diff --git a/.gitignore b/.gitignore index 9ff3d80..b2299f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -snake.prg +*.prg +*.out +symbols.txt diff --git a/Makefile b/Makefile index 56a8051..c396cfc 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,8 @@ 64: - dasm snake.asm -DSYSTEM=64 -osnake.prg + dasm snake.asm -DSYSTEM=64 -DDEBUG=0 -osnake.prg + +debug: + dasm snake.asm -DSYSTEM=64 -DDEBUG=1 -ssymbols.txt -osnake.prg 16: dasm snake.asm -DSYSTEM=16 -osnake.prg diff --git a/multicolor.asm b/multicolor.asm new file mode 100644 index 0000000..6c0da56 --- /dev/null +++ b/multicolor.asm @@ -0,0 +1,148 @@ + processor 6502 + +multicolor SUBROUTINE + +; Prepare data struct for MultiColor mode +; ---------------------------------------------------------------------- +multicolorInit: + ; Deactivate interrupt + ; This is needed to avoid calls from I/O while dealing with bank + ; switching (I/O addresses are the same) + sei + + ; Put char ROM in CPU address space + ; It becomes visible at $d000 + ; This overrides I/O +; lda $1 +; and #$fb +; sta $1 + + ; Copy ROM original content from $d000 to $3800 +; ldx #0 +;.copyLoop: +; lda $d000,x +; sta $3800,x +; lda $d100,x +; sta $3900,x +; lda $d200,x +; sta $3a00,x +; lda $d300,x +; sta $3b00,x +; lda $d400,x +; sta $3c00,x +; lda $d500,x +; sta $3d00,x +; lda $d600,x +; sta $3e00,x +; lda $d700,x +; sta $3f00,x +; inx +; bne .copyLoop + + ; Copy The GGS Font and + ; make higher half the inverse of lower one + ldx #$00 +.tggsCopy + dex + lda .tggsFont,x + sta $3800,x + eor #$ff + sta $3c00,x + lda .tggsFont + $100,x + sta $3900,x + eor #$ff + sta $3d00,x + lda .tggsFont + $200,x + sta $3a00,x + eor #$ff + sta $3e00,x + lda .tggsFont + $300,x + sta $3b00,x + eor #$ff + sta $3f00,x + cpx #$0 + bne .tggsCopy + + ; Edit character definitions in RAM (using previous defined table) + ldx #$8 +.editLoop: + dex + lda .multicolorSnakeTile,x + sta $3800 + SNAKE_TILE * 8,x + lda .multicolorFoodTile,x + sta $3800 + FOOD_TILE * 8,x +; lda .multicolorOtherTile,x +; sta $3800 + SOME_TILE * 8,x +; ... + cpx #$0 + bne .editLoop + + ; Put ROM away from CPU address space, and re-enable I/O +; lda $1 +; ora #$4 +; sta $1 + +; Set foreground color in [8-F] to all locations to enable multicolor mode for every single char +; ldx #0 +; lda #$d +;colorLoop: +; sta $d800,x +; sta $d900,x +; sta $da00,x +; sta $db00,x +; inx +; bne colorLoop + + ; Tell VIC-II to read characters from $3800 = 0xe * 0x400 + lda $d018 + ora #$0e + sta $d018 + + ; Re-enable interrupts and return + cli + rts + +; Activate multicolor mode +; ---------------------------------------------------------------------- +multicolorOn: + ; Set colors + lda #9 + sta $d021 ; 00 is brown + lda #2 + sta $d022 ; 01 is red + lda #13 + sta $d023 ; 10 is green + ; and of course + ; 11 is the colour specified in color RAM + + lda $d016 + ora #$10 + sta $d016 + + rts + +; Deactivate multicolor mode +; ---------------------------------------------------------------------- +multicolorOff: + lda $d016 + and #$ef + sta $d016 + rts + +; Costants +; ---------------------------------------------------------------------- +.multicolorCommodoreTile: + BYTE #$00,#$30,#$cc,#$ca,#$c0,#$c5,#$cc,#$30 +.multicolorSnakeTile: + BYTE #$00,#$28,#$ab,#$ab,#$ab,#$ab,#$28,#$00 +.multicolorFoodTile: + BYTE #%00010101 + BYTE #%10010101 + BYTE #%10010101 + BYTE #%10010101 + BYTE #%10101000 + BYTE #%00100000 + BYTE #%00100000 + BYTE #%10000000 +.tggsFont + INCBIN "tggs.font" diff --git a/snake.asm b/snake.asm index bdb882e..6b66e05 100644 --- a/snake.asm +++ b/snake.asm @@ -103,10 +103,10 @@ SCREEN_W = 40 SCREEN_H = 24 ; Snake features SNAKE_TILE = 81 -SNAKE_COLOR = 5 +SNAKE_COLOR = 13 ; Food features FOOD_TILE = 90 -FOOD_COLOR = 15 +FOOD_COLOR = 11 ; Strings gameoverString: @@ -128,10 +128,19 @@ intro2string: intro3string: BYTE "(C) 2018" BYTE #0 -colorshade: ; a shade from dark-gray to bright yellow, and vice-versa (40 columns) - BYTE #11,#11,#11,#11,#11,#12,#12,#12,#12,#12,#5,#5,#5 - BYTE #13,#13,#13,#13,#7,#7,#7,#7,#7,#7 - BYTE #13,#13,#13,#13,#5,#5,#5,#12,#12,#12,#12,#12,#11,#11,#11,#11,#11 +colorshade: ; a gradient of dark-bright-dark, with only hi-res colors (40 columns) + BYTE #5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5,#5 +; BYTE #6,#6,#6 +; BYTE #2,#2,#2,#2 +; BYTE #5,#5,#5,#5 +; BYTE #7,#7,#7,#7 +; BYTE #3,#3,#3,#3 +; BYTE #1,#1,#1,#1 +; BYTE #3,#3,#3,#3 +; BYTE #7,#7,#7,#7 +; BYTE #5,#5,#5,#5 +; BYTE #2,#2,#2,#2 +; BYTE #6,#6,#6 scoreString: BYTE "POINTS" BYTE #0 @@ -184,6 +193,9 @@ start: lda #0 jsr sidtune + ; Initialize MultiColor mode + jsr multicolorInit + ; Set status as first-time intro playing lda #ST_INTRO0 sta status @@ -224,6 +236,9 @@ endless: ; Full game reset ; ---------------------------------------------------------------------- fullreset: + ; Turn MultiColor mode on + jsr multicolorOn + ; Clear screen ldx #$ff lda #$20 @@ -236,11 +251,9 @@ fullresetCLS: cpx #$ff bne fullresetCLS - ; Set screen colors - lda #12 - sta $d020 ; overscan - lda #9 - sta $d021 ; center + ; Set overscan + lda #11 + sta $d020 ; Upper bar -- fill with reversed spaces, color yellow ldx #39 upperbarLoop: @@ -280,6 +293,8 @@ upperbarLoop: ; Intro reset ; ---------------------------------------------------------------------- introreset: + jsr multicolorOff + ; Clear screen ldx #$ff lda #$20 @@ -292,9 +307,7 @@ introresetCLS: cpx #$ff bne introresetCLS - ; Copy shade colors from costant table to color RAM for 2nd and 4th - ; line of text. Soon there will be some text bouncing on these - ; lines + ; Copy shade colors from costant table to color RAM for 2nd and 4th line of text ldx #39 introresetColorShade lda colorshade,x @@ -307,7 +320,6 @@ introresetColorShade ; Set screen colors lda #0 sta $d020 ; overscan - lda #0 sta $d021 ; center ; Print website @@ -349,6 +361,12 @@ irq: tya pha +#if DEBUG = 1 + ; Change background to visually see the ISR timing + lda #2 + sta $d020 +#endif + ; Check status and call appropriate sub-routine ; Sort of switch-case lda status @@ -377,9 +395,13 @@ checkEndStatus: jsr sidtune + 3 ; Increase random value - ldx random - inx - stx random + inc random + +#if DEBUG = 1 + ; Change background back again to visally see ISR timing + lda #11 + sta $d020 +#endif ; Restore registers from stack pla @@ -949,6 +971,10 @@ printIntroEndCheck: printIntroEnd: rts +; Include +; ______________________________________________________________________ + INCLUDE "multicolor.asm" + ; ; coded during december 2017 ; by giomba -- giomba at glgprograms.it diff --git a/tggs.font b/tggs.font new file mode 100644 index 0000000..166e0fa Binary files /dev/null and b/tggs.font differ