diff --git a/uxn/uxn.ha b/uxn/uxn.ha index 64da2bf..9ecfab6 100644 --- a/uxn/uxn.ha +++ b/uxn/uxn.ha @@ -1058,9 +1058,16 @@ export fn uxn_step(state: *uxn) (done | error) = { 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 => - let reladdr = (pop_from_stack(str_inst.keep, str_inst.ret, false, state): u16): i8; + let reladdr = (pop_or_get(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 val = pop_from_stack(str_inst.keep, str_inst.ret, str_inst.short, state); + let val = if(str_inst.short){ + let low = pop_or_get(normal_op{short = false, keep = str_inst.keep, ret = str_inst.ret}, 1, state): u8; + let high = pop_or_get(normal_op{short = false, keep = str_inst.keep, ret = str_inst.ret}, 2, state): u8; + yield short_from_bytes(high,low); + + }else{ + yield pop_or_get(str_inst, 1, state): u8; + }; match (val) { case let b: u8 => state.ram[addr] = b; @@ -1082,8 +1089,12 @@ export fn uxn_step(state: *uxn) (done | error) = { 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 => - let addr: u16 = pop_from_stack(sta_inst.keep, sta_inst.ret, true, state): u16; - let val = pop_from_stack(sta_inst.keep, sta_inst.ret, sta_inst.short, state); + let addr: u16 = pop_or_get(normal_op{short = true, keep = sta_inst.keep, ret = sta_inst.ret}, 0, state): u16 ; + let val = if(sta_inst.short){ + yield pop_or_get(sta_inst, 1, state): u16; + }else{ + yield pop_or_get(sta_inst, 2, state): u8; + }; match (val) { case let b: u8 => state.ram[addr] = b;