Removed CBA sound, tape pause depends on turbo mode, changed fast load routine to let Mask and Goody work

This commit is contained in:
fabio.olimpieri 2013-02-17 21:59:31 +00:00
parent efa831330a
commit 3ee3ad572f
4 changed files with 66 additions and 61 deletions

View File

@ -1057,7 +1057,7 @@ int load_config(struct computer *object, char *filename) {
if (ay_emul<2) { if (ay_emul<2) {
object->ay_emul=ay_emul; object->ay_emul=ay_emul;
} }
if (audio_mode<5) { if (audio_mode<4) {
object->audio_mode=audio_mode; object->audio_mode=audio_mode;
} }
if (mdr_active<2) { if (mdr_active<2) {

View File

@ -101,7 +101,7 @@ static const char *audio_messages[] = {
/*04*/ "^|on|off", /*04*/ "^|on|off",
/*05*/ " ", /*05*/ " ",
/*06*/ "Audio mode", /*06*/ "Audio mode",
/*07*/ "^|mono|ABC|ACB|BAC|CBA", /*07*/ "^|mono|ABC|ACB|BAC",
/*08 " ", */ /*08 " ", */
/*09 "Beeper low pass filter",*/ /*09 "Beeper low pass filter",*/
/*10 "^|0|1|2|3|4|5|6|7|max",*/ /*10 "^|0|1|2|3|4|5|6|7|max",*/

View File

@ -360,10 +360,6 @@ inline void play_sound (unsigned int tstados) {
lvalue = (beeper + ordenador.vol_b*2 + ordenador.vol_a)*ordenador.volume; lvalue = (beeper + ordenador.vol_b*2 + ordenador.vol_a)*ordenador.volume;
rvalue = (beeper + ordenador.vol_a + ordenador.vol_c*2)*ordenador.volume; rvalue = (beeper + ordenador.vol_a + ordenador.vol_c*2)*ordenador.volume;
break; break;
case 4: //CBA
lvalue = (beeper + ordenador.vol_b + ordenador.vol_c*2)*ordenador.volume;
rvalue = (beeper + ordenador.vol_a*2 + ordenador.vol_b)*ordenador.volume;
break;
default: //No emulation default: //No emulation
rvalue = beeper*ordenador.volume; rvalue = beeper*ordenador.volume;
lvalue = beeper*ordenador.volume; lvalue = beeper*ordenador.volume;

View File

@ -722,6 +722,11 @@ void save_file(FILE *fichero) {
return; return;
} }
unsigned int min(unsigned int x,unsigned int y)
{
if (x<y) return x; else return y;
}
void fastload_block_tap (FILE * fichero) { void fastload_block_tap (FILE * fichero) {
/*Frome Fuse On exit: /*Frome Fuse On exit:
@ -740,7 +745,7 @@ void fastload_block_tap (FILE * fichero) {
* Other registers unchanged. * Other registers unchanged.
*/ */
unsigned int longitud, bucle, number_bytes; unsigned int longitud, longitud_block, bucle, number_bytes;
unsigned char value[65536], empty, parity; unsigned char value[65536], empty, parity;
int retval; int retval;
@ -781,6 +786,7 @@ void fastload_block_tap (FILE * fichero) {
} }
longitud = ((unsigned int) value[0]) + 256 * ((unsigned int) value[1]); longitud = ((unsigned int) value[0]) + 256 * ((unsigned int) value[1]);
longitud_block=longitud;
retval=fread (value, 1,1, fichero); //Flag Byte retval=fread (value, 1,1, fichero); //Flag Byte
if (retval!=1) if (retval!=1)
@ -814,17 +820,10 @@ void fastload_block_tap (FILE * fichero) {
printf("TAP: expected by file %d\n", longitud-1); printf("TAP: expected by file %d\n", longitud-1);
} }
if (procesador.Rm.wr.DE>(longitud-1)) number_bytes = min(procesador.Rm.wr.DE,longitud-1);
{
procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE;
procesador.Rm.wr.DE = 0;
retval=fread (value, 1,longitud, fichero); //read the remaining bytes
return;
}
retval=fread (value, 1,longitud, fichero); retval=fread (value, 1,number_bytes+1, fichero); //read also checksum byte
if (retval!=longitud) if (retval!=(number_bytes+1))
{ {
procesador.Rm.br.F &= (~F_C); // Load error procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE; procesador.Rm.wr.IX += procesador.Rm.wr.DE;
@ -833,39 +832,47 @@ void fastload_block_tap (FILE * fichero) {
return; return;
} }
number_bytes=procesador.Rm.wr.DE;
for(bucle=0;bucle<number_bytes; bucle++) for(bucle=0;bucle<number_bytes; bucle++)
{ {
Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte
procesador.Rm.wr.IX++; procesador.Rm.wr.IX++;
procesador.Rm.wr.DE--; procesador.Rm.wr.DE--;
longitud--;
parity^=(byte) value[bucle]; parity^=(byte) value[bucle];
} }
//clean_screen (); parity^=(byte) value[number_bytes]; // checksum
parity^=value[number_bytes]; // checksum
if (parity) printf("TAP: Parity error\n"); if (parity) printf("TAP: Parity error\n");
longitud--;
if (longitud>0) retval=fread (value, 1,longitud, fichero); //read the remaining bytes
procesador.Rm.br.A=parity;
//CP 01
Z80free_doArithmetic(&procesador,procesador.Rm.br.A,0x01,0,1);
Z80free_adjustFlags(&procesador,0x01);
procesador.Rm.br.B=0xB0;
procesador.Rm.br.C=0x01; procesador.Rm.br.C=0x01;
procesador.Rm.br.H=parity; procesador.Rm.br.H=parity;
procesador.Rm.br.L=value[longitud-1]; procesador.Rm.br.L=value[number_bytes-1];
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45;
procesador.Rm.br.F |= F_C; // Load OK
if (procesador.Rm.wr.DE==0) //OK
{
procesador.Rm.br.A=parity;
//CP 01
Z80free_doArithmetic(&procesador,procesador.Rm.br.A,0x01,0,1);
Z80free_adjustFlags(&procesador,0x01);
procesador.Rm.br.B=0xB0;
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45;
procesador.Rm.br.F |= F_C; // Load OK
}
else // Load error
{
procesador.Rm.br.B=0;
procesador.Rm.br.A=0;
procesador.Rm.br.F &= (~F_C); // Load error
}
if (ordenador.pause_instant_load) if (ordenador.pause_instant_load)
{ {
ordenador.pause_fastload_countdwn=2000/20+1; //tap pause if ((ordenador.turbo==0)||(longitud_block==6914)) ordenador.pause_fastload_countdwn=2000/20+1; //tap pause for screen and norma turbo
else ordenador.pause_fastload_countdwn=1000/20+1;
} }
return; return;
@ -1108,17 +1115,10 @@ void fastload_block_tzx (FILE * fichero) {
printf("TZX: expected by file %d\n", longitud-1); printf("TZX: expected by file %d\n", longitud-1);
} }
if (procesador.Rm.wr.DE>(longitud-1)) number_bytes = min(procesador.Rm.wr.DE,longitud-1);
{
procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE;
procesador.Rm.wr.DE = 0;
retval=fread (value, 1,longitud, fichero); //read the remaining bytes
return;
}
retval=fread (value, 1,longitud, fichero); retval=fread (value, 1,number_bytes+1, fichero); //read also checksum byte
if (retval!=longitud) if (retval!=(number_bytes+1))
{ {
procesador.Rm.br.F &= (~F_C); // Load error procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE; procesador.Rm.wr.IX += procesador.Rm.wr.DE;
@ -1127,34 +1127,42 @@ void fastload_block_tzx (FILE * fichero) {
return; return;
} }
number_bytes=procesador.Rm.wr.DE;
for(bucle=0;bucle<number_bytes; bucle++) for(bucle=0;bucle<number_bytes; bucle++)
{ {
Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte
procesador.Rm.wr.IX++; procesador.Rm.wr.IX++;
procesador.Rm.wr.DE--; procesador.Rm.wr.DE--;
longitud--;
parity^=(byte) value[bucle]; parity^=(byte) value[bucle];
} }
//clean_screen (); parity^=(byte) value[number_bytes]; // checksum
parity^=value[number_bytes]; // checksum
if (parity) printf("TZX: Parity error\n"); if (parity) printf("TZX: Parity error\n");
longitud--;
if (longitud>0) retval=fread (value, 1,longitud, fichero); //read the remaining bytes
procesador.Rm.br.A=parity;
//CP 01
Z80free_doArithmetic(&procesador,procesador.Rm.br.A,0x01,0,1);
Z80free_adjustFlags(&procesador,0x01);
procesador.Rm.br.B=0xB0;
procesador.Rm.br.C=0x01; procesador.Rm.br.C=0x01;
procesador.Rm.br.H=parity; procesador.Rm.br.H=parity;
procesador.Rm.br.L=value[longitud-1]; procesador.Rm.br.L=value[number_bytes-1];
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45; if (procesador.Rm.wr.DE==0) //OK
procesador.Rm.br.F |= F_C; // Load OK {
procesador.Rm.br.A=parity;
//CP 01
Z80free_doArithmetic(&procesador,procesador.Rm.br.A,0x01,0,1);
Z80free_adjustFlags(&procesador,0x01);
procesador.Rm.br.B=0xB0;
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45;
procesador.Rm.br.F |= F_C; // Load OK
}
else // Load error
{
procesador.Rm.br.B=0;
procesador.Rm.br.A=0;
procesador.Rm.br.F &= (~F_C); // Load error
}
byte_position=ftell(fichero); byte_position=ftell(fichero);
@ -1183,7 +1191,8 @@ void fastload_block_tzx (FILE * fichero) {
} }
else if (ordenador.pause_instant_load) else if (ordenador.pause_instant_load)
{ {
ordenador.pause_fastload_countdwn=((unsigned int)pause[0]+256*(unsigned int)pause[1])/20+1; //tzx pause if (ordenador.turbo==0) ordenador.pause_fastload_countdwn=((unsigned int)pause[0]+256*(unsigned int)pause[1])/20+1; //tzx pause
else ordenador.pause_fastload_countdwn=((unsigned int)pause[0]+256*(unsigned int)pause[1])/60+1;
} }
fseek(fichero, byte_position, SEEK_SET); fseek(fichero, byte_position, SEEK_SET);