From d09f8e36813cd182a211bbbca7e1c79bcad38842 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 21 Jul 2022 22:56:32 -0500 Subject: [PATCH] Update old demos to current APIs --- demos/shell/App.Main.s | 3 + demos/sprites/App.Main.s | 12 +- demos/zelda/App.Main.s | 253 +++++++++++++++++++++++-------- demos/zelda/gen/App.TileMapBG0.s | 4 +- 4 files changed, 205 insertions(+), 67 deletions(-) diff --git a/demos/shell/App.Main.s b/demos/shell/App.Main.s index 5c2c196..28c7222 100644 --- a/demos/shell/App.Main.s +++ b/demos/shell/App.Main.s @@ -42,6 +42,7 @@ NO_MUSIC equ 1 ; turn music + tool loadi pea #MyPalette _GTESetPalette + pea $0000 pea $0000 _GTESetScreenMode @@ -56,6 +57,8 @@ NO_MUSIC equ 1 ; turn music + tool loadi sta BankLoad ; Store "Bank Pointer" jsr MovePlayerToOrigin ; Put the player at the beginning of the map + + lda #193 ; Tile ID of '0' jsr InitOverlay ; Initialize the status bar EvtLoop diff --git a/demos/sprites/App.Main.s b/demos/sprites/App.Main.s index f5d042f..d751744 100644 --- a/demos/sprites/App.Main.s +++ b/demos/sprites/App.Main.s @@ -74,6 +74,7 @@ ScreenHeight equ 14 jsr TileAnimInit jsr SetLimits + lda #193 ; Tile ID of '0' jsr InitOverlay ; Initialize the status bar stz frameCount pha @@ -317,9 +318,6 @@ EvtLoop pha _GTEMoveSprite ; Move the sprite to this local position -; Update the timers -; jsl DoTimers - ; Let's see what it looks like! ; lda vsync @@ -342,6 +340,12 @@ EvtLoop ; jsl SetBorderColor ;:no_vsync2 + lda runningCount + inc + sta runningCount + pha + _GTESetBG1Rotation + ; Update the performance counters inc frameCount @@ -353,6 +357,7 @@ EvtLoop sta oldOneSecondCounter jsr UdtOverlay stz frameCount + :noudt brl EvtLoop @@ -401,6 +406,7 @@ MaxBG0Y ds 2 oldOneSecondCounter ds 2 frameCount ds 2 +runningCount dw 0 MyUserId ds 2 MyDirectPage ds 2 diff --git a/demos/zelda/App.Main.s b/demos/zelda/App.Main.s index de95018..f034bdc 100644 --- a/demos/zelda/App.Main.s +++ b/demos/zelda/App.Main.s @@ -26,6 +26,7 @@ DOWN_ARROW equ $0A StartX equ 4 StartY equ 6 +tmp0 equ 8 TSet EXT ; Typical init @@ -114,28 +115,51 @@ OKTOROK_SLOT_4 equ 4 pea HERO_DOWN_VBUFF ; and use this stamp _GTEUpdateSprite -; Add 4 octoroks - pea OKTOROK_ID - lda OktorokX - pha - lda OktorokY - pha - pea OKTOROK_SLOT_1 - _GTEAddSprite +; Add 4 octoroks + ldx #0 +:oktorok_loop + phx ; save the index - pea OKTOROK_SLOT_1 + txa ; calculate the SLOT ID + lsr + inc + tay + +; _GTEUpdateSprite parameters + + phy pea $0000 ; with these flags (h/v flip) pea OKTOROK_VBUFF ; and use this stamp + +; _GTEAddSprite parameters + + pea OKTOROK_ID + lda OktorokX,x + pha + lda OktorokY,x + pha + phy + + _GTEAddSprite _GTEUpdateSprite + plx + dex + dex + bpl :oktorok_loop + ; Draw the initial screen + pea $0000 _GTERender ; Set up a very specific test. First, we draw a sprite into the sprite plane, and then ; leave it alone. We are just testing the ability to merge sprite plane data into ; the play field tiles. EvtLoop + lda #2 + jsr _SetBorderColor + pha _GTEReadControl pla @@ -180,45 +204,48 @@ EvtLoop pea HERO_SIDE_VBUFF ; and use this stamp _GTEUpdateSprite - bra :do_render + bra :do_render :not_d - cmp #'a' - bne :not_a - dec PlayerX - bpl *+5 - jsr TransitionLeft + cmp #'a' + bne :not_a + dec PlayerX + bpl *+5 + jsr TransitionLeft pea HERO_SLOT pea SPRITE_HFLIP pea HERO_SIDE_VBUFF _GTEUpdateSprite - bra :do_render + bra :do_render :not_a - cmp #'s' - bne :not_s - inc PlayerY + cmp #'s' + bne :not_s + inc PlayerY pea HERO_SLOT pea $0000 pea HERO_DOWN_VBUFF _GTEUpdateSprite - bra :do_render + bra :do_render :not_s - cmp #'w' - bne :not_w - dec PlayerY + cmp #'w' + bne :not_w + dec PlayerY pea HERO_SLOT pea $0000 pea HERO_UP_VBUFF _GTEUpdateSprite - bra :do_render + bra :do_render :not_w :do_render + lda #3 + jsr _SetBorderColor + pea HERO_SLOT lda PlayerX pha @@ -228,49 +255,62 @@ EvtLoop ; Based on the frame count, move an oktorok -; jsr _GetVBLTicks -; pha -; and #$0003 -; asl -; tax + jsr _GetVBLTicks + pha -; pla -; and #$007C -; lsr -; tay +; pha ; save the vbl value for a second +; and #$0003 ; pick which oktorok to move + lda #4 + jsr _SetBorderColor -; lda OktorokX,x -; clc -; adc OktorokDelta,y + plx + phx + lda #0 + jsr MoveEnemy -; phx + plx + phx + lda #1 +; jsr MoveEnemy -; ldy OktorokY,x -; tax -; pla -; inc -; inc -; jsl MoveSprite + plx + phx + lda #2 +; jsr MoveEnemy + + plx + lda #3 +; jsr MoveEnemy ; Let's see what it looks like! - lda vsync - beq :no_vsync -:vsyncloop jsr _GetVBL ; 8-bit value - cmp #12 - bcc :vsyncloop - cmp #16 - bcs :vsyncloop ; Wait until we're within the top 4 scanlines - lda #1 - jsr _SetBorderColor -:no_vsync - _GTERenderDirty +; lda vsync +; beq :no_vsync - lda vsync - beq :no_vsync2 - lda #0 - jsr _SetBorderColor +;:vsyncloop jsr _GetVBL ; 8-bit value +; cmp #12 +; bcc :vsyncloop +; cmp #16 +; bcs :vsyncloop ; Wait until we're within the top 4 scanlines + + lda #0 + jsr _SetBorderColor + + ldx #8 + jsr _WaitForScanline + + lda #1 + jsr _SetBorderColor +:no_vsync + pea $0000 + _GTERenderDirty +; brk $03 + +; lda vsync +; beq :no_vsync2 +; lda #0 +; jsr _SetBorderColor :no_vsync2 brl EvtLoop @@ -294,6 +334,8 @@ TransitionRight adc #128 sta TransitionX + jsr HideEnemies + :loop lda StartX cmp TransitionX bcs :out @@ -317,11 +359,11 @@ TransitionRight pha _GTEMoveSprite :nosprite - + pea $0000 _GTERender ; Do full renders since the playfield is scrolling bra :loop :out - + jsr ShowEnemies inc MapScreenX ; Move the index to the next screen :done rts @@ -332,6 +374,8 @@ TransitionLeft cmp #0 beq :done + jsr HideEnemies + lda StartX ; Scroll 128 bytes to the left sec sbc #128 @@ -361,14 +405,81 @@ TransitionLeft pha _GTEMoveSprite :nosprite - + pea $0000 _GTERender bra :loop :out + jsr ShowEnemies dec MapScreenX ; Move the index to the next screen :done rts +; Move an oktorok. A = 0 - 3, X = animation frame +MoveEnemy + phx + + tay + iny ; Oktoroks are in slots 1 - 4 + + asl + tax ; Update this oktorok + + pla ; Pop the VBL value + and #$007C + lsr + + phy ; push the SLOT ID + tay + + lda OktorokX,x + clc + adc OktorokDelta,y + pha ; Push the X position + + lda OktorokY,x + pha + _GTEMoveSprite + rts + +; Set the hidden flag on the enemy sprites during the screen transition +HideEnemies + ldx #6 +:loop + phx + + txa + lsr + inc + pha + pea SPRITE_HIDE + pea OKTOROK_VBUFF + _GTEUpdateSprite + + plx + dex + dex + bpl :loop + rts + +ShowEnemies + ldx #6 +:loop + phx + + txa + lsr + inc + pha + pea $0000 + pea OKTOROK_VBUFF + _GTEUpdateSprite + + plx + dex + dex + bpl :loop + rts + ToolPath str '1/Tool160' MyUserId ds 2 ; Color palette @@ -382,7 +493,7 @@ PlayerX ds 2 PlayerY ds 2 OktorokX dw 32,32,96,96 -OktorokY dw 48,96,56,72 +OktorokY dw 64,96,56,72 OktorokDelta dw 0,1,2,3,4,5,6,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-7,-6,-5,-4,-3,-2,-1,0,0,0 TransitionX ds 2 TransitionY ds 2 @@ -457,6 +568,24 @@ GTEStartUp BORDER_REG equ $E0C034 ; 0-3 = border, 4-7 Text color VBL_VERT_REG equ $E0C02E VBL_HORZ_REG equ $E0C02F +VBL_STATE_REG equ $E0C019 + +_WaitForVBL + sep #$20 +:wait1 ldal VBL_STATE_REG ; If we are already in VBL, then wait + bmi :wait1 +:wait2 ldal VBL_STATE_REG + bpl :wait2 ; spin until transition into VBL + rep #$20 + rts + +_WaitForScanline + jsr _GetVBL + and #$FFFE + sta tmp0 + cpx tmp0 + bne _WaitForScanline + rts _GetVBL sep #$20 diff --git a/demos/zelda/gen/App.TileMapBG0.s b/demos/zelda/gen/App.TileMapBG0.s index 4a9addc..3eaaf96 100644 --- a/demos/zelda/gen/App.TileMapBG0.s +++ b/demos/zelda/gen/App.TileMapBG0.s @@ -33,9 +33,9 @@ Tile_Layer_1 dw $006b,$006c,$006d,$006e,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0069,$006a,$006d,$006e,$0081,$0081,$0081,$0081,$0081,$0081,$0069,$006a,$006b,$006c,$006b,$006c,$006d,$006e,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062 - dw $004d,$004e,$0081,$0081,$0081,$0081,$0043,$0044,$0081,$0081,$0043,$0044,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0043,$0044,$0081,$0081,$0081,$0081,$0049,$004a,$004d,$004e,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0041,$0042 + dw $004d,$004e,$0081,$0081,$0081,$0081,$0043,$0044,$0081,$0081,$4043,$4044,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0043,$0044,$0081,$0081,$0081,$0081,$0049,$004a,$004d,$004e,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0041,$0042 - dw $006d,$006e,$0081,$0081,$0081,$0081,$0063,$0064,$0081,$0081,$0063,$0064,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0063,$0064,$0081,$0081,$0081,$0081,$0069,$006a,$006d,$006e,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0061,$0062 + dw $006d,$006e,$0081,$0081,$0081,$0081,$0063,$0064,$0081,$0081,$4063,$4064,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0063,$0064,$0081,$0081,$0081,$0081,$0069,$006a,$006d,$006e,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0081,$0081,$0081,$0081,$0061,$0062,$0081,$0081,$0061,$0062 dw $0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0041,$0042,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081,$0081