nxu/maze.tal

695 lines
23 KiB
Tal

( 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 &note $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 ,&notfound JCN
DUP2 ;is-unseen JSR2 ( i^ d^ cell2* unseen^ )
,&found JCN ( i^ d^ cell2* )
&notfound
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