--- nono/vm/windrv.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/windrv.cpp 2026/04/29 17:05:29 1.1.1.2 @@ -22,6 +22,7 @@ #include "windrv.h" #include "config.h" #include "hostwindrv.h" +#include "mainbus.h" #include "mpu680x0.h" #include #include @@ -99,7 +100,10 @@ WindrvDevice::Init() // パスが空ならここには来ないはず。 assert(item.AsString().empty() == false); std::string path = gMainApp.NormalizePath(item.AsString()); - host->InitRootPath(path); + if (host->InitRootPath(path) == false) { + item.Err("Invalid root path"); + return false; + } } return true; @@ -122,12 +126,12 @@ WindrvDevice::ResetHard(bool poweron) } busdata -WindrvDevice::Read8(uint32 addr) +WindrvDevice::ReadPort(uint32 offset) { busdata data; - switch (addr) { - case 0xe9f000: // 識別ポート + switch (offset) { + case 0x1000: // 識別ポート data = GetIdent(); putlog(2, "Ident -> $%02x", data.Data()); break; @@ -135,33 +139,47 @@ WindrvDevice::Read8(uint32 addr) data.SetBusErr(); break; } + + data |= BusData::Size1; return data; } busdata -WindrvDevice::Write8(uint32 addr, uint32 data) +WindrvDevice::WritePort(uint32 offset, uint32 data) { - switch (addr) { - case 0xe9f000: // 動作ポート + busdata r; + + switch (offset) { + case 0x1000: // 動作ポート // 実行 Execute(); - return 0; + break; default: // 他はバスエラー - return busdata::BusErr; + r.SetBusErr(); + break; } + + r |= BusData::Size1; + return r; } busdata -WindrvDevice::Peek8(uint32 addr) +WindrvDevice::PeekPort(uint32 offset) { - switch (addr) { - case 0xe9f000: // 識別ポート + switch (offset) { + case 0x1000: // 識別ポート return GetIdent(); default: // 他はバスエラー - return busdata::BusErr; + return BusData::BusErr; } } +bool +WindrvDevice::PokePort(uint32 offset, uint32 data) +{ + return false; +} + // モード識別ポートの読み出し uint32 WindrvDevice::GetIdent() const @@ -287,7 +305,7 @@ WindrvDevice::CmdInitialize() return result; } - int drives = 0; + uint drives = 0; for (auto& host : hosts) { if ((bool)host) { uint32 result = host->Initialize(); @@ -301,7 +319,7 @@ WindrvDevice::CmdInitialize() if (loglevel == 1) { putlogn("%s => %c:", cmdname.c_str(), 'A' + base); } else { - putlog(2, "%s Base=%c: Drives=%d", cmdname.c_str(), 'A' + base, drives); + putlog(2, "%s Base=%c: Drives=%u", cmdname.c_str(), 'A' + base, drives); } WriteMem8(a5 + 13, drives); @@ -789,7 +807,7 @@ WindrvDevice::CmdCreate(HostWindrv *host FCB fcb(this, fcbaddr, host); if (__predict_false(loglevel >= 1)) { - cmdname += string_format(" Create $%06x %s '%s' (%s) mode=%d", + cmdname += string_format(" Create $%06x %s '%s' (%s) mode=%u", fcbaddr, ns.PrintDrivePath().c_str(), ns.GetName().c_str(), Human68k::AttrStr(attr).c_str(), mode); putlog(2, "%s", cmdname.c_str()); @@ -1096,7 +1114,7 @@ WindrvDevice::CmdSeek(HostWindrv *host) uint32 fcbaddr = ReadMemAddr(a5 + 22); if (__predict_false(loglevel >= 1)) { - cmdname += string_format(" Seek $%06x ($%x, %d)", + cmdname += string_format(" Seek $%06x ($%x, %u)", fcbaddr, offset, mode); putlog(2, "%s", cmdname.c_str()); } @@ -1244,7 +1262,7 @@ WindrvDevice::CmdCtrlDrive(HostWindrv *h switch (ctrl) { case 0: // 状態検査1 if (__predict_false(loglevel >= 1)) { - cmdname += string_format(" CtrlDrive(%d)", ctrl); + cmdname += string_format(" CtrlDrive(%u)", ctrl); putlog(2, "%s", cmdname.c_str()); } res = 0x02; // メディア挿入 @@ -1252,7 +1270,7 @@ WindrvDevice::CmdCtrlDrive(HostWindrv *h default: if (__predict_false(loglevel >= 1)) { - cmdname += string_format(" CtrlDrive(%d) (NOT IMPLEMENTED)", ctrl); + cmdname += string_format(" CtrlDrive(%u) (NOT IMPLEMENTED)", ctrl); putlog(2, "%s", cmdname.c_str()); } return -Human68k::ERR_INVALID_COMMAND_IA; @@ -1312,11 +1330,11 @@ WindrvDevice::CmdGetDPB(HostWindrv *host dpb.media = 0xf3; putmsg(2, "sector_size=$%x, cluster_size=$%x", dpb.sector_size, dpb.cluster_size); - putmsg(2, "shift=%d, fat_sector=$%x fat_size=$%x", + putmsg(2, "shift=%u, fat_sector=$%x fat_size=$%x", dpb.shift, dpb.fat_sector, dpb.fat_size); putmsg(2, "file_max=$%x cluster_max=$%x", dpb.file_max, dpb.cluster_max); - putmsg(2, "root_sector=%d data_sector=%d", + putmsg(2, "root_sector=%u data_sector=%u", dpb.root_sector, dpb.data_sector); // DPB を書き戻す。 @@ -1487,42 +1505,42 @@ WindrvDevice::ResultStr(uint32 result) uint32 WindrvDevice::ReadMem8(uint32 addr) const { - return mainbus->HVRead8(addr); + return mainbus->HVRead1(addr); } // VM メモリに1バイト書き出す。 void WindrvDevice::WriteMem8(uint32 addr, uint32 data) { - mainbus->HVWrite8(addr, data & 0xff); + mainbus->HVWrite1(addr, data & 0xff); } // VM メモリから1ワード読み込む。 uint32 WindrvDevice::ReadMem16(uint32 addr) const { - return mainbus->HVRead16(addr); + return mainbus->HVRead2(addr); } // VM メモリに1ワード書き出す。 void WindrvDevice::WriteMem16(uint32 addr, uint32 data) { - mainbus->HVWrite16(addr, data); + mainbus->HVWrite2(addr, data); } // VM メモリから1ロングワード読み込む。 uint32 WindrvDevice::ReadMem32(uint32 addr) const { - return mainbus->HVRead32(addr); + return mainbus->HVRead4(addr); } // VM メモリに1ロングワード書き出す。 void WindrvDevice::WriteMem32(uint32 addr, uint32 data) { - mainbus->HVWrite32(addr, data); + mainbus->HVWrite4(addr, data); } // VM メモリからアドレスを読み込む。(下位24bitのみにする) @@ -1548,7 +1566,7 @@ WindrvDevice::ReadMem(void *dst, uint32 { uint8 *d = (uint8 *)dst; for (int i = 0; i < len; i++) { - *d++ = mainbus->HVRead8(srcaddr++); + *d++ = mainbus->HVRead1(srcaddr++); } } @@ -1559,7 +1577,7 @@ WindrvDevice::WriteMem(uint32 dstaddr, c { const uint8 *s = (const uint8 *)src; for (int i = 0; i < len; i++) { - mainbus->HVWrite8(dstaddr++, *s++); + mainbus->HVWrite1(dstaddr++, *s++); } }