Advertisement
aNNiMON

СПиОС LR_2 VAR_10

Mar 28th, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CODESG SEGMENT PARA 'CODE'
  2.     ASSUME CS: CODESG, DS: CODESG, SS: CODESG, ES: CODESG
  3.        ORG 100h
  4.     BEGIN: JMP MAIN
  5.    
  6.         keyword db 'label$'
  7.         keyword_length db 5
  8.         msg db 'This is comment!$'
  9.         msg_length db 16
  10.         cur_x db ?
  11.         cur_y db ?
  12.     RESIDENT PROC FAR
  13.         push bp sp si ds di es ax bx cx dx
  14.        
  15.         in al, 60h
  16.         cmp al, 44; 'z'
  17.         je &is_z
  18.         cmp al, 51; ','
  19.         je &cur_left
  20.         cmp al, 52; '.'
  21.         je &cur_right
  22.         int 60h
  23.         jmp &exit
  24.       ; эмуляция передвижения курсора
  25.       &cur_left:
  26.         mov ah, 03
  27.         mov bh, 0
  28.         int 10h
  29.         mov ah, 02
  30.         dec dl
  31.         int 10h
  32.         jmp &signal
  33.       &cur_right:
  34.         mov ah, 03
  35.         mov bh, 0
  36.         int 10h
  37.         mov ah, 02
  38.         inc dl
  39.         int 10h
  40.         jmp &signal
  41.       &is_z: ; проверка нахождения курсора в начале или конце keyword
  42.        ; cmd
  43.        mov al, cs:[5dh]
  44.        mov ds:82h, al
  45.         ; читаем позицию курсора
  46.         mov ah, 03
  47.         mov bh, 0
  48.         int 10h
  49.         mov cs:cur_y, dh
  50.         mov cs:cur_x, dl
  51.        
  52.         ; если в командной строке параметр равен 1
  53.         ; то курсор должен быть справа от keyword
  54.         mov al, ds:82h
  55.         cmp al, '1'
  56.         je &right_1
  57.         ; if (x < 80-keyword_length)
  58.         mov al, 80
  59.         sub al, cs:keyword_length
  60.         cmp cs:cur_x, al
  61.         jb &go_1
  62.         jmp &clear_status
  63.       &right_1:
  64.         ; if (x > keyword_length)
  65.         mov al, cs:keyword_length
  66.         cmp cs:cur_x, al
  67.         ja &go_1
  68.         jmp &clear_status
  69.       &go_1:
  70.         ; for (int i = 0; i < keyword_length; i++)
  71.         xor cx, cx
  72.         mov cl, cs:keyword_length
  73.         dec cl
  74.         mov si, 0
  75.       &for_1:
  76.           ; передвигаем курсор
  77.           mov dh, cs:cur_y
  78.           mov dl, cs:cur_x
  79.           ; if (right) x = x - i
  80.           mov al, ds:82h
  81.           cmp al, '1'
  82.           je &right_2
  83.             add dx, si
  84.             jmp &go_2
  85.         &right_2:
  86.             sub dx, si
  87.         &go_2:
  88.           mov ah, 02
  89.           mov bh, 0
  90.           int 10h
  91.           ; получаем символ
  92.           mov ah, 08
  93.           mov bh, 0
  94.           int 10h
  95.           mov bl, al
  96.           ; сравниваем с keyword
  97.           mov al, ds:82h
  98.           cmp al, '1'
  99.           je &right_3
  100.             cmp bl, cs:keyword[si]
  101.             jne &clear_status
  102.             jmp &go_3
  103.         &right_3:
  104.             xor ax, ax
  105.             mov al, cs:keyword_length
  106.             mov di, ax
  107.             sub di, si
  108.             dec di
  109.             cmp bl, cs:keyword[di]
  110.             jne &clear_status
  111.         &go_3:
  112.           inc si
  113.         loop &for_1
  114.         ; прошли весь цикл, значит перед нами keyword
  115.         jmp &this_is_keyword
  116.      
  117.       ; вывод сообщения
  118.       &this_is_keyword:
  119.         xor cx, cx
  120.         mov cl, cs:msg_length
  121.         mov si, 0
  122.       &for_2:
  123.           ; передвигаем курсор
  124.           mov ah, 02
  125.           mov bh, 0
  126.           mov dh, 24
  127.           mov dl, 0
  128.           add dx, si
  129.           int 10h
  130.           ; пишем строку
  131.           push cx
  132.           mov ah, 09
  133.           mov bh, 0
  134.           mov al, cs:msg[si]
  135.           mov cx, 1
  136.           mov bl, 1eh
  137.           int 10h
  138.           pop cx
  139.          
  140.           inc si
  141.         loop &for_2
  142.         jmp &pre_exit
  143.      
  144.       &clear_status:
  145.         xor cx, cx
  146.         ; очищаем строку с инфой
  147.         mov ah, 02
  148.         mov bh, 0
  149.         mov dh, 24
  150.         mov dl, 0
  151.         int 10h
  152.          
  153.         mov ah, 09
  154.         mov al, ' '
  155.         mov bh, 0
  156.         mov bl, 0fh
  157.         mov cl, cs:msg_length
  158.         int 10h
  159.       &pre_exit:
  160.         ; возвращаем курсор на своё место
  161.         mov ah, 02
  162.         mov bh, 0
  163.         mov dh, cs:cur_y
  164.         mov dl, cs:cur_x
  165.         int 10h
  166.       &signal: ; сигнал контроллеру прерывании
  167.         mov al, 20h
  168.         out 20h, al
  169.       &exit:
  170.         pop dx cx bx ax es di ds si sp bp
  171.         iret
  172.       finish equ $
  173.     RESIDENT ENDP
  174.    
  175.    
  176.         str_prg_started db 10, 13, 'Programm already running!$'
  177.         vector db 09h
  178.     MAIN PROC NEAR
  179.         ; проверка заполненности вектора 60h
  180.         mov ah, 35h
  181.         mov al, 60h
  182.         int 21h
  183.         cmp bx, 0
  184.         je &m1
  185.           ; программа уже запущена
  186.           mov ah, 09h
  187.           lea dx, str_prg_started
  188.           mov bl, '$'
  189.           mov ds:[62h],bl
  190.           int 21h
  191.           ; пауза
  192.           mov ah, 08h
  193.           int 21h
  194.           ret
  195.       &m1:
  196.         ; 1. Получение адреса 10h вектора
  197.         mov ah, 35h
  198.         mov al, vector
  199.         int 21h
  200.        
  201.         cli
  202.         push ds
  203.         mov dx, bx
  204.         mov ax, es
  205.         mov ds, ax
  206.         ; 2. Переписываем вектор 10h в 60h
  207.         mov ah, 25h
  208.         mov al, 60h
  209.         int 21h
  210.         pop ds
  211.         sti
  212.        
  213.         ; 3. Записываем адрес процедуры RESIDENT в 10h
  214.         mov ah, 25h
  215.         mov al, vector
  216.         lea dx, RESIDENT
  217.         int 21h
  218.        
  219.         ; 4. Оставляем процедуру резидентной
  220.         lea dx, finish
  221.         int 27h
  222.         ret
  223.     MAIN ENDP
  224.    
  225.     CODESG ENDS
  226. END BEGIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement