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); } }
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; }
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; }
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; }
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; } }
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(); }
void MipsEnv::ProceedPC (void) { SetPC (GetPC () + 4); }
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; } }
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; }