buffering

This commit is contained in:
Tyrel Souza 2023-01-24 23:18:03 -05:00
parent 0b4f05e1c2
commit 0a94e9424d
No known key found for this signature in database
GPG Key ID: F3614B02ACBE438E
4 changed files with 155 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 ./atlantico.nes && i3-msg '[id=$(xdotool getactivewindow)] floating enable'"
#on-workspace 1 "fceux atlantico.nes" #on-workspace 1 "fceux atlantico.nes"

View File

@ -8,6 +8,8 @@
;; Variables declared in RAM zero-page ;; Variables declared in RAM zero-page
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.segment "ZEROPAGE" .segment "ZEROPAGE"
Score: .res 4 ; 4 bytes for 1s, 10s, 100s, 1000s, For score
Collision: .res 1 ; 0 or 1, if 0 no collision, if 1, collisison Collision: .res 1 ; 0 or 1, if 0 no collision, if 1, collisison
Buttons: .res 1 ; Pressed buttons (A|B|Sel|Start|Up|Dwn|Lft|Rgt) Buttons: .res 1 ; Pressed buttons (A|B|Sel|Start|Up|Dwn|Lft|Rgt)
@ -28,6 +30,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 - 16bite (lo,hi)
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)
@ -51,6 +54,7 @@ PrevOAMCount: .res 1 ; Store the previous number of bytes that were sent
Seed: .res 2 ; Initialize the 16-bit seed to any value except 0 Seed: .res 2 ; Initialize the 16-bit seed to any value except 0
ActorsArray: .res MAX_ACTORS * .sizeof(Actor) ActorsArray: .res MAX_ACTORS * .sizeof(Actor)
@ -77,6 +81,114 @@ LoopButtons:
rts rts
.endproc .endproc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Returns a random 8-bit number inside A (0-255), clobbers Y (0). ;; Returns a random 8-bit number inside A (0-255), clobbers Y (0).
;; Requires a 2-byte value on the Zero page called "Seed" ;; Requires a 2-byte value on the Zero page called "Seed"
@ -372,7 +484,7 @@ EndRoutine:
lda Collision lda Collision
beq NextEnemy beq NextEnemy
lda #ActorType::NULL lda #ActorType::NULL ; Set actor to null - TODO: maybe make an explosion
sta ActorsArray+Actor::Type,x sta ActorsArray+Actor::Type,x
jmp FinishCollisionCheck jmp FinishCollisionCheck
@ -465,8 +577,10 @@ FinishCollisionCheck:
lda Collision lda Collision
beq NoCollisionFound beq NoCollisionFound
lda #ActorType::NULL lda #ActorType::NULL ; Delete missile Actor
sta ActorsArray+Actor::Type,x sta ActorsArray+Actor::Type,x
;; TODO: increment Score
jsr IncrementScore
NoCollisionFound: NoCollisionFound:
@ -838,6 +952,40 @@ OAMStartDMACopy: ; DMA copy of OAM data from RAM to PPU
lda #$02 ; Every frame, we copy spite data starting at $02** 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 sta PPU_OAM_DMA ; The OAM-DMA copy starts when we write to $4014
;; 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:
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
@ -906,6 +1054,10 @@ SetGameClock:
inc Clock60 ; But if it is 60, then increment Clock60 and zero Frame counter inc Clock60 ; But if it is 60, then increment Clock60 and zero Frame counter
lda #0 lda #0
sta Frame sta Frame
;; TODO: REMOVE
jsr IncrementScore
jsr DrawScore
: :
SetDrawComplete: SetDrawComplete:

Binary file not shown.

Binary file not shown.