Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CODESG SEGMENT PARA 'CODE'
- ASSUME CS: CODESG, DS: CODESG, SS: CODESG, ES: CODESG
- ORG 100h
- BEGIN: JMP MAIN
- keyword db 'label$'
- keyword_length db 5
- msg db 'This is comment!$'
- msg_length db 16
- cur_x db ?
- cur_y db ?
- RESIDENT PROC FAR
- push bp sp si ds di es ax bx cx dx
- in al, 60h
- cmp al, 44; 'z'
- je &is_z
- cmp al, 51; ','
- je &cur_left
- cmp al, 52; '.'
- je &cur_right
- int 60h
- jmp &exit
- ; эмуляция передвижения курсора
- &cur_left:
- mov ah, 03
- mov bh, 0
- int 10h
- mov ah, 02
- dec dl
- int 10h
- jmp &signal
- &cur_right:
- mov ah, 03
- mov bh, 0
- int 10h
- mov ah, 02
- inc dl
- int 10h
- jmp &signal
- &is_z: ; проверка нахождения курсора в начале или конце keyword
- ; cmd
- mov al, cs:[5dh]
- mov ds:82h, al
- ; читаем позицию курсора
- mov ah, 03
- mov bh, 0
- int 10h
- mov cs:cur_y, dh
- mov cs:cur_x, dl
- ; если в командной строке параметр равен 1
- ; то курсор должен быть справа от keyword
- mov al, ds:82h
- cmp al, '1'
- je &right_1
- ; if (x < 80-keyword_length)
- mov al, 80
- sub al, cs:keyword_length
- cmp cs:cur_x, al
- jb &go_1
- jmp &clear_status
- &right_1:
- ; if (x > keyword_length)
- mov al, cs:keyword_length
- cmp cs:cur_x, al
- ja &go_1
- jmp &clear_status
- &go_1:
- ; for (int i = 0; i < keyword_length; i++)
- xor cx, cx
- mov cl, cs:keyword_length
- dec cl
- mov si, 0
- &for_1:
- ; передвигаем курсор
- mov dh, cs:cur_y
- mov dl, cs:cur_x
- ; if (right) x = x - i
- mov al, ds:82h
- cmp al, '1'
- je &right_2
- add dx, si
- jmp &go_2
- &right_2:
- sub dx, si
- &go_2:
- mov ah, 02
- mov bh, 0
- int 10h
- ; получаем символ
- mov ah, 08
- mov bh, 0
- int 10h
- mov bl, al
- ; сравниваем с keyword
- mov al, ds:82h
- cmp al, '1'
- je &right_3
- cmp bl, cs:keyword[si]
- jne &clear_status
- jmp &go_3
- &right_3:
- xor ax, ax
- mov al, cs:keyword_length
- mov di, ax
- sub di, si
- dec di
- cmp bl, cs:keyword[di]
- jne &clear_status
- &go_3:
- inc si
- loop &for_1
- ; прошли весь цикл, значит перед нами keyword
- jmp &this_is_keyword
- ; вывод сообщения
- &this_is_keyword:
- xor cx, cx
- mov cl, cs:msg_length
- mov si, 0
- &for_2:
- ; передвигаем курсор
- mov ah, 02
- mov bh, 0
- mov dh, 24
- mov dl, 0
- add dx, si
- int 10h
- ; пишем строку
- push cx
- mov ah, 09
- mov bh, 0
- mov al, cs:msg[si]
- mov cx, 1
- mov bl, 1eh
- int 10h
- pop cx
- inc si
- loop &for_2
- jmp &pre_exit
- &clear_status:
- xor cx, cx
- ; очищаем строку с инфой
- mov ah, 02
- mov bh, 0
- mov dh, 24
- mov dl, 0
- int 10h
- mov ah, 09
- mov al, ' '
- mov bh, 0
- mov bl, 0fh
- mov cl, cs:msg_length
- int 10h
- &pre_exit:
- ; возвращаем курсор на своё место
- mov ah, 02
- mov bh, 0
- mov dh, cs:cur_y
- mov dl, cs:cur_x
- int 10h
- &signal: ; сигнал контроллеру прерывании
- mov al, 20h
- out 20h, al
- &exit:
- pop dx cx bx ax es di ds si sp bp
- iret
- finish equ $
- RESIDENT ENDP
- str_prg_started db 10, 13, 'Programm already running!$'
- vector db 09h
- MAIN PROC NEAR
- ; проверка заполненности вектора 60h
- mov ah, 35h
- mov al, 60h
- int 21h
- cmp bx, 0
- je &m1
- ; программа уже запущена
- mov ah, 09h
- lea dx, str_prg_started
- mov bl, '$'
- mov ds:[62h],bl
- int 21h
- ; пауза
- mov ah, 08h
- int 21h
- ret
- &m1:
- ; 1. Получение адреса 10h вектора
- mov ah, 35h
- mov al, vector
- int 21h
- cli
- push ds
- mov dx, bx
- mov ax, es
- mov ds, ax
- ; 2. Переписываем вектор 10h в 60h
- mov ah, 25h
- mov al, 60h
- int 21h
- pop ds
- sti
- ; 3. Записываем адрес процедуры RESIDENT в 10h
- mov ah, 25h
- mov al, vector
- lea dx, RESIDENT
- int 21h
- ; 4. Оставляем процедуру резидентной
- lea dx, finish
- int 27h
- ret
- MAIN ENDP
- CODESG ENDS
- END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement