diff --git a/toolbox/toolbox.cpp b/toolbox/toolbox.cpp index 08bc833..e23d3ed 100644 --- a/toolbox/toolbox.cpp +++ b/toolbox/toolbox.cpp @@ -352,6 +352,10 @@ namespace ToolBox { d0 = Utility::GetString(trap); break; + case 0xa85d: + d0 = Utility::BitTst(trap); + break; + default: fprintf(stderr, "Unsupported tool trap: %04x\n", trap); fprintf(stderr, "pc: %08x\n", cpuGetPC()); diff --git a/toolbox/utility.cpp b/toolbox/utility.cpp index 0277808..dd32278 100644 --- a/toolbox/utility.cpp +++ b/toolbox/utility.cpp @@ -78,5 +78,34 @@ namespace Utility { return d0; } + // FUNCTION BitTst (bytePtr: Ptr; bitNum: LONGINT) : BOOLEAN; + uint16_t BitTst(uint16_t trap) + { + /* + * BitTst tests whether a given bit is set and returns TRUE if so or + * FALSE if not. The bit is specified by bitNum, an offset from the + * high-order bit of the byte pointed to by bytePtr. + */ + + uint32_t bytePtr; + uint32_t bitNum; + uint16_t rv; + uint32_t sp; + + sp = StackFrame<8>(bytePtr, bitNum); + Log("%04x BitTst($%08x, $%08x)\n", trap, bytePtr, bitNum); + + + uint32_t offset = bitNum >> 3; + int mask = 0x80 >> (bitNum & 0x07); + + uint32_t value = memoryReadByte(bytePtr + offset); + + rv = value & mask ? 1 : 0; + ToolReturn<2>(sp, rv); + + return 0; + } + } diff --git a/toolbox/utility.h b/toolbox/utility.h index 926d7f4..6635c91 100644 --- a/toolbox/utility.h +++ b/toolbox/utility.h @@ -8,6 +8,8 @@ namespace Utility uint16_t NewString(uint16_t trap); uint16_t GetString(uint16_t trap); + + uint16_t BitTst(uint16_t trap); } #endif