void retro_reset( void ) { eo_init( &state.cfg ); if ( state.size ) { load_snap( "zx81_16k.z81" ); zx81.TZXin = 1; TZXFile.LoadFile( state.data, state.size, false ); TZXFile.Start(); //eo_loadp( state.data, state.size ); } }
SPWAW_ERROR snapload (int fd, SPWAW_SNAPSHOT *dst, STRTAB *stabptr) { SPWAW_ERROR rc = SPWERR_OK; STRTAB *stab = stabptr; long pos; SNAP_HEADER mhdr; SNAP_SOURCE shdr; SNAP_INFO ihdr; SNAP snap; CBIO cbio; CNULLARG (dst); if (!stabptr) stab = (STRTAB *)dst->stab; pos = bseekget (fd); memset (&snap, 0, sizeof (snap)); rc = snaploadhdrs (fd, &mhdr, &shdr, &ihdr); ERRORGOTO ("snaploadhdrs()", handle_error); if (mhdr.oobdat) { rc = SPWOOB_new (&(dst->oobdat)); ERRORGOTO ("SPWOOB_new()", handle_error); dst->freeoobdat = true; bseekset (fd, pos + mhdr.oobdat); rc = SPWOOB_load (dst->oobdat, fd); ERRORGOTO ("SPWOOB_load()", handle_error); } if (!stabptr) { bseekset (fd, pos + mhdr.stab); rc = STRTAB_fdload (stab, fd); ERRORGOTO ("STRTAB_fdload()", handle_error); } dst->src.path = STRTAB_getstr (stab, shdr.path); dst->src.file = STRTAB_getstr (stab, shdr.file); dst->src.date = *((FILETIME *)&(shdr.date)); bseekset (fd, mhdr.snap.data + pos); /* We are now backwards compatible with version 11 and older */ if (mhdr.version <= SNAP_VERSION_V11) { rc = snapshot_load_v11_snap (fd, &mhdr, &snap); ROE ("snapshot_load_v11_snap(snapshot game data)"); } else { cbio.data = (char *)&snap; cbio.size = mhdr.snap.size; cbio.comp = &(mhdr.snap.comp); if (!cbread (fd, cbio, "snapshot game data")) FAILGOTO (SPWERR_FRFAILED, "cbread(snapshot game data) failed", handle_error); } load_snap (&snap, stab, dst); bseekset (fd, pos + mhdr.map); rc = load_map (fd, &(dst->raw.game.map)); ERRORGOTO ("load_map(map)", handle_error); bseekset (fd, pos + mhdr.oobp1); rc = load_oob (fd, &(dst->raw.OOBp1), stab, mhdr.version); ERRORGOTO ("load_oob(oobP1)", handle_error); bseekset (fd, pos + mhdr.oobp2); rc = load_oob (fd, &(dst->raw.OOBp2), stab, mhdr.version); ERRORGOTO ("load_oob(OOBp2)", handle_error); dst->type = (SPWAW_BATTLE_TYPE)ihdr.type; return (SPWERR_OK); handle_error: snapclean (dst, stabptr); return (rc); }
int load_sna(char *filename) { //printf("load_sna('%s')\n",filename); int len; gzFile fichero=gzopen(filename,"rb"); if (!fichero) return -1; gzseek (fichero, 0, SEEK_END); len=gztell(fichero); //printf("LEN=%i\n",len); gzseek (fichero, 0, SEEK_SET); gzread (fichero,tempo, 27); snap.I=tempo[0]; snap.L=tempo[9]; snap.H=tempo[10]; snap.E=tempo[11]; snap.D=tempo[12]; snap.C=tempo[13]; snap.B=tempo[14]; snap.F=tempo[15]; snap.A=tempo[16]; snap.SP=((unsigned short)tempo[23])+256*((unsigned short)tempo[24]); snap.IY=((unsigned short)tempo[15])+256*((unsigned short)tempo[16]); snap.IX=((unsigned short)tempo[17])+256*((unsigned short)tempo[18]); snap.IFF1=snap.IFF2=(tempo[19] & 0x04) >> 2; snap.Imode=tempo[25]; snap.R=(tempo[20]&0x7F); gzread (fichero,memo, 0x4000 * 3); if (len <= 49179) { snap.type=0; snap.PC=((unsigned short)memo[snap.SP-16384])+256*((unsigned short)memo[snap.SP-16384+1]); snap.SP+=2; memcpy(snap.page[0],memo,0x4000); memcpy(snap.page[1],memo+0x4000,0x4000); memcpy(snap.page[2],memo+0x8000,0x4000); } else { snap.type=1; gzread(fichero,tempo2,4); snap.PC=((unsigned short)tempo2[0])+256*((unsigned short)tempo2[1]); //printf("PC=%X, SP=%X\n",snap.PC,snap.SP); snap.pager=tempo2[3]&0x7; //printf("PAGER=%i\n",snap.pager); memcpy(snap.page[5],memo,0x4000); memcpy(snap.page[2],memo+0x4000,0x4000); memcpy(snap.page[snap.pager],memo+0x8000,0x4000); if (snap.pager!=0) gzread (fichero,snap.page[0], 0x4000); if (snap.pager!=1) gzread (fichero,snap.page[1], 0x4000); if (snap.pager!=3) gzread (fichero,snap.page[3], 0x4000); if (snap.pager!=4) gzread (fichero,snap.page[4], 0x4000); if (snap.pager!=6) gzread (fichero,snap.page[6], 0x4000); if (snap.pager!=7) gzread (fichero,snap.page[7], 0x4000); } load_snap(&snap); gzclose(fichero); return 0; }
static int __load_z80(char *filename) { unsigned char type,compressed,page; gzFile fichero; int readed; int longitud=0,longitud2,bucle; for(bucle=0;bucle<16;bucle++) snap.ay_regs[bucle]=0; fichero=gzopen(filename,"rb"); if(!fichero) return -1; // error gzread(fichero,tempo,30); if((tempo[6]==0)&&(tempo[7]==0)) { // extended Z80 gzread(fichero,tempo2,2); // read the length of the extension longitud=((int)tempo2[0])+256*((int)tempo2[1]); if(longitud>54) { gzclose(fichero); return -3; // not a supported Z80 file } gzread(fichero,tempo2+2,longitud); type=1; // new type if(longitud==23) // z80 ver 2.01 switch(tempo2[4]) { case 0: case 1: snap.type=0; // 48K break; case 3: case 4: snap.type=1; // 128K break; default: gzclose(fichero); return -3; // not a supported Z80 file break; } else // z80 ver 3.0x switch(tempo2[4]) { case 0: case 1: case 3: snap.type=0; // 48K break; case 4: case 5: case 6: snap.type=1; // 128K break; default: gzclose(fichero); return -3; // not a supported Z80 file break; } } else { type=0; // old type snap.type=0; // 48k } if(tempo[29]&0x04) snap.issue=2; else snap.issue=3; snap.A=tempo[0]; snap.F=tempo[1]; snap.C=tempo[2]; snap.B=tempo[3]; snap.L=tempo[4]; snap.H=tempo[5]; if(type) { snap.PC=((unsigned short)tempo2[2])+256*((unsigned short)tempo2[3]); for(bucle=0;bucle<16;bucle++) snap.ay_regs[bucle]=tempo2[9+bucle]; snap.ay_latch=tempo2[8]; } else snap.PC=((unsigned short)tempo[6])+256*((unsigned short)tempo[7]); snap.SP=((unsigned short)tempo[8])+256*((unsigned short)tempo[9]); snap.I=tempo[10]; snap.R=(tempo[11]&0x7F); if(tempo[12]==255) tempo[12]=1; if(tempo[12]&0x01) snap.R|=0x80; snap.border=(tempo[12]>>1)&0x07; // if(tempo[12]&30) if(tempo[12]&0x20) compressed=1; else compressed=0; snap.E=tempo[13]; snap.D=tempo[14]; snap.CC=tempo[15]; snap.BB=tempo[16]; snap.EE=tempo[17]; snap.DD=tempo[18]; snap.LL=tempo[19]; snap.HH=tempo[20]; snap.AA=tempo[21]; snap.FF=tempo[22]; snap.IY=((unsigned short)tempo[23])+256*((unsigned short)tempo[24]); snap.IX=((unsigned short)tempo[25])+256*((unsigned short)tempo[26]); if(tempo[27]) snap.IFF1=1; else snap.IFF1=0; if(tempo[28]) snap.IFF2=1; else snap.IFF2=0; switch(tempo[29]&0x03) { case 0: snap.Imode=0; break; case 1: snap.Imode=1; break; case 2: snap.Imode=2; break; } if(tempo[29]&0x04) snap.issue=2; else snap.issue=3; if(type) snap.pager=tempo2[5]; if(type) { // extended z80 if(snap.type==1) { // 128K snapshot /* gzclose(fichero); return -3;*/ // z80 file not yet supported while(!gzeof(fichero)) { readed=gzread(fichero,byte_read,3); if(readed!=3) break; longitud2=((int)byte_read[0])+256*((int)byte_read[1]); switch(byte_read[2]) { case 3: page=0; break; case 4: page=1; break; case 5: page=2; break; case 6: page=3; break; case 7: page=4; break; case 8: page=5; break; case 9: page=6; break; case 10: page=7; break; default: page=11; break; } if(longitud2==0xFFFF) // uncompressed raw data gzread(fichero,snap.page[page],16384); else uncompress_z80(fichero,16384,snap.page[page]); } } else { while(!gzeof(fichero)) { readed=gzread(fichero,byte_read,3); if(readed!=3) break; longitud2=((int)byte_read[0])+256*((int)byte_read[1]); switch(byte_read[2]) { case 8: page=0; break; case 4: page=1; break; case 5: page=2; break; default: page=11; break; } if(longitud2==0xFFFF) // uncompressed raw data gzread(fichero,snap.page[page],16384); else uncompress_z80(fichero,16384,snap.page[page]); } } } else { if(compressed) { // 48k compressed z80 loader // we uncompress first the data uncompress_z80(fichero,49152,memo); memcpy(snap.page[0],memo,16384); memcpy(snap.page[1],memo+16384,16384); memcpy(snap.page[2],memo+32768,16384); } else { // 48k uncompressed z80 loader memset(snap.page[0],0,16384); gzread(fichero,snap.page[0],16384); memset(snap.page[1],0,16384); gzread(fichero,snap.page[1],16384); memset(snap.page[2],0,16384); gzread(fichero,snap.page[2],16384); } } load_snap(&snap); gzclose(fichero); return 0; // all right }