📄 mos_inth.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 + -