📝 update scripts

This commit is contained in:
ValKmjolnir
2023-11-16 23:19:03 +08:00
parent a03739ebb2
commit 28a42346b7
72 changed files with 1285 additions and 1237 deletions
+40 -38
View File
@@ -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;