📄 pci.cpp
字号:
memXfer.uOffset = pcbx.uSP - uStack[0]; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; uSid = ((uText[1]==SEM_OPEN) ? IpcOpen(cp) : IpcAlloc(cp, uTemp)); DELETE_ARRAY cp; } DELETE_ARRAY pu; pcbx.uSP -= (uStack[0]); uStack[0] = uSid; } memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); //?????? break; case SEM_OPEN: if (nFuncBase) if (pu = new UINT16[uStack[0]]) { UINT16 uSid; memXfer.pData = pu; memXfer.uLen = uStack[0]; memXfer.uOffset = pcbx.uSP - uStack[0]; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; uSid = ((uText[1]==SEM_OPEN) ? IpcOpen(cp) : IpcAlloc(cp, uTemp)); DELETE_ARRAY cp; } DELETE_ARRAY pu; pcbx.uSP -= (uStack[0]); uStack[0] = uSid; } memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); break; case SEM_CLOSE: IpcClose(uCurProc, uStack[0]); break; case SEM_SIGNAL: IpcSignal(uCurProc, uStack[0]); break; case SEM_WAIT: uTemp = (UINT16)IpcWait(uCurProc, uStack[0]); if (uTemp == 0) --pcbx.uIP; else { uStack[0] = uTemp; memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); } break; case SHR_CLOSE: uStack[0] = SmClose(uCurProc, uStack[0]); memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); break; case SHR_CREATE: uTemp = uStack[0]; pcbx.uSP--; memXfer.uLen = 1; memXfer.pData = uStack; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (pu = new UINT16[uStack[0]]) { UINT16 uId; memXfer.pData = pu; memXfer.uLen = uStack[0]; memXfer.uOffset = pcbx.uSP - uStack[0]; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; uId = ((uText[1]==SHR_OPEN) ? SmOpen(cp) : SmCreate(cp, (INT16)uTemp)); DELETE_ARRAY cp; } DELETE_ARRAY pu; pcbx.uSP -= (uStack[0]); uStack[0] = uId; } memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); //???? break; case SHR_OPEN: if (pu = new UINT16[uStack[0]]) { UINT16 uId; memXfer.pData = pu; memXfer.uLen = uStack[0]; memXfer.uOffset = pcbx.uSP - uStack[0]; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; uId = ((uText[1]==SHR_OPEN) ? SmOpen(cp) : SmCreate(cp, (INT16)uTemp)); DELETE_ARRAY cp; } DELETE_ARRAY pu; pcbx.uSP -= (uStack[0]); uStack[0] = uId; } memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); break; case SHR_SIZE: uStack[0] = SmLength(uStack[0]); memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); break; case SHR_READ: pcbx.uSP--; memXfer.uLen = 1; memXfer.pData = &uStack[1]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (SmRead(uStack[1], uStack[0], (INT16*)&uStack[2])) { memXfer.uLen = 1; memXfer.pData = &uStack[2]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); } else { pcbx.uStatus = PS_Illegal; if (pcbx.pDev) { char str[64]; sprintf(str, pszErr[0], pszErr[3]); msg = message(pcbx.uPid, KM_WriteBlk, strlen(str), str); pTx->SendMsg(ID_LNDRV + pcbx.uPid, &msg); } } break; case SHR_WRITE: pcbx.uSP -= 2; memXfer.uLen = 3; memXfer.pData = uStack; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (SmWrite(uStack[0], uStack[1], (INT16*)&uStack[2])) { memXfer.uLen = 1; memXfer.pData = &uStack[2]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); } else { pcbx.uStatus = PS_Illegal; if (pcbx.pDev) { char str[64]; sprintf(str, pszErr[0], pszErr[3]); msg = message(pcbx.uPid, KM_WriteBlk, strlen(str), str); pTx->SendMsg(ID_LNDRV + pcbx.uPid, &msg); } } break; case F_ALLOC: if (NULL == pcbx.pFile) { pcbx.pFile = new FsIface(uCurProc, pTx); if (NULL == pcbx.pFile) { pcbx.uStatus = PS_Illegal; return; } } if (pu = new UINT16[uStack[0]]) { HANDLE hFile; memXfer.pData = pu; memXfer.uLen = uStack[0]; memXfer.uOffset = pcbx.uSP - uStack[0]; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; if (FS_Ok != pcbx.pFile->Allocate(hFile, cp)) pcbx.uStatus = PS_Illegal; DELETE_ARRAY cp; } DELETE_ARRAY pu; pcbx.uSP -= (uStack[0]); uStack[0] = (UINT16)hFile; } memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); break; case F_DEL: case F_OPEN: case F_CREAT: case F_CLOSE: if (NULL == pcbx.pFile) pcbx.uStatus = PS_Illegal; else { INT16 nRes; switch (uText[1]) { case F_DEL: nRes = pcbx.pFile->Delete(uStack[0], uFsRet); break; case F_OPEN: nRes = pcbx.pFile->Open(uStack[0], uFsRet); break; case F_CREAT: nRes = pcbx.pFile->Creat(uStack[0], uFsRet); break; case F_CLOSE: nRes = pcbx.pFile->Close(uStack[0], uFsRet); break; } switch (nRes) { case FS_Busy: pcbx.uIP--; pcbx.uStatus &= ~PS_Ready; pcbx.uStatus |= PS_Blocked; break; case FS_NotFound: if (F_DEL == uText[1]) break; case FS_DiskFull: pcbx.uStatus = PS_Illegal; break; case FS_Ok: break; } } break; case F_READ: if (NULL == pcbx.pFile) pcbx.uStatus = PS_Illegal; else { char ch; INT16 nRes = pcbx.pFile->Read(uStack[0], ch, uFsRet); if (FS_Busy == nRes) { pcbx.uIP--; pcbx.uStatus &= ~PS_Ready; pcbx.uStatus |= PS_Blocked; } else { uStack[0] = (UINT16)ch; memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); } } break; case F_WRITE: if (NULL == pcbx.pFile) pcbx.uStatus = PS_Illegal; else { INT16 nRes, nFrame = 2; memXfer.uLen = 2; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP - 1; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); switch (nFuncBase) { case 0: nRes = pcbx.pFile->Write(uStack[1], (char)uStack[0], uFsRet); break; case 1: if (cp = new char[8]) { sprintf(cp, "%d", uStack[0]); nRes = pcbx.pFile->Write(uStack[1], cp, uFsRet); DELETE_ARRAY cp; } break; case 2: if (cp = new char[8]) { sprintf(cp, "%04X", uStack[0]); nRes = pcbx.pFile->Write(uStack[1], cp, uFsRet); DELETE_ARRAY cp; } break; case 3: nFrame += uStack[0]; if (pu = new UINT16[uStack[0]]) { memXfer.pData = pu; memXfer.uLen = uStack[0]; memXfer.uOffset = pcbx.uSP - nFrame + 1; msg = message(uCurProc, KM_ReadBlk, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); if (cp = new char[uStack[0]+1]) { for (INT16 i = 0; i < (INT16)uStack[0]; i++) cp[i] = (char)pu[i]; *(cp+uStack[0]) = '\0'; nRes = pcbx.pFile->Write(uStack[1], cp, uFsRet); DELETE_ARRAY cp; } DELETE_ARRAY pu; } break; default: pcbx.uStatus = PS_Illegal; } switch (nRes) { case FS_Ok : pcbx.uSP -= nFrame; break; case FS_Busy: pcbx.uIP--; pcbx.uStatus &= ~PS_Ready; pcbx.uStatus |= PS_Blocked; break; default: pcbx.uStatus = PS_Illegal; } } break; case F_EOF: if (NULL == pcbx.pFile) pcbx.uStatus = PS_Illegal; else { uStack[0] = (FS_EOF == pcbx.pFile->IsEof(uStack[0])) ? 0xffff : 0; memXfer.uLen = 1; memXfer.pData = &uStack[0]; memXfer.uOffset = pcbx.uSP; msg = message(uCurProc, KM_Write, mcbx.hStack, &memXfer); pTx->SendMsg(ID_MMU, &msg); } break; } }}//////////////////////// Decode the passed opcode and argument into the passed string//void Exec::DeCode (UINT32 lCode, char *pstr){ INT16 wOper, wArg, k1, k2, k3; static char *stMn[] = { "LIT", "OPR", "LOD", "STO", "CAL", "INT", "JMP", "JPC", "CSP", "LODX", "STOX", "???" }; static char *OPRarg[] = { "RET", "NEG", "ADD", "SUB", "MUL", "DIV", "LOW", "MOD", "EQ", "NE", "LT", "GE", "GT", "LE", "OR", "AND", "XOR", "NOT", "SHL", "SHR", "INC", "DEC", "CPY", "???" }; static char *CSParg[] = { "GETC", "PUTC", "GETN", "PUTN", "GETH", "PUTH", "EXEC", "FORK", "PUTS", "SCLO", "SCRE", "SOPN", "SSIG", "SWAIT", "MCLO", "MCRE", "MOPN", "MGET", "MPUT", "MLEN", "ALOC", "OPEN", "CREA", "CLOS", "EOF", "DEL", "READ", "WRIT", "????" }; k2 = k3 = 0; wOper = (INT16)(lCode & 0xff); wArg = (INT16)(lCode >> 16); k1 = ((wOper >= LIT) && (wOper <= CSP)) ? wOper : ((wOper == LODX) || (wOper == STOX)) ? (wOper - 9) : ILLEGAL_PCD; sprintf(pstr, "%s %2X,", stMn[k1], (INT16)((lCode >> 8) & 0xff)); switch (k1) { case OPR: k2 = ((wArg >= _RET) && (wArg < ILLEGAL_OPR_ARG)) ? wArg : ILLEGAL_OPR_ARG; strcat(pstr, OPRarg[k2]); break; case CSP: k3 = ((wArg >= CHIN) && (wArg < ILLEGAL_CSP_ARG)) ? wArg : ILLEGAL_CSP_ARG; strcat(pstr, CSParg[k3]); break; default: if ((k1 == LIT) && (wArg > 0)) sprintf(pstr+strlen(pstr), "0x%02X ", wArg); else sprintf(pstr+strlen(pstr), "%2d", wArg); break; }}/////////////// very similar to the above func, but only validates// RETURNS: TRUE .. good code// FALSE .. Illegal - process must terminate//static BOOL ValidCode (UINT16 uInst, INT16 wArg){ INT16 oper, k1, k2, k3; k2 = k3 = 0; oper = (INT16)(uInst & 0xff); k1 = ((oper >= LIT) && (oper <= CSP)) ? oper : ((oper == LODX) || (oper == STOX)) ? (oper - 9) : ILLEGAL_PCD; switch (k1) { case OPR: k2 = ((wArg >= _RET) && (wArg < ILLEGAL_OPR_ARG)) ? wArg : ILLEGAL_OPR_ARG; break; case CSP: k3 = ((wArg >= CHIN) && (wArg < ILLEGAL_CSP_ARG)) ? wArg : ILLEGAL_CSP_ARG; break; } return (((k1 == ILLEGAL_PCD) || (k2 == ILLEGAL_OPR_ARG) || (k3 == ILLEGAL_CSP_ARG)) ? FALSE : TRUE);}/////////////////////////////////// eof ////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -