--- nono/vm/human68k.cpp 2026/04/29 17:05:33 1.1.1.14 +++ nono/vm/human68k.cpp 2026/04/29 17:05:38 1.1.1.15 @@ -65,10 +65,6 @@ Human68kDevice::Init() uint32 last_addr; int ram_size; - if (inherited::Init() == false) { - return false; - } - assert(gMainApp.exec_file); human68k_file = gMainApp.exec_file; human68k_arg = gMainApp.exec_arg; @@ -165,6 +161,24 @@ Human68kDevice::Init() // STOP による停止。終了時に CPU を止めておくため。 ds.Write4(0x1010, 0x4e722700); // stop #$2700 + // MFP Timer-C ベクタを書き込む。 + ds.Write4(0x0114, 0x1020); + // Timer-C で 10ミリ秒ごとに $9cc.w のワークを減算していく。 + // 0 になったら $9d6.l の稼働時間(分) をインクリメントして、 + // $9cc.w には $9ca.w の初期値 (6000 = 60秒 * 100) を再セット。 + ds.SetOffset(0x1020); + ds.Write2(0x5378); // subq.w #1,($9cc) + ds.Write2(0x9cc); + ds.Write2(0x660a); // bne @f + ds.Write2(0x31f8); // move.w ($9ca),($9cc) + ds.Write2(0x09ca); + ds.Write2(0x09cc); + ds.Write2(0x52b8); // addq.l #1,($9d6) + ds.Write2(0x09d6); + ds.Write2(0x4e73); //@@: rte + ds.Write2(0x9ca, 6000); // $9ca: 初期値 + ds.Write2(0x9cc, 6000); // いきなり初期化しておく。 + // コマンドライン文字列を書き込む。LASCII 形式 ds.SetOffset(0xc001); for (int i = 0; i < 255; i++) { @@ -206,8 +220,8 @@ Human68kDevice::Init() ds.Write2(0x287c); // move.l exec_addr,a4 ds.Write4(exec_addr); ds.Write2(0x2c49); // move.l a1,a6 - ds.Write2(0x46fc); // move.w #$0700,sr - ds.Write2(0x0700); + ds.Write2(0x46fc); // move.w #$0500,sr + ds.Write2(0x0500); ds.Write2(0x4eb9); // jsr.l exec_addr ds.Write4(exec_addr); ds.Write2(0xff00); // DOS _EXIT @@ -770,6 +784,21 @@ Human68kDevice::IOCS() RegD(1) = t / 86400_sec; break; } + case 0x80: // _B_INTVCS + { + uint32 num = RegD(1); + uint32 newaddr = RegA(1); + uint32 oldaddr; + if (num < 0x100) { + oldaddr = mainbus->HVRead4(num * 4); + mainbus->HVWrite4(num * 4, newaddr); + RegD(0) = oldaddr; + } else { + printf("IOCS _B_INTVCS(#%04x) (NOT IMPLEMENTED)", num); + RequestExit(1); + } + break; + } case 0x82: // _B_BPEEK { uint32 data = mainbus->HVRead1(RegA(1));