亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? jobc.c

?? MMURTL(tm) Computer Operating System Ver x0.8, source code.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
  MMURTL Operating System Source Code
  Copyright 1991,1992,1993, Richard A. Burgess
  ALL RIGHTS RESERVED
  Version x0.8
*/

/* This file contains functions and data used to support
   loading or terminating jobs (or services).
   It contains the public functions:

   Chain()			 Loads new job run file in current JCB & PD
   LoadNewJob()		 Loads a new job into a new JCB & PD
   ExitJob()		 Exits current job, loads ExitJob if specified
   GetExitStatus()   Gets error set from ExitJob (the last guy's error)

   GetExitJob()		 Gets run file name that will be loaded upon ExitJob
   SetExitJob()		 Sets run file name to load upon ExitJob

   SetCmdLine()		 Sets the command line for next job
   GetCmdLine()		 Gets the command line for the current job

   GetPath()		 Gets the path prefix for the current job
   Setpath()		 Sets the path prefix for the current job

   SetUserName()	 Sets the Username for the current job
   GetUserName()	 Gets the Username for the current job

*/


#define U32 unsigned long
#define S32 long
#define U16 unsigned int
#define S16 int
#define U8 unsigned char
#define S8 char
#define TRUE 1
#define FALSE 1

#include "MKernel.h"
#include "MMemory.h"
#include "MData.h"
#include "MTimer.h"
#include "MVid.h"
#include "MKbd.h"
#include "MJob.h"
#include "MFiles.h"

#include "runfile.h"

#define MEMUSERD 7			/* User Writable (Data) */

#define ErcOutOfRange  10	/* Bad Exchange specified in OS call */
#define ErcNoExitJob   76	/* No ExitJob specified on ExitJob(n)*/
#define ErcBadRunFile  74	/* Couldn't load specified ExitRunFile */


/* Near Support Calls from OS */

extern long AllocJCB(long *pdJobNumRet, char *ppJCBRet);
extern long RemoveRdyJob(char *pJCB);
extern long	GetExchOwner(long Exch, char *pJCBRet);
extern long	SetExchOwner(long Exch, char *pNewJCB);
extern long	SendAbort(long JobNum, long Exch);

/* Temporary NEAR externals from the monitor program for debugging */

extern long xprintf(char *fmt, ...);
extern U32 Dump(unsigned char *pb, long cb);


/* We switch to this stack when we claen out a user
   PD before we rebuild it.
*/

long TmpStack[128];		/* 512 byte temporary stack */

/* Used for allocating/filling in new JCB */

struct JCBRec *pNewJCB;		/* Used to access a JCB */
struct JCBRec *pTmpJCB;
struct JCBRec *pCrntJCB;

long JobNum;

/* For ExitJob cause he can't have local vars! */

long JobNumE, job_fhE;
long ExchE, ercE, iE;
long BogusMsg[2];
long *pPDE, cbFileE;
char *pExchJCBE, *pFileE;
long KeyCodeE;
long FileE[80];

extern unsigned long KillExch;	/* From the Monitor */

/* Run file data */

char *pCode, *pData, *pStack;	/* Ptrs in User mem to load to */
long sCode,   sData,  sStack;	/* Size of segments */
unsigned long oCode, oData;		/* Offset in file to Code & Data */

long  offCode = 0,				/* Virtual Offset for Code & Data Segs */
	  offData = 0;

unsigned long 	nCDFIX = 0,
				oCDFIX = 0,
			  	nCCFIX = 0,
			  	oCCFIX = 0,
			  	nDDFIX = 0,
				oDDFIX = 0,
			  	nDCFIX = 0,
			  	oDCFIX = 0;

char *pStart, filetype;

struct tagtype tag;


/************* INTERNAL SUPPORT CALLS ******************/


/******************************************************
 This deallocates all user memory in a PD.  This is
 used when we ExitJob to free up all the memory.
 We get the pointer to the PD and "walk" through all
 the User PTs deallocating linear memory. When all
 PTs have been cleaned, we eliminate the user PDEs.
 This leaves a blank PD for reuse if needed.
******************************************************/

void CleanUserPD(long *pPD)
{
long i, j, k, erc;
unsigned long *pPT;
char *pMem;

	for (i=768; i<1024; i++) {			/* Look at each shadow PDE */
		if (pPD[i]) {					/* If it's a linear address (non 0)*/
			pPT = pPD[i] & 0xFFFFF000;	/* Point to Page Table */
			for (j=0; j<1024; j++) {

			/* Get Beginning address for each run to deallocate */

				k = 0;	/* nPages to deallocate */
				pMem = ((i-512) * 0x400000) + (j * 4096);
				while ((pPT[j++]) && (j<1024))
					k++;			/* one more page */
				if (k) {				/* we have pages (one or more) */
					erc =  DeAllocPage(pMem, k);
				}
			}
			if (i != 768) { 		/* save first PT! */
				erc = DeAllocPage(pPT, 1);	/* dealloc PT */
    	        pPD[i] = 0;					/* Wipe out shadow PDE */
        	    pPD[i-512] = 0;				/* Wipe out PDE */
			}
		}
	}
}

/*********************************************************
  This opens and reads and validates the run file.
  If all is well, it leaves it open and returns the
  file handle, else it closes the run file and returns
  the error to the caller.
  The caller is responsible for closing the file!!!
*********************************************************/

long GetRunFile(char *pFileName, long cbFileName, long *pfhRet)
{
long erc, i, fh, dret;
char fDone, junk;

	offCode = 0;
	offData = 0;
	nCDFIX = 0;
	oCDFIX = 0;
  	nCCFIX = 0;
  	oCCFIX = 0;
  	nDDFIX = 0;
	oDDFIX = 0;
  	nDCFIX = 0;
  	oDCFIX = 0;

			/* Mode Read, Stream type */
	erc = OpenFile(pFileName, cbFileName, 0, 1, &fh);

	if (!erc) {	/* File opened OK */

		fDone = 0;
		while ((!erc) && (!fDone)) {
			tag.id = 0;
			erc = ReadBytes (fh, &tag, 5, &dret);
			switch (tag.id) {
				case IDTAG:
					erc = ReadBytes (fh, &filetype, 1, &dret);
					if ((filetype < 1) || (filetype > 3))
						erc = ErcBadRunFile;
					break;
				case SEGTAG:
					erc = ReadBytes (fh, &sStack, 4, &dret);
					if (!erc) erc = ReadBytes (fh, &sCode, 4, &dret);
					if (!erc) erc = ReadBytes (fh, &sData, 4, &dret);
					break;
				case DOFFTAG:
					erc = ReadBytes (fh, &offData, 4, &dret);
					break;
				case COFFTAG:
					erc = ReadBytes (fh, &offCode, 4, &dret);
					break;
				case STRTTAG:
					erc = ReadBytes (fh, &pStart, 4, &dret);
					break;
				case CODETAG:
					erc = GetFileLFA(fh, &oCode);
					if (!erc)
						erc = SetFileLFA(fh, oCode+tag.len);	/* skip it */
					break;
				case DATATAG:
					erc = GetFileLFA(fh, &oData);
					if (!erc)
						erc = SetFileLFA(fh, oData+tag.len);	/* skip it */
					break;
				case CDFIXTAG:
					erc = GetFileLFA(fh, &oCDFIX);
					nCDFIX = tag.len/4;
					if (!erc)
						erc = SetFileLFA(fh, oCDFIX+tag.len);	/* skip it */
					break;
				case CCFIXTAG:
					erc = GetFileLFA(fh, &oCCFIX);
					nCCFIX = tag.len/4;
					if (!erc)
						erc = SetFileLFA(fh, oCCFIX+tag.len);	/* skip it */
					break;
				case DDFIXTAG:
					erc = GetFileLFA(fh, &oDDFIX);
					nDDFIX = tag.len/4;
					if (!erc)
						erc = SetFileLFA(fh, oDDFIX+tag.len);	/* skip it */
					break;
				case DCFIXTAG:
					erc = GetFileLFA(fh, &oDCFIX);
					nDCFIX = tag.len/4;
					if (!erc)
						erc = SetFileLFA(fh, oDCFIX+tag.len);	/* skip it */
					break;
				case ENDTAG:
					fDone = TRUE;
					break;
				default:
					erc = GetFileLFA(fh, &i);
				  	xprintf("UNKNOWN TAG LFA: %d  Size tag %d  ErcGetLFA: %d \r\n",
				  			 i, tag.len, erc);
					while ((tag.len--) && (!erc))
						erc = ReadBytes (fh, &junk, 1, &dret);
					break;
			}

		}
		if (erc)
			CloseFile(fh);
	}
	if (!erc)
		*pfhRet = fh;
/*
  	xprintf("PAUSED - Erc reading run file: %d\r\n", erc);
  	xprintf("sStack: %08x\r\n", sStack);
  	xprintf("sCode: %08x\r\n", sCode);
  	xprintf("sData: %08x\r\n", sData);
  	xprintf("offData: %08x\r\n", offData);
  	xprintf("offCode: %08x\r\n", offCode);
	ReadKbd(&KeyCodeE, 1);
*/
	return (erc);
}

/********************************************************/
/********************************************************/
/*********** PUBLIC CALLS FOR JOB MANAGEMENT ************/
/********************************************************/
/********************************************************/

/**************************************************/
long far SetExitJob(char *pRunFile, long dcbRunFile)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if (dcbRunFile > 79)
		return (ErcBadJobParam);
	else if (!dcbRunFile)
		pTmpJCB->JcbExitRF[0] = 0;
	else {
		CopyData(pRunFile, &pTmpJCB->JcbExitRF[1], dcbRunFile);
		pTmpJCB->JcbExitRF[0] = dcbRunFile;
	}
	return(0);
}

/**************************************************/
long far GetExitJob(char *pRunRet, long *pdcbRunRet)
{
long JobNum, i;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	i =	pTmpJCB->JcbExitRF[0];
	if (i)
		CopyData(&pTmpJCB->JcbExitRF[1], pRunRet, i);
	*pdcbRunRet = i;
	return(0);
}

/**************************************************/
long far SetPath(char *pPath, long dcbPath)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if (dcbPath > 69)
		return (ErcBadJobParam);
	else if (!dcbPath)
		pTmpJCB->sbPath[0] = 0;
	else {
		CopyData(pPath, &pTmpJCB->sbPath[1], dcbPath);
		pTmpJCB->sbPath[0] = dcbPath;
	}
	return(0);
}

/**************************************************/
long far GetPath(long JobNum, char *pPathRet, long *pdcbPathRet)
{
long i, erc;

	erc = GetpJCB(JobNum, &pTmpJCB);  /* Get pJCB to JobNum */
	if (!erc) {
		i =	pTmpJCB->sbPath[0];
		if (i)
			CopyData(&pTmpJCB->sbPath[1], pPathRet, i);
		*pdcbPathRet = i;
	}
	return(erc);
}
/**************************************************/
long far SetCmdLine(char *pCmd, long dcbCmd)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if (dcbCmd > 79)
		return (ErcBadJobParam);
	else if (!dcbCmd)
		pTmpJCB->JcbCmdLine[0] = 0;
	else {
		CopyData(pCmd, &pTmpJCB->JcbCmdLine[1], dcbCmd);
		pTmpJCB->JcbCmdLine[0] = dcbCmd;
	}
	return(0);
}

/**************************************************/
long far GetCmdLine(char *pCmdRet, long *pdcbCmdRet)
{
long JobNum, i;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	i =	pTmpJCB->JcbCmdLine[0];
	if (i)
		CopyData(&pTmpJCB->JcbCmdLine[1], pCmdRet, i);
	*pdcbCmdRet = i;
	return(0);
}


/**************************************************/
long far SetUserName(char *pUser, long dcbUser)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if (dcbUser > 29)
		return (ErcBadJobParam);
	else if (!dcbUser)
		pTmpJCB->sbUserName[0] = 0;
	else {
		CopyData(pUser, &pTmpJCB->sbUserName[1], dcbUser);
		pTmpJCB->sbUserName[0] = dcbUser;
	}
	return(0);
}

/**************************************************/
long far GetUserName(char *pUserRet, long *pdcbUserRet)
{
long JobNum, i;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	i =	pTmpJCB->sbUserName[0];
	if (i)
		CopyData(&pTmpJCB->sbUserName[1], pUserRet, i);
	*pdcbUserRet = i;
	return(0);
}

/**************************************************/
long far SetSysIn(char *pName, long dcbName)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if ((dcbName > 49) || (!dcbName))
		return (ErcBadJobParam);
	else {
		CopyData(pName, &pTmpJCB->JcbSysIn[1], dcbName);
		pTmpJCB->JcbSysIn[0] = dcbName;
	}
	return(0);
}

/**************************************************/
long far GetSysIn(char *pFileRet, long *pdcbFileRet)
{
long JobNum, i;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	i =	pTmpJCB->JcbSysIn[0];
	if (i)
		CopyData(&pTmpJCB->JcbSysIn[1], pFileRet, i);
	*pdcbFileRet = i;
	return(0);
}

/**************************************************/
long far SetSysOut(char *pName, long dcbName)
{
long JobNum;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	if ((dcbName > 49) || (!dcbName))
		return (ErcBadJobParam);
	else {
		CopyData(pName, &pTmpJCB->JcbSysOut[1], dcbName);
		pTmpJCB->JcbSysOut[0] = dcbName;
	}
	return(0);
}

/**************************************************/
long far GetSysOut(char *pFileRet, long *pdcbFileRet)
{
long JobNum, i;

	GetJobNum(&JobNum);
	GetpJCB(JobNum, &pTmpJCB);		/* Get pJCB to current Job */
	i =	pTmpJCB->JcbSysOut[0];
	if (i)
		CopyData(&pTmpJCB->JcbSysOut[1], pFileRet, i);
	*pdcbFileRet = i;
	return(0);
}

/*********************************************************
  This creates and loads a new Job from a RUN file.
  This returns ErcOK and new job number if loaded OK
  else an error is returned.
*********************************************************/

long far LoadNewJob(char *pFileName, long cbFileName, long *pJobNumRet)
{
long erc, i, fh, dret, nPages;
unsigned long *pPD, *pPT, *pVid, *pOSPD;
long *pFix;
U32 PhyAdd;

	/* FIX ME - Put Semaphore/Exch here to allow only a single user */

	erc =  GetRunFile(pFileName, cbFileName, &fh);

	if (!erc) {

		/* We set these to zero so we can tell if they have
		been allocated in case we fail so we know what to deallocate
		*/

		JobNum = 0;
		pNewJCB = 0;
		pPD = 0;
		pPT = 0;
		pVid = 0;

		erc = AllocJCB(&JobNum, &pNewJCB);

		/* Alloc OS memory pages required for new job */

		if (!erc)
			erc = AllocOSPage(3, &pPD);		/* Job's PD, PT * pVirtVid */

		pPT = pPD + 4096;			/* 1 page later */
		pVid = pPD + 8192;			/* 2 pages later */

		if (!erc) {
			FillData(pPT, 4096, 0);		/* Zero user PT */
			FillData(pVid, 4096, 0);	/* Zero user video */

			GetpJCB(1, &pTmpJCB);		/* Get OS pJCB */
			pOSPD = pTmpJCB->pJcbPD;	/* Pointer to OS PD */

			GetPhyAdd(1, pPT, &PhyAdd);	/* Get Phy Add for new PT */

			PhyAdd |= MEMUSERD;			/* Set user code bits in PDE */

			pOSPD[256] = PhyAdd; 		/* Make User PDE in OS PD */
			pOSPD[768] = pPT;			/* Shadow Linear Address of PT */

			/*
		  	xprintf("pOSPD  : %08x\r\n", pOSPD);
		  	xprintf("pUserPD: %08x\r\n", pPD);
		  	xprintf("pUserPT: %08x\r\n", pPT);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性大战久久| 一级日本不卡的影视| 亚洲日本一区二区| 人人精品人人爱| 色综合色综合色综合色综合色综合| 91精品在线观看入口| 中文字幕一区二区三| 国内国产精品久久| 欧美日韩精品系列| 中文字幕视频一区| 国产精品456露脸| 欧美大度的电影原声| 洋洋成人永久网站入口| 成人性生交大片免费看中文| 日韩免费观看2025年上映的电影| 亚洲国产精品欧美一二99| 成人精品免费视频| 久久综合久久综合亚洲| 日本免费新一区视频| 日本久久精品电影| 玉足女爽爽91| 91同城在线观看| 自拍偷拍亚洲综合| 成人高清免费观看| 国产精品免费人成网站| 国产+成+人+亚洲欧洲自线| 欧美成人免费网站| 久久国产三级精品| 精品国产百合女同互慰| 国内久久精品视频| 久久久不卡网国产精品二区| 激情久久久久久久久久久久久久久久| 欧美日韩成人一区二区| 日韩av二区在线播放| 51午夜精品国产| 免费成人性网站| 日韩免费电影一区| 国产乱理伦片在线观看夜一区| 精品国产一区二区三区忘忧草 | 亚洲国产毛片aaaaa无费看| www.欧美.com| 亚洲精品v日韩精品| 欧洲精品一区二区| 日日摸夜夜添夜夜添精品视频| 欧美日韩电影一区| 久久99久久精品| 亚洲国产精品v| 色婷婷激情一区二区三区| 香蕉影视欧美成人| 精品国产一区二区三区av性色| 国内不卡的二区三区中文字幕| 国产无遮挡一区二区三区毛片日本| 成人国产一区二区三区精品| 亚洲欧洲精品一区二区精品久久久 | 欧美大片国产精品| 高清beeg欧美| 亚洲午夜三级在线| 91丨国产丨九色丨pron| 亚洲成人av中文| 精品国产亚洲在线| 99精品视频在线播放观看| 天天综合网 天天综合色| 欧美大片一区二区| 99re热这里只有精品视频| 视频一区在线播放| 欧美韩国日本不卡| 欧美久久久久久久久久| 国产精品一品二品| 亚洲成人自拍网| 亚洲国产成人私人影院tom| 欧美三区免费完整视频在线观看| 久久99久久精品| 一区二区三区欧美| www成人在线观看| 欧美主播一区二区三区美女| 免费看黄色91| 亚洲美女视频在线| 久久久精品日韩欧美| 欧美日韩一区二区三区四区| 国产91丝袜在线观看| 日韩综合小视频| 亚洲欧美色一区| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日韩欧美一级片| 欧美在线你懂的| 成人av在线资源网站| 久久激情五月激情| 午夜精品一区在线观看| **性色生活片久久毛片| 欧美一级黄色录像| 欧美图片一区二区三区| 成人a区在线观看| 国产一区二区三区最好精华液| 亚洲.国产.中文慕字在线| 国产精品毛片无遮挡高清| 亚洲精品一区二区三区香蕉| 欧美网站大全在线观看| 99国产精品久久久久久久久久久| 精品一二线国产| 美女视频黄 久久| 日韩—二三区免费观看av| 亚洲综合在线五月| 最新国产の精品合集bt伙计| 国产三级一区二区三区| 精品久久久久一区二区国产| 7777精品伊人久久久大香线蕉的| 欧美天堂一区二区三区| 在线观看亚洲精品视频| 99r精品视频| www.成人网.com| 丁香网亚洲国际| 成人自拍视频在线观看| 国产成人精品亚洲777人妖 | 色婷婷亚洲精品| 色婷婷综合久久久久中文一区二区 | 韩国欧美国产1区| 九色|91porny| 国产高清精品网站| 福利一区二区在线观看| 懂色av中文字幕一区二区三区| 国产精品99久久久久久久女警| 国产电影精品久久禁18| 成人妖精视频yjsp地址| 91在线观看视频| 一本大道久久a久久精二百| 欧美性做爰猛烈叫床潮| 欧美日韩三级一区二区| 欧美一区二区精品在线| 日韩精品一区在线观看| 国产欧美一区二区在线| 国产精品成人免费 | 国产精品国产馆在线真实露脸| 国产精品少妇自拍| 亚洲欧美另类综合偷拍| 亚洲高清在线精品| 麻豆精品蜜桃视频网站| 国产成人免费视频网站| 97超碰欧美中文字幕| 欧美无砖砖区免费| 精品盗摄一区二区三区| 国产精品妹子av| 性做久久久久久久久| 国内精品伊人久久久久av一坑| www.欧美日韩国产在线| 欧美日韩欧美一区二区| 久久久久久免费| 一区二区三区产品免费精品久久75| 性做久久久久久免费观看| 激情综合一区二区三区| 色天使色偷偷av一区二区| 日韩午夜激情视频| 国产精品国产三级国产普通话蜜臀| 亚洲国产成人av| 国产成人综合亚洲91猫咪| 欧美视频完全免费看| 国产色91在线| 日韩av一级电影| 91麻豆免费看| 久久亚洲春色中文字幕久久久| 一个色综合av| 成人性视频免费网站| 欧美一级淫片007| 一区二区三区在线观看欧美| 国内国产精品久久| 欧美电影影音先锋| 中文字幕色av一区二区三区| 久久99精品久久久久| 欧美在线一区二区三区| 国产亚洲欧美在线| 日韩国产欧美三级| 91久久精品一区二区三| 国产欧美日本一区二区三区| 蜜桃久久av一区| 欧美乱熟臀69xxxxxx| 最新欧美精品一区二区三区| 久久99精品久久久久久| 欧美福利一区二区| 亚洲一级二级在线| av不卡一区二区三区| 国产欧美日韩卡一| 狠狠色狠狠色综合| 日韩免费高清视频| 日本色综合中文字幕| 欧美日韩一区二区三区免费看| 亚洲人午夜精品天堂一二香蕉| 国产乱理伦片在线观看夜一区| 日韩欧美成人激情| 丝袜亚洲精品中文字幕一区| 在线观看网站黄不卡| 亚洲理论在线观看| 91久久精品一区二区三| 亚洲人成小说网站色在线| 国产成人aaa| 中文字幕成人av| 成人免费视频一区| 国产精品美女久久福利网站| 国产成人免费网站| 中文字幕一区二区三区在线不卡| 成人激情图片网| 亚洲人成网站在线|