fixed bug in reset, tape always stops on reset, custom data play the tape

This commit is contained in:
fabio.olimpieri 2013-02-09 22:56:48 +00:00
parent a654a30323
commit d7825a30e6
4 changed files with 39 additions and 12 deletions

View File

@ -110,10 +110,10 @@ void computer_init () { //Called only on start-up
ordenador.vk_rumble = 1; //enabled
ordenador.rumble[0] = 0;
ordenador.rumble[1] = 0;
ordenador.turbo = 0;
ordenador.turbo = 1; //auto turbo
ordenador.turbo_state = 0;
ordenador.precision = 0;
ordenador.precision_old = 0;
ordenador.precision = 1; //precision
ordenador.precision_old = 1;
ordenador.tape_readed = 0;
ordenador.pause = 1; // tape stop
@ -559,6 +559,8 @@ inline void show_screen (int tstados) {
ordenador.interr = 1;
if ((ordenador.turbo_state == 0) || (curr_frames%7 == 0)) ordenador.readkeyboard = 1;
curr_frames++;
if (ordenador.tape_start_countdwn==1) ordenador.pause=0; //Autoplay
if (ordenador.tape_start_countdwn>0) ordenador.tape_start_countdwn--;
}
return;
}
@ -704,8 +706,10 @@ inline void show_screen_precision (int tstados) {
ordenador.interr = 1;
ordenador.readkeyboard = 1;
curr_frames++;
if (ordenador.tape_start_countdwn==1) ordenador.pause=0; //Autoplay
if (ordenador.tape_start_countdwn>0) ordenador.tape_start_countdwn--;
}
if (ordenador.tstados_counter > 31) ordenador.interr = 0;
//if (ordenador.tstados_counter > 31) ordenador.interr = 0;
return;
}
@ -1663,16 +1667,34 @@ void ResetComputer () {
microdrive_reset();
ordenador.pause = 1;
if (ordenador.rewind_on_reset)
{
ordenador.pause = 1;
{
if (ordenador.tap_file != NULL) {
ordenador.tape_current_mode = TAP_TRASH;
rewind_tape (ordenador.tap_file,1);
}
}
switch(ordenador.turbo)
{
case 2: //fast
update_frequency(10000000);
break;
case 3: //ultra fast
update_frequency(14000000);
break;
}
ordenador.precision=ordenador.precision_old; //in case the machine is reset during loading
ordenador.tape_start_countdwn=0;
curr_frames=0;
ordenador.tstados_counter=0;
ordenador.cicles_counter=0;
ordenador.currline=0;
ordenador.currpix=0;
ordenador.interr = 0;
}
// check if there's contention and waits the right number of tstates

View File

@ -1579,7 +1579,7 @@ int main(int argc,char *argv[]) {
if(ordenador.interr==1) {
Z80free_INT(&procesador,bus_empty());
if (ordenador.precision==0) ordenador.interr=0;
if ((ordenador.precision==0)||(jump_frames>0)) ordenador.interr=0;
}
}

View File

@ -576,7 +576,7 @@ static int emulation_settings(void)
{
ordenador.precision = !submenus[5];
ordenador.precision_old=ordenador.precision;
if (ordenador.turbo_state!=4) //Tape is not loading with turbo mode
if (ordenador.turbo_state!=1) //Tape is not loading with turbo mode
if (ordenador.precision)
{
update_frequency(0);

View File

@ -54,14 +54,14 @@ inline void tape_read(FILE *fichero, int tstados) {
}
//Auto ultra fast mode
if ((ordenador.turbo_state != 4)&&(ordenador.turbo==1))
if ((ordenador.turbo_state != 1)&&(ordenador.turbo==1))
{
if (ordenador.tape_file_type==TAP_TAP) update_frequency(13000000);
else update_frequency(11000000);
jump_frames=7;
ordenador.precision_old=ordenador.precision;
ordenador.precision =0;
ordenador.turbo_state = 4;
ordenador.turbo_state = 1;
}
if(ordenador.tape_file_type == TAP_TAP)
@ -885,8 +885,6 @@ void fastload_block_tzx (FILE * fichero) {
unsigned int longitud, len, bucle, number_bytes, byte_position;
unsigned char value[65536], empty, blockid, parity;
int retval;
fpos_t *file_pos;
//ordenador.other_ret = 1; // next instruction must be RET
procesador.PC=0x5e2;
@ -1151,9 +1149,16 @@ void fastload_block_tzx (FILE * fichero) {
byte_position=ftell(fichero);
retval=fread (&blockid, 1, 1, fichero); //Read next id block
if (!feof(fichero))
{
if (blockid==0x10)
{
retval=fread (value, 1, 5, fichero); //read till flag byte
if (retval==5)
if ((value[4]!=0x0)&&(value[4]!=0xFF)) blockid=0x11; //custom data
}
if ((blockid==0x11)||(blockid==0x12)||(blockid==0x13)||(blockid==0x14)||(blockid==0x21)||(blockid==0x24)) ordenador.tape_start_countdwn=80; //autoplay countdown
fseek(fichero, byte_position, SEEK_SET);