📄 kernel.x
字号:
//*******************************************************************
//output
void sys_putchar(char c)
{
while (((*(int *)0x6001) & 1) == 0); //check the state register of 8251, until the TxDRY = 1, then receive data from CPU
*(int *)0x6000 = (int )c; //transfer a char from CPU to 8251
}
void sys_puts(char *s) //transfer a string from CPU to 8251
{
int i;
for (i=0;*(s+i)!=0;i++)
sys_putchar(s[i]);
}
void sys_puthex(int num) //change a dec number to hex form(actually made up of array of char), and transfer it
{
int i,j;
for (i=0;i<4;i++)
{
j = ((num & 0xF000) >> 12);
num = (num << 4);
if (j < 10)
sys_putchar((char)(j+48));
else sys_putchar((char)(j+55));
}
}
//*******************************************************************
//input
char sys_getchar() // get a char from 8251 to CPU
{
char ch;
while (((*(int *)0x6001) & 2) == 0); //check if RxRDY = 1, then receive
ch = (char)((*(int *)0x6000) & 0xFF);
if (ch == (char)10) // ch is "enter"(new line)
sys_putchar(ch);
return ch;
}
char sys_get8bit()
{
char ch;
while (((*(int *)0x6001) & 2) == 0);
ch = (char)((*(int *)0x6000) & 0xFF);
return ch;
}
int sys_gethex()
{
int num;
char ch;
ch = sys_get8bit();
num = (ch << 8);
ch = sys_get8bit();
num = (num | ch);
return num;
}
//*******************************************************************
//decode
int *const_asm;
const int asm_total = 48;
int [6]Reg;
struct TASM
{
char [6]name;
int code;
int x,y,z;
};
/*struct Tf
{
int t;
int hi;
int lo;
int sp;
int ra;
int [8]regs;
int intno;
int pc;
};
struct Env
{
struct Tf tf; //环境的“现场信息”
int env_id; //环境id
int first_run; //标记环境是否是个新环境(第一次执行)
};*/
int debug_mode;
//sys_command
void sys_command();
void uasm(int code);
const int ram_begin = 0x4000;
const int ram_end = 0x6000;
void init()
{
//初始化const_asm整数表
const_asm = < 65,68,68,83,80,51,1793,63743,65280,65535,
66,0,0,0,0,0,4096,63488,65535,65535,
66,69,81,90,0,0,9984,63743,65280,65535,
66,78,69,90,0,0,12032,63743,65280,65535,
83,76,76,0,0,0,14308,63743,65311,65507,
83,82,76,0,0,0,14310,63743,65311,65507,
83,82,65,0,0,0,14311,63743,65311,65507,
65,68,68,73,85,51,18400,63743,65311,65520,
65,68,68,73,85,0,20224,63743,65280,65535,
83,76,84,73,0,0,22272,63743,65280,65535,
83,76,84,85,73,0,24321,63743,65280,65535,
66,84,69,81,90,0,24576,65280,65535,65535,
66,84,78,69,90,0,24832,65280,65535,65535,
83,87,45,82,83,0,25089,65280,65535,65535,
65,68,68,83,80,0,25344,65280,65535,65535,
77,84,83,80,0,0,25824,65311,65535,65535,
77,79,86,69,0,0,26599,65311,65528,65535,
76,73,0,0,0,0,28417,63743,65280,65535,
67,77,80,73,0,0,30465,63743,65280,65535,
76,87,45,83,80,0,38657,63743,65280,65535,
76,87,0,0,0,0,40929,63743,65311,65504,
83,87,45,83,80,0,55041,63743,65280,65535,
83,87,0,0,0,0,57313,63743,65311,65504,
65,68,68,85,0,0,59389,63743,65311,65507,
83,85,66,85,0,0,59391,63743,65311,65507,
74,82,0,0,0,0,61184,63743,65535,65535,
77,70,72,73,0,0,61200,63743,65535,65535,
77,70,76,79,0,0,61202,63743,65535,65535,
77,70,80,67,0,0,61248,63743,65535,65535,
83,76,84,0,0,0,61410,63743,65311,65535,
83,76,84,85,0,0,61411,63743,65311,65535,
83,76,76,86,0,0,61412,63743,65311,65535,
83,82,76,86,0,0,61414,63743,65311,65535,
83,82,65,86,0,0,61415,63743,65311,65535,
67,77,80,0,0,0,61418,63743,65311,65535,
78,69,71,0,0,0,61419,63743,65311,65535,
65,78,68,0,0,0,61420,63743,65311,65535,
79,82,0,0,0,0,61421,63743,65311,65535,
88,79,82,0,0,0,61422,63743,65311,65535,
78,79,84,0,0,0,61423,63743,65311,65535,
77,85,76,84,0,0,61432,63743,65311,65535,
77,85,76,84,85,0,61433,63743,65311,65535,
68,73,86,0,0,0,61434,63743,65311,65535,
68,73,86,85,0,0,61435,63743,65311,65535,
78,79,80,0,0,0,2048,65535,65535,65535,
73,78,84,0,0,0,63489,65520,65535,65535,
77,70,73,72,0,0,63232,63743,65535,65535,
77,84,73,72,0,0,63233,63743,65535,65535
>;
}
//*******************************************************************
//uasm
void uasm(int code) //反汇编
{
struct TASM *p;
p = (struct TASM *)const_asm;
int i, j, k;
for (i=0;i<asm_total;i++)
{
j = ((*p).code & (*p).x & (*p).y & (*p).z);
k = (code & (*p).x & (*p).y & (*p).z);
if (j == k)
break;
p ++;
}
sys_puts(" <");
sys_puthex(code);
sys_puts("> ");
if (i == asm_total)
{
sys_puts(" --- UNKNOWN ---\n");
return ;
}
char *name;
name = (*p).name;
for (i=0;i<6 && name[i]!=0;i++)
sys_putchar(name[i]);
int [3]regs;
int num;
regs[0] = ~(*p).x;
regs[1] = ~(*p).y;
regs[2] = ~(*p).z;
for (i=0;i<3;i++)
{
if (regs[i] != 0)
{
k = (regs[i] & (*p).code);
num = (regs[i] & code);
if (regs[i] == k)
{
sys_puts(" R");
while ((regs[i] & 1) == 0)
{
num = (num >> 1);
regs[i] = (regs[i] >> 1);
}
sys_putchar((char)(num+48));
}
else if (k == 0)
{
sys_putchar(' ');
while ((regs[i] & 1) == 0)
{
num = (num >> 1);
regs[i] = (regs[i] >> 1);
}
j = ~regs[i];
if ((num & (j >> 1)) != 0)
num = (num | j);
sys_puthex(num);
}
else
{
sys_putchar(' ');
while ((regs[i] & 1) == 0)
{
num = (num >> 1);
regs[i] = (regs[i] >> 1);
}
sys_puthex(num);
}
}
}
sys_putchar('\n');
}
int get_value(char *s,int *error) //将一个以字符串形式表示的数(十六进制)转换成整数形式,空串或形式有误都会使error = 1
{
if (s[0] == 0)
{
*error = 1;
return 0xFFFF;
}
int i, value;
value = 0;
char ch;
*error = 0;
for (i=0;*(s+i)!=0;i++)
{
ch = s[i];
value = (value << 4);
if (ch<='9' && ch>='0')
value = (value | (ch-'0'));
else if (ch<='f' && ch>='a')
value = (value | (ch-'W'));
else if (ch<='F' && ch>='A')
value = (value | (ch-'7'));
else
{
*error = 1;
return 0xFFFF;
}
}
return value;
}
int strlen(char *s)
{
int len;
len = 0;
while (s[len] != 0) len ++;
return len;
}
int asm(int argc,char **argv) //将MIPS指令转换为二进制编码
{
int i, j, k, code, len, value, error;
struct TASM *p;
char *s;
value = get_value(argv[0],&error);
if (error == 0)
{
if (strlen(argv[0]) > 4)
{
return 0xFFFF;
}
return value;
}
p = (struct TASM *)const_asm;
for (i=0;i<asm_total;i++)
{
s = (*p).name;
k = 0;
while (k < 6 && s[k] != 0) k ++;
if (k == strlen(argv[0]))
{
for (j=0;j<k;j++)
{
if (s[j] != argv[0][j] && (s[j]+32) != argv[0][j])
break;
}
if (j == k)
break ;
}
p ++;
}
if ((code = i) == asm_total) //没有找到相应的指令,报错
{
sys_puts("error 322");
return 0xFFFF;
}
code = (*p).code;
int [3]regs;
regs[0] = ~(*p).x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -