Ejemplo n.º 1
0
void spec_load_z80(char *fname)
{
        FILE *f;
        int i,j,k, FileLen, compressed;
        unsigned char *buf;
        int z80version=1;
        int speccy;

        f=fopen(fname, "rb");
        if (!f) return;

        buf=malloc(262144);
        FileLen=fread(buf,1,262144, f);
        fclose(f);

        z80version=1;
        if (buf[12]==255) buf[12]=1;
        if ((buf[6]==0) && (buf[7]==0))
        {
                if (buf[30]==23) z80version=2;
                else z80version=3;
        }

        speccy=SPECCY48;

        switch(z80version)
        {
        case 1: speccy=SPECCY48; break;

        case 2:
                switch(buf[34])
                {
                case 0: speccy=SPECCY48; break;
                case 1: speccy=SPECCY48; break;
                case 3: speccy=SPECCY128; break;
                case 4: speccy=SPECCY128; break;
                case 7: speccy=SPECCYPLUS2A; break;
                case 8: speccy=SPECCYPLUS2A; break;
                case 9: speccy=SPECCY128; break;
                case 10: speccy=SPECCY128; break;
                case 11: speccy=SPECCY128; break;
                case 12: speccy=SPECCYPLUS2; break;
                case 13: speccy=SPECCYPLUS2A; break;
                case 14: speccy=SPECCYTC2048; break;
                case 15: speccy=SPECCYTC2048; break;
                case 128: speccy=SPECCYTS2068; break;
                default: speccy=SPECCY128; break;
                }
                break;

        case 3:
                switch(buf[34])
                {
                case 0: speccy=SPECCY48; break;
                case 1: speccy=SPECCY48; break;
                case 3: speccy=SPECCY48; break;
                case 4: speccy=SPECCY128; break;
                case 5: speccy=SPECCY128; break;
                case 6: speccy=SPECCY128; break;
                case 7: speccy=SPECCYPLUS2A; break;
                case 8: speccy=SPECCYPLUS2A; break;
                case 9: speccy=SPECCY128; break;
                case 10: speccy=SPECCY128; break;
                case 11: speccy=SPECCY128; break;
                case 12: speccy=SPECCYPLUS2; break;
                case 13: speccy=SPECCYPLUS2A; break;
                case 14: speccy=SPECCYTC2048; break;
                case 15: speccy=SPECCYTC2048; break;
                case 128: speccy=SPECCYTS2068; break;
                default: speccy=SPECCY128; break;
                }
                break;
        }
        if ((z80version>1) && (buf[37]&128))
        {
                switch(speccy)
                {
                case SPECCY48: speccy=SPECCY16; break;
                case SPECCY128: speccy=SPECCYPLUS2; break;
                case SPECCYPLUS3: speccy=SPECCYPLUS2A; break;
                }
        }
        HWSetMachine(MACHINESPEC48, speccy);
        machine.initialise();

        z80.af.b.h = buf[0]; z80.af.b.l = buf[1];
        z80.bc.w = buf[2] + 256*buf[3];
        z80.hl.w = buf[4] + 256*buf[5];
        z80.pc.w = buf[6] + 256*buf[7];
        z80.sp.w = buf[8] + 256*buf[9];
        z80.i = buf[10];
        z80.r = buf[11];
        z80.de.w = buf[13] + 256*buf[14];
        z80.bc_.w = buf[15] + 256*buf[16];
        z80.de_.w = buf[17] + 256*buf[18];
        z80.hl_.w = buf[19] + 256*buf[20];
        z80.af_.b.h = buf[21];
        z80.af_.b.l = buf[22];
        z80.iy.w = buf[23] + 256*buf[24];
        z80.ix.w = buf[25] + 256*buf[26];
        z80.iff1 = buf[27];
        z80.iff2 = buf[28];
        z80.im = buf[29]&3;
        z80.r7=(buf[12]&1)<<7;
        SPECBorder=(buf[12]>>1)&7;
        compressed=buf[12]&32;

        if (z80version==1)
        {
                if (compressed) z80expand(buf+30, 16384, 49152);
                else for(i=0;i<49152;i++) spec48_writebyte(i+16384, buf[i+30]);

                free(buf);
                return;
        }
        else
        {
                unsigned char *ptr;
                int page, len;
                int Count;

                ptr=buf+32;
                ptr+=buf[30];

                while(ptr < (buf+FileLen))
                {
                        len=ptr[0] + 256*ptr[1];
                        page=ptr[2];

                        if (speccy==SPECCY16 || speccy==SPECCY48
                                || speccy==SPECCYTC2048 || speccy==SPECCYTS2068)
                        {
                                switch(page)
                                {
                                case 4: page=2; break;
                                case 5: page=0; break;
                                case 8: page=5; break;
                                default: page=6; break;
                                }
                        }
                        else    page -= 3;

                        ptr += 3;

                        if (len==0xffff)
                        {
                                for(i=0;i<16384;i++)
                                        RAMWrite(page+4, i, ptr[i]);
                                ptr+=16384;
                        }
                        else
                        {
                                SPECBlk[0]=page+4;
                                ptr=z80expand(ptr, 0, 16384);
                        }
                        SPECBlk[0]=0;
                }
        }
        z80.pc.w=buf[32]+ 256*buf[33];
        if (speccy==SPECCYTC2048 || speccy==SPECCYTS2068)
                spec48_writeport(0xff,buf[36], &i);
        spec48_writeport(0x7ffd,buf[35], &i);

        free(buf);
}
Ejemplo n.º 2
0
void spec_load_z80(char *fname)
{
        FILE *f;
        int i, FileLen, compressed;
        unsigned char *buf;
        int z80version;
        int speccy;

        InitialiseSpectra();
        HW->ColourBox->ItemIndex = COLOURDISABLED;
        Form1->SpectraColourEnable->Checked = false;
        Form1->SpectraColourEnable->Enabled = false;
        Form1->SpectraColourEnable->Visible = false;

        f=fopen(fname, "rb");
        if (!f) return;

        buf=(BYTE*)malloc(311335);
        FileLen=fread(buf,1,311335, f);
        fclose(f);

        z80version=1;
        if (buf[12]==255) buf[12]=1;
        if ((buf[6]==0) && (buf[7]==0))
        {
                if (buf[30]==23) z80version=2;
                else z80version=3;
        }

        speccy=SPECCY48;

        switch(z80version)
        {
        case 1: speccy=SPECCY48; break;

        case 2:
                switch(buf[34])
                {
                case 0: speccy=SPECCY48; break;
                case 1: speccy=SPECCY48; break;
                case 3: speccy=SPECCY128; break;
                case 4: speccy=SPECCY128; break;
                case 7: speccy=SPECCYPLUS2A; break;
                case 8: speccy=SPECCYPLUS2A; break;
                case 9: speccy=SPECCY128; break;
                case 10: speccy=SPECCY128; break;
                case 11: speccy=SPECCY128; break;
                case 12: speccy=SPECCYPLUS2; break;
                case 13: speccy=SPECCYPLUS2A; break;
                case 14: speccy=SPECCYTC2048; break;
                case 15: speccy=SPECCYTC2048; break;
                case 128: speccy=SPECCYTS2068; break;
                default: speccy=SPECCY128; break;
                }
                break;

        case 3:
                switch(buf[34])
                {
                case 0: speccy=SPECCY48; break;
                case 1: speccy=SPECCY48; break;
                case 3: speccy=SPECCY48; break;
                case 4: speccy=SPECCY128; break;
                case 5: speccy=SPECCY128; break;
                case 6: speccy=SPECCY128; break;
                case 7: speccy=SPECCYPLUS2A; break;
                case 8: speccy=SPECCYPLUS2A; break;
                case 9: speccy=SPECCY128; break;
                case 10: speccy=SPECCY128; break;
                case 11: speccy=SPECCY128; break;
                case 12: speccy=SPECCYPLUS2; break;
                case 13: speccy=SPECCYPLUS2A; break;
                case 14: speccy=SPECCYTC2048; break;
                case 15: speccy=SPECCYTC2048; break;
                case 128: speccy=SPECCYTS2068; break;
                default: speccy=SPECCY128; break;
                }
                break;
        }
        if ((z80version>1) && (buf[37]&128))
        {
                switch(speccy)
                {
                case SPECCY48: speccy=SPECCY16; break;
                case SPECCY128: speccy=SPECCYPLUS2; break;
                case SPECCYPLUS3: speccy=SPECCYPLUS2A; break;
                }
        }
        HWSetMachine(MACHINESPEC48, speccy);
        machine.initialise();

        z80.af.b.h = buf[0]; z80.af.b.l = buf[1];
        z80.bc.w = buf[2] + 256*buf[3];
        z80.hl.w = buf[4] + 256*buf[5];
        z80.pc.w = buf[6] + 256*buf[7];
        z80.sp.w = buf[8] + 256*buf[9];
        z80.i = buf[10];
        z80.r = buf[11];
        z80.de.w = buf[13] + 256*buf[14];
        z80.bc_.w = buf[15] + 256*buf[16];
        z80.de_.w = buf[17] + 256*buf[18];
        z80.hl_.w = buf[19] + 256*buf[20];
        z80.af_.b.h = buf[21];
        z80.af_.b.l = buf[22];
        z80.iy.w = buf[23] + 256*buf[24];
        z80.ix.w = buf[25] + 256*buf[26];
        z80.iff1 = buf[27];
        z80.iff2 = buf[28];
        z80.im = buf[29]&3;
        z80.r7=(buf[12]&1)<<7;
        SPECBorder=(buf[12]>>1)&7;
        SPECNextBorder=SPECBorder;
        compressed=buf[12]&32;

        if (z80version==1)
        {
                if (compressed) z80expand(buf+30, 16384, 49152);
                else for(i=0;i<49152;i++) spec48_setbyte(i+16384, buf[i+30]);

                free(buf);
                return;
        }
        else
        {
                unsigned char *ptr;
                int page, len;
              
                ptr = buf+32;
                int h2len = buf[30] + (buf[31] << 8);
                ptr += h2len;

                while(ptr < (buf+FileLen))
                {
                        len=ptr[0] + 256*ptr[1];
                        page=ptr[2];

                        ptr += 3;

                        if (page == 13)
                        {
                                ptr=z80expandSpectra(ptr, 0, 16384);
                        }
                        else if (page == 14)
                        {
                                ptr=z80expandSpectra(ptr, 0x4000, 16384);
                        }
                        else
                        {
                                if (speccy==SPECCY16 || speccy==SPECCY48 || speccy==SPECCYTC2048 || speccy==SPECCYTS2068)
                                {
                                        switch(page)
                                        {
                                        case 4: page=2; break;
                                        case 5: page=0; break;
                                        case 8: page=5; break;
                                        default: page=6; break;
                                        }
                                }
                                else    page -= 3;

                                if (len==0xffff)
                                {
                                        for(i=0;i<16384;i++)
                                                RAMWrite((page+4), i, ptr[i]);
                                        ptr+=16384;
                                }
                                else
                                {
                                        SPECBlk[0]=page+4;
                                        ptr=z80expand(ptr, 0, 16384);
                                }
                                SPECBlk[0]=0;
                        }
                }
        }

        int page = (spectrum.machine >= SPECCY128) ? 11 : 9;
        
        for(i=0; i<16384; i++)
        {
                SpectraMem[i] = SpecMem[(9<<14) + i]; // Page 5
                SpectraMem[0x4000 + i] = SpecMem[(page<<14) + i]; // Page 5 or 7
        }

        if (z80version == 3)
        {
                SPECLast1ffd = buf[86];

                bool spectraPresent = (buf[37] & 0x08);
                if (spectraPresent)
                {
                        HW->ColourBox->ItemIndex = 1;
                        zx81.colour = COLOURSPECTRA;

                        zx81.spectraColourSwitchOn = buf[87] & 0x01;
                        zx81.spectraMode = buf[88];
                        SPECBorder = buf[89];
                        SPECNextBorder = SPECBorder;
                        SPECKb = SPECBorder;
                        
                        DetermineSpectraDisplayBank();

                        Form1->SpectraColourEnable->Visible = true;
                        Form1->SpectraColourEnable->Enabled = true;
                        Form1->SpectraColourEnable->Checked = zx81.spectraColourSwitchOn;
                }
                else
                {
                        HW->ColourBox->ItemIndex = 0;
                        zx81.colour = COLOURSINCLAIR;

                        zx81.spectraColourSwitchOn = false;
                        zx81.spectraMode = 0x00;
                }
        }

        Artifacts->SelectRGBOutput(zx81.colour == COLOURSPECTRA);
        Artifacts->Vibrant->Checked = !zx81.spectraColourSwitchOn;
        if (zx81.colour == COLOURSPECTRA)
        {
                Form1->DisplayArt->Checked = false;
                Artifacts->Visible = false;
        }
        Form1->DisplayArt->Enabled = (zx81.colour != COLOURSPECTRA);

        z80.pc.w=buf[32]+ 256*buf[33];
        if (speccy==SPECCYTC2048 || speccy==SPECCYTS2068)
                spec48_writeport(0xff,buf[36], &i);
        spec48_writeport(0x7ffd,buf[35], &i);

        fts=17471 - (buf[55] | (buf[56]<<8));
        fts = (((buf[57]+1)&3)<<16) | fts;
        fts=0;

        //fts=buf[55] | (buf[56]<<8) | (buf[57]<<16);

        free(buf);
}