From 7ba22eadda519ed1038a68ff40d80f44ca535942 Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Thu, 19 Oct 2017 12:59:24 -0700 Subject: [PATCH] Fixed several rendering glitches --- Makefile | 5 +- equates.s | 2 + gamemanager.s | 4 +- gameobject.s | 766 +++++++++++++++++++++++++------------------------- gscats.2mg | Bin 819264 -> 819264 bytes player.s | 19 ++ 6 files changed, 415 insertions(+), 381 deletions(-) diff --git a/Makefile b/Makefile index d433dca..de95b04 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,8 @@ ADDR=800 PGM=gscats MRSPRITE=../MrSprite/mrsprite -PALETTE=00ff00 000000 ffff00 886611 cc9933 eebb44 dd6666 ff99aa 00ff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffffff +CHROMA=00ff00 +PALETTE=000000 008800 886611 cc9933 eebb44 dd6666 ff99aa 00ff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffff00 ffffff SPRITES=SpriteBank all: $(PGM) loader @@ -46,7 +47,7 @@ clean: .PHONY: art art: - $(MRSPRITE) CODE "Art/*.gif" $(PALETTE) + $(MRSPRITE) CODE "Art/*.gif" $(CHROMA) $(PALETTE) $(MRSPRITE) BANK "Art/*.txt" $(SPRITES) mv Art/$(SPRITES)00.bin . ./MerlinToCA65.sh Art/$(SPRITES)Src.txt > spritebank.s diff --git a/equates.s b/equates.s index c63468e..38589c5 100644 --- a/equates.s +++ b/equates.s @@ -8,7 +8,9 @@ KBD = $e0c000 KBDSTROBE = $e0c010 COUT = $fded VRAM = $e12000 +SHADOWVRAM = $012000 VRAMBANK = $e10000 +SHADOWVRAMBANK = $010000 PRODOS = $bf00 ; MLI entry point PRODOSRETURN = $300 ; Indirect jump to get back to ProDOS from any bank diff --git a/gamemanager.s b/gamemanager.s index 7d8c3d4..81a52bb 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -43,6 +43,8 @@ beginGameplay: ldy #0 jsr renderPlayerHeader + jsr protectPlayers + gameplayLoop: jsr syncVBL @@ -54,7 +56,6 @@ gameplayLoop: stz terrainDirty ; Render players - jsr unrenderPlayers jsr renderPlayers gameplayLoopKbd: @@ -168,6 +169,7 @@ scrollMap: lda #$ffff sta mapScrollRequested + jsr protectPlayers lda #1 sta terrainDirty rts diff --git a/gameobject.s b/gameobject.s index 1f4287a..2fd3528 100644 --- a/gameobject.s +++ b/gameobject.s @@ -54,16 +54,15 @@ placeGameObjectOnTerrain: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; RENDER_GAMEOBJECT +; VRAM_PTR ; ; ptr = Pointer to gameobject data -; Trashes SCRATCHL +; X => Offset to upper left corner of VRAM, or -1 if offscreen ; -.macro RENDER_GAMEOBJECT ptr,spriteIndex +; Trashes all registers +; +.macro VRAM_PTR ptr .scope - SAVE_AXY - - ; Find gameobject location in video memory ldy #0 ; X @@ -71,9 +70,9 @@ placeGameObjectOnTerrain: lsr cmp leftScreenEdge - bmi renderGameobjectSkip ; Gameobject is off left edge of screen + bmi vramPtrSkip ; Gameobject is off left edge of screen cmp rightScreenEdge - bpl renderGameobjectSkip ; Gameobject is off right edge of screen + bpl vramPtrSkip ; Gameobject is off right edge of screen sec ; Convert byte x-pos to screenspace sbc leftScreenEdge @@ -84,9 +83,9 @@ placeGameObjectOnTerrain: lda #200 sbc ptr+GO_POSY,y - bmi renderGameobjectSkip ; Gameobject is off top edge of screen + bmi vramPtrSkip ; Gameobject is off top edge of screen cmp #200 - GAMEOBJECTHEIGHT - bpl renderGameobjectSkip ; Gameobject is off bottom edge of screen + bpl vramPtrSkip ; Gameobject is off bottom edge of screen asl tax @@ -95,288 +94,35 @@ placeGameObjectOnTerrain: adc SCRATCHL adc #$2000 tax ; X now contains the bank address of the upper left corner + bra vramPtrDone - phx - bra renderGameobjectBackground +vramPtrSkip: + ldx #-1 -renderGameobjectSkip: - jmp renderGameobjectDone +vramPtrDone: +.endscope +.endmacro -renderGameobjectBackground: - ; Save background - lda VRAMBANK,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160+6,x - sta ptr+GO_BACKGROUND,y - iny - iny +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; RENDER_GAMEOBJECT +; +; ptr = Pointer to gameobject data +; Trashes SCRATCHL +; +.macro RENDER_GAMEOBJECT ptr,spriteIndex +.scope + SAVE_AXY - lda VRAMBANK+160*2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*2+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*2+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*2+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*3,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*3+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*3+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*3+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*4+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*4+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*4+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*5,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*5+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*5+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*5+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*6,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*6+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*6+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*6+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*7,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*7+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*7+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*7+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*8,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*8+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*8+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*8+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*9,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*9+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*9+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*9+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*10,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*10+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*10+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*10+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*11,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*11+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*11+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*11+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*12,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*12+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*12+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*12+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*13,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*13+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*13+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*13+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*14,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*14+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*14+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*14+6,x - sta ptr+GO_BACKGROUND,y - iny - iny - - lda VRAMBANK+160*15,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*15+2,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*15+4,x - sta ptr+GO_BACKGROUND,y - iny - iny - lda VRAMBANK+160*15+6,x - sta ptr+GO_BACKGROUND,y + ; Find gameobject location in video memory + VRAM_PTR ptr + cpx #0 + bmi renderGameobjectDone ; Call compiled sprite code - ply + txy lda #spriteIndex + clc jsr DrawSpriteBank renderGameobjectDone: @@ -385,6 +131,295 @@ renderGameobjectDone: .endmacro +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; protectGameObject +; +; Saves background behind this game object +; A = Pointer to gameobject data +; X = VRAM position of upper left of game object +; +; Trashes SCRATCHL +; +protectGameObject: + phy + ldy #0 + + sta SCRATCHL + + lda SHADOWVRAMBANK,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*2+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*2+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*2+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*3,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*3+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*3+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*3+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*4+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*4+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*4+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*5,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*5+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*5+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*5+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*6,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*6+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*6+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*6+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*7,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*7+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*7+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*7+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*8,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*8+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*8+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*8+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*9,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*9+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*9+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*9+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*10,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*10+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*10+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*10+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*11,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*11+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*11+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*11+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*12,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*12+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*12+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*12+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*13,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*13+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*13+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*13+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*14,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*14+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*14+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*14+6,x + sta (SCRATCHL),y + iny + iny + + lda SHADOWVRAMBANK+160*15,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*15+2,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*15+4,x + sta (SCRATCHL),y + iny + iny + lda SHADOWVRAMBANK+160*15+6,x + sta (SCRATCHL),y + + ply + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; UNRENDER_GAMEOBJECT ; @@ -394,313 +429,288 @@ renderGameobjectDone: .macro UNRENDER_GAMEOBJECT ptr .scope SAVE_AXY - - ; Find gameobject location in video memory ldy #0 - ; X - lda ptr+GO_POSX,y - lsr - cmp leftScreenEdge - bmi unrenderGameobjectSkip ; Gameobject is off left edge of screen - cmp rightScreenEdge - bpl unrenderGameobjectSkip ; Gameobject is off right edge of screen - - sec - sbc leftScreenEdge - sta SCRATCHL - - ; Y - sec - lda #200 - sbc ptr+GO_POSY,y - bmi unrenderGameobjectSkip ; Gameobject is off top edge of screen - cmp #200 - GAMEOBJECTHEIGHT - bpl unrenderGameobjectSkip ; Gameobject is off bottom edge of screen - - asl - tax - lda vramYOffset,x - clc - adc SCRATCHL - adc #$2000 - tax ; X now contains the VRAM offset of the upper left corner - + ; Find gameobject location in video memory + VRAM_PTR ptr + cpx #0 + bmi unrenderGameobjectSkip bra unrenderGameobjectBackground unrenderGameobjectSkip: jmp unrenderGameobjectDone unrenderGameobjectBackground: + lda ptr+GO_BACKGROUND,y - sta VRAMBANK,x + sta SHADOWVRAMBANK,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+2,x + sta SHADOWVRAMBANK+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+4,x + sta SHADOWVRAMBANK+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+6,x + sta SHADOWVRAMBANK+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160,x + sta SHADOWVRAMBANK+160,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160+2,x + sta SHADOWVRAMBANK+160+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160+4,x + sta SHADOWVRAMBANK+160+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160+6,x + sta SHADOWVRAMBANK+160+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*2,x + sta SHADOWVRAMBANK+160*2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*2+2,x + sta SHADOWVRAMBANK+160*2+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*2+4,x + sta SHADOWVRAMBANK+160*2+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*2+6,x + sta SHADOWVRAMBANK+160*2+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*3,x + sta SHADOWVRAMBANK+160*3,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*3+2,x + sta SHADOWVRAMBANK+160*3+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*3+4,x + sta SHADOWVRAMBANK+160*3+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*3+6,x + sta SHADOWVRAMBANK+160*3+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*4,x + sta SHADOWVRAMBANK+160*4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*4+2,x + sta SHADOWVRAMBANK+160*4+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*4+4,x + sta SHADOWVRAMBANK+160*4+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*4+6,x + sta SHADOWVRAMBANK+160*4+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*5,x + sta SHADOWVRAMBANK+160*5,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*5+2,x + sta SHADOWVRAMBANK+160*5+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*5+4,x + sta SHADOWVRAMBANK+160*5+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*5+6,x + sta SHADOWVRAMBANK+160*5+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*6,x + sta SHADOWVRAMBANK+160*6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*6+2,x + sta SHADOWVRAMBANK+160*6+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*6+4,x + sta SHADOWVRAMBANK+160*6+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*6+6,x + sta SHADOWVRAMBANK+160*6+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*7,x + sta SHADOWVRAMBANK+160*7,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*7+2,x + sta SHADOWVRAMBANK+160*7+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*7+4,x + sta SHADOWVRAMBANK+160*7+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*7+6,x + sta SHADOWVRAMBANK+160*7+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*8,x + sta SHADOWVRAMBANK+160*8,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*8+2,x + sta SHADOWVRAMBANK+160*8+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*8+4,x + sta SHADOWVRAMBANK+160*8+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*8+6,x + sta SHADOWVRAMBANK+160*8+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*9,x + sta SHADOWVRAMBANK+160*9,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*9+2,x + sta SHADOWVRAMBANK+160*9+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*9+4,x + sta SHADOWVRAMBANK+160*9+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*9+6,x + sta SHADOWVRAMBANK+160*9+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*10,x + sta SHADOWVRAMBANK+160*10,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*10+2,x + sta SHADOWVRAMBANK+160*10+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*10+4,x + sta SHADOWVRAMBANK+160*10+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*10+6,x + sta SHADOWVRAMBANK+160*10+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*11,x + sta SHADOWVRAMBANK+160*11,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*11+2,x + sta SHADOWVRAMBANK+160*11+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*11+4,x + sta SHADOWVRAMBANK+160*11+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*11+6,x + sta SHADOWVRAMBANK+160*11+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*12,x + sta SHADOWVRAMBANK+160*12,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*12+2,x + sta SHADOWVRAMBANK+160*12+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*12+4,x + sta SHADOWVRAMBANK+160*12+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*12+6,x + sta SHADOWVRAMBANK+160*12+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*13,x + sta SHADOWVRAMBANK+160*13,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*13+2,x + sta SHADOWVRAMBANK+160*13+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*13+4,x + sta SHADOWVRAMBANK+160*13+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*13+6,x + sta SHADOWVRAMBANK+160*13+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*14,x + sta SHADOWVRAMBANK+160*14,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*14+2,x + sta SHADOWVRAMBANK+160*14+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*14+4,x + sta SHADOWVRAMBANK+160*14+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*14+6,x + sta SHADOWVRAMBANK+160*14+6,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*15,x + sta SHADOWVRAMBANK+160*15,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*15+2,x + sta SHADOWVRAMBANK+160*15+2,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*15+4,x + sta SHADOWVRAMBANK+160*15+4,x iny iny lda ptr+GO_BACKGROUND,y - sta VRAMBANK+160*15+6,x + sta SHADOWVRAMBANK+160*15+6,x unrenderGameobjectDone: RESTORE_AXY diff --git a/gscats.2mg b/gscats.2mg index 8a0487c3f207a10b28663d5406b48cc7de3c3467..8f418d3a86a0def5cfc675ddbe01e067e68a08ec 100644 GIT binary patch delta 6143 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 delta 6145 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 L5qqM!`7iz#DzJhb diff --git a/player.s b/player.s index 225c577..97392ea 100644 --- a/player.s +++ b/player.s @@ -207,6 +207,25 @@ renderPlayers: rts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; protectPlayers +; +; +protectPlayers: + SAVE_AXY + + VRAM_PTR playerData + lda #playerData+GO_BACKGROUND + jsr protectGameObject + + VRAM_PTR playerData+PD_SIZE + lda #playerData+GO_BACKGROUND+PD_SIZE + jsr protectGameObject + + RESTORE_AXY + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; unrenderPlayers ;