Пример #1
0
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;
	}
}
Пример #2
0
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;
            }
        }
    }
}