2022-12-05 04:13:27 +00:00
.include "consts.inc"
.include "header.inc"
.include "actor.inc"
.include "reset.inc"
.include "utils.inc"
2022-12-09 04:34:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Variables declared in RAM zero-page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-05 04:13:27 +00:00
.segment "ZEROPAGE"
2023-01-25 04:18:03 +00:00
Score: .res 4 ; 4 bytes for 1s, 10s, 100s, 1000s, For score
2023-01-24 05:39:34 +00:00
Collision: .res 1 ; 0 or 1, if 0 no collision, if 1, collisison
2022-12-09 04:34:27 +00:00
Buttons: .res 1 ; Pressed buttons (A|B|Sel|Start|Up|Dwn|Lft|Rgt)
PrevButtons: .res 1 ; Stores the previous buttons from the last frame
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
XPos: .res 1 ; Player X 16-bit position (8.8 fixed-point): hi+lo/256px
YPos: .res 1 ; Player Y 16-bit position (8.8 fixed-point): hi+lo/256px
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
XVel: .res 1 ; Player X (signed) velocity (in pixels per 256 frames)
YVel: .res 1 ; Player Y (signed) velocity (in pixels per 256 frames)
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
PrevSubmarine: .res 1 ; Stores the value in seconds that the last submarine was added
PrevAirplane: .res 1 ; Stores the value in seconds that the last airplane was added
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
Frame: .res 1 ; Counts frames (0 to 255 and repeats)
IsDrawComplete: .res 1 ; Flag to indicate when VBlank is done drawing
Clock60: .res 1 ; Counter that increments per second (60 frames)
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
BgPtr: .res 2 ; Pointer to background address - 16bits (lo,hi)
SprPtr: .res 2 ; Pointer to the sprite address - 16bits (lo,hi)
2023-01-25 04:18:03 +00:00
BufPtr: .res 2 ; Pointer to the Buffer Address - 16bite (lo,hi)
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
XScroll: .res 1 ; Store the horizontal scroll position
CurrNametable: .res 1 ; Store the current starting nametable (0 or 1)
Column: .res 1 ; Stores the column (of tiles) we are in the level
NewColAddr: .res 2 ; The destination address of the new column in PPU
SourceAddr: .res 2 ; The source address in ROM of the new column tiles
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
ParamType: .res 1 ; Used as parameter to subroutine
ParamXPos: .res 1 ; Used as parameter to subroutine
ParamYPos: .res 1 ; Used as parameter to subroutine
ParamTileNum: .res 1 ; Used as parameter to subroutine
ParamNumTiles: .res 1 ; Used as parameter to subroutine
ParamAttribs: .res 1 ; Used as parameter to subroutine
2023-01-24 05:39:34 +00:00
ParamRectX1: .res 1 ; Used as parameter to subroutine
ParamRectY1: .res 1 ; Used as parameter to subroutine
ParamRectX2: .res 1 ; Used as parameter to subroutine
ParamRectY2: .res 1 ; Used as parameter to subroutine
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent to the OAM
2022-12-05 04:13:27 +00:00
2023-01-24 04:09:19 +00:00
Seed: .res 2 ; Initialize the 16-bit seed to any value except 0
2023-01-25 04:18:03 +00:00
2022-12-05 04:13:27 +00:00
ActorsArray: .res MAX_ACTORS * .sizeof ( Actor )
2022-12-09 04:52:02 +00:00
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PRG-ROM code located at $8000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CODE"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Routine to read controller state and store it inside "Buttons" in RAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc ReadControllers
2022-12-09 04:34:27 +00:00
lda # 1 ; A = 1
sta Buttons ; Buttons = 1
sta JOYPAD1 ; Set Latch=1 to begin 'Input'/collection mode
lsr ; A = 0
sta JOYPAD1 ; Set Latch=0 to begin 'Output' mode
2022-12-05 04:13:27 +00:00
LoopButtons:
2022-12-09 04:34:27 +00:00
lda JOYPAD1 ; This reads a bit from the controller data line and inverts its value,
; And also sends a signal to the Clock line to shift the bits
lsr ; We shift-right to place that 1-bit we just read into the Carry flag
rol Buttons ; Rotate bits left, placing the Carry value into the 1st bit of 'Buttons' in RAM
bcc LoopButtons ; Loop until Carry is set (from that initial 1 we loaded inside Buttons)
2022-12-05 04:13:27 +00:00
rts
.endproc
2023-01-25 04:18:03 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Increment the score, simulating BCD mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc IncrementScore ; LittleEndian
Increment1stDigit:
lda Score + 0
clc
adc # 1
sta Score + 0
cmp # $ A
bne DoneIncrementing
Increment10sDigit:
lda # 0
sta Score + 0
lda Score + 1
clc
adc # 1
sta Score + 1
cmp # $ A
bne DoneIncrementing
Increment100sDigit:
lda # 0
sta Score + 1
lda Score + 2
clc
adc # 1
sta Score + 2
cmp # $ A
bne DoneIncrementing
Increment1000sDigit:
lda # 0
sta Score + 2
lda Score + 3
clc
adc # 1
sta Score + 3
cmp # $ A
bne DoneIncrementing
DoneIncrementing:
rts
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Draw the score in ther nametable/background using buffering
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Buffer format starting at Ram Address $7000
;; 03 20 52 00 00 02 01 20 78 00 00
;; | \___/ \______/ | \___/ | |
;; | | | | | | |
;; | | | | | | Length=0 (End of buffering)
;; | | | | | byte to copy
;; | | | | PPU Address $2078
;; | | | Length=1
;; | | bytes to copy
;; | PPU address $2052
;; Length =
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc DrawScore
lda # $ 70
sta BufPtr + 1
lda # $ 00
sta BufPtr + 0
ldy # 0
lda # 3 ; send 3 bytes
sta ( BufPtr ), y
iny
lda # $ 20
sta ( BufPtr ), y ; hi byte
iny
lda # $ 52
sta ( BufPtr ), y ; lo byte
iny
;; Send the 3 digits of the score from MSB to LSB
;; Offset by #$60 to point to numbers
lda Score + 2 ; 100s
clc
adc # $ 60
sta ( BufPtr ), y
iny
lda Score + 1 ; 10s
clc
adc # $ 60
sta ( BufPtr ), y
iny
lda Score + 0 ; 1s
clc
adc # $ 60
sta ( BufPtr ), y
iny
lda # 0
sta ( BufPtr ), y ; Length=0, to signal the end of the buffer
iny
rts
.endproc
2023-01-24 04:09:19 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Returns a random 8-bit number inside A (0-255), clobbers Y (0).
;; Requires a 2-byte value on the Zero page called "Seed"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a 16-bit Galois Linerar Feedback Shift register with polynomial $0039
;; The sequence of numbers it generates will repeat after 65535 calls.
;; Execution time is an average of 125 cycles (excluding jsr and rts)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc GetRandomNumber
ldy # 8 ; Loop counter (generates 8 bits)
lda Seed + 0
: asl ; Shift the register
rol Seed + 1
bcc : +
eor # $ 39 ; Apply XOR feedback when a 1 bit is shifted out
:
dey
bne : --
sta Seed + 0 ; Saves the value in A into the Seed
cmp # 0 ; Set flags
rts
.endproc
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to load all 32 color palette values from ROM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc LoadPalette
PPU_SETADDR $ 3 F00
ldy # 0 ; Y = 0
: lda PaletteData , y ; Lookup byte in ROM
sta PPU_DATA ; Set value to send to PPU_DATA
iny ; Y++
cpy # 32 ; Is Y equal to 32?
bne : - ; Not yet, keep looping
rts ; Return from subroutine
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 04:34:27 +00:00
;; Routine to draw a new column of tiles off-screen every 8 pixels
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc DrawNewColumn
2022-12-09 04:34:27 +00:00
lda XScroll ; We'll set the NewColAddr lo-byte and hi-byte
2022-12-05 04:13:27 +00:00
lsr
lsr
2022-12-09 04:34:27 +00:00
lsr ; Shift right 3 times to divide XScroll by 8
sta NewColAddr ; Set the lo-byte of the column address
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
lda CurrNametable ; The hi-byte comes from the nametable
eor # 1 ; Invert the low bit (0 or 1)
2022-12-05 04:13:27 +00:00
asl
2022-12-09 04:34:27 +00:00
asl ; Multiply by 4 (A is $00 or $04)
2022-12-05 04:13:27 +00:00
clc
2022-12-09 04:34:27 +00:00
adc # $ 20 ; Add $20 (A is $20 or $24) for nametabe 0 or 1
sta NewColAddr + 1 ; Set the hi-byte of the column address ($20xx or $24xx)
lda Column ; Multiply (col * 32) to compute the data offset
asl
asl
asl
asl
asl
sta SourceAddr ; Store lo-byte (--XX) of column source address
2022-12-05 04:13:27 +00:00
lda Column
2022-12-09 04:34:27 +00:00
lsr
lsr
lsr ; Divide current Column by 8 (using 3 shift rights)
sta SourceAddr + 1 ; Store hi-byte (XX--) of column source addres
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
; Here we'll add the offset the column source address with the address of where the BackgroundData
lda SourceAddr ; Lo-byte of the column data start + offset = address to load column data from
2022-12-05 04:13:27 +00:00
clc
2022-12-09 04:34:27 +00:00
adc # < BackgroundData ; Add the lo-byte
sta SourceAddr ; Save the result of the offset back to the source address lo-byte
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
lda SourceAddr + 1 ; Hi-byte of the column source address
adc # > BackgroundData ; Add the hi-byte
sta SourceAddr + 1 ; Add the result of the offset back to the source address hi-byte
2022-12-05 04:13:27 +00:00
DrawColumn:
2022-12-09 04:34:27 +00:00
lda # % 00000100
sta PPU_CTRL ; Tell the PPU that the increments will be +32 mode
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
lda PPU_STATUS ; Hit PPU_STATUS to reset hi/lo address latch
lda NewColAddr + 1
sta PPU_ADDR ; Set the hi-byte of the new column start address
lda NewColAddr
sta PPU_ADDR ; Set the lo-byte of the new column start address
ldx # 30 ; We'll loop 30 times (=30 rows)
ldy # 0
DrawColumnLoop:
lda ( SourceAddr ), y ; Copy from the address of the column source + y offset
sta PPU_DATA
iny ; Y++
dex ; X--
bne DrawColumnLoop ; Loop 30 times to draw all 30 rows of this column
2022-12-05 04:13:27 +00:00
rts
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 04:34:27 +00:00
;; Routine to draw attributes off-screen every 32 pixels
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc DrawNewAttribs
2022-12-09 04:34:27 +00:00
lda CurrNametable
eor # 1 ; Invert low bit (0 or 1)
asl ; Multiuply by 2, ($00 or $02)
asl ; Multiply by 2 again ($00 or $04)
clc
adc # $ 23 ; Add high byte of attribute base address ($23-- or $27--)
sta NewColAddr + 1 ; The hi-byte now has address = $23 or $27 for nametable 0 or 1
lda XScroll
lsr
lsr
lsr
lsr
lsr ; Divide by 32 (shift right 5 times)
clc
adc # $ C0
sta NewColAddr ; The lo-byte contains (attribute base + XScroll/32)
lda Column ; (Column/4) * 8, since each row of attribute data in ROM is 8 bytes
and # % 11111100 ; Mask the lowest two bits to get the closest lowest multiple of 4
asl ; One shift left equivelant to a multiplication by 2
sta SourceAddr ; Stores the lo-byte of the source attribute address offset (in ROM)
lda Column ; Proceed to compute the hi-byte of the source address offset in ROM
lsr ; /2
lsr ; /4
lsr ; /8
lsr ; /16
lsr ; /32
lsr ; /64
lsr ; /128, shift right 7 times to divide by 128
sta SourceAddr + 1 ; Stores the hi-byte of the Source address offset
lda SourceAddr
clc
adc # < AttributeData ; Add the lo-byte of the base address where AttributeData is in ROM
sta SourceAddr ; Stores the result of the add back into the lo-byte of the SourceAddr
lda SourceAddr + 1
adc # > AttributeData ; Add the hi-byte of the base address where AttributeData is in ROM
sta SourceAddr + 1 ; Stores the result of the add back into the hi-byte of the SourceAddr
DrawAttribute:
bit PPU_STATUS ; Hit PPU_STATUS to reset the high/low address latch
ldy # 0 ; Y = 0
DrawAttribLoop:
lda NewColAddr + 1
sta PPU_ADDR ; Write the hi-byte of attribute PPU destination address
2022-12-05 04:13:27 +00:00
lda NewColAddr
2022-12-09 04:34:27 +00:00
sta PPU_ADDR ; Write the lo-byte of attribute PPU destination address
lda ( SourceAddr ), y ; Fetch attribute byte from ROM
sta PPU_DATA ; Stores new attribute data into the PPU memory
iny ; Y++
cpy # 8
beq : + ; Loop 8 times (to copy 8 attribute bytes)
lda NewColAddr
clc
adc # 8
sta NewColAddr ; Next attribute will be at (NewColAddr + 8)
jmp DrawAttribLoop
:
rts
2022-12-05 04:13:27 +00:00
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to add new actor to the array in the first empty slot found
2022-12-09 04:34:27 +00:00
;; Params = ParamType, ParamXPos, ParamYPos
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc AddNewActor
2022-12-09 04:34:27 +00:00
ldx # 0 ; X = 0
ArrayLoop:
cpx # MAX_ACTORS * .sizeof ( Actor ) ; Reached maximum number of actors allowed in the array?
beq EndRoutine ; Then we skip and don't add a new actor
lda ActorsArray + Actor :: Type , x
cmp # ActorType :: NULL ; If the actor type of this array position is NULL
beq AddNewActorToArray ; Then: we found an empty slot, proceed to add actor to position [x]
NextActor:
txa
clc
adc # .sizeof ( Actor ) ; Otherwise, we offset to the check the next actor in the array
tax ; X += sizeof(Actor)
jmp ArrayLoop
AddNewActorToArray: ; Here we add a new actor at index [x] of the array
lda ParamType ; Fetch parameter "actor type" from RAM
sta ActorsArray + Actor :: Type , x
lda ParamXPos ; Fetch parameter "actor position X" from RAM
sta ActorsArray + Actor :: XPos , x
lda ParamYPos ; Fetch parameter "actor position Y" from RAM
sta ActorsArray + Actor :: YPos , x
EndRoutine:
rts
2022-12-05 04:13:27 +00:00
.endproc
2022-12-09 04:34:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to spawn actors when certain conditions are met
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 03:34:44 +00:00
.proc Sp awnActors
2022-12-09 04:34:27 +00:00
SpawnSubmarine:
lda Cl ock60 ; Submarines are added in intervals of 3 seconds
sec
sbc PrevSubmarine
cmp # 3 ; Only add a new submarine if the difference in time from the previous one is equal to 3
bne : +
lda # ActorType :: SUBMARINE
sta ParamType ; Load parameter for the actor type
lda # 223
sta ParamXPos ; Load parameter for actor position X
2023-01-24 04:09:19 +00:00
jsr GetRandomNumber ; load random number into A
lsr ; Divide by 8 (right shift thrice)
lsr
lsr
clc
adc # 180 ; add 180 to lower it
2022-12-09 04:34:27 +00:00
sta ParamYPos
jsr AddNewActor ; Call the subroutine to add the new missile actor
lda Cl ock60
sta PrevSubmarine ; Save the current Clock60 time as the submarine last spawn time
2022-12-09 03:34:44 +00:00
:
2022-12-09 04:34:27 +00:00
SpawnAirplane:
lda Cl ock60 ; Submarines are added in intervals of 3 seconds
sec
sbc PrevAirplane
cmp # 2 ; Only add a new airplane if the difference in time from the previous one is equal to 2
bne : +
lda # ActorType :: AIRPLANE
sta ParamType ; Load parameter for the actor type
lda # 235
sta ParamXPos ; Load parameter for actor position X
2023-01-24 04:09:19 +00:00
jsr GetRandomNumber ; load random number into A
lsr ; Divide by 4 (right shift twice)
lsr
clc
adc # 35 ; add 35 to lower it, so its not in the status bar
;Adjust the random Y to be between top and bottom
2022-12-09 04:34:27 +00:00
sta ParamYPos
jsr AddNewActor ; Call the subroutine to add the new missile actor
lda Cl ock60
sta PrevAirplane ; Save the current Clock60 time as the submarine last spawn time
:
2022-12-09 03:34:44 +00:00
rts
.endproc
2023-01-24 05:39:34 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to check collisions
;; PARAMS: ParamXPos, ParamYPos (x and y of missile)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc Ch eckEnemyCollision
txa
pha ; Push and save the X register in the stack
ldx # 0
stx Collision ; Collision = 0
EnemiesCollisionLoop:
cpx # MAX_ACTORS * .sizeof ( Actor )
beq FinishCollisionCheck
lda ActorsArray + Actor :: Type , x
cmp # ActorType :: AIRPLANE
bne NextEnemy ; If not an airplane - skip to next enemy type
2023-01-25 04:43:58 +00:00
lda ActorsArray + Actor :: Type , x ; Load the type of the actor we are looping
cmp # ActorType :: AIRPLANE
bne NextEnemy ; If it's NOT Airplane, bypass this enemy and move check the next one
2023-01-24 05:39:34 +00:00
2023-01-25 04:43:58 +00:00
;; LOAD BOUNDING BOX X1, Y1, X2, and Y2
lda ActorsArray + Actor :: XPos , x ; Bounding Box X1
sta ParamRectX1
lda ActorsArray + Actor :: YPos , x ; Bouding Box Y1
sta ParamRectY1
2023-01-24 05:39:34 +00:00
2023-01-25 04:43:58 +00:00
lda ActorsArray + Actor :: XPos , x
clc
adc # 22 ; Get right value of the airplane bounding box by adding 22 pixels to the right
sta ParamRectX2 ; Bounding Box X2
lda ActorsArray + Actor :: YPos , x
clc
adc # 8 ; Get the bottom of the airplane bounding box by adding 8
sta ParamRectY2 ; Bouding Box Y2
2023-01-24 05:39:34 +00:00
jsr IsPointInsideBoundingBox
lda Collision
beq NextEnemy
2023-01-25 04:18:03 +00:00
lda # ActorType :: NULL ; Set actor to null - TODO: maybe make an explosion
2023-01-24 05:39:34 +00:00
sta ActorsArray + Actor :: Type , x
jmp FinishCollisionCheck
NextEnemy:
txa
clc
adc # .sizeof ( Actor )
tax
jmp EnemiesCollisionLoop
FinishCollisionCheck:
pla
tax
rts
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to check if a point is inside a bounding box.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Params:
;; (ParamXPos, ParamYPos) - coords to be tested
;; (ParamRectX1,ParamRectY1,ParamRectX2,ParamRectY2) Are rectangle coords)
;; Output:
;; Collision flag is either 1 or 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc IsPointInsideBoundingBox
lda ParamXPos
cmp ParamRectX1
bcc PointIsOutside
lda ParamYPos
cmp ParamRectY1
bcc PointIsOutside
lda ParamXPos
cmp ParamRectX2
bcs PointIsOutside
lda ParamYPos
cmp ParamRectY2
bcs PointIsOutside
PointIsInside:
lda # 1
sta Collision
jmp EndCollisionCheck
PointIsOutside:
lda # 0
sta Collision
EndCollisionCheck:
rts
.endproc
2022-12-09 04:34:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to loop all actors and update them (position, velocity, etc.)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 03:34:44 +00:00
.proc UpdateActors
2022-12-09 04:34:27 +00:00
ldx # 0
2022-12-09 03:34:44 +00:00
ActorsLoop:
2022-12-09 04:34:27 +00:00
lda ActorsArray + Actor :: Type , x
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: MISSILE
bne : +
lda ActorsArray + Actor :: YPos , x
sec
sbc # 1 ; Decrement Y position of missiles by 1
sta ActorsArray + Actor :: YPos , x
bcs SkipMissile
lda # ActorType :: NULL
sta ActorsArray + Actor :: Type , x ; Remove the missile from the array
SkipMissile:
2023-01-24 05:39:34 +00:00
CheckCollision:
lda ActorsArray + Actor :: XPos , x
clc
adc # 3
sta ParamXPos ; Missile position to be checked X += 3
2023-01-25 04:43:58 +00:00
lda ActorsArray + Actor :: YPos , x
2023-01-24 05:39:34 +00:00
clc
adc # 1
sta ParamYPos ; Missile position to be checked Y += 1
jsr Ch eckEnemyCollision ; Perform collision check between the missile and other enemy actor
lda Collision
beq NoCollisionFound
2023-01-25 04:18:03 +00:00
lda # ActorType :: NULL ; Delete missile Actor
2023-01-24 05:39:34 +00:00
sta ActorsArray + Actor :: Type , x
2023-01-25 04:43:58 +00:00
2023-01-25 04:18:03 +00:00
jsr IncrementScore
2023-01-25 04:43:58 +00:00
jsr DrawScore
2023-01-24 05:39:34 +00:00
NoCollisionFound:
2022-12-09 04:34:27 +00:00
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: SUBMARINE
bne : +
lda ActorsArray + Actor :: XPos , x
sec
sbc # 1 ; Decrement Y position of submarine by 1
sta ActorsArray + Actor :: XPos , x
bcs SkipSubmarine
lda # ActorType :: NULL
sta ActorsArray + Actor :: Type , x ; Remove the submarine from the array
SkipSubmarine:
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: AIRPLANE
bne : +
lda ActorsArray + Actor :: XPos , x
sec
sbc # 1 ; Decrement Y position of submarine by 1
sta ActorsArray + Actor :: XPos , x
bcs SkipAirplane
lda # ActorType :: NULL
sta ActorsArray + Actor :: Type , x ; Remove the submarine from the array
SkipAirplane:
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
NextActor:
txa
clc
adc # .sizeof ( Actor )
tax
cmp # MAX_ACTORS * .sizeof ( Actor )
bne ActorsLoop
rts
.endproc
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to loop all actors and send their tiles to the OAM-RAM at $200
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 03:34:44 +00:00
.proc RenderActors
2022-12-09 04:34:27 +00:00
lda # $ 02
sta Sp rPtr + 1
lda # $ 00
sta Sp rPtr ; Point SprPtr to $0200
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
ldy # 0 ; Count how many tiles we are sending
ldx # 0 ; Counts how many actors we are looping
2022-12-09 03:34:44 +00:00
ActorsLoop:
2022-12-09 04:34:27 +00:00
lda ActorsArray + Actor :: Type , x
cmp # ActorType :: SP RITE0
bne : +
lda ActorsArray + Actor :: XPos , x
sta ParamXPos
lda ActorsArray + Actor :: YPos , x
sta ParamYPos
lda # $ 70
sta ParamTileNum
lda # % 00100000
sta ParamAttribs
lda # 1
sta ParamNumTiles
jsr DrawSprite ; Call routine to draw 1 SPRITE0 tile to the OAM
jmp NextActor
:
cmp # ActorType :: PLAYER
bne : +
lda ActorsArray + Actor :: XPos , x
sta ParamXPos
lda ActorsArray + Actor :: YPos , x
sta ParamYPos
lda # $ 60
sta ParamTileNum
lda # % 00000000
sta ParamAttribs
lda # 4
sta ParamNumTiles
jsr DrawSprite ; Call routine to draw 4 PLAYER tiles to the OAM
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: SUBMARINE
bne : +
lda ActorsArray + Actor :: XPos , x
sta ParamXPos
lda ActorsArray + Actor :: YPos , x
sta ParamYPos
lda # $ 04
sta ParamTileNum
lda # % 00100000
sta ParamAttribs
lda # 4
sta ParamNumTiles
jsr DrawSprite ; Call routine to draw 4 SUBMARINE tile to the OAM
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: AIRPLANE
bne : +
lda ActorsArray + Actor :: XPos , x
sta ParamXPos
lda ActorsArray + Actor :: YPos , x
sta ParamYPos
lda # $ 10
sta ParamTileNum
lda # % 00000011
sta ParamAttribs
lda # 3
sta ParamNumTiles
jsr DrawSprite ; Call routine to draw 4 SUBMARINE tile to the OAM
jmp NextActor
:
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
cmp # ActorType :: MISSILE
bne : +
lda ActorsArray + Actor :: XPos , x
sta ParamXPos
lda ActorsArray + Actor :: YPos , x
sta ParamYPos
lda # $ 50
sta ParamTileNum
lda # % 00000001
sta ParamAttribs
lda # 1
sta ParamNumTiles
jsr DrawSprite ; Call routine to draw 1 MISSILE tile to the OAM
jmp NextActor
:
NextActor:
txa
clc
adc # .sizeof ( Actor )
tax
cmp # MAX_ACTORS * .sizeof ( Actor )
beq : +
jmp ActorsLoop ; Use absolute jump to avoid branch limit of [-128..127]
2022-12-09 03:34:44 +00:00
:
2022-12-09 04:34:27 +00:00
tya
pha ; Save the Y register to the stack
LoopTrailingTiles:
cpy PrevOAMCount
bcs : +
lda # $ FF
sta ( Sp rPtr ), y ; Set Y position to $FF (to hide tile)
iny
sta ( Sp rPtr ), y ; Set tile number as $FF
iny
sta ( Sp rPtr ), y ; Set attribs as $FF
iny
sta ( Sp rPtr ), y ; Set X position to $FF (to hide tile)
iny
jmp LoopTrailingTiles
:
pla ; Save the previous value of Y into PrevOAMCount
sta PrevOAMCount ; This is the total number of bytes that we just sent to the OAM
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
rts
2022-12-09 03:34:44 +00:00
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-12-09 04:34:27 +00:00
;; Routine to loop "NumTiles" times, sending bytes to the OAM-RAM.
2022-12-09 03:34:44 +00:00
;; Params = ParamXPos, ParamYPos, ParamTileNum, ParamAttribs, ParamNumTiles
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc DrawSprite
2022-12-09 04:34:27 +00:00
txa
pha ; Save the value of the X register before anything
2022-12-09 03:34:44 +00:00
ldx # 0
TileLoop:
2022-12-09 04:34:27 +00:00
lda ParamYPos ; Send Y position to the OAM
sta ( Sp rPtr ), y
iny
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
lda ParamTileNum ; Send the Tile # to the OAM
sta ( Sp rPtr ), y
inc ParamTileNum ; ParamTileNum++
iny
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
lda ParamAttribs ; Send the attributes to the OAM
sta ( Sp rPtr ), y
iny
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
lda ParamXPos ; Send X position to the OAM
sta ( Sp rPtr ), y
clc
adc # 8
sta ParamXPos ; ParamXPos += 8
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
iny
2022-12-09 03:34:44 +00:00
2022-12-09 04:34:27 +00:00
inx ; X++
cpx ParamNumTiles ; Loop until X == NumTiles
bne TileLoop
2022-12-09 03:34:44 +00:00
pla
2022-12-09 04:34:27 +00:00
tax ; Restore the previous value of X register
2022-12-09 03:34:44 +00:00
rts
.endproc
2022-12-09 04:52:02 +00:00
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Reset handler (called when the NES resets or powers on)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Reset:
INIT_NES ; Macro to initialize the NES to a known state
InitVariables:
lda # 0
sta Frame ; Frame = 0
sta Cl ock60 ; Clock60 = 0
sta XScroll ; XScroll = 0
2022-12-09 04:34:27 +00:00
sta CurrNametable ; CurrNametable = 0
sta Column ; Column = 0
2022-12-05 04:13:27 +00:00
lda # 113
sta XPos
lda # 165
sta YPos
2023-01-24 04:09:19 +00:00
lda # $ 10
sta Seed + 1
sta Seed + 0 ; Initialize the seed with any value not zero
2022-12-05 04:13:27 +00:00
Main:
2022-12-09 04:34:27 +00:00
jsr LoadPalette ; Call LoadPalette subroutine to load 32 colors into our palette
2022-12-05 04:13:27 +00:00
AddSprite0:
lda # ActorType :: SP RITE0
sta ParamType
lda # 0
sta ParamXPos
lda # 27
sta ParamYPos
2022-12-09 04:34:27 +00:00
jsr AddNewActor ; Add new actor to array
2022-12-05 04:13:27 +00:00
AddPlayer:
lda # ActorType :: PLAYER
sta ParamType
lda XPos
sta ParamXPos
lda YPos
sta ParamYPos
2022-12-09 04:34:27 +00:00
jsr AddNewActor ; Add new actor to array
2022-12-05 04:13:27 +00:00
InitBackgroundTiles:
lda # 1
2022-12-09 04:34:27 +00:00
sta CurrNametable ; CurrNametable = 1
2022-12-05 04:13:27 +00:00
lda # 0
2022-12-09 04:34:27 +00:00
sta XScroll ; XScroll = 0
sta Column ; Column = 0
2022-12-05 04:13:27 +00:00
InitBackgroundLoop:
2022-12-09 04:34:27 +00:00
jsr DrawNewColumn ; Draw all rows of new column (from top to bottom)
2022-12-05 04:13:27 +00:00
lda XScroll
clc
adc # 8
2022-12-09 04:34:27 +00:00
sta XScroll ; XScroll += 8
inc Column ; Column++
2022-12-05 04:13:27 +00:00
lda Column
cmp # 32
2022-12-09 04:34:27 +00:00
bne InitBackgroundLoop ; Repeat all 32 columns of the first nametable
2022-12-05 04:13:27 +00:00
lda # 0
2022-12-09 04:34:27 +00:00
sta CurrNametable ; CurrNametable = 0
2022-12-05 04:13:27 +00:00
lda # 1
2022-12-09 04:34:27 +00:00
sta XScroll ; Scroll = 1
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
jsr DrawNewColumn ; Draw first column of the second nametable
inc Column ; Column++
2022-12-05 04:13:27 +00:00
lda # % 00000000
2022-12-09 04:34:27 +00:00
sta PPU_CTRL ; Set PPU increment to +1 mode
2022-12-05 04:13:27 +00:00
InitAttribs:
lda # 1
2022-12-09 04:34:27 +00:00
sta CurrNametable
2022-12-05 04:13:27 +00:00
lda # 0
sta XScroll
sta Column
InitAttribsLoop:
2022-12-09 04:34:27 +00:00
jsr DrawNewAttribs ; Draw attributes in the correct place of the first nametable
2022-12-05 04:13:27 +00:00
lda XScroll
clc
adc # 32
2022-12-09 04:34:27 +00:00
sta XScroll ; XScroll += 32
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
lda Column ; Repeat for all elements of the first nametable
2022-12-05 04:13:27 +00:00
clc
adc # 4
2022-12-09 04:34:27 +00:00
sta Column ; Column += 4
2022-12-05 04:13:27 +00:00
cmp # 32
2022-12-09 04:34:27 +00:00
bne InitAttribsLoop ; Loop until we reach Column 32
2022-12-05 04:13:27 +00:00
lda # 0
2022-12-09 04:34:27 +00:00
sta CurrNametable
2022-12-05 04:13:27 +00:00
lda # 1
2022-12-09 04:34:27 +00:00
sta XScroll
jsr DrawNewAttribs ; Draw first attributes of second nametable
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
inc Column ; Column = 33
2022-12-05 04:13:27 +00:00
EnableRendering:
2022-12-09 04:34:27 +00:00
lda # % 10010000 ; Enable NMI and set background to use the 2nd pattern table (at $1000)
2022-12-05 04:13:27 +00:00
sta PPU_CTRL
lda # 0
2022-12-09 04:34:27 +00:00
sta PPU_SCROLL ; Disable scroll in X
sta PPU_SCROLL ; Disable scroll in Y
2022-12-05 04:13:27 +00:00
lda # % 00011110
2022-12-09 04:34:27 +00:00
sta PPU_MASK ; Set PPU_MASK bits to render the background
2022-12-05 04:13:27 +00:00
GameLoop:
2022-12-09 03:34:44 +00:00
lda Buttons
2022-12-09 04:34:27 +00:00
sta PrevButtons ; Stores the previously pressed buttons
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
jsr ReadControllers ; Read joypad and load button state
CheckAButton:
2022-12-05 04:13:27 +00:00
lda Buttons
and # BUTTON_A
beq : +
2022-12-09 04:34:27 +00:00
lda Buttons
and # BUTTON_A
cmp PrevButtons ; Compare the current buttons and check if button A was previously pressed
beq : + ; If it was, we bypass the creation of a new missile
lda # ActorType :: MISSILE
sta ParamType
lda XPos
sta ParamXPos
lda YPos
sta ParamYPos
jsr AddNewActor ; Call the subroutine to add a new missile actor
2022-12-05 04:13:27 +00:00
:
2022-12-09 03:34:44 +00:00
jsr Sp awnActors
jsr UpdateActors
jsr RenderActors
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
WaitForVBlank: ; We lock the execution of the game logic here
lda IsDrawComplete ; Here we check and only perform a game loop call once NMI is done drawing
beq WaitForVBlank ; Otherwise, we keep looping
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
lda # 0
sta IsDrawComplete ; Once we're done, we set the DrawComplete flag back to 0
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
jmp GameLoop
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; NMI interrupt handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NMI:
2022-12-09 04:34:27 +00:00
PUSH_REGS ; Macro to save register values by pushing them to the stack
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
inc Frame ; Frame++
2022-12-05 04:13:27 +00:00
2022-12-09 04:34:27 +00:00
OAMStartDMACopy: ; DMA copy of OAM data from RAM to PPU
lda # $ 02 ; Every frame, we copy spite data starting at $02**
sta PPU_OAM_DMA ; The OAM-DMA copy starts when we write to $4014
2022-12-05 04:13:27 +00:00
2023-01-25 04:18:03 +00:00
;; TODO
;; Loop all bytes of the background buffer at $7000 until we find length=0
;; Sending the tiles to the PPU nametable in VRAM
BackgroundCopy:
lda # $ 70
sta BufPtr + 1
lda # $ 00
sta BufPtr
ldy # $ 00
BufferLoop:
lda ( BufPtr ), y ; Fetch the length
beq EndBackgroundCopy ; if len is 0, stop reading from bg buffer
tax ; x = length
iny
lda ( BufPtr ), y ; hi byte
sta PPU_ADDR
iny
lda ( BufPtr ), y ; low byte
sta PPU_ADDR
iny
DataLoop:
lda ( BufPtr ), y
sta PPU_DATA
iny
dex ; X--
bne DataLoop
jmp BufferLoop
EndBackgroundCopy:
2022-12-05 04:13:27 +00:00
NewColumnCheck:
lda XScroll
2022-12-09 04:34:27 +00:00
and # % 00000111 ; Check if the scroll a multiple of 8
bne : + ; If it isn't, we still don't need to draw a new column
jsr DrawNewColumn ; If it is a multiple of 8, we proceed to draw a new column of tiles!
2022-12-05 04:13:27 +00:00
Clamp128Cols:
lda Column
clc
2022-12-09 04:34:27 +00:00
adc # 1 ; Column++
and # % 01111111 ; Drop the left-most bit to wrap around 128
sta Column ; Clamping the value to never go beyond 128
:
2022-12-05 04:13:27 +00:00
NewAttribsCheck:
2022-12-09 04:34:27 +00:00
lda XScroll
and # % 00011111 ; Check if the scroll is a multiple of 32 (lowest 5 bits are 00000)
bne : + ; If it isn't, we still don't need to draw new attributes
jsr DrawNewAttribs ; It it is a multiple of 32, we draw the new attributes!
:
2022-12-05 04:13:27 +00:00
2022-12-09 03:34:44 +00:00
SetPPUNoScroll:
2022-12-09 04:34:27 +00:00
lda # 0
sta PPU_SCROLL
sta PPU_SCROLL ; Set *no* scroll for the status bar
2022-12-09 03:34:44 +00:00
EnablePPUSprite0:
2022-12-09 04:34:27 +00:00
lda # % 10010000 ; Enable PPU sprites for sprite 0
sta PPU_CTRL
lda # % 00011110 ; Enable sprites and enable background
sta PPU_MASK
2022-12-09 03:34:44 +00:00
WaitForNoSprite0:
2022-12-09 04:34:27 +00:00
lda PPU_STATUS
and # % 01000000 ; PPU address $2002 bit 6 is the sprite 0 hit flag
bne WaitForNoSprite0 ; Loop until we do *not* have a sprite 0 hit
2022-12-09 03:34:44 +00:00
WaitForSprite0:
2022-12-09 04:34:27 +00:00
lda PPU_STATUS
and # % 01000000 ; PPU address $2002 bit 6 is the sprite 0 hit flag
beq WaitForSprite0 ; Loop until we do have a sprite 0 hit
2022-12-05 04:13:27 +00:00
ScrollBackground:
inc XScroll ; XScroll++
lda XScroll
bne : + ; Check if XScroll rolled back to 0, then we swap nametables!
lda CurrNametable
eor # 1 ; An XOR with %00000001 will flip the right-most bit.
sta CurrNametable ; If it was 0, it becomes 1. If it was 1, it becomes 0.
:
lda XScroll
sta PPU_SCROLL ; Set the horizontal X scroll first
lda # 0
sta PPU_SCROLL ; No vertical scrolling
RefreshRendering:
lda # % 10010000 ; Enable NMI, sprites from Pattern Table 0, background from Pattern Table 1
ora CurrNametable ; OR with CurrNametable (0 or 1) to set PPU_CTRL bit-0 (starting nametable)
sta PPU_CTRL
lda # % 00011110 ; Enable sprites, enable background, no clipping on left side
sta PPU_MASK
SetGameClock:
lda Frame ; Increment Clock60 every time we reach 60 frames (NTSC = 60Hz)
cmp # 60 ; Is Frame equal to #60?
bne : + ; If not, bypass Clock60 increment
inc Cl ock60 ; But if it is 60, then increment Clock60 and zero Frame counter
lda # 0
sta Frame
:
SetDrawComplete:
lda # 1
2022-12-09 04:34:27 +00:00
sta IsDrawComplete ; Set the DrawComplete flag to indicate we are done drawing to the PPU
2022-12-05 04:13:27 +00:00
PULL_REGS
2022-12-09 04:34:27 +00:00
2022-12-05 04:13:27 +00:00
rti ; Return from interrupt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; IRQ interrupt handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IRQ:
rti ; Return from interrupt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Hardcoded list of color values in ROM to be loaded by the PPU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PaletteData:
.byte $ 1 C , $ 0 F , $ 22 , $ 1 C , $ 1 C , $ 37 , $ 3 D , $ 0 F , $ 1 C , $ 37 , $ 3 D , $ 30 , $ 1 C , $ 0 F , $ 3 D , $ 30 ; Background palette
.byte $ 1 C , $ 0 F , $ 2 D , $ 10 , $ 1 C , $ 0 F , $ 20 , $ 27 , $ 1 C , $ 2 D , $ 38 , $ 18 , $ 1 C , $ 0 F , $ 1 A , $ 32 ; Sprite palette
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Background data (contains 4 screens that should scroll horizontally)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BackgroundData:
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 23 , $ 33 , $ 15 , $ 21 , $ 12 , $ 00 , $ 31 , $ 31 , $ 31 , $ 55 , $ 56 , $ 00 , $ 00 ; ---> screen column 1 (from top to bottom)
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 24 , $ 34 , $ 15 , $ 15 , $ 12 , $ 00 , $ 31 , $ 31 , $ 53 , $ 56 , $ 56 , $ 00 , $ 00 ; ---> screen column 2 (from top to bottom)
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 52 , $ 56 , $ 00 , $ 00 ; ---> screen column 3 (from top to bottom)
.byte $ 13 , $ 13 , $ 7 f , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 5 a , $ 56 , $ 00 , $ 00 ; ...
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 22 , $ 32 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ 00 , $ 00 ; ...
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 46 , $ 21 , $ 21 , $ 21 , $ 26 , $ 36 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 5 c , $ 56 , $ 00 , $ 00 ; ...
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 27 , $ 37 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 61 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 28 , $ 38 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 c , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 47 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 21 , $ 22 , $ 32 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 23 , $ 33 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 24 , $ 34 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 6 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 78 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 7 b , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 53 , $ 56 , $ 00 , $ 00
2022-12-09 04:34:27 +00:00
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 15 , $ 21 , $ 21 , $ 25 , $ 35 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 54 , $ 56 , $ 00 , $ 00
2022-12-05 04:13:27 +00:00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 26 , $ 36 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 27 , $ 37 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
2022-12-09 04:34:27 +00:00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 21 , $ 15 , $ 27 , $ 37 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 d , $ 56 , $ 00 , $ 00
2022-12-05 04:13:27 +00:00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 28 , $ 38 , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 22 , $ 35 , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 26 , $ 36 , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 21 , $ 27 , $ 37 , $ 21 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 76 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 28 , $ 38 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 72 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 59 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 c , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 29 , $ 39 , $ 21 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 55 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 2 c , $ 2 a , $ 3 a , $ 3 c , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 54 , $ 56 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 65 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 46 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 2 d , $ 2 a , $ 3 a , $ 3 d , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 52 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 2 b , $ 3 b , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ 00 , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 31 , $ 31 , $ 31 , $ 55 , $ 56 , $ ff , $ 9 a
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 15 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 31 , $ 31 , $ 53 , $ 56 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 52 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 7 f , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 5 a , $ 56 , $ ff , $ 56
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ ff , $ 59
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 15 , $ 15 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 5 c , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 61 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 c , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 47 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 25 , $ 35 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 26 , $ 36 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 6 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 27 , $ 37 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 78 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 21 , $ 21 , $ 21 , $ 28 , $ 38 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 b , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 21 , $ 21 , $ 29 , $ 39 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 53 , $ 56 , $ aa , $ 00
2022-12-09 04:34:27 +00:00
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 15 , $ 21 , $ 1 f , $ 2 a , $ 3 a , $ 3 c , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 54 , $ 56 , $ aa , $ 00
2022-12-05 04:13:27 +00:00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 28 , $ 3 b , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 d , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 21 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 76 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ 5 a , $ 00
.byte $ 13 , $ 13 , $ 72 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ 9 a , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 22 , $ 32 , $ 4 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 23 , $ 33 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 c , $ 56 , $ 6 a , $ 00
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 24 , $ 34 , $ 21 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 55 , $ 56 , $ 9 a , $ 00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 48 , $ 15 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 54 , $ 56 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 65 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 46 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 52 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 31 , $ 31 , $ 31 , $ 58 , $ 56 , $ ff , $ 9 a
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 31 , $ 31 , $ 00 , $ 5 d , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 7 f , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ ff , $ aa
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 22 , $ 32 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ ff , $ 56
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 46 , $ 21 , $ 21 , $ 21 , $ 26 , $ 36 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ ff , $ 9 a
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 27 , $ 37 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ ff , $ 59
.byte $ 13 , $ 13 , $ 61 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 28 , $ 38 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 55 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 47 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 21 , $ 22 , $ 32 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 52 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 23 , $ 33 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 53 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 24 , $ 34 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 6 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 78 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 b , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
2022-12-09 04:34:27 +00:00
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
2022-12-05 04:13:27 +00:00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 29 , $ 39 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 1 f , $ 2 a , $ 3 a , $ 3 d , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 15 , $ 2 d , $ 2 a , $ 3 a , $ 3 c , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 b , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 2 f , $ 2 a , $ 3 a , $ 3 d , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 28 , $ 3 b , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 21 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 76 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 29 , $ 39 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 72 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 2 c , $ 2 a , $ 3 a , $ 3 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 2 e , $ 2 a , $ 3 a , $ 4 e , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 1 f , $ 2 a , $ 3 a , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 d , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 28 , $ 3 b , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 65 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 46 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 31 , $ 31 , $ 31 , $ 58 , $ 56 , $ ff , $ 9 a
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 31 , $ 31 , $ 00 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 7 f , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 54 , $ 56 , $ ff , $ 59
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 31 , $ 54 , $ 56 , $ ff , $ 56
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 15 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ ff , $ 59
.byte $ 13 , $ 13 , $ 61 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ ff , $ 5 a
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 47 , $ 15 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 53 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 57 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 29 , $ 39 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 6 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 48 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 1 d , $ 1 e , $ 2 a , $ 3 a , $ 3 c , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 78 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 2 b , $ 3 b , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 b , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
2022-12-09 04:34:27 +00:00
.byte $ 13 , $ 13 , $ 6 e , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 48 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 4 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
2022-12-05 04:13:27 +00:00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 49 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 14 , $ 11 , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 4 a , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 15 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 60 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 42 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 29 , $ 39 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 43 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 2 c , $ 2 a , $ 3 a , $ 3 c , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 50 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 44 , $ 15 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 2 d , $ 2 a , $ 3 a , $ 3 e , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 50 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 76 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 45 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 2 b , $ 3 b , $ 3 f , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 54 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 72 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 46 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 14 , $ 11 , $ 3 f , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 59 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 51 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 7 c , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 75 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 5 d , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 84 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 15 , $ 14 , $ 11 , $ 15 , $ 21 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 65 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 15 , $ 21 , $ 21 , $ 21 , $ 15 , $ 15 , $ 15 , $ 14 , $ 11 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
.byte $ 13 , $ 13 , $ 13 , $ 13 , $ 20 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 21 , $ 22 , $ 32 , $ 15 , $ 15 , $ 12 , $ 00 , $ 00 , $ 00 , $ 00 , $ 58 , $ 56 , $ aa , $ 00
AttributeData:
2022-12-09 04:34:27 +00:00
.byte $ ff , $ aa , $ aa , $ aa , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 6 a , $ a6 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 9 a , $ 59 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 5 a , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 9 a , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 6 a , $ 56 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ 9 a , $ 59 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ aa , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 56 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 59 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 9 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 59 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 56 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 59 , $ 00 , $ 00 , $ 00
.byte $ ff , $ aa , $ aa , $ aa , $ 5 a , $ 00 , $ 00 , $ 00
2022-12-05 04:13:27 +00:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here we add the CHR-ROM data, included from an external .CHR file
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "CHARS"
.incbin "atlantico.chr"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Vectors with the addresses of the handlers that we always add at $FFFA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "VECTORS"
.word NMI ; Address (2 bytes) of the NMI handler
.word Reset ; Address (2 bytes) of the Reset handler
.word IRQ ; Address (2 bytes) of the IRQ handler