about summary refs log tree commit diff stats
path: root/baremetal/101screen.subx
diff options
context:
space:
mode:
Diffstat (limited to 'baremetal/101screen.subx')
-rw-r--r--baremetal/101screen.subx56
1 files changed, 25 insertions, 31 deletions
diff --git a/baremetal/101screen.subx b/baremetal/101screen.subx
index 225efeec..5a26a86a 100644
--- a/baremetal/101screen.subx
+++ b/baremetal/101screen.subx
@@ -1,44 +1,38 @@
 # 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:  # screen: (addr screen), x: int, y: int, color: int
+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
-    # ecx = screen
-    8b/-> *(ebp+8) 1/r32/ecx
-    81 7/subop/compare %ecx 0/imm32
-    {
-      75/jump-if-!= break/disp8
-      # bounds checks
-      8b/-> *(ebp+0xc) 0/r32/eax
-      3d/compare-eax-and 0/imm32
-      7c/jump-if-< $pixel:end/disp8
-      3d/compare-eax-and 0x400/imm32/1024
-      7d/jump-if->= $pixel:end/disp8
-      8b/-> *(ebp+0x10) 0/r32/eax
-      3d/compare-eax-and 0/imm32
-      7c/jump-if-< $pixel:end/disp8
-      3d/compare-eax-and 0x300/imm32/768
-      7d/jump-if->= $pixel:end/disp8
-      # eax = y*1024 + x
-      8b/-> *(ebp+0x10) 0/r32/eax
-      c1/shift 4/subop/left %eax 0xa/imm8
-      03/add-> *(ebp+0xc) 0/r32/eax
-      # eax += location of frame buffer
-      03/add-> *0x7f28 0/r32/eax
-      # *eax = color
-      8b/-> *(ebp+0x14) 1/r32/ecx
-      88/byte<- *eax 1/r32/CL
-      # return
-      eb $pixel:end/disp8
-    }
-    # TODO: fake screen
-$pixel:end:
+    # 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