summaryrefslogtreecommitdiff
path: root/sys/src/games/snes/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/src/games/snes/mem.c')
-rw-r--r--sys/src/games/snes/mem.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/sys/src/games/snes/mem.c b/sys/src/games/snes/mem.c
index dcf136e3d..3cb44ee35 100644
--- a/sys/src/games/snes/mem.c
+++ b/sys/src/games/snes/mem.c
@@ -8,7 +8,8 @@ u8int reg[32768];
u8int mem[131072];
u8int oam[544], vram[65536];
u16int cgram[256];
-u16int oamaddr, vramlatch, keylatch;
+u16int oamaddr, vramlatch;
+u32int keylatch, lastkeys;
enum {
OAMLATCH,
CGLATCH,
@@ -62,6 +63,31 @@ swaprb(u16int a)
return (a & 0x83e0) | (a & 0x7c00) >> 10 | (a & 0x001f) << 10;
}
+static void
+mouselatch(void)
+{
+ int x, y;
+ u32int v;
+
+ v = keys & 0xffff0000;
+ x = (keys & 0xff) - (lastkeys & 0xff);
+ y = (keys >> 8 & 0xff) - (lastkeys >> 8 & 0xff);
+ if(x < 0){
+ v |= 0x80;
+ x = -x;
+ }
+ if(y < 0){
+ v |= 0x8000;
+ y = -y;
+ }
+ if(x > 127)
+ x = 127;
+ if(y > 127)
+ y = 127;
+ keylatch = v | x | y << 8;
+ lastkeys = keys;
+}
+
u8int
regread(u16int p)
{
@@ -124,9 +150,15 @@ regread(u16int p)
reg[0x2181]++;
return v;
case 0x4016:
- if((reg[0x4016] & 1) != 0)
- return keylatch >> 15;
- v = keylatch >> 15;
+ if((reg[0x4016] & 1) != 0){
+ if(mouse)
+ if((keys & 0x300000) == 0x300000)
+ keys &= ~0x300000;
+ else
+ keys += 0x100000;
+ return keys >> 31;
+ }
+ v = keylatch >> 31;
keylatch = (keylatch << 1) | 1;
return v;
case 0x4017:
@@ -235,8 +267,12 @@ regwrite(u16int p, u8int v)
case 0x213e:
return;
case 0x4016:
- if((reg[0x4016] & 1) != 0 && (v & 1) == 0)
- keylatch = keys;
+ if((reg[0x4016] & 1) != 0 && (v & 1) == 0){
+ if(mouse)
+ mouselatch();
+ else
+ keylatch = keys;
+ }
break;
case 0x4200:
if((reg[0x4200] & 0x80) == 0 && (v & 0x80) != 0 && (reg[RDNMI] & 0x80) != 0)