open/read

This commit is contained in:
Kelvin Sherlock 2013-02-24 23:22:31 -05:00
parent 8235193554
commit 6ae8b870a0
3 changed files with 196 additions and 0 deletions

View File

@ -249,6 +249,175 @@ namespace OS
return d0;
}
uint16_t Open(uint16_t trap)
{
uint32_t d0;
uint32_t parm = cpuGetAReg(0);
Log("%04x Open(%08x)\n", trap, 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())
{
memoryWriteWord(bdNamErr, parm + 16);
return bdNamErr;
}
Log(" Open(%s)\n", sname.c_str());
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 = paramErr;
memoryWriteWord(d0, parm + 16);
return d0;
break;
}
//todo -- FD table w/ flag for text/binary
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
{
d0 = 0;
memoryWriteWord(fd, parm + 24);
}
memoryWriteWord(d0, parm + 16);
return d0;
}
uint16_t Read(uint16_t trap)
{
uint32_t d0;
uint32_t parm = cpuGetAReg(0);
Log("%04x Read(%08x)\n", trap, parm);
//uint32_t ioCompletion = memoryReadLong(parm + 12);
uint16_t ioRefNum = memoryReadWord(parm + 24);
uint32_t ioBuffer = memoryReadLong(parm + 32);
int32_t ioReqCount = memoryReadLong(parm + 36);
uint16_t ioPosMode = memoryReadWord(parm + 44);
int32_t ioPosOffset = memoryReadLong(parm + 46);
if (ioReqCount < 0)
{
d0 = paramErr;
memoryWriteWord(d0, parm + 16);
return d0;
}
off_t currentPos = ::lseek(ioRefNum, 0, SEEK_CUR);
if (currentPos < 0)
{
if (errno != ESPIPE)
{
d0 = errno_to_oserr(errno);
memoryWriteWord(d0, parm + 16);
return d0;
}
currentPos = 0;
}
off_t pos = 0;
switch(ioPosMode)
{
case fsFromStart:
pos = ioPosOffset;
break;
case fsFromMark:
pos = currentPos + ioPosOffset;
break;
case fsFromLEOF:
{
struct stat st;
int rv;
rv = ::fstat(ioRefNum, &st);
if (rv < 0)
{
}
pos = st.st_size + ioPosOffset;
}
break;
case fsAtMark:
pos = currentPos;
break;
default:
d0 = paramErr;
memoryWriteWord(d0, parm + 16);
return d0;
break;
}
if (pos != currentPos)
{
int rv = ::lseek(ioRefNum, pos, SEEK_SET);
if (rv < 0)
{
d0 = paramErr;
memoryWriteWord(d0, parm + 16);
return d0;
}
}
ssize_t count = ::read(ioRefNum, memoryPointer(ioBuffer), ioReqCount);
if (count >= 0)
{
pos += count;
memoryWriteLong(count, parm + 40);
}
if (count == 0)
{
d0 = eofErr;
}
if (count < 0)
{
d0 = errno_to_oserr(errno);
}
memoryWriteLong(pos, parm + 46); // new offset.
memoryWriteWord(d0, parm + 16);
return d0;
}
uint16_t Delete(uint16_t trap)
{
uint32_t d0;

View File

@ -8,6 +8,21 @@
namespace OS
{
enum {
fsCurPerm = 0,
fsRdPerm = 1,
fsWrPerm = 2,
fsRdWrPerm = 3,
fsRdWrShPerm = 4,
};
enum {
fsAtMark = 0,
fsFromStart = 1,
fsFromLEOF = 2,
fsFromMark = 3,
};
enum {
paramErr = -50, /*error in user parameter list*/
noHardwareErr = -200, /*Sound Manager Error Returns*/
@ -120,6 +135,9 @@ namespace OS
uint16_t GetEOF(uint16_t trap);
uint16_t GetVol(uint16_t trap);
uint16_t Open(uint16_t trap);
uint16_t Read(uint16_t trap);
#pragma mark String Utilities
uint16_t CmpString(uint16_t trap);
@ -131,6 +149,7 @@ namespace OS
uint16_t TickCount(uint16_t trap);
uint16_t HighLevelHFSDispatch(uint16_t trap);
}
#endif

View File

@ -30,6 +30,14 @@ namespace ToolBox {
uint32_t d0 = 0;
switch (trap)
{
case 0xa000:
d0 = OS::Open(trap);
break;
case 0xa002:
d0 = OS::Read(trap);
break;
case 0xa008:
d0 = OS::Create(trap);
break;