( 
	Bifurcan
	Every second, the Labyrinth reorganize itself to display the time. 
)

%RTN { JMP2r }
%MOD { DUP2 DIV MUL SUB }
%TOS { #00 SWP }

( devices )

|00 @System     [ &vector $2 &pad      $6 &r      $2 &g     $2 &b      $2 ]
|20 @Screen     [ &vector $2 &width    $2 &height $2 &pad   $2 &x      $2 &y      $2 &addr $2 &color $1 ]
|90 @Mouse      [ &vector $2 &x        $2 &y      $2 &state $1 &chord  $1 ]
|b0 @DateTime   [ &year   $2 &month    $1 &day    $1 &hour  $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ]

( variables )

|0000

@last  $1
@style $1
@pointer [ &x $2 &y $2 ]
@center  [ &x $2 &y $2 ]
@anchor  [ &x $2 &y $2 ]

( program )

|0100 ( -> )

	( theme ) 
	#0f3a .System/r DEO2 
	#0fda .System/g DEO2 
	#0faa .System/b DEO2

	( vectors )
	;on-frame .Screen/vector DEO2
	;on-mouse .Mouse/vector DEO2

	( find center )
	.Screen/width DEI2 #0002 DIV2 .center/x STZ2
	.Screen/height DEI2 #0002 DIV2 .center/y STZ2

	( background ) 
	;tiles ;cover-pattern JSR2
	;redraw JSR2

BRK

@on-frame ( -> )

	( only draw once per second )
	.DateTime/second DEI .last LDZ NEQ #01 JCN [ BRK ]

	.DateTime/second DEI .last STZ

	;redraw JSR2

BRK

@on-mouse ( -> )

	;draw-cursor JSR2

	.Mouse/state DEI #00 EQU ,&no-touch JCN
		( incr ) .style LDZ #01 ADD #04 MOD .style STZ
		( bg ) ;tiles .style LDZ #10 MUL TOS ADD2 ;cover-pattern JSR2
		( fg ) ;redraw JSR2
		( release ) #00 .Mouse/state DEO
	&no-touch

BRK 

@redraw ( -- )
	
	( hrs )
	[ .center/x LDZ2 #0018 SUB2 ] 
	[ .center/y LDZ2 #0048 SUB2 ] 
	.DateTime/hour DEI #0a DIV ;draw-number JSR2
	[ .center/x LDZ2 #0008 ADD2 ] 
	[ .center/y LDZ2 #0048 SUB2 ] 
	.DateTime/hour DEI #0a MOD ;draw-number JSR2
	( min )
	[ .center/x LDZ2 #0018 SUB2 ] 
	[ .center/y LDZ2 #0018 SUB2 ] 
	.DateTime/minute DEI #0a DIV ;draw-number JSR2
	[ .center/x LDZ2 #0008 ADD2 ] 
	[ .center/y LDZ2 #0018 SUB2 ] 
	.DateTime/minute DEI #0a MOD ;draw-number JSR2
	( sec )
	[ .center/x LDZ2 #0018 SUB2 ] 
	[ .center/y LDZ2 #0018 ADD2 ]
	.DateTime/second DEI #0a DIV 
	;draw-number JSR2
	[ .center/x LDZ2 #0008 ADD2 ] 
	[ .center/y LDZ2 #0018 ADD2 ] 
	.DateTime/second DEI #0a MOD 
	;draw-number JSR2

RTN

@draw-number ( x* y* n -- )
	
	STH
	( save pos ) .anchor/y STZ2 .anchor/x STZ2
	#00 #0f
	&loop
		( save-x ) OVR #03 MOD TOS #0008 MUL2 .anchor/x LDZ2 ADD2 .Screen/x DEO2
		( save-y ) OVR #03 DIV TOS #0008 MUL2 .anchor/y LDZ2 ADD2 .Screen/y DEO2
		( get digit* ) OVR DUPr STHr #02 MUL TOS ;digits ADD2 LDA2 
		( get bit ) ROT #0e SWP SUB TOS SFT2 #0001 AND2 
		( set tile ) #0008 MUL2 ;tiles ADD2 
		( set style ) .style LDZ #10 MUL TOS ADD2
		.Screen/addr DEO2
		( draw ) #21 .Screen/color DEO
		( incr ) SWP #01 ADD SWP 
		DUP2 LTH ,&loop JCN
	POP2
	POPr

RTN

@cover-pattern ( addr* -- )
	
	( load ) .Screen/addr DEO2
	#0000 .Screen/height DEI2
	&ver
		( save ) OVR2 .Screen/y DEO2
		#0000 .Screen/width DEI2
		&hor
			( save ) OVR2 .Screen/x DEO2
			( draw ) #21 .Screen/color DEO
			( incr ) SWP2 #0008 ADD2 SWP2
			LTH2k ,&hor JCN
		POP2 POP2
		( incr ) SWP2 #0008 ADD2 SWP2
		LTH2k ,&ver JCN
	POP2 POP2

RTN

@draw-cursor ( -- )
	
	( clear last cursor )
	;cursor .Screen/addr DEO2 
	.pointer/x LDZ2 .Screen/x DEO2 
	.pointer/y LDZ2 .Screen/y DEO2 
	#30 .Screen/color DEO
	( record pointer positions )
	.Mouse/x DEI2 .pointer/x STZ2 
	.Mouse/y DEI2 .pointer/y STZ2
	( draw new cursor )
	.pointer/x LDZ2 .Screen/x DEO2 
	.pointer/y LDZ2 .Screen/y DEO2 
	( colorize on state )
	#31 [ .Mouse/state DEI #00 NEQ ] ADD .Screen/color DEO

RTN

@cursor [ 
	80c0 e0f0 f8e0 1000 ]

@digits [
	7b6f 2492 73e7 73cf 
	5bc9 79cf 49ef 7249 
	7bef 7bc9 ]

@tiles [
	0102 0408 1020 4080
	8040 2010 0804 0201 
	0718 2040 4080 8080
	0101 0102 0204 18e0
	0808 0810 e304 0808
	0808 0804 e310 0808
	0000 0000 0000 0001
	ffff ffff ffff ffff ]