void Tape_Routine() { static FIL tapeFile; static dword headerSize = 0; static dword dataSize = 0; const int LOOPS_SIZE = 0x10; static CTapeLoop loops[LOOPS_SIZE]; static int loopsSize; if (!tapeStarted && tapeFile.fsize != 0 && tapeFile.fptr >= tapeFile.fsize) { tapeRestart = true; } if (tapeStarted && (tapeFile.fsize == 0 || tapeRestart)) { if (f_open(&tapeFile, tapePath, FA_READ) == FR_OK) { //__TRACE( "Tape openned...\n" ); f_lseek(&tapeFile, 0); tapeTzx = false; headerSize = 0; dataSize = 0; loopsSize = 0; if (tapeFile.fsize >= 10) { char buff[10]; UINT res; f_read(&tapeFile, buff, 10, &res); if (res == 10 && buff[0] == 'Z' && buff[1] == 'X' && buff[2] == 'T') tapeTzx = true; else f_lseek(&tapeFile, 0); } } else { __TRACE("Cannot open tape file %s...\n", tapePath); tapeStarted = false; } tapeRestart = false; } static byte header[0x20]; static dword headerPos; while (tapeStarted && tapeFifo.GetFree() > 0) { if (headerSize > 0) { tapeFifo.WriteByte(header[headerPos++]); headerSize--; continue; } if (dataSize > 0) { byte data; UINT res; f_read(&tapeFile, &data, 1, &res); if (res == 1) { tapeFifo.WriteByte(data); dataSize--; continue; } else { tapeStarted = false; break; } } if (tapeFile.fptr >= tapeFile.fsize) { tapeFinished = true; break; } UINT res; f_read(&tapeFile, header, 1, &res); if (res != 1) { tapeFinished = true; break; } byte hs = GetHeaderSize(header[0]); f_read(&tapeFile, header + 1, hs - 1, &res); if (res + 1 != hs) { tapeFinished = true; break; } CTapeBlock temp; temp.ParseHeader(header); if (temp.tape_pilot > 0 || temp.tape_sync > 0 || temp.tape_pause > 0 || (temp.data_size > 0 && temp.data_type != SKIP_DATA)) { headerPos = 0; headerSize = hs; dataSize = temp.data_size; } else if (header[0] == 0x24) { if (loopsSize < LOOPS_SIZE) { loops[loopsSize].fptr = tapeFile.fptr; loops[loopsSize].counter = ReadWord(header + 1); loopsSize++; } } else if (header[0] == 0x25) { if (loopsSize > 0) { if (loops[loopsSize - 1].counter > 0) loops[loopsSize - 1].counter--; if (loops[loopsSize - 1].counter > 0) f_lseek(&tapeFile, loops[loopsSize - 1].fptr); else loopsSize--; } } else { //__TRACE( "0x%.4x - 0x%.2x - skip\n", tapeFile.fptr - hs, header[0] ); f_lseek(&tapeFile, tapeFile.fptr + temp.data_size); } } while (tapeStarted && SystemBus_Read(0xc00015) == 0) { if (Tape_FillBuffer() == false) break; } }
void DecodeKey( word keyCode, word keyFlags ) { static bool resetState = false; bool flagKeyRelease = ( keyFlags & fKeyRelease ) != 0; bool reset1 = ( keyFlags & ( fKeyCtrlLeft | fKeyCtrlRight ) ) == ( fKeyCtrlLeft | fKeyCtrlRight ); static bool reset2 = false; if( keyCode == KEY_POWER && !flagKeyRelease ) reset2 = true; if( keyCode == KEY_POWER && flagKeyRelease ) reset2 = false; static bool reset3 = false; if( keyCode == KEY_PRNTSCR && !flagKeyRelease ) reset3 = true; if( keyCode == KEY_PRNTSCR && flagKeyRelease ) reset3 = false; if( ( reset1 || reset2 || reset3 ) != resetState ) { resetState = reset1 || reset2 || reset3; CPU_Reset( resetState ); DelayMs( 100 ); } //------------------------------------------------------ if( !flagKeyRelease ) { if( ( keyFlags & fKeyCtrl ) != 0 ) { switch( keyCode ) { case KEY_1 : specConfig.specVideoMode = 0; Spectrum_UpdateConfig(); SaveConfig(); break; case KEY_2 : specConfig.specVideoMode = 1; Spectrum_UpdateConfig(); SaveConfig(); break; case KEY_3 : specConfig.specVideoMode = 2; Spectrum_UpdateConfig(); SaveConfig(); break; case KEY_4 : specConfig.specVideoMode = 3; Spectrum_UpdateConfig(); SaveConfig(); break; case KEY_5 : specConfig.specVideoMode = 4; Spectrum_UpdateConfig(); SaveConfig(); break; case KEY_F12 : CPU_NMI(); break; } } else if ( fKeyAlt & keyFlags ) { int kc; switch ( keyCode ) { case KEY_0: kc = 0; break; case KEY_1: kc = 1; break; case KEY_2: kc = 2; break; case KEY_3: kc = 3; break; case KEY_4: kc = 4; break; case KEY_5: kc = 5; break; case KEY_6: kc = 6; break; case KEY_7: kc = 7; break; case KEY_8: kc = 8; break; case KEY_9: kc = 9; break; default: kc = -1; break; } if ( kc >= 0 ) { char snaName[ 0x10 ]; sniprintf( snaName, sizeof(snaName), "!slot_%.1d.sna", kc ); SaveSnapshot( snaName ); } } else { switch( keyCode ) { case KEY_ESC : Debugger_Enter(); break; case KEY_PAUSE : Shell_Pause(); break; case KEY_F1 : specConfig.specTurbo = 0; Spectrum_UpdateConfig(); //SaveConfig(); break; case KEY_F2 : specConfig.specTurbo = 1; Spectrum_UpdateConfig(); //SaveConfig(); break; case KEY_F3 : specConfig.specTurbo = 2; Spectrum_UpdateConfig(); //SaveConfig(); break; case KEY_F4 : specConfig.specTurbo = 3; Spectrum_UpdateConfig(); //SaveConfig(); break; case KEY_F5 : SystemBus_Write( 0xc00000, 0x00004 ); break; case KEY_F6 : { CPU_Stop(); byte specPort7ffd = SystemBus_Read( 0xc00017 ); byte page = ( specPort7ffd & ( 1 << 3 ) ) != 0 ? 7 : 5; dword addr = 0x800000 | ( page << 13 ); SystemBus_Write( 0xc00020, 0 ); // use bank 0 for( int i = 0x1800; i < 0x1b00; i += 2 ) { SystemBus_Write( addr + ( i >> 1 ), 0x3838 ); } CPU_Start(); } break; case KEY_F9 : Shell_SettingsMenu(); break; case KEY_F10 : Shell_DisksMenu(); break; case KEY_F11 : if( ( keyFlags & fKeyShift ) != 0 ) Shell_SaveSnapshot(); else SaveSnapshot( UpdateSnaName() ); break; case KEY_F12 : Shell_Browser(); break; case KEY_EQUALS : case KEY_KP_PLUS : if( !Tape_Started() ) Tape_Restart(); break; case KEY_MINUS : case KEY_KP_MINUS : if( !Tape_Started() ) Tape_Start(); else Tape_Stop(); break; case KEY_INSERT : specConfig.specMouseSwap = !specConfig.specMouseSwap; break; } } } }