diff --git a/uxn/uxn.ha b/uxn/uxn.ha index 225015d..7d661ab 100644 --- a/uxn/uxn.ha +++ b/uxn/uxn.ha @@ -795,7 +795,7 @@ export fn uxn_step(state: *uxn) (done | error) = { // /* JCN */ OPC(0x0d,POx(a,d) POx(b,0),if(b) MOV) case let jcn_inst: JCN => let addr = pop_or_get(jcn_inst,0,state); - let cond: u8 = pop_or_get(normal_op {keep = jcn_inst.keep, + let cond: u8 = pop_or_peek(normal_op {keep = jcn_inst.keep, ret = jcn_inst.ret, short = false}, if(jcn_inst.short){ yield 2;} else { yield 1; }, state ): u8; @@ -958,21 +958,17 @@ export fn uxn_step(state: *uxn) (done | error) = { 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 => - let shifts: u8 = pop_or_get(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 leftshifts = (shifts & 0b11110000) >> 4; - if(sft_inst.short){ //TODO, this seems like it can be cleaned up a bit - let low = pop_or_get(normal_op{short = false, keep = sft_inst.keep, ret = sft_inst.ret}, 1, state): u8; - let high = pop_or_get(normal_op{short = false, keep = sft_inst.keep, ret = sft_inst.ret}, 2, state): u8; - let val = short_from_bytes(high,low); - let res = (val >> rightshifts ) << leftshifts; - push_to_stack(sft_inst.ret, res, state); - }else{ - let val = pop_or_get(sft_inst, 1, state): u8; - let res = (val >> rightshifts ) << leftshifts; - push_to_stack(sft_inst.ret, res, state); + let val = pop_or_peek(sft_inst,1,state); + let res = match(val) { + case let s: u16 => + yield (s >> rightshifts ) << leftshifts; + case let b: u8 => + yield (b >> rightshifts ) << leftshifts; }; - + push_to_stack(sft_inst.ret, res, state); case => return readval: unhandled;