⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci.cpp

📁 一个嵌入式系统的C代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	      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 + -