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

📄 mosmm.java

📁 本程序是在软件模拟的计算机系统上设计一个多道程序的操作系统MOS
💻 JAVA
字号:
import java.awt.Color;

class MosMM
{
	//保存用户区数据
	private byte[] mm_user_data = null;
	
	//保存用户区数据分配表
	private byte[] mm_malloc_table = null;
	private MosVar var = null;
	String s = "";
	
	//构造方法
	public MosMM(MosVar var)
	{
		this.var = var;
		this.mm_user_data = new byte[FinalVar.MM_MAX_CAP];
		this.mm_malloc_table = new byte[FinalVar.MM_PAGE_MAXCAP];
	}
	
	//申请内存方法,参数为要申请的页数,返回一个长度为10的页表,空间不足返回null
	//返回的页表中未分配的逻辑页号对应内存页号值为-1
	byte[] mmMalloc(byte n)
	{
		byte freecount = 0;
		byte[] pagetable = null;
		for(int i = 0;i < this.mm_malloc_table.length;i++)
		{
			if(this.mm_malloc_table[i] == FinalVar.MM_FREE)++freecount;
		}
		if(freecount < n){System.out.println("内存不足!!!");return null;}
		pagetable = new byte[10];
		for(int i = 0;i < 10;i++)
		{pagetable[i] = -1;}
		for(byte i = 0,j = 0;j < n;i++)
		{
			if(this.mm_malloc_table[i] == FinalVar.MM_FREE)
			{
				pagetable[j] = i;
				++j;
				this.mm_malloc_table[i] = FinalVar.MM_MALLOCED;
			}
		}
		return pagetable;
	}
	
	
	//内存释放方法,参数为一个页表
	public void mmFree(byte[] pagetable)
	{
		for(int i = 0;i < pagetable.length;i++)
		{
			if(pagetable[i] == -1)break;
			this.mm_malloc_table[pagetable[i]] = FinalVar.MM_FREE;
		}
	}
	
	//内存写方法,以参数字节数组的长度决定是写一个字还是写一页
	//当字节数组长度为4时,是写一个字,参数addr为要写的内存字的第一字节地址
	//当字节数组长度为40时,是写一页,参数addr为内存的页号
	void mmWrite(byte[] data,int addr)
	{
		if(data.length == 4)
		{
			for(int i = 0;i < 4;i++)
			{this.mm_user_data[addr+i] = data[i];}
		}
		else if(data.length == 40)
		{
			addr = addr * 40;
			for(int i = 0;i < 40;i++)
			{this.mm_user_data[addr+i] = data[i];}
		}
		showMMState();
	}
	
	private void showMMState() {
		var.mm_area.setText("");
		for(int i = 0; i < 10; i++) {
	    	s = "";
	    	if((this.mm_user_data[i * 4 ]!=0)||(this.mm_user_data[i * 4 +1]!=0)||
	    			(this.mm_user_data[i * 4 +2]!=0)||(this.mm_user_data[i * 4 + 3]!=0))
		    	for(int j = 0; j < 4; j++)
		    		s = s + (char)mm_user_data[i * 4 + j];
	    	else
	    		for(int j = 0; j < 4; j++)
		    		s = s + mm_user_data[i * 4 + j];
	    	var.mm_area.append("   00" + i + "     "+ s + "\n");
	    }
	    for(int i = 10; i < 100; i++) {
	    	s = "";
	    	if((this.mm_user_data[i * 4 ]!=0)||(this.mm_user_data[i * 4 +1]!=0)||
	    			(this.mm_user_data[i * 4 +2]!=0)||(this.mm_user_data[i * 4 + 3]!=0))
		    	for(int j = 0; j < 4; j++)
		    		s = s + (char)mm_user_data[i * 4 + j];
	    	else
	    		for(int j = 0; j < 4; j++)
		    		s = s + mm_user_data[i * 4 + j];
	    	var.mm_area.append("   0" + i + "     "+ s + "\n");
	    }
	    for(int i = 100; i < 300; i++) {
	    	s = "";
	    	if((this.mm_user_data[i * 4 ]!=0)||(this.mm_user_data[i * 4 +1]!=0)||
	    			(this.mm_user_data[i * 4 +2]!=0)||(this.mm_user_data[i * 4 + 3]!=0))
		    	for(int j = 0; j < 4; j++)
		    		s = s + (char)mm_user_data[i * 4 + j];
	    	else
	    		for(int j = 0; j < 4; j++)
		    		s = s + mm_user_data[i * 4 + j];
	    	var.mm_area.append("   " + i + "     "+s + "\n");
	    }
	    for(int i = 250; i < 289; i++) {
	    	s = "";
	    	if((this.mm_user_data[i * 4 ]!=0)||(this.mm_user_data[i * 4 +1]!=0)||
	    			(this.mm_user_data[i * 4 +2]!=0)||(this.mm_user_data[i * 4 + 3]!=0))
		    	for(int j = 0; j < 4; j++) {
		    		s = s + (char)mm_user_data[i * 4 + j];
		    	}
	    	else
	    		for(int j = 0; j < 4; j++)
		    		s = s + mm_user_data[i * 4 + j];
	    	var.getMain().prtoutb.var_kb_input_label[i - 250].setText("" + s);
	    }
	    for(int i = 0; i < 10; i++) {
	    	s = "";
	    	if((this.mm_user_data[(290 + i) * 4 ]!=0)||(this.mm_user_data[(290 + i) * 4 +1]!=0)||
	    			(this.mm_user_data[(290 + i) * 4 +2]!=0)||(this.mm_user_data[(290 +i) * 4 + 3]!=0))
		    	for(int j = 0; j < 4; j++) {
		    		s = s + (char)mm_user_data[(290 + i) * 4 + j];
		    	}
	    	else
	    		for(int j = 0; j < 4; j++)
		    		s = s + mm_user_data[(290 + i) * 4 + j];
	    	var.getMain().kbinb.var_kb_input_label[i].setText("" + s);
	    }
	}
	//内存读方法,以参数mode的值决定是读一个字还是读一页
	//当参数mode的值为FinalVar.MM_READ_WORD时是读一个字,返回一个长度为4的字节数组
	//当参数mode的值为FinalVar.MM_READ_PAGE时是读一页,返回一个长度为40的字节数组
	byte[] mmRead(int addr,byte mode)
	{
		byte[] data = null;
		if(mode == FinalVar.MM_READ_WORD)
		{
			data = new byte[4];
			for(int i = 0;i < 4;i++)
			{data[i] = this.mm_user_data[addr+i];}
		}
		else if(mode == FinalVar.MM_READ_PAGE )
		{
			data = new byte[40];
			addr = addr * 40;
			for(int i = 0;i < 40;i++)
			{data[i] = this.mm_user_data[addr+i];}
		}
		else return null;
		return data;
	}
	
	//申请键盘和打印机内存缓冲区方法,用于系统初始化
	void mmMallocBuffer()
	{
		for(int i = 0;i < FinalVar.KB_BUFFER_SIZE;i++)
		{this.mm_malloc_table[FinalVar.KB_BUFFER_ADDR+i] = FinalVar.MM_MALLOCED;}
		for(int i = 0;i < FinalVar.PRT_BUFFER_SIZE;i++)
		{this.mm_malloc_table[FinalVar.PRT_BUFFER_ADDR+i] = FinalVar.MM_MALLOCED;}
	}
}

⌨️ 快捷键说明

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