about summary refs log tree commit diff stats
path: root/apps/ex10.mu.
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-07-16 08:09:42 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-07-16 08:28:56 -0700
commit44d26b77c45668c9b0c99894a4294cec004361fe (patch)
tree68a5dcd4971873efd4ce184e9bf9a531c2161813 /apps/ex10.mu.
parentac45f097153afd3a89f43886e4124c5b2c26b98a (diff)
downloadmu-44d26b77c45668c9b0c99894a4294cec004361fe.tar.gz
.
Diffstat (limited to 'apps/ex10.mu.')
-rw-r--r--apps/ex10.mu.176
1 files changed, 176 insertions, 0 deletions
diff --git a/apps/ex10.mu. b/apps/ex10.mu.
new file mode 100644
index 00000000..35fea653
--- /dev/null
+++ b/apps/ex10.mu.
@@ -0,0 +1,176 @@
+# Demo of mouse support.
+#
+# To build a disk image:
+#   ./translate ex10.mu            # emits disk.img
+# To run:
+#   qemu-system-i386 disk.img
+# Or:
+#   bochs -f bochsrc               # bochsrc loads disk.img
+
+fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) {
+#?   var x/esi: int <- copy 0x200
+#?   var y/edi: int <- copy 0x180
+#?   render-grid x, y
+  $main:event-loop: {
+    # read deltas from mouse
+    var dx/eax: int <- copy 0
+    var dy/ecx: int <- copy 0
+    dx, dy <- read-mouse-event
+    # loop if deltas are both 0
+    {
+      compare dx, 0
+      break-if-!=
+      compare dy, 0
+      break-if-!=
+      loop $main:event-loop
+    }
+    # render unclamped deltas
+#?     render-grid x, y
+    draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen screen, dx, 7/fg, 0/bg
+    draw-text-wrapping-right-then-down-from-cursor-over-full-screen screen, " ", 7/fg, 0/bg
+    draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen screen, dy, 7/fg, 0/bg
+    move-cursor-to-left-margin-of-next-line screen
+#?     {
+#?       var dummy1/eax: int <- copy 0
+#?       var dummy2/ecx: int <- copy 0
+#?       dummy1, dummy2 <- draw-text-wrapping-right-then-down-over-full-screen screen, "         ", 0/x, 0x10/y, 0x31/fg, 0/bg
+#?     }
+#?     {
+#?       var ephemeral-dx/eax: int <- copy dx
+#?       var dummy/ecx: int <- copy 0
+#?       ephemeral-dx, dummy <- draw-int32-decimal-wrapping-right-then-down-over-full-screen screen, ephemeral-dx, 0/x, 0x10/y, 0x31/fg, 0/bg
+#?     }
+#?     {
+#?       var dummy/eax: int <- copy 0
+#?       var ephemeral-dy/ecx: int <- copy dy
+#?       dummy, ephemeral-dy <- draw-int32-decimal-wrapping-right-then-down-over-full-screen screen, ephemeral-dy, 5/x, 0x10/y, 0x31/fg, 0/bg
+#?     }
+#?     # clamp deltas
+#?     $clamp-dx: {
+#?       compare dx, -0xa
+#?       {
+#?         break-if->
+#?         dx <- copy -0xa
+#?         break $clamp-dx
+#?       }
+#?       compare dx, 0xa
+#?       {
+#?         break-if-<
+#?         dx <- copy 0xa
+#?         break $clamp-dx
+#?       }
+#?       dx <- copy 0
+#?     }
+#?     $clamp-dy: {
+#?       compare dy, -0xa
+#?       {
+#?         break-if->
+#?         dy <- copy -0xa
+#?         break $clamp-dy
+#?       }
+#?       compare dy, 0xa
+#?       {
+#?         break-if-<
+#?         dy <- copy 0xa
+#?         break $clamp-dy
+#?       }
+#?       dy <- copy 0
+#?     }
+#?     # render clamped deltas
+#?     {
+#?       var dummy1/eax: int <- copy 0
+#?       var dummy2/ecx: int <- copy 0
+#?       dummy1, dummy2 <- draw-text-wrapping-right-then-down-over-full-screen screen, "         ", 0/x, 0x20/y, 0x31/fg, 0/bg
+#?     }
+#?     {
+#?       var save-dx/eax: int <- copy dx
+#?       var dummy/ecx: int <- copy 0
+#?       save-dx, dummy <- draw-int32-decimal-wrapping-right-then-down-over-full-screen screen, save-dx, 0/x, 0x20/y, 0x31/fg, 0/bg
+#?     }
+#?     {
+#?       var dummy/eax: int <- copy 0
+#?       var save-dy/ecx: int <- copy dy
+#?       dummy, save-dy <- draw-int32-decimal-wrapping-right-then-down-over-full-screen screen, save-dy, 5/x, 0x20/y, 0x31/fg, 0/bg
+#?     }
+#?     # loop if deltas are both 0
+#?     {
+#?       compare dx, 0
+#?       break-if-!=
+#?       compare dy, 0
+#?       break-if-!=
+#?       loop $main:event-loop
+#?     }
+#?     # accumulate deltas and clamp result within screen bounds
+#?     x <- add dx
+#?     compare x, 0
+#?     {
+#?       break-if->=
+#?       x <- copy 0
+#?     }
+#?     compare x, 0x400
+#?     {
+#?       break-if-<
+#?       x <- copy 0x3ff
+#?     }
+#?     y <- subtract dy  # mouse y coordinates are reverse compared to screen
+#?     compare y, 0
+#?     {
+#?       break-if->=
+#?       y <- copy 0
+#?     }
+#?     compare y, 0x300
+#?     {
+#?       break-if-<
+#?       y <- copy 0x2ff
+#?     }
+    loop
+  }
+}
+
+#? fn render-grid curr-x: int, curr-y: int {
+#?   and-with curr-x, 0xfffffffc
+#?   and-with curr-y, 0xfffffffc
+#?   var y/eax: int <- copy 0
+#?   {
+#?     compare y, 0x300/screen-height=768
+#?     break-if->=
+#?     var x/edx: int <- copy 0
+#?     {
+#?       compare x, 0x400/screen-width=1024
+#?       break-if->=
+#?       var color/ecx: int <- copy 0
+#?       # set color if either x or y is divisible by 4
+#?       var tmp/ebx: int <- copy y
+#?       tmp <- and 3
+#?       compare tmp, 0
+#?       {
+#?         break-if-!=
+#?         color <- copy 3
+#?       }
+#?       tmp <- copy x
+#?       tmp <- and 3
+#?       compare tmp, 0
+#?       {
+#?         break-if-!=
+#?         color <- copy 3
+#?       }
+#?       # highlight color if x and y match curr-x and curr-y (quantized)
+#?       {
+#?         var xq/edx: int <- copy x
+#?         xq <- and 0xfffffffc
+#?         var yq/eax: int <- copy y
+#?         yq <- and 0xfffffffc
+#?         compare xq, curr-x
+#?         break-if-!=
+#?         compare yq, curr-y
+#?         break-if-!=
+#?         color <- copy 0xc
+#?       }
+#?       pixel-on-real-screen x, y, color
+#?       x <- increment
+#?       loop
+#?     }
+#?     y <- increment
+#?     loop
+#?   }
+#? }