From 299eee125741b1668b2240ba422c64c4e2b0a8fe Mon Sep 17 00:00:00 2001 From: giomba Date: Mon, 10 Sep 2018 21:39:53 +0200 Subject: [PATCH] Reorganized memory Now program takes less space in RAM. All variables, costants and Lists are moved before the SID song, in a previously unused space (BASIC RAM). SID song edit has been changed: - same song but slightly different - takes up a bit less than 4k - more catchy :-) - perfectly fits in $1000-$2000 and allows... ...the new custom charset to be put at $2000! - Taken TGGS font and properly customized with tiles Now actual program starts at $2800. Also added some useful code for assembler to output debug infos when assembling with -DDEBUG=1 In the meanwhile discovered tremendous subtle bug due to uninitialized structure (listX and listY). Fixed. Memory map now is: +-------------------------------+ 0000 | things in zero page | | and low RAM | +-------------------------------+ 0800 | BASIC autostart | | then data (variables, | | costants and strings) | <-- this can be done better using segments. Reminder for the future. | | +-------------------------------+ 0E00 | listX | +-------------------------------+ 0F00 | listY | +-------------------------------+ 1000 | SID song | | | | | +-------------------------------+ 2000 | TGGS Custom font charset | | | +-------------------------------+ 2800 | ACTUAL CODE | | | <-- plus some garbage data, see above (segments TODO) . . . . --- amour.sid | Bin 0 -> 3983 bytes multicolor.asm | 97 +++++++++++-------------------------------------- snake.asm | 69 +++++++++++++++++++++-------------- snake.sid | Bin 4236 -> 0 bytes tggs.font | Bin 2048 -> 2048 bytes 5 files changed, 63 insertions(+), 103 deletions(-) create mode 100644 amour.sid delete mode 100644 snake.sid diff --git a/amour.sid b/amour.sid new file mode 100644 index 0000000000000000000000000000000000000000..14bd82a30ebb74fa4c2424f4a9c26101ba87d509 GIT binary patch literal 3983 zcmbUjZE#f8^}hYyWs`j`pXad&`(j`)fKHj)uwb@E^7h1=)d5{R$eYJL8odpXTl>X>cz~m`bDR#3x_iYlF>d+}C zd+xdSo^#Lly?NfNtamHtE#POayz_ox!Q4vW_Ep0B^{eKcT6XUp_1>B8`EHNkTxp=x#eOMm*Re8rC6f9c-*+i#ZiezxS-_D4QlbH4TKUGB5Hmci)z$B+MI)YbgE zX$R(i{BmH&!H;W)Hq_keJ9?MHe#fzP|LJW%`NLy-rol6hUo{=N{P$f~cH3;WpuqLT z1J0nIi+4MN$GC$`&vx#QJ@0Zo`#Hfye_?&R(KM(CxE;r>Z^;M-59|>lkq(AXoehkkba@6CnB_(Mx071OuNze1)qk7Jtaqby)f< zU_u7kpc~~Aa&xFrPN`PZSsWR|jP&B^SPYFBQPC!9LhcAnkq1M$vJxurR_0f@#4`{& zQBfyqib8K;O>Af^6odASAbvm{*s7@!d$To3XMhT-&?h|sN`4%8QP1~bHR3%ymSarM zH>3YsX%w2GEs&5t0C6*TAIL+-htQ}Q+6S#o2;zS5F2Q|Fu|_p!@I9`zLJbaOwy@yH zLSsuAOoz8IPyV<1xjd@wm9MB<<*Vv%h)ty4|6-mZDu%;G}cw~0h=pBP2+S=#z$-|Z9n)97d%pw z5z*qrgOX5Jnc@(i1hEUm0}$tV@pXuo@al}l3KeTH2(1+k z@dU(6`9_?a952yD82A9<)vR~{B09WcRF6>lAr0V_q5;&9=kz{PM0eRzY>63kHmDXz zr(oE?E0p23W89{sYCP8o*pRe8rLCa)P_MKZhPObpTF{k_ynjWN)7U=QW{S)HOW(M!az`Ph&JO8NXKFLB&a!K$3Z%Q{+|HM zo^+8G6HTAH^qo{mPlD1c9iZME0L&hyPWCD0c)qibPRo^>aEb*&D_syTa5idpGf&^qXE1!YbD zdW_`H>j8Q3rI|>YFcO^lm7;i)6Wa=Jv8E93bRt1H<%$tGQCasab<&(uCT z?Fc<4KOKEkehQz2ZnaVFRNWP3yjF>(kPRaq0dW-6RkTZWYAwD^+M9#hnFnbUyQCOZ z;U!IA{CfV}Ug+-bRu4^n{Id6GpG8$q3OA+2%2inJ`FZnJtvKb4?7%XNX}m zpGx4##mGjd++)m(P83P$hMWf(@{QrV^Kph8Y$i{UX{5uzl0I7@dPOWS(@Gi%$sM`H zYV6RnM!3gn>qZCQKC2z~9q@p)7}pl)u)2`uoH<~hiRa9#euaUc$!Cs`d6Wi^WY)XJ zXjRsStgo-{ z?8G4pI`KFWGG zq$_;XVzrHp=29-@7!7C=kN0BdX~thfZJ#KE(QtJ0Vpa`AX-I)L2noD}c$9=277OKz z!#>jCvo_PY(Co8^8#;vYj{4V<%-Yl z-}Fg?f%rIoovDE__)7enbos36o9?e$+`yQ8v;B492FBuBNM0N|?{qr#4o0UhDJdZi zgVCf>v&E{>FuILkwwUotTAxEW;Xjnh#@HVUcPsccNY`Ed1w!9cSo}^QsoJ_4q&2CUY7MJvFuE4|+BRp4 z{Tg(&KwCCW$Mv^pZxc{HgU}|>)>s>8boM;tUh8ae2i9g!U3AxVg987fIveLM@My-} zsQ-pB-Lug%*R#Nb$|@IBE<&uT^dLp7@>Eq))QmJ@AexaIp=nz|<_n4vlbll_`{t!!!gJeJn}D5j1`jSsgTd6d_*1{s-X^FKz$; literal 0 HcmV?d00001 diff --git a/multicolor.asm b/multicolor.asm index 6c0da56..36f2a7f 100644 --- a/multicolor.asm +++ b/multicolor.asm @@ -5,101 +5,47 @@ 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 + ; Make font higher half the inverse of lower one + ; TODO: merge these edits with actual font binary ldx #$00 .tggsCopy dex - lda .tggsFont,x - sta $3800,x + lda tggsFont,x eor #$ff - sta $3c00,x - lda .tggsFont + $100,x - sta $3900,x + sta $2400,x + lda tggsFont + $100,x eor #$ff - sta $3d00,x - lda .tggsFont + $200,x - sta $3a00,x + sta $2500,x + lda tggsFont + $200,x eor #$ff - sta $3e00,x - lda .tggsFont + $300,x - sta $3b00,x + sta $2600,x + lda tggsFont + $300,x eor #$ff - sta $3f00,x + sta $2700,x cpx #$0 bne .tggsCopy - ; Edit character definitions in RAM (using previous defined table) + ; Alter character definitions in RAM (using previous defined table) + ; TODO: merge these edits with actual font binary ldx #$8 .editLoop: dex lda .multicolorSnakeTile,x - sta $3800 + SNAKE_TILE * 8,x + sta tggsFont + SNAKE_TILE * 8,x lda .multicolorFoodTile,x - sta $3800 + FOOD_TILE * 8,x + sta tggsFont + FOOD_TILE * 8,x ; lda .multicolorOtherTile,x -; sta $3800 + SOME_TILE * 8,x +; sta tggsFont + 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 + ; Tell VIC-II to use: + ; - screen text memory at $400 = $400 * 1 + ; - characters ROM at $2000 = $400 * 8 + lda #$18 sta $d018 - - ; Re-enable interrupts and return - cli + rts ; Activate multicolor mode @@ -144,5 +90,4 @@ multicolorOff: BYTE #%00100000 BYTE #%00100000 BYTE #%10000000 -.tggsFont - INCBIN "tggs.font" + diff --git a/snake.asm b/snake.asm index 6b66e05..187ed52 100644 --- a/snake.asm +++ b/snake.asm @@ -25,19 +25,11 @@ printIntroString = $a3 introScreenStart = $fb org $801 -. = $801 ; 10 SYS9216 ($2400) BASIC autostart - BYTE #$0b,#$08,#$0a,#$00,#$9e,#$39,#$32,#$31,#$36,#$00,#$00,#$00 - -; SID tune (previously properly cleaned, see HVSC) -; ---------------------------------------------------------------------- -. = $1000 -sidtune: - INCBIN "snake.sid" +. = $801 ; 10 SYS10240 ($2800) BASIC autostart + BYTE #$0b,#$08,#$0a,#$00,#$9e,#$31,#$30,#$32,#$34,#$30,#$00,#$00,#$00 ; Data section ; ---------------------------------------------------------------------- -. = $2100 - ; Number of interrupt ; Used as counter to be decremented to do some things less frequently irqn: @@ -128,34 +120,40 @@ intro2string: intro3string: BYTE "(C) 2018" BYTE #0 -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 +colorshade: ; a gradient of dark-bright-dark (40 columns) + HEX 0b 0b 0b 0b 0b 0c 0c 0c 0c 0c 05 05 05 0d 0d 0d 0d 07 07 07 07 07 07 0d 0d 0d 0d 05 05 05 0c 0c 0c 0c 0c 0b 0b 0b 0b 0b scoreString: BYTE "POINTS" BYTE #0 +#if DEBUG = 1 + ECHO "End of Data. Space left: ",($e00 - .) +#endif + ; List ; ---------------------------------------------------------------------- -. = $2200 +. = $e00 listX: - -. = $2300 +. = $f00 listY: +; SID tune (previously properly cleaned, see HVSC) +; ---------------------------------------------------------------------- +. = $1000 +sidtune: + INCBIN "amour.sid" +#if DEBUG = 1 + ECHO "End of SIDtune. Space left: ",($2000 - .) +#endif + +. = $2000 +; This binary data that defines the font is exactly 2kB long ($800) +tggsFont: + INCBIN "tggs.font" + ; ENTRY OF PROGRAM ; ---------------------------------------------------------------------- -. = $2400 +. = $2800 start: ; Clear screen, initialize keyboard, restore interrupts jsr $ff81 @@ -288,6 +286,16 @@ upperbarLoop: lda #5 sta length ; Length of the list + ; Clear snake lists X and Y + lda #$0 + ldx #$ff +clearListLoop: + dex + sta listX,x + sta listY,y + cpx #$0 + bne clearListLoop + rts ; Intro reset @@ -393,6 +401,10 @@ checkEndStatus: ; Play music jsr sidtune + 3 + jsr sidtune + 3 + jsr sidtune + 3 + jsr sidtune + 3 + jsr sidtune + 3 ; Increase random value inc random @@ -975,6 +987,9 @@ printIntroEnd: ; ______________________________________________________________________ INCLUDE "multicolor.asm" +#if DEBUG = 1 + ECHO "Program ends at: ",. +#endif ; ; coded during december 2017 ; by giomba -- giomba at glgprograms.it diff --git a/snake.sid b/snake.sid deleted file mode 100644 index 8df7eeb6f1bfb1077223c7662cfdd28c5be16d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4236 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 P>%3kdXJU>|(F*?tsqCb+ diff --git a/tggs.font b/tggs.font index 166e0fa23949a8b1522ae6dfe4a21b9a56d61931..9852410f8accb4e7efb92b842289dafc35bdd36e 100644 GIT binary patch delta 1139 zcmY+DZ)h8J7{{OMb2+5Gp&jo=Gk$S~s|=S1jUOsC+;q}I^BSxYu-(vqLg@6x^Sa|h2o ze}DIUkIM)1!EZ}K`uZe_>e?B}l++2m1Cl?!^_0L1UaXK>c%MF-X zZk#qT{!w#eHGF9iCa*VFxo`d?G$e>`BXKaxLrH1evaGFWH2>Z2Lvg`iXSgOI0wK(& zC_aUV%vo1eb=^Uq5Tf{)NK~JSanGtM&tD{%$1JuHR+wlb1y)cxozBE9MwE%bghCij zQF$L36B4}c75@b^gz@u;=^8kYh*;tUUN`S~K5r}%wRl8|XM@}PAf)J7(|y87A|Z^C z579UIEFL%AoefqXo%YT;E^uf0%9Z6iPVct|TE1${_Nr8SVKg(#Ufm1{nw}KOm1^); zW3TsIfv9E8iZ5L?SiiTwU#TqiYE%zjoX-6C)#sG@XF|2|?N9dp`TJS5qNn_qXN2Ks z1?JM%BD*`Sjn>XCb2}&9la9--cAm;UhTwdoL@f#IN@oKK4Z@4R*!&G$b% zGFQ~kx!4C42XZ&fIzx~`>06EWmmGM6(_xm>C|veykF2|#o7^fJyX=778;l~7} zww=$H5Zea8H=y zo7FmHi~_%f3vZ~AbAobu4A6Mo$g2?m(I*NAD=RAtt(H-({9k&I__f`VJZd%DHf)5_ zC68b*=>g*58G}Me;#HhM-O^Ivj0SE3l7tHnD!C#929*ngfyrn0`NPaRTpEDTdslq| zGWLOO(7R8c{zXyZ=}>5z+jJ!ICa%WV6Bj{?^tlEnM@L8RdoKHTm-UYiA3Gm|!{-Gd z$c#w9=e!FR7f{pE;^x}?d^(%WMs8)Z_A958QIMbaWcnqC);I zkN(q^Uql-m&&S#P%5R+3b(J9qa3#?(+(qX0AeWolySCNw6h}qjlS178@Yk0MTW?SI zkN)z(=nF5$3!i-ofhYq&FwKA*V}OnxSMMwRa_{`Xl24FMSMNyw z(N1#u*qQEkl4Q91)cl!|1R;d$Bua7ZM^Lu#9hKjdV^Mt647Blu zoQ}p)G1c|>BYko-s%Fy}6;yz1u?8&@AXh5I(&?CL#dCsy8#v_)*(@P)dTEJqApO^B zHWNs#9;{X>u$0Rk%JRb6e$K@8Y*Re|j31u=o?_+)@OUJNQUH$Qc~P|66-Cp^ zWnFJH48z2Y55e(*t;aWZ{rZ@%$0qQcqD8#P!rgoK?iP~Xh^AoThwL8v#G!w~G@6D9 zCPp?bN^Sp>`m0qf4O(7`Qq=bYN?XCdhK&^ zMDhfK!El%YR5ux_K*QlMc|UHjIY^iaf$}p?x|}ZbTVSXfZGFHwuz9h18^vfEADKVi zN1q1@emo(j1WIjrw@bCxt;0q;1QSmG<(V6+re5h3WwNn43XU^s)iQIoPfTYq$p%fo|U#o5)z_ zL6qASz}V2@ zBKt8QkV?Vi$_flPgCRCnZoKs#8$T4s*Vs5*KV*(zS7BcfGCO;6eP@S#ppsbDc`CA2 zvx}JtEI<4R<=x#sjCex_2m~(ThW3}Jo&Qj>b9b