( maze.tal ) ( ) ( mazes generated by randomized depth-first search ) ( press any key to generate a new maze ) ( ) ( generator uses a simple 16-bit xorshift RNG ) ( based on http://b2d-f9r.blogspot.com/2010/08/16-bit-xorshift-rng-now-with-more.html ) %DEBUG { #ff #0e DEO } %<<5 { #50 SFT2 } %>>1 { #01 SFT2 } %>>3 { #03 SFT2 } %RTN { JMP2r } %EMIT { #18 DEO } %SPACE { #20 EMIT } %NEWLINE { #0a EMIT } %MOD { DIVk MUL SUB } %MOD2 { DIV2k MUL2 SUB2 } %DEC { #01 SUB } %DEC2 { #0001 SUB2 } %NEGATE2 { #ffff MUL2 } ( TODO: once the dimensions are finalized inline constants ) %ROWS { #0027 } ( rows of cells ) %COLS { #003f } ( columns of cells ) %CELLS { ROWS COLS MUL2 } ( %MAZEROWS { ROWS #0003 SUB2 #0002 DIV2 } %MAZECOLS { COLS #0003 SUB2 #0002 DIV2 } ) %MAZEROWS { ROWS INC2 #0002 DIV2 } %MAZECOLS { COLS INC2 #0002 DIV2 } %NORTH { COLS NEGATE2 } %EAST { #0001 } %SOUTH { COLS } %WEST { #ffff } %CELL { SWP2 COLS MUL2 ADD2 } ( row* col* -> row*cols+col ) %LOAD { ;maze ADD2 LDA } ( cell* -> val^ ) %STORE { ;maze ADD2 STA } ( val cell* -> ) %XSTORE { ROT ROT STORE } ( cell* val -> ) %IS-OPEN { LOAD #01 AND } %UNSEEN { LOAD #02 AND #00 EQU } ( cell* -> bool^ ) ( %PATH { ADD2 #0002 DIV2 } ( cell1* cell2* -> cell3* ) ) %PATH { ADD2 #01 SFT2 } ( cell1* cell2* -> cell3* ) %DIGIT { #00 SWP ;digits ADD2 LDA EMIT } %EMIT-BYTE { DUP #04 SFT DIGIT #0f AND DIGIT } %EMIT-SHORT { SWP EMIT-BYTE EMIT-BYTE } ( devices ) |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 &pad $2 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 ] |30 @Audio0 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] |70 @Midi [ &vector $2 &channel $1 ¬e $1 &velocity $1 ] |80 @Controller [ &vector $2 &button $1 &key $1 ] |90 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &wheel $1 ] |a0 @File [ &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 ] |b0 @DateTime [ &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ] ( variables ) |0000 ( pseudo-random number generator ) @rng [ &x $2 &y $2 ] ( timer to use for flashing effect ) @timer $1 ( color to draw walls ) @tint $1 ( cell to focus on during maze generatio ) @focus $2 ( directions: n e s w ) @directions $4 ( 00 01 02 03 ) ( step one cell over in respective direction ) @cell-offsets $8 ( boolean used to generate a new maze ) @regenerate $1 ( cell occupied by the character ) @charx $2 @chary $2 |0100 ( intialize rng ) ;init-rng JSR2 #03 .tint STZ #00 .regenerate STZ ( initialize dierctions ) #00 .directions #00 ADD STZ #01 .directions #01 ADD STZ #02 .directions #02 ADD STZ #03 .directions #03 ADD STZ ( initialize the character ) #0002 .charx STZ2 #0000 .chary STZ2 ( initialize cell offsets - calculated based on #columns ) NORTH .cell-offsets #00 ADD STZ2 EAST .cell-offsets #02 ADD STZ2 SOUTH .cell-offsets #04 ADD STZ2 WEST .cell-offsets #06 ADD STZ2 ( theme: #102 #def #ec2 #775 ) #1de7 .System/r DEO2 #0ec7 .System/g DEO2 #2f25 .System/b DEO2 ( testing ) ;clear-maze JSR2 ( we mark the border as having been seen to simplify bounds checking ) ( ;mark-border JSR2 ) ( generate the maze ) ;create-maze JSR2 ( cut exits ) ;create-exits JSR2 ( first draw of the maze ) ;draw-maze JSR2 ( set up redraw hook ) ;draw .Screen/vector DEO2 ;on-key .Controller/vector DEO2 BRK @draw ( -> ) .timer LDZ INC #06 MOD DUP .timer STZ #00 NEQ ,&done JCN ( .tint LDZ #09 EOR .tint STZ ( enables flashing ) ) .regenerate LDZ #00 EQU ,&paint JCN ( if regenerate was true, then create a new maze ) #00 .regenerate STZ ;clear-maze JSR2 ( ;mark-border JSR2 ) ;create-maze JSR2 ;create-exits JSR2 ;draw-maze JSR2 ( draw the maze ) &paint ;draw-maze JSR2 &done BRK @try-move ( drow dcol -> ) .charx LDZ2 ADD2 SWP2 ( col+dcol row+drow ) .chary LDZ2 ADD2 SWP2 ( row+drow dcol ) OVR2 OVR2 ( row col row col ) CELL LOAD ( col row val ) #01 AND ,&ok JCN POP2 POP2 RTN &ok .charx STZ2 .chary STZ2 RTN @on-key ( -> ) .Controller/button DEI DUP ,&move JCN POP ( #01 .regenerate STZ ) BRK &move-up #ffff #0000 ;try-move JSR2 POP BRK &move-down #0001 #0000 ;try-move JSR2 POP BRK &move-left #0000 #ffff ;try-move JSR2 POP BRK &move-right #0000 #0001 ;try-move JSR2 POP BRK &move DUP #10 AND ,&move-up JCN DUP #20 AND ,&move-down JCN DUP #40 AND ,&move-left JCN DUP #80 AND ,&move-right JCN EMIT-BYTE NEWLINE BRK @wall-sprite ffff ffff ffff ffff @open-sprite 0000 0000 0000 0000 @char-sprite 0000 183c 3c18 0000 @draw-maze ( -> ) #0000 ( row ) &loop DUP2 ( row row ) ;draw-row JSR2 ( row ) INC2 ( row+1 ) DUP2 ROWS LTH2 ,&loop JCN POP2 RTN @draw-row ( row* -> ) #0000 ( row col ) &loop OVR2 OVR2 ( row col row col ) ;draw-cell JSR2 ( row col ) INC2 ( row col+1 ) DUP2 COLS LTH2 ,&loop JCN POP2 POP2 RTN @draw-cell ( row* col* -> ) SWP2 DUP2 #0008 MUL2 .Screen/y DEO2 ( draw at y=row*8 ) SWP2 DUP2 #0008 MUL2 .Screen/x DEO2 ( draw at x=col*8 ) OVR2 OVR2 .charx LDZ2 EQU2 STH .chary LDZ2 EQU2 STHr AND ,&draw-char JCN ( OVR2 OVR2 ) CELL LOAD ( load cell byte at maze+index ) #01 AND ( get bit 1, wall bit ) ,&draw-open JCN ( POP2 POP2 ) ;wall-sprite ,&end JMP &draw-open ( .charx LDZ2 EQU2 STH .chary LDZ2 EQU2 STHr AND ,&draw-char JCN ) ;open-sprite ,&end JMP &draw-char [ POP2 POP2 ] ;char-sprite ,&end JMP &end .Screen/addr DEO2 .tint LDZ .Screen/sprite DEO ( draw the cell ) RTN @init-rng ( -> ) ( seed .rng/x in seconds ) #00 .DateTime/minute DEI #003c MUL2 #00 .DateTime/second DEI ADD2 #0001 ORA2 .rng/x STZ2 ( x <- min*60+sec|1 ) ( seed .rng/y in hours ) #00 .DateTime/day DEI #0018 MUL2 #00 .DateTime/hour DEI ADD2 #0001 ORA2 .rng/y STZ2 ( y <- day*24+hour|1 ) RTN @mark-border ( -> ) #0000 &yloop DUP2 #0000 CELL #02 XSTORE ( set row 0 ) DUP2 COLS DEC2 CELL #02 XSTORE ( set row cols-1 ) INC2 DUP2 ROWS LTH2 ,&yloop JCN POP2 #0000 &xloop #0000 OVR2 CELL #02 XSTORE ( set 0 col ) ROWS DEC2 OVR2 CELL #02 XSTORE ( set rows-1 col ) INC2 DUP2 COLS LTH2 ,&xloop JCN POP2 RTN @create-exits ( -> ) #0000 #0002 CELL DUP2 #01 XSTORE SOUTH ADD2 #01 XSTORE ROWS #0002 SUB2 COLS #0003 SUB2 CELL DUP2 #01 XSTORE SOUTH ADD2 #01 XSTORE RTN ( initialize the entire maze memory to 0 values ) @clear-maze ( -> ) ROWS COLS MUL2 ( limit* ) #0000 #0000 CELL ( limit* cell* ) &loop DUP2 #00 XSTORE INC2 GTH2k ,&loop JCN POP2 POP2 RTN ( a move is illegal if it changes both x and y. ) ( that occurs when the player wraps around the border. ) @illegal-move ( cell* -> bool^ ) DUP2 CELLS LTH2 ,&inbounds JCN POP2 #01 RTN &inbounds DUP2 DUP2 COLS MOD2 ;focus LDA2 COLS MOD2 NEQ2 STH COLS DIV2 ;focus LDA2 COLS DIV2 NEQ2 STHr AND STHk #20 ADD EMIT SPACE EMIT-SHORT SPACE ;focus LDA2 EMIT-SHORT NEWLINE STHr RTN @log-focus EMIT SPACE ;focus LDA2 EMIT-SHORT NEWLINE RTN @xstore ROT ROT STORE RTN @is-unseen ( cell* -> bool^ ) DUP2 LOAD DUP EMIT-BYTE SPACE #02 AND #00 EQU STHk #30 ADD EMIT SPACE EMIT-SHORT NEWLINE STHr RTN @create-maze ( -> ) ( create starting pt, must have even coords ) ( ;random-short JSR2 MAZEROWS MOD2 INC2 #0002 MUL2 ( row* ) ;random-short JSR2 MAZECOLS MOD2 INC2 #0002 MUL2 ( row* col* ) ) ( ;random-short JSR2 MAZEROWS MOD2 #0002 MUL2 ( row* ) ;random-short JSR2 MAZECOLS MOD2 #0002 MUL2 ( row* col* ) ) #0000 #0000 CELL DUP2 ;focus STA2 ( cell* ) #07 XSTORE ( ) &queue ( ) #3f ;log-focus JSR2 ;shuffle-directions JSR2 ( ) #00 ( i^ ) &search ( i^ ) DUP .directions ADD LDZ ( i^ d^ ) DUP #02 MUL .cell-offsets ADD LDZ2 ( i^ d^ off* ) DUP2 ;focus LDA2 ADD2 ADD2 ( i^ d^ cell2* ) DUP2 ;illegal-move JSR2 ,¬found JCN DUP2 ;is-unseen JSR2 ( i^ d^ cell2* unseen^ ) ,&found JCN ( i^ d^ cell2* ) ¬found POP2 POP INC ( j=i+1 ) DUP #04 LTH ( j^ j<4 ) ,&search JCN ( j^ ) POP ( ) ,&backtrack JMP ( ) &found ( addr^ d^ cell2* ) #2a ;log-focus JSR2 DUP2 #01 ( XSTORE ) ;xstore JSR2 DUP2 ;focus LDA2 PATH ( addr^ d^ cell2* wall* ) #01 ( XSTORE ) ;xstore JSR2 ( addr^ d^ cell2* ) ;focus STA2 ( addr^ d^ ) #3e ;log-focus JSR2 #02 EOR #08 MUL ( addr^ link^ ) #03 ORA ;focus LDA2 ( addr^ data^ cell* ) STORE ( addr^ ) POP ,&queue JMP ( ) &backtrack ( ) ;focus LDA2 LOAD #08 DIV ( link^ ) #02 MUL .cell-offsets ADD LDZ2 ( offset* ) ;focus LDA2 OVR2 ( offset* cell* offset* ) ADD2 ADD2 ( old-cell* ) DUP2 ;focus STA2 ( old-cell* ) #3c ;log-focus JSR2 LOAD #04 AND #00 NEQ ( is-start^ ) ,&done JCN ;&queue JMP2 &done ( ) RTN @random-byte ( -> val^ ) ;random-short JSR2 POP RTN @random-short ( -> val* ) .rng/x LDZ2 DUP2 <<5 EOR2 ( tmp: x^[x<<5] ) .rng/y LDZ2 DUP2 .rng/x STZ2 ( tmp y ) DUP2 >>1 EOR2 ( tmp y^[y>>1] ) SWP2 DUP2 >>3 EOR2 ( y^[y>>1] tmp^[tmp>>3] ) EOR2 DUP2 .rng/y STZ2 ( y^[y>>1] ^ tmp^[tmp>>3] ) RTN @swap-directions ( d1^ d2^ -> ) EQUk ( d1 d2 d1=d2 ) ,&skip JCN .directions ADD SWP ( a2=d2+directions d1 ) .directions ADD SWP ( a1=d1+directions a2 ) LDZk ( a1 a2 x2 ) ROT LDZk ( a2 x2 a1 x1 ) SWP ( a2 x2 x1 a1 ) ROT ( a2 x1 a1 x2 ) SWP STZ ( a2 x1 ) SWP STZ ( ) RTN &skip POP2 RTN @shuffle-directions #04 ( n=4 ) &loop DUP ( n n ) DEC ( n k=n-1 ) ;random-byte JSR2 ( n k x ) ROT ( k x n ) MOD ( k r=x-mod-n ) OVR ( k r k ) ;swap-directions JSR2 ( k ) DUP #00 ( k k 0 ) GTH ( k k>0 ) ,&loop JCN POP RTN ( convenience for less branching when printing hex ) @digits 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 |8000 ( 64x40 cells = 2560 bytes ) ( ) ( cell byte layout: ) ( * bit 1 -> 1=open, 0=wall ) ( * bit 2 -> 1=seen, 0=unseen ) ( * bit 3 -> 1=start, 0=not-start ) ( * bits 4-5 -> direction to previous link, 0=n 1=e 2=s 3=w ) ( * bit 6 -> 1=visited 0=unvisited ) ( ) ( we use the link to support backtracking without ) ( needing a separate stack. ) @maze $2560 ( hexdump -v -e '16/1 " %02x" "\n"' chr/maze1.chr > sprites.txt ) @sprites 00 00 1f 3f 70 60 60 60 ff ff ff ff f0 e0 e0 e0 00 00 f8 fc 0e 06 06 06 ff ff ff ff 0f 07 07 07 61 60 63 60 67 60 6f 60 e1 e0 e3 e0 e7 e0 ef e0 86 06 c6 06 e6 06 f6 06 87 07 c7 07 e7 07 f7 07 ff 80 80 b8 b8 bb bb bb 00 7f 40 78 78 7b 7b 7b ff 01 01 01 01 81 81 b9 00 fe 02 02 02 82 82 ba bb bb bb bb bb bb 80 ff 7b 7b 7b 7b 7b 7b 7f 00 b9 b9 b9 b9 b9 b9 01 ff ba ba ba ba ba ba fe 00 1f 18 18 1f 18 18 1f 18 1f 18 18 1f 18 18 1f 18 f8 18 18 f8 18 18 f8 18 f8 18 18 f8 18 18 f8 18 18 1f 18 18 1f 18 00 00 18 1f 18 18 1f 18 00 00 18 f8 18 18 f8 18 00 00 18 f8 18 18 f8 18 00 00 00 00 00 00 00 18 1f 18 00 00 00 00 00 18 1f 38 00 00 00 00 00 18 f8 18 00 00 00 00 00 18 f8 1c 18 1f 18 18 1f 18 00 00 58 9f 98 98 5f 38 1f 00 18 f8 18 18 f8 18 00 00 1a f9 19 19 fa 1c f8 00 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 03 07 0d 04 00 01 01 03 00 07 0d 07 00 00 00 00 c0 e0 b0 20 c0 80 80 c0 00 e0 b0 e0 09 18 1c 04 1e 1f 1f 00 07 07 03 1b 19 00 00 1f 90 18 38 20 78 f8 f8 00 e0 e0 c0 d8 98 00 00 f8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 18 18 1f 18 18 1f 18 1f 18 18 1f 18 18 1f 38 f8 18 18 f8 18 18 f8 18 f8 18 18 f8 18 18 f8 1c 18 1f 18 18 1f 18 00 00 58 9f 98 98 5f 38 1f 00 18 f8 18 18 f8 18 00 00 1a f9 19 19 fa 1c f8 00 00 00 00 05 07 03 01 03 07 0f 0f 0d 0f 0f 1f 0d 00 00 00 a0 e0 c0 80 c0 e0 f0 f0 b0 f0 f0 f8 b0 07 0b 0b 08 00 00 02 06 00 08 08 0b 03 02 00 00 e0 d0 d0 10 00 00 40 60 00 10 10 d0 c0 40 00 00 03 07 05 07 03 01 01 07 03 07 05 07 03 01 01 07 c0 e0 a0 e0 c0 80 80 e0 c0 e0 a0 e0 c0 80 80 e0 09 0b 09 03 02 02 02 06 09 0b 09 03 02 02 02 06 90 d0 90 c0 40 40 40 60 90 d0 90 c0 40 40 40 60 00 07 0f 1f 1f 11 11 11 00 07 0f 1f 1f 15 11 11 00 f0 f8 fc fc c4 c4 44 00 f0 f8 fc fc d4 c4 44 1f 0f 0d 00 0d 07 03 00 1f 0f 0d 00 0d 07 03 00 7c f8 58 00 58 f0 e0 00 7c f8 58 00 58 f0 e0 00 0f 1f 3f 1f 31 31 1f 1b 0f 1f 07 31 75 31 3f 7c f0 f8 fc f8 8c 8c f8 d8 f0 f8 e0 8c ae 8c fc 3e 1b 13 16 36 1d 1d 0d 07 27 4f 09 09 42 02 22 00 d8 c8 68 6c b8 b8 b0 e0 e4 f2 90 90 42 40 44 00 00 00 06 0d 07 03 01 03 07 0f 0f 0d 07 03 01 01 00 00 60 b0 e0 c0 80 c0 e0 f0 f0 b0 e0 c0 80 80 07 0b 0b 08 00 00 02 06 00 08 08 0b 03 02 00 00 e0 d0 d0 10 00 00 40 60 00 10 10 d0 c0 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 0f 1f 1f 11 11 11 00 07 0f 1f 1f 15 11 11 00 f0 f8 fc fc c4 c4 44 00 f0 f8 fc fc d4 c4 44 1f 0f 0d 00 00 0d 07 03 1f 0f 0d 00 00 0d 07 03 7c f8 58 00 00 58 f0 e0 7c f8 58 00 00 58 f0 e0 0f 1f 3f 1f 31 31 1f 1b 0f 1f 07 31 75 31 3f 7c f0 f8 fc f8 8c 8c f8 d8 f0 f8 e0 8c ae 8c fc 3e 18 10 16 36 1d 1d 0d 07 24 4c 09 09 42 02 22 00 18 08 68 6c b8 b8 b0 e0 24 32 90 90 42 40 44 00 00 00 1f 3f 7f 7f 67 7f ff ff ff ff f0 e0 f8 e0 00 00 f8 fc fe fe e6 fe ff ff ff ff 0f 07 1f 07 7f 7f 7f 7f 7f 67 7f 7f e4 ee ea ee e0 f8 e0 e0 fe fe fe fe fe e6 fe fe 27 77 57 77 07 1f 07 07 00 00 1f 3f 70 60 60 60 ff ff ff ff f0 e0 e0 e0 00 00 f8 fc 0e 06 06 06 ff ff ff ff 0f 07 07 07 60 60 60 60 60 60 60 60 e0 e0 e0 e0 e0 e0 e0 e0 06 06 06 06 06 06 06 06 07 07 07 07 07 07 07 07 00 00 00 00 18 3c 66 43 00 00 00 00 18 3c 66 43 00 00 00 00 00 6c 6c fe 00 00 00 00 00 6c 6c fe 43 66 3c 18 00 00 00 00 43 66 3c 18 00 00 00 00 fe 00 00 00 00 00 00 00 fe 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 3c 66 43 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 6c fe 00 00 00 00 00 00 00 00 43 66 3c 18 00 00 00 00 00 00 00 00 00 00 00 00 fe 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 00 07 03 01 00 00 00 0f 0f 0f 07 03 01 00 f8 00 00 e0 c0 80 00 00 00 f0 f0 f0 e0 c0 80 00 00 00 01 03 07 1f 00 01 03 07 0f 0f 0f 00 00 00 00 00 80 c0 e0 f8 00 80 c0 e0 f0 f0 f0 00 00 00 00 1f 20 1f 36 35 3f 00 00 00 1f 20 09 0a 00 00 00 f8 00 f8 c8 28 f8 00 00 00 f8 00 30 d0 00 3f 3f 20 1f 3f 3f 1f 00 00 00 1f 20 1f 1f 00 00 f8 f8 00 f8 f8 f8 f8 00 00 00 f8 00 f8 f8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 60 f0 c0 00 00 00 38 38 18 00 00 01 02 04 08 10 60 20 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 70 38 3c 3e 3f 37 33 00 70 38 3c 3e 3f 37 33 00 0e 1c 3c 7c fc ec cc 00 0e 1c 3c 7c fc ec cc 00 01 03 07 0e 1c 38 30 00 01 03 07 0e 1c 38 30 00 80 c0 e0 70 38 1c 0c 00 80 c0 e0 70 38 1c 0c 00 3f 3f 20 00 00 00 01 00 3f 3f 20 00 00 00 01 00 fc fc 1c 38 70 e0 c0 00 fc fc 1c 38 70 e0 c0 00 7f 3f 30 30 30 30 3f 00 7f 3f 30 30 30 30 3f 00 fc fc 04 00 00 20 e0 00 fc fc 04 00 00 20 e0 00 0f 1f 38 30 30 38 1f 00 0f 1f 38 30 30 38 1f 00 f0 f8 1c 0c 00 00 f0 00 f0 f8 1c 0c 00 00 f0 00 03 0f 1e 38 30 70 60 00 03 0f 1e 38 30 70 60 00 c0 f0 78 1c 0c 0e 06 00 c0 f0 78 1c 0c 0e 06 00 7f 3f 30 30 30 30 3f 00 7f 3f 30 30 30 30 3f 00 fc fc 04 00 00 20 e0 00 fc fc 04 00 00 20 e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 30 30 30 30 30 70 00 31 30 30 30 30 30 70 00 8c 0c 0c 0c 0c 0c 0e 00 8c 0c 0c 0c 0c 0c 0e 00 30 3f 3f 30 30 30 70 00 30 3f 3f 30 30 30 70 00 0c fc fc 0c 0c 0c 0e 00 0c fc fc 0c 0c 0c 0e 00 03 07 0e 1c 38 3f 3f 00 03 07 0e 1c 38 3f 3f 00 80 00 00 00 04 fc fc 00 80 00 00 00 04 fc fc 00 3f 30 30 30 30 3f 7f 00 3f 30 30 30 30 3f 7f 00 e0 20 00 00 04 fc fc 00 e0 20 00 00 04 fc fc 00 0f 00 00 30 38 1f 0f 00 0f 00 00 30 38 1f 0f 00 f8 1c 0c 0c 1c f8 f0 00 f8 1c 0c 0c 1c f8 f0 00 60 70 30 38 1e 0f 03 00 60 70 30 38 1e 0f 03 00 06 0e 0c 1c 78 f0 c0 00 06 0e 0c 1c 78 f0 c0 00 3f 30 30 30 30 30 78 00 3f 30 30 30 30 30 78 00 e0 20 00 00 00 00 00 00 e0 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7c 38 1c 0e 07 03 01 00 7c 38 1c 0e 07 03 01 00 3e 1c 38 70 e0 c0 80 00 3e 1c 38 70 e0 c0 80 00 7f 3f 30 30 30 30 3f 00 7f 3f 30 30 30 30 3f 00 f0 f8 1c 0c 0c 1c f8 00 f0 f8 1c 0c 0c 1c f8 00 7f 3f 30 30 30 30 3f 00 7f 3f 30 30 30 30 3f 00 fc fc 04 00 00 20 e0 00 fc fc 04 00 00 20 e0 00 0f 1f 38 30 30 38 1f 00 0f 1f 38 30 30 38 1f 00 f0 f8 1c 0c 00 00 f0 00 f0 f8 1c 0c 00 00 f0 00 07 03 01 01 01 01 01 00 07 03 01 01 01 01 01 00 e0 c0 80 80 80 80 80 00 e0 c0 80 80 80 80 80 00 70 38 3c 3e 3f 37 33 00 70 38 3c 3e 3f 37 33 00 0e 1c 3c 7c fc ec cc 00 0e 1c 3c 7c fc ec cc 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 01 01 01 01 03 00 01 01 01 01 01 01 03 00 80 80 80 80 80 80 c0 00 80 80 80 80 80 80 c0 00 3f 30 30 30 30 30 78 00 3f 30 30 30 30 30 78 00 f0 38 1c 0c 0c 0c 1e 00 f0 38 1c 0c 0c 0c 1e 00 3f 30 30 30 30 3f 7f 00 3f 30 30 30 30 3f 7f 00 e0 20 00 00 04 fc fc 00 e0 20 00 00 04 fc fc 00 0f 00 00 30 38 1f 0f 00 0f 00 00 30 38 1f 0f 00 f8 1c 0c 0c 1c f8 f0 00 f8 1c 0c 0c 1c f8 f0 00 01 01 01 01 01 03 07 00 01 01 01 01 01 03 07 00 80 80 80 80 80 c0 e0 00 80 80 80 80 80 c0 e0 00 31 30 30 30 30 30 70 00 31 30 30 30 30 30 70 00 8c 0c 0c 0c 0c 0c 0e 00 8c 0c 0c 0c 0c 0c 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 1f 38 30 30 38 1f 00 0f 1f 38 30 30 38 1f 00 f0 f8 1c 0c 00 00 f0 00 f0 f8 1c 0c 00 00 f0 0f 00 00 30 38 1f 0f 00 0f 00 00 30 38 1f 0f 00 f8 1c 0c 0c 1c f8 f0 00 f8 1c 0c 0c 1c f8 f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 71 31 31 31 31 31 31 00 71 31 31 31 31 31 31 00 8e 8c 8c 8c 8c 8c 8c 00 8e 8c 8c 8c 8c 8c 8c 31 31 31 3b 1f 0f 06 00 31 31 31 3b 1f 0f 06 00 8c 8c 8c dc f8 f0 60 00 8c 8c 8c dc f8 f0 60 00 00 70 70 38 1c 0f 07 03 00 70 70 38 1c 0f 07 03 00 1c 1c 38 70 e0 c0 80 00 1c 1c 38 70 e0 c0 80 03 07 0f 1c 38 70 70 00 03 07 0f 1c 38 70 70 00 80 c0 e0 70 38 1c 1c 00 80 c0 e0 70 38 1c 1c 00 00 7c 38 1c 0e 07 03 01 00 7c 38 1c 0e 07 03 01 00 3e 1c 38 70 e0 c0 80 00 3e 1c 38 70 e0 c0 80 01 01 01 01 01 01 03 00 01 01 01 01 01 01 03 00 80 80 80 80 80 80 c0 00 80 80 80 80 80 80 c0 00 00 3f 3f 20 00 00 00 01 00 3f 3f 20 00 00 00 01 00 fc fc 1c 38 70 e0 c0 00 fc fc 1c 38 70 e0 c0 03 07 0e 1c 38 3f 3f 00 03 07 0e 1c 38 3f 3f 00 80 00 00 00 04 fc fc 00 80 00 00 00 04 fc fc 00