From 4b183a0d99e69881fa30cff86d5f834450194ccc Mon Sep 17 00:00:00 2001 From: blondie7575 Date: Thu, 20 Jul 2023 19:41:06 -0700 Subject: [PATCH] Added palette cross-fading --- GSCats.xcodeproj/project.pbxproj | 4 +- gamemanager.s | 15 +- graphics.s | 82 +------- gscats.s | 3 +- loader.s | 43 +---- loaderGraphics.s | 318 +++---------------------------- loadingBar.s | 4 +- sharedGraphics.s | 278 +++++++++++++++++++++++++++ 8 files changed, 322 insertions(+), 425 deletions(-) create mode 100644 sharedGraphics.s diff --git a/GSCats.xcodeproj/project.pbxproj b/GSCats.xcodeproj/project.pbxproj index 42e65cb..b5bfc3e 100644 --- a/GSCats.xcodeproj/project.pbxproj +++ b/GSCats.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 701E708B2A660CEB0030C35D /* progressBar.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = progressBar.s; sourceTree = ""; }; 701E708E2A67844B0030C35D /* loaderGraphics.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loaderGraphics.s; sourceTree = ""; }; 701E708F2A69CE520030C35D /* loadingBar.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loadingBar.s; sourceTree = ""; }; + 701E70902A6A23800030C35D /* sharedGraphics.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = sharedGraphics.s; sourceTree = ""; }; 705456862A43E03B00A2B866 /* GeneratePixelCircle.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GeneratePixelCircle.py; sourceTree = ""; }; 705456882A4D336200A2B866 /* animation.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = animation.s; sourceTree = ""; }; 7059502B1F37A0BE00BBE90F /* GenerateVRAMTable.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateVRAMTable.py; sourceTree = ""; }; @@ -62,8 +63,9 @@ 706DF1641F2D39F700AA6680 /* loader.s */, 701E708E2A67844B0030C35D /* loaderGraphics.s */, 701E708F2A69CE520030C35D /* loadingBar.s */, - 70E9D8611F2BD95400555C19 /* gscats.s */, + 701E70902A6A23800030C35D /* sharedGraphics.s */, 70E9D8601F2BD95400555C19 /* graphics.s */, + 70E9D8611F2BD95400555C19 /* gscats.s */, 70E9D8621F2BD95400555C19 /* macros.s */, 7099E3841F41022100182A82 /* gameobject.s */, 70F011D123B989B800C8873F /* random.s */, diff --git a/gamemanager.s b/gamemanager.s index 4290f36..9d36973 100644 --- a/gamemanager.s +++ b/gamemanager.s @@ -12,13 +12,7 @@ beginGameplay: ; Initialize random numbers lda #1 jsr seedRandom - - ; Set up palette for terrain and players - lda #basePalette - sta PARAML0 - lda #0 - jsr setPalette - + ; Set up sprite rendering BITS8 lda #3 @@ -57,6 +51,11 @@ beginGameplay: jsr compileTerrain jsr clipTerrain + ; Set up palette for terrain and players + lda #basePalette + sta PARAML2 + jsr paletteFade + gameplayLoop: lda projectileActive bpl gameplayLoopKeyboardSkip @@ -397,7 +396,7 @@ fire: basePalette: - .word $0aef,$0080,$0080,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0f00,$0bbb,$ddd,$007b,$0a5b,$0000,$0fff + .word $06af,$0072,$0072,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0d00,$0bbb,$ddd,$007b,$0a5b,$0000,$0fff quitRequested: diff --git a/graphics.s b/graphics.s index 6689161..b0d2679 100644 --- a/graphics.s +++ b/graphics.s @@ -151,68 +151,6 @@ disableFillMode: rts -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; setPaletteColor -; Set a single color in a palette -; PARAML0 = 0:Color index -; PARAML1 = 0:R:G:B -; A = Palette index -; -; Trashes X - -setPaletteColor: - asl - asl - asl - asl - asl - sta SCRATCHL - lda PARAML0 - asl - clc - adc SCRATCHL - tax - lda PARAML1 - sta $e19e00,x - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; setPalette -; Set all colors in a palette from memory -; PARAML0 = Pointer to 32 color bytes -; A = Palette index -; -setPalette: - SAVE_XY - - asl - asl - asl - asl - asl - BITS8A - sta setPaletteLoop_SMC+1 - BITS16 - ldx #0 - ldy #0 - -setPaletteLoop: - lda (PARAML0),y -setPaletteLoop_SMC: - sta $e19e00,x ; Self-modifying code! - - iny - iny - inx - inx - cpx #32 - bne setPaletteLoop - - RESTORE_XY - rts - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; drawNumber ; @@ -254,25 +192,10 @@ drawSpriteBankSafe: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; BORDER_COLOR -; -; Trashes A -; -.macro BORDER_COLOR color - SAVE_AXY - BITS8 - lda BORDERCOLOR - and #$f0 - ora color - sta BORDERCOLOR - BITS16 - RESTORE_AXY -.endmacro - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Vertical blank checkers +; Alternate vertical blank checkers ; +.if 0 ; The Brutal Deluxe version, taken from LemminGS ; nextVBL: @@ -322,5 +245,6 @@ waitVBLToStart: BITS16 rts +.endif .include "spritebank.s" diff --git a/gscats.s b/gscats.s index 402cc7f..405fca7 100644 --- a/gscats.s +++ b/gscats.s @@ -20,7 +20,7 @@ mainBank2: BITS8 lda #$f0 sta TEXTCOLOR - BITS16 + BITS16 jmp beginGameplay @@ -31,6 +31,7 @@ quitGame: .include "random.s" +.include "sharedGraphics.s" .include "graphics.s" .include "sound.s" .include "animation.s" diff --git a/loader.s b/loader.s index d5d5a20..0b4ed7a 100644 --- a/loader.s +++ b/loader.s @@ -18,22 +18,6 @@ MAINENTRY = $020000 .org $800 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; BORDER_COLOR -; -; Trashes A -; -.macro BORDER_COLOR color - SAVE_AXY - BITS8 - lda BORDERCOLOR - and #$f0 - ora color - sta BORDERCOLOR - BITS16 - RESTORE_AXY -.endmacro - LOADSTEP = 3 .macro addProgress amount @@ -45,8 +29,6 @@ LOADSTEP = 3 main: BITS16 NATIVE - SHRVIDEO - SHADOWMEMORY ; Cache system colors BITS8 @@ -286,6 +268,8 @@ mainContinue2: lda #returnToProDOS sta PRODOSRETURN + lda #skyPalette + sta PARAML2 jsr paletteFade jml MAINENTRY @@ -410,27 +394,6 @@ soundPath: fontPath: pstring "/GSAPP/FONTBANK" - -loaderPalette: - .word $0aef,$06af,$0800,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0f00,$0bbb,$ddd,$007b,$0a5b,$0000,$0fff - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; showLoadingScreen -; -; -showLoadingScreen: - lda #loaderPalette - sta PARAML0 - lda #0 - jsr setPalette -; jsr initSCBs - BORDER_COLOR #$7 - lda #$1111 - jsr slowColorFill - jsr renderLoadingBar - rts - - - +.include "sharedGraphics.s" .include "loaderGraphics.s" .include "loadingBar.s" diff --git a/loaderGraphics.s b/loaderGraphics.s index f878e2b..2789cc8 100644 --- a/loaderGraphics.s +++ b/loaderGraphics.s @@ -1,3 +1,27 @@ +loaderPalette: + .word $0aef,$06af,$0800,$0861,$0c93,$0eb4,$0d66,$0f9a,$0777,$0f00,$0bbb,$0ddd,$007b,$0a5b,$0000,$0fff + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; showLoadingScreen +; +; +showLoadingScreen: + lda #$0000 + jsr slowColorFill + SHRVIDEO + SHADOWMEMORY + lda #loaderPalette + sta PARAML0 + lda #0 + jsr setPalette + BORDER_COLOR #$7 + lda #$1111 + jsr slowColorFill + jsr renderLoadingBar + rts + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; slowColorFill ; Fills the screen with a color (or two). Slow because it has to run from @@ -31,297 +55,3 @@ slowColorFillLoop: slowColorFillLoopDone: rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; initSCBs -; Initialize all scanline control bytes -; -; Trashes A,X - -initSCBs: - lda #0 - ldx #$0100 ;set all $100 scbs to A - -initSCBsLoop: - dex - dex - sta $e19d00,x - bne initSCBsLoop - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; setScanlinePalette -; Set the palette for a given scan line -; -; PARAML0 = Palette index -; X = Start scan line -; Y = Count - -setScanlinePalette: - pha - -setScanlinePaletteLoop: - lda $e19d00,x - ora PARAML0 - sta $e19d00,x - inx - dey - bne setScanlinePaletteLoop - - pla - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; setPalette -; Set all colors in a palette from memory -; PARAML0 = Pointer to 32 color bytes -; A = Palette index -; -setPalette: - SAVE_XY - - asl - asl - asl - asl - asl - BITS8A - sta setPaletteLoop_SMC+1 - BITS16 - ldx #0 - ldy #0 - -setPaletteLoop: - lda (PARAML0),y -setPaletteLoop_SMC: - sta $e19e00,x ; Self-modifying code! - - iny - iny - inx - inx - cpx #32 - bne setPaletteLoop - - RESTORE_XY - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; setPaletteColor -; Set a single color in a palette -; PARAML0 = 0:Color index -; PARAML1 = 0:R:G:B -; A = Palette index -; -setPaletteColor: - phx - asl - asl - asl - asl - asl - sta SCRATCHL - lda PARAML0 - asl - clc - adc SCRATCHL - tax - lda PARAML1 - sta $e19e00,x - plx - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; getPaletteColor -; Reads a single color from a palette -; X = Color index -; A = Palette index -; A => Color value 0:R:G:B -; -getPaletteColor: - phx - asl - asl - asl - asl - asl - sta SCRATCHL - txa - asl - clc - adc SCRATCHL - tax - lda $e19e00,x - plx - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; paletteFade -; -; PARAML2 = targetPalette -; -paletteFade: - ldy #$f - -paletteFadeTimeLoop: - ldx #$f - -paletteFadeColorLoop: - lda #0 - jsr getPaletteColor - cmp #0 - beq paletteFadeColorLoopSkipColor - - pha ; Fade red channel - and #$0F00 - beq paletteFadeColorLoopSkipR - pla - sec - sbc #$0100 - bra paletteFadeColorLoopG - -paletteFadeColorLoopSkipR: - pla - -paletteFadeColorLoopG: - pha ; Fade green channel - and #$00F0 - beq paletteFadeColorLoopSkipG - pla - sec - sbc #$0010 - bra paletteFadeColorLoopB - -paletteFadeColorLoopSkipG: - pla - -paletteFadeColorLoopB: - pha ; Fade blue channel - and #$000F - beq paletteFadeColorLoopSkipB - pla - dec - bra paletteFadeColorLoopStore - -paletteFadeColorLoopSkipB: - pla - -paletteFadeColorLoopStore: - stx PARAML0 - sta PARAML1 - lda #0 - jsr setPaletteColor - -paletteFadeColorLoopSkipColor: - dex - bpl paletteFadeColorLoop - jsr delayMedium - dey - bpl paletteFadeTimeLoop - - rts - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Vertical blank checkers -; - -; The Brutal Deluxe version, taken from LemminGS -; -nextVBL: - lda #75 - pha -nextVBL0: - lda $e0c02e - and #$7f - cmp 1,s - blt nextVBL0 - cmp #100 - bge nextVBL0 - pla -waitVBL: - lda $e0c018 - bpl waitVBL - rts - - -; The Apple version, taken from GS Tech Note 039 -; -syncVBL: - ;sei - BITS8 -syncVBL0: - ldaA $C02f - asl ; VA is now in the Carry flag - ldaA $C02e - rol ; Roll Carry into bit 0 - cmp #200 ; A now contains line number - blt syncVBL0 - BITS16 - ;cli - rts - -; The old style //e version -; -vblSync: - BITS8 - -waitVBLToFinish: - lda $E0C019 - bmi waitVBLToFinish -waitVBLToStart: - lda $E0C019 - bpl waitVBLToStart - - BITS16 - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; delayShort -; Sleeps for a teeny bit -; -delayShort: - SAVE_AXY - - ldy #$01 ; Loop a bit -delayShortOuter: - ldx #$ff -delayShortInner: - nop - nop - nop - nop - nop - nop - nop - dex - bne delayShortInner - dey - bne delayShortOuter - - RESTORE_AXY - rts - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; delayMedium -; Sleeps for medium time (about 0.25 sec, but not calculated as such) -; -delayMedium: - SAVE_AX - - ldx #$50 -delayMediumInner: - jsr delayShort - dex - bne delayMediumInner - - RESTORE_AX - rts - diff --git a/loadingBar.s b/loadingBar.s index 2f9e26d..7f5d1eb 100644 --- a/loadingBar.s +++ b/loadingBar.s @@ -6,8 +6,8 @@ ; BORDER = $FF -BORDERL = $0F -BORDERR = $F0 +BORDERL = $1F +BORDERR = $F1 FILL = $22 EMPTY = $ee diff --git a/sharedGraphics.s b/sharedGraphics.s new file mode 100644 index 0000000..a74a9b6 --- /dev/null +++ b/sharedGraphics.s @@ -0,0 +1,278 @@ +skyPalette: + .word $06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af,$06af + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; BORDER_COLOR +; +; Trashes A +; +.macro BORDER_COLOR color + SAVE_AXY + BITS8 + lda BORDERCOLOR + and #$f0 + ora color + sta BORDERCOLOR + BITS16 + RESTORE_AXY +.endmacro + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; setPalette +; Set all colors in a palette from memory +; PARAML0 = Pointer to 32 color bytes +; A = Palette index +; +setPalette: + SAVE_XY + + asl + asl + asl + asl + asl + BITS8A + sta setPaletteLoop_SMC+1 + BITS16 + ldx #0 + ldy #0 + +setPaletteLoop: + lda (PARAML0),y +setPaletteLoop_SMC: + sta $e19e00,x ; Self-modifying code! + + iny + iny + inx + inx + cpx #32 + bne setPaletteLoop + + RESTORE_XY + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; setPaletteColor +; Set a single color in a palette +; PARAML0 = 0:Color index +; PARAML1 = 0:R:G:B +; A = Palette index +; +setPaletteColor: + phx + asl + asl + asl + asl + asl + sta SCRATCHL + lda PARAML0 + asl + clc + adc SCRATCHL + tax + lda PARAML1 + sta $e19e00,x + plx + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; getPaletteColor +; Reads a single color from a palette +; Y = Color index +; A = Palette index +; A => Color value 0:R:G:B +; +getPaletteColor: + SAVE_XY + asl + asl + asl + asl + asl + sta SCRATCHL + tya + asl + clc + adc SCRATCHL + tax + lda $e19e00,x + RESTORE_XY + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; paletteFade +; +; PARAML2 = targetPalette +; +paletteFade: + ldx #$f + +paletteFadeTimeLoop: + ldy #$f + +paletteFadeColorLoop: + lda #0 + jsr getPaletteColor + sta SCRATCHL2 + + phy ; Find target red + tya + asl + tay + lda (PARAML2),y + cmp SCRATCHL2 + beq paletteFadeColorLoopSkipColor ; Entire color already matches + and #$0F00 + sta SCRATCHL + ply + + lda SCRATCHL2 ; Fade red channel + and #$0F00 + cmp SCRATCHL + beq paletteFadeColorLoopG + bcs paletteFadeColorLoopDecR + lda SCRATCHL2 + clc + adc #$0100 + sta SCRATCHL2 + bra paletteFadeColorLoopG + +paletteFadeColorLoopDecR: + lda SCRATCHL2 + sec + sbc #$0100 + sta SCRATCHL2 + +paletteFadeColorLoopG: + phy ; Find target green + tya + asl + tay + lda (PARAML2),y + and #$00F0 + sta SCRATCHL + ply + + lda SCRATCHL2 ; Fade green channel + and #$00F0 + cmp SCRATCHL + beq paletteFadeColorLoopB + bcs paletteFadeColorLoopDecG + lda SCRATCHL2 + clc + adc #$0010 + sta SCRATCHL2 + bra paletteFadeColorLoopB + +paletteFadeColorLoopDecG: + lda SCRATCHL2 + sec + sbc #$0010 + sta SCRATCHL2 + +paletteFadeColorLoopB: + phy ; Find target blue + tya + asl + tay + lda (PARAML2),y + and #$000F + sta SCRATCHL + ply + + lda SCRATCHL2 ; Fade blue channel + and #$000F + cmp SCRATCHL + beq paletteFadeColorLoopStore + bcs paletteFadeColorLoopDecB + inc SCRATCHL2 + bra paletteFadeColorLoopStore + +paletteFadeColorLoopDecB: + dec SCRATCHL2 + +paletteFadeColorLoopStore: + sty PARAML0 + lda SCRATCHL2 + sta PARAML1 + lda #0 + jsr setPaletteColor + bra paletteFadeColorLoopDone + +paletteFadeColorLoopSkipColor: + ply + +paletteFadeColorLoopDone: + dey + bpl paletteFadeColorLoopNext + jsr delayFade + jsr delayFade + jsr delayFade + jsr delayFade + jsr delayFade + dex + bpl paletteFadeTimeLoopNext + + rts + +paletteFadeColorLoopNext: + jmp paletteFadeColorLoop +paletteFadeTimeLoopNext: + jmp paletteFadeTimeLoop + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Vertical blank checkers +; + +; The Brutal Deluxe version, taken from LemminGS +; +nextVBL: + lda #75 + pha +nextVBL0: + lda $e0c02e + and #$7f + cmp 1,s + blt nextVBL0 + cmp #100 + bge nextVBL0 + pla +waitVBL: + lda $e0c018 + bpl waitVBL + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; delayFade +; Sleeps for a teeny bit +; +delayFade: + SAVE_AXY + + ldy #$01 ; Loop a bit +delayFadeOuter: + ldx #$ff +delayFadeInner: + nop + nop + nop + nop + nop + nop + nop + dex + bne delayFadeInner + dey + bne delayFadeOuter + + RESTORE_AXY + rts +