timer and keyboard handlers working together

This commit is contained in:
Kartik K. Agaram 2021-06-29 22:12:32 -07:00
parent db5f7c26a5
commit 3df5232ca4
1 changed files with 44 additions and 18 deletions

View File

@ -293,11 +293,11 @@ idt_start:
0/imm16 # target[16:32] -- timer-interrupt-handler must be within address 0x10000 0/imm16 # target[16:32] -- timer-interrupt-handler must be within address 0x10000
# entry 9: keyboard # entry 9: keyboard
null-interrupt-handler/imm16 # target[0:16] keyboard-interrupt-handler/imm16 # target[0:16]
8/imm16 # segment selector (gdt_code) 8/imm16 # segment selector (gdt_code)
00 # unused 00 # unused
8e # 1/p 00/dpl 0 1110/type/32-bit-interrupt-gate 8e # 1/p 00/dpl 0 1110/type/32-bit-interrupt-gate
0/imm16 # target[16:32] -- null-interrupt-handler must be within address 0x10000 0/imm16 # target[16:32] -- keyboard-interrupt-handler must be within address 0x10000
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
@ -326,22 +326,6 @@ idt_start:
== code == code
null-interrupt-handler:
# prologue
fa/disable-interrupts
60/push-all-registers
9c/push-flags
# acknowledge interrupt
b0/copy-to-al 0x20/imm8
e6/write-al-into-port 0x20/imm8
31/xor %eax 0/r32/eax
$null-interrupt-handler:epilogue:
# epilogue
9d/pop-flags
61/pop-all-registers
fb/enable-interrupts
cf/return-from-interrupt
timer-interrupt-handler: timer-interrupt-handler:
# prologue # prologue
fa/disable-interrupts fa/disable-interrupts
@ -375,6 +359,45 @@ $timer-interrupt-handler:epilogue:
fb/enable-interrupts fb/enable-interrupts
cf/return-from-interrupt cf/return-from-interrupt
keyboard-interrupt-handler:
# prologue
fa/disable-interrupts
60/push-all-registers
9c/push-flags
# acknowledge interrupt
b0/copy-to-al 0x20/imm8
e6/write-al-into-port 0x20/imm8
31/xor %eax 0/r32/eax
# check output buffer of 8042 keyboard controller (https://web.archive.org/web/20040604041507/http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/keyboard/atkeyboard.html)
e4/read-port-into-al 0x64/imm8
a8/test-bits-in-al 0x01/imm8 # set zf if bit 0 (least significant) is not set
0f 84/jump-if-not-set $keyboard-interrupt-handler:epilogue/disp32
# initialize current-pixel-location if necessary
81 7/subop/compare *Keyboard-current-pixel 0/imm32
{
75/jump-if-!= break/disp8
8b/-> *Video-memory-addr 1/r32/ecx
89/<- *Keyboard-current-pixel 1/r32/ecx
}
# - read keycode
e4/read-port-into-al 0x60/imm8
# if (al & 0x80) a key is being lifted; return
50/push-eax
24/and-al-with 0x80/imm8
3c/compare-al-and 0/imm8
58/pop-to-eax
75/jump-if-!= $keyboard-interrupt-handler:epilogue/disp8
# key pressed
8b/-> *Keyboard-current-pixel 1/r32/ecx
c6 0/subop/copy-byte *ecx 0x31/imm8/green
ff 0/subop/increment *Keyboard-current-pixel
$keyboard-interrupt-handler:epilogue:
# epilogue
9d/pop-flags
61/pop-all-registers
fb/enable-interrupts
cf/return-from-interrupt
== data == data
Video-mode-info: Video-mode-info:
@ -435,4 +458,7 @@ Video-memory-addr:
Timer-current-color: Timer-current-color:
0/imm32 0/imm32
Keyboard-current-pixel:
0/imm32
# vim:ft=subx # vim:ft=subx