--- nono/vm/romemu_news.cpp 2026/04/29 17:05:17 1.1.1.1 +++ nono/vm/romemu_news.cpp 2026/04/29 17:05:24 1.1.1.2 @@ -9,6 +9,7 @@ // #include "romemu_news.h" +#include "mainbus.h" #include "mainram.h" #include "memorystream.h" #include "mpu680x0.h" @@ -51,6 +52,11 @@ NewsROMEmuDevice::Init() } ms.SetOffset(32 * 4); ms.Write32(0xf8000500); // Trap#0 で ROM のサービスコール + // Trap#15 は ROM モニタらしい。今の所停止するだけ。 + // とりあえず Trap#1..#14 も全部ここへ向けておく。 + for (int i = 1; i < 16; i++) { + ms.Write32(0xf8000600); + } // リセット時に実行する命令 ms.SetOffset(0x400); @@ -72,6 +78,12 @@ NewsROMEmuDevice::Init() ms.Write16(0x60fa); // bra @b ; 無限ループ。 ms.Write16(0x4e73); // rte + // ROM モニタの TRAP#n。はないのでここに来たらとりあえず停止する? + ms.SetOffset(0x600); + //@@: + ms.Write32(0x4e722700); // stop #0x2700 ; STOP しつつ + ms.Write16(0x60fa); // bra @b ; 無限ループ。 + return true; } @@ -84,7 +96,7 @@ NewsROMEmuDevice::ResetHard(bool poweron } } -uint64 +busdata NewsROMEmuDevice::Read32(uint32 addr) { switch (addr) { @@ -104,24 +116,19 @@ NewsROMEmuDevice::Read32(uint32 addr) uint32 NewsROMEmuDevice::ROM_Init() { - LoadInfo info; + // -X file で指定されたホストファイルを読み込んでエントリポイント + // アドレスをこの Read アクセスの読み出し値として返す。 - // -X file - if (gMainApp.exec_file) { - // ホストのファイルを読み込んでエントリポイントアドレスを - // この Read アクセスの読み出し値として返す。 - // エラーがあればエラーメッセージは呼び出し先側で表示してある。 - info.path = gMainApp.exec_file; - if (mainram->LoadFromFile(&info) == false) { - // XXX どうすべ - PANIC("** Couldn't load specified host program.\n"); - return -1; - } - putmsg(1, "Host program loaded. Entry point = $%08x\n", info.entry); + LoadInfo info(gMainApp.exec_file); + if (mainram->LoadExec(&info) == false) { + // XXX どうすべ + PANIC("** Couldn't load specified host program"); + return -1; } + putmsg(1, "Host program loaded. Entry point = $%08x", info.entry); // ROMCONS のために VBR を設定 - m68kreg& reg = GetMPU680x0Device()->reg; + m68kreg& reg = GetMPU680x0Device(mpu)->reg; reg.vbr = 0xf8000000; // %d2 には MARK_END (たぶん最後の番地) @@ -148,22 +155,24 @@ NewsROMEmuDevice::ROM_Init() uint32 NewsROMEmuDevice::ROM_Sys() { - auto mpu680x0 = GetMPU680x0Device(); + auto mainbus = GetMainbusDevice(); + auto mpu680x0 = GetMPU680x0Device(mpu); m68kreg& reg = mpu680x0->reg; auto newsfb = GetNewsfbDevice(); if (reg.D[0] == SYS_write) { uint32 a6 = reg.A[6]; - uint32 fd = mpu680x0->Read32(a6 + 8); - uint32 buf = mpu680x0->Read32(a6 + 12); - uint32 len = mpu680x0->Read32(a6 + 16); + uint32 fd = mainbus->HVRead32(a6 + 8); + uint32 buf = mainbus->HVRead32(a6 + 12); + uint32 len = mainbus->HVRead32(a6 + 16); for (int i = 0; i < len; i++) { - uint64 ch = mpu680x0->Read8(buf++); - if ((int64)ch < 0) { + busdata bd = mainbus->HVRead8(buf++); + if (bd.IsBusErr()) { // XXX ? return 0; } + uint8 ch = bd.Data(); if (ch == '\r') { continue; }