Made ZMV store the start method, powercycle ZMVs are now possible, using a power-on state

This commit is contained in:
grinvader
2005-03-23 17:56:56 +00:00
parent 8b0b13366e
commit 80e723c9f9
6 changed files with 271 additions and 199 deletions

View File

@@ -718,6 +718,9 @@ NEWSYM start65816
; rep stosd ; rep stosd
cmp byte[romloadskip],1 cmp byte[romloadskip],1
je near StartGUI je near StartGUI
cmp byte[MovieProcessing],0
je continueprog
ret
NEWSYM continueprog NEWSYM continueprog

View File

@@ -166,7 +166,7 @@ EXTSYM GUIHQ3X
EXTSYM GUIHQ4X EXTSYM GUIHQ4X
EXTSYM firstsaveinc EXTSYM firstsaveinc
EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6 EXTSYM nssdip1,nssdip2,nssdip3,nssdip4,nssdip5,nssdip6
EXTSYM SkipMovie,MovieStop,MoviePlay,MovieRecord,MovieInsertChapter EXTSYM SkipMovie,MovieStop,MoviePlay,MovieRecord,MovieInsertChapter,init
EXTSYM MovieSeekAhead,MovieSeekBehind EXTSYM MovieSeekAhead,MovieSeekBehind
%ifdef __LINUX__ %ifdef __LINUX__

View File

@@ -398,5 +398,3 @@ NEWSYM GUIDoReset
mov byte[Voice7Status],0 mov byte[Voice7Status],0
mov byte[GUIQuit],2 mov byte[GUIQuit],2
ret ret

View File

@@ -57,7 +57,7 @@ EXTSYM NumComboLocl,ComboBlHeader,ComboHeader,CombinDataLocl
EXTSYM CombinDataGlob,NumCombo,GUIComboGameSpec EXTSYM CombinDataGlob,NumCombo,GUIComboGameSpec
EXTSYM mousexloc,mouseyloc EXTSYM mousexloc,mouseyloc
EXTSYM extlatch EXTSYM extlatch
EXTSYM BackState EXTSYM BackState,clearmem2,NextLineCache,sramsavedis
EXTSYM FIRTAPVal0,FIRTAPVal1,FIRTAPVal2,FIRTAPVal3,FIRTAPVal4 EXTSYM FIRTAPVal0,FIRTAPVal1,FIRTAPVal2,FIRTAPVal3,FIRTAPVal4
EXTSYM FIRTAPVal5,FIRTAPVal6,FIRTAPVal7,INTEnab,JoyAPos,JoyBPos EXTSYM FIRTAPVal5,FIRTAPVal6,FIRTAPVal7,INTEnab,JoyAPos,JoyBPos
EXTSYM NMIEnab,SPCROM,VIRQLoc,coladdb,coladdg,coladdr,doirqnext EXTSYM NMIEnab,SPCROM,VIRQLoc,coladdb,coladdg,coladdr,doirqnext
@@ -67,7 +67,7 @@ EXTSYM opexec268cphb,opexec358,opexec358b,opexec358cph,spcextraram
EXTSYM opexec358cphb,prevoamptr,reg1read,reg2read,reg3read EXTSYM opexec358cphb,prevoamptr,reg1read,reg2read,reg3read
EXTSYM reg4read,resolutn,romdata,scrndis,spcP,spcRam EXTSYM reg4read,resolutn,romdata,scrndis,spcP,spcRam
EXTSYM spcnumread,spchalted,tableD,timeron,vidbright,OldGfxMode2 EXTSYM spcnumread,spchalted,tableD,timeron,vidbright,OldGfxMode2
EXTSYM SPC700read,SPC700write,GUIDoReset,spc700read, GUIReset EXTSYM SPC700read,SPC700write,GUIDoReset,spc700read,GUIReset
EXTSYM InitC4,SA1Reset,SetAddressingModesSA1,SetAddressingModes,SDD1BankA,SPC7110init EXTSYM InitC4,SA1Reset,SetAddressingModesSA1,SetAddressingModes,SDD1BankA,SPC7110init
EXTSYM RTCinit,InitOBC EXTSYM RTCinit,InitOBC
EXTSYM memaccessspc7110r8,memaccessspc7110r16,memaccessspc7110w8 EXTSYM memaccessspc7110r8,memaccessspc7110r16,memaccessspc7110w8

View File

@@ -34,6 +34,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#endif #endif
#include "zip/zunzip.h" #include "zip/zunzip.h"
#include "jma/zsnesjma.h" #include "jma/zsnesjma.h"
#include "asm_call.h"
#ifndef __GNUC__ #ifndef __GNUC__
#define strcasecmp stricmp #define strcasecmp stricmp
@@ -1279,31 +1280,6 @@ extern unsigned char *vcache2b;
extern unsigned char *vcache4b; extern unsigned char *vcache4b;
extern unsigned char *vcache8b; extern unsigned char *vcache8b;
void clearmem2();
void clearmem()
{
memset(vidbuffer, 0, 131072);
memset(wramdataa, 0, 65536);
memset(ram7fa, 0, 65536);
memset(vram, 0, 65536);
memset(srama, 0, 65536);
memset(debugbufa, 0, 80000);
memset(regptra, 0, 49152);
memset(regptwa, 0, 49152);
memset(vcache2b, 0, 262144);
memset(vcache4b, 0, 131072);
memset(vcache8b, 0, 65536);
memset(vidmemch2, 0, 4096);
memset(vidmemch4, 0, 4096);
memset(vidmemch8, 0, 4096);
memset(pal16b, 0, 1024);
memset(pal16bcl, 0, 1024);
memset(pal16bclha, 0, 1024);
memset(pal16bxcl, 0xFF, 256);
memset(romdata, 0xFF, maxromspace+32768);
clearmem2();
}
void clearSPCRAM() void clearSPCRAM()
{ {
/* /*
@@ -1333,6 +1309,30 @@ void clearmem2()
clearSPCRAM(); clearSPCRAM();
} }
void clearmem()
{
memset(vidbuffer, 0, 131072);
memset(wramdataa, 0, 65536);
memset(ram7fa, 0, 65536);
memset(vram, 0, 65536);
memset(srama, 0, 65536);
memset(debugbufa, 0, 80000);
memset(regptra, 0, 49152);
memset(regptwa, 0, 49152);
memset(vcache2b, 0, 262144);
memset(vcache4b, 0, 131072);
memset(vcache8b, 0, 65536);
memset(vidmemch2, 0, 4096);
memset(vidmemch4, 0, 4096);
memset(vidmemch8, 0, 4096);
memset(pal16b, 0, 1024);
memset(pal16bcl, 0, 1024);
memset(pal16bclha, 0, 1024);
memset(pal16bxcl, 0xFF, 256);
memset(romdata, 0xFF, maxromspace+32768);
clearmem2();
}
extern unsigned char BRRBuffer[32]; extern unsigned char BRRBuffer[32];
extern unsigned char echoon0; extern unsigned char echoon0;
extern unsigned int PHdspsave; extern unsigned int PHdspsave;
@@ -1803,3 +1803,35 @@ unsigned int showinfogui()
Msgptr = CSStatus; Msgptr = CSStatus;
return (MsgCount); return (MsgCount);
} }
extern unsigned int nmiprevaddrl, nmiprevaddrh, nmirept, nmiprevline, nmistatus;
extern unsigned int spcnumread, spchalted;
extern unsigned char NextLineCache, sramsavedis, sndrot, regsbackup[3019];
extern unsigned char yesoutofmemory;
void powercycle()
{
memset(sram, 0xFF, 8192*4);
clearSPCRAM();
nmiprevaddrl = 0;
nmiprevaddrh = 0;
nmirept = 0;
nmiprevline = 224;
nmistatus = 0;
spcnumread = 0;
spchalted = ~0;
NextLineCache = 0;
curexecstate = 1;
asm_call(SetupROM);
asm_call(initsnes);
sramsavedis = 0;
memcpy(&sndrot, regsbackup, 3019);
if (yesoutofmemory == 1) { asm_call(outofmemfix); }
asm_call(GUIDoReset);
}

View File

@@ -95,7 +95,7 @@ Key input - Repeated for all input / internal chapters
1 bit - Controller 2 changed 1 bit - Controller 2 changed
1 bit - Controller 3 changed 1 bit - Controller 3 changed
1 bit - Controller 4 changed 1 bit - Controller 4 changed
1 bit - Controller 5 changed 1 bit - Controller 5 changed
1 bit - Chapter instead of input here 1 bit - Chapter instead of input here
2 bits - Reserved 2 bits - Reserved
@@ -159,7 +159,7 @@ enum zmv_video_modes { zmv_vm_ntsc, zmv_vm_pal };
#define EXT_CHAP_SIZE (cur_zst_size+4+8+4) #define EXT_CHAP_SIZE (cur_zst_size+4+8+4)
#define INT_CHAP_INDEX_SIZE (zmv_vars.header.internal_chapters*4) #define INT_CHAP_INDEX_SIZE (zmv_vars.header.internal_chapters*4)
#define EXT_CHAP_BLOCK_SIZE (zmv_open_vars.external_chapter_count*EXT_CHAP_SIZE + 2) #define EXT_CHAP_BLOCK_SIZE (zmv_open_vars.external_chapter_count*EXT_CHAP_SIZE + 2)
#define EXT_CHAP_END_DIST (EXT_CHAP_BLOCK_SIZE + (size_t)zmv_vars.header.author_len) #define EXT_CHAP_END_DIST (EXT_CHAP_BLOCK_SIZE + (size_t)zmv_vars.header.author_len)
#define INT_CHAP_END_DIST (INT_CHAP_INDEX_SIZE + EXT_CHAP_END_DIST) #define INT_CHAP_END_DIST (INT_CHAP_INDEX_SIZE + EXT_CHAP_END_DIST)
@@ -189,7 +189,7 @@ struct zmv_header
static void zmv_header_write(struct zmv_header *zmv_head, FILE *fp) static void zmv_header_write(struct zmv_header *zmv_head, FILE *fp)
{ {
unsigned char flag = 0; unsigned char flag = 0;
fwrite(zmv_head->magic, 3, 1, fp); fwrite(zmv_head->magic, 3, 1, fp);
fwrite2(zmv_head->zsnes_version, fp); fwrite2(zmv_head->zsnes_version, fp);
fwrite4(zmv_head->rom_crc32, fp); fwrite4(zmv_head->rom_crc32, fp);
@@ -201,19 +201,19 @@ static void zmv_header_write(struct zmv_header *zmv_head, FILE *fp)
fwrite2(zmv_head->internal_chapters, fp); fwrite2(zmv_head->internal_chapters, fp);
fwrite2(zmv_head->author_len, fp); fwrite2(zmv_head->author_len, fp);
fwrite3(zmv_head->zst_size, fp); fwrite3(zmv_head->zst_size, fp);
switch (zmv_head->zmv_flag.start_method) switch (zmv_head->zmv_flag.start_method)
{ {
case zmv_sm_zst: case zmv_sm_zst:
flag &= ~BIT(7); flag &= ~BIT(7);
flag &= ~BIT(6); flag &= ~BIT(6);
break; break;
case zmv_sm_power: case zmv_sm_power:
flag |= BIT(7); flag |= BIT(7);
flag &= ~BIT(6); flag &= ~BIT(6);
break; break;
case zmv_sm_reset: case zmv_sm_reset:
flag &= ~BIT(7); flag &= ~BIT(7);
flag |= BIT(6); flag |= BIT(6);
@@ -245,7 +245,7 @@ static void zmv_header_write(struct zmv_header *zmv_head, FILE *fp)
static bool zmv_header_read(struct zmv_header *zmv_head, FILE *fp) static bool zmv_header_read(struct zmv_header *zmv_head, FILE *fp)
{ {
unsigned char flag; unsigned char flag;
fread(zmv_head->magic, 3, 1, fp); fread(zmv_head->magic, 3, 1, fp);
zmv_head->zsnes_version = fread2(fp); zmv_head->zsnes_version = fread2(fp);
zmv_head->rom_crc32 = fread4(fp); zmv_head->rom_crc32 = fread4(fp);
@@ -258,42 +258,42 @@ static bool zmv_header_read(struct zmv_header *zmv_head, FILE *fp)
zmv_head->author_len = fread2(fp); zmv_head->author_len = fread2(fp);
zmv_head->zst_size = fread3(fp); zmv_head->zst_size = fread3(fp);
fread(&flag, 1, 1, fp); fread(&flag, 1, 1, fp);
if (feof(fp)) if (feof(fp))
{ {
return(false); return(false);
} }
switch (flag & (BIT(7)|BIT(6))) switch (flag & (BIT(7)|BIT(6)))
{ {
case 0: case 0:
zmv_head->zmv_flag.start_method = zmv_sm_zst; zmv_head->zmv_flag.start_method = zmv_sm_zst;
break; break;
case BIT(7): case BIT(7):
zmv_head->zmv_flag.start_method = zmv_sm_power; zmv_head->zmv_flag.start_method = zmv_sm_power;
break; break;
case BIT(6): case BIT(6):
zmv_head->zmv_flag.start_method = zmv_sm_reset; zmv_head->zmv_flag.start_method = zmv_sm_reset;
break; break;
case BIT(7)|BIT(6): case BIT(7)|BIT(6):
return(false); return(false);
break; break;
} }
switch (flag & BIT(5)) switch (flag & BIT(5))
{ {
case 0: case 0:
zmv_head->zmv_flag.video_mode = zmv_vm_ntsc; zmv_head->zmv_flag.video_mode = zmv_vm_ntsc;
break; break;
case BIT(5): case BIT(5):
zmv_head->zmv_flag.video_mode = zmv_vm_pal; zmv_head->zmv_flag.video_mode = zmv_vm_pal;
break; break;
} }
if (flag & (BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0))) if (flag & (BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)))
{ {
return(false); return(false);
@@ -322,14 +322,14 @@ static void internal_chapter_add_offset(struct internal_chapter_buf *icb, size_t
{ {
icb = icb->next; icb = icb->next;
} }
if (icb->used == INTERNAL_CHAPTER_BUF_LIM) if (icb->used == INTERNAL_CHAPTER_BUF_LIM)
{ {
icb->next = (struct internal_chapter_buf *)malloc(sizeof(struct internal_chapter_buf)); icb->next = (struct internal_chapter_buf *)malloc(sizeof(struct internal_chapter_buf));
icb = icb->next; icb = icb->next;
memset(icb, 0, sizeof(struct internal_chapter_buf)); memset(icb, 0, sizeof(struct internal_chapter_buf));
} }
icb->offsets[icb->used] = offset; icb->offsets[icb->used] = offset;
icb->used++; icb->used++;
} }
@@ -442,7 +442,7 @@ static size_t internal_chapter_delete_after(struct internal_chapter_buf *icb, si
last_offset = offset; last_offset = offset;
} }
} }
if (last_offset) if (last_offset)
{ {
size_t buffer_pos = internal_chapter_pos(icb, last_offset); size_t buffer_pos = internal_chapter_pos(icb, last_offset);
@@ -452,7 +452,7 @@ static size_t internal_chapter_delete_after(struct internal_chapter_buf *icb, si
{ {
icb = icb->next; icb = icb->next;
} }
internal_chapter_free_chain(icb->next); internal_chapter_free_chain(icb->next);
icb->next = 0; icb->next = 0;
icb->used = (buffer_pos%INTERNAL_CHAPTER_BUF_LIM)+1; icb->used = (buffer_pos%INTERNAL_CHAPTER_BUF_LIM)+1;
@@ -522,14 +522,14 @@ static void read_last_joy_state(FILE *fp)
} }
static void flush_input_buffer() static void flush_input_buffer()
{ {
if (zmv_vars.write_buffer_loc) if (zmv_vars.write_buffer_loc)
{ {
fwrite(zmv_vars.write_buffer, zmv_vars.write_buffer_loc, 1, zmv_vars.fp); fwrite(zmv_vars.write_buffer, zmv_vars.write_buffer_loc, 1, zmv_vars.fp);
zmv_vars.write_buffer_loc = 0; zmv_vars.write_buffer_loc = 0;
} }
zmv_vars.header.author_len = 0; //If we're writing, then author is erased if there zmv_vars.header.author_len = 0; //If we're writing, then author is erased if there
} }
/* /*
@@ -537,6 +537,10 @@ Create and record ZMV
*/ */
extern unsigned char MovieStartMethod;
void powercycle();
bool firstloop;
static void zmv_create(char *filename) static void zmv_create(char *filename)
{ {
memset(&zmv_vars, 0, sizeof(zmv_vars)); memset(&zmv_vars, 0, sizeof(zmv_vars));
@@ -547,16 +551,30 @@ static void zmv_create(char *filename)
zmv_vars.header.zsnes_version = versionNumber & 0xFFFF; zmv_vars.header.zsnes_version = versionNumber & 0xFFFF;
zmv_vars.header.rom_crc32 = CRC32; zmv_vars.header.rom_crc32 = CRC32;
zmv_vars.header.zst_size = cur_zst_size; zmv_vars.header.zst_size = cur_zst_size;
zmv_vars.header.zmv_flag.start_method = zmv_sm_zst; zmv_vars.header.zmv_flag.start_method = (enum zmv_start_methods)MovieStartMethod;
zmv_vars.header.zmv_flag.video_mode = romispal ? zmv_vm_pal : zmv_vm_ntsc; zmv_vars.header.zmv_flag.video_mode = romispal ? zmv_vm_pal : zmv_vm_ntsc;
zmv_header_write(&zmv_vars.header, zmv_vars.fp); zmv_header_write(&zmv_vars.header, zmv_vars.fp);
switch (MovieStartMethod)
{
case 0: // from zst
break;
case 1: // from power-on
powercycle();
break;
case 2: // from reset
// resetcycle(); // not done yet
break;
}
zst_save(zmv_vars.fp, false); zst_save(zmv_vars.fp, false);
zmv_vars.filename = (char *)malloc(filename_len+1); //+1 for null zmv_vars.filename = (char *)malloc(filename_len+1); //+1 for null
strcpy(zmv_vars.filename, filename); strcpy(zmv_vars.filename, filename);
firstloop = true;
} }
else else
{ {
} }
} }
@@ -585,9 +603,9 @@ static void zmv_create(char *filename)
static void zmv_record(bool slow, unsigned char combos_used) static void zmv_record(bool slow, unsigned char combos_used)
{ {
unsigned char flag = 0; unsigned char flag = 0;
unsigned char press_buf[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; unsigned char press_buf[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned char nibble = 0; unsigned char nibble = 0;
zmv_vars.header.frames++; zmv_vars.header.frames++;
if (slow) { zmv_vars.header.slow_frames++; } if (slow) { zmv_vars.header.slow_frames++; }
@@ -602,14 +620,14 @@ static void zmv_record(bool slow, unsigned char combos_used)
zmv_vars.write_buffer[zmv_vars.write_buffer_loc] = flag; zmv_vars.write_buffer[zmv_vars.write_buffer_loc] = flag;
zmv_vars.write_buffer_loc++; zmv_vars.write_buffer_loc++;
if (flag) if (flag)
{ {
unsigned char buffer_used = (nibble/2) + (nibble&1); unsigned char buffer_used = (nibble/2) + (nibble&1);
memcpy(zmv_vars.write_buffer+zmv_vars.write_buffer_loc, press_buf, buffer_used); memcpy(zmv_vars.write_buffer+zmv_vars.write_buffer_loc, press_buf, buffer_used);
zmv_vars.write_buffer_loc += buffer_used; zmv_vars.write_buffer_loc += buffer_used;
} }
if (zmv_vars.write_buffer_loc > WRITE_BUFFER_SIZE - (1+sizeof(press_buf))) if (zmv_vars.write_buffer_loc > WRITE_BUFFER_SIZE - (1+sizeof(press_buf)))
{ {
flush_input_buffer(); flush_input_buffer();
@@ -622,19 +640,19 @@ static bool zmv_insert_chapter()
(zmv_vars.last_internal_chapter_offset != (ftell(zmv_vars.fp) + zmv_vars.write_buffer_loc - INT_CHAP_SIZE))) (zmv_vars.last_internal_chapter_offset != (ftell(zmv_vars.fp) + zmv_vars.write_buffer_loc - INT_CHAP_SIZE)))
{ {
unsigned char flag = BIT(2); unsigned char flag = BIT(2);
flush_input_buffer(); flush_input_buffer();
fwrite(&flag, 1, 1, zmv_vars.fp); fwrite(&flag, 1, 1, zmv_vars.fp);
internal_chapter_add_offset(&zmv_vars.internal_chapters, ftell(zmv_vars.fp)); internal_chapter_add_offset(&zmv_vars.internal_chapters, ftell(zmv_vars.fp));
zmv_vars.header.internal_chapters++; zmv_vars.header.internal_chapters++;
zmv_vars.last_internal_chapter_offset = ftell(zmv_vars.fp); zmv_vars.last_internal_chapter_offset = ftell(zmv_vars.fp);
zst_save(zmv_vars.fp, false); zst_save(zmv_vars.fp, false);
fwrite4(zmv_vars.header.frames, zmv_vars.fp); fwrite4(zmv_vars.header.frames, zmv_vars.fp);
write_last_joy_state(zmv_vars.fp); write_last_joy_state(zmv_vars.fp);
return(true); return(true);
} }
return(false); return(false);
@@ -643,17 +661,17 @@ static bool zmv_insert_chapter()
static void zmv_record_finish() static void zmv_record_finish()
{ {
flush_input_buffer(); flush_input_buffer();
internal_chapter_write(&zmv_vars.internal_chapters, zmv_vars.fp); internal_chapter_write(&zmv_vars.internal_chapters, zmv_vars.fp);
internal_chapter_free_chain(zmv_vars.internal_chapters.next); internal_chapter_free_chain(zmv_vars.internal_chapters.next);
free(zmv_vars.filename); free(zmv_vars.filename);
fwrite2(0, zmv_vars.fp); //External chapter count fwrite2(0, zmv_vars.fp); //External chapter count
rewind(zmv_vars.fp); rewind(zmv_vars.fp);
zmv_header_write(&zmv_vars.header, zmv_vars.fp); zmv_header_write(&zmv_vars.header, zmv_vars.fp);
fclose(zmv_vars.fp); fclose(zmv_vars.fp);
} }
@@ -683,46 +701,62 @@ static bool zmv_open(char *filename)
{ {
memset(&zmv_vars, 0, sizeof(zmv_vars)); memset(&zmv_vars, 0, sizeof(zmv_vars));
memset(&zmv_open_vars, 0, sizeof(zmv_open_vars)); memset(&zmv_open_vars, 0, sizeof(zmv_open_vars));
zmv_vars.fp = fopen(filename,"r+b"); zmv_vars.fp = fopen(filename,"r+b");
if (zmv_vars.fp && zmv_header_read(&zmv_vars.header, zmv_vars.fp) && if (zmv_vars.fp && zmv_header_read(&zmv_vars.header, zmv_vars.fp) &&
!strncmp(zmv_vars.header.magic, "ZMV", 3)) !strncmp(zmv_vars.header.magic, "ZMV", 3))
{ {
unsigned short i; unsigned short i;
size_t filename_len = strlen(filename); size_t filename_len = strlen(filename);
if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF))
{
}
if (zmv_vars.header.rom_crc32 != CRC32) if (zmv_vars.header.rom_crc32 != CRC32)
{ {
} }
MovieStartMethod = (unsigned char)zmv_vars.header.zmv_flag.start_method;
switch (MovieStartMethod)
{
case 0: // from zst
break;
case 1: // from power-on
powercycle();
break;
case 2: // from reset
// resetcycle(); // not done yet
break;
}
zst_load(zmv_vars.fp); zst_load(zmv_vars.fp);
if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF))
{
}
firstloop = true;
zmv_open_vars.input_start_pos = ftell(zmv_vars.fp); zmv_open_vars.input_start_pos = ftell(zmv_vars.fp);
fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END); fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END);
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp); zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
fseek(zmv_vars.fp, -(INT_CHAP_END_DIST), SEEK_END); fseek(zmv_vars.fp, -(INT_CHAP_END_DIST), SEEK_END);
internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters); internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters);
for (i = 0; i < zmv_open_vars.external_chapter_count; i++) for (i = 0; i < zmv_open_vars.external_chapter_count; i++)
{ {
//Seek to 4 bytes before end of chapter, since last 4 bytes is where it contains offset value //Seek to 4 bytes before end of chapter, since last 4 bytes is where it contains offset value
fseek(zmv_vars.fp, EXT_CHAP_SIZE-4, SEEK_CUR); fseek(zmv_vars.fp, EXT_CHAP_SIZE-4, SEEK_CUR);
internal_chapter_add_offset(&zmv_open_vars.external_chapters, fread4(zmv_vars.fp)); internal_chapter_add_offset(&zmv_open_vars.external_chapters, fread4(zmv_vars.fp));
} }
fseek(zmv_vars.fp, zmv_open_vars.input_start_pos, SEEK_SET); fseek(zmv_vars.fp, zmv_open_vars.input_start_pos, SEEK_SET);
zmv_vars.filename = (char *)malloc(filename_len+1); //+1 for null zmv_vars.filename = (char *)malloc(filename_len+1); //+1 for null
strcpy(zmv_vars.filename, filename); strcpy(zmv_vars.filename, filename);
return(true); return(true);
} }
return(false); return(false);
@@ -749,7 +783,7 @@ static bool zmv_open(char *filename)
} \ } \
cur = (((unsigned int)prev) << 20) | 0x8000; cur = (((unsigned int)prev) << 20) | 0x8000;
static bool zmv_replay() static bool zmv_replay()
{ {
if (zmv_open_vars.frames_replayed < zmv_vars.header.frames) if (zmv_open_vars.frames_replayed < zmv_vars.header.frames)
@@ -759,7 +793,7 @@ static bool zmv_replay()
bool mid_byte = false; bool mid_byte = false;
fread(&flag, 1, 1, zmv_vars.fp); fread(&flag, 1, 1, zmv_vars.fp);
if (flag & BIT(2)) if (flag & BIT(2))
{ {
fseek(zmv_vars.fp, INT_CHAP_SIZE, SEEK_CUR); fseek(zmv_vars.fp, INT_CHAP_SIZE, SEEK_CUR);
@@ -771,7 +805,7 @@ static bool zmv_replay()
REPLAY_PAD(zmv_vars.last_joy_state.C, JoyCOrig, 5); REPLAY_PAD(zmv_vars.last_joy_state.C, JoyCOrig, 5);
REPLAY_PAD(zmv_vars.last_joy_state.D, JoyDOrig, 4); REPLAY_PAD(zmv_vars.last_joy_state.D, JoyDOrig, 4);
REPLAY_PAD(zmv_vars.last_joy_state.E, JoyEOrig, 3); REPLAY_PAD(zmv_vars.last_joy_state.E, JoyEOrig, 3);
zmv_open_vars.frames_replayed++; zmv_open_vars.frames_replayed++;
return(true); return(true);
} }
@@ -781,14 +815,14 @@ static bool zmv_replay()
static bool zmv_next_chapter() static bool zmv_next_chapter()
{ {
size_t current_loc = ftell(zmv_vars.fp); size_t current_loc = ftell(zmv_vars.fp);
size_t next_internal = internal_chapter_greater(&zmv_vars.internal_chapters, current_loc); size_t next_internal = internal_chapter_greater(&zmv_vars.internal_chapters, current_loc);
size_t next_external = internal_chapter_greater(&zmv_open_vars.external_chapters, current_loc); size_t next_external = internal_chapter_greater(&zmv_open_vars.external_chapters, current_loc);
size_t next = 0; size_t next = 0;
if (next_internal != current_loc) if (next_internal != current_loc)
{ {
next = next_internal; next = next_internal;
} }
else else
@@ -796,10 +830,10 @@ static bool zmv_next_chapter()
next_internal = ~0; next_internal = ~0;
} }
if ((next_external != current_loc) && next_external < next_internal) if ((next_external != current_loc) && next_external < next_internal)
{ {
next = next_external; next = next_external;
} }
if (next) if (next)
{ {
if (next == next_internal) if (next == next_internal)
@@ -816,7 +850,7 @@ static bool zmv_next_chapter()
zst_load(zmv_vars.fp); zst_load(zmv_vars.fp);
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp); zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
read_last_joy_state(zmv_vars.fp); read_last_joy_state(zmv_vars.fp);
fseek(zmv_vars.fp, next_external, SEEK_SET); fseek(zmv_vars.fp, next_external, SEEK_SET);
} }
return(true); return(true);
@@ -835,14 +869,14 @@ static void zmv_rewind_playback()
static void zmv_prev_chapter() static void zmv_prev_chapter()
{ {
size_t current_loc = ftell(zmv_vars.fp); size_t current_loc = ftell(zmv_vars.fp);
size_t prev_internal = internal_chapter_lesser(&zmv_vars.internal_chapters, current_loc); size_t prev_internal = internal_chapter_lesser(&zmv_vars.internal_chapters, current_loc);
size_t prev_external = internal_chapter_lesser(&zmv_open_vars.external_chapters, current_loc); size_t prev_external = internal_chapter_lesser(&zmv_open_vars.external_chapters, current_loc);
size_t prev = 0; size_t prev = 0;
if (prev_internal != current_loc) if (prev_internal != current_loc)
{ {
prev = prev_internal; prev = prev_internal;
} }
else else
@@ -850,31 +884,31 @@ static void zmv_prev_chapter()
prev_internal = 0; prev_internal = 0;
} }
if ((prev_external != current_loc) && prev_external > prev_internal) if ((prev_external != current_loc) && prev_external > prev_internal)
{ {
prev = prev_external; prev = prev_external;
} }
if (!prev) if (!prev)
{ {
zmv_rewind_playback(); zmv_rewind_playback();
return; return;
} }
//Code to go back before the previous chapter if the previous chapter was loaded recently //Code to go back before the previous chapter if the previous chapter was loaded recently
if (zmv_open_vars.frames_replayed - zmv_open_vars.last_chapter_frame < 150) //2.5 seconds NTSC if (zmv_open_vars.frames_replayed - zmv_open_vars.last_chapter_frame < 150) //2.5 seconds NTSC
{ {
size_t pprev = prev-1; size_t pprev = prev-1;
size_t pprev_internal = internal_chapter_lesser(&zmv_vars.internal_chapters, pprev); size_t pprev_internal = internal_chapter_lesser(&zmv_vars.internal_chapters, pprev);
size_t pprev_external = internal_chapter_lesser(&zmv_open_vars.external_chapters, pprev); size_t pprev_external = internal_chapter_lesser(&zmv_open_vars.external_chapters, pprev);
if ((pprev_internal == pprev) && (pprev_external == pprev)) if ((pprev_internal == pprev) && (pprev_external == pprev))
{ {
zmv_rewind_playback(); zmv_rewind_playback();
return; return;
} }
if (pprev_internal != pprev) if (pprev_internal != pprev)
{ {
prev = prev_internal = pprev_internal; prev = prev_internal = pprev_internal;
} }
else else
@@ -882,11 +916,11 @@ static void zmv_prev_chapter()
pprev_internal = 0; pprev_internal = 0;
} }
if ((pprev_external != pprev) && pprev_external > pprev_internal) if ((pprev_external != pprev) && pprev_external > pprev_internal)
{ {
prev = prev_external = pprev_external; prev = prev_external = pprev_external;
} }
} }
if (prev == prev_internal) if (prev == prev_internal)
{ {
fseek(zmv_vars.fp, prev_internal, SEEK_SET); fseek(zmv_vars.fp, prev_internal, SEEK_SET);
@@ -896,12 +930,12 @@ static void zmv_prev_chapter()
} }
else else
{ {
size_t ext_chapter_loc = EXT_CHAP_END_DIST - internal_chapter_pos(&zmv_open_vars.external_chapters, prev)*EXT_CHAP_SIZE; size_t ext_chapter_loc = EXT_CHAP_END_DIST - internal_chapter_pos(&zmv_open_vars.external_chapters, prev)*EXT_CHAP_SIZE;
fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END); fseek(zmv_vars.fp, -(ext_chapter_loc), SEEK_END);
zst_load(zmv_vars.fp); zst_load(zmv_vars.fp);
zmv_open_vars.frames_replayed = fread4(zmv_vars.fp); zmv_open_vars.frames_replayed = fread4(zmv_vars.fp);
read_last_joy_state(zmv_vars.fp); read_last_joy_state(zmv_vars.fp);
fseek(zmv_vars.fp, prev_external, SEEK_SET); fseek(zmv_vars.fp, prev_external, SEEK_SET);
} }
zmv_open_vars.last_chapter_frame = zmv_open_vars.frames_replayed; zmv_open_vars.last_chapter_frame = zmv_open_vars.frames_replayed;
@@ -912,7 +946,7 @@ static void zmv_add_chapter()
if ((zmv_open_vars.external_chapter_count < 65535) && zmv_open_vars.frames_replayed) if ((zmv_open_vars.external_chapter_count < 65535) && zmv_open_vars.frames_replayed)
{ {
size_t current_loc = ftell(zmv_vars.fp); size_t current_loc = ftell(zmv_vars.fp);
//Check if previous input contained internal chapter to here, or if there is external here already //Check if previous input contained internal chapter to here, or if there is external here already
if ((internal_chapter_pos(&zmv_vars.internal_chapters, current_loc-(INT_CHAP_SIZE)) == ~0) && if ((internal_chapter_pos(&zmv_vars.internal_chapters, current_loc-(INT_CHAP_SIZE)) == ~0) &&
(internal_chapter_pos(&zmv_open_vars.external_chapters, current_loc)) == ~0) (internal_chapter_pos(&zmv_open_vars.external_chapters, current_loc)) == ~0)
@@ -920,10 +954,10 @@ static void zmv_add_chapter()
//Check if we have internal right here //Check if we have internal right here
unsigned char flag; unsigned char flag;
fread(&flag, 1, 1, zmv_vars.fp); fread(&flag, 1, 1, zmv_vars.fp);
if (!(flag & BIT(2))) if (!(flag & BIT(2)))
{ {
char *author = 0; char *author = 0;
internal_chapter_add_offset(&zmv_open_vars.external_chapters, current_loc); internal_chapter_add_offset(&zmv_open_vars.external_chapters, current_loc);
zmv_open_vars.external_chapter_count++; zmv_open_vars.external_chapter_count++;
@@ -933,7 +967,7 @@ static void zmv_add_chapter()
if ((author = (char *)malloc(zmv_vars.header.author_len))) if ((author = (char *)malloc(zmv_vars.header.author_len)))
{ {
fseek(zmv_vars.fp, -(zmv_vars.header.author_len), SEEK_END); fseek(zmv_vars.fp, -(zmv_vars.header.author_len), SEEK_END);
fread(author, zmv_vars.header.author_len, 1, zmv_vars.fp); fread(author, zmv_vars.header.author_len, 1, zmv_vars.fp);
} }
} }
@@ -944,14 +978,14 @@ static void zmv_add_chapter()
fwrite4(current_loc, zmv_vars.fp); fwrite4(current_loc, zmv_vars.fp);
fwrite2(zmv_open_vars.external_chapter_count, zmv_vars.fp); fwrite2(zmv_open_vars.external_chapter_count, zmv_vars.fp);
if (author) if (author)
{ {
fwrite(author, zmv_vars.header.author_len, 1, zmv_vars.fp); fwrite(author, zmv_vars.header.author_len, 1, zmv_vars.fp);
free(author); free(author);
} }
fseek(zmv_vars.fp, current_loc, SEEK_SET); fseek(zmv_vars.fp, current_loc, SEEK_SET);
} }
else //Just skip the internal else //Just skip the internal
{ {
@@ -964,16 +998,16 @@ static void zmv_add_chapter()
static void zmv_replay_finished() static void zmv_replay_finished()
{ {
internal_chapter_free_chain(zmv_vars.internal_chapters.next); internal_chapter_free_chain(zmv_vars.internal_chapters.next);
internal_chapter_free_chain(zmv_open_vars.external_chapters.next); internal_chapter_free_chain(zmv_open_vars.external_chapters.next);
free(zmv_vars.filename); free(zmv_vars.filename);
fclose(zmv_vars.fp); fclose(zmv_vars.fp);
} }
static void zmv_replay_to_record() static void zmv_replay_to_record()
{ {
internal_chapter_free_chain(zmv_open_vars.external_chapters.next); internal_chapter_free_chain(zmv_open_vars.external_chapters.next);
zmv_vars.header.rerecords++; zmv_vars.header.rerecords++;
zmv_vars.header.removed_frames += zmv_vars.header.frames - zmv_open_vars.frames_replayed; zmv_vars.header.removed_frames += zmv_vars.header.frames - zmv_open_vars.frames_replayed;
zmv_vars.header.frames = zmv_open_vars.frames_replayed; zmv_vars.header.frames = zmv_open_vars.frames_replayed;
zmv_vars.header.internal_chapters = internal_chapter_delete_after(&zmv_vars.internal_chapters, ftell(zmv_vars.fp)); zmv_vars.header.internal_chapters = internal_chapter_delete_after(&zmv_vars.internal_chapters, ftell(zmv_vars.fp));
zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0); zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0);
@@ -1011,7 +1045,7 @@ void zmv_rewind_save(size_t state, bool playback)
{ {
unsigned char *state_start_pos = zmv_rewind_buffer + 16*state; unsigned char *state_start_pos = zmv_rewind_buffer + 16*state;
size_t file_pos = ftell(zmv_vars.fp) + zmv_vars.write_buffer_loc; size_t file_pos = ftell(zmv_vars.fp) + zmv_vars.write_buffer_loc;
save_last_joy_state(state_start_pos); save_last_joy_state(state_start_pos);
memcpy(state_start_pos+8, &file_pos, 4); memcpy(state_start_pos+8, &file_pos, 4);
memcpy(state_start_pos+12, playback ? &zmv_open_vars.frames_replayed : &zmv_vars.header.frames, 4); memcpy(state_start_pos+12, playback ? &zmv_open_vars.frames_replayed : &zmv_vars.header.frames, 4);
@@ -1021,10 +1055,10 @@ void zmv_rewind_load(size_t state, bool playback)
{ {
unsigned char *state_start_pos = zmv_rewind_buffer + 16*state; unsigned char *state_start_pos = zmv_rewind_buffer + 16*state;
size_t file_pos = 0; size_t file_pos = 0;
load_last_joy_state(state_start_pos); load_last_joy_state(state_start_pos);
memcpy(&file_pos, state_start_pos+8, 4); memcpy(&file_pos, state_start_pos+8, 4);
if (playback) if (playback)
{ {
memcpy(&zmv_open_vars.frames_replayed, state_start_pos+12, 4); memcpy(&zmv_open_vars.frames_replayed, state_start_pos+12, 4);
@@ -1037,12 +1071,12 @@ void zmv_rewind_load(size_t state, bool playback)
zmv_vars.header.rerecords++; zmv_vars.header.rerecords++;
zmv_vars.header.removed_frames += zmv_vars.header.frames - frame; zmv_vars.header.removed_frames += zmv_vars.header.frames - frame;
zmv_vars.header.frames = frame; zmv_vars.header.frames = frame;
flush_input_buffer(); flush_input_buffer();
fseek(zmv_vars.fp, file_pos, SEEK_SET); fseek(zmv_vars.fp, file_pos, SEEK_SET);
ftruncate(fileno(zmv_vars.fp), file_pos); ftruncate(fileno(zmv_vars.fp), file_pos);
zmv_vars.header.internal_chapters = internal_chapter_delete_after(&zmv_vars.internal_chapters, file_pos); zmv_vars.header.internal_chapters = internal_chapter_delete_after(&zmv_vars.internal_chapters, file_pos);
zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0); zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0);
} }
@@ -1071,63 +1105,63 @@ bool mzt_save(char *statename, bool thumb, bool playback)
size_t filename_len = strlen(zmv_vars.filename); size_t filename_len = strlen(zmv_vars.filename);
struct stat stat_buffer; struct stat stat_buffer;
bool mzt_saved = false; bool mzt_saved = false;
memcpy(zmv_vars.filename+filename_len-3, "mz", 2); memcpy(zmv_vars.filename+filename_len-3, "mz", 2);
if (!isdigit(zmv_vars.filename[filename_len-1])) if (!isdigit(zmv_vars.filename[filename_len-1]))
{ {
zmv_vars.filename[filename_len-1] = 't'; zmv_vars.filename[filename_len-1] = 't';
} }
if (stat(zmv_vars.filename, &stat_buffer)) if (stat(zmv_vars.filename, &stat_buffer))
{ {
mkdir(zmv_vars.filename); mkdir(zmv_vars.filename);
} }
if (!chdir(zmv_vars.filename)) if (!chdir(zmv_vars.filename))
{ {
FILE *fp = 0; FILE *fp = 0;
if ((fp = fopen(statename,"wb"))) if ((fp = fopen(statename,"wb")))
{ {
char FileExt[3]; char FileExt[3];
gzFile gzp = 0; gzFile gzp = 0;
size_t rewind_point; size_t rewind_point;
zst_save(fp, thumb); zst_save(fp, thumb);
fclose(fp); fclose(fp);
flush_input_buffer(); flush_input_buffer();
rewind_point = ftell(zmv_vars.fp); rewind_point = ftell(zmv_vars.fp);
internal_chapter_write(&zmv_vars.internal_chapters, zmv_vars.fp); internal_chapter_write(&zmv_vars.internal_chapters, zmv_vars.fp);
memcpy(FileExt, statename+filename_len-3, 3); memcpy(FileExt, statename+filename_len-3, 3);
memcpy(statename+filename_len-3, "zm", 2); memcpy(statename+filename_len-3, "zm", 2);
if (!isdigit(statename[filename_len-1])) if (!isdigit(statename[filename_len-1]))
{ {
statename[filename_len-1] = 'v'; statename[filename_len-1] = 'v';
} }
if ((gzp = gzopen(statename, "wb9"))) if ((gzp = gzopen(statename, "wb9")))
{ {
rewind(zmv_vars.fp); rewind(zmv_vars.fp);
zmv_header_write(&zmv_vars.header, zmv_vars.fp); zmv_header_write(&zmv_vars.header, zmv_vars.fp);
rewind(zmv_vars.fp); rewind(zmv_vars.fp);
while (!feof(zmv_vars.fp)) while (!feof(zmv_vars.fp))
{ {
size_t amount_read = fread(zmv_vars.write_buffer, 1, WRITE_BUFFER_SIZE, zmv_vars.fp); size_t amount_read = fread(zmv_vars.write_buffer, 1, WRITE_BUFFER_SIZE, zmv_vars.fp);
gzwrite(gzp, zmv_vars.write_buffer, amount_read); gzwrite(gzp, zmv_vars.write_buffer, amount_read);
} }
gzclose(gzp); gzclose(gzp);
memcpy(statename+filename_len-3, "mz", 2); memcpy(statename+filename_len-3, "mz", 2);
if (!isdigit(statename[filename_len-1])) if (!isdigit(statename[filename_len-1]))
{ {
statename[filename_len-1] = 'i'; statename[filename_len-1] = 'i';
} }
if ((fp = fopen(statename,"wb"))) if ((fp = fopen(statename,"wb")))
{ {
fwrite4((playback) ? zmv_open_vars.frames_replayed : zmv_vars.header.frames, fp); fwrite4((playback) ? zmv_open_vars.frames_replayed : zmv_vars.header.frames, fp);
write_last_joy_state(fp); write_last_joy_state(fp);
fwrite4(rewind_point, fp); fwrite4(rewind_point, fp);
@@ -1142,57 +1176,57 @@ bool mzt_save(char *statename, bool thumb, bool playback)
} }
chdir(".."); chdir("..");
} }
return(mzt_saved); return(mzt_saved);
} }
bool mzt_load(char *statename, bool playback) bool mzt_load(char *statename, bool playback)
{ {
size_t filename_len = strlen(zmv_vars.filename); size_t filename_len = strlen(zmv_vars.filename);
bool mzt_saved = false; bool mzt_saved = false;
memcpy(zmv_vars.filename+filename_len-3, "mz", 2); memcpy(zmv_vars.filename+filename_len-3, "mz", 2);
if (!isdigit(zmv_vars.filename[filename_len-1])) if (!isdigit(zmv_vars.filename[filename_len-1]))
{ {
zmv_vars.filename[filename_len-1] = 't'; zmv_vars.filename[filename_len-1] = 't';
} }
if (!chdir(zmv_vars.filename)) if (!chdir(zmv_vars.filename))
{ {
FILE *fp = 0; FILE *fp = 0;
if ((fp = fopen(statename,"rb"))) if ((fp = fopen(statename,"rb")))
{ {
char FileExt[3]; char FileExt[3];
zst_load(fp); zst_load(fp);
fclose(fp); fclose(fp);
memcpy(FileExt, statename+filename_len-3, 3); memcpy(FileExt, statename+filename_len-3, 3);
memcpy(statename+filename_len-3, "mz", 2); memcpy(statename+filename_len-3, "mz", 2);
if (!isdigit(statename[filename_len-1])) if (!isdigit(statename[filename_len-1]))
{ {
statename[filename_len-1] = 'i'; statename[filename_len-1] = 'i';
} }
if ((fp = fopen(statename,"rb"))) if ((fp = fopen(statename,"rb")))
{ {
size_t rewind_point; size_t rewind_point;
size_t current_frame = fread4(fp); size_t current_frame = fread4(fp);
read_last_joy_state(fp); read_last_joy_state(fp);
rewind_point = fread4(fp); rewind_point = fread4(fp);
fclose(fp); fclose(fp);
if (!playback) if (!playback)
{ {
gzFile gzp = 0; gzFile gzp = 0;
memcpy(statename+filename_len-3, "zm", 2); memcpy(statename+filename_len-3, "zm", 2);
if (!isdigit(statename[filename_len-1])) if (!isdigit(statename[filename_len-1]))
{ {
statename[filename_len-1] = 'v'; statename[filename_len-1] = 'v';
} }
if ((gzp = gzopen(statename, "rb"))) if ((gzp = gzopen(statename, "rb")))
{ {
size_t rerecords = zmv_vars.header.rerecords+1; size_t rerecords = zmv_vars.header.rerecords+1;
@@ -1207,7 +1241,7 @@ bool mzt_load(char *statename, bool playback)
size_t amount_read = gzread(gzp, zmv_vars.write_buffer, WRITE_BUFFER_SIZE); size_t amount_read = gzread(gzp, zmv_vars.write_buffer, WRITE_BUFFER_SIZE);
fwrite(zmv_vars.write_buffer, 1, amount_read, zmv_vars.fp); fwrite(zmv_vars.write_buffer, 1, amount_read, zmv_vars.fp);
} }
gzclose(gzp); gzclose(gzp);
rewind(zmv_vars.fp); rewind(zmv_vars.fp);
zmv_header_read(&zmv_vars.header, zmv_vars.fp); zmv_header_read(&zmv_vars.header, zmv_vars.fp);
@@ -1217,7 +1251,7 @@ bool mzt_load(char *statename, bool playback)
fseek(zmv_vars.fp, rewind_point, SEEK_SET); fseek(zmv_vars.fp, rewind_point, SEEK_SET);
internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters); internal_chapter_read(&zmv_vars.internal_chapters, zmv_vars.fp, zmv_vars.header.internal_chapters);
fseek(zmv_vars.fp, rewind_point, SEEK_SET); fseek(zmv_vars.fp, rewind_point, SEEK_SET);
zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0); zmv_vars.last_internal_chapter_offset = internal_chapter_lesser(&zmv_vars.internal_chapters, ~0);
ftruncate(fileno(zmv_vars.fp), ftell(zmv_vars.fp)); ftruncate(fileno(zmv_vars.fp), ftell(zmv_vars.fp));
@@ -1228,11 +1262,11 @@ bool mzt_load(char *statename, bool playback)
zmv_open_vars.frames_replayed = current_frame; zmv_open_vars.frames_replayed = current_frame;
fseek(zmv_vars.fp, rewind_point, SEEK_SET); fseek(zmv_vars.fp, rewind_point, SEEK_SET);
} }
mzt_saved = true; mzt_saved = true;
} }
memcpy(statename+filename_len-3, FileExt, 3); memcpy(statename+filename_len-3, FileExt, 3);
} }
chdir(".."); chdir("..");
} }
return(mzt_saved); return(mzt_saved);
@@ -1285,7 +1319,7 @@ static char *MovieSub_GetData()
if (MovieSub.fp) if (MovieSub.fp)
{ {
char *i, *num; char *i, *num;
if (zmv_frames_replayed() > MovieSub.message_start + MovieSub.message_duration) if (zmv_frames_replayed() > MovieSub.message_start + MovieSub.message_duration)
{ {
MovieSub.message_duration = 0; MovieSub.message_duration = 0;
@@ -1306,14 +1340,14 @@ static char *MovieSub_GetData()
for (i = num; *i; i++) for (i = num; *i; i++)
{ {
if (!isdigit(*i)) if (!isdigit(*i))
{ {
MovieSub.message_start = 0; MovieSub.message_start = 0;
return(0); return(0);
} }
} }
MovieSub.message_duration = atoi(num); MovieSub.message_duration = atoi(num);
} }
if (zmv_frames_replayed() == MovieSub.message_start) if (zmv_frames_replayed() == MovieSub.message_start)
{ {
return(strtok(0, ":")); return(strtok(0, ":"));
@@ -1428,7 +1462,7 @@ void Replay()
{ {
Msgptr = sub; Msgptr = sub;
MessageOn = MovieSub_GetDuration(); MessageOn = MovieSub_GetDuration();
} }
} }
else else
{ {
@@ -1442,10 +1476,10 @@ void Replay()
} }
MessageOn = MsgCount; MessageOn = MsgCount;
MovieProcessing = 0; MovieProcessing = 0;
zmv_replay_finished(); zmv_replay_finished();
zmv_dealloc_rewind_buffer(); zmv_dealloc_rewind_buffer();
MovieSub_Close(); MovieSub_Close();
SRAMState = PrevSRAMState; SRAMState = PrevSRAMState;
} }
} }
@@ -1463,32 +1497,37 @@ void ProcessMovies()
// It came from guiwindp.inc and gui.asm, after all // It came from guiwindp.inc and gui.asm, after all
extern unsigned char MovieRecordWinVal; extern unsigned char MovieRecordWinVal;
void SkipMovie() void SkipMovie()
{ {
MovieRecordWinVal = 0; MovieRecordWinVal = 0;
} }
void MovieStop() void MovieStop()
{ {
switch (MovieProcessing) if (firstloop)
{ {
case 1: switch (MovieProcessing)
zmv_replay_finished(); {
MovieSub_Close(); case 1:
SRAMState = PrevSRAMState; zmv_replay_finished();
break; MovieSub_Close();
SRAMState = PrevSRAMState;
case 2: break;
zmv_record_finish();
if (!zmv_frames_recorded()) case 2:
{ zmv_record_finish();
Msgptr = "STATE SAVED."; if (!zmv_frames_recorded())
MessageOn = MsgCount; {
} Msgptr = "STATE SAVED.";
break; MessageOn = MsgCount;
}
break;
}
zmv_dealloc_rewind_buffer();
MovieProcessing = 0;
} }
zmv_dealloc_rewind_buffer(); else { firstloop = false; }
MovieProcessing = 0;
} }
extern unsigned int MovieCounter, statefileloc, Totalbyteloaded, curexecstate; extern unsigned int MovieCounter, statefileloc, Totalbyteloaded, curexecstate;
@@ -1508,7 +1547,7 @@ void MoviePlay()
PrevSRAMState = SRAMState; PrevSRAMState = SRAMState;
SRAMState = true; SRAMState = true;
if (!MovieProcessing) if (!MovieProcessing)
{ {
GUIQuit = 2; GUIQuit = 2;
@@ -1524,16 +1563,16 @@ void MoviePlay()
MovieProcessing = 1; MovieProcessing = 1;
memcpy(&fnamest[statefileloc-3], ".sub", 4); memcpy(&fnamest[statefileloc-3], ".sub", 4);
if (isdigit(CMovieExt)) { fnamest[statefileloc] = CMovieExt; } if (isdigit(CMovieExt)) { fnamest[statefileloc] = CMovieExt; }
MovieSub_Open(fnamest+1); MovieSub_Open(fnamest+1);
Msgptr = "MOVIE STARTED."; Msgptr = "MOVIE STARTED.";
MessageOn = MsgCount; MessageOn = MsgCount;
} }
else else
{ {
Msgptr = "MOVIE COULD NOT BE STARTED."; Msgptr = "MOVIE COULD NOT BE STARTED.";
MessageOn = MsgCount; MessageOn = MsgCount;
} }
memcpy (&fnamest[statefileloc-3], FileExt, 4); memcpy (&fnamest[statefileloc-3], FileExt, 4);
asm_call(ChangetoLOADdir); asm_call(ChangetoLOADdir);
} }
@@ -1546,31 +1585,31 @@ void MovieRecord()
zmv_replay_to_record(); zmv_replay_to_record();
MovieProcessing = 2; MovieProcessing = 2;
} }
if (!MovieProcessing) if (!MovieProcessing)
{ {
unsigned char FileExt[4]; unsigned char FileExt[4];
FILE *tempfhandle; FILE *tempfhandle;
memcpy (FileExt, &fnamest[statefileloc-3], 4); memcpy (FileExt, &fnamest[statefileloc-3], 4);
memcpy (&fnamest[statefileloc-3], ".zmv", 4); memcpy (&fnamest[statefileloc-3], ".zmv", 4);
fnamest[statefileloc] = CMovieExt; fnamest[statefileloc] = CMovieExt;
SRAMChdir(); SRAMChdir();
if (MovieRecordWinVal == 1) if (MovieRecordWinVal == 1)
{ {
remove(fnamest+1); remove(fnamest+1);
MovieRecordWinVal = 0; MovieRecordWinVal = 0;
} }
if (!(tempfhandle = fopen(fnamest+1,"rb"))) if (!(tempfhandle = fopen(fnamest+1,"rb")))
{ {
zmv_create(fnamest+1); zmv_create(fnamest+1);
zmv_alloc_rewind_buffer(RewindStates); zmv_alloc_rewind_buffer(RewindStates);
MovieProcessing = 2; MovieProcessing = 2;
Msgptr = "MOVIE RECORDING."; Msgptr = "MOVIE RECORDING.";
MessageOn = MsgCount; MessageOn = MsgCount;
} }
else else
{ {
@@ -1584,6 +1623,7 @@ void MovieRecord()
} }
char MovieFrameStr[10]; char MovieFrameStr[10];
void GetMovieFrameStr() void GetMovieFrameStr()
{ {
*MovieFrameStr = 0; *MovieFrameStr = 0;
@@ -1594,7 +1634,6 @@ void GetMovieFrameStr()
break; break;
case 2: case 2:
sprintf(MovieFrameStr, "%u",zmv_frames_recorded()); sprintf(MovieFrameStr, "%u",zmv_frames_recorded());
break; break;
} }
} }