From f2dc2496147716692c0b8e668ebad6c4e9b787fe Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Thu, 19 Feb 2015 15:32:13 -0500 Subject: [PATCH] SANE - add FTINTX, FCSTR2DEC --- toolbox/sane.cpp | 49 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/toolbox/sane.cpp b/toolbox/sane.cpp index 128305d..8b110f9 100644 --- a/toolbox/sane.cpp +++ b/toolbox/sane.cpp @@ -885,6 +885,29 @@ using std::to_string; return 0; } + uint16_t ftintx() + { + // truncate (round towards 0 regardless of rounding settings) + + uint32_t address; + uint16_t op; + + StackFrame<6>(address, op); + + Log(" FTINTX(%08x)\n", address); + + extended s = readnum(address); + + if (ToolBox::Trace) + { + std::string tmp1 = to_string(s); + Log(" %s\n", tmp1.c_str()); + } + s = std::trunc(s); + writenum(s, address); + return 0; + } + extern "C" void cpuSetFlagsAbs(UWO f); uint16_t fp68k(uint16_t trap) { @@ -977,7 +1000,7 @@ using std::to_string; return fdecimal("FDEC2X"); break; - + case 0x0016: return ftintx(); case 0x0017: return fprocentry(); case 0x0019: return fprocexit(); case 0x0003: return fgetenv(); @@ -1065,7 +1088,7 @@ using std::to_string; return tmp; } - uint32_t fpstr2dec() + uint32_t fstr2dec(char type) { // void str2dec(const char *s,short *ix,decimal *d,short *vp); @@ -1098,13 +1121,16 @@ struct decimal { index = memoryReadWord(indexPtr); - std::string str = ToolBox::ReadPString(stringPtr, false); - Log(" FPSTR2DEC(%s, %04x, %08x, %08x)\n", - str.c_str(), index, decimalPtr, validPtr); + std::string str; + if (type == 'P') str = ToolBox::ReadPString(stringPtr, false); + if (type == 'C') str = ToolBox::ReadCString(stringPtr, false); - index--; + Log(" F%cSTR2DEC(%s, %04x, %08x, %08x)\n", + type, str.c_str(), index, decimalPtr, validPtr); + + if (type == 'P') index--; str2dec(str, index, d, valid); - index++; + if (type == 'P') index++; memoryWriteWord(index, indexPtr); memoryWriteWord(valid, validPtr); @@ -1149,9 +1175,16 @@ struct decimal { case 0x02: // fpstr2dec - return fpstr2dec(); + return fstr2dec('P'); break; + + case 0x04: + // fcstr2dec + return fstr2dec('C'); + break; + + default: fprintf(stderr, "decstr68k -- op %04x is not yet supported\n", op); exit(1);