示例#1
0
文件: CPU.cpp 项目: wangsitan/Mesen
void CPU::IRQ() 
{
	uint16_t originalPc = PC();
	DummyRead();  //fetch opcode (and discard it - $00 (BRK) is forced into the opcode register instead)
	DummyRead();  //read next instruction byte (actually the same as above, since PC increment is suppressed. Also discarded.)
	Push((uint16_t)(PC()));

	if(_state.NMIFlag) {
		Push((uint8_t)PS());
		SetFlags(PSFlags::Interrupt);

		SetPC(MemoryReadWord(CPU::NMIVector));
		_state.NMIFlag = false;

		TraceLogger::LogStatic("NMI");
		Debugger::ProcessInterrupt(originalPc, _state.PC, true);
	} else {
		Push((uint8_t)PS());
		SetFlags(PSFlags::Interrupt);
		SetPC(MemoryReadWord(CPU::IRQVector));

		TraceLogger::LogStatic("IRQ");
		Debugger::ProcessInterrupt(originalPc, _state.PC, false);
	}
}
示例#2
0
void
MachThread::ThreadWillResume(const DNBThreadResumeAction *thread_action, bool others_stopped)
{
    if (thread_action->addr != INVALID_NUB_ADDRESS)
        SetPC (thread_action->addr);

    SetState (thread_action->state);
    switch (thread_action->state)
    {
    case eStateStopped:
    case eStateSuspended:
        assert (others_stopped == false);
        Suspend();
        break;

    case eStateRunning:
    case eStateStepping:
        Resume(others_stopped);
        break;
    default: 
        break;
    }
    m_arch_ap->ThreadWillResume();
    m_stop_exception.Clear();
}
bool
RegisterContextPOSIXProcessMonitor_arm64::UpdateAfterBreakpoint()
{
    // PC points one byte past the int3 responsible for the breakpoint.
    lldb::addr_t pc;

    if ((pc = GetPC()) == LLDB_INVALID_ADDRESS)
        return false;

    SetPC(pc - 1);
    return true;
}
示例#4
0
文件: CPU.cpp 项目: wangsitan/Mesen
void CPU::BRK() {
	Push((uint16_t)(PC() + 1));

	uint8_t flags = PS() | PSFlags::Break;
	if(_state.NMIFlag) {
		Push((uint8_t)flags);
		SetFlags(PSFlags::Interrupt);

		SetPC(MemoryReadWord(CPU::NMIVector));

		TraceLogger::LogStatic("NMI");
	} else {
		Push((uint8_t)flags);
		SetFlags(PSFlags::Interrupt);

		SetPC(MemoryReadWord(CPU::IRQVector));

		TraceLogger::LogStatic("IRQ");
	}

	//Since we just set the flag to prevent interrupts, do not run one right away after this (fixes nmi_and_brk & nmi_and_irq tests)
	_prevRunIrq = false;
}
示例#5
0
void InitCPU(void) /* 68K state when powered on */
{ 
	ssp=*sp=RL(&theROM[0]);
	SetPC(RL(&theROM[1]));
	if(V3)printf("initial PC=%x SP=%x\n",(void*)pc-(void*)theROM,ssp);
	
	iMask=7;
	supervisor=true;
	trace=doTrace=false;
	exception=0;
	extraFlag=false;
	pendingInterrupt=0;
	stopped=false;
	badCodeAddress=false;
}
示例#6
0
static void ProcessInterrupts(void)
{       /* gestione interrupts */
	if(pendingInterrupt==7 || pendingInterrupt>iMask)
	  {       
	    if(!supervisor)
	{ 
	  usp=(*sp);
	  (*sp)=ssp;
	}
	    ExceptionIn(24+pendingInterrupt);
	    WriteLong((*sp)-4,(w32)pc-(long)theROM);
	    (*sp)-=6;
	    WriteWord(*sp,GetSR());
	    SetPC(theROM[24+pendingInterrupt]);
	    iMask=pendingInterrupt;
	    pendingInterrupt=0;
	    supervisor=true;
	    trace=false;
	    stopped=false;
	  }
}
示例#7
0
void
MachThread::ThreadWillResume(const DNBThreadResumeAction *thread_action)
{
    if (thread_action->addr != INVALID_NUB_ADDRESS)
        SetPC (thread_action->addr);

    SetState (thread_action->state);
    switch (thread_action->state)
    {
    case eStateStopped:
    case eStateSuspended:
        Suspend();
        break;

    case eStateRunning:
    case eStateStepping:
        Resume();
        break;
    }
    m_arch.ThreadWillResume();
    m_stop_exception.Clear();
}
示例#8
0
void MipsEnv::ProceedPC (void)
{
    SetPC (GetPC () + 4);
}
示例#9
0
void ExceptionProcessing()
{
	if(exception!=0)
	      {
	  if(exception==8) pc--;
	  if(exception<32 || exception>36) /* tutte le eccezioni
					      tranne le trap 0-4 */
	    {       
	      extraFlag=exception<3 || (exception>9 &&
					exception<32) || exception>47;
	      if(!extraFlag) extraFlag=ReadLong(0x28050l)==0;
	      if(extraFlag)
	                      {  
			  UpdateNowRegisters();
			  /*                              ShowException(); */
			  nInst=nInst2=0;
	                      }
	    }
	  if(!supervisor)
	    { 
	      usp=(*sp);
	      (*sp)=ssp;
	    }
	  ExceptionIn(exception);
	  (*sp)-=6;
	  WriteLong((*sp)+2,(w32)pc-(w32)theROM);
	  WriteWord((*sp),GetSR());
	  SetPC(theROM[exception]);
	  if(exception==3) /* address error */
	    {
	      (*sp)-=8;
	      WriteWord((*sp)+6,code);
	      WriteLong((*sp)+2,badAddress);
	      WriteWord((*sp),BusErrorCode(badCodeAddress? 2:1));
	      badCodeAddress=false;
	    }
	  supervisor=true;
	  trace=false;
	      }
	if(doTrace && exception!=3 && exception!=4 && exception!=8)
	  { 
	    if(!supervisor)
	{
	  usp=(*sp);
	  (*sp)=ssp;
	}
	    ExceptionIn(9);
	    (*sp)-=6;
	    WriteLong((*sp)+2,(w32)pc-(long)theROM);
	    WriteWord((*sp),GetSR());
	    SetPC(theROM[9]);
	    supervisor=true;
	    trace=false;
	    stopped=false;
	  }
	if(pendingInterrupt!=0) ProcessInterrupts();
	exception=0;
	extraFlag=doTrace=trace;
	if(extraFlag)
	  {
	    nInst2=nInst;
	    nInst=2;
	  }
}
示例#10
0
int RS232Check(serial_driver_t *rs)
{
	int i, j;
	U32 ch,sum;
	TMyBuf *packet;
	PRSHeader pch;
	
	if(rs->poll()==0) return 0;
	i=0;sum=0;
	packet=bget(0);
	pch=(PRSHeader)(packet->buf);
	rsc++;
	while(1)
	{
		j=200;
		while(rs->poll()==0) 
		{
			DelayUS(2000);
			if(++j>=220) 
			{
				if(i>8)	//FIFO溢出,要求重发
				{
					PCmdHeader chdr=(PCmdHeader)(packet->buf+sizeof(TRSHeader));
					PCommSession session=GetSession(chdr->SessionID);
					if(session)
					{
						chdr->Command=CMD_ACK_RETRY;
						chdr->CheckSum=0;
						chdr->CheckSum=in_chksum((BYTE*)chdr,sizeof(TCmdHeader));
						session->Send((char *)chdr,sizeof(TCmdHeader),session->Sender);
						PS1[PSIndex]=i;
						PS2[PSIndex++]=rsc;
						PSIndex &= 0xFF;
						j=0;	//等待重发
						i=0;
						sum=0;
						continue;
					}
				}
//				ExBeep(5);
				return -1;
			}
		}
		ch=rs->read();
		packet->buf[i]=ch;
		if(i<=1)
		{
#ifdef MAIN_PRG
			if(rs==&st232 && (ch!=(U32)THEDID)) break;
#endif
		}
		else if(i==3)
		{
			if(pch->Cmd+pch->CmdCheck!=0xFF) break;
			if(pch->Cmd!=CMD_RS) break;
		}
		else if(i==sizeof(TRSHeader)-1)
		{
			if(pch->Len>BUFSZ-sizeof(TRSHeader)) break;
		}
		else if(i==(int)(pch->Len+sizeof(TRSHeader)-1))
		{
			sum=pch->CheckSum;
			pch->CheckSum=0;
			if(sum==in_chksum(packet->buf, pch->Len+sizeof(TRSHeader)))
			{
				PCommSession session;
				int cmd=RunCommand(packet->buf+sizeof(TRSHeader), pch->Len);
				if(cmd==0) return -2;
				if(cmd==CMD_CONNECT)
				{
					char Sender[SENDER_LEN];
					PCmdHeader chdr=(PCmdHeader)(packet->buf+sizeof(TRSHeader));
					memset(Sender, 0, SENDER_LEN);
					memcpy(Sender, (void*)&rs, sizeof(rs));
					session=CreateSession(Sender);
					chdr->SessionID=session->SessionID;
					chdr->CheckSum=0;
					chdr->CheckSum=in_chksum((void*)chdr,sizeof(TCmdHeader));
					session->Send=SendRSData;
					session->Speed=THEBR;
					SendRSData((void*)chdr, sizeof(TCmdHeader), Sender);
				}
				else if(CMD_RESTART==cmd)
					SetPC(0);		
//				while(rs->poll()) ch=rs->read();
			}
			return pch->Cmd;
		}
		i++;
	}
	while(rs->poll()) ch=rs->read();
//	ExBeep(5);DelayUS(100000);ExBeep(5);
	return -1;	
}