( uxncli uxnmin.rom file.rom ) |10 @Console &vector $2 &read $1 &pad $4 &type $1 &write $1 &error $1 |a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 |000 @src/buf $40 @uxn/src $2 &dst $2 &m2 $1 &mr $1 &ptr $2 @pc/addr $2 |100 @on-reset ( -> ) .Console/type DEI ?{ ;dict/usage str/ #010f DEO BRK } ;src/on-console .Console/vector DEO2 BRK @src/on-console ( -> ) [ LIT2 03 -Console/type ] DEI GTH ?{ ;&buf .File/name DEO2 #8000 .File/length DEO2 ;rom/reset .File/read DEO2 vm/ BRK } .Console/read DEI [ LIT &ptr -&buf ] INCk ,&ptr STR STZ BRK ( @|emu ) @vm/ ( -- ) ;&on-console .Console/vector DEO2 / ( >> ) @vm/ ( -- ) &>w [ LIT2 &steps $2 ] INC2 ,&steps STR2 /step ?&>w JMP2r @vm/on-console ( -> ) [ LIT2 &console-hb $1 &console-lb $1 ] ORAk ?{ POP2 BRK } .Console/read DEI ,&console-read STR .Console/type DEI ,&console-type STR pc/ / BRK @vm/dei ( p -- v ) ( Console/read ) DUP #12 NEQ ?{ POP [ LIT &console-read $1 ] JMP2r } ( Console/type ) DUP #17 NEQ ?{ POP [ LIT &console-type $1 ] JMP2r } POP #00 JMP2r @vm/deo ( v p -- ) ( System/debug ) DUP #0e NEQ ?{ DEO JMP2r } ( System/halt ) DUP #0f NEQ ?{ DEO JMP2r } ( Console/vector-hb ) DUP #10 NEQ ?{ POP ,&console-hb STR JMP2r } ( Console/vector-lb ) DUP #11 NEQ ?{ POP ,&console-lb STR JMP2r } ( Console/stdout ) DUP #18 NEQ ?{ DEO JMP2r } ( Console/stderr ) DUP #19 NEQ ?{ DEO JMP2r } POP JMP2r ( @|stdlib ) @str/ ( str* -- ) &>w LDAk DUP ?{ POP POP2 JMP2r } #19 DEO INC2 !&>w @dict/usage "usage: 20 "uxnmin.rom 20 "game.rom 0a 00 ( Uxn Core ) @vm/ ( -- ) #0100 pc/ #0000 .uxn/ptr STZ2 #0000 ;wst/ptr STA2 #0000 ;rst/ptr STA2 JMP2r @vm/step ( -- ok ) ( ptr+1 ) .pc/addr LDZ2 INC2k .pc/addr STZ2 ( opcode ) ;rom/mem ADD2 LDA ( mode 2 ) DUP #20 AND #00 NEQ .uxn/m2 STZ ( mode r ) DUP #40 AND #00 NEQ .uxn/mr STZ ( mode r ) DUP #40 AND #00 NEQ STH ;rst/buf ;wst/buf STHr [ JMP SWP2 ] .uxn/dst STZ2 .uxn/src STZ2 ( mode k ) DUP #80 AND #00 NEQ ;pop/keep STA ( copy pop pointer ) .uxn/src LDZ2 #0100 ADD2 LDAk DUP SWP2 STA2 ( apply ) #00 OVR #1f AND DUP2 ADD2 ;lib/lut ADD2 LDA2 JMP2 ( @|PC ) @pc/rel ( a* -- ) DUP #7f GTH #ff MUL SWP .pc/addr LDZ2 ADD2 JMP2r @pc/ ( a* -- ) .uxn/m2 LDZ ?& & ( a* -- ) NIP /rel ( >> ) & ( a* -- ) .&addr STZ2 JMP2r ( @|Stacks ) @push ( v* -- ) .uxn/m2 LDZ ?&16 NIP ( >> ) &byte ( stack ptr* ) .uxn/src LDZ2 #0100 ADD2 STH2 ( incr ) .uxn/src LDZ2 #00 LDAkr STHr INCk STH2r STA ( save ) ADD2 STA JMP2r &16 ( v* -- ) SWP /byte !/byte @pop ( -- v* ) .uxn/m2 LDZ ?&16 &8 ( -- v* ) #00 ( >> ) &byte ( -- ) .uxn/src LDZ2 #0100 ADD2 #00 [ LIT &keep $1 ] ADD2 STH2 ( decr ) .uxn/src LDZ2 LDAkr STHr #01 SUB STH2kr STA ( load ) #00 LDAr STHr ADD2 LDA JMP2r &16 ( -- v* ) /byte /byte SWP JMP2r @poke ( v* a* -- ) .uxn/m2 LDZ ?&16 ;rom/mem ADD2 STA POP JMP2r &16 ( v* a* -- ) ;rom/mem ADD2 STA2 JMP2r @peek ( a* -- v* ) .uxn/m2 LDZ ?&16 ;rom/mem ADD2 LDA #00 SWP JMP2r &16 ( a* -- v* ) ;rom/mem ADD2 LDA2 JMP2r @devw ( v* p* -- ) .uxn/m2 LDZ ?&16 NIP ROT POP !vm/deo &16 ( v* p* -- ) NIP ( hb ) STHk INC vm/deo ( lb ) STHr !vm/deo @devr ( p* -- ) .uxn/m2 LDZ ?/16 NIP vm/dei #00 SWP !push &16 ( p* -- ) NIP ( hb ) INCk vm/dei #00 SWP push ( lb ) vm/dei #00 SWP !push ( @|Library ) @lib/imm ( opc -- ) DUP #00 EQU ?&op-brk DUP #20 EQU ?&op-jci DUP #40 EQU ?&op-jmi DUP #60 EQU ?&op-jsi &op-lit ( -- ) .pc/addr LDZ2 peek push #0001 .uxn/m2 LDZ ADD !pc/ &op-jci ( -- ) ;wst/buf .uxn/src STZ2 pop/8 NIP ?&op-jmi ( else ) .pc/addr LDZ2k INC2 INC2 ROT STZ2 JMP2r &op-jsi ( -- ) ;rst/buf .uxn/src STZ2 .pc/addr LDZ2 INC2 INC2 push/16 ( >> ) &op-jmi ( -- ) .pc/addr LDZ2 DUP2 peek/16 INC2 INC2 ADD2 !pc/ &op-brk ( -- ) JMP2r @lib/inc pop INC2 !push &pop pop POP2 JMP2r &nip pop pop POP2 !push &swp pop pop SWP2 push !push &rot pop pop pop ROT2 ROT2 push push !push &dup pop DUP2 push !push &ovr pop pop SWP2 OVR2 push push !push &equ pop pop EQU2 !push/byte &neq pop pop NEQ2 !push/byte >h pop pop LTH2 !push/byte <h pop pop GTH2 !push/byte &jmp pop !pc/ &jcn pop pop/8 NIP [ ?pc/ POP2 ] JMP2r &jsr pop .pc/addr LDZ2 .uxn/dst LDZ2 [ .uxn/src STZ2 push/16 ] !pc/ &sth pop .uxn/dst LDZ2 .uxn/src STZ2 !push &ldz pop/8 peek !push &stz pop/8 pop SWP2 !poke &ldr pop/8 NIP pc/rel peek !push &str pop/8 pop SWP2 NIP pc/rel !poke &lda pop/16 peek !push &sta pop/16 pop SWP2 !poke &dei pop/8 !devr &deo pop/8 pop SWP2 !devw &add pop pop ADD2 !push &sub pop pop SWP2 SUB2 !push &mul pop pop MUL2 !push &div pop pop SWP2 DIV2 !push &and pop pop AND2 !push &ora pop pop ORA2 !push &eor pop pop EOR2 !push &sft pop/8 pop SWP2 NIP SFT2 !push @lib/lut [ =&imm =&inc =&pop =&nip =&swp =&rot =&dup =&ovr =&equ =&neq =>h =<h =&jmp =&jcn =&jsr =&sth =&ldz =&stz =&ldr =&str =&lda =&sta =&dei =&deo =&add =&sub =&mul =&div =&and =&ora =&eor =&sft ] ( @|Buffers ) @wst/buf $100 &ptr $2 @rst/buf $100 &ptr $2 @rom/mem $100 &reset