Cleaned up code

This commit is contained in:
JJ Bliss
2026-05-07 16:01:38 -04:00
parent 752102d0b6
commit 1831a1fee5
3 changed files with 513 additions and 618 deletions
+5 -6
View File
@@ -7,10 +7,7 @@ LIBS != pkg-config --libs-only-l --libs-only-L sdl3 sdl3-image
HARE_SOURCES != find . -name '*.ha' HARE_SOURCES != find . -name '*.ha'
build: build/meadow build: build/meadow build/meadowcli
run: build
build/meadow monospace.rom
build/meadow: $(HARE_SOURCES) build/meadow: $(HARE_SOURCES)
hare build $(LIBS) -o build/meadow cmd/meadow hare build $(LIBS) -o build/meadow cmd/meadow
@@ -18,5 +15,7 @@ build/meadow: $(HARE_SOURCES)
build/meadowcli: $(HARE_SOURCES) build/meadowcli: $(HARE_SOURCES)
hare build -o build/meadowcli cmd/meadowcli hare build -o build/meadowcli cmd/meadowcli
cli: build/meadowcli install: build/meadow
build/meadowcli factor.rom cp ./build/meadow ~/.local/bin/
uninstall:
rm ~/.local/bin/meadow
+1 -1
View File
@@ -54,7 +54,7 @@ export fn main() void = {
let run = true; let run = true;
let ev = sdl3::Event { ... }; let ev = sdl3::Event { ... };
if(len(os::args) < 2){ if(len(os::args) < 2){
fmt::printf("usage: %s file.rom [args..]\n")!; fmt::printf("usage: meadow file.rom [args..]\n")!;
return; return;
}; };
let path = os::args[1]; let path = os::args[1];
+3 -107
View File
@@ -8,12 +8,6 @@ use time;
use time::date; use time::date;
use strings; use strings;
// let console_vector: u16 = 0;
// let ram: [0x10000] u8 = [0...];
// let dev: [0x100] u8 = [0...];
// let ptr: [2] u8 = [0...];
// let stk: [2][0x100] u8 = [[0...],[0...]];
export type uxn = struct { export type uxn = struct {
pc: u16, pc: u16,
console_vector: u16, console_vector: u16,
@@ -163,13 +157,11 @@ fn emu_dei(port: u8, state: *uxn) u8 = {
return if(zone.dst) {yield 1;} else {yield 0;}; //TODO this isn't tested return if(zone.dst) {yield 1;} else {yield 0;}; //TODO this isn't tested
case => case =>
return state.dev[port]; return state.dev[port];
// fmt::printfln("Read {:x} from port {:x}", val, port)!;
}; };
}; };
export fn emu_deo(port: u8, value: u8, state: *uxn) void = { export fn emu_deo(port: u8, value: u8, state: *uxn) void = {
// fmt::printfln("Writing {:x} to port {:x}", value, port)!;
state.dev[port] = value; state.dev[port] = value;
switch(port) { switch(port) {
case 0x03 => case 0x03 =>
@@ -187,7 +179,6 @@ export fn emu_deo(port: u8, value: u8, state: *uxn) void = {
const high = state.dev[0x10]; const high = state.dev[0x10];
const low = value; const low = value;
state.console_vector = short_from_bytes(high,low); state.console_vector = short_from_bytes(high,low);
// fmt::printfln("Setting console_vector to: {:x}", console_vector)!;
case 0x18 => case 0x18 =>
fmt::print(value: rune)!; fmt::print(value: rune)!;
case 0x19 => case 0x19 =>
@@ -254,7 +245,7 @@ fn deo_expansion(addr: u16, state: *uxn) void = {
const bank = short_from_bytes(state.ram[addr+3],state.ram[addr+4]): u32; const bank = short_from_bytes(state.ram[addr+3],state.ram[addr+4]): u32;
const dstaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32; const dstaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32;
const value = state.ram[addr+7]; const value = state.ram[addr+7];
fmt::printfln("expansion fill: bank: {:x} addr: {:x} value: {:x} | length: {:x}",bank,dstaddr,value,length)!; // fmt::printfln("expansion fill: bank: {:x} addr: {:x} value: {:x} | length: {:x}",bank,dstaddr,value,length)!;
if(bank < numbanks) for(let i: u16 =0; i < length; i+=1){ if(bank < numbanks) for(let i: u16 =0; i < length; i+=1){
state.ram[bank * banksize + dstaddr + i] = value; state.ram[bank * banksize + dstaddr + i] = value;
}; };
@@ -263,7 +254,7 @@ fn deo_expansion(addr: u16, state: *uxn) void = {
const srcaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32; const srcaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32;
const dstbank = short_from_bytes(state.ram[addr+7],state.ram[addr+8]): u32; const dstbank = short_from_bytes(state.ram[addr+7],state.ram[addr+8]): u32;
const dstaddr = short_from_bytes(state.ram[addr+9],state.ram[addr+10]): u32; const dstaddr = short_from_bytes(state.ram[addr+9],state.ram[addr+10]): u32;
fmt::printfln("Cpyl: src: {:x} <-> {:x} dst: {:x} <-> {:x} | length: {:x}",srcbank,srcaddr,dstbank,dstaddr,length)!; // fmt::printfln("Cpyl: src: {:x} <-> {:x} dst: {:x} <-> {:x} | length: {:x}",srcbank,srcaddr,dstbank,dstaddr,length)!;
if(srcbank < numbanks && dstbank < numbanks) for(let i: u16 =0; i < length; i+=1){ if(srcbank < numbanks && dstbank < numbanks) for(let i: u16 =0; i < length; i+=1){
const readval = state.ram[srcbank * banksize + srcaddr + i]; const readval = state.ram[srcbank * banksize + srcaddr + i];
state.ram[dstbank * banksize + dstaddr + i] = readval; state.ram[dstbank * banksize + dstaddr + i] = readval;
@@ -273,7 +264,7 @@ fn deo_expansion(addr: u16, state: *uxn) void = {
const srcaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32; const srcaddr = short_from_bytes(state.ram[addr+5],state.ram[addr+6]): u32;
const dstbank = short_from_bytes(state.ram[addr+7],state.ram[addr+8]): u32; const dstbank = short_from_bytes(state.ram[addr+7],state.ram[addr+8]): u32;
const dstaddr = short_from_bytes(state.ram[addr+9],state.ram[addr+10]): u32; const dstaddr = short_from_bytes(state.ram[addr+9],state.ram[addr+10]): u32;
fmt::printfln("Cpyr: src: {:x} <-> {:x} dst: {:x} <-> {:x} | length: {:x}",srcbank,srcaddr,dstbank,dstaddr,length)!; // fmt::printfln("Cpyr: src: {:x} <-> {:x} dst: {:x} <-> {:x} | length: {:x}",srcbank,srcaddr,dstbank,dstaddr,length)!;
if(srcbank < numbanks && dstbank < numbanks) for(let i: u16 =1; i <= length; i+=1){ if(srcbank < numbanks && dstbank < numbanks) for(let i: u16 =1; i <= length; i+=1){
const readval = state.ram[srcbank * banksize + srcaddr + length - i]; const readval = state.ram[srcbank * banksize + srcaddr + length - i];
state.ram[dstbank * banksize + dstaddr + length - i] = readval; state.ram[dstbank * banksize + dstaddr + length - i] = readval;
@@ -393,7 +384,6 @@ fn get_instruction(byte: u8) (instruction | error) = {
return JSR {short = s, keep = k, ret = r}; return JSR {short = s, keep = k, ret = r};
case 0x0f => case 0x0f =>
return STH {short = s, keep = k, ret = r}; return STH {short = s, keep = k, ret = r};
case 0x10 => case 0x10 =>
return LDZ {short = s, keep = k, ret = r}; return LDZ {short = s, keep = k, ret = r};
case 0x11 => case 0x11 =>
@@ -488,7 +478,6 @@ fn read_from_zaddr(short: bool, zaddr: u8, state: *uxn) (u8 | u16) = {
const high = state.ram[zaddr: u16]; const high = state.ram[zaddr: u16];
const low = state.ram[(zaddr+1): u16]; const low = state.ram[(zaddr+1): u16];
return short_from_bytes(high,low); return short_from_bytes(high,low);
case false => case false =>
return state.ram[zaddr: u16]; return state.ram[zaddr: u16];
}; };
@@ -500,7 +489,6 @@ fn write_to_zaddr(value: (u8 | u16), zaddr: u8, state: *uxn) void = {
let low = s: u8; let low = s: u8;
state.ram[zaddr: u16] = high; state.ram[zaddr: u16] = high;
state.ram[(zaddr+1): u16] = low; state.ram[(zaddr+1): u16] = low;
case let b: u8 => case let b: u8 =>
state.ram[zaddr: u16] = b; state.ram[zaddr: u16] = b;
}; };
@@ -635,12 +623,10 @@ export fn uxn_step(state: *uxn) (done | error) = {
state.pc += 1; //TODO verify all pc changes state.pc += 1; //TODO verify all pc changes
match(inst) { match(inst) {
// /* BRK */ case 0x00: return 1;
case BRK => case BRK =>
// fmt::println("Break!")!; // fmt::println("Break!")!;
state.running = false; state.running = false;
return done; return done;
// /* JCI */ case 0x20: if(DEC(0)) { IMM state.pc += a; } else pc += 2; break;
case JCI => case JCI =>
const val: u8 = pop_from_stack(false, false, false, state): u8; const val: u8 = pop_from_stack(false, false, false, state): u8;
if(val != 0) { if(val != 0) {
@@ -648,15 +634,11 @@ export fn uxn_step(state: *uxn) (done | error) = {
}else{ }else{
state.pc += 2; state.pc += 2;
}; };
// /* JMI */ case 0x40: IMM pc += a; break;
case JMI => case JMI =>
state.pc = state.pc + 2 + short_from_bytes(state.ram[state.pc],state.ram[state.pc+1]); //TODO is this signed? state.pc = state.pc + 2 + short_from_bytes(state.ram[state.pc],state.ram[state.pc+1]); //TODO is this signed?
// /* JSI */ case 0x60: IMM PUx(pc, 1, 1) pc += a; break;
case JSI => case JSI =>
push_to_stack(true, state.pc + 2, state); push_to_stack(true, state.pc + 2, state);
state.pc = state.pc + 2 + short_from_bytes(state.ram[state.pc],state.ram[state.pc+1]); //TODO is this signed? state.pc = state.pc + 2 + short_from_bytes(state.ram[state.pc],state.ram[state.pc+1]); //TODO is this signed?
// /* LIT */ case 0x80: INC(0) = ram[pc++]; break;
case let lit_inst: LIT => case let lit_inst: LIT =>
push_to_stack(lit_inst.ret, state.ram[state.pc], state); push_to_stack(lit_inst.ret, state.ram[state.pc], state);
state.pc = state.pc + 1; state.pc = state.pc + 1;
@@ -664,7 +646,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
push_to_stack(lit_inst.ret, state.ram[state.pc],state); push_to_stack(lit_inst.ret, state.ram[state.pc],state);
state.pc = state.pc + 1; state.pc = state.pc + 1;
}; };
// /* INC */ OPC(0x01,POx(a,d),PUx(a + 1,d,r))
case let inc_inst: INC => case let inc_inst: INC =>
const val = match(pop_from_stack(inc_inst.keep,inc_inst.ret,inc_inst.short,state)) { const val = match(pop_from_stack(inc_inst.keep,inc_inst.ret,inc_inst.short,state)) {
//TODO this whole match statement seems unnecessary //TODO this whole match statement seems unnecessary
@@ -675,24 +656,20 @@ export fn uxn_step(state: *uxn) (done | error) = {
}; };
push_to_stack(inc_inst.ret,val,state); push_to_stack(inc_inst.ret,val,state);
// /* POP */ OPC(0x02,ptr[r] -= 1 + d;,{})
case let pop_inst: POP => case let pop_inst: POP =>
if(!pop_inst.keep){ if(!pop_inst.keep){
pop_from_stack(false,pop_inst.ret,pop_inst.short,state); pop_from_stack(false,pop_inst.ret,pop_inst.short,state);
}; };
// /* NIP */ OPC(0x03,GOT(x) ptr[r] -= 1 + d;,PUT(x,r))
case let nip_inst: NIP => case let nip_inst: NIP =>
const top = pop_or_get(nip_inst,0,state); const top = pop_or_get(nip_inst,0,state);
const bot = pop_or_get(nip_inst,1,state); const bot = pop_or_get(nip_inst,1,state);
push_to_stack(nip_inst.ret, top, state); push_to_stack(nip_inst.ret, top, state);
// /* SWP */ OPC(0x04,GOT(x) GOT(y),PUT(x,r) PUT(y,r))
case let swp_inst: SWP => case let swp_inst: SWP =>
const top = pop_or_get(swp_inst,0,state); const top = pop_or_get(swp_inst,0,state);
const bot = pop_or_get(swp_inst,1,state); const bot = pop_or_get(swp_inst,1,state);
push_to_stack(swp_inst.ret, top, state); push_to_stack(swp_inst.ret, top, state);
push_to_stack(swp_inst.ret, bot, state); push_to_stack(swp_inst.ret, bot, state);
// /* ROT */ OPC(0x05,GOT(x) GOT(y) GOT(z),PUT(y,r) PUT(x,r) PUT(z,r))
case let rot_inst: ROT => case let rot_inst: ROT =>
const top = pop_or_get(rot_inst,0,state); const top = pop_or_get(rot_inst,0,state);
const mid = pop_or_get(rot_inst,1,state); const mid = pop_or_get(rot_inst,1,state);
@@ -701,12 +678,10 @@ export fn uxn_step(state: *uxn) (done | error) = {
push_to_stack(rot_inst.ret, mid, state); push_to_stack(rot_inst.ret, mid, state);
push_to_stack(rot_inst.ret, top, state); push_to_stack(rot_inst.ret, top, state);
push_to_stack(rot_inst.ret, bot, state); push_to_stack(rot_inst.ret, bot, state);
// /* DUP */ OPC(0x06,GOT(x),PUT(x,r) PUT(x,r))
case let dup_inst: DUP => case let dup_inst: DUP =>
const val = pop_from_stack(dup_inst.keep, dup_inst.ret, dup_inst.short, state); const val = pop_from_stack(dup_inst.keep, dup_inst.ret, dup_inst.short, state);
push_to_stack(dup_inst.ret, val, state); push_to_stack(dup_inst.ret, val, state);
push_to_stack(dup_inst.ret, val, state); push_to_stack(dup_inst.ret, val, state);
// /* OVR */ OPC(0x07,GOT(x) GOT(y),PUT(y,r) PUT(x,r) PUT(y,r))
case let ovr_inst: OVR => case let ovr_inst: OVR =>
const top = pop_or_get(ovr_inst,0,state); const top = pop_or_get(ovr_inst,0,state);
const bot = pop_or_get(ovr_inst,1,state); const bot = pop_or_get(ovr_inst,1,state);
@@ -714,7 +689,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
push_to_stack(ovr_inst.ret, bot, state); push_to_stack(ovr_inst.ret, bot, state);
push_to_stack(ovr_inst.ret, top, state); push_to_stack(ovr_inst.ret, top, state);
push_to_stack(ovr_inst.ret, bot, state); push_to_stack(ovr_inst.ret, bot, state);
// /* EQU */ OPC(0x08,POx(a,d) POx(b,d),PUx(b == a,0,r))
case let equ_inst: EQU => case let equ_inst: EQU =>
const top = pop_or_get(equ_inst,0,state); const top = pop_or_get(equ_inst,0,state);
const bot = pop_or_get(equ_inst,1,state); const bot = pop_or_get(equ_inst,1,state);
@@ -725,21 +699,7 @@ export fn uxn_step(state: *uxn) (done | error) = {
} else { } else {
yield 0; yield 0;
}; };
// let val: u8 = if(!equ_inst.short){
// yield if(bot: u8 == top: u8){
// yield 1;
// } else {
// yield 0;
// };
// } else {
// yield if(bot: u16 == top: u16){
// yield 1;
// } else {
// yield 0;
// };
// };
push_to_stack(equ_inst.ret, val, state); push_to_stack(equ_inst.ret, val, state);
// /* NEQ */ OPC(0x09,POx(a,d) POx(b,d),PUx(b != a,0,r))
case let neq_inst: NEQ => case let neq_inst: NEQ =>
const top = pop_or_get(neq_inst,0,state); const top = pop_or_get(neq_inst,0,state);
const bot = pop_or_get(neq_inst,1,state); const bot = pop_or_get(neq_inst,1,state);
@@ -750,21 +710,7 @@ export fn uxn_step(state: *uxn) (done | error) = {
} else { } else {
yield 0; yield 0;
}; };
// let val: u8 = if(!neq_inst.short){
// yield if(bot: u8 != top: u8){
// yield 1;
// } else {
// yield 0;
// };
// } else {
// yield if(bot: u16 != top: u16){
// yield 1;
// } else {
// yield 0;
// };
// };
push_to_stack(neq_inst.ret, val, state); push_to_stack(neq_inst.ret, val, state);
// /* GTH */ OPC(0x0a,POx(a,d) POx(b,d),PUx(b > a,0,r))
case let gth_inst: GTH => case let gth_inst: GTH =>
const top = pop_or_get(gth_inst,0,state); const top = pop_or_get(gth_inst,0,state);
const bot = pop_or_get(gth_inst,1,state); const bot = pop_or_get(gth_inst,1,state);
@@ -775,21 +721,7 @@ export fn uxn_step(state: *uxn) (done | error) = {
} else { } else {
yield 0; yield 0;
}; };
// let val: u8 = if(!gth_inst.short){
// yield if(bot: u8 > top: u8){
// yield 1;
// } else {
// yield 0;
// };
// } else {
// yield if(bot: u16 > top: u16){
// yield 1;
// } else {
// yield 0;
// };
// };
push_to_stack(gth_inst.ret, val, state); push_to_stack(gth_inst.ret, val, state);
// /* LTH */ OPC(0x0b,POx(a,d) POx(b,d),PUx(b < a,0,r))
case let lth_inst: LTH => case let lth_inst: LTH =>
const top = pop_or_get(lth_inst,0,state); const top = pop_or_get(lth_inst,0,state);
const bot = pop_or_get(lth_inst,1,state); const bot = pop_or_get(lth_inst,1,state);
@@ -800,21 +732,7 @@ export fn uxn_step(state: *uxn) (done | error) = {
} else { } else {
yield 0; yield 0;
}; };
// let val: u8 = if(!lth_inst.short){
// yield if(bot: u8 < top: u8){
// yield 1;
// } else {
// yield 0;
// };
// } else {
// yield if(bot: u16 < top: u16){
// yield 1;
// } else {
// yield 0;
// };
// };
push_to_stack(lth_inst.ret, val, state); push_to_stack(lth_inst.ret, val, state);
// /* JMP */ OPC(0x0c,POx(a,d),MOV)
case let jmp_inst: JMP => case let jmp_inst: JMP =>
const addr = pop_or_get(jmp_inst,0,state); const addr = pop_or_get(jmp_inst,0,state);
match(addr) { match(addr) {
@@ -825,8 +743,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
case let s: u16 => case let s: u16 =>
state.pc = s; state.pc = s;
}; };
// /* JCN */ OPC(0x0d,POx(a,d) POx(b,0),if(b) MOV)
case let jcn_inst: JCN => case let jcn_inst: JCN =>
const addr = pop_or_get(jcn_inst,0,state); const addr = pop_or_get(jcn_inst,0,state);
const cond: u8 = pop_or_peek(normal_op {keep = jcn_inst.keep, const cond: u8 = pop_or_peek(normal_op {keep = jcn_inst.keep,
@@ -842,7 +758,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
state.pc = s; state.pc = s;
}; };
}; };
// /* JSR */ OPC(0x0e,POx(a,d),PUx(pc,1,!r) MOV)
case let jsr_inst: JSR => case let jsr_inst: JSR =>
let addr = pop_or_get(jsr_inst,0,state); let addr = pop_or_get(jsr_inst,0,state);
push_to_stack(true, state.pc, state); push_to_stack(true, state.pc, state);
@@ -854,45 +769,36 @@ export fn uxn_step(state: *uxn) (done | error) = {
state.pc = s; state.pc = s;
}; };
// /* STH */ OPC(0x0f,GOT(x),PUT(x,!r))
case let sth_inst: STH => case let sth_inst: STH =>
const val = pop_from_stack(sth_inst.keep,sth_inst.ret,sth_inst.short,state); const val = pop_from_stack(sth_inst.keep,sth_inst.ret,sth_inst.short,state);
push_to_stack(!sth_inst.ret, val, state); push_to_stack(!sth_inst.ret, val, state);
// /* LDZ */ OPC(0x10,POx(a,0),PEK(a, x, 0xff))
case let ldz_inst: LDZ => case let ldz_inst: LDZ =>
let addr: u8 = pop_from_stack(ldz_inst.keep, ldz_inst.ret, false, state): u8; let addr: u8 = pop_from_stack(ldz_inst.keep, ldz_inst.ret, false, state): u8;
let val = read_from_zaddr(ldz_inst.short,addr,state); let val = read_from_zaddr(ldz_inst.short,addr,state);
push_to_stack(ldz_inst.ret, val, state); push_to_stack(ldz_inst.ret, val, state);
// /* STZ */ OPC(0x11,POx(a,0) GOT(y),POK(a, y, 0xff))
case let stz_inst: STZ => case let stz_inst: STZ =>
let addr: u8 = pop_or_peek(normal_op{short = false, keep = stz_inst.keep, ret = stz_inst.ret}, 0, state): u8; let addr: u8 = pop_or_peek(normal_op{short = false, keep = stz_inst.keep, ret = stz_inst.ret}, 0, state): u8;
let val = pop_or_peek(stz_inst,1,state); let val = pop_or_peek(stz_inst,1,state);
write_to_zaddr(val,addr,state); write_to_zaddr(val,addr,state);
// /* LDR */ OPC(0x12,POx(a,0),PEK(pc + (Sint8)a, x, 0xffff))
case let ldr_inst: LDR => case let ldr_inst: LDR =>
let reladdr = (pop_from_stack(ldr_inst.keep, ldr_inst.ret, false, state): u16): i8; let reladdr = (pop_from_stack(ldr_inst.keep, ldr_inst.ret, false, state): u16): i8;
let addr: u16 = (state.pc: u32: i32 + reladdr): u16; let addr: u16 = (state.pc: u32: i32 + reladdr): u16;
let val = read_from_addr(ldr_inst.short,addr,state); let val = read_from_addr(ldr_inst.short,addr,state);
push_to_stack(ldr_inst.ret, val, state); push_to_stack(ldr_inst.ret, val, state);
// /* STR */ OPC(0x13,POx(a,0) GOT(y),POK(pc + (Sint8)a, y, 0xffff))
case let str_inst: STR => case let str_inst: STR =>
let reladdr = (pop_or_peek(normal_op{short = false, keep = str_inst.keep, ret = str_inst.ret}, 0, state): u16 & 0x00FF): u8: i8; let reladdr = (pop_or_peek(normal_op{short = false, keep = str_inst.keep, ret = str_inst.ret}, 0, state): u16 & 0x00FF): u8: i8;
let addr: u16 = (state.pc: u32: i32 + reladdr): u16; let addr: u16 = (state.pc: u32: i32 + reladdr): u16;
let val = pop_or_peek(str_inst,1,state); let val = pop_or_peek(str_inst,1,state);
write_to_addr(val,addr,state); write_to_addr(val,addr,state);
// /* LDA */ OPC(0x14,POx(a,1),PEK(a, x, 0xffff))
case let lda_inst: LDA => case let lda_inst: LDA =>
let addr: u16 = pop_from_stack(lda_inst.keep, lda_inst.ret, true, state): u16; let addr: u16 = pop_from_stack(lda_inst.keep, lda_inst.ret, true, state): u16;
let val = read_from_addr(lda_inst.short,addr,state); let val = read_from_addr(lda_inst.short,addr,state);
push_to_stack(lda_inst.ret, val, state); push_to_stack(lda_inst.ret, val, state);
// /* STA */ OPC(0x15,POx(a,1) GOT(y),POK(a, y, 0xffff))
case let sta_inst: STA => case let sta_inst: STA =>
let addr: u16 = pop_or_peek(normal_op{short = true, keep = sta_inst.keep, ret = sta_inst.ret}, 0, state): u16 ; let addr: u16 = pop_or_peek(normal_op{short = true, keep = sta_inst.keep, ret = sta_inst.ret}, 0, state): u16 ;
let val = pop_or_peek(sta_inst,2,state); let val = pop_or_peek(sta_inst,2,state);
write_to_addr(val,addr,state); write_to_addr(val,addr,state);
// /* DEI */ OPC(0x16,POx(a,0),DEI(a, x))
case let dei_inst: DEI => case let dei_inst: DEI =>
// fmt::println("DEI Instruction")!;
let port: u8 = pop_from_stack(dei_inst.keep, dei_inst.ret, false, state): u8; let port: u8 = pop_from_stack(dei_inst.keep, dei_inst.ret, false, state): u8;
let val = if(dei_inst.short){ let val = if(dei_inst.short){
yield short_from_bytes(emu_dei(port,state),emu_dei(port+1,state)); yield short_from_bytes(emu_dei(port,state),emu_dei(port+1,state));
@@ -900,7 +806,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield emu_dei(port,state); yield emu_dei(port,state);
}; };
push_to_stack(dei_inst.ret,val,state); push_to_stack(dei_inst.ret,val,state);
// /* DEO */ OPC(0x17,POx(a,0) GOT(y),DEO(a, y))
case let deo_inst: DEO => case let deo_inst: DEO =>
const port: u8 = pop_or_get(normal_op{short = false, keep = deo_inst.keep, ret = deo_inst.ret}, 0, state): u8; const port: u8 = pop_or_get(normal_op{short = false, keep = deo_inst.keep, ret = deo_inst.ret}, 0, state): u8;
const val = pop_or_peek(deo_inst,1,state); const val = pop_or_peek(deo_inst,1,state);
@@ -913,18 +818,15 @@ export fn uxn_step(state: *uxn) (done | error) = {
case let b: u8 => case let b: u8 =>
emu_deo(port,b,state); emu_deo(port,b,state);
}; };
// /* ADD */ OPC(0x18,POx(a,d) POx(b,d),PUx(b + a, d,r))
case let add_inst: ADD => case let add_inst: ADD =>
let top = pop_or_get(add_inst,0,state); let top = pop_or_get(add_inst,0,state);
let bot = pop_or_get(add_inst,1,state); let bot = pop_or_get(add_inst,1,state);
let res = if(!add_inst.short){ let res = if(!add_inst.short){
yield (top: u8 + bot: u8); yield (top: u8 + bot: u8);
} else { } else {
// fmt::printfln("ADD2 0x{:x} + 0x{:x} = 0x{:x}",bot,top,top: u16 + bot: u16)!;
yield (top: u16 + bot: u16); yield (top: u16 + bot: u16);
}; };
push_to_stack(add_inst.ret, res, state); push_to_stack(add_inst.ret, res, state);
// /* SUB */ OPC(0x19,POx(a,d) POx(b,d),PUx(b - a, d,r))
case let sub_inst: SUB => case let sub_inst: SUB =>
let top = pop_or_get(sub_inst,0,state); let top = pop_or_get(sub_inst,0,state);
let bot = pop_or_get(sub_inst,1,state); let bot = pop_or_get(sub_inst,1,state);
@@ -934,7 +836,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 - top: u16); yield (bot: u16 - top: u16);
}; };
push_to_stack(sub_inst.ret, res, state); push_to_stack(sub_inst.ret, res, state);
// /* MUL */ OPC(0x1a,POx(a,d) POx(b,d),PUx(b * a, d,r))
case let mul_inst: MUL => case let mul_inst: MUL =>
let top = pop_or_get(mul_inst,0,state); let top = pop_or_get(mul_inst,0,state);
let bot = pop_or_get(mul_inst,1,state); let bot = pop_or_get(mul_inst,1,state);
@@ -944,7 +845,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 * top: u16); yield (bot: u16 * top: u16);
}; };
push_to_stack(mul_inst.ret, res, state); push_to_stack(mul_inst.ret, res, state);
// /* DIV */ OPC(0x1b,POx(a,d) POx(b,d),PUx(a ? b / a : 0, d,r))
case let div_inst: DIV => case let div_inst: DIV =>
let top = pop_or_get(div_inst,0,state); let top = pop_or_get(div_inst,0,state);
let bot = pop_or_get(div_inst,1,state); let bot = pop_or_get(div_inst,1,state);
@@ -961,7 +861,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 / top: u16): u16; yield (bot: u16 / top: u16): u16;
};//TODO handle rounding and edge cases with division };//TODO handle rounding and edge cases with division
push_to_stack(div_inst.ret, res, state); push_to_stack(div_inst.ret, res, state);
// /* AND */ OPC(0x1c,POx(a,d) POx(b,d),PUx(b & a, d,r))
case let and_inst: AND => case let and_inst: AND =>
let top = pop_or_get(and_inst,0,state); let top = pop_or_get(and_inst,0,state);
let bot = pop_or_get(and_inst,1,state); let bot = pop_or_get(and_inst,1,state);
@@ -971,7 +870,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 & top: u16); yield (bot: u16 & top: u16);
}; };
push_to_stack(and_inst.ret, res, state); push_to_stack(and_inst.ret, res, state);
// /* ORA */ OPC(0x1d,POx(a,d) POx(b,d),PUx(b | a, d,r))
case let ora_inst: ORA => case let ora_inst: ORA =>
let top = pop_or_get(ora_inst,0,state); let top = pop_or_get(ora_inst,0,state);
let bot = pop_or_get(ora_inst,1,state); let bot = pop_or_get(ora_inst,1,state);
@@ -981,7 +879,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 | top: u16); yield (bot: u16 | top: u16);
}; };
push_to_stack(ora_inst.ret, res, state); push_to_stack(ora_inst.ret, res, state);
// /* EOR */ OPC(0x1e,POx(a,d) POx(b,d),PUx(b ^ a, d,r))
case let eor_inst: EOR => case let eor_inst: EOR =>
let top = pop_or_get(eor_inst,0,state); let top = pop_or_get(eor_inst,0,state);
let bot = pop_or_get(eor_inst,1,state); let bot = pop_or_get(eor_inst,1,state);
@@ -991,7 +888,6 @@ export fn uxn_step(state: *uxn) (done | error) = {
yield (bot: u16 ^ top: u16); yield (bot: u16 ^ top: u16);
}; };
push_to_stack(eor_inst.ret, res, state); push_to_stack(eor_inst.ret, res, state);
// /* SFT */ OPC(0x1f,POx(a,0) POx(b,d),PUx(b >> (a & 0xf) << (a >> 4), d,r))
case let sft_inst: SFT => case let sft_inst: SFT =>
let shifts: u8 = pop_or_peek(normal_op{short = false, keep = sft_inst.keep, ret = sft_inst.ret}, 0, state): u8; let shifts: u8 = pop_or_peek(normal_op{short = false, keep = sft_inst.keep, ret = sft_inst.ret}, 0, state): u8;
let rightshifts = shifts & 0b00001111; let rightshifts = shifts & 0b00001111;