( uxncli hx.rom file.bin )

|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

|0000

	@src $40
	@uxn &pc $2 &src $2 &dst $2 &err $1 &2 $1

|0100

@on-reset ( -> )
	.Console/type DEI ?&>has-arg
		;dict/usage <print-str>
		#010f DEO
		BRK &>has-arg
	;on-waitsrc .Console/vector DEO2
	BRK

@on-waitsrc ( -> )
	.Console/read DEI .src skey ?on-ready
	BRK

@on-ready ( -> )
	<reset>
	;src load-rom run #800f DEO
	BRK

(
@|emu )

@load-rom ( filename* -- )
	.File/name DEO2
	#fff0 ;rom/reset SUB2 DUP2 .File/length DEO2
	;rom/reset .File/read DEO2
	.File/success DEI2 SUB2 <print-dec>
	;dict/bytes-free !<print-str>

@run ( -- )
	<step>
	.uxn/err LDZ ?&err
	?run
	;<step>/count LDA2 <print-dec>
	;dict/cycles <print-str>
	JMP2r
	&err ( opcode -- )
		POP !<reset>

@halt ( opcode -- opcode )
	JMP2r

@emu-deo ( v p -- )
	( | handlers )
	DUP #0e NEQ ?&>no-debug
		POP2 JMP2r &>no-debug
	DUP #0f NEQ ?&>no-halt
		POP2 JMP2r &>no-halt
	DUP #18 NEQ ?&>no-out
		DEO
		JMP2r &>no-out
	DUP #19 NEQ ?&>no-err
		DEO
		JMP2r &>no-err
	( | error )
	;dict/err-device <print-str>
	<print-hex>/b
	#0a18 DEO
	POP JMP2r

(
@|stdlib )

@skey ( key buf -- proc )
	OVR #21 LTH ?&eval
	#00 SWP sput #00 JMP2r
	&eval ( -- )
		POP2 #01 JMP2r

@scap ( str* -- end* )
	!&
	&w ( -- )
		INC2 & LDAk ?&w
	JMP2r

@sput ( chr str* -- )
	scap/ ROT #00 SWP2 STA2
	JMP2r

@<print-hex> ( short* -- )
	SWP <print-hex>/b
	&b ( -- )
		DUP #04 SFT <print-hex>/c
	&c ( -- )
		#0f AND DUP #09 GTH #27 MUL ADD LIT "0 ADD #18 DEO
		JMP2r

@<print-str> ( str* -- )
	&w ( -- )
		LDAk #19 DEO
		INC2 LDAk ?&w
	POP2 JMP2r

@<print-dec> ( short* -- )
	#2710 [ LIT2r 00fb ]
	&w ( -- )
		DIV2k #000a DIV2k MUL2 SUB2 SWPr EQUk OVR STHkr EQU AND ?&>skip
			DUP LIT "0 ADD #19 DEO
			INCr &>skip
		POP2 #000a DIV2 SWPr INCr STHkr ?&w
	POP2r POP2 POP2 JMP2r

(
@|res )

@dict &usage "usage: 20 "uxnvm.rom 20 "game.rom 0a $1
	&bytes-free 20 "bytes 20 "free. 0a $1
	&err-device "Unsupported 20 "device: 20 $1
	&cycles 20 "cycles. 0a $1

~vm.tal