buffering
This commit is contained in:
parent
0b4f05e1c2
commit
0a94e9424d
@ -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"
|
||||||
|
@ -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.
Loading…
Reference in New Issue
Block a user