forked from xxq250/Nasal-Interpreter
📝 update scripts
This commit is contained in:
+40
-38
@@ -1,3 +1,5 @@
|
||||
use std.bits;
|
||||
|
||||
var inst={
|
||||
inst_stop:0,
|
||||
inst_mov_reg_reg:1,
|
||||
@@ -26,24 +28,24 @@ var inst={
|
||||
inst_out:24
|
||||
};
|
||||
|
||||
var hex=func(){
|
||||
var hex = func() {
|
||||
var vec=[];
|
||||
foreach(var i;['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'])
|
||||
foreach(var j;['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'])
|
||||
append(vec,i~j);
|
||||
return func(n){
|
||||
return func(n) {
|
||||
return vec[n];
|
||||
}
|
||||
}();
|
||||
|
||||
var hex32=func(n){
|
||||
var hex32 = func(n) {
|
||||
return hex(bits.u32_and(n/math.pow(2,24),0xff))~
|
||||
hex(bits.u32_and(n/math.pow(2,16),0xff))~
|
||||
hex(bits.u32_and(n/math.pow(2,8),0xff))~
|
||||
hex(bits.u32_and(n,0xff));
|
||||
}
|
||||
|
||||
var machine=func(disk_file){
|
||||
var machine = func(disk_file) {
|
||||
|
||||
var reg=[];
|
||||
var reg_size=32;
|
||||
@@ -51,7 +53,7 @@ var pc=0;
|
||||
var ir=[0,0,0,0]; # 32 bit instruction word
|
||||
var mem=[];
|
||||
var mem_size=1024*1024*4; # memory size, byte
|
||||
var init=func(){
|
||||
var init = func() {
|
||||
println("[",os.time(),"] init ",reg_size," registers.");
|
||||
setsize(reg,reg_size); # 8 bit address wire
|
||||
for(var i=0;i<reg_size;i+=1)
|
||||
@@ -63,7 +65,7 @@ var init=func(){
|
||||
println("[",os.time(),"] init completed.");
|
||||
}
|
||||
init();
|
||||
var load=func(){
|
||||
var load = func() {
|
||||
var vec=split(" ",disk_file);
|
||||
println("[",os.time(),"] loading boot from disk: ",size(vec)," byte.");
|
||||
forindex(var i;vec)
|
||||
@@ -71,77 +73,77 @@ var load=func(){
|
||||
println("[",os.time(),"] loading complete.");
|
||||
}
|
||||
load();
|
||||
var ctx_info=func(){
|
||||
var ctx_info = func() {
|
||||
var cnt=0;
|
||||
println("pc : 0x",hex32(pc));
|
||||
println("instr : 0x",hex(ir[0]),hex(ir[1]),hex(ir[2]),hex(ir[3]));
|
||||
for(var i=0;i<reg_size;i+=1){
|
||||
for(var i=0;i<reg_size;i+=1) {
|
||||
print("reg[",hex(i),"]: 0x",hex32(reg[i])," ");
|
||||
if(cnt==3){
|
||||
if (cnt==3) {
|
||||
print("\n");
|
||||
cnt=0;
|
||||
}else{
|
||||
} else {
|
||||
cnt+=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
var exec=func(info=1){
|
||||
var exec = func(info=1) {
|
||||
println("[",os.time(),"] executing ...");
|
||||
while(1){
|
||||
while(1) {
|
||||
ir=[mem[pc],mem[pc+1],mem[pc+2],mem[pc+3]];
|
||||
if(info)ctx_info();
|
||||
if (info)ctx_info();
|
||||
var op=ir[0];
|
||||
if(op==inst.inst_stop){
|
||||
if (op==inst.inst_stop) {
|
||||
break;
|
||||
}elsif(op==inst.inst_mov_reg_reg){
|
||||
} elsif (op==inst.inst_mov_reg_reg) {
|
||||
reg[ir[1]]=reg[ir[2]];
|
||||
}elsif(op==inst.inst_mov_reg_imm_low){
|
||||
} elsif (op==inst.inst_mov_reg_imm_low) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[1]],0xffff0000);
|
||||
reg[ir[1]]=bits.u32_or(reg[ir[1]],ir[2]*math.pow(2,8)+ir[3]);
|
||||
}elsif(op==inst.inst_mov_reg_imm_high){
|
||||
} elsif (op==inst.inst_mov_reg_imm_high) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[1]],0x0000ffff);
|
||||
reg[ir[1]]=bits.u32_or(reg[ir[1]],ir[2]*math.pow(2,24)+ir[3]*math.pow(2,16));
|
||||
}elsif(op==inst.inst_add){
|
||||
} elsif (op==inst.inst_add) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]+reg[ir[3]],0xffffffff);
|
||||
}elsif(op==inst.inst_sub){
|
||||
} elsif (op==inst.inst_sub) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]-reg[ir[3]],0xffffffff);
|
||||
}elsif(op==inst.inst_mult){
|
||||
} elsif (op==inst.inst_mult) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]*reg[ir[3]],0xffffffff);
|
||||
}elsif(op==inst.inst_div){
|
||||
} elsif (op==inst.inst_div) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]/reg[ir[3]],0xffffffff);
|
||||
}elsif(op==inst.inst_and){
|
||||
} elsif (op==inst.inst_and) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]],reg[ir[3]]);
|
||||
}elsif(op==inst.inst_or){
|
||||
} elsif (op==inst.inst_or) {
|
||||
reg[ir[1]]=bits.u32_or(reg[ir[2]],reg[ir[3]]);
|
||||
}elsif(op==inst.inst_xor){
|
||||
} elsif (op==inst.inst_xor) {
|
||||
reg[ir[1]]=bits.u32_xor(reg[ir[2]],reg[ir[3]]);
|
||||
}elsif(op==inst.inst_not){
|
||||
} elsif (op==inst.inst_not) {
|
||||
reg[ir[1]]=bits.u32_not(reg[ir[2]]);
|
||||
}elsif(op==inst.inst_nand){
|
||||
} elsif (op==inst.inst_nand) {
|
||||
reg[ir[1]]=bits.u32_nand(reg[ir[2]],reg[ir[3]]);
|
||||
}elsif(op==inst.inst_shl){
|
||||
} elsif (op==inst.inst_shl) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]*math.pow(2,reg[ir[3]]),0xffffffff);
|
||||
}elsif(op==inst.inst_shr){
|
||||
} elsif (op==inst.inst_shr) {
|
||||
reg[ir[1]]=bits.u32_and(reg[ir[2]]/math.pow(2,reg[ir[3]]),0xffffffff);
|
||||
}elsif(op==inst.inst_jmp){
|
||||
} elsif (op==inst.inst_jmp) {
|
||||
pc=reg[ir[1]];
|
||||
}elsif(op==inst.inst_jt){
|
||||
} elsif (op==inst.inst_jt) {
|
||||
pc=reg[ir[1]]?reg[ir[2]]:pc;
|
||||
}elsif(op==inst.inst_jf){
|
||||
} elsif (op==inst.inst_jf) {
|
||||
pc=reg[ir[1]]?pc:reg[ir[2]];
|
||||
}elsif(op==inst.inst_les){
|
||||
} elsif (op==inst.inst_les) {
|
||||
reg[ir[1]]=reg[ir[2]]<reg[ir[3]];
|
||||
}elsif(op==inst.inst_grt){
|
||||
} elsif (op==inst.inst_grt) {
|
||||
reg[ir[1]]=reg[ir[2]]>reg[ir[3]];
|
||||
}elsif(op==inst.inst_leq){
|
||||
} elsif (op==inst.inst_leq) {
|
||||
reg[ir[1]]=reg[ir[2]]<=reg[ir[3]];
|
||||
}elsif(op==inst.inst_geq){
|
||||
} elsif (op==inst.inst_geq) {
|
||||
reg[ir[1]]=reg[ir[2]]>=reg[ir[3]];
|
||||
}elsif(op==inst.inst_eq){
|
||||
} elsif (op==inst.inst_eq) {
|
||||
reg[ir[1]]=reg[ir[2]]==reg[ir[3]];
|
||||
}elsif(op==inst.inst_in){
|
||||
} elsif (op==inst.inst_in) {
|
||||
reg[0]=0; # unfinished
|
||||
}elsif(op==inst.inst_out){
|
||||
} elsif (op==inst.inst_out) {
|
||||
println("reg[",ir[1],"]: 0x",hex32(reg[ir[1]]));
|
||||
}
|
||||
pc+=4;
|
||||
|
||||
Reference in New Issue
Block a user