177 lines
4.9 KiB
Plaintext
177 lines
4.9 KiB
Plaintext
# 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
|
|
#? }
|
|
#? }
|