games/snes: added state saving
This commit is contained in:
parent
4b0467ce44
commit
46168ec503
|
@ -1,26 +1,30 @@
|
||||||
typedef signed char s8int;
|
typedef signed char s8int;
|
||||||
typedef signed short s16int;
|
typedef signed short s16int;
|
||||||
|
|
||||||
extern u16int pc;
|
extern u8int rP, dma, nmi, irq, emu, wai;
|
||||||
extern u32int rPB, curpc;
|
extern u16int rA, rX, rY, rS, rD, pc;
|
||||||
extern u8int dma, nmi, irq;
|
extern u32int rPB, rDB, curpc, hdma;
|
||||||
extern u32int hdma;
|
|
||||||
extern int trace;
|
extern int trace;
|
||||||
extern int memcyc;
|
extern int memcyc;
|
||||||
|
|
||||||
extern uchar *prg, *sram;
|
extern uchar *prg, *sram;
|
||||||
extern int nprg, nsram, hirom;
|
extern int nprg, nsram, hirom;
|
||||||
extern u32int keys, keylatch, lastkeys;
|
extern u32int keys, keylatch, lastkeys;
|
||||||
extern u8int reg[32768], spcmem[65536], vram[65536], oam[544];
|
extern u8int reg[32768], mem[131072], spcmem[65536], vram[65536], oam[544];
|
||||||
extern u16int cgram[256];
|
extern u16int cgram[256], vramlatch;
|
||||||
|
|
||||||
extern int ppux, ppuy, rx;
|
extern int ppux, ppuy, rx;
|
||||||
extern u16int vtime, htime, subcolor, oamaddr;
|
extern u16int vtime, htime, subcolor, oamaddr;
|
||||||
extern u16int hofs[5], vofs[5];
|
extern u16int hofs[5], vofs[5];
|
||||||
extern s16int m7[6];
|
extern s16int m7[6];
|
||||||
|
|
||||||
extern u8int spcmem[65536];
|
extern u8int spcmem[65536], spctimer[4], dsp[256];
|
||||||
|
extern u8int sA, sX, sY, sP, sS;
|
||||||
|
extern u16int spc;
|
||||||
|
extern u8int dspstate;
|
||||||
|
extern u16int dspcounter, noise;
|
||||||
|
|
||||||
|
extern int ppuclock, spcclock, dspclock, stimerclock;
|
||||||
extern int battery, saveclock, scale, mouse;
|
extern int battery, saveclock, scale, mouse;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fns.h"
|
#include "fns.h"
|
||||||
|
|
||||||
static u8int dsp[256], dspstate;
|
u8int dsp[256], dspstate;
|
||||||
static u16int counter, noise;
|
u16int dspcounter, noise;
|
||||||
static s16int samp[2], echoin[2];
|
static s16int samp[2], echoin[2];
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -134,9 +134,9 @@ envyes(int r)
|
||||||
if(r >= 30){
|
if(r >= 30){
|
||||||
if(r == 31)
|
if(r == 31)
|
||||||
return 1;
|
return 1;
|
||||||
return (counter & 1) == 0;
|
return (dspcounter & 1) == 0;
|
||||||
}
|
}
|
||||||
c = counter;
|
c = dspcounter;
|
||||||
switch(r % 3){
|
switch(r % 3){
|
||||||
case 0: c += 536; break;
|
case 0: c += 536; break;
|
||||||
case 2: c += 1040; break;
|
case 2: c += 1040; break;
|
||||||
|
@ -515,8 +515,8 @@ dspstep(void)
|
||||||
dsp[INT|KOFF] = dsp[KOFF];
|
dsp[INT|KOFF] = dsp[KOFF];
|
||||||
dsp[INT|KON] = dsp[NEWKON];
|
dsp[INT|KON] = dsp[NEWKON];
|
||||||
}
|
}
|
||||||
if(counter-- == 0)
|
if(dspcounter-- == 0)
|
||||||
counter = 0x77ff;
|
dspcounter = 0x77ff;
|
||||||
break;
|
break;
|
||||||
case 31: voice(0, 4); voice(2, 1); break;
|
case 31: voice(0, 4); voice(2, 1); break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,3 +17,6 @@ void dspwrite(u8int, u8int);
|
||||||
void dspreset(void);
|
void dspreset(void);
|
||||||
void audioinit(void);
|
void audioinit(void);
|
||||||
int audioout(void);
|
int audioout(void);
|
||||||
|
void flushram(void);
|
||||||
|
void loadstate(char *);
|
||||||
|
void savestate(char *);
|
||||||
|
|
|
@ -9,6 +9,7 @@ OFILES=\
|
||||||
ppu.$O\
|
ppu.$O\
|
||||||
spc.$O\
|
spc.$O\
|
||||||
dsp.$O\
|
dsp.$O\
|
||||||
|
state.$O\
|
||||||
|
|
||||||
HFILES=dat.h fns.h
|
HFILES=dat.h fns.h
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
int ppux, ppuy, rx;
|
int ppux, ppuy, rx;
|
||||||
static u8int mode, bright, pixelpri[2];
|
static u8int mode, bright, pixelpri[2];
|
||||||
static u32int pixelcol[2];
|
static u32int pixelcol[2];
|
||||||
u16int vtime = 0x1ff, htime = 0x1ff, subcolor, mosatop;
|
u16int vtime = 0x1ff, htime = 0x1ff, subcolor;
|
||||||
uchar pic[256*239*2*9];
|
uchar pic[256*239*2*9];
|
||||||
u16int hofs[5], vofs[5];
|
u16int hofs[5], vofs[5];
|
||||||
s16int m7[6];
|
s16int m7[6];
|
||||||
|
|
|
@ -15,7 +15,7 @@ int ppuclock, spcclock, dspclock, stimerclock, saveclock, msgclock, paused, perf
|
||||||
Mousectl *mc;
|
Mousectl *mc;
|
||||||
QLock pauselock;
|
QLock pauselock;
|
||||||
u32int keys;
|
u32int keys;
|
||||||
int savefd, scale, profile, mouse;
|
int savefd, scale, profile, mouse, loadreq, savereq;
|
||||||
Rectangle picr;
|
Rectangle picr;
|
||||||
Image *tmp, *bg;
|
Image *tmp, *bg;
|
||||||
|
|
||||||
|
@ -126,6 +126,10 @@ keyproc(void *)
|
||||||
if(read(fd, buf, sizeof(buf) - 1) <= 0)
|
if(read(fd, buf, sizeof(buf) - 1) <= 0)
|
||||||
sysfatal("read /dev/kbd: %r");
|
sysfatal("read /dev/kbd: %r");
|
||||||
if(buf[0] == 'c'){
|
if(buf[0] == 'c'){
|
||||||
|
if(utfrune(buf, KF|5))
|
||||||
|
savereq = 1;
|
||||||
|
if(utfrune(buf, KF|6))
|
||||||
|
loadreq = 1;
|
||||||
if(utfrune(buf, Kdel)){
|
if(utfrune(buf, Kdel)){
|
||||||
close(fd);
|
close(fd);
|
||||||
threadexitsall(nil);
|
threadexitsall(nil);
|
||||||
|
@ -251,6 +255,14 @@ usage:
|
||||||
spcreset();
|
spcreset();
|
||||||
dspreset();
|
dspreset();
|
||||||
for(;;){
|
for(;;){
|
||||||
|
if(savereq){
|
||||||
|
savestate("snes.save");
|
||||||
|
savereq = 0;
|
||||||
|
}
|
||||||
|
if(loadreq){
|
||||||
|
loadstate("snes.save");
|
||||||
|
loadreq = 0;
|
||||||
|
}
|
||||||
if(paused){
|
if(paused){
|
||||||
qlock(&pauselock);
|
qlock(&pauselock);
|
||||||
qunlock(&pauselock);
|
qunlock(&pauselock);
|
||||||
|
|
184
sys/src/games/snes/state.c
Normal file
184
sys/src/games/snes/state.c
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
#include <u.h>
|
||||||
|
#include <libc.h>
|
||||||
|
#include <thread.h>
|
||||||
|
#include <draw.h>
|
||||||
|
#include <bio.h>
|
||||||
|
#include "dat.h"
|
||||||
|
#include "fns.h"
|
||||||
|
|
||||||
|
static Biobuf *bp;
|
||||||
|
|
||||||
|
void
|
||||||
|
put8(u8int i)
|
||||||
|
{
|
||||||
|
Bputc(bp, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
put16(u16int i)
|
||||||
|
{
|
||||||
|
put8(i);
|
||||||
|
put8(i >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
put32(u32int i)
|
||||||
|
{
|
||||||
|
put8(i);
|
||||||
|
put8(i >> 8);
|
||||||
|
put8(i >> 16);
|
||||||
|
put8(i >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
put16s(u16int *p, int n)
|
||||||
|
{
|
||||||
|
while(n--)
|
||||||
|
put16(*p++);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get8(void)
|
||||||
|
{
|
||||||
|
return Bgetc(bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get16(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = get8();
|
||||||
|
i |= get8() << 8;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get32(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = get8();
|
||||||
|
i |= get8() << 8;
|
||||||
|
i |= get8() << 16;
|
||||||
|
i |= get8() << 24;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
get16s(u16int *p, int n)
|
||||||
|
{
|
||||||
|
while(n--)
|
||||||
|
*p++ = get16();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
loadstate(char *file)
|
||||||
|
{
|
||||||
|
bp = Bopen(file, OREAD);
|
||||||
|
if(bp == nil){
|
||||||
|
message("open: %r");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bread(bp, reg, sizeof(reg));
|
||||||
|
Bread(bp, mem, sizeof(mem));
|
||||||
|
Bread(bp, vram, sizeof(vram));
|
||||||
|
Bread(bp, oam, sizeof(oam));
|
||||||
|
Bread(bp, spcmem, sizeof(spcmem));
|
||||||
|
Bread(bp, dsp, sizeof(dsp));
|
||||||
|
get16s(cgram, nelem(cgram));
|
||||||
|
ppuclock = get32();
|
||||||
|
spcclock = get32();
|
||||||
|
dspclock = get32();
|
||||||
|
stimerclock = get32();
|
||||||
|
rA = get16();
|
||||||
|
rX = get16();
|
||||||
|
rY = get16();
|
||||||
|
rS = get16();
|
||||||
|
rP = get8();
|
||||||
|
rD = get16();
|
||||||
|
rDB = get8()<<16;
|
||||||
|
pc = get16();
|
||||||
|
rPB = get8()<<16;
|
||||||
|
emu = get8();
|
||||||
|
irq = get8();
|
||||||
|
nmi = get8();
|
||||||
|
dma = get8();
|
||||||
|
hdma = get32();
|
||||||
|
wai = get8();
|
||||||
|
oamaddr = get16();
|
||||||
|
vramlatch = get16();
|
||||||
|
keylatch = get32();
|
||||||
|
ppux = get16();
|
||||||
|
ppuy = get16();
|
||||||
|
htime = reg[0x4207] | reg[0x4208] << 8 & 0x100;
|
||||||
|
vtime = reg[0x4209] | reg[0x420a] << 8 & 0x100;
|
||||||
|
subcolor = get16();
|
||||||
|
get16s(hofs, nelem(hofs));
|
||||||
|
get16s(vofs, nelem(vofs));
|
||||||
|
get16s((u16int*) m7, nelem(m7));
|
||||||
|
sA = get8();
|
||||||
|
sX = get8();
|
||||||
|
sY = get8();
|
||||||
|
sS = get8();
|
||||||
|
sP = get8();
|
||||||
|
dspstate = get8();
|
||||||
|
dspcounter = get16();
|
||||||
|
noise = get16();
|
||||||
|
Bterm(bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
savestate(char *file)
|
||||||
|
{
|
||||||
|
flushram();
|
||||||
|
bp = Bopen(file, OWRITE);
|
||||||
|
if(bp == nil){
|
||||||
|
message("open: %r");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bwrite(bp, reg, sizeof(reg));
|
||||||
|
Bwrite(bp, mem, sizeof(mem));
|
||||||
|
Bwrite(bp, vram, sizeof(vram));
|
||||||
|
Bwrite(bp, oam, sizeof(oam));
|
||||||
|
Bwrite(bp, spcmem, sizeof(spcmem));
|
||||||
|
Bwrite(bp, dsp, sizeof(dsp));
|
||||||
|
put16s(cgram, nelem(cgram));
|
||||||
|
put32(ppuclock);
|
||||||
|
put32(spcclock);
|
||||||
|
put32(dspclock);
|
||||||
|
put32(stimerclock);
|
||||||
|
put16(rA);
|
||||||
|
put16(rX);
|
||||||
|
put16(rY);
|
||||||
|
put16(rS);
|
||||||
|
put8(rP);
|
||||||
|
put16(rD);
|
||||||
|
put8(rDB>>16);
|
||||||
|
put16(pc);
|
||||||
|
put8(rPB>>16);
|
||||||
|
put8(emu);
|
||||||
|
put8(irq);
|
||||||
|
put8(nmi);
|
||||||
|
put8(dma);
|
||||||
|
put32(hdma);
|
||||||
|
put8(wai);
|
||||||
|
put16(oamaddr);
|
||||||
|
put16(vramlatch);
|
||||||
|
put32(keylatch);
|
||||||
|
put16(ppux);
|
||||||
|
put16(ppuy);
|
||||||
|
put16(subcolor);
|
||||||
|
put16s(hofs, nelem(hofs));
|
||||||
|
put16s(vofs, nelem(vofs));
|
||||||
|
put16s((u16int*) m7, nelem(m7));
|
||||||
|
put8(sA);
|
||||||
|
put8(sX);
|
||||||
|
put8(sY);
|
||||||
|
put8(sS);
|
||||||
|
put8(sP);
|
||||||
|
put8(dspstate);
|
||||||
|
put16(dspcounter);
|
||||||
|
put16(noise);
|
||||||
|
Bterm(bp);
|
||||||
|
}
|
Loading…
Reference in a new issue