Wenn ichs richtig verstandan habe willst du, dass IRQ1 die gedrückte Taste in einen Zwischenspeicher schreibt und man diesen dann über einen Software-Interrupt auslesen kann, bzw. dieser Software-Interrupt darauf wartet bis eine Taste gedrückt wurde?
Habsch mal was weiter geschrieben. Allerdings nicht nur mit einer Variable zum zwischenspeichern der Tasten, sondern gleich einen richtigen 16 Byte Ringbuffer.
Hierbei ist das STI in der INT16h-Funktion zu beachten, denn auch Softwareinterrupts löschen das Interruptflag (CLI), und dann kann man natürlich lange auf den IRQ1 warten. :]
use16
org 0x7C00
;CS:IP=7C0:$
jmp 0x0:start
start:
;CPU: Interrupts auschalten
cli
;IVT: neue Adresse fuer IRQ 1 bzw. Interrupt 0x9 setzen
mov word[0x9*4 ], IRQ1
mov word[0x9*4+2], 0
;IVT: neue Adresse Interrupt 0x16 setzen
mov word[0x16*4 ], INT16h
mov word[0x16*4+2], 0
;CPU: Interrups einschalten
sti
schleife:
int 0x16
call draw_char
jmp schleife
;IN: al = char
draw_char:
pusha
MOV AH,0Eh
INT 10h
popa
ret
ringbuffer_write_pos db 0
ringbuffer_read_pos db 0
ringbuffer: times 16 db ?
;OUT: al=char
INT16h:
push bx
xor bx, bx
sti ;<-- auch bei einem Software-Interrupt wird cli aufgerufen
mov bl, [ringbuffer_read_pos]
.wait_for_key:
cmp bl, [ringbuffer_write_pos]
je .wait_for_key
mov al, [ringbuffer+bx]
inc bl
and bl, 0xF
mov [ringbuffer_read_pos], bl
pop bx
iret
Keyboard_layout_de db 0,0,49,50,51,52,53,54,55,56,57,48,225,39,1,0,113,119,101,114,116
db 122,117,105,111,112,129,43,2,0,97,115,100,102,103,104,106,107,108
db 148,132,94,0,35,121,120,99,118,98,110,109,44,46,45,0,42,0,32,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,43,0,0,0,0,0,0,0,60,0,0
IRQ1:
pusha
in al, 0x60
cmp al, 128
jae .end
push word 0
pop ds
mov bl, al
mov bh, 0
mov al, [Keyboard_layout_de+bx] ;Scancode zu ASCII machen
;Zeichen im Ringbuffer speichern
mov bl, [ringbuffer_write_pos]
mov cl, bl
inc cl
and cl, 0xF
cmp cl, [ringbuffer_read_pos]
je .end ;ringbuffer is full
mov [ringbuffer+bx], al
mov [ringbuffer_write_pos], cl
.end:
mov al, 0x20
out 0x20, al ;Set PIC1 back
popa
iret
;510 Byte
times 510-($-$$) db 0
;Bootsignatur
dw 0xAA55