--- nono/m88xx0/m88100subr.cpp 2026/04/29 17:04:49 1.1.1.6 +++ nono/m88xx0/m88100subr.cpp 2026/04/29 17:05:07 1.1.1.10 @@ -7,9 +7,9 @@ #include "m88100.h" // コンストラクタ -m88kcpu::m88kcpu(uint32 reset_vector_) +m88kcpu::m88kcpu(MPU88xx0Device *dev_) { - reset_vector = reset_vector_; + dev = dev_; cmmu[0].Ctor(this); cmmu[1].Ctor(this); @@ -22,9 +22,10 @@ m88kcpu::m88kcpu(uint32 reset_vector_) for (int i = 1; i < 32; i++) { r[i] = Undefined; } - for (int i = 1; i < 9; i++) { - fcr[i] = Undefined; + for (int i = 0; i < countof(fcr); i++) { + fcr[i] = Undefined & fcr_mask[i]; } + epsr = Undefined; ssbr = Undefined; sfip = Undefined; @@ -37,7 +38,6 @@ m88kcpu::m88kcpu(uint32 reset_vector_) dmd0 = Undefined; dmd1 = Undefined; dmd2 = Undefined; - } // デストラクタ @@ -45,29 +45,12 @@ m88kcpu::~m88kcpu() { } -// MPU クロックを設定 +// DOS call エミュレーションのコールバックを設定 void -m88kcpu::SetClockSpeed(uint32 clock_khz_) +m88kcpu::SetFLineCallback(bool (*callback)(m88kcpu *, void *), void *arg) { - clock_khz = clock_khz_; - - // サイクル数を nsec に変換する際の係数。25MHz なら c2v は 40 [nsec/clock] - c2v = 1000 * 1000 / clock_khz; - - // nsec をクロック数に変換する際の係数、つまり c2v の逆数。 - // (http://hp.vector.co.jp/authors/VA003988/how_to_o.htm#27_2) - int b = 32 - __builtin_clz(c2v) - 1; - int rr = 32 + b; - // 小数部を近接丸め(0捨1入)するため一桁余分に計算しておいて.. - uint64 f = (1ULL << (rr + 1)) / c2v; - // 最下位ビットを丸める - if ((f & 1) != 0) { - f += 1; - } - f >>= 1; - - v2c_factor = f; - v2c_shift = rr; + fline_callback = callback; + fline_arg = arg; } // PID の VERSION フィールドをセットする。初期化時に呼ぶ。 @@ -78,6 +61,21 @@ m88kcpu::SetVersion(uint32 version) pid |= version << 1; } +// fcr のマスク +/*static*/ const uint32 m88100reg::fcr_mask[11] = { + FPECR_MASK, + 0xffffffff, // fphs1 + 0xffffffff, // fpls1 + 0xffffffff, // fphs2 + 0xffffffff, // fpls2 + FPPT_MASK, + FPRH_MASK, + 0xffffffff, // fprl + FPIT_MASK, + FPSR_MASK, + FPCR_MASK, +}; + /*static*/ const char * const m88100reg::sipname[3] = { "sxip", "snip", "sfip", }; @@ -100,50 +98,3 @@ m88kcpu::SetVersion(uint32 version) "111-", // not used normally "LLLL", }; - -// 例外 -/*static*/ const char * const m88kcpu::exception_names[] = { - // 01234567890123456789012 <- 例外履歴欄の横幅 - /* 0 */ "Reset Exception", - /* 1 */ "Interrupt Exception", - /* 2 */ "Inst Access Exception", - /* 3 */ "Data Access Exception", - /* 4 */ "Misaligned Access Excep", - /* 5 */ "Unimplemented Opcode", - /* 6 */ "Priv. Violation Excep.", - /* 7 */ "Bounds Check Violation", - /* 8 */ "Illegal Integer Divide", - /* 9 */ "Int Overflow Exception", - /* 10 */ "Error Exception", - // 01234567890123456789012 -}; - -// 例外名を返す。 -// Reserved なところは NULL を返す。 -// XXX TODO 114 以降未実装 -/*static*/ const char * -m88kcpu::GetExceptionName(int vector) -{ - if (0 <= vector && vector < countof(exception_names)) { - return exception_names[vector]; - } - - // OpenBSD - // XXX 本来は OpenBSD 稼働時に限定すべきだろうけど、そうする意味もない - switch (vector) { - case 450: - return "OpenBSD system call"; - case 451: - return "OpenBSD cache flush"; - case 503: - return "Division by zero in GCC"; - case 504: - return "OpenBSD stepbpt"; - case 511: - return "OpenBSD userbpt"; - default: - break; - } - - return NULL; -}