int MastFrame() { //printf("frame PC=0x%x\n", Doze.pc); MvidPreFrame(); #ifdef EMU_DOZE nDozeInterrupt=Masta.Irq ? 0xff : -1; // Load IRQ latch #elif defined(EMU_Z80JB) Z80Vector=Masta.Irq; #elif defined(EMU_DRZ80) drz80.z80irqvector = Masta.Irq; #endif if (MastEx&MX_PAL) LineCyc=273; // PAL timings (but not really: not enough lines) else LineCyc=228; // NTSC timings TotalCyc=LineCyc*262; // For sound // Start counter and sound MsndDone=0; FrameCyc=0; CyclesLeft=0; CpuBase=0; // V-Int: MastY=192; RunLine(); Masta.v.Stat|=0x80; for (MastY=193;MastY<262;MastY++) { RunLine(); } if (MastInput[0]&0x40) // Cause nmi if pause pressed #ifdef EMU_DOZE DozeNmi(); #elif defined(EMU_Z80JB) Z80SetIrqLine(Z80_INPUT_LINE_NMI, 1); else
enum CScript::SCRIPTRETURN CScript::For(const char* CmdStr, char* retStr) { // 获取变量 int cmdLen = strlen(CmdStr); char* szBeginCmd = GetStringParam(CmdStr, 0); if(!szBeginCmd) return CScript::SR_ERROR; int szCmdLen = strlen(szBeginCmd); szBeginCmd[szCmdLen] = ';'; szBeginCmd[szCmdLen+1] = '\0'; char* szMaxCmd = GetStringParam(CmdStr, 1); if(!szMaxCmd) { M_FREE( szBeginCmd, sizeof(char)*MAX_VAR_LEN ); return CScript::SR_ERROR; } szCmdLen = strlen(szMaxCmd); szMaxCmd[szCmdLen] = ';'; szMaxCmd[szCmdLen+1] = '\0'; char* szCountCmd = GetStringParam(CmdStr, 2); if(!szCountCmd) { M_FREE( szBeginCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szMaxCmd, sizeof(char)*MAX_VAR_LEN ); return CScript::SR_ERROR; } szCmdLen = strlen(szCountCmd); szCountCmd[szCmdLen] = ';'; szCountCmd[szCmdLen+1] = '\0'; //读取For脚本内容 char* chr = NULL; chr = m_Data; long beginPos = 0; // 子脚本起始位置 long endPos = 0; // 子脚本结束位置 beginPos = m_Point; int forBlockNum = 0; // For函数的内部括号计数 ReadForCmd(beginPos, endPos); // 从当前脚本数据中重新生成循环子脚本数据 char* scriptBuf = (char*)M_ALLOC(sizeof(char)*m_DataLen); //memset(scriptBuf, 0, m_DataLen); memcpy(scriptBuf, &m_Data[beginPos], (endPos-beginPos+1)); scriptBuf[(endPos-beginPos+1)+1] = '\0'; CScript* forScript = BeginForScript(scriptBuf); if(NULL == forScript) { M_FREE( szBeginCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szMaxCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szCountCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( scriptBuf, sizeof(char)*m_DataLen ); return CScript::SR_ERROR; } CScript::SCRIPTRETURN retFlag = CScript::SR_END; // 将Count变量值改变 RunLine(szBeginCmd); RunLine(szMaxCmd); #ifdef _RUNSTACKINFO_ char pszStatckInfo[10240]=""; _snprintf(pszStatckInfo,10240,"For(beginStr:%s,endStr:%s) Start",szBeginCmd,szMaxCmd); CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo); #endif while(1 == m_Value[0]) { retFlag = CScript::SR_END; //重置当前指针 forScript->ResetDataPos(); //记录进入子脚本 EnterChildScript(CST_FOR,forScript,szCountCmd,szMaxCmd); retFlag = forScript->RunStep(); //只要该脚本不挂起,就记录离开子脚本 if(retFlag != CScript::SR_HANG) LeaveChildScript(forScript); //脚本挂起 if(retFlag == CScript::SR_HANG) { #ifdef _RUNSTACKINFO_ _snprintf(pszStatckInfo,10240,"For(beginStr:%s,endStr:%s) Hang",szBeginCmd,szMaxCmd); CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo); #endif SetIsHang(true); SetHangFunc(forScript->GetHangFunc()); M_FREE( scriptBuf, sizeof(char)*m_DataLen ); M_FREE( szBeginCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szMaxCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szCountCmd, sizeof(char)*MAX_VAR_LEN ); return retFlag; } else if(retFlag == CScript::SR_FORBREAK || retFlag == CScript::SR_RETURN || retFlag == CScript::SR_ERROR) { if(retFlag == CScript::SR_FORBREAK) retFlag = CScript::SR_END; break; } //在retFlag == CScript::SR_FORCONTINUE或者其他况下,继续执行 RunLine(szCountCmd); RunLine(szMaxCmd); } EndForScript(forScript); #ifdef _RUNSTACKINFO_ _snprintf(pszStatckInfo,10240,"For(beginStr:%s,endStr:%s) End",szBeginCmd,szMaxCmd); CMessage::AsyWriteFile(GetGame()->GetStatckFileName(),pszStatckInfo); #endif M_FREE( scriptBuf, sizeof(char)*m_DataLen ); M_FREE( szBeginCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szMaxCmd, sizeof(char)*MAX_VAR_LEN ); M_FREE( szCountCmd, sizeof(char)*MAX_VAR_LEN ); return retFlag; }