www.pudn.com > Mos.rar > Mos_inth.cpp


// Mos_inth.cpp: implementation of the CMos_inth class. 
// Author:Wang Hao. Released April,2002. 
// Copyright (C) 2002 by Wang Hao. 
// 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); 
}