From 71a81ffacb569c6db68e98de76f2063436ddaca3 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sat, 18 May 2013 22:11:42 -0400 Subject: [PATCH] Open - use FDEntry::open --- toolbox/os.cpp | 103 ++++++++++++++++---------------------------- toolbox/os.h | 1 + toolbox/toolbox.cpp | 5 ++- 3 files changed, 41 insertions(+), 68 deletions(-) diff --git a/toolbox/os.cpp b/toolbox/os.cpp index 7b594b1..b3acf3f 100644 --- a/toolbox/os.cpp +++ b/toolbox/os.cpp @@ -292,94 +292,63 @@ namespace OS } - // todo -- call FDEntry::open instead of this... uint16_t Open(uint16_t trap) { uint32_t d0; + int fd; + uint32_t parm = cpuGetAReg(0); - bool rf = trap == 0xa00a; - const char *modifier = ""; - switch(trap) - { - case 0xa00a: - modifier = "RF"; - break; - } + Log("%04x Open(%08x)\n", trap, parm); - Log("%04x Open%s(%08x)\n", trap, modifier, parm); - - //uint32_t ioCompletion = memoryReadLong(parm + 12); uint32_t namePtr = memoryReadLong(parm + 18); - //uint16_t ioVRefNum = memoryReadWord(parm + 22); - //uint8_t ioFVersNum = memoryReadByte(parm + 26); - uint8_t ioPermission = memoryReadByte(parm + 27); - //uint32_t ioMisc = memoryReadLong(parm + 28); std::string sname = ToolBox::ReadPString(namePtr, true); - if (!sname.length()) + fd = Internal::FDEntry::open(sname, ioPermission, false); + d0 = fd < 0 ? fd : 0; + if (fd >= 0) { - memoryWriteWord(MacOS::bdNamErr, parm + 16); - return MacOS::bdNamErr; - } - - - int access = 0; - switch(ioPermission) - { - case fsWrPerm: - case fsRdWrPerm: - case fsRdWrShPerm: - case fsCurPerm: - access = O_RDWR; - break; - case fsRdPerm: - access = O_RDONLY; - break; - default: - d0 = MacOS::paramErr; - memoryWriteWord(d0, parm + 16); - return d0; - break; - } - - //todo -- FD table w/ flag for text/binary - - std::string xname = sname; - if (rf) - sname.append(_PATH_RSRCFORKSPEC); - - - Log(" open(%s, %04x)\n", xname.c_str(), access); - int fd = ::open(sname.c_str(), access); - if (fd < 0 && ioPermission == fsCurPerm && errno == EACCES) - { - fd = ::open(sname.c_str(), O_RDONLY); - } - - if (fd < 0) - { - d0 = errno_to_oserr(errno); - } - else - { - auto &e = OS::Internal::FDEntry::allocate(fd, std::move(xname)); - e.resource = rf; - e.text = rf ? false : IsTextFile(sname); - - d0 = 0; - memoryWriteWord(fd, parm + 24); + memoryWriteWord(fd, parm + 24); } memoryWriteWord(d0, parm + 16); return d0; } + uint16_t OpenRF(uint16_t trap) + { + uint32_t d0; + + int fd; + + uint32_t parm = cpuGetAReg(0); + + + Log("%04x OpenRF(%08x)\n", trap, parm); + + uint32_t namePtr = memoryReadLong(parm + 18); + + uint8_t ioPermission = memoryReadByte(parm + 27); + + std::string sname = ToolBox::ReadPString(namePtr, true); + + fd = Internal::FDEntry::open(sname, ioPermission, true); + d0 = fd < 0 ? fd : 0; + if (fd >= 0) + { + memoryWriteWord(fd, parm + 24); + } + + memoryWriteWord(d0, parm + 16); + return d0; + } + + uint16_t Read(uint16_t trap) { uint32_t d0; diff --git a/toolbox/os.h b/toolbox/os.h index 243e29f..c73be83 100644 --- a/toolbox/os.h +++ b/toolbox/os.h @@ -53,6 +53,7 @@ namespace OS uint16_t HGetVol(uint16_t trap); uint16_t Open(uint16_t trap); + uint16_t OpenRF(uint16_t trap); uint16_t HOpen(uint16_t trap); uint16_t Read(uint16_t trap); uint16_t Write(uint16_t trap); diff --git a/toolbox/toolbox.cpp b/toolbox/toolbox.cpp index 21c0f67..08bc833 100644 --- a/toolbox/toolbox.cpp +++ b/toolbox/toolbox.cpp @@ -31,10 +31,13 @@ namespace ToolBox { switch (trap) { case 0xa000: // open - case 0xa00a: // openrf d0 = OS::Open(trap); break; + case 0xa00a: // openrf + d0 = OS::OpenRF(trap); + break; + case 0xa200: d0 = OS::HOpen(trap); break;