game title screen

This commit is contained in:
Tyrel Souza 2023-02-13 23:25:29 -05:00
parent 3999c5d6c5
commit b56f86a1cd
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
8 changed files with 226 additions and 3 deletions

View File

@ -15,5 +15,5 @@ clean:
# Rule to run the final cartridge .nes file in the FCEUX emulator # Rule to run the final cartridge .nes file in the FCEUX emulator
############################################################################### ###############################################################################
run: run:
on-workspace 1 "fceux ./atlantico.nes && i3-msg '[id=$(xdotool getactivewindow)] floating enable'" on-workspace 1 "fceux /home/tyrel/code/6502nes/atlantico/atlantico.nes && i3-msg '[id=$(xdotool getactivewindow)] floating enable'"
#on-workspace 1 "fceux atlantico.nes" #on-workspace 1 "fceux atlantico.nes"

View File

@ -2,12 +2,14 @@
.include "header.inc" .include "header.inc"
.include "actor.inc" .include "actor.inc"
.include "reset.inc" .include "reset.inc"
.include "state.inc"
.include "utils.inc" .include "utils.inc"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Variables declared in RAM zero-page ;; Variables declared in RAM zero-page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "ZEROPAGE" .segment "ZEROPAGE"
MenuItem: .res 1 ; Keep track of menu item
Score: .res 4 ; Score (1s, 10s, 100s, and 1000s digits in decimal) Score: .res 4 ; Score (1s, 10s, 100s, and 1000s digits in decimal)
Collision: .res 1 ; Flag if a collision happened or not Collision: .res 1 ; Flag if a collision happened or not
@ -31,6 +33,7 @@ Clock60: .res 1 ; Counter that increments per second (60 frames)
BgPtr: .res 2 ; Pointer to background address - 16bits (lo,hi) BgPtr: .res 2 ; Pointer to background address - 16bits (lo,hi)
SprPtr: .res 2 ; Pointer to the sprite address - 16bits (lo,hi) SprPtr: .res 2 ; Pointer to the sprite address - 16bits (lo,hi)
BufPtr: .res 2 ; Pointer to the buffer address - 16bits (lo,hi) BufPtr: .res 2 ; Pointer to the buffer address - 16bits (lo,hi)
PalPtr: .res 2
XScroll: .res 1 ; Store the horizontal scroll position XScroll: .res 1 ; Store the horizontal scroll position
CurrNametable: .res 1 ; Store the current starting nametable (0 or 1) CurrNametable: .res 1 ; Store the current starting nametable (0 or 1)
@ -53,6 +56,8 @@ PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent
Seed: .res 2 ; Initialize 16-bit seed to any value except 0 Seed: .res 2 ; Initialize 16-bit seed to any value except 0
GameState: .res 1 ; Keep track of game state
ActorsArray: .res MAX_ACTORS * .sizeof(Actor) ActorsArray: .res MAX_ACTORS * .sizeof(Actor)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -207,13 +212,44 @@ DoneIncrementing:
;; Subroutine to load all 32 color palette values from ROM ;; Subroutine to load all 32 color palette values from ROM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc LoadPalette .proc LoadPalette
ldx MenuItem
cpx #0
bne :+
lda #<PaletteDataClear
sta PalPtr
lda #>PaletteDataClear
sta PalPtr+1
jmp LoadPaletteBytes
:
ldx MenuItem
cpx #1
bne :+
lda #<PaletteDataCloudy
sta PalPtr
lda #>PaletteDataCloudy
sta PalPtr+1
jmp LoadPaletteBytes
:
ldx MenuItem
cpx #2
bne :+
lda #<PaletteDataNight
sta PalPtr
lda #>PaletteDataNight
sta PalPtr+1
jmp LoadPaletteBytes
:
LoadPaletteBytes:
PPU_SETADDR $3F00 PPU_SETADDR $3F00
ldy #0 ; Y = 0 ldy #0 ; Y = 0
: lda PaletteData,y ; Lookup byte in ROM : lda (PalPtr),y ; Lookup byte in ROM
sta PPU_DATA ; Set value to send to PPU_DATA sta PPU_DATA ; Set value to send to PPU_DATA
iny ; Y++ iny ; Y++
cpy #32 ; Is Y equal to 32? cpy #32 ; Is Y equal to 32?
bne :- ; Not yet, keep looping bne :- ; Not yet, keep looping
rts ; Return from subroutine rts ; Return from subroutine
.endproc .endproc
@ -774,6 +810,34 @@ FinishCollisionCheck:
rts rts
.endproc .endproc
.proc LoadTitleScreen
lda #<TitleScreenData
sta BgPtr
lda #>TitleScreenData
sta BgPtr+1
PPU_SETADDR $2000
ldx #$00
ldy #$00
OuterLoop:
InnerLoop:
lda (BgPtr),y
sta PPU_DATA
iny
cpy #0
beq IncreaseHiByte
jmp InnerLoop
IncreaseHiByte:
inc BgPtr+1
inx
cpx #4
bne OuterLoop
rts
.endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Subroutine to switch CHR banks ;; Subroutine to switch CHR banks
;; Params = A has the bank number ;; Params = A has the bank number
@ -789,6 +853,133 @@ FinishCollisionCheck:
Reset: Reset:
INIT_NES ; Macro to initialize the NES to a known state INIT_NES ; Macro to initialize the NES to a known state
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;; T I T L E S C R E E N ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc TitleScreen ; using proc to define scope
lda #1
jsr SwitchCHRBank
lda #State::TITLESCREEN
sta GameState ; GameState = TITLESCREEN
lda #1
sta MenuItem
jsr LoadPalette
jsr LoadTitleScreen ; Load tiles and attributes to the PPU
lda #0
sta MenuItem
DrawMenuArrow:
; Sprite y pos $0200
lda #92
sta $0200
; Sprite Tile# $0201
lda #$23
sta $0201
; Sprite Attribs $0202
lda #%00000001
sta $0202
; Sprite X positon $0203
lda #95
sta $0203
EnableNMI:
lda #%10010000
sta PPU_CTRL
lda #%00011110
sta PPU_MASK
TitleScreenLoop:
lda Buttons
sta PrevButtons
jsr ReadControllers
CheckStartButtons:
lda Buttons
and #BUTTON_START
beq :+
jmp GamePlay
:
CheckDownButton:
lda Buttons
and #BUTTON_DOWN
beq :+
cmp PrevButtons ; only one press considered, not hold
beq :+
lda MenuItem
cmp #2 ; prevent past 2
beq :+
;; increment menu item
inc MenuItem
lda $0200
clc
adc #17
sta $0200
:
CheckUpButton:
lda Buttons
and #BUTTON_UP
beq :+
cmp PrevButtons ; only one press considered, not hold
beq :+
lda MenuItem
beq :+
dec MenuItem
lda $0200
sec
sbc #17
sta $0200
:
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
lda #0
sta IsDrawComplete ; Once we're done, we set the DrawComplete flag back to 0
jmp TitleScreenLoop
.endproc ; End titleScreen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;; G A M E P L A Y ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.proc GamePlay
lda #0
jsr SwitchCHRBank
lda #State::PLAYING
sta GameState ; GameState = Playing
PPU_DISABLE_NMI
InitVariables: InitVariables:
lda #0 lda #0
sta Frame ; Frame = 0 sta Frame ; Frame = 0
@ -938,6 +1129,8 @@ GameLoop:
jmp GameLoop jmp GameLoop
.endproc ; EndGameplay Proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; NMI interrupt handler ;; NMI interrupt handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -979,7 +1172,11 @@ BackgroundCopy: ; Here is where we copy/draw the background buffer
jmp BufferLoop ; Loop back until we finish the buffer (find an entry with Length=0) jmp BufferLoop ; Loop back until we finish the buffer (find an entry with Length=0)
EndBackgroundCopy: EndBackgroundCopy:
lda GameState
cmp #State::PLAYING
bne EndScrolling ; Bypass scrolling if not in gameplay state
;; Only GAMEPLAY
NewColumnCheck: NewColumnCheck:
lda XScroll lda XScroll
and #%00000111 ; Check if the scroll a multiple of 8 and #%00000111 ; Check if the scroll a multiple of 8
@ -1034,6 +1231,8 @@ ScrollBackground:
lda #0 lda #0
sta PPU_SCROLL ; No vertical scrolling sta PPU_SCROLL ; No vertical scrolling
EndScrolling:
RefreshRendering: RefreshRendering:
lda #%10010000 ; Enable NMI, sprites from Pattern Table 0, background from Pattern Table 1 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) ora CurrNametable ; OR with CurrNametable (0 or 1) to set PPU_CTRL bit-0 (starting nametable)
@ -1067,9 +1266,15 @@ IRQ:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Hardcoded list of color values in ROM to be loaded by the PPU ;; Hardcoded list of color values in ROM to be loaded by the PPU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PaletteData: PaletteDataCloudy:
.byte $1C,$0F,$22,$1C, $1C,$37,$3D,$0F, $1C,$37,$3D,$30, $1C,$0F,$3D,$30 ; Background palette .byte $1C,$0F,$22,$1C, $1C,$37,$3D,$0F, $1C,$37,$3D,$30, $1C,$0F,$3D,$30 ; Background palette
.byte $1C,$0F,$2D,$10, $1C,$0F,$20,$27, $1C,$2D,$38,$18, $1C,$0F,$1A,$32 ; Sprite palette .byte $1C,$0F,$2D,$10, $1C,$0F,$20,$27, $1C,$2D,$38,$18, $1C,$0F,$1A,$32 ; Sprite palette
PaletteDataClear:
.byte $1C,$0F,$22,$1C, $1C,$36,$21,$0B, $1C,$36,$21,$30, $1C,$0F,$3D,$30 ; Background palette
.byte $1C,$0F,$2D,$10, $1C,$0F,$20,$27, $1C,$2D,$38,$18, $1C,$0F,$1A,$32 ; Sprite palette
PaletteDataNight:
.byte $0C,$0F,$1C,$0C, $0C,$26,$0C,$0F, $0C,$26,$0C,$2D, $0C,$36,$07,$2D ; Background palette
.byte $0C,$0F,$1D,$2D, $0C,$0F,$20,$27, $0C,$2D,$38,$18, $0C,$0F,$1A,$21 ; Sprite palette
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Background data (contains 4 screens that should scroll horizontally) ;; Background data (contains 4 screens that should scroll horizontally)
@ -1244,6 +1449,11 @@ AttributeData:
.byte $ff,$aa,$aa,$aa,$59,$00,$00,$00 .byte $ff,$aa,$aa,$aa,$59,$00,$00,$00
.byte $ff,$aa,$aa,$aa,$5a,$00,$00,$00 .byte $ff,$aa,$aa,$aa,$5a,$00,$00,$00
TitleScreenData:
.incbin "titlescreen.nam"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here we add the CHR-ROM data, included from an external .CHR file ;; Here we add the CHR-ROM data, included from an external .CHR file
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Binary file not shown.

Binary file not shown.

6
atlantico/state.inc Normal file
View File

@ -0,0 +1,6 @@
.enum State
TITLESCREEN
PLAYING
GAMEOVER
PAUSED
.endenum

Binary file not shown.

BIN
atlantico/titlescreen.nam Executable file

Binary file not shown.

View File

@ -40,3 +40,10 @@
tax tax
pla ; Pull A from the stack pla ; Pull A from the stack
.endmacro .endmacro
.macro PPU_DISABLE_NMI
lda #0
sta PPU_CTRL
sta PPU_MASK
.endmacro