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

📄 mos_inth.cpp

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

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

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

}

CMos_inth::~CMos_inth()
{

}

void CMos_inth::interrupt_handle()
{
	
	m_UI.DealWithUI(_T("KERNEL"),IDC_STATIC_CPU);
	if(m_pcb.curr_pcb!=NULL)
	{
		if(m_pcb.curr_pcb->mode ==USERMODE)
		{
			m_pcb.curr_pcb ->regc = m_cpu.C;//保存现场
			m_pcb.curr_pcb->regpc[0] = m_cpu.PC[0];
			m_pcb.curr_pcb->regpc[1] = m_cpu.PC[1];
			for(int i=0;i<=3;i++)
				m_pcb.curr_pcb->regr[i] =m_cpu.R[i];
		}
	}
	if(m_cpu.PI>0)pi_handle(m_cpu.PI);
	if(m_cpu.SI>0)si_handle(m_cpu.SI);
	if(m_cpu.TI>0)ti_handle(m_cpu.TI);
	if(m_cpu.IOI>0)ioi_handle(m_cpu.IOI);
	m_cpu.kerneltime++;
}

void CMos_inth::pi_handle(int &pi)
{
	mos_proc.halt(pi);
	pi = 0;
}

void CMos_inth::si_handle(int &si)
{
	int addr1,addr2;
	if(si==1||si==2)
	{
		addr1 = (m_cpu.PC[1]-0x30)*10+m_cpu.PC[0]-0x30;
		addr1--;
		m_cpu.mapy(addr1);
		addr2 = (m_cpu.memory[addr1].op3-0x30)*10 + (m_cpu.memory[addr1].op4 -0x30);
	}
	switch(si)
	{
	case 1: RL(addr2);break;
	case 2: WL(addr2);break;
	case 3: m_cpu.GT();
			m_pcb.curr_pcb->regr[0] =m_cpu.R[0];
			m_pcb.curr_pcb->regr[1] =m_cpu.R[1];
			m_pcb.curr_pcb->regr[2] =m_cpu.R[2];
			m_pcb.curr_pcb->regr[3] =m_cpu.R[3];
			m_pcb.curr_pcb->flag = READY;//挂当前进程到就绪队列
			mos_proc.rearrange( m_pcb.curr_pcb,m_pcb.readypcbhead,
								m_pcb.readypcbtail,0,IDC_STATIC_RP);
			break;
	case 4:mos_proc.halt(0);break;
	default:break;
	}
	si = 0;
}

void CMos_inth::ti_handle(int &ti)
{
	ti = 0;
	if(m_pcb.curr_pcb!=NULL){
		m_pcb.curr_pcb->flag = READY;
		m_UI.DealWithUIEx(NULL,IDC_STATIC_CP);
		mos_proc.rearrange(m_pcb.curr_pcb,m_pcb.readypcbhead,m_pcb.readypcbtail,0,IDC_STATIC_RP);
	}
}

void CMos_inth::ioi_handle(int &ioi)
{
	switch(ioi)
	{
	case 1:ResetIORBHead(m_io.CHHEAD[0],m_io.CHTAIL[0]);
		   mos_proc.wakeup(IORESTKB,KB);
		   break;
	case 2:ResetIORBHead(m_io.CHHEAD[1],m_io.CHTAIL[1]);
		   mos_proc.wakeup(IORESTPRT,PRT);
		   break;
	case 3:ResetIORBHead(m_io.CHHEAD[2],m_io.CHTAIL[2]);
		   mos_proc.wakeup(IORESTDSK,DSK);
		   break;
	case 4:ResetIORBHead(m_io.CHHEAD[1],m_io.CHTAIL[1]);
		   mos_proc.wakeup(IORESTPRT,PRT);
		   ResetIORBHead(m_io.CHHEAD[0],m_io.CHTAIL[0]);
		   mos_proc.wakeup(IORESTKB,KB);
		   break;
	case 5:ResetIORBHead(m_io.CHHEAD[2],m_io.CHTAIL[2]);
		   mos_proc.wakeup(IORESTDSK,DSK);
		   ResetIORBHead(m_io.CHHEAD[0],m_io.CHTAIL[0]);
		   mos_proc.wakeup(IORESTKB,KB);
		   break;
	case 6:ResetIORBHead(m_io.CHHEAD[2],m_io.CHTAIL[2]);
		   mos_proc.wakeup(IORESTDSK,DSK);
		   ResetIORBHead(m_io.CHHEAD[1],m_io.CHTAIL[1]);
		   mos_proc.wakeup(IORESTPRT,PRT);
		   break;
	case 7:ResetIORBHead(m_io.CHHEAD[2],m_io.CHTAIL[2]);
		   mos_proc.wakeup(IORESTDSK,DSK);
		   ResetIORBHead(m_io.CHHEAD[1],m_io.CHTAIL[1]);
		   mos_proc.wakeup(IORESTPRT,PRT);
		   ResetIORBHead(m_io.CHHEAD[0],m_io.CHTAIL[0]);
		   mos_proc.wakeup(IORESTKB,KB);
	default:break;
	}
	if(m_pcb.curr_pcb!=NULL){
		m_pcb.curr_pcb->flag = READY;//挂当前进程到就绪队列
		m_UI.DealWithUIEx(NULL,IDC_STATIC_CP);
		mos_proc.rearrange(m_pcb.curr_pcb,m_pcb.readypcbhead,m_pcb.readypcbtail,0,IDC_STATIC_RP);
	}
	ioi = 0;
}

void CMos_inth::ResetIORBHead(iorbtype *&head, iorbtype *&tail)
{
	if(head!=NULL)
	{
		iorbtype *p = head;
		head->pcb = NULL;
		if(head->link==NULL)
			head=tail=NULL;
		else head=head->link;
		delete p;
	}
}

void CMos_inth::RL(int &addr)
{
	int newaddr = 0;
	int x2 = addr%10;
	int beta = addr-x2;
	char buffer[41];
	char oldch[8],newch[8];
	for(int i=0;i<=6;i++)
		oldch[i] = newch[i] = ' ';
	newch[7] = oldch[7] = '\0';
	for(i=0;i<=40;i++)
		buffer[i] = '\0';
	m_pcb.curr_pcb->io++;
	m_io.rdsk(x2+1,buffer,m_pcb.curr_pcb->inp,m_pcb.curr_pcb->inp);
	for(i = 0;i<=x2;i++)
	{
		newaddr = beta+i;
		m_cpu.mapy(newaddr);
		oldch[0] = m_cpu.memory[newaddr].op1;//高位
		oldch[2] = m_cpu.memory[newaddr].op2;
		oldch[4] = m_cpu.memory[newaddr].op3;
		oldch[6] = m_cpu.memory[newaddr].op4;//低位
		newch[0] = m_cpu.memory[newaddr].op1 = buffer[i*4];
		newch[2] = m_cpu.memory[newaddr].op2 = buffer[i*4+1];
		newch[4] = m_cpu.memory[newaddr].op3 = buffer[i*4+2];
		newch[6] = m_cpu.memory[newaddr].op4 = buffer[i*4+3];
		m_UI.UpdateList(IDC_LIST1,oldch,newaddr,newch);
	}
}

void CMos_inth::WL(int &addr)
{
	int newaddr = 0;
	int x2 = addr%10;
	int beta = addr-x2;
	char buffer[40];
	for(int i=0;i<=39;i++)
		buffer[i] = '\0';
	m_pcb.curr_pcb->io++;
	for(i = 0;i<=x2;i++)
	{
		newaddr = beta+i;
		m_cpu.mapy(newaddr);
		if(m_cpu.memory[newaddr].op1=='0') buffer[i*4] = '+';
		else
			buffer[i*4] = m_cpu.memory[newaddr].op1;//高位
		buffer[i*4+1] = m_cpu.memory[newaddr].op2;
		buffer[i*4+2] = m_cpu.memory[newaddr].op3;
		buffer[i*4+3] = m_cpu.memory[newaddr].op4;//低位
	}
	m_pcb.curr_pcb->olimit--;
	m_pcb.curr_pcb->resultline++;
	if(m_pcb.curr_pcb->olimit<0) {;}//输出异常
	m_io.wdsk(10,buffer,m_pcb.curr_pcb->outp,m_pcb.curr_pcb->outp);
}

⌨️ 快捷键说明

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