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); }
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); }