mpw/toolbox/toolbox.cpp

170 lines
2.9 KiB
C++
Raw Normal View History

2013-02-08 00:21:47 +00:00
#include <cstdio>
#include <cstdint>
#include <stdlib.h>
2013-02-14 03:16:40 +00:00
#include <string>
2013-02-08 00:21:47 +00:00
#include <cpu/defs.h>
#include <cpu/CpuModule.h>
#include <cpu/fmem.h>
#include "toolbox.h"
#include "rm.h"
2013-02-08 03:49:04 +00:00
#include "mm.h"
2013-02-12 22:32:31 +00:00
#include "os.h"
2013-02-15 04:08:38 +00:00
#include "qd.h"
2013-02-14 03:16:40 +00:00
#include "mpw_time.h"
2013-02-08 00:21:47 +00:00
2013-02-13 03:35:15 +00:00
2013-02-08 00:21:47 +00:00
// yuck. TST.W d0
extern "C" void cpuSetFlagsNZ00NewW(UWO res);
namespace ToolBox {
2013-02-13 03:35:15 +00:00
2013-02-08 00:21:47 +00:00
void dispatch(uint16_t trap)
{
// todo -- check/remove extra bits for save a0, toolglue, etc.
uint32_t d0 = 0;
switch (trap)
{
2013-02-14 03:16:40 +00:00
case 0xa008:
d0 = OS::Create(trap);
break;
2013-02-14 03:38:34 +00:00
case 0xa009:
d0 = OS::Delete(trap);
break;
2013-02-14 04:07:33 +00:00
2013-02-12 22:32:31 +00:00
case 0xA00C:
d0 = OS::GetFileInfo(trap);
break;
2013-02-13 03:35:15 +00:00
case 0xa00d:
d0 = OS::SetFileInfo(trap);
break;
2013-02-08 00:21:47 +00:00
2013-02-14 03:16:40 +00:00
case 0xa014:
d0 = OS::GetVol(trap);
break;
2013-02-08 04:44:58 +00:00
// BlockMove (sourcePtr,destPtr: Ptr; byteCount: Size);
case 0xa02e:
d0 = MM::BlockMove(trap);
break;
2013-02-14 03:16:40 +00:00
// ReadDateTime (VAR sees: LONGINT) : OSErr;
case 0xa039:
d0 = Time::ReadDateTime(trap);
break;
// SecondsToDate (s: LongInt; VAR d: DateTimeRec);
case 0xa9c6:
d0 = Time::SecondsToDate(trap);
break;
2013-02-11 01:19:35 +00:00
2013-02-08 03:12:30 +00:00
// NewPtr [Sys, Clear] (logicalSize: Size): Ptr;
case 0xa11e:
case 0xa31e:
case 0xa51e:
case 0xa71e:
// clear = bit 9, sys = bit 10
2013-02-08 03:49:04 +00:00
d0 = MM::NewPtr(trap);
2013-02-08 03:12:30 +00:00
break;
2013-02-11 01:19:35 +00:00
// DisposPtr (p: Ptr);
case 0xa01f:
d0 = MM::DisposePtr(trap);
break;
2013-02-08 03:12:30 +00:00
2013-02-14 04:07:33 +00:00
// resource manager stuff.
2013-02-08 00:21:47 +00:00
// Get1NamedResource (theType: ResType; name: Str255) : Handle;
case 0xa820:
2013-02-08 03:12:30 +00:00
d0 = RM::Get1NamedResource(trap);
2013-02-08 00:21:47 +00:00
break;
2013-02-14 04:07:33 +00:00
// GetResource (theType: ResType; thelD: INTEGER) : Handle;
case 0xa9a0:
d0 = RM::GetResource(trap);
break;
2013-02-15 04:08:38 +00:00
// quickdraw (AsmIIgs ... )
2013-02-14 04:07:33 +00:00
// _ShowCursor();
case 0xA853:
2013-02-15 04:08:38 +00:00
d0 = QD::ShowCursor(trap);
break;
// GetCursor (cursorlD: INTEGER) : CursHandle;
case 0xA9B9:
d0 = QD::GetCursor(trap);
break;
//SetCursor (crsr: Cursor)
case 0xA851:
d0 = QD::SetCursor(trap);
break;
// GetFNum (fontName: Str255; VAR theNum: INTEGER);
case 0xa900:
d0 = QD::GetFNum(trap);
2013-02-14 04:07:33 +00:00
break;
2013-02-08 00:21:47 +00:00
default:
fprintf(stderr, "Unsupported tool trap: %04x\n", trap);
fprintf(stderr, "pc: %08x\n", cpuGetPC());
exit(255);
}
cpuSetDReg(0, d0);
cpuSetFlagsNZ00NewW(d0);
}
2013-02-13 03:35:15 +00:00
std::string ReadCString(uint32_t address)
{
std::string tmp;
if (address)
{
tmp.assign((char *)memoryPointer(address));
}
return tmp;
}
std::string ReadPString(uint32_t address)
{
std::string tmp;
if (address)
{
unsigned length = memoryReadByte(address);
tmp.assign((char *)memoryPointer(address + 1), length);
}
return tmp;
}
2013-02-14 03:16:05 +00:00
bool WritePString(uint32_t address, const std::string &s)
{
int length = s.length();
if (length > 255) return false;
if (address == 0) return false;
uint8_t *ptr = memoryPointer(address);
*ptr++ = (uint8_t)length;
for (char c : s)
{
*ptr++ = (uint8_t)c;
}
return true;
}
2013-02-13 03:35:15 +00:00
2013-02-08 00:21:47 +00:00
}