예제 #1
0
// Convert CAP to CBM TAP format.
__int32 CAP2CBMTAP(HANDLE hCAP, HANDLE hTAP)
{
	unsigned __int64 ui64Delta, ui64Delta2, ui64Len;
	unsigned __int32 Timer_Precision_MHz, uiFreq;
	unsigned __int8  TAPv; // TAP file format version.
	unsigned __int8  ch;   // Single TAP data byte.
	__int32          TAP_Counter = 0; // CAP & TAP file byte counters.
	__int32          FuncRes, ReadFuncRes; // Function call results.

	if (Initialize_TAP_header_and_return_frequencies(hCAP, hTAP, &Timer_Precision_MHz, &uiFreq) != 0)
		return -1;

	// Start conversion CAP->TAP.

	// Get target TAP version from header.
	FuncRes = TAP_CBM_GetHeader_TAPversion(hTAP, &TAPv);
	if (FuncRes != TAP_CBM_Status_OK)
	{
		TAP_CBM_OutputError(FuncRes);
		return -1;
	}

	// Skip first halfwave (time until first pulse starts).
	FuncRes = CAP_ReadSignal(hCAP, &ui64Delta, NULL);
	if (FuncRes == CAP_Status_OK_End_of_file)
	{
		printf("Error: Empty image file.");
		return -1;
	}
	else if (FuncRes == CAP_Status_Error_Reading_data)
	{
		CAP_OutputError(FuncRes);
		return -1;
	}

	// Convert while CAP file signal available.
	while ((ReadFuncRes = CAP_ReadSignal(hCAP, &ui64Delta, NULL)) == CAP_Status_OK)
	{
		if ((TAPv == TAPv0) || (TAPv == TAPv1))
		{
			// Get and add timestamp of falling edge.
			FuncRes = CAP_ReadSignal(hCAP, &ui64Delta2, NULL);
			if (FuncRes == CAP_Status_Error_Reading_data)
			{
				CAP_OutputError(FuncRes);
				return -1;
			}
			else if (FuncRes == CAP_Status_OK_End_of_file)
				break;

			ui64Delta += ui64Delta2;
		}

		ui64Len = (ui64Delta*uiFreq/Timer_Precision_MHz+500000)/1000000;

		if (ui64Len > 2040) // 8*0xff=2040
		{
			// We have a pause.
			if ((TAPv == TAPv0) || (TAPv == TAPv1))
			{
				if (HandlePause(hTAP, ui64Len, NeedEvenSplitNumber, TAPv, &TAP_Counter) == -1)
					return -1;
			}
			else
			{
				if (HandlePause(hTAP, ui64Len, NeedOddSplitNumber, TAPv, &TAP_Counter) == -1)
					return -1;
			}
		}
		else
		{
			// We have a data byte.
			ch = (unsigned __int8) ((ui64Len+4)/8);
			Check_TAP_CBM_Error_TextRetM1(TAP_CBM_WriteSignal_1Byte(hTAP, ch, &TAP_Counter));
		}
	} // Convert while CAP file signal available.

	if (ReadFuncRes == CAP_Status_Error_Reading_data)
	{
		CAP_OutputError(ReadFuncRes);
		return -1;
	}

	// Set signal byte count in header (sum of all signal bytes).
	FuncRes = TAP_CBM_SetHeader_ByteCount(hTAP, TAP_Counter);
	if (FuncRes != TAP_CBM_Status_OK)
	{
		TAP_CBM_OutputError(FuncRes);
		return -1;
	}

	// Seek to start of file & write image header.
	FuncRes = TAP_CBM_WriteHeader(hTAP);
	if (FuncRes != TAP_CBM_Status_OK)
	{
		TAP_CBM_OutputError(FuncRes);
		return -1;
	}

	return 0;
}
예제 #2
0
bool DisplayTimer::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_Start("START");
	static CParsedMsg::CToken s_cTok_On("ON");
	static CParsedMsg::CToken s_cTok_Add("ADD");
	static CParsedMsg::CToken s_cTok_End("END");
	static CParsedMsg::CToken s_cTok_Off("OFF");
	static CParsedMsg::CToken s_cTok_Kill("KILL");
	static CParsedMsg::CToken s_cTok_Pause("PAUSE");
	static CParsedMsg::CToken s_cTok_Resume("RESUME");
	static CParsedMsg::CToken s_cTok_Team("TEAM");

	if ((cMsg.GetArg(0) == s_cTok_Start) ||
		(cMsg.GetArg(0) == s_cTok_On))
	{
		if (cMsg.GetArgCount() > 1)
		{
            HandleStart((LTFLOAT)atof(cMsg.GetArg(1)));
		}
	}
	else if (cMsg.GetArg(0) == s_cTok_Add)
	{
		if (cMsg.GetArgCount() > 1)
		{
            HandleAdd((LTFLOAT)atof(cMsg.GetArg(1)));
		}
	}
	else if ((cMsg.GetArg(0) == s_cTok_End) ||
			 (cMsg.GetArg(0) == s_cTok_Off))
	{
		HandleEnd();
	}
	else if (cMsg.GetArg(0) == s_cTok_Kill)
	{
		HandleAbort();
	}
	else if (cMsg.GetArg(0) == s_cTok_Pause)
	{
		HandlePause();
	}
	else if (cMsg.GetArg(0) == s_cTok_Resume)
	{
		HandleResume();
	}
	else if (cMsg.GetArg(0) == s_cTok_Team)
	{
		if( cMsg.GetArgCount( ) > 1 )
		{
			uint32 nTeamId = atoi( cMsg.GetArg( 1 ));
			if( nTeamId < MAX_TEAMS )
			{
				m_nTeamId = nTeamId;
			}
			else
			{
				m_nTeamId = INVALID_TEAM;
			}

			UpdateClients( );
		}
	}
	else
		return GameBase::OnTrigger(hSender, cMsg);

	return true;
}