--- nono/hd64180/hd64180core.cpp 2026/04/29 17:05:34 1.1.1.3 +++ nono/hd64180/hd64180core.cpp 2026/04/29 17:06:01 1.1.1.7 @@ -10,6 +10,7 @@ #include "mpu64180.h" #include "debugger.h" +#include "event.h" #include "hd64180.h" #include "hd647180.h" #include "scheduler.h" @@ -19,7 +20,7 @@ #include "hd64180ops.cpp" void -MPU64180Device::ExecNormal(Event& ev) +MPU64180Device::ExecNormal(Event *ev) { uint64 cycle_start = used_cycle; @@ -59,7 +60,7 @@ MPU64180Device::ExecNormal(Event& ev) } int cycle = used_cycle - cycle_start; - ev.time = cycle * clock_nsec; + ev->time = cycle * clock_tsec; scheduler->StartEvent(ev); } @@ -110,15 +111,15 @@ MPU64180Device::Jump(uint16 addr) // 命令本体(オペランドを含まない)を16ビット左詰めにする。 // 分岐命令は1バイト命令か ED XX か DD/FD XX の2バイト命令しかないはず。 - //上位ワードは $0000。 - uint32 inst; + // 上位ワードは $0000。 + uint32 info; if (ops[0] == 0xed || ops[0] == 0xdd || ops[0] == 0xfd) { - inst = (ops[0] << 8) | ops[1]; + info = (ops[0] << 8) | ops[1]; } else { - inst = (ops[0] << 8); + info = (ops[0] << 8); } - brhist.AddEntry(GetPPC(), addr, inst); + brhist.AddEntry(GetPPC(), addr, info); } // @@ -192,6 +193,20 @@ MPU64180Device::NegateINT0() NegateIntmap(HD647180::IntmapINT0); } +// ASCIn 割り込みをアサート/ネゲートする。 +// IEF1 はこちらで加味する。 +void +MPU64180Device::ChangeASCIInt(uint n, bool asci_req) +{ + uint32 map = HD647180::IntmapASCI(n); + + if ((asci_req && GetIEF1())) { + AssertIntmap(map); + } else { + NegateIntmap(map); + } +} + // マスカブル割り込みを処理する。(命令境界で呼ばれる) void MPU64180Device::DoInterrupt() @@ -238,12 +253,11 @@ void MPU64180Device::ExceptionDirect(int source, uint32 new_addr) { // 例外発生とジャンプを記録。 + last_vector = source; brhist.AddEntry(GetPPC(), new_addr, 0x80000000 | source); exhist.AddEntry(GetPPC(), new_addr, 0x80000000 | source); reg.pc = new_addr; - - debugger->NotifyExceptionXP(source); } // 例外ごとに固有のベクタにジャンプする。 @@ -282,6 +296,7 @@ MPU64180Device::ExceptionVector(int sour uint32 vec_addr = (reg_i << 8) | intvec_low | vector_offset[source]; // 例外発生を記録。 + last_vector = source; brhist.AddEntry(GetPPC(), -1, 0x80000000 | source); exhist.AddEntry(GetPPC(), -1, 0x80000000 | source); @@ -292,8 +307,6 @@ MPU64180Device::ExceptionVector(int sour brhist.AddEntry(vec_addr, new_addr, -1); reg.pc = new_addr; - - debugger->NotifyExceptionXP(source); }