// 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; }
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; }