void spec_save_z80(char *fname) { FILE *f; int i,j; int mode, flags; f=fopen(fname,"wb"); if (!f) return; fputc(z80.af.b.h,f); fputc(z80.af.b.l,f); fputc(z80.bc.b.l,f); fputc(z80.bc.b.h,f); fputc(z80.hl.b.l,f); fputc(z80.hl.b.h,f); fputc(0,f); fputc(0,f); fputc(z80.sp.b.l,f); fputc(z80.sp.b.h,f); fputc(z80.i,f); fputc(z80.r,f); i=0; if (z80.r7) i |= 1; i |= (SPECBorder<<1); fputc(i,f); fputc(z80.de.b.l,f); fputc(z80.de.b.h,f); fputc(z80.bc_.b.l,f); fputc(z80.bc_.b.h,f); fputc(z80.de_.b.l,f); fputc(z80.de_.b.h,f); fputc(z80.hl_.b.l,f); fputc(z80.hl_.b.h,f); fputc(z80.af_.b.h,f); fputc(z80.af_.b.l,f); fputc(z80.iy.b.l,f); fputc(z80.iy.b.h,f); fputc(z80.ix.b.l,f); fputc(z80.ix.b.h,f); fputc(z80.iff1,f); fputc(z80.iff2,f); i=z80.im; if (spectrum.kbissue==SPECKBISS2) i|=4; fputc(i,f); // We're going to do a version 2 .z80 file fputc(23,f); fputc(0,f); fputc(z80.pc.b.l,f); fputc(z80.pc.b.h,f); switch(spectrum.machine) { case SPECCY16: mode=0; flags=128; break; case SPECCY48: mode=0; flags=0; break; case SPECCYTC2048: mode=14; flags=0; break; case SPECCYTS2068: mode=128; flags=0; break; case SPECCY128: mode=3; flags=0; break; case SPECCYPLUS2: mode=12; flags=0; break; case SPECCYPLUS2A: mode=13; flags=0; break; case SPECCYPLUS3: mode=7; flags=0; break; } if (spectrum.floppytype=FLOPPYIF1) mode++; fputc(mode,f); if (spectrum.machine==SPECCY128 || spectrum.machine==SPECCYPLUS2 || spectrum.machine==SPECCYPLUS2A || spectrum.machine==SPECCYPLUS3) fputc(SPECLast7ffd,f); else fputc(0,f); if (spectrum.machine==SPECCYTC2048 || spectrum.machine==SPECCYTS2068) fputc(TIMEXByte,f); else fputc(0,f); flags |= 1 | 2; fputc(flags,f); fputc(0,f); for(i=0;i<16;i++) fputc(0,f); if (spectrum.machine==SPECCY16) z80_save_block(f,SPECBlk[1], 8); else if (spectrum.machine==SPECCY48 || spectrum.machine==SPECCYTC2048 || spectrum.machine==SPECCYTS2068) { z80_save_block(f,SPECBlk[1], 8); z80_save_block(f,SPECBlk[2], 4); z80_save_block(f,SPECBlk[3], 5); } else { for(i=0;i<8;i++) z80_save_block(f,i+4, i+3); } fclose(f); }
void spec_save_z80(char *fname) { FILE *f; int i; int mode, flags; f=fopen(fname,"wb"); if (!f) return; fputc(z80.af.b.h,f); fputc(z80.af.b.l,f); fputc(z80.bc.b.l,f); fputc(z80.bc.b.h,f); fputc(z80.hl.b.l,f); fputc(z80.hl.b.h,f); fputc(0,f); fputc(0,f); fputc(z80.sp.b.l,f); fputc(z80.sp.b.h,f); fputc(z80.i,f); fputc(z80.r,f); i=0; if (z80.r7) i |= 1; i |= ((SPECBorder & 0x07)<<1); fputc(i,f); fputc(z80.de.b.l,f); fputc(z80.de.b.h,f); fputc(z80.bc_.b.l,f); fputc(z80.bc_.b.h,f); fputc(z80.de_.b.l,f); fputc(z80.de_.b.h,f); fputc(z80.hl_.b.l,f); fputc(z80.hl_.b.h,f); fputc(z80.af_.b.h,f); fputc(z80.af_.b.l,f); fputc(z80.iy.b.l,f); fputc(z80.iy.b.h,f); fputc(z80.ix.b.l,f); fputc(z80.ix.b.h,f); fputc(z80.iff1,f); fputc(z80.iff2,f); i=z80.im; if (spectrum.kbissue==SPECKBISS2) i|=4; fputc(i,f); // We're going to do a version 2 or 3 .z80 file int h2len = (zx81.colour == COLOURSPECTRA) ? 58 : 23; fputc(h2len,f); fputc(0,f); fputc(z80.pc.b.l,f); fputc(z80.pc.b.h,f); switch(spectrum.machine) { case SPECCY16: mode=0; flags=128; break; case SPECCY48: mode=0; flags=0; break; case SPECCYTC2048: mode=14; flags=0; break; case SPECCYTS2068: mode=128; flags=0; break; case SPECCY128: mode=3; flags=0; break; case SPECCYPLUS2: mode=12; flags=0; break; case SPECCYPLUS2A: mode=13; flags=0; break; case SPECCYPLUS3: mode=7; flags=0; break; } if (spectrum.floppytype==FLOPPYIF1) mode++; fputc(mode,f); if (spectrum.machine==SPECCY128 || spectrum.machine==SPECCYPLUS2 || spectrum.machine==SPECCYPLUS2A || spectrum.machine==SPECCYPLUS3) fputc(SPECLast7ffd,f); else fputc(0,f); if (spectrum.machine==SPECCYTC2048 || spectrum.machine==SPECCYTS2068) fputc(TIMEXByte,f); else fputc(0,f); /* Bit 0: 1 if R register emulation on Bit 1: 1 if LDIR emulation on Bit 2: AY sound in use, even on 48K machines Bit 3: SPECTRA interface present Bit 6: (if bit 2 set) Fuller Audio Box emulation Bit 7: Modify hardware */ flags |= 1 | 2; if (zx81.colour == COLOURSPECTRA) flags |= 8; fputc(flags,f); fputc(0,f); for(i=0;i<16;i++) fputc(0,f); // If Spectra is enabled then output a version 3 file if (zx81.colour == COLOURSPECTRA) { for (i=55; i<86; i++) { fputc(0,f); } fputc(SPECLast1ffd, f); /* Spectra extension devised for zxsp emulator. Bit 0: new colour modes enabled Bit 1: RS232 enabled Bit 2: Joystick enabled Bit 3: IF1 rom hooks enabled Bit 4: rom paged in Bit 5: port 239: Comms out bit Bit 6: port 239: CTS out bit Bit 7: port 247: Data out bit */ // Only colour mode supported at present BYTE spectraBits = zx81.spectraColourSwitchOn ? 1 : 0; fputc(spectraBits, f); /* Spectra extension devised for zxsp emulator. Last out to port 7FDF */ fputc(zx81.spectraMode, f); fputc(SPECBorder, f); } if (spectrum.machine==SPECCY16) z80_save_block(f,SPECBlk[1], 8); else if (spectrum.machine==SPECCY48 || spectrum.machine==SPECCYTC2048 || spectrum.machine==SPECCYTS2068) { z80_save_block(f,SPECBlk[1], 8); z80_save_block(f,SPECBlk[2], 4); z80_save_block(f,SPECBlk[3], 5); } else { for(i=0;i<8;i++) z80_save_block(f,i+4, i+3); } if (zx81.colour == COLOURSPECTRA) { /* Spectra extension devised for zxsp emulator. pg no. memory bank ------ ----------- 12 SPECTRA rom 13 SPECTRA ram[0] 14 SPECTRA ram[1] */ // Only RAM supported at present z80_save_spectra_block(f, 0, 13); z80_save_spectra_block(f, 1, 14); } fclose(f); }