Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}