Esempio n. 1
0
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
Esempio n. 2
0
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;
}