From af3af7743337c67a0a739e94d58cd4557cd179cc Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 31 Mar 2013 23:50:37 -0400 Subject: [PATCH] SANE comparisons and status register updates --- toolbox/sane.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++- toolbox/toolbox.cpp | 2 ++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/toolbox/sane.cpp b/toolbox/sane.cpp index da28589..36eb79c 100644 --- a/toolbox/sane.cpp +++ b/toolbox/sane.cpp @@ -207,7 +207,7 @@ namespace SANE return 0; } #endif - + uint16_t fx2dec() { // extended (80-bit fp) to decimal @@ -383,7 +383,58 @@ namespace SANE return 0; } + extern "C" void cpuSetFlagsShift(BOOLE z, BOOLE n, BOOLE c, BOOLE v); + template + uint16_t fcmp(const char *name) + { + uint16_t op; + uint32_t dest; + uint32_t src; + // TODO op & 0x0f == 0x08 vs 0x0a + // for signaling unordered & NaN + + StackFrame<10>(src, dest, op); + + Log(" %s(%08x, %08x, %04x)\n", name, src, dest, op); + + SrcType s = readnum(src); + DestType d = readnum(dest); + + if (ToolBox::Trace) + { + std::string tmp1 = std::to_string(d); + std::string tmp2 = std::to_string(s); + Log(" %s <> %s\n", tmp1.c_str(), tmp2.c_str()); + } + + // + // check if ordered... + + if (d > s) + { + cpuSetFlagsShift(false, false, false, false); + return 0; + } + if (d < s) + { + cpuSetFlagsShift(false, true, true, false); + return 0; + } + if (d == s) + { + cpuSetFlagsShift(true, false, false, false); + return 0; + } + + // unorderable? + // signal? + cpuSetFlagsShift(false, false, false, true); + return 0; + } + + + extern "C" void cpuSetFlagsAbs(UWO f); uint16_t fp68k(uint16_t trap) { uint16_t op; @@ -394,6 +445,8 @@ namespace SANE Log("%04x FP68K(%04x)\n", op); + cpuSetFlagsAbs(0x4); + if (op == 0x000b) return fx2dec(); switch(op) @@ -430,7 +483,20 @@ namespace SANE case 0x2006: return fdiv("FDIVI"); case 0x2806: return fdiv("FDIVL"); + // comparison + case 0x0008: return fcmp("FCMPX"); + case 0x0808: return fcmp("FCMPD"); + case 0x1008: return fcmp("FCMPS"); + //case 0x3008: return fcmp("FCMPC"); + case 0x2008: return fcmp("FCMPI"); + case 0x2808: return fcmp("FCMPL"); + case 0x000a: return fcmp("FCPXX"); + case 0x080a: return fcmp("FCPXD"); + case 0x100a: return fcmp("FCPXS"); + //case 0x300a: return fcmp("FCPXC"); + case 0x200a: return fcmp("FCPXI"); + case 0x280a: return fcmp("FCPXL"); // conversion @@ -470,6 +536,7 @@ namespace SANE return fconvert("FL2X"); break; + } diff --git a/toolbox/toolbox.cpp b/toolbox/toolbox.cpp index b1f8033..69713c2 100644 --- a/toolbox/toolbox.cpp +++ b/toolbox/toolbox.cpp @@ -291,6 +291,8 @@ namespace ToolBox { // sane case 0xa9Eb: d0 = SANE::fp68k(trap); + cpuSetDReg(0, d0); + return; // SANE sets the flags. break; case 0x0a9ee: