( uxnemu soroban.rom )

|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2
|10 @Console &vector $2 &read $1 &pad $5 &write $1
|20 @Screen &vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1
|80 @Controller &vector $2 &button $1 &key $1
|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &chord $1
|a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2

|0000

	@cursor &x $2 &y $2
	@rods $a $1

|0100 ( -> )

	( meta )
	;meta #f0 DEO2

	( theme )
	#e1cc .System/r DEO2
	#e03b .System/g DEO2
	#e009 .System/b DEO2
	load-theme

	( size )
	#0148 .Screen/width DEO2
	#0078 .Screen/height DEO2

	( unlock )
	;on-mouse .Mouse/vector DEO2
	;on-console .Console/vector DEO2
	redraw

BRK

(
@|vectors )

@on-console ( -> )

	.Console/read DEI
	DUP #20 GTH ?&no-lb
		#00 ,&id STR POP BRK
		&no-lb
	LIT "0 SUB [ LIT &id $1 ] set-rod
	,&id LDR INC ,&id STR

BRK

@on-mouse ( -> )

	( clear last cursor )
	#40 draw-cursor

	( draw new cursor )
	.Mouse/x DEI2 .cursor/x STZ2
	.Mouse/y DEI2 .cursor/y STZ2
	;cursor-icn .Screen/addr DEO2
	#41 .Mouse/state DEI #00 NEQ ADD draw-cursor

	( route )
	.Mouse/x DEI2 #0008 SUB2 #0018 DIV2 NIP
	.Mouse/y DEI2 #0008 SUB2 #03 SFT2 NIP
	.Mouse/state DEI
		DUP #01 EQU ?&on-mouse-touch
		DUP #01 GTH ?&on-mouse-alt
	POP POP2

BRK

&on-mouse-alt ( x y state -> )

	POP2
	#00 SWP set-rod
	#00 .Mouse/state DEO

BRK

&on-mouse-touch ( x y state -> )

	POP
	( release ) #00 .Mouse/state DEO
	DUP #03 LTH ?&on-touch-godama
	#04 SUB #05 LTH ?&on-touch-ichidama-inc
	#ff SWP mod-rod

BRK

&on-touch-godama ( x y -> )

	POP
	#05 SWP mod-rod

BRK

&on-touch-ichidama-inc ( x -> )

	#01 SWP mod-rod

BRK

(
@|core )

@get-rod ( id -- value )

	.rods ADD LDZ

JMP2r

@mod-rod ( mod id -- )

	STHk get-rod ADD STHr

@set-rod ( value id -- )

	STH
	#0a DIVk MUL SUB
		STHkr .rods ADD STZ
		STHr

!draw-rod

(
@|drawing )

@redraw ( -- )

	( frame )
	#d5 .Screen/auto DEO
	#0000 .Screen/x DEO2
	#0000 .Screen/y DEO2
	;frame-chr .Screen/addr DEO2
	#81 .Screen/sprite DEO
	.Screen/width DEI2 #0008 SUB2 .Screen/x DEO2
	#0000 .Screen/y DEO2
	;frame-chr .Screen/addr DEO2
	#91 .Screen/sprite DEO

	( bottom )
	#01 .Screen/auto DEO
	#0000 .Screen/x DEO2
	;fill-icn .Screen/addr DEO2
	.Screen/height DEI2 #0008 SUB2 .Screen/y DEO2
	.Screen/width DEI2 #03 SFT2 NIP #00
	&f
		#03 .Screen/sprite DEO
		INC GTHk ?&f
	POP2

	( rods )
	#0d00
	&l
		DUP draw-rod
		INC GTHk ?&l
	POP2

JMP2r

@draw-rod ( id -- )

	DUP .rods ADD LDZ SWP

	( position )
	#00 OVR #0018 MUL2 #0008 ADD2 .Screen/x DEO2
	#0000 .Screen/y DEO2

	( set special )
	INC INC #03 DIVk MUL SUB #00 EQU ,&special STR
	#26 .Screen/auto DEO

	( top )
	;rod-icn/top .Screen/addr DEO2
	#81 .Screen/sprite DEO
	#01 .Screen/sprite DEO
	;rod-icn/rod .Screen/addr DEO2
	#01 .Screen/sprite DEO
	;rod-icn/rod .Screen/addr DEO2
	#01 .Screen/sprite DEO

	( middle )
	[ LIT2 00 &special $1 ] #0030 MUL2 ;rod-icn/spacer ADD2
		.Screen/addr DEO2
	#81 .Screen/sprite DEO

	( bottom )
	#0800
	&l
		;rod-icn/rod .Screen/addr DEO2
		#01 .Screen/sprite DEO
		INC GTHk ?&l
	POP2
	;rod-icn/top .Screen/addr DEO2
	#a1 .Screen/sprite DEO

	( num )
	#00 .Screen/auto DEO
	.Screen/x DEI2k #0008 ADD2 ROT DEO2
	.Screen/y DEI2k #0002 SUB2 ROT DEO2
	#00 OVR #30 SFT2 ;num-icn ADD2 .Screen/addr DEO2
	#0d .Screen/sprite DEO
	.Screen/x DEI2k #0008 SUB2 ROT DEO2
	.Screen/y DEI2k INC2 INC2 ROT DEO2

@draw-beads ( value -- )

	STH

	( godama )
	#26 .Screen/auto DEO
	#00 STHkr #04 GTH #0b MUL #0006 ADD2 .Screen/y DEO2
	;bead-icn .Screen/addr DEO2
	#85 .Screen/sprite DEOk DEO

	( ichidama )
	#0027 .Screen/y DEO2
	#0400
	&l
		( red ichidama )
			( first bead ) DUP #00 EQU
			( 3rd rod ) ;draw-rod/special LDA AND
			#00 SWP #0060 MUL2 ;bead-icn ADD2 .Screen/addr DEO2
		( offset )
		#00
			OVR #05 DIVk MUL SUB
			STHkr #05 DIVk MUL SUB
				EQU #000c MUL2 STH2
		.Screen/y DEI2k STH2r ADD2 ROT DEO2
		( location )
		#85 .Screen/sprite DEOk DEO
		.Screen/y DEI2k #0003 SUB2 ROT DEO2
		INC GTHk ?&l
	POP2
	POPr

JMP2r

@draw-cursor ( color -- )

	#00 .Screen/auto DEO
	.cursor/x LDZ2 .Screen/x DEO2
	.cursor/y LDZ2 .Screen/y DEO2
	.Screen/sprite DEO

JMP2r

(
@|utils )

@load-theme ( -- )

	;&path .File/name DEO2
	#0002 .File/length DEO2
	;&r .File/read DEO2
	;&g .File/read DEO2
	;&b .File/read DEO2
	.File/success DEI2 ORA #01 JCN JMP2r
	LIT2 &r $2 .System/r DEO2
	LIT2 &g $2 .System/g DEO2
	LIT2 &b $2 .System/b DEO2

JMP2r
	&path ".theme $1

(
@|etc )

@meta =&end =appicon &body
	( name ) "Soroban $1
	( version ) "Ver. 20 "1.01 $1
	( details ) "Graphical 20 "Japanese 20 "Soroban $1
	( author ) "Devine 20 "Lu 20 "Linvega 20 7f 20 "2022 $1
	&end $1

(
@|spritesheet )

@cursor-icn [
	80c0 e0f0 f8e0 1000 ]
@fill-icn [
	ffff ffff ffff ffff ]
@bead-icn [
	0000 0000 030f 3f7f 0000 0000 0003 0f3f 0018 3cff ffff ffff 0000 003c ffff ffff
	0000 0000 c0f0 fcfe 0000 0000 00c0 f0fc 7f3f 0f03 0000 0000 3f0f 0300 0000 0000
	ffff ffff ff3c 1800 ffff ffff 3c00 0000 fefc f0c0 0000 0000 fcf0 c000 0000 0000
	( special )
	0000 0000 030c 3040 0000 0000 0003 0f3f 1818 3cc3 0000 0000 0000 003c ffff ffff
	0000 0000 c030 0c02 0000 0000 00c0 f0fc 4030 0c03 0000 0000 3f0f 0300 0000 0000
	0000 0000 c33c 1818 ffff ffff 3c00 0000 020c 30c0 0000 0000 fcf0 c000 0000 0000 ]

@rod-icn [
	&top
	ffff ffff ffff 0000 ffff ffff ff00 0000 ffff ffff ffff 3c18 ffff ffff ff3c 1800
	ffff ffff ffff 0000 ffff ffff ff00 0000
	&rod
	0000 0000 0000 0000 1818 1818 1818 1818 0000 0000 0000 0000
	&spacer
	00ff ffff ffff ff00 0000 ffff ffff 0000 3cff ffff ffff ff3c 003c ffff ffff 3c00
	00ff ffff ffff ff00 0000 ffff ffff 0000
	( marker )
	00ff ffff ffff ff00 0000 ffff ffff 0000 3cff ffff ffff ff3c 183c ffe7 e7ff 3c18
	00ff ffff ffff ff00 0000 ffff ffff 0000 ]

@frame-chr [
	ffff ffff ffff fcfc ffff ffff fffc f8f8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcff ffff ffff fffc f8fc ffff ffff fcf8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8 fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8
	fcfc fcfc fcfc fcfc f8f8 f8f8 f8f8 f8f8 fcfc ffff ffff ffff f8f8 fcff ffff ffff ]

@num-icn [
	3c66 6e76 6666 3c00
	1838 1818 1818 7e00
	3c66 060c 1830 7e00
	7e0c 180c 0666 3c00
	0c1c 3c6c 7e0c 0c00
	7e60 7c06 0666 3c00
	3c60 607c 6666 3c00
	7e06 0c18 3030 3000
	3c66 663c 6666 3c00
	3c66 663e 060c 3800 ]

@appicon [
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00ff 0000 0000 0000 00ff
0000 0000 0000 00ff 0000 0000 0000 00ff 0000 0000 0000 0080 0000 0000 0000 0000
0000 0000 0000 0000 0101 0101 0101 0101 ff88 8888 889c be9c ff20 71fb 7120 2020
ff82 c2e2 c287 8f87 ff08 0808 081c be1c c0c0 c0c0 c0c0 c0c0 0000 0000 0000 0000
0000 0000 0000 0000 0101 0101 0101 0101 88ff 889c be9c 889c 20ff 2070 f870 2123
827f 8282 8282 c7ef 08ff 081c 3e1c 089c c0c0 c0c0 c0c0 c0c0 0000 0000 0000 0000
0000 0000 0000 0000 0101 0101 0101 0101 be9c 889c be9c 8888 2120 71fb 7120 71fb
c782 c7ef c782 c7ef 3e1c 089c 3e1c 089c c0c0 c0c0 c0c0 c0c0 0000 0000 0000 0000
0000 0000 0000 0000 0101 0101 0101 0100 8888 9cbe 9c88 ffff 7120 71fb 7120 ffff
c782 c7ef c782 ffff 3e1c 0888 0808 ffff c0c0 c0c0 c0c0 c080 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ]