; MARS RESCUE
; by Ron Martin
; v0.3

	processor 6502
	include vcs.h

SectionPF0 = $80 ; to 87
SectionPF1 = $88 ; to 8F
SectionPF2 = $90 ; to 97
Colors	= $98	 ; to 9E
LineOffset = $A0
SectionLo = $A1
SectionHi = $A2
Level = $A3
LevelLo = $A4
LevelHi = $A5
Temp = $A6 ; and $A7 for temp 16-bit values
SectionTemp = $A8
LevelWidth = $A9
ScanLine = $AA
ShipGraphic = $AB
WallOffset = $AC ; to B2
Color = $B3
WallAdjust = $B4 ; to $BA
LastOffset = $BB
Timer = $BC
	org $1000
	rorg $D000
Start
	NOP		;In case the second bank is loaded at start up, it must switch to this bank.
	NOP		;These NOP's provide "space" so that if the jump must occur, then it will
	NOP		;Jump to valid and proper code.
	
	SEI		;Disable interrupts, if there are any.
	CLD		;Clear BCD math bit.
	LDX  #$FF
	TXS		;Set stack to beginning.
	LDA #0

ClearLoop		;Clear memory.
	STA 0,X
	DEX
	BNE ClearLoop

Init			;Do initialization.
	LDA #$22
	STA COLUPF
	LDA #$31
	STA CTRLPF	;Set PF to reflect and ball to quad width.
	LDA #$06
	STA COLUP0
	;LDA #$01
	;STA WallOffset
	STA VDELBL
	LDA #$7F
	STA ShipGraphic
	JSR LoadLevel

MainLoop
	JSR  VerticalBlank ;Execute the vertical blank.
	JSR  CheckSwitches ;Check console switches.
	JSR  GameCalc      ;Do calculations during Vblank
	JSR  DrawScreen    ;Draw the screen
	JSR  OverScan      ;Do more calculations during overscan
	JMP  MainLoop      ;Continue forever.

VerticalBlank  ;*********************** VERTICAL BLANK HANDLER
	LDX  #0
	LDA  #2
	STA  WSYNC  
	STA  WSYNC
	STA  WSYNC
	STA  VSYNC ;Begin vertical sync.
	STA  WSYNC ; First line of VSYNC
	STA  WSYNC ; Second line of VSYNC.
	LDA  #44
	STA  TIM64T
	LDA #0
	STA CXCLR
	STA  WSYNC ; Third line of VSYNC.
	STA  VSYNC ; (0)
	RTS  

CheckSwitches ;*************************** CONSOLE SWITCH HANDLER
	LDA #0
	STA COLUBK  ; Background will be black.
	RTS

GameCalc ;******************************* GAME CALCULATION ROUTINES
	INC Timer
	JSR LoadSections
	LDA #$70
	STA ScanLine

	LDA #$0B
	STA LineOffset
	LDA #$00
	STA SectionTemp
	LDA #$80
	STA ShipGraphic
	RTS

DrawScreen ;**************************** SCREEN DRAWING ROUTINES
	LDA INTIM
	BNE DrawScreen		;Wait until it is safe to continue.
	
	STA WSYNC
	STA VBLANK		;End the VBLANK period with a zero.
	
	STA WSYNC
	LDY #$09
BurnShip
	DEY
	BNE BurnShip
	STA RESP0

	LDY #$10
BurnLines
	STA WSYNC
	DEY
	BNE BurnLines
	
	LDY #$00
Top
	STA WSYNC
	STY COLUPF 
	LDA #$00
	STA PF0
	LDA #$FF
	STA PF1
	STA PF2
	INY
	INY
	TYA
	CMP #$10
	BNE Top

	LDX SectionTemp	
	LDA Colors,X
	STA Color
	LDY ShipGraphic
MapLoop
	STA WSYNC
FirstLine
	LDA ShipData,Y
	STA GRP0
	LDA Color
	STA COLUPF
	LDA SectionPF1,X
	STA PF1
	LDA SectionPF2,X
	STA PF2
	DEC ScanLine
	BNE GoToSecond
	JMP Done
GoToSecond
	LDX ShipGraphic
	DEX
	LDA ShipData,X
	INC Color
SecondLine
	STA WSYNC
	STA GRP0
	LDA Color
	STA COLUPF
	DEX
	LDA ShipData,X
	DEC ScanLine
	BNE GoToThird
	JMP Done
GoToThird
	INC Color
	;Position Missile
ThirdLine
	STA WSYNC
	STA HMOVE
	STA GRP0
	LDA Color
	STA COLUPF
	DEX
	STX ShipGraphic
	DEC ScanLine
	BNE GoToRest
	JMP Done
GoToRest
	LDY LineOffset
RestOfSection
	STA WSYNC
	LDX ShipGraphic
	LDA ShipData,X
	STA GRP0
	LDA Color
	STA COLUPF
	DEX
	STX ShipGraphic
	DEC ScanLine
	BNE GoToNext
	JMP Done
GoToNext
	CPY #$06
	BMI ColorDown
	INC Color
	BVC DoneColor
ColorDown
	DEC Color
DoneColor
	DEY
	BNE RestOfSection
	LDA #$0B
	STA LineOffset
	STX ShipGraphic
	LDX SectionTemp
	LDA WallOffset,X
	BEQ NoPosition
	CMP #$FF
	BEQ NoPosition
	TAY
	LDX ShipGraphic
	
PositionWall
	STA WSYNC
	LDA ShipData,X
	STA GRP0
	LDA Color
	STA COLUPF
Position
	DEY
	BNE Position
	NOP
	NOP
	STA RESBL
	LDX SectionTemp
	LDA WallAdjust,X
	STA HMBL
	LDX ShipGraphic
	DEX
	DEC ScanLine
	BNE GoToWall
	JMP Done
GoToWall
	DEC Color
	JMP DrawWall
NoPosition
	STA WSYNC
	LDX ShipGraphic
	LDA ShipData,X
	STA GRP0
	LDA Color
	STA COLUPF
	DEX
	DEC ScanLine
	BNE GoToWall2
	JMP Done
GoToWall2
	DEC Color

DrawWall
	STA WSYNC
	STA HMOVE
	LDA ShipData,X
	STA GRP0
	DEX
	LDA Color
	STA COLUPF
	STX ShipGraphic
	LDX SectionTemp
	INX
	LDA WallOffset,X
	CMP #$FF
	BNE NoWall
Wall
	LDA #$02
	BVC SetDrawBit
NoWall
	LDA #$00
SetDrawBit
	STA ENABL
	DEC ScanLine
	BEQ Done

	STX SectionTemp
	LDA #$00
	STA HMBL
	LDA Colors,X
	STA Color
	LDY ShipGraphic
	STA HMCLR
	JMP MapLoop

Done
	LDY #$0E
Bottom
	STA WSYNC
	LDA #$00
	STA ENABL
	STY COLUPF 
	LDA #$00
	STA PF0
	LDA #$FF
	STA PF1
	STA PF2
	DEY
	DEY
	BNE Bottom

	STA WSYNC
	LDA #$00
	STA PF0
	STA PF1
	STA PF2
	STA GRP0
	STA COLUPF
	RTS

OverScan   ;***************************** OVERSCAN CALCULATIONS
	RTS
	
	org $1C00
	rorg $DC00
LoadLevel
	LDA $1FF9
	;After switching banks, there are 5 bytes of instruction
	;that the processor goes through.  We need to make sure valid
	;code goes into the proper memory location in this bank for
	;when the subroutine jumps back.  We'll just pad the 26 bytes
	;with $EA, which translates to NOP.  We could fill this with
	;useful code, but I haven't found a reason to yet.
	
	.byte $EA, $EA, $EA, $EA, $EA, $EA
	RTS
	
LoadSections
	LDA $1FF9
	;After switching banks, there are 32 bytes of instruction
	;that the processor goes through.  We need to make sure valid
	;code goes into the proper memory location in this bank for
	;when the subroutine jumps back.  We'll just pad the 32 bytes
	;with $EA, which translates to NOP.  We could fill this with
	;useful code, but I haven't found a reason to yet.
	
	.byte $EA, $EA, $EA, $EA, $EA, $EA
	RTS

	org $1D00
	rorg $DD00
;Graphics data will go here
ShipData
;80 bytes of blank, 8 bytes of data, 80 bytes of blank.
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $3C, $FF, $FF, $FF, $7E, $7E, $3C, $18
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	
	org $1FFC
	rorg $DFFC
	.word Start
	.word Start
;**********
;* BANK 2 *
;**********
;
;Bank 2 will hold all level data.  The level data is as follows:
;
;The first section, labeled "Catalog", will hold the addresses of the
;start of each level (two bytes per level).  This provides easy indexing
;and allows for variable length levels.  Also, it will hold the "width"
;of the level as well as the starting section (Can only be first 256 sections)
;
;The second section, labeled "Levels", will hold all the level data.  The
;level data has the following format:
;8 bits - Playfield definition for the section
;4 bits - High order color for the section
;4 bits - Wall (ball) offset, to fake asymmetrical playfield
;(Repeat for each section)
;8 bits - obstacle / target definition

	org $2000
	rorg $F000
Switch
	LDA $1FF8	;Jump to main bank.  In case this one was loaded first.
	
Catalog
	.byte $11, $00, $00, $00
	org $2100
	rorg $F100

;LEVEL DATA
;16 bits per section for the map data, 8 bits per section for the obstacle
;and power up data.
;
;MAP DATA
;+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
;|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
;+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
;  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^  ^__^__^__^__Wall position
;  |  |  |  |  |  |  |  |  |__|__|__|______________Base color
;  |__|__|__|__|__|__|__|__________________________Playfield definition
;
;Wall position is the offset used to position the wall horizontally.
;The wall is used to fake an asymmetric playfield.
;
;Base color is the base color to use for the playfield.
;
;Playfield definition refers to the offset used to find the bitmap
;for the desired playfield.  See the **PFDEFS** comments section at
;the end of this file.

Levels
;              PP   CW   PP   CW   PP   CW   PP   CW
	.byte $FF, $20, $AC, $79, $80, $39, $80, $50
	.byte $80, $30, $80, $87, $80, $27, $80, $30
	.byte $80, $3F, $80, $3F, $80, $3F, $FF, $20	;Eight
	;object data
	.byte $00, $00, $00, $00, $00, $00, $00, $00
	.byte $00, $00, $00, $00, $00 ,$00, $00, $00	;End level 0.

	org $2C00
	rorg $FC00
SwitchLoadLevel
	NOP			;Pad with NOP until we get to valid code area.
	NOP
	NOP
	JSR RealLoadLevel	;Jump to actual subroutine (Saves us from counting instruction bytes)
	LDA $1FF8		;Switch back to other bank.
SwitchLoadSections
	NOP			;Pad with NOP until we get to valid code area.
	NOP
	NOP
	NOP
	JSR RealLoadSections	;Jump to actual subroutine (Saves us from counting instruction bytes)
	LDA $1FF8		;Switch back to other bank.

RealLoadLevel
	LDA Level		
	ASL
	ASL
	TAX			
	LDA Catalog,X		
	STA LevelHi		
	LDA Catalog+1,X		
	STA LevelLo		
	LDA Catalog+2,X
	STA LevelWidth
	LDA Catalog+3,X
	STA SectionLo
	LDA #$00
	STA SectionHi
	RTS

RealLoadSections
	LDX #$00		
	STX SectionTemp	
	STX LastOffset
	JSR FindOffset		
	LDY #$00		
SectionLoop
	LDX SectionTemp		
	LDA (Temp),Y		
	AND #$F0		
	LSR			
	LSR			
	LSR			
	LSR
	TAX			
	LDA PF1Data,X		
	LDX SectionTemp		
	STA SectionPF1,X	
	LDA (Temp),Y		
	AND #$0F
	TAX			
	LDA PF2Data,X		
	LDX SectionTemp		
	STA SectionPF2,X
	JSR IncrementOffset
	LDA (Temp),Y
	AND #$F0
	ADC #$02
	STA Colors,X
	LDA (Temp),Y
	AND #$0F
	CMP LastOffset
	BNE ChangeOffset
	LDA #$00
	STA WallAdjust,X
	LDA #$FF
	BVC SkipTest
ChangeOffset
	STA LastOffset
	TAX
	LDA WallMinOffsetData,X
	LDX SectionTemp
	STA WallAdjust,X
	LDA (Temp),Y
	AND #$0F
	TAX
	LDA WallMajOffsetData,X
SkipTest
	LDX SectionTemp
	STA WallOffset,X
	LDX SectionTemp
	JSR IncrementOffset
	INC SectionTemp
	LDA #$08
	CMP SectionTemp
	BNE SectionLoop
	RTS

FindOffset
	LDA SectionLo
	STA Temp
	LDA SectionHi
	STA Temp+1
	CLC
	ASL Temp
	ROL Temp+1
	CLC
	LDA LevelLo
	ADC Temp
	STA Temp
	LDA LevelHi
	ADC Temp+1
	STA Temp+1
	CLC
	RTS
	
IncrementOffset
	CLC
	LDA Temp
	ADC #$01
	STA Temp
	LDA Temp+1
	ADC #$00
	STA Temp+1
	CLC
	RTS
	
	org $2E00
	rorg $FE00
	
	;These are the playfield section definitions.  The display
	;kernel will use these to draw, well, the playfield.
PF1Data
	.byte $00, $03, $0C, $0F, $30, $33, $3C, $3F
	.byte $C0, $C3, $CC, $CF, $F0, $F3, $FC, $FF
PF2Data
	.byte $00, $C0, $30, $F0, $0C, $CC, $3C, $FC
	.byte $03, $C3, $33, $F3, $0F, $CF, $3F, $FF

;Wall offset data.
;DON'T SCREW WITH THESE VALUES!!!!!!!!
;+-+-+-+-+-+-+-+-+
;|7|6|5|4|X|X|X|X|
;+-+-+-+-+-+-+-+-+
; ^ ^ ^ ^
; |_|_|_|____________Horizontal clock adjust (2's compliment)

WallMinOffsetData
	.byte $70, $00, $50, $E0, $50, $D0, $40, $C0
	.byte $30, $B0, $20, $A0, $10, $90, $00, $80

;DEC instructions to execute for ball positioning
WallMajOffsetData
	.byte $02, $02, $03, $03, $04, $04, $05, $05
	.byte $06, $06, $07, $07, $08, $08, $09, $09
	
	org $2FFC
	rorg $FFFC
	.word Switch
	.word Switch


;**PFDEFS**
;There are 256 different "pieces" from which a level can be built.
;These pieces do not reflect the possibilities of having a ball
;object placed to fake asymmetry in the playfield.  Below is
;a quick visual of the possibilities.
;00   |                |
;01   |       XX       |
;02   |      X  X      |
;03   |      XXXX      |
;04   |     X    X     |
;05   |     X XX X     |
;06   |     XX  XX     |
;07   |     XXXXXX     |
;08   |    X      X    |
;09   |    X  XX  X    |
;0A   |    X X  X X    |
;0B   |    X XXXX X    |
;0C   |    XX    XX    |
;0D   |    XX XX XX    |
;0E   |    XXX  XXX    |
;0F   |    XXXXXXXX    |
;10   |   X        X   |
;11   |   X   XX   X   |
;12   |   X  X  X  X   |
;13   |   X  XXXX  X   |
;14   |   X X    X X   |
;15   |   X X XX X X   |
;16   |   X XX  XX X   |
;17   |   X XXXXXX X   |
;18   |   XX      XX   |
;19   |   XX  XX  XX   |
;1A   |   XX X  X XX   |
;1B   |   XX XXXX XX   |
;1C   |   XXX    XXX   |
;1D   |   XXX XX XXX   |
;1E   |   XXXX  XXXX   |
;1F   |   XXXXXXXXXX   |
;20   |  X          X  |
;21   |  X    XX    X  |
;22   |  X   X  X   X  |
;23   |  X   XXXX   X  |
;24   |  X  X    X  X  |
;25   |  X  X XX X  X  |
;26   |  X  XX  XX  X  |
;27   |  X  XXXXXX  X  |
;28   |  X X      X X  |
;29   |  X X  XX  X X  |
;2A   |  X X X  X X X  |
;2B   |  X X XXXX X X  |
;2C   |  X XX    XX X  |
;2D   |  X XX XX XX X  |
;2E   |  X XXX  XXX X  |
;2F   |  X XXXXXXXX X  |
;30   |  XX        XX  |
;31   |  XX   XX   XX  |
;32   |  XX  X  X  XX  |
;33   |  XX  XXXX  XX  |
;34   |  XX X    X XX  |
;35   |  XX X XX X XX  |
;36   |  XX XX  XX XX  |
;37   |  XX XXXXXX XX  |
;38   |  XXX      XXX  |
;39   |  XXX  XX  XXX  |
;3A   |  XXX X  X XXX  |
;3B   |  XXX XXXX XXX  |
;3C   |  XXXX    XXXX  |
;3D   |  XXXX XX XXXX  |
;3E   |  XXXXX  XXXXX  |
;3F   |  XXXXXXXXXXXX  |
;40   | X            X |
;41   | X     XX     X |
;42   | X    X  X    X |
;43   | X    XXXX    X |
;44   | X   X    X   X |
;45   | X   X XX X   X |
;46   | X   XX  XX   X |
;47   | X   XXXXXX   X |
;48   | X  X      X  X |
;49   | X  X  XX  X  X |
;4A   | X  X X  X X  X |
;4B   | X  X XXXX X  X |
;4C   | X  XX    XX  X |
;4D   | X  XX XX XX  X |
;4E   | X  XXX  XXX  X |
;4F   | X  XXXXXXXX  X |
;50   | X X        X X |
;51   | X X   XX   X X |
;52   | X X  X  X  X X |
;53   | X X  XXXX  X X |
;54   | X X X    X X X |
;55   | X X X XX X X X |
;56   | X X XX  XX X X |
;57   | X X XXXXXX X X |
;58   | X XX      XX X |
;59   | X XX  XX  XX X |
;5A   | X XX X  X XX X |
;5B   | X XX XXXX XX X |
;5C   | X XXX    XXX X |
;5D   | X XXX XX XXX X |
;5E   | X XXXX  XXXX X |
;5F   | X XXXXXXXXXX X |
;60   | XX          XX |
;61   | XX    XX    XX |
;62   | XX   X  X   XX |
;63   | XX   XXXX   XX |
;64   | XX  X    X  XX |
;65   | XX  X XX X  XX |
;66   | XX  XX  XX  XX |
;67   | XX  XXXXXX  XX |
;68   | XX X      X XX |
;69   | XX X  XX  X XX |
;6A   | XX X X  X X XX |
;6B   | XX X XXXX X XX |
;6C   | XX XX    XX XX |
;6D   | XX XX XX XX XX |
;6E   | XX XXX  XXX XX |
;6F   | XX XXXXXXXX XX |
;70   | XXX        XXX |
;71   | XXX   XX   XXX |
;72   | XXX  X  X  XXX |
;73   | XXX  XXXX  XXX |
;74   | XXX X    X XXX |
;75   | XXX X XX X XXX |
;76   | XXX XX  XX XXX |
;77   | XXX XXXXXX XXX |
;78   | XXXX      XXXX |
;79   | XXXX  XX  XXXX |
;7A   | XXXX X  X XXXX |
;7B   | XXXX XXXX XXXX |
;7C   | XXXXX    XXXXX |
;7D   | XXXXX XX XXXXX |
;7E   | XXXXXX  XXXXXX |
;7F   | XXXXXXXXXXXXXX |
;80   |X              X|
;81   |X      XX      X|
;82   |X     X  X     X|
;83   |X     XXXX     X|
;84   |X    X    X    X|
;85   |X    X XX X    X|
;86   |X    XX  XX    X|
;87   |X    XXXXXX    X|
;88   |X   X      X   X|
;89   |X   X  XX  X   X|
;8A   |X   X X  X X   X|
;8B   |X   X XXXX X   X|
;8C   |X   XX    XX   X|
;8D   |X   XX XX XX   X|
;8E   |X   XXX  XXX   X|
;8F   |X   XXXXXXXX   X|
;90   |X  X        X  X|
;91   |X  X   XX   X  X|
;92   |X  X  X  X  X  X|
;93   |X  X  XXXX  X  X|
;94   |X  X X    X X  X|
;95   |X  X X XX X X  X|
;96   |X  X XX  XX X  X|
;97   |X  X XXXXXX X  X|
;98   |X  XX      XX  X|
;99   |X  XX  XX  XX  X|
;9A   |X  XX X  X XX  X|
;9B   |X  XX XXXX XX  X|
;9C   |X  XXX    XXX  X|
;9D   |X  XXX XX XXX  X|
;9E   |X  XXXX  XXXX  X|
;9F   |X  XXXXXXXXXX  X|
;A0   |X X          X X|
;A1   |X X    XX    X X|
;A2   |X X   X  X   X X|
;A3   |X X   XXXX   X X|
;A4   |X X  X    X  X X|
;A5   |X X  X XX X  X X|
;A6   |X X  XX  XX  X X|
;A7   |X X  XXXXXX  X X|
;A8   |X X X      X X X|
;A9   |X X X  XX  X X X|
;AA   |X X X X  X X X X|
;AB   |X X X XXXX X X X|
;AC   |X X XX    XX X X|
;AD   |X X XX XX XX X X|
;AE   |X X XXX  XXX X X|
;AF   |X X XXXXXXXX X X|
;B0   |X XX        XX X|
;B1   |X XX   XX   XX X|
;B2   |X XX  X  X  XX X|
;B3   |X XX  XXXX  XX X|
;B4   |X XX X    X XX X|
;B5   |X XX X XX X XX X|
;B6   |X XX XX  XX XX X|
;B7   |X XX XXXXXX XX X|
;B8   |X XXX      XXX X|
;B9   |X XXX  XX  XXX X|
;BA   |X XXX X  X XXX X|
;BB   |X XXX XXXX XXX X|
;BC   |X XXXX    XXXX X|
;BD   |X XXXX XX XXXX X|
;BE   |X XXXXX  XXXXX X|
;BF   |X XXXXXXXXXXXX X|
;C0   |XX            XX|
;C1   |XX     XX     XX|
;C2   |XX    X  X    XX|
;C3   |XX    XXXX    XX|
;C4   |XX   X    X   XX|
;C5   |XX   X XX X   XX|
;C6   |XX   XX  XX   XX|
;C7   |XX   XXXXXX   XX|
;C8   |XX  X      X  XX|
;C9   |XX  X  XX  X  XX|
;CA   |XX  X X  X X  XX|
;CB   |XX  X XXXX X  XX|
;CC   |XX  XX    XX  XX|
;CD   |XX  XX XX XX  XX|
;CE   |XX  XXX  XXX  XX|
;CF   |XX  XXXXXXXX  XX|
;D0   |XX X        X XX|
;D1   |XX X   XX   X XX|
;D2   |XX X  X  X  X XX|
;D3   |XX X  XXXX  X XX|
;D4   |XX X X    X X XX|
;D5   |XX X X XX X X XX|
;D6   |XX X XX  XX X XX|
;D7   |XX X XXXXXX X XX|
;D8   |XX XX      XX XX|
;D9   |XX XX  XX  XX XX|
;DA   |XX XX X  X XX XX|
;DB   |XX XX XXXX XX XX|
;DC   |XX XXX    XXX XX|
;DD   |XX XXX XX XXX XX|
;DE   |XX XXXX  XXXX XX|
;DF   |XX XXXXXXXXXX XX|
;E0   |XXX          XXX|
;E1   |XXX    XX    XXX|
;E2   |XXX   X  X   XXX|
;E3   |XXX   XXXX   XXX|
;E4   |XXX  X    X  XXX|
;E5   |XXX  X XX X  XXX|
;E6   |XXX  XX  XX  XXX|
;E7   |XXX  XXXXXX  XXX|
;E8   |XXX X      X XXX|
;E9   |XXX X  XX  X XXX|
;EA   |XXX X X  X X XXX|
;EB   |XXX X XXXX X XXX|
;EC   |XXX XX    XX XXX|
;ED   |XXX XX XX XX XXX|
;EE   |XXX XXX  XXX XXX|
;EF   |XXX XXXXXXXX XXX|
;F0   |XXXX        XXXX|
;F1   |XXXX   XX   XXXX|
;F2   |XXXX  X  X  XXXX|
;F3   |XXXX  XXXX  XXXX|
;F4   |XXXX X    X XXXX|
;F5   |XXXX X XX X XXXX|
;F6   |XXXX XX  XX XXXX|
;F7   |XXXX XXXXXX XXXX|
;F8   |XXXXX      XXXXX|
;F9   |XXXXX  XX  XXXXX|
;FA   |XXXXX X  X XXXXX|
;FB   |XXXXX XXXX XXXXX|
;FC   |XXXXXX    XXXXXX|
;FD   |XXXXXX XX XXXXXX|
;FE   |XXXXXXX  XXXXXXX|
;FF   |XXXXXXXXXXXXXXXX|
