summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorftrvxmtrx <devnull@localhost>2014-06-01 01:21:00 +0200
committerftrvxmtrx <devnull@localhost>2014-06-01 01:21:00 +0200
commit8061f30e559569943324a666ee2fcc74048785cd (patch)
tree8583c17a08eddf4f51f15d3e3e2f476740adfd62
parentbf0d5c8abbe9d4e3a145df29bee8ef2758d01884 (diff)
games/nes: support Battle City two players mode with joypads
-rw-r--r--sys/src/games/nes/dat.h4
-rwxr-xr-xsys/src/games/nes/joynes33
-rw-r--r--sys/src/games/nes/mem.c12
-rw-r--r--sys/src/games/nes/nes.c48
-rw-r--r--sys/src/games/nes/state.c2
5 files changed, 93 insertions, 6 deletions
diff --git a/sys/src/games/nes/dat.h b/sys/src/games/nes/dat.h
index 4f774dfe3..8da07fa84 100644
--- a/sys/src/games/nes/dat.h
+++ b/sys/src/games/nes/dat.h
@@ -4,7 +4,7 @@ extern u8int irq, nmi;
extern uchar mem[32768], ppuram[16384], oam[256];
extern u16int pput, ppuv;
extern u8int ppusx, vrambuf;
-extern int mirr, ppux, ppuy, odd, vramlatch, keylatch;
+extern int mirr, ppux, ppuy, odd, vramlatch, keylatch, keylatch2;
extern int map, scale, mmc3hack, oflag;
extern uchar *prg, *chr;
@@ -13,7 +13,7 @@ extern int nprg, nchr, map, chrram;
extern u8int apuseq, apuctr[13];
extern u16int dmcaddr, dmccnt;
-extern int keys, clock, ppuclock, apuclock, dmcclock, dmcfreq, saveclock, paused;
+extern int keys, keys2, clock, ppuclock, apuclock, dmcclock, dmcfreq, saveclock, paused;
extern void (*mapper[])(int, u8int);
diff --git a/sys/src/games/nes/joynes b/sys/src/games/nes/joynes
new file mode 100755
index 000000000..2240b88e9
--- /dev/null
+++ b/sys/src/games/nes/joynes
@@ -0,0 +1,33 @@
+#!/bin/rc
+# run as "nusb/joy epX.Y | joynes N", where N=[1,2]
+
+awk -safe -v 'joy='$1 '
+ BEGIN { k[0] = "" }
+
+ /^axis 0 0/ { k[0] = "left " }
+ /^axis 0 255/ { k[0] = "right " }
+ /^axis 0 128/ { k[0] = "" }
+
+ /^axis 1 0/ { k[1] = "up " }
+ /^axis 1 255/ { k[1] = "down " }
+ /^axis 1 128/ { k[1] = "" }
+
+ /^down 7$/ { k[3] = "b " }
+ /^down 8$/ { k[2] = "a " }
+ /^down 1$/ { k[4] = "control " }
+ /^down 2$/ { k[5] = "start " }
+
+ /^up 7$/ { k[3] = "" }
+ /^up 8$/ { k[2] = "" }
+ /^up 1$/ { k[4] = "" }
+ /^up 2$/ { k[5] = "" }
+
+ {
+ if(joy != "")
+ printf "joy%s ", joy
+ for(i = 0; i <= 5; i++)
+ printf k[i]
+ printf "\n"
+ fflush
+ }
+'
diff --git a/sys/src/games/nes/mem.c b/sys/src/games/nes/mem.c
index 63a851d56..575cf0c0e 100644
--- a/sys/src/games/nes/mem.c
+++ b/sys/src/games/nes/mem.c
@@ -11,7 +11,7 @@ uchar oam[256];
uchar *prgb[16], *chrb[16];
u16int pput, ppuv;
u8int ppusx, vrambuf;
-int vramlatch = 1, keylatch = 0xFF;
+int vramlatch = 1, keylatch = 0xFF, keylatch2 = 0xFF;
int prgsh, chrsh, mmc3hack;
static void
@@ -395,7 +395,11 @@ memread(u16int p)
keylatch = (keylatch >> 1) | 0x80;
return v | 0x40;
case 0x4017:
- return 0x40;
+ if((mem[p] & 1) != 0)
+ return keys2 & 1;
+ v = keylatch2 & 1;
+ keylatch2 = (keylatch2 >> 1) | 0x80;
+ return v | 0x40;
}
}
if(p >= 0x8000){
@@ -489,8 +493,10 @@ memwrite(u16int p, u8int v)
irq &= ~IRQDMC;
break;
case 0x4016:
- if((mem[p] & 1) != 0 && (v & 1) == 0)
+ if((mem[p] & 1) != 0 && (v & 1) == 0){
keylatch = keys;
+ keylatch2 = keys2;
+ }
break;
case APUFRAME:
apuseq = 0;
diff --git a/sys/src/games/nes/nes.c b/sys/src/games/nes/nes.c
index 5cc6c1c3b..78c25adb3 100644
--- a/sys/src/games/nes/nes.c
+++ b/sys/src/games/nes/nes.c
@@ -15,7 +15,7 @@ Rectangle picr;
Image *tmp, *bg;
int clock, ppuclock, apuclock, dmcclock, dmcfreq, sampclock, msgclock, saveclock;
Mousectl *mc;
-int keys, paused, savereq, loadreq, oflag, savefd = -1;
+int keys, keys2, paused, savereq, loadreq, oflag, savefd = -1;
int mirr;
QLock pauselock;
@@ -125,6 +125,51 @@ loadrom(char *file, int sflag)
extern int trace;
void
+joyproc(void *)
+{
+ char *s, *down[9];
+ static char buf[64];
+ int n, k, j;
+
+ j = 1;
+ for(;;){
+ n = read(0, buf, sizeof(buf) - 1);
+ if(n <= 0)
+ sysfatal("read: %r");
+ buf[n] = 0;
+ n = getfields(buf, down, nelem(down), 1, " ");
+ k = 0;
+ for(n--; n >= 0; n--){
+ s = down[n];
+ if(strcmp(s, "joy1") == 0)
+ j = 1;
+ else if(strcmp(s, "joy2") == 0)
+ j = 2;
+ else if(strcmp(s, "a") == 0)
+ k |= 1<<0;
+ else if(strcmp(s, "b") == 0)
+ k |= 1<<1;
+ else if(strcmp(s, "control") == 0)
+ k |= 1<<2;
+ else if(strcmp(s, "start") == 0)
+ k |= 1<<3;
+ else if(strcmp(s, "up") == 0)
+ k |= 1<<4;
+ else if(strcmp(s, "down") == 0)
+ k |= 1<<5;
+ else if(strcmp(s, "left") == 0)
+ k |= 1<<6;
+ else if(strcmp(s, "right") == 0)
+ k |= 1<<7;
+ }
+ if(j == 2)
+ keys2 = k;
+ else
+ keys = k;
+ }
+}
+
+void
keyproc(void *)
{
int fd, k;
@@ -220,6 +265,7 @@ threadmain(int argc, char **argv)
mc = initmouse(nil, screen);
if(mc == nil)
sysfatal("initmouse: %r");
+ proccreate(joyproc, nil, 8192);
proccreate(keyproc, nil, 8192);
originwindow(screen, Pt(0, 0), screen->r.min);
p = divpt(addpt(screen->r.min, screen->r.max), 2);
diff --git a/sys/src/games/nes/state.c b/sys/src/games/nes/state.c
index e1b37f54a..04fa45c19 100644
--- a/sys/src/games/nes/state.c
+++ b/sys/src/games/nes/state.c
@@ -89,6 +89,7 @@ loadstate(char *file)
odd = get8();
vramlatch = get8();
keylatch = get8();
+ keylatch2 = get8();
vrambuf = get8();
clock = get32();
ppuclock = get32();
@@ -130,6 +131,7 @@ savestate(char *file)
put8(odd);
put8(vramlatch);
put8(keylatch);
+ put8(keylatch2);
put8(vrambuf);
put32(clock);
put32(ppuclock);