From 8c700685ab5cc1c2de92b521e8e22921bae5c186 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Tue, 23 Jul 2024 17:05:23 +0900 Subject: [PATCH] fix save bug --- Makefile | 4 ++-- gb.c | 31 +++++++++++++++++++++++-------- zelda.sav | Bin 0 -> 8192 bytes 3 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 zelda.sav diff --git a/Makefile b/Makefile index 7b8ffb5..e37556e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC=tcc -CFLAGS= -c -Wall -g -Wextra +CFLAGS= -Wall -g -Wextra -g all: gb @@ -8,4 +8,4 @@ clean: rm -f gb gb: $(OBJ) - $(CC) jmp.S *.c -lSDL2 -o gb + $(CC) jmp.S *.c -lSDL2 -o gb $(CFLAGS) diff --git a/gb.c b/gb.c index 7e54112..2e7c69c 100644 --- a/gb.c +++ b/gb.c @@ -3,11 +3,12 @@ #include #include #include +#include int savereq, loadreq; int cpuhalt; int backup; -FILE *savefp; +int savefd = -1; int saveframes; const char *romname; u8 mbc, feat, mode; @@ -22,11 +23,18 @@ writeback(void) void flushback(void) { - if(savefp != nil) - fwrite(back, 1, nback, savefp); + if(savefd >= 0) + pwrite(savefd, back, nback, 0); saveframes = 0; } +static void +_flushback(void) +{ + flushback(); + close(savefd); +} + static void loadsave(const char *file) { @@ -38,16 +46,23 @@ loadsave(const char *file) 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); + savefd = open(buf, O_RDWR); + if(savefd == -1){ + savefd = open(buf, O_RDWR|O_CREAT, 0664); + if(savefd == -1) + error("Can't load save file '%s'", file); + back = xalloc(nback); + if(write(savefd, back, nback)!= nback) + error("Can't Write %d byte to savefile", nback); + atexit(_flushback); free(buf); return; } back = xalloc(nback); - fwrite(back, 1, nback, savefp); + if(read(savefd, back, nback) != nback) + error("savefile size is not matched\n"); + atexit(_flushback); free(buf); - atexit(flushback); } static void diff --git a/zelda.sav b/zelda.sav new file mode 100644 index 0000000000000000000000000000000000000000..7dac3ef531594267edf31827008196a754588fc8 GIT binary patch literal 8192 zcmeIxF$w@62mrt$BKkq^@&Au%YHbRa&P72`Jg}6%qqaWg-vq8F@Khio&b-x5b<3Xc orlUt7LBJCxAX`Cz009C72oNAZfB*pk1PBlyK!5-N0t8Y7Hhxh7EdT%j literal 0 HcmV?d00001