From 131157cd53a88f671081213d4146b97ced974466 Mon Sep 17 00:00:00 2001 From: neauoire Date: Sat, 10 Apr 2021 11:24:38 -0700 Subject: [PATCH] Fixed issue with mouse button not being released --- build.sh | 2 +- projects/examples/dev.mouse.usm | 63 +++++++++++++++++++++++++++------ src/emulator.c | 24 +++++++------ 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/build.sh b/build.sh index ac8a567..5f7b817 100755 --- a/build.sh +++ b/build.sh @@ -32,7 +32,7 @@ else fi echo "Assembling.." -./bin/assembler projects/software/nasu.usm bin/boot.rom +./bin/assembler projects/examples/dev.mouse.usm bin/boot.rom echo "Running.." if [ "${2}" = '--cli' ]; diff --git a/projects/examples/dev.mouse.usm b/projects/examples/dev.mouse.usm index 4982112..37da267 100644 --- a/projects/examples/dev.mouse.usm +++ b/projects/examples/dev.mouse.usm @@ -1,10 +1,15 @@ ( Dev/Mouse ) %RTN { JMP2r } +%8+ { #0008 ADD2 } %++ { #0001 ADD2 } %-- { #0001 SUB2 } +;touch1 { xc 2 yc 2 r 2 } +;touch2 { xc 2 yc 2 r 2 } + ;color { byte 1 } +;addr { short 2 } ;pointer { x 2 y 2 } ;circle { xc 2 yc 2 x 2 y 2 r 2 d 2 } @@ -23,9 +28,18 @@ BRK @on-screen - - ( clear ) ~circle.xc ~circle.yc ~circle.r #00 ,draw-circle JSR2 - ( draw ) ~circle.xc ~circle.yc ~circle.r #0001 ADD2 #03 ,draw-circle JSR2 + + ( clear ) ~touch1.xc ~touch1.yc ~touch1.r #00 ,draw-circle JSR2 + ( clear ) ~touch2.xc ~touch2.yc ~touch2.r #00 ,draw-circle JSR2 + + ~touch1.r ++ =touch1.r + ~touch2.r ++ =touch2.r + + ( draw ) ~touch1.xc ~touch1.yc ~touch1.r #03 ,draw-circle JSR2 + ( draw ) ~touch2.xc ~touch2.yc ~touch2.r #02 ,draw-circle JSR2 + + ~touch1.xc ~touch1.yc #23 ,touch1.r #0001 ADD2 ,draw-byte JSR2 + ~touch2.xc ~touch2.yc #28 ,touch2.r #0001 ADD2 ,draw-byte JSR2 BRK @@ -33,14 +47,16 @@ BRK ,draw-cursor JSR2 - ( clear ) ~circle.xc ~circle.yc ~circle.r #00 ,draw-circle JSR2 - - ~Mouse.state #00 EQU ^$no-touch JNZ - ~Mouse.x DUP2 =circle.xc - ~Mouse.y DUP2 =circle.yc - #0000 =circle.r + ~Mouse.state #01 NEQ ,$no-touch1 JNZ2 + ( clear ) ~touch1.xc ~touch1.yc ~touch1.r #00 ,draw-circle JSR2 + ( update ) ~Mouse.x =touch1.xc ~Mouse.y =touch1.yc #0000 =touch1.r ( release ) #00 =Mouse.state - $no-touch + $no-touch1 + ~Mouse.state #10 NEQ ,$no-touch2 JNZ2 + ( clear ) ~touch2.xc ~touch2.yc ~touch2.r #00 ,draw-circle JSR2 + ( update ) ~Mouse.x =touch2.xc ~Mouse.y =touch2.yc #0000 =touch2.r + ( release ) #00 =Mouse.state + $no-touch2 BRK @@ -93,5 +109,30 @@ RTN RTN +@draw-byte ( x y color addr -- ) + + =addr STH + =Screen.y + =Screen.x + ,font_hex #00 ~addr PEK2 #04 SFT #0008 MUL2 ADD2 =Screen.addr + STHr DUP STH =Screen.color + ,font_hex #00 ~addr PEK2 #0f AND #0008 MUL2 ADD2 =Screen.addr + ~Screen.x 8+ =Screen.x + STHr =Screen.color + +RTN + @clear_icn [ 0000 0000 0000 0000 ] -@cursor_icn [ 80c0 e0f0 f8e0 1000 ] \ No newline at end of file +@cursor_icn [ 80c0 e0f0 f8e0 1000 ] + +@font_hex +[ + 003c 464a 5262 3c00 0018 0808 0808 1c00 + 003c 4202 3c40 7e00 003c 421c 0242 3c00 + 000c 1424 447e 0400 007e 407c 0242 3c00 + 003c 407c 4242 3c00 007e 0204 0810 1000 + 003c 423c 4242 3c00 003c 4242 3e02 3c00 + 003c 4242 7e42 4200 007c 427c 4242 7c00 + 003c 4240 4042 3c00 007c 4242 4242 7c00 + 007e 4078 4040 7e00 007e 4078 4040 4000 +] \ No newline at end of file diff --git a/src/emulator.c b/src/emulator.c index 0d30e94..85a00e7 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -128,23 +128,25 @@ void domouse(Uxn *u, SDL_Event *event) { Uint8 flag = 0x00; - Uint16 addr = devmouse->addr + 2; Uint16 x = clamp(event->motion.x / zoom - ppu.pad, 0, ppu.hor * 8 - 1); Uint16 y = clamp(event->motion.y / zoom - ppu.pad, 0, ppu.ver * 8 - 1); - mempoke16(u, addr + 0, x); - mempoke16(u, addr + 2, y); - u->ram.dat[addr + 5] = 0x00; - flag = event->button.button == SDL_BUTTON_LEFT ? 0x01 : 0x10; + mempoke16(u, devmouse->addr + 2, x); + mempoke16(u, devmouse->addr + 4, y); + u->ram.dat[devmouse->addr + 7] = 0x00; + switch(event->button.button) { + case SDL_BUTTON_LEFT: flag = 0x01; break; + case SDL_BUTTON_RIGHT: flag = 0x10; break; + } switch(event->type) { case SDL_MOUSEBUTTONDOWN: - u->ram.dat[addr + 4] |= flag; - if(flag == 0x10 && (u->ram.dat[addr + 4] & 0x01)) - u->ram.dat[addr + 5] = 0x01; - if(flag == 0x01 && (u->ram.dat[addr + 4] & 0x10)) - u->ram.dat[addr + 5] = 0x10; + u->ram.dat[devmouse->addr + 6] |= flag; + if(flag == 0x10 && (u->ram.dat[devmouse->addr + 6] & 0x01)) + u->ram.dat[devmouse->addr + 7] = 0x01; + if(flag == 0x01 && (u->ram.dat[devmouse->addr + 6] & 0x10)) + u->ram.dat[devmouse->addr + 7] = 0x10; break; case SDL_MOUSEBUTTONUP: - u->ram.dat[addr + 4] &= (~flag); + u->ram.dat[devmouse->addr + 6] &= (~flag); break; } }