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