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

%RTN { JMP2r }
%MOD { DUP2 DIV MUL SUB }
%TOS { #00 SWP }
%2// { #01 SFT2 }
%8** { #30 SFT2 }

( 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 &wheel  $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 2// .center/x STZ2
	.Screen/height DEI2 2// .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 #03 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 8** .anchor/x LDZ2 ADD2 .Screen/x DEO2
		( save-y ) OVR #03 DIV TOS 8** .anchor/y LDZ2 ADD2 .Screen/y DEO2
		( get digit* ) OVR STHkr #02 MUL TOS ;digits ADD2 LDA2 
		( get bit ) ROT #0e SWP SUB SFT2 #0001 AND2 
		( set tile ) 8** ;tiles ADD2 
		( set style ) .style LDZ #10 MUL TOS ADD2
		.Screen/addr DEO2
		( draw ) #21 .Screen/color DEO
		( incr ) SWP #01 ADD SWP 
		LTHk ,&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 ]