mu/baremetal/102keyboard.subx
Kartik Agaram 6e36ce06dd 7521 - new plan for tests
It's not really manageable to make the fake screen pixel-oriented. Feels
excessive to compare things pixel by pixel when we will mostly be
writing text to screen. It'll also make expected screen assertions
more difficult to manage.

So I'm not sure how to make assertions about pixels for now. Instead
we'll introduce fake screens at draw-grapheme.
2021-01-15 20:30:07 -08:00

49 lines
1.4 KiB
Plaintext

# check keyboard for a key
# return 0 on no keypress or unrecognized key
#
# We need to do this in machine code because Mu doesn't have global variables
# yet (for the keyboard buffer).
== code
read-key: # kbd: (addr keyboard) -> result/eax: byte
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
51/push-ecx
# result = 0
b8/copy-to-eax 0/imm32
# ecx = keyboard
8b/-> *(ebp+8) 1/r32/ecx
81 7/subop/compare %ecx 0/imm32
{
75/jump-if-!= break/disp8
# var read/ecx: byte = keyboard buffer's read index
8b/-> *0x7dcc 1/r32/CL # keyboard-buffer-read
# var next-key/eax: byte = *(keyboard buffer + ecx)
8a/byte-> *(ecx+0x7dd0) 0/r32/AL # keyboard-buffer-data
# if (next-key != 0) lock and remove from keyboard-buffer
81 7/subop/compare %eax 0/imm32
{
74/jump-if-= break/disp8
# TODO: add some instructions in this block to SubX if we ever want to
# use bootstrap on baremetal programs
fa/disable-interrupts
c6 0/subop/copy-byte *(ecx+0x7dd0) 0/imm8
ff 0/subop/increment *0x7dcc # keyboard-buffer-read
81 4/subop/and *0x7dcc 0xf/imm32 # keyboard-buffer-read
fb/enable-interrupts
}
# return
eb $read-key:end/disp8
}
# TODO: fake keyboard
$read-key:end:
# . restore registers
59/pop-to-ecx
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return