( uxncli checksum.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

|0100

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

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

@on-ready ( -> )
	;src DUP2 hash <emit-long>
	#2018 DEO
	<pstr>
	#0a18 DEO
	#800f DEO
	BRK

(
@|core )

@hash ( filename* -- x* y* )
	.File/name DEO2
	#0001 .File/length DEO2
	#1234 ,&x STR2
	#abcd ,&y STR2
	#2443 ,&a STR2
	#118d ,&b STR2
	&w ( -- )
		;&c .File/read DEO2
		[ LIT &c $1 ] DUP DUP2 [ LIT2 &x $2 ] [ LIT2 &a $2 ] MUL2 ADD2 ,&x STR2
		[ LIT2 &y $2 ] [ LIT2 &b $2 ] MUL2 ADD2 ,&y STR2
		.File/success DEI2 ORA ?&w
	,&x LDR2 ,&y LDR2 JMP2r

(
@|stdlib )

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

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

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

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

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

@<emit-long> ( a* b* -> )
	SWP2 <emit-long>/s
	&s ( -- )
		SWP <emit-long>/b
	&b ( -- )
		DUP #04 SFT <emit-long>/c
	&c ( -- )
		#0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO
		JMP2r

@dict &usage "usage: 20 "checksum.rom 20 "input.bin 0a $1