timer and keyboard handlers working together
This commit is contained in:
parent
db5f7c26a5
commit
3df5232ca4
62
timer.subx
62
timer.subx
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue