--- nono/m680x0/m680x0fpu.cpp 2026/04/29 17:05:40 1.1.1.3 +++ nono/m680x0/m680x0fpu.cpp 2026/04/29 17:05:57 1.1.1.4 @@ -41,6 +41,79 @@ // o: ハードウェアサポート // x: ソフトウェアサポート +// 68040 の BUSY フレーム: +// MC68040UM.pdf (p.9-40)、fpsp/fpsp.h より。 +// +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---------------+---------------+---------------+---------------+ +//$00 | VERSION=$41 | $60 | | +// +---------------+---------------+---------------+---------------+ +//$04 | | +// +---------------+---------------+---------------+---------------+ +//$08(LV-92)| CU_SAVEPC : |(FPR_DIRTY_BITS) | +// +---------------+---------------+---------------+---------------+ +//$0c(LV-88)| | +//$10(LV-84)| | +//$14(LV-80)| | +// +---------------+---------------+---------------+---------------+ +//$18(LV-76)| |<- WBTS WBTE[14:0] | (WBTEMP_SGN) | | +// +---------------+---------------+---------------+---------------+ +// (WBTEMP_SGN) のバイトは fpsp がワークとして使っているようだ。 +// +---------------+---------------+---------------+---------------+ +//$1c(LV-72)| WBTM[63-32] (資料によって [65-34][33-02] 表記もあるが | +//$20(LV-68)| WBTM[31-00] ここでは仮数部のビット位置で数える) | +// +---------------+---------------+---------------+---------------+ +//$24(LV-64)| (FPSR_SHADOW) | +// +---------------+---------------+---------------+---------------+ +//$28(LV-60)| FPIARCU | +// +---------------+---------------+---------------+---------------+ +//$2c(LV-56)| | +// +---------------+---------------+---------------+---------------+ +//$30(LV-52)| (CMDREG2B.W?/.L?) | +// +---------+-----+---------------+---------------+---------------+ +//$34(LV-48)| | CMDREG3B | | +// +---------+-----+---------------+---------------+---------------+ +//$38(LV-44)| (NMNEXC) | (NMCEXC) | | +// | N N|N N N C C C C C| | +// | U N|O V D U S O V D| | +// +---------------+---------------+---------------+---------------+ +// NMN Unsupported --+ | | | | | | | | +-- NMC Underflow +// NMN SNAN ----+ | | | | | | +---- NMC Overflow +// NMN OPErr ------+ | | | | +------ NMC OPErr +// NMN Overflow --------+ | | +-------- NMC SNAN +// NMN Underflow ----------+ +---------- NMC Unsupported +// +---------------+---------------+---------------+---------------+ +//$3c(LV-40)|STAG |E| |V|G|R|S| | | +// +---------------+---------------+---------------+---------------+ +// (ETEMP15) --+ | | | +-- SBIT (WBTEMP Sticky) +// | | +---- WBTM0 (WBTEMP Round) +// | +------ WBTM1 (WBTEMP Guard) +// +-------- WBTM66 (WBTEMP Overflow) +// +---------------+---------------+---------------+---------------+ +//$40(LV-36)| CMDREG1B | | +// +-------+-------+-------+-------+---------------+---------------+ +//$44(LV-32)|DTAG |F|. . . .:. . .|W|. . . .| | +// +-------+-------+-------+-------+---------------+---------------+ +// +-- (FPTEMP15) +-- (WBTEMP15) +// +---------------+---------------+---------------+---------------+ +//$48(LV-28)|. . . . .|E|E|S|X|.|U|T|. . . .| | +// | |1|3|F|F| |F|F| | | +// +---------------+---------------+---------------+---------------+ +// (SFLAG) --+ | | +-- TFLAG +// (XFLAG) ----+ +---- (UFLAG) +// +---------------+---------------+---------------+---------------+ +//$4c(LV-24)| |<-FPTS FPTE | | +// +---------------+---------------+---------------+---------------+ +//$50(LV-20)| FPTM[63-32] | +//$54(LV-16)| FPTM[31-00] | +// +---------------+---------------+---------------+---------------+ +//$58(LV-12)| |<-ETS ETE | | +// +---------------+---------------+---------------+---------------+ +//$5c(LV-8) | ETM[63-32] | +//$60(LV-4) | ETM[31-00] | +// +---------------+---------------+---------------+---------------+ +//$64(LV-0) + #include "mpu680x0.h" #include "m680x0disasm.h" #include "m680x0cycle.h" @@ -2014,6 +2087,7 @@ MPU680x0Device::fpu_op_frestore() uint32 ea; uint32 fmtword; uint32 ver_len; + uint32 ver; uint32 len; bool postinc; @@ -2085,15 +2159,17 @@ MPU680x0Device::fpu_op_frestore() ea += 4; ver_len = fmtword >> 16; + ver = ver_len >> 8; len = ver_len & 0xff; if (GetFPUType().Is4060FPU()) { - if (ver_len == 0) { + if (ver == 0) { // NULL フレーム。 // NULL フレームのリストアは FPU の状態をリセットする。 CYCLE3(frestore_null); ResetFPU(false); + goto done; } else if (ver_len == 0x4100) { // IDLE フレーム。 @@ -2119,12 +2195,14 @@ MPU680x0Device::fpu_op_frestore() goto done; } } else /* 68881 */ { - if (ver_len == 0) { + if (ver == 0) { // NULL フレーム。 + // 長さフィールドは見ない。(MC68881UM.pdf 6.4.2.1) // NULL フレームのリストアは FPU の状態をリセットする。 CYCLE3(frestore_null); ResetFPU(false); + goto done; } else if (ver_len == 0x1f18) { // IDLE フレーム。 @@ -2286,7 +2364,7 @@ MPU68040Device::GetFPUTagName(int32 tag) // モニター更新 (040 内部情報) void -MPU68040Device::MonitorUpdateFPU40(TextScreen& screen, int y, const FPU40& tmp) +MPU68040Device::MonitorScreenFPU40(TextScreen& screen, int y, const FPU40& tmp) { // CMDREG1B:$xxxx OPCLASS=0 Rs=7 Rd=7 cmd=00(FTWOTOX) Flags: E3 E1 T // ETEMP :$01234567_01234567_01234567 STAG:1(Unnormal)