CC = CC | CC_II | CC_IF; // 0x50
PCD = RM16(0xfffc);
// printf("NMI occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
- int_state &= ~(MC6809_SYNC_IN | MC6809_CWAI_IN | MC6809_CWAI_OUT | MC6809_NMI_BIT); // $FE1E
+ int_state &= ~(MC6809_CWAI_IN | MC6809_CWAI_OUT | MC6809_NMI_BIT); // $FE1E
}
CC = CC | CC_II | CC_IF;
PCD = RM16(0xfff6);
// printf("Firq occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
- int_state &= ~(MC6809_SYNC_IN | MC6809_CWAI_IN | MC6809_CWAI_OUT); // $FE1F
+ int_state &= ~(MC6809_CWAI_IN | MC6809_CWAI_OUT); // $FE1F
}
// Refine from cpu_x86.asm of V3.52a.
CC |= CC_II;
PCD = RM16(0xfff8);
// printf("IRQ occured PC=0x%04x VECTOR=%04x SP=%04x \n",rpc.w.l,pPC.w.l,S);
- int_state &= ~(MC6809_SYNC_IN | MC6809_CWAI_IN | MC6809_CWAI_OUT); // $FE1F
+ int_state &= ~(MC6809_CWAI_IN | MC6809_CWAI_OUT); // $FE1F
}
int MC6809::run(int clock)
if ((int_state & (MC6809_NMI_BIT | MC6809_FIRQ_BIT | MC6809_IRQ_BIT)) != 0) { // 0x0007
if ((int_state & MC6809_NMI_BIT) == 0)
goto check_firq;
- //if ((int_state & MC6809_LDS) == 0) {
+ //if ((int_state & MC6809_LDS) == 0)
// goto check_firq;
- //}
- int_state &= ~MC6809_LDS;
if ((int_state & MC6809_SYNC_IN) != 0) {
//if ((int_state & MC6809_NMI_LC) != 0)
// goto check_firq;
* INTERRUPT
*/
int_cycle:
- icount -= cycle;
+ if((int_state & MC6809_CWAI_IN) == 0) {
+ icount -= cycle;
+ }
return icount;
// run cpu
check_ok:
+ if((int_state & MC6809_CWAI_IN) == 0) {
if(clock == -1) {
// run only one opcode
icount = 0;
}
return first_icount - icount;
}
+ } else {
+ icount = 0;
+ return icount;
+ }
+
}
void MC6809::run_one_opecode()
OP_HANDLER(leas) {
fetch_effective_address();
S = EA;
+ int_state |= MC6809_LDS;
}
/* $33 LEAU indexed ----- */
/* $3C CWAI inherent ----1 */
OP_HANDLER(cwai) {
uint8 t;
- if ((int_state & MC6809_CWAI_IN) != 0) { // FIX 20130417
- /* CWAI実行中 */
- PC -= 1; // 次回もCWAI命令実行
- return;
- }
+ // if ((int_state & MC6809_CWAI_IN) != 0) { // FIX 20130417
+ // /* CWAI実行中 */
+ // PC -= 1; // 次回もCWAI命令実行
+ // return;
+ //}
/* 今回初めてCWAI実行 */
first:
IMMBYTE(t);
int_state = int_state | MC6809_CWAI_IN;
int_state &= ~MC6809_CWAI_OUT; // 0xfeff
- PC -= 2; // レジスタ退避して再度実行
+ //PC -= 2; // レジスタ退避して再度実行
return;
}