diff options
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 +#? } +#? } |