( 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 ]