Язык ассемблера 8086 Прерывание клавиатуры и мыши

У меня возникли проблемы с выяснением того, как реализовать прерывание клавиатуры и мыши для моей матричной программы, чтобы моя бесконечная матричная программа завершалась после нажатия любой клавиши на клавиатуре и/или при перемещении мыши, а также при любом кнопки мыши нажаты.

Вот мой матричный код:

    title lab9 (lab9.asm)

.model small
.stack 100h
.data

    seed dw 1234h   
 .code
main proc
mov ax, @data
mov ds, ax



    mov ax, 0B800h
    mov es, ax  

    mov bx, 0
    mov ax, 0 

    Loo1:
        add bx, 120
        call row  
        call busyWait
        mov si, 0
        jmp Loo1
        loop Loo1

    mov ax,4C00h
    int 21h

main endp
row proc    

      push cx 
      mov cx, 10   

      R:  
      call printMsg 
      add bx, 160

      loop R

      pop cx


      ret
row endp



printMsg proc

    call randomCh
    mov ah, [si]
    mov es:[bx], ax
    inc si 

    ret
printMsg endp 

randomCh proc
    mov ax, 343Fh
    mul seed
    xor dx, dx
    add ax, 269h
    mov seed, ax     

    ret
randomCh endp


busyWait proc  
       push cx
       mov cx, 100h
    L1: 


    loop L1 
    pop cx

    ret
busyWait endp      

My_int proc 
mov ax, 4C00h
int 21h
iret
My_int endp

end 

Вот код прерывания клавиатуры, который мне дал мой профессор:

mov ax, @data
mov ds, ax
;Install interrupt handler
push ds
mov ax, @code
mov ds, ax
mov ah, 25h
mov al, 9
mov dx, offset My_Int
int 21h
pop ds

Loop2;

;MATRIX CODE GOES HERE

jmp Loop2

;mov ax, 4c00h
;Int 21h
main endp

My_int proc 
mov ax, 4c00h
int 21h
iret
My_Int endp
end main

Вот Код прерывания мыши, который также дал мне мой профессор:

.model smal
.stack 100h
.data
oX dw 0
oY dw 0
.code
main proc

    mov ax, @data
    mov ds, ax

    moov ax, 3
    int 33h
    mov oX, CX
    mov oY, DX

L1:

cmp oX ,CX ; (While oX == cx, && oY == dx && button == 0) <-- I believe the "button variable is 
           ; the BX register             
jne exit
cmp oY, DX
jne exit
cmp bx, 0
jne exit

;Matrix code goes here probably with the "Loop2: ;Matrix goes here loop Loop2 section from the
;keyboard interrupt section

mov ax, 3
int 33h
jmp L1

exit:
mov ax, 4C00H
int 21h
main endp
end main

Таким образом, я в основном должен объединить код прерывания клавиатуры и мыши в один, чтобы, когда любой, кто запускает мою программу, мог завершить ее, нажав клавишу на клавиатуре, переместив мышь или щелкнув кнопки мыши (щелчок левой кнопкой мыши, правой кнопкой мыши). нажмите и среднюю кнопку).

Что касается части завершения работы с клавиатурой, мой профессор сказал нам, что нам просто нужно вставить наш код в раздел кода «Loop2: ;Матричный код идет здесь loop Loop2», но я почти уверен, что просто ослышался. Я полагаю, он хотел сказать, что мы должны вставить наш код в этот цикл И проверить ввод с клавиатуры, но я знаю, что это не так, как я знаю, как проверять ввод (mov ah 7h/1h, int 21h), поэтому я запутался в той части.

Что касается части прерывания мыши, кажется, что мой профессор дал мне все, что мне нужно, и мне просто нужно вставить свой код в разделы «;Код матрицы идет здесь» моего кода прерывания мыши. Если это неверно, пожалуйста, дайте мне знать и, если возможно, объясните мне и, если возможно, с примерами, что мне нужно, чтобы прерывание мыши работало.


person AlternateRealm    schedule 03.12.2014    source источник


Ответы (1)


Я пытаюсь немного помочь:

My_int proc 
; mov ax, 4c00h ; This is the functions number for to terminate the program.
; int 21h       ; Both instructions are not needed here and it is a very wrong
                ; place for it, because all of the following instructions can
                ; not be execute after terminating the program.

; It make more sense to push all of the register that we use here to the stack.
push ax

; But before we want to return from the interrupt with iret, we have to send
; an End of Interrupt signal(EOI) to the programmable interupt controller(PIC).
mov al, 20h
out 20h, al

; And here we can pop all the register that we have pushed before.
pop ax

iret
My_Int endp
end main

Функция завершения: "AH=4Ch int 21h" полезна только для завершения основной программы и для возврата в DOS или для возврата к родительской программе, когда родитель вызывает дочернюю программу. Но в подпрограмме обслуживания прерываний (ISR) это не имеет смысла.

;-------------------

Чтобы использовать прерывание мыши 33h, мы должны запустить драйвер мыши, как ранее драйвер cutemouse. http://cutemouse.sourceforge.net/

Привод cutemouse поддерживает протоколы последовательных COM-портов и мышей PS/2. (Для USB нам нужно включить отставание USB в BIOS материнской платы. Это перенаправит данные USB с мыши на контроллер клавиатуры, поэтому мышь USB можно использовать так же, как мышь PS2.)

person Dirk Wolfgang Glomp    schedule 03.12.2014
comment
Действительно? Это странно, так как мой профессор сказал мне, что мне просто нужно вставить свой код в выбранные области кода, который он нам дал. - person AlternateRealm; 03.12.2014