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) {
object->ay_emul=ay_emul;
}
if (audio_mode<5) {
if (audio_mode<4) {
object->audio_mode=audio_mode;
}
if (mdr_active<2) {

View File

@ -101,7 +101,7 @@ static const char *audio_messages[] = {
/*04*/ "^|on|off",
/*05*/ " ",
/*06*/ "Audio mode",
/*07*/ "^|mono|ABC|ACB|BAC|CBA",
/*07*/ "^|mono|ABC|ACB|BAC",
/*08 " ", */
/*09 "Beeper low pass filter",*/
/*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;
rvalue = (beeper + ordenador.vol_a + ordenador.vol_c*2)*ordenador.volume;
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
rvalue = beeper*ordenador.volume;
lvalue = beeper*ordenador.volume;

View File

@ -722,6 +722,11 @@ void save_file(FILE *fichero) {
return;
}
unsigned int min(unsigned int x,unsigned int y)
{
if (x<y) return x; else return y;
}
void fastload_block_tap (FILE * fichero) {
/*Frome Fuse On exit:
@ -740,7 +745,7 @@ void fastload_block_tap (FILE * fichero) {
* Other registers unchanged.
*/
unsigned int longitud, bucle, number_bytes;
unsigned int longitud, longitud_block, bucle, number_bytes;
unsigned char value[65536], empty, parity;
int retval;
@ -781,6 +786,7 @@ void fastload_block_tap (FILE * fichero) {
}
longitud = ((unsigned int) value[0]) + 256 * ((unsigned int) value[1]);
longitud_block=longitud;
retval=fread (value, 1,1, fichero); //Flag Byte
if (retval!=1)
@ -814,17 +820,10 @@ void fastload_block_tap (FILE * fichero) {
printf("TAP: expected by file %d\n", longitud-1);
}
if (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;
}
number_bytes = min(procesador.Rm.wr.DE,longitud-1);
retval=fread (value, 1,longitud, fichero);
if (retval!=longitud)
retval=fread (value, 1,number_bytes+1, fichero); //read also checksum byte
if (retval!=(number_bytes+1))
{
procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE;
@ -832,40 +831,48 @@ void fastload_block_tap (FILE * fichero) {
printf("TAP: Read file error\n");
return;
}
number_bytes=procesador.Rm.wr.DE;
for(bucle=0;bucle<number_bytes; bucle++)
{
Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte
procesador.Rm.wr.IX++;
procesador.Rm.wr.DE--;
longitud--;
parity^=(byte) value[bucle];
}
//clean_screen ();
parity^=value[number_bytes]; // checksum
parity^=(byte) value[number_bytes]; // checksum
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.H=parity;
procesador.Rm.br.L=value[longitud-1];
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45;
procesador.Rm.br.F |= F_C; // Load OK
procesador.Rm.br.L=value[number_bytes-1];
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)
{
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;
@ -1108,17 +1115,10 @@ void fastload_block_tzx (FILE * fichero) {
printf("TZX: expected by file %d\n", longitud-1);
}
if (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);
if (retval!=longitud)
number_bytes = min(procesador.Rm.wr.DE,longitud-1);
retval=fread (value, 1,number_bytes+1, fichero); //read also checksum byte
if (retval!=(number_bytes+1))
{
procesador.Rm.br.F &= (~F_C); // Load error
procesador.Rm.wr.IX += procesador.Rm.wr.DE;
@ -1126,35 +1126,43 @@ void fastload_block_tzx (FILE * fichero) {
printf("TZX: Read file error\n");
return;
}
number_bytes=procesador.Rm.wr.DE;
for(bucle=0;bucle<number_bytes; bucle++)
{
Z80free_Wr_fake (procesador.Rm.wr.IX, (byte) value[bucle]); // store the byte
procesador.Rm.wr.IX++;
procesador.Rm.wr.DE--;
longitud--;
parity^=(byte) value[bucle];
}
//clean_screen ();
parity^=value[number_bytes]; // checksum
parity^=(byte) value[number_bytes]; // checksum
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.H=parity;
procesador.Rm.br.L=value[longitud-1];
procesador.Ra.br.A=0x01;
procesador.Ra.br.F=0x45;
procesador.Rm.br.F |= F_C; // Load OK
procesador.Rm.br.L=value[number_bytes-1];
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
}
byte_position=ftell(fichero);
@ -1183,7 +1191,8 @@ void fastload_block_tzx (FILE * fichero) {
}
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);