mu/baremetal/101screen.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

43 lines
1.2 KiB
Plaintext

# Primitives for screen control.
#
# We need to do this in machine code because Mu doesn't have global variables
# yet (for the start of video memory).
== code
pixel-on-real-screen: # x: int, y: int, color: int
# . prologue
55/push-ebp
89/<- %ebp 4/r32/esp
# . save registers
50/push-eax
51/push-ecx
# bounds checks
8b/-> *(ebp+8) 0/r32/eax
3d/compare-eax-and 0/imm32
7c/jump-if-< $pixel-on-real-screen:end/disp8
3d/compare-eax-and 0x400/imm32/1024
7d/jump-if->= $pixel-on-real-screen:end/disp8
8b/-> *(ebp+0xc) 0/r32/eax
3d/compare-eax-and 0/imm32
7c/jump-if-< $pixel-on-real-screen:end/disp8
3d/compare-eax-and 0x300/imm32/768
7d/jump-if->= $pixel-on-real-screen:end/disp8
# eax = y*1024 + x
8b/-> *(ebp+0xc) 0/r32/eax
c1/shift 4/subop/left %eax 0xa/imm8
03/add-> *(ebp+8) 0/r32/eax
# eax += location of frame buffer
03/add-> *0x7f28 0/r32/eax # unsafe
# *eax = color
8b/-> *(ebp+0x10) 1/r32/ecx
88/byte<- *eax 1/r32/CL
$pixel-on-real-screen:end:
# . restore registers
59/pop-to-ecx
58/pop-to-eax
# . epilogue
89/<- %esp 5/r32/ebp
5d/pop-to-ebp
c3/return