The Main game screen is not working now
This example now demonstrates the Charpad map that is loaded (using SwitchCharSet) that has tiles shifted to the left for some strange reason. Updated 10-27-23.
Title Screen Vs. The Main Game Screen
Above is a tool you can use to view the title screen (on the left) and then the main game map (on the right) as it appears currently. The title screen loads great (using incbin), but I am lost as of why the main game screen is a jumbled mess.
Commodore 64 Game Project
This is an example screen of my title screen. It uses a separate character set from the game demo The goal is to have a character set for the title screen. Then when the fire button is pressed, the game will use a totally different character set.
I’m also hoping to learn how to import multiple maps using CBM Prg Studio include files as well, but so far this is not working.
Here is an example of two binary files I’d like to switch between them (as seen at the bottom of Main.asm)
TITLE_MAP_CHAR_MEM ; Character set for map screen incbin "Parkour_Maps/Project16_TitleScreen_Chars1_perchar.bin"
*=$4800 MAP_CHAR_MEM ; Character set for map screen ;incbin"Parkour_Maps/Project14Anim1_Chars2.bin"
Yet when I’m trying to read them both like this, it doesn’t seem to work right (as found in CharSet_Memory.asm)
Note: This is a short snippet. See the full code using the Tabs below on the page.
I am using cpy #32 since there are 32 pixels in the individual character set tiles. Then after I’ve read all 32 bytes for one tile (out of 16 tiles) then I adc #32 to be stored in ZEROPAGE_POINTER_4 (which holds the character set data) and I do the same adc #32 for ZEROPAGE_POINTER_1 (which increases the memory by 32 bytes each time). This is necessary to read the next tile in a row. That’s my dilemma at least.
ldx #0
ldy #0
loop1
lda (ZEROPAGE_POINTER_4),y ; GAMECHSET1_MEM
lda ZEROPAGE_POINTER_1
adc ZEROPAGE_POINTER_1 ; inc $4800 (low/hi) bytes
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1
jsr ReadChset
iny ; x = x + 1
cpy #32 ; read all 32 pixels in Char Editor
bne loop1
rts
lda ZEROPAGE_POINTER_4 ; GAMECHSET1_MEM
clc
adc #32 ; Skip first(each) 32 pixels to read next chset data
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1
lda ZEROPAGE_POINTER_1 ; CHSET_LOC ($4800)
clc
adc #32 ; Skip first(each) 32 pixels to read next chset data
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1
ldy #0
inx
cpx #124 ; read down 15 lines
bne loop1
rts
CharPad Example
Here are the actual two different character sets I’m using:
- Title screen character set
- In game character set
The Assembly Language Game Code
The game project also includes scrolling screens horizontally and vertically. I’m hoping to eventually create more maps that will need to be switched to with either an include file or a reference to a byte table or something. I can currently show 1 character set and map only.
Remember the goal here is to access multiple character sets and maps eventually.
Clicking on the tabs reviews 4 source files
- Main.asm
- CharSet_Memory.asm
- Game_Chset.asm
- VIC_Registers.asm
There are many other assembly files as well, but the purpose of this page (for the lemon64.com post) is to highlight the areas of interest. In Main you can see the binary files I’m trying to read from using the assembly code in “CharSet_Memory.asm”. The “Game_Chset.asm” contains the byte data (although main uses the include, I figured it would be beneficial to show you the actual output from CharPad Pro).
Finally the VIC_Registers shows the VIC variable data and other constants.
I can also add more assembly language files tabs as needed per this discussion.
I hope this is helpful. Feel free to leave comments on this page if you want as well.
Main.asm
;===============================================================================
; Commodore 64: “Your Game Project”
;
; File: Project 16-17: “Game Title Screen / Sound Effects”
;===============================================================================
; Bugs found: When scrolling the screen, sometimes the wall detection is not found
; and sprite passes through it.
; Sprite animation looping is off. The animation is running fast
; Sprite Idle animation is not showing.
;===============================================================================
; SCROLLING MAP EXAMPLE 1 – C64 YouTube Game Project
; 2016/17 – Peter ‘Sig’ Hewett aka RetroRomIcon (contributions)
; Additional coding by Steve Morrow
;===============================================================================
Operator Calc ; IMPORTANT – calculations are made BEFORE hi/lo bytes
; in precidence (for expressions and tables)
;===============================================================================
; DEFINITIONS
;===============================================================================
IncAsm “VIC_Registers.asm” ; VICII register includes
IncAsm “Game_Macros.asm ; macro includes
;===============================================================================
;===============================================================================
; CONSTANTS
;===============================================================================
CONSOLE_TEXT = SPRITE_CONSOLE_TEXT
CONSOLE_DISPLAY = DisplaySpriteInfo
#region “Constants”
SCREEN1_MEM = $4000 ; Bank 1 – Screen 0 ; $4000
SCREEN2_MEM = $4400 ; Bank 1 – Screen 1 ; $4400
SCORE_SCREEN = $5800 ; Bank 1 – Screen 6 ; $5800
CHSET_LOC = $4800
; ****** CURRENT PROJECT *******
; Start $4800: 18432
; Top blue background: 18680
; Rock stacked wall: 19112
; Regular brick wall: 19256
; Pole facing to left: 19304
; Top part of wall (behind window): 19544
; Solid water part: 19744, 19888
; Rock stacked wall: 19864
CHRADR1 = 19992 ; middle of rope
CHRADR2 = 19144 ; top of window
CHRADR3 = 19208
CHRADR4 = 20128 ; top water tile: 20288
CHRADR5 = 19544 ; 20200, 20080: rock stacked wall
; 19544 = top part of orange (background wall)
; 20128 = top middle of rope facing right
; 20144 = top part of rope facing right
; 20192 = center of rope facing right
; 20224 = top/center of rope facing left (top part)
; 20320 = top of water
CHRADR6 = 20312
COLOR_MEM = $D800 ; Color mem never changes
SPRITE_POINTER_BASE = SCREEN1_MEM + $3f8 ; last 8 bytes of screen mem
SPRITE_BASE = $70 ; the pointer to the first image#
SPRITE_0_PTR = SPRITE_POINTER_BASE + 0 ; Sprite pointers
SPRITE_1_PTR = SPRITE_POINTER_BASE + 1
SPRITE_2_PTR = SPRITE_POINTER_BASE + 2
SPRITE_3_PTR = SPRITE_POINTER_BASE + 3
SPRITE_4_PTR = SPRITE_POINTER_BASE + 4
SPRITE_5_PTR = SPRITE_POINTER_BASE + 5
SPRITE_6_PTR = SPRITE_POINTER_BASE + 6
SPRITE_7_PTR = SPRITE_POINTER_BASE + 7
SPRITE_DELTA_OFFSET_X = 8 ; Offset from SPRITE coords to Delta Char coords
SPRITE_DELTA_OFFSET_Y = 14
ENEMY_SPRITE_DELTA_OFFSET_X = 8
ENEMY_SPRITE_DELTA_OFFSET_Y = 14
NUMBER_OF_SPRITES_DIV_4 = 3 ; This is for my personal version, which
; loads sprites and characters under IO ROM
LEVEL_1_MAP = $E000 ;Address of level 1 tiles/charsets
#endregion
;===============================================================================
; GAME TIMERS
;===============================================================================
CIA1_TIMA_LO = $dc04
CIA1_TIMA_HI = $dc05
CIA1_TIMB_LO = $dc06
CIA1_TIMB_HI = $dc07
;===============================================================================
; ZERO PAGE LABELS
;===============================================================================
#region “ZeroPage”
PARAM1 = $03 ; These will be used to pass parameters to routines
PARAM2 = $04 ; when you can’t use registers or other reasons
PARAM3 = $05
PARAM4 = $06 ; essentially, think of these as extra data registers
PARAM5 = $07
TIMER = $08 ; Timers – fast and slow, updated every frame
SLOW_TIMER = $09
WPARAM1 = $0A ; Word length Params. Same as above only room for 2
WPARAM2 = $0C ; bytes (or an address)
WPARAM3 = $0E
;—————————- $11 – $16 available
ZEROPAGE_POINTER_1 = $17 ; Similar only for pointers that hold a word long address
ZEROPAGE_POINTER_2 = $19
ZEROPAGE_POINTER_3 = $21
ZEROPAGE_POINTER_4 = $23
CURRENT_SCREEN = $25 ; Pointer to current front screen
CURRENT_BUFFER = $27 ; Pointer to current back buffer
SCROLL_COUNT_X = $29 ; Current hardware scroll value
SCROLL_COUNT_Y = $2A
SCROLL_SPEED = $2B ; Scroll speed (not implemented yet)
SCROLL_DIRECTION = $2C ; Direction we are scrolling in
SCROLL_MOVING = $2D ; are we moving? (Set to direction of scrolling)
; This is for resetting back to start frames
; All data is for the top left corner of the visible map area
MAP_POS_ADDRESS = $2E ; (2 bytes) pointer to current address in the level map
MAP_X_POS = $30 ; Current map x position (in tiles)
MAP_Y_POS = $31 ; Current map y position (in tiles)
MAP_X_DELTA = $32 ; Map sub tile delta (in characters)
MAP_Y_DELTA = $33 ; Map sub tile delta (in characters)
ENMAP_X_POS = $34 ; Current map x position (in tiles)
ENMAP_Y_POS = $35 ; Current map y position (in tiles)
ENMAP_X_DELTA = $36 ; Map sub tile delta (in characters)
ENMAP_Y_DELTA = $37 ; Map sub tile delta (in characters)
#endregion
;===============================================================================
; BASIC KICKSTART
;===============================================================================
KICKSTART
; Sys call to start the program – 10 SYS (2064)
*=$0801
BYTE $0E,$08,$0A,$00,$9E,$20,$28,$32,$30,$36,$34,$29,$00,$00,$00
;===============================================================================
; START OF GAME PROJECT
;===============================================================================
*=$0810
PRG_START
lda #0 ; Turn off sprites
sta VIC_SPRITE_ENABLE
lda VIC_SCREEN_CONTROL ; turn screen off with bit 4
and #%11100000 ; mask out bit 4 – Screen on/off
sta VIC_SCREEN_CONTROL ; save back – setting bit 4 to off
;===============================================================================
; SETUP VIC BANK MEMORY
;===============================================================================
#region “VIC Setup”
; To set the VIC bank we have to change the first 2 bits in the
; CIA 2 register. So we want to be careful and only change the
; bits we need to.
lda VIC_BANK ; Fetch the status of CIA 2 ($DD00)
and #%11111100 ; mask for bits 2-8
ora #%00000010 ; the first 2 bits are your desired VIC bank value
; In this case bank 1 ($4000 – $7FFF)
sta VIC_BANK
;===============================================================================
; CHARACTER SET ENABLE: SCREEN MEMORY
;===============================================================================
; Within the VIC Bank we can set where we want our screen and character
; set memory to be using the VIC_MEMORY_CONTROL at $D018
; It is important to note that the values given are RELATIVE to the start
; address of the VIC bank you are using.
lda #%00000010 ; bits 1-3 (001) = character memory 2 : $0800 – $0FFF
; bits 4-7 (000) = screen memory 0 : $0000 – $03FF
sta VIC_MEMORY_CONTROL
; Because these are RELATIVE to the VIC banks base address (Bank 1 = $4000)
; this gives us a base screen memory address of $4000 and a base
; character set memory of $4800
;
; Sprite pointers are the last 8 bytes of screen memory (25 * 40 = 1000 and
; yet each screen reserves 1024 bytes). So Sprite pointers start at
; $4000 + $3f8.
; After alloction of VIC Memory for Screen, backbuffer, scoreboard, and
; 2 character sets , arranged to one solid block of mem,
; Sprite data starts at $5C00 – giving the initial image a pointer value of $70
; and allowing for up to 144 sprite images
#endregion
;===============================================================================
; SYSTEM INITIALIZATION
;===============================================================================
#region “System Setup”
System_Setup
; Here is where we copy level 1 data from the start setup to under
; $E000 so we can use it later when the game resets.
; A little bank switching is involved here.
sei
; Here you load and store the Processor Port ($0001), then use
; it to turn off LORAM (BASIC), HIRAM (KERNAL), CHAREN (CHARACTER ROM)
; then use a routine to copy your sprite and character mem under there
; before restoring the original value of $0001 and turning interrupts
; back on.
lda PROC_PORT ; store ram setup
sta PARAM1
lda #%00110000 ; Switch out BASIC, KERNAL, CHAREN, IO
sta PROC_PORT
; When the game starts, Level 1 tiles and characters are stored in place to run,
; However, when the game resets we will need to restore these levels intact.
; So we’re saving them away to load later under the KERNAL at $E000-$EFFF (4k)
; To do this we need to do some bank switching, copy data, then restore as
; we may use the KERNAL later for some things.
lda PARAM1 ; restore ram setup
sta PROC_PORT
cli
#endregion
;===============================================================================
; SCREEN SETUP
;===============================================================================
#region “Screen Setup”
Screen_Setup
lda #COLOR_LTRED
sta VIC_BACKGROUND_COLOR
lda #COLOR_LTGREEN
sta VIC_CHARSET_MULTICOLOR_1
lda #COLOR_VIOLET
sta VIC_CHARSET_MULTICOLOR_2
lda #COLOR_BROWN
sta VIC_CHARSET_MULTICOLOR_2
;loadPointer CURRENT_SCREEN,SCREEN1_MEM
;loadPointer CURRENT_BUFFER,SCREEN2_MEM
lda #SCREEN1_MEM
sta CURRENT_SCREEN + 1
lda #SCREEN2_MEM
sta CURRENT_BUFFER + 1
ldx #25
ldy #0
jsr DrawTitleMap
;jsr CopyToBuffer ; Copy to the backbuffer(Screen2)
; Bring multicolor back to the screen
jsr WaitFrame
jsr InitRasterIRQ ; Setup raster interrupts
jsr WaitFrame
lda #%00011011 ; Default (Y scroll = 3 by default)
sta VIC_SCREEN_CONTROL
lda #COLOR_BLACK
sta VIC_BORDER_COLOR
#endregion
;===============================================================================
; SPRITE SETUP
;===============================================================================
#region “Sprite Setup”
Sprite_Setup
lda #0
sta VIC_SPRITE_ENABLE ; Turn all sprites off
sta VIC_SPRITE_X_EXTEND ; clear all extended X bits
sta SPRITE_POS_X_EXTEND ; in registers and data
jsr PlayerInit
lda #%11111111 ; Turn on all sprites
sta VIC_SPRITE_ENABLE
lda #140
sta 53248 ; Player Horizontal (X): Head
sta 53250 ; Player Vertical (Y) : Body
lda #115
sta 53249 ; Player Vertical (Y): Head
;sta 53251 ; Player Vertical (Y): Body
lda #0
sta 53252 ; Enemy Horizontal (X): Head
sta 53253 ; Enemy Vertical (Y) : Head
sta 53254 ; Enemy Horizontal (X): Body
sta 53255 ; Enemy Vertical (Y) : Body
; jsr DisplayNewSprite
; ============================================================
; Title Screen Display
; ============================================================
lda SHOW_GAME_TITLE
beq Continue_Game
;jsr $e544 ; Clear screen
lda #TITLESCREEN_PANEL
sta ZEROPAGE_POINTER_1 + 1
; Write text (stored in ZEROPAGE_POINTER_1 to screen display)
lda #0 ; PARAM1 contains X screen coord (column)
sta PARAM1
lda #18 ; PARAM2 contains Y screen coord (row)
sta PARAM2
lda #COLOR_RED ; PARAM3 contains the color to use
sta PARAM3
jsr DisplayText ; Then we display the stats panel
jsr WaitFrame
jsr InitRasterIRQ ; Setup raster interrupts
jsr WaitFrame
;jsr SwitchTitleSet
; ============================================================
; Press FIRE BUTTON to begin
; ============================================================
WaitToStartGame
jsr JoystickReady
; Wait for fire button to restart Game
lda #%00010000 ; Mask for bit 0
bit JOY_2 ; check zero = jumping (button pressed)
bne WaitToStartGame
; ============================================================
; Setup Start of Game
; ============================================================
Continue_Game
;jsr EnemySetup
lda #0 ; PARAM1 contains X screen coord (column)
sta PARAM1
lda #19 ; PARAM2 contains Y screen coord (row)
sta PARAM2
lda #COLOR_WHITE ; PARAM3 contains the color to use
sta PARAM3
jsr DisplayText ; Then we display the stats panel
lda #0
sta SHOW_GAME_TITLE
lda #SCORE_PANEL_TEXT
sta ZEROPAGE_POINTER_1 + 1
lda #0 ; PARAM1 contains X screen coord (column)
sta PARAM1
lda #23 ; PARAM2 contains Y screen coord (row)
sta PARAM2
lda #COLOR_RED ; PARAM3 contains the color to use
sta PARAM3
jsr DisplayText ; Then we display the stats panel
lda #%00011011 ; Default (Y scroll = 3 by default)
sta VIC_SCREEN_CONTROL
lda #COLOR_BLACK
sta VIC_BORDER_COLOR
jsr ClearChsetMemory
;jsr SwitchCharSet
jsr SwitchCharSet2
ldx #25 ; (65,20=default), 59,36
ldy #0
jsr DrawMap ; Draw the level map (Screen1)
; And initialize it
;jsr CopyToBuffer ; Copy to the backbuffer(Screen2)
;Holdgame
; jmp Holdgame
#endregion
;===============================================================================
; MAIN LOOP
;===============================================================================
MainLoop
jsr WaitFrame ; wait for the vertical blank period
jsr UpdateTimers
jsr UpdatePlayer ; Player animation, etc.
jsr UpdateScroll
;jsr UpdateEnemy ; Enemy animation, etc.
jsr DisplaySpriteInfoNow ; Display simple debug info
jmp MainLoop
;===============================================================================
; FILES IN GAME PROJECT
;===============================================================================
incAsm “TitleScreen.asm”
incAsm “Collision_Detection.asm”
incAsm “Game_Interrupts.asm”
incAsm “Game_Routines.asm” ; core framework routines
incAsm “Player_Routines.asm”
incAsm “Attacker.asm”
incAsm “Screen_Memory.asm” ; screen drawing and handling
incAsm “Start_Level.asm
incAsm “Scrolling.asm”
incAsm “Sprite_Routines.asm”
incAsm “Attacker_Collision.asm”
incAsm “CharSet_Memory.asm”
;incAsm “Game_Chset.asm”
;incAsm “Title_Charpad.asm”
;===============================================================================
; JOYSTICK
;===============================================================================
DisplaySpriteInfo
lda JOY_X
bne DisplaySpriteInfoNow
lda JOY_Y
bne DisplaySpriteInfoNow
rts
DisplaySpriteInfoNow
;loadPointer WPARAM1,SCORE_SCREEN
lda #SCORE_SCREEN
sta WPARAM1 + 1
; Line 1
lda COLLIDER_ATTR
ldx #19
ldy #7
jsr DisplayByte
; lda ActiveTimer
; ldx #2
; ldx #19
; ldy #16
; jsr DisplayByte
lda PLAYER_DAMAGE
ldx #19
ldy #17
jsr DisplayByte
lda ENEMY_BULLETS
ldx #19
ldy #28
jsr DisplayByte
lda PLAYER_ISDEAD
ldx #19
ldy #36
jsr DisplayByte
; ldx #1
; lda SPRITE_POS_X,x
; ldx #19
; ldy #16
; jsr DisplayByte
; ldx #1
; lda SPRITE_POS_Y,x
; ldx #19
; ldy #33
; jsr DisplayByte
; Line 2
lda ENEMY_COLLIDER_ATTR
ldx #20
ldy #7
jsr DisplayByte
lda ActiveTimer
ldx #2
ldx #20
ldy #17
jsr DisplayByte
lda PLAYER_CASH
ldx #20
ldy #26
jsr DisplayByte
ldx #1
lda PLAYER_LIVES
ldx #20
ldy #36
jsr DisplayByte
lda MAP_X_POS
ldx #23
ldy #18
jsr DisplayByte
ldx #1
lda MAP_Y_POS
ldx #23
ldy #25
jsr DisplayByte
; Line 3
ldx #1
lda SPRITE_POS_X,x
ldx #21
ldy #27
jsr DisplayByte
ldx #1
lda SPRITE_POS_Y,x
ldx #21
ldy #35
jsr DisplayByte
; Line 4
ldx #3
lda SPRITE_POS_X,x
ldx #22
ldy #7
jsr DisplayByte
lda WaitToFireCD
ldx #22
ldy #15
jsr DisplayByte
lda FiringHoldCD
ldx #22
ldy #23
jsr DisplayByte
ldx #2
lda SPRITE_ANIM_TIMER,x
ldx #22
ldy #32
jsr DisplayByte
; Line 5
lda gamescore
ldx #23
ldy #6
jsr ScoreBoard
rts
SPRITE_CONSOLE_TEXT
byte ‘ coll:$ damage: bullets: dead: /’
byte ‘ enco:$ timr:$ cash: lives: /’
byte ‘ spcx:$ spcy:$ /’
byte ‘ enyx:$ wfir:$: frhd:$ actv:$ /’,0
SCORE_PANEL_TEXT
byte ‘ score: ‘,0
GAMEOVER_PANEL
byte ‘ /’
byte ‘ /’
byte ‘ FIRE TO PLAY AGAIN /’
byte ‘ /’
byte ‘ /’
byte ‘ ‘,0
TITLESCREEN_PANEL
byte ‘ /’
byte ‘ A YouTube game project /’
byte ‘ /’
byte ‘ By c64brain, press fire to start /’
byte ‘ /’
byte ‘ /’,0
JOY_X ; current positon of Joystick(2)
byte $00 ; -1 0 or +1
JOY_Y
byte $00 ; -1 0 or +1
NE_DIR
byte $00
JOY_NW
byte $00
BUTTON_PRESSED ; holds 1 when the button is held down
byte $00
; holds 1 when a single press is made (button released)
BUTTON_ACTION
byte $00
;——————————————————————————-
; Bit Table
; Take a value from 0 to 7 and return it’s bit value
BIT_TABLE
byte 1,2,4,8,16,32,64,128
*=$4000
;===============================================================================
; VIC MEMORY BLOCK
; CHARSET AND SPRITE DATA
;===============================================================================
; Charset and Sprite data directly loaded here.
VIC_DATA_INCLUDES
; VIC VIDEO MEMORY LAYOUT – BANK 1 ($4000 – $7FFF)
; SCREEN_1 = $4000 – $43FF (Screen 0) ; Double buffered
; SCREEN_2 = $4400 – $47FF (Screen 1) ; game screen
; MAP_CHARSET1 = $4800 – $5FFF (Charset 1) ; game chars (tiles)
; MAP_CHARSET2 = $5000 – $5FFF (Charset 1) ; game chars (tiles)
; SCORE_CHARS = $5800 – $57FF (Charset 2) ; Scoreboard chars
; SCORE_SCREEN = $5800 – $5BFF (Screen 6) ; Scoreboard Screen
; SPRITES = $5COO – $7FFF (144 Sprite Images)
;———————
; CHARACTER SET SETUP
;———————
; Going with the ‘Bear Essentials’ model would be :
;
; 000 – 063 Normal font (letters / numbers / punctuation, sprite will pass over)
; 064 – 127 Backgrounds (sprite will pass over)
; 128 – 143 Collapsing platforms (deteriorate and eventually disappear when stood on)
; 144 – 153 Conveyors (move the character left or right when stood on)
; 154 – 191 Semi solid platforms (can be stood on, but can jump and walk through)
; 192 – 239 Solid platforms (cannot pass through)
; 240 – 255 Death (spikes etc)
;
; I would prefer to follow this model for organization, but it is useful to note that
; Charpad allows the setting the upper 4 bits of Color data (which is ignored by the VIC)
; to use as 16 ‘attribute’ values. Something I am taking advantage of.
;
; MAP_CHAR_MEM points to the current character set in memory
*=$4800
MAP_CHAR_MEM ; Character set for map screen
;incbin”Parkour_Maps/Project14Anim1_Chars2.bin”
;incbin”Parkour_Maps/Project_BackupV2_Chars.bin”
TITLE_MAP_CHAR_MEM ; Character set for map screen
;incbin”Parkour_Maps/Project14Anim1_Chars2.bin”
;incbin”Parkour_Maps/Project_BackupV2_Chars.bin”
incbin”Parkour_Maps/Project16_TitleScreen_Chars1_perchar.bin”
; SPRITE DATA
;*=$5000
*=$5800
SCORE_CHAR_MEM
incbin “ScoreChars.cst”,0,255 ; Character set for scoreboard
*=$5C00
incbin “yoursprite.spt”,1,4,true ; idle (28,33)
incbin “yoursprite.spt”,5,6,true
incbin “yoursprite.spt”,7,12,true ; rope climb (36-39)
incbin “yoursprite.spt”,13,18,true ; Walking left (14-27)
incbin “yoursprite.spt”,19,24,true ; Walking right (0 – 13)
incbin “yoursprite.spt”,25,28,true ; Punching to the right
incbin “yoursprite.spt”,29,32,true ; Punching to the left
incbin “yoursprite.spt”,33,34,true ; Fighting
incbin “yoursprite.spt”,35,38,true ; Kicking to the right
incbin “yoursprite.spt”,39,42,true ; Kicking to the left
incbin “yoursprite.spt”,43,43,true ; Unused
incbin “yoursprite.spt”,44,46,true ; Swimming to the right
incbin “yoursprite.spt”,47,50,true ; Swimming to the left
incbin “yoursprite.spt”,51,52,true ; Player (gun to the right)
incbin “yoursprite.spt”,53,54,true ; Player (gun to the left)
incbin “yoursprite.spt”,55,55,true ; Enemy bullet
incbin “yoursprite.spt”,56,59,true ; Unused
incbin “yoursprite.spt”,60,66,true ; Unused
incbin “yoursprite.spt”,67,68,true ; Enemy shooting left
incbin “yoursprite.spt”,69,74,true ; Enemy running left
incbin “yoursprite.spt”,75,80,true ; Enemy running right
incbin “yoursprite.spt”,81,82,true ; Enemy shooting right
incbin “yoursprite.spt”,83,84,true ; Dead sprite to left
incbin “yoursprite.spt”,85,88,true ; Enemy attack to right
incbin “yoursprite.spt”,89,92,true ; Enemy attack to left
incbin “yoursprite.spt”,93,94,true ; Unused
incbin “yoursprite.spt”,95,96,true ; Dead sprite to left
incbin “yoursprite.spt”,97,98,true ; Dead sprite to left
incbin “yoursprite.spt”,99,104,true ; Enemy front walking
incbin “yoursprite.spt”,105,110,true ; Enemy back walking
;===============================================================================
; LEVEL DATA
;===============================================================================
; Each Level has a character set (2k) an attribute/color list (256 bytes)
; 64 4×4 tiles (1k)
; and a 64 x 32 (or 32 x 64) map (2k).
; The current level map will be put at $8000 with Attribute lists (256 bytes)
; and Tiles (1k)
; Starting after it at 8800
*=$8000
MAP_MEM
;incbin”Parkour_Maps/Project16_TitleScreen_Map1_perchar.bin”
;incbin”Parkour_Maps/Project14Anim1_Map2.bin”
;incbin”Parkour_Maps/Project_BackupV2_Map.bin”
;incbin”Parkour_Maps/Project14Anim1_Backup5c_Map.bin”
TITLE_MAP_MEM
;incbin”Parkour_Maps/Project16_TitleScreen_Map1_perchar.bin”
incbin”Parkour_Maps/Project16_TitleScreen_Map1_perchar.bin”
;*=$9325
TITLE_ATTRIBUTE_MEM
incbin”Parkour_Maps/Project16_TitleScreen_CharAttribs_perchar_L1.bin”
;*=$960B
TITLE_TILE_MEM
;incbin”Parkour_Maps/Project16_TitleScreen_Tiles1_perchar.bin”
incbin”Parkour_Maps/Project16_TitleScreen_Tiles1_perchar.bin”
GAMECHARS_MEM
;incbin”Parkour_Maps/Project14Anim1_Chars2.bin”
;incbin”Parkour_Maps/Project_BackupV2_Chars.bin”
;incbin”Parkour_Maps/Project16_TitleScreen_Chars1b_perchar.bin”
incbin”Parkour_Maps/Project14Anim1_Backup5c_Chars.bin”
; Attributes
;*=$9325
ATTRIBUTE_MEM
;incbin”Parkour_Maps/Project14Anim1_CharAttribs2.bin”
;incbin”Parkour_Maps/Project16_TitleScreen_CharAttribs1_perchar_L1.bin”
;incbin”Parkour_Maps/Project_BackupV2_CharAttribs_L1.bin”
incbin”Parkour_Maps/Project14Anim1_Backup5c_CharAttribs_L1.bin”
TILE_MEM
;TILE1_MEM
;incbin”Parkour_Maps/Project16_TitleScreen_Tiles1_perchar.bin”
;incbin”Parkour_Maps/Project_BackupV2_Tiles.bin”
;incbin”Parkour_Maps/Project14Anim1_Tiles2.bin”
incbin”Parkour_Maps/Project14Anim1_Backup5c_Tiles.bin”
CharSet_Memory.asm
;==============================================================
; Find starting position of character set data
; by reading from “Game_Chset.asm”
; Add chset data into memory ($4800,x)
; Loop until all memory is filled.
;==============================================================
FillScoreScreen
lda SCORE_SCREEN_LO ; fetch the character set data
sta ZEROPAGE_POINTER_4
lda SCORE_SCREEN_HI
sta ZEROPAGE_POINTER_4 + 1
ldx #4
fy2 ldy #0
fs1 lda #42
sta (ZEROPAGE_POINTER_4),y
iny
bne fs1
inc ZEROPAGE_POINTER_4 + 1
dex
bne fy2
rts
FillScreen
lda MAIN_SCREEN_LO ; fetch the character set data
sta ZEROPAGE_POINTER_4
lda MAIN_SCREEN_HI
sta ZEROPAGE_POINTER_4 + 1
ldx #4
dy2 ldy #0
ds1 lda #0
sta (ZEROPAGE_POINTER_4),y
iny
bne ds1
inc ZEROPAGE_POINTER_4 + 1
dex
bne dy2
rts
ClearChsetMemory
lda CHSET_DATA_LOOKUP_LO ; fetch the character set data
sta ZEROPAGE_POINTER_1
lda CHSET_DATA_LOOKUP_HI
sta ZEROPAGE_POINTER_1 + 1
lda CHSET_MEM_LOOKUP_LO ; memory starts at $4800
sta ZEROPAGE_POINTER_2
lda CHSET_MEM_LOOKUP_HI
sta ZEROPAGE_POINTER_2 + 1
ldx #7
cly2 ldy #0
cls1
lda #0
sta (ZEROPAGE_POINTER_2),y
dey
bne chs1
inc ZEROPAGE_POINTER_1 + 1
inc ZEROPAGE_POINTER_2 + 1
dex
bpl cls1
rts
SwitchCharSet
lda CHSET_DATA_LOOKUP_LO ; fetch the character set data
sta ZEROPAGE_POINTER_4
lda CHSET_DATA_LOOKUP_HI
sta ZEROPAGE_POINTER_4 + 1
lda CHSET_MEM_LOOKUP_LO ; memory starts at $4800
sta ZEROPAGE_POINTER_1
lda CHSET_MEM_LOOKUP_HI
sta ZEROPAGE_POINTER_1 + 1
ldx #7
cy2 ldy #0
cs1 lda (ZEROPAGE_POINTER_4),y
sta (ZEROPAGE_POINTER_1),y
iny
bne cs1
inc ZEROPAGE_POINTER_1 + 1
dex
bne cy2
rts
SwitchCharSet2
lda CHSET_DATA_LOOKUP_LO ; fetch the character set data
sta ZEROPAGE_POINTER_1
lda CHSET_DATA_LOOKUP_HI
sta ZEROPAGE_POINTER_1 + 1
lda CHSET_MEM_LOOKUP_LO ; memory starts at $4800
sta ZEROPAGE_POINTER_2
lda CHSET_MEM_LOOKUP_HI
sta ZEROPAGE_POINTER_2 + 1
ldx #7
chy2 ldy #0
chs1
lda (ZEROPAGE_POINTER_1),y
sta (ZEROPAGE_POINTER_2),y
dey
bne chs1
inc ZEROPAGE_POINTER_1 + 1
inc ZEROPAGE_POINTER_2 + 1
dex
bpl chs1
rts
LoadChset
; Find starting address for GAMECHSET1_MEM
lda CHSET_DATA_LOOKUP_LO ; fetch the character set data
sta ZEROPAGE_POINTER_4
lda CHSET_DATA_LOOKUP_HI
sta ZEROPAGE_POINTER_4 + 1
; Find starting address for CHSET_LOC
lda CHSET_MEM_LOOKUP_LO ; memory starts at $4800
sta ZEROPAGE_POINTER_1
lda CHSET_MEM_LOOKUP_HI
sta ZEROPAGE_POINTER_1 + 1
ldx #7
ldy #0
titleloop1
;jsr ReadChset
;lda #0
; lda (ZEROPAGE_POINTER_4),y ; read MAP_CHAR_MEM
; sta (ZEROPAGE_POINTER_1),y
; clc
; adc ZEROPAGE_POINTER_1 ; inc $4800 (hi/low bytes)
; sta ZEROPAGE_POINTER_1
; iny
; lda (ZEROPAGE_POINTER_4),y
; adc #0
; sta ZEROPAGE_POINTER_1 + 1
; cpy #128
; bne loop1
; rts
lda (ZEROPAGE_POINTER_4),y
;lda #129
sta (ZEROPAGE_POINTER_1),y
iny
;cpy #255
bne titleloop1
; inc ZEROPAGE_POINTER_4 + 1
; inc ZEROPAGE_POINTER_1 + 1
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1 ; destination base address is in ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1 ; destination base address is in ZEROPAGE_POINTER_1
inc ZEROPAGE_POINTER_4 + 1
inc ZEROPAGE_POINTER_1 + 1
; lda (ZEROPAGE_POINTER_4),y ; read MAP_CHAR_MEM
; sta (ZEROPAGE_POINTER_1),y
; clc
; adc ZEROPAGE_POINTER_1 ; inc $4800 (hi/low bytes)
; sta ZEROPAGE_POINTER_1
; iny
; lda (ZEROPAGE_POINTER_4),y
; adc #0
; sta ZEROPAGE_POINTER_1 + 1
dex
bne titleloop1
rts
lda ZEROPAGE_POINTER_4 ; GAMECHSET1_MEM
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1
lda ZEROPAGE_POINTER_1 ; CHSET_LOC ($4800)
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1
dex
bne loop1
rts
; ldy #0
; inx
; cpx #16 ; read 4×4 tiles (4×4=16 in total)
; bne loop1
rts
SwitchTitleSet
; Find starting address for GAMECHSET1_MEM
lda CHSET_DATA_LOOKUP_LO ; fetch the character set data
sta ZEROPAGE_POINTER_4
lda CHSET_DATA_LOOKUP_HI
sta ZEROPAGE_POINTER_4 + 1
; Find starting address for CHSET_LOC
lda CHSET_MEM_LOOKUP_LO ; memory starts at $4800
sta ZEROPAGE_POINTER_1
lda CHSET_MEM_LOOKUP_HI
sta ZEROPAGE_POINTER_1 + 1
ldx #7
ldy #0
loop1
lda (ZEROPAGE_POINTER_4),y
;lda #129
sta (ZEROPAGE_POINTER_1),y
iny
bne loop1
; inc ZEROPAGE_POINTER_4 + 1
; inc ZEROPAGE_POINTER_1 + 1
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1 ; destination base address is in ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1 ; destination base address is in ZEROPAGE_POINTER_1
inc ZEROPAGE_POINTER_4 + 1
inc ZEROPAGE_POINTER_1 + 1
dex
bne loop1
rts
CHSET_DATA_LOOKUP_LO
byte GAMECHARS_MEM
CHSET_MEM_LOOKUP_LO
byte CHSET_LOC
MAIN_SCREEN_LO
byte SCREEN1_MEM
SCORE_SCREEN_LO
byte SCORE_SCREEN
StartLevel.asm
;===============================================================================
; CHAR PAD TOOLS
;===============================================================================
; Peter ‘Sig’ Hewett 2017
;——————————————————————————-
; Tools for integrating CharPad character sets, tiles, and maps
;===============================================================================
; Map Notes:
;
; CharPad setup : To make a level map, set up for 256 characters
; A tile size of 4×4
; Set number of tiles to 64
; Set map size to 64 x 32
; *IMPORTANT* set color to ‘per character’
;
;——————————————————————————-
; DRAW MAP
;——————————————————————————-
; Draw the entire map on the screen. This won’t be done that often as most updates
; to the screen will be scrolling. But for starting a level, resetting on death,
; or teleporting, we need to build the entire screen.
; This also sets up essential data for using the map.
; Initializes : MAP_POS_X
; MAP_POS_Y
; MAP_POS_ADDRESS
; MAP_X_DELTA
; MAP_Y_DELTA
;
; X = Start map X coord (top left corner)
; Y = Start map Y coord (top left corner)
;
; Uses ZEROPAGE_POINTER_4 (as TileDraw uses 1,2,3)
;——————————————————————————-
; New code: 10/16/23
; Pointing to TILE1_NUMBER_LOOKUP_LO,x
; Pointing to ATTRIB1_MEM
#region “DrawMap”
DrawMap
lda SHOW_GAME_TITLE
beq MainGame
;jsr BeginTitleScreen
MainGame
lda #0
sta MAP_X_DELTA
sta MAP_Y_DELTA
stx MAP_X_POS
sty MAP_Y_POS
;—————————————————————
; First find the address for the starting map position
ldx MAP_Y_POS
lda MAP_LINE_LOOKUP_LO,x ; fetch the address for the line (Y pos)
sta ZEROPAGE_POINTER_4
lda MAP_LINE_LOOKUP_HI,x
sta ZEROPAGE_POINTER_4 + 1
clc
lda ZEROPAGE_POINTER_4 ; add the x position
adc MAP_X_POS
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1 ; ZEROPAGE_POINTER_1 now holds the
; map start address
; Save this info for map usage
;copyPointer ZEROPAGE_POINTER_4, MAP_POS_ADDRESS
lda ZEROPAGE_POINTER_4
sta MAP_POS_ADDRESS
lda ZEROPAGE_POINTER_4 + 1
sta MAP_POS_ADDRESS + 1
;———————————————————————–
; Fetch map data and draw tile – coords are in ’tiles’ not
; character positions
ldy #0 ; holds X screen coord
ldx #0 ; holds Y screen coord
@loop
lda (ZEROPAGE_POINTER_4),y ; fetch map data
jsr DrawTile ; draw the tile
iny ; inc X and check for end of screen
cpy #10 ; draw 10 tiles left to right
bne @loop
; go down one line on the map (64 char)
;addPointer ZEROPAGE_POINTER_4, 100
lda ZEROPAGE_POINTER_4
clc
adc #100
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1
ldy #0
inx
cpx #6
bne @loop
rts
#endregion
;——————————————————————————-
; DRAW TILE
;——————————————————————————-
; This routine actually won’t be called that often. Most updates are scrolling,
; so there are very few circumstances that need a whole tile drawn at once.
;——————————————————————————-
;
; X = Screen tile Y coord – ‘flipped’ so it dovetails into the MapDraw
; Y = Screen tile X coord routine without exhanging data in registers
; A = Tile # to draw
;
; Restores registers off the stack A / X / Y
;——————————————————————————-
#region “DrawTile”
DrawTile
sta PARAM1 ; save tile number
sty PARAM2 ; save X pos
stx PARAM3 ; save Y pos
saveRegs ; put registers on the stack to
; exit cleaner – this routine will
; likely be nested
;——————————————————
; First get the destination for the tile
lda PARAM3 ; fetch the Y pos (in tile coords)
asl ; point to next tile row (16 * 2) (16 * 3), etc.
asl ; multiply by 4 (tiles are 4 x 4 chars)
tax ; screen line in X
; tax (PARAM3: x reg = points to each tile row on screen)
; Tile 1: (asl, asl) * 4
; Tile 2: (asl, asl) * 4
; ZEROPAGE_POINTER_1 = screen char(tile number)
; The GetScreenLineAddress reads at ZEROPAGE_POINTER_1 (data)
; to see what tile exists there.
jsr GetScreenLineAddress ; fetch line address based on current displayed screen
; Y line address is in ZEROPAGE_POINTER_1
; Find the address for color memory
; ZEROPAGE_POINTER_3 = COLOR RAM
lda COLOR_LINE_OFFSET_TABLE_LO,x ; fetch color ram line address too
sta ZEROPAGE_POINTER_3
lda COLOR_LINE_OFFSET_TABLE_HI,x
sta ZEROPAGE_POINTER_3 + 1
lda PARAM2 ; get X coord
asl ; multiply by 4
asl
tax ; save it in x (x = COLOR RAM)
clc ; add to Y line address
; screen character data
adc ZEROPAGE_POINTER_1
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1 ; destination base address is in ZEROPAGE_POINTER_1
txa
; color ram data
clc
adc ZEROPAGE_POINTER_3 ; color ram destination is in ZEROPAGE_POINTER_3
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
;————————————————————
; Fetch the source tile address
ldx PARAM1 ; Fetch the tile number
lda TILE_NUMBER_LOOKUP_LO,x
sta ZEROPAGE_POINTER_2
lda TILE_NUMBER_LOOKUP_HI,x
sta ZEROPAGE_POINTER_2 + 1
;————————————————————-
; Loop through and draw the tile
ldy #0
@drawloop1
lda (ZEROPAGE_POINTER_2),y ; Get the character code
sta (ZEROPAGE_POINTER_1),y ; store it on the screen
tax ; pass to X as an offset
lda ATTRIBUTE_MEM,x ; fetch the color/data attribute
sta (ZEROPAGE_POINTER_3),y ; write it to color ram
cpy #15 ; drawn the 15th character? We’re finished
beq @done1
tya ; save Y before the increment for our test
iny ; (saves having to inc it in 2 diff places)
; I need to count 0-3 to draw a row of tiles,
and #%00000011 ; but I need to count 0-15 to fetch the tile data
cmp #3 ; both NEED to use indirect Y addressing, and saving/
bne @drawloop1 ; fetching Y rapidly becomes a tangled nightmare.
; by masking out the last 2 bits in A, we get a number
; that counts 0-3 over and over without stopping the
; data fetch count 0-15. It’s also faster than my other
; options by quite a bit.
clc ; add new line
lda ZEROPAGE_POINTER_1 ; increment destination and color ram by 1 line – 4 chars
adc #40 – 4
sta ZEROPAGE_POINTER_1 ; by ‘backsetting’ our pointers, we don’t need to change Y
lda ZEROPAGE_POINTER_1 + 1 ; when drawing 0-3 characters, and can leave the 0-15
adc #0 ; count intact.
sta ZEROPAGE_POINTER_1 + 1 ; We have to increase them to the next line anyways, so this
; only saves time.
clc
lda ZEROPAGE_POINTER_3
adc #40 – 4
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
jmp @drawloop1
@done1
restoreRegs ; pull registers back off the stack
rts
#endRegion
#region “DrawMap”
;TileMap
lda #0
sta MAP_X_DELTA
sta MAP_Y_DELTA
stx MAP_X_POS
sty MAP_Y_POS
;—————————————————————
; First find the address for the starting map position
ldx MAP_Y_POS
lda MAP_LINE_LOOKUP_LO,x ; fetch the address for the line (Y pos)
sta ZEROPAGE_POINTER_4
lda MAP_LINE_LOOKUP_HI,x
sta ZEROPAGE_POINTER_4 + 1
clc
lda ZEROPAGE_POINTER_4 ; add the x position
adc MAP_X_POS
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1 ; ZEROPAGE_POINTER_1 now holds the map
; start address
; Save this info for map usage
copyPointer ZEROPAGE_POINTER_4, MAP_POS_ADDRESS
;———————————————————————–
; Fetch map data and draw tile – coords are in ’tiles’ not
; character positions
ldy #0 ; holds X screen coord
ldx #0 ; holds Y screen coord
@loop
lda (ZEROPAGE_POINTER_4),y ; fetch map data
;jsr TileDraw ; draw the tile
iny ; inc X and check for end of screen
cpy #2 ; (10 tiles)
bne @loop
; go down one line on the map (64 char)
addPointer ZEROPAGE_POINTER_4, 100
ldy #0
inx
cpx #6
bne @loop
rts
#endregion
;——————————————————————————-
; DRAW TILE
;——————————————————————————-
; This routine actually won’t be called that often. Most updates are scrolling,
; so there are very few circumstances that need a whole tile drawn at once.
;——————————————————————————-
;
; X = Screen tile Y coord – ‘flipped’ so it dovetails into the MapDraw
; Y = Screen tile X coord routine without exhanging data in registers
; A = Tile # to draw
;
; Restores registers off the stack A / X / Y
;——————————————————————————-
#region “DrawTile”
;TileDraw
sta PARAM1 ; save tile number
sty PARAM2 ; save X pos
stx PARAM3 ; save Y pos
saveRegs ; put registers on the stack to
; exit cleaner – this routine will
; likely be nested
;——————————————————
; First get the destination for the tile
lda PARAM3 ; fetch the Y pos (in tile coords)
asl
asl ; multiply by 4 (tiles are 4 x 4 chars)
tax ; screen line in X
jsr GetScreenLineAddress ; fetch line address based on current displayed screen
; Y line address is in ZEROPAGE_POINTER_1
lda COLOR_LINE_OFFSET_TABLE_LO,x ; fetch color ram line address too
sta ZEROPAGE_POINTER_3
lda COLOR_LINE_OFFSET_TABLE_HI,x
sta ZEROPAGE_POINTER_3 + 1
lda PARAM2 ; get X coord
asl ; multiply by 4
asl
tax ; save it in x
clc ; add to Y line address
adc ZEROPAGE_POINTER_1
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1 ; destination base address is in ZEROPAGE_POINTER_1
txa
clc
adc ZEROPAGE_POINTER_3 ; color ram destination is in ZEROPAGE_POINTER_3
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
;————————————————————
; Fetch the source tile address
ldx PARAM1 ; Fetch the tile number
lda TILE_NUMBER_LOOKUP_LO,x
sta ZEROPAGE_POINTER_2
lda TILE_NUMBER_LOOKUP_HI,x
sta ZEROPAGE_POINTER_2 + 1
;————————————————————-
; Loop through and draw the tile
ldy #0
@drawloop
lda (ZEROPAGE_POINTER_2),y ; Get the character code
sta (ZEROPAGE_POINTER_1),y ; store it on the screen
tax ; pass to X as an offset
lda ATTRIBUTE_MEM,x ; fetch the color/data attribute
sta (ZEROPAGE_POINTER_3),y ; write it to color ram
cpy #15 ; drawn the 15th character? We’re finished
beq @done
tya ; save Y before the increment for our test
iny ; (saves having to inc it in 2 diff places)
; I need to count 0-3 to draw a row of tiles,
and #%00000011 ; but I need to count 0-15 to fetch the tile data
cmp #3 ; both NEED to use indirect Y addressing, and saving/
bne @drawloop ; fetching Y rapidly becomes a tangled nightmare.
; by masking out the last 2 bits in A, we get a number
; that counts 0-3 over and over without stopping the
; data fetch count 0-15. It’s also faster than my other
; options by quite a bit.
clc ; add new line
lda ZEROPAGE_POINTER_1 ; increment destination and color ram by 1 line – 4 chars
adc #40 – 4
sta ZEROPAGE_POINTER_1 ; by ‘backsetting’ our pointers, we don’t need to change Y
lda ZEROPAGE_POINTER_1 + 1 ; when drawing 0-3 characters, and can leave the 0-15
adc #0 ; count intact.
sta ZEROPAGE_POINTER_1 + 1 ; We have to increase them to the next line anyways, so this
; only saves time.
clc
lda ZEROPAGE_POINTER_3
adc #40 – 4
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
jmp @drawloop
@done
restoreRegs ; pull registers back off the stack
rts
;===============================================================================
; LEVEL DATA AND TABLES
;===============================================================================
CURRENT_LEVEL
byte 0
;CHAR_ADDRESS
; word LEVEL_1_CHARS
ATTRIB_ADDRESS
word ATTRIBUTE_MEM
TILE_ADDRESS
word TILE_MEM
MAP_ADDRESS
word LEVEL_1_MAP
;——————————————————————————-
; MAP DATA LOOKUP TABLE 1
;——————————————————————————-
; Lookup table to return an address to a map line (Y coord). This table assumes
; a landscape
; layout (64 x 32 tiles). A portrait style table will be done in the future to
; allow more vertical maps
;——————————————————————————-
MAP_LINE_LOOKUP_LO
byte <MAP_MEM
byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte
;; New lines – Parkour Big Map
byte byte byte byte byte byte byte byte byte byte byte byte byte
byte byte byte byte byte
byte byte byte byte byte
MAP_LINE_LOOKUP_HI
byte >MAP_MEM
byte >MAP_MEM + 100
byte >MAP_MEM + 200
byte >MAP_MEM + 300
byte >MAP_MEM + 400
byte >MAP_MEM + 500
byte >MAP_MEM + 600
byte >MAP_MEM + 700
byte >MAP_MEM + 800
byte >MAP_MEM + 900
byte >MAP_MEM + 1000 ; 10
byte >MAP_MEM + 1100
byte >MAP_MEM + 1200
byte >MAP_MEM + 1300
byte >MAP_MEM + 1400
byte >MAP_MEM + 1500
byte >MAP_MEM + 1600
byte >MAP_MEM + 1700
byte >MAP_MEM + 1800
byte >MAP_MEM + 1900
byte >MAP_MEM + 2000 ;20
byte >MAP_MEM + 2100
byte >MAP_MEM + 2200
byte >MAP_MEM + 2300 ; byte >MAP_MEM + 4700
byte >MAP_MEM + 2400
byte >MAP_MEM + 2500
byte >MAP_MEM + 2600
byte >MAP_MEM + 2700
byte >MAP_MEM + 2800
byte >MAP_MEM + 2900 ;30
byte >MAP_MEM + 3000
byte >MAP_MEM + 3100 ;32
; New lines – Parkour Big Map
byte >MAP_MEM + 3200
byte >MAP_MEM + 3300
byte >MAP_MEM + 3400
byte >MAP_MEM + 3500
byte >MAP_MEM + 3600
byte >MAP_MEM + 3700
byte >MAP_MEM + 3800
byte >MAP_MEM + 3900
byte >MAP_MEM + 4000
byte >MAP_MEM + 4100
byte >MAP_MEM + 4200
byte >MAP_MEM + 4300
byte >MAP_MEM + 4400
byte >MAP_MEM + 4500
byte >MAP_MEM + 4600
byte >MAP_MEM + 4700
byte >MAP_MEM + 4800
byte >MAP_MEM + 4900
byte >MAP_MEM + 5000
byte >MAP_MEM + 5010
byte >MAP_MEM + 5020
byte >MAP_MEM + 5030
byte >MAP_MEM + 5040
byte >MAP_MEM + 5050
;MAP1_LINE_LOOKUP_LO
; byte <MAP1_MEM
; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte
;;; New lines – Parkour Big Map
; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte
; byte ; byte ; byte ; byte ; byte
; byte ; byte ; byte ; byte ; byte
;MAP1_LINE_LOOKUP_HI
; byte >MAP1_MEM
; byte >MAP1_MEM + 100
; byte >MAP1_MEM + 200
; byte >MAP1_MEM + 300
; byte >MAP1_MEM + 400
; byte >MAP1_MEM + 500
; byte >MAP1_MEM + 600
; byte >MAP1_MEM + 700
; byte >MAP1_MEM + 800
; byte >MAP1_MEM + 900
; byte >MAP1_MEM + 1000 ; 10
; byte >MAP1_MEM + 1100
; byte >MAP1_MEM + 1200
; byte >MAP1_MEM + 1300
; byte >MAP1_MEM + 1400
; byte >MAP1_MEM + 1500
; byte >MAP1_MEM + 1600
; byte >MAP1_MEM + 1700
; byte >MAP1_MEM + 1800
; byte >MAP1_MEM + 1900
; byte >MAP1_MEM + 2000 ;20
; byte >MAP1_MEM + 2100
; byte >MAP1_MEM + 2200
; byte >MAP1_MEM + 2300 ; byte >MAP_MEM + 4700
; byte >MAP1_MEM + 2400
; byte >MAP1_MEM + 2500
; byte >MAP1_MEM + 2600
; byte >MAP1_MEM + 2700
; byte >MAP1_MEM + 2800
; byte >MAP1_MEM + 2900 ;30
; byte >MAP1_MEM + 3000
; byte >MAP1_MEM + 3100 ;32
;;; New lines – Parkour Big Map
; byte >MAP1_MEM + 3200
; byte >MAP1_MEM + 3300
; byte >MAP1_MEM + 3400
; byte >MAP1_MEM + 3500
; byte >MAP1_MEM + 3600
; byte >MAP1_MEM + 3700
; byte >MAP1_MEM + 3800
; byte >MAP1_MEM + 3900
; byte >MAP1_MEM + 4000
; byte >MAP1_MEM + 4100
; byte >MAP1_MEM + 4200
; byte >MAP1_MEM + 4300
; byte >MAP1_MEM + 4400
; byte >MAP1_MEM + 4500
; byte >MAP1_MEM + 4600
; byte >MAP1_MEM + 4700
; byte >MAP1_MEM + 4800
; byte >MAP1_MEM + 4900
; byte >MAP1_MEM + 5000
; byte >MAP1_MEM + 5010
; byte >MAP1_MEM + 5020
; byte >MAP1_MEM + 5030
; byte >MAP1_MEM + 5040
; byte >MAP1_MEM + 5050
;——————————————————————————-
; TILE ADDRESS LOOKUP TABLE
;——————————————————————————-
; Lookup table to find the start address of a tile on the current map.
; All current level tiles are
; held in TILE_MEM, there are 64 entries
;——————————————————————————-
; Each tile in a complete row contains 16 characters
; Tile1 = 16 (16 + 0)
; Tile2 = 32 (16 * 2)
; Tile3 = 48 (16 * 3)
TILE_NUMBER_LOOKUP_LO
byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte
TILE_NUMBER_LOOKUP_HI
byte >TILE_MEM ; 0
byte >TILE_MEM + 16
byte >TILE_MEM + 32
byte >TILE_MEM + 48
byte >TILE_MEM + 64
byte >TILE_MEM + 80
byte >TILE_MEM + 96
byte >TILE_MEM + 112
byte >TILE_MEM + 128
byte >TILE_MEM + 144
byte >TILE_MEM + 160 ; 10
byte >TILE_MEM + 176
byte >TILE_MEM + 192
byte >TILE_MEM + 208
byte >TILE_MEM + 224
byte >TILE_MEM + 240
byte >TILE_MEM + 256
byte >TILE_MEM + 272
byte >TILE_MEM + 288
byte >TILE_MEM + 304
byte >TILE_MEM + 320 ; 20
byte >TILE_MEM + 336
byte >TILE_MEM + 352
byte >TILE_MEM + 368
byte >TILE_MEM + 384
byte >TILE_MEM + 400
byte >TILE_MEM + 416
byte >TILE_MEM + 432
byte >TILE_MEM + 448
byte >TILE_MEM + 464
byte >TILE_MEM + 480 ; 30
byte >TILE_MEM + 496
byte >TILE_MEM + 512
byte >TILE_MEM + 528
byte >TILE_MEM + 544
byte >TILE_MEM + 560
byte >TILE_MEM + 576
byte >TILE_MEM + 592
byte >TILE_MEM + 608
byte >TILE_MEM + 624
byte >TILE_MEM + 640 ; 40
byte >TILE_MEM + 656
byte >TILE_MEM + 672
byte >TILE_MEM + 688
byte >TILE_MEM + 704
byte >TILE_MEM + 720
byte >TILE_MEM + 736
byte >TILE_MEM + 752
byte >TILE_MEM + 768
byte >TILE_MEM + 784
byte >TILE_MEM + 800 ;50
byte >TILE_MEM + 816
byte >TILE_MEM + 832
byte >TILE_MEM + 848
byte >TILE_MEM + 864
byte >TILE_MEM + 880
byte >TILE_MEM + 896
byte >TILE_MEM + 912
byte >TILE_MEM + 928
byte >TILE_MEM + 944
byte >TILE_MEM + 960 ; 10
byte >TILE_MEM + 976
byte >TILE_MEM + 992
byte >TILE_MEM + 1008
byte >TILE_MEM + 1024 ; 64
;TILE1_NUMBER_LOOKUP_LO
; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte
;TILE1_NUMBER_LOOKUP_HI
; byte >TILE1_MEM ; 0
; byte >TILE1_MEM + 16
; byte >TILE1_MEM + 32
; byte >TILE1_MEM + 48
; byte >TILE1_MEM + 64
; byte >TILE1_MEM + 80
; byte >TILE1_MEM + 96
; byte >TILE1_MEM + 112
; byte >TILE1_MEM + 128
; byte >TILE1_MEM + 144
; byte >TILE1_MEM + 160 ; 10
; byte >TILE1_MEM + 176
; byte >TILE1_MEM + 192
; byte >TILE1_MEM + 208
; byte >TILE1_MEM + 224
; byte >TILE1_MEM + 240
; byte >TILE1_MEM + 256
; byte >TILE1_MEM + 272
; byte >TILE1_MEM + 288
; byte >TILE1_MEM + 304
; byte >TILE1_MEM + 320 ; 20
; byte >TILE1_MEM + 336
; byte >TILE1_MEM + 352
; byte >TILE1_MEM + 368
; byte >TILE1_MEM + 384
; byte >TILE1_MEM + 400
; byte >TILE1_MEM + 416
; byte >TILE1_MEM + 432
; byte >TILE1_MEM + 448
; byte >TILE1_MEM + 464
; byte >TILE1_MEM + 480 ; 30
; byte >TILE1_MEM + 496
; byte >TILE1_MEM + 512
; byte >TILE1_MEM + 528
; byte >TILE1_MEM + 544
; byte >TILE1_MEM + 560
; byte >TILE1_MEM + 576
; byte >TILE1_MEM + 592
; byte >TILE1_MEM + 608
; byte >TILE1_MEM + 624
; byte >TILE1_MEM + 640 ; 40
; byte >TILE1_MEM + 656
; byte >TILE1_MEM + 672
; byte >TILE1_MEM + 688
; byte >TILE1_MEM + 704
; byte >TILE1_MEM + 720
; byte >TILE1_MEM + 736
; byte >TILE1_MEM + 752
; byte >TILE1_MEM + 768
; byte >TILE1_MEM + 784
; byte >TILE1_MEM + 800 ;50
; byte >TILE1_MEM + 816
; byte >TILE1_MEM + 832
; byte >TILE1_MEM + 848
; byte >TILE1_MEM + 864
; byte >TILE1_MEM + 880
; byte >TILE1_MEM + 896
; byte >TILE1_MEM + 912
; byte >TILE1_MEM + 928
; byte >TILE1_MEM + 944
; byte >TILE1_MEM + 960 ; 10
; byte >TILE1_MEM + 976
; byte >TILE1_MEM + 992
; byte >TILE1_MEM + 1008
; byte >TILE1_MEM + 1024 ; 64
;GAMECHMAP_LO
; byte <GAMECH_MAP
;GAMECHMAP_HI
; byte >GAMECH_MAP
;GAMECHARS_LO
; byte <GAMECHARS_MEM
;GAMECHARS_HI
; byte >GAMECHARS_MEM
;GAMEATTRIBS_LO
; byte <GAME_CHATTRIBS
;GAMEATTRIBS_HI
; byte >GAME_CHATTRIBS
GAME_CHTILES_LO
byte GAME_CHTILES_HI
byte >MAP_CHAR_MEM
VIC_Registers.asm
;===============================================================================
; VIC II REGISTER INCLUDE FILE
;===============================================================================
; Peter ‘Sig’ Hewett aka Retroromicon
; – 2016
;===============================================================================
; VIC II REGISTERS
VIC_SPRITE_X_POS = $D000 ; Increment by 2 bytes for the next sprite x pos
VIC_SPRITE_Y_POS = $D001 ; Increment by 2 bytes for the next sprite y pos
VIC_SPRITE_X_EXTEND = $D010 ; Bits #0 – 7 : Extended X bit for sprites 0-7
VIC_SCREEN_CONTROL_Y = $D011
VIC_SCREEN_CONTROL = $D011 ; Screen Control Register 1
; Bits #0-#2: Vertical raster scroll
; Bit #3 : Screen Height 0 = 24 rows 1 = 25 rows
; Bit #4 : 0 = Screen off 1 = Screen on (normal function)
; Bit #5 : 0 = Text Mode ; 1 = Bitmap mode
; Bit #6 : 1 = Extended Background Mode on
; Bit #7 : Read current raster line (bit #8)
; Write: Raster line to generate interrupt at (bit #8)
;
VIC_RASTER_LINE = $D012 ; Read: Current raster line (bits #0-#7)
; Write: Raster line to generate interrupt at (bits #0-#7).
VIC_SPRITE_ENABLE = $D015 ; (53269) set bits 0-8 to enable repective sprite
VIC_SCREEN_CONTROL_X = $D016
VIC_CONTROL = $D016 ; Screen Control Register 2
; Bits #0-#2 : Horizontal raster scroll
; Bit #3 : Screen Width ; 0 = 38 cols 1 = 40 cols
; Bit #4 : 1 = Multicolor mode on
; Default : $C8 (%11001000)
VIC_MEMORY_CONTROL = $D018 ; MEMORY SETUP REGISTER BITS
; Bits #1-#3 in text mode are a pointer
; to character memory relative to VIC_BANK ($DD00)
; %000, 0 : $0000-$07FF
; %001, 1 : $0800-$0FFF
; %010, 2 : $1000-$17FF
; %011, 3 : $1800-$1FFF
; %100, 4 : $2000-$27FF
; %101, 5 : $2800-$2FFF
; %110, 6 : $3000-$37FF
; %111, 7 : $3800-$3FFF
; Values %010 and %011 in VIC Bank #0 and #2
; select Character ROM instead
;
; In bitmap mode, pointer to bitmap memory
; (bit #13) relative to VIC_BANK address ($DD00)
; %0xx, 0 : $0000-$1FFFF
; %1xx, 4 : $2000-$3FFFF
;
; Bits #4-#7 : Pointer to screen memory (bits #10-#13)
; relative to VIC_BANK address ($DD00)
; %0000, 0 : $0000 – $03FF
; %0001, 1 : $0400 – $07FF
; %0010, 2 : $0800 – $0BFF
; %0011, 3 : $0C00 – $0FFF
; %0100, 4 : $1000 – $13FF
; %0101, 5 : $1400 – $17FF
; %0110, 6 : $1800 – $1BFF
; %0111, 7 : $1C00 – $1FFF
; %1000, 8 : $2000 – $23FF
; %1001, 9 : $2400 – $27FF
; %1010, 10 : $2800 – $2BFF
; %1011, 11 : $2C00 – $2FFF
; %1100, 12 : $3000 – $33FF
; %1101, 13 : $3400 – $37FF
; %1110, 14 : $3800 – $3BFF
; %1111, 15 : $3C00 – $3FFF
VIC_MASK_IRQ = $D019
VIC_INTERRUPT_CONTROL = $D01A ; (53274) Interrupt control register
; Bit #0 1 = Raster interupt enabled
; Bit #1 1 = Sprite – Background collision interupt enabled
; Bit #2 1 = Sprite – Sprite collision interrupt enabled
; Bit #3 1 = Light pen interrupt enabled
VIC_SPRITE_MULTICOLOR = $D01C ; (53276) Sprite Multicolor mode register
; #bit – set individual sprites to multicolor
; Bit #x = 0 – SpriteX is single color 1 = Sprite x is multicolor
;
VIC_BORDER_COLOR = $D020 ; (53280) Border color
VIC_BACKGROUND_COLOR = $D021 ; (53281) Background color
VIC_CHARSET_MULTICOLOR_1 = $D022 ; (53282) Extra Background Color 1 – Multicolor 1
VIC_CHARSET_MULTICOLOR_2 = $D023 ; (53283) Extra Background Color 2 – Multicolor 2
VIC_CHARSET_MULTICOLOR_3 = $D024 ; (53284) Extra Background Color 3
VIC_SPRITE_MULTICOLOR_1 = $D025 ; (53285) Sprite extra color 1
VIC_SPRITE_MULTICOLOR_2 = $D026 ; (53286) Sprite extra color 2
VIC_SPRITE_COLOR = $D027 ; (53287) Sprite Color ($D027 – $D02E = Sprites 0 – 7)
; CIA REGISTERS
PORT_A = $DC00 ; CIA PORT A – Joystick #2
JOY_2 = $DC00 ; Keyboard Matrix columns and Joystick #2
; Read Bits:
; Bit #0 0 = Port 2 Joystick up pressed
; Bit #1 0 = Port 2 Joystick down pressed
; Bit #2 0 = Port 2 Joystick left pressed
; Bit #3 0 = Port 2 Joystick right pressed
; Bit #4 0 = Port 2 Joystick fire pressed
; Write Bits:
; Bit #x : 0 = Select keyboard matrix column #x
; Bit #6-#7 : Padle selection %01 = Paddle 1; #10 = Paddle #2
INT_CONTROL = $DC0D ; Interrupt control and status register
; Read Bits
; #0 – 1 = Timer A underflow occurred
; #1 – 1 = Timer B underflow occurred
; #2 – 1 = TOD is equal to alarm time
; #3 – 1 = A complete byte has been received into or
; sent from serial shift register
; #4 – Signal level on FLAG pin, datasette input
; #7 – An interrupt has been generated
;
; Write Bits
; #0 – 1 = Enable interrupts generated by timer A underflow
; #1 – 1 = Enable interrupts generated by timer B underflow
; #2 – 1 = Enable TOD alarm interrupt
; #3 – 1 = Enable interrupts generated by a byte having been
; recieved/sent via serial shift register
; #4 – 1 = Enable interrupts generated by positivy edge on FLAG pin
; #7 – Fill bit ; bits #0-#6 that are set to 1, get their values from
; this bit; bits #0-#6, that are set to 0, are left unchanged
VIC_BANK = $DD00
CIA_PRA = $DD00 ; CIA#2 – PORT_A, serial bus access
; Bits #0-#1 : VIC bank values
; %00 – Bank #3 – $C000 – $FFFF
; %01 – Bank #2 – $8000 – $BFFF
; %10 – Bank #1 – $4000 – $7FFF
; %11 – Bank #0 – $0000 – $3FFF
; Bit #2 – RS232 TXD line, output bit
; Bit #3 – Serial bus ATN OUT; 0 = high; 1 = low
; Bit #4 – Serial bus CLOCK OUT; 0 – high; 1 = low
; Bit #5 – Serial bus DATA OUT; 0 – low ; 1 = high
; Bit #6 – Serial bus CLOCK IN; 0 = low; 1 = high
; Bit #7 – Serial bus DATA IN; 0 = low; 1 = high
;——————————————————————————-
; ZERO PAGE
;——————————————————————————-
PROC_PORT = $0001
; Bits #0 – #2 : Configuration for memory areas $A000-$BFFF,
; $D000-$DFFF and $E000-$FFFF
; Values : %x00 : RAM visible in all 3 areas
; %x01 : RAM visible at $A000-$BFFF and $E000-$FFFF
; %x10 : RAM visible at $A000-$BFFF ; KERNAL ROM visible at $E000-$FFFF
; %x11 : BASIC ROM visible at $A000-$BFFF; KERNAL ROM visible at $E000-$FFFF
; %1xx : I/O area visible at $D000-$DFFF (Except for the value %100, see above)
;
; Bit #3 : Datasette output signal level
; Bit #4 : Datasette button status; 0 = One or more of PLAY,RECORD,FFWD or REW pressed
; 1 = No button pressed
; Bit #5 : Datasette motor control; 0 = on; 1 = off
;
; Default: #$37, %00110111
;——————————————————————————-
; COLORS
;——————————————————————————-
COLOR_BLACK = 0
COLOR_WHITE = 1
COLOR_RED = 2
COLOR_CYAN = 3
COLOR_VIOLET = 4
COLOR_GREEN = 5
COLOR_BLUE = 6
COLOR_YELLOW = 7
COLOR_ORANGE = 8
COLOR_BROWN = 9
COLOR_LTRED = 10
COLOR_GREY1 = 11
COLOR_GREY2 = 12
COLOR_LTGREEN = 13
COLOR_LTBLUE = 14
COLOR_GREY3 = 15
Game_Chset.asm
; This is actually the binary data from CharPad for the character set (main game screen)
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$20,$00,$03,$8f,$0f,$0f,$3f,$00,$00,$fd,$fd,$fd,$fd,$fd,$fd
byte $02,$00,$3f,$3f,$3f,$3f,$3f,$3f,$00,$00,$08,$c0,$f0,$f0,$f0,$fc
byte $33,$3f,$3f,$3f,$3f,$3f,$3f,$00,$fd,$fd,$fd,$fd,$fd,$fd,$f1,$01
byte $3f,$3f,$3f,$3f,$3f,$3f,$0f,$00,$cc,$fc,$fc,$fc,$fc,$fc,$fc,$0c
byte $15,$00,$3f,$3f,$3f,$3f,$3f,$3f,$55,$01,$fd,$fd,$fd,$fd,$fd,$fd
byte $54,$00,$fc,$fc,$fc,$fc,$fc,$fc,$3f,$3f,$00,$2a,$2a,$3a,$0f,$00
byte $fd,$fd,$01,$a9,$a9,$a9,$ff,$00,$3f,$3f,$00,$2a,$2a,$ea,$ff,$00
byte $fc,$fc,$00,$a8,$a8,$ac,$f0,$00,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
byte $ff,$ff,$bb,$ef,$ff,$ef,$ef,$eb,$ff,$fe,$bc,$2f,$cb,$f2,$fa,$fe
byte $ff,$ff,$bb,$2f,$ff,$ef,$ef,$eb,$bf,$ff,$ee,$fb,$fb,$fb,$fb,$fb
byte $ff,$ef,$ee,$fa,$fa,$fb,$eb,$fb,$ef,$ff,$bf,$ff,$ff,$ff,$ff,$bf
byte $af,$ee,$ef,$eb,$ae,$ae,$ae,$ef,$fb,$fb,$fb,$fa,$ff,$ff,$ff,$ff
byte $bb,$fb,$fb,$aa,$fb,$fb,$fa,$e8,$fe,$ef,$cb,$e3,$8b,$f2,$fc,$ff
byte $ef,$ef,$ff,$ef,$ef,$ef,$af,$2f,$ff,$fe,$f8,$f3,$ff,$ff,$ff,$ff
byte $bb,$3b,$fb,$fb,$fb,$fb,$ea,$aa,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$be
byte $2b,$eb,$ef,$ef,$ef,$ef,$ab,$aa,$30,$03,$00,$3f,$07,$30,$30,$f0
byte $03,$f0,$e0,$c8,$30,$2c,$0f,$f0,$03,$20,$00,$88,$cc,$2f,$3c,$00
byte $00,$32,$00,$0c,$c3,$08,$f0,$70,$e3,$3f,$f3,$00,$8c,$00,$00,$03
byte $00,$c3,$0b,$83,$0f,$80,$30,$f1,$0f,$80,$0c,$33,$c3,$e3,$0c,$f0
byte $3c,$cc,$3c,$cf,$e0,$c0,$cc,$02,$8e,$0f,$0c,$30,$0c,$cc,$cc,$00
byte $f0,$00,$3f,$83,$0c,$fc,$3f,$0f,$c0,$f0,$cc,$c1,$03,$0f,$30,$b0
byte $80,$0c,$00,$03,$30,$00,$3c,$30,$00,$00,$8c,$01,$30,$0c,$c0,$0f
byte $03,$cf,$00,$20,$c3,$33,$0f,$00,$3f,$08,$f0,$3c,$3f,$03,$0c,$30
byte $33,$cf,$03,$e0,$0f,$fc,$f0,$0c,$00,$00,$00,$00,$00,$00,$00,$c0
byte $00,$00,$00,$32,$0e,$c9,$c9,$29,$c0,$00,$00,$9b,$56,$55,$55,$55
byte $00,$00,$00,$00,$03,$80,$60,$68,$25,$a5,$95,$55,$55,$56,$59,$55
byte $55,$95,$55,$55,$55,$55,$55,$55,$5a,$56,$55,$95,$65,$59,$55,$55
byte $30,$80,$a3,$68,$58,$56,$55,$55,$ff,$f0,$c0,$c0,$c0,$c0,$00,$00
byte $ff,$3f,$3f,$03,$03,$03,$03,$03,$10,$00,$00,$00,$00,$00,$00,$00
byte $03,$03,$03,$03,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00
byte $00,$00,$04,$00,$00,$00,$00,$00,$95,$56,$7c,$aa,$c0,$cc,$f3,$ff
byte $6a,$dd,$d6,$2b,$89,$21,$00,$fc,$44,$58,$49,$4d,$f5,$4f,$0c,$04
byte $00,$00,$00,$00,$00,$00,$00,$00,$55,$a5,$a9,$29,$89,$21,$01,$fe
byte $94,$e8,$c8,$e0,$c0,$cc,$f0,$f0,$05,$0b,$04,$04,$0d,$0f,$0d,$05
byte $00,$00,$00,$00,$00,$c0,$70,$c0,$95,$ea,$c8,$e2,$c0,$cc,$f3,$ff
byte $54,$a4,$a8,$28,$88,$20,$00,$fc,$01,$01,$05,$06,$c6,$06,$0e,$14
byte $55,$a5,$a9,$29,$89,$2a,$8a,$fe,$94,$e8,$c8,$e0,$c0,$cc,$f3,$ab
byte $05,$1b,$05,$04,$05,$07,$0b,$09,$b0,$ce,$30,$aa,$ec,$a8,$2a,$a2
byte $ea,$cc,$32,$2b,$8a,$2a,$22,$0a,$cc,$e0,$23,$c8,$3a,$82,$a2,$8a
byte $8e,$20,$ca,$0c,$b3,$2a,$08,$2a,$3f,$fb,$65,$eb,$fe,$7e,$9b,$eb
byte $a0,$fb,$aa,$bf,$e6,$fa,$be,$ad,$a2,$fe,$5a,$ff,$ba,$be,$a7,$7f
byte $aa,$fb,$69,$be,$db,$ff,$aa,$ee,$ae,$ee,$aa,$ea,$3a,$aa,$0a,$ff
byte $ef,$af,$aa,$d7,$ff,$be,$aa,$ff,$fe,$af,$aa,$db,$ea,$aa,$aa,$73
byte $fb,$ef,$aa,$5b,$ea,$38,$a2,$de,$65,$a5,$a9,$29,$89,$2a,$8a,$fe
byte $94,$e8,$c9,$e1,$d4,$cc,$f3,$ab,$89,$b3,$1a,$49,$29,$a9,$51,$34
byte $3d,$d4,$da,$e8,$e9,$fa,$98,$c5,$95,$56,$7c,$aa,$00,$cc,$33,$cf
byte $6a,$dd,$d6,$2b,$8b,$21,$01,$fe,$be,$e9,$8a,$f2,$c0,$cc,$f3,$ff
byte $a9,$59,$9a,$e9,$89,$21,$01,$ce,$97,$eb,$cb,$e3,$c3,$cf,$f3,$ff
byte $d5,$a5,$e9,$e9,$c9,$e1,$01,$fe,$95,$ea,$f8,$22,$c0,$0c,$00,$cf
byte $57,$b5,$ab,$2b,$89,$23,$00,$c3,$55,$a5,$a9,$e9,$89,$21,$01,$ce
byte $95,$ea,$08,$e2,$00,$cc,$33,$ab,$55,$a5,$a9,$29,$89,$a1,$a2,$fe
byte $95,$ea,$c8,$e2,$c0,$cc,$e3,$eb,$00,$80,$61,$41,$5f,$31,$3c,$10
byte $00,$0a,$ab,$e8,$62,$48,$00,$3f,$00,$aa,$aa,$aa,$aa,$aa,$aa,$ff
byte $00,$00,$00,$00,$00,$01,$05,$03,$50,$20,$10,$10,$70,$70,$70,$50
byte $16,$2b,$23,$0b,$03,$33,$0f,$0f,$55,$5a,$6a,$68,$62,$48,$40,$bf
byte $40,$40,$50,$90,$93,$90,$b0,$14,$15,$1a,$2a,$28,$22,$08,$00,$3f
byte $56,$ab,$23,$8b,$03,$33,$cf,$ff,$50,$e4,$50,$10,$50,$d0,$e0,$60
byte $16,$2b,$23,$0b,$03,$33,$cf,$ea,$55,$5a,$6a,$68,$62,$a8,$a2,$bf
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$3f,$3f,$3f,$3f,$3f,$3f,$3f,$3f
byte $ff,$cf,$ff,$ff,$fc,$3f,$f7,$ff,$ff,$cf,$ff,$ff,$7c,$3f,$ff,$ff
byte $af,$8f,$9f,$af,$ac,$2f,$af,$ff,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa
byte $a8,$a8,$a8,$a8,$a8,$a8,$a8,$a8,$6a,$6a,$6a,$6a,$6a,$6a,$6a,$6a
byte $aa,$aa,$aa,$a2,$aa,$aa,$aa,$aa,$a8,$a8,$88,$a8,$a8,$a8,$a8,$a8
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$fc,$ff,$ff,$ff,$ff,$ff,$ff,$ff
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$fc,$ff,$ff,$ff,$ff,$ff,$ff,$cf,$ff
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0
byte $00,$30,$03,$c0,$f0,$ff,$ff,$3f,$00,$00,$00,$30,$00,$c3,$ff,$ff
byte $00,$0c,$3f,$ff,$ff,$ff,$ff,$ff,$00,$30,$00,$c0,$fc,$ff,$f3,$ff
byte $fd,$ff,$ff,$ff,$df,$cf,$ef,$f3,$fe,$ff,$ff,$ef,$ff,$ff,$ff,$ff
byte $fc,$ff,$ff,$3f,$ff,$ff,$ff,$ff,$3f,$ff,$fc,$ff,$ff,$ff,$ff,$bf
byte $f3,$ff,$ff,$cf,$ff,$ff,$ff,$ff,$3f,$fc,$3f,$ff,$ff,$ff,$ff,$ff
byte $7f,$ff,$fc,$ff,$ff,$ff,$3f,$ff,$fa,$69,$be,$9a,$aa,$aa,$a6,$88
byte $aa,$aa,$aa,$aa,$aa,$ac,$b0,$81,$ee,$b6,$fa,$06,$0a,$0a,$0e,$fb
byte $ae,$9a,$aa,$9a,$a9,$aa,$ae,$ea,$22,$0a,$2a,$aa,$aa,$aa,$8f,$00
byte $80,$a2,$aa,$a2,$b0,$c0,$2a,$aa,$aa,$aa,$aa,$aa,$aa,$2a,$0a,$40
byte $88,$a4,$a8,$aa,$aa,$aa,$a2,$08,$0a,$b9,$aa,$aa,$aa,$aa,$a0,$84
byte $ea,$aa,$aa,$ab,$ab,$af,$bc,$00,$0e,$3a,$2a,$2a,$2a,$1a,$01,$02
byte $ae,$aa,$aa,$aa,$aa,$aa,$aa,$2a,$2a,$2a,$2a,$a0,$ac,$a4,$20,$a0
byte $80,$a2,$a2,$a2,$ba,$c0,$28,$aa,$aa,$ae,$aa,$aa,$aa,$ea,$1a,$01
byte $88,$80,$a0,$a8,$aa,$aa,$a4,$08,$fc,$ff,$ff,$ff,$ff,$ff,$ff,$ff
byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$fc,$ff,$ff,$ff,$ff,$ff,$ff,$cf,$ff
byte $00,$ff,$ff,$aa,$00,$ff,$ff,$aa,$00,$3e,$3a,$2a,$00,$f3,$e3,$a2
byte $55,$77,$53,$5c,$73,$5c,$d0,$f0,$df,$ff,$df,$fc,$fc,$3f,$cf,$00
byte $cf,$ff,$cf,$fc,$fc,$3f,$ff,$00,$cf,$ff,$cf,$fc,$fc,$3f,$cf,$00
byte $ff,$ff,$ff,$fc,$ff,$ff,$cf,$cc,$ff,$cf,$ff,$fc,$ff,$ff,$cf,$cc
byte $ab,$af,$af,$bf,$b3,$bf,$b3,$3f,$ff,$ff,$c0,$ff,$c0,$c0,$00,$00
byte $ff,$ff,$03,$fd,$01,$03,$00,$00,$aa,$fa,$fa,$fe,$fe,$7e,$de,$e4
byte $bf,$bf,$b3,$b3,$b3,$bf,$bf,$33,$e6,$e6,$e6,$e6,$e6,$e6,$e6,$e4
byte $b3,$b3,$b3,$b3,$b3,$b3,$b3,$33,$b3,$b3,$b3,$bf,$b3,$b3,$b3,$b3
byte $e6,$e6,$e6,$e6,$e6,$e6,$e6,$e6,$00,$76,$ba,$fe,$65,$aa,$aa,$aa
byte $00,$6d,$ae,$f7,$99,$aa,$aa,$aa,$00,$6d,$ae,$ff,$5a,$aa,$aa,$aa
byte $00,$6e,$aa,$7f,$96,$aa,$aa,$aa,$bf,$af,$ab,$aa,$aa,$aa,$ff,$00
byte $aa,$aa,$aa,$aa,$aa,$aa,$ff,$00,$aa,$aa,$ba,$aa,$ab,$aa,$ff,$00
byte $aa,$aa,$aa,$aa,$aa,$aa,$ff,$0c,$aa,$aa,$ba,$aa,$aa,$aa,$fb,$aa
byte $ac,$a8,$ac,$a8,$a8,$ac,$ac,$bc,$aa,$aa,$aa,$aa,$aa,$aa,$eb,$ff
byte $aa,$aa,$aa,$aa,$ae,$be,$ff,$fb,$aa,$aa,$aa,$aa,$ae,$be,$fe,$fa
byte $aa,$aa,$aa,$a9,$aa,$aa,$eb,$ff,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $00,$00,$aa,$aa,$55,$00,$00,$00,$f0,$fc,$f8,$f8,$f8,$f8,$f8,$f8
byte $aa,$aa,$aa,$00,$00,$00,$00,$00,$f0,$fc,$f8,$f8,$f8,$f8,$f8,$fc
byte $aa,$aa,$aa,$55,$00,$00,$00,$00,$f0,$fc,$fc,$f8,$f8,$f8,$f8,$f8
byte $00,$00,$10,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$10,$00,$00,$00,$00,$00,$00,$10,$00,$00,$00,$10,$00
byte $00,$00,$00,$00,$00,$10,$00,$00,$ab,$a8,$aa,$aa,$aa,$aa,$aa,$aa
byte $ff,$ff,$30,$3f,$3f,$3f,$3f,$33,$ff,$ff,$0e,$f9,$f9,$39,$39,$39
byte $aa,$6a,$aa,$aa,$aa,$aa,$aa,$aa,$33,$33,$33,$33,$33,$3f,$3f,$8f
byte $39,$39,$39,$39,$39,$f9,$f8,$e2,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$00
byte $aa,$aa,$a2,$aa,$aa,$aa,$aa,$00,$aa,$a2,$aa,$aa,$aa,$aa,$aa,$00
byte $aa,$aa,$a2,$aa,$aa,$aa,$aa,$aa,$a8,$a8,$a8,$a8,$a8,$88,$a8,$a8
byte $6a,$6a,$6a,$6a,$6a,$62,$6a,$6a,$80,$a0,$a0,$a0,$a0,$a0,$a0,$a0
byte $00,$3c,$0c,$3c,$3c,$3c,$3c,$3c,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a
byte $a0,$a0,$a0,$a0,$a0,$a0,$a0,$a0,$aa,$aa,$aa,$ab,$ab,$ac,$ac,$00
byte $bf,$f0,$ca,$2a,$a9,$a9,$a9,$00,$f6,$0f,$ab,$aa,$aa,$aa,$aa,$00
byte $aa,$aa,$6a,$ea,$da,$ba,$b6,$30,$00,$ac,$ac,$ac,$ac,$ac,$ac,$00
byte $00,$a9,$a1,$a0,$a0,$aa,$aa,$aa,$00,$aa,$aa,$6a,$1a,$86,$aa,$aa
byte $30,$b6,$b6,$b6,$b6,$b6,$b2,$04,$a8,$ab,$aa,$aa,$aa,$aa,$aa,$00
byte $aa,$2a,$ca,$f3,$bf,$a0,$a8,$00,$aa,$aa,$ab,$ff,$fd,$0a,$2a,$00
byte $da,$da,$6a,$aa,$aa,$aa,$aa,$00,$aa,$aa,$aa,$aa,$00,$00,$ff,$ff
byte $a8,$a8,$a8,$a8,$00,$00,$ff,$ff,$aa,$00,$00,$a0,$aa,$aa,$aa,$00
byte $00,$00,$aa,$aa,$aa,$aa,$aa,$aa,$00,$00,$a8,$a8,$8a,$a2,$aa,$aa
byte $00,$00,$aa,$2a,$0a,$82,$a0,$a8,$00,$aa,$ba,$aa,$aa,$ab,$aa,$aa
byte $00,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$aa,$ff,$ff,$ff,$ff
byte $aa,$3a,$3a,$3a,$3a,$3a,$aa,$ff,$aa,$0e,$0e,$0e,$0e,$0e,$aa,$ff
byte $55,$a5,$a9,$29,$89,$2a,$8a,$02,$15,$ea,$08,$e2,$00,$cc,$33,$ab
byte $55,$a5,$a9,$29,$89,$a1,$a2,$02,$95,$2a,$08,$22,$00,$00,$20,$28
TitleScreen.asm
;===============================================================================
; CHAR PAD TOOLS
;===============================================================================
; Peter ‘Sig’ Hewett 2017
;——————————————————————————-
; Tools for integrating CharPad character sets, tiles, and maps
;===============================================================================
; Map Notes:
;
; CharPad setup : To make a level map, set up for 256 characters
; A tile size of 4×4
; Set number of tiles to 64
; Set map size to 64 x 32
; *IMPORTANT* set color to ‘per character’
;
;——————————————————————————-
; DRAW MAP
;——————————————————————————-
; Draw the entire map on the screen. This won’t be done that often as most updates
; to the screen will be scrolling. But for starting a level, resetting on death,
; or teleporting, we need to build the entire screen.
; This also sets up essential data for using the map.
; Initializes : MAP_POS_X
; MAP_POS_Y
; MAP_POS_ADDRESS
; MAP_X_DELTA
; MAP_Y_DELTA
;
; X = Start map X coord (top left corner)
; Y = Start map Y coord (top left corner)
;
; Uses ZEROPAGE_POINTER_4 (as TileDraw uses 1,2,3)
;——————————————————————————-
BeginTitleScreen
; lda #SCREEN1_MEM
; sta CURRENT_SCREEN + 1
; lda #SCREEN2_MEM
; sta CURRENT_BUFFER + 1
#region “DrawMap”
DrawTitleMap
ldx #14 ; (129,26=default), 25,35
ldy #0 ; 7, 43
lda #0
sta MAP_X_DELTA
sta MAP_Y_DELTA
stx MAP_X_POS
sty MAP_Y_POS
;—————————————————————
; First find the address for the starting map position
ldx MAP_Y_POS
lda TITLE_MAP_LINE_LOOKUP_LO,x ; fetch the address for the line (Y pos)
sta ZEROPAGE_POINTER_4
lda TITLE_MAP_LINE_LOOKUP_HI,x
sta ZEROPAGE_POINTER_4 + 1
clc
lda ZEROPAGE_POINTER_4 ; add the x position
adc MAP_X_POS
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1 ; ZEROPAGE_POINTER_1 now holds the
; map start address
; Save this info for map usage
;copyPointer ZEROPAGE_POINTER_4, MAP_POS_ADDRESS
lda ZEROPAGE_POINTER_4
sta MAP_POS_ADDRESS
lda ZEROPAGE_POINTER_4 + 1
sta MAP_POS_ADDRESS + 1
;———————————————————————–
; Fetch map data and draw tile – coords are in ’tiles’ not
; character positions
ldy #0 ; holds X screen coord
ldx #0 ; holds Y screen coord
@loop
lda (ZEROPAGE_POINTER_4),y ; fetch map data
jsr DrawTitleTile ; draw the tile
iny ; inc X and check for end of screen
cpy #10 ; draw 10 tiles left to right
bne @loop
; go down one line on the map (64 char)
;addPointer ZEROPAGE_POINTER_4, 100
lda ZEROPAGE_POINTER_4
clc
adc #100
sta ZEROPAGE_POINTER_4
lda ZEROPAGE_POINTER_4 + 1
adc #0
sta ZEROPAGE_POINTER_4 + 1
ldy #0
inx
cpx #6
bne @loop
rts
WaitToStartGame
jsr JoystickReady
; Wait for fire button to restart Game
lda #%00010000 ; Mask for bit 0
bit JOY_2 ; check zero = jumping (button pressed)
bne WaitToStartGame
rts
#endregion
;——————————————————————————-
; DRAW TILE
;——————————————————————————-
; This routine actually won’t be called that often. Most updates are scrolling,
; so there are very few circumstances that need a whole tile drawn at once.
;——————————————————————————-
;
; X = Screen tile Y coord – ‘flipped’ so it dovetails into the MapDraw
; Y = Screen tile X coord routine without exhanging data in registers
; A = Tile # to draw
;
; Restores registers off the stack A / X / Y
;——————————————————————————-
#region “DrawTile”
DrawTitleTile
sta PARAM1 ; save tile number
sty PARAM2 ; save X pos
stx PARAM3 ; save Y pos
saveRegs ; put registers on the stack to
; exit cleaner – this routine will
; likely be nested
;——————————————————
; First get the destination for the tile
lda PARAM3 ; fetch the Y pos (in tile coords)
asl
asl ; multiply by 4 (tiles are 4 x 4 chars)
tax ; screen line in X
jsr GetScreenLineAddress ; fetch line address based on current displayed screen
; Y line address is in ZEROPAGE_POINTER_1
lda COLOR_LINE_OFFSET_TABLE_LO,x ; fetch color ram line address too
sta ZEROPAGE_POINTER_3
lda COLOR_LINE_OFFSET_TABLE_HI,x
sta ZEROPAGE_POINTER_3 + 1
lda PARAM2 ; get X coord
asl ; multiply by 4
asl
tax ; save it in x
clc ; add to Y line address
adc ZEROPAGE_POINTER_1
sta ZEROPAGE_POINTER_1
lda ZEROPAGE_POINTER_1 + 1
adc #0
sta ZEROPAGE_POINTER_1 + 1 ; destination base address is in ZEROPAGE_POINTER_1
txa
clc
adc ZEROPAGE_POINTER_3 ; color ram destination is in ZEROPAGE_POINTER_3
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
;————————————————————
; Fetch the source tile address
ldx PARAM1 ; Fetch the tile number
lda TITLE_TILE_NUMBER_LOOKUP_LO,x
sta ZEROPAGE_POINTER_2
lda TITLE_TILE_NUMBER_LOOKUP_HI,x
sta ZEROPAGE_POINTER_2 + 1
;————————————————————-
; Loop through and draw the tile
ldy #0
@drawloop
lda (ZEROPAGE_POINTER_2),y ; Get the character code
sta (ZEROPAGE_POINTER_1),y ; store it on the screen
tax ; pass to X as an offset
lda TITLE_ATTRIBUTE_MEM,x ; fetch the color/data attribute
sta (ZEROPAGE_POINTER_3),y ; write it to color ram
cpy #15 ; drawn the 15th character? We’re finished
beq @done
tya ; save Y before the increment for our test
iny ; (saves having to inc it in 2 diff places)
; I need to count 0-3 to draw a row of tiles,
and #%00000011 ; but I need to count 0-15 to fetch the tile data
cmp #3 ; both NEED to use indirect Y addressing, and saving/
bne @drawloop ; fetching Y rapidly becomes a tangled nightmare.
; by masking out the last 2 bits in A, we get a number
; that counts 0-3 over and over without stopping the
; data fetch count 0-15. It’s also faster than my other
; options by quite a bit.
clc ; add new line
lda ZEROPAGE_POINTER_1 ; increment destination and color ram by 1 line – 4 chars
adc #40 – 4
sta ZEROPAGE_POINTER_1 ; by ‘backsetting’ our pointers, we don’t need to change Y
lda ZEROPAGE_POINTER_1 + 1 ; when drawing 0-3 characters, and can leave the 0-15
adc #0 ; count intact.
sta ZEROPAGE_POINTER_1 + 1 ; We have to increase them to the next line anyways, so this
; only saves time.
clc
lda ZEROPAGE_POINTER_3
adc #40 – 4
sta ZEROPAGE_POINTER_3
lda ZEROPAGE_POINTER_3 + 1
adc #0
sta ZEROPAGE_POINTER_3 + 1
jmp @drawloop
@done
restoreRegs ; pull registers back off the stack
rts
#endRegion
;===============================================================================
; LEVEL DATA AND TABLES
;===============================================================================
CURRENT_LEVEL
byte 0
;CHAR_ADDRESS
; word LEVEL_1_CHARS
TITLE_ATTRIB_ADDRESS
word ATTRIBUTE_MEM
;TITLE_TILE_ADDRESS
; word TITLE_TILE_MEM
;TITLE_MAP_ADDRESS
; word LEVEL_1_MAP
;——————————————————————————-
; MAP DATA LOOKUP TABLE 1
;——————————————————————————-
; Lookup table to return an address to a map line (Y coord). This table assumes
; a landscape
; layout (64 x 32 tiles). A portrait style table will be done in the future to
; allow more vertical maps
;——————————————————————————-
TITLE_MAP_LINE_LOOKUP_LO
byte TITLE_MAP_MEM
byte >TITLE_MAP_MEM + 100
byte >TITLE_MAP_MEM + 200
byte >TITLE_MAP_MEM + 300
byte >TITLE_MAP_MEM + 400
byte >TITLE_MAP_MEM + 500
byte >TITLE_MAP_MEM + 600
byte >TITLE_MAP_MEM + 700
byte >TITLE_MAP_MEM + 800
byte >TITLE_MAP_MEM + 900
byte >TITLE_MAP_MEM + 1000 ; 10
byte >TITLE_MAP_MEM + 1100
byte >TITLE_MAP_MEM + 1200
byte >TITLE_MAP_MEM + 1300
byte >TITLE_MAP_MEM + 1400
byte >TITLE_MAP_MEM + 1500
byte >TITLE_MAP_MEM + 1600
byte >TITLE_MAP_MEM + 1700
byte >TITLE_MAP_MEM + 1800
byte >TITLE_MAP_MEM + 1900
byte >TITLE_MAP_MEM + 2000 ;20
byte >TITLE_MAP_MEM + 2100
byte >TITLE_MAP_MEM + 2200
byte >TITLE_MAP_MEM + 2300 ; byte >TITLE_MAP_MEM + 4700
byte >TITLE_MAP_MEM + 2400
byte >TITLE_MAP_MEM + 2500
byte >TITLE_MAP_MEM + 2600
byte >TITLE_MAP_MEM + 2700
byte >TITLE_MAP_MEM + 2800
byte >TITLE_MAP_MEM + 2900 ;30
byte >TITLE_MAP_MEM + 3000
byte >TITLE_MAP_MEM + 3100 ;32
;; New lines – Parkour Big Map
byte >TITLE_MAP_MEM + 3200
byte >TITLE_MAP_MEM + 3300
byte >TITLE_MAP_MEM + 3400
byte >TITLE_MAP_MEM + 3500
byte >TITLE_MAP_MEM + 3600
byte >TITLE_MAP_MEM + 3700
byte >TITLE_MAP_MEM + 3800
byte >TITLE_MAP_MEM + 3900
byte >TITLE_MAP_MEM + 4000
byte >TITLE_MAP_MEM + 4100
byte >TITLE_MAP_MEM + 4200
byte >TITLE_MAP_MEM + 4300
byte >TITLE_MAP_MEM + 4400
byte >TITLE_MAP_MEM + 4500
byte >TITLE_MAP_MEM + 4600
byte >TITLE_MAP_MEM + 4700
byte >TITLE_MAP_MEM + 4800
byte >TITLE_MAP_MEM + 4900
byte >TITLE_MAP_MEM + 5000
byte >TITLE_MAP_MEM + 5010
byte >TITLE_MAP_MEM + 5020
byte >TITLE_MAP_MEM + 5030
byte >TITLE_MAP_MEM + 5040
byte >TITLE_MAP_MEM + 5050
;——————————————————————————-
; TILE ADDRESS LOOKUP TABLE
;——————————————————————————-
; Lookup table to find the start address of a tile on the current map.
; All current level tiles are
; held in TILE_MEM, there are 64 entries
;——————————————————————————-
;TILE_NUMBER_LOOKUP_LO
; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte ; byte
;TILE_NUMBER_LOOKUP_HI
; byte >TILE_MEM ; 0
; byte >TILE_MEM + 16
; byte >TILE_MEM + 32
; byte >TILE_MEM + 48
; byte >TILE_MEM + 64
; byte >TILE_MEM + 80
; byte >TILE_MEM + 96
; byte >TILE_MEM + 112
; byte >TILE_MEM + 128
; byte >TILE_MEM + 144
; byte >TILE_MEM + 160 ; 10
; byte >TILE_MEM + 176
; byte >TILE_MEM + 192
; byte >TILE_MEM + 208
; byte >TILE_MEM + 224
; byte >TILE_MEM + 240
; byte >TILE_MEM + 256
; byte >TILE_MEM + 272
; byte >TILE_MEM + 288
; byte >TILE_MEM + 304
; byte >TILE_MEM + 320 ; 20
; byte >TILE_MEM + 336
; byte >TILE_MEM + 352
; byte >TILE_MEM + 368
; byte >TILE_MEM + 384
; byte >TILE_MEM + 400
; byte >TILE_MEM + 416
; byte >TILE_MEM + 432
; byte >TILE_MEM + 448
; byte >TILE_MEM + 464
; byte >TILE_MEM + 480 ; 30
; byte >TILE_MEM + 496
; byte >TILE_MEM + 512
; byte >TILE_MEM + 528
; byte >TILE_MEM + 544
; byte >TILE_MEM + 560
; byte >TILE_MEM + 576
; byte >TILE_MEM + 592
; byte >TILE_MEM + 608
; byte >TILE_MEM + 624
; byte >TILE_MEM + 640 ; 40
; byte >TILE_MEM + 656
; byte >TILE_MEM + 672
; byte >TILE_MEM + 688
; byte >TILE_MEM + 704
; byte >TILE_MEM + 720
; byte >TILE_MEM + 736
; byte >TILE_MEM + 752
; byte >TILE_MEM + 768
; byte >TILE_MEM + 784
; byte >TILE_MEM + 800 ;50
; byte >TILE_MEM + 816
; byte >TILE_MEM + 832
; byte >TILE_MEM + 848
; byte >TILE_MEM + 864
; byte >TILE_MEM + 880
; byte >TILE_MEM + 896
; byte >TILE_MEM + 912
; byte >TILE_MEM + 928
; byte >TILE_MEM + 944
; byte >TILE_MEM + 960 ; 10
; byte >TILE_MEM + 976
; byte >TILE_MEM + 992
; byte >TILE_MEM + 1008
; byte >TILE_MEM + 1024 ; 64
TITLE_TILE_NUMBER_LOOKUP_LO
byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte byte
TITLE_TILE_NUMBER_LOOKUP_HI
byte >TITLE_TILE_MEM ; 0
byte >TITLE_TILE_MEM + 16
byte >TITLE_TILE_MEM + 32
byte >TITLE_TILE_MEM + 48
byte >TITLE_TILE_MEM + 64
byte >TITLE_TILE_MEM + 80
byte >TITLE_TILE_MEM + 96
byte >TITLE_TILE_MEM + 112
byte >TITLE_TILE_MEM + 128
byte >TITLE_TILE_MEM + 144
byte >TITLE_TILE_MEM + 160 ; 10
byte >TITLE_TILE_MEM + 176
byte >TITLE_TILE_MEM + 192
byte >TITLE_TILE_MEM + 208
byte >TITLE_TILE_MEM + 224
byte >TITLE_TILE_MEM + 240
byte >TITLE_TILE_MEM + 256
byte >TITLE_TILE_MEM + 272
byte >TITLE_TILE_MEM + 288
byte >TITLE_TILE_MEM + 304
byte >TITLE_TILE_MEM + 320 ; 20
byte >TITLE_TILE_MEM + 336
byte >TITLE_TILE_MEM + 352
byte >TITLE_TILE_MEM + 368
byte >TITLE_TILE_MEM + 384
byte >TITLE_TILE_MEM + 400
byte >TITLE_TILE_MEM + 416
byte >TITLE_TILE_MEM + 432
byte >TITLE_TILE_MEM + 448
byte >TITLE_TILE_MEM + 464
byte >TITLE_TILE_MEM + 480 ; 30
byte >TITLE_TILE_MEM + 496
byte >TITLE_TILE_MEM + 512
byte >TITLE_TILE_MEM + 528
byte >TITLE_TILE_MEM + 544
byte >TITLE_TILE_MEM + 560
byte >TITLE_TILE_MEM + 576
byte >TITLE_TILE_MEM + 592
byte >TITLE_TILE_MEM + 608
byte >TITLE_TILE_MEM + 624
byte >TITLE_TILE_MEM + 640 ; 40
byte >TITLE_TILE_MEM + 656
byte >TITLE_TILE_MEM + 672
byte >TITLE_TILE_MEM + 688
byte >TITLE_TILE_MEM + 704
byte >TITLE_TILE_MEM + 720
byte >TITLE_TILE_MEM + 736
byte >TITLE_TILE_MEM + 752
byte >TITLE_TILE_MEM + 768
byte >TITLE_TILE_MEM + 784
byte >TITLE_TILE_MEM + 800 ;50
byte >TITLE_TILE_MEM + 816
byte >TITLE_TILE_MEM + 832
byte >TITLE_TILE_MEM + 848
byte >TITLE_TILE_MEM + 864
byte >TITLE_TILE_MEM + 880
byte >TITLE_TILE_MEM + 896
byte >TITLE_TILE_MEM + 912
byte >TITLE_TILE_MEM + 928
byte >TITLE_TILE_MEM + 944
byte >TITLE_TILE_MEM + 960 ; 10
byte >TITLE_TILE_MEM + 976
byte >TITLE_TILE_MEM + 992
byte >TITLE_TILE_MEM + 1008
byte >TITLE_TILE_MEM + 1024 ; 64
SHOW_GAME_TITLE
byte 1
TitleMap_Charpad.asm
TITLE_MAP_MEM
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08,$08,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $05,$0f,$0f,$15,$0f,$05,$0f,$0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$05
byte $0f,$0f,$0f,$19,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$18,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$05,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$19,$0f,$0f,$0f,$00,$0f,$0f
byte $0f,$0f,$18,$0f,$0f,$0f,$18,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08
byte $08,$08,$0f,$0f,$0f,$0f,$0f,$19,$0f,$0f,$19,$0f,$0f,$0f,$05,$0f
byte $0f,$0f,$0f,$0f,$18,$0f,$0f,$15,$08,$18,$0f,$09,$06,$19,$18,$0f
byte $0f,$0f,$00,$00,$0f,$0f,$0f,$18,$0f,$0f,$0f,$0f,$02,$0f,$0f,$00
byte $00,$00,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$19,$0f,$05,$0f,$02,$0f,$0f
byte $0f,$0f,$18,$17,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$19,$00,$0f,$02
byte $0f,$00,$00,$0f,$05,$0f,$00,$0f,$0f,$18,$00,$18,$0f,$0f,$0f,$0f
byte $0f,$02,$0f,$08,$08,$08,$08,$0f,$18,$0f,$0f,$00,$0f,$0f,$18,$0f
byte $0f,$18,$18,$17,$0f,$16,$1f,$16,$1f,$1f,$16,$15,$08,$00,$0f,$09
byte $06,$19,$00,$09,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$1f,$1f,$1f,$09,$1f,$1f,$1f,$1f,$1f,$1f,$06,$18,$19,$18,$19
byte $09,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$06
byte $00,$00,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$1f,$1f,$1f,$1f,$1f,$1f,$08,$08,$08,$08,$06,$00,$0f,$00,$00
byte $0f,$0f,$00,$0f,$0f,$00,$00,$00,$0f,$16,$15,$16,$15,$15,$16,$15
byte $08,$06,$00,$09,$06,$00,$00,$09,$0b,$01,$0b,$08,$0b,$01,$0b,$08
byte $0b,$01,$0b,$08,$0b,$01,$0b,$08,$09,$0b,$01,$08,$0b,$01,$0b,$06
byte $00,$00,$00,$00,$09,$0b,$01,$0b,$08,$01,$0b,$08,$0b,$01,$08,$0b
byte $01,$0b,$0b,$06,$00,$00,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$06
byte $00,$0f,$00,$00,$0f,$18,$00,$18,$0f,$00,$00,$00,$0f,$16,$1e,$16
byte $1e,$1e,$16,$15,$08,$06,$00,$09,$06,$00,$00,$09,$07,$07,$07,$07
byte $07,$07,$07,$08,$07,$07,$07,$08,$07,$07,$07,$08,$09,$08,$08,$08
byte $08,$08,$08,$06,$00,$00,$00,$00,$09,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$06,$00,$00,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$06,$00,$04,$00,$00,$0f,$00,$00,$00,$0f,$00,$00,$00
byte $00,$0f,$0f,$16,$00,$0f,$16,$15,$08,$06,$00,$08,$06,$00,$00,$09
byte $0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08
byte $09,$0b,$01,$08,$0b,$01,$0b,$06,$00,$06,$00,$00,$09,$0b,$0b,$0b
byte $08,$0b,$0b,$08,$0b,$0b,$08,$0b,$0b,$0b,$08,$06,$00,$00,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$1f,$1f,$1f,$1f,$16,$15,$08,$06,$00,$08
byte $06,$00,$00,$09,$07,$07,$07,$08,$07,$07,$07,$08,$07,$07,$07,$08
byte $07,$07,$07,$08,$09,$0b,$0b,$08,$0b,$0b,$0b,$06,$00,$06,$00,$00
byte $09,$0b,$01,$0b,$08,$01,$0b,$08,$0b,$01,$08,$0b,$01,$0b,$08,$06
byte $00,$00,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$06,$00,$00,$00,$00
byte $00,$00,$00,$15,$15,$15,$15,$00,$00,$00,$15,$15,$15,$15,$16,$15
byte $08,$06,$00,$09,$06,$00,$00,$00,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$09,$08,$08,$08,$08,$08,$08,$06
byte $00,$06,$1f,$1f,$09,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$06,$00,$00,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$06
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1e
byte $1e,$1e,$16,$15,$08,$06,$00,$09,$06,$00,$00,$00,$00,$08,$08,$08
byte $08,$08,$08,$08,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$08,$09,$0b,$0b,$0b
byte $0b,$0b,$0b,$06,$03,$06,$08,$08,$09,$1b,$1b,$1b,$1b,$1b,$1b,$1b
byte $14,$1b,$1b,$1b,$1b,$1b,$08,$06,$00,$00,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$06,$1f,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$00,$00,$00,$00,$00,$16,$15,$08,$06,$00,$09,$06,$00,$00,$00
byte $00,$00,$07,$07,$07,$07,$07,$08,$1b,$1b,$1b,$14,$1b,$1b,$1b,$08
byte $09,$0b,$0b,$0b,$0b,$0b,$0b,$06,$1b,$06,$1b,$08,$09,$1b,$1b,$1b
byte $16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1b,$08,$06,$00,$00,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$08,$08,$16,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$00,$04,$00,$00,$00,$16,$15,$08,$00,$00,$09
byte $06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1f,$16,$1f,$1f
byte $1f,$16,$1f,$08,$09,$1f,$1f,$1f,$1f,$16,$1f,$06,$1b,$06,$1b,$1b
byte $09,$1b,$1b,$1b,$16,$08,$08,$08,$08,$08,$08,$08,$08,$1b,$08,$06
byte $00,$00,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$13,$16,$13,$13
byte $13,$13,$13,$13,$13,$13,$13,$13,$08,$1f,$1f,$1f,$1f,$1f,$16,$15
byte $08,$00,$09,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $08,$16,$08,$08,$08,$16,$08,$08,$09,$08,$08,$08,$08,$16,$08,$06
byte $1b,$06,$1b,$1b,$1b,$1b,$1b,$1b,$16,$08,$06,$1b,$1b,$1b,$04,$1b
byte $1b,$1b,$1b,$06,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b
byte $1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$08,$08,$08,$08
byte $13,$16,$13,$13,$13,$13,$13,$13,$13,$13,$13,$13,$08,$15,$15,$15
byte $15,$15,$16,$15,$08,$00,$09,$08,$06,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$16,$08,$08,$08,$16,$08,$08,$09,$1b,$1b,$1b
byte $1b,$1b,$1b,$1b,$1b,$06,$1b,$1f,$1f,$16,$1f,$1f,$1f,$08,$06,$1b
byte $1b,$1f,$1f,$1f,$1f,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$16,$1f,$1f
byte $1f,$1f,$1f,$1f,$1f,$1f,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1b
byte $1b,$08,$08,$16,$1f,$1f,$1f,$1f,$1f,$16,$13,$13,$13,$13,$13,$13
byte $13,$1e,$1e,$1e,$1e,$1e,$16,$15,$08,$00,$09,$08,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$16,$08,$1b,$1b,$16,$1b,$1b
byte $09,$1b,$1b,$1b,$1b,$16,$1f,$1f,$1f,$06,$1b,$08,$08,$16,$08,$08
byte $08,$08,$06,$1b,$1b,$08,$08,$08,$06,$1b,$1b,$16,$1f,$1b,$1f,$1b
byte $1b,$16,$08,$08,$08,$08,$08,$08,$08,$08,$16,$08,$08,$08,$08,$08
byte $08,$08,$08,$1b,$1b,$1b,$08,$16,$08,$08,$08,$08,$08,$16,$03,$03
byte $1f,$1f,$1f,$1f,$16,$00,$00,$00,$00,$00,$00,$15,$08,$00,$09,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$1b
byte $1b,$16,$1b,$1b,$09,$1b,$1b,$1b,$1b,$16,$08,$08,$08,$06,$1b,$1b
byte $1b,$16,$1b,$1b,$1b,$08,$06,$1b,$1b,$08,$08,$08,$06,$1b,$1b,$16
byte $08,$1b,$08,$1b,$1b,$16,$08,$08,$1b,$1b,$1b,$1b,$1b,$08,$16,$03
byte $03,$03,$08,$03,$03,$03,$03,$03,$03,$03,$03,$16,$03,$03,$03,$03
byte $03,$16,$03,$03,$08,$08,$08,$08,$16,$00,$00,$00,$00,$00,$00,$15
byte $08,$06,$08,$08,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$1b,$08,$06,$1b,$1b
byte $1b,$1b,$1b,$1b,$1b,$16,$1b,$1b,$09,$1b,$1b,$1f,$1f,$1f,$08,$08
byte $08,$08,$1f,$1f,$1f,$1f,$1f,$1f,$1b,$08,$06,$1f,$1f,$08,$08,$08
byte $08,$1f,$1f,$1f,$08,$1b,$06,$1b,$1f,$1f,$08,$08,$1f,$1f,$1f,$16
byte $1f,$08,$16,$03,$03,$03,$0e,$1f,$1f,$16,$1f,$1f,$1f,$03,$03,$16
byte $03,$03,$03,$03,$03,$16,$03,$03,$03,$03,$15,$15,$16,$00,$00,$00
byte $00,$00,$16,$15,$08,$06,$08,$08,$1f,$1f,$1f,$1f,$16,$1f,$1f,$1f
byte $08,$06,$1b,$1b,$14,$1b,$1b,$1b,$1b,$16,$1f,$1f,$08,$1b,$1b,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$0b,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$1b,$06,$1b,$08,$08,$08,$08
byte $08,$08,$08,$16,$08,$08,$16,$03,$03,$03,$08,$08,$08,$16,$08,$08
byte $08,$03,$03,$03,$03,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$15,$00
byte $16,$1f,$1f,$1f,$1f,$00,$16,$15,$08,$06,$08,$08,$08,$08,$08,$08
byte $16,$08,$08,$08,$08,$08,$1f,$1f,$1f,$1f,$1f,$16,$0b,$16,$08,$08
byte $08,$0b,$0b,$0b,$0b,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$09,$08
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$0e,$0e,$0e,$0e,$0b,$06,$0b
byte $0e,$0e,$0e,$0e,$0e,$0e,$08,$16,$03,$03,$16,$03,$03,$03,$03,$03
byte $06,$03,$03,$03,$03,$03,$03,$03,$03,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$1f,$15,$00,$16,$15,$15,$15,$15,$00,$16,$15,$08,$06,$08,$08
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$08,$08,$08,$08,$08,$16
byte $0b,$0b,$0b,$0b,$09,$0b,$06,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$09,$08,$0b,$0b,$1a,$0b,$14,$0b,$0b,$08,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$00,$00,$08,$16,$03,$03,$16,$03
byte $03,$03,$03,$03,$06,$03,$03,$03,$03,$03,$03,$03,$1f,$08,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$16,$1e,$1e,$1e,$1e,$00,$16,$15
byte $08,$06,$08,$08,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$09,$0b,$06,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$09,$08,$0b,$1f,$1f,$1f,$1f,$1f,$1f,$08
byte $08,$0b,$0b,$0b,$1f,$1f,$1f,$1f,$1f,$1f,$0b,$0b,$00,$00,$08,$16
byte $03,$03,$16,$03,$03,$03,$1f,$1f,$1f,$1f,$03,$03,$11,$13,$13,$13
byte $08,$08,$00,$04,$00,$00,$00,$00,$00,$00,$00,$15,$15,$15,$00,$00
byte $00,$00,$16,$10,$08,$06,$08,$08,$0b,$0b,$0b,$0b,$14,$0b,$0b,$0b
byte $08,$0b,$0b,$16,$1f,$1f,$1f,$1f,$1f,$16,$0b,$0b,$09,$0b,$06,$0b
byte $0b,$0b,$0b,$0b,$14,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$08
byte $08,$08,$08,$08,$1b,$0b,$1f,$1f,$08,$08,$08,$08,$08,$08,$1f,$0b
byte $00,$00,$00,$03,$03,$03,$16,$03,$03,$03,$08,$08,$08,$08,$03,$11
byte $13,$13,$13,$13,$08,$08,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$1f,$16,$1f,$1f,$00,$16,$15,$08,$06,$08,$08,$1f,$1f,$1f,$1f
byte $1f,$06,$1f,$1f,$08,$1f,$1f,$16,$08,$08,$08,$08,$08,$16,$0b,$0b
byte $09,$0b,$06,$0b,$1f,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$0b,$0b,$0b
byte $14,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$1f,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$1f,$00,$00,$00,$03,$03,$03,$16,$03,$03,$03,$03,$03
byte $03,$03,$11,$03,$13,$03,$13,$13,$10,$08,$08,$08,$08,$08,$08,$16
byte $10,$10,$15,$08,$08,$08,$16,$08,$08,$00,$16,$15,$08,$06,$08,$08
byte $08,$08,$08,$08,$08,$06,$00,$00,$00,$00,$00,$16,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$06,$00,$08,$16,$08,$08,$08,$08,$08,$08
byte $08,$0b,$0b,$1f,$1f,$1f,$0b,$0b,$0b,$0b,$1f,$1f,$1f,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$00,$00,$09,$03,$03,$03,$16,$1f
byte $1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16,$10,$0e,$0e
byte $0e,$0e,$0e,$16,$10,$10,$15,$00,$00,$00,$16,$00,$00,$00,$16,$15
byte $08,$06,$07,$07,$07,$07,$07,$07,$07,$06,$00,$00,$00,$00,$00,$16
byte $08,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$08,$00,$00,$16,$0b,$0e
byte $0e,$0e,$0e,$0e,$0b,$0b,$1f,$08,$08,$08,$00,$00,$00,$09,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$00,$00,$09,$03
byte $03,$03,$16,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $16,$10,$10,$10,$10,$10,$10,$16,$10,$09,$15,$1f,$1f,$1f,$16,$1f
byte $1f,$1f,$15,$15,$08,$06,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$06,$00,$00
byte $00,$00,$00,$16,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$00
byte $00,$08,$1f,$0b,$0b,$0b,$0b,$0b,$0b,$1f,$08,$08,$00,$00,$00,$00
byte $00,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$09,$03,$03,$03,$16,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$08,$16,$10,$10,$10,$10,$10,$10,$10,$10,$09,$15,$15
byte $15,$15,$16,$15,$15,$15,$15,$15,$08,$06,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$08,$08,$1f,$0b,$0b,$0b,$0b,$1f,$08,$08,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$09,$06,$00,$00,$16,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$08,$16,$10,$10,$10,$10,$10,$10,$10
byte $10,$09,$15,$15,$00,$00,$00,$00,$00,$00,$16,$15,$08,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$08,$08,$1f,$1f,$1f,$1f
byte $08,$08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08,$06,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1f,$1f,$1f,$1f
byte $00,$00,$16,$1f,$1f,$1f,$15,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16,$15
byte $08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08
byte $08,$08,$08,$08,$08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08
byte $08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08
byte $08,$08,$08,$08,$00,$00,$16,$08,$08,$08,$15,$15,$15,$15,$15,$15
byte $15,$15,$16,$15,$08,$0c,$0c,$0c,$0c,$0c,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$08,$08,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$16,$0d,$0d,$0d,$1e,$1e
byte $1e,$1e,$1e,$1e,$1e,$15,$16,$15,$08,$0c,$0c,$0c,$0c,$0f,$0f,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$0f,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0f,$0f,$0f,$0f,$0f,$08,$08,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$16,$15,$08,$0f,$0f,$0f
byte $0f,$0f,$15,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$15,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$00,$08,$15,$15,$15,$15,$16,$15,$15,$15,$15,$15,$16,$15
byte $15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$00,$15,$1e,$1e,$1e,$1e,$16,$00,$00,$00
byte $00,$15,$16,$15,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15
byte $15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$0b,$0b,$0b,$0b
byte $0b,$1a,$0b,$0b,$0b,$0b,$14,$0b,$0b,$0b,$0b,$1a,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$1e,$1e,$1e,$1e,$1e,$1e,$00,$15,$00,$00,$00,$15
byte $16,$00,$00,$04,$00,$15,$16,$15,$15,$0c,$0c,$16,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$16,$15,$15,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $1f,$16,$1f,$1f,$1f,$1f,$1f,$01,$01,$01,$01,$01,$01,$01,$01,$01
byte $01,$1c,$00,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16,$15,$15,$15,$15,$16
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$16,$15,$15,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$1d,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$1c,$0b,$0b,$14,$0b,$0b
byte $1a,$0b,$0b,$0b,$0b,$0b,$16,$15,$15,$0b,$0b,$0b,$0b,$00,$00,$00
byte $00,$00,$00,$15,$15,$16,$0b,$0b,$0b,$1a,$0b,$01,$01,$01,$01,$01
byte $01,$01,$01,$01,$01,$01,$01,$01,$01,$15,$15,$15,$15,$15,$16,$15
byte $15,$16,$0a,$16,$15,$15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$15,$01,$15,$15,$16,$15,$15,$0b,$0b,$0b
byte $0b,$0b,$0b,$1a,$0b,$14,$0b,$1a,$0b,$0b,$0b,$0b,$0b,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$16,$0b,$16,$15,$15,$1f,$16,$0b
byte $0b,$00,$00,$04,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$01
byte $01,$05,$06,$07,$08,$09,$0a,$07,$01,$01,$01,$01,$01,$1e,$1e,$1e
byte $1e,$1e,$16,$15,$15,$16,$0a,$16,$15,$15,$00,$04,$00,$00,$00,$15
byte $15,$15,$15,$00,$00,$00,$00,$00,$00,$00,$15,$15,$15,$15,$16,$0b
byte $0b,$0b,$0b,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16
byte $0a,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$16,$0b,$16,$1e
byte $1e,$1e,$16,$0b,$0b,$16,$15,$15,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$15,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01
byte $01,$00,$00,$00,$00,$00,$16,$15,$15,$16,$0a,$16,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$16,$0a,$0a,$16,$15
byte $15,$15,$16,$1f,$16,$1f,$0a,$16,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
byte $0a,$15,$15,$16,$0a,$0a,$0a,$00,$00,$00,$00,$00,$15,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$15,$15,$16,$0a,$0a,$16,$15,$15,$16,$15,$15,$15
byte $16,$0b,$0b,$1c,$0b,$1a,$15,$01,$01,$01,$01,$01,$02,$01,$01,$01
byte $01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$16,$15,$15,$16,$0a,$0a
byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15,$16
byte $0a,$0a,$16,$0a,$0a,$0a,$16,$15,$16,$15,$0a,$16,$0a,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$0a,$15,$15,$16,$0a,$0a,$0a,$00,$00,$00,$00,$00
byte $15,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$15,$15,$16,$0a,$0a,$0a,$0a,$0a
byte $16,$15,$15,$15,$16,$15,$15,$15,$15,$15,$15,$01,$01,$16,$12,$12
byte $12,$12,$12,$01,$01,$01,$01,$14,$01,$16,$00,$00,$00,$00,$00,$15
byte $15,$16,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
byte $0a,$0a,$0a,$16,$0a,$0a,$16,$0a,$0a,$0a,$16,$15,$16,$15,$0a,$16
byte $1f,$1f,$1f,$1f,$1f,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16
byte $00,$00,$00,$00,$1f,$16,$1f,$1f,$1f,$1f,$1f,$16,$1f,$1f,$1f,$1f
byte $1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$16,$1e,$1e,$1e,$1e,$1e,$1e,$19
byte $01,$16,$11,$11,$11,$11,$11,$18,$17,$01,$01,$18,$01,$16,$00,$00
byte $1f,$16,$1f,$15,$15,$16,$0a,$16,$1f,$1f,$1f,$1f,$16,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$16,$0a,$0a,$0a,$16,$15
byte $1f,$1f,$1f,$16,$00,$00,$00,$00,$00,$16,$00,$00,$00,$00,$15,$15
byte $0a,$0a,$0a,$16,$00,$00,$00,$00,$15,$16,$15,$15,$15,$15,$15,$16
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$16,$00,$00,$00
byte $00,$00,$00,$00,$01,$16,$11,$11,$11,$11,$11,$04,$00,$01,$01,$04
byte $00,$16,$00,$00,$15,$16,$15,$15,$15,$16,$0a,$16,$15,$15,$15,$15
byte $16,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$16,$0a
byte $0a,$0a,$0a,$0a,$15,$15,$15,$16,$1f,$1f,$1f,$1f,$1f,$16,$00,$00
byte $04,$00,$15,$15,$1f,$1f,$1f,$16,$00,$00,$00,$00,$1e,$16,$1e,$1e
byte $1e,$1e,$1e,$16,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$15,$15
byte $16,$00,$00,$00,$00,$00,$00,$0d,$0d,$16,$15,$15,$15,$15,$15,$0d
byte $0d,$0d,$0d,$0d,$0d,$16,$00,$00,$1e,$16,$1e,$15,$15,$16,$0a,$16
byte $15,$07,$07,$07,$16,$0a,$16,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f
byte $16,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$16,$1e,$1e,$1e,$1e
byte $1e,$16,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$00,$00,$00,$00,$00
byte $00,$16,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$04,$15,$15,$16,$0d,$0d,$0d,$0d,$0d,$0d,$01,$01,$0c,$0c,$01
byte $0c,$01,$0c,$0c,$01,$01,$0c,$04,$04,$04,$04,$04,$00,$04,$00,$15
byte $15,$16,$00,$00,$00,$00,$00,$00,$16,$00,$16,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$16,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$16,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08
byte $08,$08,$08,$16,$08,$08,$15,$15,$16,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0d,$0d,$0d
byte $0d,$16,$0d,$15,$15,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$16,$15
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$16,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$16,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$16,$0d,$0d,$15,$15,$16,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$15,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$15
byte $16,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$00
byte $00,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$15,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$15,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$15,$15,$16,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15,$15
byte $15,$15,$15,$15
TITLE_ATTRIBUTE_MEM
byte $08,$1e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0b,$0b,$0e,$0e,$2e,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$1a,$3a,$3a,$3a,$1a,$3a,$1a,$3a,$3a,$3a,$1a,$2a
byte $3a,$1a,$1a,$1a,$1a,$2a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a
byte $1a,$1a,$1a,$1a,$1a,$1a,$1a,$3a,$3a,$1a,$1a,$3a,$3a,$1a,$3a,$3a
byte $1a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$08,$08,$08,$08,$08,$4e
byte $4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e
byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$0e,$0e,$0a,$0a,$0a,$1a,$0a,$0a,$1a,$1a,$0a,$1a,$0a
byte $1a,$1a,$0a,$0a,$0a,$0a,$0a,$1a,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $3a,$3a,$3a,$3a,$3a,$3a,$3a,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$0e,$0e,$08,$08,$08,$5b,$5b,$5b,$5b,$5b,$5b,$5b,$0e
byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$5e
TITLE_TILE_MEM
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01
byte $02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f,$10,$11
byte $12,$12,$12,$12,$12,$13,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12
byte $14,$14,$14,$14,$14,$15,$15,$14,$14,$16,$14,$14,$16,$15,$15,$16
byte $17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1b,$1f,$20,$21,$22,$23,$21,$21
byte $24,$25,$26,$27,$28,$29,$2a,$2b,$28,$2c,$2d,$2b,$2e,$2f,$30,$2b
byte $31,$32,$33,$34,$35,$36,$37,$38,$28,$39,$3a,$3b,$2e,$3c,$3d,$3e
byte $31,$3f,$40,$34,$28,$41,$42,$43,$28,$44,$45,$46,$2e,$3c,$3d,$3e
byte $47,$48,$49,$4a,$4b,$4c,$4d,$3e,$4b,$4c,$4d,$3e,$4e,$4f,$50,$43
byte $17,$51,$52,$53,$1b,$54,$55,$56,$1b,$54,$55,$56,$57,$58,$59,$56
byte $5a,$5b,$5c,$5a,$5d,$5b,$5c,$5a,$5a,$5e,$5c,$5a,$5d,$5b,$5c,$5a
byte $5f,$5f,$5f,$5f,$60,$5f,$5f,$5f,$61,$5f,$5f,$5f,$5f,$5f,$5f,$62
byte $63,$63,$64,$63,$65,$66,$67,$68,$69,$6a,$6b,$6c,$6d,$6e,$60,$6f
byte $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7a,$7b,$7c,$7d,$7e,$7f
byte $02,$02,$02,$02,$80,$02,$02,$02,$81,$02,$02,$02,$02,$02,$02,$82
byte $83,$84,$84,$84,$83,$84,$84,$84,$83,$84,$84,$84,$84,$84,$84,$84
byte $85,$86,$87,$88,$89,$8a,$8b,$8c,$8d,$8b,$8e,$8f,$90,$91,$92,$93
byte $94,$95,$96,$97,$89,$8a,$8b,$8c,$8d,$8b,$8e,$8f,$90,$91,$92,$93
byte $98,$99,$98,$99,$9a,$98,$99,$98,$98,$99,$98,$99,$99,$98,$99,$98
byte $9b,$9c,$9d,$9e,$9f,$14,$14,$a0,$9f,$14,$14,$a0,$a1,$14,$14,$a0
byte $a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$aa,$ab,$ac,$ad,$ae,$ab,$af,$ae
byte $b0,$b1,$b1,$b2,$b0,$b3,$b3,$b4,$b0,$b3,$b3,$b2,$b0,$b5,$b5,$b6
byte $15,$02,$02,$02,$14,$02,$02,$02,$14,$15,$14,$14,$14,$14,$15,$14
byte $02,$b7,$b8,$02,$02,$14,$14,$02,$14,$15,$15,$14,$14,$15,$15,$14
byte $02,$b9,$14,$02,$02,$15,$14,$02,$02,$14,$ba,$02,$02,$bb,$14,$02
byte $bc,$bd,$be,$bc,$bc,$bd,$be,$bc,$bf,$c0,$c1,$c2,$bc,$c3,$c4,$bc
byte $c5,$c5,$c5,$c5,$c6,$c5,$c6,$c6,$c5,$c7,$c5,$c5,$c7,$c5,$c5,$c6
byte $c8,$c9,$ca,$c8,$cb,$cc,$cc,$cd,$ce,$cc,$cc,$cd,$ce,$cc,$cc,$cd
byte $cf,$cf,$cf,$cf,$d0,$d1,$d2,$d3,$d4,$d5,$d6,$d7,$d8,$d9,$da,$db
byte $bc,$bd,$bc,$bc,$dc,$dd,$dc,$dc,$de,$de,$de,$de,$df,$e0,$e1,$df
byte $e2,$e2,$e2,$e3,$e4,$e4,$e4,$e4,$e5,$e6,$e6,$e6,$e7,$e8,$e9,$ea
Game_Maps.asm
MAP_MEM
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08,$08,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $05,$0f,$0f,$14,$0f,$05,$0f,$0f,$0f,$05,$0f,$0f,$0f,$0f,$0f,$05
byte $0f,$0f,$0f,$18,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$17,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$05,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$18,$0f,$0f,$0f,$00,$0f,$0f
byte $0f,$0f,$17,$0f,$0f,$0f,$17,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08
byte $08,$08,$0f,$0f,$0f,$0f,$0f,$18,$0f,$0f,$18,$0f,$0f,$0f,$05,$0f
byte $0f,$0f,$0f,$0f,$17,$0f,$0f,$14,$08,$17,$0f,$09,$06,$18,$17,$0f
byte $0f,$0f,$00,$00,$0f,$0f,$0f,$17,$0f,$0f,$0f,$0f,$02,$0f,$0f,$00
byte $00,$00,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$18,$0f,$05,$0f,$02,$0f,$0f
byte $0f,$0f,$17,$16,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$18,$00,$0f,$02
byte $0f,$00,$00,$0f,$05,$0f,$00,$0f,$0f,$17,$00,$17,$0f,$0f,$0f,$0f
byte $0f,$02,$0f,$08,$08,$08,$08,$0f,$17,$0f,$0f,$00,$0f,$0f,$17,$0f
byte $0f,$17,$17,$16,$0f,$15,$1e,$15,$1e,$1e,$15,$14,$08,$00,$0f,$09
byte $06,$18,$00,$09,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$1e,$1e,$09,$1e,$1e,$1e,$1e,$1e,$1e,$06,$17,$18,$17,$18
byte $09,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$06
byte $00,$00,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$08,$08,$08,$08,$06,$00,$0f,$00,$00
byte $0f,$0f,$00,$0f,$0f,$00,$00,$00,$0f,$15,$14,$15,$14,$14,$15,$14
byte $08,$06,$00,$09,$06,$00,$00,$09,$0b,$01,$0b,$08,$0b,$01,$0b,$08
byte $0b,$01,$0b,$08,$0b,$01,$0b,$08,$09,$0b,$01,$08,$0b,$01,$0b,$06
byte $00,$00,$00,$00,$09,$0b,$01,$0b,$08,$01,$0b,$08,$0b,$01,$08,$0b
byte $01,$0b,$0b,$06,$00,$00,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$06
byte $00,$0f,$00,$00,$0f,$17,$00,$17,$0f,$00,$00,$00,$0f,$15,$1d,$15
byte $1d,$1d,$15,$14,$08,$06,$00,$09,$06,$00,$00,$09,$07,$07,$07,$07
byte $07,$07,$07,$08,$07,$07,$07,$08,$07,$07,$07,$08,$09,$08,$08,$08
byte $08,$08,$08,$06,$00,$00,$00,$00,$09,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$06,$00,$00,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$06,$00,$17,$00,$00,$0f,$00,$00,$00,$0f,$00,$00,$00
byte $00,$0f,$0f,$15,$00,$0f,$15,$14,$08,$06,$00,$08,$06,$00,$00,$09
byte $0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08
byte $09,$0b,$01,$08,$0b,$01,$0b,$06,$00,$06,$00,$00,$09,$0b,$0b,$0b
byte $08,$0b,$0b,$08,$0b,$0b,$08,$0b,$0b,$0b,$08,$06,$00,$00,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$1e,$1e,$1e,$1e,$15,$14,$08,$06,$00,$08
byte $06,$00,$00,$09,$07,$07,$07,$08,$07,$07,$07,$08,$07,$07,$07,$08
byte $07,$07,$07,$08,$09,$0b,$0b,$08,$0b,$0b,$0b,$06,$00,$06,$00,$00
byte $09,$0b,$01,$0b,$08,$01,$0b,$08,$0b,$01,$08,$0b,$01,$0b,$08,$06
byte $00,$00,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$06,$00,$00,$00,$00
byte $00,$00,$00,$14,$14,$14,$14,$00,$00,$00,$14,$14,$14,$14,$15,$14
byte $08,$06,$00,$09,$06,$00,$00,$00,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$09,$08,$08,$08,$08,$08,$08,$06
byte $00,$06,$1e,$1e,$09,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$06,$00,$00,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$06
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1d
byte $1d,$1d,$15,$14,$08,$06,$00,$09,$06,$00,$00,$00,$00,$08,$08,$08
byte $08,$08,$08,$08,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$08,$09,$0b,$0b,$0b
byte $0b,$0b,$0b,$06,$03,$06,$08,$08,$09,$1a,$1a,$1a,$1a,$1a,$1a,$1a
byte $13,$1a,$1a,$1a,$1a,$1a,$08,$06,$00,$00,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b,$0b,$0b,$08,$0b
byte $0b,$0b,$08,$06,$1e,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$00,$00,$00,$00,$00,$15,$14,$08,$06,$00,$09,$06,$00,$00,$00
byte $00,$00,$07,$07,$07,$07,$07,$08,$1a,$1a,$1a,$13,$1a,$1a,$1a,$08
byte $09,$0b,$0b,$0b,$0b,$0b,$0b,$06,$1a,$06,$1a,$08,$09,$1a,$1a,$1a
byte $15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1a,$08,$06,$00,$00,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b,$01,$0b,$08,$0b
byte $01,$0b,$08,$0b,$01,$0b,$08,$08,$08,$15,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$00,$04,$00,$00,$00,$15,$14,$08,$00,$00,$09
byte $06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1e,$15,$1e,$1e
byte $1e,$15,$1e,$08,$09,$1e,$1e,$1e,$1e,$15,$1e,$06,$1a,$06,$1a,$1a
byte $09,$1a,$1a,$1a,$15,$08,$08,$08,$08,$08,$08,$08,$08,$1a,$08,$06
byte $00,$00,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$12,$15,$12,$12
byte $12,$12,$12,$12,$12,$12,$12,$12,$08,$1e,$1e,$1e,$1e,$1e,$15,$14
byte $08,$00,$09,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $08,$15,$08,$08,$08,$15,$08,$08,$09,$08,$08,$08,$08,$15,$08,$06
byte $1a,$06,$1a,$1a,$1a,$1a,$1a,$1a,$15,$08,$06,$1a,$1a,$1a,$04,$1a
byte $1a,$1a,$1a,$06,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a
byte $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$08,$08,$08,$08
byte $12,$15,$12,$12,$12,$12,$12,$12,$12,$12,$12,$12,$08,$14,$14,$14
byte $14,$14,$15,$14,$08,$00,$09,$08,$06,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$15,$08,$08,$08,$15,$08,$08,$09,$1a,$1a,$1a
byte $1a,$1a,$1a,$1a,$1a,$06,$1a,$1e,$1e,$15,$1e,$1e,$1e,$08,$06,$1a
byte $1a,$1e,$1e,$1e,$1e,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$15,$1e,$1e
byte $1e,$1e,$1e,$1e,$1e,$1e,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1a
byte $1a,$08,$08,$15,$1e,$1e,$1e,$1e,$1e,$15,$12,$12,$12,$12,$12,$12
byte $12,$1d,$1d,$1d,$1d,$1d,$15,$14,$08,$00,$09,$08,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$15,$08,$1a,$1a,$15,$1a,$1a
byte $09,$1a,$1a,$1a,$1a,$15,$1e,$1e,$1e,$06,$1a,$08,$08,$15,$08,$08
byte $08,$08,$06,$1a,$1a,$08,$08,$08,$06,$1a,$1a,$15,$1e,$1a,$1e,$1a
byte $1a,$15,$08,$08,$08,$08,$08,$08,$08,$08,$15,$08,$08,$08,$08,$08
byte $08,$08,$08,$1a,$1a,$1a,$08,$15,$08,$08,$08,$08,$08,$15,$03,$03
byte $1e,$1e,$1e,$1e,$15,$00,$00,$00,$00,$00,$00,$14,$08,$00,$09,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$1a
byte $1a,$15,$1a,$1a,$09,$1a,$1a,$1a,$1a,$15,$08,$08,$08,$06,$1a,$1a
byte $1a,$15,$1a,$1a,$1a,$08,$06,$1a,$1a,$08,$08,$08,$06,$1a,$1a,$15
byte $08,$1a,$08,$1a,$1a,$15,$08,$08,$1a,$1a,$1a,$1a,$1a,$08,$15,$03
byte $03,$03,$08,$03,$03,$03,$03,$03,$03,$03,$03,$15,$03,$03,$03,$03
byte $03,$15,$03,$03,$08,$08,$08,$08,$15,$00,$00,$00,$00,$00,$00,$14
byte $08,$06,$08,$08,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a,$08,$06,$1a,$1a
byte $1a,$1a,$1a,$1a,$1a,$15,$1a,$1a,$09,$1a,$1a,$1e,$1e,$1e,$08,$08
byte $08,$08,$1e,$1e,$1e,$1e,$1e,$1e,$1a,$08,$06,$1e,$1e,$08,$08,$08
byte $08,$1e,$1e,$1e,$08,$1a,$06,$1a,$1e,$1e,$08,$08,$1e,$1e,$1e,$15
byte $1e,$08,$15,$03,$03,$03,$0e,$1e,$1e,$15,$1e,$1e,$1e,$03,$03,$15
byte $03,$03,$03,$03,$03,$15,$03,$03,$03,$03,$14,$14,$15,$00,$00,$00
byte $00,$00,$15,$14,$08,$06,$08,$08,$1e,$1e,$1e,$1e,$15,$1e,$1e,$1e
byte $08,$06,$1a,$1a,$13,$1a,$1a,$1a,$1a,$15,$1e,$1e,$08,$1a,$1a,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$0b,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$1a,$06,$1a,$08,$08,$08,$08
byte $08,$08,$08,$15,$08,$08,$15,$03,$03,$03,$08,$08,$08,$15,$08,$08
byte $08,$03,$03,$03,$03,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$14,$00
byte $15,$1e,$1e,$1e,$1e,$00,$15,$14,$08,$06,$08,$08,$08,$08,$08,$08
byte $15,$08,$08,$08,$08,$08,$1e,$1e,$1e,$1e,$1e,$15,$0b,$15,$08,$08
byte $08,$0b,$0b,$0b,$0b,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$09,$08
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$0e,$0e,$0e,$0e,$0b,$06,$0b
byte $0e,$0e,$0e,$0e,$0e,$0e,$08,$15,$03,$03,$15,$03,$03,$03,$03,$03
byte $06,$03,$03,$03,$03,$03,$03,$03,$03,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$14,$00,$15,$14,$14,$14,$14,$00,$15,$14,$08,$06,$08,$08
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$08,$08,$08,$08,$08,$15
byte $0b,$0b,$0b,$0b,$09,$0b,$06,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$09,$08,$0b,$0b,$19,$0b,$13,$0b,$0b,$08,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$00,$00,$08,$15,$03,$03,$15,$03
byte $03,$03,$03,$03,$06,$03,$03,$03,$03,$03,$03,$03,$1e,$08,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$15,$1d,$1d,$1d,$1d,$00,$15,$14
byte $08,$06,$08,$08,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$09,$0b,$06,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$09,$08,$0b,$1e,$1e,$1e,$1e,$1e,$1e,$08
byte $08,$0b,$0b,$0b,$1e,$1e,$1e,$1e,$1e,$1e,$0b,$0b,$00,$00,$08,$15
byte $03,$03,$15,$03,$03,$03,$1e,$1e,$1e,$1e,$03,$03,$11,$12,$12,$12
byte $08,$08,$00,$04,$00,$00,$00,$00,$00,$00,$00,$14,$14,$14,$00,$00
byte $00,$00,$15,$10,$08,$06,$08,$08,$0b,$0b,$0b,$0b,$13,$0b,$0b,$0b
byte $08,$0b,$0b,$15,$1e,$1e,$1e,$1e,$1e,$15,$0b,$0b,$09,$0b,$06,$0b
byte $0b,$0b,$0b,$0b,$13,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$08,$08,$08
byte $08,$08,$08,$08,$1a,$0b,$1e,$1e,$08,$08,$08,$08,$08,$08,$1e,$0b
byte $00,$00,$00,$03,$03,$03,$15,$03,$03,$03,$08,$08,$08,$08,$03,$11
byte $12,$12,$12,$12,$08,$08,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$15,$1e,$1e,$00,$15,$14,$08,$06,$08,$08,$1e,$1e,$1e,$1e
byte $1e,$06,$1e,$1e,$08,$1e,$1e,$15,$08,$08,$08,$08,$08,$15,$0b,$0b
byte $09,$0b,$06,$0b,$1e,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$0b,$0b,$0b
byte $13,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$1e,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$1e,$00,$00,$00,$03,$03,$03,$15,$03,$03,$03,$03,$03
byte $03,$03,$11,$03,$12,$03,$12,$12,$10,$08,$08,$08,$08,$08,$08,$15
byte $10,$10,$14,$08,$08,$08,$15,$08,$08,$00,$15,$14,$08,$06,$08,$08
byte $08,$08,$08,$08,$08,$06,$00,$00,$00,$00,$00,$15,$08,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$06,$00,$08,$15,$08,$08,$08,$08,$08,$08
byte $08,$0b,$0b,$1e,$1e,$1e,$0b,$0b,$0b,$0b,$1e,$1e,$1e,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$00,$00,$09,$03,$03,$03,$15,$1e
byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15,$10,$0e,$0e
byte $0e,$0e,$0e,$15,$10,$10,$14,$00,$00,$00,$15,$00,$00,$00,$15,$14
byte $08,$06,$07,$07,$07,$07,$07,$07,$07,$06,$00,$00,$00,$00,$00,$15
byte $08,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$08,$00,$00,$15,$0b,$0e
byte $0e,$0e,$0e,$0e,$0b,$0b,$1e,$08,$08,$08,$00,$00,$00,$09,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$00,$00,$09,$03
byte $03,$03,$15,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $15,$10,$10,$10,$10,$10,$10,$15,$10,$09,$14,$1e,$1e,$1e,$15,$1e
byte $1e,$1e,$14,$14,$08,$06,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$06,$00,$00
byte $00,$00,$00,$15,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$00
byte $00,$08,$1e,$0b,$0b,$0b,$0b,$0b,$0b,$1e,$08,$08,$00,$00,$00,$00
byte $00,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$09,$03,$03,$03,$15,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$08,$15,$10,$10,$10,$10,$10,$10,$10,$10,$09,$14,$14
byte $14,$14,$15,$14,$14,$14,$14,$14,$08,$06,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$08,$08,$1e,$0b,$0b,$0b,$0b,$1e,$08,$08,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$09,$06,$00,$00,$15,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$08,$15,$10,$10,$10,$10,$10,$10,$10
byte $10,$09,$14,$14,$00,$00,$00,$00,$00,$00,$15,$14,$08,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$08,$08,$1e,$1e,$1e,$1e
byte $08,$08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08,$06,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1e,$1e,$1e,$1e
byte $00,$00,$15,$1e,$1e,$1e,$14,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15,$14
byte $08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08
byte $08,$08,$08,$08,$08,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$08
byte $08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$08
byte $08,$08,$08,$08,$00,$00,$15,$08,$08,$08,$14,$14,$14,$14,$14,$14
byte $14,$14,$15,$14,$08,$0c,$0c,$0c,$0c,$0c,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$08,$08,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$15,$0d,$0d,$0d,$1d,$1d
byte $1d,$1d,$1d,$1d,$1d,$14,$15,$14,$08,$0c,$0c,$0c,$0c,$0f,$0f,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$0f,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0f,$0f,$0f,$0f,$0f,$08,$08,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$15,$14,$08,$0f,$0f,$0f
byte $0f,$0f,$14,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$14,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f
byte $0f,$0f,$0f,$0f,$0f,$0f,$0f,$0f,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
byte $08,$08,$15,$08,$14,$14,$14,$14,$15,$14,$14,$14,$14,$14,$15,$14
byte $14,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$15,$14,$1d,$1d,$1d,$1d,$15,$00,$00,$00
byte $00,$14,$15,$14,$14,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14
byte $14,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d
byte $1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$0b,$0b,$0b,$0b
byte $0b,$19,$0b,$0b,$0b,$0b,$13,$0b,$0b,$0b,$0b,$19,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$1d,$1d,$1d,$1d,$1d,$1d,$15,$14,$0b,$0b,$0b,$14
byte $15,$00,$00,$04,$00,$14,$15,$14,$14,$0c,$0c,$15,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$15,$14,$14,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$15,$1e,$1e,$1e,$1e,$1e,$15,$0b,$0b,$0b,$0b,$0b,$0b,$15,$1e
byte $0b,$1b,$0b,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15,$14,$14,$14,$14,$15
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$15,$14,$14,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$1c,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$1b,$0b,$0b,$13,$0b,$0b
byte $19,$0b,$0b,$0b,$0b,$0b,$15,$14,$14,$0b,$0b,$0b,$0b,$00,$00,$00
byte $00,$00,$00,$14,$14,$15,$0b,$0b,$0b,$19,$0b,$15,$0b,$0b,$0b,$0b
byte $0b,$0b,$15,$14,$14,$14,$14,$14,$15,$14,$14,$14,$14,$14,$15,$14
byte $14,$15,$0a,$15,$14,$14,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$14,$01,$14,$14,$15,$14,$14,$0b,$0b,$0b
byte $0b,$0b,$0b,$19,$0b,$13,$0b,$19,$0b,$0b,$0b,$0b,$0b,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$15,$0b,$15,$14,$14,$1e,$15,$0b
byte $0b,$00,$00,$04,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15
byte $1a,$1a,$1c,$1a,$1a,$1a,$15,$14,$15,$00,$15,$1e,$15,$1d,$1d,$1d
byte $1d,$1d,$15,$14,$14,$15,$0a,$15,$14,$14,$00,$04,$00,$00,$00,$14
byte $14,$14,$14,$00,$00,$00,$00,$00,$00,$00,$14,$14,$14,$14,$15,$0b
byte $0b,$0b,$0b,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15
byte $0a,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$15,$0b,$15,$1d
byte $1d,$1d,$15,$0b,$0b,$15,$14,$14,$0b,$0b,$0b,$0b,$0b,$0b,$0b,$0b
byte $0b,$0b,$14,$15,$0b,$0b,$13,$0b,$19,$0b,$15,$14,$15,$00,$15,$14
byte $15,$00,$00,$00,$00,$00,$15,$14,$14,$15,$0a,$15,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$0a,$0a,$15,$14
byte $14,$14,$15,$1e,$15,$1e,$0a,$15,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
byte $0a,$14,$14,$15,$0a,$0a,$0a,$00,$00,$00,$00,$00,$14,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$14,$14,$15,$0a,$0a,$15,$14,$14,$15,$14,$14,$14
byte $15,$0b,$0b,$1b,$0b,$19,$14,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$15,$14,$14,$15,$0a,$0a
byte $1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$14,$15
byte $0a,$0a,$15,$0a,$0a,$0a,$15,$14,$15,$14,$0a,$15,$0a,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$0a,$14,$14,$15,$0a,$0a,$0a,$00,$00,$00,$00,$00
byte $14,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$14,$14,$15,$0a,$0a,$0a,$0a,$0a
byte $15,$14,$14,$14,$15,$14,$14,$14,$14,$14,$14,$15,$14,$14,$14,$14
byte $14,$14,$14,$14,$15,$1e,$1e,$1e,$1e,$15,$00,$00,$00,$00,$00,$14
byte $14,$15,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
byte $0a,$0a,$0a,$15,$0a,$0a,$15,$0a,$0a,$0a,$15,$14,$15,$14,$0a,$15
byte $1e,$1e,$1e,$1e,$1e,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15
byte $00,$00,$00,$00,$1e,$15,$1e,$1e,$1e,$1e,$1e,$15,$1e,$1e,$1e,$1e
byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$15,$1d,$1d,$1d,$1d,$1d,$1d,$15
byte $1d,$1d,$1d,$1d,$1d,$1d,$1d,$14,$14,$14,$14,$14,$14,$15,$00,$00
byte $1e,$15,$1e,$14,$14,$15,$0a,$15,$1e,$1e,$1e,$1e,$15,$0a,$0a,$0a
byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$15,$0a,$0a,$0a,$15,$14
byte $1e,$1e,$1e,$15,$00,$00,$00,$00,$00,$15,$00,$00,$00,$00,$14,$14
byte $0a,$0a,$0a,$15,$00,$00,$00,$00,$14,$15,$14,$14,$14,$14,$14,$15
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$00,$00,$00
byte $00,$00,$00,$15,$00,$00,$00,$00,$00,$00,$00,$14,$14,$1d,$1d,$1d
byte $1d,$15,$00,$00,$14,$15,$14,$14,$14,$15,$0a,$15,$14,$14,$14,$14
byte $15,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a,$15,$0a
byte $0a,$0a,$0a,$0a,$14,$14,$14,$15,$1e,$1e,$1e,$1e,$1e,$15,$00,$00
byte $04,$00,$14,$14,$1e,$1e,$1e,$15,$00,$00,$00,$00,$1d,$15,$1d,$1d
byte $1d,$1d,$1d,$15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14,$14
byte $15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$14
byte $14,$00,$00,$00,$00,$15,$00,$00,$1d,$15,$1d,$14,$14,$15,$0a,$15
byte $14,$07,$07,$07,$15,$0a,$15,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$15,$1d,$1d,$1d,$1d
byte $1d,$15,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$1d,$00,$00,$00,$00,$00
byte $00,$15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$04,$14,$14,$15,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$14,$14,$00,$00,$00,$00,$15,$00,$00,$00,$15,$00,$14
byte $14,$15,$00,$00,$00,$00,$00,$00,$15,$00,$15,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$15,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$15,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08
byte $08,$08,$08,$15,$08,$08,$14,$14,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$15,$0d,$14,$14,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$15,$14
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$15,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$0d,$15,$0d,$0d,$0d,$0d,$0d,$0d
byte $0d,$0d,$0d,$0d,$0d,$0d,$0d,$15,$0d,$0d,$14,$14,$15,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$14,$14,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14
byte $15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14
byte $14,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$14,$14,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$14,$14,$15,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14
byte $14,$14,$14,$14
ATTRIBUTE1_MEM
byte $03,$0b,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$2e,$0e,$2b,$2b,$2b,$2e,$0e,$0e,$0b,$0e,$0b,$0b,$1e
byte $38,$3e,$33,$18,$38,$1e,$3e,$18,$38,$3e,$18,$28,$3e,$1e,$1e,$1e
byte $1e,$28,$18,$18,$18,$18,$18,$18,$18,$18,$18,$18,$1e,$1e,$18,$18
byte $1e,$18,$18,$1e,$1e,$1e,$1e,$18,$18,$3e,$18,$18,$3e,$3e,$18,$18
byte $3e,$18,$18,$3e,$18,$18,$0a,$0a,$0a,$0a,$0a,$0b,$0b,$0b,$0b,$0b
byte $4e,$4e,$4e,$4e,$4b,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e,$4e
byte $4e,$0e,$0e,$0e,$0e,$0e,$0e,$0b,$0b,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0b,$0e,$0e,$0e,$0e,$0e,$1e,$1e,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
byte $0e,$0e,$0e,$0e,$0e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
byte $1e,$1e,$1e,$3a,$3b,$3a,$3b,$3a,$3b,$3a,$0b,$0b,$0b,$0b,$0b,$0e
byte $0e,$0e,$0b,$0e,$0e,$0b,$0b,$0b,$5b,$5b,$5b,$5b,$5b,$5b,$5b,$0e
byte $0e,$0e,$0e,$0e,$0b,$0b,$0e,$0e,$0e,$0e,$0e,$0e,$0e,$0b,$0b,$0b
byte $0b,$1e,$1b,$1e,$1e,$1e,$1b,$1e,$1b,$5b
TILE_MEM
byte $00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0a,$0c,$0d,$0e,$0f,$10
byte $11,$12,$13,$14,$15,$16,$17,$18,$19,$1a,$1b,$1c,$1d,$1e,$1f,$20
byte $21,$22,$23,$24,$25,$26,$27,$28,$29,$2a,$2b,$2c,$2d,$2e,$2f,$30
byte $01,$01,$01,$01,$01,$31,$01,$01,$32,$33,$34,$01,$35,$36,$37,$38
byte $11,$39,$3a,$11,$11,$3b,$3c,$11,$11,$01,$3d,$11,$11,$3e,$01,$11
byte $3f,$40,$41,$42,$43,$44,$45,$46,$47,$48,$49,$42,$4a,$4b,$4c,$42
byte $4d,$4e,$4f,$50,$51,$52,$53,$54,$55,$56,$57,$58,$59,$5a,$5b,$5c
byte $5d,$5e,$5f,$60,$43,$61,$62,$63,$47,$64,$47,$65,$4a,$66,$67,$68
byte $42,$69,$6a,$6b,$6c,$6d,$6e,$6f,$42,$70,$71,$72,$42,$73,$74,$75
byte $76,$77,$78,$76,$76,$77,$76,$76,$79,$77,$76,$76,$76,$77,$7a,$76
byte $7b,$7c,$7d,$7b,$7e,$7c,$7d,$7b,$7b,$7f,$7d,$7b,$7e,$7c,$7d,$7b
byte $80,$80,$80,$80,$81,$80,$80,$80,$82,$80,$80,$80,$80,$80,$80,$83
byte $84,$84,$85,$84,$86,$87,$88,$89,$8a,$8b,$8c,$8d,$8e,$8f,$81,$90
byte $91,$92,$93,$94,$95,$96,$97,$98,$99,$9a,$9b,$9c,$9d,$9e,$9f,$a0
byte $11,$11,$11,$11,$a1,$11,$11,$11,$a2,$11,$11,$11,$11,$11,$11,$a3
byte $a4,$a5,$a5,$a5,$a4,$a5,$a5,$a5,$a4,$a5,$a5,$a5,$a5,$a5,$a5,$a5
byte $30,$30,$00,$a6,$30,$00,$a6,$a6,$00,$a6,$a7,$a8,$a6,$a7,$a9,$a8
byte $30,$aa,$30,$aa,$ab,$30,$aa,$30,$30,$aa,$30,$aa,$aa,$30,$aa,$30
byte $ac,$ad,$ae,$af,$b0,$01,$01,$b1,$b2,$01,$01,$b1,$b3,$01,$01,$b4
byte $b5,$b6,$b7,$b8,$b9,$ba,$bb,$bc,$bd,$be,$bf,$c0,$c1,$be,$c2,$c1
byte $c3,$c4,$c4,$c5,$c3,$c6,$c6,$c7,$c3,$c6,$c6,$c5,$c3,$c8,$c8,$c9
byte $ca,$11,$11,$11,$01,$11,$11,$11,$01,$ca,$01,$01,$01,$01,$ca,$01
byte $11,$cb,$3d,$11,$11,$01,$01,$11,$01,$ca,$ca,$01,$01,$ca,$ca,$01
byte $11,$cc,$01,$11,$11,$ca,$01,$11,$11,$01,$cd,$11,$11,$ce,$01,$11
byte $7b,$7c,$7d,$7b,$7b,$7c,$7d,$7b,$cf,$d0,$d1,$d2,$7b,$d3,$d4,$7b
byte $d5,$d5,$d5,$d5,$d6,$d5,$d6,$d6,$d5,$d7,$d5,$d5,$d7,$d5,$d5,$d6
byte $d8,$d9,$da,$d8,$db,$dc,$dc,$dd,$de,$dc,$dc,$dd,$de,$dc,$dc,$dd
byte $d5,$d5,$d5,$d5,$df,$e0,$e1,$e2,$e3,$e4,$e5,$e6,$e7,$e8,$e9,$ea
byte $7b,$7c,$7b,$7b,$eb,$ec,$eb,$eb,$ed,$ed,$ed,$ed,$ee,$ef,$f0,$ee
byte $f1,$f1,$f1,$f2,$f3,$f3,$f3,$f3,$f4,$f5,$f5,$f5,$f6,$f7,$f8,$f9