add loadsave
loadsave: only for BAT features cartidge [load|save] state: for all cartidge. It's like snapshot
This commit is contained in:
parent
4661fc35bb
commit
bc76c36ed4
1
.gitignore
vendored
1
.gitignore
vendored
@ -7,6 +7,7 @@
|
|||||||
*.obj
|
*.obj
|
||||||
*.elf
|
*.elf
|
||||||
.*.swp
|
.*.swp
|
||||||
|
*.gb
|
||||||
|
|
||||||
# Linker output
|
# Linker output
|
||||||
*.ilk
|
*.ilk
|
||||||
|
|||||||
10
eui.c
10
eui.c
@ -9,7 +9,7 @@ u8* pic;
|
|||||||
SDL_Renderer* renderer;
|
SDL_Renderer* renderer;
|
||||||
SDL_Texture* bitmapTex;
|
SDL_Texture* bitmapTex;
|
||||||
|
|
||||||
static void
|
void
|
||||||
render()
|
render()
|
||||||
{
|
{
|
||||||
SDL_UpdateTexture(bitmapTex, nil, pic, 160 * sizeof(u32));
|
SDL_UpdateTexture(bitmapTex, nil, pic, 160 * sizeof(u32));
|
||||||
@ -29,6 +29,8 @@ joypadevent(void*_)
|
|||||||
case SDL_KEYUP: keys = 0; break;
|
case SDL_KEYUP: keys = 0; break;
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
switch (evt.key.keysym.scancode) {
|
switch (evt.key.keysym.scancode) {
|
||||||
|
case SDL_SCANCODE_F1: savereq = 1; break;
|
||||||
|
case SDL_SCANCODE_F2: loadreq = 1; break;
|
||||||
case SDL_SCANCODE_X: keys = GB_KEY_A; break;
|
case SDL_SCANCODE_X: keys = GB_KEY_A; break;
|
||||||
case SDL_SCANCODE_Z: keys = GB_KEY_B; break;
|
case SDL_SCANCODE_Z: keys = GB_KEY_B; break;
|
||||||
case SDL_SCANCODE_UP: keys = GB_KEY_UP; break;
|
case SDL_SCANCODE_UP: keys = GB_KEY_UP; break;
|
||||||
@ -45,12 +47,6 @@ joypadevent(void*_)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
flush()
|
|
||||||
{
|
|
||||||
render();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
initwindow(int scale)
|
initwindow(int scale)
|
||||||
{
|
{
|
||||||
|
|||||||
2
ev.c
2
ev.c
@ -1,7 +1,7 @@
|
|||||||
#include "gb.h"
|
#include "gb.h"
|
||||||
|
|
||||||
Event evhblank, evjoypad;
|
Event evhblank, evjoypad;
|
||||||
Event *events[NEVENT] = {&evhblank, &evjoypad, nil};
|
Event *events[NEVENT] = {&evhblank, &evjoypad};
|
||||||
Event* elist;
|
Event* elist;
|
||||||
|
|
||||||
Var evvars[] = {{nil, 0, 0}};
|
Var evvars[] = {{nil, 0, 0}};
|
||||||
|
|||||||
75
gb.c
75
gb.c
@ -1,12 +1,56 @@
|
|||||||
#include "gb.h"
|
#include "gb.h"
|
||||||
#include "co/task.h"
|
#include "co/task.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int savereq, loadreq;
|
||||||
int cpuhalt;
|
int cpuhalt;
|
||||||
int backup;
|
int backup;
|
||||||
int savefd = -1;
|
FILE *savefp;
|
||||||
|
int saveframes;
|
||||||
|
const char *romname;
|
||||||
u8 mbc, feat, mode;
|
u8 mbc, feat, mode;
|
||||||
|
|
||||||
|
void
|
||||||
|
writeback(void)
|
||||||
|
{
|
||||||
|
if(saveframes == 0)
|
||||||
|
saveframes = 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
flushback(void)
|
||||||
|
{
|
||||||
|
if(savefp != nil)
|
||||||
|
fwrite(back, 1, nback, savefp);
|
||||||
|
saveframes = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
loadsave(const char *file)
|
||||||
|
{
|
||||||
|
u8 *buf, *p;
|
||||||
|
|
||||||
|
buf = xalloc(strlen(file) + 4);
|
||||||
|
strcpy(buf, file);
|
||||||
|
p = strrchr(buf, '.');
|
||||||
|
if(p == nil)
|
||||||
|
p = buf + strlen(buf);
|
||||||
|
strcpy(p, ".sav");
|
||||||
|
savefp = fopen(buf, "w+");
|
||||||
|
if(savefp == 0){
|
||||||
|
error("Can't load save file '%s'", file);
|
||||||
|
free(buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
back = xalloc(nback);
|
||||||
|
fwrite(back, 1, nback, savefp);
|
||||||
|
free(buf);
|
||||||
|
atexit(flushback);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
loadrom(const char* file)
|
loadrom(const char* file)
|
||||||
{
|
{
|
||||||
@ -47,7 +91,6 @@ loadrom(const char* file)
|
|||||||
default: panic("Unkown Ram size %d\n", rom[0x149]);
|
default: panic("Unkown Ram size %d\n", rom[0x149]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
back = xalloc(nback);
|
|
||||||
if(nback == 0)
|
if(nback == 0)
|
||||||
nbackbank = 1;
|
nbackbank = 1;
|
||||||
else
|
else
|
||||||
@ -59,6 +102,32 @@ loadrom(const char* file)
|
|||||||
}
|
}
|
||||||
if ((rom[0x143] & 0x80) != 0 && (mode & FORCEDMG) == 0)
|
if ((rom[0x143] & 0x80) != 0 && (mode & FORCEDMG) == 0)
|
||||||
mode = CGB | COL;
|
mode = CGB | COL;
|
||||||
|
if((feat & FEATBAT) != 0)
|
||||||
|
loadsave(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
flush()
|
||||||
|
{
|
||||||
|
static char *savestatename;
|
||||||
|
if (savestatename == 0){
|
||||||
|
int len = strlen(romname);
|
||||||
|
savestatename = xalloc(len + 4);
|
||||||
|
strncpy(savestatename, romname, len);
|
||||||
|
strcpy(savestatename + len, "-state.save");
|
||||||
|
}
|
||||||
|
|
||||||
|
render();
|
||||||
|
if(saveframes > 0 && -- saveframes == 0)
|
||||||
|
flushback();
|
||||||
|
if(savereq){
|
||||||
|
savestate(savestatename);
|
||||||
|
savereq = 0;
|
||||||
|
}
|
||||||
|
if(loadreq){
|
||||||
|
loadstate(savestatename);
|
||||||
|
loadreq = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -80,8 +149,8 @@ colinit(void)
|
|||||||
void
|
void
|
||||||
taskmain(int argc, char* argv[])
|
taskmain(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
loadrom(romname = argv[1]);
|
||||||
colinit();
|
colinit();
|
||||||
loadrom(argv[1]);
|
|
||||||
initwindow(5);
|
initwindow(5);
|
||||||
initevent();
|
initevent();
|
||||||
meminit();
|
meminit();
|
||||||
|
|||||||
14
gb.h
14
gb.h
@ -132,7 +132,7 @@ enum
|
|||||||
GB_KEY_START = 0x80
|
GB_KEY_START = 0x80
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { NEVENT = 2 + 1};
|
enum { NEVENT = 2 };
|
||||||
|
|
||||||
typedef uint8_t u8;
|
typedef uint8_t u8;
|
||||||
typedef uint16_t u16;
|
typedef uint16_t u16;
|
||||||
@ -180,6 +180,7 @@ extern u32 white;
|
|||||||
extern u8* pic;
|
extern u8* pic;
|
||||||
extern int (*mapper)(int, int);
|
extern int (*mapper)(int, int);
|
||||||
extern Event *events[NEVENT];
|
extern Event *events[NEVENT];
|
||||||
|
extern int savereq, loadreq;
|
||||||
|
|
||||||
/* joypad */
|
/* joypad */
|
||||||
void
|
void
|
||||||
@ -219,15 +220,22 @@ reset(void);
|
|||||||
|
|
||||||
/* graphic */
|
/* graphic */
|
||||||
void
|
void
|
||||||
flush();
|
|
||||||
void
|
|
||||||
initwindow(int scale);
|
initwindow(int scale);
|
||||||
|
void
|
||||||
|
render();
|
||||||
|
|
||||||
/* save */
|
/* save */
|
||||||
void
|
void
|
||||||
putvars(Var *v);
|
putvars(Var *v);
|
||||||
void
|
void
|
||||||
getvars(Var *v);
|
getvars(Var *v);
|
||||||
|
void
|
||||||
|
flush();
|
||||||
|
int
|
||||||
|
savestate(const char *fname);
|
||||||
|
int
|
||||||
|
loadstate(const char *fname);
|
||||||
|
|
||||||
/* error */
|
/* error */
|
||||||
void
|
void
|
||||||
error(const char*, ...);
|
error(const char*, ...);
|
||||||
|
|||||||
1
mem.c
1
mem.c
@ -160,6 +160,7 @@ memwrite(u16 a, u8 v)
|
|||||||
eramb[a - 0xa000] = v;
|
eramb[a - 0xa000] = v;
|
||||||
else
|
else
|
||||||
mapper(a, v);
|
mapper(a, v);
|
||||||
|
writeback();
|
||||||
return;
|
return;
|
||||||
case 12: case 14:
|
case 12: case 14:
|
||||||
wram[a & 0xFFF] = v;
|
wram[a & 0xFFF] = v;
|
||||||
|
|||||||
14
save.c
14
save.c
@ -14,7 +14,7 @@ putevents(void)
|
|||||||
if(elist == events[i]) /* find head */
|
if(elist == events[i]) /* find head */
|
||||||
break;
|
break;
|
||||||
if(i == NEVENT && elist != nil)
|
if(i == NEVENT && elist != nil)
|
||||||
error("Unkown event in chain [%p]", e->next);
|
error("Unkown event in chain [%p]", elist);
|
||||||
fputc(i, fp);
|
fputc(i, fp);
|
||||||
for(i = 0; i < NEVENT; ++i){
|
for(i = 0; i < NEVENT; ++i){
|
||||||
e = events[i];
|
e = events[i];
|
||||||
@ -125,10 +125,10 @@ getevents(void)
|
|||||||
Event *e;
|
Event *e;
|
||||||
|
|
||||||
i = fgetc(fp);
|
i = fgetc(fp);
|
||||||
if(i > NEVENT){
|
if(i >= NEVENT)
|
||||||
error("Unkown event index [%d]", i);
|
|
||||||
elist = nil;
|
elist = nil;
|
||||||
}
|
else
|
||||||
|
elist = events[i];
|
||||||
for(i = 0; i < NEVENT; ++i){
|
for(i = 0; i < NEVENT; ++i){
|
||||||
e = events[i];
|
e = events[i];
|
||||||
e->time = fgetc(fp);
|
e->time = fgetc(fp);
|
||||||
@ -136,12 +136,10 @@ getevents(void)
|
|||||||
e->time |= fgetc(fp) << 16;
|
e->time |= fgetc(fp) << 16;
|
||||||
e->time |= fgetc(fp) << 24;
|
e->time |= fgetc(fp) << 24;
|
||||||
j = fgetc(fp);
|
j = fgetc(fp);
|
||||||
if(j >= NEVENT){
|
if(j >= NEVENT)
|
||||||
error("Unkown event index [%d]", j);
|
|
||||||
e->next = nil;
|
e->next = nil;
|
||||||
}else{
|
else
|
||||||
e->next = events[j];
|
e->next = events[j];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user