Removed sound during reset, malloc for snapshot variables

This commit is contained in:
fabio.olimpieri 2012-05-20 18:42:41 +00:00
parent 2bc2a83812
commit dd1edcde76
2 changed files with 145 additions and 112 deletions

View File

@ -160,25 +160,34 @@ int save_z80(char *filename, int overwrite) {
int load_z80(char *filename) { int load_z80(char *filename) {
static struct z80snapshot snap; struct z80snapshot *snap;
unsigned char tempo[30],tempo2[56],memo[49152],type,compressed,page,byte_read[3]; unsigned char tempo[30],tempo2[56],type,compressed,page,byte_read[3];
unsigned char *memo;
FILE *fichero; FILE *fichero;
int longitud=0,longitud2,bucle,retval; int longitud=0,longitud2,bucle,retval;
memo=(unsigned char *)malloc(49152);
snap=(struct z80snapshot *)malloc(sizeof(struct z80snapshot));
longitud=strlen(filename); longitud=strlen(filename);
if ((longitud>4)&&(0==strcasecmp(".sna",filename+(longitud-4)))) { if ((longitud>4)&&(0==strcasecmp(".sna",filename+(longitud-4)))) {
printf("Read SNA file\n"); printf("Read SNA file\n");
free(memo);
free(snap);
return load_sna(filename); return load_sna(filename);
} }
printf("Read Z80 file\n"); printf("Read Z80 file\n");
for(bucle=0;bucle<16;bucle++) for(bucle=0;bucle<16;bucle++)
snap.ay_regs[bucle]=0; snap->ay_regs[bucle]=0;
fichero=fopen(filename,"r"); fichero=fopen(filename,"r");
if(fichero==NULL) if(fichero==NULL) {
free(memo);
free(snap);
return -1; // error return -1; // error
}
printf("Read header (first 30 bytes)\n"); printf("Read header (first 30 bytes)\n");
retval=fread(tempo,1,30,fichero); retval=fread(tempo,1,30,fichero);
@ -193,6 +202,8 @@ int load_z80(char *filename) {
if(longitud>54) { if(longitud>54) {
fclose(fichero); fclose(fichero);
printf("Not suported Z80 file\n"); printf("Not suported Z80 file\n");
free(memo);
free(snap);
return -3; // not a supported Z80 file return -3; // not a supported Z80 file
} }
printf("Length: %d\n",longitud); printf("Length: %d\n",longitud);
@ -202,15 +213,17 @@ int load_z80(char *filename) {
switch(tempo2[4]) { switch(tempo2[4]) {
case 0: case 0:
case 1: case 1:
snap.type=0; // 48K snap->type=0; // 48K
break; break;
case 3: case 3:
case 4: case 4:
snap.type=1; // 128K snap->type=1; // 128K
break; break;
default: default:
fclose(fichero); fclose(fichero);
printf("Again not suported Z80 file\n"); printf("Again not suported Z80 file\n");
free(memo);
free(snap);
return -3; // not a supported Z80 file return -3; // not a supported Z80 file
break; break;
} }
@ -219,50 +232,52 @@ int load_z80(char *filename) {
case 0: case 0:
case 1: case 1:
case 3: case 3:
snap.type=0; // 48K snap->type=0; // 48K
break; break;
case 4: case 4:
case 5: case 5:
case 6: case 6:
snap.type=1; // 128K snap->type=1; // 128K
break; break;
default: default:
fclose(fichero); fclose(fichero);
free(memo);
free(snap);
return -3; // not a supported Z80 file return -3; // not a supported Z80 file
break; break;
} }
} else { } else {
printf("Old type z80\n"); printf("Old type z80\n");
type=0; // old type type=0; // old type
snap.type=0; // 48k snap->type=0; // 48k
} }
if(tempo[29]&0x04) { if(tempo[29]&0x04) {
printf("Issue 2\n"); printf("Issue 2\n");
snap.issue=2; // issue2 snap->issue=2; // issue2
} else { } else {
printf("Issue 3\n"); printf("Issue 3\n");
snap.issue=3; // issue3 snap->issue=3; // issue3
} }
snap.A=tempo[0]; snap->A=tempo[0];
snap.F=tempo[1]; snap->F=tempo[1];
snap.C=tempo[2]; snap->C=tempo[2];
snap.B=tempo[3]; snap->B=tempo[3];
snap.L=tempo[4]; snap->L=tempo[4];
snap.H=tempo[5]; snap->H=tempo[5];
if(type) { if(type) {
snap.PC=((word)tempo2[2])+256*((word)tempo2[3]); snap->PC=((word)tempo2[2])+256*((word)tempo2[3]);
for(bucle=0;bucle<16;bucle++) for(bucle=0;bucle<16;bucle++)
snap.ay_regs[bucle]=tempo2[9+bucle]; snap->ay_regs[bucle]=tempo2[9+bucle];
snap.ay_latch=tempo2[8]; snap->ay_latch=tempo2[8];
} else { } else {
snap.PC=((word)tempo[6])+256*((word)tempo[7]); snap->PC=((word)tempo[6])+256*((word)tempo[7]);
} }
snap.SP=((word)tempo[8])+256*((word)tempo[9]); snap->SP=((word)tempo[8])+256*((word)tempo[9]);
snap.I=tempo[10]; snap->I=tempo[10];
snap.R=(tempo[11]&0x7F); snap->R=(tempo[11]&0x7F);
if(tempo[12]==255) { if(tempo[12]==255) {
printf("Byte 12 is 255! doing 1\n"); printf("Byte 12 is 255! doing 1\n");
@ -270,57 +285,57 @@ int load_z80(char *filename) {
} }
if(tempo[12]&0x01) if(tempo[12]&0x01)
snap.R|=0x80; snap->R|=0x80;
snap.border=(tempo[12]>>1)&0x07; snap->border=(tempo[12]>>1)&0x07;
if(tempo[12]&32) if(tempo[12]&32)
compressed=1; compressed=1;
else else
compressed=0; compressed=0;
snap.E=tempo[13]; snap->E=tempo[13];
snap.D=tempo[14]; snap->D=tempo[14];
snap.CC=tempo[15]; snap->CC=tempo[15];
snap.BB=tempo[16]; snap->BB=tempo[16];
snap.EE=tempo[17]; snap->EE=tempo[17];
snap.DD=tempo[18]; snap->DD=tempo[18];
snap.LL=tempo[19]; snap->LL=tempo[19];
snap.HH=tempo[20]; snap->HH=tempo[20];
snap.AA=tempo[21]; snap->AA=tempo[21];
snap.FF=tempo[22]; snap->FF=tempo[22];
snap.IY=((word)tempo[23])+256*((word)tempo[24]); snap->IY=((word)tempo[23])+256*((word)tempo[24]);
snap.IX=((word)tempo[25])+256*((word)tempo[26]); snap->IX=((word)tempo[25])+256*((word)tempo[26]);
if(tempo[27]!=0) if(tempo[27]!=0)
snap.IFF1=1; snap->IFF1=1;
else else
snap.IFF1=0; snap->IFF1=0;
if(tempo[28]!=0) if(tempo[28]!=0)
snap.IFF2=1; snap->IFF2=1;
else else
snap.IFF2=0; snap->IFF2=0;
switch(tempo[29]&0x03) { switch(tempo[29]&0x03) {
case 0: case 0:
snap.Imode=0; snap->Imode=0;
break; break;
case 1: case 1:
snap.Imode=1; snap->Imode=1;
break; break;
case 2: case 2:
snap.Imode=2; snap->Imode=2;
break; break;
} }
snap.joystick=((tempo[29]>>6)&0x03); snap->joystick=((tempo[29]>>6)&0x03);
if(type) if(type)
snap.pager=tempo2[5]; snap->pager=tempo2[5];
if(type) { // extended z80 if(type) { // extended z80
if(snap.type==1) { // 128K snapshot if(snap->type==1) { // 128K snapshot
/* fclose(fichero); /* fclose(fichero);
return -3;*/ // z80 file not yet supported return -3;*/ // z80 file not yet supported
@ -361,9 +376,9 @@ int load_z80(char *filename) {
} }
printf("Loading page %d of length %d\n",page,longitud); printf("Loading page %d of length %d\n",page,longitud);
if(longitud2==0xFFFF) // uncompressed raw data if(longitud2==0xFFFF) // uncompressed raw data
retval=fread(snap.page[page],16384,1,fichero); retval=fread(snap->page[page],16384,1,fichero);
else else
uncompress_z80(fichero,16384,snap.page[page]); uncompress_z80(fichero,16384,snap->page[page]);
} }
} else { } else {
@ -387,9 +402,9 @@ int load_z80(char *filename) {
break; break;
} }
if(longitud2==0xFFFF) // uncompressed raw data if(longitud2==0xFFFF) // uncompressed raw data
retval=fread(snap.page[page],16384,1,fichero); retval=fread(snap->page[page],16384,1,fichero);
else else
uncompress_z80(fichero,16384,snap.page[page]); uncompress_z80(fichero,16384,snap->page[page]);
} }
} }
} else { } else {
@ -401,49 +416,63 @@ int load_z80(char *filename) {
uncompress_z80(fichero,49152,memo); uncompress_z80(fichero,49152,memo);
memcpy(snap.page[0],memo,16384); memcpy(snap->page[0],memo,16384);
memcpy(snap.page[1],memo+16384,16384); memcpy(snap->page[1],memo+16384,16384);
memcpy(snap.page[2],memo+32768,16384); memcpy(snap->page[2],memo+32768,16384);
} else { } else {
// 48k uncompressed z80 loader // 48k uncompressed z80 loader
retval=fread(snap.page[0],16384,1,fichero); retval=fread(snap->page[0],16384,1,fichero);
retval=fread(snap.page[1],16384,1,fichero); retval=fread(snap->page[1],16384,1,fichero);
retval=fread(snap.page[2],16384,1,fichero); retval=fread(snap->page[2],16384,1,fichero);
} }
} }
load_snap(&snap); load_snap(snap);
fclose(fichero); fclose(fichero);
free(memo);
free(snap);
return 0; // all right return 0; // all right
} }
int load_sna(char *filename) { int load_sna(char *filename) {
unsigned char tempo[49179]; unsigned char *tempo;
unsigned char tempo2[98308]; unsigned char *tempo2;
unsigned char type=0; unsigned char type=0;
FILE *fichero; FILE *fichero;
static struct z80snapshot snap; struct z80snapshot *snap;
unsigned char v1,v2; unsigned char v1,v2;
int addr,loop; int addr,loop;
tempo=(unsigned char *)malloc(49179);
tempo2=(unsigned char *)malloc(98308);
snap=(struct z80snapshot *)malloc(sizeof(struct z80snapshot));
//Some inits //Some inits
for(loop=0;loop<16;loop++) for(loop=0;loop<16;loop++)
snap.ay_regs[loop]=0; snap->ay_regs[loop]=0;
snap.ay_latch=0; snap->ay_latch=0;
snap.issue=3; snap->issue=3;
snap.joystick=1; //kempston snap->joystick=1; //kempston
printf("Loading SNA file\n"); printf("Loading SNA file\n");
fichero=fopen(filename,"r"); fichero=fopen(filename,"r");
if(fichero==NULL) if(fichero==NULL) {
free(tempo);
free(tempo2);
free(snap);
return -1; // error return -1; // error
}
if (1!=fread(tempo,49179,1,fichero)) { if (1!=fread(tempo,49179,1,fichero)) {
free(tempo);
free(tempo2);
free(snap);
return -1; return -1;
} }
@ -455,46 +484,46 @@ int load_sna(char *filename) {
type=1; type=1;
} }
snap.type=type; snap->type=type;
snap.I=tempo[0]; snap->I=tempo[0];
snap.LL=tempo[1]; snap->LL=tempo[1];
snap.HH=tempo[2]; snap->HH=tempo[2];
snap.EE=tempo[3]; snap->EE=tempo[3];
snap.DD=tempo[4]; snap->DD=tempo[4];
snap.CC=tempo[5]; snap->CC=tempo[5];
snap.BB=tempo[6]; snap->BB=tempo[6];
snap.FF=tempo[7]; snap->FF=tempo[7];
snap.AA=tempo[8]; snap->AA=tempo[8];
snap.L=tempo[9]; snap->L=tempo[9];
snap.H=tempo[10]; snap->H=tempo[10];
snap.E=tempo[11]; snap->E=tempo[11];
snap.D=tempo[12]; snap->D=tempo[12];
snap.C=tempo[13]; snap->C=tempo[13];
snap.B=tempo[14]; snap->B=tempo[14];
snap.IY=((word)tempo[15])+256*((word)tempo[16]); snap->IY=((word)tempo[15])+256*((word)tempo[16]);
snap.IX=((word)tempo[17])+256*((word)tempo[18]); snap->IX=((word)tempo[17])+256*((word)tempo[18]);
if (tempo[19]&0x01) { if (tempo[19]&0x01) {
snap.IFF1=1; snap->IFF1=1;
} else { } else {
snap.IFF1=0; snap->IFF1=0;
} }
if (tempo[19]&0x02) { if (tempo[19]&0x02) {
snap.IFF2=1; snap->IFF2=1;
} else { } else {
snap.IFF2=0; snap->IFF2=0;
} }
snap.R=tempo[20]; snap->R=tempo[20];
snap.F=tempo[21]; snap->F=tempo[21];
snap.A=tempo[22]; snap->A=tempo[22];
snap.SP=((word)tempo[23])+256*((word)tempo[24]); snap->SP=((word)tempo[23])+256*((word)tempo[24]);
snap.Imode=tempo[25]; snap->Imode=tempo[25];
snap.border=tempo[26]; snap->border=tempo[26];
if (type==0) { if (type==0) {
@ -502,42 +531,49 @@ int load_sna(char *filename) {
v2=tempo[24]; v2=tempo[24];
addr=((int)v1)+256*((int)v2); addr=((int)v1)+256*((int)v2);
if ((addr<16384)||(addr>=65534)) { if ((addr<16384)||(addr>=65534)) {
free(tempo);
free(tempo2);
free(snap);
printf("Error loading SNA file. Return address in ROM.\n"); printf("Error loading SNA file. Return address in ROM.\n");
return -1; return -1;
} }
addr-=16384; addr-=16384;
addr+=27; addr+=27;
snap.PC=((word)tempo[addr])+256*((word)tempo[addr+1]); snap->PC=((word)tempo[addr])+256*((word)tempo[addr+1]);
tempo[addr]=0; tempo[addr]=0;
tempo[addr+1]=0; tempo[addr+1]=0;
snap.SP+=2; snap->SP+=2;
snap.IFF1=snap.IFF2; snap->IFF1=snap->IFF2;
memcpy(snap.page[0],tempo+27,16384); memcpy(snap->page[0],tempo+27,16384);
memcpy(snap.page[1],tempo+16411,16384); memcpy(snap->page[1],tempo+16411,16384);
memcpy(snap.page[2],tempo+32795,16384); memcpy(snap->page[2],tempo+32795,16384);
} else { } else {
snap.PC=((word)tempo2[0])+256*((word)tempo2[1]); snap->PC=((word)tempo2[0])+256*((word)tempo2[1]);
memcpy(snap.page[5],tempo+27,16384); memcpy(snap->page[5],tempo+27,16384);
memcpy(snap.page[2],tempo+16411,16384); memcpy(snap->page[2],tempo+16411,16384);
v1=tempo[2]; v1=tempo[2];
snap.pager=v1; snap->pager=v1;
v1&=0x07; v1&=0x07;
memcpy(snap.page[v1],tempo+32795,16384); memcpy(snap->page[v1],tempo+32795,16384);
addr=4; addr=4;
for (loop=0;loop<7;loop++) { for (loop=0;loop<7;loop++) {
if ((loop==2)||(loop==5)||(loop==((int)v1))) { if ((loop==2)||(loop==5)||(loop==((int)v1))) {
continue; continue;
} }
memcpy(snap.page[loop],tempo2+addr,16384); memcpy(snap->page[loop],tempo2+addr,16384);
addr+=16384; addr+=16384;
} }
} }
load_snap(&snap); load_snap(snap);
free(tempo);
free(tempo2);
free(snap);
return 0; return 0;
} }
void load_snap(struct z80snapshot *snap) { void load_snap(struct z80snapshot *snap) {
int bucle; int bucle;

View File

@ -351,7 +351,6 @@ void load_rom(char type) {
void init_screen(int resx,int resy,int depth,int fullscreen,int dblbuffer,int hwsurface) { void init_screen(int resx,int resy,int depth,int fullscreen,int dblbuffer,int hwsurface) {
int retorno,bucle,bucle2,valores,ret2; int retorno,bucle,bucle2,valores,ret2;
unsigned char value;
//if (sound_type!=3) //if (sound_type!=3)
retorno=SDL_Init(SDL_INIT_VIDEO); retorno=SDL_Init(SDL_INIT_VIDEO);
@ -431,14 +430,12 @@ void init_screen(int resx,int resy,int depth,int fullscreen,int dblbuffer,int hw
else else
ordenador.increment=ordenador.channels; ordenador.increment=ordenador.channels;
value=0;
for(bucle2=0;bucle2<NUM_SNDBUF;bucle2++) { for(bucle2=0;bucle2<NUM_SNDBUF;bucle2++) {
//sound[bucle2]=(unsigned char *)malloc(ordenador.buffer_len*ordenador.increment+8); //sound[bucle2]=(unsigned char *)malloc(ordenador.buffer_len*ordenador.increment+8);
//ASND Required alligned memory with padding //ASND Required alligned memory with padding
sound[bucle2]=(unsigned char *)memalign(32,ordenador.buffer_len*ordenador.increment+32); sound[bucle2]=(unsigned char *)memalign(32,ordenador.buffer_len*ordenador.increment+32);
for(bucle=0;bucle<ordenador.buffer_len*ordenador.increment+4;bucle++) for(bucle=0;bucle<ordenador.buffer_len*ordenador.increment+4;bucle++)
sound[bucle2][bucle]=value; sound[bucle2][bucle]=0;
value+=4;
} }
printf("Init sound 2\n"); printf("Init sound 2\n");