https://github.com/akkartik/mu/blob/main/baremetal/101screen.subx
 1 # Primitives for screen control.
 2 
 3 == code
 4 
 5 pixel:  # screen: (addr screen), x: int, y: int, color: int
 6     # . prologue
 7     55/push-ebp
 8     89/<- %ebp 4/r32/esp
 9     # . save registers
10     50/push-eax
11     51/push-ecx
12     # ecx = screen
13     8b/-> *(ebp+8) 1/r32/ecx
14     81 7/subop/compare %ecx 0/imm32
15     {
16       75/jump-if-!= break/disp8
17       # bounds checks
18       8b/-> *(ebp+0xc) 0/r32/eax
19       3d/compare-eax-and 0/imm32
20       7c/jump-if-< $pixel:end/disp8
21       3d/compare-eax-and 0x400/imm32/1024
22       7d/jump-if->= $pixel:end/disp8
23       8b/-> *(ebp+0x10) 0/r32/eax
24       3d/compare-eax-and 0/imm32
25       7c/jump-if-< $pixel:end/disp8
26       3d/compare-eax-and 0x300/imm32/768
27       7d/jump-if->= $pixel:end/disp8
28       # eax = y*1024 + x
29       8b/-> *(ebp+0x10) 0/r32/eax
30       c1/shift 4/subop/left %eax 0xa/imm8
31       03/add-> *(ebp+0xc) 0/r32/eax
32       # eax += location of frame buffer
33       03/add-> *0x7f28 0/r32/eax
34       # *eax = color
35       8b/-> *(ebp+0x14) 1/r32/ecx
36       88/byte<- *eax 1/r32/CL
37       # return
38       eb $pixel:end/disp8
39     }
40     # TODO: fake screen
41 $pixel:end:
42     # . restore registers
43     59/pop-to-ecx
44     58/pop-to-eax
45     # . epilogue
46     89/<- %esp 5/r32/ebp
47     5d/pop-to-ebp
48     c3/return