From 0a94e9424d931aceccd21cfb10dca7e13a18c588 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Tue, 24 Jan 2023 23:18:03 -0500 Subject: [PATCH] buffering --- atlantico/Makefile | 2 +- atlantico/atlantico.asm | 156 +++++++++++++++++++++++++++++++++++++++- atlantico/atlantico.nes | Bin 40976 -> 40976 bytes atlantico/atlantico.o | Bin 54684 -> 56532 bytes 4 files changed, 155 insertions(+), 3 deletions(-) diff --git a/atlantico/Makefile b/atlantico/Makefile index bee39cd..e953e5d 100755 --- a/atlantico/Makefile +++ b/atlantico/Makefile @@ -15,5 +15,5 @@ clean: # Rule to run the final cartridge .nes file in the FCEUX emulator ############################################################################### 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" diff --git a/atlantico/atlantico.asm b/atlantico/atlantico.asm index 0ed3387..37fb20f 100755 --- a/atlantico/atlantico.asm +++ b/atlantico/atlantico.asm @@ -8,6 +8,8 @@ ;; Variables declared in RAM zero-page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .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 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) 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 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 + ActorsArray: .res MAX_ACTORS * .sizeof(Actor) @@ -77,6 +81,114 @@ LoopButtons: rts .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). ;; Requires a 2-byte value on the Zero page called "Seed" @@ -372,7 +484,7 @@ EndRoutine: lda Collision beq NextEnemy - lda #ActorType::NULL + lda #ActorType::NULL ; Set actor to null - TODO: maybe make an explosion sta ActorsArray+Actor::Type,x jmp FinishCollisionCheck @@ -465,8 +577,10 @@ FinishCollisionCheck: lda Collision beq NoCollisionFound - lda #ActorType::NULL + lda #ActorType::NULL ; Delete missile Actor sta ActorsArray+Actor::Type,x + ;; TODO: increment Score + jsr IncrementScore 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** 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: lda XScroll 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 lda #0 sta Frame + + ;; TODO: REMOVE + jsr IncrementScore + jsr DrawScore : SetDrawComplete: diff --git a/atlantico/atlantico.nes b/atlantico/atlantico.nes index 01ff9e140f9fdf25dcc90bbc7a6b7aad8d9fed0f..c559f0de26e4f846782d429c38a439e39bf31b63 100644 GIT binary patch delta 1304 zcmY*Z&ube;6rR~#{XnrSS5a3Z*?SIf7T9Fbcdr8|vpnbEB6lK|cGw*%xeeau{ zo$Zgc{#f&_zw<#^qm;}pNg>fQcU$<}$Dx|&|LX|CTnZ$}gqI}&BB*jHx)!=rXv)>l z&7rFaUAa2C#F2O4Rg4veMCu2HiR8-MK%;6LHG0SuPq2j=B|+m1(_%YQt@X8QZ+#j5 z4ch^68XA{x_mW%^G(+;}J?N$QWX!{-jxbxT7L-Ks8qH*w%b_e-MqRKfn1a^CDsyk6 zx8?$@Nux*jeT|DUGI^qe_Rt!VlT}6dOZbm7BickFMcryKcZ~e3_H0I}f{U~RSVMtB z5_86sXLRFqlo2K7rlDkCZ99kLH!CWSb^;Qm_nE67+1|~zSRd>NYfu-JLBkQbD}S5| z^sp>7SeL(o#k+ni;76$NkJ=&!=Typ4poJx=W6G1~Da_rRWh^=S%|r5qfxX_qUV2y^ z)nW5dgTTd6ow+7l!nx8^<+|4qMwF6duw#?XnWRbk){!Hu)6ITKR8BAU&*S{kaTe#* zZ-uQ z#u(IJ3dXTmOkjoII`}HiW5fKA#2u4i8P{Wt8c@OSi%Sj{P}K(iaL;~yFQ5ykgD64N zn4{VPYN%T8B^clPoO%Ue9Z`K=Y%HMfBT5$=KbITn_BWk-&7Zf9Uy=VE@UHu_ljy-?+>4rk8~rm{0^JKZTSOkd`Y@gKhq`FO#_I z1T484?>DMg7b&nrdgc}pHG%OTd|@h5bIJq@c=#8_iRp2U9TS z8Xl;MC-Vy0#)`hGAiV^~TUtHJMFNtX_##pBqoT5>$tZ_!dr=Voyv?^d{Hu;wj-Dak zvi(W7x!=6kOi!~?>lJoi{3A{ZQTb?cQosZG+S#D&*`c%_c7<6>g-dE#sF2oBB1S5q z&T0GZ$HvB+rZB^#I=fI5rjn?n%6_7#WXE!|!PRhSs{T@0{22MWKCXZH!9(N0XUXrn M{@!)?e#Phi1Ja|;Pyhe` delta 1146 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 O?~)V5!3zf-$N4{~RE(Mc literal 54684 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 bWOpm*l3!5RsB5<_g?(~@I0|3|cbxwV1eh!M