This commit is contained in:
parent
542773df2f
commit
a4c28e1bfb
176
apps/ex10.mu.
176
apps/ex10.mu.
|
@ -1,176 +0,0 @@
|
|||
# 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
|
||||
#? }
|
||||
#? }
|
Loading…
Reference in New Issue