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

📄 vcs.cpp

📁 用VC编写的一个微型操作系统
💻 CPP
字号:
// VCS.cpp: implementation of the CVCS class.
// Wrote by biti_zx. Released April,2002.
// Copyright (C) 2002 by biti_zx.
// All rights reserved.
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mos.h"
#include "VCS.h"
#include "PCB.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CVCS m_cpu;
extern PCB m_pcb;
CVCS::CVCS()
{

}

CVCS::~CVCS()
{

}

BOOL CVCS::Test()
{
	if(PI+SI+TI+IOI>0)
		return TRUE;
	else 
		return FALSE;
}

void CVCS::VCS()
{
	int ipc = 0;
	int addr1 = 0,addr2 = 0;
	for(;;)
	{
		m_pcb.curr_pcb->cputime++;
		m_cpu.usertime++;
		addr1 = ipc = (PC[1]-0x30)*10 + (PC[0]-0x30);
		ipc++;
		PC[1] =	char(ipc/10)+0x30;//high
		PC[0] = ipc%10+0x30;//low
		mapy(addr1);
		addr2 = (memory[addr1].op3-0x30)*10 + (memory[addr1].op4 -0x30);
		//op3: x1,op4: x2
		switch(memory[addr1].op1)
		{
			case 'L':LR(addr2);break;
			case 'C':CR(addr2);break;
			case 'A':AD(addr2);break;
			case 'R':SI=1;break;
			case 'W':SI=2;break;
			case 'G':SI=3;break;
			case 'H':SI=4;break;
			case 'S':switch(memory[addr1].op2)
					 {
						case 'R':SR(addr2);break;
						case 'U':SU(addr2);break;
						default:PI=2;break;
					 }
					break;
			case 'B':switch(memory[addr1].op2)
					{
						case 'T':BT(addr2);break;
						case 'N':BN(addr2);break;
						case 'U':BU(addr2);break;
						default:PI=2;break;
					}
					break;
			default:PI=2;break;
		}
		clock();
		if(Test()){
			MODE = KERNELMODE;
			return;//有中断
		}
	}//end of for(;;)
}

bool CVCS::mapy(int &adr)//adr: pc寄存器内容 or 指令中 x1x2
/*
regptr:|op4|op3|op2|op1|
        [3] [2] [1] [0]
*/
{
	char a1 = PTR.op2;//op2 l-1
	char a2 = PTR.op3;//op3 x1
	char a3 = PTR.op4;//op4 x2
	int m = (a2-'0')*10+(a3-'0');  //取得页表基址
	int x1 = (int)(adr/10);//取得逻辑页号
	int x2 = adr%10; //取得页内位移
	if(x1 > (a1-'0'))
	{
		PI = 1;
		return false; //映射不成功
	}
	else
	{
		char bi1 = memory[m*10+x1].op1;//0 0
		char bi2 = memory[m*10+x1].op2;//1 2
		int n = (bi1-'0')*10+(bi2-'0');//取得实际物理页号
		n*=10;//得相应物理页起始下标
		adr = n+x2;//加页内位移,得指令、数据的物理下标
		return true;
	}
}

void CVCS::clock()
{
	CString str;
	rtime++;
	time--;
	if(time == 0)
		TI = 1;
	if(CHST[0]+CHST[1]+CHST[2]>0)
	{//通道计时
		for(int i = 0;i<=2;i++)
			if(CHST[i]==BUSY){
				CHCOUNT[i]--;
				str.Format("%d",CHCOUNT[i]);
				m_UI.DealWithUI(str,IDC_STATIC_IOKB-i);
			}

		if(CHCOUNT[0]==0&&CHST[0]==BUSY)
		{
			IOI = 1;
			CHST[0] = FREE;
			if(CHCOUNT[1]==0&&CHST[1]==BUSY)
			{
				IOI = 4;
				CHST[1] = FREE;
				if(CHCOUNT[2]==0&&CHST[2]==BUSY)
				{
					IOI = 7;
					CHST[2] = FREE;
				}
			}
			else if(CHCOUNT[2]==0&&CHST[2]==BUSY)
			{
				IOI = 5;
				CHST[2] = FREE;
			}
		}//end of if(CHCOUNT[0]==0)
		else if(CHCOUNT[1] == 0&&CHST[1]==BUSY)
		{
			IOI = 2;
			CHST[1] = FREE;
			if(CHCOUNT[2]==0&&CHST[2]==BUSY)
			{
				IOI = 6;
				CHST[2] = FREE;
			}
		}
		else if(CHCOUNT[2]==0&&CHST[2]==BUSY)
		{
			IOI = 3;
			CHST[2] = FREE;
		}
		for(i=0;i<=2;i++){
			if(CHST[i]==FREE) m_UI.DealWithUI("FREE",IDC_STATIC_KBS+i);
			else if(CHST[i]==BUSY) m_UI.DealWithUI("BUSY",IDC_STATIC_KBS+i);
		}
	}//end of if
}

void CVCS::LR(int &addr)
/*     ___ ___ ___ ___
R:高->|op1|op2|op3|op4|->低
       R[3]R[2]R[1]R[0] 下同  
*/
{
	mapy(addr);
	R[3] = memory[addr].op1;
	R[2] = memory[addr].op2;
	R[1] = memory[addr].op3;
	R[0] = memory[addr].op4;
}

void CVCS::SR(int &addr)
{
	char oldch[8],newch[8];
	for(int i=0;i<=6;i++)
		oldch[i] = newch[i] = ' ';
	newch[7] = oldch[7] = '\0';
	mapy(addr);
	oldch[0] = memory[addr].op1;
	oldch[2] = memory[addr].op2;
	oldch[4] = memory[addr].op3;
	oldch[6] = memory[addr].op4;
	newch[0] = memory[addr].op1 = R[3];
	newch[2] = memory[addr].op2 = R[2];
	newch[4] = memory[addr].op3 = R[1];
	newch[6] = memory[addr].op4 = R[0];
	m_UI.UpdateList(IDC_LIST1,oldch,addr,newch);
}

void CVCS::CR(int &addr)
{
	mapy(addr);
	if(memory[addr].op1==R[3]&&memory[addr].op2 == R[2]&&
	   memory[addr].op3==R[1]&&memory[addr].op4 == R[0])
	   C = 'T';
	else C = 'F';
}

void CVCS::BT(int &addr)
/*
PC:high|x1|x2|low
		1  0
*/
{
	if(C == 'T') 
		addr = (PC[1]-0x30)*10+(PC[0]-0x30);
}

void CVCS::AD(int &addr)
{
	mapy(addr);
	int a,b;
	b=(R[2]-0x30)*100+(R[1]-0x30)*10+(R[0]-0x30);
	if(R[3]=='-') b=-b;
	else b+=(R[3]-0x30)*1000;
	
	a=(memory[addr].op2-0x30)*100+(memory[addr].op3-0x30)*10+(memory[addr].op4-0x30);
	if(memory[addr].op1=='-') a=-a;
	else a+=(memory[addr].op1-0x30)*1000;

	b += a;
	if(b<0){
		R[3] = '-'-0x30;
		b = -b;
		R[2] = b/100;
	}
	else{
			R[3] = b/1000;
			R[2] = (b-R[3]*1000)/100;
	}
	R[0] = b%10;
	R[1] = (b-R[0])%100/10;
	for(a=0;a<=3;a++)
		R[a] += 0x30;
}

void CVCS::SU(int &addr)
{
	mapy(addr);
	int a,b;
	b=(R[2]-0x30)*100+(R[1]-0x30)*10+(R[0]-0x30);
	if(R[3]=='-') b=-b;
	else b+=(R[3]-0x30)*1000;
	
	a=(memory[addr].op2-0x30)*100+(memory[addr].op3-0x30)*10+(memory[addr].op4-0x30);
	if(memory[addr].op1=='-') a=-a;
	else a+=(memory[addr].op1-0x30)*1000;

	b -= a;
	if(b<0){
		R[3] = '-'-0x30;
		b = -b;
		R[2] = b/100;
	}
	else{
			R[3] = b/1000;
			R[2] = (b-R[3]*1000)/100;
	}
	R[0] = b%10;
	R[1] = (b-R[0])%100/10;
	for(a=0;a<=3;a++)
		R[a] += 0x30;
}

void CVCS::BN(int &addr)
{
	if(R[3] == '-'){
		PC[0] = addr%10 + 0x30;
		PC[1] = addr/10 + 0x30;
	}
}

void CVCS::BU(int &addr)
{
	PC[0] = addr%10 + 0x30;
	PC[1] = addr/10 + 0x30;
}

void CVCS::GT()
{	
	R[3] = rtime/1000;
	R[2] = (rtime-R[3]*1000)/100;
	R[0] = rtime%10;
	R[1] = (rtime-R[0])%100/10;
	for(int i=0;i<=3;i++)
		R[i] +=  0x30;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -