; DD1 v1.1 ; by Rojer (2004/05/12) ; > tasm32 dd1.asm ; > tlink dd1.obj .model small .stack 100h .code .286 strseg dw ? stroff dw ? start: mov ax, 3 int 10h ; найдём своё имя: оно находится после environment'а ; загружаем сегментный адрес environment'а из PSP mov es, es:[2Ch] ; сканируем с начала xor di, di mov al, 0 mov cx, 0FFFFh cld nextvar: repne scasb ; переменные разделены NULL'ями, а весь ; environment заканчивается двумя NULL cmp byte ptr es:[di], 0 jne nextvar ; пропустим к тому ещё 2 байта - число item'ов или типа того add di, 3 ; теперь es:di указывает на полный путь к файлу ; дойдём до конца и откатимся до последнего \ repne scasb mov al, '\' std repne scasb inc di inc di cld ; теперь es:di указывает на имя файла программы. фиксируем. mov ax, es mov ds, ax mov cs:[strseg], ax mov cs:[stroff], di ; просто выводим пока без подсветки mov si, di mov bl, 0 call v_out ; теперь садимся на клаву и ждём wait_key: mov ah, 0 int 16h ; в al - символ нажатой клавиши call to_lower mov bl, al ; этот символ будет подсвечен mov si, cs:[stroff] call v_out ; встретился ли хотя бы один раз ; символ нажатой клавиши в строке? or cx, cx jnz wait_key ; аля-улю mov ax, 4C00h int 21h ; ds:si - ASCIIZ строка, bl - символ, который подсвечиваем ; на выходе cx = числу подсвеченных символов v_out proc push ax es di ; выводим в видеопамять mov ax, 0B800h ; сегментный адрес нулевой страницы видеопамяти mov es, ax sub di, di ; в cx будем считать число подсвеченных символов xor cx, cx cld loop_out: lodsb cmp al, 0 ; всё уже? je out_done call to_lower ; придумаем себе цвет - например, зелёный (2) mov ah, 2 ; подсвечиваем? cmp al, bl jne no_hl or ah, 8 inc cx no_hl: stosw jmp loop_out out_done: pop di es ax ret v_out endp ; quick-n-dirty lowercase to_lower proc cmp al, 'A' jnb lc_checkz ret lc_checkz: cmp al, 'Z' jg lc_nolower or al, 20h lc_nolower: ret to_lower endp END start