This commit is contained in:
Kartik K. Agaram 2021-07-19 17:57:41 -07:00
parent 542773df2f
commit a4c28e1bfb
1 changed files with 0 additions and 176 deletions

View File

@ -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
#? }
#? }