From 17c4339a804c17f6271fc23a11e443a678160b3c Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sun, 30 Apr 2023 00:33:21 +0200 Subject: [PATCH 01/65] Colors experiment --- constants.asm | 8 ++++---- scorch.xex | Bin 56622 -> 56622 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/constants.asm b/constants.asm index 69fbf21..854b04b 100644 --- a/constants.asm +++ b/constants.asm @@ -69,12 +69,12 @@ GradientAddrH .by >dliColorsFore, >dliColorsFore, >dliColorsFore2 dliColorsFore2 ; colors for NTSC .by $0a ; one mountains color - .by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38 - .by $3a,$16,$18,$e6,$e8,$d4,$d6,$b4,$b6,$b6 + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 dliColorsFore2PAL ; colors for PAL .by $0a ; one mountains color - .by $7e,$7a,$7c,$6a,$6c,$58,$5a,$48,$4a,$38 - .by $3a,$16,$18,$e6,$e8,$c4,$c6,$a4,$a6,$a6 + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 ;----------- pmtableL ; addressess of the P/M memory for 6 tanks diff --git a/scorch.xex b/scorch.xex index dd03251bb4b2010feb4e6f1ab2a0d7eba439c78a..39c0ce5e41ec917c0b74afeea9ab989d129e1cc9 100644 GIT binary patch delta 56 zcmZ3ti+SBH<_!yqG^?trva+J0yu7Teq@-TGx^ZL2jvZWRf+tR_Sg~UB$)eOO0O9Kz A^#A|> delta 56 zcmZ3ti+SBH<_!yqH0!ErvT`D#JiIKd#3Y`*xN>dFwryN!f=7-mS+;ER$)eOO0N#5V A#Q*>R From b83e4f716905ff367d92d35d1bcd40eaba1358e8 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 2 May 2023 14:22:53 +0200 Subject: [PATCH 02/65] AI level display --- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56622 -> 56627 bytes textproc.asm | 13 ++++++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/scorch.bin b/scorch.bin index 1801e81cc94ee9f43dadd695f3ed892972347b8c..7f34050c6e0b308e15e679f3f864bc7f76291b4e 100644 GIT binary patch delta 4786 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 ZUV0oQbJly&(Xpb|kv8+4;Mt~mGs6ovt91p*0D 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 diff --git a/scorch.xex b/scorch.xex index 39c0ce5e41ec917c0b74afeea9ab989d129e1cc9..fbc53daa304e5840074dd17cd874ba1b5bbe15f8 100644 GIT binary patch delta 4896 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 JR$ty{_kUb#p6LJp delta 4772 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 Date: Tue, 2 May 2023 17:56:22 +0200 Subject: [PATCH 03/65] RoboTank indicator on status line --- scorch.asm | 2 +- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56627 -> 56626 bytes textproc.asm | 54 ++++++++++++++++++++++++++------------------------- weapons.asm | 4 ++-- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/scorch.asm b/scorch.asm index 5c4a6bf..0df711b 100644 --- a/scorch.asm +++ b/scorch.asm @@ -737,7 +737,7 @@ CheckNextTankAD lda TankStatusColoursTable,x sta COLOR2 ; set color of status line jsr PutTankNameOnScreen - jsr DisplayStatus +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen lda SkillTable,x beq ManualShooting diff --git a/scorch.bin b/scorch.bin index 7f34050c6e0b308e15e679f3f864bc7f76291b4e..7b99faf91129d753feff7aca989f7ee1c1410dd1 100644 GIT binary patch delta 7692 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 delta 7750 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 E2S*(!>;M1& diff --git a/scorch.xex b/scorch.xex index fbc53daa304e5840074dd17cd874ba1b5bbe15f8..5532562e9a5b4d228f5af2770db60a91e3a4452a 100644 GIT binary patch delta 7591 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 delta 7758 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 Y{L7grml=!n)1aqfy)5>;^|^)qUoj|wZU6uP diff --git a/textproc.asm b/textproc.asm index e7d09e9..1984f92 100644 --- a/textproc.asm +++ b/textproc.asm @@ -2030,6 +2030,34 @@ EndOfCredits rts .endp ;------------------------------------------------- +.proc PutTankNameOnScreen +;------------------------------------------------- +; puts name of the tank on the screen + ldy #$00 +; lda TankNr + txa ; TankNr in X ! + asl + asl + asl ; 8 chars per name + tax +NextChar02 + lda tanksnames,x + sta statusBuffer+7,y + inx + iny + cpy #$08 + bne NextChar02 + ; memory !!!! + ldx TankNr + ldy #$5e ; Computer symbol + lda SkillTable,x + bne ThisIsAI + ldy #$0a ; Joystick symbol +ThisIsAI + sty statusBuffer+16 +; rts +.endp +;------------------------------------------------- .proc DisplayStatus ;------------------------------------------------- @@ -2242,32 +2270,6 @@ AngleDisplay rts .endp ;------------------------------------------------- -.proc PutTankNameOnScreen -; puts name of the tank on the screen - ldy #$00 - lda TankNr - asl - asl - asl ; 8 chars per name - tax -NextChar02 - lda tanksnames,x - sta statusBuffer+7,y - inx - iny - cpy #$08 - bne NextChar02 - ; memory !!!! -; ldx TankNr -; ldy #$5e ; Computer symbol -; lda SkillTable,x -; bne ThisIsAI -; ldy #$0a ; Joystick symbol -;ThisIsAI -; sty statusBuffer+16 - rts -.endp -;------------------------------------------------- .proc RoundOverSprites ; fill sprites with bytes ldy numberOfPlayers diff --git a/weapons.asm b/weapons.asm index e5f186e..252e79e 100644 --- a/weapons.asm +++ b/weapons.asm @@ -1082,8 +1082,8 @@ ContinueToCheckMaxForce2 sta ForceTableL,x @ mva #0 Erase - jsr DisplayStatus ;all digital values like force, angle, wind, etc. jsr PutTankNameOnScreen +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen jsr DrawTankNr @@ -2534,7 +2534,7 @@ SpyHardEnd lda TankStatusColoursTable,x sta COLOR2 ; set color of status line jsr PutTankNameOnScreen - jsr DisplayStatus +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen rts .endp ; ------------------------------------------------- From cf0067413612d562e331da1bdd5557105b42e3f9 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 4 May 2023 08:57:30 +0200 Subject: [PATCH 04/65] Small optimization (better AI numbers) --- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56626 -> 56627 bytes textproc.asm | 18 ++++++++---------- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/scorch.bin b/scorch.bin index 7b99faf91129d753feff7aca989f7ee1c1410dd1..d1efd873d2ce401bb9f16444288afdd05e512100 100644 GIT binary patch delta 4730 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 Lg)ZHO1FruI+YtBI delta 4732 zcmZ`c3se+Gw$#jk{ChB{!0;&$9t_AwP{0q13K}#mAHN_94Vd_uL>!cekKeK(#>Tpc`YmlffJV*GwSmXjq8 zueyC#NdGyhqkB*vMH#L2O_WiJBN_(fMnIo-m>J+z$RoD1L#5AK&pP6=ONe{q_~pYbC|ia{4n>q5iz_4dk1?J0#gGe_!yl9Y_t`E46gWZ_4I*6 ztTT=M4ZMZ6f%5%a-p71xL*YA(AaE#(!gN);$|ND@0QZ5>6TelAUwNBTu|=R{xk?`| zY8Xi}9okj^%a_&CxDX55pQnabggYt1K@AdakBZ;JiG<)WQ2)S3d1da8^ zd1pvr)#iI#f_lk9|D|XpDfIV%vDrTi#%um%FeU~>M64|2pRwopb!;!MVZQ)1Z_@yB z0nqwif$)tr`1l&rIg<+kSe90d6MDZ00KEgrLuHUnpc)PW4rv#e75KfcLDFhl-Rjt( z>dUe>NZL1FI<=|hv}0d2b?K)KHD?_4)f65hVL>_QLhsR_cM-}WbZ|JTBPGGJQ9n5o z9D-(&8^K8^g7}2^q0J-##uBnC#0RyJ`VdbSl$)HuJ#g@n!#NoWxDO0bTuxX79v~lw zgu9|#fDLO5lHpRWwEwU{#%cP?jZ)g4Ob?||C&>(Taj(xEsEp>=QEQgvDxx2ijmlhJ zXW0sRQ!ef#Bs4t4P!P>scvQ(|a~DS~*c^};&7FUg%Q9Rqtg~R<{ZER`?jEN^BzYR@ zJ;jpy5=-U3V_6o~PsJ3Ap}?sU+APXdIFQVoyVx%yPk)8#>f5pbVmsAYNY_cOUOluO zav`G#NABl%umt6ieRFkbwRv=M9sHgL2e;6W9KI&of6 zhl=5+vlX1X5*cK$b%nS+h~B7fMfk@xVw8$2q6t?xgI}`^l7XCo>;bjm2`^>UU}sOb zixQm6fOE3|{L~CC7zWDWoEPB7{4^7_F&u~fEXIsBd6F4*U>TicK=h*-Y?c5!#71}^ z1KAScDcc72l9C8tShh!a!#EJ(1>?*}OIAJA>5En~nC9i}PYpHW{0zS|sub zQiB!nLAr`;QaW|7=ra@CUaUQ{4VI=N^Q#@;C{NChLnGwg{BXIA8a8FvEH<0XF{$Jo z88%C?4}bu`Gxi(pS}nNj`l5O@T}ZY^?r@*6-{1k8bmEbMR*Q3LHv60!w5(Ud5sr|@ zkzq(qJfl{k{~_C>qR@w=H7Xh{C%2=rB!4L&r3*YrTC@_?lY`M$5!XvEh(pMa)GfT} zRMo+r*H3n^y(8k7r>`RUi#U`*6pI5;HHlvwh}MzZ#o_2KXTe;c~#)f zv46!Y$%qNBh;ap~`7tq$8AbYXimik|WjioSG%*LzE96;B0GyNG?^dK-YlI-Krfj?P zrNs$)O>qKqr}$CvSH)w+KNd%oM3#J0QmZ+txmN$IE^ylO9YzIRD_4;`yZScYbRo4)IQG4+Nhp+r!IPt>H0*e2?Kf5sL2> zW2+LV<}2FYIMdxFXFGU%RvXP-8?|JwLBxH6?^i*|cjO&`_O(XdlGW0PB@wZ{wy!l} z!~!R_Az862(0$Sw>zkC=2-J2W8E*$16Nd(Lh8j4!2i$3hr@lr;+*(uut2EIZGwNfG z>nVr}$Lxq_nL5Z8GlVFX1VpJcE?hRivjLvN

r~qOygnx@l8f{0vsha16VT%VHr3 z*?caCeH%}Zcb52}MAEuMgCdFdQeUJaE0$)?y2k>2k73;8gC`~*BsS9hq;KgPu3wgk z8pzBVbYF*Hm)P2Z8Hr@kG6i~*Y+M!v1@XwTi1aVZws#H6A6&mq0a=)ojx953(G7`Z z<+4Ne)>Dez&SeQuHaJFDsCz(1?gz*A7;O2OFv@r@QEDS^3w}au7sRfA?o>+q6OT9r z;ApqQpqy5uG+3LyV$3{{r?d}Ajq^o>6vb(0jTCf0flRypEp`0~1)mPz!gWmVC3EAG z(Knf9D}2=Y~6}8lNfRD7yEV%cX3_)J#|l^s&A{-Fd;+B6RgGU z4MEt7gsez#u`1xsi-n%e;x3360GnfqtO-)P;sWGC+^cVtz|DVqjc=n|igT(uRGfRK z($W~*q?8$Bnv@bKEO#rrsjq}d_&QP{jGHFTLwOnMk3Fs|gdS#)U&4OQKr3WzUcb)> z(+oD)MvX6L&~6oijUfyc{3QDj8#BcF8k#3)#N=w5c-f`Zo9OiwoSTV*x13~~>G#MV69T=<59>9Qb}yxW zhtlq%Xjtxo$h3v;y1z{9rRa~yc!IK|{4fa7MgwltgpvZ`&|WHR2xhKXE(2_{;HtxL zCSuI-I5}@9)mgkUCygR4e*tB5Vquyg3KU!=#WDg>(?IB%SnJ6iV*U!G7`@?twvytqSOezvr$% zIDg1yb$=&zIb+b}_%`kqapYdIrv##&UafGct%aQ*h%rsit%Yn5C-Iw z;^OS;dB~1DTpj8-m2cV@Q_2yXsPO4)fC2VGD(^g!m66iGg22gS@JTN3A>r=%(| z7{>P!%g{BlC~2{c<#D|$w14zxM3Yp6-X#-Beje5Zbo>#$g`8#dmU2kNYmkbcKq^|W zA3$%oBsm-?&U%Vm@kihv;BYPTAH)4Gws_X$Nb>AC!^J@HGDhU$k=9k-CKGqH9F%__ z213YC@@x?Ka_YZ$Ti{oSXUfqPnR%x86ipNRD{T~|jiXHXFY1FA%-f8<&Yo54(;V2mbLy3o^=byMI*!|$ z@OTr`p{gCA#BQ=YvV6>k}_-znciKLZ`i zRH8t4ltj|j`Z&X-EVdGGcWCu7l;CW@d;>YM*3C-X4nHP6YiE?0YUD#kkQo`l$~fCp zsfv!$Ixk35+Cy^8D6zDOzxGo;v zPXAgLJ^s*NlOhz?~MR8>QeN z*a_Mf=RBEyksVPd!r9pOHOQzf=AkaZ`^2` zqQys>@Z~1#MZ!}<&>@nQ>Mv@>xox_ePf+;6Wvg&IA*pHBKs(+LUZ zsov8~3vkN)6XrO>Da1c5)Nh+su+mwYY9}KKA8+~<4fJzoM#D*Pnj1NmMuq$a_0|^> zTV;5y_7~y1joe6kCVTxPzDsUwn&b3Yb2N7gdc#`-x8TOk2k7Z^PZFGN15I{Rx>9zm z89-ap=QzE7(uKRV0|Mh( zQ$Tp_ydd-xVdVa1w|OGD{A>Lyli+A!CzNN|8 zq3W|=7$-cu7p`OqtF%*pr%v@+Z5x-I-+5MwE|Q+Nj#_g(`z`mqYX^C4m+Q1ky!Mpa MrR%+_UB{gMA7@zb_y7O^ diff --git a/scorch.xex b/scorch.xex index 5532562e9a5b4d228f5af2770db60a91e3a4452a..33483f5b55816d38522789269deb538c398edaae 100644 GIT binary patch delta 4857 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 o@q1sZ&DXBt5btYk^!3iZ Date: Thu, 4 May 2023 19:19:12 +0200 Subject: [PATCH 05/65] Basic graphics routines in separate file and optimizations --- gr_basics.asm | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++ grafproc.asm | 204 +-------------------------------------------- scorch.asm | 13 +-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56627 -> 56609 bytes 5 files changed, 228 insertions(+), 213 deletions(-) create mode 100644 gr_basics.asm diff --git a/gr_basics.asm b/gr_basics.asm new file mode 100644 index 0000000..b7dbe55 --- /dev/null +++ b/gr_basics.asm @@ -0,0 +1,224 @@ +.IF *>0 ;this is a trick that prevents compiling this file alone + +; Basic hardware-dependent graphics routines. + +; ----------------------------------------- +.proc unPlot +; plots a point and saves the plotted byte, reverts the previous plot. +; ----------------------------------------- + ldx #0 ; only one pixel +unPlotAfterX + stx WhichUnPlot + + ; first remake the oldie + lda oldplotL,x + sta oldplot + lda oldplotH,x + sta oldplot+1 + + lda oldply,x + tay + lda oldora,x + sta (oldplot),y + + + ; is it not out of the screen ???? + cpw ydraw #screenheight + jcc CheckX + mwa #0 ydraw +CheckX + cpw xdraw #screenwidth + jcs EndOfUnPlot +MakeUnPlot + ; let's count coordinates taken from xdraw and ydraw + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr +;--- + tay + ldx WhichUnPlot + tya + sta oldply,x + + ldx ydraw + lda linetableL,x + sta xbyte + sta oldplot + lda linetableH,x + sta xbyte+1 + sta oldplot+1 + + lda xdraw + and #$7 + tax + + lda color + bne ClearUnPlot + + ;plotting here + lda (xbyte),y + sta OldOraTemp + ora bittable,x + sta (xbyte),y + bne ContinueUnPlot ; allways <>0 +ClearUnPlot + lda (xbyte),y + sta OldOraTemp + and bittable2,x + sta (xbyte),y +ContinueUnPlot + ldx WhichUnPlot + lda OldOraTemp + sta oldora,x + lda oldplot + sta oldplotL,x + lda oldplot+1 + sta oldplotH,x + ; and now we must solve the problem of several plots + ; in one byte + ldx #4 + ldy WhichUnPlot +LetsCheckOverlapping + cpx WhichUnPlot + beq SkipThisPlot + lda oldplotL,x + cmp oldplotL,y + bne NotTheSamePlot + lda oldplotH,x + cmp oldplotH,y + bne NotTheSamePlot + lda oldply,x + cmp oldply,y + bne NotTheSamePlot + ; the pixel is in the same byte so let's take correct contents + lda oldora,x + sta oldora,y +NotTheSamePlot +SkipThisPlot + dex + bpl LetsCheckOverlapping +EndOfUnPlot + rts +.endp + +; ----------------------------------------- +.proc plot ;plot (xdraw, ydraw, color) +; color == 1 --> put pixel +; color == 0 --> erase pixel +; this is one of the most important routines in the whole +; game. If you are going to speed up the game, start with +; plot - it is used by every single effect starting from explosions +; through line drawing and small text output!!! +; +; Optimized by 0xF (Fox) THXXXX!!! + +; ----------------------------------------- + ; is it not over the screen ??? + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + bcs unPlot.EndOfUnPlot ;nearest RTS +CheckX02 + cpw xdraw #screenwidth + bcs EndOfPlot +MakePlot + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + lda color + bne ClearPlot + + lda (xbyte),y + ora bittable,x + sta (xbyte),y +EndOfPlot + rts +ClearPlot + lda (xbyte),y + and bittable2,x + sta (xbyte),y + rts +.endp + +; ----------------------------------------- +.proc point_plot +; ----------------------------------------- + ; checks state of the pixel (coordinates in xdraw and ydraw) + ; result is in A (zero or appropriate bit is set) + + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidht = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + + lda (xbyte),y + eor #$ff + and bittable,x + rts +.endp + +;-------------------------------------------------- +.proc ClearScreen +;-------------------------------------------------- + mwa #display temp + ldy #0 +@ lda #$ff + sta (temp),y + inw temp + cpw temp #display+screenheight*screenBytes+1 + bne @- + rts +.endp + +;-------------------------------------------------- +.proc GenerateLineTable + + mwa #display temp + mwa #linetableL temp2 + mwa #linetableH modify + ldy #0 +@ lda temp + sta (temp2),y + lda temp+1 + sta (modify),y + adw temp #40 + iny + cpy #screenheight+1 + bne @- + rts +.endp + +.ENDIF \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index a3fe794..c69f73f 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -473,19 +473,6 @@ endcircleloop RTS .endp -;-------------------------------------------------- -.proc ClearScreen -;-------------------------------------------------- - mwa #display temp - ldy #0 -@ lda #$ff - sta (temp),y - inw temp - cpw temp #display+screenheight*screenBytes+1 - bne @- - rts -.endp - ;-------------------------------*------------------ .proc placetanks ;-------------------------------------------------- @@ -1643,195 +1630,10 @@ NotHigher rts .endp -; ----------------------------------------- -.proc unPlot -; plots a point and saves the plotted byte, reverts the previous plot. -; ----------------------------------------- - ldx #0 ; only one pixel -unPlotAfterX - stx WhichUnPlot +;--------------------------------------------------- + icl 'gr_basics.asm' +;--------------------------------------------------- - ; first remake the oldie - lda oldplotL,x - sta oldplot - lda oldplotH,x - sta oldplot+1 - - lda oldply,x - tay - lda oldora,x - sta (oldplot),y - - - ; is it not out of the screen ???? - cpw ydraw #screenheight - jcc CheckX - mwa #0 ydraw -CheckX - cpw xdraw #screenwidth - jcs EndOfUnPlot -MakeUnPlot - ; let's count coordinates taken from xdraw and ydraw - mwa xdraw xbyte - - lda xbyte - and #$7 - sta ybit - - lsrw xbyte - rorw xbyte - rorw xbyte -;--- - ldy xbyte - - ldx WhichUnPlot - tya - sta oldply,x - - - ldx ydraw - lda linetableL,x - sta xbyte - sta oldplot - lda linetableH,x - sta xbyte+1 - sta oldplot+1 - ldx ybit - - - lda color - bne ClearUnPlot - - ;plotting here - lda (xbyte),y - sta OldOraTemp - ora bittable,x - sta (xbyte),y - jmp ContinueUnPlot -ClearUnPlot - lda (xbyte),y - sta OldOraTemp - and bittable2,x - sta (xbyte),y -ContinueUnPlot - ldx WhichUnPlot - lda OldOraTemp - sta oldora,x - lda oldplot - sta oldplotL,x - lda oldplot+1 - sta oldplotH,x - ; and now we must solve the problem of several plots - ; in one byte - ldx #4 - ldy WhichUnPlot -LetsCheckOverlapping - cpx WhichUnPlot - beq SkipThisPlot - lda oldplotL,x - cmp oldplotL,y - bne NotTheSamePlot - lda oldplotH,x - cmp oldplotH,y - bne NotTheSamePlot - lda oldply,x - cmp oldply,y - bne NotTheSamePlot - ; the pixel is in the same byte so let's take correct contents - lda oldora,x - sta oldora,y -NotTheSamePlot -SkipThisPlot - dex - bpl LetsCheckOverlapping -EndOfUnPlot - rts -.endp - -; ----------------------------------------- -.proc plot ;plot (xdraw, ydraw, color) -; color == 1 --> put pixel -; color == 0 --> erase pixel -; this is one of the most important routines in the whole -; game. If you are going to speed up the game, start with -; plot - it is used by every single effect starting from explosions -; through line drawing and small text output!!! -; -; Optimized by 0xF (Fox) THXXXX!!! - -; ----------------------------------------- - ; is it not over the screen ??? - cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - bcs unPlot.EndOfUnPlot ;nearest RTS -CheckX02 - cpw xdraw #screenwidth - bcs EndOfPlot -MakePlot - ; let's calculate coordinates from xdraw and ydraw - - ;xbyte = xbyte/8 - lda xdraw+1 - lsr - lda xdraw - ror ;just one bit over 256. Max screenwidth = 512!!! - lsr - lsr - sta xbyte - ;--- - ldx ydraw - ldy linetableL,x - lda linetableH,x - sta xbyte+1 - - lda xdraw - and #$7 - tax - lda color - bne ClearPlot - - lda (xbyte),y - ora bittable,x - sta (xbyte),y -EndOfPlot - rts -ClearPlot - lda (xbyte),y - and bittable2,x - sta (xbyte),y - rts -.endp - -; ----------------------------------------- -.proc point_plot -; ----------------------------------------- - ; checks state of the pixel (coordinates in xdraw and ydraw) - ; result is in A (zero or appropriate bit is set) - - ; let's calculate coordinates from xdraw and ydraw - - ;xbyte = xbyte/8 - lda xdraw+1 - lsr - lda xdraw - ror ;just one bit over 256. Max screenwidht = 512!!! - lsr - lsr - sta xbyte - ;--- - ldx ydraw - ldy linetableL,x - lda linetableH,x - sta xbyte+1 - - lda xdraw - and #$7 - tax - - lda (xbyte),y - eor #$ff - and bittable,x - rts -.endp ;-------------------------------------------------- .proc TypeChar ; puts char on the graphics screen diff --git a/scorch.asm b/scorch.asm index 0df711b..39e8d3f 100644 --- a/scorch.asm +++ b/scorch.asm @@ -322,18 +322,7 @@ no5200splash jsr SelectNextGradient.NotWind ; generate linetables - mwa #display temp - mwa #linetableL temp2 - mwa #linetableH modify - ldy #0 -@ lda temp - sta (temp2),y - lda temp+1 - sta (modify),y - adw temp #40 - iny - cpy #screenheight+1 - bne @- + jsr GenerateLineTable .IF TARGET = 800 diff --git a/scorch.bin b/scorch.bin index d1efd873d2ce401bb9f16444288afdd05e512100..a614b7850a7894b13bd8e44f3a309ad4d6574c1a 100644 GIT binary patch delta 7923 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 Ub=IUABB6U@y>p(qU+T>LAF{n}NdN!< delta 7758 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 DMW_m) diff --git a/scorch.xex b/scorch.xex index 33483f5b55816d38522789269deb538c398edaae..87efd6871eb8faced66ebd604abc915ff135ba32 100644 GIT binary patch delta 7813 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 delta 7778 zcmZuW30M?Y($h1XBham4WKiItcmO7%CW1zd#$%DRL6IYB)ZtLUQE^b?2?Iz2B7@*l zE*%|?p3ul}su6xCm_Ly?XiO&?-OVPNjT$1mt2-Kv$GY;@>p`P`f_~la)vKykuex4c zQ`Mnp>rgZ=PNJT)MJHWVjBbq*WX2g4W8LzZ$Huq{ne3eS*f^~H?dXa%0D2(ExcAV; z<#>JRM7%8dRb8N-i4kJ-gJT36*C+IG20?~?jxrvrUMx7H_iqStJ@pN0jY7;qK@JOO z!~5vYasUKe4!MaYCD}(;(TRoVpNkN`5Jjx8gU%y;BuZtGVgX=&yimceWKrHC*j=MP zC+FTrPc{kzfS(H*y#^hLLamriStK9G;)Il0g zI+~S%8n+;Y7Dui9lkVm&_Jc^1x!V#-+gvQ=v`vA+_jfZkSU0V+xY3-Z9+pG}JNaGE z$luW5T>{0`nKTxc7=4!<^{%zVyV-ouv@(+hd1}x*i_ETHTZfAZl)j67!zJ5oyM}CwvMoQT9Hj@4Hi|%Rsvh0v(ods{c!mGbiifiwEDIy zjeaSGJ+6k*D88UpBe96v$$xC~MQbvU^9Q_!ONW!>YAkceF@iRCGryS9b2SY|Xwk`} zDK`|- ^%;Z%k>v>b`JLKEnyk7N}K@aLM)VR1VfVm*P?rW_55O5-@sY5HjA=u*TD{2^9ZN*7;q$X@?slfKCm_M~f2I!AL+IQOFMGFI{=h)83F)vjbJ&8g8>K=09qZz8dxS^Hxc-b6BQ_7IZO#_h3L#Lo9~Ca zcF@iqG2D{&fid{|9p2tQEI;Ea-t*$MDN0UTEbmD(%J|J!*0`Y`FtamnqIAS|>4<7j zoQAs&7Xa+u2@OBYey~C^aDZP&%`2qCARV^u97+8zzO~c)ZMbv?R|whqC=bC?zt{s# zQq2f``YOg)Ea?ywCcI5F?m;x}4;mMS1zcz3f)8A3>7wEJyGBs2<8`}yJeyVv*<6y~ z$*roE6&+=Yj0}pxhFwTEB{8QHJzj}6CE7LW4DwuN*G7@^vjfytC;LlMi3eOa+BVhd z4=}$3&>ne-pP8!}#=WbP@og|N`8l2Jy_GO=Z8+LL;XBXvG|RajR!}HfcXHyb?Tgug1;$mU{VthQ^ zU-uwJbZS@8SH{FP11R3;CD0{FMqhy`N%G>8QeNS<@T*c}+y_9z9YeO&CM^N0o`c5# z*zzETYd}q_jVi&RB#Cv57v}1Bc?jY9bPwSZ{Twoy>tWKi?}+Bg+B2iM@>*?68Id5~ zIBkd^D@i(c28oY&E%GSijuH0MGxpMk7948?zHqWMqryo$IxU}hMC`_bi!)xM*5S^K zX;c(`k};F|0#Db41v@3E1FnZ?$5k^SF14NQsSNu@0=)MzCQV(KMMXav6Khb>mcjI+ z2iT~4bpjE~Ld5cFDcc?wTT*6CDs~VOOUfi&4qZtYxl4>p8gOXrTKrU}3KJuf>)26= z*4IQgAsFITm7$y_^KqiHFq2zOhOff#jD0vBhJD-$fa1u^Ag`JwhUv8B`Nl0}VZBsI z8N0TvBy#}uy4^@&cM`1X``x}K$!_O`O+6Z3bJi^OsKJb-OTpc+ypF}J;0SIt%sc41 z_Scu{cl%q;*hhK(=;o?tm%e)Rm0y@--{XIdajBue7R)?<2)(whBMaev|qXPu?A@y1A;M zhN&LizRy2UXGO(MR&}%7b>M6AihcftAg*F{wTmS=n$ude_~+eIs7csA zXDB?Ua;ehKPlO~7A3DGj&U||eG$a<^>Ih1NfAc~An|c=28lQ_h&Uum(sAz#N{B+nrIOQx zuu`P+G|C!vo{*%}=aPH`N9GQ9Riq?`8>xD*!OgkjeZgJIxGh`*SmOIMxz5^@!El|^ zQoxCzCj3dR-y-l7Bh8bRmS~gf&XLn9*ncFSak9AxvWj50bK<>fM@sIhQV8FlTBg%${?g@tH>^%#|+E$w(<{uM& zev!`xP>y9Y%{2($^@E%6|LmErB%7#f&H3$bVR=D06^#!SOr&<>iv=U8Q}}MdYjW3A zJYw&=^3fY`+TH*v5|`~AMWtcO-VxM6{P(@SUiUUE4Ck-8`!O~J`fMBju^7rHhD?I6 z`byzM)x8Y>>&X=5Jz0F#**wvK&pexJQ?PwFzL2F3;l@I*;W?>Yd%}3G*M;Nw{IH+0 zdmX%1aa=yTAQc_L*9s@AMZfGun>u6*&5I*eC?Lj-Tu6)!k*S~xtPAj-QEyAqUL zTJescATWG&pI0D!CpCPhcmV%m2XE^E)SkrW;9GVM*smCk|Ba7*S<EH^=&D`40mrFuR0J=vU_`)M4w zfAuu7FXWj{urK8CWLpKxZYG~Xg1ZsUBS`>|*t{Siv6l1u-*)gwmfeWUaLRDk?V=BCRfoRcW|XyPxr7!i zoV7#?2J$@~ejr2+Ro}Y@!l}RDvIC)DvR@tulTX=-T@NmIELO0eZo{`reX#c6&|!_M z7`{$)Z%NY6WPJD-NTfIr3nn00?ZF-H1f(W%k~e;OQ03f`G{0{;AA^sUs;JJk_R`rD z^%nkb**61gOSRmLWY~FiDfoD|?rl#YVO8=PO`2F?S>N9@N zX`j>W>M9oRz@0d$Hu_5eMsRi;JcM?4~mH4 zI(UP-M^-57cKvbg}rIJ@y)?0RFgj;rGgsZ>F_#xw`jDKg`&zPVK(e>)`GmA3YGukr_ zXVqj0SyOh;-rbbdp4FN4P1bi=*Rp!EY*}}*A7uYGJ7)Lz-5nX@bJSqx26Uszgr^)H zw&-DwFpz74JFMcGKzj!97I>5<@g9MqZ!?fg2Zi*!+SN7YdWJIzZk!>EKi})fod+Lr z0o^ZvYTEW#^#IQDdb8eNWTU*9vw!l#@$ClscI}YP8xVQ zJGs7_xpwg)4QL?>b_$+nM8QGZL1#^(Qg{WP4uT&cEftiY1B$DMd+D9p@ASM=af#6z z7Fo|c5WzrDMHgu_-A)9qj2({88v`gkwiyjWzu#uQ1J2~)UHal38iww7q07N;z_nEi zscZOtRRla|R*x9>!$HuyqcI6wmYQt-eB=6_dcOW_Q}Hhlo9b@n)`Kv(sM?!4j)iIj z#NE{sV!b2TkdWfl76WtM2d)7?cyv;eM z3;g=Y+C*J1$*jP$29z=iw5`CTfq+*R=xBSbJkY^5qdZV9D%iVw%=FjRJ{VQ!TOUX- zXiEilT3tjpXiP!vat_L(%W7y;x!C8Y)Yi8|SLnnc-3s=Ve5<<{LfUeDQcX{CHt20Z z>rA251uS2vKvnw#R>1aA`=!ns81-c~yuexnJN4yT_rYuG9%}=<1{PRLL|1<0{620a zUnK18DX`9f*USRzbO>()`h7qh?7N`-`Vw|gJ}F)l?7IaZa3$M{r<#KNGxIE&v|%$8cC=vw&BAm8 zShEtw#a}+%Otar&&J?K2%mXHdFj(uAmK1<^bu%4u72bR$lv7X{SyjylJ|r<=0s2zV zgd$l?pN-%O#|_Yvg7KekY`DK)$ zoB_-FUw%r50*v6)fbk%guVr1-So4@LeC1ac~C6? z0^Rh1ZV+0?c|f&XCE5@rRfG!GEuS=gO2HVdlbavuV?3dgNZO%s_|}J`lrt9vl!iEf zPc>lQ246h2ZV33mg>@S}V)p{oPhrARdq}ugmrO_rln_UKh3kbl*K6y>AtpqD zreS4$Fy)IU*H574;N_cp<_mV%}iq|*#%Hi((t$vtSO%ZUv zMlJ$7uL$lGd66-8KQ_kYog(Wf8<|Wy_Bw^I_SksZ2Wkb#I-uH@ZZK{-<~{OKso-w^ zw2-v^cEt(K=UlfP?_bA)om}=p@-!3sG>nzI?8Sd-$f9mwYr`~G-!h8|l6&?h_AsYY z7jU6@l+Tl`?2>&J8N;b9jtpGv^Kh{*z{QqvA4BGU(L50_8hr`Xl6~+W;E>}8pF>JU z68ImXAc~NPSg_2W} zOxGYacnuLW9GNsF6lUyx~gE$usP4a-{Axbo*5`7M>ZJP^vTtP;eTq(%BTwT~jBV8q51DBMq zg}V#wbT#^VtJSyIq1R26Lwa9DqPb9n&o`@}A&aw`2Zut!xy9;OOj6T2v_ndEuQt*> zTfj|93rfj@N^9&O{0xh*7*5T`H=9RzLf|HO2ZSI4B)L{k5eW_0x5e9O)-L$yKjIlJ zugsOa<~8Ue+Mr=*8zs4`(gSQ4e&&vx>xe7*3EN$fv;@p-Iw^(j|1h|sW!Ta=2O#}2 z2!r58i_-|oycbc(x3kpIR+;E%sixsv%vGq8VFcd%Y8}mH+o`L8n#2Kc%h2cUI>;Wv zAhSm+IZ|-zFzQGAr`9=g$f)(LK|_4B?AHgn8FECAem4dy7h1z2frGs~c-lx4c2dsH zW*?N~wXc9b;H#{IYzoj3Yy`#zg_cR<1u~I50c1^qN)mDuk|Zo{%ZGdMeH-@cE7c#N z)x;OMLjB+ zBBP9W9EajZR*&ZUfluq&C6cmmHToHQobYn`_d=r|yB?1_5lV&Nq!Tm!|Gf~6T*P03 z-y^`K!%q@W)Wfe5tj2&E%h9*xXbL`i;eTEgIqH7Wm(U>1tm&PI&z$teV?T16@W%v6&-of1(0aoQ z_aqCi`siZ^pqh!toSN#OJA@wK2d8}fnumDtmr@+9#^y-w5__vMjK2iQ?4_oKBiVXMIUQR zU{enNejzW`HorEl9s1bX_6PW8d*FcQmeC%Ehj$E%TYMNyZ7Z<~3ao-|zK<3k?%FEe z29qQ}e*gyc1EElUj_CU$B6OQ0>`TwlaZ$(6;e-=IIQ<@BD*mKH#Z0v$7=4KqgTc1_ zqa(yscc`}R`w|u+NWN!WRYR_$lp}wQuTDf+Yq2c1?zg@ld^ME(z zuP>-Ne)g-|_f<1f@{X9!-Bo&pz8RgkqqNpw|2uNz2(J9hpEBappM@%G`Tjps+mp|3 zIZ|KZe{>%h+bM8&`G=}Ag5g(hOP9CJ-%5$zmLuL?=@-4dPIr56|Fd8?;@y6;&2;`v c%E^8*{PTtB?vta96QOZpuL#>Fd|{*i50V*gRR910 From 569cbddfe216efd7e9ef4502f907beb1e995d603 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 4 May 2023 21:10:45 +0200 Subject: [PATCH 06/65] Prepare for versions on other 6502 machines. --- .../display_main_menu.asm | 0 .../display_purchasedl.asm | 0 .../display_static.asm | 0 .../display_status.asm | 0 gr_basics.asm => Atari/gr_basics.asm | 0 interrupts.asm => Atari/interrupts.asm | 0 {lib => Atari/lib}/5200MACRO.ASM | 0 {lib => Atari/lib}/5200SYS.ASM | 0 {lib => Atari/lib}/ATARISYS.ASM | 0 {lib => Atari/lib}/MACRO.ASM | 0 textproc.asm => Atari/textproc.asm | 0 game.asm | 1156 ++++++++++++++++ grafproc.asm | 2 +- scorch.asm | 1176 +---------------- 14 files changed, 1173 insertions(+), 1161 deletions(-) rename display_main_menu.asm => Atari/display_main_menu.asm (100%) rename display_purchasedl.asm => Atari/display_purchasedl.asm (100%) rename display_static.asm => Atari/display_static.asm (100%) rename display_status.asm => Atari/display_status.asm (100%) rename gr_basics.asm => Atari/gr_basics.asm (100%) rename interrupts.asm => Atari/interrupts.asm (100%) rename {lib => Atari/lib}/5200MACRO.ASM (100%) rename {lib => Atari/lib}/5200SYS.ASM (100%) rename {lib => Atari/lib}/ATARISYS.ASM (100%) rename {lib => Atari/lib}/MACRO.ASM (100%) rename textproc.asm => Atari/textproc.asm (100%) create mode 100644 game.asm diff --git a/display_main_menu.asm b/Atari/display_main_menu.asm similarity index 100% rename from display_main_menu.asm rename to Atari/display_main_menu.asm diff --git a/display_purchasedl.asm b/Atari/display_purchasedl.asm similarity index 100% rename from display_purchasedl.asm rename to Atari/display_purchasedl.asm diff --git a/display_static.asm b/Atari/display_static.asm similarity index 100% rename from display_static.asm rename to Atari/display_static.asm diff --git a/display_status.asm b/Atari/display_status.asm similarity index 100% rename from display_status.asm rename to Atari/display_status.asm diff --git a/gr_basics.asm b/Atari/gr_basics.asm similarity index 100% rename from gr_basics.asm rename to Atari/gr_basics.asm diff --git a/interrupts.asm b/Atari/interrupts.asm similarity index 100% rename from interrupts.asm rename to Atari/interrupts.asm diff --git a/lib/5200MACRO.ASM b/Atari/lib/5200MACRO.ASM similarity index 100% rename from lib/5200MACRO.ASM rename to Atari/lib/5200MACRO.ASM diff --git a/lib/5200SYS.ASM b/Atari/lib/5200SYS.ASM similarity index 100% rename from lib/5200SYS.ASM rename to Atari/lib/5200SYS.ASM diff --git a/lib/ATARISYS.ASM b/Atari/lib/ATARISYS.ASM similarity index 100% rename from lib/ATARISYS.ASM rename to Atari/lib/ATARISYS.ASM diff --git a/lib/MACRO.ASM b/Atari/lib/MACRO.ASM similarity index 100% rename from lib/MACRO.ASM rename to Atari/lib/MACRO.ASM diff --git a/textproc.asm b/Atari/textproc.asm similarity index 100% rename from textproc.asm rename to Atari/textproc.asm diff --git a/game.asm b/game.asm new file mode 100644 index 0000000..75b3cf9 --- /dev/null +++ b/game.asm @@ -0,0 +1,1156 @@ +.IF *>0 ;this is a trick that prevents compiling this file alone + +; All main procedures of the game not dependent on hardware (I hope) :) + +START + jsr MakeDarkScreen + ; Startup sequence + jsr Initialize + + ;jsr GameOverScreen ; only for test !!! + + RMTSong song_main_menu + + jsr Options ;startup screen + jsr SetVariablesFromOptions + jsr MakeDarkScreen + bit escFlag + bmi START + + jsr EnterPlayerNames + jsr MakeDarkScreen + bit escFlag + bmi START + + jsr RandomizeSequence + ; for the round #1 shooting sequence is random + +MainGameLoop + jsr SetWallsType + ; first set default barrel lengths (fix for Long Schlong activation :) ) + ; we must do it before purchase/activate + ; and set Auto Defense to off + jsr SetStandardBarrels + + jsr CallPurchaseForEveryTank + jsr MakeDarkScreen + bit escFlag + bmi START + + jsr GetRandomWind + + jsr RoundInit + + jsr MainRoundLoop + bit escFlag + bmi START + jvs GoGameOver + + jsr SortSequence + + mva #0 TankNr ; + sta COLBAKS ; set background color to black + sta JoystickNumber ; set joystick port for player + + ; Hide all (easier than hide last ;) ) tanks + jsr cleartanks ; A=0 + + ; here gains and losses should be displayed (dollars) + ; finally we have changed our minds and money of players + ; is displayed only in weapons shop + + ; Results are number of other deaths + ; before the player dies itself + + RmtSong song_round_over + jsr DisplayResults + + jsr DemoModeOrKey + jsr MakeDarkScreen + + ldx NumberOfPlayers + dex +CalculateGains + ; add gains and substract losses + ; gain is what player gets for lost energy of opponents + ; energy lost by opponents is added during Round and + ; little below in source, multiplied by 2 to get "dollars". + ; By analogy, loss is energy that given player losses during + ; each Round. + ; Important! If player has 10 energy and gets a central hit + ; from nuke that would take 90 energy points, his loss + ; is 90, not 10 + + ; adding the remaining energy of the tank to gain + ; winner gets more ! :) + lda Energy,x + adc gainL,x + sta gainL,x + bcc @+ + inc gainH,x +@ + ; add gain * 2 + asl gainL,x + rol gainH,x + clc + lda moneyL,x + adc gainL,x + sta moneyL,x + lda moneyH,x + adc gainH,x + sta moneyH,x + ; substract lose + ; if lose is greater than money then zero money + lda moneyH,x + cmp loseH,x + bcc zeromoney + bne substractlose + lda moneyL,x + cmp loseL,x + bcc zeromoney +substractlose + sec + lda moneyL,x + sbc loseL,x + sta moneyL,x + lda moneyH,x + sbc loseH,x + sta moneyH,x + jmp skipzeroing +zeromoney + lda #0 + sta moneyL,x + sta moneyH,x +skipzeroing +; and earned money for summary + clc + lda EarnedMoneyL,x + adc gainL,x + sta EarnedMoneyL,x + lda EarnedMoneyH,x + adc gainH,x + sta EarnedMoneyH,x + ; substract lose + ; if lose is greater than money then zero money + lda EarnedMoneyH,x + cmp loseH,x + bcc ezeromoney + bne esubstractlose + lda EarnedMoneyL,x + cmp loseL,x + bcc ezeromoney +esubstractlose + sec + lda EarnedMoneyL,x + sbc loseL,x + sta EarnedMoneyL,x + lda EarnedMoneyH,x + sbc loseH,x + sta EarnedMoneyH,x + jmp eskipzeroing +ezeromoney + lda #0 + sta EarnedMoneyL,x + sta EarnedMoneyH,x +eskipzeroing + + dex + jpl CalculateGains + + lda GameIsOver + beq NoGameOverYet +GoGameOver + jsr GameOverScreen + jmp START +NoGameOverYet + inc CurrentRoundNr + mva #sfx_silencer sfx_effect + + jmp MainGameLoop + + +;-------------------------------------------------- +.proc RoundInit +;-------------------------------------------------- +; at the beginning of each Round we set energy +; of all players to 99 +; the maximum shooting energy to 990 (it is 10*energy) +; the default shooting energy to 350 +; the shooting angle is randomized +; of course gains an loses are zeroed + + RmtSong song_ingame + + jsr SetPMWidth ; A=0 + lda #0 + sta AfterBFGflag ; reset BFG flag + sta COLOR2 ; status line "off" + sta COLOR1 + + tax +@ sta singleRoundVars,x + inx + cpx #(singleRoundVarsEnd-singleRoundVars) + bne @- + + ldx #(MaxPlayers-1) +SettingEnergies + lda #$00 + sta gainL,x + sta gainH,x + sta loseL,x + sta loseH,x + lda #99 + sta Energy,x + sta eXistenZ,x + sta LASTeXistenZ,x + ; anything in eXistenZ table means that this tank exist + ; in the given round + lda #<1000 + sta MaxForceTableL,x + lda #>1000 + sta MaxForceTableH,x + lda #<350 + sta ForceTableL,x + lda #>350 + sta ForceTableH,x + + ;lda #(255-45) + ;it does not look good when all tanks have + ;barrels pointing the same direction + ;so it would be nice to have more or less random + ;angles + jsr RandomizeAngle + sta AngleTable,x + + dex + bpl SettingEnergies + +;generating the new landscape + jsr PMoutofScreen ;let P/M disappear + jsr clearscreen ;let the screen be clean + jsr ClearPMmemory + jsr placetanks ;let the tanks be evenly placed + jsr calculatemountains ;let mountains be easy for the eye + ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height + + + mwa #StatusBufferROM temp + mwa #StatusBufferCopy temp2 + mwa #StatusBufferCopyEnd+1 modify + jsr CopyFromROM + + jsr SetMainScreen + jsr ColorsOfSprites + + jsr drawmountains ;draw them + jsr drawtanks ;finally draw tanks + + mva #$00 TankSequencePointer + +;---------round screen is ready--------- + mva #TextForegroundColor COLOR1 ; status line "on" + rts +.endp + +;-------------------------------------------------- +.proc MainRoundLoop +; here we must check if by a chance there is only one +; tank with energy greater than 0 left +;-------------------------------------------------- + + ldy #0 ; in Y - number of tanks with energy greater than zero + sty ATRACT ; reset atract mode + ldx NumberOfPlayers + dex +CheckingIfRoundIsFinished + lda eXistenZ,x + beq NoEnergy + iny +NoEnergy + dex + bpl CheckingIfRoundIsFinished + + cpy #2 ; is it less than 2 tanks have energy >0 ? + bcs DoNotFinishTheRound + +;points for the last living tank + ldx NumberOfPlayers + dex +WhichTankWonLoop + lda eXistenZ,x + bne ThisOneWon + dex + bpl WhichTankWonLoop + ;error was here!!! + ; somehow I believed program will be never here + ; but it was a bad assumption + ; god knows when there is such a situation + ; (we've got a SITUATION here, if you know what I mean) + ; there are two tanks left. + ; one of them is killed by the second tank + ; second tank explodes and kills the first one. + ; and code lands here... + ; looks like no one won! + rts + +ThisOneWon + lda CurrentResult + clc + adc ResultsTable,x + sta ResultsTable,x + + rts ; this Round is finished + +DoNotFinishTheRound + ; Seppuku here + lda noDeathCounter + cmp seppukuVal + bcc @+ + + mva #0 noDeathCounter + mva #sfx_seppuku sfx_effect + + jsr DisplaySeppuku + jmp Seppuku + +@ + ; Auto Defense - activates defensives + ldx NumberOfPlayers + dex +CheckNextTankAD + lda Energy,x ; only active players + beq @+ + lda AutoDefenseFlag,x ; with Auto Defence activated + beq @+ + ; run auto defense for tank in X + jsr AutoDefense +@ dex + bpl CheckNextTankAD + jsr DrawTanks ; redraw tanks with new defences +; + ldx TankSequencePointer + lda TankSequence,x + sta TankNr + tax + lda Energy,x ;skip if no energy + jeq NextPlayerShoots + + + + mva #$ff plot4x4color + jsr DisplayTankNameAbove + + mva #1 color ;to display flying point + + ldx tankNr + lda TankStatusColoursTable,x + sta COLOR2 ; set color of status line + jsr PutTankNameOnScreen +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + + lda SkillTable,x + beq ManualShooting + +RoboTanks + ; robotanks shoot here + ; TankNr still in X + jsr ArtificialIntelligence + ;pause 30 + ldx TankNr + jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) + jsr MoveBarrelToNewPosition + lda kbcode + cmp #@kbcode._esc ; 28 ; ESC + bne @+ + jsr AreYouSure +@ lda escFlag + seq:rts ; keys Esc or O + + + jmp AfterManualShooting + +ManualShooting + lda JoyNumber,x + sta JoystickNumber ; set joystick port for player + jsr WaitForKeyRelease + lda #%00000000 + sta TestFlightFlag ; set "Test Fight" off + jsr BeforeFire + lda escFlag + seq:rts ; keys Esc or O + +AfterManualShooting + mva #$00 plot4x4color + jsr DisplayTankNameAbove + ; defensive weapons without flight handling + ldx TankNr + lda ActiveDefenceWeapon,x + cmp #ind_Hovercraft_____ + beq GoFloat + cmp #ind_White_Flag_____ ; White Flag + beq ShootWhiteFlag + cmp #ind_Nuclear_Winter_ + bne StandardShoot +ShootAtomicWinter + ; --- atomic winter --- + jsr AtomicWinter + jmp NextPlayerShoots ; and we skip shoot +ShootWhiteFlag + ; --- white flag --- + jsr WhiteFlag + jmp NextPlayerShoots ; and we skip shoot +GoFloat + jsr TankFlying + lda #0 + sta ActiveDefenceWeapon,x ; deactivate after use + bit escFlag + bpl ManualShooting ; after floating tank can shoot + rts +StandardShoot + inc noDeathCounter + + jsr DecreaseWeaponBeforeShoot + jsr DisplayStatus + +; ldx TankNr + dec Energy,x ; lower energy to eventually let tanks commit suicide + +ShootNow + jsr Shoot + ;here we clear offensive text (after a shoot) + ldy TankNr + mva #$00 plot4x4color + jsr DisplayOffensiveTextNr + + lda HitFlag ;0 if missed + beq missed + + jsr Explosion + +continueMainRoundLoopAfterSeppuku + +AfterExplode + jsr SoilDown2 ; allways +NoFallDown2 + ;here tanks are falling down + mva tankNr tempor2 + ldx NumberOfPlayers + dex +TanksFallDown + stx TankNr + lda eXistenZ,x + beq NoExistNoFall + jsr TankFalls +NoExistNoFall + dex + bpl TanksFallDown + mvx tempor2 TankNr + +missed + ldy WeaponDepleted + bne @+ + ldx TankNr + tya + sta ActiveWeapon,x +@ + + ;here we clear offensive text (after a shoot) + ldy TankNr + mva #$00 plot4x4color + jsr DisplayOffensiveTextNr + +NextPlayerShoots + ;before it shoots, the eXistenZ table must be updated + ;accordingly to actual energy (was forgotten, sorry to ourselves) + + ldx #(MaxPlayers-1) +SeteXistenZ + lda Energy,x + sta eXistenZ,x + + jsr MaxForceCalculate + + dex + bpl SeteXistenZ + + ;was setup of maximum energy for players + + +PlayersAgain + +; In LASTeXistenZ there are values of eXistenZ before shoot +; from the next tank. +; Now it must be checked if by a chance something that had +; LASTeXistenZ>0 is not equal to 0 right now, +; because it means this tank died during this round. +; Most important thing is: +; after each explosion of the tank these operations must be +; performed from the beginning! +; (it is made by another jump into the after explosion routines) +; It is because exploding tank can destroy their neighbours, +; additionally this tank just have had LASTeXistenZ set to 0, +; otherwise it would explode again and again. +; OK, text how to do it is ready, now comes coding . +; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ + + mva #sfx_next_player sfx_effect + + ldx NumberOfPlayers + dex +CheckingPlayersDeath + lda LASTeXistenZ,x + beq NoPlayerNoDeath + lda eXistenZ,x + beq PlayerXdeath +NoPlayerNoDeath + dex + bpl CheckingPlayersDeath + ; if processor is here it means there are no more explosions + + inc:lda TankSequencePointer + cmp NumberOfPlayers + bne NotLastPlayerInRound + mva #0 TankSequencePointer + + lda WindChangeInRound + beq NoWindChangeNow + jsr GetRandomWind ; wind change after each turn (not round only) +NoWindChangeNow +NotLastPlayerInRound + jmp MainRoundLoop +.endp + +;--------------------------------- +.proc PlayerXdeath +; this tank should not explode anymore: +; there is 0 in A, and Tank Number in X, so... +;--------------------------------- + + sta LASTeXistenZ,x + ; save x somewhere + stx TankTempY + + ;clear NoDeathCounter here + sta noDeathCounter + + mva #sfx_death_begin sfx_effect + + ; display defensive text here (well, defensive + ; is not the real meaning, it should be pre-death, + ; but I am too lazy to change names of variables) + + ; in X there is a number of tank that died + + lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") + bit AfterBFGflag ; check BFG flag + bmi TextAfterBFG + ; if BFG then no points for dead tanks ... + lda CurrentResult + clc + adc ResultsTable,x + sta ResultsTable,x + ;inc CurrentResult + + ; RandomizeDeffensiveText + randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) +TextAfterBFG + sta TextNumberOff + inc CurrentResult ; ... but increase result of winner (BFG) + ldy TankTempY + mva #$ff plot4x4color + jsr DisplayOffensiveTextNr + ; tank flash + ldy TankTempY + mva TankNr temp2 ; not elegant, and probably unnecessary + sty TankNr + jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) + mva temp2 TankNr + + ;Deffensive text cleanup + ;here we clear Deffensive text (after a shoot) + ldy TankTempY + mva #$00 plot4x4color + jsr DisplayOffensiveTextNr + + ; calculate position of the explosion (the post-death one) + ldx TankTempY + clc + lda xtankstableL,x + adc #4 ; more or less in the middle of the tank + sta xdraw + lda xtankstableH,x + adc #0 + sta xdraw+1 + sec + lda ytankstable,x + sbc #4 + sta ydraw + lda #0 + sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit + + ;cleanup of the soil fall down ranges (left and right) + sta RangeRight + sta RangeRight+1 + mwa #screenwidth RangeLeft + + ; We are randomizing the weapon now. + ; jumping into the middle of the explosion + ; routine +MetodOfDeath + lda random + and #%00011111 ; range 0-31 + cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) + bcs MetodOfDeath + tay + lda weaponsOfDeath,y + jsr ExplosionDirect + mva #sfx_silencer sfx_effect + + ; Clear current Shooter settings. After that, Shooter will "search" for the target again + ldx NumberOfPlayers + dex +@ lda skillTable,x + cmp #2 ; clear variables only if Shooter + bne NotShooter + lda #0 + sta PreviousAngle,x + sta PreviousEnergyL,x + sta PreviousEnergyH,x +NotShooter + dex + bpl @- + + ; jump to after explosion routines (soil fallout, etc.) + ; After going through these routines we are back + ; to checking if a tank exploded and maybe we have + ; a deadly shot here again. + jmp MainRoundLoop.AfterExplode +.endp + +;-------------------------------------------------- +.proc DecreaseEnergyX +;Decreases energy of player nr X by the value Y +;increases his financial loss +;increases gain of tank TankNr +;-------------------------------------------------- + sty EnergyDecrease + ; Lose increase + lda loseL,x + clc + adc EnergyDecrease + sta loseL,x + lda loseH,x + adc #$00 + sta loseH,x + ; Energy now, not less than 0 + lda Energy,x + cmp EnergyDecrease + bcc ldahashzero + ;sec + sbc EnergyDecrease + bpl NotNegativeEnergy +ldahashzero + lda #0 +NotNegativeEnergy + sta Energy,x + ;now increase the gain of the shooting tank + ldy TankNr + clc + lda gainL,y + adc EnergyDecrease + sta gainL,y + lda gainH,y + adc #$00 + sta gainH,y + rts +.endp + +;-------------------------------------------------- +.proc DecreaseShieldEnergyX +; Decreases energy of shield player nr X by the value Y +; if shield energy is 0 after decrease then in Y we have +; rest of the energy - to decrease tank energy +;-------------------------------------------------- + sty EnergyDecrease + ldy #0 ; if Shield survive then no decrease tank anergy + ; Energy cannot be less than 0 + lda ShieldEnergy,x + cmp EnergyDecrease + bcc UseAllShieldEnergy + ;sec + sbc EnergyDecrease + bpl NotNegativeShieldEnergy ; jump allways +UseAllShieldEnergy + ; now calculate rest of energy for future tank energy decrease + sec + lda EnergyDecrease + sbc ShieldEnergy,x + tay + lda #0 +NotNegativeShieldEnergy + sta ShieldEnergy,x + rts +.endp + +;--------------------------------- +.proc Seppuku +;--------------------------------- + lda #0 + sta ydraw+1 + ; get position of the tank + ldx TankNr +; lda #0 ; turn off defense weapons when hara-kiring + sta ActiveDefenceWeapon,x + sta ShieldEnergy,x + jsr SetupXYdraw + lda #1 ; Missile + jsr ExplosionDirect + jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku +.endp + +;-------------------------------------------------- +.proc GetRandomWind +;in: MaxWind (byte) +;out: Wind (word) +;uses: _ +;-------------------------------------------------- + lda random + cmp MaxWind + bcs GetRandomWind ; if more than MaxWind then randomize again + sta Wind + mva #$00 Wind+1 + sta Wind+2 + sta Wind+3 + ; multiply Wind by 16 + ; two bytes of Wind are treated as a decimal part of vx variable + :4 aslw Wind + ; decide the direction + lda random + and #$01 + beq @+ + sec ; Wind = -Wind + .rept 4 + lda #$00 + sbc Wind+# + sta Wind+# + .endr +@ rts +.endp +;-------------------------------------------------- +.proc MaxForceCalculate +; calculates max force for tank (tanknr in X) +; Energy of tank X in A +;-------------------------------------------------- + sta L1 + + ;DATA L1,L2 + ;Multiplication 8bit*8bit, + ;result 16bit + ;this algiorithm is a little longer than one in Ruszczyc 6502 book + ;but it is faster + + ldy #8 + lda #0 + clc +LP0 ror + ror L1 + bcc B0 + clc + adc #10 ; (L2) multiplication by 10 +B0 dey + bne LP0 + ror + ror L1 + sta MaxForceTableH,x + lda L1 + sta MaxForceTableL,x + rts +.endp + +;-------------------------------------------------- +.proc WeaponCleanup +; cleaning of the weapon possesion tables +; 99 of Baby Missles and White Flags, all other weapons=0) +;-------------------------------------------------- + ldx #(number_of_weapons - 1) +@ lda #$0 + cpx #ind_White_Flag_____ ; White Flag + bne no99 +set99 lda #99 +no99 sta TanksWeapon1,x + sta TanksWeapon2,x + sta TanksWeapon3,x + sta TanksWeapon4,x + sta TanksWeapon5,x + sta TanksWeapon6,x + dex + beq set99 ; Baby Missile (index=0) + bpl @- + rts +.endp + +;-------------------------------------------------- +.proc Initialize +;Initialization sequence +;uses: temp, ... +;-------------------------------------------------- +deletePtr = temp + + ; clean variables + lda #0 + sta escFlag + sta JoystickNumber + tay + mwa #variablesStart deletePtr +@ tya + sta (deletePtr),y + inw deletePtr + cpw deletePtr #variablesEnd + bne @- + + ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) + ldy #1 + sty TankShape+1 + sty TankShape+4 + iny + sty TankShape+2 + sty TankShape+5 + + + mwa #1024 RandBoundaryHigh + mva #$ff LastWeapon + sta HowMuchToFall + mva #1 color + + jsr SetStandardBarrels + jsr WeaponCleanup + + mva #>WeaponFont chbas + + ;parameter for old plot (unPlot) max 5 points + ldx #4 +SetunPlots + lda #display + sta oldplotH,x + lda #0 + sta oldply,x + lda #$ff + sta oldora,x + dex + bpl SetunPlots + + ;setting up P/M graphics + lda #>pmgraph + sta pmbase + lda #$03 ; P/M on + sta GRACTL + jsr SetPMWidth + lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 + sta GPRIOR + jsr PMoutofScreen + + ;let the tanks be visible! + ldx #(maxPlayers-1) + lda #99 ; tank is visible +MakeTanksVisible + sta eXistenZ,x + dex + bpl MakeTanksVisible + + mva #1 CurrentRoundNr ;we start from round 1 + mva #6 NTSCcounter + + rts +.endp +;-------------------------------------------------- +.proc SetStandardBarrels +; set standart barrel length and deactivate Auto Defense +; for all tanks +;-------------------------------------------------- + ldx #maxPlayers-1 +@ lda #StandardBarrel ; standard barrel length + sta BarrelLength,x + lda #$00 ; deactivate Auto Defense + sta AutoDefenseFlag,x + dex + bpl @- + rts +.endp +;---------------------------------------------- +/* .proc RandomizeSequence0 + ldx #0 +@ txa + sta TankSequence,x + inx + cpx #MaxPlayers + bne @- + rts +.endp */ +;-------------------------------------------------- +.proc RandomizeSequence +; in: NumberOfPlayers +; out: TankSequence +; how: get random number lower than NumberOfPlayers +; put it in the first slot. +; get another random number lower than NumberOfPlayers +; check if was previously saved in first slot +; if not then save it in second slot +; repeat untill NumberOfPlayers + + ldx #0 +GetRandomAgain0 + lda RANDOM + and #$07 ;NumberOfPlayers < 7 + cmp NumberOfPlayers + bcs GetRandomAgain0 + sta TankSequence,x + ;now first slot is ready, nexts slots are handled + ;in a more complicated way + +GetRandomAgainX + lda RANDOM + and #$07 ;NumberOfPlayers < 7 + cmp NumberOfPlayers + bcs GetRandomAgainX + + ;now we have to check if the value was not used + ;in previous slots + + stx temp + ldy temp +UsageLoop + cmp TankSequence,y + beq GetRandomAgainX ;apparently we have already used this value + dey + bpl UsageLoop + + ;well, looks like this value is new! + inx + sta TankSequence,x + + stx temp + inc:lda temp ;x+1 + + cmp NumberOfPlayers + bne GetRandomAgainX + rts +.endp +;---------------------------------------------- +.proc RandomizeAngle +; routine returns in A +; a valid angle for the tank's barrel. +; X is not changed +;---------------------------------------------- + + ; lets randomize someting between 0 and 180 + lda RANDOM + cmp #180 + bcs RandomizeAngle + rts +.endp +;---------------------------------------------- +.proc RandomizeForce +; routine returns in ForceTable/L/H +; valid force of shooting for TankNr +; in X must be TankNr +; low and high randomize boundary passed as word value +; RandBoundaryLow +; RandBoundaryHigh +;---------------------------------------------- + + lda RANDOM + sta temp2 + lda RANDOM + and #%00000011 ;(0..1023) + sta temp2+1 + + cpw RandBoundaryLow temp2 + seq:bcs RandomizeForce + + cpw RandBoundaryHigh temp2 + bcc RandomizeForce + + lda temp2 + sta ForceTableL,x + lda temp2+1 + sta ForceTableH,x + +;--------- +LimitForce +; in X must be TankNr +; cuts force to MaxForceTable + lda MaxForceTableH,x + cmp ForceTableH,x + bne @+ + lda MaxForceTableL,x + cmp ForceTableL,x +@ bcs @+ + + lda MaxForceTableL,x + sta ForceTableL,x + lda MaxForceTableH,x + sta ForceTableH,x +@ + rts + +.endp +;---------------------------------------------- +.proc Table2Force +;---------------------------------------------- + lda ForceTableL,x + sta Force + lda ForceTableH,x + sta Force+1 + rts +.endp +;---------------------------------------------- +.proc MoveBarrelToNewPosition +;---------------------------------------------- + mva #1 Erase + jsr DrawTankNr.BarrelChange + mva #0 Erase +MoveBarrel + mva #sfx_set_power_2 sfx_effect + jsr DrawTankNr + jsr DisplayStatus.displayAngle +; ldx TankNr + mva #1 Erase + jsr WaitOneFrame + jsr DrawTankNr.BarrelChange + mva #0 Erase + lda NewAngle + cmp AngleTable,x + beq BarrelPositionIsFine + bcc rotateLeft +rotateRight ; older is lower + inc angleTable,x + jmp MoveBarrel +rotateLeft ; older is bigger + dec angleTable,x + jmp MoveBarrel +BarrelPositionIsFine + jsr DrawTankNr + rts + +.endp + +;---------------------------------------------- +.proc SortSequence ; +;---------------------------------------------- +; here we try to get a sequence of tanks for two +; purposes: +; 1. to make up shooting sequence for the next round (from down to top) +; 2. to display game results more nicely (from top to down) +; +; I think I will go for a stupid bubble sort... +; it is easy to test :) +; +; Results are in ResultsTable, in TankSequence (Sorted Table) we want to +; have numbers of tanks from the worst to the best. +; in other words, if ResultsTable=(5,4,65,23,3,6) +; the TankSequence=(4,1,0,5,3,2) +; let's assume initially the TankSequence=(0,1,2,3,4,5) + + ldx #0 +SequenceStart + txa + sta TankSequence,x + inx + cpx #MaxPlayers + bne SequenceStart + +; we will need a TempResults (TR) table to fiddle with + ldx #0 +movetotemp + lda ResultsTable,x + sta TempResults,x + inx + cpx NumberOfPlayers + bne movetotemp + +; i=0:sortflag=0 +;loop: +; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers +; or goto loop: +; else +; temp=TR(i): tempo=TankSequence(i) +; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) +; TR(i+1)=temp: TankSequence(i+1)=tempo +; i=i+1 +; sortflag=sortflag+1 +; go loop: +; if sortflag=0 then finished, else repeat... +; +; or something like this :) + ldx NumberOfPlayers + dex + stx temp+1 ; for checking end of the loop only + +Bubble + ldx #0 ;i=x + stx temp2 ; sortflag=temp2 + +BubbleBobble + lda TempResults,x + cmp TempResults+1,x + bcc nextishigher + bne swapvalues +nextisequal + ; if results are equal, check Direct Hits + ldy TankSequence,x + lda DirectHits,y + ldy TankSequence+1,x + cmp DirectHits,y + ; + beq nextishigher ; this is to block hangs when 2 equal values meet + bcc nextishigher + ;here we must swap values + ;because next is smaller than previous +swapvalues + sta temp + lda TempResults+1,x + sta TempResults,x + lda temp + sta TempResults+1,x + ; + lda TankSequence,x + sta temp + lda TankSequence+1,x + sta TankSequence,x + lda temp + sta TankSequence+1,x + inc temp2 +nextishigher + inx + cpx temp+1 ;cpx ^NumberOfPlayers-1 + bne BubbleBobble + + lda temp2 + + bne Bubble + + rts +.endp +;-------------------------------------------------- +.proc SetWallsType +;-------------------------------------------------- + mva #0 WallsType + lda OptionsTable+8 + cmp #4 + beq SetRandomWalls + lsr + ror WallsType + lsr + ror WallsType + rts +SetRandomWalls + lda random + and #%11000000 + sta WallsType + rts +.endp + +.ENDIF \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index c69f73f..30930aa 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1631,7 +1631,7 @@ NotHigher .endp ;--------------------------------------------------- - icl 'gr_basics.asm' + icl 'Atari/gr_basics.asm' ;--------------------------------------------------- ;-------------------------------------------------- diff --git a/scorch.asm b/scorch.asm index 39e8d3f..a139adc 100644 --- a/scorch.asm +++ b/scorch.asm @@ -152,8 +152,8 @@ FirstZpageVariable = $57 ;----------------------------------------------- .IF TARGET = 5200 OPT h-f+ ; no headers, single block --> cart bin file - icl 'lib/5200SYS.ASM' - icl 'lib/5200MACRO.ASM' + icl 'Atari/lib/5200SYS.ASM' + icl 'Atari/lib/5200MACRO.ASM' .enum @kbcode /* _0 @@ -192,8 +192,8 @@ FirstZpageVariable = $57 .ende .ELSE - icl 'lib/ATARISYS.ASM' - icl 'lib/MACRO.ASM' + icl 'Atari/lib/ATARISYS.ASM' + icl 'Atari/lib/MACRO.ASM' icl 'artwork/splash_v2/splash.asm' ; splash screen and musix .ENDIF @@ -215,26 +215,26 @@ WeaponFont DisplayCopyRom = * org display, DisplayCopyRom DisplayCopyStart - icl 'display_main_menu.asm' + icl 'Atari/display_main_menu.asm' DisplayCopyEnd org DisplayCopyRom + (DisplayCopyEnd - DisplayCopyStart) DisplayCopyPurchaseDlROM = * org DisplayCopyPurchase, DisplayCopyPurchaseDlROM DisplayCopyPurchaseStart - icl 'display_purchasedl.asm' + icl 'Atari/display_purchasedl.asm' DisplayCopyPurchaseEnd org DisplayCopyPurchaseDlROM + (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart) StatusBufferROM = * org StatusBufferCopy, StatusBufferROM StatusBufferCopyStart - icl 'display_status.asm' + icl 'Atari/display_status.asm' StatusBufferCopyEnd org StatusBufferROM + (StatusBufferCopyEnd - StatusBufferCopyStart) - icl 'display_static.asm' + icl 'Atari/display_static.asm' ;---------------------------------------------- ;-------------------------------------------------- @@ -380,1157 +380,13 @@ NoRMT_PALchange VMAIN VBLinterrupt,7 ;jsr SetVBL mva #2 chactl ; necessary for 5200 + +;-------------------------------------------------- +; Main program of the game + icl 'game.asm' +;-------------------------------------------------- + -START - jsr MakeDarkScreen - ; Startup sequence - jsr Initialize - - ;jsr GameOverScreen ; only for test !!! - - RMTSong song_main_menu - - jsr Options ;startup screen - jsr SetVariablesFromOptions - jsr MakeDarkScreen - bit escFlag - bmi START - - jsr EnterPlayerNames - jsr MakeDarkScreen - bit escFlag - bmi START - - jsr RandomizeSequence - ; for the round #1 shooting sequence is random - -MainGameLoop - jsr SetWallsType - ; first set default barrel lengths (fix for Long Schlong activation :) ) - ; we must do it before purchase/activate - ; and set Auto Defense to off - jsr SetStandardBarrels - - jsr CallPurchaseForEveryTank - jsr MakeDarkScreen - bit escFlag - bmi START - - jsr GetRandomWind - - jsr RoundInit - - jsr MainRoundLoop - bit escFlag - bmi START - jvs GoGameOver - - jsr SortSequence - - mva #0 TankNr ; - sta COLBAKS ; set background color to black - sta JoystickNumber ; set joystick port for player - - ; Hide all (easier than hide last ;) ) tanks - jsr cleartanks ; A=0 - - ; here gains and losses should be displayed (dollars) - ; finally we have changed our minds and money of players - ; is displayed only in weapons shop - - ; Results are number of other deaths - ; before the player dies itself - - RmtSong song_round_over - jsr DisplayResults - - jsr DemoModeOrKey - jsr MakeDarkScreen - - ldx NumberOfPlayers - dex -CalculateGains - ; add gains and substract losses - ; gain is what player gets for lost energy of opponents - ; energy lost by opponents is added during Round and - ; little below in source, multiplied by 2 to get "dollars". - ; By analogy, loss is energy that given player losses during - ; each Round. - ; Important! If player has 10 energy and gets a central hit - ; from nuke that would take 90 energy points, his loss - ; is 90, not 10 - - ; adding the remaining energy of the tank to gain - ; winner gets more ! :) - lda Energy,x - adc gainL,x - sta gainL,x - bcc @+ - inc gainH,x -@ - ; add gain * 2 - asl gainL,x - rol gainH,x - clc - lda moneyL,x - adc gainL,x - sta moneyL,x - lda moneyH,x - adc gainH,x - sta moneyH,x - ; substract lose - ; if lose is greater than money then zero money - lda moneyH,x - cmp loseH,x - bcc zeromoney - bne substractlose - lda moneyL,x - cmp loseL,x - bcc zeromoney -substractlose - sec - lda moneyL,x - sbc loseL,x - sta moneyL,x - lda moneyH,x - sbc loseH,x - sta moneyH,x - jmp skipzeroing -zeromoney - lda #0 - sta moneyL,x - sta moneyH,x -skipzeroing -; and earned money for summary - clc - lda EarnedMoneyL,x - adc gainL,x - sta EarnedMoneyL,x - lda EarnedMoneyH,x - adc gainH,x - sta EarnedMoneyH,x - ; substract lose - ; if lose is greater than money then zero money - lda EarnedMoneyH,x - cmp loseH,x - bcc ezeromoney - bne esubstractlose - lda EarnedMoneyL,x - cmp loseL,x - bcc ezeromoney -esubstractlose - sec - lda EarnedMoneyL,x - sbc loseL,x - sta EarnedMoneyL,x - lda EarnedMoneyH,x - sbc loseH,x - sta EarnedMoneyH,x - jmp eskipzeroing -ezeromoney - lda #0 - sta EarnedMoneyL,x - sta EarnedMoneyH,x -eskipzeroing - - dex - jpl CalculateGains - - lda GameIsOver - beq NoGameOverYet -GoGameOver - jsr GameOverScreen - jmp START -NoGameOverYet - inc CurrentRoundNr - mva #sfx_silencer sfx_effect - - jmp MainGameLoop - - -;-------------------------------------------------- -.proc RoundInit -;-------------------------------------------------- -; at the beginning of each Round we set energy -; of all players to 99 -; the maximum shooting energy to 990 (it is 10*energy) -; the default shooting energy to 350 -; the shooting angle is randomized -; of course gains an loses are zeroed - - RmtSong song_ingame - - jsr SetPMWidth ; A=0 - lda #0 - sta AfterBFGflag ; reset BFG flag - sta COLOR2 ; status line "off" - sta COLOR1 - - tax -@ sta singleRoundVars,x - inx - cpx #(singleRoundVarsEnd-singleRoundVars) - bne @- - - ldx #(MaxPlayers-1) -SettingEnergies - lda #$00 - sta gainL,x - sta gainH,x - sta loseL,x - sta loseH,x - lda #99 - sta Energy,x - sta eXistenZ,x - sta LASTeXistenZ,x - ; anything in eXistenZ table means that this tank exist - ; in the given round - lda #<1000 - sta MaxForceTableL,x - lda #>1000 - sta MaxForceTableH,x - lda #<350 - sta ForceTableL,x - lda #>350 - sta ForceTableH,x - - ;lda #(255-45) - ;it does not look good when all tanks have - ;barrels pointing the same direction - ;so it would be nice to have more or less random - ;angles - jsr RandomizeAngle - sta AngleTable,x - - dex - bpl SettingEnergies - -;generating the new landscape - jsr PMoutofScreen ;let P/M disappear - jsr clearscreen ;let the screen be clean - jsr ClearPMmemory - jsr placetanks ;let the tanks be evenly placed - jsr calculatemountains ;let mountains be easy for the eye - ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height - - - mwa #StatusBufferROM temp - mwa #StatusBufferCopy temp2 - mwa #StatusBufferCopyEnd+1 modify - jsr CopyFromROM - - jsr SetMainScreen - jsr ColorsOfSprites - - jsr drawmountains ;draw them - jsr drawtanks ;finally draw tanks - - mva #$00 TankSequencePointer - -;---------round screen is ready--------- - mva #TextForegroundColor COLOR1 ; status line "on" - rts -.endp - -;-------------------------------------------------- -.proc MainRoundLoop -; here we must check if by a chance there is only one -; tank with energy greater than 0 left -;-------------------------------------------------- - - ldy #0 ; in Y - number of tanks with energy greater than zero - sty ATRACT ; reset atract mode - ldx NumberOfPlayers - dex -CheckingIfRoundIsFinished - lda eXistenZ,x - beq NoEnergy - iny -NoEnergy - dex - bpl CheckingIfRoundIsFinished - - cpy #2 ; is it less than 2 tanks have energy >0 ? - bcs DoNotFinishTheRound - -;points for the last living tank - ldx NumberOfPlayers - dex -WhichTankWonLoop - lda eXistenZ,x - bne ThisOneWon - dex - bpl WhichTankWonLoop - ;error was here!!! - ; somehow I believed program will be never here - ; but it was a bad assumption - ; god knows when there is such a situation - ; (we've got a SITUATION here, if you know what I mean) - ; there are two tanks left. - ; one of them is killed by the second tank - ; second tank explodes and kills the first one. - ; and code lands here... - ; looks like no one won! - rts - -ThisOneWon - lda CurrentResult - clc - adc ResultsTable,x - sta ResultsTable,x - - rts ; this Round is finished - -DoNotFinishTheRound - ; Seppuku here - lda noDeathCounter - cmp seppukuVal - bcc @+ - - mva #0 noDeathCounter - mva #sfx_seppuku sfx_effect - - jsr DisplaySeppuku - jmp Seppuku - -@ - ; Auto Defense - activates defensives - ldx NumberOfPlayers - dex -CheckNextTankAD - lda Energy,x ; only active players - beq @+ - lda AutoDefenseFlag,x ; with Auto Defence activated - beq @+ - ; run auto defense for tank in X - jsr AutoDefense -@ dex - bpl CheckNextTankAD - jsr DrawTanks ; redraw tanks with new defences -; - ldx TankSequencePointer - lda TankSequence,x - sta TankNr - tax - lda Energy,x ;skip if no energy - jeq NextPlayerShoots - - - - mva #$ff plot4x4color - jsr DisplayTankNameAbove - - mva #1 color ;to display flying point - - ldx tankNr - lda TankStatusColoursTable,x - sta COLOR2 ; set color of status line - jsr PutTankNameOnScreen -; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - - lda SkillTable,x - beq ManualShooting - -RoboTanks - ; robotanks shoot here - ; TankNr still in X - jsr ArtificialIntelligence - ;pause 30 - ldx TankNr - jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) - jsr MoveBarrelToNewPosition - lda kbcode - cmp #@kbcode._esc ; 28 ; ESC - bne @+ - jsr AreYouSure -@ lda escFlag - seq:rts ; keys Esc or O - - - jmp AfterManualShooting - -ManualShooting - lda JoyNumber,x - sta JoystickNumber ; set joystick port for player - jsr WaitForKeyRelease - lda #%00000000 - sta TestFlightFlag ; set "Test Fight" off - jsr BeforeFire - lda escFlag - seq:rts ; keys Esc or O - -AfterManualShooting - mva #$00 plot4x4color - jsr DisplayTankNameAbove - ; defensive weapons without flight handling - ldx TankNr - lda ActiveDefenceWeapon,x - cmp #ind_Hovercraft_____ - beq GoFloat - cmp #ind_White_Flag_____ ; White Flag - beq ShootWhiteFlag - cmp #ind_Nuclear_Winter_ - bne StandardShoot -ShootAtomicWinter - ; --- atomic winter --- - jsr AtomicWinter - jmp NextPlayerShoots ; and we skip shoot -ShootWhiteFlag - ; --- white flag --- - jsr WhiteFlag - jmp NextPlayerShoots ; and we skip shoot -GoFloat - jsr TankFlying - lda #0 - sta ActiveDefenceWeapon,x ; deactivate after use - bit escFlag - bpl ManualShooting ; after floating tank can shoot - rts -StandardShoot - inc noDeathCounter - - jsr DecreaseWeaponBeforeShoot - jsr DisplayStatus - -; ldx TankNr - dec Energy,x ; lower energy to eventually let tanks commit suicide - -ShootNow - jsr Shoot - ;here we clear offensive text (after a shoot) - ldy TankNr - mva #$00 plot4x4color - jsr DisplayOffensiveTextNr - - lda HitFlag ;0 if missed - beq missed - - jsr Explosion - -continueMainRoundLoopAfterSeppuku - -AfterExplode - jsr SoilDown2 ; allways -NoFallDown2 - ;here tanks are falling down - mva tankNr tempor2 - ldx NumberOfPlayers - dex -TanksFallDown - stx TankNr - lda eXistenZ,x - beq NoExistNoFall - jsr TankFalls -NoExistNoFall - dex - bpl TanksFallDown - mvx tempor2 TankNr - -missed - ldy WeaponDepleted - bne @+ - ldx TankNr - tya - sta ActiveWeapon,x -@ - - ;here we clear offensive text (after a shoot) - ldy TankNr - mva #$00 plot4x4color - jsr DisplayOffensiveTextNr - -NextPlayerShoots - ;before it shoots, the eXistenZ table must be updated - ;accordingly to actual energy (was forgotten, sorry to ourselves) - - ldx #(MaxPlayers-1) -SeteXistenZ - lda Energy,x - sta eXistenZ,x - - jsr MaxForceCalculate - - dex - bpl SeteXistenZ - - ;was setup of maximum energy for players - - -PlayersAgain - -; In LASTeXistenZ there are values of eXistenZ before shoot -; from the next tank. -; Now it must be checked if by a chance something that had -; LASTeXistenZ>0 is not equal to 0 right now, -; because it means this tank died during this round. -; Most important thing is: -; after each explosion of the tank these operations must be -; performed from the beginning! -; (it is made by another jump into the after explosion routines) -; It is because exploding tank can destroy their neighbours, -; additionally this tank just have had LASTeXistenZ set to 0, -; otherwise it would explode again and again. -; OK, text how to do it is ready, now comes coding . -; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ - - mva #sfx_next_player sfx_effect - - ldx NumberOfPlayers - dex -CheckingPlayersDeath - lda LASTeXistenZ,x - beq NoPlayerNoDeath - lda eXistenZ,x - beq PlayerXdeath -NoPlayerNoDeath - dex - bpl CheckingPlayersDeath - ; if processor is here it means there are no more explosions - - inc:lda TankSequencePointer - cmp NumberOfPlayers - bne NotLastPlayerInRound - mva #0 TankSequencePointer - - lda WindChangeInRound - beq NoWindChangeNow - jsr GetRandomWind ; wind change after each turn (not round only) -NoWindChangeNow -NotLastPlayerInRound - jmp MainRoundLoop -.endp - -;--------------------------------- -.proc PlayerXdeath -; this tank should not explode anymore: -; there is 0 in A, and Tank Number in X, so... -;--------------------------------- - - sta LASTeXistenZ,x - ; save x somewhere - stx TankTempY - - ;clear NoDeathCounter here - sta noDeathCounter - - mva #sfx_death_begin sfx_effect - - ; display defensive text here (well, defensive - ; is not the real meaning, it should be pre-death, - ; but I am too lazy to change names of variables) - - ; in X there is a number of tank that died - - lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") - bit AfterBFGflag ; check BFG flag - bmi TextAfterBFG - ; if BFG then no points for dead tanks ... - lda CurrentResult - clc - adc ResultsTable,x - sta ResultsTable,x - ;inc CurrentResult - - ; RandomizeDeffensiveText - randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) -TextAfterBFG - sta TextNumberOff - inc CurrentResult ; ... but increase result of winner (BFG) - ldy TankTempY - mva #$ff plot4x4color - jsr DisplayOffensiveTextNr - ; tank flash - ldy TankTempY - mva TankNr temp2 ; not elegant, and probably unnecessary - sty TankNr - jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) - mva temp2 TankNr - - ;Deffensive text cleanup - ;here we clear Deffensive text (after a shoot) - ldy TankTempY - mva #$00 plot4x4color - jsr DisplayOffensiveTextNr - - ; calculate position of the explosion (the post-death one) - ldx TankTempY - clc - lda xtankstableL,x - adc #4 ; more or less in the middle of the tank - sta xdraw - lda xtankstableH,x - adc #0 - sta xdraw+1 - sec - lda ytankstable,x - sbc #4 - sta ydraw - lda #0 - sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit - - ;cleanup of the soil fall down ranges (left and right) - sta RangeRight - sta RangeRight+1 - mwa #screenwidth RangeLeft - - ; We are randomizing the weapon now. - ; jumping into the middle of the explosion - ; routine -MetodOfDeath - lda random - and #%00011111 ; range 0-31 - cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) - bcs MetodOfDeath - tay - lda weaponsOfDeath,y - jsr ExplosionDirect - mva #sfx_silencer sfx_effect - - ; Clear current Shooter settings. After that, Shooter will "search" for the target again - ldx NumberOfPlayers - dex -@ lda skillTable,x - cmp #2 ; clear variables only if Shooter - bne NotShooter - lda #0 - sta PreviousAngle,x - sta PreviousEnergyL,x - sta PreviousEnergyH,x -NotShooter - dex - bpl @- - - ; jump to after explosion routines (soil fallout, etc.) - ; After going through these routines we are back - ; to checking if a tank exploded and maybe we have - ; a deadly shot here again. - jmp MainRoundLoop.AfterExplode -.endp - -;-------------------------------------------------- -.proc DecreaseEnergyX -;Decreases energy of player nr X by the value Y -;increases his financial loss -;increases gain of tank TankNr -;-------------------------------------------------- - sty EnergyDecrease - ; Lose increase - lda loseL,x - clc - adc EnergyDecrease - sta loseL,x - lda loseH,x - adc #$00 - sta loseH,x - ; Energy now, not less than 0 - lda Energy,x - cmp EnergyDecrease - bcc ldahashzero - ;sec - sbc EnergyDecrease - bpl NotNegativeEnergy -ldahashzero - lda #0 -NotNegativeEnergy - sta Energy,x - ;now increase the gain of the shooting tank - ldy TankNr - clc - lda gainL,y - adc EnergyDecrease - sta gainL,y - lda gainH,y - adc #$00 - sta gainH,y - rts -.endp - -;-------------------------------------------------- -.proc DecreaseShieldEnergyX -; Decreases energy of shield player nr X by the value Y -; if shield energy is 0 after decrease then in Y we have -; rest of the energy - to decrease tank energy -;-------------------------------------------------- - sty EnergyDecrease - ldy #0 ; if Shield survive then no decrease tank anergy - ; Energy cannot be less than 0 - lda ShieldEnergy,x - cmp EnergyDecrease - bcc UseAllShieldEnergy - ;sec - sbc EnergyDecrease - bpl NotNegativeShieldEnergy ; jump allways -UseAllShieldEnergy - ; now calculate rest of energy for future tank energy decrease - sec - lda EnergyDecrease - sbc ShieldEnergy,x - tay - lda #0 -NotNegativeShieldEnergy - sta ShieldEnergy,x - rts -.endp - -;--------------------------------- -.proc Seppuku -;--------------------------------- - lda #0 - sta ydraw+1 - ; get position of the tank - ldx TankNr -; lda #0 ; turn off defense weapons when hara-kiring - sta ActiveDefenceWeapon,x - sta ShieldEnergy,x - jsr SetupXYdraw - lda #1 ; Missile - jsr ExplosionDirect - jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku -.endp - -;-------------------------------------------------- -.proc GetRandomWind -;in: MaxWind (byte) -;out: Wind (word) -;uses: _ -;-------------------------------------------------- - lda random - cmp MaxWind - bcs GetRandomWind ; if more than MaxWind then randomize again - sta Wind - mva #$00 Wind+1 - sta Wind+2 - sta Wind+3 - ; multiply Wind by 16 - ; two bytes of Wind are treated as a decimal part of vx variable - :4 aslw Wind - ; decide the direction - lda random - and #$01 - beq @+ - sec ; Wind = -Wind - .rept 4 - lda #$00 - sbc Wind+# - sta Wind+# - .endr -@ rts -.endp -;-------------------------------------------------- -.proc MaxForceCalculate -; calculates max force for tank (tanknr in X) -; Energy of tank X in A -;-------------------------------------------------- - sta L1 - - ;DATA L1,L2 - ;Multiplication 8bit*8bit, - ;result 16bit - ;this algiorithm is a little longer than one in Ruszczyc 6502 book - ;but it is faster - - ldy #8 - lda #0 - clc -LP0 ror - ror L1 - bcc B0 - clc - adc #10 ; (L2) multiplication by 10 -B0 dey - bne LP0 - ror - ror L1 - sta MaxForceTableH,x - lda L1 - sta MaxForceTableL,x - rts -.endp - -;-------------------------------------------------- -.proc WeaponCleanup -; cleaning of the weapon possesion tables -; 99 of Baby Missles and White Flags, all other weapons=0) -;-------------------------------------------------- - ldx #(number_of_weapons - 1) -@ lda #$0 - cpx #ind_White_Flag_____ ; White Flag - bne no99 -set99 lda #99 -no99 sta TanksWeapon1,x - sta TanksWeapon2,x - sta TanksWeapon3,x - sta TanksWeapon4,x - sta TanksWeapon5,x - sta TanksWeapon6,x - dex - beq set99 ; Baby Missile (index=0) - bpl @- - rts -.endp - -;-------------------------------------------------- -.proc Initialize -;Initialization sequence -;uses: temp, ... -;-------------------------------------------------- -deletePtr = temp - - ; clean variables - lda #0 - sta escFlag - sta JoystickNumber - tay - mwa #variablesStart deletePtr -@ tya - sta (deletePtr),y - inw deletePtr - cpw deletePtr #variablesEnd - bne @- - - ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) - ldy #1 - sty TankShape+1 - sty TankShape+4 - iny - sty TankShape+2 - sty TankShape+5 - - - mwa #1024 RandBoundaryHigh - mva #$ff LastWeapon - sta HowMuchToFall - mva #1 color - - jsr SetStandardBarrels - jsr WeaponCleanup - - mva #>WeaponFont chbas - - ;parameter for old plot (unPlot) max 5 points - ldx #4 -SetunPlots - lda #display - sta oldplotH,x - lda #0 - sta oldply,x - lda #$ff - sta oldora,x - dex - bpl SetunPlots - - ;setting up P/M graphics - lda #>pmgraph - sta pmbase - lda #$03 ; P/M on - sta GRACTL - jsr SetPMWidth - lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 - sta GPRIOR - jsr PMoutofScreen - - ;let the tanks be visible! - ldx #(maxPlayers-1) - lda #99 ; tank is visible -MakeTanksVisible - sta eXistenZ,x - dex - bpl MakeTanksVisible - - mva #1 CurrentRoundNr ;we start from round 1 - mva #6 NTSCcounter - - rts -.endp -;-------------------------------------------------- -.proc SetStandardBarrels -; set standart barrel length and deactivate Auto Defense -; for all tanks -;-------------------------------------------------- - ldx #maxPlayers-1 -@ lda #StandardBarrel ; standard barrel length - sta BarrelLength,x - lda #$00 ; deactivate Auto Defense - sta AutoDefenseFlag,x - dex - bpl @- - rts -.endp -;---------------------------------------------- -/* .proc RandomizeSequence0 - ldx #0 -@ txa - sta TankSequence,x - inx - cpx #MaxPlayers - bne @- - rts -.endp */ -;-------------------------------------------------- -.proc RandomizeSequence -; in: NumberOfPlayers -; out: TankSequence -; how: get random number lower than NumberOfPlayers -; put it in the first slot. -; get another random number lower than NumberOfPlayers -; check if was previously saved in first slot -; if not then save it in second slot -; repeat untill NumberOfPlayers - - ldx #0 -GetRandomAgain0 - lda RANDOM - and #$07 ;NumberOfPlayers < 7 - cmp NumberOfPlayers - bcs GetRandomAgain0 - sta TankSequence,x - ;now first slot is ready, nexts slots are handled - ;in a more complicated way - -GetRandomAgainX - lda RANDOM - and #$07 ;NumberOfPlayers < 7 - cmp NumberOfPlayers - bcs GetRandomAgainX - - ;now we have to check if the value was not used - ;in previous slots - - stx temp - ldy temp -UsageLoop - cmp TankSequence,y - beq GetRandomAgainX ;apparently we have already used this value - dey - bpl UsageLoop - - ;well, looks like this value is new! - inx - sta TankSequence,x - - stx temp - inc:lda temp ;x+1 - - cmp NumberOfPlayers - bne GetRandomAgainX - rts -.endp -;---------------------------------------------- -.proc RandomizeAngle -; routine returns in A -; a valid angle for the tank's barrel. -; X is not changed -;---------------------------------------------- - - ; lets randomize someting between 0 and 180 - lda RANDOM - cmp #180 - bcs RandomizeAngle - rts -.endp -;---------------------------------------------- -.proc RandomizeForce -; routine returns in ForceTable/L/H -; valid force of shooting for TankNr -; in X must be TankNr -; low and high randomize boundary passed as word value -; RandBoundaryLow -; RandBoundaryHigh -;---------------------------------------------- - - lda RANDOM - sta temp2 - lda RANDOM - and #%00000011 ;(0..1023) - sta temp2+1 - - cpw RandBoundaryLow temp2 - seq:bcs RandomizeForce - - cpw RandBoundaryHigh temp2 - bcc RandomizeForce - - lda temp2 - sta ForceTableL,x - lda temp2+1 - sta ForceTableH,x - -;--------- -LimitForce -; in X must be TankNr -; cuts force to MaxForceTable - lda MaxForceTableH,x - cmp ForceTableH,x - bne @+ - lda MaxForceTableL,x - cmp ForceTableL,x -@ bcs @+ - - lda MaxForceTableL,x - sta ForceTableL,x - lda MaxForceTableH,x - sta ForceTableH,x -@ - rts - -.endp -;---------------------------------------------- -.proc Table2Force -;---------------------------------------------- - lda ForceTableL,x - sta Force - lda ForceTableH,x - sta Force+1 - rts -.endp -;---------------------------------------------- -.proc MoveBarrelToNewPosition -;---------------------------------------------- - mva #1 Erase - jsr DrawTankNr.BarrelChange - mva #0 Erase -MoveBarrel - mva #sfx_set_power_2 sfx_effect - jsr DrawTankNr - jsr DisplayStatus.displayAngle -; ldx TankNr - mva #1 Erase - jsr WaitOneFrame - jsr DrawTankNr.BarrelChange - mva #0 Erase - lda NewAngle - cmp AngleTable,x - beq BarrelPositionIsFine - bcc rotateLeft -rotateRight ; older is lower - inc angleTable,x - jmp MoveBarrel -rotateLeft ; older is bigger - dec angleTable,x - jmp MoveBarrel -BarrelPositionIsFine - jsr DrawTankNr - rts - -.endp - -;---------------------------------------------- -.proc SortSequence ; -;---------------------------------------------- -; here we try to get a sequence of tanks for two -; purposes: -; 1. to make up shooting sequence for the next round (from down to top) -; 2. to display game results more nicely (from top to down) -; -; I think I will go for a stupid bubble sort... -; it is easy to test :) -; -; Results are in ResultsTable, in TankSequence (Sorted Table) we want to -; have numbers of tanks from the worst to the best. -; in other words, if ResultsTable=(5,4,65,23,3,6) -; the TankSequence=(4,1,0,5,3,2) -; let's assume initially the TankSequence=(0,1,2,3,4,5) - - ldx #0 -SequenceStart - txa - sta TankSequence,x - inx - cpx #MaxPlayers - bne SequenceStart - -; we will need a TempResults (TR) table to fiddle with - ldx #0 -movetotemp - lda ResultsTable,x - sta TempResults,x - inx - cpx NumberOfPlayers - bne movetotemp - -; i=0:sortflag=0 -;loop: -; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers -; or goto loop: -; else -; temp=TR(i): tempo=TankSequence(i) -; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) -; TR(i+1)=temp: TankSequence(i+1)=tempo -; i=i+1 -; sortflag=sortflag+1 -; go loop: -; if sortflag=0 then finished, else repeat... -; -; or something like this :) - ldx NumberOfPlayers - dex - stx temp+1 ; for checking end of the loop only - -Bubble - ldx #0 ;i=x - stx temp2 ; sortflag=temp2 - -BubbleBobble - lda TempResults,x - cmp TempResults+1,x - bcc nextishigher - bne swapvalues -nextisequal - ; if results are equal, check Direct Hits - ldy TankSequence,x - lda DirectHits,y - ldy TankSequence+1,x - cmp DirectHits,y - ; - beq nextishigher ; this is to block hangs when 2 equal values meet - bcc nextishigher - ;here we must swap values - ;because next is smaller than previous -swapvalues - sta temp - lda TempResults+1,x - sta TempResults,x - lda temp - sta TempResults+1,x - ; - lda TankSequence,x - sta temp - lda TankSequence+1,x - sta TankSequence,x - lda temp - sta TankSequence+1,x - inc temp2 -nextishigher - inx - cpx temp+1 ;cpx ^NumberOfPlayers-1 - bne BubbleBobble - - lda temp2 - - bne Bubble - - rts -.endp -;-------------------------------------------------- -.proc SetWallsType -;-------------------------------------------------- - mva #0 WallsType - lda OptionsTable+8 - cmp #4 - beq SetRandomWalls - lsr - ror WallsType - lsr - ror WallsType - rts -SetRandomWalls - lda random - and #%11000000 - sta WallsType - rts -.endp ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -1740,11 +596,11 @@ noingame rts .endp ;-------------------------------------------------- - icl 'interrupts.asm' + icl 'Atari/interrupts.asm' ;---------------------------------------------- icl 'constants.asm' ;---------------------------------------------- - icl 'textproc.asm' + icl 'Atari/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' ;---------------------------------------------- From be37772b29f9d8c0505617c0aa582f58d1501ea2 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 5 May 2023 11:29:34 +0200 Subject: [PATCH 07/65] Prepare for C64 port --- C64/lib/C64SYS.ASM | 47 ++++ C64/lib/MACRO.ASM | 213 ++++++++++++++++++ scorchC64.asm | 546 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 806 insertions(+) create mode 100644 C64/lib/C64SYS.ASM create mode 100644 C64/lib/MACRO.ASM create mode 100644 scorchC64.asm diff --git a/C64/lib/C64SYS.ASM b/C64/lib/C64SYS.ASM new file mode 100644 index 0000000..9b3f0b6 --- /dev/null +++ b/C64/lib/C64SYS.ASM @@ -0,0 +1,47 @@ +vic_spr0_x = $D000 +vic_spr0_y = $D001 +vic_spr1_x = $D002 +vic_spr1_y = $D003 +vic_spr2_x = $D004 +vic_spr2_y = $D005 +vic_spr3_x = $D006 +vic_spr3_y = $D007 +vic_spr4_x = $D008 +vic_spr4_y = $D009 +vic_spr5_x = $D00A +vic_spr5_y = $D00B +vic_spr6_x = $D00C +vic_spr6_y = $D00D +vic_spr7_x = $D00E +vic_spr7_y = $D00F +vic_spr_hi_x = $D010 +vic_cr1 = $D011 +vic_raster = $D012 +vic_lp_x = $D013 +vic_lp_y = $D014 +vic_spr_ena = $D015 +vic_cr2 = $D016 +vic_spr_exp_y = $D017 +vic_mem = $D018 +vic_irq = $D019 +vic_irq_ena = $D01A +vic_spr_dp = $D01B +vic_spr_mcolor = $D01C +vic_spr_exp_x = $D01D +vic_spr_ss_col = $D01E +vic_spr_sd_col = $D01F +vic_border = $D020 +vic_bg_color0 = $D021 +vic_bg_color1 = $D022 +vic_bg_color2 = $D023 +vic_bg_color3 = $D024 +vic_spr_color1 = $D025 +vic_spr_color2 = $D026 +vic_spr0_color = $D027 +vic_spr1_color = $D028 +vic_spr2_color = $D029 +vic_spr3_color = $D02A +vic_spr4_color = $D02B +vic_spr5_color = $D02C +vic_spr6_color = $D02D +vic_spr7_color = $D02E diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM new file mode 100644 index 0000000..9ff9cae --- /dev/null +++ b/C64/lib/MACRO.ASM @@ -0,0 +1,213 @@ + + + +.macro basic_start(addr) + + .word upstartEnd // link address + .word 10 // line num + .byte $9e // sys + + ?a=0 + ?b=0 + ?c=0 + ?d=0 + ?e=0 + + ?v = %%addr + + ift ?v>=10000 + ?a=?v/10000 + ?v=?v-(?a*10000) + eif + + ift ?v>=1000 + ?b=?v/1000 + ?v=?v-(?b*1000) + eif + + ift ?v>=100 + ?c=?v/100 + ?v=?v-(?c*100) + eif + + ift ?v>=10 + ?d=?v/10 + ?v=?v-(?d*10) + eif + + ?e=?v%10 + + dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 + + .byte 0 +upstartEnd + .word 0 // empty link signals the end of the program + +.endm + + +// +// Switch bank in VIC-II +// +// Args: +// bank: bank number to switch to. Valid values: 0-3. +// +.macro SwitchVICBank(bank) + // + // The VIC-II chip can only access 16K bytes at a time. In order to + // have it access all of the 64K available, we have to tell it to look + // at one of four banks. + // + // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2). + // + // +------+-------+----------+-------------------------------------+ + // | BITS | BANK | STARTING | VIC-II CHIP RANGE | + // | | | LOCATION | | + // +------+-------+----------+-------------------------------------+ + // | 00 | 3 | 49152 | ($C000-$FFFF)* | + // | 01 | 2 | 32768 | ($8000-$BFFF) | + // | 10 | 1 | 16384 | ($4000-$7FFF)* | + // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) | + // +------+-------+----------+-------------------------------------+ + ?bits=%11 + + ift (%%bank==0) + ?bits=%11 + eli (%%bank==1) + ?bits=%10 + eli (%%bank==2) + ?bits=%01 + eli (%%bank==3) + ?bits=%00 + eif + + // + // Set Data Direction for CIA #2, Port A to output + // + lda $dd02 + and #%11111100 // Mask the bits we're interested in. + ora #$03 // Set bits 0 and 1. + sta $dd02 + + // + // Tell VIC-II to switch to bank + // + lda $dd00 + and #%11111100 + ora #?bits + sta $dd00 +.endm + + +// +// Enter hires bitmap mode (a.k.a. standard bitmap mode) +// +.macro SetHiresBitmapMode + // + // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + // + lda $d011 + and #%10111111 + ora #%00100000 + sta $d011 + + // + // Clear multi color mode (bit 4) + // + lda $d016 + and #%11101111 + sta $d016 +.endm + + +// +// Enter hires bitmap mode (a.k.a. standard bitmap mode) +// +.macro SetMulticolorBitmapMode + // + // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + // + lda $d011 + and #%10111111 + ora #%00100000 + sta $d011 + + // + // Clear multi color mode (bit 4) + // + lda $d016 + ora #%00010000 + sta $d016 +.endm + + +// +// Switch location of screen memory. +// +// Args: +// address: Address relative to current VIC-II bank base address. +// Valid values: $0000-$3c00. Must be a multiple of $0400. +// +.macro SetScreenMemory(address) + // + // The most significant nibble of $D018 selects where the screen is + // located in the current VIC-II bank. + // + // +------------+-----------------------------+ + // | | LOCATION* | + // | BITS +---------+-------------------+ + // | | DECIMAL | HEX | + // +------------+---------+-------------------+ + // | 0000XXXX | 0 | $0000 | + // | 0001XXXX | 1024 | $0400 (DEFAULT) | + // | 0010XXXX | 2048 | $0800 | + // | 0011XXXX | 3072 | $0C00 | + // | 0100XXXX | 4096 | $1000 | + // | 0101XXXX | 5120 | $1400 | + // | 0110XXXX | 6144 | $1800 | + // | 0111XXXX | 7168 | $1C00 | + // | 1000XXXX | 8192 | $2000 | + // | 1001XXXX | 9216 | $2400 | + // | 1010XXXX | 10240 | $2800 | + // | 1011XXXX | 11264 | $2C00 | + // | 1100XXXX | 12288 | $3000 | + // | 1101XXXX | 13312 | $3400 | + // | 1110XXXX | 14336 | $3800 | + // | 1111XXXX | 15360 | $3C00 | + // +------------+---------+-------------------+ + // + ?bits = (%%address / $0400) << 4 + + lda $d018 + and #%00001111 + ora #?bits + sta $d018 +.endm + + +// +// Set location of bitmap. +// +// Args: +// address: Address relative to VIC-II bank address. +// Valid values: $0000 (bitmap at $0000-$1FFF) +// $2000 (bitmap at $2000-$3FFF) +// +.macro SetBitmapAddress(address) + // + // In standard bitmap mode the location of the bitmap area can + // be set to either BANK address + $0000 or BANK address + $2000 + // + // By setting bit 3, we can configure which of the locations to use. + // + + lda $d018 + + ift %%address == $0000 + and #%11110111 + eli %%address == $2000 + ora #%00001000 + eif + + sta $d018 +.end \ No newline at end of file diff --git a/scorchC64.asm b/scorchC64.asm new file mode 100644 index 0000000..854b222 --- /dev/null +++ b/scorchC64.asm @@ -0,0 +1,546 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +;C64 8-bit Scorched Earth source code +;--------------------------------------------------- +;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski +;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 +;Miami & Warsaw 2022, 2023 + +;--------------------------------------------------- +.def TARGET = C64 ; :) +;--------------------------------------------------- +.def XCORRECTION_FOR_PM = 0 +; if 1 - active x position of tanks correction fo PMG +.def FASTER_GRAF_PROCS = 0 +; if 1 - activates faster graphics routines +; (direct writes to screen memory - atari only :) ) +;--------------------------------------------------- + + + opt h-f+ + org $801 + org [a($801)],$801 + basic_start(START) + + +;--------------------------------------------------- +.macro build + dta d"1.28" ; number of this build (4 bytes) +.endm + +.macro RMTSong + lda #:1 + rts ; do nothing in C64 +.endm + +;--------------------------------------------------- + icl 'definitions.asm' +;--------------------------------------------------- + +FirstZpageVariable = $57 + .zpvar DliColorBack .byte = FirstZpageVariable + .zpvar GradientNr .byte + .zpvar GradientColors .word + .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) + .zpvar JoystickNumber .byte + .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing + .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory + .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) + .zpvar xdraw .word ;= $64 ;variable X for plot + .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + .zpvar xbyte .word + .zpvar ybyte .word + .zpvar CharCode .byte + .zpvar fontind .word + .zpvar tanknr .byte + .zpvar TankSequencePointer .byte + .zpvar oldplot .word + .zpvar xc .word + .zpvar temp .word ;temporary word for the most embeded loops only + .zpvar temp2 .word ;same as above + .zpvar modify .word ;origially used to replace self-modyfying code + .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) + .zpvar xtempDRAW .word ;same as above for XDRAW routine + .zpvar ytempDRAW .word ;same as above for XDRAW routine + .zpvar tempor2 .word + .zpvar CreditsVScrol .byte + ;--------------temps used in circle routine + .zpvar xi .word ;X (word) in draw routine + .zpvar fx .byte + .zpvar yi .word ;Y (word) in draw routine + .zpvar fy .byte + .zpvar xk .word + .zpvar fs .byte + .zpvar yc .byte ;ycircle - temporary for circle + .zpvar dx .word + .zpvar dy .word + .zpvar dd .word + .zpvar di .word + .zpvar dp .word + ;---------------------------- + .zpvar UnderTank1 .byte + .zpvar UnderTank2 .byte + ;---------------------------- + .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) + .zpvar weaponPointer .word + .zpvar dliCounter .byte + .zpvar pressTimer .byte + .zpvar NTSCcounter .byte + .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling + .zpvar sfx_effect .byte + .zpvar RMT_blocked .byte + .zpvar ScrollFlag .byte + .zpvar SkStatSimulator .byte + .zpvar FloatingAlt .byte ; floating tank altitude + .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen + + ; --------------OPTIMIZATION VARIABLES-------------- + .zpvar Force .word + .zpvar Force_ .byte ; Force is 3 bytes long + .zpvar Angle .byte + .zpvar Parachute .byte ; are you insured with parachute? + .zpvar color .byte + .zpvar Erase .byte ; if 1 only mask of the character is printed + ; on the graphics screen. if 0 character is printed normally + .zpvar radius .byte + .zpvar decimal .word + .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) + .zpvar Counter .byte ;temporary Counter for outside loops + .zpvar ExplosionRadius .byte + .zpvar FunkyBombCounter .byte + .zpvar ResultY .byte + .zpvar xcircle .word + .zpvar ycircle .word + .zpvar vy .word + .zpvar vy_ .word ; 4 bytes + .zpvar vx .word + .zpvar vx_ .word ; 4 bytes + .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank + .zpvar PositionOnTheList .byte ; pointer position on the list being displayed + .zpvar XHit .word + .zpvar delta .word + .zpvar HowMuchToFall .byte + .zpvar magic .word + .zpvar xtraj .word + .zpvar xtraj_ .byte ; 3 bytes + .zpvar ytraj .word + .zpvar ytraj_ .byte ; 3 bytes + .zpvar Wind .word + .zpvar Wind_ .word ; 4 bytes + .zpvar RangeLeft .word + .zpvar RangeRight .word + .zpvar NewAngle .byte + .zpvar escFlag .byte + .zpvar LineYdraw .byte + .zpvar LineXdraw .word + .zpvar plot4x4color .byte ; $00 / $ff + .zpvar Multiplier .word + .zpvar Multiplier_ .byte ; 3 bytes + .zpvar HowToDraw .byte + .zpvar gravity .byte + .zpvar LineLength .word + .zpvar tracerflag .byte + .zpvar isInventory .byte + .zpvar DifficultyLevel .byte + .zpvar goleft .byte + .zpvar OffsetDL1 .byte + .zpvar L1 .byte + HotNapalmFlag = FunkyBombCounter ; reuse variable! + ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 + + displayposition = modify + LineAddress4x4 = xcircle + +;----------------------------------------------- +; libraries +;----------------------------------------------- + icl 'C64/lib/C64SYS.ASM' + icl 'C64/lib/MACRO.ASM' + +;----------------------------------------------- +; variable declarations in RAM (no code) +;----------------------------------------------- + ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) + icl 'variables.asm' + + ; Game loading address + ORG $4000 + +WeaponFont + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' + + +;-------------------------------------------------- +; Game Code +;-------------------------------------------------- +FirstSTART + jsr MakeDarkScreen + + ; one time zero variables in RAM (non zero page) + lda #0 + ldy #OneTimeZeroVariablesCount-1 +@ sta OneTimeZeroVariables,y + dey + bpl @- + + ; one time zero variables in RAM (zero page) + ldy #FirstZpageVariable +@ sta $0000,y + iny + bne @- + + ; initialize variables in RAM (non zero page) + ldy #initialvaluesCount-1 +@ lda initialvaluesStart,y + sta variablesToInitialize,y + dey + bpl @- + + ; set gradient to the full LGBTIQQAAPP+ flag on start + mva #0 GradientNr ; #1 to set gradient number 2 :) (next one) + jsr SelectNextGradient.NotWind + + ; generate linetables + jsr GenerateLineTable + + + ; RMT INIT + lda #$f0 ;initial value + sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) + + lda #$ff ;initial value + sta sfx_effect + + RMTSong 0 + + VMAIN VBLinterrupt,7 ;jsr SetVBL + + mva #2 chactl ; necessary for 5200 + +;-------------------------------------------------- +; Main program of the game + icl 'game.asm' +;-------------------------------------------------- + + +;-------------------------------------------------- +.proc GetKey +; waits for pressing a key and returns pressed value in A +; when [ESC] is pressed, escFlag is set +; result: A=keycode +;-------------------------------------------------- + jsr WaitForKeyRelease +@ + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 ; SHIFT + beq checkJoyGetKey + .ELSE + lda SkStatSimulator + and #%11111110 + bne checkJoyGetKey ; key not pressed, check Joy + .ENDIF + lda kbcode + cmp #@kbcode._none + beq checkJoyGetKey + and #$3f ;CTRL and SHIFT ellimination + cmp #@kbcode._esc ; 28 ; ESC + bne getkeyend + mvy #$80 escFlag + bne getkeyend + +checkJoyGetKey + ;------------JOY------------- + ;happy happy joy joy + ;check for joystick now + lda STICK0 + and #$0f + cmp #$0f + beq notpressedJoyGetKey + tay + lda joyToKeyTable,y + bne getkeyend + +notpressedJoyGetKey + ;fire + lda STRIG0 + beq JoyButton + .IF TARGET = 800 ; Select and Option key only on A800 + bne checkSelectKey +checkSelectKey + lda CONSOL + and #%00000010 ; Select + beq SelectPressed + lda CONSOL + and #%00000100 ; Option + .ENDIF + bne @- +OptionPressed + lda #@kbcode._atari ; Option key + bne getkeyend +SelectPressed + lda #@kbcode._tab ; Select key + bne getkeyend +JoyButton + lda #@kbcode._ret ;Return key +getkeyend + ldy #0 + sty ATRACT ; reset atract mode + mvy #sfx_keyclick sfx_effect + rts +.endp + +;-------------------------------------------------- +.proc getkeynowait +;-------------------------------------------------- + jsr WaitForKeyRelease + lda kbcode + and #$3f ;CTRL and SHIFT ellimination + rts +.endp + +;-------------------------------------------------- +.proc WaitForKeyRelease +;-------------------------------------------------- + mva #128-KeyRepeatSpeed pressTimer ; tricky +StillWait + bit pressTimer + bmi KeyReleased + lda STICK0 + and #$0f + cmp #$0f + bne StillWait + lda STRIG0 + beq StillWait + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + bne StillWait + lda CONSOL + and #%00000110 ; Select and Option only + cmp #%00000110 + bne StillWait + .ELSE + lda SkStatSimulator + and #%11111110 + beq StillWait + .ENDIF +KeyReleased + rts +.endp +;-------------------------------------------------- +.proc IsKeyPressed +; result: A=0 - yes , A>0 - no +;-------------------------------------------------- + lda SKSTAT + and #%00000100 + beq @+ + lda #1 +@ and STRIG0 + rts +.endp +;-------------------------------------------------- +.proc DemoModeOrKey +; Waits for the key pressed if at least one human is playing. +; Otherwise, waits 3 seconds (demo mode). +;-------------------------------------------------- + ;check demo mode + ldx numberOfPlayers + dex +checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + lda skillTable,x + beq peopleAreHere + dex + bpl checkForHuman + ; no people, just wait a bit + ;pause 150 + ldy #75 + jsr PauseYFrames + rts +peopleAreHere + jmp getkey ; jsr:rts +.endp + +;-------------------------------------------------- +MakeDarkScreen +;-------------------------------------------------- + jsr PMoutofScreen ; hide P/M + mva #0 dmactls ; dark screen + ; and wait one frame :) +;-------------------------------------------------- +.proc WaitOneFrame +;-------------------------------------------------- + lda CONSOL + and #%00000101 ; Start + Option + sne:mva #$40 escFlag + and #%00000001 ; START KEY + seq:wait ; or waitRTC ? + rts +.endp + +;-------------------------------------------------- +.proc PauseYFrames +; Y - number of frames to wait (divided by 2) +; pauses for maximally 510 frames (255 * 2) +;-------------------------------------------------- +@ jsr WaitOneFrame + jsr WaitOneFrame + dey + bne @- + rts +.endp + +;-------------------------------------------------- +.proc RmtSongSelect +; starting song line 0-255 to A reg +;-------------------------------------------------- + cmp #song_ingame + bne noingame ; noMusic blocks only ingame song + bit noMusic + spl:lda #song_silencio +noingame + mvx #$ff RMT_blocked + ldx #MODUL ;hi byte of RMT module to Y reg + jsr RASTERMUSICTRACKER ;Init + mva #0 RMT_blocked + rts +.endp +;------------------------------------------------- +.proc CopyFromROM +;------------------------------------------------- +;copy from CART to RAM +; trashes: Y +; temp: source +; temp2: destination +; modify: destination-end +;usage: +; mwa #DisplayCopyRom temp +; mwa #display temp2 +; mwa #DisplayCopyEnd+1 modify +; jsr CopyFromROM + + ldy #0 +@ lda (temp),y + sta (temp2),y + inw temp + inw temp2 + cpw temp2 modify + bne @- + rts +.endp +;-------------------------------------------------- + icl 'C64/interrupts.asm' +;---------------------------------------------- + icl 'constants.asm' +;---------------------------------------------- + icl 'C64/textproc.asm' +;---------------------------------------------- + icl 'grafproc.asm' +;---------------------------------------------- + icl 'weapons.asm' +;---------------------------------------------- + icl 'ai.asm' +;---------------------------------------------- + icl 'artwork/talk.asm' +;---------------------------------------------- +TankFont + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only +;---------------------------------------------- +font4x4 + ins 'artwork/font4x4s.bmp',+62 +;---------------------------------------------- +;RMT PLAYER loading shenaningans + icl 'artwork/sfx/rmtplayr_modified.asm' +;------------------------------------------------- +.proc CheckTankCheat + ldy #$07 + lda TankNr + asl + asl + asl ; 8 chars per name + tax +@ + lda CheatName,y + sec + sbc tanksnames,x + cmp #$27 + bne NoCheat + inx + dey + bpl @- +YesCheat + ldx TankNr + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + lda #99 +@ iny + sta (temp),y + cpy #(number_of_weapons - 1) + bne @- +NoCheat + rts +.endp +CheatName + dta d" 008.T"+$27 +;---------------------------------------------- +.proc DLIinterruptBFG + pha + lda dliCounter + bne EndofBFGDLI + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF2 + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF1 +EndofBFGDLI + inc dliCounter + pla + rti +.endp +; ------------------------ +.proc BFGblink + SetDLI DLIinterruptBFG ; blinking on + ldy #50 + jsr PauseYFrames + SetDLI DLIinterruptGraph ; blinking off + rts +.endp +;-------------------------------------------------- + .IF * > MODUL-1 + .ECHO * + .ERROR 'Code and data too long' + .ENDIF + .ECHO "Bytes left: ",$b000-* + + + org $b000 ;address of RMT module +MODUL + ;RMT module is standard Atari binary file already + ins "artwork/sfx/scorch_str9-NTSC.rmt",+6 ;include music RMT module +MODULEND +;---------------------------------------------- + icl 'constants_top.asm' +;---------------------------------------------- + + .ECHO "Bytes on top left: ",$bfe8-* ;ROM_SETTINGS-* + .IF target = 5200 + .IF * > ROM_SETTINGS-1 + .ERROR 'Code and RMT song too long to fit in 5200' + .ENDIF + org ROM_SETTINGS ; 5200 ROM settings address $bfe8 + ; "01234567890123456789" + .byte " scorch supersystem " ;20 characters title + .byte " ", $ff ;$BFFD == $ff means diagnostic cart, no splash screen + .word FirstSTART + .ELSE + run FirstSTART + .ENDIF From 9b34ac0e43660cdd21b2433420547d6a99005247 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 5 May 2023 12:15:54 +0200 Subject: [PATCH 08/65] More C64 "code" :alien: --- C64/lib/C64_ATARISYS.ASM | 632 +++++++++++++++++++++++++++++++++++++++ scorchC64.asm | 3 +- 2 files changed, 634 insertions(+), 1 deletion(-) create mode 100644 C64/lib/C64_ATARISYS.ASM diff --git a/C64/lib/C64_ATARISYS.ASM b/C64/lib/C64_ATARISYS.ASM new file mode 100644 index 0000000..26a00e5 --- /dev/null +++ b/C64/lib/C64_ATARISYS.ASM @@ -0,0 +1,632 @@ +;**************************************************************************** +;* ATARI PERSONAL COMPUTER * +;* SYSTEM EQUATES * +;**************************************************************************** + +FAKEADDR EQU $0100 + + +; +; OPERATING SYSTEM EQUATE FILE +; +; MODULE ORIGIN TABLE +; +; VECTOR TABLE +; +; HANDLER ENTRY POINTS ARE CALL- +; ED OUT IN THE FOLLOWING VECTOR +; TABLE. THESE ARE THE ADDRESSES +; MINUS ONE. +; +; EXAMPLE FOR EDITOR +; +; E400 OPEN +; 2 CLOSE +; 4 GET +; 6 PUT +; 8 STATUS +; A SPECIAL +; C JUMP TO POWER ON INIT +; F NOT USED +; +EDITRV EQU $E400 ;EDITOR +SCRENV EQU $E410 ;TV SCREEN +KEYBDV EQU $E420 ;KEYBOARD +PRINTV EQU $E430 ;PRINTER +CASETV EQU $E440 ;CASSETTE +; +; JUMP VECTOR TABLE +; +; THE FOLLOWING IS A TABLE OF +; JUMP INSTRUCTIONS TO VARIOUS +; ENTRY POINTS IN THE OPERATING +; SYSTEM +; +DISKIV EQU $E450 ;DISK INITIALIZATION +DSKINV EQU $E453 ;DISK INTERFACE +CIOV EQU $E456 ;CENTRAL I/O ROUTINE +SIOV EQU $E459 ;SERIAL I/O ROUTINE +SETVBV EQU $E45C ;SET SYSTEM TIMERS +SYSVBV EQU $E45F ;VBLANK CALCULATIONS +XITVBV EQU $E462 ;EXIT VBLANK +SIOINV EQU $E465 ;SIO INITIALIZATION +SENDEV EQU $E468 ;SEND ENABLE ROUTINE +INTINV EQU $E46B ;INTRPT HANDLER INIT +CIOINV EQU $E46E ;CIO INITIALIZATION +BLKBDV EQU $E471 ;BLACKBOARD MODE +WARMSV EQU $E474 ;WARM START VECTOR +COLDSV EQU $E477 ;COLD START VECTOR +RBLOKV EQU $E47A ;CASSETTE READ BLOCK +CSOPIV EQU $E47D ;CASSETTE INPUT OPEN +; +; VECTORS ADDED FOR 800XL +; +PUPDIV EQU $E480 ;POWER UP DISPLAY +SLFTSV EQU $E483 ;SELF TEST PROGRAM +PHENTV EQU $E486 ;UPLOADED HANDLER ENTER +PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK +PHINIV EQU $E48C ;UPLOADED HANDLER INIT +; +; OPERATING SYSTEM EQUATES +; +; COMMAND CODES FOR IOCBS +; +OPEN EQU $03 ;OPEN FOR I/O +GETREC EQU $05 ;GET RECORD (TEXT) +GETCHR EQU $07 ;GET CHARACTER(S) +PUTREC EQU $09 ;PUT RECORD (TEXT) +PUTCHR EQU $0B ;PUT CHARACTER(S) +CLOSE EQU $0C ;CLOSE DEVICE +STATIS EQU $0D ;STATUS REQUEST +SPECIL EQU $0E ;SPECIAL ENTRY COMMAND +; +; SPECIAL ENTRY COMMANDS +; +DRAWLN EQU $11 ;DRAW LINE +FILLIN EQU $12 ;FILL +RENAME EQU $20 ;RENAME DISK FILE +DELETE EQU $21 ;DELETE DISK FILE +FORMAT EQU $22 ;FORMAT DISK +LOCKFL EQU $23 ;LOCK FILE +UNLOCK EQU $24 ;UNLOCK FILE +POINT EQU $25 ;POINT SECTOR +NOTE EQU $26 ;NOTE SECTOR +IOCFRE EQU $FF ;IOCB "FREE" +; +; AUX1 EQUATES +; () INDICATES WHICH DEVICES +; +APPEND EQU $01 ;WR APPEND(D)-SCN RD(E) +DIRECT EQU $02 ;OPEN DIRECTORY(D) +OPNIN EQU $04 ;OPEN FOR INPUT(ALL) +OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL) +OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL) +MXDMOD EQU $10 ;OPEN MIXED MODE(E,S) +INSCLR EQU $20 ;OPEN W/O CLEAR(E,S) +; +; DEVICE NAMES +; +SCREDT EQU 'E' ;SCREEN EDITOR (R/W) +KBD EQU 'K' ;KEYBOARD (R ONLY) +DISPLY EQU 'S' ;SCREEN DISPLAY (R/W) +PRINTR EQU 'P' ;PRINTER (W ONLY) +CASSET EQU 'C' ;CASSETTE (R/W) +RS232 EQU 'R' ;MODEM (R/W) +DISK EQU 'D' ;DISK (R/W) +; +; +; +; OPERATING SYSTEM STATUS CODES +; +SUCCES EQU $01 ;SUCCESSFUL OPERATION +BRKABT EQU $80 ;BREAK KEY ABORT +PRVOPN EQU $81 ;IOCB ALREADY OPEN +NONDEV EQU $82 ;NON-EXISTANT DEVICE +WRONLY EQU $83 ;IOCB OPEN FOR W ONLY +NVALID EQU $84 ;INVALID COMMAND +NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN +BADIOC EQU $86 ;INVALID IOCB # +RDONLY EQU $87 ;IOCB OPEN FOR R ONLY +EOFERR EQU $88 ;END OF FILE +TRNRCD EQU $89 ;TRUNCATED RECORD +TIMOUT EQU $8A ;PERIPHERAL TIMEOUT +DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE +FRMERR EQU $8C ;SERIAL BUS FRAME ERR +CRSROR EQU $8D ;CURSOR OVERRANGE +OVRRUN EQU $8E ;SERIAL DATA OVERRUN +CHKERR EQU $8F ;SERIAL CHECKSUM ERR +DERRER EQU $90 ;PERIPHRAL DEVICE ERR +BADMOD EQU $91 ;BAD SCREEN MODE # +FNCNOT EQU $92 ;NONEXISTANT FUNCTION +SCRMEM EQU $93 ;SCREEN MEM TOO SMALL +; +; PAGE ZERO RAM ASSIGNMENTS +; +LNFLG EQU $00 ;LINBUG RAM +NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG +; +; THESE LOCATIONS NOT CLEARED +; +CASINI EQU $02 ;CASSETTE INIT LOC +RAMLO EQU $04 ;RAM POINTER MEM TST +TRAMSZ EQU $06 ;TEMP REG RAM SIZE +TSTDAT EQU $07 ;RAM TEST DATA REG +; +;CLEARED ON COLDSTART ONLY +; +WARMST EQU $08 ;WARM START FLAG +BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG +DOSVEC EQU $0A ;DOS START VECTOR +DOSINI EQU $0C ;DOS INIT ADDRESS +APPMHI EQU $0E ;APPL MEM HI LIMIT +; +;CLEARED ON COLD OR WARM START +; +POKMSK EQU $10 ;MASK POKEY IRQ +BRKKEY EQU $11 ;BREAK KEY FLAG +RTCLOK EQU $12 ;REAL TIME CLOCK +BUFADR EQU $15 ;INDIRECT BUFF ADDR +ICCOMT EQU $17 ;COMMAND FOR VECTOR +DSKFMS EQU $18 ;FMS POINTER +DSKUTL EQU $1A ;DISK UTILITIES PTR +ABUFPT EQU $1C ;RESERVED +ICHIDZ EQU $20 ;HANDLER INDEX # +ICDNOZ EQU $21 ;DEVICE NUMBER +ICCOMZ EQU $22 ;COMMAND CODE +ICSTAZ EQU $23 ;STATUS RETURN +ICBALZ EQU $24 ;BUFFER ADDRESS +ICBAHZ EQU $25 +ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1 +ICPTHZ EQU $27 +ICBLLZ EQU $28 ;BUFFER LENGTH +ICBLHZ EQU $29 +ICAX1Z EQU $2A ;AUXILIARY BYTES +ICAX2Z EQU $2B +ICSPRZ EQU $2C ;SPARE BYTES +ICIDNO EQU $2E ;IOCB # X 16 +CIOCHR EQU $2F ;CIO CHARACTER BYTE +STATUS EQU $30 ;INTERNAL STATUS +CHKSUM EQU $31 ;CHECKSUM +BUFRLO EQU $32 ;DATA BUFFER LO BYTE +BUFRHI EQU $33 ;DATA BUFFER HI BYTE +BFENLO EQU $34 ;NEXT BYTE PAST DATA +BFENHI EQU $35 ;BUFFER (HI & LO) +LTEMP EQU $36 ;LOADER TEMP +BUFRFL EQU $38 ;DATA BUFFR FULL FLG +RECVDN EQU $39 ;RECIEVE DONE FLAG +XMTDON EQU $3A ;XMIT DONE FLAG +CHKSNT EQU $3B ;CHECKSUM SENT FLAG +NOCKSM EQU $3C ;NO CHKSUM SENT FLAG +;BPTR EQU $3D ;CASSETTE DATA INDEX +FTYPE EQU $3E ;INTERRECORD GAP TYPE +FEOF EQU $3F ;END OF FILE FLAG +FREQ EQU $40 ;BEEP COUNT +SOUNDR EQU $41 ;NOISY I/O FLAG +CRITIC EQU $42 ;CRITICAL MODE +FMSZPG EQU $43 ;FMS ZERO PAGE +ZCHAIN EQU $4A ;HANDLER LOADER TEMP +DSTAT EQU $4C ;DISPLAY STATUS +ATRACT EQU $4D ;ATTRACT FLAG +DRKMSK EQU $4E ;DARK ATTRACT MASK +COLRSH EQU $4F ;COLOR SHIFTER +TMPCHR EQU $50 ;TEMP STORAGE +HOLD1 EQU $51 ;TEMP STORAGE +LMARGN EQU $52 ;LEFT MARGIN (1) +RMARGN EQU $53 ;RIGHT MARGIN (38) +ROWCRS EQU $54 ;CURSOR COUNTERS +COLCRS EQU $55 +DINDEX EQU $57 ;DISPLAY MODE # +SAVMSC EQU $58 ;SCREEN MEM ADDR +OLDROW EQU $5A ;DRAW START POSIT +OLDCOL EQU $5B +OLDCHR EQU $5D ;DATA UNDER CURSOR +OLDADR EQU $5E ;CURSOR MEM ADDR +FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER +PALNTS EQU $62 ;PAL/NTSC FLAG +LOGCOL EQU $63 ;COL IN LOGICAL LINE +ADRESS EQU $64 ;TEMP STORAGE +MLTEMP EQU $66 ;TEMP STORAGE +SAVADR EQU $68 ;TEMP STORAGE +RAMTOP EQU $6A ;AVAILABLE RAM PAGES +BUFCNT EQU $6B ;BUFFER COUNT +BUFSTR EQU $6C ;EDITOR GETCH POINTR +BITMSK EQU $6E ;BIT MASK +SHFAMT EQU $6F ;PIXEL JUSTIFICATION +ROWAC EQU $70 ;ROW ACCUMULATOR +COLAC EQU $72 ;COLUMN ACCUMULATOR +ENDPT EQU $74 ;LINE LENGTH +DELTAR EQU $76 ;DELTA ROW +DELTAC EQU $77 ;DELTA COLUMN +KEYDEF EQU $79 ;KEY DEFEAT POINTER +SWPFLG EQU $7B ;SPLIT SCN CURS CNTL +HOLDCH EQU $7C ;KB CHAR TEMP HOLD +INSDAT EQU $7D ;TEMP STORAGE +COUNTR EQU $7E ;DRAW ITERATION CNT +; +; 80-FF ARE RESERVED FOR USER +; +; NOTE: SEE FLOATING POINT +; SUBROUTINE AREA FOR ZERO +; PAGE CELLS +; +; PAGE 1 - HARDWARE STACK +; +; PAGE TWO RAM ASSIGNMENTS +; +VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR +VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR +VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR +VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR +VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR +VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ +VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY +VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE +VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ +VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ +VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ +VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR +CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1 +CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2 +CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3 +CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4 +CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5 +VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR +VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR +CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS +CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS +CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG +SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR +CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG +INTEMP EQU FAKEADDR ;IAN'S TEMP +CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG +DMACTLS EQU FAKEADDR ;SAVE DMACTL REG +DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO +;SDLSTH EQU $0231 ;SAVE DISP LIST HI +SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM +LCOUNT EQU FAKEADDR ;LOADER TEMP +LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL +LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL +BRKKY EQU FAKEADDR ;BREAK KEY VECTOR +RELADR EQU FAKEADDR ;LOADER REL ADDR +CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV +CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND +CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1 +CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2 +;TEMP EQU $023E ;TEMPORARY RAM CELL +ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG +DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1) +DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS +BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS +COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS +RECLEN EQU FAKEADDR ;LOADER LENGTH +DSKTIM EQU FAKEADDR ;DISK TIME OUT REG +VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP +KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG +FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200) +GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY +PADDL0 EQU FAKEADDR ;POT 0 RAM CELL +PADDL1 EQU FAKEADDR +PADDL2 EQU FAKEADDR +PADDL3 EQU FAKEADDR +STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL +STICK1 EQU FAKEADDR +PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0 +PTRIG1 EQU FAKEADDR +PTRIG2 EQU FAKEADDR +PTRIG3 EQU FAKEADDR +STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0 +STRIG1 EQU FAKEADDR +HIBYTE EQU FAKEADDR ;LOADER +WMODE EQU FAKEADDR ;CASSETTE R/W MODE +BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE +IMASK EQU FAKEADDR +JVECK EQU FAKEADDR ;JUMP VECTOR +NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS +TXTROW EQU FAKEADDR ;TEXT ROWCRS +TXTCOL EQU FAKEADDR ;TEXT COLCRS +TINDEX EQU FAKEADDR ;TEXT INDEX +TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD +TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL +CRETRY EQU FAKEADDR ;# COMMAND RETRIES +HOLD3 EQU FAKEADDR +SUBTMP EQU FAKEADDR +HOLD2 EQU FAKEADDR +DMASK EQU FAKEADDR ;PIXEL LOCATION MASK +TMPLBT EQU FAKEADDR +ESCFLG EQU FAKEADDR ;ESCAPE FLAG +TABMAP EQU FAKEADDR ;TAB STOP MAP +LOGMAP EQU FAKEADDR ;LINE START BIT MAP +INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG +FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW +TMPROW EQU FAKEADDR +TMPCOL EQU FAKEADDR +SCRFLG EQU FAKEADDR ;SET IF SCROLLING +HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW +DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES +SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG +BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN +PCOLR0 EQU FAKEADDR ;P0 COLOR +PCOLR1 EQU FAKEADDR ;P1 COLOR +PCOLR2 EQU FAKEADDR ;P2 COLOR +PCOLR3 EQU FAKEADDR ;P3 COLOR +COLOR0 EQU FAKEADDR ;COLOR 0 +COLOR1 EQU FAKEADDR +COLOR2 EQU FAKEADDR +COLOR3 EQU FAKEADDR +COLOR4 EQU FAKEADDR +COLBAKS EQU COLOR4 +CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM +; +; COLLEEN MNEMONICS +; +; --------------------------------------------------------------------------- +POKEY EQU FAKEADDR +; --------------------------------------------------------------------------- +; +; READ +; +POT0 EQU POKEY+$00 +POT1 EQU POKEY+$00 +POT2 EQU POKEY+$00 +POT3 EQU POKEY+$00 +POT4 EQU POKEY+$00 +POT5 EQU POKEY+$00 +POT6 EQU POKEY+$00 +POT7 EQU POKEY+$00 +ALLPOT EQU POKEY+$00 +KBCODE EQU POKEY+$00 +; !!!!! +RANDOM EQU POKEY+$00 +; +POTGO EQU POKEY+$00 +SERIN EQU POKEY+$00 +IRQST EQU POKEY+$00 +SKSTAT EQU POKEY+$00 +; +; WRITE +; +AUDF1 EQU POKEY+$00 +AUDC1 EQU POKEY+$00 +AUDF2 EQU POKEY+$00 +AUDC2 EQU POKEY+$00 +AUDF3 EQU POKEY+$00 +AUDC3 EQU POKEY+$00 +AUDF4 EQU POKEY+$00 +AUDC4 EQU POKEY+$00 +AUDCTL EQU POKEY+$00 +STIMER EQU POKEY+$00 +SKRES EQU POKEY+$00 +SEROUT EQU POKEY+$00 +IRQEN EQU POKEY+$00 +SKCTL EQU POKEY+$00 +; +; +; +; --------------------------------------------------------------------------- +GTIA EQU FAKEADDR +; --------------------------------------------------------------------------- +; +; WRITE +; +HPOSP0 EQU GTIA+$00 +HPOSP1 EQU GTIA+$00 +HPOSP2 EQU GTIA+$00 +HPOSP3 EQU GTIA+$00 +HPOSM0 EQU GTIA+$00 +HPOSM1 EQU GTIA+$00 +HPOSM2 EQU GTIA+$00 +HPOSM3 EQU GTIA+$00 +SIZEP0 EQU GTIA+$00 +SIZEP1 EQU GTIA+$00 +SIZEP2 EQU GTIA+$00 +SIZEP3 EQU GTIA+$00 +SIZEM EQU GTIA+$00 +GRAFP0 EQU GTIA+$00 +GRAFP1 EQU GTIA+$00 +GRAFP2 EQU GTIA+$00 +GRAFP3 EQU GTIA+$00 +GRAFM EQU GTIA+$00 +COLPM0 EQU GTIA+$00 +COLPM1 EQU GTIA+$00 +COLPM2 EQU GTIA+$00 +COLPM3 EQU GTIA+$00 +COLPF0 EQU GTIA+$00 +COLPF1 EQU GTIA+$00 +COLPF2 EQU GTIA+$00 +COLPF3 EQU GTIA+$00 +COLBAK EQU GTIA+$00 +PRIOR EQU GTIA+$00 +VDELAY EQU GTIA+$00 +GRACTL EQU GTIA+$00 +HITCLR EQU GTIA+$00 +CONSOL EQU GTIA+$00 +; +; READ +; +M0PF EQU GTIA+$00 +M1PF EQU GTIA+$00 +M2PF EQU GTIA+$00 +M3PF EQU GTIA+$00 +P0PF EQU GTIA+$00 +P1PF EQU GTIA+$00 +P2PF EQU GTIA+$00 +P3PF EQU GTIA+$00 +M0PL EQU GTIA+$00 +M1PL EQU GTIA+$00 +M2PL EQU GTIA+$00 +M3PL EQU GTIA+$00 +P0PL EQU GTIA+$00 +P1PL EQU GTIA+$00 +P2PL EQU GTIA+$00 +P3PL EQU GTIA+$00 +TRIG0 EQU GTIA+$00 +TRIG1 EQU GTIA+$00 +TRIG2 EQU GTIA+$00 +TRIG3 EQU GTIA+$00 +PAL EQU GTIA+$00 +; +; +; --------------------------------------------------------------------------- +ANTIC EQU FAKEADDR +; --------------------------------------------------------------------------- +; +DMACTL EQU ANTIC+$00 +CHACTL EQU ANTIC+$00 +DLPTR EQU ANTIC+$00 +;DLISTH EQU ANTIC+$00 +HSCROL EQU ANTIC+$00 +VSCROL EQU ANTIC+$00 +PMBASE EQU ANTIC+$00 +CHBASE EQU ANTIC+$00 +WSYNC EQU ANTIC+$00 +; !!!! +VCOUNT EQU ANTIC+$00 +; ---- +PENH EQU ANTIC+$00 +PENV EQU ANTIC+$00 +NMIEN EQU ANTIC+$00 +NMIRES EQU ANTIC+$00 +NMIST EQU ANTIC+$00 +; +; +; --------------------------------------------------------------------------- +PIA EQU FAKEADDR +; --------------------------------------------------------------------------- +; +PORTA EQU PIA+0 +PORTB EQU PIA+0 +PACTL EQU PIA+0 +PBCTL EQU PIA+0 +; +; --------------------------------------------------------------------------- +; Atari ANTIC chip display list equates +; --------------------------------------------------------------------------- +; +JUMP EQU $01 ; display list jump instruction (3 byte) +JVB EQU $41 ; display list jump and wait for vblank instruction (3) +; +SCH EQU $10 ; display list horizontal scrolling +SCV EQU $20 ; display list vertical scrolling +LMS EQU $40 ; display list load memory scan instruction (3 byte) +DLII EQU $80 ; display list interrupt instruction +; +SKIP1 EQU $00 ; display list skip 1 scan line instruction +SKIP2 EQU $10 ; display list skip 2 scan lines instruction +SKIP3 EQU $20 ; display list skip 3 scan lines instruction +SKIP4 EQU $30 ; display list skip 4 scan lines instruction +SKIP5 EQU $40 ; display list skip 5 scan lines instruction +SKIP6 EQU $50 ; display list skip 6 scan lines instruction +SKIP7 EQU $60 ; display list skip 7 scan lines instruction +SKIP8 EQU $70 ; display list skip 8 scan lines instruction +; +MODE2 EQU $02 ; display list mode 2 +MODE4 EQU $04 ; display list mode 4 +MODE8 EQU $08 ; display list mode 8 +MODEE EQU $0E ; display list mode E +MODEF EQU $0F ; display list mode F +; --------------------------------------------------------------------------- +; ENUMS +; --------------------------------------------------------------------------- + +.enum @dmactl + blank = %00 + narrow = %01 + standard= %10 + wide = %11 + missiles= %100 + players = %1000 + lineX1 = %10000 + lineX2 = %00000 + dma = %100000 +.ende + +scr48 = @dmactl(wide|dma|players|missiles|lineX1) +scr40 = @dmactl(standard|dma|players|missiles|lineX1) +scr32 = @dmactl(narrow|dma|players|missiles|lineX1) + +.enum @pmcntl + missiles= %1 + players = %10 + trigs = %100 +.ende + +.enum @gtictl + prior0 = %0 + prior1 = %1 + prior2 = %10 + prior4 = %100 + prior8 = %1000 + ply5 = %10000 ; Fifth Player Enable + mlc = %100000 ; Multiple Color Player Enable + mode9 = %01000000 + mode10 = %10000000 + mode11 = %11000000 +.ende +; --------------------------------------------------------------------------- +; KBCODEs +; --------------------------------------------------------------------------- +.enum @kbcode + _none = 255 + _esc = 28 + _1 = 31 + _2 = 30 + _3 = 26 + _4 = 24 + _5 = 29 + _6 = 27 + _7 = 51 + _8 = 53 + _9 = 48 + _0 = 50 + _lt = 54 + _gt = 55 + _del = 52 + _tab = 44 + _Q = 47 + _W = 46 + _E = 42 + _R = 40 + _T = 45 + _Y = 43 + _U = 11 + _I = 13 + _O = 8 + _P = 10 + _min = 14 + _up = 14 ; cursor function + _eq = 15 + _down = 15 ; cursor function + _ret = 12 + _A = 63 + _S = 62 + _D = 58 + _F = 56 + _G = 61 + _H = 57 + _J = 1 + _K = 5 + _L = 0 + _semicolon = 2 + _plus = 6 + _left = 6 ; cursor function + _asterisk = 7 + _right = 7 ; cursor function + _caps = 60 + _Z = 23 + _X = 22 + _C = 18 + _V = 16 + _B = 21 + _N = 36 + _M = 37 + _comma = 32 + _dot = 34 + _slash = 38 + _atari = 39 + _help = 17 + _F1 = 3 + _F2 = 4 + _F3 = 19 + _F4 = 20 + _space = 33 +.ende \ No newline at end of file diff --git a/scorchC64.asm b/scorchC64.asm index 854b222..d83175d 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -19,7 +19,7 @@ opt h-f+ org $801 org [a($801)],$801 - basic_start(START) + basic_start(FirstSTART) ;--------------------------------------------------- @@ -153,6 +153,7 @@ FirstZpageVariable = $57 ;----------------------------------------------- ; libraries ;----------------------------------------------- + icl 'C64/lib/C64_ATARISYS.ASM' icl 'C64/lib/C64SYS.ASM' icl 'C64/lib/MACRO.ASM' From b13b53602b42775203d73cf16a653cfdb8de39a4 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 5 May 2023 14:13:07 +0200 Subject: [PATCH 09/65] C64 Random --- C64/lib/C64SYS.ASM | 2 ++ C64/lib/C64_ATARISYS.ASM | 2 +- C64/lib/MACRO.ASM | 13 +++++++- scorchC64.asm | 68 ++-------------------------------------- 4 files changed, 18 insertions(+), 67 deletions(-) diff --git a/C64/lib/C64SYS.ASM b/C64/lib/C64SYS.ASM index 9b3f0b6..47d3f96 100644 --- a/C64/lib/C64SYS.ASM +++ b/C64/lib/C64SYS.ASM @@ -45,3 +45,5 @@ vic_spr4_color = $D02B vic_spr5_color = $D02C vic_spr6_color = $D02D vic_spr7_color = $D02E + +RANDOM = $D41B diff --git a/C64/lib/C64_ATARISYS.ASM b/C64/lib/C64_ATARISYS.ASM index 26a00e5..cd96f29 100644 --- a/C64/lib/C64_ATARISYS.ASM +++ b/C64/lib/C64_ATARISYS.ASM @@ -376,7 +376,7 @@ POT7 EQU POKEY+$00 ALLPOT EQU POKEY+$00 KBCODE EQU POKEY+$00 ; !!!!! -RANDOM EQU POKEY+$00 +;RANDOM EQU POKEY+$00 ; POTGO EQU POKEY+$00 SERIN EQU POKEY+$00 diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM index 9ff9cae..c077046 100644 --- a/C64/lib/MACRO.ASM +++ b/C64/lib/MACRO.ASM @@ -210,4 +210,15 @@ upstartEnd eif sta $d018 -.end \ No newline at end of file +.end + +// +// Once this is done, random values appear in location $D41B (RANDOM) +// +.macro InitializeSIDrnd + LDA #$FF ; maximum frequency value + STA $D40E ; voice 3 frequency low byte + STA $D40F ; voice 3 frequency high byte + LDA #$80 ; noise waveform, gate bit off + STA $D412 ; voice 3 control register +.endm \ No newline at end of file diff --git a/scorchC64.asm b/scorchC64.asm index d83175d..91e2522 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -204,18 +204,8 @@ FirstSTART jsr GenerateLineTable - ; RMT INIT - lda #$f0 ;initial value - sta RMTSFXVOLUME ;sfx note volume * 16 (0,16,32,...,240) - - lda #$ff ;initial value - sta sfx_effect - - RMTSong 0 - - VMAIN VBLinterrupt,7 ;jsr SetVBL - - mva #2 chactl ; necessary for 5200 + ; Random INIT + InitializeSIDrnd ;-------------------------------------------------- ; Main program of the game @@ -408,29 +398,6 @@ noingame mva #0 RMT_blocked rts .endp -;------------------------------------------------- -.proc CopyFromROM -;------------------------------------------------- -;copy from CART to RAM -; trashes: Y -; temp: source -; temp2: destination -; modify: destination-end -;usage: -; mwa #DisplayCopyRom temp -; mwa #display temp2 -; mwa #DisplayCopyEnd+1 modify -; jsr CopyFromROM - - ldy #0 -@ lda (temp),y - sta (temp2),y - inw temp - inw temp2 - cpw temp2 modify - bne @- - rts -.endp ;-------------------------------------------------- icl 'C64/interrupts.asm' ;---------------------------------------------- @@ -451,9 +418,6 @@ TankFont ;---------------------------------------------- font4x4 ins 'artwork/font4x4s.bmp',+62 -;---------------------------------------------- -;RMT PLAYER loading shenaningans - icl 'artwork/sfx/rmtplayr_modified.asm' ;------------------------------------------------- .proc CheckTankCheat ldy #$07 @@ -515,33 +479,7 @@ EndofBFGDLI SetDLI DLIinterruptGraph ; blinking off rts .endp -;-------------------------------------------------- - .IF * > MODUL-1 - .ECHO * - .ERROR 'Code and data too long' - .ENDIF - .ECHO "Bytes left: ",$b000-* - - - org $b000 ;address of RMT module -MODUL - ;RMT module is standard Atari binary file already - ins "artwork/sfx/scorch_str9-NTSC.rmt",+6 ;include music RMT module -MODULEND ;---------------------------------------------- icl 'constants_top.asm' ;---------------------------------------------- - - .ECHO "Bytes on top left: ",$bfe8-* ;ROM_SETTINGS-* - .IF target = 5200 - .IF * > ROM_SETTINGS-1 - .ERROR 'Code and RMT song too long to fit in 5200' - .ENDIF - org ROM_SETTINGS ; 5200 ROM settings address $bfe8 - ; "01234567890123456789" - .byte " scorch supersystem " ;20 characters title - .byte " ", $ff ;$BFFD == $ff means diagnostic cart, no splash screen - .word FirstSTART - .ELSE - run FirstSTART - .ENDIF + \ No newline at end of file From b438982e3d88e2c1c3f6b524102bde6304f2a20f Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 8 May 2023 09:55:37 +0200 Subject: [PATCH 10/65] Continued work - version for C64 --- C64/gr_basics.asm | 224 ++++++ C64/interrupts.asm | 22 + C64/lib/MACRO.ASM | 2 +- C64/textproc.asm | 1793 ++++++++++++++++++++++++++++++++++++++++++++ scorchC64.asm | 6 + 5 files changed, 2046 insertions(+), 1 deletion(-) create mode 100644 C64/gr_basics.asm create mode 100644 C64/interrupts.asm create mode 100644 C64/textproc.asm diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm new file mode 100644 index 0000000..7ad8115 --- /dev/null +++ b/C64/gr_basics.asm @@ -0,0 +1,224 @@ +.IF *>0 ;this is a trick that prevents compiling this file alone + +; Basic hardware-dependent graphics routines. + +; ----------------------------------------- +.proc unPlot +; plots a point and saves the plotted byte, reverts the previous plot. +; ----------------------------------------- + ldx #0 ; only one pixel +unPlotAfterX + stx WhichUnPlot + + ; first remake the oldie + lda oldplotL,x + sta oldplot + lda oldplotH,x + sta oldplot+1 + + lda oldply,x + tay + lda oldora,x + sta (oldplot),y + + + ; is it not out of the screen ???? + cpw ydraw #screenheight + jcc CheckX + mwa #0 ydraw +CheckX + cpw xdraw #screenwidth + jcs EndOfUnPlot +MakeUnPlot + ; let's count coordinates taken from xdraw and ydraw + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr +;--- + tay + ldx WhichUnPlot + tya + sta oldply,x + + ldx ydraw + lda linetableL,x + sta xbyte + sta oldplot + lda linetableH,x + sta xbyte+1 + sta oldplot+1 + + lda xdraw + and #$7 + tax + + lda color + bne ClearUnPlot + + ;plotting here + lda (xbyte),y + sta OldOraTemp + ora bittable,x + sta (xbyte),y + bne ContinueUnPlot ; allways <>0 +ClearUnPlot + lda (xbyte),y + sta OldOraTemp + and bittable2,x + sta (xbyte),y +ContinueUnPlot + ldx WhichUnPlot + lda OldOraTemp + sta oldora,x + lda oldplot + sta oldplotL,x + lda oldplot+1 + sta oldplotH,x + ; and now we must solve the problem of several plots + ; in one byte + ldx #4 + ldy WhichUnPlot +LetsCheckOverlapping + cpx WhichUnPlot + beq SkipThisPlot + lda oldplotL,x + cmp oldplotL,y + bne NotTheSamePlot + lda oldplotH,x + cmp oldplotH,y + bne NotTheSamePlot + lda oldply,x + cmp oldply,y + bne NotTheSamePlot + ; the pixel is in the same byte so let's take correct contents + lda oldora,x + sta oldora,y +NotTheSamePlot +SkipThisPlot + dex + bpl LetsCheckOverlapping +EndOfUnPlot + rts +.endp + +; ----------------------------------------- +.proc plot ;plot (xdraw, ydraw, color) +; color == 1 --> put pixel +; color == 0 --> erase pixel +; this is one of the most important routines in the whole +; game. If you are going to speed up the game, start with +; plot - it is used by every single effect starting from explosions +; through line drawing and small text output!!! +; +; Optimized by 0xF (Fox) THXXXX!!! + +; ----------------------------------------- + ; is it not over the screen ??? + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + bcs unPlot.EndOfUnPlot ;nearest RTS +CheckX02 + cpw xdraw #screenwidth + bcs EndOfPlot +MakePlot + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidth = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + lda color + bne ClearPlot + + lda (xbyte),y + ora bittable,x + sta (xbyte),y +EndOfPlot + rts +ClearPlot + lda (xbyte),y + and bittable2,x + sta (xbyte),y + rts +.endp + +; ----------------------------------------- +.proc point_plot +; ----------------------------------------- + ; checks state of the pixel (coordinates in xdraw and ydraw) + ; result is in A (zero or appropriate bit is set) + + ; let's calculate coordinates from xdraw and ydraw + + ;xbyte = xbyte/8 + lda xdraw+1 + lsr + lda xdraw + ror ;just one bit over 256. Max screenwidht = 512!!! + lsr + lsr + sta xbyte + ;--- + ldx ydraw + ldy linetableL,x + lda linetableH,x + sta xbyte+1 + + lda xdraw + and #$7 + tax + + lda (xbyte),y + eor #$ff + and bittable,x + rts +.endp + +;-------------------------------------------------- +.proc ClearScreen +;-------------------------------------------------- + mwa #display temp + ldy #0 +@ lda #$ff + sta (temp),y + inw temp + cpw temp #display+screenheight*screenBytes+1 + bne @- + rts +.endp + +;-------------------------------------------------- +.proc GenerateLineTable + + mwa #displayC64 temp + mwa #linetableL temp2 + mwa #linetableH modify + ldy #0 +@ lda temp + sta (temp2),y + lda temp+1 + sta (modify),y + adw temp #40 + iny + cpy #screenheight+1 + bne @- + rts +.endp + +.ENDIF \ No newline at end of file diff --git a/C64/interrupts.asm b/C64/interrupts.asm new file mode 100644 index 0000000..e2bccab --- /dev/null +++ b/C64/interrupts.asm @@ -0,0 +1,22 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + + .IF *>0 ;this is a trick that prevents compiling this file alone + + +;-------------------------------------------------- +.macro SetDLI +; SetDLI #WORD +; Initialises Display List Interrupts + LDY # <:1 + LDX # >:1 + jsr _SetDLIproc +.endm +.proc _SetDLIproc +; LDA #$C0 +; STY VDSLST +; STX VDSLST+1 +; STA NMIEN + rts +.endp + + .ENDIF diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM index c077046..fcbb714 100644 --- a/C64/lib/MACRO.ASM +++ b/C64/lib/MACRO.ASM @@ -85,7 +85,7 @@ upstartEnd // Set Data Direction for CIA #2, Port A to output // lda $dd02 - and #%11111100 // Mask the bits we're interested in. + and #%11111100 // Mask the bits were interested in. ora #$03 // Set bits 0 and 1. sta $dd02 diff --git a/C64/textproc.asm b/C64/textproc.asm new file mode 100644 index 0000000..0fd63d8 --- /dev/null +++ b/C64/textproc.asm @@ -0,0 +1,1793 @@ +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + + + .IF *>0 +;---------------------------------------- +; this module contains routines used in text mode +; like shop and start-up options +;---------------------------------------- + +;-------------------------------------------------- +.proc Options +;-------------------------------------------------- +; start-up screen - options, etc. +; this function returns: +; - number of players (NumberOfPlayers) +; - money each player has on the beginning of the game (moneyL i moneyH) +; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight + + jsr clearscreen ;let the screen be clean + + mwa #DisplayCopyRom temp + mwa #display temp2 + mwa #DisplayCopyEnd+1 modify + jsr CopyFromROM + + mwa #OptionsDL dlptrs + + lda #%00111110 ; normal screen width, DL on, P/M on + sta dmactls + jsr SetPMWidth + mva #TextBackgroundColor COLOR2 + jsr ColorsOfSprites + mva #$ca COLOR1 + mva #$00 COLBAKS ; set color of background + + SetDLI DLIinterruptOptions ; jsr SetDLI for Options text screen + +; -------- setup bottom (tanks) line + lda NumberOfPlayers + pha + lda mountainsDeltaTableH + sta mountainDeltaH + lda mountainsDeltaTableL + sta mountainDeltaL + mva #6 NumberOfPlayers + jsr PMoutofScreen ;let P/M disappear + ;jsr clearscreen ;let the screen be clean (clean-ish already) + jsr ClearPMmemory + jsr placetanks ;let the tanks be evenly placed + jsr calculatemountains ;let mountains be easy for the eye + jsr drawmountains ;draw them + ldx NumberOfPlayers + dex +@ jsr RandomizeAngle + sta AngleTable,x + dex + bpl @- + jsr drawtanks ;finally draw tanks + pla + sta NumberOfPlayers +; -------- + + mva #0 OptionsY + +OptionsMainLoop + + lda WindChangeInRound + sta OptionsHere+126 + + jsr OptionsInversion + jsr getkey + bit escFlag + spl:rts + + cmp #@kbcode._down ; $f ;cursor down + bne OptionsNoDown + inc:lda OptionsY + cmp #maxoptions + bne OptionsMainLoop + mva #maxoptions-1 OptionsY + jmp OptionsMainLoop + +OptionsNoDown + cmp #@kbcode._up ; $e ;cursor up + bne OptionsNoUp + dec OptionsY + bpl OptionsMainLoop + mva #0 OptionsY + jmp OptionsMainLoop + +OptionsNoUp + cmp #@kbcode._left ; $6 ;cursor left + bne OptionsNoLeft + ldx OptionsY + dec OptionsTable,X + lda OptionsTable,X + bpl OptionsMainLoop + inc OptionsTable,X + jmp OptionsMainLoop + +OptionsNoLeft + cmp #@kbcode._right ; $7 ;cursor right + bne OptionsNoRight + + ldx OptionsY + inc OptionsTable,X + lda OptionsTable,X + cmp #5 ; number of columns in options + bne OptionsMainLoop + dec OptionsTable,X + jmp OptionsMainLoop + +OptionsNoRight + cmp #@kbcode._ret ; $c ;Return key + bne OptionsNoReturn + rts ; options selected + +OptionsNoReturn + cmp #@kbcode._tab ; Tab key + bne OptionsNoTab + jsr SelectNextGradient +OptionsNoTab + jmp OptionsMainLoop +.endp +.proc SelectNextGradient + lda OptionsY ; if "Wind" option selected + cmp #$03 + bne NotWind + lda WindChangeInRound ; wind change after each turn (not round only) flag + eor #$1f ; '?' character + sta WindChangeInRound + rts +NotWind + ldy GradientNr + iny + cpy #$03 + bne NoGradientLoop + ldy #$00 +NoGradientLoop + sty GradientNr + lda GradientAddrL,y + sta GradientColors + lda GradientAddrH,y + sta GradientColors+1 + rts +.endp +;-------- +; inversing selected option (cursor) +;-------- +.proc OptionsInversion +YPos = temp2 +XPos = temp2+1 +optionWidth = 6 +nameWidth = 10 + mwa #OptionsHere temp ; offset of the first option=11 + mva #0 YPos ;option number pointer + mva #0 Xpos ;X position in the menu + tay ; Y is zero here... +OptionsSetMainLoop + ldx YPos ; Y position in the menu +;inversing the first few chars of the selected line (OptionsY) + cpx OptionsY + jsr _inverter + cpy #nameWidth-1 + bne OptionsSetMainLoop + adw temp #nameWidth + ldy #0 + +OptionsLoop + lda XPos + cmp OptionsTable,x + jsr _inverter + cpy #optionWidth ; width of the option highlight + bne OptionsLoop + ldy #0 + ; next X position of the + adw temp #optionWidth ; width of the option highlight + inc:lda XPos + cmp #5 ; number of options in a row + bne OptionsLoop + ; next line + ;adw temp #nameWidth ; beginning of the next line + mva #0 Xpos + tay + inc:lda Ypos + cmp #maxOptions + bne OptionsSetMainLoop + rts + +_inverter + beq invertme + ; clean inversion otherwise + lda (temp),y + and #$7f ; clear the top bit + sta (temp),y + bpl @+ ; JMP +invertme + lda (temp),y + ora #$80 ; set the top bit + sta (temp),y +@ + ; next character in an option + iny + rts +.endp + +; -------------------------------------- +; Sets the appropriate variables based on the options table +; +.proc SetVariablesFromOptions + ;first option + ldy OptionsTable + iny + iny + sty NumberOfPlayers ;1=1 player (but minimum is 2) + + ;second option (cash) + + + ldy OptionsTable+1 + ldx #0 +@ + lda CashOptionL,y + sta moneyL,x + lda CashOptionH,y + sta moneyH,x + inx + cpx NumberOfPlayers + bne @- + + ;third option (gravity) + ldy OptionsTable+2 + lda GravityTable,y + sta gravity + + ;fourth option (wind) + ldy OptionsTable+3 + lda MaxWindTable,y + sta MaxWind + + ;fifth option (no of rounds) + ldy OptionsTable+4 + lda RoundsTable,y + sta RoundsInTheGame + + ;6th option (shell speed) + ldy OptionsTable+5 + lda flyDelayTable,y + sta flyDelay + + ;7th option (Airstrike after how many missess) + ldy OptionsTable+6 + lda seppukuTable,y + sta seppukuVal + + ;8th option (how aggressive are mountains) + ldy OptionsTable+7 + lda mountainsDeltaTableH,y + sta mountainDeltaH + lda mountainsDeltaTableL,y + sta mountainDeltaL + + + rts +.endp + +;------------------------------------------- +; call of the purchase (and activate) screens for each tank +.proc CallPurchaseForEveryTank + + mva #0 TankNr + sta isInventory +@ + ldx TankNr + lda SkillTable,x + beq ManualPurchase + jsr PurchaseAI ; remember to make ActivateAI :) !!! + jmp AfterManualPurchase +ManualPurchase + lda JoyNumber,x + sta JoystickNumber ; set joystick port for player + mva #0 isInventory + jsr Purchase ; purchase weapons + bit escFlag + spl:rts + jsr DefensivesActivate ; activate weapons + bit escFlag + spl:rts +AfterManualPurchase + inc:lda TankNr + cmp NumberOfPlayers + bne @- + rts +.endp +;-------------------------------------------------- +.proc DefensivesActivate +;-------------------------------------------------- +; This proc call Inventory and set Defensives activation first + + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + mva #$ff IsInventory + mva #%10000000 WhichList + ; offensive weapon - 0, defensive - %10000000 + jmp Purchase.GoToActivation +.endp + +;-------------------------------------------------- +.proc CopyFromPurchaseAndGameOver + mwa #DisplayCopyPurchaseDlROM temp + mwa #DisplayCopyPurchase temp2 + mwa #DisplayCopyPurchaseEnd+1 modify + jmp CopyFromROM ; jsr:rts +.endp + +;-------------------------------------------------- +.proc Purchase ; +;-------------------------------------------------- +; In tanknr there is a number of the tank (player) +; that is buying weapons now (from 0). +; Rest of the data is taken from appropriate tables +; and during the purchase these tables are modified. + + jsr CopyFromPurchaseAndGameOver + + mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons + +; we are clearing list of the weapons + mva #$00 WhichList + ; offensive weapon - 0, deffensive - %10000000 +GoToActivation + mva #$ff LastWeapon + + SetDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen + jsr PMoutofScreen + mwa #PurchaseDL dlptrs + lda #@dmactl(narrow|dma) ; narrow screen width, DL on, P/M off + sta dmactls + + lda #song_supermarket + bit IsInventory + bpl @+ + lda #song_inventory +@ jsr RmtSongSelect + + ldx tankNr + lda TankStatusColoursTable,x + sta COLOR2 + + ; there is a tank (player) number in tanknr + ; we are displaying name of the player + lda #$ca + sta COLOR1 ; set color of header text + ldy #0 + sty COLBAKS ; set color of background + lda tanknr + :3 asl ; 8 chars per name + tax +NextChar03 + lda tanksnames,x + sta purchaseTextBuffer+7,y + inx + iny + cpy #$08 + bne NextChar03 + ; displaying number of active controller port + ldy JoystickNumber + lda digits+1,y + sta purchaseTextBuffer+17 + + ; and we display cash of the given player + +; here we must jump in after each purchase +; to generate again list of available weapons +AfterPurchase + + ; current cash display + mva #sfx_purchase sfx_effect + ldx tanknr + lda moneyL,x + sta decimal + lda moneyH,x + sta decimal+1 + mwa #purchaseTextBuffer+26 displayposition + jsr displaydec5 + + ; in xbyte there is the address of the line that + ; is being processed now + mwa #ListOfWeapons xbyte + ldx #$00 ; index of the checked weapon + stx HowManyOnTheListOff ; amounts of weapons (shells, bullets) in both lists + stx HowManyOnTheListDef + + jsr CreateList + + bit isInventory ; + bpl ChoosingItemForPurchase + + lda whichList + bne PositionDefensive + +; calculate positionOnTheList from the activeWeapon (offensives) + ldx tankNr + lda activeWeapon,x + ldy #0 +@ + cmp IndexesOfWeaponsL1,y + beq ?weaponfound + iny + cpy #(last_offensive_____ - first_offensive____)+1 ; maxOffensiveWeapons + bne @- + ; not found apparently? + ; TODO: check border case (the last weapon) + ldy #0 + beq ?weaponFound ; jmp +PositionDefensive + jsr calcPosDefensive + + +?weaponFound + ; weapon index in Y + sty positionOnTheList + jsr _MakeOffsetDown ; set list screen offset + +; Here we have all we need +; So choose the weapon for purchase ...... +;-------------------------------------------------- +ChoosingItemForPurchase +;-------------------------------------------------- + + jsr PutLitteChar ; Places pointer at the right position + jsr getkey + bit escFlag + bpl @+ + mva #0 escFlag + jmp WaitForKeyRelease ; like jsr ... : rts +@ + cmp #@kbcode._tab ; $2c ; Tab + jeq ListChange + cmp #@kbcode._left ; $06 ; cursor left + jeq ListChange + cmp #@kbcode._ret ; $0c ; Return + sne:rts + cmp #@kbcode._up ; $e + beq PurchaseKeyUp + cmp #@kbcode._down ; $f + beq PurchaseKeyDown + cmp #@kbcode._space ; $21 ; Space + jeq PurchaseWeaponNow + cmp #@kbcode._right ; $07 ; cursor right + jeq PurchaseWeaponNow + bne ChoosingItemForPurchase + +PurchaseKeyUp + lda WhichList + bpl GoUpOffensive + dec PositionOnTheList + bpl EndUpX + ldy HowManyOnTheListDef + dey + sty PositionOnTheList + jmp MakeOffsetDown +GoUpOffensive + dec PositionOnTheList + bpl MakeOffsetUp + ldy HowManyOnTheListOff + dey + sty PositionOnTheList + jmp MakeOffsetDown +MakeOffsetUp + ; If offset is larger than pointer position, + ; it must be equal then. + lda PositionOnTheList + cmp OffsetDL1 + bcs EndUpX ; do not modify the offset + sta OffsetDL1 +EndUpX + jmp ChoosingItemForPurchase +PurchaseKeyDown + lda WhichList + bpl GoDownOffensive + inc:lda PositionOnTheList + cmp HowManyOnTheListDef + bne EndGoDownX + ldy #0 + sty PositionOnTheList + beq MakeOffsetUp +GoDownOffensive + inc:lda PositionOnTheList + cmp HowManyOnTheListOff + bne MakeOffsetDown + ldy #0 + sty PositionOnTheList + beq MakeOffsetUp +MakeOffsetDown + jsr _MakeOffsetDown +EndGoDownX + jmp ChoosingItemForPurchase + +_MakeOffsetDown + lda OffsetDL1 + clc + adc #15 + ;if offset+16 is lower than the position then it must =16 + cmp PositionOnTheList + bcs _EndGoDownX + sec + lda PositionOnTheList + sbc #15 + sta OffsetDL1 +_EndGoDownX + rts + +; swapping the displayed list and setting pointer to position 0 +ListChange + mva #0 OffsetDL1 + + lda WhichList + eor #%10000000 ; flip WhichList + sta WhichList + bne DeffensiveSelected + + mwa #ListOfWeapons WeaponsListDL + lda isInventory + beq @+ + ; inventory + jsr calcPosOffensive + jsr _MakeOffsetDown ; set list screen offset + jmp ChoosingItemForPurchase +@ + mva #0 PositionOnTheList + jmp ChoosingItemForPurchase + +DeffensiveSelected + mwa #ListOfDefensiveWeapons WeaponsListDL + lda isInventory + beq @+ + jsr calcPosDefensive + jmp ChoosingItemForPurchase +@ + mva #0 positionOnTheList + jmp ChoosingItemForPurchase + +.endp +; +;-------------------------------------------------- +.proc CreateList +;-------------------------------------------------- +; Creating full list of the available weapons for displaying +; in X there is an index of the weapon to be checked, +; in 'Xbyte' address of the first char in filled screen line + +CreateList + stx temp ; index of a weapon will be necessary later + ; checking if the weapon of the given index is present + lda WeaponUnits,x + jeq NoWeapon + + ldy tanknr + + bit isInventory + jmi itIsInventory + + ; put "Purchase" on the screen + mwa #PurchaseDescription PurActDescAddr + ; and Title + mwa #PurchaseTitle DLPurTitleAddr + + ; checking if we can afford buying this weapon + ldx temp + lda moneyH,y + cmp WeaponPriceH,x + bne @+ + lda moneyL,y + cmp WeaponPriceL,x +@ + jcc TooLittleCash + + ; we have enough cash and the weapon can be + ; added to the list + + ; first parentheses and other special chars + ; (it's easier this way) + ;ldy #22 + ;lda #08 ; "(" + ;STA (XBYTE),y + ;ldy #32 + ;lda #09 ; ")" + ;sta (xbyte),y + ldy #24 + lda #15 ; "/" + sta (xbyte),y + ldy #30 + lda #16 ; "0" + sta (xbyte),y + + ;now number of units (shells) to be purchased + adw xbyte #22 displayposition ; 23 chars from the beginning of the line + lda WeaponUnits,x + sta decimal + jsr displaybyte + ldx temp ;getting back index of the weapon + + ; and now price of the weapon + adw xbyte #25 displayposition ; 26 chars from the beginning of the line + lda WeaponPriceL,x + sta decimal + lda WeaponPriceH,x + sta decimal+1 + jsr displaydec5 + ldy #25 ; overwrite first digit (allways space - no digit :) ) + lda #04 ; "$" + sta (xbyte),y + + jmp notInventory + +itIsInventory + ; put "Activate" on the screen + mwa #ActivateDescription PurActDescAddr + ; and Title + mwa #InventoryTitle DLPurTitleAddr + + ldx temp + lda TanksWeaponsTableL,y + sta weaponPointer + lda TanksWeaponsTableH,y + sta weaponPointer+1 + ldy temp + lda (weaponPointer),y + jeq noWeapon + + ; clear price area + ldy #21 ; beginning of the price area + lda #0 +@ sta (XBYTE),y + iny + cpy #32 ; end of price + bne @- + +notInventory + + ; number of posessed shells + lda temp ; weapon index again + jsr HowManyBullets + sta decimal + + adw xbyte #1 displayposition + jsr displaybyte + + ldx temp ;weapon index + ; now symbol of the weapon + lda WeaponSymbols,x + ldy #$4 ; 4 chars from the beginning of the line + sta (xbyte),y + + ; and now name of the weapon and finisheeeedd !!!! + mva #0 temp+1 ; this number is only in X + ; times 16 (it's length of the names of weapons) + ldy #3 ; Rotate 4 times +@ + asl temp + rol temp+1 + dey + bpl @- + + adw temp #NamesOfWeapons-6 weaponPointer + + ldy #6 ; from 6th char on screen + +@ + lda (weaponPointer),y + sta (xbyte),y + iny + cpy #(16+6) + bne @- + + + ; in X there is what we need (weapon index) + + ; If on screen after the purchase there is still + ; present the weapon purchased recently, + ; the pointer must point to it. + bit lastWeapon + bpl @+ ; if == $ff => first run, jump to top + mva #0 PositionOnTheList + beq NotTheSameAsLastTime +@ + cpx LastWeapon + bne NotTheSameAsLastTime + bit WhichList + bmi @+ + lda HowManyOnTheListOff + sta PositionOnTheList + jmp NotTheSameAsLastTime +@ + lda HowManyOnTheListDef + sta PositionOnTheList +NotTheSameAsLastTime + ; increase appropriate counter + txa + cpx #last_offensive_____+1 + bcs DefenceList + ldy HowManyOnTheListOff + sta IndexesOfWeaponsL1,y + inc HowManyOnTheListOff + bne NextLineOfTheList +DefenceList + ldy HowManyOnTheListDef + sta IndexesOfWeaponsL2,y + inc HowManyOnTheListDef + ; If everything is copied then next line +NextLineOfTheList + adw xbyte #32 +TooLittleCash +NoWeapon + + ; next weapon. If no more weapons then finish! + inx + cpx #last_offensive_____+1 + bne NoDefense + +; if we got to the defense weapons, +; we switch address to the second table. + mwa #ListOfDefensiveWeapons xbyte +NoDefense + cpx #last_defensive_____+1 + + jne CreateList + + ; offset may be only too big + ; (because after purchase list will never be longer) + ; check it and modify if necessary. + ; If offset is larger than position of the pointer, + ; it must be equal. + lda PositionOnTheList + cmp OffsetDL1 + bcs WeHaveOffset ; do not modify offset + sta OffsetDL1 +WeHaveOffset + + ; now we have to erase empty position of both lists. + + ; Multiply number on list 1 by 32 and set address + ; of the first erased char. + + lda HowManyOnTheListOff + sta xbyte ; multiplier (temporarily here, it will be erased anyway) + lda #$00 ; + sta xbyte+1 ; higher byte of the Result + ldx #$05 ; 2^5 +@ asl xbyte + rol xbyte+1 + dex + bne @- + + ; add to the address of the list + adw xbyte #ListOfWeapons + ldy #0 +ClearList1 + cpw xbyte #ListOfWeapons1End + beq ListCleared1 + tya ; now there is zero here + sta (xbyte),y + inw xbyte + jmp ClearList1 +ListCleared1 + ; And the same we do with the second list + + ; Multiply number on list 1 by 32 and set address + ; of the first erased char. + lda HowManyOnTheListDef + sta xbyte ; multiplier (temporarily here, it will be erased anyway) + lda #$00 ; + sta xbyte+1 ; higher byte of the Result + ldx #$05 ; 2^5 +@ asl xbyte + rol xbyte+1 + dex + bne @- + + ; add to the address of the list + adw xbyte #ListOfDefensiveWeapons + ldy #0 +ClearList2 + cpw xbyte #ListOfDefensiveWeaponsEnd + beq ListCleared2 + tya ; now there is zero here + sta (xbyte),y + inw xbyte + jmp ClearList2 +ListCleared2 + +; here we have pretty cool lists and there is no brute force +; screen clearing at each list refresh +; (it was very ugly - I checked it :) + rts +.endp + +;-------------------------------------------------- +.proc PurchaseWeaponNow +; weapon purchase routne increases number of possessed bullets +; decreases cash and jumps to screen refresh +;-------------------------------------------------- + bit isInventory + bmi inventorySelect + + bit WhichList + bmi PurchaseDeffensive + + ; here we purchase the offensive weapon + ldy PositionOnTheList + lda IndexesOfWeaponsL1,y + jmp PurchaseAll +PurchaseDeffensive + ldy PositionOnTheList + lda IndexesOfWeaponsL2,y +PurchaseAll + ; after getting weapon index the routine is common for all + ldx tanknr + tay ; weapon index is in Y + sec + lda moneyL,x ; substracting from posessed money + sbc WeaponPriceL,y ; of price of the given weapon + sta moneyL,x + lda moneyH,x + sbc WeaponPriceH,y + sta moneyH,x + +positiveMoney + ; now we have to get address of + ; the table of the weapon of the tank + ; and add appropriate number of shells + + sty LastWeapon ; store last purchased weapon + ; because we must put screen pointer next to it + + ; but if we purchasing "Buy me!" then we must draw the winning weapon. + + cpy #ind_Buy_me_________ + bne NoSuprise + +Suprise ; get a random weapon + lda random + cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) + bcc GetRandomDefensive +GetRandomOffensive + randomize ind_Missile________ last_offensive_____ + ;cmp #ind_Buy_me_________ ; buy me do not buy buy me :) + ;beq GetRandomOffensive + tay + bne NoSuprise ; Y always <> 0 +GetRandomDefensive + randomize ind_Battery________ last_defensive_____ + tay +; lda WeaponUnits,y ; check if weapon exist +; beq GetRandomDefensive + +NoSuprise + lda TanksWeaponsTableL,x + sta weaponPointer + lda TanksWeaponsTableH,x + sta weaponPointer+1 + + clc + lda (weaponPointer),y ; and we have number of posessed bullets of the weapon + adc WeaponUnits,y + sta (weaponPointer),y ; and we added appropriate number of bullets + cmp #100 ; but there should be no more than 99 bullets + bcc LessThan100 + lda #99 + sta (weaponPointer),y +LessThan100 + + mva #0 PositionOnTheList ; to move the pointer to the top when no more monies + jmp Purchase.AfterPurchase + +inventorySelect + bit whichList + bmi invSelectDef + + ldy PositionOnTheList + lda IndexesOfWeaponsL1,y + ldx tankNr + sta activeWeapon,x + jmp WaitForKeyRelease ; rts + +invSelectDef + ldy PositionOnTheList + lda IndexesOfWeaponsL2,y + tay + ldx tankNr + cmp #ind_Battery________ + bne NotBattery + ; if activate battery, we do it differently + mva #sfx_battery sfx_effect + phy + mva #99 Energy,x + jsr MaxForceCalculate + ply + jmp DecreaseDefensive ; bypass activation +NotBattery + cmp #ind_Auto_Defense___ + bne NoAutoDefense + ; Auto Defense - do it like battery + mva #sfx_auto_defense sfx_effect + mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) + jmp DecreaseDefensive ; bypass activation +NoAutoDefense + cmp #ind_Lazy_Boy_______ + bne NoLazyBoy + ; Lazy Boy - do it like battery + mva #%01000000 LazyFlag + jmp DecreaseDefensive ; bypass activation +NoLazyBoy + cmp #ind_Lazy_Darwin____ + bne NoLazyDarwin + ; Lazy Darwin - do it like battery + mva #%11000000 LazyFlag + jmp DecreaseDefensive ; bypass activation +NoLazyDarwin + cmp #ind_Spy_Hard_______ + bne NotSpy + mva #$ff SpyHardFlag + jmp DecreaseDefensive ; bypass activation +NotSpy + cmp #ind_Long_Barrel____ + bne NotBarrel + ; if activate long barrel, we do it differently too + mva #sfx_long_barrel sfx_effect + mva #LongBarrel BarrelLength,x + bne DecreaseDefensive ; bypass activation +NotBarrel + cmp #ind_White_Flag_____ + bne NotWhiteFlag + cmp ActiveDefenceWeapon,x + bne NoDeactivateWhiteFlag + mva #sfx_white_flag sfx_effect + lda #$00 ; if try to activate activated White Flag then deactivate Defence + sta ActiveDefenceWeapon,x + sta ShieldEnergy,x + beq DefActivationEnd +NotWhiteFlag +NoDeactivateWhiteFlag + ; activate new defensive + sta ActiveDefenceWeapon,x + ; set defensive energy + lda DefensiveEnergy,y + sta ShieldEnergy,x +DecreaseDefensive + ; decrease number of defensives + lda TanksWeaponsTableL,x + sta weaponPointer + lda TanksWeaponsTableH,x + sta weaponPointer+1 + lda (weaponPointer),y + sec + sbc #1 + sta (weaponPointer),y + +DefActivationEnd + jmp WaitForKeyRelease ; rts + +.endp +; ----------------------------------------------------- +.proc calcPosDefensive +; calculate positionOnTheList from the activeWeapon (defensives) + ldx tankNr + lda ActiveDefenceWeapon,x + beq ?noWeaponActive + ldy #0 ; min defensive weapon +@ + cmp IndexesOfWeaponsL2,y + beq ?weaponfound + iny + cpy #(last_defensive_____ - first_defensive____)+1 ; maxDefensiveWeapon + bne @- + ; not found apparently? + ; TODO: check border case (the last weapon) +?noWeaponActive + ldy #0 +?weaponFound + cpy howManyOnTheListDef + bcs ?noWeaponActive + sty positionOnTheList + rts +.endp + +.proc calcPosOffensive +; calculate positionOnTheList from the activeWeapon (defensives) + ldx tankNr + lda ActiveWeapon,x + beq ?noWeaponActive + ldy #0 ; min defensive weapon +@ + cmp IndexesOfWeaponsL1,y + beq ?weaponfound + iny + cpy #(last_offensive_____ - first_offensive____) ; maxOffensiveWeapon + bne @- + ; not found apparently? + ; TODO: check border case (the last weapon) +?noWeaponActive + ldy #0 +?weaponFound + cpy howManyOnTheListOff + bcs ?noWeaponActive + sty positionOnTheList + rts +.endp +; ----------------------------------------------------- +.proc PutLitteChar + ; first let's clear both lists from little chars + mwa #ListOfWeapons xbyte + ldx #last_defensive_____ ; there are xx lines total + ldy #$00 +EraseLoop + tya ; lda #$00 + sta (xbyte),y + adw xbyte #32 ; narrow screen + dex + bpl EraseLoop + + ; now let's check which list is active now + bit WhichList + bpl CharToList1 + ; we are on the second list (deffensive) + ; so there is no problem with scrolling + mwa #ListOfDefensiveWeapons xbyte + ldx PositionOnTheList + beq SelectList2 ; if there is 0 we add nothing +AddLoop2 + adw xbyte #32 ; narrow screen + dex + bne AddLoop2 +SelectList2 + lda #$7f ; little char (tab) - this is the pointer + sta (xbyte),y + ; now we clear up and down arrows indicating more content below or above screen + ldx #EmptyLine + stx MoreUpdl + sty MoreUpdl+1 + stx MoreDowndl + sty MoreDowndl+1 + rts +CharToList1 + ; we putchar on list 1 + ; and later set-up list itself + mwa #ListOfWeapons xbyte + ldx PositionOnTheList + beq SelectList1 ; if there is 0 we add nothing +AddLoop1 + adw xbyte #32 ; narrow screen + dex + bne AddLoop1 +SelectList1 + lda #$7f ; pointer = little char = (tab) + sta (xbyte),y + ; now moving the window basing on given offset + mwa #ListOfWeapons xbyte + ldx OffsetDL1 + beq SetWindowList1 ; if zero then add nothing +LoopWindow1 + adw xbyte #32 ; narrow screen + dex + bne LoopWindow1 +SetWindowList1 + mwa xbyte WeaponsListDL ; and we change Display List + + ; we show screen line with arrows meaning that + ; you can scroll the list up + ldx #EmptyLine + lda OffsetDL1 + beq NoArrowUp + ldx #MoreUp +NoArrowUp + stx MoreUpdl + sty MoreUpdl+1 + ; the same, bu scrolling down + lda HowManyOnTheListOff + ldx #EmptyLine + sec + sbc #17 ; ???? + bmi NoArrowDown + cmp OffsetDL1 + bcc NoArrowDown + ldx #MoreDown +NoArrowDown + stx MoreDowndl + sty MoreDowndl+1 + rts +.endp +; ----------------------------------------------------- +.proc EnterPlayerNames + ;entering names of players + mwa #NameDL dlptrs + lda #%00110001 ; narrow screen width, DL on, P/M off + sta dmactls + SetDLI DLIinterruptText ; jsr SetDLI for text (names) screen + + mva #0 TankNr + sta COLBAKS ; set color of background +@ tax + lda TankStatusColoursTable,x + sta COLOR2 ; set color of player name line + jsr EnterPlayerName + bit escFlag + spl:rts + jsr CheckTankCheat + inc TankNr + lda TankNr + cmp NumberOfPlayers + bne @- + rts +.endp +; ----------------------------------------------------- +.proc EnterPlayerName +; in: TankNr +; Out: TanksNames, SkillTable + +; this little thing is for choosing Player's skill (if computer) +; and entering his name +; If no name entered, there should be name "1st Tank", etc. +; Default tanks names are in table TanksNamesDefault +; ----------------------------------------------------- + + jsr PMoutofScreen + ; display tank number + ldx tanknr + lda skillTable,x + sta difficultyLevel + lda digits+1,x + sta NameScreen2+7 + + ; clear tank name editor field - not necessary +; ldx #8 +; lda #0 +;@ sta NameAdr,x +; dex +; bpl @- + + ; copy existing name and place cursor at end + lda TankNr + :3 asl + tax + + ldy #0 +@ lda TanksNames,x +; beq endOfTankName + sta NameAdr,y + inx + iny + cpy #8 + bne @- +endOfTankName + +@ lda NameAdr,y + and #$7f + bne LastNameChar + dey + bpl @- +LastNameChar + cpy #7 + beq @+ + iny +@ sty PositionInName + +CheckKeys + jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) + ldx TankNr + lda JoyNumber,x + tay + lda digits+1,y + sta NameScreen2+11 ; display joystick port number + lda TankShape,x + tay + lda digits+1,y + sta NameScreen2+15 ; display tank shape number + jsr CursorDisplay + jsr getkey + bit escFlag + spl:rts + + .IF TARGET = 800 ; only the A800 has a keyboard + ; is the char to be recorded? + ldx #keycodesEnd-keycodes ;table was 38 chars long +IsLetter + cmp keycodes,x + beq YesLetter + dex + bpl IsLetter + bmi CheckFurtherX01 ; if not in the table + ; we check cursors and (Return) +YesLetter + lda scrcodes,x ; we have screen code of the char + ldx PositionInName + sta NameAdr,x + inx + cpx #$08 ; is there 8 characters? + bne @+ + dex +@ stx PositionInName ; if not, we store + jmp CheckKeys + .ENDIF +CheckFurtherX01 ; here we check Tab, Return and Del + cmp #@kbcode._ret ; $0c ; Return + jeq EndOfNick + cmp #@kbcode._tab ; $2c ; Tab + beq ChangeOfJoyUp + cmp #@kbcode._right ; $7 ;cursor right + beq ChangeOfLevelUp + cmp #@kbcode._left ; $6 ;cursor left + beq ChangeOfLevelDown + cmp #@kbcode._down ; $f ;cursor down + beq ChangeOfLevel3Up + cmp #@kbcode._up ; $e ;cursor up + beq ChangeOfLevel3Down + cmp #@kbcode._atari ; atari (inverse) key + jeq ChangeOfShapeUp + + cmp #@kbcode._del ; $34 ; Backspace (del) + bne CheckKeys + ; handling backing one char + ldx PositionInName + beq FirstChar ; ferst char - no go back + cpx #7 + bne NotLastChar + lda NameAdr,x + and #$7f + bne LastIsNotSpace ; last char not empty - first clear last char (no go back) +NotLastChar + dex +LastIsNotSpace +FirstChar + stx PositionInName + lda #0 + sta NameAdr,x + jmp CheckKeys +;---- +ChangeOfJoyUp + ldx TankNr + inc JoyNumber,x + lda JoyNumber,x + and #%00000011 ; max 4 joysticks + sta JoyNumber,x + .IF TARGET = 5200 + beq ChangeOfShapeUp ; change tank shape + .ENDIF + jmp CheckKeys +;---- +ChangeOfLevelUp ; change difficulty level of computer opponent + inc:lda DifficultyLevel + cmp #9 ; 9 levels are possible + bne DoNotLoopLevelUp + mva #$0 DifficultyLevel +DoNotLoopLevelUp + jmp CheckKeys +;---- +ChangeOfLevelDown + dec:lda DifficultyLevel + bpl DoNotLoopLevelDown + mva #$8 DifficultyLevel +DoNotLoopLevelDown + jmp CheckKeys +;---- +ChangeOfLevel3Up + adb DifficultyLevel #3 + + cmp #9 + bcc DoNotLoopLevel3Up + + sbb DifficultyLevel #9 + +DoNotLoopLevel3Up + jmp CheckKeys +;---- +ChangeOfLevel3Down + sbb DifficultyLevel #3 + bpl @+ + adb DifficultyLevel #9 +@ + jmp CheckKeys +;---- +ChangeOfShapeUp + ldx TankNr + inc TankShape,x + lda TankShape,x + cmp #$03 + bne @+ + lda #$00 + sta TankShape,x +@ jmp CheckKeys +;---- +EndOfNick + ; now check long press joy button (or Return...) + mva #0 pressTimer ; reset +WaitForLongPress + lda STRIG0 ; wait only for joy long press + bne ShortJoyPress + lda pressTimer + cmp #25 ; 1/2s + bcc WaitForLongPress + jsr EnterNameByJoy + jmp CheckKeys +ShortJoyPress + ; storing name of the player and its level + + ; level of the computer opponent goes to + ; the table of levels (difficulties) + ldx tanknr + lda DifficultyLevel + sta skilltable,x + beq NotRobot + lda #$03 ; shape for robotanks + sta TankShape,x +NotRobot + ; storing name of the tank in the right space + ; (without cursor!) + ldy #$00 + txa ; ldx TankNr + asl + asl + asl ; 8 chars per name + tax ; in X where to put new name + + mva #sfx_next_player sfx_effect + + + ; check if all chars are empty (" ") + ldy #7 + lda #0 +@ ora NameAdr,y + and #$7F ; remove inverse (Cursor) + dey + bpl @- + tay + beq MakeDefaultName + + ldy #0 +nextchar04 + lda NameAdr,y + and #$7f ; remove inverse (Cursor) + sta tanksnames,x + inx + iny + cpy #$08 + bne nextchar04 + rts +MakeDefaultName +nextchar05 + lda tanksnamesDefault,x + sta tanksnames,x + inx + iny + cpy #$08 + bne nextchar05 + rts +.endp +;-------------------------------------------------- +.proc CursorDisplay + ldy #7 +CursorLoop + lda NameAdr,y + and #$7f + cpy #0 + bne NotFirstLetter + and #$3f ; First letter should be Capital letter + ; (nice trick does not affect digits) +NotFirstLetter + cpy PositionInName + bne @+ + ora #$80 ; place cursor +@ sta NameAdr,y + dey + bpl CursorLoop + rts +.endp +;-------------------------------------------------- +.proc EnterNameByJoy + mva #sfx_keyclick sfx_effect + jsr CursorDisplay + ldy PositionInName + ; now in Y we have PositionInName + ldx #(keycodesEnd-keycodes) +SearchCharacter + lda NameAdr,y + and #$7f + cmp #$20 + bcc CharOK ; digit or space + cmp #$60 + bcs CharOK ; not capital letter + ora #$40 +CharOK + cmp scrcodes,x + beq CharacterFound + dex + bpl SearchCharacter + inx +CharacterFound + ; now in X we have Character (index) on PositionInName + ; wait for centered joy + mva #128-15 pressTimer ; reset (trick) +@ lda STICK0 + and #$0f + cmp #$0f + beq checkjoy + bit pressTimer ; trick (no A change) + bpl @- +checkjoy + lda STICK0 + and #$0f + cmp #$0f + bne JoyNotCentered + +notpressedJoy + ;fire + lda STRIG0 + beq checkjoy ; fire still pressed + rts + +JoyNotCentered + ; this is a place for code :) + cmp #7 + bne NoRight + ; joy right + cpy #7 + beq GoToMainLoop ; the last character + iny + bne GoToMainLoop +NoRight + cmp #11 + bne NoLeft + ; joy left + lda #0 + sta NameAdr,y + dey + bpl GoToMainLoop + iny + beq GoToMainLoop +NoLeft + cmp #14 + bne NoUp + ; joy up + cpx #(keycodesEnd-keycodes-1) + bne @+ + ldx #$00 ; set to the first character index (loop) + beq CharAndMainLoop +@ inx + bne CharAndMainLoop +NoUp + cmp #13 + bne EnterNameByJoy ; not down + ; joy down + dex + bpl CharAndMainLoop + ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop) +CharAndMainLoop + lda scrcodes,x + sta NameAdr,y +GoToMainLoop + sty PositionInName + jmp EnterNameByJoy + +.endp +;-------------------------------------------------- +.proc HighlightLevel + ; this routine highlights the choosen + ; level of the computer opponent + ldx #8 ; 9 possible levels +CheckNextLevel01 + lda LevelNameBeginL,x ; address on the screen + sta temp + lda LevelNameBeginH,x + sta temp+1 + ldy #9 ; flip 10 chars to inverse video + cpx DifficultyLevel ; is it the choosen level? + bne NotThisLevel + ; change to inverse, because it is it! +InverseFurther + lda (temp),y + ora #$80 + sta (temp),y + dey + bpl InverseFurther + bmi CheckNextLevel ; Check Next Level +NotThisLevel + lda (temp),y + and #$7f + sta (temp),y + dey + bpl NotThisLevel +CheckNextLevel + dex + bpl CheckNextLevel01 + rts +.endp + +;-------------------------------------------------- +.proc displaydec5 ;decimal (word), displayposition (word) +;-------------------------------------------------- +; displays decimal number as in parameters (in text mode) +; leading zeroes are removed +; the range is (00000..65565 - two bytes) + + ldy #4 ; there will be 5 digits +NextDigit + ldx #16 ; 16-bit dividee so Rotate 16 times + lda #$00 +Rotate000 + aslw decimal + rol ; scroll dividee + ; (as highest byte - additional - byte is A) + cmp #10 ; divider + bcc TooLittle000 ; if A is smaller than divider + ; there is nothing to substract + sbc #10 ; divider + inc decimal ; lowest bit set to 1 + ; because it is 0 and this is the fastest way +TooLittle000 dex + bne Rotate000 ; and Rotate 16 times, Result will be in decimal + tax ; and the rest in A + ; (and it goes to X because + ; it is our decimal digit) + lda digits,x + sta decimalresult,y + dey + bpl NextDigit ; Result again /10 and we have next digit + +;rightnumber + ; displaying without leading zeroes (if zeroes exist then display space at this position) + ldy #0 + ldx #0 ; digit flag (cut leading zeroes) +displayloop + lda decimalresult,y + cpx #0 + bne noleading0 + cpy #4 + beq noleading0 ; if 00000 - last 0 must stay + cmp zero + bne noleading0 + lda #space + beq displaychar ; space = 0 ! +noleading0 + inx ; set flag (no leading zeroes to cut) +displaychar + sta (displayposition),y +nexdigit + iny + cpy #5 + bne displayloop + + rts +.endp +;-------------------------------------------------- +.proc displaybyte ;decimal (byte), displayposition (word) +;-------------------------------------------------- +; displays decimal number as in parameters (in text mode) +; leading zeores are removed +; the range is (00..99 - one byte) + + ldy #1 ; there will be 2 digits +NextDigit2 + ldx #8 ; 8-bit dividee so Rotate 8 times + lda #$00 +Rotate001 + asl decimal + rol ; scroll dividee + ; (as highest byte - additional - byte is A) + cmp #10 ; divider + bcc TooLittle001 ; if A is smaller than divider + ; there is nothing to substract + sbc #10 ; divider + inc decimal ; because it is 0 and this is the fastest way +TooLittle001 dex + bne Rotate001 ; and Rotate 8 times, Result will be in decimal + tax ; and the rest in A + ; (and it goes to X because + ; it is our decimal digit) + lda digits,x + sta decimalresult,y + dey + bpl NextDigit2 ; Result again /10 and we have next digit + +; now cut leading zeroes (02 goes 2) + lda decimalresult + cmp zero + bne decimalend1 + lda #space + sta decimalresult + +decimalend1 + ; displaying + ldy #1 +displayloop1 + lda decimalresult,y + sta (displayposition),y + dey + bpl displayloop1 + + rts +.endp + +;-------------------------------- +.proc DisplayResults ; +;displays results of the round +;using 4x4 font + + + mva #$ff plot4x4color + + ;centering the result screen + mva #((ScreenHeight/2)-(8*4)) ResultY + + + ;upper frame + mva ResultY LineYdraw + jsr TL4x4_top + + adb ResultY #4 ;next line + + ;Header1 + ;Displays round number + lda CurrentRoundNr + cmp RoundsInTheGame + beq GameOver4x4 + + sta decimal + mwa #RoundNrDisplay displayposition + jsr displaybyte ;decimal (byte), displayposition (word) + + mwa #LineHeader1 LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + beq @+ ;unconditional jump, because TypeLine4x4 ends with beq + +GameOver4x4 + RmtSong song_round_over + mwa #LineGameOver LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + mva #1 GameIsOver + +@ + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + adb ResultY #2 ;next line + + + ;Header2 + mwa #LineHeader2 LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + sbb ResultY #2 ;next line (was empty) + + ldx NumberOfPlayers ;we start from the highest (best) tank + dex ;and it is the last one + stx ResultOfTankNr ;in TankSequence table + + mwa #TanksNames tempXROLLER + +ResultOfTheNextPlayer + ldx ResultOfTankNr ;we are after a round, so we can use TankNr + lda TankSequence,x ;and we keep here real number if the tank + sta TankNr ;for which we are displaying results + + + + + adb ResultY #4 ;next line + + ;there are at least 2 players, so we can safely + ;start displaying the result + + lda #3 ;it means | + sta ResultLineBuffer + + ldy TankNr + lda ResultsTable,y + sta decimal + mva #0 decimal+1 + mwa #(ResultLineBuffer+8) displayposition + jsr displaydec5 ;decimal (byte), displayposition (word) + + ; overwrite the second digit of the points (max 255) + ;it means ":" + mva #26 ResultLineBuffer+9 + + ldx #0 + lda TankNr + asl + asl ; times 8, because it is lengtgh + asl ; of the names of the tanks + tay + +TankNameCopyLoop + lda (tempXROLLER),y ;XROLLER is not working now + and #$3f ;always CAPITAL letters + inx + sta ResultLineBuffer,x + iny + cpx #8 ; end of name + bne TankNameCopyLoop + ; last letter of tank name overwrites first digit of the points (max 255) + + + ;just after the digits + ;it means | + mva #$3 ResultLineBuffer+13 + + ;result line display + mwa #ResultLineBuffer LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + dec ResultOfTankNr + bmi FinishResultDisplay + + sbb ResultY #2 ;distance between lines is smaller + + jmp ResultOfTheNextPlayer + +FinishResultDisplay + mva ResultY LineYdraw + ;jmp TL4x4_bottom ; just go +.endp + +.proc TL4x4_bottom + ;bottom of the frame + mwa #LineBottom LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp + +.proc TL4x4_top + ;bottom of the frame + mwa #LineTop LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp + +.proc TL4x4_empty + ;empty frame + mwa #LineEmpty LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp + +;-------------------------------------------------- +.proc GameOverScreen +;-------------------------------------------------- + + rts +.endp +;------------------------------------------------- +.proc PutTankNameOnScreen +;------------------------------------------------- + +.endp +;------------------------------------------------- +.proc DisplayStatus +;------------------------------------------------- + + ldx TankNr + rts +.endp +;------------------------------------------------- + + +.endif \ No newline at end of file diff --git a/scorchC64.asm b/scorchC64.asm index 91e2522..3afdfde 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -174,6 +174,12 @@ WeaponFont ; Game Code ;-------------------------------------------------- FirstSTART + + displayC64 = $2000 ; graphics screen memory start + SwitchVICBank(0) + SetScreenMemory(displayC64) + SetHiresBitmapMode ; Hires mode on + jsr MakeDarkScreen ; one time zero variables in RAM (non zero page) From 56a756f0ba39d6509b91e064377db79ccbcba53c Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 8 May 2023 11:30:10 +0200 Subject: [PATCH 11/65] First C64 compilation --- C64/interrupts.asm | 2 +- C64/lib/MACRO.ASM | 61 ++- C64/textproc.asm | 1270 +------------------------------------------- scorchC64.asm | 27 +- scorchC64.prg | Bin 0 -> 35866 bytes 5 files changed, 90 insertions(+), 1270 deletions(-) create mode 100644 scorchC64.prg diff --git a/C64/interrupts.asm b/C64/interrupts.asm index e2bccab..9d9c188 100644 --- a/C64/interrupts.asm +++ b/C64/interrupts.asm @@ -2,7 +2,7 @@ .IF *>0 ;this is a trick that prevents compiling this file alone - +DLIinterruptGraph = 0 ;-------------------------------------------------- .macro SetDLI ; SetDLI #WORD diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM index fcbb714..470397a 100644 --- a/C64/lib/MACRO.ASM +++ b/C64/lib/MACRO.ASM @@ -210,7 +210,7 @@ upstartEnd eif sta $d018 -.end +.endm // // Once this is done, random values appear in location $D41B (RANDOM) @@ -221,4 +221,63 @@ upstartEnd STA $D40F ; voice 3 frequency high byte LDA #$80 ; noise waveform, gate bit off STA $D412 ; voice 3 control register +.endm + +;------------------------------------- + .MACRO rolw + ROL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO aslw + ASL :1 + ROL :1+1 + .ENDM +;------------------------------------- + .MACRO rorw + ROR :1+1 + ROR :1 + .ENDM +;------------------------------------- + .MACRO lsrw + LSR :1+1 + ROR :1 + .ENDM +;------------------------------------- + .macro randomize + ;usage: randomize floor ceiling + ;returns (in A) a random .byte between "floor" and "ceiling" + .if :2 < :1 + .error "floor higher than ceiling" + .endif +?rand + lda random + cmp #:1 ;floor + bcc ?rand + cmp #:2+1 ;ceiling + bcs ?rand + .endm +;------------------------------------- + .macro phx + txa + pha + .endm +;------------------------------------- + .macro phy + tya + pha + .endm +;------------------------------------- + .macro plx + pla + tax + .endm +;------------------------------------- + .macro ply + pla + tay + .endm +;------------------------------------- +.macro wait + nop .endm \ No newline at end of file diff --git a/C64/textproc.asm b/C64/textproc.asm index 0fd63d8..991f3aa 100644 --- a/C64/textproc.asm +++ b/C64/textproc.asm @@ -2,6 +2,9 @@ .IF *>0 + +WeaponsListDL = 0 +NamesOfLevels = 0 ;---------------------------------------- ; this module contains routines used in text mode ; like shop and start-up options @@ -16,112 +19,19 @@ ; - money each player has on the beginning of the game (moneyL i moneyH) ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight - jsr clearscreen ;let the screen be clean - mwa #DisplayCopyRom temp - mwa #display temp2 - mwa #DisplayCopyEnd+1 modify - jsr CopyFromROM - - mwa #OptionsDL dlptrs - - lda #%00111110 ; normal screen width, DL on, P/M on - sta dmactls - jsr SetPMWidth - mva #TextBackgroundColor COLOR2 - jsr ColorsOfSprites - mva #$ca COLOR1 - mva #$00 COLBAKS ; set color of background - - SetDLI DLIinterruptOptions ; jsr SetDLI for Options text screen - -; -------- setup bottom (tanks) line - lda NumberOfPlayers - pha - lda mountainsDeltaTableH - sta mountainDeltaH - lda mountainsDeltaTableL - sta mountainDeltaL - mva #6 NumberOfPlayers - jsr PMoutofScreen ;let P/M disappear - ;jsr clearscreen ;let the screen be clean (clean-ish already) - jsr ClearPMmemory - jsr placetanks ;let the tanks be evenly placed - jsr calculatemountains ;let mountains be easy for the eye - jsr drawmountains ;draw them - ldx NumberOfPlayers - dex -@ jsr RandomizeAngle - sta AngleTable,x + ldx #$08 +@ lda Autoplay_OptionsTable,x + sta OptionsTable,x dex bpl @- - jsr drawtanks ;finally draw tanks - pla - sta NumberOfPlayers -; -------- - mva #0 OptionsY + rts + +Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 -OptionsMainLoop - - lda WindChangeInRound - sta OptionsHere+126 - - jsr OptionsInversion - jsr getkey - bit escFlag - spl:rts - - cmp #@kbcode._down ; $f ;cursor down - bne OptionsNoDown - inc:lda OptionsY - cmp #maxoptions - bne OptionsMainLoop - mva #maxoptions-1 OptionsY - jmp OptionsMainLoop - -OptionsNoDown - cmp #@kbcode._up ; $e ;cursor up - bne OptionsNoUp - dec OptionsY - bpl OptionsMainLoop - mva #0 OptionsY - jmp OptionsMainLoop - -OptionsNoUp - cmp #@kbcode._left ; $6 ;cursor left - bne OptionsNoLeft - ldx OptionsY - dec OptionsTable,X - lda OptionsTable,X - bpl OptionsMainLoop - inc OptionsTable,X - jmp OptionsMainLoop - -OptionsNoLeft - cmp #@kbcode._right ; $7 ;cursor right - bne OptionsNoRight - - ldx OptionsY - inc OptionsTable,X - lda OptionsTable,X - cmp #5 ; number of columns in options - bne OptionsMainLoop - dec OptionsTable,X - jmp OptionsMainLoop - -OptionsNoRight - cmp #@kbcode._ret ; $c ;Return key - bne OptionsNoReturn - rts ; options selected - -OptionsNoReturn - cmp #@kbcode._tab ; Tab key - bne OptionsNoTab - jsr SelectNextGradient -OptionsNoTab - jmp OptionsMainLoop .endp + .proc SelectNextGradient lda OptionsY ; if "Wind" option selected cmp #$03 @@ -144,65 +54,6 @@ NoGradientLoop sta GradientColors+1 rts .endp -;-------- -; inversing selected option (cursor) -;-------- -.proc OptionsInversion -YPos = temp2 -XPos = temp2+1 -optionWidth = 6 -nameWidth = 10 - mwa #OptionsHere temp ; offset of the first option=11 - mva #0 YPos ;option number pointer - mva #0 Xpos ;X position in the menu - tay ; Y is zero here... -OptionsSetMainLoop - ldx YPos ; Y position in the menu -;inversing the first few chars of the selected line (OptionsY) - cpx OptionsY - jsr _inverter - cpy #nameWidth-1 - bne OptionsSetMainLoop - adw temp #nameWidth - ldy #0 - -OptionsLoop - lda XPos - cmp OptionsTable,x - jsr _inverter - cpy #optionWidth ; width of the option highlight - bne OptionsLoop - ldy #0 - ; next X position of the - adw temp #optionWidth ; width of the option highlight - inc:lda XPos - cmp #5 ; number of options in a row - bne OptionsLoop - ; next line - ;adw temp #nameWidth ; beginning of the next line - mva #0 Xpos - tay - inc:lda Ypos - cmp #maxOptions - bne OptionsSetMainLoop - rts - -_inverter - beq invertme - ; clean inversion otherwise - lda (temp),y - and #$7f ; clear the top bit - sta (temp),y - bpl @+ ; JMP -invertme - lda (temp),y - ora #$80 ; set the top bit - sta (temp),y -@ - ; next character in an option - iny - rts -.endp ; -------------------------------------- ; Sets the appropriate variables based on the options table @@ -304,13 +155,6 @@ AfterManualPurchase jmp Purchase.GoToActivation .endp -;-------------------------------------------------- -.proc CopyFromPurchaseAndGameOver - mwa #DisplayCopyPurchaseDlROM temp - mwa #DisplayCopyPurchase temp2 - mwa #DisplayCopyPurchaseEnd+1 modify - jmp CopyFromROM ; jsr:rts -.endp ;-------------------------------------------------- .proc Purchase ; @@ -320,786 +164,18 @@ AfterManualPurchase ; Rest of the data is taken from appropriate tables ; and during the purchase these tables are modified. - jsr CopyFromPurchaseAndGameOver - - mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons ; we are clearing list of the weapons mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 GoToActivation - mva #$ff LastWeapon - - SetDLI DLIinterruptText ; jsr SetDLI for text (purchase) screen - jsr PMoutofScreen - mwa #PurchaseDL dlptrs - lda #@dmactl(narrow|dma) ; narrow screen width, DL on, P/M off - sta dmactls - - lda #song_supermarket - bit IsInventory - bpl @+ - lda #song_inventory -@ jsr RmtSongSelect - - ldx tankNr - lda TankStatusColoursTable,x - sta COLOR2 - - ; there is a tank (player) number in tanknr - ; we are displaying name of the player - lda #$ca - sta COLOR1 ; set color of header text - ldy #0 - sty COLBAKS ; set color of background - lda tanknr - :3 asl ; 8 chars per name - tax -NextChar03 - lda tanksnames,x - sta purchaseTextBuffer+7,y - inx - iny - cpy #$08 - bne NextChar03 - ; displaying number of active controller port - ldy JoystickNumber - lda digits+1,y - sta purchaseTextBuffer+17 - - ; and we display cash of the given player - -; here we must jump in after each purchase -; to generate again list of available weapons -AfterPurchase - - ; current cash display - mva #sfx_purchase sfx_effect - ldx tanknr - lda moneyL,x - sta decimal - lda moneyH,x - sta decimal+1 - mwa #purchaseTextBuffer+26 displayposition - jsr displaydec5 - - ; in xbyte there is the address of the line that - ; is being processed now - mwa #ListOfWeapons xbyte - ldx #$00 ; index of the checked weapon - stx HowManyOnTheListOff ; amounts of weapons (shells, bullets) in both lists - stx HowManyOnTheListDef - - jsr CreateList - - bit isInventory ; - bpl ChoosingItemForPurchase - - lda whichList - bne PositionDefensive - -; calculate positionOnTheList from the activeWeapon (offensives) - ldx tankNr - lda activeWeapon,x - ldy #0 -@ - cmp IndexesOfWeaponsL1,y - beq ?weaponfound - iny - cpy #(last_offensive_____ - first_offensive____)+1 ; maxOffensiveWeapons - bne @- - ; not found apparently? - ; TODO: check border case (the last weapon) - ldy #0 - beq ?weaponFound ; jmp -PositionDefensive - jsr calcPosDefensive - - -?weaponFound - ; weapon index in Y - sty positionOnTheList - jsr _MakeOffsetDown ; set list screen offset - -; Here we have all we need -; So choose the weapon for purchase ...... -;-------------------------------------------------- -ChoosingItemForPurchase -;-------------------------------------------------- - - jsr PutLitteChar ; Places pointer at the right position - jsr getkey - bit escFlag - bpl @+ - mva #0 escFlag - jmp WaitForKeyRelease ; like jsr ... : rts -@ - cmp #@kbcode._tab ; $2c ; Tab - jeq ListChange - cmp #@kbcode._left ; $06 ; cursor left - jeq ListChange - cmp #@kbcode._ret ; $0c ; Return - sne:rts - cmp #@kbcode._up ; $e - beq PurchaseKeyUp - cmp #@kbcode._down ; $f - beq PurchaseKeyDown - cmp #@kbcode._space ; $21 ; Space - jeq PurchaseWeaponNow - cmp #@kbcode._right ; $07 ; cursor right - jeq PurchaseWeaponNow - bne ChoosingItemForPurchase - -PurchaseKeyUp - lda WhichList - bpl GoUpOffensive - dec PositionOnTheList - bpl EndUpX - ldy HowManyOnTheListDef - dey - sty PositionOnTheList - jmp MakeOffsetDown -GoUpOffensive - dec PositionOnTheList - bpl MakeOffsetUp - ldy HowManyOnTheListOff - dey - sty PositionOnTheList - jmp MakeOffsetDown -MakeOffsetUp - ; If offset is larger than pointer position, - ; it must be equal then. - lda PositionOnTheList - cmp OffsetDL1 - bcs EndUpX ; do not modify the offset - sta OffsetDL1 -EndUpX - jmp ChoosingItemForPurchase -PurchaseKeyDown - lda WhichList - bpl GoDownOffensive - inc:lda PositionOnTheList - cmp HowManyOnTheListDef - bne EndGoDownX - ldy #0 - sty PositionOnTheList - beq MakeOffsetUp -GoDownOffensive - inc:lda PositionOnTheList - cmp HowManyOnTheListOff - bne MakeOffsetDown - ldy #0 - sty PositionOnTheList - beq MakeOffsetUp -MakeOffsetDown - jsr _MakeOffsetDown -EndGoDownX - jmp ChoosingItemForPurchase - -_MakeOffsetDown - lda OffsetDL1 - clc - adc #15 - ;if offset+16 is lower than the position then it must =16 - cmp PositionOnTheList - bcs _EndGoDownX - sec - lda PositionOnTheList - sbc #15 - sta OffsetDL1 -_EndGoDownX rts - -; swapping the displayed list and setting pointer to position 0 -ListChange - mva #0 OffsetDL1 - - lda WhichList - eor #%10000000 ; flip WhichList - sta WhichList - bne DeffensiveSelected - - mwa #ListOfWeapons WeaponsListDL - lda isInventory - beq @+ - ; inventory - jsr calcPosOffensive - jsr _MakeOffsetDown ; set list screen offset - jmp ChoosingItemForPurchase -@ - mva #0 PositionOnTheList - jmp ChoosingItemForPurchase - -DeffensiveSelected - mwa #ListOfDefensiveWeapons WeaponsListDL - lda isInventory - beq @+ - jsr calcPosDefensive - jmp ChoosingItemForPurchase -@ - mva #0 positionOnTheList - jmp ChoosingItemForPurchase - -.endp -; -;-------------------------------------------------- -.proc CreateList -;-------------------------------------------------- -; Creating full list of the available weapons for displaying -; in X there is an index of the weapon to be checked, -; in 'Xbyte' address of the first char in filled screen line - -CreateList - stx temp ; index of a weapon will be necessary later - ; checking if the weapon of the given index is present - lda WeaponUnits,x - jeq NoWeapon - - ldy tanknr - - bit isInventory - jmi itIsInventory - - ; put "Purchase" on the screen - mwa #PurchaseDescription PurActDescAddr - ; and Title - mwa #PurchaseTitle DLPurTitleAddr - - ; checking if we can afford buying this weapon - ldx temp - lda moneyH,y - cmp WeaponPriceH,x - bne @+ - lda moneyL,y - cmp WeaponPriceL,x -@ - jcc TooLittleCash - - ; we have enough cash and the weapon can be - ; added to the list - - ; first parentheses and other special chars - ; (it's easier this way) - ;ldy #22 - ;lda #08 ; "(" - ;STA (XBYTE),y - ;ldy #32 - ;lda #09 ; ")" - ;sta (xbyte),y - ldy #24 - lda #15 ; "/" - sta (xbyte),y - ldy #30 - lda #16 ; "0" - sta (xbyte),y - - ;now number of units (shells) to be purchased - adw xbyte #22 displayposition ; 23 chars from the beginning of the line - lda WeaponUnits,x - sta decimal - jsr displaybyte - ldx temp ;getting back index of the weapon - - ; and now price of the weapon - adw xbyte #25 displayposition ; 26 chars from the beginning of the line - lda WeaponPriceL,x - sta decimal - lda WeaponPriceH,x - sta decimal+1 - jsr displaydec5 - ldy #25 ; overwrite first digit (allways space - no digit :) ) - lda #04 ; "$" - sta (xbyte),y - - jmp notInventory - -itIsInventory - ; put "Activate" on the screen - mwa #ActivateDescription PurActDescAddr - ; and Title - mwa #InventoryTitle DLPurTitleAddr - - ldx temp - lda TanksWeaponsTableL,y - sta weaponPointer - lda TanksWeaponsTableH,y - sta weaponPointer+1 - ldy temp - lda (weaponPointer),y - jeq noWeapon - - ; clear price area - ldy #21 ; beginning of the price area - lda #0 -@ sta (XBYTE),y - iny - cpy #32 ; end of price - bne @- - -notInventory - - ; number of posessed shells - lda temp ; weapon index again - jsr HowManyBullets - sta decimal - - adw xbyte #1 displayposition - jsr displaybyte - - ldx temp ;weapon index - ; now symbol of the weapon - lda WeaponSymbols,x - ldy #$4 ; 4 chars from the beginning of the line - sta (xbyte),y - - ; and now name of the weapon and finisheeeedd !!!! - mva #0 temp+1 ; this number is only in X - ; times 16 (it's length of the names of weapons) - ldy #3 ; Rotate 4 times -@ - asl temp - rol temp+1 - dey - bpl @- - - adw temp #NamesOfWeapons-6 weaponPointer - - ldy #6 ; from 6th char on screen - -@ - lda (weaponPointer),y - sta (xbyte),y - iny - cpy #(16+6) - bne @- - - - ; in X there is what we need (weapon index) - - ; If on screen after the purchase there is still - ; present the weapon purchased recently, - ; the pointer must point to it. - bit lastWeapon - bpl @+ ; if == $ff => first run, jump to top - mva #0 PositionOnTheList - beq NotTheSameAsLastTime -@ - cpx LastWeapon - bne NotTheSameAsLastTime - bit WhichList - bmi @+ - lda HowManyOnTheListOff - sta PositionOnTheList - jmp NotTheSameAsLastTime -@ - lda HowManyOnTheListDef - sta PositionOnTheList -NotTheSameAsLastTime - ; increase appropriate counter - txa - cpx #last_offensive_____+1 - bcs DefenceList - ldy HowManyOnTheListOff - sta IndexesOfWeaponsL1,y - inc HowManyOnTheListOff - bne NextLineOfTheList -DefenceList - ldy HowManyOnTheListDef - sta IndexesOfWeaponsL2,y - inc HowManyOnTheListDef - ; If everything is copied then next line -NextLineOfTheList - adw xbyte #32 -TooLittleCash -NoWeapon - - ; next weapon. If no more weapons then finish! - inx - cpx #last_offensive_____+1 - bne NoDefense - -; if we got to the defense weapons, -; we switch address to the second table. - mwa #ListOfDefensiveWeapons xbyte -NoDefense - cpx #last_defensive_____+1 - - jne CreateList - - ; offset may be only too big - ; (because after purchase list will never be longer) - ; check it and modify if necessary. - ; If offset is larger than position of the pointer, - ; it must be equal. - lda PositionOnTheList - cmp OffsetDL1 - bcs WeHaveOffset ; do not modify offset - sta OffsetDL1 -WeHaveOffset - - ; now we have to erase empty position of both lists. - - ; Multiply number on list 1 by 32 and set address - ; of the first erased char. - - lda HowManyOnTheListOff - sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; - sta xbyte+1 ; higher byte of the Result - ldx #$05 ; 2^5 -@ asl xbyte - rol xbyte+1 - dex - bne @- - - ; add to the address of the list - adw xbyte #ListOfWeapons - ldy #0 -ClearList1 - cpw xbyte #ListOfWeapons1End - beq ListCleared1 - tya ; now there is zero here - sta (xbyte),y - inw xbyte - jmp ClearList1 -ListCleared1 - ; And the same we do with the second list - - ; Multiply number on list 1 by 32 and set address - ; of the first erased char. - lda HowManyOnTheListDef - sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; - sta xbyte+1 ; higher byte of the Result - ldx #$05 ; 2^5 -@ asl xbyte - rol xbyte+1 - dex - bne @- - - ; add to the address of the list - adw xbyte #ListOfDefensiveWeapons - ldy #0 -ClearList2 - cpw xbyte #ListOfDefensiveWeaponsEnd - beq ListCleared2 - tya ; now there is zero here - sta (xbyte),y - inw xbyte - jmp ClearList2 -ListCleared2 - -; here we have pretty cool lists and there is no brute force -; screen clearing at each list refresh -; (it was very ugly - I checked it :) - rts -.endp - -;-------------------------------------------------- -.proc PurchaseWeaponNow -; weapon purchase routne increases number of possessed bullets -; decreases cash and jumps to screen refresh -;-------------------------------------------------- - bit isInventory - bmi inventorySelect - - bit WhichList - bmi PurchaseDeffensive - - ; here we purchase the offensive weapon - ldy PositionOnTheList - lda IndexesOfWeaponsL1,y - jmp PurchaseAll -PurchaseDeffensive - ldy PositionOnTheList - lda IndexesOfWeaponsL2,y -PurchaseAll - ; after getting weapon index the routine is common for all - ldx tanknr - tay ; weapon index is in Y - sec - lda moneyL,x ; substracting from posessed money - sbc WeaponPriceL,y ; of price of the given weapon - sta moneyL,x - lda moneyH,x - sbc WeaponPriceH,y - sta moneyH,x - -positiveMoney - ; now we have to get address of - ; the table of the weapon of the tank - ; and add appropriate number of shells - - sty LastWeapon ; store last purchased weapon - ; because we must put screen pointer next to it - - ; but if we purchasing "Buy me!" then we must draw the winning weapon. - cpy #ind_Buy_me_________ - bne NoSuprise - -Suprise ; get a random weapon - lda random - cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) - bcc GetRandomDefensive -GetRandomOffensive - randomize ind_Missile________ last_offensive_____ - ;cmp #ind_Buy_me_________ ; buy me do not buy buy me :) - ;beq GetRandomOffensive - tay - bne NoSuprise ; Y always <> 0 -GetRandomDefensive - randomize ind_Battery________ last_defensive_____ - tay -; lda WeaponUnits,y ; check if weapon exist -; beq GetRandomDefensive - -NoSuprise - lda TanksWeaponsTableL,x - sta weaponPointer - lda TanksWeaponsTableH,x - sta weaponPointer+1 - - clc - lda (weaponPointer),y ; and we have number of posessed bullets of the weapon - adc WeaponUnits,y - sta (weaponPointer),y ; and we added appropriate number of bullets - cmp #100 ; but there should be no more than 99 bullets - bcc LessThan100 - lda #99 - sta (weaponPointer),y -LessThan100 - - mva #0 PositionOnTheList ; to move the pointer to the top when no more monies - jmp Purchase.AfterPurchase - -inventorySelect - bit whichList - bmi invSelectDef - - ldy PositionOnTheList - lda IndexesOfWeaponsL1,y - ldx tankNr - sta activeWeapon,x - jmp WaitForKeyRelease ; rts - -invSelectDef - ldy PositionOnTheList - lda IndexesOfWeaponsL2,y - tay - ldx tankNr - cmp #ind_Battery________ - bne NotBattery - ; if activate battery, we do it differently - mva #sfx_battery sfx_effect - phy - mva #99 Energy,x - jsr MaxForceCalculate - ply - jmp DecreaseDefensive ; bypass activation -NotBattery - cmp #ind_Auto_Defense___ - bne NoAutoDefense - ; Auto Defense - do it like battery - mva #sfx_auto_defense sfx_effect - mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) - jmp DecreaseDefensive ; bypass activation -NoAutoDefense - cmp #ind_Lazy_Boy_______ - bne NoLazyBoy - ; Lazy Boy - do it like battery - mva #%01000000 LazyFlag - jmp DecreaseDefensive ; bypass activation -NoLazyBoy - cmp #ind_Lazy_Darwin____ - bne NoLazyDarwin - ; Lazy Darwin - do it like battery - mva #%11000000 LazyFlag - jmp DecreaseDefensive ; bypass activation -NoLazyDarwin - cmp #ind_Spy_Hard_______ - bne NotSpy - mva #$ff SpyHardFlag - jmp DecreaseDefensive ; bypass activation -NotSpy - cmp #ind_Long_Barrel____ - bne NotBarrel - ; if activate long barrel, we do it differently too - mva #sfx_long_barrel sfx_effect - mva #LongBarrel BarrelLength,x - bne DecreaseDefensive ; bypass activation -NotBarrel - cmp #ind_White_Flag_____ - bne NotWhiteFlag - cmp ActiveDefenceWeapon,x - bne NoDeactivateWhiteFlag - mva #sfx_white_flag sfx_effect - lda #$00 ; if try to activate activated White Flag then deactivate Defence - sta ActiveDefenceWeapon,x - sta ShieldEnergy,x - beq DefActivationEnd -NotWhiteFlag -NoDeactivateWhiteFlag - ; activate new defensive - sta ActiveDefenceWeapon,x - ; set defensive energy - lda DefensiveEnergy,y - sta ShieldEnergy,x -DecreaseDefensive - ; decrease number of defensives - lda TanksWeaponsTableL,x - sta weaponPointer - lda TanksWeaponsTableH,x - sta weaponPointer+1 - lda (weaponPointer),y - sec - sbc #1 - sta (weaponPointer),y - -DefActivationEnd - jmp WaitForKeyRelease ; rts - -.endp -; ----------------------------------------------------- -.proc calcPosDefensive -; calculate positionOnTheList from the activeWeapon (defensives) - ldx tankNr - lda ActiveDefenceWeapon,x - beq ?noWeaponActive - ldy #0 ; min defensive weapon -@ - cmp IndexesOfWeaponsL2,y - beq ?weaponfound - iny - cpy #(last_defensive_____ - first_defensive____)+1 ; maxDefensiveWeapon - bne @- - ; not found apparently? - ; TODO: check border case (the last weapon) -?noWeaponActive - ldy #0 -?weaponFound - cpy howManyOnTheListDef - bcs ?noWeaponActive - sty positionOnTheList - rts .endp -.proc calcPosOffensive -; calculate positionOnTheList from the activeWeapon (defensives) - ldx tankNr - lda ActiveWeapon,x - beq ?noWeaponActive - ldy #0 ; min defensive weapon -@ - cmp IndexesOfWeaponsL1,y - beq ?weaponfound - iny - cpy #(last_offensive_____ - first_offensive____) ; maxOffensiveWeapon - bne @- - ; not found apparently? - ; TODO: check border case (the last weapon) -?noWeaponActive - ldy #0 -?weaponFound - cpy howManyOnTheListOff - bcs ?noWeaponActive - sty positionOnTheList - rts -.endp -; ----------------------------------------------------- -.proc PutLitteChar - ; first let's clear both lists from little chars - mwa #ListOfWeapons xbyte - ldx #last_defensive_____ ; there are xx lines total - ldy #$00 -EraseLoop - tya ; lda #$00 - sta (xbyte),y - adw xbyte #32 ; narrow screen - dex - bpl EraseLoop - - ; now let's check which list is active now - bit WhichList - bpl CharToList1 - ; we are on the second list (deffensive) - ; so there is no problem with scrolling - mwa #ListOfDefensiveWeapons xbyte - ldx PositionOnTheList - beq SelectList2 ; if there is 0 we add nothing -AddLoop2 - adw xbyte #32 ; narrow screen - dex - bne AddLoop2 -SelectList2 - lda #$7f ; little char (tab) - this is the pointer - sta (xbyte),y - ; now we clear up and down arrows indicating more content below or above screen - ldx #EmptyLine - stx MoreUpdl - sty MoreUpdl+1 - stx MoreDowndl - sty MoreDowndl+1 - rts -CharToList1 - ; we putchar on list 1 - ; and later set-up list itself - mwa #ListOfWeapons xbyte - ldx PositionOnTheList - beq SelectList1 ; if there is 0 we add nothing -AddLoop1 - adw xbyte #32 ; narrow screen - dex - bne AddLoop1 -SelectList1 - lda #$7f ; pointer = little char = (tab) - sta (xbyte),y - ; now moving the window basing on given offset - mwa #ListOfWeapons xbyte - ldx OffsetDL1 - beq SetWindowList1 ; if zero then add nothing -LoopWindow1 - adw xbyte #32 ; narrow screen - dex - bne LoopWindow1 -SetWindowList1 - mwa xbyte WeaponsListDL ; and we change Display List - - ; we show screen line with arrows meaning that - ; you can scroll the list up - ldx #EmptyLine - lda OffsetDL1 - beq NoArrowUp - ldx #MoreUp -NoArrowUp - stx MoreUpdl - sty MoreUpdl+1 - ; the same, bu scrolling down - lda HowManyOnTheListOff - ldx #EmptyLine - sec - sbc #17 ; ???? - bmi NoArrowDown - cmp OffsetDL1 - bcc NoArrowDown - ldx #MoreDown -NoArrowDown - stx MoreDowndl - sty MoreDowndl+1 - rts -.endp ; ----------------------------------------------------- .proc EnterPlayerNames ;entering names of players - mwa #NameDL dlptrs - lda #%00110001 ; narrow screen width, DL on, P/M off - sta dmactls - SetDLI DLIinterruptText ; jsr SetDLI for text (names) screen mva #0 TankNr sta COLBAKS ; set color of background @@ -1127,191 +203,16 @@ NoArrowDown ; Default tanks names are in table TanksNamesDefault ; ----------------------------------------------------- - jsr PMoutofScreen - ; display tank number - ldx tanknr - lda skillTable,x - sta difficultyLevel - lda digits+1,x - sta NameScreen2+7 +; - ; clear tank name editor field - not necessary -; ldx #8 -; lda #0 -;@ sta NameAdr,x -; dex -; bpl @- - - ; copy existing name and place cursor at end - lda TankNr - :3 asl - tax - - ldy #0 -@ lda TanksNames,x -; beq endOfTankName - sta NameAdr,y - inx - iny - cpy #8 - bne @- -endOfTankName - -@ lda NameAdr,y - and #$7f - bne LastNameChar - dey - bpl @- -LastNameChar - cpy #7 - beq @+ - iny -@ sty PositionInName - -CheckKeys - jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) - ldx TankNr - lda JoyNumber,x - tay - lda digits+1,y - sta NameScreen2+11 ; display joystick port number - lda TankShape,x - tay - lda digits+1,y - sta NameScreen2+15 ; display tank shape number - jsr CursorDisplay - jsr getkey - bit escFlag - spl:rts - - .IF TARGET = 800 ; only the A800 has a keyboard - ; is the char to be recorded? - ldx #keycodesEnd-keycodes ;table was 38 chars long -IsLetter - cmp keycodes,x - beq YesLetter - dex - bpl IsLetter - bmi CheckFurtherX01 ; if not in the table - ; we check cursors and (Return) -YesLetter - lda scrcodes,x ; we have screen code of the char - ldx PositionInName - sta NameAdr,x - inx - cpx #$08 ; is there 8 characters? - bne @+ - dex -@ stx PositionInName ; if not, we store - jmp CheckKeys - .ENDIF -CheckFurtherX01 ; here we check Tab, Return and Del - cmp #@kbcode._ret ; $0c ; Return - jeq EndOfNick - cmp #@kbcode._tab ; $2c ; Tab - beq ChangeOfJoyUp - cmp #@kbcode._right ; $7 ;cursor right - beq ChangeOfLevelUp - cmp #@kbcode._left ; $6 ;cursor left - beq ChangeOfLevelDown - cmp #@kbcode._down ; $f ;cursor down - beq ChangeOfLevel3Up - cmp #@kbcode._up ; $e ;cursor up - beq ChangeOfLevel3Down - cmp #@kbcode._atari ; atari (inverse) key - jeq ChangeOfShapeUp - - cmp #@kbcode._del ; $34 ; Backspace (del) - bne CheckKeys - ; handling backing one char - ldx PositionInName - beq FirstChar ; ferst char - no go back - cpx #7 - bne NotLastChar - lda NameAdr,x - and #$7f - bne LastIsNotSpace ; last char not empty - first clear last char (no go back) -NotLastChar - dex -LastIsNotSpace -FirstChar - stx PositionInName - lda #0 - sta NameAdr,x - jmp CheckKeys -;---- -ChangeOfJoyUp - ldx TankNr - inc JoyNumber,x - lda JoyNumber,x - and #%00000011 ; max 4 joysticks - sta JoyNumber,x - .IF TARGET = 5200 - beq ChangeOfShapeUp ; change tank shape - .ENDIF - jmp CheckKeys -;---- -ChangeOfLevelUp ; change difficulty level of computer opponent - inc:lda DifficultyLevel - cmp #9 ; 9 levels are possible - bne DoNotLoopLevelUp - mva #$0 DifficultyLevel -DoNotLoopLevelUp - jmp CheckKeys -;---- -ChangeOfLevelDown - dec:lda DifficultyLevel - bpl DoNotLoopLevelDown - mva #$8 DifficultyLevel -DoNotLoopLevelDown - jmp CheckKeys -;---- -ChangeOfLevel3Up - adb DifficultyLevel #3 - - cmp #9 - bcc DoNotLoopLevel3Up - - sbb DifficultyLevel #9 - -DoNotLoopLevel3Up - jmp CheckKeys -;---- -ChangeOfLevel3Down - sbb DifficultyLevel #3 - bpl @+ - adb DifficultyLevel #9 -@ - jmp CheckKeys -;---- -ChangeOfShapeUp - ldx TankNr - inc TankShape,x - lda TankShape,x - cmp #$03 - bne @+ - lda #$00 - sta TankShape,x -@ jmp CheckKeys -;---- EndOfNick - ; now check long press joy button (or Return...) - mva #0 pressTimer ; reset -WaitForLongPress - lda STRIG0 ; wait only for joy long press - bne ShortJoyPress - lda pressTimer - cmp #25 ; 1/2s - bcc WaitForLongPress - jsr EnterNameByJoy - jmp CheckKeys -ShortJoyPress ; storing name of the player and its level ; level of the computer opponent goes to ; the table of levels (difficulties) ldx tanknr - lda DifficultyLevel + lda #6 ; Spoiler + sta DifficultyLevel sta skilltable,x beq NotRobot lda #$03 ; shape for robotanks @@ -1332,7 +233,7 @@ NotRobot ; check if all chars are empty (" ") ldy #7 lda #0 -@ ora NameAdr,y +@ ora #0 ; NameAdr,y and #$7F ; remove inverse (Cursor) dey bpl @- @@ -1341,7 +242,7 @@ NotRobot ldy #0 nextchar04 - lda NameAdr,y + lda #0 ; NameAdr,y and #$7f ; remove inverse (Cursor) sta tanksnames,x inx @@ -1359,145 +260,6 @@ nextchar05 bne nextchar05 rts .endp -;-------------------------------------------------- -.proc CursorDisplay - ldy #7 -CursorLoop - lda NameAdr,y - and #$7f - cpy #0 - bne NotFirstLetter - and #$3f ; First letter should be Capital letter - ; (nice trick does not affect digits) -NotFirstLetter - cpy PositionInName - bne @+ - ora #$80 ; place cursor -@ sta NameAdr,y - dey - bpl CursorLoop - rts -.endp -;-------------------------------------------------- -.proc EnterNameByJoy - mva #sfx_keyclick sfx_effect - jsr CursorDisplay - ldy PositionInName - ; now in Y we have PositionInName - ldx #(keycodesEnd-keycodes) -SearchCharacter - lda NameAdr,y - and #$7f - cmp #$20 - bcc CharOK ; digit or space - cmp #$60 - bcs CharOK ; not capital letter - ora #$40 -CharOK - cmp scrcodes,x - beq CharacterFound - dex - bpl SearchCharacter - inx -CharacterFound - ; now in X we have Character (index) on PositionInName - ; wait for centered joy - mva #128-15 pressTimer ; reset (trick) -@ lda STICK0 - and #$0f - cmp #$0f - beq checkjoy - bit pressTimer ; trick (no A change) - bpl @- -checkjoy - lda STICK0 - and #$0f - cmp #$0f - bne JoyNotCentered - -notpressedJoy - ;fire - lda STRIG0 - beq checkjoy ; fire still pressed - rts - -JoyNotCentered - ; this is a place for code :) - cmp #7 - bne NoRight - ; joy right - cpy #7 - beq GoToMainLoop ; the last character - iny - bne GoToMainLoop -NoRight - cmp #11 - bne NoLeft - ; joy left - lda #0 - sta NameAdr,y - dey - bpl GoToMainLoop - iny - beq GoToMainLoop -NoLeft - cmp #14 - bne NoUp - ; joy up - cpx #(keycodesEnd-keycodes-1) - bne @+ - ldx #$00 ; set to the first character index (loop) - beq CharAndMainLoop -@ inx - bne CharAndMainLoop -NoUp - cmp #13 - bne EnterNameByJoy ; not down - ; joy down - dex - bpl CharAndMainLoop - ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop) -CharAndMainLoop - lda scrcodes,x - sta NameAdr,y -GoToMainLoop - sty PositionInName - jmp EnterNameByJoy - -.endp -;-------------------------------------------------- -.proc HighlightLevel - ; this routine highlights the choosen - ; level of the computer opponent - ldx #8 ; 9 possible levels -CheckNextLevel01 - lda LevelNameBeginL,x ; address on the screen - sta temp - lda LevelNameBeginH,x - sta temp+1 - ldy #9 ; flip 10 chars to inverse video - cpx DifficultyLevel ; is it the choosen level? - bne NotThisLevel - ; change to inverse, because it is it! -InverseFurther - lda (temp),y - ora #$80 - sta (temp),y - dey - bpl InverseFurther - bmi CheckNextLevel ; Check Next Level -NotThisLevel - lda (temp),y - and #$7f - sta (temp),y - dey - bpl NotThisLevel -CheckNextLevel - dex - bpl CheckNextLevel01 - rts -.endp - ;-------------------------------------------------- .proc displaydec5 ;decimal (word), displayposition (word) ;-------------------------------------------------- @@ -1783,7 +545,7 @@ FinishResultDisplay ;------------------------------------------------- .proc DisplayStatus ;------------------------------------------------- - +DisplayAngle ldx TankNr rts .endp diff --git a/scorchC64.asm b/scorchC64.asm index 3afdfde..be0b0e1 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -6,7 +6,7 @@ ;Miami & Warsaw 2022, 2023 ;--------------------------------------------------- -.def TARGET = C64 ; :) +.def TARGET = 64 ; :) ;--------------------------------------------------- .def XCORRECTION_FOR_PM = 0 ; if 1 - active x position of tanks correction fo PMG @@ -174,7 +174,13 @@ WeaponFont ; Game Code ;-------------------------------------------------- FirstSTART - + DL = 0 + StatusBufferROM = 0 + ;StatusBufferCopy = 0 + StatusBufferCopyEnd = 0 + TRACKS = 4 + DisplayCopyPurchaseEnd = 0 + DisplayCopyPurchaseStart = 0 displayC64 = $2000 ; graphics screen memory start SwitchVICBank(0) SetScreenMemory(displayC64) @@ -392,16 +398,9 @@ MakeDarkScreen .proc RmtSongSelect ; starting song line 0-255 to A reg ;-------------------------------------------------- - cmp #song_ingame - bne noingame ; noMusic blocks only ingame song - bit noMusic - spl:lda #song_silencio -noingame - mvx #$ff RMT_blocked - ldx #MODUL ;hi byte of RMT module to Y reg - jsr RASTERMUSICTRACKER ;Init - mva #0 RMT_blocked + rts +.endp +.proc CopyFromRom rts .endp ;-------------------------------------------------- @@ -479,10 +478,10 @@ EndofBFGDLI .endp ; ------------------------ .proc BFGblink - SetDLI DLIinterruptBFG ; blinking on +; SetDLI DLIinterruptBFG ; blinking on ldy #50 jsr PauseYFrames - SetDLI DLIinterruptGraph ; blinking off +; SetDLI DLIinterruptGraph ; blinking off rts .endp ;---------------------------------------------- diff --git a/scorchC64.prg b/scorchC64.prg new file mode 100644 index 0000000000000000000000000000000000000000..1721170422f38098336b8f2f38de6d3acf00c1ff GIT binary patch literal 35866 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 Date: Mon, 8 May 2023 11:54:34 +0200 Subject: [PATCH 12/65] Next try... --- Atari/gr_basics.asm | 13 +++++++++++++ C64/gr_basics.asm | 7 +++++++ grafproc.asm | 13 ------------- scorch.xex | Bin 56609 -> 56609 bytes scorchC64.asm | 30 +++--------------------------- scorchC64.prg | Bin 35866 -> 35790 bytes 6 files changed, 23 insertions(+), 40 deletions(-) diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index b7dbe55..71cf658 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -220,5 +220,18 @@ ClearPlot bne @- rts .endp +;-------------------------------------------------- +.proc SetMainScreen +; mva #0 dmactls + SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen + mwa #dl dlptrs ; issue #72 (glitches when switches) + lda #%00111110 +; and #$fc +; ora #$02 ; 2=normal, 3 = wide screen width + sta dmactls + mva WallsType COLBAKS ; set color of background + jsr WaitOneFrame + rts +.endp .ENDIF \ No newline at end of file diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 7ad8115..f359e6c 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -220,5 +220,12 @@ ClearPlot bne @- rts .endp +;-------------------------------------------------- +.proc SetMainScreen + SwitchVICBank(0) + SetScreenMemory(displayC64) + SetHiresBitmapMode ; Hires mode on + rts +.endp .ENDIF \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index 30930aa..2bd2fac 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -2244,19 +2244,6 @@ quit_seppuku .endp -;-------------------------------------------------- -.proc SetMainScreen -; mva #0 dmactls - SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen - mwa #dl dlptrs ; issue #72 (glitches when switches) - lda #%00111110 -; and #$fc -; ora #$02 ; 2=normal, 3 = wide screen width - sta dmactls - mva WallsType COLBAKS ; set color of background - jsr WaitOneFrame - rts -.endp ; ------------------------------------- .proc SetupXYdraw lda ytankstable,x diff --git a/scorch.xex b/scorch.xex index 87efd6871eb8faced66ebd604abc915ff135ba32..c4a31c8a77e48437defdb347aa2707f590794145 100644 GIT binary patch delta 354 zcmZ3ui+SNL<_+#yOcIroJ+lHBzfGQ%rO&81`Bat$WB26GSxP{*Shgc$>g0%QQy|%w zT>vEiXG=1sZkEhhDIxD&^FeVXx5AE~m9twntqf`1yt1M7#!80Pn@cygURUs*{IJD< z(R;E`YZH*1+G?!sU9&P7RiO`1s2*Kt^ZVAd9E=u|=l0!UwAftLZ_Eg!)=l`tI(h9Z zh0P15J!fJJp4>50gRyV&#+h1-VUzF7G-A9znSYickaV0S474qDma)qH8n83;GgdOU zPFTs(x^d-Eh)oLjYmQC0@bOs3g>9S9%sS2tG=0jvOCU?q7kp+B?5*R=RQy|%w zT>vEiXG=1=ZkEhhDIu?2^FeVXx5AE~m9twntqf`1yt1M7#!80Pn@cygURThb{IJD< zQG2pbYZH*1+G?z>U9&P7RiO`1s2*Kt^ZVAd9E=i^=l0!Ul-OL=Z_Eg!)=l`ty7|Dg z=S+;olUK~tV9c9*ai$id+2lVnjTrY&)}LhvBok)|18pjuWvsHl2J8g=jFrr-6IQac zZd`d3VvEB5nqw0#d_2~1VcX>S(-b$Kopp>EX!?|Smq3=JFZj$Nm|dfCP2j{zht_Ke zCuJ^hC}dC0UaA2Mqs>#7hBE=Z{&x9pHXyZf-E~Gr{mG3R(ijaVzt|7}WLs{O1_oT{ O#;c5mo3%H6(*gj^xSO&7 diff --git a/scorchC64.asm b/scorchC64.asm index be0b0e1..59af7c8 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -182,9 +182,6 @@ FirstSTART DisplayCopyPurchaseEnd = 0 DisplayCopyPurchaseStart = 0 displayC64 = $2000 ; graphics screen memory start - SwitchVICBank(0) - SetScreenMemory(displayC64) - SetHiresBitmapMode ; Hires mode on jsr MakeDarkScreen @@ -219,6 +216,8 @@ FirstSTART ; Random INIT InitializeSIDrnd + + ;-------------------------------------------------- ; Main program of the game icl 'game.asm' @@ -306,30 +305,7 @@ getkeyend ;-------------------------------------------------- .proc WaitForKeyRelease ;-------------------------------------------------- - mva #128-KeyRepeatSpeed pressTimer ; tricky -StillWait - bit pressTimer - bmi KeyReleased - lda STICK0 - and #$0f - cmp #$0f - bne StillWait - lda STRIG0 - beq StillWait - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - bne StillWait - lda CONSOL - and #%00000110 ; Select and Option only - cmp #%00000110 - bne StillWait - .ELSE - lda SkStatSimulator - and #%11111110 - beq StillWait - .ENDIF -KeyReleased +StillWait rts .endp ;-------------------------------------------------- diff --git a/scorchC64.prg b/scorchC64.prg index 1721170422f38098336b8f2f38de6d3acf00c1ff..b647c2f6d5b09cff31c21303f0788b78b2b62803 100644 GIT binary patch delta 6153 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 From 825ef7636207e7ffe32b341308b4008e784f59a9 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 8 May 2023 15:49:08 +0200 Subject: [PATCH 13/65] Next... try ? --- C64/gr_basics.asm | 6 +-- C64/lib/C64_ATARISYS.ASM | 2 +- C64/lib/MACRO.ASM | 4 ++ grafproc.asm | 3 -- scorch.asm | 1 + scorch.xex | Bin 56609 -> 56609 bytes scorchC64.asm | 103 ++++++++++++--------------------------- scorchC64.prg | Bin 35790 -> 39370 bytes 8 files changed, 40 insertions(+), 79 deletions(-) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index f359e6c..3cbf842 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -193,12 +193,12 @@ ClearPlot ;-------------------------------------------------- .proc ClearScreen ;-------------------------------------------------- - mwa #display temp + mwa #displayC64 temp ldy #0 @ lda #$ff sta (temp),y inw temp - cpw temp #display+screenheight*screenBytes+1 + cpw temp #displayC64+screenheight*screenBytes+1 bne @- rts .endp @@ -223,7 +223,7 @@ ClearPlot ;-------------------------------------------------- .proc SetMainScreen SwitchVICBank(0) - SetScreenMemory(displayC64) + SetScreenMemory($2000) SetHiresBitmapMode ; Hires mode on rts .endp diff --git a/C64/lib/C64_ATARISYS.ASM b/C64/lib/C64_ATARISYS.ASM index cd96f29..656ae8a 100644 --- a/C64/lib/C64_ATARISYS.ASM +++ b/C64/lib/C64_ATARISYS.ASM @@ -3,7 +3,7 @@ ;* SYSTEM EQUATES * ;**************************************************************************** -FAKEADDR EQU $0100 +FAKEADDR EQU $0002 ; diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM index 470397a..3761e4e 100644 --- a/C64/lib/MACRO.ASM +++ b/C64/lib/MACRO.ASM @@ -280,4 +280,8 @@ upstartEnd ;------------------------------------- .macro wait nop +.endm +;------------------------------------- +.macro halt +?s jmp ?s .endm \ No newline at end of file diff --git a/grafproc.asm b/grafproc.asm index 2bd2fac..59e0da5 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1630,9 +1630,6 @@ NotHigher rts .endp -;--------------------------------------------------- - icl 'Atari/gr_basics.asm' -;--------------------------------------------------- ;-------------------------------------------------- .proc TypeChar diff --git a/scorch.asm b/scorch.asm index a139adc..9db07ab 100644 --- a/scorch.asm +++ b/scorch.asm @@ -603,6 +603,7 @@ noingame icl 'Atari/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' + icl 'Atari/gr_basics.asm' ;---------------------------------------------- icl 'weapons.asm' ;---------------------------------------------- diff --git a/scorch.xex b/scorch.xex index c4a31c8a77e48437defdb347aa2707f590794145..dfb3126ead82f8f852ae1605aebcfe5b367c8e03 100644 GIT binary patch delta 1117 zcmZuxeP~-%6wf;`?n7NR_t8??c-yU(b#Cj5)2V-05E(+tNEy>1Xqr$+(~KBIYu`ub zbaz@@n#5y^ZJ@NP&+P`9HMyOYLLgI@tlK}?7@acQaInrQlghM1r0BgbI++R&ew^Pq zzjMw#obyJf?W5E7iT!?n9{#fbbp^PN#f}!ofKI+MuqIIJ*x5ryb!-l_fM3HzU>l%{ z=L2=Hq~b4uYH5{qHo@g?+~4`QglK0-z=y$dX;cKifGLe%4T7?g>#RBw0y3cU9}d(2 z2we5r^a>Dl&UJ5*ZiwVT7W<>SR(c;*!HTNa6Aoz?4*d=!t1eWt2gv8GEI~7DFXilQ z`ZcrBZ_G5kEWCLA@OBWemL8HYKpS^tRpz@lwpmaI|3i^?Tgfx6^4-7DS_jufD}3XT zn-0(neDLVA5?YQH4r<0ObMi(n^_r*VZPZ7kow*UB9+L~ZP1xg$PU;=Mr@OCx!gpbe7`((s>Xg$HX-7$v&@RN+ZcG9PYcaD%mxn zm~26L|L_TNUc>jI&#l)C(_4hRFYnEVi$60v4U1ZMEm~Hu8FQW@%(V&r_Fw#*2%YoY zrEjrirEn5^q~V`LCBN0OXZ|7TnSi`}Z;39YkTpWFN;#}ZtjdwIIy@QMD2YokB4IJ+ zlCUA}+VZ!S-A}_NdqLT{^5SNNp17M+bof29Sp>cscdyB5*_5-qL!n-_Tr`+7`004F z0%)KUn`BZq?t+|wAK)8RIipy`WHK~HZ0Rudro%!R4~q$*!K*%6ukhT!O@K2hvcWpA zsd#a4Gn{=3mj-u$Tf>H-h7E2lA1mJS{CmgV9BQm|Yu3hX_lpU}*nKq3&XhKa2<=xx z#5tv9k2q;>_N8_7Q*u?q+e0b@bqpoyWTPJ^p68AIeG30J@fkp}i}w#-P$c?CYUP7? zbaV|sLC0fbyCwWMc23HsJ{fy>N!>KN`Ydarv!0pC;&LJ`F=*Do&K}-xz6j#%_)o`E zmUcK#rcUn(t0{wA^!>c(w79uAItn&|0kzS1xEk? delta 1098 zcmZuxVN6q36y}|#PT6L44rv&44}=lXO(lzV?uU?#m_?Al7B*s1OPeN8YP!Y@Uh%cg z=~W4qw!69%NeED%^EOgxFHS?k4~;3#{pk!r7qgKq0c4AYWeU;#*zPILMYrT7U%v00 z^PO`~?tKHJx`9#MaAPw}D|}D$ehDi5G~H68FZRpV6k6mg(Hp(;CO@rq*1&>Fd!27V zp-R7VmO__GA2K5>&%ZMb;brq_7{3jPk*_D1)7;uAJ?B~Dk zD*_O>^3%~3Ao|?!Zon`EQh?3=@|IxqjSk3Um8rdYHa{wU7?}N0JZM%kS3XxgU`deWhQF z!q*+0)q_Q$FP+$dP;+AZphYojBh#J4rd^!NB6b;ha@tL-8W+4t@Sz0*u?;O6GC`x3 zbaY~{MFh1Ghnv^}3kL0?p!UF`AyYmg%Ad8%RQ#WvmD0eV*aqF!ZPQozWV4s{b>CTO z_V!B}o0pCsIVU&z=&|5?ITl5;r6FZc*;1bL?@UKLq8FVC=9XEM8EYD5nuPwx6MaUc z&e)&I_t*2m1x&HoxL#WN#Y=Uyh(VMyV5m*gc2?BNdO$ywRuqmG^qc^@$6h$DHw%^_A!Vz#_xX}&(!wC^00Pa z+@zCZ?fgz`65xD0NMI ; to our routine + STA $0319 ; + LDA #$00 ; stop Timer A + STA $DD0E ; + STA $DD04 ; set Timer A to 0, after starting + STA $DD05 ; NMI will occur immediately + LDA #$81 ; + STA $DD0D ; set Timer A as source for NMI + LDA #$01 ; + STA $DD0E ; start Timer A -> NMI + */ + ; from here on NMI is disabled + jsr MakeDarkScreen - + ; one time zero variables in RAM (non zero page) lda #0 ldy #OneTimeZeroVariablesCount-1 @@ -216,8 +233,6 @@ FirstSTART ; Random INIT InitializeSIDrnd - - ;-------------------------------------------------- ; Main program of the game icl 'game.asm' @@ -231,65 +246,9 @@ FirstSTART ; result: A=keycode ;-------------------------------------------------- jsr WaitForKeyRelease -@ - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - beq checkJoyGetKey ; key not pressed, check Joy - cmp #$f7 ; SHIFT - beq checkJoyGetKey - .ELSE - lda SkStatSimulator - and #%11111110 - bne checkJoyGetKey ; key not pressed, check Joy - .ENDIF - lda kbcode - cmp #@kbcode._none - beq checkJoyGetKey - and #$3f ;CTRL and SHIFT ellimination - cmp #@kbcode._esc ; 28 ; ESC - bne getkeyend - mvy #$80 escFlag - bne getkeyend - -checkJoyGetKey - ;------------JOY------------- - ;happy happy joy joy - ;check for joystick now - lda STICK0 - and #$0f - cmp #$0f - beq notpressedJoyGetKey - tay - lda joyToKeyTable,y - bne getkeyend - -notpressedJoyGetKey - ;fire - lda STRIG0 - beq JoyButton - .IF TARGET = 800 ; Select and Option key only on A800 - bne checkSelectKey -checkSelectKey - lda CONSOL - and #%00000010 ; Select - beq SelectPressed - lda CONSOL - and #%00000100 ; Option - .ENDIF - bne @- -OptionPressed - lda #@kbcode._atari ; Option key - bne getkeyend -SelectPressed - lda #@kbcode._tab ; Select key - bne getkeyend -JoyButton - lda #@kbcode._ret ;Return key -getkeyend - ldy #0 - sty ATRACT ; reset atract mode - mvy #sfx_keyclick sfx_effect + lda #0 + sta escFlag + lda #$ff rts .endp @@ -344,16 +303,11 @@ peopleAreHere ;-------------------------------------------------- MakeDarkScreen ;-------------------------------------------------- - jsr PMoutofScreen ; hide P/M - mva #0 dmactls ; dark screen +; mva #0 dmactls ; dark screen ; and wait one frame :) ;-------------------------------------------------- .proc WaitOneFrame ;-------------------------------------------------- - lda CONSOL - and #%00000101 ; Start + Option - sne:mva #$40 escFlag - and #%00000001 ; START KEY seq:wait ; or waitRTC ? rts .endp @@ -387,6 +341,7 @@ MakeDarkScreen icl 'C64/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' + icl 'C64/gr_basics.asm' ;---------------------------------------------- icl 'weapons.asm' ;---------------------------------------------- @@ -463,4 +418,8 @@ EndofBFGDLI ;---------------------------------------------- icl 'constants_top.asm' ;---------------------------------------------- +NMI + INC $D020 ; change border colour, indication for a NMI + RTI ; exit interrupt + ; (not acknowledged!) \ No newline at end of file diff --git a/scorchC64.prg b/scorchC64.prg index b647c2f6d5b09cff31c21303f0788b78b2b62803..d49a934a7dc6ca832f3783a12a8fdc3de193dce3 100644 GIT binary patch delta 12547 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 Date: Mon, 8 May 2023 20:28:24 +0200 Subject: [PATCH 14/65] New set hires proc --- C64/gr_basics.asm | 32 ++++++++++++++++++++++++++++++-- scorchC64.prg | Bin 39370 -> 39386 bytes 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 3cbf842..0bf04e1 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -222,9 +222,37 @@ ClearPlot .endp ;-------------------------------------------------- .proc SetMainScreen - SwitchVICBank(0) - SetScreenMemory($2000) + lda #0 ; Black background and border + sta $d020 + sta $d021 +; lda #$3b ; Bitmap mode on +; sta $d011 +; lda #$18 ; Multicolor on +; sta $d016 + + lda $dd00 ; Set video bank to start at 0 + and #252 + ora #3 + sta $dd00 + lda #$18 + sta $d018 + +; SwitchVICBank(0) +; SetScreenMemory($2000) SetHiresBitmapMode ; Hires mode on + lda #$00 + sta 53281 + ; clear color RAM + lda #0 + tax +@ sta $d800,x + sta $d900,x + sta $da00,x + sta $db00,x + inx + bne @- + + rts .endp diff --git a/scorchC64.prg b/scorchC64.prg index d49a934a7dc6ca832f3783a12a8fdc3de193dce3..bcbf2c0a645a4405fccd638a60f7a26e1ab185dc 100644 GIT binary patch delta 2495 zcmZuy4Ny~87S2rqN>Bug3MzO(Scza2bv2^a@FD|CAG%YEe?@tswji@a5CRFmK_35! zk%Ne=p+$H!PobdEskDZ*x<#H;o9&2OZIM}Q9o%&=Zrh>ms_ad4wcXkKX72g>?m73J zd(ORAt>W8OaraRgeFTm4Qq%+k^n%SE#oSE?Vt5gI8~bLpr`w)VLa@VEzz&%ZZuiGq zs_5KA9O0Uk)x603lnS}&eSsOvrtsTFJiO=52@3b?+tOVgwq|m@jzH{yxP%|j&#-2L z5&di(*ia)816a4d)iz0CX)%{kJ)JG)B5L%zPW!`-Xl2it7IwIUQuch@VvwmiRLY(U zErvK{$9iSYK#M^`b;Kxp?67=$Fw()6?TIMB+PU3Zij>ygov~u11@~PsNNc5cmARt; z_{)2jkr|Gp_D>f#vuA9%&8&6QIcM3#%~o|7-fowOMq_EV^wLeKTr*#NZes$#sgX^J$TXnHhRxjuQb@+b|Z3DrhumufHRzR)SOlr~PgL%V0LHeH*g)oOLR z5?#6Oj_$lpr8%F^@RM0HJ^-sT0+1fIWz3bPXmAy1GXh>qDkVAf;=R}|{JDX5W6g9K z@EM`f&keW?zRI9c63kPFZ0t7>n5WaudlIO=ps(9*Acr!-wKybrg^}R{*)Cp6qKxG# zIOcvZ%XEwTcD>N}aZK8JmNAL%z0g3NIt-1$r|JOzv0Q!zYi2lx&ENmc$Em_E&^}mhNI(9l#7eqt3!5rOYr$B-kogbCf%hMj0BTb zA{-*5twiV`BwsIICwMs$g=s|4l?d*HOw|jM2DP? zuP)}q@@c{}ho^#^g|56{83CL%UygN(-{krKQtZl` zrFeEZ)^<5oINR-9NA3z2kVoWP5X)n~eZ=UOCM9a2`&ST1(E1}ayr&IZsx~_A+Gp?+ z2_mIIq~zU6zKDR72BgGWx4GQ132YPLxhBEiB%$lzW37(#z*60QWP?`SC{jReellu> z2l?Ts82kz%(J6>8Smaq-#*Nq|I69k7hSGvWKUq2X*^!V2ZwcMWa=msZaq{r6V8P@w ztPtvO3W0^oQ3Y%&+=^B}M_~fl=D!LTkvXiW6ve=)qBS1HMq8PRU^jxJsE~9*Mse8e zi{-X-70cN6tJq!K0Gq;n!R{u}da)9^i=(6$%jt_SR=gag!Tgei=%RH)Nfc77FybqJ zU~H*MHq#av&1Rj>{N2RiOa@;v;<+ZQHZkq##z@r(QF(g#&IgeyN3iV#3sA6 zPL=vYa%r?@E&;L@ydj-;>ZlpctBy34*=C^xUpwYy>>2)j5FcD0FkVB4*Sx5`Nfu|_ z#Szgip`8ZUeQ*)t;PAn<_-+j^Aq8-PoH~AzN_L0yw&4W^T2%AG+1Nn~N!rn}21m-} zAwL*>549cIYciU?H7z{+t+8{?4MA#pEO>SQB!6b!bHWkNd&7l(WfA}GI+X+ z=S3v5u52F00zl>BdBgRBd$$|ufN_d(`c|8Mjrm*U;@AHVX3tAMA4u^)J=aRwlWQYg zi-+NjD$A75S`6RC?mb|*7u$0Q{#g|#9je2LV6P5@q-rmpH|rGK;C(lCuy2q&13APp zwI)zz^5`4v%W-(qmC#x(mri}YBEn~=&W{^RBj|gt&#_MFC-R`Q~_!ib1ROjb8q&(^Nv@hI=jz(`qyVtPw${L>*>GK!Un{u14eE&rHo8PBujvPDl+1Edc>yP|*z=4J^ zXln3=j)rOQNyF4xe?0zjm|u-%>rg|K7{!C%vB;^=5;5n-5;3=h6?Xz`K9>C-7g1Sx delta 2477 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 From 1ce1e978bb1d86a29cb19a408955a0340878b5ce Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 8 May 2023 21:45:08 +0200 Subject: [PATCH 15/65] First "working" try --- C64/gr_basics.asm | 59 ++++++++++++++++++++++++++-------------------- scorchC64.asm | 8 +++---- scorchC64.prg | Bin 39386 -> 39710 bytes 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 0bf04e1..e9bbfb0 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -126,23 +126,22 @@ CheckX02 MakePlot ; let's calculate coordinates from xdraw and ydraw - ;xbyte = xbyte/8 - lda xdraw+1 - lsr lda xdraw - ror ;just one bit over 256. Max screenwidth = 512!!! - lsr - lsr - sta xbyte + and #%11111000 + ;sta xbyte ;--- ldx ydraw - ldy linetableL,x + clc + adc linetableL,x + sta xbyte lda linetableH,x + adc xdraw+1 sta xbyte+1 lda xdraw and #$7 tax + ldy #0 lda color bne ClearPlot @@ -166,24 +165,22 @@ ClearPlot ; let's calculate coordinates from xdraw and ydraw - ;xbyte = xbyte/8 - lda xdraw+1 - lsr lda xdraw - ror ;just one bit over 256. Max screenwidht = 512!!! - lsr - lsr - sta xbyte + and #%11111000 + ;sta xbyte ;--- ldx ydraw - ldy linetableL,x + clc + adc linetableL,x + sta xbyte lda linetableH,x + adc xdraw+1 sta xbyte+1 lda xdraw and #$7 tax - + ldy #0 lda (xbyte),y eor #$ff and bittable,x @@ -210,11 +207,20 @@ ClearPlot mwa #linetableL temp2 mwa #linetableH modify ldy #0 + ldx #0 @ lda temp sta (temp2),y lda temp+1 sta (modify),y - adw temp #40 + cpx #7 + bne NotChar + ldx #0 + adw temp #(320-7) + jmp next8lines +NotChar + inw temp + inx +next8lines iny cpy #screenheight+1 bne @- @@ -222,13 +228,9 @@ ClearPlot .endp ;-------------------------------------------------- .proc SetMainScreen - lda #0 ; Black background and border + lda #1 ; White background and border sta $d020 sta $d021 -; lda #$3b ; Bitmap mode on -; sta $d011 -; lda #$18 ; Multicolor on -; sta $d016 lda $dd00 ; Set video bank to start at 0 and #252 @@ -243,12 +245,17 @@ ClearPlot lda #$00 sta 53281 ; clear color RAM - lda #0 - tax -@ sta $d800,x + ldx #0 +@ lda #1 + sta $d800,x sta $d900,x sta $da00,x sta $db00,x + lda #$21 + sta $0400,x + sta $0500,x + sta $0600,x + sta $0700,x inx bne @- diff --git a/scorchC64.asm b/scorchC64.asm index 6e3b3ab..6e83f19 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -35,7 +35,7 @@ icl 'definitions.asm' ;--------------------------------------------------- -FirstZpageVariable = $57 +FirstZpageVariable = $30 ; $57 .zpvar DliColorBack .byte = FirstZpageVariable .zpvar GradientNr .byte .zpvar GradientColors .word @@ -161,7 +161,7 @@ FirstZpageVariable = $57 ;----------------------------------------------- ; Game loading address - ORG $4000 + ORG $4100 icl 'variables.asm' WeaponFont @@ -184,7 +184,7 @@ FirstSTART ; SEI ; disable IRQ LDA #$36 STA $0001 ; Turn Off BASIC ROM -/* LDA #NMI ; to our routine STA $0319 ; @@ -196,7 +196,7 @@ FirstSTART STA $DD0D ; set Timer A as source for NMI LDA #$01 ; STA $DD0E ; start Timer A -> NMI - */ + ; from here on NMI is disabled diff --git a/scorchC64.prg b/scorchC64.prg index bcbf2c0a645a4405fccd638a60f7a26e1ab185dc..4ec4ea022c23e14095a155a4f0cb6bca38dc1e5e 100644 GIT binary patch literal 39710 zcmeHvdwdgB+W#c!owkIlK`x!NO=+Mvo0cYRxs*&XrU5|_rA19?QwWr{_Clewr69vr zAP^A2D$!DzN|2PYtE*M3cqx*uu(PY;vM!h1wUK(kxay)S(BJpWq@}3)zVF|^PX^7L z%X6OdJkNQ~bDr~@GnIsdhlEkjq~4)PPopSm!2kFq;Fo}30)7ejCE%BUUjlv!_$A<% zfL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&` z;Fo}30)7ejCE%BUUjlv!_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCE%BUUjlv! z_$A<%fL{WB3HT-8mw;aaehK&`;Fo}30)7ejCGh{51n}o|#7B#V(o#)x;uTs-CR4;R zId^Z}+@z@I>&MrpP}G^fX)8P@DJpjEz}#3gNl8H=MFoW`@Pr4QFry&Fe1hZ@jROM| zB@5R!zOY0cm2sJ_1-HKb)z|Z${A8V zqwLI$NaQbl7fJHPLSh2N?U(p&*FGFRWfk! z>cIg@u3apbFV@N_q~wdwQdISsNrYdD8gp?Bp{f3i=Z42aQP<8~^LVb2{H05Tu4@ZC zLjH#NhZFy}0XmldaOu(|q5g`ej-ouC8z)J-`Vzy`pdXKi@bB@IRueWnp0lrB zIZ5zVYnMS@XU?1{n{o~G?aW^HFXXf5ZXyr$$w0~6ciwr2$}Yh#-X#CYC-2Oi%Y9~f z=f*~gGS4y-{;74d)(P)~S+f#IqI5=PDPAY&F=InQsJZVb64Dg!%+)Slyk`%!2l(?F z6_f%10r#YpW+U;$gJnk=vrz!z$OAbGZ$)eZjcP5k_<=c)IJ4(S+krU*j*Jc-Co^qq z2;P%sOq)brNgM7%qWsxo50j~O|KrCBUd|gBSpAIUugM?1+B>lE&5P8_8?JYMLS6NK zb>U6CznaLq)>0vqf=~m6$tKj0@xO7SUQ2~cnzeBf5Ko%4an_^|s&Vezxs9=n1Aj$r znN%tToxTS3k&R~{|4Y{}oY#P${^X^9)KgSsZrS^fzP@dYW`#9d*fb<%dr(jum*8X9NDr8)wgAyr|cKALYO=jK7e-c1geogcS8R zkDy=FvP<g{cv0fpkoHJO7bAnAFb3SLAAahc-$n&;< z^R~eA&P}$6^G*r!^!|J&)jF$%%4wGWr!}R8qE7MuX`R@0IKO2!imo~-_73{$a@w)h zIbe(Y&^GczXOnI8hiFDuJm8elA1K`l4!hniyRl6_ z#jc;VO|R(QA{1`XcQ@)Aw&@*>ByoP9-cIu&s5^f^Zy&Ek;`#x-LjbzIj{uoAEOt^T zKvL2Dfq>!zefMbr#c7flMDf8OiVp-70uVuQT5o!Tp!k3!dsAel*u|~}y*G%yZZW-k z@0GE+&T;HoljmM%5WT1dQa(p`k{)rqZMb}CD*r=UAliZ%Pz=KM>77N6HofDR-tm&& zdD+pYcgh@J=$#Ka&gq>J$3;D@U+Q?r&@1ny(`)GZwex%bS*unhCWzEOID#M*BQo2&8^gy`9zM#^j^uSUisA%($3q&JRi_2 z|H15f+n{K8P49S3Z+2DdPv4be9|_8<_0HSbwRA|e>FoXDD0oAXkh7_s=`Jf^rSuI;w=Ty!iN3I_ok50vekmt)PvT{? zql!D`m6%PpE$LP<81!1G9$QY&ZxV`;CYXTby51e_9qXpOVeaYt1p4W1=!dQlez$Cg zEU)WhkI7#*U#Zs9Pwqkw7uxi6_@jpy0Yhyix8FO3POGK=S;jH!60otAA!3lxlh^dh zzinT#l{p&9@Imd&la8zUp;m2yU=B6k1)x_)x#gW#4|nOzbapLKL_)SM$1Np^k zAJ!j6o5OlDA+4Rk*dRkMsdh?04!Q(|r^A@eAJ}#PJkK6xok8t!&kz5f@F4L{&^oEU zb^_J+Jo`L;53@kr=VYB`_C#xllTxfIIboM6tYOXk_ef&Oa3?T%%x%d|>JrUMF{`HJ zIu_(Q8gm^TxsD6Dj>vhv-hTPt31!FF^ux|7*67r;c~9;(dW^i(lgH(`@8$zIqk9$q zMXO{-0<$BTIkh8^*^vTGvUv>70NZC6EL(Uk>md3~%-MnmoOiR*wg9Kxae#5sj{N|2 zv@^~D$3do7-tSbfQl|`a0Cqr$S9%R5e-X5*SNYUnX}rJbL;J`?jEoa;FMj=>vg54!P=!Svgu7ldB`f}?F9 z`0}M7{%RZ54KwqW{_>|=`R~bO%xj~zn!4Z8pMP6#zk`>*UaRkVPyhNl{kiw_UZp*X zHFm#E;5nn?Z9TCy#_n}`AVYqg-ebD_X&(PJXX0PQu-d{I*PS`;0B@+VESw?#6M?8t zpxi7Pmt)QWlH#Q5*=93-1H4kFL?tzgbHp18OW2x6Kb>zjS@OM-&&_06+n?XeUp3>Q zB=8_4GAR|7CmWDasmbX{vA1I_hW9&w^1$GzjRPA8sIam0w6rB79AIP7=Na$5_x^&1 zi&vIbRIjUVdh|EjckS8tl;hx`=U?bJ{?aS2z46w&C*AM=@lPL~J@?7^i~so4bGiSE zudaCi_3d~6zWT$D|M}_Kwd*%-h&!#OIkY?^Kq`UX_x07EuEVogwQx>)qC_eS2n-4y zRaG6CR#>)rbXl?R9#bj4$5yWt^5cB(@xC`5n-DJ$E|EYs6#ggwk)-$_iGLCbLn;lB zhR7sv5GixH{e8OkJq&=;8${{cDFM;fpZqyO-Uia8WD|HPb} zxq2pd-kpZKjCrQ{3+`UH=$?BQ-?!xc2bSg+m^Vbx4^Il3IB`nW%F&_>Z1#n zucs2NRaMqf3*lf`l4L2NKB;E4P>KAoq)?w=DXfUAEMFmH@Do>4wt77kUA|_ySdyqt zoiSKP-m#X#>XpG&RJ^6InBC1^QCU zOG|w~!;(TH^s{z7b+a_piVk8{7FMnhITG^GrG-`1Vjp6Dh-dD#kTs5lXbVl5@5mZIu%GHjZaR!iw1Gsuhb zyjdDoURh)r1{GaiQ&zN|iot*g3YkE#Yl>Euk~f~DnxaxmVI`GeEd!n4zp##|+YrG* zKDMy3)>=luDP>J{IU&eWRwag#U^JaM)v6aOkMfW5$jff16^$ z?Gr^CG7yY+(7?#Zf!X6mXHL`3)I~@FDOF5JSaSTV#1ZnO@zZZhjhb@1V)8^ydP=mi zaCuR&rDVlQ>#EhIYs$(i9;vLVu31~VZhf762zMm)*kik%c=}+|;G-+Ap=vFa7OJAO zaJ{wcGffd>b2+21vZ}B)922u}P5)@QTplr6KKk*d6wJBG!Zm9EmsY-}u&RyJOf0OlmQ%s1HLDBP197GGho+eFVhfdA zQEgpgtt$lVl@v^tN-9{sE-o16pvwA1ld|$VWpUveDg&w`;7tX|WmNDwGWeCG%Q&m0 zvZV0aCUvo;uqvEdX(_D`2)yH9ba|1ru&gGW0>{e>ms?A%)$5BZ3s;nv?NF5!TPkB~ ziY?((EVL3O(H6_{Qp@tn@^#@Lu5Nu*YWa$AsTs&C z62z1#A3(;Xs znWdO2!F(ZI$JMN|CRwT}%)2T`e$$|OG_{3vUs~>%or9g0IUoRbAL~GXt48mZ@xff$ zT~TbB`OqDwPRMvEHfDEpRTr?SU9|k&Z$#dwjQ06(?)fD*@kUu*Een0sS!Ue2UH@)lUpYEAr|YLSTNraxpVLJ>XEWp+WpcVkK4)92Kbo7@;_n zJ)l3#v!$2!9_el|w~Wkfmj9!bf|N$)UZVJj6L9-Zx0v|=C*_q~-o4<|i9r5SbE~8c zdxfAa!3hceMxyI(6 zHspBY*e%Zcu-VSRW_wvNq_Z8#9nL29I7Indp~-_)-YL!z&JXDGW6y)Wwc+(2Ao#s}(@+46G^FrdxvTn9eicD zv-`48Hm5I}E#WeIW)a*yGwtKKmqVqbTGuy|E#fl!X0gSlwh}EjvrmWotiDXPm@Don z0eDf5#Xf>7Vjt#;S+nWm63&8T32R1?1w|#?!)Raz_{*UI?8{tHU~!-&u!IjL+?nE6 z0(>>VOM_O&m1;RlUlF^4E9om{R|c(!Bb8QEt_rfotVu}-6{K{vP+AJGm(>CM7;Y(R!|J#^%e`!-=|zCt(`Q8f z-o89GGoeZ^kMMMXl2>E3Df3NZRxUJfuSIMlp`o#Bx&3?whDk$j*@5%nmbl&Fp?)0s_xcV9w|AdoZ85r9BUOWu_@B zI6@6*;RxX%+YA)jfno=j#oC}TJ2A`#_Ac&Gb~#c7cs~?`f80ZCVbDVguFxuD3%P=x zhdR^fS66xr3a-E!02EZ1^Is3ho?4?}18Rdgu51)b31*U*u;0_BKc9Ag;A1OyhogPA+a*ghuFjK47L zTgl!y`0%@1JHP9SVEC`Q#xVTn3fEbtVd65twL~y>*_DqO*T+oD80N}fn2x_NSc6W9 z!HFnE0}vCC8)FzPf>Zq?k?WLQ7{id2>Tkl1I)drZ@wXvl)sxA~xhxRj47PoU?%Ai= z1HJN#X2e5C0D)r+hygGN6nL0+(#iKLSpu~g#sR@LUfJEQZ3mq(ruOW2ws%m0HM?<@%nA-sm zX(16S1fXBlDnU4d$ns|HWFddn413ovV|AUj z5LA^81y!AaA}fQ;eoJJ8YSNoX!k}1&bwq3%VC<035SfGBNW^Y1JA^*iOpL>(A+8A3 z+~&I^iI|2YnmEWU$iM6ZB*RMCiW!@QVVj&%TM?!QQJolXh&$FB;EspTo4BULBE}mE zz#_&OiI_8q(@k8(H6e;BqwgyvgYU91d;&D!;cBq2uoA*Tz-<0nZ;-a6OxqctC@E9K ztr;4>KJ+tzaldDmnapL}8a|s~;{#izblv@gfLLAu#rpmICn$7*qQiO~P958Xa4**s zDrK9*ZX6RB(_Lk)L0!?yde(T;ddj?k&GLVxEKVq9D(;3|z@i=q>9}Wf<_KdUfejHN z+%Q>iH;X|uKvQB-#s?EXnOz|m8y{dlMF8gzK-m=wF(6zMJnSHFjj$bIT4tKPh6qF` z4;N%d+&zKLVe&ys5-NwZ54TVgTc}Ab)Z`XwN(&WrioZe}4IKt=7M!Sg?A<`Osg*ju zz21|HtV>NR2jFB z5+XWZmtyzA3>rrNF|UiO@jl9KB9J&V@<~*S704am`Gdl`5G&mWWL^3*<9r$^tcepp zOw7w+pC)f(4toG^wZ!%jL*65gT)upH=Z6gakyUgp76`7z-CR~HwR?fU4Lf! zo(4MC2Tb1qV8k0;soJQWA2Fug6$;c_eD#*W`c`{jn*{Z2)}ZL1pn?bL4LS26!|yVU zt1u6$0k$6RZTr&#yX^RaBjUJocf0Qd_yTt$@7ZSNa@e^TGkwt9IDMS&e+4(!TFB1j z^ww5Z-x_>;?p*^dC*bz9oMM{g-;ml6b}mfGU|lCf((($aYYX0LgiXx@#!a(28M}7Y z38piM+lcs# zkq*L+;}qlcItcNOR~Q0Mi(K`}Kj3t>Qw*1Bb2D6)?G=X0wskSwCflnFd}tkf=uG&* zS@46i+hkx^c9UVF$nfvH|Ak@SsxZW`>lBQx%gwNvu2+aUb-~4Qy~?ng~_AI;OGWpFTd83vy_HBpHoY%JlUbBfUfOo_i;T^GghYFgX48wUV#m*;C zCK&KMILvu+>@is!#(Gn^g0L`!#YkW*d1yXg5U0sK2M#Z)aN}m`A3K`fgZt_z&VGtdqX}( z>&)-lC{(~%5-W(~A%l`;_rs;{?kr#*=QaXEpz}p7KuN(a$Y3vP2b%@hM!dme|5jjm zoGq}2aXQOh(OEE!sL^r-eJJfjX&*{Or{ zcXB#)@DXkkafEFzFq20t+dY#H6VfxsAdOb87Z{v^a`SL9%H4^R(YAo2`9}jxY?PvH%kaVscNAMu4g`AuI)jUL-8}{jDAV7s)e`wEAG!Rlihy|{^KnT{q zO?=4lnF1Z=<1+;s;B)>r=;Jf*8kjj^8Ci&oPMYjWodd(pfoH=u8r?bk=R*L_m6+2x zxMy((ynwmv-6ZnF8F#}>>|Sswm>=Cnk-4j5VG*nnHqUgyw<02{<%YYBpbyR4l)Q^N zuf7&4vr*@r3Y&s=jpEgBhSIiCylXtK{@OO4#~P^Q+bG=pp#I{Z&N-;RI;c;aN(U9- zpaLCKkb?@o%>Ug?KZeT`-B zZ>`;0YptuOTU!@YFR!n!+gi7y?qJ>Fx?^>}uj{URW5c@}dN)MZU)%7T+H3V@xP)uz zm)j6oa#EjSBaf5+UirUwo`VxQf^CL(yw=py;2gy^BUUs41p(|@{wr)sn)&ZYDcxR6 zpC-2~<~5YmyT;|R8=c`SHo%Aa1KC4RZjNq!6jw1KVUe2Y&|Lz)Qw?S_NpJ^kM;Wfo z=3)eRTL;5&{gmw(1BZbC)2AAMn0Qg}K`>@@X!ID;ufZK)>ycS~ z%0A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 literal 39386 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 TZhI(3)SEbJaOhRqllA`r=GI`W From f79da6ac0fe79cf94fbd8b9ea168e91ce44bc281 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 8 May 2023 22:24:20 +0200 Subject: [PATCH 16/65] First attempt - done! --- C64/gr_basics.asm | 32 +++++++++++--------------------- scorchC64.asm | 2 +- scorchC64.prg | Bin 39710 -> 39693 bytes 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index e9bbfb0..09a6fa1 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -16,8 +16,7 @@ unPlotAfterX lda oldplotH,x sta oldplot+1 - lda oldply,x - tay + ldy #0 lda oldora,x sta (oldplot),y @@ -31,30 +30,24 @@ CheckX jcs EndOfUnPlot MakeUnPlot ; let's count coordinates taken from xdraw and ydraw - ;xbyte = xbyte/8 - lda xdraw+1 - lsr lda xdraw - ror ;just one bit over 256. Max screenwidth = 512!!! - lsr - lsr -;--- - tay - ldx WhichUnPlot - tya - sta oldply,x - + and #%11111000 + ;sta xbyte + ;--- ldx ydraw - lda linetableL,x - sta xbyte - sta oldplot + clc + adc linetableL,x + sta xbyte + sta oldplot lda linetableH,x + adc xdraw+1 sta xbyte+1 - sta oldplot+1 + sta oldplot+1 lda xdraw and #$7 tax + ldy #0 lda color bne ClearUnPlot @@ -91,9 +84,6 @@ LetsCheckOverlapping lda oldplotH,x cmp oldplotH,y bne NotTheSamePlot - lda oldply,x - cmp oldply,y - bne NotTheSamePlot ; the pixel is in the same byte so let's take correct contents lda oldora,x sta oldora,y diff --git a/scorchC64.asm b/scorchC64.asm index 6e83f19..12f0d09 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -35,7 +35,7 @@ icl 'definitions.asm' ;--------------------------------------------------- -FirstZpageVariable = $30 ; $57 +FirstZpageVariable = $58 ; $57 .zpvar DliColorBack .byte = FirstZpageVariable .zpvar GradientNr .byte .zpvar GradientColors .word diff --git a/scorchC64.prg b/scorchC64.prg index 4ec4ea022c23e14095a155a4f0cb6bca38dc1e5e..d4cd94166ae242b2d3a6dc24aa147cdac72a1bbf 100644 GIT binary patch delta 13487 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 UARbTC(KMnPT<&?&MUSrg{{mmsCIA2c From 5693fffd8a623490a13ece393a8251c4fca0a032 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 9 May 2023 12:40:57 +0200 Subject: [PATCH 17/65] C64 colors --- C64/gr_basics.asm | 4 ++-- scorch.bin | Bin 32768 -> 32768 bytes scorchC64.prg | Bin 39693 -> 39693 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 09a6fa1..e1e8846 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -218,7 +218,7 @@ next8lines .endp ;-------------------------------------------------- .proc SetMainScreen - lda #1 ; White background and border + lda #$b ; Grey background and border sta $d020 sta $d021 @@ -241,7 +241,7 @@ next8lines sta $d900,x sta $da00,x sta $db00,x - lda #$21 + lda #$0f sta $0400,x sta $0500,x sta $0600,x diff --git a/scorch.bin b/scorch.bin index a614b7850a7894b13bd8e44f3a309ad4d6574c1a..e528f21e28947410cbe7de7a89efb048dc96cf9d 100644 GIT binary patch delta 1121 zcmZ`&Z)j6j6z@A-s)O{;?R!+1^EaJa36Dc##*1$Ik z`NUcYMJh>H-NO3G+6c4nlQP>D0U=wbfTV4MfEn9Wm{8f*c1f~~Yt;SOb63!y#)e8B zN+58}tQmNtUPqOghXLC}vrCQ&5&X>oAaKsrZxVQX;~jvMLiT$c0^ag?1$^uIKme-p z*QOMD6OYkDn9&%%LksXPA?{ju!iCPXqNA-s;D=S^rg4q;WM`}9Owgl~&ug{|_@O54 z?a^P3pP%o;k@$s$0^EUwJvQHo|N0ku z^o(pkrk(r$eB{sY)J(@?_kFq|pMKi^yzjq4`FKv1ykN!hIYFBRd+N%`Ut7x{t&`%q6V9}5IH@Q&pr0y8L~$e$ zGz-?%R???*g= zXAs|>nPBbSHZ^DMILcqKpFV>V)XO*LFlH!6T1xdA-^+YrJ}%#e4y zCe-A|cHEadQi_LAMkSr~3LMwSV!cP`C~eru*h}w7WOKcP9cj1-z`9t;j@y#JKbk6q zW@g#Bnvbp#=dNY}Z|s^9RDbj7HAU*i>5?hhh^OUAi?I^%%bRcZK(L$Hb~gaOGPeKK z(H!?-=vl$N8Fm$-TN-<1-!y=sk+tD{E<+o2m1GM;-Y@va1<1Iart?w|Pw5WViOh@P zZ333U>&5X}TE@iPU2btpFr|>+TVID83fX<|fOAUWq6gj`u`f>klYL?GLAE^Ztlqvn Q-T8w*^F;RPp%a__1)B)uPyhe` delta 1083 zcmZ`&Z%k8H6z3gMCzZD76o|InEy!9lKxq+?5@4heyH!@IOU#lbrNl9#lQm-c(DzD> zy9>B%W4j-gOkFgl#J2zuuDJMtX_i>Ugjo|sjmhR%U?aw*M5EuB_Y`r7%aWJ;a(?Ih z&cAnVJPz?VoU^Tfzhz#$;$sQCG4@UFJ32>o@n`U<{J2Sy^xl|e`(oW?;)wBqyafpm zS3Sr9QK;AK$PsR!Ml5#GT#U|N%>ang)_xsg*ZR8vRSIjdn-TWeD-cfFk020-tFlVb zCh4fQlX5Li?`m1}o?lRN|Dnj4Ao(bW10Ho0>AW#flmFnD)7p zoS*5V;l$Wn7HubJkIr<`P=X7)P1r+EO*B08%#?AmD;4C0rt=j|-~Vb>JI{#G*hObp z=TnKTn~}=1p#q`vAR_GD8&49YCG`k-Y{PFXZe*dw3H8i~;GNJOZ= zj)*Pw$o%{2H4^`&ZokC&=05@I6n3K44$;HxN^L1L9AfF(O1P%5VvjTbnv(2KJqj%y zNn(WFA>xGgcrpy4Fai zLKFJba?+)+nPxkbsoc1&9>n|MEpHEJvVsGSU0vk8xK&-N*Ru_${zu-!Tq9k%AB zv;7rciBIe|MBB8hVyAerA|w{5#>fkSEeP|00(_SG)=_*>KegHn+a diff --git a/scorchC64.prg b/scorchC64.prg index d4cd94166ae242b2d3a6dc24aa147cdac72a1bbf..c3fb402ed4574ebcd2ab0cc15da83c8bd59ff006 100644 GIT binary patch delta 22 ecmeC(#?-rwX~We#M()Yi@@yITH;d%|)CK@-%n1kp delta 22 ecmeC(#?-rwX~We#M#jn4@@yFuH;d%|)CK@-zzGll From 0385423fb0dac5bd804ed8d25ab348b175fc0b0c Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 9 May 2023 14:43:18 +0200 Subject: [PATCH 18/65] Wait macro for C64 --- C64/lib/MACRO.ASM | 15 ++++++++++++--- scorchC64.prg | Bin 39693 -> 39711 bytes 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/C64/lib/MACRO.ASM b/C64/lib/MACRO.ASM index 3761e4e..92f8d13 100644 --- a/C64/lib/MACRO.ASM +++ b/C64/lib/MACRO.ASM @@ -278,9 +278,18 @@ upstartEnd tay .endm ;------------------------------------- -.macro wait - nop -.endm + .MACRO WAIT +; WAIT +; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) +?ze LDA $D012 + cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + bcc ?ze + sbc #10 ; last lines correction +?wa cmp $D012 + bcc ?wa +?wf cmp $D012 + bcs ?wf + .ENDM ;------------------------------------- .macro halt ?s jmp ?s diff --git a/scorchC64.prg b/scorchC64.prg index c3fb402ed4574ebcd2ab0cc15da83c8bd59ff006..a06710be9ccfa98cca47c1b8bf9d04d1babccdf0 100644 GIT binary patch delta 5584 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 delta 5661 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 Date: Tue, 9 May 2023 15:25:45 +0200 Subject: [PATCH 19/65] Better C64 wait --- C64/lib/C64_ATARISYS.ASM | 282 +-------------------------------------- scorchC64.asm | 11 +- scorchC64.prg | Bin 39711 -> 39695 bytes 3 files changed, 3 insertions(+), 290 deletions(-) diff --git a/C64/lib/C64_ATARISYS.ASM b/C64/lib/C64_ATARISYS.ASM index 656ae8a..bb343bb 100644 --- a/C64/lib/C64_ATARISYS.ASM +++ b/C64/lib/C64_ATARISYS.ASM @@ -5,251 +5,8 @@ FAKEADDR EQU $0002 - -; -; OPERATING SYSTEM EQUATE FILE -; -; MODULE ORIGIN TABLE -; -; VECTOR TABLE -; -; HANDLER ENTRY POINTS ARE CALL- -; ED OUT IN THE FOLLOWING VECTOR -; TABLE. THESE ARE THE ADDRESSES -; MINUS ONE. -; -; EXAMPLE FOR EDITOR -; -; E400 OPEN -; 2 CLOSE -; 4 GET -; 6 PUT -; 8 STATUS -; A SPECIAL -; C JUMP TO POWER ON INIT -; F NOT USED -; -EDITRV EQU $E400 ;EDITOR -SCRENV EQU $E410 ;TV SCREEN -KEYBDV EQU $E420 ;KEYBOARD -PRINTV EQU $E430 ;PRINTER -CASETV EQU $E440 ;CASSETTE -; -; JUMP VECTOR TABLE -; -; THE FOLLOWING IS A TABLE OF -; JUMP INSTRUCTIONS TO VARIOUS -; ENTRY POINTS IN THE OPERATING -; SYSTEM -; -DISKIV EQU $E450 ;DISK INITIALIZATION -DSKINV EQU $E453 ;DISK INTERFACE -CIOV EQU $E456 ;CENTRAL I/O ROUTINE -SIOV EQU $E459 ;SERIAL I/O ROUTINE -SETVBV EQU $E45C ;SET SYSTEM TIMERS -SYSVBV EQU $E45F ;VBLANK CALCULATIONS -XITVBV EQU $E462 ;EXIT VBLANK -SIOINV EQU $E465 ;SIO INITIALIZATION -SENDEV EQU $E468 ;SEND ENABLE ROUTINE -INTINV EQU $E46B ;INTRPT HANDLER INIT -CIOINV EQU $E46E ;CIO INITIALIZATION -BLKBDV EQU $E471 ;BLACKBOARD MODE -WARMSV EQU $E474 ;WARM START VECTOR -COLDSV EQU $E477 ;COLD START VECTOR -RBLOKV EQU $E47A ;CASSETTE READ BLOCK -CSOPIV EQU $E47D ;CASSETTE INPUT OPEN -; -; VECTORS ADDED FOR 800XL -; -PUPDIV EQU $E480 ;POWER UP DISPLAY -SLFTSV EQU $E483 ;SELF TEST PROGRAM -PHENTV EQU $E486 ;UPLOADED HANDLER ENTER -PHULNV EQU $E489 ;UPLOADED HANDLER UNLINK -PHINIV EQU $E48C ;UPLOADED HANDLER INIT -; -; OPERATING SYSTEM EQUATES -; -; COMMAND CODES FOR IOCBS -; -OPEN EQU $03 ;OPEN FOR I/O -GETREC EQU $05 ;GET RECORD (TEXT) -GETCHR EQU $07 ;GET CHARACTER(S) -PUTREC EQU $09 ;PUT RECORD (TEXT) -PUTCHR EQU $0B ;PUT CHARACTER(S) -CLOSE EQU $0C ;CLOSE DEVICE -STATIS EQU $0D ;STATUS REQUEST -SPECIL EQU $0E ;SPECIAL ENTRY COMMAND -; -; SPECIAL ENTRY COMMANDS -; -DRAWLN EQU $11 ;DRAW LINE -FILLIN EQU $12 ;FILL -RENAME EQU $20 ;RENAME DISK FILE -DELETE EQU $21 ;DELETE DISK FILE -FORMAT EQU $22 ;FORMAT DISK -LOCKFL EQU $23 ;LOCK FILE -UNLOCK EQU $24 ;UNLOCK FILE -POINT EQU $25 ;POINT SECTOR -NOTE EQU $26 ;NOTE SECTOR -IOCFRE EQU $FF ;IOCB "FREE" -; -; AUX1 EQUATES -; () INDICATES WHICH DEVICES -; -APPEND EQU $01 ;WR APPEND(D)-SCN RD(E) -DIRECT EQU $02 ;OPEN DIRECTORY(D) -OPNIN EQU $04 ;OPEN FOR INPUT(ALL) -OPNOT EQU $08 ;OPEN FOR OUTPUT(ALL) -OPNINO EQU $0C ;OPEN INPUT&OUTPUT(ALL) -MXDMOD EQU $10 ;OPEN MIXED MODE(E,S) -INSCLR EQU $20 ;OPEN W/O CLEAR(E,S) -; -; DEVICE NAMES -; -SCREDT EQU 'E' ;SCREEN EDITOR (R/W) -KBD EQU 'K' ;KEYBOARD (R ONLY) -DISPLY EQU 'S' ;SCREEN DISPLAY (R/W) -PRINTR EQU 'P' ;PRINTER (W ONLY) -CASSET EQU 'C' ;CASSETTE (R/W) -RS232 EQU 'R' ;MODEM (R/W) -DISK EQU 'D' ;DISK (R/W) -; -; -; -; OPERATING SYSTEM STATUS CODES -; -SUCCES EQU $01 ;SUCCESSFUL OPERATION -BRKABT EQU $80 ;BREAK KEY ABORT -PRVOPN EQU $81 ;IOCB ALREADY OPEN -NONDEV EQU $82 ;NON-EXISTANT DEVICE -WRONLY EQU $83 ;IOCB OPEN FOR W ONLY -NVALID EQU $84 ;INVALID COMMAND -NOTOPN EQU $85 ;DEVICE/FILE NOT OPEN -BADIOC EQU $86 ;INVALID IOCB # -RDONLY EQU $87 ;IOCB OPEN FOR R ONLY -EOFERR EQU $88 ;END OF FILE -TRNRCD EQU $89 ;TRUNCATED RECORD -TIMOUT EQU $8A ;PERIPHERAL TIMEOUT -DNACK EQU $8B ;DEVICE NO ACKNOWLEDGE -FRMERR EQU $8C ;SERIAL BUS FRAME ERR -CRSROR EQU $8D ;CURSOR OVERRANGE -OVRRUN EQU $8E ;SERIAL DATA OVERRUN -CHKERR EQU $8F ;SERIAL CHECKSUM ERR -DERRER EQU $90 ;PERIPHRAL DEVICE ERR -BADMOD EQU $91 ;BAD SCREEN MODE # -FNCNOT EQU $92 ;NONEXISTANT FUNCTION -SCRMEM EQU $93 ;SCREEN MEM TOO SMALL -; -; PAGE ZERO RAM ASSIGNMENTS -; -LNFLG EQU $00 ;LINBUG RAM -NGFLAG EQU $01 ;POWER-UP SELF-TEST FLAG -; -; THESE LOCATIONS NOT CLEARED -; -CASINI EQU $02 ;CASSETTE INIT LOC -RAMLO EQU $04 ;RAM POINTER MEM TST -TRAMSZ EQU $06 ;TEMP REG RAM SIZE -TSTDAT EQU $07 ;RAM TEST DATA REG -; -;CLEARED ON COLDSTART ONLY -; -WARMST EQU $08 ;WARM START FLAG -BOOTQ EQU $09 ;SUCCESSFUL BOOT FLG -DOSVEC EQU $0A ;DOS START VECTOR -DOSINI EQU $0C ;DOS INIT ADDRESS -APPMHI EQU $0E ;APPL MEM HI LIMIT -; -;CLEARED ON COLD OR WARM START -; -POKMSK EQU $10 ;MASK POKEY IRQ -BRKKEY EQU $11 ;BREAK KEY FLAG +ATRACT EQU FAKEADDR RTCLOK EQU $12 ;REAL TIME CLOCK -BUFADR EQU $15 ;INDIRECT BUFF ADDR -ICCOMT EQU $17 ;COMMAND FOR VECTOR -DSKFMS EQU $18 ;FMS POINTER -DSKUTL EQU $1A ;DISK UTILITIES PTR -ABUFPT EQU $1C ;RESERVED -ICHIDZ EQU $20 ;HANDLER INDEX # -ICDNOZ EQU $21 ;DEVICE NUMBER -ICCOMZ EQU $22 ;COMMAND CODE -ICSTAZ EQU $23 ;STATUS RETURN -ICBALZ EQU $24 ;BUFFER ADDRESS -ICBAHZ EQU $25 -ICPTLZ EQU $26 ;PUT BYTE ROUTINE-1 -ICPTHZ EQU $27 -ICBLLZ EQU $28 ;BUFFER LENGTH -ICBLHZ EQU $29 -ICAX1Z EQU $2A ;AUXILIARY BYTES -ICAX2Z EQU $2B -ICSPRZ EQU $2C ;SPARE BYTES -ICIDNO EQU $2E ;IOCB # X 16 -CIOCHR EQU $2F ;CIO CHARACTER BYTE -STATUS EQU $30 ;INTERNAL STATUS -CHKSUM EQU $31 ;CHECKSUM -BUFRLO EQU $32 ;DATA BUFFER LO BYTE -BUFRHI EQU $33 ;DATA BUFFER HI BYTE -BFENLO EQU $34 ;NEXT BYTE PAST DATA -BFENHI EQU $35 ;BUFFER (HI & LO) -LTEMP EQU $36 ;LOADER TEMP -BUFRFL EQU $38 ;DATA BUFFR FULL FLG -RECVDN EQU $39 ;RECIEVE DONE FLAG -XMTDON EQU $3A ;XMIT DONE FLAG -CHKSNT EQU $3B ;CHECKSUM SENT FLAG -NOCKSM EQU $3C ;NO CHKSUM SENT FLAG -;BPTR EQU $3D ;CASSETTE DATA INDEX -FTYPE EQU $3E ;INTERRECORD GAP TYPE -FEOF EQU $3F ;END OF FILE FLAG -FREQ EQU $40 ;BEEP COUNT -SOUNDR EQU $41 ;NOISY I/O FLAG -CRITIC EQU $42 ;CRITICAL MODE -FMSZPG EQU $43 ;FMS ZERO PAGE -ZCHAIN EQU $4A ;HANDLER LOADER TEMP -DSTAT EQU $4C ;DISPLAY STATUS -ATRACT EQU $4D ;ATTRACT FLAG -DRKMSK EQU $4E ;DARK ATTRACT MASK -COLRSH EQU $4F ;COLOR SHIFTER -TMPCHR EQU $50 ;TEMP STORAGE -HOLD1 EQU $51 ;TEMP STORAGE -LMARGN EQU $52 ;LEFT MARGIN (1) -RMARGN EQU $53 ;RIGHT MARGIN (38) -ROWCRS EQU $54 ;CURSOR COUNTERS -COLCRS EQU $55 -DINDEX EQU $57 ;DISPLAY MODE # -SAVMSC EQU $58 ;SCREEN MEM ADDR -OLDROW EQU $5A ;DRAW START POSIT -OLDCOL EQU $5B -OLDCHR EQU $5D ;DATA UNDER CURSOR -OLDADR EQU $5E ;CURSOR MEM ADDR -FKDEF EQU $60 ;FUNC KEY DEFEAT POINTER -PALNTS EQU $62 ;PAL/NTSC FLAG -LOGCOL EQU $63 ;COL IN LOGICAL LINE -ADRESS EQU $64 ;TEMP STORAGE -MLTEMP EQU $66 ;TEMP STORAGE -SAVADR EQU $68 ;TEMP STORAGE -RAMTOP EQU $6A ;AVAILABLE RAM PAGES -BUFCNT EQU $6B ;BUFFER COUNT -BUFSTR EQU $6C ;EDITOR GETCH POINTR -BITMSK EQU $6E ;BIT MASK -SHFAMT EQU $6F ;PIXEL JUSTIFICATION -ROWAC EQU $70 ;ROW ACCUMULATOR -COLAC EQU $72 ;COLUMN ACCUMULATOR -ENDPT EQU $74 ;LINE LENGTH -DELTAR EQU $76 ;DELTA ROW -DELTAC EQU $77 ;DELTA COLUMN -KEYDEF EQU $79 ;KEY DEFEAT POINTER -SWPFLG EQU $7B ;SPLIT SCN CURS CNTL -HOLDCH EQU $7C ;KB CHAR TEMP HOLD -INSDAT EQU $7D ;TEMP STORAGE -COUNTR EQU $7E ;DRAW ITERATION CNT -; -; 80-FF ARE RESERVED FOR USER -; -; NOTE: SEE FLOATING POINT -; SUBROUTINE AREA FOR ZERO -; PAGE CELLS -; -; PAGE 1 - HARDWARE STACK ; ; PAGE TWO RAM ASSIGNMENTS ; @@ -524,44 +281,7 @@ MODE4 EQU $04 ; display list mode 4 MODE8 EQU $08 ; display list mode 8 MODEE EQU $0E ; display list mode E MODEF EQU $0F ; display list mode F -; --------------------------------------------------------------------------- -; ENUMS -; --------------------------------------------------------------------------- -.enum @dmactl - blank = %00 - narrow = %01 - standard= %10 - wide = %11 - missiles= %100 - players = %1000 - lineX1 = %10000 - lineX2 = %00000 - dma = %100000 -.ende - -scr48 = @dmactl(wide|dma|players|missiles|lineX1) -scr40 = @dmactl(standard|dma|players|missiles|lineX1) -scr32 = @dmactl(narrow|dma|players|missiles|lineX1) - -.enum @pmcntl - missiles= %1 - players = %10 - trigs = %100 -.ende - -.enum @gtictl - prior0 = %0 - prior1 = %1 - prior2 = %10 - prior4 = %100 - prior8 = %1000 - ply5 = %10000 ; Fifth Player Enable - mlc = %100000 ; Multiple Color Player Enable - mode9 = %01000000 - mode10 = %10000000 - mode11 = %11000000 -.ende ; --------------------------------------------------------------------------- ; KBCODEs ; --------------------------------------------------------------------------- diff --git a/scorchC64.asm b/scorchC64.asm index 12f0d09..9eed48d 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -181,7 +181,7 @@ FirstSTART DisplayCopyPurchaseStart = 0 displayC64 = $2000 ; graphics screen memory start -; SEI ; disable IRQ + SEI ; disable IRQ LDA #$36 STA $0001 ; Turn Off BASIC ROM LDA #0 - no ;-------------------------------------------------- - lda SKSTAT - and #%00000100 - beq @+ lda #1 -@ and STRIG0 rts .endp ;-------------------------------------------------- @@ -308,7 +301,7 @@ MakeDarkScreen ;-------------------------------------------------- .proc WaitOneFrame ;-------------------------------------------------- - seq:wait ; or waitRTC ? + wait ; or waitRTC ? rts .endp diff --git a/scorchC64.prg b/scorchC64.prg index a06710be9ccfa98cca47c1b8bf9d04d1babccdf0..ae26d50655259b73b0b5b8de3a16270621bfd630 100644 GIT binary patch delta 6095 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 Date: Tue, 9 May 2023 15:50:19 +0200 Subject: [PATCH 20/65] ShellDealay i proper file :) --- scorch.asm | 19 + scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56609 -> 56609 bytes scorchC64.asm | 12 + scorchC64.lst | 11712 ++++++++++++++++++++++++++++++++++++++++++++++++ scorchC64.prg | Bin 39695 -> 39683 bytes weapons.asm | 18 - 7 files changed, 11743 insertions(+), 18 deletions(-) create mode 100644 scorchC64.lst diff --git a/scorch.asm b/scorch.asm index 9db07ab..84c2c09 100644 --- a/scorch.asm +++ b/scorch.asm @@ -556,6 +556,25 @@ MakeDarkScreen rts .endp +;-------------------------------------------------- +.proc ShellDelay + lda CONSOL + and #%00000101 ; Start + Option + bne @+ + mva #$40 escFlag +@ and #%00000001 + beq noShellDelay + ldx flyDelay +DelayLoop + lda VCOUNT +@ cmp VCOUNT + beq @- + dex + bne DelayLoop +noShellDelay + rts +.endp + ;-------------------------------------------------- .proc RmtSongSelect ; starting song line 0-255 to A reg diff --git a/scorch.bin b/scorch.bin index e528f21e28947410cbe7de7a89efb048dc96cf9d..32b25cb7dc165f8cbd31248cc6c18793c797017d 100644 GIT binary patch delta 6275 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 delta 6380 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≶25SA;t7+xM#V^lmBzT9Fqm=!Yk{ zVr~RNBWRH;f?N>NYzdEEk>@WY0z45SD@jO_RFF>-rT#XL5i0s_*9&_5l8}I3780TC zB|%XcDj?oRLZJjbbR>^yA}3&7OD-PSH0}%rf>!yaVukM%E5ujxcCz$nO2GSjsR&w^ z2=;RjRcf6M^oS>Cj|M_{xN&q2Q$dh**68>5rZx?5SI(Vd0S#(t7)iFG$flRTeyy@j zydVB+#fg-(TGW9x7~BN@|5f@(X80y|5~d~H$6^A`WD6%~`N0XoNm`b0lHx+} z+o1XmQ0$}nBvaQ``r_Xo8(Ph2P)cco0g6Fmgqw4EZG_hOcx{9l64hrVcJ{n<2UZou z(oN+9Q<8{o$y4@*ISDlG{qPRBpoh7Mr)&SVURoe~q2>&kHA zfl&(#ayl|hp&OQIP2df>FO}v)9)5BI zFyO5rMfR7~5iC4VM>WE|OFK`l;TIIsUR}e_D+PfM^H#FDVM=g%kt2__>|`B#SW7y~ z!!{lKQwQscf85^5@@L4gh6q!75iqet!`ZNMqyfasJK3nq@D&cjTLK;eQa~GmpNu-C z2m=?Iw-WfljE3?%*`^??{)!(o@|0iO z?@`8K3$%gKM0mcbVASN)+%98X%_6CLBWUR_)y}K3zj$Y9xVJeRhA%KJ01LuC!rL6- z4GlLH8!U(qqXn_bJ4eI+Ttw#=)pp%^>5;Zu=6FAtU(q4lMKY=}ktVI}joW<}?FXFe z(c)THR{y#&l?fzYHwKanaTU`|`o&dV9owcNE=q%@knpBRwRa7PZ;E1OlES8G-eb+e z6rv3&CoJ>6qilp_{sxt?G@_w{Okh|H1tE) zB=UHe=iCF*WGCIMJwBW9CFRFw_>P1nJZ5QRlC#GHC%soK`nY~aXx?b+=89a3at045 zXkN`z)jyV!Ij+y<=6vQn`J#EAmv@aL0Ge0+0-0*hVY*0@eR7bL%|Bc2P;tZz>LOC>EG@1=>Z-Qz2wbJVH+t2JQ=t?+ z0;AW^4N*E2b{M@015>9bx^W1-NtU-wWcCtc+q9Tddm8ApbQd&Qy>%6{MuZb~Np2N% z@YIN=C>`157ItVC{0Pc{4xBE6Ha$~z@G9cMB16FPJ>uRzNeh+pJek@)#YB0d${k9A zbB0Mbogp-}E%-H+UC~SK&P2(>Ia$dm1qb<)oh_09QML* zYzRH4#K>;Ye@e64M%}hS#=70e@-q*L<2B$wV;~ykd6e>*-%yhOX%7y_I0!A0MYI71 z&C`%JVJds_RlbBooS?caJ`u=NlFcU;F@vP(M5Nzf2H$gVfP+>Bng&;j86?9e=Dq;L zuDt zJIO153uktA*#7pFnkIwt&gqf60 - each turn) + 43 080E .zpvar JoystickNumber .byte + 44 080E .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing + 45 080E .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory + 46 080E .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) + 47 080E .zpvar xdraw .word ;= $64 ;variable X for plot + 48 080E .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + 49 080E .zpvar xbyte .word + 50 080E .zpvar ybyte .word + 51 080E .zpvar CharCode .byte + 52 080E .zpvar fontind .word + 53 080E .zpvar tanknr .byte + 54 080E .zpvar TankSequencePointer .byte + 55 080E .zpvar oldplot .word + 56 080E .zpvar xc .word + 57 080E .zpvar temp .word ;temporary word for the most embeded loops only + 58 080E .zpvar temp2 .word ;same as above + 59 080E .zpvar modify .word ;origially used to replace self-modyfying code + 60 080E .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) + 61 080E .zpvar xtempDRAW .word ;same as above for XDRAW routine + 62 080E .zpvar ytempDRAW .word ;same as above for XDRAW routine + 63 080E .zpvar tempor2 .word + 64 080E .zpvar CreditsVScrol .byte + 65 ;--------------temps used in circle routine + 66 080E .zpvar xi .word ;X (word) in draw routine + 67 080E .zpvar fx .byte + 68 080E .zpvar yi .word ;Y (word) in draw routine + 69 080E .zpvar fy .byte + 70 080E .zpvar xk .word + 71 080E .zpvar fs .byte + 72 080E .zpvar yc .byte ;ycircle - temporary for circle + 73 080E .zpvar dx .word + 74 080E .zpvar dy .word + 75 080E .zpvar dd .word + 76 080E .zpvar di .word + 77 080E .zpvar dp .word + 78 ;---------------------------- + 79 080E .zpvar UnderTank1 .byte + 80 080E .zpvar UnderTank2 .byte + 81 ;---------------------------- + 82 080E .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) + 83 080E .zpvar weaponPointer .word + 84 080E .zpvar dliCounter .byte + 85 080E .zpvar pressTimer .byte + 86 080E .zpvar NTSCcounter .byte + 87 080E .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling + 88 080E .zpvar sfx_effect .byte + 89 080E .zpvar RMT_blocked .byte + 90 080E .zpvar ScrollFlag .byte + 91 080E .zpvar SkStatSimulator .byte + 92 080E .zpvar FloatingAlt .byte ; floating tank altitude + 93 080E .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen + 94 + 95 ; --------------OPTIMIZATION VARIABLES-------------- + 96 080E .zpvar Force .word + 97 080E .zpvar Force_ .byte ; Force is 3 bytes long + 98 080E .zpvar Angle .byte + 99 080E .zpvar Parachute .byte ; are you insured with parachute? + 100 080E .zpvar color .byte + 101 080E .zpvar Erase .byte ; if 1 only mask of the character is printed + 102 ; on the graphics screen. if 0 character is printed normally + 103 080E .zpvar radius .byte + 104 080E .zpvar decimal .word + 105 080E .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) + 106 080E .zpvar Counter .byte ;temporary Counter for outside loops + 107 080E .zpvar ExplosionRadius .byte + 108 080E .zpvar FunkyBombCounter .byte + 109 080E .zpvar ResultY .byte + 110 080E .zpvar xcircle .word + 111 080E .zpvar ycircle .word + 112 080E .zpvar vy .word + 113 080E .zpvar vy_ .word ; 4 bytes + 114 080E .zpvar vx .word + 115 080E .zpvar vx_ .word ; 4 bytes + 116 080E .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank + 117 080E .zpvar PositionOnTheList .byte ; pointer position on the list being displayed + 118 080E .zpvar XHit .word + 119 080E .zpvar delta .word + 120 080E .zpvar HowMuchToFall .byte + 121 080E .zpvar magic .word + 122 080E .zpvar xtraj .word + 123 080E .zpvar xtraj_ .byte ; 3 bytes + 124 080E .zpvar ytraj .word + 125 080E .zpvar ytraj_ .byte ; 3 bytes + 126 080E .zpvar Wind .word + 127 080E .zpvar Wind_ .word ; 4 bytes + 128 080E .zpvar RangeLeft .word + 129 080E .zpvar RangeRight .word + 130 080E .zpvar NewAngle .byte + 131 080E .zpvar escFlag .byte + 132 080E .zpvar LineYdraw .byte + 133 080E .zpvar LineXdraw .word + 134 080E .zpvar plot4x4color .byte ; $00 / $ff + 135 080E .zpvar Multiplier .word + 136 080E .zpvar Multiplier_ .byte ; 3 bytes + 137 080E .zpvar HowToDraw .byte + 138 080E .zpvar gravity .byte + 139 080E .zpvar LineLength .word + 140 080E .zpvar tracerflag .byte + 141 080E .zpvar isInventory .byte + 142 080E .zpvar DifficultyLevel .byte + 143 080E .zpvar goleft .byte + 144 080E .zpvar OffsetDL1 .byte + 145 080E .zpvar L1 .byte + 146 = 00B1 HotNapalmFlag = FunkyBombCounter ; reuse variable! + 147 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 + 148 + 149 = 0076 displayposition = modify + 150 = 00B3 LineAddress4x4 = xcircle + 151 + 152 ;----------------------------------------------- + 153 ; libraries + 154 ;----------------------------------------------- + 155 080E icl 'C64/lib/C64_ATARISYS.ASM' +Source: C64_ATARISYS.ASM + 1 ;**************************************************************************** + 2 ;* ATARI PERSONAL COMPUTER * + 3 ;* SYSTEM EQUATES * + 4 ;**************************************************************************** + 5 + 6 = 0002 FAKEADDR EQU $0002 + 7 + 8 = 0002 ATRACT EQU FAKEADDR + 9 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK + 10 ; + 11 ; PAGE TWO RAM ASSIGNMENTS + 12 ; + 13 = 0002 VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR + 14 = 0002 VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR + 15 = 0002 VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR + 16 = 0002 VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR + 17 = 0002 VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR + 18 = 0002 VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ + 19 = 0002 VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY + 20 = 0002 VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE + 21 = 0002 VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ + 22 = 0002 VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ + 23 = 0002 VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ + 24 = 0002 VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR + 25 = 0002 CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1 + 26 = 0002 CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2 + 27 = 0002 CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3 + 28 = 0002 CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4 + 29 = 0002 CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5 + 30 = 0002 VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR + 31 = 0002 VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR + 32 = 0002 CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS + 33 = 0002 CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS + 34 = 0002 CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG + 35 = 0002 SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR + 36 = 0002 CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG + 37 = 0002 INTEMP EQU FAKEADDR ;IAN'S TEMP + 38 = 0002 CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG + 39 = 0002 DMACTLS EQU FAKEADDR ;SAVE DMACTL REG + 40 = 0002 DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO + 41 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI + 42 = 0002 SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM + 43 = 0002 LCOUNT EQU FAKEADDR ;LOADER TEMP + 44 = 0002 LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL + 45 = 0002 LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL + 46 = 0002 BRKKY EQU FAKEADDR ;BREAK KEY VECTOR + 47 = 0002 RELADR EQU FAKEADDR ;LOADER REL ADDR + 48 = 0002 CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV + 49 = 0002 CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND + 50 = 0002 CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1 + 51 = 0002 CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2 + 52 ;TEMP EQU $023E ;TEMPORARY RAM CELL + 53 = 0002 ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG + 54 = 0002 DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1) + 55 = 0002 DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS + 56 = 0002 BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS + 57 = 0002 COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS + 58 = 0002 RECLEN EQU FAKEADDR ;LOADER LENGTH + 59 = 0002 DSKTIM EQU FAKEADDR ;DISK TIME OUT REG + 60 = 0002 VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP + 61 = 0002 KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG + 62 = 0002 FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200) + 63 = 0002 GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY + 64 = 0002 PADDL0 EQU FAKEADDR ;POT 0 RAM CELL + 65 = 0002 PADDL1 EQU FAKEADDR + 66 = 0002 PADDL2 EQU FAKEADDR + 67 = 0002 PADDL3 EQU FAKEADDR + 68 = 0002 STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL + 69 = 0002 STICK1 EQU FAKEADDR + 70 = 0002 PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0 + 71 = 0002 PTRIG1 EQU FAKEADDR + 72 = 0002 PTRIG2 EQU FAKEADDR + 73 = 0002 PTRIG3 EQU FAKEADDR + 74 = 0002 STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0 + 75 = 0002 STRIG1 EQU FAKEADDR + 76 = 0002 HIBYTE EQU FAKEADDR ;LOADER + 77 = 0002 WMODE EQU FAKEADDR ;CASSETTE R/W MODE + 78 = 0002 BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE + 79 = 0002 IMASK EQU FAKEADDR + 80 = 0002 JVECK EQU FAKEADDR ;JUMP VECTOR + 81 = 0002 NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS + 82 = 0002 TXTROW EQU FAKEADDR ;TEXT ROWCRS + 83 = 0002 TXTCOL EQU FAKEADDR ;TEXT COLCRS + 84 = 0002 TINDEX EQU FAKEADDR ;TEXT INDEX + 85 = 0002 TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD + 86 = 0002 TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL + 87 = 0002 CRETRY EQU FAKEADDR ;# COMMAND RETRIES + 88 = 0002 HOLD3 EQU FAKEADDR + 89 = 0002 SUBTMP EQU FAKEADDR + 90 = 0002 HOLD2 EQU FAKEADDR + 91 = 0002 DMASK EQU FAKEADDR ;PIXEL LOCATION MASK + 92 = 0002 TMPLBT EQU FAKEADDR + 93 = 0002 ESCFLG EQU FAKEADDR ;ESCAPE FLAG + 94 = 0002 TABMAP EQU FAKEADDR ;TAB STOP MAP + 95 = 0002 LOGMAP EQU FAKEADDR ;LINE START BIT MAP + 96 = 0002 INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG + 97 = 0002 FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW + 98 = 0002 TMPROW EQU FAKEADDR + 99 = 0002 TMPCOL EQU FAKEADDR + 100 = 0002 SCRFLG EQU FAKEADDR ;SET IF SCROLLING + 101 = 0002 HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW + 102 = 0002 DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES + 103 = 0002 SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG + 104 = 0002 BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN + 105 = 0002 PCOLR0 EQU FAKEADDR ;P0 COLOR + 106 = 0002 PCOLR1 EQU FAKEADDR ;P1 COLOR + 107 = 0002 PCOLR2 EQU FAKEADDR ;P2 COLOR + 108 = 0002 PCOLR3 EQU FAKEADDR ;P3 COLOR + 109 = 0002 COLOR0 EQU FAKEADDR ;COLOR 0 + 110 = 0002 COLOR1 EQU FAKEADDR + 111 = 0002 COLOR2 EQU FAKEADDR + 112 = 0002 COLOR3 EQU FAKEADDR + 113 = 0002 COLOR4 EQU FAKEADDR + 114 = 0002 COLBAKS EQU COLOR4 + 115 = 0002 CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM + 116 ; + 117 ; COLLEEN MNEMONICS + 118 ; + 119 ; --------------------------------------------------------------------------- + 120 = 0002 POKEY EQU FAKEADDR + 121 ; --------------------------------------------------------------------------- + 122 ; + 123 ; READ + 124 ; + 125 = 0002 POT0 EQU POKEY+$00 + 126 = 0002 POT1 EQU POKEY+$00 + 127 = 0002 POT2 EQU POKEY+$00 + 128 = 0002 POT3 EQU POKEY+$00 + 129 = 0002 POT4 EQU POKEY+$00 + 130 = 0002 POT5 EQU POKEY+$00 + 131 = 0002 POT6 EQU POKEY+$00 + 132 = 0002 POT7 EQU POKEY+$00 + 133 = 0002 ALLPOT EQU POKEY+$00 + 134 = 0002 KBCODE EQU POKEY+$00 + 135 ; !!!!! + 136 ;RANDOM EQU POKEY+$00 + 137 ; + 138 = 0002 POTGO EQU POKEY+$00 + 139 = 0002 SERIN EQU POKEY+$00 + 140 = 0002 IRQST EQU POKEY+$00 + 141 = 0002 SKSTAT EQU POKEY+$00 + 142 ; + 143 ; WRITE + 144 ; + 145 = 0002 AUDF1 EQU POKEY+$00 + 146 = 0002 AUDC1 EQU POKEY+$00 + 147 = 0002 AUDF2 EQU POKEY+$00 + 148 = 0002 AUDC2 EQU POKEY+$00 + 149 = 0002 AUDF3 EQU POKEY+$00 + 150 = 0002 AUDC3 EQU POKEY+$00 + 151 = 0002 AUDF4 EQU POKEY+$00 + 152 = 0002 AUDC4 EQU POKEY+$00 + 153 = 0002 AUDCTL EQU POKEY+$00 + 154 = 0002 STIMER EQU POKEY+$00 + 155 = 0002 SKRES EQU POKEY+$00 + 156 = 0002 SEROUT EQU POKEY+$00 + 157 = 0002 IRQEN EQU POKEY+$00 + 158 = 0002 SKCTL EQU POKEY+$00 + 159 ; + 160 ; + 161 ; + 162 ; --------------------------------------------------------------------------- + 163 = 0002 GTIA EQU FAKEADDR + 164 ; --------------------------------------------------------------------------- + 165 ; + 166 ; WRITE + 167 ; + 168 = 0002 HPOSP0 EQU GTIA+$00 + 169 = 0002 HPOSP1 EQU GTIA+$00 + 170 = 0002 HPOSP2 EQU GTIA+$00 + 171 = 0002 HPOSP3 EQU GTIA+$00 + 172 = 0002 HPOSM0 EQU GTIA+$00 + 173 = 0002 HPOSM1 EQU GTIA+$00 + 174 = 0002 HPOSM2 EQU GTIA+$00 + 175 = 0002 HPOSM3 EQU GTIA+$00 + 176 = 0002 SIZEP0 EQU GTIA+$00 + 177 = 0002 SIZEP1 EQU GTIA+$00 + 178 = 0002 SIZEP2 EQU GTIA+$00 + 179 = 0002 SIZEP3 EQU GTIA+$00 + 180 = 0002 SIZEM EQU GTIA+$00 + 181 = 0002 GRAFP0 EQU GTIA+$00 + 182 = 0002 GRAFP1 EQU GTIA+$00 + 183 = 0002 GRAFP2 EQU GTIA+$00 + 184 = 0002 GRAFP3 EQU GTIA+$00 + 185 = 0002 GRAFM EQU GTIA+$00 + 186 = 0002 COLPM0 EQU GTIA+$00 + 187 = 0002 COLPM1 EQU GTIA+$00 + 188 = 0002 COLPM2 EQU GTIA+$00 + 189 = 0002 COLPM3 EQU GTIA+$00 + 190 = 0002 COLPF0 EQU GTIA+$00 + 191 = 0002 COLPF1 EQU GTIA+$00 + 192 = 0002 COLPF2 EQU GTIA+$00 + 193 = 0002 COLPF3 EQU GTIA+$00 + 194 = 0002 COLBAK EQU GTIA+$00 + 195 = 0002 PRIOR EQU GTIA+$00 + 196 = 0002 VDELAY EQU GTIA+$00 + 197 = 0002 GRACTL EQU GTIA+$00 + 198 = 0002 HITCLR EQU GTIA+$00 + 199 = 0002 CONSOL EQU GTIA+$00 + 200 ; + 201 ; READ + 202 ; + 203 = 0002 M0PF EQU GTIA+$00 + 204 = 0002 M1PF EQU GTIA+$00 + 205 = 0002 M2PF EQU GTIA+$00 + 206 = 0002 M3PF EQU GTIA+$00 + 207 = 0002 P0PF EQU GTIA+$00 + 208 = 0002 P1PF EQU GTIA+$00 + 209 = 0002 P2PF EQU GTIA+$00 + 210 = 0002 P3PF EQU GTIA+$00 + 211 = 0002 M0PL EQU GTIA+$00 + 212 = 0002 M1PL EQU GTIA+$00 + 213 = 0002 M2PL EQU GTIA+$00 + 214 = 0002 M3PL EQU GTIA+$00 + 215 = 0002 P0PL EQU GTIA+$00 + 216 = 0002 P1PL EQU GTIA+$00 + 217 = 0002 P2PL EQU GTIA+$00 + 218 = 0002 P3PL EQU GTIA+$00 + 219 = 0002 TRIG0 EQU GTIA+$00 + 220 = 0002 TRIG1 EQU GTIA+$00 + 221 = 0002 TRIG2 EQU GTIA+$00 + 222 = 0002 TRIG3 EQU GTIA+$00 + 223 = 0002 PAL EQU GTIA+$00 + 224 ; + 225 ; + 226 ; --------------------------------------------------------------------------- + 227 = 0002 ANTIC EQU FAKEADDR + 228 ; --------------------------------------------------------------------------- + 229 ; + 230 = 0002 DMACTL EQU ANTIC+$00 + 231 = 0002 CHACTL EQU ANTIC+$00 + 232 = 0002 DLPTR EQU ANTIC+$00 + 233 ;DLISTH EQU ANTIC+$00 + 234 = 0002 HSCROL EQU ANTIC+$00 + 235 = 0002 VSCROL EQU ANTIC+$00 + 236 = 0002 PMBASE EQU ANTIC+$00 + 237 = 0002 CHBASE EQU ANTIC+$00 + 238 = 0002 WSYNC EQU ANTIC+$00 + 239 ; !!!! + 240 = 0002 VCOUNT EQU ANTIC+$00 + 241 ; ---- + 242 = 0002 PENH EQU ANTIC+$00 + 243 = 0002 PENV EQU ANTIC+$00 + 244 = 0002 NMIEN EQU ANTIC+$00 + 245 = 0002 NMIRES EQU ANTIC+$00 + 246 = 0002 NMIST EQU ANTIC+$00 + 247 ; + 248 ; + 249 ; --------------------------------------------------------------------------- + 250 = 0002 PIA EQU FAKEADDR + 251 ; --------------------------------------------------------------------------- + 252 ; + 253 = 0002 PORTA EQU PIA+0 + 254 = 0002 PORTB EQU PIA+0 + 255 = 0002 PACTL EQU PIA+0 + 256 = 0002 PBCTL EQU PIA+0 + 257 ; + 258 ; --------------------------------------------------------------------------- + 259 ; Atari ANTIC chip display list equates + 260 ; --------------------------------------------------------------------------- + 261 ; + 262 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte) + 263 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3) + 264 ; + 265 = 0010 SCH EQU $10 ; display list horizontal scrolling + 266 = 0020 SCV EQU $20 ; display list vertical scrolling + 267 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte) + 268 = 0080 DLII EQU $80 ; display list interrupt instruction + 269 ; + 270 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction + 271 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction + 272 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction + 273 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction + 274 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction + 275 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction + 276 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction + 277 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction + 278 ; + 279 = 0002 MODE2 EQU $02 ; display list mode 2 + 280 = 0004 MODE4 EQU $04 ; display list mode 4 + 281 = 0008 MODE8 EQU $08 ; display list mode 8 + 282 = 000E MODEE EQU $0E ; display list mode E + 283 = 000F MODEF EQU $0F ; display list mode F + 284 + 285 ; --------------------------------------------------------------------------- + 286 ; KBCODEs + 287 ; --------------------------------------------------------------------------- + 288 080E .enum @kbcode + 289 = 00FF _none = 255 + 290 = 001C _esc = 28 + 291 = 001F _1 = 31 + 292 = 001E _2 = 30 + 293 = 001A _3 = 26 + 294 = 0018 _4 = 24 + 295 = 001D _5 = 29 + 296 = 001B _6 = 27 + 297 = 0033 _7 = 51 + 298 = 0035 _8 = 53 + 299 = 0030 _9 = 48 + 300 = 0032 _0 = 50 + 301 = 0036 _lt = 54 + 302 = 0037 _gt = 55 + 303 = 0034 _del = 52 + 304 = 002C _tab = 44 + 305 = 002F _Q = 47 + 306 = 002E _W = 46 + 307 = 002A _E = 42 + 308 = 0028 _R = 40 + 309 = 002D _T = 45 + 310 = 002B _Y = 43 + 311 = 000B _U = 11 + 312 = 000D _I = 13 + 313 = 0008 _O = 8 + 314 = 000A _P = 10 + 315 = 000E _min = 14 + 316 = 000E _up = 14 ; cursor function + 317 = 000F _eq = 15 + 318 = 000F _down = 15 ; cursor function + 319 = 000C _ret = 12 + 320 = 003F _A = 63 + 321 = 003E _S = 62 + 322 = 003A _D = 58 + 323 = 0038 _F = 56 + 324 = 003D _G = 61 + 325 = 0039 _H = 57 + 326 = 0001 _J = 1 + 327 = 0005 _K = 5 + 328 = 0000 _L = 0 + 329 = 0002 _semicolon = 2 + 330 = 0006 _plus = 6 + 331 = 0006 _left = 6 ; cursor function + 332 = 0007 _asterisk = 7 + 333 = 0007 _right = 7 ; cursor function + 334 = 003C _caps = 60 + 335 = 0017 _Z = 23 + 336 = 0016 _X = 22 + 337 = 0012 _C = 18 + 338 = 0010 _V = 16 + 339 = 0015 _B = 21 + 340 = 0024 _N = 36 + 341 = 0025 _M = 37 + 342 = 0020 _comma = 32 + 343 = 0022 _dot = 34 + 344 = 0026 _slash = 38 + 345 = 0027 _atari = 39 + 346 = 0011 _help = 17 + 347 = 0003 _F1 = 3 + 348 = 0004 _F2 = 4 + 349 = 0013 _F3 = 19 + 350 = 0014 _F4 = 20 + 351 = 0021 _space = 33 + 352 .ende + 352 = 0058 DLICOLORBACK + 352 = 0059 GRADIENTNR + 352 = 005A GRADIENTCOLORS + 352 = 005C WINDCHANGEINROUND + 352 = 005D JOYSTICKNUMBER + 352 = 005E LAZYFLAG + 352 = 005F SPYHARDFLAG + 352 = 0060 VDEBUG + 352 = 0061 XDRAW + 352 = 0063 YDRAW + 352 = 0065 XBYTE + 352 = 0067 YBYTE + 352 = 0069 CHARCODE + 352 = 006A FONTIND + 352 = 006C TANKNR + 352 = 006D TANKSEQUENCEPOINTER + 352 = 006E OLDPLOT + 352 = 0070 XC + 352 = 0072 TEMP + 352 = 0074 TEMP2 + 352 = 0076 MODIFY + 352 = 0078 TEMPXROLLER + 352 = 007A XTEMPDRAW + 352 = 007C YTEMPDRAW + 352 = 007E TEMPOR2 + 352 = 0080 CREDITSVSCROL + 352 = 0081 XI + 352 = 0083 FX + 352 = 0084 YI + 352 = 0086 FY + 352 = 0087 XK + 352 = 0089 FS + 352 = 008A YC + 352 = 008B DX + 352 = 008D DY + 352 = 008F DD + 352 = 0091 DI + 352 = 0093 DP + 352 = 0095 UNDERTANK1 + 352 = 0096 UNDERTANK2 + 352 = 0097 TESTFLIGHTFLAG + 352 = 0098 WEAPONPOINTER + 352 = 009A DLICOUNTER + 352 = 009B PRESSTIMER + 352 = 009C NTSCCOUNTER + 352 = 009D ISENDOFTHEFALLFLAG + 352 = 009E SFX_EFFECT + 352 = 009F RMT_BLOCKED + 352 = 00A0 SCROLLFLAG + 352 = 00A1 SKSTATSIMULATOR + 352 = 00A2 FLOATINGALT + 352 = 00A3 OVERTANKDIR + 352 = 00A4 FORCE + 352 = 00A6 FORCE_ + 352 = 00A7 ANGLE + 352 = 00A8 PARACHUTE + 352 = 00A9 COLOR + 352 = 00AA ERASE + 352 = 00AB RADIUS + 352 = 00AC DECIMAL + 352 = 00AE NUMBEROFPLAYERS + 352 = 00AF COUNTER + 352 = 00B0 EXPLOSIONRADIUS + 352 = 00B1 FUNKYBOMBCOUNTER + 352 = 00B2 RESULTY + 352 = 00B3 XCIRCLE + 352 = 00B5 YCIRCLE + 352 = 00B7 VY + 352 = 00B9 VY_ + 352 = 00BB VX + 352 = 00BD VX_ + 352 = 00BF HITFLAG + 352 = 00C0 POSITIONONTHELIST + 352 = 00C1 XHIT + 352 = 00C3 DELTA + 352 = 00C5 HOWMUCHTOFALL + 352 = 00C6 MAGIC + 352 = 00C8 XTRAJ + 352 = 00CA XTRAJ_ + 352 = 00CB YTRAJ + 352 = 00CD YTRAJ_ + 352 = 00CE WIND + 352 = 00D0 WIND_ + 352 = 00D2 RANGELEFT + 352 = 00D4 RANGERIGHT + 352 = 00D6 NEWANGLE + 352 = 00D7 ESCFLAG + 352 = 00D8 LINEYDRAW + 352 = 00D9 LINEXDRAW + 352 = 00DB PLOT4X4COLOR + 352 = 00DC MULTIPLIER + 352 = 00DE MULTIPLIER_ + 352 = 00DF HOWTODRAW + 352 = 00E0 GRAVITY + 352 = 00E1 LINELENGTH + 352 = 00E3 TRACERFLAG + 352 = 00E4 ISINVENTORY + 352 = 00E5 DIFFICULTYLEVEL + 352 = 00E6 GOLEFT + 352 = 00E7 OFFSETDL1 + 352 = 00E8 L1 + 156 080E icl 'C64/lib/C64SYS.ASM' +Source: C64SYS.ASM + 1 = D000 vic_spr0_x = $D000 + 2 = D001 vic_spr0_y = $D001 + 3 = D002 vic_spr1_x = $D002 + 4 = D003 vic_spr1_y = $D003 + 5 = D004 vic_spr2_x = $D004 + 6 = D005 vic_spr2_y = $D005 + 7 = D006 vic_spr3_x = $D006 + 8 = D007 vic_spr3_y = $D007 + 9 = D008 vic_spr4_x = $D008 + 10 = D009 vic_spr4_y = $D009 + 11 = D00A vic_spr5_x = $D00A + 12 = D00B vic_spr5_y = $D00B + 13 = D00C vic_spr6_x = $D00C + 14 = D00D vic_spr6_y = $D00D + 15 = D00E vic_spr7_x = $D00E + 16 = D00F vic_spr7_y = $D00F + 17 = D010 vic_spr_hi_x = $D010 + 18 = D011 vic_cr1 = $D011 + 19 = D012 vic_raster = $D012 + 20 = D013 vic_lp_x = $D013 + 21 = D014 vic_lp_y = $D014 + 22 = D015 vic_spr_ena = $D015 + 23 = D016 vic_cr2 = $D016 + 24 = D017 vic_spr_exp_y = $D017 + 25 = D018 vic_mem = $D018 + 26 = D019 vic_irq = $D019 + 27 = D01A vic_irq_ena = $D01A + 28 = D01B vic_spr_dp = $D01B + 29 = D01C vic_spr_mcolor = $D01C + 30 = D01D vic_spr_exp_x = $D01D + 31 = D01E vic_spr_ss_col = $D01E + 32 = D01F vic_spr_sd_col = $D01F + 33 = D020 vic_border = $D020 + 34 = D021 vic_bg_color0 = $D021 + 35 = D022 vic_bg_color1 = $D022 + 36 = D023 vic_bg_color2 = $D023 + 37 = D024 vic_bg_color3 = $D024 + 38 = D025 vic_spr_color1 = $D025 + 39 = D026 vic_spr_color2 = $D026 + 40 = D027 vic_spr0_color = $D027 + 41 = D028 vic_spr1_color = $D028 + 42 = D029 vic_spr2_color = $D029 + 43 = D02A vic_spr3_color = $D02A + 44 = D02B vic_spr4_color = $D02B + 45 = D02C vic_spr5_color = $D02C + 46 = D02D vic_spr6_color = $D02D + 47 = D02E vic_spr7_color = $D02E + 48 + 49 = D41B RANDOM = $D41B + 157 080E icl 'C64/lib/MACRO.ASM' +Source: MACRO.ASM + 1 + 2 + 3 + 4 .macro basic_start(addr) + 5 + 6 .word upstartEnd // link address + 7 .word 10 // line num + 8 .byte $9e // sys + 9 + 10 ?a=0 + 11 ?b=0 + 12 ?c=0 + 13 ?d=0 + 14 ?e=0 + 15 + 16 ?v = %%addr + 17 + 18 ift ?v>=10000 + 19 ?a=?v/10000 + 20 ?v=?v-(?a*10000) + 21 eif + 22 + 23 ift ?v>=1000 + 24 ?b=?v/1000 + 25 ?v=?v-(?b*1000) + 26 eif + 27 + 28 ift ?v>=100 + 29 ?c=?v/100 + 30 ?v=?v-(?c*100) + 31 eif + 32 + 33 ift ?v>=10 + 34 ?d=?v/10 + 35 ?v=?v-(?d*10) + 36 eif + 37 + 38 ?e=?v%10 + 39 + 40 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 + 41 + 42 .byte 0 + 43 upstartEnd + 44 .word 0 // empty link signals the end of the program + 45 + 46 .endm + 47 + 48 + 49 // + 50 // Switch bank in VIC-II + 51 // + 52 // Args: + 53 // bank: bank number to switch to. Valid values: 0-3. + 54 // + 55 .macro SwitchVICBank(bank) + 56 // + 57 // The VIC-II chip can only access 16K bytes at a time. In order to + 58 // have it access all of the 64K available, we have to tell it to look + 59 // at one of four banks. + 60 // + 61 // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2). + 62 // + 63 // +------+-------+----------+-------------------------------------+ + 64 // | BITS | BANK | STARTING | VIC-II CHIP RANGE | + 65 // | | | LOCATION | | + 66 // +------+-------+----------+-------------------------------------+ + 67 // | 00 | 3 | 49152 | ($C000-$FFFF)* | + 68 // | 01 | 2 | 32768 | ($8000-$BFFF) | + 69 // | 10 | 1 | 16384 | ($4000-$7FFF)* | + 70 // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) | + 71 // +------+-------+----------+-------------------------------------+ + 72 ?bits=%11 + 73 + 74 ift (%%bank==0) + 75 ?bits=%11 + 76 eli (%%bank==1) + 77 ?bits=%10 + 78 eli (%%bank==2) + 79 ?bits=%01 + 80 eli (%%bank==3) + 81 ?bits=%00 + 82 eif + 83 + 84 // + 85 // Set Data Direction for CIA #2, Port A to output + 86 // + 87 lda $dd02 + 88 and #%11111100 // Mask the bits were interested in. + 89 ora #$03 // Set bits 0 and 1. + 90 sta $dd02 + 91 + 92 // + 93 // Tell VIC-II to switch to bank + 94 // + 95 lda $dd00 + 96 and #%11111100 + 97 ora #?bits + 98 sta $dd00 + 99 .endm + 100 + 101 + 102 // + 103 // Enter hires bitmap mode (a.k.a. standard bitmap mode) + 104 // + 105 .macro SetHiresBitmapMode + 106 // + 107 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + 108 // + 109 lda $d011 + 110 and #%10111111 + 111 ora #%00100000 + 112 sta $d011 + 113 + 114 // + 115 // Clear multi color mode (bit 4) + 116 // + 117 lda $d016 + 118 and #%11101111 + 119 sta $d016 + 120 .endm + 121 + 122 + 123 // + 124 // Enter hires bitmap mode (a.k.a. standard bitmap mode) + 125 // + 126 .macro SetMulticolorBitmapMode + 127 // + 128 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + 129 // + 130 lda $d011 + 131 and #%10111111 + 132 ora #%00100000 + 133 sta $d011 + 134 + 135 // + 136 // Clear multi color mode (bit 4) + 137 // + 138 lda $d016 + 139 ora #%00010000 + 140 sta $d016 + 141 .endm + 142 + 143 + 144 // + 145 // Switch location of screen memory. + 146 // + 147 // Args: + 148 // address: Address relative to current VIC-II bank base address. + 149 // Valid values: $0000-$3c00. Must be a multiple of $0400. + 150 // + 151 .macro SetScreenMemory(address) + 152 // + 153 // The most significant nibble of $D018 selects where the screen is + 154 // located in the current VIC-II bank. + 155 // + 156 // +------------+-----------------------------+ + 157 // | | LOCATION* | + 158 // | BITS +---------+-------------------+ + 159 // | | DECIMAL | HEX | + 160 // +------------+---------+-------------------+ + 161 // | 0000XXXX | 0 | $0000 | + 162 // | 0001XXXX | 1024 | $0400 (DEFAULT) | + 163 // | 0010XXXX | 2048 | $0800 | + 164 // | 0011XXXX | 3072 | $0C00 | + 165 // | 0100XXXX | 4096 | $1000 | + 166 // | 0101XXXX | 5120 | $1400 | + 167 // | 0110XXXX | 6144 | $1800 | + 168 // | 0111XXXX | 7168 | $1C00 | + 169 // | 1000XXXX | 8192 | $2000 | + 170 // | 1001XXXX | 9216 | $2400 | + 171 // | 1010XXXX | 10240 | $2800 | + 172 // | 1011XXXX | 11264 | $2C00 | + 173 // | 1100XXXX | 12288 | $3000 | + 174 // | 1101XXXX | 13312 | $3400 | + 175 // | 1110XXXX | 14336 | $3800 | + 176 // | 1111XXXX | 15360 | $3C00 | + 177 // +------------+---------+-------------------+ + 178 // + 179 ?bits = (%%address / $0400) << 4 + 180 + 181 lda $d018 + 182 and #%00001111 + 183 ora #?bits + 184 sta $d018 + 185 .endm + 186 + 187 + 188 // + 189 // Set location of bitmap. + 190 // + 191 // Args: + 192 // address: Address relative to VIC-II bank address. + 193 // Valid values: $0000 (bitmap at $0000-$1FFF) + 194 // $2000 (bitmap at $2000-$3FFF) + 195 // + 196 .macro SetBitmapAddress(address) + 197 // + 198 // In standard bitmap mode the location of the bitmap area can + 199 // be set to either BANK address + $0000 or BANK address + $2000 + 200 // + 201 // By setting bit 3, we can configure which of the locations to use. + 202 // + 203 + 204 lda $d018 + 205 + 206 ift %%address == $0000 + 207 and #%11110111 + 208 eli %%address == $2000 + 209 ora #%00001000 + 210 eif + 211 + 212 sta $d018 + 213 .endm + 214 + 215 // + 216 // Once this is done, random values appear in location $D41B (RANDOM) + 217 // + 218 .macro InitializeSIDrnd + 219 LDA #$FF ; maximum frequency value + 220 STA $D40E ; voice 3 frequency low byte + 221 STA $D40F ; voice 3 frequency high byte + 222 LDA #$80 ; noise waveform, gate bit off + 223 STA $D412 ; voice 3 control register + 224 .endm + 225 + 226 ;------------------------------------- + 227 .MACRO rolw + 228 ROL :1 + 229 ROL :1+1 + 230 .ENDM + 231 ;------------------------------------- + 232 .MACRO aslw + 233 ASL :1 + 234 ROL :1+1 + 235 .ENDM + 236 ;------------------------------------- + 237 .MACRO rorw + 238 ROR :1+1 + 239 ROR :1 + 240 .ENDM + 241 ;------------------------------------- + 242 .MACRO lsrw + 243 LSR :1+1 + 244 ROR :1 + 245 .ENDM + 246 ;------------------------------------- + 247 .macro randomize + 248 ;usage: randomize floor ceiling + 249 ;returns (in A) a random .byte between "floor" and "ceiling" + 250 .if :2 < :1 + 251 .error "floor higher than ceiling" + 252 .endif + 253 ?rand + 254 lda random + 255 cmp #:1 ;floor + 256 bcc ?rand + 257 cmp #:2+1 ;ceiling + 258 bcs ?rand + 259 .endm + 260 ;------------------------------------- + 261 .macro phx + 262 txa + 263 pha + 264 .endm + 265 ;------------------------------------- + 266 .macro phy + 267 tya + 268 pha + 269 .endm + 270 ;------------------------------------- + 271 .macro plx + 272 pla + 273 tax + 274 .endm + 275 ;------------------------------------- + 276 .macro ply + 277 pla + 278 tay + 279 .endm + 280 ;------------------------------------- + 281 .MACRO WAIT + 282 ; WAIT + 283 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) + 284 ?ze LDA $D012 + 285 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + 286 bcc ?ze + 287 sbc #10 ; last lines correction + 288 ?wa cmp $D012 + 289 bcc ?wa + 290 ?wf cmp $D012 + 291 bcs ?wf + 292 .ENDM + 293 ;------------------------------------- + 294 .macro halt + 295 ?s jmp ?s + 296 .endm + 158 + 159 ;----------------------------------------------- + 160 ; variable declarations in RAM (no code) + 161 ;----------------------------------------------- + 162 + 163 ; Game loading address + 164 ORG $4100 + 165 4100 icl 'variables.asm' +Source: variables.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 ;===================================================== + 5 ; most important non-zero page variables + 6 ; used by the given subroutines + 7 ; moved to one place for easier + 8 ; compilation to e.g. cartridge + 9 ; zero page variables are declared in program.s65 module + 10 ;===================================================== + 11 4100 OneTimeZeroVariables + 12 = 003F OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! + 13 .if OneTimeZeroVariablesCount > 127 + 14 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount + 15 .endif + 16 + 17 = 4100 noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music + 18 = 4101 noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX + 19 ;---------------------------------------------------- + 20 ; Color table for Game Over Screen (created in a gameover routine) + 21 = 4102 .ds 1 ;.by $00 ; labels line color + 22 = 4103 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 + 23 ;---------------------------------------------------- + 24 4109 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 + 25 ;:6 dta d" " + 26 = 4109 .ds 6*8 + 27 ;---------------------------------------------------- + 28 4139 skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) + 29 = 4139 .DS MaxPlayers + 30 ;---------------------------------------------------- + 31 413F variablesToInitialize + 32 ;Options DO NOT ZERO ON RESTART GAME - ticket #27 + 33 = 413F OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0 + 34 = 4148 RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game + 35 = 4149 seppukuVal .ds 1 ;.by 75 + 36 = 414A mountainDeltaH .ds 1 ;.by 3 + 37 = 414B mountainDeltaL .ds 1 ;.by $ff + 38 ;---------------------------------------------------- + 39 414C LineHeader1 + 40 = 414C .ds 9 ;dta d"# ROUND: " + 41 4155 RoundNrDisplay + 42 = 4155 .ds 5 ;dta d" #", $ff + 43 ; 4x4 text buffer + 44 415A ResultLineBuffer + 45 = 415A .ds 14 ;dta d" ", $ff + 46 4168 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 + 47 = 4168 .ds (screenHeight+1) + 48 4231 linetableH ; = PMGraph + $0300 - (screenHeight+1) + 49 = 4231 .ds (screenHeight+1) + 50 42FA DisplayCopyPurchase + 51 = 42FA .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1) + 52 42FB StatusBufferCopy + 53 = 42FB .ds screenBytes*3 + 54 ;===================================================== + 55 4373 variablesStart ; zeroing starts here + 56 ;===================================================== + 57 ;isInventory .ds 1 ; 0 - purchase, $ff - inventory + 58 ;-------------- + 59 = 4373 drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) + 60 ;-------------- + 61 = 4374 noDeathCounter .ds 1 + 62 ;-------------- + 63 = 4375 OptionsY .ds 1 ;vertical position of cursor on Options screen + 64 = 4376 flyDelay .ds 1 + 65 ;-------------- + 66 ;NumberOfPlayers .DS 1 ;current number of players (counted from 1) + 67 = 4377 TankSequence .DS MaxPlayers ;sequence of shooting during the Round + 68 = 437D GameIsOver .DS 1 ; 1 means it was the last round in the game + 69 ;---------------------------------------------------- + 70 437E moneyH ;we place zero at the end of prices and money + 71 ;and have range from 0 to 99990 (not too much) + 72 ;money players have (maybe one more byte is needed?) + 73 = 437E .DS MaxPlayers + 74 4384 moneyL + 75 = 4384 .DS MaxPlayers + 76 ;---------------------------------------------------- + 77 438A gainH ;how much money player gets after the round + 78 ;it is gathered during the round basing on energy + 79 ;opponents lose after player's shoots + 80 = 438A .DS MaxPlayers + 81 4390 gainL + 82 = 4390 .DS MaxPlayers + 83 ;---------------------------------------------------- + 84 4396 loseH ;how much player looses after the round + 85 ;calculated from REAL energy loss + 86 ;(not only to zero energy) + 87 = 4396 .DS MaxPlayers + 88 439C loseL + 89 = 439C .DS MaxPlayers + 90 ;---------------------------------------------------- + 91 43A2 Energy + 92 = 43A2 .DS MaxPlayers + 93 43A8 ShieldEnergy + 94 = 43A8 .DS MaxPlayers + 95 = 43AE EnergyDecrease .DS 1 + 96 43AF eXistenZ + 97 = 43AF .DS MaxPlayers + 98 43B5 LASTeXistenZ ; eXistenZ before shoot + 99 = 43B5 .DS MaxPlayers + 100 + 101 43BB ResultsTable ;the results in the gameeeeee + 102 = 43BB .DS MaxPlayers + 103 43C1 TempResults + 104 = 43C1 .DS MaxPlayers + 105 ;DirectHitsH ; one byte enough + 106 ; .DS MaxPlayers + 107 43C7 DirectHits + 108 = 43C7 .DS MaxPlayers + 109 43CD EarnedMoneyH + 110 = 43CD .DS MaxPlayers + 111 43D3 EarnedMoneyL + 112 = 43D3 .DS MaxPlayers + 113 ;---------------------------------------------------- + 114 43D9 ForceTableL ;shooting Force of the tank during the round + 115 = 43D9 .DS MaxPlayers + 116 43DF ForceTableH + 117 = 43DF .DS MaxPlayers ;maxplayers=6 + 118 43E5 MaxForceTableL ;Energy of the tank during the round + 119 ;(limes superior force of the Shoot) + 120 = 43E5 .DS MaxPlayers ;1000 is the default + 121 43EB MaxForceTableH + 122 = 43EB .DS MaxPlayers + 123 ;---------------------------------------------------- + 124 43F1 BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! + 125 = 43F1 .DS MaxPlayers + 126 43F7 ActiveWeapon ;number of the selected weapon + 127 = 43F7 .DS MaxPlayers + 128 43FD ActiveDefenceWeapon ;number of the activated defence weapon - 0 + 129 = 43FD .DS MaxPlayers + 130 4403 AutoDefenseFlag ; 0 - not activated, >$7f - activated + 131 = 4403 .DS MaxPlayers + 132 = 4409 WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile + 133 ;---------------------------------------------------- + 134 + 135 ;format of the 3-byte static point number used in the game + 136 ; 20203.5 => 128 : <20203 : >20203 + 137 ;---------------------------------------------------- + 138 + 139 ;L1 .DS 1 ; variable used in multiplications (by 10:) + 140 ;gravity .DS 1 ;only the decimal part (1/10 = 25) + 141 ;---------------------------------------------------- + 142 + 143 ;Wind .ds 4 ;format: 0000.hhll + 144 ;walue displayed on the screen is + 145 ;decimal portion divided by 16 (>>4) + 146 ;---------------------------------------------------- + 147 = 440A MaxWind .ds 1 ; + 148 = 440B WindOrientation .DS 1 ;(0-right,1-left) + 149 ;---------------------------------------------------- + 150 ;Counter .DS 1 ;temporary Counter for outside loops + 151 ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank + 152 = 440C WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + 153 ;---------------------------------------------------- + 154 440D xtankstableL ;X positions of tanks (lower left point) + 155 = 440D .DS MaxPlayers + 156 4413 xtankstableH + 157 = 4413 .DS MaxPlayers + 158 4419 ytankstable ;Y positions of tanks (lower left point) + 159 = 4419 .DS MaxPlayers + 160 441F LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) + 161 = 441F .DS MaxPlayers + 162 4425 JoyNumber ; Joystick port number (from 0 to 3) + 163 = 4425 .DS MaxPlayers + 164 442B TankShape ; Tank shape number (from 0 to 2) + 165 = 442B .DS MaxPlayers + 166 ;---------------------------------------------------- + 167 4431 TargetTankNr ; Target tank index (for AI routines) + 168 = 4431 .DS 1 + 169 4432 SecondTryFlag ; For precise AI aiming + 170 = 4432 .DS 1 + 171 ;---------------------------------------------------- + 172 ;Erase .DS 1 ; if 1 only mask of the character is printed + 173 ; on the graphics screen. if 0 character is printed normally + 174 + 175 ;---------------------------------------------------- + 176 ;RangeLeft .DS 2 ;range of the soil to be fallen down + 177 ;RangeRight .DS 2 ;it is being set by all Explosions + 178 ;---------------------------------------------------- + 179 = 4433 WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon + 180 = 4435 WeaponRangeRight .DS 2 + 181 ;---------------------------------------------------- + 182 ;xroller + 183 ;HowMuchToFall .ds 1 + 184 = 4437 HeightRol .DS 1 + 185 ;digger + 186 ;digstartx .DS 2 + 187 ;digstarty .DS 2 + 188 = 4438 diggery .DS 1 + 189 = 4439 DigLong .DS 1 + 190 = 443A digtabxL .DS [8] + 191 = 4442 digtabxH .DS [8] + 192 = 444A digtabyL .DS [8] + 193 = 4452 digtabyH .DS [8] + 194 ; liquiddirt + 195 = 445A TempXfill .ds 2 + 196 = 445C FillCounter .ds 2 + 197 ;sandhog + 198 = 445E sandhogflag .DS 1 ; (0 digger, 8 sandhog) + 199 ;ofdirt + 200 ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65) + 201 ;draw + 202 ;HowToDraw .DS 1 + 203 ; bits here mean + 204 ; 0 - negative X (go up) + 205 ; 1 - negative Y (left) + 206 ; 2 - directional value > 1 (more than 45 degrees) + 207 ; if all 0 then standart routine + 208 ;XHit .DS 2 + 209 = 445F YHit .DS 2 + 210 ;LineLength .DS 2 + 211 ;circle + 212 ;radius .DS 1 + 213 ;xcircle .DS 2 + 214 ;ycircle .DS 2 + 215 = 4461 tempcir .DS 2 + 216 ;TankFalls + 217 = 4463 FallingSoundBit .DS 1 + 218 = 4464 PreviousFall .DS 1 + 219 = 4465 EndOfTheFallFlag .DS 1 ; in case of the infinite fall + 220 ;Parachute .DS 1 ; are you insured with parachute? + 221 ;FloatingAlt .DS 1 ; floating tank altitude + 222 = 00A2 FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! + 223 = 00A2 PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc + 224 ;---------------------------------------------------- + 225 ;Flight + 226 ;variables for 5 missiles (used for mirv) + 227 = 4466 xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte + 228 = 446B xtraj01 .DS [5] ; middle byte + 229 = 4470 xtraj02 .DS [5] ; high byte + 230 ;vx00 .DS [5] ; looks like it is not really used anywhere + 231 = 4475 vx01 .DS [5] + 232 = 447A vx02 .DS [5] + 233 = 447F vx03 .DS [5] + 234 = 4484 MirvDown .DS [5] ; is given missile down? + 235 = 4489 MirvMissileCounter .DS 1 ; missile Counter (mainly for X) + 236 = 448A SmokeTracerFlag .DS 1 ; if Smoketracer + 237 = 448B LaserFlag .DS 1 ; $ff if Laser + 238 = 448C XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) + 239 = 448D YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) + 240 ;---------------------------------------------------- + 241 ;CheckCollisionWithTank + 242 ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) + 243 ;vy .ds 4 ;0,0,0,0 + 244 ;xtraj .ds 3 ; 0,0,0 + 245 ;ytraj .ds 3 ; 0,0,0 + 246 = 448E xtrajold .ds 3 ; 0,0,0 + 247 = 4491 ytrajold .ds 3 ; 0,0,0 + 248 ;Angle .DS 1 + 249 ;Force .ds 3 ; 0,0,0 + 250 ;Multiplier .ds 3 ; 0,0,0 + 251 = 4494 Multiplee .ds 2 ; 0,0 + 252 ;goleft .DS 1 ;if 1 then flights left + 253 ;---------------------------------------------------- + 254 ;unPlot + 255 = 4496 WhichUnPlot .DS 1 + 256 ; max 5 concurrent unPlots + 257 = 4497 oldplotH .DS [5] + 258 = 449C oldplotL .DS [5] + 259 = 44A1 oldora .DS [5] + 260 = 44A6 oldply .DS [5] + 261 = 44AB OldOraTemp .DS 1 + 262 = 44AC xtrajfb .DS 2 + 263 = 44AE ytrajfb .DS 2 + 264 ; + 265 ;tracerflag .DS 1 + 266 ;---------------------------------------------------- + 267 ;TypeChar + 268 = 44B0 mask1 .DS [8] + 269 = 44B8 mask2 .DS [8] + 270 + 271 = 44C0 char1 .DS [8] + 272 = 44C8 char2 .DS [8] + 273 ;color .DS 1 + 274 = 44D0 ybit .DS 1 + 275 = 44D1 tempbyte01 .DS 1 + 276 ;delta .DS 2 + 277 = 44D2 yfloat .DS 2 + 278 = 44D4 deltaX .DS 1 + 279 = 44D5 UpNdown .DS 1 + 280 + 281 = 44D6 temptankX .DS 2 + 282 = 44D8 temptankNr .DS 1 + 283 = 44D9 AfterBFGflag .DS 1 + 284 + 285 ;---------------------------------------------------- + 286 ;Variables from textproc.s65 + 287 ; tables with indexes of weapons on the right lists + 288 ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive + 289 44DA IndexesOfWeaponsL1 + 290 = 44DA .ds (last_offensive_____ - first_offensive____+1) + 291 44FA IndexesOfWeaponsL2 + 292 = 44FA .ds (last_defensive_____ - first_defensive____+1) + 293 ;---------------------------------------------------- + 294 + 295 ; variables storing amount of weapons on the first and second + 296 ; list and pointer position + 297 + 298 450A HowManyOnTheListOff + 299 = 450A .DS 1 + 300 450B HowManyOnTheListDef + 301 = 450B .DS 1 + 302 ;PositionOnTheList ; pointer position on the list being displayed + 303 ; .DS 1 + 304 450C LastWeapon + 305 ; number of the last previously purchased weapon + 306 ; it is necessary when after purchase some weapon + 307 ; is removed from the list (because too expensive) + 308 ; and the cursor must be placed elsewhere + 309 = 450C .DS 1 + 310 450D WhichList ; list currently on the screen + 311 ; (0-offensive, %10000000 - defensive (check with bit:bmi for defensives) + 312 = 450D .DS 1 + 313 ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines).... + 314 + 315 + 316 ;---------------------------------------------------- + 317 + 318 ;mark the level + 319 450E PositionInName ; cursor position in name of the player when name input + 320 = 450E .DS 1 + 321 ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu) + 322 + 323 ;---------------------------------------------------- + 324 ;displaydecimal + 325 ;decimal .DS 2 + 326 = 450F decimalresult .DS 5 + 327 + 328 ;xmissile + 329 ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte + 330 ;round + 331 = 4514 CurrentRoundNr .DS 1 + 332 ;FallDown2 .DS 1 + 333 ;leapfrog + 334 = 4515 LeapFrogAngle .DS 1 + 335 ;laser + 336 = 4516 LaserCoordinate .DS 8 ; 2,2,2,2 + 337 ;---------------------------------------------------- + 338 ; Here go tables with weapons possesed by a given tank + 339 ; Index in the table means weapon type + 340 ; number entered means ammo for given weapon possessed (max 99) + 341 ; Let 0 be "baby missile" + 342 ; from $30 the defensive weapons begin + 343 451E TanksWeapons + 344 451E TanksWeapon1 + 345 = 451E .DS number_of_weapons + 346 454E TanksWeapon2 + 347 = 454E .DS number_of_weapons + 348 457E TanksWeapon3 + 349 = 457E .DS number_of_weapons + 350 45AE TanksWeapon4 + 351 = 45AE .DS number_of_weapons + 352 45DE TanksWeapon5 + 353 = 45DE .DS number_of_weapons + 354 460E TanksWeapon6 + 355 = 460E .DS number_of_weapons + 356 + 357 463E mountaintable ;table of mountains (size=screenwidth) + 358 = 463E .DS [screenwidth] + 359 = 477E .DS 1 ; additional byte for fallout (sometimes 1 pixel) + 360 477F mountaintable2 ;table of mountains (size=screenwidth) + 361 = 477F .DS [screenwidth] + 362 = 48BF .DS 1 ; additional byte for fallout (sometimes 1 pixel) + 363 48C0 MountaintableEnd ;good for table clearing + 364 ;---------------------------------------------------- + 365 = 48C0 TextNumberOff .DS 1 + 366 ;-------------- + 367 48C1 TankTempY + 368 = 48C1 .DS 1 + 369 ;---------------------------------------------------- + 370 ;-------------- single round variables -------------- + 371 ;---------------------------------------------------- + 372 48C2 singleRoundVars + 373 ;-------------- + 374 ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed + 375 ;-------------- + 376 48C2 CurrentResult + 377 = 48C2 .DS 1 + 378 ;-------------- + 379 48C3 AngleTable ;Angle of the barrel of each tank during the round + 380 = 48C3 .DS MaxPlayers + 381 48C9 EndOfTheBarrelX + 382 = 48C9 .ds 2 + 383 48CB EndOfTheBarrelY + 384 = 48CB .ds 1 + 385 ;---------------------------------------------------- + 386 48CC previousAngle + 387 = 48CC .DS MaxPlayers + 388 48D2 previousEnergyL + 389 = 48D2 .DS MaxPlayers + 390 48D8 previousLeftRange + 391 = 48D8 .DS MaxPlayers + 392 48DE previousEnergyH + 393 = 48DE .DS MaxPlayers + 394 48E4 RandBoundaryLow + 395 = 48E4 .ds 2 + 396 48E6 RandBoundaryHigh + 397 = 48E6 .ds 2 + 398 48E8 AngleTablePointer + 399 = 48E8 .DS 1 + 400 48E9 singleRoundVarsEnd + 401 ;---------------------------------------------------- + 402 ; 4x4 texts + 403 ;---------------------------------------------------- + 404 ;LineAddress4x4 .DS 2 + 405 = 48E9 LineCharNr .DS 1 + 406 ;LineXdraw .DS 2 + 407 ;LineYdraw .DS 1 + 408 + 409 ;----------- + 410 48EA ResultOfTankNr + 411 = 48EA .DS 1 + 412 + 413 ;---------------------------------------------------- + 414 ;PutChar4x4 + 415 ;---------------------------------------------------- + 416 = 48EB nibbler4x4 .DS 1 + 417 = 48EC CharCode4x4 .DS 1 + 418 ;plot4x4color .DS 1 ;1-white, 0-background + 419 ; This is moved from display.asm to be easier to relocate + 420 48ED ListOfWeapons + 421 ; 0123456789012345678901234567890123456789 + 422 ; :number_of_offensives dta d" " + 423 ;:32 dta d" " + 424 = 48ED .ds 32*32 + 425 4CED ListOfWeapons1End + 426 4CED ListOfDefensiveWeapons + 427 ; :number_of_defensives dta d" " + 428 ;:16 dta d" " + 429 = 4CED .ds 16*32 + 430 4EED ListOfDefensiveWeaponsEnd ;constant useful when clearing + 431 4EED track_variables + 432 = 4EED trackn_db .ds TRACKS + 433 = 4EF1 trackn_hb .ds TRACKS + 434 = 4EF5 trackn_idx .ds TRACKS + 435 = 4EF9 trackn_pause .ds TRACKS + 436 = 4EFD trackn_note .ds TRACKS + 437 = 4F01 trackn_volume .ds TRACKS + 438 = 4F05 trackn_distor .ds TRACKS + 439 = 4F09 trackn_shiftfrq .ds TRACKS + 440 = 4F0D trackn_instrx2 .ds TRACKS + 441 = 4F11 trackn_instrdb .ds TRACKS + 442 = 4F15 trackn_instrhb .ds TRACKS + 443 = 4F19 trackn_instridx .ds TRACKS + 444 = 4F1D trackn_instrlen .ds TRACKS + 445 = 4F21 trackn_instrlop .ds TRACKS + 446 = 4F25 trackn_instrreachend .ds TRACKS + 447 = 4F29 trackn_volumeslidedepth .ds TRACKS + 448 = 4F2D trackn_volumeslidevalue .ds TRACKS + 449 = 4F31 trackn_effdelay .ds TRACKS + 450 = 4F35 trackn_effvibratoa .ds TRACKS + 451 = 4F39 trackn_effshift .ds TRACKS + 452 = 4F3D trackn_tabletypespeed .ds TRACKS + 453 = 4F41 trackn_tablenote .ds TRACKS + 454 = 4F45 trackn_tablea .ds TRACKS + 455 = 4F49 trackn_tableend .ds TRACKS + 456 = 4F4D trackn_tablelop .ds TRACKS + 457 = 4F51 trackn_tablespeeda .ds TRACKS + 458 = 4F55 trackn_command .ds TRACKS + 459 = 4F59 trackn_filter .ds TRACKS + 460 = 4F5D trackn_audf .ds TRACKS + 461 = 4F61 trackn_audc .ds TRACKS + 462 = 4F65 trackn_audctl .ds TRACKS + 463 = 4F69 v_aspeed .ds 1 + 464 4F6A track_endvariables + 465 + 466 4F6A variablesEnd + 467 ;---------------------------------------------------- + 468 + 469 .endif + 166 + 167 4F6A WeaponFont + 168 4F6A 00 00 00 00 00 00 + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' + 169 + 170 + 171 ;-------------------------------------------------- + 172 ; Game Code + 173 ;-------------------------------------------------- + 174 536A FirstSTART + 175 = 0000 DL = 0 + 176 = 0000 StatusBufferROM = 0 + 177 ;StatusBufferCopy = 0 + 178 = 0000 StatusBufferCopyEnd = 0 + 179 = 0004 TRACKS = 4 + 180 = 0000 DisplayCopyPurchaseEnd = 0 + 181 = 0000 DisplayCopyPurchaseStart = 0 + 182 = 2000 displayC64 = $2000 ; graphics screen memory start + 183 + 184 536A 78 SEI ; disable IRQ + 185 536B A9 36 LDA #$36 + 186 536D 85 01 STA $0001 ; Turn Off BASIC ROM + 187 536F A9 FE LDA #NMI ; to our routine + 190 5376 8D 19 03 STA $0319 ; + 191 5379 A9 00 LDA #$00 ; stop Timer A + 192 537B 8D 0E DD STA $DD0E ; + 193 537E 8D 04 DD STA $DD04 ; set Timer A to 0, after starting + 194 5381 8D 05 DD STA $DD05 ; NMI will occur immediately + 195 5384 A9 81 LDA #$81 ; + 196 5386 8D 0D DD STA $DD0D ; set Timer A as source for NMI + 197 5389 A9 01 LDA #$01 ; + 198 538B 8D 0E DD STA $DD0E ; start Timer A -> NMI + 199 + 200 ; from here on NMI is disabled + 201 + 202 + 203 538E 20 89 5A jsr MakeDarkScreen + 204 + 205 ; one time zero variables in RAM (non zero page) + 206 5391 A9 00 lda #0 + 207 5393 A0 3E ldy #OneTimeZeroVariablesCount-1 + 208 5395 99 00 41 @ sta OneTimeZeroVariables,y + 209 5398 88 dey + 210 5399 10 FA bpl @- + 211 + 212 ; one time zero variables in RAM (zero page) + 213 539B A0 58 ldy #FirstZpageVariable + 214 539D 99 00 00 @ sta $0000,y + 215 53A0 C8 iny + 216 53A1 D0 FA bne @- + 217 + 218 ; initialize variables in RAM (non zero page) + 219 53A3 A0 1B ldy #initialvaluesCount-1 + 220 53A5 B9 B9 5A @ lda initialvaluesStart,y + 221 53A8 99 3F 41 sta variablesToInitialize,y + 222 53AB 88 dey + 223 53AC 10 F7 bpl @- + 224 + 225 + 226 ; generate linetables + 227 53AE 20 9D 76 jsr GenerateLineTable + 228 + 229 + 230 ; Random INIT + 231 53B1 InitializeSIDrnd +Macro: INITIALIZESIDRND [Source: MACRO.ASM] + 1 53B1 A9 FF LDA #$FF ; maximum frequency value + 2 53B3 8D 0E D4 STA $D40E ; voice 3 frequency low byte + 3 53B6 8D 0F D4 STA $D40F ; voice 3 frequency high byte + 4 53B9 A9 80 LDA #$80 ; noise waveform, gate bit off + 5 53BB 8D 12 D4 STA $D412 ; voice 3 control register +Source: scorchC64.asm + 232 + 233 ;-------------------------------------------------- + 234 ; Main program of the game + 235 53BE icl 'game.asm' +Source: game.asm + 1 .IF *>0 ;this is a trick that prevents compiling this file alone + 2 + 3 ; All main procedures of the game not dependent on hardware (I hope) :) + 4 + 5 53BE START + 6 53BE 20 89 5A jsr MakeDarkScreen + 7 ; Startup sequence + 8 53C1 20 6A 58 jsr Initialize + 9 + 10 ;jsr GameOverScreen ; only for test !!! + 11 + 12 53C4 RMTSong song_main_menu +Macro: RMTSONG [Source: scorchC64.asm] + 1 53C4 A9 02 lda #SONG_MAIN_MENU ; do nothing in C64 +Source: game.asm + 13 + 14 53C6 20 E5 62 jsr Options ;startup screen + 15 53C9 20 1E 63 jsr SetVariablesFromOptions + 16 53CC 20 89 5A jsr MakeDarkScreen + 17 53CF 24 D7 bit escFlag + 18 53D1 30 EB bmi START + 19 + 20 53D3 20 C6 63 jsr EnterPlayerNames + 21 53D6 20 89 5A jsr MakeDarkScreen + 22 53D9 24 D7 bit escFlag + 23 53DB 30 E1 bmi START + 24 + 25 53DD 20 0B 59 jsr RandomizeSequence + 26 ; for the round #1 shooting sequence is random + 27 + 28 53E0 MainGameLoop + 29 53E0 20 41 5A jsr SetWallsType + 30 ; first set default barrel lengths (fix for Long Schlong activation :) ) + 31 ; we must do it before purchase/activate + 32 ; and set Auto Defense to off + 33 53E3 20 FB 58 jsr SetStandardBarrels + 34 + 35 53E6 20 77 63 jsr CallPurchaseForEveryTank + 36 53E9 20 89 5A jsr MakeDarkScreen + 37 53EC 24 D7 bit escFlag + 38 53EE 30 CE bmi START + 39 + 40 53F0 20 E7 57 jsr GetRandomWind + 41 + 42 53F3 20 D3 54 jsr RoundInit + 43 + 44 53F6 20 5F 55 jsr MainRoundLoop + 45 53F9 24 D7 bit escFlag + 46 53FB 30 C1 bmi START + 47 53FD 50 03 4C C3 54 jvs GoGameOver + 48 + 49 5402 20 DD 59 jsr SortSequence + 50 + 51 5405 A9 00 85 6C mva #0 TankNr ; + 52 5409 85 02 sta COLBAKS ; set background color to black + 53 540B 85 5D sta JoystickNumber ; set joystick port for player + 54 + 55 ; Hide all (easier than hide last ;) ) tanks + 56 540D 20 0B 6A jsr cleartanks ; A=0 + 57 + 58 ; here gains and losses should be displayed (dollars) + 59 ; finally we have changed our minds and money of players + 60 ; is displayed only in weapons shop + 61 + 62 ; Results are number of other deaths + 63 ; before the player dies itself + 64 + 65 5410 RmtSong song_round_over +Macro: RMTSONG [Source: scorchC64.asm] + 1 5410 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 +Source: game.asm + 66 5412 20 A3 64 jsr DisplayResults + 67 + 68 5415 20 75 5A jsr DemoModeOrKey + 69 5418 20 89 5A jsr MakeDarkScreen + 70 + 71 541B A6 AE ldx NumberOfPlayers + 72 541D CA dex + 73 541E CalculateGains + 74 ; add gains and substract losses + 75 ; gain is what player gets for lost energy of opponents + 76 ; energy lost by opponents is added during Round and + 77 ; little below in source, multiplied by 2 to get "dollars". + 78 ; By analogy, loss is energy that given player losses during + 79 ; each Round. + 80 ; Important! If player has 10 energy and gets a central hit + 81 ; from nuke that would take 90 energy points, his loss + 82 ; is 90, not 10 + 83 + 84 ; adding the remaining energy of the tank to gain + 85 ; winner gets more ! :) + 86 541E BD A2 43 lda Energy,x + 87 5421 7D 90 43 adc gainL,x + 88 5424 9D 90 43 sta gainL,x + 89 5427 90 03 bcc @+ + 90 5429 FE 8A 43 inc gainH,x + 91 @ + 92 ; add gain * 2 + 93 542C 1E 90 43 asl gainL,x + 94 542F 3E 8A 43 rol gainH,x + 95 5432 18 clc + 96 5433 BD 84 43 lda moneyL,x + 97 5436 7D 90 43 adc gainL,x + 98 5439 9D 84 43 sta moneyL,x + 99 543C BD 7E 43 lda moneyH,x + 100 543F 7D 8A 43 adc gainH,x + 101 5442 9D 7E 43 sta moneyH,x + 102 ; substract lose + 103 ; if lose is greater than money then zero money + 104 5445 BD 7E 43 lda moneyH,x + 105 5448 DD 96 43 cmp loseH,x + 106 544B 90 20 bcc zeromoney + 107 544D D0 08 bne substractlose + 108 544F BD 84 43 lda moneyL,x + 109 5452 DD 9C 43 cmp loseL,x + 110 5455 90 16 bcc zeromoney + 111 5457 substractlose + 112 5457 38 sec + 113 5458 BD 84 43 lda moneyL,x + 114 545B FD 9C 43 sbc loseL,x + 115 545E 9D 84 43 sta moneyL,x + 116 5461 BD 7E 43 lda moneyH,x + 117 5464 FD 96 43 sbc loseH,x + 118 5467 9D 7E 43 sta moneyH,x + 119 546A 4C 75 54 jmp skipzeroing + 120 546D zeromoney + 121 546D A9 00 lda #0 + 122 546F 9D 84 43 sta moneyL,x + 123 5472 9D 7E 43 sta moneyH,x + 124 5475 skipzeroing + 125 ; and earned money for summary + 126 5475 18 clc + 127 5476 BD D3 43 lda EarnedMoneyL,x + 128 5479 7D 90 43 adc gainL,x + 129 547C 9D D3 43 sta EarnedMoneyL,x + 130 547F BD CD 43 lda EarnedMoneyH,x + 131 5482 7D 8A 43 adc gainH,x + 132 5485 9D CD 43 sta EarnedMoneyH,x + 133 ; substract lose + 134 ; if lose is greater than money then zero money + 135 5488 BD CD 43 lda EarnedMoneyH,x + 136 548B DD 96 43 cmp loseH,x + 137 548E 90 20 bcc ezeromoney + 138 5490 D0 08 bne esubstractlose + 139 5492 BD D3 43 lda EarnedMoneyL,x + 140 5495 DD 9C 43 cmp loseL,x + 141 5498 90 16 bcc ezeromoney + 142 549A esubstractlose + 143 549A 38 sec + 144 549B BD D3 43 lda EarnedMoneyL,x + 145 549E FD 9C 43 sbc loseL,x + 146 54A1 9D D3 43 sta EarnedMoneyL,x + 147 54A4 BD CD 43 lda EarnedMoneyH,x + 148 54A7 FD 96 43 sbc loseH,x + 149 54AA 9D CD 43 sta EarnedMoneyH,x + 150 54AD 4C B8 54 jmp eskipzeroing + 151 54B0 ezeromoney + 152 54B0 A9 00 lda #0 + 153 54B2 9D D3 43 sta EarnedMoneyL,x + 154 54B5 9D CD 43 sta EarnedMoneyH,x + 155 54B8 eskipzeroing + 156 + 157 54B8 CA dex + 158 54B9 30 03 4C 1E 54 jpl CalculateGains + 159 + 160 54BE AD 7D 43 lda GameIsOver + 161 54C1 F0 06 beq NoGameOverYet + 162 54C3 GoGameOver + 163 54C3 20 0E 66 jsr GameOverScreen + 164 54C6 4C BE 53 jmp START + 165 54C9 NoGameOverYet + 166 54C9 EE 14 45 inc CurrentRoundNr + 167 54CC A9 15 85 9E mva #sfx_silencer sfx_effect + 168 + 169 54D0 4C E0 53 jmp MainGameLoop + 170 + 171 + 172 ;-------------------------------------------------- + 173 54D3 .proc RoundInit + 174 ;-------------------------------------------------- + 175 ; at the beginning of each Round we set energy + 176 ; of all players to 99 + 177 ; the maximum shooting energy to 990 (it is 10*energy) + 178 ; the default shooting energy to 350 + 179 ; the shooting angle is randomized + 180 ; of course gains an loses are zeroed + 181 + 182 54D3 RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 54D3 A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: game.asm + 183 + 184 54D5 20 62 75 jsr SetPMWidth ; A=0 + 185 54D8 A9 00 lda #0 + 186 54DA 8D D9 44 sta AfterBFGflag ; reset BFG flag + 187 54DD 85 02 sta COLOR2 ; status line "off" + 188 54DF 85 02 sta COLOR1 + 189 + 190 54E1 AA tax + 191 54E2 9D C2 48 @ sta singleRoundVars,x + 192 54E5 E8 inx + 193 54E6 E0 27 cpx #(singleRoundVarsEnd-singleRoundVars) + 194 54E8 D0 F8 bne @- + 195 + 196 54EA A2 05 ldx #(MaxPlayers-1) + 197 54EC SettingEnergies + 198 54EC A9 00 lda #$00 + 199 54EE 9D 90 43 sta gainL,x + 200 54F1 9D 8A 43 sta gainH,x + 201 54F4 9D 9C 43 sta loseL,x + 202 54F7 9D 96 43 sta loseH,x + 203 54FA A9 63 lda #99 + 204 54FC 9D A2 43 sta Energy,x + 205 54FF 9D AF 43 sta eXistenZ,x + 206 5502 9D B5 43 sta LASTeXistenZ,x + 207 ; anything in eXistenZ table means that this tank exist + 208 ; in the given round + 209 5505 A9 E8 lda #<1000 + 210 5507 9D E5 43 sta MaxForceTableL,x + 211 550A A9 03 lda #>1000 + 212 550C 9D EB 43 sta MaxForceTableH,x + 213 550F A9 5E lda #<350 + 214 5511 9D D9 43 sta ForceTableL,x + 215 5514 A9 01 lda #>350 + 216 5516 9D DF 43 sta ForceTableH,x + 217 + 218 ;lda #(255-45) + 219 ;it does not look good when all tanks have + 220 ;barrels pointing the same direction + 221 ;so it would be nice to have more or less random + 222 ;angles + 223 5519 20 3D 59 jsr RandomizeAngle + 224 551C 9D C3 48 sta AngleTable,x + 225 + 226 551F CA dex + 227 5520 10 CA bpl SettingEnergies + 228 + 229 ;generating the new landscape + 230 5522 20 46 75 jsr PMoutofScreen ;let P/M disappear + 231 5525 20 7C 76 jsr clearscreen ;let the screen be clean + 232 5528 20 9C 6E jsr ClearPMmemory + 233 552B 20 6A 69 jsr placetanks ;let the tanks be evenly placed + 234 552E 20 04 70 jsr calculatemountains ;let mountains be easy for the eye + 235 ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height + 236 + 237 + 238 5531 A9 00 85 72 85 73 mwa #StatusBufferROM temp + 239 5537 A9 FB 85 74 A9 42 + mwa #StatusBufferCopy temp2 + 240 553F A9 01 85 76 A9 00 + mwa #StatusBufferCopyEnd+1 modify + 241 5547 20 B7 5A jsr CopyFromROM + 242 + 243 554A 20 E4 76 jsr SetMainScreen + 244 554D 20 51 75 jsr ColorsOfSprites + 245 + 246 5550 20 B2 6E jsr drawmountains ;draw them + 247 5553 20 12 6A jsr drawtanks ;finally draw tanks + 248 + 249 5556 A9 00 85 6D mva #$00 TankSequencePointer + 250 + 251 ;---------round screen is ready--------- + 252 555A A9 0A 85 02 mva #TextForegroundColor COLOR1 ; status line "on" + 253 555E 60 rts + 254 .endp + 255 + 256 ;-------------------------------------------------- + 257 555F .proc MainRoundLoop + 258 ; here we must check if by a chance there is only one + 259 ; tank with energy greater than 0 left + 260 ;-------------------------------------------------- + 261 + 262 555F A0 00 ldy #0 ; in Y - number of tanks with energy greater than zero + 263 5561 84 02 sty ATRACT ; reset atract mode + 264 5563 A6 AE ldx NumberOfPlayers + 265 5565 CA dex + 266 5566 CheckingIfRoundIsFinished + 267 5566 BD AF 43 lda eXistenZ,x + 268 5569 F0 01 beq NoEnergy + 269 556B C8 iny + 270 556C NoEnergy + 271 556C CA dex + 272 556D 10 F7 bpl CheckingIfRoundIsFinished + 273 + 274 556F C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ? + 275 5571 B0 17 bcs DoNotFinishTheRound + 276 + 277 ;points for the last living tank + 278 5573 A6 AE ldx NumberOfPlayers + 279 5575 CA dex + 280 5576 WhichTankWonLoop + 281 5576 BD AF 43 lda eXistenZ,x + 282 5579 D0 04 bne ThisOneWon + 283 557B CA dex + 284 557C 10 F8 bpl WhichTankWonLoop + 285 ;error was here!!! + 286 ; somehow I believed program will be never here + 287 ; but it was a bad assumption + 288 ; god knows when there is such a situation + 289 ; (we've got a SITUATION here, if you know what I mean) + 290 ; there are two tanks left. + 291 ; one of them is killed by the second tank + 292 ; second tank explodes and kills the first one. + 293 ; and code lands here... + 294 ; looks like no one won! + 295 557E 60 rts + 296 + 297 557F ThisOneWon + 298 557F AD C2 48 lda CurrentResult + 299 5582 18 clc + 300 5583 7D BB 43 adc ResultsTable,x + 301 5586 9D BB 43 sta ResultsTable,x + 302 + 303 5589 60 rts ; this Round is finished + 304 + 305 558A DoNotFinishTheRound + 306 ; Seppuku here + 307 558A AD 74 43 lda noDeathCounter + 308 558D CD 49 41 cmp seppukuVal + 309 5590 90 0F bcc @+ + 310 + 311 5592 A9 00 8D 74 43 mva #0 noDeathCounter + 312 5597 A9 1A 85 9E mva #sfx_seppuku sfx_effect + 313 + 314 559B 20 19 74 jsr DisplaySeppuku + 315 559E 4C D0 57 jmp Seppuku + 316 + 317 @ + 318 ; Auto Defense - activates defensives + 319 55A1 A6 AE ldx NumberOfPlayers + 320 55A3 CA dex + 321 55A4 CheckNextTankAD + 322 55A4 BD A2 43 lda Energy,x ; only active players + 323 55A7 F0 08 beq @+ + 324 55A9 BD 03 44 lda AutoDefenseFlag,x ; with Auto Defence activated + 325 55AC F0 03 beq @+ + 326 ; run auto defense for tank in X + 327 55AE 20 F2 8A jsr AutoDefense + 328 55B1 CA @ dex + 329 55B2 10 F0 bpl CheckNextTankAD + 330 55B4 20 12 6A jsr DrawTanks ; redraw tanks with new defences + 331 ; + 332 55B7 A6 6D ldx TankSequencePointer + 333 55B9 BD 77 43 lda TankSequence,x + 334 55BC 85 6C sta TankNr + 335 55BE AA tax + 336 55BF BD A2 43 lda Energy,x ;skip if no energy + 337 55C2 D0 03 4C 90 56 jeq NextPlayerShoots + 338 + 339 + 340 + 341 55C7 A9 FF 85 DB mva #$ff plot4x4color + 342 55CB 20 44 73 jsr DisplayTankNameAbove + 343 + 344 55CE A9 01 85 A9 mva #1 color ;to display flying point + 345 + 346 55D2 A6 6C ldx tankNr + 347 55D4 BD 7F 5B lda TankStatusColoursTable,x + 348 55D7 85 02 sta COLOR2 ; set color of status line + 349 55D9 20 0F 66 jsr PutTankNameOnScreen + 350 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 351 + 352 55DC BD 39 41 lda SkillTable,x + 353 55DF F0 1C beq ManualShooting + 354 + 355 55E1 RoboTanks + 356 ; robotanks shoot here + 357 ; TankNr still in X + 358 55E1 20 C3 8F jsr ArtificialIntelligence + 359 ;pause 30 + 360 55E4 A6 6C ldx TankNr + 361 55E6 20 0F 66 jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) + 362 55E9 20 A1 59 jsr MoveBarrelToNewPosition + 363 55EC A5 02 lda kbcode + 364 55EE C9 1C cmp #@kbcode._esc ; 28 ; ESC + 365 55F0 D0 03 bne @+ + 366 55F2 20 AE 73 jsr AreYouSure + 367 55F5 A5 D7 @ lda escFlag + 368 55F7 F0 01 60 seq:rts ; keys Esc or O + 369 + 370 + 371 55FA 4C 11 56 jmp AfterManualShooting + 372 + 373 55FD ManualShooting + 374 55FD BD 25 44 lda JoyNumber,x + 375 5600 85 5D sta JoystickNumber ; set joystick port for player + 376 5602 20 71 5A jsr WaitForKeyRelease + 377 5605 A9 00 lda #%00000000 + 378 5607 85 97 sta TestFlightFlag ; set "Test Fight" off + 379 5609 20 4D 80 jsr BeforeFire + 380 560C A5 D7 lda escFlag + 381 560E F0 01 60 seq:rts ; keys Esc or O + 382 + 383 5611 AfterManualShooting + 384 5611 A9 00 85 DB mva #$00 plot4x4color + 385 5615 20 44 73 jsr DisplayTankNameAbove + 386 ; defensive weapons without flight handling + 387 5618 A6 6C ldx TankNr + 388 561A BD FD 43 lda ActiveDefenceWeapon,x + 389 561D C9 22 cmp #ind_Hovercraft_____ + 390 561F F0 14 beq GoFloat + 391 5621 C9 20 cmp #ind_White_Flag_____ ; White Flag + 392 5623 F0 0A beq ShootWhiteFlag + 393 5625 C9 2B cmp #ind_Nuclear_Winter_ + 394 5627 D0 19 bne StandardShoot + 395 5629 ShootAtomicWinter + 396 ; --- atomic winter --- + 397 5629 20 9B 8A jsr AtomicWinter + 398 562C 4C 90 56 jmp NextPlayerShoots ; and we skip shoot + 399 562F ShootWhiteFlag + 400 ; --- white flag --- + 401 562F 20 70 8A jsr WhiteFlag + 402 5632 4C 90 56 jmp NextPlayerShoots ; and we skip shoot + 403 5635 GoFloat + 404 5635 20 84 8B jsr TankFlying + 405 5638 A9 00 lda #0 + 406 563A 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate after use + 407 563D 24 D7 bit escFlag + 408 563F 10 BC bpl ManualShooting ; after floating tank can shoot + 409 5641 60 rts + 410 5642 StandardShoot + 411 5642 EE 74 43 inc noDeathCounter + 412 + 413 5645 20 98 8F jsr DecreaseWeaponBeforeShoot + 414 5648 20 0F 66 jsr DisplayStatus + 415 + 416 ; ldx TankNr + 417 564B DE A2 43 dec Energy,x ; lower energy to eventually let tanks commit suicide + 418 + 419 564E ShootNow + 420 564E 20 0C 83 jsr Shoot + 421 ;here we clear offensive text (after a shoot) + 422 5651 A4 6C ldy TankNr + 423 5653 A9 00 85 DB mva #$00 plot4x4color + 424 5657 20 88 72 jsr DisplayOffensiveTextNr + 425 + 426 565A A5 BF lda HitFlag ;0 if missed + 427 565C F0 1E beq missed + 428 + 429 565E 20 34 77 jsr Explosion + 430 + 431 5661 continueMainRoundLoopAfterSeppuku + 432 + 433 5661 AfterExplode + 434 5661 20 F4 6E jsr SoilDown2 ; allways + 435 5664 NoFallDown2 + 436 ;here tanks are falling down + 437 5664 A5 6C 85 7E mva tankNr tempor2 + 438 5668 A6 AE ldx NumberOfPlayers + 439 566A CA dex + 440 566B TanksFallDown + 441 566B 86 6C stx TankNr + 442 566D BD AF 43 lda eXistenZ,x + 443 5670 F0 03 beq NoExistNoFall + 444 5672 20 2E 6D jsr TankFalls + 445 5675 NoExistNoFall + 446 5675 CA dex + 447 5676 10 F3 bpl TanksFallDown + 448 5678 A6 7E 86 6C mvx tempor2 TankNr + 449 + 450 567C missed + 451 567C AC 09 44 ldy WeaponDepleted + 452 567F D0 06 bne @+ + 453 5681 A6 6C ldx TankNr + 454 5683 98 tya + 455 5684 9D F7 43 sta ActiveWeapon,x + 456 @ + 457 + 458 ;here we clear offensive text (after a shoot) + 459 5687 A4 6C ldy TankNr + 460 5689 A9 00 85 DB mva #$00 plot4x4color + 461 568D 20 88 72 jsr DisplayOffensiveTextNr + 462 + 463 5690 NextPlayerShoots + 464 ;before it shoots, the eXistenZ table must be updated + 465 ;accordingly to actual energy (was forgotten, sorry to ourselves) + 466 + 467 5690 A2 05 ldx #(MaxPlayers-1) + 468 5692 SeteXistenZ + 469 5692 BD A2 43 lda Energy,x + 470 5695 9D AF 43 sta eXistenZ,x + 471 + 472 5698 20 2A 58 jsr MaxForceCalculate + 473 + 474 569B CA dex + 475 569C 10 F4 bpl SeteXistenZ + 476 + 477 ;was setup of maximum energy for players + 478 + 479 + 480 569E PlayersAgain + 481 + 482 ; In LASTeXistenZ there are values of eXistenZ before shoot + 483 ; from the next tank. + 484 ; Now it must be checked if by a chance something that had + 485 ; LASTeXistenZ>0 is not equal to 0 right now, + 486 ; because it means this tank died during this round. + 487 ; Most important thing is: + 488 ; after each explosion of the tank these operations must be + 489 ; performed from the beginning! + 490 ; (it is made by another jump into the after explosion routines) + 491 ; It is because exploding tank can destroy their neighbours, + 492 ; additionally this tank just have had LASTeXistenZ set to 0, + 493 ; otherwise it would explode again and again. + 494 ; OK, text how to do it is ready, now comes coding . + 495 ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ + 496 + 497 569E A9 16 85 9E mva #sfx_next_player sfx_effect + 498 + 499 56A2 A6 AE ldx NumberOfPlayers + 500 56A4 CA dex + 501 56A5 CheckingPlayersDeath + 502 56A5 BD B5 43 lda LASTeXistenZ,x + 503 56A8 F0 05 beq NoPlayerNoDeath + 504 56AA BD AF 43 lda eXistenZ,x + 505 56AD F0 19 beq PlayerXdeath + 506 56AF NoPlayerNoDeath + 507 56AF CA dex + 508 56B0 10 F3 bpl CheckingPlayersDeath + 509 ; if processor is here it means there are no more explosions + 510 + 511 56B2 E6 6D A5 6D inc:lda TankSequencePointer + 512 56B6 C5 AE cmp NumberOfPlayers + 513 56B8 D0 0B bne NotLastPlayerInRound + 514 56BA A9 00 85 6D mva #0 TankSequencePointer + 515 + 516 56BE A5 5C lda WindChangeInRound + 517 56C0 F0 03 beq NoWindChangeNow + 518 56C2 20 E7 57 jsr GetRandomWind ; wind change after each turn (not round only) + 519 56C5 NoWindChangeNow + 520 56C5 NotLastPlayerInRound + 521 56C5 4C 5F 55 jmp MainRoundLoop + 522 .endp + 523 + 524 ;--------------------------------- + 525 56C8 .proc PlayerXdeath + 526 ; this tank should not explode anymore: + 527 ; there is 0 in A, and Tank Number in X, so... + 528 ;--------------------------------- + 529 + 530 56C8 9D B5 43 sta LASTeXistenZ,x + 531 ; save x somewhere + 532 56CB 8E C1 48 stx TankTempY + 533 + 534 ;clear NoDeathCounter here + 535 56CE 8D 74 43 sta noDeathCounter + 536 + 537 56D1 A9 06 85 9E mva #sfx_death_begin sfx_effect + 538 + 539 ; display defensive text here (well, defensive + 540 ; is not the real meaning, it should be pre-death, + 541 ; but I am too lazy to change names of variables) + 542 + 543 ; in X there is a number of tank that died + 544 + 545 56D5 A9 4E lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") + 546 56D7 2C D9 44 bit AfterBFGflag ; check BFG flag + 547 56DA 30 15 bmi TextAfterBFG + 548 ; if BFG then no points for dead tanks ... + 549 56DC AD C2 48 lda CurrentResult + 550 56DF 18 clc + 551 56E0 7D BB 43 adc ResultsTable,x + 552 56E3 9D BB 43 sta ResultsTable,x + 553 ;inc CurrentResult + 554 + 555 ; RandomizeDeffensiveText + 556 56E6 randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 56E6 ?rand + 7 56E6 AD 1B D4 lda random + 8 56E9 C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor + 9 56EB 90 F9 bcc ?rand + 10 56ED C9 74 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling + 11 56EF B0 F5 bcs ?rand +Source: game.asm + 557 56F1 TextAfterBFG + 558 56F1 8D C0 48 sta TextNumberOff + 559 56F4 EE C2 48 inc CurrentResult ; ... but increase result of winner (BFG) + 560 56F7 AC C1 48 ldy TankTempY + 561 56FA A9 FF 85 DB mva #$ff plot4x4color + 562 56FE 20 88 72 jsr DisplayOffensiveTextNr + 563 ; tank flash + 564 5701 AC C1 48 ldy TankTempY + 565 5704 A5 6C 85 74 mva TankNr temp2 ; not elegant, and probably unnecessary + 566 5708 84 6C sty TankNr + 567 570A 20 57 6B jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) + 568 570D A5 74 85 6C mva temp2 TankNr + 569 + 570 ;Deffensive text cleanup + 571 ;here we clear Deffensive text (after a shoot) + 572 5711 AC C1 48 ldy TankTempY + 573 5714 A9 00 85 DB mva #$00 plot4x4color + 574 5718 20 88 72 jsr DisplayOffensiveTextNr + 575 + 576 ; calculate position of the explosion (the post-death one) + 577 571B AE C1 48 ldx TankTempY + 578 571E 18 clc + 579 571F BD 0D 44 lda xtankstableL,x + 580 5722 69 04 adc #4 ; more or less in the middle of the tank + 581 5724 85 61 sta xdraw + 582 5726 BD 13 44 lda xtankstableH,x + 583 5729 69 00 adc #0 + 584 572B 85 62 sta xdraw+1 + 585 572D 38 sec + 586 572E BD 19 44 lda ytankstable,x + 587 5731 E9 04 sbc #4 + 588 5733 85 63 sta ydraw + 589 5735 A9 00 lda #0 + 590 5737 85 64 sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit + 591 + 592 ;cleanup of the soil fall down ranges (left and right) + 593 5739 85 D4 sta RangeRight + 594 573B 85 D5 sta RangeRight+1 + 595 573D A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft + 596 + 597 ; We are randomizing the weapon now. + 598 ; jumping into the middle of the explosion + 599 ; routine + 600 5745 MetodOfDeath + 601 5745 AD 1B D4 lda random + 602 5748 29 1F and #%00011111 ; range 0-31 + 603 574A C9 10 cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) + 604 574C B0 F7 bcs MetodOfDeath + 605 574E A8 tay + 606 574F B9 4A 60 lda weaponsOfDeath,y + 607 5752 20 3C 77 jsr ExplosionDirect + 608 5755 A9 15 85 9E mva #sfx_silencer sfx_effect + 609 + 610 ; Clear current Shooter settings. After that, Shooter will "search" for the target again + 611 5759 A6 AE ldx NumberOfPlayers + 612 575B CA dex + 613 575C BD 39 41 @ lda skillTable,x + 614 575F C9 02 cmp #2 ; clear variables only if Shooter + 615 5761 D0 0B bne NotShooter + 616 5763 A9 00 lda #0 + 617 5765 9D CC 48 sta PreviousAngle,x + 618 5768 9D D2 48 sta PreviousEnergyL,x + 619 576B 9D DE 48 sta PreviousEnergyH,x + 620 576E NotShooter + 621 576E CA dex + 622 576F 10 EB bpl @- + 623 + 624 ; jump to after explosion routines (soil fallout, etc.) + 625 ; After going through these routines we are back + 626 ; to checking if a tank exploded and maybe we have + 627 ; a deadly shot here again. + 628 5771 4C 61 56 jmp MainRoundLoop.AfterExplode + 629 .endp + 630 + 631 ;-------------------------------------------------- + 632 5774 .proc DecreaseEnergyX + 633 ;Decreases energy of player nr X by the value Y + 634 ;increases his financial loss + 635 ;increases gain of tank TankNr + 636 ;-------------------------------------------------- + 637 5774 8C AE 43 sty EnergyDecrease + 638 ; Lose increase + 639 5777 BD 9C 43 lda loseL,x + 640 577A 18 clc + 641 577B 6D AE 43 adc EnergyDecrease + 642 577E 9D 9C 43 sta loseL,x + 643 5781 BD 96 43 lda loseH,x + 644 5784 69 00 adc #$00 + 645 5786 9D 96 43 sta loseH,x + 646 ; Energy now, not less than 0 + 647 5789 BD A2 43 lda Energy,x + 648 578C CD AE 43 cmp EnergyDecrease + 649 578F 90 05 bcc ldahashzero + 650 ;sec + 651 5791 ED AE 43 sbc EnergyDecrease + 652 5794 10 02 bpl NotNegativeEnergy + 653 5796 ldahashzero + 654 5796 A9 00 lda #0 + 655 5798 NotNegativeEnergy + 656 5798 9D A2 43 sta Energy,x + 657 ;now increase the gain of the shooting tank + 658 579B A4 6C ldy TankNr + 659 579D 18 clc + 660 579E B9 90 43 lda gainL,y + 661 57A1 6D AE 43 adc EnergyDecrease + 662 57A4 99 90 43 sta gainL,y + 663 57A7 B9 8A 43 lda gainH,y + 664 57AA 69 00 adc #$00 + 665 57AC 99 8A 43 sta gainH,y + 666 57AF 60 rts + 667 .endp + 668 + 669 ;-------------------------------------------------- + 670 57B0 .proc DecreaseShieldEnergyX + 671 ; Decreases energy of shield player nr X by the value Y + 672 ; if shield energy is 0 after decrease then in Y we have + 673 ; rest of the energy - to decrease tank energy + 674 ;-------------------------------------------------- + 675 57B0 8C AE 43 sty EnergyDecrease + 676 57B3 A0 00 ldy #0 ; if Shield survive then no decrease tank anergy + 677 ; Energy cannot be less than 0 + 678 57B5 BD A8 43 lda ShieldEnergy,x + 679 57B8 CD AE 43 cmp EnergyDecrease + 680 57BB 90 05 bcc UseAllShieldEnergy + 681 ;sec + 682 57BD ED AE 43 sbc EnergyDecrease + 683 57C0 10 0A bpl NotNegativeShieldEnergy ; jump allways + 684 57C2 UseAllShieldEnergy + 685 ; now calculate rest of energy for future tank energy decrease + 686 57C2 38 sec + 687 57C3 AD AE 43 lda EnergyDecrease + 688 57C6 FD A8 43 sbc ShieldEnergy,x + 689 57C9 A8 tay + 690 57CA A9 00 lda #0 + 691 57CC NotNegativeShieldEnergy + 692 57CC 9D A8 43 sta ShieldEnergy,x + 693 57CF 60 rts + 694 .endp + 695 + 696 ;--------------------------------- + 697 57D0 .proc Seppuku + 698 ;--------------------------------- + 699 57D0 A9 00 lda #0 + 700 57D2 85 64 sta ydraw+1 + 701 ; get position of the tank + 702 57D4 A6 6C ldx TankNr + 703 ; lda #0 ; turn off defense weapons when hara-kiring + 704 57D6 9D FD 43 sta ActiveDefenceWeapon,x + 705 57D9 9D A8 43 sta ShieldEnergy,x + 706 57DC 20 67 74 jsr SetupXYdraw + 707 57DF A9 01 lda #1 ; Missile + 708 57E1 20 3C 77 jsr ExplosionDirect + 709 57E4 4C 61 56 jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku + 710 .endp + 711 + 712 ;-------------------------------------------------- + 713 57E7 .proc GetRandomWind + 714 ;in: MaxWind (byte) + 715 ;out: Wind (word) + 716 ;uses: _ + 717 ;-------------------------------------------------- + 718 57E7 AD 1B D4 lda random + 719 57EA CD 0A 44 cmp MaxWind + 720 57ED B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again + 721 57EF 85 CE sta Wind + 722 57F1 A9 00 85 CF mva #$00 Wind+1 + 723 57F5 85 D0 sta Wind+2 + 724 57F7 85 D1 sta Wind+3 + 725 ; multiply Wind by 16 + 726 ; two bytes of Wind are treated as a decimal part of vx variable + 727 57F9 06 CE 26 CF 06 CE + :4 aslw Wind + 728 ; decide the direction + 729 5809 AD 1B D4 lda random + 730 580C 29 01 and #$01 + 731 580E F0 19 beq @+ + 732 5810 38 sec ; Wind = -Wind + 733 .rept 4 + 734 LDA #$00 + 735 SBC WIND+# + 736 STA WIND+# + 737 .endr +Source: REPT + 734 5811 A9 00 LDA #$00 + 734 5813 E5 CE SBC WIND+# + 734 5815 85 CE STA WIND+# + 734 5817 A9 00 LDA #$00 + 734 5819 E5 CF SBC WIND+# + 734 581B 85 CF STA WIND+# + 734 581D A9 00 LDA #$00 + 734 581F E5 D0 SBC WIND+# + 734 5821 85 D0 STA WIND+# + 734 5823 A9 00 LDA #$00 + 734 5825 E5 D1 SBC WIND+# + 734 5827 85 D1 STA WIND+# +Source: game.asm + 738 5829 60 @ rts + 739 .endp + 740 ;-------------------------------------------------- + 741 582A .proc MaxForceCalculate + 742 ; calculates max force for tank (tanknr in X) + 743 ; Energy of tank X in A + 744 ;-------------------------------------------------- + 745 582A 85 E8 sta L1 + 746 + 747 ;DATA L1,L2 + 748 ;Multiplication 8bit*8bit, + 749 ;result 16bit + 750 ;this algiorithm is a little longer than one in Ruszczyc 6502 book + 751 ;but it is faster + 752 + 753 582C A0 08 ldy #8 + 754 582E A9 00 lda #0 + 755 5830 18 clc + 756 5831 6A LP0 ror + 757 5832 66 E8 ror L1 + 758 5834 90 03 bcc B0 + 759 5836 18 clc + 760 5837 69 0A adc #10 ; (L2) multiplication by 10 + 761 5839 88 B0 dey + 762 583A D0 F5 bne LP0 + 763 583C 6A ror + 764 583D 66 E8 ror L1 + 765 583F 9D EB 43 sta MaxForceTableH,x + 766 5842 A5 E8 lda L1 + 767 5844 9D E5 43 sta MaxForceTableL,x + 768 5847 60 rts + 769 .endp + 770 + 771 ;-------------------------------------------------- + 772 5848 .proc WeaponCleanup + 773 ; cleaning of the weapon possesion tables + 774 ; 99 of Baby Missles and White Flags, all other weapons=0) + 775 ;-------------------------------------------------- + 776 5848 A2 2F ldx #(number_of_weapons - 1) + 777 584A A9 00 @ lda #$0 + 778 584C E0 20 cpx #ind_White_Flag_____ ; White Flag + 779 584E D0 02 bne no99 + 780 5850 A9 63 set99 lda #99 + 781 5852 9D 1E 45 no99 sta TanksWeapon1,x + 782 5855 9D 4E 45 sta TanksWeapon2,x + 783 5858 9D 7E 45 sta TanksWeapon3,x + 784 585B 9D AE 45 sta TanksWeapon4,x + 785 585E 9D DE 45 sta TanksWeapon5,x + 786 5861 9D 0E 46 sta TanksWeapon6,x + 787 5864 CA dex + 788 5865 F0 E9 beq set99 ; Baby Missile (index=0) + 789 5867 10 E1 bpl @- + 790 5869 60 rts + 791 .endp + 792 + 793 ;-------------------------------------------------- + 794 586A .proc Initialize + 795 ;Initialization sequence + 796 ;uses: temp, ... + 797 ;-------------------------------------------------- + 798 = 0072 deletePtr = temp + 799 + 800 ; clean variables + 801 586A A9 00 lda #0 + 802 586C 85 D7 sta escFlag + 803 586E 85 5D sta JoystickNumber + 804 5870 A8 tay + 805 5871 A9 73 85 72 A9 43 + mwa #variablesStart deletePtr + 806 5879 98 @ tya + 807 587A 91 72 sta (deletePtr),y + 808 587C E6 72 D0 02 E6 73 inw deletePtr + 809 5882 A5 73 C9 4F D0 04 + cpw deletePtr #variablesEnd + 810 588C D0 EB bne @- + 811 + 812 ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) + 813 588E A0 01 ldy #1 + 814 5890 8C 2C 44 sty TankShape+1 + 815 5893 8C 2F 44 sty TankShape+4 + 816 5896 C8 iny + 817 5897 8C 2D 44 sty TankShape+2 + 818 589A 8C 30 44 sty TankShape+5 + 819 + 820 + 821 589D A9 00 8D E6 48 A9 + mwa #1024 RandBoundaryHigh + 822 58A7 A9 FF 8D 0C 45 mva #$ff LastWeapon + 823 58AC 85 C5 sta HowMuchToFall + 824 58AE A9 01 85 A9 mva #1 color + 825 + 826 58B2 20 FB 58 jsr SetStandardBarrels + 827 58B5 20 48 58 jsr WeaponCleanup + 828 + 829 58B8 A9 4F 85 02 mva #>WeaponFont chbas + 830 + 831 ;parameter for old plot (unPlot) max 5 points + 832 58BC A2 04 ldx #4 + 833 58BE SetunPlots + 834 58BE A9 10 lda #display + 837 58C5 9D 97 44 sta oldplotH,x + 838 58C8 A9 00 lda #0 + 839 58CA 9D A6 44 sta oldply,x + 840 58CD A9 FF lda #$ff + 841 58CF 9D A1 44 sta oldora,x + 842 58D2 CA dex + 843 58D3 10 E9 bpl SetunPlots + 844 + 845 ;setting up P/M graphics + 846 58D5 A9 18 lda #>pmgraph + 847 58D7 85 02 sta pmbase + 848 58D9 A9 03 lda #$03 ; P/M on + 849 58DB 85 02 sta GRACTL + 850 58DD 20 62 75 jsr SetPMWidth + 851 58E0 A9 21 lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 + 852 58E2 85 02 sta GPRIOR + 853 58E4 20 46 75 jsr PMoutofScreen + 854 + 855 ;let the tanks be visible! + 856 58E7 A2 05 ldx #(maxPlayers-1) + 857 58E9 A9 63 lda #99 ; tank is visible + 858 58EB MakeTanksVisible + 859 58EB 9D AF 43 sta eXistenZ,x + 860 58EE CA dex + 861 58EF 10 FA bpl MakeTanksVisible + 862 + 863 58F1 A9 01 8D 14 45 mva #1 CurrentRoundNr ;we start from round 1 + 864 58F6 A9 06 85 9C mva #6 NTSCcounter + 865 + 866 58FA 60 rts + 867 .endp + 868 ;-------------------------------------------------- + 869 58FB .proc SetStandardBarrels + 870 ; set standart barrel length and deactivate Auto Defense + 871 ; for all tanks + 872 ;-------------------------------------------------- + 873 58FB A2 05 ldx #maxPlayers-1 + 874 58FD A9 06 @ lda #StandardBarrel ; standard barrel length + 875 58FF 9D F1 43 sta BarrelLength,x + 876 5902 A9 00 lda #$00 ; deactivate Auto Defense + 877 5904 9D 03 44 sta AutoDefenseFlag,x + 878 5907 CA dex + 879 5908 10 F3 bpl @- + 880 590A 60 rts + 881 .endp + 882 ;---------------------------------------------- + 883 /* .proc RandomizeSequence0 + 884 ldx #0 + 885 @ txa + 886 sta TankSequence,x + 887 inx + 888 cpx #MaxPlayers + 889 bne @- + 890 rts + 891 .endp */ + 891 + 892 ;-------------------------------------------------- + 893 590B .proc RandomizeSequence + 894 ; in: NumberOfPlayers + 895 ; out: TankSequence + 896 ; how: get random number lower than NumberOfPlayers + 897 ; put it in the first slot. + 898 ; get another random number lower than NumberOfPlayers + 899 ; check if was previously saved in first slot + 900 ; if not then save it in second slot + 901 ; repeat untill NumberOfPlayers + 902 + 903 590B A2 00 ldx #0 + 904 590D GetRandomAgain0 + 905 590D AD 1B D4 lda RANDOM + 906 5910 29 07 and #$07 ;NumberOfPlayers < 7 + 907 5912 C5 AE cmp NumberOfPlayers + 908 5914 B0 F7 bcs GetRandomAgain0 + 909 5916 9D 77 43 sta TankSequence,x + 910 ;now first slot is ready, nexts slots are handled + 911 ;in a more complicated way + 912 + 913 5919 GetRandomAgainX + 914 5919 AD 1B D4 lda RANDOM + 915 591C 29 07 and #$07 ;NumberOfPlayers < 7 + 916 591E C5 AE cmp NumberOfPlayers + 917 5920 B0 F7 bcs GetRandomAgainX + 918 + 919 ;now we have to check if the value was not used + 920 ;in previous slots + 921 + 922 5922 86 72 stx temp + 923 5924 A4 72 ldy temp + 924 5926 UsageLoop + 925 5926 D9 77 43 cmp TankSequence,y + 926 5929 F0 EE beq GetRandomAgainX ;apparently we have already used this value + 927 592B 88 dey + 928 592C 10 F8 bpl UsageLoop + 929 + 930 ;well, looks like this value is new! + 931 592E E8 inx + 932 592F 9D 77 43 sta TankSequence,x + 933 + 934 5932 86 72 stx temp + 935 5934 E6 72 A5 72 inc:lda temp ;x+1 + 936 + 937 5938 C5 AE cmp NumberOfPlayers + 938 593A D0 DD bne GetRandomAgainX + 939 593C 60 rts + 940 .endp + 941 ;---------------------------------------------- + 942 593D .proc RandomizeAngle + 943 ; routine returns in A + 944 ; a valid angle for the tank's barrel. + 945 ; X is not changed + 946 ;---------------------------------------------- + 947 + 948 ; lets randomize someting between 0 and 180 + 949 593D AD 1B D4 lda RANDOM + 950 5940 C9 B4 cmp #180 + 951 5942 B0 F9 bcs RandomizeAngle + 952 5944 60 rts + 953 .endp + 954 ;---------------------------------------------- + 955 5945 .proc RandomizeForce + 956 ; routine returns in ForceTable/L/H + 957 ; valid force of shooting for TankNr + 958 ; in X must be TankNr + 959 ; low and high randomize boundary passed as word value + 960 ; RandBoundaryLow + 961 ; RandBoundaryHigh + 962 ;---------------------------------------------- + 963 + 964 5945 AD 1B D4 lda RANDOM + 965 5948 85 74 sta temp2 + 966 594A AD 1B D4 lda RANDOM + 967 594D 29 03 and #%00000011 ;(0..1023) + 968 594F 85 75 sta temp2+1 + 969 + 970 5951 AD E5 48 C5 75 D0 + cpw RandBoundaryLow temp2 + 971 595D F0 02 B0 E4 seq:bcs RandomizeForce + 972 + 973 5961 AD E7 48 C5 75 D0 + cpw RandBoundaryHigh temp2 + 974 596D 90 D6 bcc RandomizeForce + 975 + 976 596F A5 74 lda temp2 + 977 5971 9D D9 43 sta ForceTableL,x + 978 5974 A5 75 lda temp2+1 + 979 5976 9D DF 43 sta ForceTableH,x + 980 + 981 ;--------- + 982 5979 LimitForce + 983 ; in X must be TankNr + 984 ; cuts force to MaxForceTable + 985 5979 BD EB 43 lda MaxForceTableH,x + 986 597C DD DF 43 cmp ForceTableH,x + 987 597F D0 06 bne @+ + 988 5981 BD E5 43 lda MaxForceTableL,x + 989 5984 DD D9 43 cmp ForceTableL,x + 990 5987 B0 0C @ bcs @+ + 991 + 992 5989 BD E5 43 lda MaxForceTableL,x + 993 598C 9D D9 43 sta ForceTableL,x + 994 598F BD EB 43 lda MaxForceTableH,x + 995 5992 9D DF 43 sta ForceTableH,x + 996 @ + 997 5995 60 rts + 998 + 999 .endp + 1000 ;---------------------------------------------- + 1001 5996 .proc Table2Force + 1002 ;---------------------------------------------- + 1003 5996 BD D9 43 lda ForceTableL,x + 1004 5999 85 A4 sta Force + 1005 599B BD DF 43 lda ForceTableH,x + 1006 599E 85 A5 sta Force+1 + 1007 59A0 60 rts + 1008 .endp + 1009 ;---------------------------------------------- + 1010 59A1 .proc MoveBarrelToNewPosition + 1011 ;---------------------------------------------- + 1012 59A1 A9 01 85 AA mva #1 Erase + 1013 59A5 20 48 6B jsr DrawTankNr.BarrelChange + 1014 59A8 A9 00 85 AA mva #0 Erase + 1015 59AC MoveBarrel + 1016 59AC A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1017 59B0 20 2C 6A jsr DrawTankNr + 1018 59B3 20 0F 66 jsr DisplayStatus.displayAngle + 1019 ; ldx TankNr + 1020 59B6 A9 01 85 AA mva #1 Erase + 1021 59BA 20 89 5A jsr WaitOneFrame + 1022 59BD 20 48 6B jsr DrawTankNr.BarrelChange + 1023 59C0 A9 00 85 AA mva #0 Erase + 1024 59C4 A5 D6 lda NewAngle + 1025 59C6 DD C3 48 cmp AngleTable,x + 1026 59C9 F0 0E beq BarrelPositionIsFine + 1027 59CB 90 06 bcc rotateLeft + 1028 59CD rotateRight ; older is lower + 1029 59CD FE C3 48 inc angleTable,x + 1030 59D0 4C AC 59 jmp MoveBarrel + 1031 59D3 rotateLeft ; older is bigger + 1032 59D3 DE C3 48 dec angleTable,x + 1033 59D6 4C AC 59 jmp MoveBarrel + 1034 59D9 BarrelPositionIsFine + 1035 59D9 20 2C 6A jsr DrawTankNr + 1036 59DC 60 rts + 1037 + 1038 .endp + 1039 + 1040 ;---------------------------------------------- + 1041 59DD .proc SortSequence ; + 1042 ;---------------------------------------------- + 1043 ; here we try to get a sequence of tanks for two + 1044 ; purposes: + 1045 ; 1. to make up shooting sequence for the next round (from down to top) + 1046 ; 2. to display game results more nicely (from top to down) + 1047 ; + 1048 ; I think I will go for a stupid bubble sort... + 1049 ; it is easy to test :) + 1050 ; + 1051 ; Results are in ResultsTable, in TankSequence (Sorted Table) we want to + 1052 ; have numbers of tanks from the worst to the best. + 1053 ; in other words, if ResultsTable=(5,4,65,23,3,6) + 1054 ; the TankSequence=(4,1,0,5,3,2) + 1055 ; let's assume initially the TankSequence=(0,1,2,3,4,5) + 1056 + 1057 59DD A2 00 ldx #0 + 1058 59DF SequenceStart + 1059 59DF 8A txa + 1060 59E0 9D 77 43 sta TankSequence,x + 1061 59E3 E8 inx + 1062 59E4 E0 06 cpx #MaxPlayers + 1063 59E6 D0 F7 bne SequenceStart + 1064 + 1065 ; we will need a TempResults (TR) table to fiddle with + 1066 59E8 A2 00 ldx #0 + 1067 59EA movetotemp + 1068 59EA BD BB 43 lda ResultsTable,x + 1069 59ED 9D C1 43 sta TempResults,x + 1070 59F0 E8 inx + 1071 59F1 E4 AE cpx NumberOfPlayers + 1072 59F3 D0 F5 bne movetotemp + 1073 + 1074 ; i=0:sortflag=0 + 1075 ;loop: + 1076 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers + 1077 ; or goto loop: + 1078 ; else + 1079 ; temp=TR(i): tempo=TankSequence(i) + 1080 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) + 1081 ; TR(i+1)=temp: TankSequence(i+1)=tempo + 1082 ; i=i+1 + 1083 ; sortflag=sortflag+1 + 1084 ; go loop: + 1085 ; if sortflag=0 then finished, else repeat... + 1086 ; + 1087 ; or something like this :) + 1088 59F5 A6 AE ldx NumberOfPlayers + 1089 59F7 CA dex + 1090 59F8 86 73 stx temp+1 ; for checking end of the loop only + 1091 + 1092 59FA Bubble + 1093 59FA A2 00 ldx #0 ;i=x + 1094 59FC 86 74 stx temp2 ; sortflag=temp2 + 1095 + 1096 59FE BubbleBobble + 1097 59FE BD C1 43 lda TempResults,x + 1098 5A01 DD C2 43 cmp TempResults+1,x + 1099 5A04 90 31 bcc nextishigher + 1100 5A06 D0 10 bne swapvalues + 1101 5A08 nextisequal + 1102 ; if results are equal, check Direct Hits + 1103 5A08 BC 77 43 ldy TankSequence,x + 1104 5A0B B9 C7 43 lda DirectHits,y + 1105 5A0E BC 78 43 ldy TankSequence+1,x + 1106 5A11 D9 C7 43 cmp DirectHits,y + 1107 ; + 1108 5A14 F0 21 beq nextishigher ; this is to block hangs when 2 equal values meet + 1109 5A16 90 1F bcc nextishigher + 1110 ;here we must swap values + 1111 ;because next is smaller than previous + 1112 5A18 swapvalues + 1113 5A18 85 72 sta temp + 1114 5A1A BD C2 43 lda TempResults+1,x + 1115 5A1D 9D C1 43 sta TempResults,x + 1116 5A20 A5 72 lda temp + 1117 5A22 9D C2 43 sta TempResults+1,x + 1118 ; + 1119 5A25 BD 77 43 lda TankSequence,x + 1120 5A28 85 72 sta temp + 1121 5A2A BD 78 43 lda TankSequence+1,x + 1122 5A2D 9D 77 43 sta TankSequence,x + 1123 5A30 A5 72 lda temp + 1124 5A32 9D 78 43 sta TankSequence+1,x + 1125 5A35 E6 74 inc temp2 + 1126 5A37 nextishigher + 1127 5A37 E8 inx + 1128 5A38 E4 73 cpx temp+1 ;cpx ^NumberOfPlayers-1 + 1129 5A3A D0 C2 bne BubbleBobble + 1130 + 1131 5A3C A5 74 lda temp2 + 1132 + 1133 5A3E D0 BA bne Bubble + 1134 + 1135 5A40 60 rts + 1136 .endp + 1137 ;-------------------------------------------------- + 1138 5A41 .proc SetWallsType + 1139 ;-------------------------------------------------- + 1140 5A41 A9 00 8D 0C 44 mva #0 WallsType + 1141 5A46 AD 47 41 lda OptionsTable+8 + 1142 5A49 C9 04 cmp #4 + 1143 5A4B F0 09 beq SetRandomWalls + 1144 5A4D 4A lsr + 1145 5A4E 6E 0C 44 ror WallsType + 1146 5A51 4A lsr + 1147 5A52 6E 0C 44 ror WallsType + 1148 5A55 60 rts + 1149 5A56 SetRandomWalls + 1150 5A56 AD 1B D4 lda random + 1151 5A59 29 C0 and #%11000000 + 1152 5A5B 8D 0C 44 sta WallsType + 1153 5A5E 60 rts + 1154 .endp + 1155 + 1156 .ENDIF + 236 ;-------------------------------------------------- + 237 + 238 + 239 ;-------------------------------------------------- + 240 5A5F .proc GetKey + 241 ; waits for pressing a key and returns pressed value in A + 242 ; when [ESC] is pressed, escFlag is set + 243 ; result: A=keycode + 244 ;-------------------------------------------------- + 245 5A5F 20 71 5A jsr WaitForKeyRelease + 246 5A62 A9 00 lda #0 + 247 5A64 85 D7 sta escFlag + 248 5A66 A9 FF lda #$ff + 249 5A68 60 rts + 250 .endp + 251 + 252 ;-------------------------------------------------- + 253 5A69 .proc getkeynowait + 254 ;-------------------------------------------------- + 255 5A69 20 71 5A jsr WaitForKeyRelease + 256 5A6C A5 02 lda kbcode + 257 5A6E 29 3F and #$3f ;CTRL and SHIFT ellimination + 258 5A70 60 rts + 259 .endp + 260 + 261 ;-------------------------------------------------- + 262 5A71 .proc WaitForKeyRelease + 263 ;-------------------------------------------------- + 264 5A71 StillWait + 265 5A71 60 rts + 266 .endp + 267 ;-------------------------------------------------- + 268 5A72 .proc IsKeyPressed + 269 ; result: A=0 - yes , A>0 - no + 270 ;-------------------------------------------------- + 271 5A72 A9 01 lda #1 + 272 5A74 60 rts + 273 .endp + 274 ;-------------------------------------------------- + 275 5A75 .proc DemoModeOrKey + 276 ; Waits for the key pressed if at least one human is playing. + 277 ; Otherwise, waits 3 seconds (demo mode). + 278 ;-------------------------------------------------- + 279 ;check demo mode + 280 5A75 A6 AE ldx numberOfPlayers + 281 5A77 CA dex + 282 5A78 checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + 283 5A78 BD 39 41 lda skillTable,x + 284 5A7B F0 09 beq peopleAreHere + 285 5A7D CA dex + 286 5A7E 10 F8 bpl checkForHuman + 287 ; no people, just wait a bit + 288 ;pause 150 + 289 5A80 A0 4B ldy #75 + 290 5A82 20 9D 5A jsr PauseYFrames + 291 5A85 60 rts + 292 5A86 peopleAreHere + 293 5A86 4C 5F 5A jmp getkey ; jsr:rts + 294 .endp + 295 + 296 ;-------------------------------------------------- + 297 5A89 MakeDarkScreen + 298 ;-------------------------------------------------- + 299 ; mva #0 dmactls ; dark screen + 300 ; and wait one frame :) + 301 ;-------------------------------------------------- + 302 5A89 .proc WaitOneFrame + 303 ;-------------------------------------------------- + 304 5A89 wait ; or waitRTC ? +Macro: WAIT [Source: MACRO.ASM] + 3 5A89 AD 12 D0 ?ze LDA $D012 + 4 5A8C C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + 5 5A8E 90 F9 bcc ?ze + 6 5A90 E9 0A sbc #10 ; last lines correction + 7 5A92 CD 12 D0 ?wa cmp $D012 + 8 5A95 90 FB bcc ?wa + 9 5A97 CD 12 D0 ?wf cmp $D012 + 10 5A9A B0 FB bcs ?wf +Source: scorchC64.asm + 305 5A9C 60 rts + 306 .endp + 307 + 308 ;-------------------------------------------------- + 309 5A9D .proc PauseYFrames + 310 ; Y - number of frames to wait (divided by 2) + 311 ; pauses for maximally 510 frames (255 * 2) + 312 ;-------------------------------------------------- + 313 5A9D 20 89 5A @ jsr WaitOneFrame + 314 5AA0 20 89 5A jsr WaitOneFrame + 315 5AA3 88 dey + 316 5AA4 D0 F7 bne @- + 317 5AA6 60 rts + 318 .endp + 319 + 320 ;-------------------------------------------------- + 321 5AA7 .proc ShellDelay + 322 5AA7 AE 76 43 ldx flyDelay + 323 5AAA DelayLoop + 324 5AAA AD 12 D0 lda $d012 + 325 5AAD CD 12 D0 @ cmp $d012 + 326 5AB0 F0 FB beq @- + 327 5AB2 CA dex + 328 5AB3 D0 F5 bne DelayLoop + 329 5AB5 noShellDelay + 330 5AB5 60 rts + 331 .endp + 332 ;-------------------------------------------------- + 333 5AB6 .proc RmtSongSelect + 334 ; starting song line 0-255 to A reg + 335 ;-------------------------------------------------- + 336 5AB6 60 rts + 337 .endp + 338 5AB7 .proc CopyFromRom + 339 5AB7 60 rts + 340 .endp + 341 ;-------------------------------------------------- + 342 5AB8 icl 'C64/interrupts.asm' +Source: interrupts.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 = 0000 DLIinterruptGraph = 0 + 6 ;-------------------------------------------------- + 7 .macro SetDLI + 8 ; SetDLI #WORD + 9 ; Initialises Display List Interrupts + 10 LDY # <:1 + 11 LDX # >:1 + 12 jsr _SetDLIproc + 13 .endm + 14 5AB8 .proc _SetDLIproc + 15 ; LDA #$C0 + 16 ; STY VDSLST + 17 ; STX VDSLST+1 + 18 ; STA NMIEN + 19 5AB8 60 rts + 20 .endp + 21 + 22 .ENDIF + 343 ;---------------------------------------------- + 344 5AB9 icl 'constants.asm' +Source: constants.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ; initial values for some variables + 6 5AB9 initialvaluesStart + 7 5AB9 00 01 02 02 00 01 + I_OptionsTable .by 0,1,2,2,0,1,3,2,0 + 8 5AC2 0A I_RoundsInTheGame .by 10 ;how many rounds in the current game + 9 5AC3 4B I_seppukuVal .by 75 + 10 5AC4 03 I_mountainDeltaH .by 3 + 11 5AC5 FF I_mountainDeltaL .by $ff + 12 ;---------------------------------------------------- + 13 5AC6 I_LineHeader1 + 14 5AC6 03 00 32 2F 35 2E + dta d"# ROUND: " + 15 5ACF I_RoundNrDisplay + 16 5ACF 00 00 00 00 03 FF dta d" #", $ff + 17 = 001C initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes ! + 18 ;=================================================================================== + 19 ;==========================CONSTANT TABLES, do not erase!=========================== + 20 ;=================================================================================== + 21 + 22 5AD5 00 01 03 05 07 mountainsDeltaTableH .by 0,1,3,5,7 + 23 5ADA 1F 7F FF 7F FF mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff + 24 ;------------------------------------------------ + 25 5ADF LevelNameBeginL ; begins of level names + 26 5ADF 00 0A 14 .by NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) + 31 5AEB 00 00 00 .by >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) + 32 5AEE 00 00 00 .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) + 33 ;-------------- + 34 5AF1 TanksWeaponsTableL + 35 5AF1 1E 4E 7E AE DE 0E .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 + 38 ;-------------- + 39 5AFD XtankOffsetGO_L + 40 5AFD 06 38 6A 9C CE 00 .by 6,56,106,156,206,0 + 41 5B03 XtankOffsetGO_H + 42 5B03 00 00 00 00 00 01 .by 0,0,0,0,0,1 + 43 ;-----4x4 texts----- + 44 5B09 LineTop + 45 5B09 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%%)" + 46 ;# - vertical, () * +, % - horizontal + 47 5B17 LineBottom + 48 5B17 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%%+" + 49 5B25 LineEmpty + 50 5B25 03 00 00 00 00 00 + dta d"# #" + 51 5B33 LineHeader2 + 52 5B33 03 00 00 32 25 33 + dta d"# RESULTS #" + 53 5B41 LineGameOver + 54 5B41 03 00 27 21 2D 25 + dta d"# GAME OVER #" + 55 5B4F seppukuText + 56 5B4F 03 00 00 33 25 30 + dta d"# SEPPUKU! #" + 57 5B5D areYouSureText + 58 5B5D 03 00 33 35 32 25 + dta d"# SURE? Y/N #" + 59 5B6B lineClear + 60 5B6B 00 00 00 00 00 00 + dta d" " + 61 + 62 5B79 58 2A 96 CA 7A ED TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed + 63 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order + 64 5B7F 74 C4 24 E4 54 94 TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order + 65 ;----------- + 66 5B85 GradientAddrL + 67 5B85 BC BC 8B .by dliColorsFore, >dliColorsFore, >dliColorsFore2 + 70 5B8B dliColorsFore2 ; colors for NTSC + 71 5B8B 0A .by $0a ; one mountains color + 72 5B8C 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + 73 5B96 3A 1A 1A EA EA D8 + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 + 74 5BA0 dliColorsFore2PAL ; colors for PAL + 75 5BA0 0A .by $0a ; one mountains color + 76 5BA1 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + 77 5BAB 3A 1A 1A EA EA C8 + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 + 78 + 79 ;----------- + 80 5BB5 pmtableL ; addressess of the P/M memory for 6 tanks + 81 5BB5 00 .by <(pmgraph+$400) + 82 5BB6 00 .by <(pmgraph+$500) + 83 5BB7 00 .by <(pmgraph+$600) + 84 5BB8 00 .by <(pmgraph+$700) + 85 5BB9 00 .by <(pmgraph+$300) ; this is a missile background + 86 5BBA 00 .by <(pmgraph+$300) ; this is a missile background + 87 5BBB pmtableH + 88 5BBB 1C .by >(pmgraph+$400) + 89 5BBC 1D .by >(pmgraph+$500) + 90 5BBD 1E .by >(pmgraph+$600) + 91 5BBE 1F .by >(pmgraph+$700) + 92 5BBF 1B .by >(pmgraph+$300) + 93 5BC0 1B .by >(pmgraph+$300) + 94 ;----------- + 95 5BC1 sintable + 96 5BC1 01 .by 1 + 97 5BC2 04 .by 4 + 98 5BC3 08 .by 8 + 99 5BC4 0D .by 13 + 100 5BC5 11 .by 17 + 101 5BC6 16 .by 22 + 102 5BC7 1A .by 26 + 103 5BC8 1F .by 31 + 104 5BC9 23 .by 35 + 105 5BCA 28 .by 40 + 106 5BCB 2C .by 44 + 107 5BCC 30 .by 48 + 108 5BCD 35 .by 53 + 109 5BCE 39 .by 57 + 110 5BCF 3D .by 61 + 111 5BD0 42 .by 66 + 112 5BD1 46 .by 70 + 113 5BD2 4A .by 74 + 114 5BD3 4F .by 79 + 115 5BD4 53 .by 83 + 116 5BD5 57 .by 87 + 117 5BD6 5B .by 91 + 118 5BD7 5F .by 95 + 119 5BD8 64 .by 100 + 120 5BD9 68 .by 104 + 121 5BDA 6C .by 108 + 122 5BDB 70 .by 112 + 123 5BDC 74 .by 116 + 124 5BDD 78 .by 120 + 125 5BDE 7C .by 124 + 126 5BDF 80 .by 128 + 127 5BE0 83 .by 131 + 128 5BE1 87 .by 135 + 129 5BE2 8B .by 139 + 130 5BE3 8F .by 143 + 131 5BE4 92 .by 146 + 132 5BE5 96 .by 150 + 133 5BE6 9A .by 154 + 134 5BE7 9D .by 157 + 135 5BE8 A1 .by 161 + 136 5BE9 A4 .by 164 + 137 5BEA A7 .by 167 + 138 5BEB AB .by 171 + 139 5BEC AE .by 174 + 140 5BED B1 .by 177 + 141 5BEE B5 .by 181 + 142 5BEF B8 .by 184 + 143 5BF0 BB .by 187 + 144 5BF1 BE .by 190 + 145 5BF2 C1 .by 193 + 146 5BF3 C4 .by 196 + 147 5BF4 C6 .by 198 + 148 5BF5 C9 .by 201 + 149 5BF6 CC .by 204 + 150 5BF7 CF .by 207 + 151 5BF8 D1 .by 209 + 152 5BF9 D4 .by 212 + 153 5BFA D6 .by 214 + 154 5BFB D9 .by 217 + 155 5BFC DB .by 219 + 156 5BFD DD .by 221 + 157 5BFE DF .by 223 + 158 5BFF E2 .by 226 + 159 5C00 E4 .by 228 + 160 5C01 E6 .by 230 + 161 5C02 E8 .by 232 + 162 5C03 E9 .by 233 + 163 5C04 EB .by 235 + 164 5C05 ED .by 237 + 165 5C06 EE .by 238 + 166 5C07 F0 .by 240 + 167 5C08 F2 .by 242 + 168 5C09 F3 .by 243 + 169 5C0A F4 .by 244 + 170 5C0B F6 .by 246 + 171 5C0C F7 .by 247 + 172 5C0D F8 .by 248 + 173 5C0E F9 .by 249 + 174 5C0F FA .by 250 + 175 5C10 FB .by 251 + 176 5C11 FC .by 252 + 177 5C12 FC .by 252 + 178 5C13 FD .by 253 + 179 5C14 FE .by 254 + 180 5C15 FE .by 254 + 181 5C16 FF .by 255 + 182 5C17 FF .by 255 + 183 5C18 FF .by 255 + 184 5C19 FF .by 255 + 185 5C1A FF .by 255 + 186 5C1B FF .by 255 ;anti self destruction byte + 187 + 188 ;linetableL + 189 ; :screenheight+1 .by <(display+screenBytes*#) + 190 ;linetableH + 191 ; :screenheight+1 .by >(display+screenBytes*#) + 192 ;---------------------------- + 193 5C1C bittable + 194 5C1C 80 40 20 10 08 04 + .by $80,$40,$20,$10,$08,$04,$02,$01 + 195 5C24 bittable2 + 196 5C24 7F BF DF EF F7 FB + .by $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe + 197 ;---------------------------- + 198 5C2C disktance ;tanks distance + 199 5C2C 00 00 .by 0,0 + 200 5C2E 6A .by screenwidth/3 + 201 5C2F 50 .by screenwidth/4 + 202 5C30 40 .by screenwidth/5 + 203 5C31 35 .by screenwidth/6 + 204 5C32 2D .by screenwidth/7 + 205 ;max number of players=6 + 206 + 207 ; this table is for deciding where a tank should slide + 208 ; accordingly to what is below the tank + 209 ; values in table mean that tank is moving to the left + 210 5C33 SlideLeftTable + 211 5C33 01 .BY %00000001 + 212 5C34 02 .BY %00000010 + 213 5C35 03 .BY %00000011 + 214 5C36 04 .BY %00000100 + 215 5C37 05 .BY %00000101 + 216 5C38 06 .BY %00000110 + 217 5C39 07 .BY %00000111 + 218 ; .BY %00001100 + 219 = 0007 SlideLeftTableLen = *-SlideLeftTable + 220 ;------------------------------------------------- + 221 5C3A TanksNamesDefault + 222 5C3A 11 73 74 0E 34 61 + dta d"1st.Tank" + 223 5C42 12 6E 64 0E 34 61 + dta d"2nd.Tank" + 224 5C4A 13 72 64 0E 34 61 + dta d"3rd.Tank" + 225 5C52 14 74 68 0E 34 61 + dta d"4th.Tank" + 226 5C5A 15 74 68 0E 34 61 + dta d"5th.Tank" + 227 5C62 16 74 68 0E 34 61 + dta d"6th.Tank" + 228 ;------------------------------------------------- + 229 5C6A 20 TankShapesTable .BYTE char_tank1___________ + 230 5C6B 24 .BYTE char_tank2___________ + 231 5C6C 2C .BYTE char_tank3___________ + 232 5C6D 28 .BYTE char_tank4___________ + 233 ;------------------------------------------------- + 234 5C6E WeaponPriceH ; weapons prices (tables with prices of weapons) + 235 5C6E 00 .by >price_Baby_Missile___ + 236 5C6F 00 .by >price_Missile________ + 237 5C70 00 .by >price_Baby_Nuke______ + 238 5C71 00 .by >price_Nuke___________ + 239 5C72 00 .by >price_LeapFrog_______ + 240 5C73 01 .by >price_Funky_Bomb_____ + 241 5C74 01 .by >price_MIRV___________ + 242 5C75 01 .by >price_Death_s_Head___ + 243 5C76 00 .by >price_Napalm_________ + 244 5C77 00 .by >price_Hot_Napalm_____ + 245 5C78 00 .by >price_Tracer_________ + 246 5C79 01 .by >price_Smoke_Tracer___ + 247 5C7A 00 .by >price_Baby_Roller____ + 248 5C7B 00 .by >price_Roller_________ + 249 5C7C 01 .by >price_Heavy_Roller___ + 250 5C7D 00 .by >price_Riot_Charge____ + 251 5C7E 00 .by >price_Riot_Blast_____ + 252 5C7F 01 .by >price_Riot_Bomb______ + 253 5C80 01 .by >price_Heavy_Riot_Bomb + 254 5C81 00 .by >price_Baby_Digger____ + 255 5C82 00 .by >price_Digger_________ + 256 5C83 00 .by >price_Heavy_Digger___ + 257 5C84 00 .by >price_Baby_Sandhog___ + 258 5C85 00 .by >price_Sandhog________ + 259 5C86 00 .by >price_Heavy_Sandhog__ + 260 5C87 00 .by >price_Dirt_Clod______ + 261 5C88 00 .by >price_Dirt_Ball______ + 262 5C89 00 .by >price_Ton_of_Dirt____ + 263 5C8A 01 .by >price_Liquid_Dirt____ + 264 5C8B 01 .by >price_Dirt_Charge____ + 265 5C8C 00 .by >price_Buy_me_________ + 266 5C8D 01 .by >price_Laser__________ + 267 5C8E 00 .by >price_White_Flag_____ + 268 5C8F 01 .by >price_Battery________ + 269 5C90 01 .by >price_Hovercraft_____ + 270 5C91 00 .by >price_Parachute______ + 271 5C92 03 .by >price_StrongParachute + 272 5C93 02 .by >price_Mag_Deflector__ + 273 5C94 00 .by >price_Shield_________ + 274 5C95 02 .by >price_Heavy_Shield___ + 275 5C96 04 .by >price_Force_Shield___ + 276 5C97 02 .by >price_Bouncy_Castle__ + 277 5C98 08 .by >price_Long_Barrel____ + 278 5C99 03 .by >price_Nuclear_Winter_ + 279 5C9A 01 .by >price_Lazy_Boy_______ + 280 5C9B 02 .by >price_Lazy_Darwin____ + 281 5C9C 00 .by >price_Auto_Defense___ + 282 5C9D 00 .by >price_Spy_Hard_______ + 283 5C9E WeaponPriceL + 284 5C9E 00 .by 0 + 5 + 6 = 0000 WeaponsListDL = 0 + 7 = 0000 NamesOfLevels = 0 + 8 ;---------------------------------------- + 9 ; this module contains routines used in text mode + 10 ; like shop and start-up options + 11 ;---------------------------------------- + 12 + 13 ;-------------------------------------------------- + 14 62E5 .proc Options + 15 ;-------------------------------------------------- + 16 ; start-up screen - options, etc. + 17 ; this function returns: + 18 ; - number of players (NumberOfPlayers) + 19 ; - money each player has on the beginning of the game (moneyL i moneyH) + 20 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight + 21 + 22 + 23 62E5 A2 08 ldx #$08 + 24 62E7 BD F1 62 @ lda Autoplay_OptionsTable,x + 25 62EA 9D 3F 41 sta OptionsTable,x + 26 62ED CA dex + 27 62EE 10 F7 bpl @- + 28 + 29 62F0 60 rts + 30 + 31 62F1 04 04 02 02 04 01 + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 + 32 + 33 .endp + 34 + 35 62FA .proc SelectNextGradient + 36 62FA AD 75 43 lda OptionsY ; if "Wind" option selected + 37 62FD C9 03 cmp #$03 + 38 62FF D0 07 bne NotWind + 39 6301 A5 5C lda WindChangeInRound ; wind change after each turn (not round only) flag + 40 6303 49 1F eor #$1f ; '?' character + 41 6305 85 5C sta WindChangeInRound + 42 6307 60 rts + 43 6308 NotWind + 44 6308 A4 59 ldy GradientNr + 45 630A C8 iny + 46 630B C0 03 cpy #$03 + 47 630D D0 02 bne NoGradientLoop + 48 630F A0 00 ldy #$00 + 49 6311 NoGradientLoop + 50 6311 84 59 sty GradientNr + 51 6313 B9 85 5B lda GradientAddrL,y + 52 6316 85 5A sta GradientColors + 53 6318 B9 88 5B lda GradientAddrH,y + 54 631B 85 5B sta GradientColors+1 + 55 631D 60 rts + 56 .endp + 57 + 58 ; -------------------------------------- + 59 ; Sets the appropriate variables based on the options table + 60 ; + 61 631E .proc SetVariablesFromOptions + 62 ;first option + 63 631E AC 3F 41 ldy OptionsTable + 64 6321 C8 iny + 65 6322 C8 iny + 66 6323 84 AE sty NumberOfPlayers ;1=1 player (but minimum is 2) + 67 + 68 ;second option (cash) + 69 + 70 + 71 6325 AC 40 41 ldy OptionsTable+1 + 72 6328 A2 00 ldx #0 + 73 @ + 74 632A B9 D1 A2 lda CashOptionL,y + 75 632D 9D 84 43 sta moneyL,x + 76 6330 B9 D6 A2 lda CashOptionH,y + 77 6333 9D 7E 43 sta moneyH,x + 78 6336 E8 inx + 79 6337 E4 AE cpx NumberOfPlayers + 80 6339 D0 EF bne @- + 81 + 82 ;third option (gravity) + 83 633B AC 41 41 ldy OptionsTable+2 + 84 633E B9 DB A2 lda GravityTable,y + 85 6341 85 E0 sta gravity + 86 + 87 ;fourth option (wind) + 88 6343 AC 42 41 ldy OptionsTable+3 + 89 6346 B9 E0 A2 lda MaxWindTable,y + 90 6349 8D 0A 44 sta MaxWind + 91 + 92 ;fifth option (no of rounds) + 93 634C AC 43 41 ldy OptionsTable+4 + 94 634F B9 E5 A2 lda RoundsTable,y + 95 6352 8D 48 41 sta RoundsInTheGame + 96 + 97 ;6th option (shell speed) + 98 6355 AC 44 41 ldy OptionsTable+5 + 99 6358 B9 F4 A2 lda flyDelayTable,y + 100 635B 8D 76 43 sta flyDelay + 101 + 102 ;7th option (Airstrike after how many missess) + 103 635E AC 45 41 ldy OptionsTable+6 + 104 6361 B9 F9 A2 lda seppukuTable,y + 105 6364 8D 49 41 sta seppukuVal + 106 + 107 ;8th option (how aggressive are mountains) + 108 6367 AC 46 41 ldy OptionsTable+7 + 109 636A B9 D5 5A lda mountainsDeltaTableH,y + 110 636D 8D 4A 41 sta mountainDeltaH + 111 6370 B9 DA 5A lda mountainsDeltaTableL,y + 112 6373 8D 4B 41 sta mountainDeltaL + 113 + 114 + 115 6376 60 rts + 116 .endp + 117 + 118 ;------------------------------------------- + 119 ; call of the purchase (and activate) screens for each tank + 120 6377 .proc CallPurchaseForEveryTank + 121 + 122 6377 A9 00 85 6C mva #0 TankNr + 123 637B 85 E4 sta isInventory + 124 @ + 125 637D A6 6C ldx TankNr + 126 637F BD 39 41 lda SkillTable,x + 127 6382 F0 06 beq ManualPurchase + 128 6384 20 A3 94 jsr PurchaseAI ; remember to make ActivateAI :) !!! + 129 6387 4C A3 63 jmp AfterManualPurchase + 130 638A ManualPurchase + 131 638A BD 25 44 lda JoyNumber,x + 132 638D 85 5D sta JoystickNumber ; set joystick port for player + 133 638F A9 00 85 E4 mva #0 isInventory + 134 6393 20 C0 63 jsr Purchase ; purchase weapons + 135 6396 24 D7 bit escFlag + 136 6398 10 01 60 spl:rts + 137 639B 20 AC 63 jsr DefensivesActivate ; activate weapons + 138 639E 24 D7 bit escFlag + 139 63A0 10 01 60 spl:rts + 140 63A3 AfterManualPurchase + 141 63A3 E6 6C A5 6C inc:lda TankNr + 142 63A7 C5 AE cmp NumberOfPlayers + 143 63A9 D0 D2 bne @- + 144 63AB 60 rts + 145 .endp + 146 ;-------------------------------------------------- + 147 63AC .proc DefensivesActivate + 148 ;-------------------------------------------------- + 149 ; This proc call Inventory and set Defensives activation first + 150 + 151 63AC A9 ED 85 00 A9 4C + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + 152 63B4 A9 FF 85 E4 mva #$ff IsInventory + 153 63B8 A9 80 8D 0D 45 mva #%10000000 WhichList + 154 ; offensive weapon - 0, defensive - %10000000 + 155 63BD 4C C5 63 jmp Purchase.GoToActivation + 156 .endp + 157 + 158 + 159 ;-------------------------------------------------- + 160 63C0 .proc Purchase ; + 161 ;-------------------------------------------------- + 162 ; In tanknr there is a number of the tank (player) + 163 ; that is buying weapons now (from 0). + 164 ; Rest of the data is taken from appropriate tables + 165 ; and during the purchase these tables are modified. + 166 + 167 + 168 ; we are clearing list of the weapons + 169 63C0 A9 00 8D 0D 45 mva #$00 WhichList + 170 ; offensive weapon - 0, deffensive - %10000000 + 171 63C5 GoToActivation + 172 63C5 60 rts + 173 + 174 .endp + 175 + 176 ; ----------------------------------------------------- + 177 63C6 .proc EnterPlayerNames + 178 ;entering names of players + 179 + 180 63C6 A9 00 85 6C mva #0 TankNr + 181 63CA 85 02 sta COLBAKS ; set color of background + 182 63CC AA @ tax + 183 63CD BD 7F 5B lda TankStatusColoursTable,x + 184 63D0 85 02 sta COLOR2 ; set color of player name line + 185 63D2 20 E6 63 jsr EnterPlayerName + 186 63D5 24 D7 bit escFlag + 187 63D7 10 01 60 spl:rts + 188 63DA 20 46 A2 jsr CheckTankCheat + 189 63DD E6 6C inc TankNr + 190 63DF A5 6C lda TankNr + 191 63E1 C5 AE cmp NumberOfPlayers + 192 63E3 D0 E7 bne @- + 193 63E5 60 rts + 194 .endp + 195 ; ----------------------------------------------------- + 196 63E6 .proc EnterPlayerName + 197 ; in: TankNr + 198 ; Out: TanksNames, SkillTable + 199 + 200 ; this little thing is for choosing Player's skill (if computer) + 201 ; and entering his name + 202 ; If no name entered, there should be name "1st Tank", etc. + 203 ; Default tanks names are in table TanksNamesDefault + 204 ; ----------------------------------------------------- + 205 + 206 ; + 207 + 208 63E6 EndOfNick + 209 ; storing name of the player and its level + 210 + 211 ; level of the computer opponent goes to + 212 ; the table of levels (difficulties) + 213 63E6 A6 6C ldx tanknr + 214 63E8 A9 06 lda #6 ; Spoiler + 215 63EA 85 E5 sta DifficultyLevel + 216 63EC 9D 39 41 sta skilltable,x + 217 63EF F0 05 beq NotRobot + 218 63F1 A9 03 lda #$03 ; shape for robotanks + 219 63F3 9D 2B 44 sta TankShape,x + 220 63F6 NotRobot + 221 ; storing name of the tank in the right space + 222 ; (without cursor!) + 223 63F6 A0 00 ldy #$00 + 224 63F8 8A txa ; ldx TankNr + 225 63F9 0A asl + 226 63FA 0A asl + 227 63FB 0A asl ; 8 chars per name + 228 63FC AA tax ; in X where to put new name + 229 + 230 63FD A9 16 85 9E mva #sfx_next_player sfx_effect + 231 + 232 + 233 ; check if all chars are empty (" ") + 234 6401 A0 07 ldy #7 + 235 6403 A9 00 lda #0 + 236 6405 09 00 @ ora #0 ; NameAdr,y + 237 6407 29 7F and #$7F ; remove inverse (Cursor) + 238 6409 88 dey + 239 640A 10 F9 bpl @- + 240 640C A8 tay + 241 640D F0 10 beq MakeDefaultName + 242 + 243 640F A0 00 ldy #0 + 244 6411 nextchar04 + 245 6411 A9 00 lda #0 ; NameAdr,y + 246 6413 29 7F and #$7f ; remove inverse (Cursor) + 247 6415 9D 09 41 sta tanksnames,x + 248 6418 E8 inx + 249 6419 C8 iny + 250 641A C0 08 cpy #$08 + 251 641C D0 F3 bne nextchar04 + 252 641E 60 rts + 253 641F MakeDefaultName + 254 641F nextchar05 + 255 641F BD 3A 5C lda tanksnamesDefault,x + 256 6422 9D 09 41 sta tanksnames,x + 257 6425 E8 inx + 258 6426 C8 iny + 259 6427 C0 08 cpy #$08 + 260 6429 D0 F4 bne nextchar05 + 261 642B 60 rts + 262 .endp + 263 ;-------------------------------------------------- + 264 642C .proc displaydec5 ;decimal (word), displayposition (word) + 265 ;-------------------------------------------------- + 266 ; displays decimal number as in parameters (in text mode) + 267 ; leading zeroes are removed + 268 ; the range is (00000..65565 - two bytes) + 269 + 270 642C A0 04 ldy #4 ; there will be 5 digits + 271 642E NextDigit + 272 642E A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times + 273 6430 A9 00 lda #$00 + 274 6432 Rotate000 + 275 6432 aslw decimal +Macro: ASLW [Source: MACRO.ASM] + 1 6432 06 AC ASL DECIMAL + 2 6434 26 AD ROL DECIMAL+1 +Source: textproc.asm + 276 6436 2A rol ; scroll dividee + 277 ; (as highest byte - additional - byte is A) + 278 6437 C9 0A cmp #10 ; divider + 279 6439 90 04 bcc TooLittle000 ; if A is smaller than divider + 280 ; there is nothing to substract + 281 643B E9 0A sbc #10 ; divider + 282 643D E6 AC inc decimal ; lowest bit set to 1 + 283 ; because it is 0 and this is the fastest way + 284 643F CA TooLittle000 dex + 285 6440 D0 F0 bne Rotate000 ; and Rotate 16 times, Result will be in decimal + 286 6442 AA tax ; and the rest in A + 287 ; (and it goes to X because + 288 ; it is our decimal digit) + 289 6443 BD AA 60 lda digits,x + 290 6446 99 0F 45 sta decimalresult,y + 291 6449 88 dey + 292 644A 10 E2 bpl NextDigit ; Result again /10 and we have next digit + 293 + 294 ;rightnumber + 295 ; displaying without leading zeroes (if zeroes exist then display space at this position) + 296 644C A0 00 ldy #0 + 297 644E A2 00 ldx #0 ; digit flag (cut leading zeroes) + 298 6450 displayloop + 299 6450 B9 0F 45 lda decimalresult,y + 300 6453 E0 00 cpx #0 + 301 6455 D0 0D bne noleading0 + 302 6457 C0 04 cpy #4 + 303 6459 F0 09 beq noleading0 ; if 00000 - last 0 must stay + 304 645B CD AA 60 cmp zero + 305 645E D0 04 bne noleading0 + 306 6460 A9 00 lda #space + 307 6462 F0 01 beq displaychar ; space = 0 ! + 308 6464 noleading0 + 309 6464 E8 inx ; set flag (no leading zeroes to cut) + 310 6465 displaychar + 311 6465 91 76 sta (displayposition),y + 312 6467 nexdigit + 313 6467 C8 iny + 314 6468 C0 05 cpy #5 + 315 646A D0 E4 bne displayloop + 316 + 317 646C 60 rts + 318 .endp + 319 ;-------------------------------------------------- + 320 646D .proc displaybyte ;decimal (byte), displayposition (word) + 321 ;-------------------------------------------------- + 322 ; displays decimal number as in parameters (in text mode) + 323 ; leading zeores are removed + 324 ; the range is (00..99 - one byte) + 325 + 326 646D A0 01 ldy #1 ; there will be 2 digits + 327 646F NextDigit2 + 328 646F A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times + 329 6471 A9 00 lda #$00 + 330 6473 Rotate001 + 331 6473 06 AC asl decimal + 332 6475 2A rol ; scroll dividee + 333 ; (as highest byte - additional - byte is A) + 334 6476 C9 0A cmp #10 ; divider + 335 6478 90 04 bcc TooLittle001 ; if A is smaller than divider + 336 ; there is nothing to substract + 337 647A E9 0A sbc #10 ; divider + 338 647C E6 AC inc decimal ; because it is 0 and this is the fastest way + 339 647E CA TooLittle001 dex + 340 647F D0 F2 bne Rotate001 ; and Rotate 8 times, Result will be in decimal + 341 6481 AA tax ; and the rest in A + 342 ; (and it goes to X because + 343 ; it is our decimal digit) + 344 6482 BD AA 60 lda digits,x + 345 6485 99 0F 45 sta decimalresult,y + 346 6488 88 dey + 347 6489 10 E4 bpl NextDigit2 ; Result again /10 and we have next digit + 348 + 349 ; now cut leading zeroes (02 goes 2) + 350 648B AD 0F 45 lda decimalresult + 351 648E CD AA 60 cmp zero + 352 6491 D0 05 bne decimalend1 + 353 6493 A9 00 lda #space + 354 6495 8D 0F 45 sta decimalresult + 355 + 356 6498 decimalend1 + 357 ; displaying + 358 6498 A0 01 ldy #1 + 359 649A displayloop1 + 360 649A B9 0F 45 lda decimalresult,y + 361 649D 91 76 sta (displayposition),y + 362 649F 88 dey + 363 64A0 10 F8 bpl displayloop1 + 364 + 365 64A2 60 rts + 366 .endp + 367 + 368 ;-------------------------------- + 369 64A3 .proc DisplayResults ; + 370 ;displays results of the round + 371 ;using 4x4 font + 372 + 373 + 374 64A3 A9 FF 85 DB mva #$ff plot4x4color + 375 + 376 ;centering the result screen + 377 64A7 A9 44 85 B2 mva #((ScreenHeight/2)-(8*4)) ResultY + 378 + 379 + 380 ;upper frame + 381 64AB A5 B2 85 D8 mva ResultY LineYdraw + 382 64AF 20 E8 65 jsr TL4x4_top + 383 + 384 64B2 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 385 + 386 ;Header1 + 387 ;Displays round number + 388 64B9 AD 14 45 lda CurrentRoundNr + 389 64BC CD 48 41 cmp RoundsInTheGame + 390 64BF F0 26 beq GameOver4x4 + 391 + 392 64C1 85 AC sta decimal + 393 64C3 A9 55 85 76 A9 41 + mwa #RoundNrDisplay displayposition + 394 64CB 20 6D 64 jsr displaybyte ;decimal (byte), displayposition (word) + 395 + 396 64CE A9 4C 85 B3 A9 41 + mwa #LineHeader1 LineAddress4x4 + 397 64D6 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 398 64DE A5 B2 85 D8 mva ResultY LineYdraw + 399 64E2 20 6E 73 jsr TypeLine4x4 + 400 64E5 F0 1E beq @+ ;unconditional jump, because TypeLine4x4 ends with beq + 401 + 402 64E7 GameOver4x4 + 403 64E7 RmtSong song_round_over +Macro: RMTSONG [Source: scorchC64.asm] + 1 64E7 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 +Source: textproc.asm + 404 64E9 A9 41 85 B3 A9 5B + mwa #LineGameOver LineAddress4x4 + 405 64F1 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 406 64F9 A5 B2 85 D8 mva ResultY LineYdraw + 407 64FD 20 6E 73 jsr TypeLine4x4 + 408 6500 A9 01 8D 7D 43 mva #1 GameIsOver + 409 + 410 @ + 411 6505 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 412 + 413 ;Empty line + 414 650C A5 B2 85 D8 mva ResultY LineYdraw + 415 6510 20 FB 65 jsr TL4x4_empty + 416 + 417 6513 A5 B2 18 69 02 85 + adb ResultY #2 ;next line + 418 + 419 + 420 ;Header2 + 421 651A A9 33 85 B3 A9 5B + mwa #LineHeader2 LineAddress4x4 + 422 6522 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 423 652A A5 B2 85 D8 mva ResultY LineYdraw + 424 652E 20 6E 73 jsr TypeLine4x4 + 425 + 426 6531 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 427 + 428 ;Empty line + 429 6538 A5 B2 85 D8 mva ResultY LineYdraw + 430 653C 20 FB 65 jsr TL4x4_empty + 431 + 432 653F A5 B2 38 E9 02 85 + sbb ResultY #2 ;next line (was empty) + 433 + 434 6546 A6 AE ldx NumberOfPlayers ;we start from the highest (best) tank + 435 6548 CA dex ;and it is the last one + 436 6549 8E EA 48 stx ResultOfTankNr ;in TankSequence table + 437 + 438 654C A9 09 85 78 A9 41 + mwa #TanksNames tempXROLLER + 439 + 440 6554 ResultOfTheNextPlayer + 441 6554 AE EA 48 ldx ResultOfTankNr ;we are after a round, so we can use TankNr + 442 6557 BD 77 43 lda TankSequence,x ;and we keep here real number if the tank + 443 655A 85 6C sta TankNr ;for which we are displaying results + 444 + 445 + 446 + 447 + 448 655C A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 449 + 450 ;there are at least 2 players, so we can safely + 451 ;start displaying the result + 452 + 453 6563 A9 03 lda #3 ;it means | + 454 6565 8D 5A 41 sta ResultLineBuffer + 455 + 456 6568 A4 6C ldy TankNr + 457 656A B9 BB 43 lda ResultsTable,y + 458 656D 85 AC sta decimal + 459 656F A9 00 85 AD mva #0 decimal+1 + 460 6573 A9 62 85 76 A9 41 + mwa #(ResultLineBuffer+8) displayposition + 461 657B 20 2C 64 jsr displaydec5 ;decimal (byte), displayposition (word) + 462 + 463 ; overwrite the second digit of the points (max 255) + 464 ;it means ":" + 465 657E A9 1A 8D 63 41 mva #26 ResultLineBuffer+9 + 466 + 467 6583 A2 00 ldx #0 + 468 6585 A5 6C lda TankNr + 469 6587 0A asl + 470 6588 0A asl ; times 8, because it is lengtgh + 471 6589 0A asl ; of the names of the tanks + 472 658A A8 tay + 473 + 474 658B TankNameCopyLoop + 475 658B B1 78 lda (tempXROLLER),y ;XROLLER is not working now + 476 658D 29 3F and #$3f ;always CAPITAL letters + 477 658F E8 inx + 478 6590 9D 5A 41 sta ResultLineBuffer,x + 479 6593 C8 iny + 480 6594 E0 08 cpx #8 ; end of name + 481 6596 D0 F3 bne TankNameCopyLoop + 482 ; last letter of tank name overwrites first digit of the points (max 255) + 483 + 484 + 485 ;just after the digits + 486 ;it means | + 487 6598 A9 03 8D 67 41 mva #$3 ResultLineBuffer+13 + 488 + 489 ;result line display + 490 659D A9 5A 85 B3 A9 41 + mwa #ResultLineBuffer LineAddress4x4 + 491 65A5 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 492 65AD A5 B2 85 D8 mva ResultY LineYdraw + 493 65B1 20 6E 73 jsr TypeLine4x4 + 494 + 495 65B4 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 496 + 497 ;Empty line + 498 65BB A5 B2 85 D8 mva ResultY LineYdraw + 499 65BF 20 FB 65 jsr TL4x4_empty + 500 + 501 65C2 CE EA 48 dec ResultOfTankNr + 502 65C5 30 0A bmi FinishResultDisplay + 503 + 504 65C7 A5 B2 38 E9 02 85 + sbb ResultY #2 ;distance between lines is smaller + 505 + 506 65CE 4C 54 65 jmp ResultOfTheNextPlayer + 507 + 508 65D1 FinishResultDisplay + 509 65D1 A5 B2 85 D8 mva ResultY LineYdraw + 510 ;jmp TL4x4_bottom ; just go + 511 .endp + 512 + 513 65D5 .proc TL4x4_bottom + 514 ;bottom of the frame + 515 65D5 A9 17 85 B3 A9 5B + mwa #LineBottom LineAddress4x4 + 516 65DD A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 517 65E5 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 518 .endp + 519 + 520 65E8 .proc TL4x4_top + 521 ;bottom of the frame + 522 65E8 A9 09 85 B3 A9 5B + mwa #LineTop LineAddress4x4 + 523 65F0 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 524 65F8 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 525 .endp + 526 + 527 65FB .proc TL4x4_empty + 528 ;empty frame + 529 65FB A9 25 85 B3 A9 5B + mwa #LineEmpty LineAddress4x4 + 530 6603 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 531 660B 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 532 .endp + 533 + 534 ;-------------------------------------------------- + 535 660E .proc GameOverScreen + 536 ;-------------------------------------------------- + 537 + 538 660E 60 rts + 539 .endp + 540 ;------------------------------------------------- + 541 660F .proc PutTankNameOnScreen + 542 ;------------------------------------------------- + 543 + 544 .endp + 545 ;------------------------------------------------- + 546 660F .proc DisplayStatus + 547 ;------------------------------------------------- + 548 660F DisplayAngle + 549 660F A6 6C ldx TankNr + 550 6611 60 rts + 551 .endp + 552 ;------------------------------------------------- + 553 + 554 + 555 .endif + 347 ;---------------------------------------------- + 348 6612 icl 'grafproc.asm' +Source: grafproc.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 + 6 ;-------------------------------------------------- + 7 6612 .proc draw ;;fuxxing good draw :) + 8 ; xdraw,ydraw (word) - coordinates of first point + 9 ; xbyte,ybyte (word) - coordinates of last point + 10 ;-------------------------------------------------- + 11 ;creditz to Dr Jankowski / MIM U.W. + 12 ; (xi,yi)-----(xk,yk) + 13 ;20 DX=XK-XI + 14 ;30 DY=YK-YI + 15 ;40 DP=2*DY + 16 ;50 DD=2*(DY-DX) + 17 ;60 DI=2*DY-DX + 18 ;70 REPEAT + 19 ;80 IF DI>=0 + 20 ;90 DI=DI+DD + 21 ;100 YI=YI+1 + 22 ;110 ELSE + 23 ;120 DI=DI+DP + 24 ;130 ENDIF + 25 ;140 plot XI,YI + 26 ;150 XI=XI+1 + 27 ;160 UNTIL XI=XK + 28 + 29 + 30 ; begin: xdraw,ydraw - end: xbyte,ybyte + 31 ; let's store starting coordinates + 32 ; will be needed, because everything is calculated relatively + 33 6612 A9 FF 85 E1 85 E2 mwa #$ffff LineLength + 34 6618 A5 61 85 7A A5 62 + mwa xdraw xtempDRAW + 35 6620 A5 63 85 7C A5 64 + mwa ydraw ytempDRAW + 36 + 37 ; if line goes our of the screen we are not drawing it, but... + 38 + 39 6628 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 40 6632 B0 14 bcs DrawOutOfTheScreen + 41 6634 A5 66 C9 01 D0 04 + cpw xbyte #screenwidth + 42 663E B0 08 bcs DrawOutOfTheScreen + 43 ;cpw ydraw #screenheight + 44 ;bcs DrawOutOfTheScreen + 45 ;cpw ybyte #screenheight + 46 ;bcc DrawOnTheScreen + 47 6640 A5 64 lda ydraw+1 + 48 6642 30 04 bmi DrawOutOfTheScreen + 49 6644 A5 68 lda ybyte+1 + 50 6646 10 01 bpl DrawOnTheScreen + 51 6648 DrawOutOfTheScreen + 52 ;jsr DrawJumpPad + 53 6648 60 rts + 54 6649 DrawOnTheScreen + 55 ; constant parameters + 56 ; XI=0 ,YI=0 + 57 6649 A9 00 lda #0 + 58 664B 85 81 sta XI + 59 664D 85 82 sta XI+1 + 60 664F 85 84 sta YI + 61 6651 85 85 sta YI+1 + 62 + 63 ; setting the direction controll bits + 64 6653 A5 64 C5 68 D0 04 + cpw ydraw ybyte + 65 665D 90 14 bcc LineDown + 66 ; here one line up + 67 ; we are setting bit 0 + 68 665F A9 01 85 DF mva #1 HowToDraw ;here we can because it's first operation + 69 ; we are subctracting Yend from Ybegin (reverse order) + 70 ; DY=YI-YK + 71 6663 38 A5 63 E5 67 85 + sbw ydraw ybyte DY + 72 6670 4C 84 66 jmp CheckDirectionX + 73 6673 LineDown + 74 ; one line down here + 75 ; we are setting bit 0 + 76 6673 A9 00 85 DF mva #0 HowToDraw ;here we can because it's first operation + 77 ; substract Ybegin from Yend (normal order) + 78 ; DY=YK-YI + 79 6677 38 A5 67 E5 63 85 + sbw ybyte ydraw DY + 80 6684 CheckDirectionX + 81 6684 A5 62 C5 66 D0 04 + cpw xdraw xbyte + 82 668E 90 16 bcc LineRight + 83 ; here goes line to the left + 84 ; we set bit 1 + 85 + 86 6690 A5 DF lda HowToDraw + 87 6692 09 02 ora #$02 + 88 6694 85 DF sta HowToDraw + 89 ; substract Xend from Xbegin (reverse) + 90 ; DX=XI-XK + 91 6696 38 A5 61 E5 65 85 + sbw xdraw xbyte DX + 92 66A3 4C B3 66 jmp CheckDirectionFactor + 93 66A6 LineRight + 94 ; here goes one line to the right + 95 ; we clear bit 0 + 96 ; we can do nothing because the bit is cleared! + 97 + 98 ;lda HowToDraw + 99 ;and #$FD + 100 ;sta HowToDraw + 101 + 102 ; substracting Xbegin from Xend (normal way) + 103 ; DX=XK-XI + 104 66A6 38 A5 65 E5 61 85 + sbw xbyte xdraw DX + 105 66B3 CheckDirectionFactor + 106 ; here we check Direction Factor + 107 ; I do not know if we are using proper English word + 108 ; but the meaning is 'a' in y=ax+b + 109 + 110 ; lda DX + 111 ; we already have DX in A + 112 66B3 A5 8C C5 8E D0 04 + cpw DX DY + 113 + 114 66BD 90 0B bcc SwapXY + 115 ; 'a' factor is fire, so we copy parameters + 116 ; XK=DX + 117 66BF A5 8B 85 87 A5 8C + mwa DX XK + 118 ; and clearing bit 2 + 119 ; and bit 2 clear + 120 ; (is not needed because already cleared) + 121 ;lda HowToDraw + 122 ;and #$FB + 123 ;sta HowToDraw + 124 66C7 4C E8 66 jmp LineParametersReady + 125 66CA SwapXY + 126 ; not this half of a quarter! - parameters must be swapped + 127 ; XK=DY + 128 ; DY=DX + 129 ; DX=XK - because DY is there so DY and DX are swapped + 130 ; YK ... not used + 131 66CA A5 8D 85 87 A5 8E + mwa DY XK + 132 66D2 A5 8B 85 8D A5 8C + mwa DX DY + 133 66DA A5 87 85 8B A5 88 + mwa XK DX + 134 + 135 ; and let's set bit 2 + 136 66E2 A5 DF lda HowToDraw + 137 66E4 09 04 ora #$04 + 138 66E6 85 DF sta HowToDraw + 139 66E8 LineParametersReady + 140 ; let's check if length is not zero + 141 66E8 A5 8B lda DX + 142 66EA 05 8C ora DX+1 + 143 66EC 05 8D ora DY + 144 66EE 05 8E ora DY+1 + 145 66F0 D0 07 bne NotOnePoint + 146 ; length=0 + 147 66F2 85 E1 sta LineLength + 148 66F4 85 E2 sta LineLength+1 + 149 66F6 4C 39 68 jmp EndOfDraw + 150 + 151 66F9 NotOnePoint + 152 ; here we have DX,DY,XK and we know which operations + 153 ; are to be performed with these factors when doing PLOT + 154 ; (accordingly to given bits of 'HowToDraw') + 155 ; Now we must calculate DP, DD and DI + 156 ; DP=2*DY + 157 ; DD=2*(DY-DX) + 158 ; DI=2*DY-DX + 159 + 160 66F9 A5 8D 85 93 A5 8E + mwa DY DP + 161 6701 aslw DP +Macro: ASLW [Source: MACRO.ASM] + 1 6701 06 93 ASL DP + 2 6703 26 94 ROL DP+1 +Source: grafproc.asm + 162 + 163 6705 38 A5 8D E5 8B 85 + sbw DY DX DD + 164 6712 aslw DD +Macro: ASLW [Source: MACRO.ASM] + 1 6712 06 8F ASL DD + 2 6714 26 90 ROL DD+1 +Source: grafproc.asm + 165 + 166 6716 A5 8D 85 91 A5 8E + mwa DY DI + 167 671E aslw DI +Macro: ASLW [Source: MACRO.ASM] + 1 671E 06 91 ASL DI + 2 6720 26 92 ROL DI+1 +Source: grafproc.asm + 168 6722 38 A5 91 E5 8B 85 + sbw DI DX + 169 + 170 672F DrawLoop + 171 ; REPEAT + 172 ; IF DI>=0 + 173 672F A5 92 lda DI+1 + 174 6731 30 16 bmi DINegative + 175 ; DI=DI+DD + 176 ; YI=YI+1 + 177 6733 18 A5 91 65 8F 85 + adw DI DD + 178 6740 E6 84 D0 02 E6 85 inw YI + 179 6746 4C 56 67 jmp drplot + 180 6749 DINegative + 181 ; ELSE + 182 ; DI=DI+DP + 183 6749 18 A5 91 65 93 85 + adw DI DP + 184 + 185 6756 drplot ; Our plot that checks how to calculate pixels. + 186 ; In xtempDRAW and ycircle there are begin coordinates + 187 ; of our line + 188 ; First we check the 'a' factor (like in y=ax+b) + 189 ; If necessary we swap XI and YI + 190 ; (as we can not change XI and YI we move XI to temp2 + 191 ; and YI to temp) + 192 + 193 + 194 6756 A5 DF lda HowToDraw + 195 6758 29 04 and #$04 + 196 675A D0 13 bne SwappedXY + 197 675C A5 81 85 72 A5 82 + mwa XI temp + 198 6764 A5 84 85 74 A5 85 + mwa YI temp2 + 199 676C 4C 7F 67 jmp CheckPlotY + 200 676F SwappedXY + 201 676F A5 81 85 74 A5 82 + mwa XI temp2 + 202 6777 A5 84 85 72 A5 85 + mwa YI temp + 203 677F CheckPlotY + 204 677F A5 DF lda HowToDraw + 205 6781 29 01 and #01 + 206 6783 D0 10 bne LineGoesUp + 207 ; here we know that line goes down and we are not changing Y + 208 6785 18 A5 74 65 7C 85 + adw temp2 ytempDRAW ydraw ; YI + 209 6792 4C A2 67 jmp CheckPlotX + 210 6795 LineGoesUp + 211 ; line goes up here - we are reversing Y + 212 6795 38 A5 7C E5 74 85 + sbw ytempDRAW temp2 ydraw ; YI + 213 67A2 CheckPlotX + 214 67A2 A5 DF lda HowToDraw + 215 67A4 29 02 and #02 + 216 67A6 D0 10 bne LineGoesLeft + 217 ; here we know that line goes right and we are not changing X + 218 67A8 18 A5 72 65 7A 85 + adw temp xtempDRAW xdraw ; XI + 219 67B5 4C C5 67 jmp PutPixelinDraw + 220 67B8 LineGoesLeft + 221 ; line goes left - we are reversing X + 222 67B8 38 A5 7A E5 72 85 + sbw xtempDRAW temp xdraw ; XI + 223 67C5 PutPixelinDraw + 224 + 225 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) + 226 67C5 2C 73 43 bit drawFunction + 227 67C8 10 0D bpl @+ + 228 67CA E6 E1 D0 02 E6 E2 inw LineLength + 229 67D0 24 60 bit Vdebug + 230 67D2 30 4D bmi MeasureVisualisation + 231 67D4 4C 24 68 jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff + 232 @ + 233 67D7 50 48 bvc @+ + 234 67D9 DrawCheck + 235 67D9 A5 E3 lda tracerflag + 236 67DB 0D 8A 44 ora SmokeTracerFlag + 237 67DE yestrace + 238 67DE F0 03 beq notrace + 239 67E0 20 14 76 jsr plot + 240 67E3 notrace + 241 ;aftertrace + 242 ;key + 243 67E3 A5 BF lda HitFlag + 244 67E5 D0 37 bne StopHitChecking + 245 + 246 67E7 CheckCollisionDraw + 247 ; checking collision! + 248 67E7 A5 64 lda ydraw+1 + 249 67E9 30 33 bmi StopHitChecking + 250 + 251 67EB 20 84 8E jsr CheckCollisionWithTank + 252 67EE A5 BF lda HitFlag + 253 67F0 D0 2C bne StopHitChecking + 254 + 255 67F2 18 clc + 256 67F3 A5 61 lda xdraw + 257 67F5 69 3E adc #mountaintable + 261 67FD 85 73 sta temp+1 + 262 + 263 67FF A0 00 ldy #0 + 264 6801 A5 63 lda ydraw + 265 6803 D1 72 cmp (temp),y + 266 6805 90 17 bcc StopHitChecking + 267 + 268 6807 A5 61 85 C1 A5 62 + mwa xdraw XHit + 269 680F B1 72 lda (temp),y + 270 6811 38 sec + 271 6812 E9 01 sbc #1 + 272 6814 8D 5F 44 sta YHit + 273 6817 8C 60 44 sty YHit+1 + 274 681A A9 FF 85 BF mva #$ff HitFlag + 275 681E StopHitChecking + 276 681E 4C 24 68 jmp ContinueDraw + 277 @ + 278 6821 MeasureVisualisation + 279 6821 20 14 76 jsr plot + 280 + 281 6824 ContinueDraw + 282 ; XI=XI+1 + 283 ; UNTIL XI=XK + 284 6824 E6 81 D0 02 E6 82 inw XI + 285 682A A5 82 C5 88 D0 04 + cpw XI XK + 286 6834 F0 03 4C 2F 67 jne DrawLoop + 287 + 288 6839 EndOfDraw + 289 6839 A5 7A 85 61 A5 7B + mwa xtempDRAW xdraw + 290 6841 A5 7C 85 63 A5 7D + mwa ytempDRAW ydraw + 291 6849 60 rts + 292 .endp + 293 + 294 ;-------------------------------------------------- + 295 684A .proc circle ;fxxxing good circle drawing :) + 296 ; xdraw,ydraw (word) - coordinates of circle center + 297 ; radius (byte) - radius of circle + 298 ;-------------------------------------------------- + 299 ;Turbo Basic source + 300 ; R=30 + 301 ; XC=0:YC=R + 302 ; FX=0:FY=8*R:FS=4*R+3 + 303 ; WHILE FX0 + 308 ; FS=FS-FX-4 + 309 ; ELSE + 310 ; YC=YC-1 + 311 ; FY=FY-8 + 312 ; FS=FS-FX-4+FY + 313 ; ENDIF + 314 ; WEND + 315 ; splot8 + 316 + 317 684A A5 61 85 B3 A5 62 + mwa xdraw xcircle + 318 6852 A5 63 85 B5 A5 64 + mwa ydraw ycircle + 319 + 320 685A A9 00 85 70 85 71 mwa #0 xc + 321 6860 A5 AB 85 8A mva radius yc + 322 6864 A9 00 85 83 mva #0 fx + 323 6868 A5 AB 85 86 mva radius fy + 324 686C 06 86 asl FY + 325 686E 06 86 asl FY + 326 6870 A5 86 85 89 mva FY FS + 327 6874 06 86 asl FY + 328 6876 18 clc + 329 6877 A5 89 lda FS + 330 6879 69 03 adc #3 + 331 687B 85 89 sta FS + 332 + 333 687D circleloop + 334 687D A5 83 lda FX + 335 687F C5 86 cmp FY + 336 6881 B0 34 bcs endcircleloop + 337 6883 20 CB 68 jsr splot8 + 338 6886 E6 70 inc XC + 339 + 340 6888 18 clc + 341 6889 A5 83 lda FX + 342 688B 69 08 adc #8 + 343 688D 85 83 sta FX + 344 + 345 688F A5 89 lda FS + 346 6891 F0 0C beq else01 + 347 6893 30 0A bmi else01 + 348 6895 38 sec + 349 6896 E5 83 sbc FX + 350 6898 E9 04 sbc #4 + 351 689A 85 89 sta FS + 352 689C 4C B4 68 jmp endif01 + 353 689F else01 + 354 689F C6 8A dec YC + 355 68A1 38 sec + 356 68A2 A5 86 lda FY + 357 68A4 E9 08 sbc #8 + 358 68A6 85 86 sta FY + 359 + 360 68A8 A5 89 lda FS + 361 68AA 38 sec + 362 68AB E5 83 sbc FX + 363 68AD E9 04 sbc #4 + 364 68AF 18 clc + 365 68B0 65 86 adc FY + 366 68B2 85 89 sta FS + 367 68B4 endif01 + 368 68B4 4C 7D 68 jmp circleloop + 369 68B7 endcircleloop + 370 + 371 68B7 20 CB 68 jsr splot8 + 372 + 373 68BA A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 374 68C2 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 375 68CA 60 rts + 376 .endp + 377 ;---- + 378 68CB .proc splot8 + 379 ; plot xcircle+XC,ycircle+YC + 380 ; plot xcircle+XC,ycircle-YC + 381 ; plot xcircle-XC,ycircle-YC + 382 ; plot xcircle-XC,ycircle+YC + 383 + 384 ; plot xcircle+YC,ycircle+XC + 385 ; plot xcircle+YC,ycircle-XC + 386 ; plot xcircle-YC,ycircle-XC + 387 ; plot xcircle-YC,ycircle+XC + 388 + 389 68CB 18 clc + 390 68CC A5 B3 lda xcircle + 391 68CE 65 70 adc XC + 392 68D0 85 61 sta xdraw + 393 68D2 A5 B4 lda xcircle+1 + 394 68D4 69 00 adc #0 + 395 68D6 85 62 sta xdraw+1 + 396 ;clc + 397 68D8 A5 B5 lda ycircle + 398 68DA 65 8A adc YC + 399 68DC 85 63 sta ydraw + 400 68DE 8D 61 44 sta tempcir + 401 68E1 A5 B6 lda ycircle+1 + 402 68E3 69 00 adc #$00 + 403 68E5 85 64 sta ydraw+1 + 404 68E7 8D 62 44 sta tempcir+1 + 405 68EA 20 14 76 jsr plot + 406 + 407 68ED 38 sec + 408 68EE A5 B5 lda ycircle + 409 68F0 E5 8A sbc YC + 410 68F2 85 63 sta ydraw + 411 68F4 A5 B6 lda ycircle+1 + 412 68F6 E9 00 sbc #$00 + 413 68F8 85 64 sta ydraw+1 + 414 68FA 20 14 76 jsr plot + 415 + 416 68FD 38 sec + 417 68FE A5 B3 lda xcircle + 418 6900 E5 70 sbc XC + 419 6902 85 61 sta xdraw + 420 6904 A5 B4 lda xcircle+1 + 421 6906 E9 00 sbc #0 + 422 6908 85 62 sta xdraw+1 + 423 690A 20 14 76 jsr plot + 424 + 425 690D AD 61 44 lda tempcir + 426 6910 85 63 sta ydraw + 427 6912 AD 62 44 lda tempcir+1 + 428 6915 85 64 sta ydraw+1 + 429 6917 20 14 76 jsr plot + 430 ;--- + 431 691A 18 clc + 432 691B A5 B3 lda xcircle + 433 691D 65 8A adc yC + 434 691F 85 61 sta xdraw + 435 6921 A5 B4 lda xcircle+1 + 436 6923 69 00 adc #0 + 437 6925 85 62 sta xdraw+1 + 438 ;clc + 439 6927 A5 B5 lda ycircle + 440 6929 65 70 adc xC + 441 692B 85 63 sta ydraw + 442 692D 8D 61 44 sta tempcir + 443 6930 A5 B6 lda ycircle+1 + 444 6932 69 00 adc #$00 + 445 6934 85 64 sta ydraw+1 + 446 6936 8D 62 44 sta tempcir+1 + 447 6939 20 14 76 jsr plot + 448 + 449 693C 38 sec + 450 693D A5 B5 lda ycircle + 451 693F E5 70 sbc xC + 452 6941 85 63 sta ydraw + 453 6943 A5 B6 lda ycircle+1 + 454 6945 E9 00 sbc #$00 + 455 6947 85 64 sta ydraw+1 + 456 6949 20 14 76 jsr plot + 457 + 458 694C 38 sec + 459 694D A5 B3 lda xcircle + 460 694F E5 8A sbc yC + 461 6951 85 61 sta xdraw + 462 6953 A5 B4 lda xcircle+1 + 463 6955 E9 00 sbc #0 + 464 6957 85 62 sta xdraw+1 + 465 6959 20 14 76 jsr plot + 466 + 467 695C AD 61 44 lda tempcir + 468 695F 85 63 sta ydraw + 469 6961 AD 62 44 lda tempcir+1 + 470 6964 85 64 sta ydraw+1 + 471 6966 20 14 76 jsr plot + 472 + 473 6969 60 RTS + 474 .endp + 475 + 476 ;-------------------------------*------------------ + 477 696A .proc placetanks + 478 ;-------------------------------------------------- + 479 696A A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 + 480 696C A9 00 lda #0 + 481 @ + 482 ; clearing the tables with coordinates of the tank + 483 ; it is necessary, because randomizing checks + 484 ; if the given tank is already placed + 485 ; after check if its position is not (0,0) + 486 + 487 ; I will be honest with you - I have no idea + 488 ; what the above comment was intending to mean :) + 489 + 490 696E 9D 0D 44 sta XtankstableL,x + 491 6971 9D 13 44 sta XtankstableH,x + 492 6974 9D 19 44 sta Ytankstable,x + 493 6977 CA dex + 494 6978 10 F4 bpl @- + 495 + 496 + 497 697A A9 00 8D D6 44 8D + mwa #0 temptankX + 498 6982 A9 00 8D D8 44 mva #0 temptankNr ;player number + 499 6987 StillRandomize + 500 6987 A6 AE ldx NumberOfPlayers + 501 6989 AD 1B D4 lda random + 502 698C 29 07 and #$07 + 503 698E A8 tay + 504 698F C4 AE cpy NumberOfPlayers + 505 6991 B0 F4 bcs StillRandomize + 506 6993 B9 0D 44 lda xtankstableL,y + 507 6996 D0 EF bne StillRandomize + 508 6998 B9 13 44 lda xtankstableH,y + 509 699B D0 EA bne StillRandomize + 510 ; here we know that we got a random number + 511 ; of the tank that is not in use + 512 ; this number is in Y + 513 + 514 699D 18 clc + 515 699E AD D6 44 lda temptankX + 516 69A1 7D 2C 5C adc disktance,x + 517 69A4 8D D6 44 sta temptankX + 518 69A7 99 0D 44 sta xtankstableL,y + 519 69AA 90 03 bcc NotHigherByte03 + 520 69AC EE D7 44 inc temptankX+1 + 521 69AF NotHigherByte03 + 522 69AF AD D7 44 lda temptankX+1 + 523 69B2 99 13 44 sta xtankstableH,y + 524 69B5 EE D8 44 INC temptankNr + 525 69B8 AE D8 44 ldx temptankNr + 526 69BB E4 AE Cpx NumberOfPlayers + 527 69BD D0 C8 bne StillRandomize + 528 + 529 ; getting random displacements relative to even positions + 530 69BF A2 00 ldx #$00 + 531 69C1 StillRandomize02 + 532 69C1 AD 1B D4 lda random + 533 69C4 29 1F and #$1f ; maximal displacement is 31 pixels + 534 + 535 69C6 18 clc + 536 69C7 7D 0D 44 adc xtankstableL,x + 537 69CA 9D 0D 44 sta xtankstableL,x + 538 69CD 90 03 bcc NotHigherByte02 + 539 69CF FE 13 44 inc xtankstableH,x + 540 69D2 NotHigherByte02 + 541 ; and we deduct 15 to make the displacement work two ways + 542 69D2 38 sec + 543 69D3 BD 0D 44 lda xtankstableL,x + 544 69D6 E9 0F sbc #$0f + 545 ; and clear lowest bit to be sure that the X coordinate is even + 546 ; (this is to have P/M background look nice) + 547 ; "AND" does not change "Carry" bit. + 548 ; x correction for P/M + 549 ; -- + 550 .IF XCORRECTION_FOR_PM = 1 + 551 and #$fe + 552 .ENDIF + 553 ; -- + 554 69D8 9D 0D 44 sta xtankstableL,x + 555 69DB B0 03 bcs NotHigherByte01 + 556 69DD DE 13 44 dec xtankstableH,x + 557 69E0 NotHigherByte01 + 558 + 559 69E0 E8 inx + 560 69E1 E4 AE Cpx NumberOfPlayers + 561 69E3 D0 DC bne StillRandomize02 + 562 69E5 60 rts + 563 + 564 ; during calculating heights of thw mountains + 565 ; check if the tank is not somewhere around + 566 ; if so, make horizontal line 8 pixels long + 567 69E6 CheckTank + 568 69E6 A6 AE ldx NumberOfPlayers + 569 69E8 CA dex + 570 69E9 CheckNextTank + 571 69E9 BD 0D 44 lda xtankstableL,x + 572 69EC C5 61 cmp xdraw + 573 69EE D0 17 bne UnequalTanks + 574 69F0 BD 13 44 lda xtankstableH,x + 575 69F3 C5 62 cmp xdraw+1 + 576 69F5 D0 10 bne UnequalTanks + 577 69F7 A5 63 lda ydraw + 578 ;sec + 579 ;sbc #$01 ; minus 1, because it was 1 pixel too high + 580 69F9 9D 19 44 sta ytankstable,x ; what's the heck is that????!!!! + 581 69FC A9 07 8D D4 44 mva #7 deltaX + 582 6A01 A9 00 85 C3 85 C4 mwa #0 delta + 583 6A07 UnequalTanks + 584 6A07 CA dex + 585 6A08 10 DF bpl CheckNextTank + 586 6A0A 60 rts + 587 .endp + 588 + 589 ;------------------------------------------------- + 590 6A0B .proc ClearTanks + 591 6A0B 20 46 75 jsr PMoutofScreen + 592 6A0E A9 01 85 AA mva #1 Erase ; erase tanks flag + 593 .endp + 594 ;-- + 595 6A12 .proc drawtanks + 596 ;------------------------------------------------- + 597 6A12 A5 6C lda TankNr + 598 6A14 48 pha + 599 6A15 A2 00 ldx #$00 + 600 6A17 86 6C stx TankNr + 601 + 602 6A19 DrawNextTank + 603 6A19 20 2C 6A jsr drawtanknr + 604 6A1C E6 6C inc TankNr + 605 6A1E A6 6C ldx TankNr + 606 6A20 E4 AE Cpx NumberOfPlayers + 607 6A22 D0 F5 bne DrawNextTank + 608 + 609 6A24 68 pla + 610 6A25 85 6C sta TankNr + 611 + 612 6A27 A9 00 85 AA mva #0 Erase ; no erase tanks flag + 613 6A2B 60 rts + 614 .endp + 615 ;--------- + 616 6A2C .proc DrawTankNr + 617 6A2C A6 6C ldx tankNr + 618 ; let's check the energy + 619 6A2E BD AF 43 lda eXistenZ,x + 620 6A31 D0 21 bne SkipHidingPM ; if energy=0 then no tank + 621 + 622 ; hide P/M + 623 6A33 BD A2 A2 lda TanksPMOrder,x + 624 6A36 AA tax + 625 6A37 A9 00 lda #0 + 626 6A39 E0 04 cpx #$4 ; 5th tank is defferent + 627 6A3B D0 06 bne No5thTankHide + 628 6A3D 85 06 sta hposp0+4 + 629 6A3F 85 07 sta hposp0+5 + 630 6A41 F0 0C beq @+ + 631 6A43 No5thTankHide + 632 6A43 E0 05 cpx #$5 ; 6th tank is defferent + 633 6A45 D0 06 bne No6thTankHide + 634 6A47 85 08 sta hposp0+6 + 635 6A49 85 09 sta hposp0+7 + 636 6A4B F0 02 beq @+ + 637 6A4D No6thTankHide + 638 6A4D 95 02 sta hposp0,x + 639 @ + 640 6A4F A6 6C ldx TankNr + 641 6A51 4C 56 6B jmp DoNotDrawTankNr + 642 6A54 SkipHidingPM + 643 + 644 6A54 BD 2B 44 lda TankShape,x + 645 6A57 AA tax + 646 6A58 BC 6A 5C ldy TankShapesTable,x + 647 6A5B A6 6C ldx TankNr + 648 6A5D BD C3 48 lda AngleTable,x + 649 6A60 C9 5B cmp #91 ; left or right tank shape + 650 6A62 B0 02 bcs LeftTank + 651 6A64 C8 C8 :2 iny ; right tank + 652 6A66 LeftTank + 653 6A66 84 69 sty CharCode + 654 6A68 DrawTankNrX + 655 6A68 A6 6C ldx tanknr + 656 6A6A 20 67 74 jsr SetupXYdraw + 657 + 658 6A6D 20 E7 70 jsr TypeChar + 659 6A70 A5 AA lda Erase + 660 6A72 F0 03 4C F9 6A jne noTankNoPM + 661 ; now P/M graphics on the screen (only for 5 tanks) + 662 ; horizontal position + 663 6A77 A6 6C ldx TankNr + 664 6A79 BD A2 A2 lda TanksPMOrder,x + 665 6A7C AA tax + 666 6A7D A5 61 85 65 A5 62 + mwa xdraw xbyte + 667 6A85 rorw xbyte ; divide by 2 (carry does not matter) +Macro: RORW [Source: MACRO.ASM] + 1 6A85 66 66 ROR XBYTE+1 + 2 6A87 66 65 ROR XBYTE +Source: grafproc.asm + 668 6A89 A5 65 lda xbyte + 669 6A8B 18 clc + 670 6A8C 69 2C adc #PMOffsetX ; P/M to graphics offset + 671 6A8E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent + 672 6A90 D0 09 bne No5thTank + 673 6A92 18 clc + 674 6A93 69 04 adc #$04 ; missile offset offset + 675 6A95 85 06 sta hposp0+4 + 676 6A97 85 07 sta hposp0+5 + 677 6A99 D0 0F bne NoMissile + 678 6A9B No5thTank + 679 6A9B E0 05 cpx #$5 ; 6th tank are joined missiles and offset is defferent + 680 6A9D D0 09 bne Tanks1to4 + 681 6A9F 18 clc + 682 6AA0 69 04 adc #$04 ; missile offset offset + 683 6AA2 85 08 sta hposp0+6 + 684 6AA4 85 09 sta hposp0+7 + 685 6AA6 D0 02 bne NoMissile + 686 6AA8 Tanks1to4 + 687 6AA8 95 02 sta hposp0,x + 688 + 689 6AAA NoMissile + 690 ; vertical position + 691 6AAA BD B5 5B lda pmtableL,x + 692 6AAD 85 65 sta xbyte + 693 6AAF BD BB 5B lda pmtableH,x + 694 6AB2 85 66 sta xbyte+1 + 695 + 696 ; calculate start position of the tank + 697 6AB4 A5 63 lda ydraw + 698 6AB6 18 clc + 699 6AB7 69 2A adc #PMOffsetY + 700 6AB9 85 72 sta temp + 701 6ABB A0 00 ldy #$00 + 702 6ABD E0 05 cpx #$5 + 703 6ABF B0 1D bcs PMForTank6 + 704 ; clear sprite and put 3 lines on the tank at the same time + 705 6AC1 A2 03 ldx #3 ; three lines of PM + 706 6AC3 ClearPM + 707 6AC3 C4 72 cpy temp + 708 6AC5 D0 0C bne ZeroesToGo + 709 6AC7 B1 65 @ lda (xbyte),y + 710 6AC9 29 F0 and #%11110000 + 711 6ACB 09 0F ora #%00001111 ; (2 bits set) we set on two pixels in three lines + 712 6ACD 91 65 sta (xbyte),y + 713 6ACF 88 dey + 714 6AD0 CA dex + 715 6AD1 D0 F4 bne @- + 716 6AD3 ZeroesToGo + 717 6AD3 B1 65 lda (xbyte),y + 718 6AD5 29 F0 and #%11110000 + 719 6AD7 91 65 sta (xbyte),y + 720 6AD9 88 dey + 721 6ADA D0 E7 bne ClearPM + 722 6ADC F0 1B beq NoPlayerMissile + 723 6ADE PMForTank6 + 724 ; clear sprite and put 3 lines on the tank at the same time + 725 6ADE A2 03 ldx #3 ; three lines of PM + 726 6AE0 ClearPM6 + 727 6AE0 C4 72 cpy temp + 728 6AE2 D0 0C bne ZeroesToGo6 + 729 6AE4 B1 65 @ lda (xbyte),y + 730 6AE6 29 0F and #%00001111 + 731 6AE8 09 F0 ora #%11110000 ; (2 bits set) we set on two pixels in three lines + 732 6AEA 91 65 sta (xbyte),y + 733 6AEC 88 dey + 734 6AED CA dex + 735 6AEE D0 F4 bne @- + 736 6AF0 ZeroesToGo6 + 737 6AF0 B1 65 lda (xbyte),y + 738 6AF2 29 0F and #%00001111 + 739 6AF4 91 65 sta (xbyte),y + 740 6AF6 88 dey + 741 6AF7 D0 E7 bne ClearPM6 + 742 + 743 6AF9 NoPlayerMissile + 744 6AF9 noTankNoPM + 745 6AF9 A0 01 ldy #$01 + 746 6AFB A5 AA lda Erase + 747 6AFD F0 01 beq @+ + 748 6AFF 88 dey + 749 6B00 84 A9 @ sty color + 750 ; draw defensive weapons like shield ( tank number in X ) + 751 ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char + 752 6B02 A6 6C ldx TankNr + 753 6B04 BD FD 43 lda ActiveDefenceWeapon,x + 754 6B07 C9 26 cmp #ind_Shield_________ ; one shot shield + 755 6B09 F0 16 beq DrawTankSh + 756 6B0B C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute + 757 6B0D F0 21 beq DrawTankShieldBold + 758 6B0F C9 27 cmp #ind_Heavy_Shield___ ; shield with energy + 759 6B11 F0 1D beq DrawTankShieldBold + 760 6B13 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence + 761 6B15 F0 10 beq DrawTankShieldWihHorns + 762 6B17 C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector + 763 6B19 F0 0C beq DrawTankShieldWihHorns + 764 6B1B C9 20 cmp #ind_White_Flag_____ ; White Flag + 765 6B1D F0 1A beq DrawTankFlag + 766 6B1F D0 27 bne NoShieldDraw + 767 6B21 DrawTankSh + 768 6B21 20 86 6B jsr DrawTankShield + 769 6B24 4C 48 6B jmp NoShieldDraw + 770 6B27 DrawTankShieldWihHorns + 771 6B27 20 86 6B jsr DrawTankShield + 772 6B2A 20 F7 6B jsr DrawTankShieldHorns + 773 6B2D 4C 48 6B jmp NoShieldDraw + 774 6B30 DrawTankShieldBold + 775 6B30 20 86 6B jsr DrawTankShield + 776 6B33 20 3C 6C jsr DrawTankShieldBoldLine + 777 6B36 4C 48 6B jmp NoShieldDraw + 778 6B39 DrawTankFlag + 779 6B39 A9 1E lda #char_flag____________ ; flag symbol + 780 6B3B 85 69 sta CharCode + 781 6B3D BD 19 44 lda Ytankstable,x + 782 6B40 38 sec + 783 6B41 E9 08 sbc #8 + 784 6B43 85 63 sta ydraw + 785 6B45 20 E7 70 jsr TypeChar + 786 6B48 NoShieldDraw + 787 6B48 BarrelChange + 788 6B48 A0 01 ldy #$01 + 789 6B4A A5 AA lda Erase + 790 6B4C F0 01 beq @+ + 791 6B4E 88 dey + 792 6B4F 84 A9 @ sty color + 793 6B51 20 7B 74 jsr DrawBarrel + 794 6B54 A6 6C ldx TankNr + 795 6B56 DoNotDrawTankNr + 796 6B56 60 rts + 797 .endp + 798 + 799 ; ------------------------------------- + 800 6B57 .proc FlashTank + 801 ; ------------------------------------- + 802 ; number of blinking tank in TankNr + 803 6B57 A9 12 85 89 mva #18 fs ; temp, how many times flash the tank + 804 6B5B tankflash_loop + 805 6B5B A5 02 lda CONSOL ; turbo mode + 806 6B5D 29 01 and #%00000001 ; START KEY + 807 6B5F D0 04 A9 01 85 89 sne:mva #1 fs ; finish it + 808 6B65 A9 01 85 AA mva #1 Erase + 809 6B69 A6 6C ldx TankNr + 810 6B6B 20 54 6A jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! + 811 ;PAUSE 2 + 812 6B6E A0 01 ldy #1 + 813 6B70 20 9D 5A jsr PauseYFrames + 814 6B73 A9 00 85 AA mva #0 Erase + 815 6B77 A6 6C ldx TankNr + 816 6B79 20 54 6A jsr DrawTankNr.SkipHidingPM + 817 ;PAUSE 2 + 818 6B7C A0 01 ldy #1 + 819 6B7E 20 9D 5A jsr PauseYFrames + 820 6B81 C6 89 dec fs + 821 6B83 D0 D6 jne tankflash_loop + 822 6B85 60 rts + 823 .endp + 824 + 825 ;-------------------------------------------------- + 826 6B86 .proc DrawTankShield + 827 ; X - tank number + 828 ; if use DrawInPosition entry point then: + 829 ; xdraw, ydraw - coordinates left LOWER corner of Tank char + 830 ; values remain there after a DrawTankNr proc. + 831 ; + 832 ; this proc change xdraw, ydraw and temp! + 833 ;-------------------------------------------------- + 834 6B86 38 A5 61 E9 03 85 + sbw xdraw #$03 ; 3 pixels to left + 835 ; draw left vertical line of shield ( | ) + 836 6B91 A9 07 85 72 mva #7 temp ; strange !!! + 837 @ + 838 6B95 20 14 76 jsr plot + 839 6B98 A5 63 D0 02 C6 64 + .nowarn dew ydraw + 840 6BA0 C6 72 dec temp + 841 6BA2 D0 F1 bne @- + 842 ; draw left oblique line of shield ( / ) + 843 6BA4 A9 03 85 72 mva #3 temp + 844 @ + 845 6BA8 20 14 76 jsr plot + 846 6BAB A5 63 D0 02 C6 64 + .nowarn dew ydraw + 847 6BB3 E6 61 D0 02 E6 62 inw xdraw + 848 6BB9 C6 72 dec temp + 849 6BBB D0 EB bne @- + 850 ; draw top horizontal line of shield ( _ ) + 851 6BBD A9 07 85 72 mva #7 temp + 852 @ + 853 6BC1 20 14 76 jsr plot + 854 6BC4 E6 61 D0 02 E6 62 inw xdraw + 855 6BCA C6 72 dec temp + 856 6BCC D0 F3 bne @- + 857 ; draw right oblique line of shield ( \ ) + 858 6BCE A9 03 85 72 mva #3 temp + 859 @ + 860 6BD2 20 14 76 jsr plot + 861 6BD5 E6 63 D0 02 E6 64 inw ydraw + 862 6BDB E6 61 D0 02 E6 62 inw xdraw + 863 6BE1 C6 72 dec temp + 864 6BE3 D0 ED bne @- + 865 ; draw right vertical line of shield ( | ) + 866 6BE5 A9 07 85 72 mva #7 temp + 867 @ + 868 6BE9 20 14 76 jsr plot + 869 6BEC E6 63 D0 02 E6 64 inw ydraw + 870 6BF2 C6 72 dec temp + 871 6BF4 D0 F3 bne @- + 872 6BF6 60 rts + 873 .endp + 874 ;-------------------------------------------------- + 875 6BF7 .proc DrawTankShieldHorns + 876 ; use only directly after DrawTankShield + 877 ; this proc draws a little "horns" on shield. + 878 ; Symbol of defensive but aggressive :) weapon + 879 ;-------------------------------------------------- + 880 6BF7 A5 61 D0 02 C6 62 + .nowarn dew xdraw ; 1 pixel left + 881 6BFF 38 A5 63 E9 0A 85 + sbw ydraw #$0a ; 10 pixels up + 882 6C0A 20 14 76 jsr plot + 883 6C0D A5 63 D0 02 C6 64 + .nowarn dew ydraw + 884 6C15 E6 61 D0 02 E6 62 inw xdraw + 885 6C1B 20 14 76 jsr plot + 886 6C1E 38 A5 61 E9 0D 85 + sbw xdraw #$0d ; 13 pixels left + 887 6C29 20 14 76 jsr plot + 888 6C2C E6 61 D0 02 E6 62 inw xdraw + 889 6C32 E6 63 D0 02 E6 64 inw ydraw + 890 6C38 20 14 76 jsr plot + 891 6C3B 60 rts + 892 .endp + 893 ;-------------------------------------------------- + 894 6C3C .proc DrawTankShieldBoldLine + 895 ; use only directly after DrawTankShield + 896 ; this proc draws bold top on shield. + 897 ; Symbol of ablative shield ? :) + 898 ;-------------------------------------------------- + 899 6C3C 38 A5 61 E9 04 85 + sbw xdraw #$04 ; 5 pixels left + 900 6C47 38 A5 63 E9 0B 85 + sbw ydraw #$0b ; 11 pixels up + 901 ; draw additional top horizontal line of shield ( _ ) + 902 6C52 A9 06 85 72 mva #6 temp + 903 @ + 904 6C56 20 14 76 jsr plot + 905 6C59 A5 61 D0 02 C6 62 + .nowarn dew xdraw + 906 6C61 C6 72 dec temp + 907 6C63 D0 F1 bne @- + 908 6C65 60 rts + 909 .endp + 910 ;-------------------------------------------------- + 911 6C66 .proc DrawTankParachute + 912 ;Tank number in X + 913 ;-------------------------------------------------- + 914 6C66 A9 02 lda #char_parachute_______ ; parachute symbol + 915 6C68 85 69 sta CharCode + 916 6C6A BD 19 44 lda Ytankstable,x + 917 6C6D C9 10 cmp #16 + 918 6C6F 90 0A bcc ToHighToParachute + 919 ;sec + 920 6C71 E9 08 sbc #8 + 921 6C73 85 63 sta ydraw + 922 6C75 20 70 74 jsr SetupXYdraw.X + 923 6C78 20 E7 70 jsr TypeChar + 924 6C7B ToHighToParachute + 925 6C7B A6 6C ldx TankNr + 926 6C7D 60 rts + 927 .endp + 928 + 929 ;-------------------------------------------------- + 930 6C7E .proc DrawTankRocketEngine + 931 ; X - tank number + 932 ; + 933 ; this proc change xdraw, ydraw and temp! + 934 ;-------------------------------------------------- + 935 6C7E 18 clc + 936 6C7F BD 19 44 lda Ytankstable,x + 937 6C82 69 02 adc #2 ; 1 pixel down + 938 6C84 85 63 sta ydraw + 939 6C86 A9 00 85 64 mva #0 ydraw+1 + 940 + 941 6C8A 18 clc + 942 6C8B BD 0D 44 lda XtanksTableL,x + 943 6C8E 69 02 adc #2 ; 2 pixels to right + 944 6C90 85 61 sta xdraw + 945 6C92 BD 13 44 lda XtanksTableH,x + 946 6C95 69 00 adc #0 + 947 6C97 85 62 sta xdraw+1 + 948 + 949 ; draw first horizontal line + 950 6C99 A9 05 85 72 mva #5 temp + 951 @ + 952 6C9D 20 14 76 jsr plot + 953 6CA0 E6 61 D0 02 E6 62 inw xdraw + 954 6CA6 C6 72 dec temp + 955 6CA8 D0 F3 bne @- + 956 + 957 6CAA 38 A5 61 E9 02 85 + sbw xdraw #2 ; 2 pixels left + 958 6CB5 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down + 959 + 960 ; draw second horizontal line + 961 6CBB A9 03 85 72 mva #3 temp + 962 @ + 963 6CBF 20 14 76 jsr plot + 964 6CC2 A5 61 D0 02 C6 62 + .nowarn dew xdraw + 965 6CCA C6 72 dec temp + 966 6CCC D0 F1 bne @- + 967 + 968 6CCE 18 A5 61 69 02 85 + adw xdraw #2 ; 2 pixels right + 969 6CD9 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down + 970 + 971 ; and last pixel + 972 6CDF 20 14 76 jsr plot + 973 + 974 6CE2 A6 6C ldx TankNr + 975 6CE4 60 rts + 976 .endp + 977 ;-------------------------------------------------- + 978 6CE5 .proc DrawTankEngine + 979 ; X - tank number + 980 ; + 981 ; this proc change xdraw, ydraw and temp! + 982 ;-------------------------------------------------- + 983 ; one pixel under tank + 984 6CE5 18 clc + 985 6CE6 BD 19 44 lda Ytankstable,x + 986 6CE9 69 01 adc #1 + 987 6CEB 85 63 sta ydraw + 988 6CED A9 00 85 64 mva #0 ydraw+1 + 989 6CF1 BD 0D 44 lda XtankstableL,x + 990 6CF4 85 61 sta xdraw + 991 6CF6 BD 13 44 lda XtankstableH,x + 992 6CF9 85 62 sta xdraw+1 + 993 ; clear first pixel under tank + 994 6CFB A9 00 85 A9 mva #0 color + 995 6CFF 20 14 76 jsr plot + 996 6D02 E6 61 D0 02 E6 62 inw xdraw + 997 ; plot 6 random color pixels + 998 6D08 A9 06 85 72 mva #6 temp + 999 6D0C A5 AA @ lda Erase + 1000 6D0E 49 01 eor #%00000001 + 1001 6D10 2D 1B D4 and random + 1002 6D13 29 01 and #%00000001 + 1003 6D15 85 A9 sta color + 1004 6D17 20 14 76 jsr plot + 1005 6D1A E6 61 D0 02 E6 62 inw xdraw + 1006 6D20 C6 72 dec temp + 1007 6D22 D0 E8 bne @- + 1008 ; clear last pixel under tank + 1009 6D24 A9 00 85 A9 mva #0 color + 1010 6D28 20 14 76 jsr plot + 1011 6D2B A6 6C ldx TankNr + 1012 6D2D 60 rts + 1013 .endp + 1014 ;-------------------------------------------------- + 1015 6D2E .proc TankFalls; + 1016 ;-------------------------------------------------- + 1017 6D2E A9 00 lda #0 + 1018 6D30 8D 64 44 sta PreviousFall ; bit 7 - left, bit 6 - right + 1019 6D33 8D 65 44 sta EndOfTheFallFlag + 1020 6D36 85 A8 sta Parachute + 1021 6D38 A9 02 8D 63 44 mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop + 1022 + 1023 ; let's check if the given tank has got the parachute + 1024 6D3D A6 6C ldx TankNr + 1025 6D3F BD FD 43 lda ActiveDefenceWeapon,x + 1026 6D42 C9 23 cmp #ind_Parachute______ ; parachute + 1027 6D44 F0 08 beq ParachuteActive + 1028 6D46 C9 24 cmp #ind_StrongParachute ; strong parachute + 1029 6D48 F0 04 beq ParachuteActive + 1030 6D4A C9 28 cmp #ind_Force_Shield___ ; shield witch energy and parachute + 1031 6D4C D0 02 bne TankFallsX + 1032 6D4E ParachuteActive + 1033 6D4E E6 A8 inc Parachute + 1034 6D50 TankFallsX + 1035 ; sound only if really falls + 1036 6D50 A5 A8 lda Parachute + 1037 6D52 2D 63 44 and FallingSoundBit ; bit 1 + 1038 6D55 F0 09 beq NoFallingSound + 1039 6D57 A9 00 8D 63 44 mva #0 FallingSoundBit + 1040 6D5C A9 0E 85 9E mva #sfx_shield_off sfx_effect + 1041 6D60 NoFallingSound + 1042 ; clear previous position + 1043 6D60 A9 01 85 AA mva #1 Erase + 1044 6D64 20 2C 6A jsr DrawTankNr + 1045 ; and the parachute (if present) + 1046 6D67 A5 A8 lda Parachute + 1047 6D69 29 01 and #01 + 1048 6D6B F0 03 beq DoNotClearParachute + 1049 ; here we clear the parachute + 1050 ; ldx TankNr + 1051 6D6D 20 66 6C jsr DrawTankParachute + 1052 6D70 DoNotClearParachute + 1053 6D70 A9 00 85 AA mva #0 Erase + 1054 ; ldx TankNr + 1055 6D74 AD 65 44 lda EndOfTheFallFlag ; We only get byte below the tank if still falling + 1056 6D77 D0 2C bne NoGroundCheck + 1057 ; coordinates of the first pixel under the tank + 1058 6D79 A6 6C ldx TankNr + 1059 6D7B 20 70 74 jsr SetupXYdraw.X + 1060 6D7E BD 19 44 lda Ytankstable,x + 1061 6D81 18 clc + 1062 6D82 69 01 adc #1 ; in this point the comment helped us! For the very first + 1063 ; time in our lives! Tada! It opens a new chapter!!! + 1064 6D84 85 63 sta ydraw + 1065 ; + 1066 ; UnderTank1 ; byte under tank + 1067 ; UnderTank2 ; byte under tank reversed (for simple check right direction) + 1068 6D86 A9 08 lda #08 + 1069 6D88 85 72 sta temp ; Loop Counter + 1070 6D8A ByteBelowTank + 1071 6D8A 20 5A 76 jsr point_plot + 1072 6D8D F0 06 beq EmptyPoint2 + 1073 6D8F 38 sec + 1074 6D90 66 96 ror UnderTank2 + 1075 6D92 38 sec + 1076 6D93 B0 04 bcs ROLPoint2 + 1077 6D95 EmptyPoint2 + 1078 6D95 18 clc + 1079 6D96 66 96 ror UnderTank2 + 1080 6D98 18 clc + 1081 6D99 ROLPoint2 + 1082 6D99 26 95 rol UnderTank1 + 1083 6D9B E6 61 D0 02 E6 62 inw xdraw + 1084 6DA1 C6 72 dec temp + 1085 6DA3 D0 E5 bne ByteBelowTank + 1086 6DA5 NoGroundCheck + 1087 6DA5 A6 6C ldx TankNr + 1088 6DA7 BD 19 44 lda Ytankstable,x + 1089 6DAA C9 C7 cmp #screenheight-1 ; tank on lowest position (no falling down) + 1090 6DAC 90 03 4C 71 6E jcs EndOfFall + 1091 6DB1 A5 95 lda UnderTank1 + 1092 6DB3 D0 3C bne NoFallingDown + 1093 ; Tank falling down ---- + 1094 6DB5 A5 A8 lda Parachute + 1095 6DB7 29 01 and #1 + 1096 6DB9 D0 05 bne ParachutePresent + 1097 ; decreasing energy + 1098 6DBB A0 02 ldy #2 ; how much energy to substract if no parachute + 1099 6DBD 20 74 57 jsr DecreaseEnergyX + 1100 6DC0 ParachutePresent + 1101 ; check parachute type + 1102 6DC0 BD FD 43 lda ActiveDefenceWeapon,x + 1103 6DC3 C9 24 cmp #ind_StrongParachute ; strong parachute + 1104 6DC5 D0 18 bne OneTimeParachute + 1105 ; decreasing energy of parachute + 1106 6DC7 A0 01 ldy #1 ; how much parachute energy to substract + 1107 6DC9 20 B0 57 jsr DecreaseShieldEnergyX + 1108 6DCC C0 00 cpy #0 ; is necessary to reduce tenk energy ? + 1109 6DCE F0 03 beq @+ + 1110 6DD0 20 74 57 jsr DecreaseEnergyX + 1111 @ + 1112 ; check energy of parachute + 1113 6DD3 BD A8 43 lda ShieldEnergy,x + 1114 6DD6 D0 07 bne OneTimeParachute + 1115 6DD8 A9 00 lda #$00 + 1116 6DDA 85 A8 sta Parachute + 1117 6DDC 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defence + 1118 6DDF OneTimeParachute + 1119 6DDF A5 A8 lda Parachute + 1120 6DE1 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + 1121 6DE3 85 A8 sta Parachute + 1122 ; tank is falling down - modify coorinates + 1123 6DE5 BD 19 44 lda Ytankstable,x + 1124 6DE8 18 clc + 1125 6DE9 69 01 adc #1 + 1126 6DEB 9D 19 44 sta Ytankstable,x + 1127 6DEE 4C 5A 6E jmp EndOfFCycle + 1128 6DF1 NoFallingDown + 1129 ; check direction (left or right) + 1130 6DF1 A0 06 ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) + 1131 6DF3 B9 33 5C @ lda SlideLeftTable,y + 1132 6DF6 C5 95 cmp UnderTank1 + 1133 6DF8 F0 34 beq FallingLeft + 1134 6DFA C5 96 cmp UnderTank2 + 1135 6DFC F0 05 beq FallingRight + 1136 6DFE 88 dey + 1137 6DFF 10 F2 bpl @- + 1138 6E01 30 54 bmi NoLeftOrRight + 1139 6E03 FallingRight + 1140 ; tank is falling right + 1141 6E03 2C 64 44 bit PreviousFall ; bit 6 - left + 1142 6E06 70 4F bvs EndRightFall + 1143 ; we finish falling right if the tank reached the edge of the screen + 1144 6E08 BD 13 44 lda XtanksTableH,x + 1145 6E0B C9 01 cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + 1146 6E0D D0 05 bne @+ + 1147 6E0F BD 0D 44 lda XtanksTableL,x + 1148 6E12 C9 36 cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + 1149 6E14 B0 41 @ bcs EndRightFall + 1150 6E16 NotRightEdge + 1151 ; tank is falling right - modify coorinates + 1152 6E16 18 clc + 1153 6E17 BD 0D 44 lda XtankstableL,x + 1154 6E1A 69 01 adc #1 + 1155 6E1C 9D 0D 44 sta XtankstableL,x + 1156 6E1F BD 13 44 lda XtankstableH,x + 1157 6E22 69 00 adc #0 + 1158 6E24 9D 13 44 sta XtankstableH,x + 1159 6E27 A9 80 8D 64 44 mva #%10000000 PreviousFall ; set bit 7 - right + 1160 6E2C D0 2C bne EndOfFCycle + 1161 6E2E FallingLeft + 1162 ; tank is falling left + 1163 6E2E 2C 64 44 bit PreviousFall ; bit 7 - right + 1164 6E31 30 24 bmi EndLeftFall + 1165 ; we finish falling left if the tank reached the edge of the screen + 1166 6E33 BD 13 44 lda XtanksTableH,x + 1167 6E36 D0 07 bne NotLeftEdge + 1168 6E38 BD 0D 44 lda XtanksTableL,x + 1169 6E3B C9 03 cmp #3 ; 2 pixels correction due to a barrel wider than tank + 1170 6E3D 90 18 bcc EndLeftFall + 1171 6E3F NotLeftEdge + 1172 ; tank is falling left - modify coorinates + 1173 6E3F 38 sec + 1174 6E40 BD 0D 44 lda XtankstableL,x + 1175 6E43 E9 01 sbc #1 + 1176 6E45 9D 0D 44 sta XtankstableL,x + 1177 6E48 BD 13 44 lda XtankstableH,x + 1178 6E4B E9 00 sbc #0 + 1179 6E4D 9D 13 44 sta XtankstableH,x + 1180 6E50 A9 40 8D 64 44 mva #%01000000 PreviousFall ; set bit 6 - left + 1181 6E55 D0 03 bne EndOfFCycle + 1182 6E57 EndLeftFall + 1183 6E57 EndRightFall + 1184 6E57 NoLeftOrRight + 1185 6E57 EE 65 44 inc EndOfTheFallFlag ; after this is shouldn't fall + 1186 6E5A EndOfFCycle + 1187 ; draw tank on new position + 1188 6E5A 20 2C 6A jsr DrawTankNr ; ew have TankNr in X (I hope :) ) + 1189 ; checking is parachute present and if so, draw it + 1190 6E5D A5 A8 lda Parachute + 1191 6E5F C9 03 cmp #3 ; parachute and falling + 1192 6E61 D0 06 bne DoNotDrawParachute + 1193 ; here we draw parachute + 1194 ; ldx TankNr + 1195 6E63 20 66 6C jsr DrawTankParachute + 1196 6E66 20 89 5A jsr WaitOneFrame ; only if tank with parachute + 1197 6E69 RapidFalling + 1198 6E69 DoNotDrawParachute + 1199 6E69 AD 65 44 lda EndOfTheFallFlag + 1200 6E6C D0 03 4C 50 6D jeq TankFallsX + 1201 ; Tank falling down already finished, but it is not sure that + 1202 ; the horizontal coordinate is even. + 1203 ; If it is odd then it must be corrected because otherwise + 1204 ; P/M graphics background would not look OK + 1205 ; ldx TankNr + 1206 ; x correction for P/M + 1207 ; -- + 1208 .IF XCORRECTION_FOR_PM = 1 + 1209 lda XtanksTableL,x + 1210 and #$01 + 1211 beq EndOfFall ; if it is even then it is the end + 1212 ; and if not, we push it one pixel the way it was falling before + 1213 lda #%10000000 ; set "virtual ground" for right falling + 1214 ldy #%00000001 + 1215 bit PreviousFall + 1216 bmi ForceFallLeft + 1217 tay ; tricky - replaces ldy #%10000000 + 1218 lda #%00000001 ; set "virtual ground" for left falling + 1219 ForceFallLeft + 1220 sta UnderTank1 + 1221 sty UnderTank2 + 1222 jmp TankFallsX + 1223 .ENDIF + 1224 ; -- + 1225 6E71 EndOfFall + 1226 6E71 A9 01 85 AA mva #1 Erase + 1227 ; ldx TankNr + 1228 ; if tank was falling down having parachute, + 1229 ; we must deduct one parachute + 1230 6E75 A5 A8 lda Parachute + 1231 6E77 C9 03 cmp #$03 ; was falling down and the parachute + 1232 6E79 D0 0C bne NoParachuteWeapon + 1233 ; first we check type of parachute + 1234 6E7B BD FD 43 lda ActiveDefenceWeapon,x + 1235 6E7E C9 23 cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) + 1236 6E80 D0 05 bne NoParachuteWeapon + 1237 6E82 A9 00 9D FD 43 mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) + 1238 6E87 NoParachuteWeapon + 1239 ; now we clear parachute on the screen if present + 1240 6E87 A5 A8 lda Parachute + 1241 6E89 29 01 and #01 + 1242 6E8B F0 03 beq ThereWasNoParachute + 1243 6E8D 20 66 6C jsr DrawTankParachute + 1244 6E90 ThereWasNoParachute + 1245 6E90 A9 00 85 AA mva #0 Erase + 1246 ; ldx TankNr + 1247 6E94 20 2C 6A jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) + 1248 6E97 A9 15 85 9E mva #sfx_silencer sfx_effect + 1249 6E9B 60 rts + 1250 + 1251 .endp + 1252 + 1253 ;-------------------------------------------------- + 1254 6E9C .proc ClearPMmemory + 1255 ;-------------------------------------------------- + 1256 + 1257 6E9C A9 00 lda #$00 + 1258 6E9E A8 tay + 1259 6E9F 99 00 1B @ sta pmgraph+$300,y + 1260 6EA2 99 00 1C sta pmgraph+$400,y + 1261 6EA5 99 00 1D sta pmgraph+$500,y + 1262 6EA8 99 00 1E sta pmgraph+$600,y + 1263 6EAB 99 00 1F sta pmgraph+$700,y + 1264 6EAE C8 iny + 1265 6EAF D0 EE bne @- + 1266 6EB1 60 rts + 1267 .endp + 1268 + 1269 ;-------------------------------------------------- + 1270 6EB2 .proc drawmountains + 1271 ;-------------------------------------------------- + 1272 6EB2 A9 00 85 61 85 62 mwa #0 xdraw + 1273 6EB8 A9 3E 85 76 A9 46 + mwa #mountaintable modify + 1274 6EC0 A9 01 85 A9 mva #1 color + 1275 + 1276 6EC4 drawmountainsloop + 1277 6EC4 A0 00 ldy #0 + 1278 6EC6 B1 76 lda (modify),y + 1279 6EC8 C9 C8 cmp #screenheight + 1280 6ECA F0 0F beq NoMountain + 1281 6ECC 85 63 sta ydraw + 1282 6ECE 84 64 sty ydraw+1 + 1283 .IF FASTER_GRAF_PROCS = 1 + 1284 ; there was Drawline proc + 1285 lda #screenheight + 1286 sec + 1287 sbc ydraw + 1288 sta tempbyte01 + 1289 jsr plot.MakePlot + 1290 ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) + 1291 ; jmp IntoDraw ; jumps inside Draw routine + 1292 ; because one pixel is already plotted (and who cares? :) ) + 1293 @ + 1294 lda (xbyte),y + 1295 and bittable2,x + 1296 sta (xbyte),y + 1297 ;IntoDraw + 1298 adw xbyte #screenBytes + 1299 dec tempbyte01 + 1300 bne @- + 1301 ; end of Drawline proc + 1302 .ELSE + 1303 ; there was Drawline proc + 1304 6ED0 drawline + 1305 6ED0 20 2C 76 jsr plot.MakePlot + 1306 6ED3 E6 63 inc ydraw + 1307 6ED5 A5 63 lda ydraw + 1308 6ED7 C9 C8 cmp #screenheight + 1309 6ED9 D0 F5 bne drawline + 1310 ; end of Drawline proc + 1311 .ENDIF + 1312 6EDB NoMountain + 1313 6EDB E6 76 D0 02 E6 77 inw modify + 1314 6EE1 E6 61 D0 02 E6 62 inw xdraw + 1315 6EE7 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 1316 6EF1 D0 D1 bne drawmountainsloop + 1317 6EF3 60 rts + 1318 /* + 1319 ;-------------------------------------------------- + 1320 drawmountainspixel ; never used ? + 1321 ;-------------------------------------------------- + 1322 mwa #0 xdraw + 1323 mwa #mountaintable modify + 1324 drawmountainspixelloop + 1325 ldy #0 + 1326 lda (modify),y + 1327 sta ydraw + 1328 sty ydraw+1 + 1329 jsr plot + 1330 inw modify + 1331 inw xdraw + 1332 cpw xdraw #screenwidth + 1333 bne drawmountainspixelloop + 1334 rts + 1335 */ + 1335 + 1336 .endp + 1337 ;-------------------------------------------------- + 1338 6EF4 .proc SoilDown2 + 1339 ;-------------------------------------------------- + 1340 + 1341 ; how it is supposed to work: + 1342 ; first loop is looking for the highest pixels + 1343 ; and fills with their Y coordinates both temporary tables + 1344 ; + 1345 ; second (main) loop works this way: + 1346 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) + 1347 ; goes through the horizontal line checking if + 1348 ; Y coordinate from the first table equals to height of the peak + 1349 ; if so, it goes further + 1350 ; if not: + 1351 ; sets end-of-soil-fall-down-flag to 0 + 1352 ; increases Y from the first table + 1353 ; if there is no pixel there it plots here and + 1354 ; zeroes pixel from the second table and after that + 1355 ; increases Y of the second table + 1356 ; repeats with next pixels au to the end of the line + 1357 ; if the flag is 0 then repeat the main loop + 1358 ; and that's it :) + 1359 ; + 1360 ; I am sorry but after these 4 years I have no idea + 1361 ; how it works. I have just translated Polish comment + 1362 ; but I do not understand a word of it :) + 1363 ; If you know how it works, please write here :)))) + 1364 6EF4 20 0B 6A jsr ClearTanks + 1365 6EF7 NoClearTanks + 1366 + 1367 ; Fix for lonely pixel after nuclear winter :) #103 + 1368 6EF7 A9 00 lda #0 + 1369 6EF9 85 61 sta xdraw + 1370 6EFB 85 62 sta xdraw+1 + 1371 6EFD 85 63 sta ydraw + 1372 6EFF 85 64 sta ydraw+1 + 1373 6F01 85 A9 sta color + 1374 6F03 20 14 76 jsr plot + 1375 + 1376 ; First we look for highest pixels and fill with their coordinates + 1377 ; both tables + 1378 + 1379 6F06 A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw + 1380 6F0E 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp + 1381 6F1B 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 + 1382 + 1383 6F28 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1384 6F32 90 03 4C FC 6F jcs NothingToFall + 1385 + 1386 6F37 NextColumn1 + 1387 6F37 A9 00 85 63 85 64 mwa #0 ydraw + 1388 6F3D NextPoint1 + 1389 6F3D 20 5A 76 jsr point_plot + 1390 6F40 F0 0B beq StillNothing + 1391 6F42 A0 00 ldy #0 + 1392 6F44 A5 63 lda ydraw + 1393 6F46 91 7E sta (tempor2),y + 1394 6F48 91 72 sta (temp),y + 1395 6F4A 4C 5D 6F jmp FoundPeek1 + 1396 6F4D StillNothing + 1397 6F4D E6 63 inc ydraw + 1398 6F4F A5 63 lda ydraw + 1399 6F51 C9 C8 cmp #screenheight + 1400 6F53 D0 E8 bne NextPoint1 + 1401 ; no pixels on whole column !!! + 1402 6F55 A0 00 ldy #0 + 1403 6F57 A5 63 lda ydraw + 1404 6F59 91 7E sta (tempor2),y + 1405 6F5B 91 72 sta (temp),y + 1406 6F5D FoundPeek1 + 1407 6F5D E6 7E D0 02 E6 7F inw tempor2 + 1408 6F63 E6 72 D0 02 E6 73 inw temp + 1409 6F69 E6 61 D0 02 E6 62 inw xdraw + 1410 ;vcmp xdraw,screenwidth,NextColumn1 + 1411 6F6F A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1412 6F79 90 BC bcc NextColumn1 + 1413 6F7B F0 BA beq NextColumn1 + 1414 ; we have both tables filled with starting values + 1415 + 1416 ; main loop starts here + 1417 6F7D MainFallout2 + 1418 6F7D A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw + 1419 6F85 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp + 1420 6F92 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 + 1421 + 1422 6F9F A9 01 85 9D mva #1 IsEndOfTheFallFlag + 1423 6FA3 FalloutOfLine + 1424 6FA3 A0 00 ldy #0 + 1425 + 1426 ; is Y coordinate from the first table + 1427 ; equal to peak height, if so, go ahead + 1428 6FA5 B1 7E lda (tempor2),y + 1429 6FA7 C9 C7 cmp #screenheight-1 ;cmp (temp),y + 1430 6FA9 B0 2B bcs ColumnIsReady + 1431 ; in the other case there are things to be done + 1432 6FAB 84 9D sty IsEndOfTheFallFlag ; flag to 0 + 1433 ; we are increasing Y in the first table + 1434 ;lda (tempor2),y + 1435 6FAD 18 clc + 1436 6FAE 69 01 adc #1 + 1437 6FB0 91 7E sta (tempor2),y + 1438 ; and checking if there is a pixel there + 1439 6FB2 85 63 sta ydraw + 1440 6FB4 20 5A 76 jsr point_plot + 1441 6FB7 D0 1D bne ThereIsPixelHere + 1442 ; if no pixel we plot it + 1443 6FB9 A9 01 85 A9 mva #1 color + 1444 6FBD 20 2C 76 jsr plot.MakePlot + 1445 ; zeroing pixel from the second table + 1446 ; and increase Y in second table + 1447 6FC0 A0 00 ldy #0 + 1448 6FC2 B1 72 lda (temp),y + 1449 6FC4 85 63 sta ydraw + 1450 6FC6 B1 72 lda (temp),y + 1451 6FC8 18 clc + 1452 6FC9 69 01 adc #1 + 1453 6FCB 91 72 sta (temp),y + 1454 6FCD 84 A9 sty color + 1455 6FCF 20 2C 76 jsr plot.MakePlot + 1456 6FD2 A9 15 85 9E mva #sfx_silencer sfx_effect + 1457 + 1458 6FD6 ThereIsPixelHere + 1459 6FD6 ColumnIsReady + 1460 6FD6 E6 72 D0 02 E6 73 inw temp + 1461 6FDC E6 7E D0 02 E6 7F inw tempor2 + 1462 6FE2 E6 61 D0 02 E6 62 inw xdraw + 1463 ;vcmp xdraw,screenwidth,FalloutOfLine + 1464 6FE8 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1465 6FF2 90 AF bcc FalloutOfLine + 1466 6FF4 F0 AD beq FalloutOfLine + 1467 + 1468 6FF6 A5 9D lda IsEndOfTheFallFlag + 1469 ; we repeat untill at some point first table reaches + 1470 ; level of the mountains + 1471 6FF8 F0 83 jeq MainFallout2 + 1472 ; now correct heights are in the mountaintable + 1473 6FFA 85 A9 sta color ; Pozor! :) we know - now A=1 + 1474 6FFC NothingToFall + 1475 6FFC A9 15 85 9E mva #sfx_silencer sfx_effect + 1476 7000 20 12 6A jsr DrawTanks + 1477 7003 60 rts + 1478 .endp + 1479 + 1480 ;-------------------------------------------------- + 1481 7004 .proc calculatemountains + 1482 ;-------------------------------------------------- + 1483 7004 A9 00 85 61 85 62 mwa #0 xdraw + 1484 + 1485 ; starting point + 1486 700A getrandomY ;getting random Y coordinate + 1487 700A 38 sec + 1488 700B AD 1B D4 lda random + 1489 700E C9 28 cmp #screenheight-(margin*4) ;it means that max line=199 + 1490 7010 B0 F8 bcs getrandomY + 1491 7012 18 clc + 1492 7013 69 50 adc #(margin*2) + 1493 7015 85 63 sta ydraw + 1494 7017 8D D3 44 sta yfloat+1 + 1495 701A A9 00 8D D2 44 mva #0 yfloat ;yfloat equals to e.g. 140.0 + 1496 701F A9 9B 8D D3 44 mva #screenheight-margin-5 yfloat+1 + 1497 7024 85 63 sta ydraw + 1498 + 1499 ; how to make nice looking mountains? + 1500 ; randomize points and join them with lines + 1501 ; Here we do it simpler way - we randomize X (or deltaX) + 1502 ; and "delta" (change of Y coordinate) + 1503 + 1504 7026 NextPart + 1505 7026 AD 1B D4 lda random + 1506 7029 2D 4B 41 and mountainDeltaL + 1507 702C 85 C3 sta delta ; it is after the dot (xxx.delta) + 1508 702E AD 1B D4 lda random + 1509 7031 2D 4A 41 and mountainDeltaH ;(max delta) + 1510 7034 85 C4 sta delta+1 ; before the dot (delta+1.delta) + 1511 + 1512 7036 AD 1B D4 lda random + 1513 7039 29 01 and #$01 ;random sign (+/- or up/down) + 1514 703B 8D D5 44 sta UpNdown + 1515 + 1516 ; theoretically we have here ready + 1517 ; fixed-point delta value + 1518 ; (-1*(UpNdown))*(delta+1.delta) + 1519 + 1520 ;loop drawing one line + 1521 + 1522 703E ChangingDirection + 1523 703E AD 1B D4 lda random ;length of the line + 1524 7041 29 0F and #$0f ;max line length + 1525 7043 AA tax + 1526 7044 E8 inx + 1527 7045 E8 inx + 1528 7046 E8 inx + 1529 7047 8E D4 44 stx deltaX + 1530 + 1531 704A OnePart + 1532 704A 20 E6 69 jsr placeTanks.CheckTank + 1533 ; checks if at a given X coordinate + 1534 ; is any tank and if so + 1535 ; changes parameters of drawing + 1536 ; to generate flat 8 pixels + 1537 ; (it will be the place for the tank) + 1538 ; it also stores Y position of the tank + 1539 704D 18 A5 61 69 3E 85 + adw xdraw #mountaintable modify + 1540 + 1541 705A A5 63 lda ydraw + 1542 705C A0 00 ldy #0 + 1543 705E 91 76 sta (modify),y + 1544 + 1545 ; Up or Down + 1546 7060 AD D5 44 lda UpNdown + 1547 7063 F0 20 beq ToBottom + 1548 + 1549 7065 ToTop ;it means substracting + 1550 + 1551 7065 38 AD D2 44 E5 C3 + sbw yfloat delta + 1552 7076 AD D3 44 lda yfloat+1 + 1553 7079 C9 28 cmp #margin + 1554 707B B0 25 bcs @+ + 1555 ; if smaller than 10 + 1556 707D A2 00 ldx #$00 + 1557 707F 8E D5 44 stx UpNdown + 1558 7082 4C A2 70 jmp @+ + 1559 + 1560 7085 ToBottom + 1561 7085 18 AD D2 44 65 C3 + adw yfloat delta + 1562 7096 AD D3 44 lda yfloat+1 + 1563 7099 C9 A0 cmp #screenheight-margin + 1564 709B 90 05 bcc @+ + 1565 ; if higher than screen + 1566 709D A2 01 ldx #$01 + 1567 709F 8E D5 44 stx UpNdown + 1568 @ + 1569 70A2 85 63 sta ydraw + 1570 + 1571 70A4 E6 61 D0 02 E6 62 inw xdraw + 1572 + 1573 70AA A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 1574 70B4 F0 08 beq EndDrawing + 1575 + 1576 70B6 CE D4 44 dec deltaX + 1577 70B9 D0 8F bne OnePart + 1578 + 1579 70BB 4C 26 70 jmp NextPart + 1580 70BE EndDrawing + 1581 + 1582 70BE 60 rts + 1583 .endp + 1584 + 1585 /* + 1586 ;-------------------------------------------------- + 1587 .proc calculatemountains0 + 1588 ; Only for testing - makes ground flat (0 pixels) + 1589 ; and places tanks on it + 1590 ; remember to remove in final compilation :) + 1591 ;-------------------------------------------------- + 1592 mwa #0 xdraw + 1593 nextPointDrawing + 1594 adw xdraw #mountaintable modify + 1595 lda #screenheight + 1596 ldy #0 + 1597 sta (modify),y + 1598 inw xdraw + 1599 cpw xdraw #screenwidth + 1600 bne nextPointDrawing + 1601 ldx NumberOfPlayers + 1602 dex + 1603 SetYofNextTank + 1604 lda #screenheight-1 + 1605 sta ytankstable,x + 1606 dex + 1607 bpl SetYofNextTank + 1608 rts + 1609 .endp + 1610 */ + 1610 + 1611 + 1612 ;-------------------------------------------------- + 1613 70BF .proc CheckMaxMountain + 1614 ; in A return y coordinate of highest mountain + 1615 ;-------------------------------------------------- + 1616 70BF A9 3E 85 76 A9 46 + mwa #mountaintable modify + 1617 70C7 A0 00 ldy #0 + 1618 70C9 A2 C7 ldx #screenheight-1 + 1619 70CB nextPointChecking + 1620 70CB 8A txa + 1621 70CC D1 76 cmp (modify),y + 1622 70CE 90 03 bcc NotHigher + 1623 70D0 B1 76 lda (modify),y + 1624 70D2 AA tax + 1625 70D3 NotHigher + 1626 70D3 E6 76 D0 02 E6 77 inw modify + 1627 70D9 A5 77 C9 47 D0 04 + cpw modify #(mountaintable+screenwidth) + 1628 70E3 D0 E6 bne nextPointChecking + 1629 70E5 8A txa + 1630 70E6 60 rts + 1631 .endp + 1632 + 1633 + 1634 ;-------------------------------------------------- + 1635 70E7 .proc TypeChar + 1636 ; puts char on the graphics screen + 1637 ; in: CharCode + 1638 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) + 1639 ;-------------------------------------------------- + 1640 ; char to the table + 1641 70E7 A5 69 lda CharCode + 1642 70E9 85 6A sta fontind + 1643 70EB A9 00 lda #$00 + 1644 70ED 85 6B sta fontind+1 + 1645 ; char intex times 8 + 1646 70EF aslw fontind +Macro: ASLW [Source: MACRO.ASM] + 1 70EF 06 6A ASL FONTIND + 2 70F1 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1647 70F3 rolw fontind +Macro: ROLW [Source: MACRO.ASM] + 1 70F3 26 6A ROL FONTIND + 2 70F5 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1648 70F7 rolw fontind +Macro: ROLW [Source: MACRO.ASM] + 1 70F7 26 6A ROL FONTIND + 2 70F9 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1649 + 1650 70FB 18 A5 6A 69 46 85 + adw fontind #TankFont + 1651 + 1652 ; and 8 bytes to the table + 1653 7108 A0 07 ldy #7 + 1654 710A CopyChar + 1655 710A B1 6A lda (fontind),y + 1656 710C 49 FF eor #$ff + 1657 710E 99 C0 44 sta char1,y + 1658 7111 A9 FF lda #$ff + 1659 7113 99 C8 44 sta char2,y + 1660 7116 88 dey + 1661 7117 10 F1 bpl CopyChar + 1662 ; and 8 subsequent bytes as a mask + 1663 7119 18 A5 6A 69 08 85 + adw fontind #8 + 1664 7124 A0 07 ldy #7 + 1665 7126 CopyMask + 1666 7126 B1 6A lda (fontind),y + 1667 7128 49 FF eor #$ff + 1668 712A 99 B0 44 sta mask1,y + 1669 712D A9 00 lda #$00 + 1670 712F 99 B8 44 sta mask2,y + 1671 7132 88 dey + 1672 7133 10 F1 bpl CopyMask + 1673 + 1674 .IF FASTER_GRAF_PROCS = 1 + 1675 ; calculating coordinates from xdraw and ydraw + 1676 mwa xdraw xbyte + 1677 + 1678 lda xbyte + 1679 and #$7 + 1680 sta ybit + 1681 + 1682 lsrw xbyte ; div 8 + 1683 rorw xbyte + 1684 rorw xbyte + 1685 ;--- + 1686 ldy xbyte + 1687 + 1688 lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? + 1689 sec + 1690 sbc #7 + 1691 tax + 1692 + 1693 lda linetableL,x + 1694 sta xbyte + 1695 lda linetableH,x + 1696 sta xbyte+1 + 1697 ; mask preparation and character shifting + 1698 ldx ybit + 1699 beq MaskOK00 + 1700 MakeMask00 + 1701 .rept 8 + 1702 lsr mask1+# + 1703 ror mask2+# + 1704 .endr + 1705 sec + 1706 .rept 8 + 1707 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 1708 ror char2+# + 1709 .endr + 1710 dex + 1711 bne MakeMask00 + 1712 MaskOK00 + 1713 ; here x=0 + 1714 lda Erase + 1715 beq CharLoopi ; it works, because x=0 + 1716 lda #$ff + 1717 ldx #7 + 1718 EmptyChar + 1719 sta char1,x + 1720 sta char2,x + 1721 dex + 1722 bpl EmptyChar + 1723 ldx #0 + 1724 CharLoopi + 1725 lda (xbyte),y + 1726 ora mask1,x + 1727 and char1,x + 1728 sta (xbyte),y + 1729 iny + 1730 lda (xbyte),y + 1731 ora mask2,x + 1732 and char2,x + 1733 sta (xbyte),y + 1734 dey + 1735 adw xbyte #screenBytes + 1736 inx + 1737 cpx #8 + 1738 bne CharLoopi + 1739 .ELSE + 1740 7135 A2 07 86 72 mvx #7 temp ; line counter (Y) + 1741 7139 CharLoop1 + 1742 7139 A9 07 85 73 mva #7 temp+1 ; pixel counter (X) + 1743 713D CharLoop2 + 1744 713D A9 00 85 A9 mva #0 color + 1745 7141 3E B0 44 rol mask1,x + 1746 7144 90 38 bcc NoMaskNoPlot + 1747 7146 3E C0 44 rol char1,x + 1748 7149 B0 06 bcs NoPlot + 1749 714B MakeCharPlot + 1750 714B A5 AA lda Erase + 1751 714D D0 02 bne ErasingChar + 1752 714F E6 A9 inc color + 1753 7151 ErasingChar + 1754 7151 NoPlot + 1755 7151 20 2C 76 jsr plot.MakePlot + 1756 7154 AfterCharPlot + 1757 7154 E6 61 D0 02 E6 62 inw xdraw + 1758 715A A6 72 ldx temp + 1759 715C C6 73 dec temp+1 + 1760 715E 10 DD bpl CharLoop2 + 1761 7160 38 sec + 1762 7161 38 A5 61 E9 08 85 + sbw xdraw #8 + 1763 716C C6 63 dec ydraw + 1764 716E A6 72 ldx temp + 1765 7170 CA dex + 1766 7171 86 72 stx temp + 1767 7173 10 C4 bpl CharLoop1 + 1768 7175 18 clc + 1769 7176 A5 63 lda ydraw + 1770 7178 69 08 adc #8 + 1771 717A 85 63 sta ydraw + 1772 717C D0 06 bne EndPutChar + 1773 717E NoMaskNoPlot + 1774 717E 3E C0 44 rol char1,x + 1775 7181 4C 54 71 jmp AfterCharPlot + 1776 .ENDIF + 1777 7184 EndPutChar + 1778 7184 60 rts + 1779 .endp + 1780 + 1781 ;-------------------------------------------------- + 1782 7185 .proc PutChar4x4 + 1783 ; puts 4x4 pixels char on the graphics screen + 1784 ; in: dx, dy (LOWER left corner of the char) + 1785 ; in: CharCode4x4 (.sbyte) + 1786 ; in: plot4x4color (0/255) + 1787 ; all pixels are being drawn + 1788 ; (empty and not empty) + 1789 ;-------------------------------------------------- + 1790 7185 A5 8E C9 00 D0 04 + cpw dy #(screenheight-1) + 1791 718F B0 F3 jcs TypeChar.EndPutChar ;nearest RTS + 1792 7191 A5 8E C9 00 D0 04 + cpw dy #(4) + 1793 719B 90 E7 jcc TypeChar.EndPutChar ;nearest RTS + 1794 719D A5 8C C9 01 D0 04 + cpw dx #(screenwidth-4) + 1795 71A7 B0 DB jcs TypeChar.EndPutChar ;nearest RTS + 1796 ; checks ommited. + 1797 ; char to the table + 1798 71A9 AD EC 48 lda CharCode4x4 + 1799 71AC 29 01 and #%00000001 + 1800 71AE F0 02 beq Upper4bits + 1801 71B0 A9 FF lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) + 1802 71B2 Upper4bits + 1803 71B2 8D EB 48 sta nibbler4x4 + 1804 71B5 AD EC 48 lda CharCode4x4 + 1805 71B8 4A lsr + 1806 71B9 85 6A sta fontind + 1807 71BB A9 00 lda #$00 + 1808 71BD 85 6B sta fontind+1 + 1809 + 1810 71BF 18 A5 6A 69 C6 85 + adw fontind #font4x4 + 1811 + 1812 ; and 4 bytes to the table + 1813 71CC A0 00 ldy #0 + 1814 71CE A2 03 ldx #3 + 1815 71D0 CopyChar + 1816 71D0 B1 6A lda (fontind),y ; Y must be 0 !!!! + 1817 71D2 2C EB 48 bit nibbler4x4 + 1818 71D5 10 04 bpl GetUpper4bits + 1819 71D7 2A 2A 2A 2A :4 rol + 1820 71DB GetUpper4bits + 1821 71DB 09 0F ora #$0f + 1822 71DD 9D C0 44 sta char1,x + 1823 71E0 A9 FF lda #$ff + 1824 71E2 9D C8 44 sta char2,x + 1825 ; and 4 bytes as a mask + 1826 71E5 A9 F0 lda #$f0 + 1827 71E7 9D B0 44 sta mask1,x + 1828 71EA A9 00 lda #$00 + 1829 71EC 9D B8 44 sta mask2,x + 1830 71EF 18 A5 6A 69 20 85 + adw fontind #32 ; next byte of 4x4 font + 1831 71FA CA dex + 1832 71FB 10 D3 bpl CopyChar + 1833 + 1834 .IF FASTER_GRAF_PROCS = 1 + 1835 ; calculating coordinates from xdraw and ydraw + 1836 mwa dx xbyte + 1837 + 1838 lda xbyte + 1839 and #$7 + 1840 sta ybit + 1841 + 1842 :3 lsrw xbyte ; div 8 + 1843 ; rorw xbyte + 1844 ; rorw xbyte + 1845 ;--- + 1846 ldy xbyte ; horizontal byte offet stored in Y + 1847 lda dy ; y = y - 3 because left lower. + 1848 sec + 1849 sbc #3 + 1850 tax + 1851 + 1852 lda linetableL,x + 1853 sta xbyte + 1854 lda linetableH,x + 1855 sta xbyte+1 + 1856 ; mask preparation and character shifting + 1857 ldx ybit + 1858 beq MaskOK01 + 1859 MakeMask01 + 1860 .rept 4 + 1861 lsr mask1+# + 1862 ror mask2+# + 1863 .endr + 1864 sec + 1865 .rept 4 + 1866 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 1867 ror char2+# + 1868 .endr + 1869 dex + 1870 bne MakeMask01 + 1871 MaskOK01 + 1872 ldx #0 + 1873 CharLoopi4x4 + 1874 lda (xbyte),y + 1875 ora mask1,x + 1876 bit plot4x4color + 1877 bpl PutInColor0_1 ; only mask - no char + 1878 and char1,x + 1879 PutInColor0_1 + 1880 sta (xbyte),y + 1881 iny + 1882 lda (xbyte),y + 1883 ora mask2,x + 1884 bit plot4x4color + 1885 bpl PutInColor0_2 ; only mask - no char + 1886 and char2,x + 1887 PutInColor0_2 + 1888 sta (xbyte),y + 1889 dey + 1890 adw xbyte #screenBytes + 1891 inx + 1892 cpx #4 + 1893 bne CharLoopi4x4 + 1894 .ELSE + 1895 71FD A5 61 8D C8 44 A5 + mwa xdraw char2 + 1896 7207 A5 63 8D B8 44 A5 + mwa ydraw mask2 + 1897 7211 A5 A9 8D BA 44 mva color mask2+2 + 1898 7216 A5 8B 85 61 A5 8C + mwa dx xdraw + 1899 721E A5 8D 85 63 A5 8E + mwa dy ydraw + 1900 7226 A2 03 86 72 mvx #3 temp ; line counter (Y) + 1901 722A CharLoop1 + 1902 722A A9 03 85 73 mva #3 temp+1 ; pixel counter (X) + 1903 722E CharLoop2 + 1904 722E A9 00 85 A9 mva #0 color + 1905 7232 3E B0 44 rol mask1,x + 1906 7235 90 4A bcc NoMaskNoPlot + 1907 7237 3E C0 44 rol char1,x + 1908 723A B0 06 bcs NoPlot + 1909 723C MakeCharPlot + 1910 723C A5 DB lda plot4x4color + 1911 723E F0 02 beq ErasingChar + 1912 7240 E6 A9 inc color + 1913 7242 ErasingChar + 1914 7242 NoPlot + 1915 7242 20 2C 76 jsr plot.MakePlot + 1916 7245 AfterCharPlot + 1917 7245 E6 61 D0 02 E6 62 inw xdraw + 1918 724B A6 72 ldx temp + 1919 724D C6 73 dec temp+1 + 1920 724F 10 DD bpl CharLoop2 + 1921 7251 38 sec + 1922 7252 38 A5 61 E9 04 85 + sbw xdraw #4 + 1923 725D C6 63 dec ydraw + 1924 725F A6 72 ldx temp + 1925 7261 CA dex + 1926 7262 86 72 stx temp + 1927 7264 10 C4 bpl CharLoop1 + 1928 7266 AD C8 44 85 61 AD + mwa char2 xdraw + 1929 7270 AD B8 44 85 63 AD + mwa mask2 ydraw + 1930 727A AD BA 44 85 A9 mva mask2+2 color + 1931 727F 10 06 bpl EndPut4x4 + 1932 7281 NoMaskNoPlot + 1933 7281 3E C0 44 rol char1,x + 1934 7284 4C 45 72 jmp AfterCharPlot + 1935 .ENDIF + 1936 7287 EndPut4x4 + 1937 7287 60 rts + 1938 .endp + 1939 + 1940 ;-------------------------------------------------------- + 1941 7288 .proc DisplayOffensiveTextNr ; + 1942 7288 AE C0 48 ldx TextNumberOff + 1943 728B BD 2B 9F lda talk.OffensiveTextTableL,x + 1944 728E 85 B3 sta LineAddress4x4 + 1945 7290 BD A0 9F lda talk.OffensiveTextTableH,x + 1946 7293 85 B4 sta LineAddress4x4+1 + 1947 7295 E8 inx ; the next text + 1948 7296 BD A0 9F lda talk.OffensiveTextTableH,x + 1949 7299 85 73 sta temp+1 + 1950 729B BD 2B 9F lda talk.OffensiveTextTableL,x + 1951 729E 85 72 sta temp ; opty possible + 1952 ; substract address of the next text from previous to get text length + 1953 72A0 38 A5 72 E5 B3 85 + sbw temp LineAddress4x4 temp2 + 1954 72AD A5 74 85 83 mva temp2 fx + 1955 + 1956 ;jsr Display4x4AboveTank + 1957 ;rts + 1958 ; POZOR !!! + 1959 .endp + 1960 + 1961 ;-------------------------------------------------------- + 1962 72B1 .proc Display4x4AboveTank ; + 1963 ; Displays texts using PutChar4x4 above tank and mountains. + 1964 ; Pretty cool, eh! + 1965 ;parameters are: + 1966 ;Y - number of tank above which text is displayed + 1967 ;fx - length of text + 1968 ;LineAddress4x4 - address of the text + 1969 + 1970 ;lets calculate position of the text first! + 1971 ;that's easy because we have number of tank + 1972 ;and xtankstableL and H keep X position of a given tank + 1973 + 1974 72B1 B9 0D 44 lda xtankstableL,y + 1975 72B4 85 72 sta temp + 1976 72B6 B9 13 44 lda xtankstableH,y + 1977 72B9 85 73 sta temp+1 + 1978 ;now we should substract length of the text-1 + 1979 ;temp2 = (fx-1)*2 + 1980 72BB A4 83 ldy fx + 1981 72BD 88 dey + 1982 72BE 98 tya + 1983 72BF 0A asl + 1984 72C0 85 74 sta temp2 + 1985 72C2 A9 00 85 75 mva #0 temp2+1 + 1986 ;now we have HALF length in pixels + 1987 ;stored in temp2 + 1988 + 1989 ;here we assume max length of text + 1990 ;to display is 127 chars, but later it turns out it must be max 63! + 1991 + 1992 72C6 38 A5 72 E5 74 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!! + 1993 ;now we should check overflows + 1994 ;lda temp+1 ; opty + 1995 72D3 10 08 bpl DOTNnotLessThanZero + 1996 ;less than zero, so should be zero + 1997 72D5 A9 00 85 72 85 73 mwa #0 temp + 1998 72DB F0 32 beq DOTNnoOverflow + 1999 + 2000 72DD DOTNnotLessThanZero + 2001 ;so check if end larger than screenwidth + 2002 + 2003 + 2004 72DD A5 83 lda fx + 2005 72DF 0A asl + 2006 72E0 0A asl + 2007 ;length in pixels - + 2008 ;text length max 63 chars !!!!!!!! + 2009 + 2010 + 2011 72E1 18 clc + 2012 72E2 65 72 adc temp + 2013 72E4 85 74 sta temp2 + 2014 72E6 A9 00 lda #0 + 2015 72E8 65 73 adc temp+1 + 2016 72EA 85 75 sta temp2+1 + 2017 ;now in temp2 is end of the text in pixels + 2018 ;so check if not greater than screenwitdth + 2019 72EC A5 75 C9 01 D0 04 + cpw temp2 #screenwidth + 2020 72F6 90 17 bcc DOTNnoOverflow + 2021 + 2022 ;if end is greater than screenwidth + 2023 ;then screenwidth - length is fine + 2024 72F8 A5 83 lda fx + 2025 72FA 0A asl + 2026 72FB 0A asl + 2027 72FC 85 72 sta temp + 2028 72FE A9 00 85 73 mva #0 temp+1 + 2029 + 2030 7302 38 sec + 2031 7303 A9 3F lda #<(screenwidth-1) + 2032 7305 E5 72 sbc temp + 2033 7307 85 72 sta temp + 2034 7309 A9 01 lda #>(screenwidth-1) + 2035 730B E5 73 sbc temp+1 + 2036 730D 85 73 sta temp+1 + 2037 730F DOTNnoOverflow + 2038 ;here in temp we have really good x position of text + 2039 + 2040 730F A5 72 85 D9 A5 73 + mwa temp LineXdraw + 2041 + 2042 ;now let's get y position + 2043 ;we will try to put text as low as possible + 2044 ;just above mountains (so mountaintable will be checked) + 2045 7317 A5 83 lda fx + 2046 7319 0A asl + 2047 731A 0A asl + 2048 731B A8 tay + 2049 ;in temp there still is X position of text + 2050 ;if we add temp and Y we will get end of the text + 2051 ;so, lets go through mountaintable and look for + 2052 ;the lowest value within + 2053 ;Mountaitable+temp and Mountaitable+temp+Y + 2054 + 2055 731C 18 A5 72 69 3E 85 + adw temp #MountainTable + 2056 + 2057 7329 A9 C8 85 74 mva #screenheight temp2 ;initialisation of the lowest value + 2058 + 2059 732D DOTLowestMountainValueLoop + 2060 732D B1 72 lda (temp),y + 2061 732F C5 74 cmp temp2 + 2062 7331 B0 02 bcs DOTOldLowestValue ;old lowest value + 2063 ;new lowest value + 2064 7333 85 74 sta temp2 + 2065 7335 DOTOldLowestValue + 2066 7335 88 dey + 2067 7336 C0 FF cpy #$ff + 2068 7338 D0 F3 bne DOTLowestMountainValueLoop + 2069 + 2070 733A 38 sec + 2071 733B A5 74 lda temp2 + 2072 733D E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...) + 2073 733F 85 D8 sta LineYdraw + 2074 + 2075 7341 4C 76 73 jmp TypeLine4x4.noLengthNoColor ; rts + 2076 + 2077 .endp + 2078 + 2079 ;-------------------------------------------------------- + 2080 7344 .proc DisplayTankNameAbove ; + 2081 7344 A5 6C lda tankNr + 2082 7346 0A 0A 0A :3 asl ; *8 + 2083 7349 18 clc + 2084 734A 69 09 adc #Tanksnames + 2088 7352 85 73 sta temp+1 ; TextAddress+1 + 2089 7354 A5 72 85 B3 A5 73 + mwa temp LineAddress4x4 + 2090 + 2091 ;find length of the tank's name + 2092 735C A0 07 ldy #7 + 2093 @ + 2094 735E B1 72 lda (temp),y + 2095 7360 D0 03 bne end_found + 2096 7362 88 dey + 2097 7363 D0 F9 bne @- + 2098 + 2099 7365 end_found + 2100 7365 C8 iny + 2101 7366 84 83 sty fx + 2102 7368 A4 6C ldy tankNr + 2103 736A 20 B1 72 jsr Display4x4AboveTank + 2104 736D 60 rts + 2105 .endp + 2106 + 2107 ;------------------------------- + 2108 736E .proc TypeLine4x4 ; + 2109 ;------------------------------- + 2110 ;this routine prints line of length `fx` + 2111 ;address in LineAddress4x4 + 2112 ;starting from LineXdraw, LineYdraw + 2113 + 2114 736E A9 0E lda #14 ; default length of 4x4 texts + 2115 7370 85 83 sta fx + 2116 + 2117 7372 variableLength + 2118 7372 A9 FF lda #$ff ; $ff - visible characters, $00 - clearing + 2119 + 2120 7374 staplot4x4color + 2121 7374 85 DB sta plot4x4color + 2122 7376 noLengthNoColor + 2123 + 2124 7376 A0 00 ldy #0 + 2125 7378 8C E9 48 sty LineCharNr + 2126 + 2127 737B TypeLine4x4Loop + 2128 737B AC E9 48 ldy LineCharNr + 2129 + 2130 737E B1 B3 lda (LineAddress4x4),y + 2131 7380 29 3F and #$3f ;always CAPITAL letters + 2132 7382 8D EC 48 sta CharCode4x4 + 2133 7385 A5 D9 85 8B A5 DA + mwa LineXdraw dx + 2134 738D A5 D8 85 8D mva LineYdraw dy + 2135 7391 A9 00 85 8E mva #0 dy+1 ; dy is 2 bytes value + 2136 7395 20 85 71 jsr PutChar4x4 ;type empty pixels as well! + 2137 7398 18 A5 D9 69 04 85 + adw LineXdraw #4 + 2138 73A3 EE E9 48 AD E9 48 inc:lda LineCharNr + 2139 73A9 C5 83 cmp fx + 2140 73AB D0 CE bne TypeLine4x4Loop + 2141 + 2142 73AD EndOfTypeLine4x4 + 2143 73AD 60 rts + 2144 .endp + 2145 + 2146 + 2147 ;-------------------------------- + 2148 73AE .proc AreYouSure + 2149 ;using 4x4 font + 2150 + 2151 73AE A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen + 2152 + 2153 ;top frame + 2154 73B2 A5 B2 85 D8 mva ResultY LineYdraw + 2155 73B6 20 E8 65 jsr TL4x4_top + 2156 73B9 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2157 + 2158 ;sure? + 2159 73C0 A9 5D 85 B3 A9 5B + mwa #areYouSureText LineAddress4x4 + 2160 73C8 20 02 74 jsr _sep_opty + 2161 ;bottom frame + 2162 73CB A5 B2 85 D8 mva ResultY LineYdraw + 2163 73CF 20 D5 65 jsr TL4x4_bottom + 2164 + 2165 + 2166 73D2 20 5F 5A jsr GetKey + 2167 73D5 C9 2B cmp #@kbcode._Y ; $2b ; "Y" + 2168 73D7 D0 06 bne @+ + 2169 73D9 A9 80 85 D7 mva #$80 escFlag + 2170 73DD D0 04 bne skip01 + 2171 73DF A9 00 85 D7 @ mva #0 escFlag + 2172 73E3 skip01 + 2173 73E3 20 71 5A jsr WaitForKeyRelease + 2174 + 2175 ;clean + 2176 73E6 A9 03 85 91 mva #3 di + 2177 73EA A9 04 85 B2 mva #4 ResultY + 2178 @ + 2179 73EE A9 FF 85 DB mva #$ff plot4x4color + 2180 73F2 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 + 2181 73FA 20 02 74 jsr _sep_opty + 2182 73FD C6 91 dec di + 2183 73FF D0 ED bne @- + 2184 + 2185 7401 quit_areyousure + 2186 7401 60 rts + 2187 .endp + 2188 + 2189 7402 .proc _sep_opty + 2190 7402 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering + 2191 740A A5 B2 85 D8 mva ResultY LineYdraw + 2192 740E 20 6E 73 jsr TypeLine4x4 + 2193 7411 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2194 7418 60 rts + 2195 .endp + 2196 + 2197 ;-------------------------------- + 2198 7419 .proc DisplaySeppuku + 2199 ;using 4x4 font + 2200 + 2201 + 2202 7419 A9 14 85 89 mva #20 fs ; temp, how many times blink the billboard + 2203 741D seppuku_loop + 2204 741D A5 02 lda CONSOL ; turbo mode + 2205 741F 29 01 and #%00000001 ; START KEY + 2206 7421 D0 04 A9 01 85 89 sne:mva #1 fs ; finish it + 2207 + 2208 7427 A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen + 2209 + 2210 ;top frame + 2211 742B A5 B2 85 D8 mva ResultY LineYdraw + 2212 742F 20 E8 65 jsr TL4x4_top + 2213 7432 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2214 + 2215 ;seppuku + 2216 7439 A9 4F 85 B3 A9 5B + mwa #seppukuText LineAddress4x4 + 2217 7441 20 02 74 jsr _sep_opty + 2218 + 2219 ;bottom frame + 2220 7444 A5 B2 85 D8 mva ResultY LineYdraw + 2221 7448 20 D5 65 jsr TL4x4_bottom ; just go + 2222 + 2223 ;clean seppuku + 2224 + 2225 744B A9 03 85 91 mva #3 di + 2226 ;mva #4 ResultY + 2227 744F A9 04 lda #4 + 2228 7451 85 B2 sta ResultY + 2229 7453 loplop ;@ + 2230 7453 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 + 2231 745B 20 02 74 jsr _sep_opty + 2232 + 2233 745E C6 91 dec di + 2234 7460 D0 F1 bne loplop ;@- + 2235 + 2236 7462 C6 89 dec fs + 2237 7464 D0 B7 jne seppuku_loop + 2238 + 2239 7466 quit_seppuku + 2240 7466 60 rts + 2241 + 2242 .endp + 2243 + 2244 ; ------------------------------------- + 2245 7467 .proc SetupXYdraw + 2246 7467 BD 19 44 lda ytankstable,x + 2247 746A 85 63 sta ydraw + 2248 746C A9 00 85 64 mva #0 ydraw+1 + 2249 7470 BD 0D 44 X lda XtanksTableL,x + 2250 7473 85 61 sta xdraw + 2251 7475 BD 13 44 lda XtanksTableH,x + 2252 7478 85 62 sta xdraw+1 + 2253 747A 60 rts + 2254 .endp + 2255 ;-------------------------------------------------- + 2256 747B .proc DrawBarrel + 2257 ; X - tankNr + 2258 ; changes xdraw, ydraw, fx, fy + 2259 ;-------------------------------------------------- + 2260 ;vx calculation + 2261 ;vx = sin(90-Angle) for Angle <=90 + 2262 ;vx = -sin(Angle-90) for 90 < Angle <= 180 + 2263 + 2264 ; erase previous barrel + 2265 + 2266 ;cos(Angle) (but we use sin table only so some shenanigans happen) + 2267 ; mva #0 color + 2268 ; lda previousBarrelAngle,x + 2269 ; sta Angle + 2270 ; jsr DrawBarrelTech + 2271 ; + 2272 ; mva #1 color + 2273 747B A6 6C ldx TankNr + 2274 747D 20 67 74 jsr SetupXYdraw + 2275 7480 BD F1 43 lda BarrelLength,x + 2276 7483 85 8A sta yc ; current tank barrel length + 2277 7485 BD C3 48 lda angleTable,x + 2278 7488 85 A7 sta Angle + 2279 748A 20 8E 74 jsr DrawBarrelTech + 2280 748D 60 rts + 2281 .endp + 2282 + 2283 748E .proc DrawBarrelTech + 2284 ; angle in Angle and A + 2285 + 2286 748E A2 00 86 E6 mvx #0 goleft + 2287 7492 C9 5B cmp #91 + 2288 7494 90 17 bcc angleUnder90 + 2289 + 2290 ;over 90 + 2291 7496 38 sec + 2292 7497 E9 5A sbc #90 + 2293 7499 AA tax + 2294 ; barrel start offset over 90deg + 2295 749A 18 A5 61 69 04 85 + adw xdraw #4 xdraw + 2296 74A7 A9 01 85 E6 mva #1 goleft + 2297 74AB 10 13 bpl @+ ; jmp @+ + 2298 + 2299 74AD angleUnder90 + 2300 74AD 38 sec ; X = 90-Angle + 2301 74AE A9 5A lda #90 + 2302 74B0 E5 A7 sbc Angle + 2303 74B2 AA tax + 2304 ; barrel start offset under 90deg + 2305 74B3 18 A5 61 69 03 85 + adw xdraw #3 xdraw + 2306 + 2307 @ + 2308 74C0 38 A5 63 E9 03 85 + sbw ydraw #3 ydraw + 2309 74CD BD C1 5B lda sintable,x ; cos(X) + 2310 74D0 85 BB sta vx + 2311 + 2312 ;======vy + 2313 ;vy = sin(Angle) for Angle <=90 + 2314 ;vy = sin(180-Angle) for 90 < Angle <= 180 + 2315 + 2316 ;-- + 2317 74D2 A5 A7 lda Angle + 2318 74D4 C9 5B cmp #91 + 2319 74D6 90 05 bcc YangleUnder90 + 2320 + 2321 74D8 A9 B4 lda #180 + 2322 74DA 38 sec + 2323 74DB E5 A7 sbc Angle + 2324 74DD YangleUnder90 + 2325 74DD AA tax + 2326 74DE BD C1 5B lda sintable,x + 2327 74E1 85 B7 sta vy + 2328 + 2329 74E3 A9 00 lda #0 ; all arithmetic to zero + 2330 74E5 85 BC sta vx+1 + 2331 74E7 85 B8 sta vy+1 + 2332 74E9 A9 80 lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) + 2333 74EB 85 83 sta fx + 2334 74ED 85 86 sta fy + 2335 + 2336 ; draw by vx vy + 2337 ; in each step + 2338 ; 1. plot(xdraw, ydraw) + 2339 ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy + 2340 ; 3 check length, if shorter, go to 1. + 2341 + 2342 ; mva #6 yc ; barrel length + 2343 74EF barrelLoop + 2344 + 2345 74EF A5 E6 lda goleft + 2346 74F1 D0 16 bne goright + 2347 74F3 18 clc + 2348 74F4 A5 83 lda fx + 2349 74F6 65 BB adc vx + 2350 74F8 85 83 sta fx + 2351 74FA 90 0A bcc @+ + 2352 74FC A5 61 lda xdraw + 2353 74FE 65 BC adc vx+1 + 2354 7500 85 61 sta xdraw + 2355 7502 90 02 bcc @+ + 2356 7504 E6 62 inc xdraw+1 + 2357 @ + 2358 7506 4C 1C 75 jmp ybarrel + 2359 7509 goright + 2360 7509 38 sec + 2361 750A A5 83 lda fx + 2362 750C E5 BB sbc vx + 2363 750E 85 83 sta fx + 2364 7510 B0 0A bcs @+ + 2365 7512 A5 61 lda xdraw + 2366 7514 E5 BC sbc vx+1 + 2367 7516 85 61 sta xdraw + 2368 7518 B0 02 bcs @+ + 2369 751A C6 62 dec xdraw+1 + 2370 @ + 2371 751C ybarrel + 2372 751C 38 sec + 2373 751D A5 86 lda fy + 2374 751F E5 B7 sbc vy + 2375 7521 85 86 sta fy + 2376 7523 B0 0A bcs @+ + 2377 7525 A5 63 lda ydraw + 2378 7527 E5 B8 sbc vy+1 + 2379 7529 85 63 sta ydraw + 2380 752B B0 02 bcs @+ + 2381 752D C6 64 dec ydraw+1 + 2382 @ + 2383 752F 20 14 76 jsr plot ;.MakePlot + 2384 + 2385 7532 C6 8A dec yc + 2386 7534 D0 B9 bne barrelLoop + 2387 + 2388 7536 A5 61 8D C9 48 A5 + mwa xdraw EndOfTheBarrelX + 2389 7540 A5 63 8D CB 48 mva ydraw EndOfTheBarrelY + 2390 + 2391 7545 60 rts + 2392 .endp + 2393 ;-------------------------------------------------- + 2394 7546 .proc PMoutofScreen + 2395 ;-------------------------------------------------- + 2396 7546 A9 00 lda #$00 ; let all P/M disappear + 2397 7548 A0 07 ldy #7 + 2398 754A 99 02 00 @ sta hposp0,y + 2399 754D 88 dey + 2400 754E 10 FA bpl @- + 2401 ;:8 sta hposp0+# ; optimized... but Y! + 2402 7550 60 rts + 2403 .endp + 2404 ;-------------------------------------------------- + 2405 7551 .proc ColorsOfSprites + 2406 7551 A0 03 ldy #3 + 2407 7553 B9 79 5B @ lda TankColoursTable,y ; colours of sprites under tanks + 2408 7556 99 02 00 sta PCOLR0,y + 2409 7559 88 dey + 2410 755A 10 F7 bpl @- + 2411 755C AD 7D 5B LDA TankColoursTable+4 + 2412 755F 85 02 STA COLOR3 ; joined missiles (5th tank) + 2413 7561 60 rts + 2414 .endp + 2415 ;-------------------------------------------------- + 2416 7562 .proc SetPMWidth + 2417 7562 A9 55 lda #%01010101 + 2418 7564 85 02 sta sizem ; all missiles, double width + 2419 7566 A9 00 lda #$00 + 2420 7568 85 02 sta sizep0 ; P0-P3 widths + 2421 756A 85 03 sta sizep0+1 + 2422 756C 85 04 sta sizep0+2 + 2423 756E 85 05 sta sizep0+3 + 2424 7570 60 rts + 2425 .endp + 2426 + 2427 .endif + 349 7571 icl 'C64/gr_basics.asm' +Source: gr_basics.asm + 1 .IF *>0 ;this is a trick that prevents compiling this file alone + 2 + 3 ; Basic hardware-dependent graphics routines. + 4 + 5 ; ----------------------------------------- + 6 7571 .proc unPlot + 7 ; plots a point and saves the plotted byte, reverts the previous plot. + 8 ; ----------------------------------------- + 9 7571 A2 00 ldx #0 ; only one pixel + 10 7573 unPlotAfterX + 11 7573 8E 96 44 stx WhichUnPlot + 12 + 13 ; first remake the oldie + 14 7576 BD 9C 44 lda oldplotL,x + 15 7579 85 6E sta oldplot + 16 757B BD 97 44 lda oldplotH,x + 17 757E 85 6F sta oldplot+1 + 18 + 19 7580 A0 00 ldy #0 + 20 7582 BD A1 44 lda oldora,x + 21 7585 91 6E sta (oldplot),y + 22 + 23 + 24 ; is it not out of the screen ???? + 25 7587 A5 64 C9 00 D0 04 + cpw ydraw #screenheight + 26 7591 90 06 jcc CheckX + 27 7593 A9 00 85 63 85 64 mwa #0 ydraw + 28 7599 CheckX + 29 7599 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 30 75A3 B0 6E jcs EndOfUnPlot + 31 75A5 MakeUnPlot + 32 ; let's count coordinates taken from xdraw and ydraw + 33 75A5 A5 61 lda xdraw + 34 75A7 29 F8 and #%11111000 + 35 ;sta xbyte + 36 ;--- + 37 75A9 A6 63 ldx ydraw + 38 75AB 18 clc + 39 75AC 7D 68 41 adc linetableL,x + 40 75AF 85 65 sta xbyte + 41 75B1 85 6E sta oldplot + 42 75B3 BD 31 42 lda linetableH,x + 43 75B6 65 62 adc xdraw+1 + 44 75B8 85 66 sta xbyte+1 + 45 75BA 85 6F sta oldplot+1 + 46 + 47 75BC A5 61 lda xdraw + 48 75BE 29 07 and #$7 + 49 75C0 AA tax + 50 75C1 A0 00 ldy #0 + 51 + 52 75C3 A5 A9 lda color + 53 75C5 D0 0C bne ClearUnPlot + 54 + 55 ;plotting here + 56 75C7 B1 65 lda (xbyte),y + 57 75C9 8D AB 44 sta OldOraTemp + 58 75CC 1D 1C 5C ora bittable,x + 59 75CF 91 65 sta (xbyte),y + 60 75D1 D0 0A bne ContinueUnPlot ; allways <>0 + 61 75D3 ClearUnPlot + 62 75D3 B1 65 lda (xbyte),y + 63 75D5 8D AB 44 sta OldOraTemp + 64 75D8 3D 24 5C and bittable2,x + 65 75DB 91 65 sta (xbyte),y + 66 75DD ContinueUnPlot + 67 75DD AE 96 44 ldx WhichUnPlot + 68 75E0 AD AB 44 lda OldOraTemp + 69 75E3 9D A1 44 sta oldora,x + 70 75E6 A5 6E lda oldplot + 71 75E8 9D 9C 44 sta oldplotL,x + 72 75EB A5 6F lda oldplot+1 + 73 75ED 9D 97 44 sta oldplotH,x + 74 ; and now we must solve the problem of several plots + 75 ; in one byte + 76 75F0 A2 04 ldx #4 + 77 75F2 AC 96 44 ldy WhichUnPlot + 78 75F5 LetsCheckOverlapping + 79 75F5 EC 96 44 cpx WhichUnPlot + 80 75F8 F0 16 beq SkipThisPlot + 81 75FA BD 9C 44 lda oldplotL,x + 82 75FD D9 9C 44 cmp oldplotL,y + 83 7600 D0 0E bne NotTheSamePlot + 84 7602 BD 97 44 lda oldplotH,x + 85 7605 D9 97 44 cmp oldplotH,y + 86 7608 D0 06 bne NotTheSamePlot + 87 ; the pixel is in the same byte so let's take correct contents + 88 760A BD A1 44 lda oldora,x + 89 760D 99 A1 44 sta oldora,y + 90 7610 NotTheSamePlot + 91 7610 SkipThisPlot + 92 7610 CA dex + 93 7611 10 E2 bpl LetsCheckOverlapping + 94 7613 EndOfUnPlot + 95 7613 60 rts + 96 .endp + 97 + 98 ; ----------------------------------------- + 99 7614 .proc plot ;plot (xdraw, ydraw, color) + 100 ; color == 1 --> put pixel + 101 ; color == 0 --> erase pixel + 102 ; this is one of the most important routines in the whole + 103 ; game. If you are going to speed up the game, start with + 104 ; plot - it is used by every single effect starting from explosions + 105 ; through line drawing and small text output!!! + 106 ; + 107 ; Optimized by 0xF (Fox) THXXXX!!! + 108 + 109 ; ----------------------------------------- + 110 ; is it not over the screen ??? + 111 7614 A5 64 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + 112 761E B0 F3 bcs unPlot.EndOfUnPlot ;nearest RTS + 113 7620 CheckX02 + 114 7620 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 115 762A B0 25 bcs EndOfPlot + 116 762C MakePlot + 117 ; let's calculate coordinates from xdraw and ydraw + 118 + 119 762C A5 61 lda xdraw + 120 762E 29 F8 and #%11111000 + 121 ;sta xbyte + 122 ;--- + 123 7630 A6 63 ldx ydraw + 124 7632 18 clc + 125 7633 7D 68 41 adc linetableL,x + 126 7636 85 65 sta xbyte + 127 7638 BD 31 42 lda linetableH,x + 128 763B 65 62 adc xdraw+1 + 129 763D 85 66 sta xbyte+1 + 130 + 131 763F A5 61 lda xdraw + 132 7641 29 07 and #$7 + 133 7643 AA tax + 134 7644 A0 00 ldy #0 + 135 7646 A5 A9 lda color + 136 7648 D0 08 bne ClearPlot + 137 + 138 764A B1 65 lda (xbyte),y + 139 764C 1D 1C 5C ora bittable,x + 140 764F 91 65 sta (xbyte),y + 141 7651 EndOfPlot + 142 7651 60 rts + 143 7652 ClearPlot + 144 7652 B1 65 lda (xbyte),y + 145 7654 3D 24 5C and bittable2,x + 146 7657 91 65 sta (xbyte),y + 147 7659 60 rts + 148 .endp + 149 + 150 ; ----------------------------------------- + 151 765A .proc point_plot + 152 ; ----------------------------------------- + 153 ; checks state of the pixel (coordinates in xdraw and ydraw) + 154 ; result is in A (zero or appropriate bit is set) + 155 + 156 ; let's calculate coordinates from xdraw and ydraw + 157 + 158 765A A5 61 lda xdraw + 159 765C 29 F8 and #%11111000 + 160 ;sta xbyte + 161 ;--- + 162 765E A6 63 ldx ydraw + 163 7660 18 clc + 164 7661 7D 68 41 adc linetableL,x + 165 7664 85 65 sta xbyte + 166 7666 BD 31 42 lda linetableH,x + 167 7669 65 62 adc xdraw+1 + 168 766B 85 66 sta xbyte+1 + 169 + 170 766D A5 61 lda xdraw + 171 766F 29 07 and #$7 + 172 7671 AA tax + 173 7672 A0 00 ldy #0 + 174 7674 B1 65 lda (xbyte),y + 175 7676 49 FF eor #$ff + 176 7678 3D 1C 5C and bittable,x + 177 767B 60 rts + 178 .endp + 179 + 180 ;-------------------------------------------------- + 181 767C .proc ClearScreen + 182 ;-------------------------------------------------- + 183 767C A9 00 85 72 A9 20 + mwa #displayC64 temp + 184 7684 A0 00 ldy #0 + 185 7686 A9 FF @ lda #$ff + 186 7688 91 72 sta (temp),y + 187 768A E6 72 D0 02 E6 73 inw temp + 188 7690 A5 73 C9 3F D0 04 + cpw temp #displayC64+screenheight*screenBytes+1 + 189 769A D0 EA bne @- + 190 769C 60 rts + 191 .endp + 192 + 193 ;-------------------------------------------------- + 194 769D .proc GenerateLineTable + 195 + 196 769D A9 00 85 72 A9 20 + mwa #displayC64 temp + 197 76A5 A9 68 85 74 A9 41 + mwa #linetableL temp2 + 198 76AD A9 31 85 76 A9 42 + mwa #linetableH modify + 199 76B5 A0 00 ldy #0 + 200 76B7 A2 00 ldx #0 + 201 76B9 A5 72 @ lda temp + 202 76BB 91 74 sta (temp2),y + 203 76BD A5 73 lda temp+1 + 204 76BF 91 76 sta (modify),y + 205 76C1 E0 07 cpx #7 + 206 76C3 D0 12 bne NotChar + 207 76C5 A2 00 ldx #0 + 208 76C7 18 A5 72 69 39 85 + adw temp #(320-7) + 209 76D4 4C DE 76 jmp next8lines + 210 76D7 NotChar + 211 76D7 E6 72 D0 02 E6 73 inw temp + 212 76DD E8 inx + 213 76DE next8lines + 214 76DE C8 iny + 215 76DF C0 C9 cpy #screenheight+1 + 216 76E1 D0 D6 bne @- + 217 76E3 60 rts + 218 .endp + 219 ;-------------------------------------------------- + 220 76E4 .proc SetMainScreen + 221 76E4 A9 0B lda #$b ; Grey background and border + 222 76E6 8D 20 D0 sta $d020 + 223 76E9 8D 21 D0 sta $d021 + 224 + 225 76EC AD 00 DD lda $dd00 ; Set video bank to start at 0 + 226 76EF 29 FC and #252 + 227 76F1 09 03 ora #3 + 228 76F3 8D 00 DD sta $dd00 + 229 76F6 A9 18 lda #$18 + 230 76F8 8D 18 D0 sta $d018 + 231 + 232 ; SwitchVICBank(0) + 233 ; SetScreenMemory($2000) + 234 76FB SetHiresBitmapMode ; Hires mode on +Macro: SETHIRESBITMAPMODE [Source: MACRO.ASM] + 4 76FB AD 11 D0 lda $d011 + 5 76FE 29 BF and #%10111111 + 6 7700 09 20 ora #%00100000 + 7 7702 8D 11 D0 sta $d011 + 12 7705 AD 16 D0 lda $d016 + 13 7708 29 EF and #%11101111 + 14 770A 8D 16 D0 sta $d016 +Source: gr_basics.asm + 235 770D A9 00 lda #$00 + 236 770F 8D 21 D0 sta 53281 + 237 ; clear color RAM + 238 7712 A2 00 ldx #0 + 239 7714 A9 01 @ lda #1 + 240 7716 9D 00 D8 sta $d800,x + 241 7719 9D 00 D9 sta $d900,x + 242 771C 9D 00 DA sta $da00,x + 243 771F 9D 00 DB sta $db00,x + 244 7722 A9 0F lda #$0f + 245 7724 9D 00 04 sta $0400,x + 246 7727 9D 00 05 sta $0500,x + 247 772A 9D 00 06 sta $0600,x + 248 772D 9D 00 07 sta $0700,x + 249 7730 E8 inx + 250 7731 D0 E1 bne @- + 251 + 252 + 253 7733 60 rts + 254 .endp + 255 + 256 .ENDIF + 350 ;---------------------------------------------- + 351 7734 icl 'weapons.asm' +Source: weapons.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 ;-------------------------------------------------- + 5 7734 .proc Explosion + 6 ; xdraw,ydraw (word) - coordinates of explosion center + 7 ; TankNr - number of shooting tank + 8 ; ActiveWeapon(TankNr) - weapon that tank fires + 9 ;-------------------------------------------------- + 10 ;cleanup of the soil fall down ranges (left and right) + 11 7734 20 89 8F jsr ClearScreenSoilRange + 12 + 13 7737 A6 6C ldx TankNr + 14 7739 BD F7 43 lda ActiveWeapon,x + 15 .endp + 16 773C .proc ExplosionDirect + 17 773C 0A asl + 18 773D AA tax + 19 773E BD 48 77 lda ExplosionRoutines+1,x + 20 7741 48 pha + 21 7742 BD 47 77 lda ExplosionRoutines,x + 22 7745 48 pha + 23 7746 60 rts + 24 7747 ExplosionRoutines + 25 7747 A1 77 .word babymissile-1 ;Baby_Missile___;_00 + 26 7749 AC 77 .word missile-1 ;Missile________;_01 + 27 774B B2 77 .word babynuke-1 ;Baby_Nuke______;_02 + 28 774D BC 77 .word nuke-1 ;Nuke___________;_03 + 29 774F C2 77 .word leapfrog-1 ;LeapFrog_______;_04 + 30 7751 FE 77 .word funkybomb-1 ;Funky_Bomb_____;_05 + 31 7753 FD 77 .word mirv-1 ;MIRV___________;_06 + 32 7755 B6 78 .word deathshead-1 ;Death_s_Head___;_07 + 33 7757 55 79 .word napalm-1 ;Napalm_________;_08 + 34 7759 5B 79 .word hotnapalm-1 ;Hot_Napalm_____;_09 + 35 775B 86 77 .word tracer-1 ;Tracer_________;_10 + 36 775D 86 77 .word tracer-1 ;Smoke_Tracer___;_11 + 37 775F 69 7A .word babyroller-1 ;Baby_Roller____;_12 + 38 7761 70 7A .word roller-1 ;Roller_________;_13 + 39 7763 76 7A .word heavyroller-1 ;Heavy_Roller___;_14 + 40 7765 06 7C .word riotcharge-1 ;Riot_Charge____;_15 + 41 7767 10 7C .word riotblast-1 ;Riot_Blast_____;_16 + 42 7769 7C 7A .word riotbomb-1 ;Riot_Bomb______;_17 + 43 776B 86 7A .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 + 44 776D 8C 7A .word babydigger-1 ;Baby_Digger____;_19 + 45 776F A1 7A .word digger-1 ;Digger_________;_20 + 46 7771 A8 7A .word heavydigger-1 ;Heavy_Digger___;_21 + 47 7773 AF 7A .word babysandhog-1 ;Baby_Sandhog___;_22 + 48 7775 B6 7A .word sandhog-1 ;Sandhog________;_23 + 49 7777 BD 7A .word heavysandhog-1 ;Heavy_Sandhog__;_24 + 50 7779 BE 7B .word dirtclod-1 ;Dirt_Clod______;_25 + 51 777B C4 7B .word dirtball-1 ;Dirt_Ball______;_26 + 52 777D CA 7B .word tonofdirt-1 ;Ton_of_Dirt____;_27 + 53 777F 22 7C .word liquiddirt-1 ;Liquid_Dirt____;_28 + 54 7781 FC 7B .word dirtcharge-1 ;Dirt_Charge____;_29 + 55 7783 87 77 .word BFG-1 ;Buy_me_________;_30 + 56 7785 FC 7C .word laser-1 ;Laser__________;_31 + 57 + 58 7787 VOID + 59 7787 tracer + 60 7787 60 rts + 61 .endp + 62 7788 .proc BFG + 63 7788 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect + 64 778C 20 9C A2 jsr BFGblink + 65 ; Kill all :) + 66 778F A6 AE ldx NumberOfPlayers + 67 7791 CA dex + 68 7792 A9 00 lda #$00 + 69 7794 CheckNextTankBFG + 70 7794 E4 6C cpx TankNr ; not me! + 71 7796 F0 03 beq @+ + 72 7798 9D A2 43 sta Energy,x + 73 779B CA @ dex + 74 779C 10 F6 bpl CheckNextTankBFG + 75 779E 8E D9 44 stx AfterBFGflag ; $ff + 76 77A1 60 rts + 77 .endp + 78 ; ------------------------ + 79 77A2 .proc babymissile + 80 77A2 A9 0B 85 B0 mva #11 ExplosionRadius + 81 77A6 GoBabyMissileSFX + 82 77A6 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 83 77AA GoXmissile + 84 77AA 4C C5 7D jmp xmissile + 85 .endp + 86 ; ------------------------ + 87 77AD .proc missile ; + 88 77AD A9 11 85 B0 mva #17 ExplosionRadius + 89 77B1 D0 F3 bne babymissile.GoBabyMissileSFX + 90 ; jmp xmissile + 91 .endp + 92 ; ------------------------ + 93 77B3 .proc babynuke + 94 77B3 A9 19 85 B0 mva #25 ExplosionRadius + 95 77B7 GoBabyNukeSFX + 96 77B7 A9 04 85 9E mva #sfx_nuke sfx_effect ; allways <>0 + 97 77BB D0 ED bne babymissile.GoXmissile + 98 ; jmp xmissile + 99 .endp + 100 ; ------------------------ + 101 77BD .proc nuke + 102 77BD A9 1E 85 B0 mva #30 ExplosionRadius + 103 77C1 D0 F4 bne babynuke.GoBabyNukeSFX + 104 ; jmp xmissile + 105 .endp + 106 ; ------------------------ + 107 77C3 .proc leapfrog + 108 77C3 A9 11 85 B0 mva #17 ExplosionRadius + 109 ; mva #sfx_baby_missile sfx_effect + 110 ; jsr xmissile + 111 77C7 20 A6 77 jsr babymissile.GoBabyMissileSFX + 112 + 113 77CA 20 CD 77 jsr SecondRepeat + 114 + 115 77CD SecondRepeat + 116 ; soil must fall down now! there is no other way... + 117 ; hide tanks or they fall down with soil + 118 77CD 20 F4 6E jsr SoilDown2 + 119 + 120 ; it looks like force is divided by 4 here BUT" + 121 ; in Flight routine force is multiplied by 2 and left + 122 ; so, we have Force divided by 2 here (not accurately) + 123 ;lsr Force+1 + 124 ;ror Force + 125 77D0 46 A5 lsr Force+1 + 126 77D2 66 A4 ror Force + 127 77D4 AD 15 45 85 A7 mva LeapFrogAngle Angle + 128 77D9 A9 0C 85 9E mva #sfx_funky_hit sfx_effect + 129 77DD 38 A5 CC E9 05 85 + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + 130 77E8 20 A0 83 jsr Flight + 131 77EB A5 BF lda HitFlag + 132 77ED F0 0E beq EndOfLeapping + 133 77EF A9 0E 85 B0 mva #14 ExplosionRadius + 134 77F3 20 09 8F jsr CalculateExplosionRange0 + 135 77F6 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 136 77FA 4C C8 7D jmp xmissile.NoRangeCalc + 137 77FD EndOfLeapping + 138 77FD 60 rts + 139 .endp + 140 ; ------------------------ + 141 77FE .proc mirv ; the whole mirv is performed by Flight routine + 142 77FE 60 rts + 143 .endp + 144 ; ------------------------ + 145 77FF .proc funkybomb ; + 146 77FF A9 05 85 9E mva #sfx_baby_missile sfx_effect + 147 7803 A5 C9 8D AC 44 A5 + mwa xtraj+1 xtrajfb + 148 780D 38 A5 CC E9 05 8D + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + 149 ;central Explosion + 150 781C A9 15 85 B0 mva #21 ExplosionRadius + 151 7820 20 09 8F jsr CalculateExplosionRange0 + 152 7823 20 C8 7D jsr xmissile.NoRangeCalc + 153 + 154 7826 20 F4 6E jsr SoilDown2 + 155 ; + 156 7829 20 0B 6A jsr cleartanks ; maybe not? + 157 782C A9 01 85 A9 mva #1 color + 158 7830 A9 00 85 A2 mva #0 FunkyWallFlag + 159 7834 A9 05 85 B1 mva #5 FunkyBombCounter + 160 7838 FunkyBombLoop + 161 7838 A9 01 85 E3 mva #1 tracerflag + 162 ;force randomization (range: 256-511) + 163 783C AD 1B D4 lda random + 164 783F 85 A4 sta Force + 165 7841 A9 01 85 A5 mva #1 Force+1 + 166 ;Angle randomization Range: (70-110 degrees) + 167 7845 randomize 70 110 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 7845 ?rand + 7 7845 AD 1B D4 lda random + 8 7848 C9 46 cmp #70 ;floor + 9 784A 90 F9 bcc ?rand + 10 784C C9 6F cmp #110+1 ;ceiling + 11 784E B0 F5 bcs ?rand +Source: weapons.asm + 168 7850 85 A7 sta Angle + 169 + 170 7852 A9 00 lda #0 + 171 7854 85 C8 sta xtraj + 172 7856 85 CB sta ytraj + 173 7858 AD AC 44 85 C9 AD + mwa xtrajfb xtraj+1 + 174 7862 AD AE 44 85 CC AD + mwa ytrajfb ytraj+1 + 175 786C A9 0C 85 9E mva #sfx_funky_hit sfx_effect + 176 7870 20 A0 83 jsr Flight + 177 7873 A9 00 85 B0 mva #0 ExplosionRadius ; if no explosion (off screen) + 178 ; if xdraw if over range then fix it + 179 7877 A5 62 lda xdraw+1 + 180 7879 10 06 bpl NoOnLeftEdge + 181 787B A9 00 lda #0 + 182 787D 85 61 sta xdraw + 183 787F 85 62 sta xdraw+1 + 184 7881 NoOnLeftEdge + 185 7881 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 186 788B 90 08 bcc NoOnRightEdge + 187 788D A9 40 85 61 A9 01 + mwa #screenwidth xdraw + 188 7895 NoOnRightEdge + 189 7895 20 0C 8F jsr CalculateExplosionRange ; add end of flight coordinates to soildown range + 190 7898 A5 BF lda HitFlag + 191 789A F0 0B beq NoExplosionInFunkyBomb + 192 789C A9 05 85 9E mva #sfx_baby_missile sfx_effect + 193 78A0 A9 0B 85 B0 mva #11 ExplosionRadius + 194 78A4 20 C5 7D jsr xmissile + 195 78A7 NoExplosionInFunkyBomb + 196 78A7 C6 B1 dec FunkyBombCounter + 197 78A9 D0 8D bne FunkyBombLoop + 198 78AB A9 00 85 E3 mva #0 tracerflag + 199 78AF A5 A2 lda FunkyWallFlag + 200 78B1 F0 03 beq NoWallsInFunky + 201 78B3 20 7A 8F jsr SetFullScreenSoilRange + 202 78B6 NoWallsInFunky + 203 78B6 60 rts + 204 .endp + 205 ; ------------------------ + 206 78B7 .proc deathshead + 207 78B7 A9 1E 85 B0 mva #30 ExplosionRadius + 208 78BB A9 04 85 9E mva #sfx_nuke sfx_effect + 209 78BF 20 32 79 jsr GoXmissileWithSaveXYdraw + 210 78C2 38 A5 61 E9 22 85 + sbw xdraw #34 + 211 78CD A9 04 85 9E mva #sfx_nuke sfx_effect + 212 78D1 20 32 79 jsr GoXmissileWithSaveXYdraw + 213 78D4 18 A5 61 69 44 85 + adw xdraw #68 + 214 78DF A9 04 85 9E mva #sfx_nuke sfx_effect + 215 78E3 20 32 79 jsr GoXmissileWithSaveXYdraw + 216 78E6 38 A5 61 E9 22 85 + sbw xdraw #34 + 217 ; + 218 78F1 38 A5 63 E9 22 85 + sbw ydraw #34 + 219 ;jsr CalculateExplosionRange + 220 78FC A5 64 C9 00 D0 04 + cpw ydraw #screenHeight + 221 7906 B0 07 bcs NoUpperCircle + 222 7908 A9 04 85 9E mva #sfx_nuke sfx_effect + 223 790C 20 32 79 jsr GoXmissileWithSaveXYdraw + 224 790F NoUpperCircle + 225 790F 18 A5 63 69 44 85 + adw ydraw #68 + 226 ;jsr CalculateExplosionRange + 227 791A A5 64 C9 00 D0 04 + cpw ydraw #screenHeight + 228 7924 B0 07 bcs NoLowerCircle + 229 7926 A9 04 85 9E mva #sfx_nuke sfx_effect + 230 792A 20 32 79 jsr GoXmissileWithSaveXYdraw + 231 792D NoLowerCircle + 232 792D A9 15 85 9E mva #sfx_silencer sfx_effect + 233 7931 60 rts + 234 + 235 7932 GoXmissileWithSaveXYdraw + 236 7932 A5 61 85 78 A5 62 + mwa xdraw tempXROLLER + 237 793A A5 63 85 76 A5 64 + mwa ydraw modify + 238 7942 20 C5 7D jsr xmissile + 239 7945 A5 78 85 61 A5 79 + mwa tempXROLLER xdraw + 240 794D A5 76 85 63 A5 77 + mwa modify ydraw + 241 7955 60 rts + 242 .endp + 243 ; ------------------------ + 244 7956 .proc napalm + 245 7956 A9 00 85 B1 mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm + 246 795A F0 04 beq xnapalm + 247 .endp + 248 ; ------------------------ + 249 795C .proc hotnapalm + 250 795C A9 01 85 B1 mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm + 251 ; jmp xnapalm + 252 .endp + 253 ; ------------------------ + 254 7960 .proc xnapalm + 255 7960 A9 09 85 9E mva #sfx_napalm sfx_effect + 256 7964 A9 0E 85 B0 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) + 257 7968 20 0C 8F jsr CalculateExplosionRange + 258 ; + 259 796B A5 61 85 B3 A5 62 + mwa xdraw xcircle ; store hitpoint for future repeats + 260 7973 A0 1E ldy #30 ; repeat 30 times + 261 7975 84 C6 sty magic + 262 7977 RepeatNapalm ; external loop (for fire animation) + 263 7977 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 264 797F 38 A5 61 E9 0A 85 + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point + 265 798A A0 00 ldy #0 + 266 798C 84 C7 sty magic+1 + 267 798E RepeatFlame ; internal loop (draw flames) + 268 798E A0 00 ldy #0 + 269 7990 18 A5 61 69 3E 85 + adw xdraw #mountaintable temp + 270 799D 84 64 sty ydraw+1 + 271 799F B1 72 lda (temp),y + 272 79A1 38 sec + 273 79A2 E9 01 sbc #1 ; over ground + 274 79A4 85 63 sta ydraw + 275 79A6 A5 61 lda xdraw + 276 79A8 25 B1 and HotNapalmFlag ; if hotnapalm and x is odd: + 277 79AA 0A 0A :2 asl ; modify y position 4 pixels up + 278 79AC A4 63 ldy ydraw + 279 79AE 85 63 sta ydraw + 280 79B0 98 tya + 281 79B1 38 sec + 282 79B2 E5 63 sbc ydraw + 283 79B4 85 63 sta ydraw + 284 79B6 38 A5 61 E9 04 85 + sbw xdraw #4 ; half character correction + 285 ; draw flame symbol + 286 79C1 A5 C6 lda magic ; if last repeat - clear flames + 287 79C3 F0 0A beq LastNapalmRepeat + 288 79C5 AD 1B D4 lda random + 289 79C8 29 06 and #%00000110 + 290 79CA 18 clc + 291 79CB 69 14 adc #char_flame___________ + 292 79CD D0 02 bne PutFlameChar + 293 79CF LastNapalmRepeat + 294 79CF A9 1C lda #char_clear_flame_____ ; clear flame symbol + 295 79D1 PutFlameChar + 296 79D1 85 69 sta CharCode + 297 ; check coordinates + 298 79D3 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-7) + 299 79DD B0 0D bcs CharOffTheScreen + 300 79DF A5 63 lda ydraw + 301 79E1 C9 07 cmp #7 + 302 79E3 90 07 bcc CharOffTheScreen + 303 79E5 C9 C7 cmp #(screenHeight-1) + 304 79E7 B0 03 bcs CharOffTheScreen + 305 79E9 20 E7 70 jsr TypeChar + 306 79EC CharOffTheScreen + 307 79EC 18 A5 61 69 04 85 + adw xdraw #4 ; reverse half character correction (we need positon of character center) + 308 79F7 18 A5 61 69 01 85 + adw xdraw #1 ; next char 1 pixels to right + 309 7A02 E6 C7 inc magic+1 + 310 7A04 A5 C7 lda magic+1 + 311 7A06 C9 15 cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center + 312 7A08 D0 84 jne RepeatFlame + 313 7A0A C6 C6 dec magic + 314 7A0C 30 03 4C 77 79 jpl RepeatNapalm + 315 ; after napalm + 316 ;now we must check tanks in range + 317 7A11 A6 AE ldx NumberOfPlayers + 318 7A13 CA dex + 319 7A14 BurnedCheckLoop + 320 7A14 BD AF 43 lda eXistenZ,x + 321 7A17 F0 49 beq EndNurnedCheckLoop + 322 ;here the tank exist + 323 ; calculate right edge of the fire + 324 7A19 18 A5 B3 69 12 85 + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction + 325 ; now we compare tank position with right edge of the fire (napalm) + 326 7A26 BD 13 44 lda XtankstableH,x + 327 7A29 C5 62 cmp xdraw+1 + 328 7A2B D0 05 bne @+ + 329 7A2D BD 0D 44 lda XtankstableL,x + 330 7A30 C5 61 cmp xdraw + 331 @ + 332 7A32 B0 2E bcs TankOutOfFire + 333 ; let's calculate left edge of the fire + 334 7A34 38 A5 B3 E9 12 85 + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction + 335 7A41 10 06 bpl @+ + 336 7A43 A9 00 85 61 85 62 mwa #0 xdraw ; left screen edge + 337 @ + 338 ; now we compare tank position with left edge of the fire (napalm) + 339 7A49 BD 13 44 lda XtankstableH,x + 340 7A4C C5 62 cmp xdraw+1 + 341 7A4E D0 05 bne @+ + 342 7A50 BD 0D 44 lda XtankstableL,x + 343 7A53 C5 61 cmp xdraw + 344 @ + 345 7A55 90 0B bcc TankOutOfFire + 346 + 347 7A57 A0 28 ldy #40 ; energy decrease (napalm) - but if hotnapalm: + 348 7A59 A5 B1 lda HotNapalmFlag + 349 7A5B F0 02 beq NotHot + 350 7A5D A0 50 ldy #80 ; energy decrease (hotnapalm) + 351 7A5F NotHot + 352 ; check shields ( joke :) ) + 353 7A5F 20 74 57 jsr DecreaseEnergyX + 354 7A62 TankOutOfFire + 355 7A62 EndNurnedCheckLoop + 356 7A62 CA dex + 357 7A63 10 AF bpl BurnedCheckLoop + 358 7A65 A9 15 85 9E mva #sfx_silencer sfx_effect + 359 7A69 60 rts + 360 .endp + 361 ; ------------------------ + 362 7A6A .proc babyroller + 363 7A6A A9 0B 85 B0 mva #11 ExplosionRadius + 364 7A6E GoRoller + 365 7A6E 4C A6 7E jmp xroller + 366 .endp + 367 ; ------------------------ + 368 7A71 .proc roller ; + 369 7A71 A9 15 85 B0 mva #21 ExplosionRadius + 370 7A75 D0 F7 bne babyroller.GoRoller ; 1 byte saved + 371 ; jmp xroller + 372 .endp + 373 ; ------------------------ + 374 7A77 .proc heavyroller + 375 7A77 A9 1E 85 B0 mva #30 ExplosionRadius + 376 7A7B D0 F1 bne babyroller.GoRoller ; 1 byte saved + 377 ; jmp xroller + 378 .endp + 379 ; ------------------------ + 380 7A7D .proc riotbomb + 381 7A7D A9 11 85 B0 mva #17 ExplosionRadius + 382 7A81 GoRiotBomb + 383 7A81 20 0C 8F jsr CalculateExplosionRange + 384 7A84 4C 8C 7E jmp xriotbomb + 385 .endp + 386 ; ------------------------ + 387 7A87 .proc heavyriotbomb + 388 7A87 A9 1D 85 B0 mva #29 ExplosionRadius + 389 7A8B D0 F4 bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) + 390 ; jsr CalculateExplosionRange + 391 ; jmp xriotbomb + 392 .endp + 393 ; ------------------------ + 394 7A8D .proc babydigger + 395 7A8D A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) + 396 7A92 GoBabydiggerSFX + 397 7A92 A9 14 85 9E mva #sfx_digger sfx_effect + 398 7A96 A9 00 8D 5E 44 mva #0 sandhogflag + 399 7A9B A9 0D 8D 39 44 mva #13 DigLong + 400 7AA0 D0 2F bne xdigger + 401 .endp + 402 ; ------------------------ + 403 7AA2 .proc digger ; + 404 7AA2 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) + 405 7AA7 D0 E9 bne babydigger.GoBabydiggerSFX + 406 .endp + 407 ; ------------------------ + 408 7AA9 .proc heavydigger + 409 7AA9 A9 07 8D 38 44 mva #7 diggery ; how many branches (-1) + 410 7AAE D0 E2 bne babydigger.GoBabydiggerSFX + 411 .endp + 412 ; ------------------------ + 413 7AB0 .proc babysandhog + 414 7AB0 A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) + 415 7AB5 D0 0C bne heavysandhog.GoHeavysandhogSFX + 416 .endp + 417 ; ------------------------ + 418 7AB7 .proc sandhog + 419 7AB7 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) + 420 7ABC D0 05 bne heavysandhog.GoHeavysandhogSFX + 421 .endp + 422 ; ------------------------ + 423 7ABE .proc heavysandhog + 424 7ABE A9 05 8D 38 44 mva #5 diggery ; how many branches (-1) + 425 7AC3 GoHeavysandhogSFX + 426 7AC3 A9 12 85 9E mva #sfx_sandhog sfx_effect + 427 7AC7 A9 08 8D 5E 44 mva #char_sandhog_offset sandhogflag + 428 7ACC A9 0D 8D 39 44 mva #13 DigLong + 429 ; jmp xdigger + 430 .endp + 431 ; ------------------------ + 432 7AD1 .proc xdigger + 433 ;mwa xdraw digstartx + 434 ;mwa ydraw digstarty + 435 7AD1 AE 38 44 ldx diggery + 436 7AD4 WriteToBranches + 437 7AD4 A5 61 lda xdraw + 438 7AD6 9D 3A 44 sta digtabxL,x + 439 7AD9 A5 62 lda xdraw+1 + 440 7ADB 9D 42 44 sta digtabxH,x + 441 7ADE A5 63 lda ydraw + 442 7AE0 9D 4A 44 sta digtabyL,x + 443 7AE3 A5 64 lda ydraw+1 + 444 7AE5 9D 52 44 sta digtabyH,x + 445 7AE8 CA dex + 446 7AE9 10 E9 bpl WriteToBranches + 447 7AEB 20 A3 7B jsr DiggerCharacter ; start character + 448 + 449 7AEE 18 A5 61 69 04 85 + adw xdraw #4 + 450 7AF9 AD 39 44 lda DigLong + 451 ; looks strange, but it is (DigLong+2)*4 + 452 7AFC 18 clc + 453 7AFD 69 02 adc #$2 + 454 7AFF 0A asl + 455 7B00 0A asl + 456 7B01 85 B0 sta ExplosionRadius + 457 7B03 20 0C 8F jsr CalculateExplosionRange + 458 7B06 BranchNotFinished + 459 7B06 AE 38 44 ldx diggery + 460 7B09 CalculateBranches + 461 7B09 8A txa + 462 7B0A 29 01 and #$01 + 463 7B0C D0 14 bne DigRight + 464 7B0E diglewy ; even branches go left + 465 7B0E 38 sec + 466 7B0F BD 3A 44 lda digtabxL,x + 467 7B12 E9 04 sbc #$04 + 468 7B14 9D 3A 44 sta digtabxL,x + 469 7B17 BD 42 44 lda digtabxH,x + 470 7B1A E9 00 sbc #$00 + 471 7B1C 9D 42 44 sta digtabxH,x + 472 7B1F 4C 33 7B jmp DigRandomize + 473 7B22 DigRight ; odd go right (everytime 4 pixels) + 474 7B22 18 clc + 475 7B23 BD 3A 44 lda digtabxL,x + 476 7B26 69 04 adc #$04 + 477 7B28 9D 3A 44 sta digtabxL,x + 478 7B2B BD 42 44 lda digtabxH,x + 479 7B2E 69 00 adc #$00 + 480 7B30 9D 42 44 sta digtabxH,x + 481 7B33 DigRandomize + 482 7B33 AD 1B D4 lda random + 483 7B36 29 87 and #$87 + 484 7B38 30 20 bmi DigUp + 485 7B3A DigDown + 486 7B3A 29 07 and #$07 + 487 7B3C 18 clc + 488 7B3D 7D 4A 44 adc digtabyL,x + 489 7B40 9D 4A 44 sta digtabyL,x + 490 7B43 BD 52 44 lda digtabyH,x + 491 7B46 69 00 adc #$00 + 492 7B48 9D 52 44 sta digtabyH,x + 493 ;crashing bug here - if too much added to digtaby, it gets over screenheight and starts writing over random areas + 494 ;WARNING! fix for 1 byte screenheight. TODO + 495 7B4B BD 4A 44 lda digtabyL,x + 496 7B4E C9 C8 cmp #screenheight + 497 7B50 90 05 bcc @+ ; branch if less + 498 7B52 A9 C7 lda #screenheight-1 + 499 7B54 9D 4A 44 sta digtabyL,x + 500 7B57 4C 6F 7B @ jmp DigCalculateNext + 501 7B5A DigUp + 502 7B5A 29 07 and #$07 + 503 7B5C 85 72 sta temp + 504 7B5E 38 sec + 505 7B5F BD 4A 44 lda digtabyL,x + 506 7B62 E5 72 sbc temp + 507 7B64 9D 4A 44 sta digtabyL,x + 508 7B67 BD 52 44 lda digtabyH,x + 509 7B6A E9 00 sbc #$00 + 510 7B6C 9D 52 44 sta digtabyH,x + 511 7B6F DigCalculateNext + 512 7B6F CA dex + 513 7B70 10 97 bpl CalculateBranches + 514 ; here we draw... + 515 7B72 AE 38 44 ldx diggery + 516 7B75 DigDrawing + 517 7B75 BD 3A 44 lda digtabxL,x + 518 7B78 85 61 sta xdraw + 519 7B7A BD 42 44 lda digtabxH,x + 520 7B7D 85 62 sta xdraw+1 + 521 7B7F BD 4A 44 lda digtabyL,x + 522 7B82 85 63 sta ydraw + 523 7B84 BD 52 44 lda digtabyH,x + 524 7B87 85 64 sta ydraw+1 + 525 7B89 phx +Macro: PHX [Source: MACRO.ASM] + 1 7B89 8A txa + 2 7B8A 48 pha +Source: weapons.asm + 526 7B8B 20 A3 7B jsr DiggerCharacter + 527 7B8E plx +Macro: PLX [Source: MACRO.ASM] + 1 7B8E 68 pla + 2 7B8F AA tax +Source: weapons.asm + 528 7B90 CA dex + 529 7B91 10 E2 bpl DigDrawing + 530 7B93 CE 39 44 AD 39 44 dec:lda DigLong + 531 7B99 30 03 4C 06 7B jpl BranchNotFinished + 532 7B9E DoNotPutDig + 533 7B9E A9 15 85 9E mva #sfx_silencer sfx_effect + 534 7BA2 60 rts + 535 7BA3 DiggerCharacter + 536 7BA3 AD 1B D4 lda random + 537 7BA6 29 06 and #$06 + 538 7BA8 18 clc + 539 7BA9 69 04 adc #char_digger__________ + 540 7BAB 6D 5E 44 adc sandhogflag + 541 7BAE 85 69 sta CharCode + 542 7BB0 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-6) + 543 7BBA B0 E2 bcs DoNotPutDig + 544 7BBC 4C E7 70 jmp TypeChar + 545 .endp + 546 ; ------------------------ + 547 7BBF .proc dirtclod + 548 7BBF A9 0C 85 B0 mva #12 ExplosionRadius + 549 7BC3 D0 0A bne xdirt + 550 .endp + 551 ; ------------------------ + 552 7BC5 .proc dirtball + 553 7BC5 A9 16 85 B0 mva #22 ExplosionRadius + 554 7BC9 D0 04 bne xdirt + 555 .endp + 556 ; ------------------------ + 557 7BCB .proc tonofdirt + 558 7BCB A9 1F 85 B0 mva #31 ExplosionRadius + 559 ; jmp xdirt + 560 .endp + 561 ; ----------------- + 562 7BCF .proc xdirt ; + 563 ; ----------------- + 564 7BCF 20 0C 8F jsr CalculateExplosionRange + 565 7BD2 A9 0A 85 9E mva #sfx_dirt_charge sfx_effect + 566 7BD6 A9 01 lda #1 + 567 7BD8 85 AB sta radius + 568 7BDA 85 A9 sta color + 569 7BDC dirtLoop + 570 7BDC 20 4A 68 jsr circle + 571 7BDF E6 63 D0 02 E6 64 inw ydraw + 572 7BE5 20 4A 68 jsr circle + 573 7BE8 A5 63 D0 02 C6 64 + .nowarn dew ydraw + 574 7BF0 E6 AB inc radius + 575 7BF2 A5 AB lda radius + 576 7BF4 C5 B0 cmp ExplosionRadius + 577 7BF6 D0 E4 bne dirtLoop + 578 7BF8 A9 15 85 9E mva #sfx_silencer sfx_effect + 579 7BFC 60 rts + 580 .endp + 581 ; ------------------------ + 582 7BFD .proc dirtcharge + 583 7BFD A9 3D 85 B0 mva #61 ExplosionRadius + 584 7C01 20 0C 8F jsr CalculateExplosionRange + 585 7C04 4C E1 7F jmp ofdirt + 586 .endp + 587 ; ------------------------ + 588 7C07 .proc riotcharge + 589 7C07 A9 11 85 9E mva #sfx_riot_blast sfx_effect + 590 7C0B A9 1F 85 B0 mva #31 ExplosionRadius + 591 7C0F D0 08 bne cleanDirt + 592 .endp + 593 ; ------------------------ + 594 7C11 .proc riotblast + 595 7C11 A9 11 85 9E mva #sfx_riot_blast sfx_effect + 596 7C15 A9 3D 85 B0 mva #61 ExplosionRadius + 597 ; jmp cleanDirt + 598 .endp + 599 ; ----------------- + 600 7C19 .proc cleanDirt + 601 ; ----------------- + 602 7C19 20 0C 8F jsr CalculateExplosionRange + 603 7C1C A9 00 85 A9 mva #0 color + 604 7C20 4C E9 7F jmp ofdirt.NoColor + 605 .endp + 606 ; ------------------------ + 607 7C23 .proc liquiddirt + 608 7C23 A9 1B 85 9E mva #sfx_liquid_dirt sfx_effect + 609 7C27 A9 FE 8D 5C 44 A9 + mwa #510 FillCounter + 610 ; ----- + 611 7C31 A5 61 8D 5A 44 A5 + mwa xdraw TempXfill + 612 7C3B RepeatFill + 613 7C3B AD 5A 44 85 61 AD + mwa TempXfill xdraw + 614 7C45 20 5A 7F jsr checkRollDirection + 615 ; HowMuchToFall - direction + 616 ; $FF - we are in a hole (flying in missile direction) + 617 ; 1 - right, 2 - left + 618 7C48 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 619 7C55 A0 00 ldy #0 + 620 7C57 B1 78 lda (tempXROLLER),y + 621 7C59 8D 37 44 sta HeightRol ; relative point + 622 + 623 7C5C RollinContinuesLiquid + 624 ; new point is set + 625 7C5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 626 7C69 A0 00 ldy #0 + 627 7C6B B1 78 lda (tempXROLLER),y + 628 7C6D 85 63 sta ydraw + 629 7C6F CD 37 44 cmp HeightRol + 630 7C72 F0 02 beq UpNotYet2 + 631 7C74 90 32 bcc FillNow + 632 7C76 UpNotYet2 + 633 7C76 38 sec ;clc + 634 7C77 8D 37 44 sta HeightRol + 635 7C7A E9 01 sbc #1 + 636 7C7C 85 63 sta ydraw + 637 7C7E A5 C5 lda HowMuchToFall + 638 7C80 C9 01 cmp #1 + 639 7C82 F0 12 beq HowMuchToFallRight3 + 640 7C84 A5 61 D0 02 C6 62 + .NOWARN dew xdraw + 641 7C8C A5 61 lda xdraw + 642 7C8E 25 62 and xdraw+1 + 643 7C90 C9 FF cmp #$ff ; like cpw xdraw #$ffff + 644 ;ora xdraw+1 ; like cpw xdraw #$0000 + 645 7C92 D0 C8 jne RollinContinuesLiquid + 646 7C94 F0 12 beq FillNow + 647 7C96 HowMuchToFallRight3 + 648 7C96 E6 61 D0 02 E6 62 inw xdraw + 649 7C9C A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 650 7CA6 D0 B4 jne RollinContinuesLiquid + 651 7CA8 FillNow + 652 ; finally one pixel more + 653 7CA8 A0 00 ldy #0 + 654 7CAA A5 C5 lda HowMuchToFall + 655 7CAC 30 18 bmi FillHole + 656 7CAE C9 01 cmp #1 + 657 7CB0 F0 0C beq FillLeft + 658 7CB2 E6 61 D0 02 E6 62 inw xdraw + 659 7CB8 E6 61 D0 02 E6 62 inw xdraw ; tricky but we must rollback xdraw in proper direction + 660 7CBE FillLeft + 661 7CBE A5 61 D0 02 C6 62 + .nowarn dew xdraw + 662 7CC6 FillHole + 663 7CC6 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 664 7CD3 B1 78 lda (tempXROLLER),y + 665 7CD5 85 63 sta ydraw + 666 7CD7 F0 0D beq ToHighFill ; if we filled all playfield (very rare but possible) + 667 7CD9 C6 63 dec ydraw ; one pixel up + 668 7CDB A5 63 lda ydraw + 669 7CDD 91 78 sta (tempXROLLER),y ;mountaintable update + 670 7CDF A9 01 85 A9 mva #1 color + 671 7CE3 20 2C 76 jsr plot.MakePlot + 672 7CE6 ToHighFill + 673 7CE6 AD 5C 44 D0 03 CE + .nowarn dew FillCounter + 674 7CF1 AD 5C 44 lda FillCounter + 675 7CF4 0D 5D 44 ora FillCounter+1 + 676 7CF7 F0 03 4C 3B 7C jne RepeatFill + 677 7CFC 60 rts + 678 .endp + 679 ; ------------------------ + 680 7CFD .proc laser + 681 ; in xdraw and ydraw we have hit point coordinates + 682 ; from Shoot/Flight procedures (invisible flight) + 683 ; ------------------------ + 684 7CFD A6 6C ldx TankNr + 685 7CFF BD C3 48 lda AngleTable,x + 686 7D02 A8 tay + 687 + 688 7D03 AD C9 48 85 65 AD + mwa EndOfTheBarrelX xbyte + 689 7D0D AD CB 48 85 67 mva EndOfTheBarrelY ybyte + 690 7D12 A9 00 85 68 mva #0 ybyte+1 + 691 7D16 8D 8B 44 sta LaserFlag ; turn on gravity and wind after shot :) + 692 + 693 7D19 A5 61 8D 16 45 A5 + mwa xdraw LaserCoordinate + 694 7D23 A5 63 8D 18 45 A5 + mwa ydraw LaserCoordinate+2 + 695 7D2D A5 65 8D 1A 45 A5 + mwa xbyte LaserCoordinate+4 + 696 7D37 A5 67 8D 1C 45 A5 + mwa ybyte LaserCoordinate+6 + 697 + 698 7D41 A9 02 85 9E mva #sfx_lightning sfx_effect + 699 + 700 7D45 A9 80 8D 73 43 mva #%10000000 drawFunction + 701 ;the above switches Draw to measuring length + 702 7D4A 20 12 66 jsr draw + 703 7D4D A9 00 8D 73 43 mva #0 drawFunction + 704 7D52 46 E2 lsr LineLength+1 ; LineLength / 8 + 705 7D54 66 E1 ror LineLength + 706 7D56 46 E1 lsr LineLength ; max line lenght is about 380 (9 bits) + 707 7D58 46 E1 lsr LineLength + 708 7D5A 38 sec + 709 7D5B A9 3C lda #60 + 710 7D5D E5 E1 sbc LineLength + 711 7D5F 85 8A sta yc ; laser blink counter 60-(LineLength/8) + 712 @ + 713 7D61 A5 8A lda yc + 714 7D63 29 01 and #$01 + 715 7D65 49 01 eor #$01 + 716 7D67 85 A9 sta color + 717 7D69 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw + 718 7D73 AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw + 719 7D7D AD 1A 45 85 65 AD + mwa LaserCoordinate+4 xbyte + 720 7D87 AD 1C 45 85 67 AD + mwa LaserCoordinate+6 ybyte + 721 7D91 A9 02 85 9E mva #sfx_lightning sfx_effect + 722 7D95 20 12 66 jsr draw + 723 + 724 7D98 C6 8A dec yc + 725 7D9A D0 C5 bne @- + 726 + 727 7D9C A9 01 85 A9 mva #1 color + 728 7DA0 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw + 729 7DAA AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw + 730 7DB4 A9 00 85 BF mva #0 HitFlag + 731 7DB8 20 84 8E jsr CheckCollisionWithTank + 732 7DBB A5 BF lda HitFlag + 733 7DBD F0 05 beq LaserMisses + 734 ; here we hit a tank (X) + 735 7DBF A0 64 ldy #100 + 736 7DC1 20 74 57 jsr DecreaseEnergyX + 737 7DC4 LaserMisses + 738 7DC4 60 rts + 739 .endp + 740 ; ----------------- + 741 7DC5 .proc xmissile ; + 742 ; ----------------- + 743 7DC5 20 0C 8F jsr CalculateExplosionRange + 744 7DC8 NoRangeCalc + 745 7DC8 A9 01 lda #1 + 746 7DCA 85 AB sta radius + 747 7DCC 85 A9 sta color + 748 7DCE ExplosionLoop + 749 7DCE 20 4A 68 jsr circle + 750 7DD1 E6 AB E6 AB :2 inc radius + 751 7DD5 A5 AB lda radius + 752 7DD7 C5 B0 cmp ExplosionRadius + 753 7DD9 90 F3 bcc ExplosionLoop + 754 + 755 7DDB A2 00 ldx #0 + 756 7DDD 86 A9 stx color + 757 7DDF E8 inx + 758 7DE0 86 AB stx radius + 759 7DE2 ExplosionLoop2 + 760 7DE2 20 4A 68 jsr circle + 761 7DE5 E6 AB inc radius + 762 7DE7 A5 AB lda radius + 763 7DE9 C5 B0 cmp ExplosionRadius + 764 7DEB 90 F5 bcc ExplosionLoop2 + 765 + 766 7DED A9 01 85 A9 mva #1 color + 767 + 768 ;check tanks' distance from the centre of the explosion + 769 + 770 7DF1 A9 80 8D 73 43 mva #%10000000 drawFunction + 771 ;the above switches Draw to measuring length + 772 ;trick is easy - how many pixels does it take to draw + 773 ;a line from one point to another + 774 ;it must be somehow easier than regular Pitagoras + 775 ;calculation + 776 + 777 7DF6 A6 AE ldx NumberOfPlayers + 778 7DF8 CA dex + 779 7DF9 DistanceCheckLoop + 780 7DF9 BD AF 43 lda eXistenZ,x + 781 7DFC D0 03 4C 81 7E jeq EndOfDistanceCheckLoop + 782 ;here the tank exist + 783 7E01 BD 0D 44 lda XtankstableL,x + 784 7E04 18 clc + 785 7E05 69 03 adc #3 ;measure from middle of the tank + 786 7E07 85 65 sta xbyte + 787 7E09 BD 13 44 lda XtankstableH,x + 788 7E0C 18 clc + 789 7E0D 69 00 adc #0 ;measure from middle of the tank + 790 7E0F 85 66 sta xbyte+1 + 791 7E11 BD 19 44 lda Ytankstable,x + 792 7E14 38 sec + 793 7E15 E9 02 sbc #2 ;measure from middle of the tank + 794 7E17 85 67 sta ybyte + 795 7E19 A9 00 lda #0 + 796 7E1B 85 68 sta ybyte+1 + 797 7E1D phx +Macro: PHX [Source: MACRO.ASM] + 1 7E1D 8A txa + 2 7E1E 48 pha +Source: weapons.asm + 798 7E1F 20 12 66 jsr draw + 799 7E22 plx +Macro: PLX [Source: MACRO.ASM] + 1 7E22 68 pla + 2 7E23 AA tax +Source: weapons.asm + 800 ;if tank within range of the explosion? + 801 7E24 A5 E2 lda LineLength+1 + 802 7E26 D0 59 bne TankIsNotWithinTheRange + 803 7E28 A5 E1 lda LineLength + 804 7E2A C5 B0 cmp ExplosionRadius + 805 7E2C B0 53 bcs TankIsNotWithinTheRange + 806 7E2E A5 B0 lda ExplosionRadius + 807 7E30 38 sec + 808 7E31 E5 E1 sbc LineLength + 809 ;multiply difference by 8 + 810 7E33 18 clc + 811 7E34 69 01 adc #1 + 812 7E36 0A 0A 0A :3 asl + 813 7E39 A8 tay + 814 ; check shields + 815 7E3A BD FD 43 lda ActiveDefenceWeapon,x + 816 7E3D C9 26 cmp #ind_Shield_________ ; one hit shield + 817 7E3F F0 25 beq UseShield + 818 7E41 C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute + 819 7E43 F0 12 beq UseShieldWithEnergy + 820 7E45 C9 27 cmp #ind_Heavy_Shield___ ; shield with energy + 821 7E47 F0 0E beq UseShieldWithEnergy + 822 7E49 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + 823 7E4B F0 0A beq UseShieldWithEnergy + 824 7E4D C9 25 cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + 825 7E4F F0 06 beq UseShieldWithEnergy + 826 7E51 20 74 57 jsr DecreaseEnergyX + 827 7E54 4C 81 7E jmp EndOfDistanceCheckLoop + 828 7E57 UseShieldWithEnergy + 829 7E57 20 B0 57 jsr DecreaseShieldEnergyX + 830 7E5A C0 00 cpy #0 ; is necessary to reduce tenk energy ? + 831 7E5C F0 03 beq ShieldCoveredTank + 832 7E5E 20 74 57 jsr DecreaseEnergyX + 833 7E61 ShieldCoveredTank + 834 7E61 BD A8 43 lda ShieldEnergy,x + 835 7E64 D0 1B jne EndOfDistanceCheckLoop + 836 7E66 ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) + 837 7E66 UseShield + 838 7E66 A9 01 85 AA mva #1 Erase + 839 7E6A A5 6C lda TankNr + 840 7E6C 48 pha ; store TankNr + 841 7E6D 86 6C stx TankNr ; store X in TankNr :) + 842 7E6F 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 843 7E72 A9 00 lda #0 + 844 7E74 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defense weapons + 845 7E77 85 AA sta Erase + 846 7E79 20 2C 6A jsr DrawTankNr ; draw tank without shield + 847 7E7C A6 6C ldx TankNr ; restore X value :) + 848 7E7E 68 pla + 849 7E7F 85 6C sta TankNr ; restore TankNr value :) + 850 7E81 TankIsNotWithinTheRange + 851 7E81 EndOfDistanceCheckLoop + 852 7E81 CA dex + 853 7E82 30 03 4C F9 7D jpl DistanceCheckLoop + 854 7E87 A9 15 85 9E mva #sfx_silencer sfx_effect + 855 7E8B 60 rts + 856 .endp + 857 ; ----------------- + 858 7E8C .proc xriotbomb ; + 859 ; ----------------- + 860 7E8C A9 11 85 9E mva #sfx_riot_blast sfx_effect + 861 7E90 A9 00 lda #0 + 862 7E92 85 AB sta radius + 863 7E94 85 A9 sta color + 864 7E96 rbombLoop + 865 7E96 20 4A 68 jsr circle + 866 7E99 E6 AB inc radius + 867 7E9B A5 AB lda radius + 868 7E9D C5 B0 cmp ExplosionRadius + 869 7E9F D0 F5 bne rbombLoop + 870 7EA1 A9 01 85 A9 mva #1 color + 871 7EA5 60 rts + 872 .endp + 873 ; ---------------- + 874 7EA6 .proc xroller ; + 875 ; now collisions are detected with modified draw routine + 876 ; therefore YDRAW value must be taken from mountaintable + 877 7EA6 20 5A 7F jsr checkRollDirection + 878 ; HowMuchToFall - direction + 879 ; $FF - we are in a hole (flying in missile direction) + 880 ; 1 - right, 2 - left + 881 7EA9 Rollin + 882 7EA9 A9 0E 85 9E mva #sfx_shield_off sfx_effect + 883 7EAD 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 884 7EBA A0 00 ldy #0 + 885 7EBC B1 78 lda (tempXROLLER),y + 886 7EBE 8D 37 44 sta HeightRol ; relative point + 887 + 888 7EC1 RollinContinues + 889 7EC1 20 89 5A jsr WaitOneFrame + 890 7EC4 20 89 5A jsr WaitOneFrame + 891 ; new point is set + 892 7EC7 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 893 7ED4 A0 00 ldy #0 + 894 7ED6 B1 78 lda (tempXROLLER),y + 895 7ED8 85 63 sta ydraw + 896 7EDA 84 64 sty ydraw+1 + 897 7EDC F0 43 beq ExplodeNow + 898 7EDE CD 37 44 cmp HeightRol + 899 7EE1 F0 02 beq UpNotYet + 900 7EE3 90 3C bcc ExplodeNow + 901 7EE5 UpNotYet + 902 7EE5 38 sec ;clc + 903 7EE6 8D 37 44 sta HeightRol + 904 7EE9 E9 01 sbc #1 + 905 7EEB 85 63 sta ydraw + 906 ;check tank collision prior to PLOT + 907 7EED 84 BF sty HitFlag ; set to 0 + 908 + 909 7EEF 20 84 8E jsr CheckCollisionWithTank + 910 + 911 7EF2 A5 BF lda HitFlag + 912 7EF4 D0 2B bne ExplodeNow + 913 7EF6 20 71 75 jsr unPlot + 914 ; let's go the right direction + 915 7EF9 A5 C5 lda HowMuchToFall + 916 7EFB C9 01 cmp #1 + 917 7EFD F0 10 beq HowMuchToFallRight2 + 918 7EFF A5 61 D0 02 C6 62 + .nowarn dew xdraw + 919 7F07 A5 61 lda xdraw + 920 7F09 05 62 ora xdraw+1 + 921 7F0B D0 B4 jne RollinContinues ; like cpw xdraw #0 + 922 7F0D F0 12 beq ExplodeNow + 923 7F0F HowMuchToFallRight2 + 924 7F0F E6 61 D0 02 E6 62 inw xdraw + 925 7F15 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 926 7F1F D0 A0 jne RollinContinues + 927 7F21 ExplodeNow + 928 7F21 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store somewhere (BAD) + 929 7F29 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw (BAD) + 930 7F31 A9 00 85 61 85 62 mwa #0 xdraw + 931 7F37 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 932 7F3F 20 71 75 jsr unPlot + 933 7F42 A5 B3 85 61 A5 B4 + mwa xcircle xdraw ;(bad) + 934 7F4A A5 B5 85 63 A5 B6 + mwa ycircle ydraw ;(bad) + 935 + 936 ; finally a little explosion + 937 7F52 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 938 7F56 4C C5 7D jmp xmissile + 939 7F59 60 rts + 940 .endp + 941 ; -------------------------------------------------- + 942 7F5A .proc checkRollDirection + 943 ; check rolling direction (for roller and other rolling weapons) + 944 ; xdraw (word) - X coordinate + 945 ; Y coordinate is taken from mountaintable and go to ydraw (word) + 946 ; shoot direction is taken from VX+3 + 947 ; result: + 948 ; HowMuchToFall - direction + 949 ; $FF - we are in a hole (flying in missile direction) + 950 ; 1 - right, 2 - left + 951 ; -------------------------------------------------- + 952 7F5A A0 00 ldy #0 + 953 7F5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 954 7F69 B1 78 lda (tempXROLLER),y + 955 7F6B 85 63 sta ydraw + 956 7F6D 84 64 sty ydraw+1 + 957 + 958 7F6F A5 BE lda vx+3 + 959 ; if horizontal velocity is negative then change the direction + 960 7F71 10 06 bpl PositiveVelocity + 961 7F73 A5 E6 lda goleft + 962 7F75 09 01 ora #$01 + 963 7F77 85 E6 sta goleft + 964 7F79 PositiveVelocity + 965 ; first we look for the left slope + 966 ; then righ slope and set the flag + 967 ; $FF - we are in a hole (flying in missile direction) + 968 ; 1 - right, 2 - left + 969 7F79 A9 FF 85 C5 mva #$ff HowMuchToFall + 970 7F7D A5 63 8D 37 44 mva ydraw HeightRol + 971 7F82 SeekLeft + 972 7F82 A5 79 C9 46 D0 04 + cpw tempXROLLER #mountaintable + 973 7F8C F0 13 beq GoRightNow ; "bounce" if we have on left end + 974 7F8E A5 78 D0 02 C6 79 + .nowarn dew tempXROLLER + 975 7F96 B1 78 lda (tempXROLLER),y ;fukk! beware of Y value + 976 7F98 CD 37 44 cmp HeightRol + 977 7F9B HowMuchToFallLeft + 978 7F9B B0 04 bcs GoRightNow + 979 7F9D A9 01 85 C5 mva #1 HowMuchToFall + 980 7FA1 GoRightNow + 981 7FA1 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 982 7FAE SeekRight + 983 7FAE A5 79 C9 47 D0 04 + cpw tempXROLLER #(mountaintable+screenwidth) + 984 7FB8 F0 1B beq HowMuchToFallKnown ; "stop" if we have on left end + 985 7FBA E6 78 D0 02 E6 79 inw tempXROLLER + 986 7FC0 B1 78 lda (tempXROLLER),y + 987 7FC2 CD 37 44 cmp HeightRol + 988 7FC5 HowMuchToFallRight + 989 7FC5 B0 0E bcs HowMuchToFallKnown + 990 7FC7 A5 C5 lda HowMuchToFall + 991 7FC9 10 06 bpl ItIsLeftAlready + 992 7FCB A9 02 85 C5 mva #2 HowMuchToFall + 993 7FCF D0 04 bne HowMuchToFallKnown + 994 7FD1 ItIsLeftAlready + 995 7FD1 A9 FF 85 C5 mva #$ff HowMuchToFall + 996 7FD5 HowMuchToFallKnown + 997 7FD5 A5 C5 lda HowMuchToFall + 998 7FD7 10 07 bpl DirectionChecked + 999 7FD9 A9 01 lda #1 + 1000 7FDB 18 clc + 1001 7FDC 65 E6 adc goleft + 1002 7FDE 85 C5 sta HowMuchToFall + 1003 7FE0 DirectionChecked + 1004 7FE0 60 rts + 1005 .endp + 1006 + 1007 ; -------------------------------------------------- + 1008 7FE1 .proc ofdirt ; + 1009 ; -------------------------------------------------- + 1010 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height + 1011 7FE1 A9 13 85 9E mva #sfx_dirt_chrg_s sfx_effect + 1012 + 1013 7FE5 A9 01 85 A9 mva #1 color + 1014 7FE9 NoColor ; jump here with color=0 to clean dirt + 1015 7FE9 A5 61 85 B3 A5 62 + mwa xdraw xcircle + 1016 7FF1 A5 63 85 B5 A5 64 + mwa ydraw ycircle + 1017 7FF9 A9 01 lda #1 + 1018 ; current dirt width + 1019 7FFB 85 C6 sta magic + 1020 7FFD NextRow + 1021 7FFD 20 89 5A jsr WaitOneFrame + 1022 8000 A4 C6 ldy magic + 1023 8002 NextLine + 1024 8002 AD 1B D4 lda random + 1025 8005 29 01 and #$01 + 1026 8007 F0 07 beq DoNotPlot + 1027 8009 84 C7 sty magic+1 + 1028 800B 20 14 76 jsr plot + 1029 800E A4 C7 ldy magic+1 + 1030 8010 DoNotPlot + 1031 8010 E6 61 D0 02 E6 62 inw xdraw + 1032 8016 88 dey + 1033 8017 D0 E9 bne NextLine + 1034 8019 C6 63 dec ydraw ; 1 line up + 1035 801B A5 63 lda ydraw + 1036 801D C9 FF cmp #$ff + 1037 801F F0 1B beq EndOfTheDirt ;if horizontal Counter wraps + 1038 8021 E6 C6 inc magic ; width+2 + 1039 8023 E6 C6 inc magic + 1040 8025 A5 C6 lda magic + 1041 8027 85 C7 sta magic+1 ; just for a second + 1042 8029 46 C7 lsr magic+1 + 1043 802B 38 sec + 1044 802C A5 B3 lda xcircle + 1045 802E E5 C7 sbc magic+1 + 1046 8030 85 61 sta xdraw + 1047 8032 A5 B4 lda xcircle+1 + 1048 8034 E9 00 sbc #0 + 1049 8036 85 62 sta xdraw+1 ; new starting coordinate in a given row + 1050 8038 C6 B0 dec ExplosionRadius + 1051 803A D0 C1 bne NextRow + 1052 803C EndOfTheDirt + 1053 803C A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 1054 8044 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 1055 804C 60 rts + 1056 .endp + 1057 ;-------------------------------------------------- + 1058 804D .proc BeforeFire ;TankNr (byte) + 1059 ;-------------------------------------------------- + 1060 ;this nice routine makes the whole shooting + 1061 ;preparation: aiming and displaying + 1062 ;angle and shooting force values + 1063 ; + 1064 + 1065 ;first, get current parameters (angle+force) + 1066 ;for an active tank and display them + 1067 ;(these values are taken from the previous round) + 1068 + 1069 804D A6 6C ldx TankNr + 1070 + 1071 ;Checking the maximal force + 1072 804F BD EB 43 lda MaxForceTableH,x + 1073 8052 DD DF 43 cmp ForceTableH,x + 1074 8055 D0 06 bne ContinueToCheckMaxForce2 + 1075 8057 BD E5 43 lda MaxForceTableL,x + 1076 805A DD D9 43 cmp ForceTableL,x + 1077 805D ContinueToCheckMaxForce2 + 1078 805D B0 0C bcs @+ + 1079 805F BD EB 43 lda MaxForceTableH,x + 1080 8062 9D DF 43 sta ForceTableH,x + 1081 8065 BD E5 43 lda MaxForceTableL,x + 1082 8068 9D D9 43 sta ForceTableL,x + 1083 @ + 1084 806B A9 00 85 AA mva #0 Erase + 1085 806F 20 0F 66 jsr PutTankNameOnScreen + 1086 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 1087 + 1088 8072 20 2C 6A jsr DrawTankNr + 1089 + 1090 8075 20 89 5A jsr WaitOneFrame ; best after drawing a tank + 1091 + 1092 8078 24 97 bit TestFlightFlag + 1093 807A 10 03 bpl @+ + 1094 807C 20 23 83 jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation + 1095 @ + 1096 ;keyboard reading + 1097 ; KBCODE keeps code of last keybi + 1098 ; SKSTAT $ff - nothing pressed + 1099 ; $FB - any key + 1100 ; $f7 - shift + 1101 ; $f3 - shift+key + 1102 + 1103 807F notpressed + 1104 807F A6 6C ldx TankNr ; for optimize + 1105 ; Select and Option + 1106 8081 A5 02 lda CONSOL + 1107 8083 A8 tay + 1108 8084 29 05 and #%00000101 ; Start + Option + 1109 8086 F0 2C beq QuitToGameover + 1110 8088 98 tya + 1111 8089 29 04 and #%00000100 + 1112 808B F0 3C beq callActivation ; Option key + 1113 808D 98 tya + 1114 808E 29 02 and #%00000010 + 1115 8090 D0 03 4C A0 82 jeq pressedTAB ; Select key + 1116 8095 A5 02 lda SKSTAT + 1117 8097 C9 FF cmp #$ff + 1118 8099 D0 03 4C 52 81 jeq checkJoy + 1119 809E C9 F7 cmp #$f7 ; SHIFT + 1120 80A0 D0 03 4C 52 81 jeq checkJoy + 1121 + 1122 80A5 A5 02 lda kbcode + 1123 80A7 29 BF and #%10111111 ; SHIFT elimination + 1124 + 1125 80A9 C9 08 cmp #@kbcode._O ; $08 ; O + 1126 80AB D0 0C bne @+ + 1127 80AD 20 AE 73 jsr AreYouSure + 1128 80B0 24 D7 bit escFlag + 1129 80B2 10 CB bpl notpressed + 1130 ;---O pressed-quit game to game over screen--- + 1131 80B4 QuitToGameover + 1132 80B4 A9 40 85 D7 mva #$40 escFlag + 1133 80B8 60 rts + 1134 @ + 1135 80B9 C9 1C cmp #@kbcode._esc ; 28 ; ESC + 1136 80BB D0 08 bne @+ + 1137 80BD 20 AE 73 jsr AreYouSure + 1138 80C0 24 D7 bit escFlag + 1139 80C2 10 BB bpl notpressed + 1140 ;---esc pressed-quit game--- + 1141 80C4 60 rts + 1142 @ + 1143 80C5 C9 3F cmp #@kbcode._A ; $3f ; A + 1144 80C7 D0 09 bne @+ + 1145 80C9 callActivation + 1146 ; Hide all tanks - after inventory they may have other shapes + 1147 80C9 20 0B 6A jsr ClearTanks + 1148 80CC 20 AC 63 jsr DefensivesActivate + 1149 80CF 4C E0 80 jmp afterInventory + 1150 + 1151 @ + 1152 80D2 C9 0D cmp #@kbcode._I ; $0d ; I + 1153 80D4 D0 2D bne @+ + 1154 80D6 callInventory + 1155 ; Hide all tanks - after inventory they may have other shapes + 1156 80D6 20 0B 6A jsr ClearTanks + 1157 ; + 1158 80D9 A9 FF 85 E4 mva #$ff isInventory + 1159 80DD 20 C0 63 jsr Purchase + 1160 80E0 afterInventory + 1161 80E0 20 89 5A jsr MakeDarkScreen + 1162 80E3 20 0F 66 jsr DisplayStatus + 1163 80E6 20 E4 76 jsr SetMainScreen + 1164 80E9 20 12 6A jsr DrawTanks + 1165 ;jsr WaitOneFrame ; not necessary + 1166 80EC 24 5E bit LazyFlag + 1167 80EE 50 03 bvc NoLazy + 1168 80F0 20 4A 8B jsr LazyBoys + 1169 80F3 NoLazy + 1170 80F3 24 5F bit SpyHardFlag + 1171 80F5 10 03 bpl NoSpyHard + 1172 80F7 20 FC 8A jsr SpyHard + 1173 80FA NoSpyHard + 1174 80FA RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 80FA A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: weapons.asm + 1175 80FC A9 00 85 D7 mva #0 escFlag + 1176 8100 4C F3 82 jmp ReleaseAndLoop + 1177 @ + 1178 8103 C9 8E cmp #$80|@kbcode._up + 1179 8105 D0 03 4C AD 81 jeq CTRLPressedUp + 1180 810A C9 8F cmp #$80|@kbcode._down + 1181 810C D0 03 4C E8 81 jeq CTRLPressedDown + 1182 8111 C9 AC cmp #$80|@kbcode._tab + 1183 8113 D0 03 4C BF 82 jeq CTRLPressedTAB + 1184 + 1185 8118 jumpFromStick + 1186 .IF TARGET = 800 + 1187 cmp #$80|17 ; Ctrl+Help + 1188 bne NoVdebugSwitch + 1189 lda Vdebug + 1190 eor #$ff + 1191 sta Vdebug + 1192 jmp ReleaseAndLoop + 1193 NoVdebugSwitch + 1194 .ENDIF + 1195 8118 29 3F and #$3f ;CTRL and SHIFT ellimination + 1196 811A C9 0E cmp #@kbcode._up ; $e + 1197 811C F0 55 jeq pressedUp + 1198 811E C9 0F cmp #@kbcode._down ; $f + 1199 8120 D0 03 4C BE 81 jeq pressedDown + 1200 8125 C9 06 cmp #@kbcode._left ; $6 + 1201 8127 D0 03 4C 51 82 jeq pressedLeft + 1202 812C C9 07 cmp #@kbcode._right ; $7 + 1203 812E D0 03 4C 02 82 jeq pressedRight + 1204 8133 C9 21 cmp #@kbcode._space ; $21 + 1205 8135 D0 03 4C F9 82 jeq pressedSpace + 1206 813A C9 2C cmp #@kbcode._tab ; $2c + 1207 813C D0 03 4C A0 82 jeq pressedTAB + 1208 8141 C9 25 cmp #@kbcode._M ; $25 ; M + 1209 8143 D0 03 4C DE 82 jeq pressedM + 1210 8148 C9 3E cmp #@kbcode._S ; $3e ; S + 1211 814A D0 03 4C EB 82 jeq pressedS + 1212 .IF TARGET = 800 + 1213 cmp #61 ; G + 1214 bne EndKeys + 1215 jsr SelectNextGradient.NotWind + 1216 jmp ReleaseAndLoop + 1217 .ENDIF + 1218 814F EndKeys + 1219 814F 4C 7F 80 jmp notpressed + 1220 8152 checkJoy + 1221 ;------------JOY------------- + 1222 ;happy happy joy joy + 1223 ;check for joystick now + 1224 8152 A5 02 lda STICK0 + 1225 8154 29 0F and #$0f + 1226 8156 C9 0F cmp #$0f + 1227 8158 F0 0B beq notpressedJoy + 1228 815A A8 tay + 1229 815B A9 00 85 02 mva #0 ATRACT ; reset atract mode + 1230 815F B9 5A 60 lda joyToKeyTable,y + 1231 8162 4C 18 81 jmp jumpFromStick + 1232 8165 notpressedJoy + 1233 ;fire + 1234 8165 A5 02 lda STRIG0 + 1235 8167 D0 03 4C F9 82 jeq pressedSpace + 1236 816C A9 FF 85 9B mva #$ff pressTimer ; stop counting frames + 1237 8170 4C 7F 80 jmp notpressed + 1238 + 1239 ; + 1240 8173 pressedUp + 1241 8173 A5 9B lda pressTimer + 1242 8175 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1243 817B C9 19 cmp #25 ; 1/2s + 1244 817D B0 2E bcs CTRLPressedUp + 1245 + 1246 + 1247 ;force increaseeee! + 1248 ;ldx TankNr ; optimized + 1249 817F FE D9 43 inc ForceTableL,x + 1250 8182 D0 03 bne CheckingMaxForce + 1251 8184 FE DF 43 inc ForceTableH,x + 1252 + 1253 8187 CheckingMaxForce + 1254 + 1255 8187 A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1256 + 1257 818B BD EB 43 lda MaxForceTableH,x + 1258 818E DD DF 43 cmp ForceTableH,x + 1259 8191 D0 06 bne FurtherCheckMaxForce + 1260 8193 BD E5 43 lda MaxForceTableL,x + 1261 8196 DD D9 43 cmp ForceTableL,x + 1262 8199 FurtherCheckMaxForce + 1263 8199 90 03 4C 4D 80 jcs BeforeFire + 1264 + 1265 819E BD EB 43 lda MaxForceTableH,x + 1266 81A1 9D DF 43 sta ForceTableH,x + 1267 81A4 BD E5 43 lda MaxForceTableL,x + 1268 81A7 9D D9 43 sta ForceTableL,x + 1269 + 1270 81AA 4C 4D 80 jmp BeforeFire + 1271 + 1272 81AD CTRLPressedUp + 1273 ;ldx TankNr ; optimized + 1274 81AD BD D9 43 lda ForceTableL,x + 1275 81B0 18 clc + 1276 81B1 69 0A adc #10 + 1277 81B3 9D D9 43 sta ForceTableL,x + 1278 81B6 90 CF bcc CheckingMaxForce + 1279 81B8 FE DF 43 inc ForceTableH,x + 1280 81BB 4C 87 81 jmp CheckingMaxForce + 1281 + 1282 + 1283 81BE pressedDown + 1284 81BE A5 9B lda pressTimer + 1285 81C0 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1286 81C6 C9 19 cmp #25 ; 1/2s + 1287 81C8 B0 1E bcs CTRLPressedDown + 1288 + 1289 81CA A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1290 + 1291 ;ldx TankNr ; optimized + 1292 81CE DE D9 43 dec ForceTableL,x + 1293 81D1 BD D9 43 lda ForceTableL,x + 1294 81D4 C9 FF cmp #$ff + 1295 81D6 D0 0D bne @+ + 1296 81D8 DE DF 43 dec ForceTableH,x + 1297 81DB 10 08 bpl @+ + 1298 81DD ForceGoesZero + 1299 81DD A9 00 lda #0 + 1300 81DF 9D DF 43 sta ForceTableH,x + 1301 81E2 9D D9 43 sta ForceTableL,x + 1302 @ + 1303 81E5 4C 4D 80 jmp BeforeFire + 1304 + 1305 81E8 CTRLPressedDown + 1306 81E8 A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1307 + 1308 ;ldx TankNr ; optimized + 1309 81EC 38 sec + 1310 81ED BD D9 43 lda ForceTableL,x + 1311 81F0 E9 0A sbc #10 + 1312 81F2 9D D9 43 sta ForceTableL,x + 1313 81F5 90 03 4C 4D 80 jcs BeforeFire + 1314 81FA DE DF 43 dec ForceTableH,x + 1315 81FD 30 DE bmi ForceGoesZero + 1316 81FF 4C 4D 80 jmp BeforeFire + 1317 + 1318 8202 pressedRight + 1319 ;ldx TankNr ; optimized + 1320 8202 A5 9B lda pressTimer + 1321 8204 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1322 820A C9 19 cmp #25 ; 1/2s + 1323 820C B0 20 bcs CTRLPressedRight + 1324 + 1325 820E A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1326 8212 A9 01 85 AA mva #1 Erase + 1327 8216 20 48 6B jsr DrawTankNr.BarrelChange + 1328 8219 DE C3 48 BD C3 48 dec:lda AngleTable,x + 1329 821F C9 FF cmp #255 ; -1 + 1330 8221 F0 03 4C 4D 80 jne BeforeFire + 1331 8226 A9 B4 lda #180 + 1332 8228 9D C3 48 sta AngleTable,x + 1333 822B 4C 4D 80 jmp BeforeFire + 1334 + 1335 822E CTRLPressedRight + 1336 ;ldx TankNr ; optimized + 1337 822E A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1338 8232 A9 01 85 AA mva #1 Erase + 1339 8236 20 48 6B jsr DrawTankNr.BarrelChange + 1340 8239 BD C3 48 lda AngleTable,x + 1341 823C 38 sec + 1342 823D E9 04 sbc #4 + 1343 823F 9D C3 48 sta AngleTable,x + 1344 8242 C9 04 cmp #4 ; smallest angle for speed rotating + 1345 8244 90 03 4C 4D 80 jcs BeforeFire + 1346 8249 A9 B4 lda #180 + 1347 824B 9D C3 48 sta AngleTable,x + 1348 824E 4C 4D 80 jmp BeforeFire + 1349 + 1350 + 1351 8251 pressedLeft + 1352 ;ldx TankNr ; optimized + 1353 8251 A5 9B lda pressTimer + 1354 8253 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1355 8259 C9 19 cmp #25 ; 1/2s + 1356 825B B0 20 bcs CTRLPressedLeft + 1357 + 1358 825D A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1359 8261 A9 01 85 AA mva #1 Erase + 1360 8265 20 48 6B jsr DrawTankNr.BarrelChange + 1361 8268 FE C3 48 INC AngleTable,x + 1362 826B BD C3 48 lda AngleTable,x + 1363 826E C9 B4 cmp #180 + 1364 8270 B0 03 4C 4D 80 jcc BeforeFire + 1365 8275 A9 00 lda #0 + 1366 8277 9D C3 48 sta AngleTable,x + 1367 827A 4C 4D 80 jmp BeforeFire + 1368 + 1369 827D CTRLPressedLeft + 1370 ;ldx TankNr ; optimized + 1371 827D A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1372 8281 A9 01 85 AA mva #1 Erase + 1373 8285 20 48 6B jsr DrawTankNr.BarrelChange + 1374 8288 BD C3 48 lda AngleTable,x + 1375 828B 18 clc + 1376 828C 69 04 adc #4 + 1377 828E 9D C3 48 sta AngleTable,x + 1378 8291 C9 B0 cmp #180-4 + 1379 8293 B0 03 4C 4D 80 jcc BeforeFire + 1380 8298 A9 00 lda #0 + 1381 829A 9D C3 48 sta AngleTable,x + 1382 829D 4C 4D 80 jmp BeforeFire + 1383 + 1384 82A0 pressedTAB + 1385 82A0 A9 17 85 9E mva #sfx_purchase sfx_effect + 1386 ;ldx TankNr ; optimized + 1387 82A4 BD F7 43 lda ActiveWeapon,x + 1388 82A7 C9 1F cmp #last_offensive_____ ; the last possible offensive weapon + 1389 82A9 D0 07 bne ?notlasttofirst + 1390 82AB A9 00 lda #first_offensive____ ; #0 + 1391 82AD 9D F7 43 sta ActiveWeapon,x + 1392 82B0 F0 03 beq @+ ; allways = 0 + 1393 82B2 ?notlasttofirst + 1394 82B2 FE F7 43 inc ActiveWeapon,x + 1395 @ + 1396 82B5 BD F7 43 lda ActiveWeapon,x + 1397 82B8 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 1398 82BB F0 E3 beq pressedTAB + 1399 82BD D0 34 bne ReleaseAndLoop + 1400 + 1401 82BF CTRLpressedTAB + 1402 82BF A9 17 85 9E mva #sfx_purchase sfx_effect + 1403 ;ldx TankNr ; optimized + 1404 82C3 BD F7 43 lda ActiveWeapon,x + 1405 82C6 C9 00 cmp #first_offensive____ ; #0 + 1406 82C8 D0 07 bne ?notfirsttolast + 1407 82CA A9 1F lda #last_offensive_____ ; the last possible offensive weapon + 1408 82CC 9D F7 43 sta ActiveWeapon,x + 1409 82CF D0 03 bne @+ ; allways <> 0 + 1410 82D1 ?notfirsttolast + 1411 82D1 DE F7 43 dec ActiveWeapon,x + 1412 @ + 1413 82D4 BD F7 43 lda ActiveWeapon,x + 1414 82D7 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 1415 82DA F0 E3 beq CTRLpressedTAB + 1416 82DC D0 15 bne ReleaseAndLoop + 1417 + 1418 82DE pressedM + 1419 ; have you tried turning the music off and on again? + 1420 82DE A9 FF lda #$ff + 1421 82E0 4D 00 41 8D 00 41 eor:sta noMusic + 1422 82E6 RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 82E6 A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: weapons.asm + 1423 82E8 4C F3 82 jmp ReleaseAndLoop + 1424 + 1425 82EB pressedS + 1426 ; have you tried turning sfx off and on again? + 1427 82EB A9 FF lda #$ff + 1428 82ED 4D 01 41 8D 01 41 eor:sta noSfx + 1429 82F3 ReleaseAndLoop + 1430 82F3 20 71 5A jsr WaitForKeyRelease + 1431 82F6 4C 4D 80 jmp BeforeFire + 1432 + 1433 82F9 pressedSpace + 1434 ;================================= + 1435 ;we shoot here!!! + 1436 82F9 A9 00 lda #0 + 1437 82FB 85 02 sta ATRACT ; reset atract mode + 1438 82FD 85 9B sta pressTimer ; reset + 1439 82FF 20 71 5A jsr WaitForKeyRelease.StillWait + 1440 8302 A5 9B lda pressTimer + 1441 8304 C9 19 cmp #25 ; 1/2s + 1442 8306 90 03 bcc fire + 1443 8308 4C D6 80 jmp callInventory + 1444 830B fire + 1445 830B 60 RTS + 1446 .endp + 1447 + 1448 ;-------------------------------------------------- + 1449 830C .proc Shoot ;TankNr (byte) + 1450 ;-------------------------------------------------- + 1451 ;it looks like this routine is too big - + 1452 ;- more and more functions were being added... + 1453 ;good idea would be to rewrite it completely + 1454 ;with much more separate blocks, but you know - + 1455 ;- do not touch it if it works... + 1456 + 1457 830C A9 00 85 97 mva #0 TestFlightFlag + 1458 + 1459 ;the latest addition to this routine is + 1460 ;displaying offensive texts! + 1461 + 1462 8310 RandomizeOffensiveText + 1463 8310 AD 1B D4 lda random + 1464 8313 C9 36 cmp #talk.NumberOfOffensiveTexts + 1465 8315 B0 F9 bcs RandomizeOffensiveText + 1466 + 1467 8317 8D C0 48 sta TextNumberOff + 1468 831A A4 6C ldy TankNr + 1469 831C A9 FF 85 DB mva #$ff plot4x4color + 1470 8320 20 88 72 jsr DisplayOffensiveTextNr + 1471 + 1472 8323 AfterOffensiveText + 1473 8323 A9 00 8D 8B 44 mva #0 LaserFlag ; $ff - Laser + 1474 8328 A6 6C ldx TankNr + 1475 832A BD F7 43 lda ActiveWeapon,x + 1476 832D C9 1F cmp #ind_Laser__________ ; laser + 1477 832F D0 15 bne NotStrongShoot + 1478 ; Laser: (not)very strong - invisible - shot for laser beam end coordinates + 1479 8331 24 60 bit Vdebug + 1480 8333 30 04 bmi @+ + 1481 8335 A9 00 85 A9 mva #0 color + 1482 8339 A9 01 @ lda #1 + 1483 833B 85 A4 sta Force + 1484 833D 85 A5 sta Force+1 + 1485 833F A9 FF 8D 8B 44 mva #$ff LaserFlag ; $ff - Laser + 1486 8344 D0 0B bne AfterStrongShoot + 1487 8346 NotStrongShoot + 1488 8346 20 96 59 jsr Table2Force + 1489 8349 24 97 bit TestFlightFlag + 1490 834B 30 04 bmi AfterStrongShoot + 1491 834D A9 19 85 9E mva #sfx_shoot sfx_effect + 1492 8351 AfterStrongShoot + 1493 8351 BD C3 48 lda AngleTable,x + 1494 8354 85 A7 sta Angle + 1495 + 1496 ; Shoots tank nr X !!! :) + 1497 ; set the starting coordinates of bullet with correction + 1498 ; to start where the tank's barrel ends + 1499 ; (without it bullet would go from the left lower corner of the tank) + 1500 ;ldx TankNr + 1501 + 1502 8356 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 + 1503 8360 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 + 1504 8365 A9 00 lda #0 + 1505 8367 85 A6 sta Force+2 + 1506 8369 85 CD sta ytraj+2 + 1507 836B 85 C8 sta xtraj + 1508 836D 85 CB sta ytraj + 1509 + 1510 ; checking if the shot is underground (no Flight but Hit :) ) + 1511 836F A8 tay ; A=0 ! + 1512 8370 18 A5 C9 69 3E 85 + adw xtraj+1 #mountaintable temp + 1513 837D A5 CC lda ytraj+1 + 1514 837F D1 72 cmp (temp),y ; check collision with mountains + 1515 8381 B0 08 bcs ShotUnderGround + 1516 8383 20 A0 83 jsr Flight + 1517 8386 A9 01 85 A9 mva #1 color + 1518 838A 60 rts + 1519 838B ShotUnderGround + 1520 838B A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? + 1521 8393 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 1522 839B A9 FF 85 BF mva #$ff HitFlag + 1523 839F 60 rts + 1524 .endp + 1525 + 1526 ;-------------------------------------------------- + 1527 83A0 .proc Flight ; Force(byte.byte), Wind(0.word) + 1528 ; Angle(byte) 128=0, 255=maxright, 0=maxleft + 1529 ; if 7bit and 6bit of TestFlightFlag is set no real flight - hit test only (for AI) + 1530 ; 7bit - fast, test flight + 1531 ; 6bit - invisible bullet + 1532 ;-------------------------------------------------- + 1533 ;g=-0.1 + 1534 ;vx=Force*cos(Angle) + 1535 ;vy=Force*sin(Angle) + 1536 ; + 1537 ;:begin + 1538 ;ytraj=ytray-vy + 1539 ;vy=vy-g + 1540 ;xtraj=xtraj+vx - without Wind + 1541 ;vx=vx+Wind (Wind is a small fraction) + 1542 ;plot xtraj,ytraj - there is clearing in plot + 1543 ;goto begin- + 1544 + 1545 + 1546 ; smoke tracer :) + 1547 83A0 A0 00 ldy #0 + 1548 83A2 24 97 bit TestFlightFlag ; if test flight for AI or Lazy Darwin + 1549 83A4 30 0A bmi noSmokeTracer ; no Smoke Tracer display + 1550 83A6 A6 6C ldx TankNr + 1551 83A8 BD F7 43 lda ActiveWeapon,x + 1552 83AB C9 0B cmp #ind_Smoke_Tracer___ ; Smoke tracer + 1553 83AD D0 01 bne noSmokeTracer + 1554 83AF C8 iny + 1555 83B0 noSmokeTracer + 1556 83B0 8C 8A 44 sty SmokeTracerFlag + 1557 + 1558 83B3 RepeatIfSmokeTracer + 1559 83B3 RepeatFlight + 1560 83B3 A5 CC 8D 92 44 A5 + mwa ytraj+1 Ytrajold+1 + 1561 83BD A5 C9 8D 8F 44 A5 + mwa xtraj+1 Xtrajold+1 + 1562 83C7 A9 40 8D 73 43 mva #%01000000 drawFunction + 1563 + 1564 83CC A9 00 lda #0 + 1565 83CE 85 BB sta vx + 1566 83D0 85 BC sta vx+1 + 1567 83D2 85 BD sta vx+2 + 1568 83D4 85 BF sta HitFlag + 1569 83D6 85 61 sta xdraw + 1570 83D8 85 62 sta xdraw+1 + 1571 83DA 85 63 sta ydraw + 1572 83DC 85 64 sta ydraw+1 + 1573 + 1574 ;vx calculation + 1575 ;vx = sin(90-Angle) for Angle <=90 + 1576 ;vx = -sin(Angle-90) for 90 < Angle <= 180 + 1577 83DE aslw Force ;Force = Force * 2 +Macro: ASLW [Source: MACRO.ASM] + 1 83DE 06 A4 ASL FORCE + 2 83E0 26 A5 ROL FORCE+1 +Source: weapons.asm + 1578 + 1579 ;cos(Angle) (but we use sin table only so some shenanigans happen) + 1580 83E2 A6 A7 ldx Angle + 1581 83E4 8E 15 45 stx LeapFrogAngle ; we will need it later + 1582 + 1583 ;Angle works like this: + 1584 ;0 'degrees' is horizontally right + 1585 ;90 'degrees' is straight up + 1586 ;180 horizontally left + 1587 + 1588 ; (we have to set goleft used in rolling weapons) + 1589 + 1590 83E7 E0 5B cpx #91 + 1591 83E9 90 0C bcc angleUnder90 + 1592 + 1593 ;over 90 + 1594 83EB A9 01 85 E6 mva #1 goleft + 1595 83EF 38 sec + 1596 83F0 8A txa ; lda # Angle + 1597 83F1 E9 5A sbc #90 + 1598 83F3 AA tax + 1599 83F4 4C 01 84 jmp @+ + 1600 + 1601 83F7 angleUnder90 + 1602 83F7 A9 00 85 E6 mva #0 goleft + 1603 83FB 38 sec ; X = 90-Angle + 1604 83FC A9 5A lda #90 + 1605 83FE E5 A7 sbc Angle + 1606 8400 AA tax + 1607 @ + 1608 8401 BD C1 5B lda sintable,x ; cos(X) + 1609 8404 8D 94 44 sta Multiplee ; *Force + 1610 8407 A5 A4 85 DC A5 A5 + mwa Force Multiplier + 1611 840F A9 00 lda #$0 + 1612 8411 85 DE sta Multiplier+2 + 1613 8413 A2 08 ldx #8 + 1614 8415 MultiplyLoop + 1615 8415 6E 94 44 ror Multiplee + 1616 8418 90 13 bcc DoNotAdd + 1617 841A 18 clc + 1618 841B A5 DC lda Multiplier + 1619 841D 65 BB adc vx + 1620 841F 85 BB sta vx + 1621 8421 A5 DD lda Multiplier+1 + 1622 8423 65 BC adc vx+1 + 1623 8425 85 BC sta vx+1 + 1624 8427 A5 DE lda Multiplier+2 + 1625 8429 65 BD adc vx+2 + 1626 842B 85 BD sta vx+2 + 1627 842D DoNotAdd + 1628 ;clc ;carry always cleared here (anyway we hope so :) + 1629 842D 26 DC rol Multiplier + 1630 842F 26 DD rol Multiplier+1 + 1631 8431 26 DE rol Multiplier+2 + 1632 8433 CA dex + 1633 8434 D0 DF bne MultiplyLoop + 1634 + 1635 8436 A9 00 85 BE mva #0 vx+3 + 1636 ; here in vx there is a number + 1637 ; xxxx.xx00 = sin(Angle)*Force + 1638 ; negate it if going left + 1639 843A A5 E6 lda goleft + 1640 843C F0 18 beq @+ + 1641 .rept 4 + 1642 LDA #$00 + 1643 SBC VX+# + 1644 STA VX+# + 1645 .endr +Source: REPT + 1642 843E A9 00 LDA #$00 + 1642 8440 E5 BB SBC VX+# + 1642 8442 85 BB STA VX+# + 1642 8444 A9 00 LDA #$00 + 1642 8446 E5 BC SBC VX+# + 1642 8448 85 BC STA VX+# + 1642 844A A9 00 LDA #$00 + 1642 844C E5 BD SBC VX+# + 1642 844E 85 BD STA VX+# + 1642 8450 A9 00 LDA #$00 + 1642 8452 E5 BE SBC VX+# + 1642 8454 85 BE STA VX+# +Source: weapons.asm + 1646 @ + 1647 ;======vy + 1648 ;vy = sin(Angle) for Angle <=90 + 1649 ;vy = sin(180-Angle) for 90 < Angle <= 180 + 1650 + 1651 8456 A9 00 lda #0 + 1652 8458 85 B7 sta vy + 1653 845A 85 B8 sta vy+1 + 1654 845C 85 B9 sta vy+2 + 1655 ;-- + 1656 845E A6 A7 ldx Angle + 1657 8460 E0 5B cpx #91 + 1658 8462 90 06 bcc YangleUnder90 + 1659 + 1660 8464 A9 B4 lda #180 + 1661 8466 38 sec + 1662 8467 E5 A7 sbc Angle + 1663 8469 AA tax + 1664 + 1665 846A YangleUnder90 + 1666 846A BD C1 5B lda sintable,x + 1667 + 1668 846D 8D 94 44 sta Multiplee ;sin(Angle)*Force + 1669 8470 A5 A4 85 DC A5 A5 + mwa Force Multiplier + 1670 8478 A9 00 lda #$0 + 1671 847A 85 DE sta Multiplier+2 + 1672 847C A2 08 ldx #8 + 1673 847E MultiplyLoopY + 1674 847E 6E 94 44 ror Multiplee + 1675 8481 90 13 bcc DoNotAddY + 1676 8483 18 clc + 1677 8484 A5 DC lda Multiplier + 1678 8486 65 B7 adc vy + 1679 8488 85 B7 sta vy + 1680 848A A5 DD lda Multiplier+1 + 1681 848C 65 B8 adc vy+1 + 1682 848E 85 B8 sta vy+1 + 1683 8490 A5 DE lda Multiplier+2 + 1684 8492 65 B9 adc vy+2 + 1685 8494 85 B9 sta vy+2 + 1686 8496 DoNotAddY + 1687 ;clc ;carry always cleared here (anyway we hope so :) + 1688 8496 26 DC rol Multiplier + 1689 8498 26 DD rol Multiplier+1 + 1690 849A 26 DE rol Multiplier+2 + 1691 849C CA dex + 1692 849D D0 DF bne MultiplyLoopY + 1693 ; here in vy there is a number + 1694 ; yyyy.yy=cos(Angle)*Force + 1695 + 1696 849F A9 00 85 BA mva #0 vy+3 ;vy=cos(Angle)*Force + 1697 + 1698 84A3 Loopi + 1699 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 1700 84A3 38 sec + 1701 84A4 A5 CB lda ytraj + 1702 84A6 E5 B8 sbc vy+1 + 1703 84A8 85 CB sta ytraj + 1704 84AA A5 CC lda ytraj+1 + 1705 84AC E5 B9 sbc vy+2 + 1706 84AE 85 CC sta ytraj+1 + 1707 84B0 A5 CD lda ytraj+2 + 1708 84B2 E5 BA sbc vy+3 + 1709 84B4 85 CD sta ytraj+2 + 1710 + 1711 84B6 2C 8B 44 bit LaserFlag ; no gravity if Laser + 1712 84B9 30 25 bmi NoGravity + 1713 ;vy=vy-g (again without least significant byte of vy) + 1714 84BB 38 sec + 1715 84BC A5 B8 lda vy+1 + 1716 84BE E5 E0 sbc gravity + 1717 84C0 85 B8 sta vy+1 + 1718 84C2 A5 B9 lda vy+2 + 1719 84C4 E9 00 sbc #0 + 1720 84C6 85 B9 sta vy+2 + 1721 84C8 A5 BA lda vy+3 + 1722 84CA E9 00 sbc #0 + 1723 84CC 85 BA sta vy+3 + 1724 84CE 10 10 bpl StillUp + 1725 ; where we know that the bullet starts to fall down + 1726 ; we check if it is MIRV and if so, jump to MIRV routine + 1727 84D0 24 97 bit TestFlightFlag + 1728 84D2 30 0C bmi NoTestForMIRV + 1729 84D4 A6 6C ldx TankNr + 1730 84D6 BD F7 43 lda ActiveWeapon,x + 1731 84D9 C9 06 cmp #ind_MIRV___________ ; MIRV + 1732 84DB D0 03 4C 7C 87 jeq MIRVdownLoop + 1733 84E0 NoTestForMIRV + 1734 84E0 NoGravity + 1735 84E0 StillUp + 1736 + 1737 84E0 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx) + 1738 84E1 A5 C8 lda xtraj ;here of course Fight to right + 1739 84E3 65 BC adc vx+1 + 1740 84E5 85 C8 sta xtraj + 1741 84E7 A5 C9 lda xtraj+1 + 1742 84E9 65 BD adc vx+2 + 1743 84EB 85 C9 sta xtraj+1 + 1744 84ED A5 CA lda xtraj+2 + 1745 84EF 65 BE adc vx+3 + 1746 84F1 85 CA sta xtraj+2 + 1747 + 1748 84F3 2C 8B 44 bit LaserFlag ; no wind if Laser + 1749 84F6 30 19 bmi NoWind + 1750 84F8 18 clc + 1751 .rept 4 + 1752 LDA VX+# + 1753 ADC WIND+# + 1754 STA VX+# + 1755 .endr +Source: REPT + 1752 84F9 A5 BB LDA VX+# + 1752 84FB 65 CE ADC WIND+# + 1752 84FD 85 BB STA VX+# + 1752 84FF A5 BC LDA VX+# + 1752 8501 65 CF ADC WIND+# + 1752 8503 85 BC STA VX+# + 1752 8505 A5 BD LDA VX+# + 1752 8507 65 D0 ADC WIND+# + 1752 8509 85 BD STA VX+# + 1752 850B A5 BE LDA VX+# + 1752 850D 65 D1 ADC WIND+# + 1752 850F 85 BE STA VX+# +Source: weapons.asm + 1756 8511 NoWind + 1757 8511 AD 8F 44 85 61 AD + mwa xtrajold+1 xdraw + 1758 851B AD 92 44 85 63 AD + mwa ytrajold+1 ydraw + 1759 8525 A5 C9 85 65 A5 CA + mwa xtraj+1 xbyte + 1760 852D A5 CC 85 67 A5 CD + mwa ytraj+1 ybyte + 1761 8535 20 12 66 jsr draw + 1762 ;key + 1763 8538 2C 8B 44 bit LaserFlag + 1764 853B 30 03 bmi LaserNoWalls + 1765 ; Check for walls + 1766 853D 20 E7 89 jsr MakeWalls + 1767 ; + 1768 8540 LaserNoWalls + 1769 8540 A5 C9 8D 8F 44 A5 + mwa xtraj+1 XtrajOld+1 + 1770 854A A5 CC 8D 92 44 A5 + mwa ytraj+1 YtrajOld+1 + 1771 + 1772 8554 24 97 bit TestFlightFlag + 1773 8556 30 14 bmi nowait + 1774 8558 2C 8B 44 bit LaserFlag ; faster laser prepare + 1775 855B 10 04 bpl nolaserwait + 1776 855D 24 60 bit Vdebug + 1777 855F 10 0B bpl nowait + 1778 8561 nolaserwait + 1779 8561 A5 A9 lda color + 1780 8563 F0 04 beq nonowait ; smoke tracer erases slowly + 1781 8565 A5 E3 lda tracerflag + 1782 8567 D0 03 bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) + 1783 8569 nonowait + 1784 8569 20 A7 5A jsr shellDelay + 1785 + 1786 856C nowait + 1787 856C A5 BF lda HitFlag + 1788 856E D0 66 bne Hit + 1789 ; --- only for Laser + 1790 8570 2C 8B 44 bit LaserFlag + 1791 8573 10 29 bpl NoCheckEdgesForLaser + 1792 ; If laser fires, edges of the screen finish "flying" and laser hits. + 1793 8575 A5 CD lda ytraj+2 + 1794 8577 30 0C bmi LaserHitEdge + 1795 8579 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth ;+1 + 1796 8583 90 19 bcc LaserNoHitEdge + 1797 8585 LaserHitEdge + 1798 8585 A5 61 85 C1 A5 62 + mwa xdraw XHit + 1799 858D A5 63 8D 5F 44 A5 + mwa ydraw YHit + 1800 8597 A9 FF 85 BF mva #$ff HitFlag ; screen edgs like ground (only for Laser) + 1801 859B 4C EF 85 jmp EndOfFlight + 1802 859E LaserNoHitEdge + 1803 ; ------------------ + 1804 859E NoCheckEdgesForLaser + 1805 + 1806 859E A5 CD C9 00 D0 04 + cpw ytraj+1 #screenheight+1 + 1807 85A8 90 04 bcc YTrayLowerThanScreenHeight + 1808 85AA A5 CD lda ytraj+2 + 1809 85AC 10 41 bpl EndOfFlight + 1810 + 1811 85AE YTrayLowerThanScreenHeight ; it means it is still on screen and not above + 1812 + 1813 85AE SkipCollisionCheck + 1814 + 1815 85AE A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw + 1816 85B6 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 1817 + 1818 85BE 24 97 bit TestFlightFlag + 1819 85C0 50 0A bvc NoTestFlight + 1820 85C2 24 60 bit Vdebug + 1821 85C4 10 0D bpl NoUnplot + 1822 85C6 20 89 5A jsr WaitOneFrame ; visualize AI targeting + 1823 85C9 4C D0 85 jmp YesUnPlot + 1824 85CC NoTestFlight + 1825 85CC A5 E3 lda tracerflag + 1826 85CE D0 03 bne NoUnPlot + 1827 + 1828 85D0 YesUnPlot + 1829 85D0 20 71 75 jsr UnPlot + 1830 + 1831 85D3 NoUnPlot + 1832 + 1833 85D3 4C A3 84 jmp Loopi + 1834 + 1835 85D6 Hit + 1836 85D6 A5 C1 85 61 A5 C2 + mwa XHit xdraw + 1837 85DE AD 5F 44 85 63 AD + mwa YHit ydraw + 1838 85E8 24 97 bit TestFlightFlag + 1839 85EA 70 03 bvs EndOfFlight + 1840 85EC 20 71 75 jsr unPlot + 1841 85EF EndOfFlight + 1842 85EF A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store for a little while + 1843 85F7 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!! + 1844 85FF A9 00 85 61 85 62 mwa #0 xdraw + 1845 8605 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 1846 860D 20 71 75 jsr unPlot + 1847 8610 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 1848 8618 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 1849 + 1850 8620 AC 8A 44 ldy SmokeTracerFlag + 1851 8623 F0 07 beq EndOfFlight2 + 1852 8625 88 dey + 1853 8626 8C 8A 44 sty SmokeTracerFlag + 1854 8629 4C 4E 87 jmp SecondFlight + 1855 862C EndOfFlight2 + 1856 862C A9 00 85 E3 mva #0 tracerflag ; don't know why + 1857 + 1858 8630 24 97 bit TestFlightFlag + 1859 8632 10 03 4C F1 86 jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check + 1860 ; and now check for defensive-aggressive weapon + 1861 8637 A5 BF lda HitFlag + 1862 8639 D0 03 4C F1 86 jeq NoHitAtEndOfFight ; RTS only !!! + 1863 863E 10 03 4C F1 86 jmi NoTankHitAtEndOfFight + 1864 ; tank hit - increase direct hits points + 1865 8643 A6 6C ldx TankNr + 1866 8645 E8 inx + 1867 8646 E4 BF cpx HitFlag ; we don't count suicides :) + 1868 8648 F0 04 beq @+ + 1869 864A CA dex + 1870 864B FE C7 43 inc DirectHits,x + 1871 ; bne @+ ; one byte enough + 1872 ; inc DirectHitsH,x + 1873 @ + 1874 ; tank hit - check defensive weapon of this tank + 1875 864E AA tax + 1876 864F CA dex ; index of hitted tank in X + 1877 8650 A4 6C ldy TankNr + 1878 8652 B9 F7 43 lda ActiveWeapon,y + 1879 8655 C9 0A cmp #ind_Tracer_________ ; defence not fire by tracers + 1880 8657 F0 16 beq JNoDefence + 1881 8659 C9 0B cmp #ind_Smoke_Tracer___ + 1882 865B F0 12 beq JNoDefence + 1883 865D C9 1F cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser + 1884 865F F0 0E beq JNoDefence + 1885 8661 BD FD 43 lda ActiveDefenceWeapon,x + 1886 8664 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence + 1887 8666 D0 03 4C F6 86 jeq BouncyCastle + 1888 866B C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector + 1889 866D F0 03 beq MagDeflector + 1890 866F JNoDefence + 1891 866F 4C F1 86 jmp NoDefence + 1892 8672 MagDeflector + 1893 ; now run defensive-aggressive weapon - Mag Deflector! + 1894 ; get tank position + 1895 8672 18 clc + 1896 8673 BD 0D 44 lda xtankstableL,x + 1897 8676 69 04 adc #$04 ; almost in tak center :) + 1898 8678 85 C1 sta XHit + 1899 867A BD 13 44 lda xtankstableH,x + 1900 867D 69 00 adc #$00 + 1901 867F 85 C2 sta XHit+1 + 1902 8681 A9 FF lda #$ff ; change to ground hit (we hope) + 1903 8683 85 BF sta HitFlag + 1904 8685 2C 1B D4 bit random ; left or right deflection ? + 1905 8688 10 1D bpl RightDeflection + 1906 868A LeftDeflection + 1907 868A 38 A5 C1 E9 12 85 + sbw XHit #18 ; 18 pixels to left and explode... + 1908 8695 24 C2 bit XHit+1 ; if off-screen ... + 1909 8697 10 32 bpl EndOfMagDeflector ; hit of course but we need RTS + 1910 8699 18 A5 C1 69 24 85 + adw XHit #36 ; change to right :) + 1911 86A4 4C CB 86 jmp EndOfMagDeflector + 1912 86A7 RightDeflection + 1913 86A7 18 A5 C1 69 12 85 + adw XHit #18 ; 18 pixels to right and explode... + 1914 86B2 A5 C2 CD 41 01 D0 + cpw XHit screenwidth ; if off-screen ... + 1915 86BE B0 0B bcs EndOfMagDeflector ; hit of course but we need RTS + 1916 86C0 38 A5 C1 E9 24 85 + sbw XHit #36 ; change to left + 1917 86CB EndOfMagDeflector + 1918 86CB A9 01 85 AA mva #1 Erase + 1919 86CF A5 6C lda TankNr + 1920 86D1 48 pha ; store TankNr + 1921 86D2 86 6C stx TankNr ; store X in TankNr :) + 1922 86D4 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 1923 86D7 A9 00 lda #0 + 1924 86D9 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon + 1925 86DC 9D A8 43 sta ShieldEnergy,x + 1926 86DF 85 AA sta Erase + 1927 86E1 20 2C 6A jsr DrawTankNr ; draw tank without shield + 1928 86E4 A6 6C ldx TankNr ; restore X value :) + 1929 86E6 68 pla + 1930 86E7 85 6C sta TankNr ; restore TankNr value :) + 1931 86E9 A5 C1 85 61 A5 C2 + mwa XHit xdraw ; why? !!! + 1932 86F1 NoTankHitAtEndOfFight + 1933 86F1 NoHitAtEndOfFight + 1934 86F1 NoDefence + 1935 86F1 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 +Macro: LSRW [Source: MACRO.ASM] + 1 86F1 46 A5 LSR FORCE+1 + 2 86F3 66 A4 ROR FORCE +Source: weapons.asm + 1936 86F5 60 rts ; END !!! + 1937 86F6 BouncyCastle + 1938 ; now in Y we have number of of the attacking player (TankNr) ! + 1939 86F6 B9 F7 43 lda ActiveWeapon,y + 1940 ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down + 1941 86F9 C9 05 cmp #ind_Funky_Bomb_____ + 1942 86FB D0 03 bne @+ + 1943 86FD 20 7A 8F jsr SetFullScreenSoilRange + 1944 @ + 1945 8700 A9 0D 85 9E mva #sfx_shield_on sfx_effect + 1946 ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! + 1947 8704 A9 01 85 AA mva #1 Erase + 1948 8708 A5 6C lda TankNr + 1949 870A 48 pha ; store TankNr + 1950 870B 86 6C stx TankNr ; store X in TankNr :) + 1951 870D 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 1952 8710 A9 00 lda #0 + 1953 8712 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon + 1954 8715 9D A8 43 sta ShieldEnergy,x + 1955 8718 85 C8 sta xtraj ; prepare coordinates + 1956 871A 85 CB sta ytraj + 1957 ; sta xtraj+2 + 1958 ; sta ytraj+2 + 1959 871C 85 AA sta Erase + 1960 871E 20 2C 6A jsr DrawTankNr ; draw tank without shield + 1961 ; ldx TankNr ; restore X value :) ... but we don't need X now .. + 1962 8721 68 pla + 1963 8722 85 6C sta TankNr ; restore TankNr value :) + 1964 8724 38 sec + 1965 8725 A9 B4 lda #180 + 1966 8727 ED 15 45 sbc LeapFrogAngle + 1967 872A 85 A7 sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) + 1968 872C lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 +Macro: LSRW [Source: MACRO.ASM] + 1 872C 46 A5 LSR FORCE+1 + 2 872E 66 A4 ROR FORCE +Source: weapons.asm + 1969 8730 A5 C1 85 C9 A5 C2 + mwa XHit xtraj+1 + 1970 8738 38 AD 5F 44 E9 05 + sbw YHit #5 ytraj+1 + 1971 8747 A9 01 85 A9 mva #1 color + 1972 874B 4C B3 83 jmp RepeatFlight ; and repeat Fight + 1973 .endp + 1974 + 1975 874E .proc SecondFlight + 1976 ; ---------------- copied code fragment from before firing. not too elegant. + 1977 ; ---------------- get fire parameters again + 1978 + 1979 874E A6 6C ldx TankNr + 1980 8750 20 96 59 jsr Table2Force + 1981 8753 BD C3 48 lda AngleTable,x + 1982 8756 85 A7 sta Angle + 1983 + 1984 ; Shoots tank nr X !!! :) + 1985 ; set the starting coordinates of bullet with correction + 1986 ; to start where the tank's barrel ends + 1987 ; (without it bullet would go from the left lower corner of the tank) + 1988 ;ldx TankNr + 1989 + 1990 8758 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 + 1991 8762 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 + 1992 8767 A9 00 lda #0 + 1993 8769 85 A6 sta Force+2 + 1994 876B 85 CD sta ytraj+2 + 1995 876D 85 C8 sta xtraj + 1996 876F 85 CB sta ytraj + 1997 8771 85 A9 sta color + 1998 + 1999 + 2000 8773 A0 64 ldy #100 ; ??? + 2001 8775 A9 01 85 E3 mva #1 tracerflag ; I do not know (I mean I think I know ;) ) + 2002 ; 10 years later - I do not know!!! + 2003 ; 20 years later - still do not know :] + 2004 8779 4C B3 83 jmp Flight.RepeatIfSmokeTracer + 2005 .endp + 2006 + 2007 ; ------------------------------------------------- + 2008 877C .proc MIRVdownLoop + 2009 ; MIRV loop - here mirv bullets fall down + 2010 ; ------------------------------------------------- + 2011 ; copy Flight parameters to the table + 2012 877C A2 04 ldx #4 + 2013 877E MIRVcopyParameters + 2014 877E A5 C8 lda xtraj + 2015 8780 9D 66 44 sta xtraj00,x + 2016 8783 A5 C9 lda xtraj+1 + 2017 8785 9D 6B 44 sta xtraj01,x + 2018 8788 A5 CA lda xtraj+2 + 2019 878A 9D 70 44 sta xtraj02,x + 2020 ;lda vx + 2021 ;sta vx00,x + 2022 878D A5 BC lda vx+1 + 2023 878F 9D 75 44 sta vx01,x + 2024 8792 A5 BD lda vx+2 + 2025 8794 9D 7A 44 sta vx02,x + 2026 8797 A5 BE lda vx+3 + 2027 8799 9D 7F 44 sta vx03,x + 2028 879C A9 00 lda #0 + 2029 879E 9D 84 44 sta MirvDown,x + 2030 87A1 CA dex + 2031 87A2 10 DA bpl MIRVcopyParameters + 2032 ; modification (to make bullets "split away" and go different directions) + 2033 ; bullet indexed 0 is in the middle + 2034 + 2035 ; bullet 1 + 2036 87A4 18 clc + 2037 87A5 A5 BC lda vx+1 + 2038 87A7 69 64 adc #100 + 2039 87A9 8D 76 44 sta vx01+1 + 2040 87AC A5 BD lda vx+2 + 2041 87AE 69 00 adc #0 + 2042 87B0 8D 7B 44 sta vx02+1 + 2043 87B3 A5 BE lda vx+3 + 2044 87B5 69 00 adc #0 + 2045 87B7 8D 80 44 sta vx03+1 + 2046 ; bullet 2 + 2047 87BA 38 sec + 2048 87BB A5 BC lda vx+1 + 2049 87BD E9 64 sbc #100 + 2050 87BF 8D 77 44 sta vx01+2 + 2051 87C2 A5 BD lda vx+2 + 2052 87C4 E9 00 sbc #0 + 2053 87C6 8D 7C 44 sta vx02+2 + 2054 87C9 A5 BE lda vx+3 + 2055 87CB E9 00 sbc #0 + 2056 87CD 8D 81 44 sta vx03+2 + 2057 ; bullet 3 + 2058 87D0 18 clc + 2059 87D1 A5 BC lda vx+1 + 2060 87D3 69 C8 adc #200 + 2061 87D5 8D 78 44 sta vx01+3 + 2062 87D8 A5 BD lda vx+2 + 2063 87DA 69 00 adc #0 + 2064 87DC 8D 7D 44 sta vx02+3 + 2065 87DF A5 BE lda vx+3 + 2066 87E1 69 00 adc #0 + 2067 87E3 8D 82 44 sta vx03+3 + 2068 ; bullet 4 + 2069 87E6 38 sec + 2070 87E7 A5 BC lda vx+1 + 2071 87E9 E9 C8 sbc #200 + 2072 87EB 8D 79 44 sta vx01+4 + 2073 87EE A5 BD lda vx+2 + 2074 87F0 E9 00 sbc #0 + 2075 87F2 8D 7E 44 sta vx02+4 + 2076 87F5 A5 BE lda vx+3 + 2077 87F7 E9 00 sbc #0 + 2078 87F9 8D 83 44 sta vx03+4 + 2079 + 2080 ; clearing ranges of soil down registers + 2081 87FC 20 89 8F jsr ClearScreenSoilRange + 2082 + 2083 87FF A2 FF ldx #$FF ; it will turn 0 in a moment anyway + 2084 8801 8E 89 44 stx MirvMissileCounter + 2085 8804 mrLoopi + 2086 8804 AE 89 44 ldx MirvMissileCounter + 2087 8807 E8 inx + 2088 8808 E0 05 cpx #5 + 2089 880A D0 02 bne @+ + 2090 880C A2 00 ldx #0 + 2091 880E 8E 89 44 @ stx MirvMissileCounter + 2092 + 2093 ; Y changes only for bullet number 0 + 2094 ; because rest of the bullets have the same Y (height) + 2095 + 2096 8811 D0 29 bne MIRVdoNotChangeY + 2097 ; Y is the same for all falling bullets + 2098 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 2099 8813 38 sec + 2100 8814 A5 CB lda ytraj + 2101 8816 E5 B8 sbc vy+1 + 2102 8818 85 CB sta ytraj + 2103 881A A5 CC lda ytraj+1 + 2104 881C E5 B9 sbc vy+2 + 2105 881E 85 CC sta ytraj+1 + 2106 8820 A5 CD lda ytraj+2 + 2107 8822 E5 BA sbc vy+3 + 2108 8824 85 CD sta ytraj+2 + 2109 + 2110 ;vy=vy-g (also without least significant byte of vy) + 2111 8826 38 sec + 2112 8827 A5 B8 lda vy+1 + 2113 8829 E5 E0 sbc gravity + 2114 882B 85 B8 sta vy+1 + 2115 882D A5 B9 lda vy+2 + 2116 882F E9 00 sbc #0 + 2117 8831 85 B9 sta vy+2 + 2118 8833 A5 BA lda vy+3 + 2119 8835 E9 00 sbc #0 + 2120 8837 85 BA sta vy+3 + 2121 + 2122 8839 20 A7 5A jsr ShellDelay + 2123 + 2124 883C MIRVdoNotChangeY + 2125 + 2126 883C BD 84 44 lda MirvDown,x ; if bullet is already down we go with the next one + 2127 883F F0 03 4C 93 89 jne MIRVnextBullet + 2128 + 2129 8844 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) + 2130 8845 BD 66 44 lda xtraj00,x ;and here of course Flight to the right + 2131 8848 7D 75 44 adc vx01,x + 2132 884B 9D 66 44 sta xtraj00,x + 2133 884E BD 6B 44 lda xtraj01,x + 2134 8851 7D 7A 44 adc vx02,x + 2135 8854 9D 6B 44 sta xtraj01,x + 2136 8857 BD 70 44 lda xtraj02,x + 2137 885A 7D 7F 44 adc vx03,x + 2138 885D 9D 70 44 sta xtraj02,x + 2139 + 2140 ;vx=vx+Wind + 2141 + 2142 8860 18 clc + 2143 .rept 4 + 2144 LDA VX+# + 2145 ADC WIND+# + 2146 STA VX+# + 2147 .endr +Source: REPT + 2144 8861 A5 BB LDA VX+# + 2144 8863 65 CE ADC WIND+# + 2144 8865 85 BB STA VX+# + 2144 8867 A5 BC LDA VX+# + 2144 8869 65 CF ADC WIND+# + 2144 886B 85 BC STA VX+# + 2144 886D A5 BD LDA VX+# + 2144 886F 65 D0 ADC WIND+# + 2144 8871 85 BD STA VX+# + 2144 8873 A5 BE LDA VX+# + 2144 8875 65 D1 ADC WIND+# + 2144 8877 85 BE STA VX+# +Source: weapons.asm + 2148 + 2149 ; rules for a falling MIRV bulets. + 2150 ; if Y is negative and any X (bullet over the screen) - continue flying + 2151 ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying + 2152 ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision + 2153 ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit + 2154 ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) + 2155 + 2156 ; check bullet position and set flags: + 2157 ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) + 2158 ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) + 2159 8879 A9 00 lda #$00 + 2160 887B 8D 8C 44 sta XposFlag + 2161 887E 8D 8D 44 sta YposFlag + 2162 8881 A5 CD lda ytraj+2 ; Y high byte + 2163 8883 10 07 bpl @+ + 2164 8885 A9 80 8D 8D 44 mva #%10000000 YposFlag ; bullet over the screen (Y) + 2165 888A 30 0B bmi MIRVsetXflag + 2166 @ + 2167 888C A5 CC lda ytraj+1 ; Y low byte + 2168 888E C9 C8 cmp #screenheight + 2169 8890 90 05 bcc MIRVsetXflag ; bullet on screen (Y) + 2170 8892 A9 40 8D 8D 44 mva #%01000000 YposFlag ; bullet under the screen (Y) + 2171 8897 MIRVsetXflag + 2172 8897 BD 70 44 lda xtraj02,x ; X high byte + 2173 889A C9 01 cmp #>screenwidth + 2174 889C D0 05 bne @+ + 2175 889E BD 6B 44 lda xtraj01,x ; X low byte + 2176 88A1 C9 40 cmp #mountaintable + 2236 8918 85 73 sta temp+1 + 2237 + 2238 891A A0 00 ldy #0 + 2239 891C A5 CC lda ytraj+1 + 2240 891E D1 72 cmp (temp),y ; check collision with mountains + 2241 8920 B0 20 bcs mrHit + 2242 + 2243 8922 mrSkipCollisionCheck + 2244 ;mwa xtraj01 xdraw + 2245 8922 BD 6B 44 lda xtraj01,x + 2246 8925 85 61 sta xdraw + 2247 8927 BD 70 44 lda xtraj02,x + 2248 892A 85 62 sta xdraw+1 + 2249 892C A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 2250 + 2251 8934 20 73 75 jsr unPlot.unPlotAfterX + 2252 8937 AE 89 44 ldx MirvMissileCounter + 2253 893A F0 03 4C 04 88 jne mrLoopi + 2254 + 2255 893F 4C 04 88 jmp mrLoopi + 2256 + 2257 8942 mrHit + 2258 ; we have to make unPlot over the screen (to initialise it) + 2259 ; before actual explosion + 2260 8942 A9 00 85 61 85 62 mwa #0 xdraw + 2261 8948 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2262 8950 20 73 75 jsr unPlot.unPlotAfterX + 2263 8953 AE 89 44 ldx MirvMissileCounter + 2264 8956 A0 00 ldy #0 + 2265 ; concurrent moving xtraj+1 -> xdraw and calculating temp + 2266 8958 18 clc + 2267 8959 BD 6B 44 lda xtraj01,x + 2268 895C 85 61 sta xdraw + 2269 895E 69 3E adc #mountaintable + 2274 8969 85 73 sta temp+1 + 2275 896B B1 72 lda (temp),y + 2276 896D 38 sec + 2277 896E E9 01 sbc #1 + 2278 8970 85 63 sta ydraw + 2279 8972 84 64 sty ydraw+1 ;we know that y=0 + 2280 8974 20 AD 77 jsr missile ; explode .... + 2281 + 2282 8977 mrEndOfFlight + 2283 8977 AE 89 44 ldx MirvMissileCounter + 2284 897A A9 00 85 61 85 62 mwa #0 xdraw + 2285 8980 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2286 8988 20 73 75 jsr unPlot.unPlotAfterX + 2287 898B AE 89 44 ldx MirvMissileCounter + 2288 898E A9 01 lda #1 + 2289 8990 9D 84 44 sta MirvDown,x + 2290 8993 MIRVnextBullet + 2291 ; checking if all bullets already fallen down + 2292 8993 A2 04 ldx #4 + 2293 8995 MIRVcheckIfEnd + 2294 8995 BD 84 44 lda MirvDown,x + 2295 8998 F0 05 beq MIRVstillNotAll + 2296 899A CA dex + 2297 899B 10 F8 bpl MIRVcheckIfEnd + 2298 899D 30 03 bmi MIRValreadyAll + 2299 899F MIRVstillNotAll + 2300 899F 4C 04 88 jmp mrLoopi + 2301 89A2 MIRValreadyAll + 2302 89A2 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store them (for a while) + 2303 89AA A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw + 2304 89B2 A9 00 85 61 85 62 mwa #0 xdraw + 2305 89B8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2306 89C0 AE 89 44 ldx MirvMissileCounter + 2307 89C3 20 73 75 jsr unPlot.unPlotAfterX + 2308 89C6 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 2309 89CE A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 2310 + 2311 ; we must do it manually because of the VOID pointer + 2312 + 2313 ;first clean the offensive text... + 2314 89D6 A4 6C ldy TankNr + 2315 89D8 A9 00 85 DB mva #$00 plot4x4color + 2316 89DC 20 88 72 jsr DisplayOffensiveTextNr + 2317 + 2318 ; temporary removing tanks from the screen (otherwise they will fall down with soil) + 2319 89DF 20 F4 6E jsr SoilDown2 + 2320 89E2 A9 FF 85 BF mva #$ff HitFlag ; but why ?? + 2321 89E6 60 rts + 2322 .endp + 2323 ; ------------------------------------------------- + 2324 89E7 .proc MakeWalls + 2325 ; ------------------------------------------------- + 2326 89E7 2C 0C 44 bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + 2327 89EA 10 54 bpl WrapAndNone + 2328 89EC 50 21 bvc MakeBump + 2329 ; top bounce + 2330 89EE 24 CD bit ytraj+2 + 2331 89F0 10 1D bpl NoOnTop + 2332 89F2 24 BA bit vy+3 + 2333 89F4 30 19 bmi FlyingDown + 2334 89F6 38 sec + 2335 .rept 4 + 2336 LDA #$00 + 2337 SBC VY+# + 2338 STA VY+# + 2339 .endr +Source: REPT + 2336 89F7 A9 00 LDA #$00 + 2336 89F9 E5 B7 SBC VY+# + 2336 89FB 85 B7 STA VY+# + 2336 89FD A9 00 LDA #$00 + 2336 89FF E5 B8 SBC VY+# + 2336 8A01 85 B8 STA VY+# + 2336 8A03 A9 00 LDA #$00 + 2336 8A05 E5 B9 SBC VY+# + 2336 8A07 85 B9 STA VY+# + 2336 8A09 A9 00 LDA #$00 + 2336 8A0B E5 BA SBC VY+# + 2336 8A0D 85 BA STA VY+# +Source: weapons.asm + 2340 8A0F FlyingDown + 2341 8A0F NoOnTop + 2342 8A0F MakeBump + 2343 8A0F A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth + 2344 8A19 90 54 bcc OnScreen + 2345 ; inverse vx (bouncing wall) + 2346 8A1B 38 sec + 2347 .rept 4 + 2348 LDA #$00 + 2349 SBC VX+# + 2350 STA VX+# + 2351 .endr +Source: REPT + 2348 8A1C A9 00 LDA #$00 + 2348 8A1E E5 BB SBC VX+# + 2348 8A20 85 BB STA VX+# + 2348 8A22 A9 00 LDA #$00 + 2348 8A24 E5 BC SBC VX+# + 2348 8A26 85 BC STA VX+# + 2348 8A28 A9 00 LDA #$00 + 2348 8A2A E5 BD SBC VX+# + 2348 8A2C 85 BD STA VX+# + 2348 8A2E A9 00 LDA #$00 + 2348 8A30 E5 BE SBC VX+# + 2348 8A32 85 BE STA VX+# +Source: weapons.asm + 2352 ; and bouce feapfrog :) + 2353 8A34 38 sec + 2354 8A35 A9 B4 lda #180 + 2355 8A37 ED 15 45 sbc LeapFrogAngle + 2356 8A3A 8D 15 45 sta LeapFrogAngle ; swap angle (LeapFrogAngle) + 2357 8A3D E6 A2 inc FunkyWallFlag + 2358 8A3F 60 rts + 2359 8A40 WrapAndNone + 2360 8A40 50 2D bvc NoWall + 2361 8A42 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth + 2362 8A4C 90 21 bcc OnScreen + 2363 ; (wrapping wall) + 2364 8A4E E6 A2 inc FunkyWallFlag + 2365 8A50 24 CA bit xtraj+2 + 2366 8A52 30 0E bmi LeftWrap + 2367 8A54 RightWrap + 2368 8A54 38 A5 C9 E9 40 85 + sbw xtraj+1 #screenwidth + 2369 8A61 60 rts + 2370 8A62 LeftWrap + 2371 8A62 18 A5 C9 69 40 85 + adw xtraj+1 #screenwidth + 2372 8A6F OnScreen + 2373 8A6F NoWall + 2374 8A6F 60 rts + 2375 .endp + 2376 ; ------------------------------------------------- + 2377 8A70 .proc WhiteFlag + 2378 ; ------------------------------------------------- + 2379 ; This routine is run from inside of the main loop + 2380 ; and replaces Shoot and Flight routines + 2381 ; X and TankNr - index of shooting tank + 2382 ; ------------------------------------------------- + 2383 8A70 A9 06 85 9E mva #sfx_death_begin sfx_effect + 2384 8A74 20 57 6B jsr FlashTank ; first we flash tank + 2385 8A77 A9 01 85 AA mva #1 Erase + 2386 8A7B 20 2C 6A jsr DrawTankNr ; and erase tank + 2387 8A7E A9 00 lda #0 + 2388 8A80 85 AA sta Erase + 2389 8A82 A6 6C ldx TankNr + 2390 8A84 9D A2 43 sta Energy,x ; clear tank energy + 2391 8A87 9D AF 43 sta eXistenZ,x ; erase from existence + 2392 8A8A 9D B5 43 sta LASTeXistenZ,x ; to prevent explosion + 2393 8A8D 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate White Flag + 2394 8A90 20 46 75 jsr PMoutofScreen + 2395 8A93 20 12 6A jsr drawtanks ; for restore PM + 2396 8A96 A9 15 85 9E mva #sfx_silencer sfx_effect + 2397 8A9A 60 rts + 2398 .endp + 2399 + 2400 ; ------------------------------------------------- + 2401 8A9B .proc AtomicWinter + 2402 ; ------------------------------------------------- + 2403 ; This routine is run from inside of the main loop + 2404 ; and replaces Shoot and Flight routines + 2405 ; X and TankNr - index of shooting tank + 2406 ; ------------------------------------------------- + 2407 8A9B A9 12 85 9E mva #sfx_sandhog sfx_effect + 2408 .IF FASTER_GRAF_PROCS = 1 + 2409 ldy #0 ; byte counter (from 0 to 39) + 2410 NextColumn + 2411 ; big loop - we repat internal loops for each column of bytes + 2412 sty magic + 2413 ldx #120 ; line counter (from 0 to 60 ) + 2414 ; first loop - inverse column of bytes for a while + 2415 ldy magic + 2416 NextLine1 + 2417 jsr InverseScreenByte + 2418 dex + 2419 dex + 2420 bpl NextLine1 + 2421 ; + 2422 jsr WaitOneFrame ; wait uses A only + 2423 ; second loop - inverse again and put random "snow" to column of bytes + 2424 ldx #120 + 2425 ldy magic + 2426 mva #$55 magic+1 + 2427 NextLine2 + 2428 jsr InverseScreenByte + 2429 lda random + 2430 ora magic+1 + 2431 and (temp),y + 2432 sta (temp),y + 2433 lda magic+1 + 2434 eor #$ff + 2435 sta magic+1 + 2436 dex + 2437 dex + 2438 bpl NextLine2 + 2439 ; and go to next column + 2440 iny + 2441 cpy #40 + 2442 bne NextColumn + 2443 .ELSE + 2444 8A9F A9 01 85 A9 mva #1 color + 2445 8AA3 A9 78 85 63 A9 00 + mwa #120 ydraw + 2446 8AAB NextLineSlow + 2447 8AAB A9 00 lda #0 + 2448 8AAD 85 61 sta xdraw + 2449 8AAF 85 62 sta xdraw+1 + 2450 8AB1 NextPixelSlow + 2451 8AB1 2C 1B D4 bit random + 2452 8AB4 10 05 bpl NoPlot + 2453 8AB6 50 03 bvc NoPlot + 2454 8AB8 20 2C 76 jsr plot.MakePlot + 2455 8ABB NoPlot + 2456 8ABB E6 61 D0 02 E6 62 inw xdraw + 2457 8AC1 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 2458 8ACB D0 E4 bne NextPixelSlow + 2459 8ACD C6 63 dec ydraw + 2460 8ACF C6 63 dec ydraw + 2461 8AD1 10 D8 bpl NextLineSlow + 2462 .ENDIF + 2463 ; and we have "snow" :) + 2464 8AD3 A9 00 lda #0 + 2465 8AD5 A6 6C ldx TankNr + 2466 8AD7 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + 2467 8ADA 20 7A 8F jsr SetFullScreenSoilRange + 2468 8ADD 20 F7 6E jsr SoilDown2.NoClearTanks + 2469 8AE0 60 rts + 2470 + 2471 ; in order to optimize the fragment repeated in both internal loops + 2472 ; we save 15 bytes :) + 2473 8AE1 InverseScreenByte + 2474 8AE1 BD 68 41 lda LineTableL,x + 2475 8AE4 85 72 sta temp + 2476 8AE6 BD 31 42 lda LineTableH,x + 2477 8AE9 85 73 sta temp+1 + 2478 8AEB B1 72 lda (temp),y + 2479 8AED 49 FF eor #$ff + 2480 8AEF 91 72 sta (temp),y + 2481 8AF1 60 rts + 2482 .endp + 2483 ; ------------------------------------------------- + 2484 8AF2 .proc AutoDefense + 2485 ; ------------------------------------------------- + 2486 ; This routine is run from inside of the main loop + 2487 ; X - index of tank + 2488 ; ------------------------------------------------- + 2489 8AF2 20 EB 8F jsr PrepareAIShoot.WepTableToTemp + 2490 8AF5 20 45 91 jsr UseBattery + 2491 8AF8 20 98 91 jsr TosserDefensives + 2492 8AFB 60 rts + 2493 .endp + 2494 ; ------------------------------------------------- + 2495 8AFC .proc SpyHard + 2496 ; ------------------------------------------------- + 2497 8AFC A6 6C 8E 31 44 mvx TankNr TargetTankNr ; save + 2498 8B01 RepeatSpy + 2499 8B01 A2 00 86 6C mvx #0 TankNr + 2500 8B05 86 5F stx SpyHardFlag ; 0 - optimization + 2501 8B07 CheckNextTankSH + 2502 8B07 EC 31 44 cpx TargetTankNr + 2503 8B0A F0 22 beq ThisTankItsMe + 2504 8B0C BD A2 43 lda Energy,x ; only active players + 2505 8B0F F0 1D beq ThisTankIsDead + 2506 ; run SpyHard for tank in X + 2507 8B11 20 41 8B jsr DisplaySpyInfo + 2508 8B14 20 57 6B jsr FlashTank + 2509 8B17 20 5F 5A @ jsr GetKey + 2510 8B1A 24 D7 bit escFlag + 2511 8B1C 30 1A bmi SpyHardEnd + 2512 8B1E C9 21 cmp #@kbcode._space ; $21 ; Space + 2513 8B20 F0 16 beq SpyHardEnd + 2514 8B22 C9 0C cmp #@kbcode._ret ; Return key (5200 - fire) + 2515 8B24 F0 12 beq SpyHardEnd + 2516 8B26 C9 06 cmp #@kbcode._left ; $6 + 2517 8B28 F0 04 beq SelectNextTank + 2518 8B2A C9 07 cmp #@kbcode._right ; $07 ; cursor right + 2519 8B2C D0 E9 bne @- + 2520 8B2E ThisTankIsDead + 2521 8B2E ThisTankItsMe + 2522 8B2E SelectNextTank + 2523 8B2E E6 6C inc TankNr + 2524 8B30 A6 6C ldx TankNr + 2525 8B32 E4 AE cpx NumberOfPlayers + 2526 8B34 D0 D1 bne CheckNextTankSH + 2527 8B36 F0 C9 beq RepeatSpy + 2528 8B38 SpyHardEnd + 2529 8B38 AE 31 44 86 6C mvx TargetTankNr TankNr ; restore + 2530 8B3D 20 41 8B jsr DisplaySpyInfo + 2531 8B40 60 rts + 2532 .endp + 2533 8B41 .proc DisplaySpyInfo + 2534 8B41 BD 7F 5B lda TankStatusColoursTable,x + 2535 8B44 85 02 sta COLOR2 ; set color of status line + 2536 8B46 20 0F 66 jsr PutTankNameOnScreen + 2537 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 2538 8B49 60 rts + 2539 .endp + 2540 ; ------------------------------------------------- + 2541 8B4A .proc LazyBoys + 2542 ; ------------------------------------------------- + 2543 8B4A A9 2C 85 9E mva #sfx_lazy_boys sfx_effect + 2544 8B4E 20 CF 8F jsr PrepareAIShoot + 2545 8B51 A6 6C ldx TankNr + 2546 8B53 24 5E bit LazyFlag + 2547 8B55 30 0A bmi GoDarwin + 2548 8B57 20 C0 92 jsr FindBestTarget2 ; find nearest tank neighbour + 2549 8B5A 20 70 8B jsr LazyAim + 2550 8B5D A9 00 lda #%00000000 ; set "visual aiming" off + 2551 8B5F F0 08 beq EndLazy + 2552 8B61 GoDarwin + 2553 8B61 20 81 92 jsr FindBestTarget3 ; find target with lowest energy + 2554 8B64 20 70 8B jsr LazyAim + 2555 8B67 A9 80 lda #%10000000 + 2556 8B69 EndLazy + 2557 8B69 85 97 sta TestFlightFlag ; set "visual aiming" on + 2558 8B6B A9 00 85 5E mva #0 LazyFlag + 2559 8B6F 60 rts + 2560 .endp + 2561 8B70 .proc LazyAim + 2562 ; aiming proc for Lazy ... weapons + 2563 ; as proc for memory optimisation + 2564 ; Y - target tan nr + 2565 ; A - target direction + 2566 8B70 8C 31 44 sty TargetTankNr + 2567 ; aiming + 2568 8B73 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 2569 8B76 A5 A4 lda Force + 2570 8B78 9D D9 43 sta ForceTableL,x + 2571 8B7B A5 A5 lda Force+1 + 2572 8B7D 9D DF 43 sta ForceTableH,x + 2573 8B80 20 A1 59 jsr MoveBarrelToNewPosition + 2574 8B83 60 rts + 2575 .endp + 2576 ; ------------------------------------------------- + 2577 8B84 .proc TankFlying + 2578 ; ------------------------------------------------- + 2579 ; This routine is run from inside of the main loop + 2580 ; and replaces Shoot and Flight routines + 2581 ; X and TankNr - index of flying tank + 2582 ; ------------------------------------------------- + 2583 ; Let's designate the flight altitude. + 2584 8B84 20 BF 70 jsr CheckMaxMountain + 2585 8B87 C9 1E cmp #(12+18) ; tank with shield (12) and max alt (18) check + 2586 8B89 90 04 bcc IsToHigh + 2587 8B8B E9 0C sbc #12 ; tank with shield high correction + 2588 8B8D D0 02 bne StoreMaxAlt + 2589 8B8F IsToHigh + 2590 8B8F A9 12 lda #18 + 2591 8B91 StoreMaxAlt + 2592 8B91 85 A2 sta FloatingAlt + 2593 ; mva #18 FloatingAlt ; for testing + 2594 8B93 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect + 2595 + 2596 ; display text 4x4 - fuel full + 2597 + 2598 8B97 A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 + 2599 8B9F A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering + 2600 8BA7 A9 1D 85 83 mva #hoverFullEnd-hoverFull-1 fx ; length + 2601 8BAB 38 sec + 2602 8BAC A5 A2 lda FloatingAlt + 2603 8BAE E9 0C sbc #12 + 2604 8BB0 85 D8 sta LineYdraw + 2605 8BB2 20 72 73 jsr TypeLine4x4.variableLength + 2606 + 2607 8BB5 A6 6C ldx TankNr + 2608 + 2609 ; TankNr in X reg. + 2610 ; now animate Up + 2611 8BB7 A9 00 85 76 mva #0 modify ; it's a counter + 2612 8BBB TankGoUp + 2613 8BBB BD 19 44 lda ytankstable,x + 2614 8BBE C5 A2 cmp FloatingAlt ; Floating altitude + 2615 8BC0 90 33 bcc ReachSky + 2616 ; first erase old tank position + 2617 8BC2 A9 01 85 AA mva #1 Erase + 2618 8BC6 20 2C 6A jsr DrawTankNr + 2619 8BC9 A5 76 lda modify + 2620 8BCB C9 05 cmp #5 + 2621 8BCD 90 07 bcc NoEngineClear + 2622 8BCF A9 00 85 A9 mva #0 color + 2623 8BD3 20 7E 6C jsr DrawTankRocketEngine + 2624 8BD6 NoEngineClear + 2625 8BD6 A9 00 85 AA mva #0 Erase + 2626 8BDA DE 19 44 dec ytankstable,x + 2627 8BDD E6 76 inc modify + 2628 ; then draw tank on new position + 2629 8BDF 20 2C 6A jsr DrawTankNr + 2630 8BE2 A5 76 lda modify + 2631 8BE4 C9 05 cmp #5 + 2632 8BE6 90 0A bcc NoEngine + 2633 8BE8 AD 1B D4 lda random + 2634 8BEB 29 01 and #%00000001 + 2635 8BED 85 A9 sta color + 2636 8BEF 20 7E 6C jsr DrawTankRocketEngine + 2637 8BF2 NoEngine + 2638 ; jsr WaitOneFrame + 2639 8BF2 4C BB 8B jmp TankGoUp + 2640 + 2641 8BF5 ReachSky + 2642 ; engine symbol erase + 2643 8BF5 A9 00 85 A9 mva #0 color + 2644 8BF9 20 7E 6C jsr DrawTankRocketEngine + 2645 + 2646 ; display text 4x4 - fuel full (clear text) + 2647 8BFC A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 + 2648 8C04 A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering + 2649 8C0C A9 1D 85 83 mva #(hoverFullEnd-hoverFull-1) fx ; length + 2650 8C10 38 sec + 2651 8C11 A5 A2 lda FloatingAlt + 2652 8C13 E9 0C sbc #12 + 2653 8C15 85 D8 sta LineYdraw + 2654 8C17 A9 00 lda #$00 + 2655 8C19 20 74 73 jsr TypeLine4x4.staplot4x4color + 2656 ; and Soildown at the start (for correct mountaintable if tank was buried) + 2657 ; calculate range + 2658 8C1C A6 6C ldx TankNr + 2659 8C1E 38 sec + 2660 8C1F BD 0D 44 lda XtankstableL,x + 2661 8C22 E9 02 sbc #2 + 2662 8C24 85 D2 sta RangeLeft + 2663 8C26 BD 13 44 lda XtankstableH,x + 2664 8C29 E9 00 sbc #0 + 2665 8C2B 85 D3 sta RangeLeft+1 + 2666 8C2D 18 clc + 2667 8C2E BD 0D 44 lda XtankstableL,x + 2668 8C31 69 0A adc #10 + 2669 8C33 85 D4 sta RangeRight + 2670 8C35 BD 13 44 lda XtankstableH,x + 2671 8C38 69 00 adc #0 + 2672 8C3A 85 D5 sta RangeRight+1 + 2673 ; hide tanks and ... + 2674 8C3C 20 F4 6E jsr SoilDown2 + 2675 8C3F 20 89 8F jsr ClearScreenSoilRange + 2676 8C42 A6 6C ldx TankNr + 2677 + 2678 ; check keyboard/joy and move tank left/right - code copied from BeforeFire + 2679 ;keyboard reading + 2680 ; KBCODE keeps code of last keybi + 2681 ; SKSTAT $ff - nothing pressed + 2682 ; $FB - any key + 2683 ; $f7 - shift + 2684 ; $f3 - shift+key + 2685 8C44 KeyboardAndJoyCheck + 2686 8C44 A9 1F 85 9E mva #sfx_tank_move sfx_effect + 2687 8C48 BD A8 43 lda ShieldEnergy,x + 2688 8C4B C9 14 cmp #20 + 2689 8C4D D0 20 bne LotOfFuel + 2690 + 2691 ; display text 4x4 - low fuel + 2692 8C4F A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 + 2693 8C57 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering + 2694 8C5F A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length + 2695 8C63 38 sec + 2696 8C64 A5 A2 lda FloatingAlt + 2697 8C66 E9 0C sbc #12 + 2698 8C68 85 D8 sta LineYdraw + 2699 8C6A 20 72 73 jsr TypeLine4x4.variableLength + 2700 8C6D A6 6C ldx TankNr + 2701 + 2702 8C6F LotOfFuel + 2703 8C6F notpressed + 2704 ; let's animate "engine" + 2705 8C6F 20 E5 6C jsr DrawTankEngine + 2706 ; enimation ends + 2707 + 2708 8C72 A5 02 lda SKSTAT + 2709 8C74 C9 FF cmp #$ff + 2710 8C76 F0 26 jeq checkJoy + 2711 8C78 C9 F7 cmp #$f7 ; SHIFT + 2712 8C7A F0 22 jeq checkJoy + 2713 + 2714 8C7C A5 02 lda kbcode + 2715 8C7E 29 3F and #%00111111 ; CTRL and SHIFT elimination + 2716 + 2717 8C80 C9 1C cmp #@kbcode._esc ; 28 ; ESC + 2718 8C82 D0 08 bne @+ + 2719 8C84 20 AE 73 jsr AreYouSure + 2720 8C87 24 D7 bit escFlag + 2721 8C89 10 E4 bpl notpressed + 2722 ;---esc pressed-quit game--- + 2723 8C8B 60 rts + 2724 @ + 2725 8C8C jumpFromStick + 2726 8C8C C9 06 cmp #@kbcode._left ; $6 + 2727 8C8E F0 60 jeq pressedLeft + 2728 8C90 C9 07 cmp #@kbcode._right ; $7 + 2729 8C92 F0 23 jeq pressedRight + 2730 8C94 C9 21 cmp #@kbcode._space ; $21 + 2731 8C96 D0 03 4C 3B 8D jeq pressedSpace + 2732 8C9B 4C 6F 8C jmp notpressed + 2733 8C9E checkJoy + 2734 ;------------JOY------------- + 2735 ;happy happy joy joy + 2736 ;check for joystick now + 2737 8C9E A5 02 lda STICK0 + 2738 8CA0 29 0F and #$0f + 2739 8CA2 C9 0F cmp #$0f + 2740 8CA4 F0 07 beq notpressedJoy + 2741 8CA6 A8 tay + 2742 8CA7 B9 5A 60 lda joyToKeyTable,y + 2743 8CAA 4C 8C 8C jmp jumpFromStick + 2744 8CAD notpressedJoy + 2745 ;fire + 2746 8CAD A5 02 lda STRIG0 + 2747 8CAF D0 03 4C 3B 8D jeq pressedSpace + 2748 8CB4 4C 6F 8C jmp notpressed + 2749 + 2750 + 2751 8CB7 pressedRight + 2752 8CB7 BD A8 43 lda ShieldEnergy,x + 2753 8CBA F0 7F jeq pressedSpace + 2754 8CBC A0 01 ldy #1 + 2755 8CBE 20 B0 57 jsr DecreaseShieldEnergyX + 2756 ; first erase old tank position + 2757 8CC1 A9 01 85 AA mva #1 Erase + 2758 8CC5 20 2C 6A jsr DrawTankNr + 2759 8CC8 A9 00 85 AA mva #0 Erase + 2760 8CCC BD 13 44 lda XtankstableH,x + 2761 8CCF C9 01 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 + 2762 8CD1 D0 05 bne @+ + 2763 8CD3 BD 0D 44 lda XtankstableL,x + 2764 8CD6 C9 34 cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels + 2765 8CD8 B0 0B @ bcs RightScreenEdge + 2766 8CDA FE 0D 44 inc XtankstableL,x + 2767 8CDD D0 03 FE 13 44 sne:inc XtankstableH,x + 2768 8CE2 4C E9 8C jmp NoREdge + 2769 8CE5 RightScreenEdge + 2770 8CE5 A9 03 85 9E mva #sfx_dunno sfx_effect + 2771 8CE9 NoREdge + 2772 8CE9 A9 12 9D C3 48 mva #18 AngleTable,x + 2773 8CEE D0 3C bne DrawFloatingTank ; then draw tank on new position + 2774 + 2775 8CF0 pressedLeft + 2776 8CF0 BD A8 43 lda ShieldEnergy,x + 2777 8CF3 F0 46 beq pressedSpace + 2778 8CF5 A0 01 ldy #1 + 2779 8CF7 20 B0 57 jsr DecreaseShieldEnergyX + 2780 ; first erase old tank position + 2781 8CFA A9 01 85 AA mva #1 Erase + 2782 8CFE 20 2C 6A jsr DrawTankNr + 2783 8D01 A9 00 85 AA mva #0 Erase + 2784 8D05 BD 13 44 lda XtankstableH,x + 2785 8D08 C9 00 cmp #0 + 2786 8D0A D0 05 bne @+ + 2787 8D0C BD 0D 44 lda XtankstableL,x + 2788 8D0F C9 05 cmp #5 ; 4 pixles from left edge + 2789 8D11 90 10 @ bcc LeftScreenEdge + 2790 8D13 DE 0D 44 dec XtankstableL,x + 2791 8D16 BD 0D 44 lda XtankstableL,x + 2792 8D19 C9 FF cmp #$ff + 2793 8D1B D0 03 DE 13 44 sne:dec XtankstableH,x + 2794 8D20 4C 27 8D jmp NoLEdge + 2795 8D23 LeftScreenEdge + 2796 8D23 A9 03 85 9E mva #sfx_dunno sfx_effect + 2797 8D27 NoLEdge + 2798 8D27 A9 A2 9D C3 48 mva #162 AngleTable,x + 2799 ; then draw tank on new position + 2800 8D2C DrawFloatingTank + 2801 8D2C 20 2C 6A jsr DrawTankNr + 2802 8D2F 20 0F 66 jsr DisplayStatus + 2803 8D32 20 89 5A jsr WaitOneFrame + 2804 8D35 20 6B 8E jsr CalculateSoildown + 2805 8D38 4C 44 8C jmp KeyboardAndJoyCheck + 2806 + 2807 8D3B pressedSpace + 2808 ; display text 4x4 - low fuel (clear text) + 2809 8D3B A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 + 2810 8D43 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering + 2811 8D4B A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length + 2812 8D4F 38 sec + 2813 8D50 A5 A2 lda FloatingAlt + 2814 8D52 E9 0C sbc #12 + 2815 8D54 85 D8 sta LineYdraw + 2816 8D56 A9 00 lda #$00 + 2817 8D58 20 74 73 jsr TypeLine4x4.staplot4x4color + 2818 8D5B A6 6C ldx TankNr + 2819 ;================================= + 2820 ; left or right from center of screen ? + 2821 8D5D A0 00 ldy #0 + 2822 8D5F BD 13 44 lda XtankstableH,x + 2823 8D62 C9 00 cmp #>((screenwidth/2)-TankWidth) + 2824 8D64 D0 05 bne @+ + 2825 8D66 BD 0D 44 lda XtankstableL,x + 2826 8D69 C9 98 cmp #<((screenwidth/2)-TankWidth) + 2827 8D6B 90 01 @ bcc TankOnLeftSide + 2828 8D6D TankOnRightSide + 2829 8D6D 88 dey + 2830 8D6E TankOnLeftSide + 2831 8D6E 84 A3 sty OverTankDir ; (0 go right, $ff go left) + 2832 ; now we have direction of bypassing tanks on screen + 2833 + 2834 ; clear "engine pixels" under tank + 2835 8D70 A9 01 85 AA mva #1 erase + 2836 8D74 20 E5 6C jsr DrawTankEngine + 2837 + 2838 8D77 CheckForTanksBelow + 2839 8D77 BD 0D 44 lda XtankstableL,x + 2840 8D7A 85 61 sta xdraw + 2841 8D7C BD 13 44 lda XtankstableH,x + 2842 8D7F 85 62 sta xdraw+1 + 2843 8D81 A6 AE ldx NumberOfPlayers + 2844 8D83 CA dex + 2845 8D84 CheckCollisionWithTankLoop + 2846 8D84 E4 6C cpx TankNr + 2847 8D86 F0 63 beq ItIsMe + 2848 8D88 BD AF 43 lda eXistenZ,x + 2849 8D8B F0 5E beq DeadTank + 2850 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + 2851 ; it is tricky but fast and much shorter + 2852 8D8D BD 0D 44 lda xtankstableL,x + 2853 8D90 38 sec + 2854 8D91 E9 09 sbc #9 ; 2 pixels more on left side + tank width + 2855 8D93 A8 tay + 2856 8D94 BD 13 44 lda xtankstableH,x + 2857 8D97 E9 00 sbc #0 + 2858 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + 2859 8D99 C5 62 cmp xdraw+1 + 2860 8D9B D0 02 bne @+ + 2861 8D9D C4 61 cpy xdraw + 2862 @ + 2863 8D9F B0 4A bcs LeftFromTheTank + 2864 8DA1 98 tya ;add 20 (tank size*2 +2 and +2) + 2865 8DA2 18 clc + 2866 8DA3 69 14 adc #20 + 2867 8DA5 A8 tay + 2868 8DA6 BD 13 44 lda xtankstableH,x + 2869 8DA9 69 00 adc #0 + 2870 8DAB C5 62 cmp xdraw+1 + 2871 8DAD D0 02 bne @+ + 2872 8DAF C4 61 cpy xdraw + 2873 @ + 2874 8DB1 90 38 bcc RightFromTheTank + 2875 8DB3 TankBelow + 2876 ; tank below - we must move our tank + 2877 8DB3 A6 6C ldx TankNr + 2878 ; first erase old tank position + 2879 8DB5 A9 01 85 AA mva #1 Erase + 2880 8DB9 20 2C 6A jsr DrawTankNr + 2881 8DBC A9 00 85 AA mva #0 Erase + 2882 8DC0 24 A3 bit OverTankDir + 2883 8DC2 30 0F bmi PassLeft + 2884 8DC4 PassRight + 2885 8DC4 FE 0D 44 inc XtankstableL,x + 2886 8DC7 D0 03 FE 13 44 sne:inc XtankstableH,x + 2887 8DCC A9 12 9D C3 48 mva #18 AngleTable,x + 2888 8DD1 D0 12 bne Bypassing + 2889 8DD3 PassLeft + 2890 8DD3 DE 0D 44 dec XtankstableL,x + 2891 8DD6 BD 0D 44 lda XtankstableL,x + 2892 8DD9 C9 FF cmp #$ff + 2893 8DDB D0 03 DE 13 44 sne:dec XtankstableH,x + 2894 8DE0 A9 A2 9D C3 48 mva #162 AngleTable,x + 2895 8DE5 Bypassing + 2896 ; then draw tank on new position + 2897 8DE5 20 2C 6A jsr DrawTankNr + 2898 8DE8 4C 77 8D jmp CheckForTanksBelow + 2899 8DEB RightFromTheTank + 2900 8DEB LeftFromTheTank + 2901 8DEB DeadTank + 2902 8DEB ItIsMe + 2903 8DEB CA dex + 2904 8DEC 10 96 bpl CheckCollisionWithTankLoop + 2905 8DEE A6 6C ldx TankNr + 2906 8DF0 A9 0E 85 9E mva #sfx_shield_off sfx_effect + 2907 8DF4 A9 01 85 AA mva #1 Erase + 2908 8DF8 20 2C 6A jsr DrawTankNr + 2909 8DFB A9 00 85 AA mva #0 Erase + 2910 ; x correction for P/M + 2911 ; -- + 2912 .IF XCORRECTION_FOR_PM = 1 + 2913 lda XtankstableL,x + 2914 and #%11111110 ; correction for PM + 2915 sta XtankstableL,x + 2916 .ENDIF + 2917 ; -- + 2918 8DFF GoDown + 2919 + 2920 8DFF A9 3E 85 72 A9 46 + mwa #mountaintable temp + 2921 8E07 18 clc + 2922 8E08 A5 72 lda temp + 2923 8E0A 7D 0D 44 adc XtankstableL,x + 2924 8E0D 85 72 sta temp + 2925 8E0F A5 73 lda temp+1 + 2926 8E11 7D 13 44 adc XtankstableH,x + 2927 8E14 85 73 sta temp+1 + 2928 8E16 18 A5 72 69 04 85 + adw temp #4 ; center of the tank + 2929 8E21 A0 00 ldy #0 + 2930 8E23 B1 72 lda (temp),y + 2931 8E25 85 A3 sta OverTankDir ; not elegant!!! Reuse as height of tank flight + 2932 8E27 FloatDown + 2933 8E27 BD 19 44 lda ytankstable,x + 2934 8E2A C5 A3 cmp OverTankDir + 2935 8E2C B0 1D bcs OnGround + 2936 ; first erase old tank position + 2937 8E2E A9 01 85 AA mva #1 Erase + 2938 8E32 20 2C 6A jsr DrawTankNr + 2939 8E35 20 66 6C jsr DrawTankParachute + 2940 8E38 A9 00 85 AA mva #0 Erase + 2941 8E3C FE 19 44 inc ytankstable,x + 2942 ; then draw tank on new position + 2943 8E3F 20 2C 6A jsr DrawTankNr + 2944 8E42 20 66 6C jsr DrawTankParachute + 2945 8E45 20 89 5A jsr WaitOneFrame + 2946 8E48 4C 27 8E jmp FloatDown + 2947 8E4B OnGround + 2948 ; clear parachute + 2949 8E4B A9 01 85 AA mva #1 Erase + 2950 8E4F 20 66 6C jsr DrawTankParachute + 2951 8E52 A9 00 85 AA mva #0 Erase + 2952 8E56 20 71 5A jsr WaitForKeyRelease + 2953 ; and Soildown at the end (for correct mountaintable) + 2954 ; If tank did not fly at maximum altitude there is no need to soildown to much + 2955 8E59 A5 A2 lda FloatingAlt + 2956 8E5B C9 12 cmp #18 + 2957 8E5D F0 03 beq NotHighest + 2958 8E5F 20 89 8F jsr ClearScreenSoilRange + 2959 8E62 NotHighest + 2960 ; calculate range + 2961 8E62 20 6B 8E jsr CalculateSoildown + 2962 ; hide tanks and ... + 2963 8E65 20 F4 6E jsr SoilDown2 + 2964 8E68 A6 6C ldx TankNr + 2965 8E6A 60 rts + 2966 + 2967 8E6B CalculateSoildown + 2968 8E6B A6 6C ldx TankNr + 2969 8E6D 18 clc + 2970 8E6E BD 0D 44 lda XtankstableL,x + 2971 8E71 69 04 adc #4 + 2972 8E73 85 61 sta xdraw + 2973 8E75 BD 13 44 lda XtankstableH,x + 2974 8E78 69 00 adc #0 + 2975 8E7A 85 62 sta xdraw+1 + 2976 8E7C A9 04 85 B0 mva #$04 ExplosionRadius + 2977 8E80 20 0C 8F jsr CalculateExplosionRange + 2978 8E83 60 rts + 2979 .endp + 2980 + 2981 ; ------------------------------------------------- + 2982 8E84 .proc CheckCollisionWithTank + 2983 ; ------------------------------------------------- + 2984 ; Check collision with Tank :) + 2985 ; xdraw , ydraw - coordinates of the checked point + 2986 ; results: + 2987 ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1) + 2988 ; XHit , YHit - coordinates of hit + 2989 ; X - index of the hit tank + 2990 + 2991 8E84 A6 AE ldx NumberOfPlayers + 2992 8E86 CA dex + 2993 8E87 CheckCollisionWithTankLoop + 2994 8E87 BD AF 43 lda eXistenZ,x + 2995 8E8A F0 51 beq DeadTank + 2996 ; first we test top and bottom (same with and without shield!) + 2997 8E8C BD 19 44 lda ytankstable,x + 2998 8E8F C5 63 cmp ydraw ; check range + 2999 8E91 90 4A bcc BelowTheTank ;(ytankstable,ytankstable+3) + 3000 8E93 E9 03 sbc #3 ; hitbox height + 3001 8E95 C5 63 cmp ydraw + 3002 8E97 B0 44 bcs OverTheTank + 3003 ; with or without shield ? + 3004 + 3005 8E99 BD FD 43 lda ActiveDefenceWeapon,x + 3006 8E9C C9 25 cmp #ind_Mag_Deflector__ ; first shielded weapon + 3007 8E9E 90 04 bcc CheckCollisionWithNotShieldedTank + 3008 8EA0 C9 2A cmp #ind_Bouncy_Castle__+1 ; last shielded weapon + 3009 8EA2 90 3D bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) + 3010 + 3011 ;lda ShieldEnergy,x ; there is wrong method to check shield :) + 3012 ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) + 3013 + 3014 8EA4 CheckCollisionWithNotShieldedTank + 3015 8EA4 BD 13 44 lda xtankstableH,x + 3016 8EA7 C5 62 cmp xdraw+1 + 3017 8EA9 D0 05 bne @+ + 3018 8EAB BD 0D 44 lda xtankstableL,x + 3019 8EAE C5 61 cmp xdraw + 3020 @ + 3021 8EB0 B0 2B bcs LeftFromTheTank + 3022 ; add 8 double byte + 3023 ; now we use Y as low byte and A as high byte of checked position (right edge of tank) + 3024 ; it is tricky but fast and much shorter + 3025 8EB2 18 clc + 3026 8EB3 BD 0D 44 lda xtankstableL,x + 3027 8EB6 69 08 adc #TankWidth + 3028 8EB8 A8 tay + 3029 8EB9 BD 13 44 lda xtankstableH,x + 3030 8EBC 69 00 adc #0 + 3031 8EBE C5 62 cmp xdraw+1 + 3032 8EC0 D0 02 bne @+ + 3033 8EC2 C4 61 cpy xdraw + 3034 @ + 3035 8EC4 90 17 bcc RightFromTheTank + 3036 8EC6 TankHit + 3037 8EC6 E8 inx + 3038 8EC7 86 BF stx HitFlag ; index of hit tank+1 + 3039 8EC9 CA dex + 3040 8ECA A5 61 85 C1 A5 62 + mwa xdraw XHit + 3041 8ED2 A5 63 8D 5F 44 A5 + mwa ydraw YHit + 3042 8EDC 60 rts ; in X there is an index of the hit tank + 3043 8EDD RightFromTheTank + 3044 8EDD LeftFromTheTank + 3045 8EDD OverTheTank + 3046 8EDD BelowTheTank + 3047 8EDD DeadTank + 3048 8EDD CA dex + 3049 8EDE 10 A7 bpl CheckCollisionWithTankLoop + 3050 8EE0 60 rts + 3051 8EE1 CheckCollisionWithShieldedTank + 3052 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + 3053 ; it is tricky but fast and much shorter + 3054 8EE1 BD 0D 44 lda xtankstableL,x + 3055 8EE4 38 sec + 3056 8EE5 E9 04 sbc #4 ; 5 pixels more on left side + 3057 8EE7 A8 tay + 3058 8EE8 BD 13 44 lda xtankstableH,x + 3059 8EEB E9 00 sbc #0 + 3060 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + 3061 8EED C5 62 cmp xdraw+1 + 3062 8EEF D0 02 bne @+ + 3063 8EF1 C4 61 cpy xdraw + 3064 @ + 3065 8EF3 B0 E8 bcs LeftFromTheTank + 3066 8EF5 98 tya ;add 16 double byte + 3067 8EF6 18 clc + 3068 8EF7 69 10 adc #TankWidth+4+4 + 3069 8EF9 A8 tay + 3070 8EFA BD 13 44 lda xtankstableH,x + 3071 8EFD 69 00 adc #0 + 3072 8EFF C5 62 cmp xdraw+1 + 3073 8F01 D0 02 bne @+ + 3074 8F03 C4 61 cpy xdraw + 3075 @ + 3076 8F05 90 D6 bcc RightFromTheTank + 3077 8F07 B0 BD bcs TankHit + 3078 .endp + 3079 ;-------------------------------------------------- + 3080 8F09 CalculateExplosionRange0 + 3081 ;-------------------------------------------------- + 3082 + 3083 ;the same as below, but without summing up + 3084 ;(for the first or single explosion) + 3085 + 3086 ;zero soil fall out ranges + 3087 8F09 20 89 8F jsr ClearScreenSoilRange + 3088 ;-------------------------------------------------- + 3089 8F0C .proc CalculateExplosionRange + 3090 ;-------------------------------------------------- + 3091 ;calculates total horizontal range of explosion by + 3092 ;"summing up" ranges of all separate explosions + 3093 + 3094 ; WeaponRangeRight = xdraw + ExplosionRadius + 3095 8F0C 18 clc + 3096 8F0D A5 61 lda xdraw + 3097 8F0F 65 B0 adc ExplosionRadius + 3098 8F11 8D 35 44 sta WeaponRangeRight + 3099 8F14 A5 62 lda xdraw+1 + 3100 8F16 69 00 adc #$00 + 3101 8F18 8D 36 44 sta WeaponRangeRight+1 + 3102 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now + 3103 ; cpw WeaponRangeRight #screenwidth-1 + 3104 8F1B C9 01 cmp #>(screenwidth-1) + 3105 8F1D D0 05 bne @+ + 3106 8F1F AD 35 44 lda WeaponRangeRight + 3107 8F22 C9 3F cmp #<(screenwidth-1) + 3108 8F24 90 0A @ bcc NotOutOfTheScreenRight + 3109 8F26 A9 3F 8D 35 44 A9 + mwa #screenwidth-1 WeaponRangeRight + 3110 + 3111 8F30 NotOutOfTheScreenRight + 3112 ; WeaponRangeLeft = xdraw - ExplosionRadius + 3113 8F30 38 sec + 3114 8F31 A5 61 lda xdraw + 3115 8F33 E5 B0 sbc ExplosionRadius + 3116 8F35 8D 33 44 sta WeaponRangeLeft + 3117 8F38 A5 62 lda xdraw+1 + 3118 8F3A E9 00 sbc #$00 + 3119 8F3C 8D 34 44 sta WeaponRangeLeft+1 + 3120 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now + 3121 ; lda WeaponRangeLeft+1 + 3122 8F3F 10 08 bpl NotOutOfTheScreenLeft + 3123 8F41 A9 00 lda #0 + 3124 8F43 8D 33 44 sta WeaponRangeLeft + 3125 8F46 8D 34 44 sta WeaponRangeLeft+1 + 3126 8F49 NotOutOfTheScreenLeft + 3127 + 3128 8F49 A5 D3 CD 34 44 D0 + cpw RangeLeft WeaponRangeLeft + 3129 8F55 90 0A bcc CheckRangeRight + 3130 8F57 AD 33 44 85 D2 AD + mwa WeaponRangeLeft RangeLeft + 3131 8F61 CheckRangeRight + 3132 8F61 A5 D5 CD 36 44 D0 + cpw RangeRight WeaponRangeRight + 3133 8F6D B0 0A bcs RangesChecked + 3134 8F6F AD 35 44 85 D4 AD + mwa WeaponRangeRight RangeRight + 3135 8F79 RangesChecked + 3136 + 3137 8F79 60 rts + 3138 .endp + 3139 + 3140 ;-------------------------------------------------- + 3141 8F7A .proc SetFullScreenSoilRange + 3142 ; whole screen in range of soil down + 3143 ;-------------------------------------------------- + 3144 8F7A A9 00 lda #0 + 3145 8F7C 85 D2 sta RangeLeft + 3146 8F7E 85 D3 sta RangeLeft+1 + 3147 8F80 A9 40 85 D4 A9 01 + mwa #screenwidth RangeRight + 3148 8F88 60 rts + 3149 .endp + 3150 ;-------------------------------------------------- + 3151 8F89 .proc ClearScreenSoilRange + 3152 ; cleanup of the soil fall down ranges (left and right) + 3153 ;-------------------------------------------------- + 3154 8F89 A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft + 3155 8F91 A9 00 lda #0 + 3156 8F93 85 D4 sta RangeRight + 3157 8F95 85 D5 sta RangeRight+1 + 3158 8F97 60 rts + 3159 .endp + 3160 ;-------------------------------------------------- + 3161 8F98 .proc DecreaseWeaponBeforeShoot + 3162 ;-------------------------------------------------- + 3163 8F98 A6 6C ldx TankNr + 3164 8F9A BD F7 43 lda ActiveWeapon,x + 3165 8F9D 20 A4 8F jsr DecreaseWeapon + 3166 ; and here we have amount of possessed ammo for given weapon + 3167 8FA0 8D 09 44 sta WeaponDepleted + 3168 8FA3 60 rts + 3169 .endp + 3170 + 3171 ;-------------------------------------------------- + 3172 8FA4 .proc DecreaseWeapon + 3173 ; in: A: Weapon number, TankNr + 3174 ; out: A: number of shells left, Y: weapon number + 3175 ; decreases 1 bullet from a weapon(A) of tank(TankNr) + 3176 ;-------------------------------------------------- + 3177 8FA4 20 B3 8F jsr HowManyBullets + 3178 8FA7 F0 09 beq noBullets ; no bullets - no decreasing (additional check) + 3179 8FA9 C0 00 cpy #0 + 3180 8FAB F0 05 beq defaultWeapon ; no decreasing Baby Missile + 3181 8FAD 38 sec + 3182 8FAE E9 01 sbc #1 + 3183 8FB0 91 98 sta (weaponPointer),y ; we have good values after HowManyBullets + 3184 8FB2 defaultWeapon + 3185 8FB2 noBullets + 3186 8FB2 60 rts + 3187 .endp + 3188 + 3189 ;-------------------------------------------------- + 3190 8FB3 .proc HowManyBullets + 3191 ; in: A <-- Weapon number, TankNr + 3192 ; out: A <-- How many bullets in the weapon, Y: weapon number + 3193 ; how many bullets weapon of tank(TankNr) has, Result in A + 3194 ;-------------------------------------------------- + 3195 8FB3 A8 tay + 3196 8FB4 A6 6C ldx TankNr + 3197 8FB6 BD F1 5A lda TanksWeaponsTableL,x + 3198 8FB9 85 98 sta weaponPointer + 3199 8FBB BD F7 5A lda TanksWeaponsTableH,x + 3200 8FBE 85 99 sta weaponPointer+1 + 3201 + 3202 8FC0 B1 98 lda (weaponPointer),y ; and we have number of bullets in A + 3203 8FC2 60 rts + 3204 .endp + 3205 + 3206 + 3207 .ENDIF + 3208 + 352 ;---------------------------------------------- + 353 8FC3 icl 'ai.asm' +Source: ai.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 ; artificial intelligence of tanks goes here! + 4 ; in A there is a level of tank's intelligence + 5 ; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all) + 6 ; at the moment (2003-08-15) I have no idea how + 7 ; to program better opponents, but moron is easy - + 8 ; - shoots random direction and force + 9 ; greeeting to myself 10 years older in 2013-11-09... still no idea + 10 + 11 + 12 ;---------------------------------------------- + 13 8FC3 .proc ArtificialIntelligence ; + 14 ; A - skill of the TankNr (in X) + 15 ; returns shoot energy and angle in + 16 ; ForceTable/L/H and AngleTable + 17 ;---------------------------------------------- + 18 8FC3 0A asl + 19 8FC4 A8 tay + 20 8FC5 88 88 :2 dey ;credit KK + 21 8FC7 B9 F7 8F lda AIRoutines+1,y + 22 8FCA 48 pha + 23 8FCB B9 F6 8F lda AIRoutines,y + 24 8FCE 48 pha + 25 ; it's no necessary - PrepareAIShoot is next proc :) + 26 ; jsr PrepareAIShoot + 27 ; rts + 28 .endp + 29 ;---------------------------------------------- + 30 8FCF .proc PrepareAIShoot + 31 ; create low precision table of positions + 32 ; by dividing positions by 4 + 33 8FCF A0 05 ldy #MaxPlayers-1 + 34 8FD1 loop + 35 8FD1 B9 0D 44 lda xtankstableL,y + 36 8FD4 85 72 sta temp + 37 8FD6 B9 13 44 lda xtankstableH,y + 38 8FD9 85 73 sta temp+1 + 39 ;= /4 + 40 8FDB 46 73 66 72 46 73 + :2 lsrw temp + 41 8FE3 A5 72 lda temp + 42 8FE5 99 1F 44 sta LowResDistances,y + 43 8FE8 88 dey + 44 8FE9 10 E6 bpl loop + 45 + 46 ; common values used in AI routines + 47 ; address of weapons table (for future use) + 48 8FEB WepTableToTemp + 49 8FEB BD F1 5A lda TanksWeaponsTableL,x + 50 8FEE 85 72 sta temp + 51 8FF0 BD F7 5A lda TanksWeaponsTableH,x + 52 8FF3 85 73 sta temp+1 + 53 8FF5 60 rts + 54 .endp + 55 ;---------------- + 56 8FF6 AIRoutines + 57 8FF6 1C 90 .word Moron-1 + 58 8FF8 3D 90 .word Shooter-1 ;Shooter + 59 8FFA CD 90 .word Poolshark-1 ;Poolshark + 60 8FFC 8E 91 .word Tosser-1 ;Tosser + 61 8FFE B7 91 .word Chooser-1 ;Chooser + 62 9000 05 92 .word Spoiler-1 ;Spoiler + 63 9002 53 92 .word Cyborg-1 ;Cyborg + 64 9004 05 90 .word Unknown-1 ;Unknown + 65 + 66 ;---------------------------------------------- + 67 9006 .proc Unknown + 68 ; random robotank (from Poolshark to Cyborg) + 69 9006 randomize 4 13 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9006 ?rand + 7 9006 AD 1B D4 lda random + 8 9009 C9 04 cmp #4 ;floor + 9 900B 90 F9 bcc ?rand + 10 900D C9 0E cmp #13+1 ;ceiling + 11 900F B0 F5 bcs ?rand +Source: ai.asm + 70 9011 29 FE and #%11111110 + 71 9013 A8 tay + 72 9014 B9 F7 8F lda AIRoutines+1,y + 73 9017 48 pha + 74 9018 B9 F6 8F lda AIRoutines,y + 75 901B 48 pha + 76 901C 60 rts + 77 .endp + 78 ;---------------------------------------------- + 79 901D .proc Moron + 80 901D 20 3D 59 jsr RandomizeAngle + 81 9020 85 D6 sta NewAngle + 82 9022 A9 50 8D E4 48 A9 + mwa #80 RandBoundaryLow + 83 902C A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh + 84 9036 20 45 59 jsr RandomizeForce + 85 ; choose the best weapon + 86 9039 A0 1F ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) + 87 903B 4C F4 95 jmp ChooseBestOffensive.NotFromAll + 88 ;rts + 89 .endp + 90 ;---------------------------------------------- + 91 903E .proc Shooter + 92 + 93 903E BD CC 48 lda PreviousAngle,x + 94 9041 1D D2 48 ora PreviousEnergyL,x + 95 9044 1D DE 48 ora PreviousEnergyH,x + 96 9047 F0 2D beq firstShoot + 97 + 98 9049 BD CC 48 lda PreviousAngle,x + 99 904C C9 5A cmp #90 + 100 904E B0 09 bcs shootingLeftAtThisMomentOfTime + 101 ; shooting right at this moment of time + 102 9050 38 sec + 103 9051 E9 05 sbc #5 + 104 9053 C9 0A cmp #10 + 105 9055 B0 09 bcs @+ ;not smaller than 10 + 106 9057 90 1D bcc firstShoot ; GET THE aim againg + 107 + 108 9059 shootingLeftAtThisMomentOfTime + 109 + 110 9059 18 clc + 111 905A 69 05 adc #5 + 112 905C C9 AA cmp #170 ; maximum shooter angle + 113 905E B0 16 bcs firstShoot + 114 @ + 115 9060 85 D6 sta NewAngle + 116 + 117 9062 38 sec + 118 9063 BD D2 48 lda PreviousEnergyL,x + 119 9066 E9 05 sbc #5 + 120 9068 9D D9 43 sta ForceTableL,x + 121 906B BD DE 48 lda PreviousEnergyH,x + 122 906E E9 00 sbc #0 + 123 9070 9D DF 43 sta ForceTableH,x + 124 9073 4C B7 90 jmp endo + 125 + 126 9076 firstShoot + 127 ; compare the x position with the middle of the screen + 128 9076 BD 13 44 lda xTanksTableH,x + 129 9079 C9 00 cmp #>(screenwidth/2) + 130 907B D0 05 bne @+ + 131 907D BD 0D 44 lda xTanksTableL,x + 132 9080 C9 A0 cmp #<(screenwidth/2) + 133 9082 90 0F @ bcc tankIsOnTheRight + 134 + 135 ; enemy tank is on the left + 136 9084 randomize 95 125 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9084 ?rand + 7 9084 AD 1B D4 lda random + 8 9087 C9 5F cmp #95 ;floor + 9 9089 90 F9 bcc ?rand + 10 908B C9 7E cmp #125+1 ;ceiling + 11 908D B0 F5 bcs ?rand +Source: ai.asm + 137 908F 85 D6 sta NewAngle + 138 9091 D0 0D bne forceNow + 139 + 140 9093 tankIsOnTheRight + 141 9093 randomize 55 85 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9093 ?rand + 7 9093 AD 1B D4 lda random + 8 9096 C9 37 cmp #55 ;floor + 9 9098 90 F9 bcc ?rand + 10 909A C9 56 cmp #85+1 ;ceiling + 11 909C B0 F5 bcs ?rand +Source: ai.asm + 142 909E 85 D6 sta NewAngle + 143 + 144 90A0 forceNow + 145 90A0 A9 64 8D E4 48 A9 + mwa #100 RandBoundaryLow + 146 90AA A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh + 147 ;ldx TankNr ;this is possibly not necessary + 148 90B4 20 45 59 jsr RandomizeForce + 149 + 150 90B7 endo + 151 ;ldx TankNr ;this is possibly not necessary + 152 90B7 20 79 59 jsr RandomizeForce.LimitForce + 153 90BA A5 D6 lda NewAngle + 154 90BC 9D CC 48 sta PreviousAngle,x + 155 90BF BD D9 43 lda ForceTableL,x + 156 90C2 9D D2 48 sta PreviousEnergyL,x + 157 90C5 BD DF 43 lda ForceTableH,x + 158 90C8 9D DE 48 sta PreviousEnergyH,x + 159 + 160 ; choose the best weapon + 161 + 162 90CB 4C F2 95 jmp ChooseBestOffensive + 163 ;rts + 164 .endp + 165 ;---------------------------------------------- + 166 90CE .proc Poolshark + 167 90CE 20 35 91 jsr UseBatteryOrFlag + 168 ; defensives + 169 90D1 20 60 91 jsr PoolsharkDefensives + 170 90D4 firstShoot + 171 ;find nearest tank neighbour + 172 90D4 20 C0 92 jsr FindBestTarget2 + 173 90D7 F0 0F beq EnemyOnLeft + 174 ; calculate index to shotangle table + 175 ; in temp2 we have x distance divided by 8 + 176 90D9 A5 74 lda temp2 + 177 90DB 4A 4A 4A :3 lsr @ + 178 90DE 29 07 and #%00000111 + 179 90E0 18 clc + 180 90E1 69 08 adc #8 + 181 90E3 8D E8 48 sta AngleTablePointer + 182 90E6 D0 0C bne AngleIsSet + 183 90E8 EnemyOnLeft + 184 90E8 A5 74 lda temp2 + 185 90EA 4A 4A 4A :3 lsr @ + 186 90ED 29 07 and #%00000111 + 187 90EF 49 07 eor #%00000111 + 188 90F1 8D E8 48 sta AngleTablePointer + 189 90F4 AngleIsSet + 190 + 191 90F4 randomize 0 8 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 90F4 ?rand + 7 90F4 AD 1B D4 lda random + 8 90F7 C9 00 cmp #0 ;floor + 9 90F9 90 F9 bcc ?rand + 10 90FB C9 09 cmp #8+1 ;ceiling + 11 90FD B0 F5 bcs ?rand +Source: ai.asm + 192 90FF AC E8 48 ldy AngleTablePointer + 193 9102 18 clc + 194 9103 79 25 91 adc AngleTable,y + 195 9106 85 D6 sta NewAngle + 196 + 197 9108 forceNow + 198 9108 A9 2C 8D E4 48 A9 + mwa #300 RandBoundaryLow + 199 9112 A9 BC 8D E6 48 A9 + mwa #700 RandBoundaryHigh + 200 911C A6 6C ldx TankNr + 201 911E 20 45 59 jsr RandomizeForce + 202 + 203 9121 endo + 204 ; choose the best weapon + 205 + 206 9121 20 F2 95 jsr ChooseBestOffensive + 207 9124 60 rts + 208 + 209 ;---------------------------------------------- + 210 9125 AngleTable ; 16 bytes ;ba w $348b L$3350 + 211 9125 6A 72 7A 82 8A 92 + .by 106,114,122,130,138,146,154,162 + 212 912D 12 1A 22 2B 32 3A + .by 18,26,34,43,50,58,66,74 + 213 .endp + 214 ;---------------------------------------------- + 215 9135 .proc UseBatteryOrFlag + 216 9135 20 45 91 jsr UseBattery ; as subroutine for reuse in AutoDefense + 217 ; if very low energy and no battery then use White Flag + 218 9138 BD A2 43 lda Energy,x + 219 913B C9 05 cmp #5 + 220 913D B0 05 bcs EnoughEnergy + 221 ; lower than 5 units - white flag + 222 913F A9 20 lda #ind_White_Flag_____ + 223 9141 9D FD 43 sta ActiveDefenceWeapon,x + 224 9144 EnoughEnergy + 225 9144 60 rts + 226 .endp + 227 ; + 228 9145 .proc UseBattery + 229 ; if low energy ten use battery + 230 9145 BD A2 43 lda Energy,x + 231 9148 C9 1E cmp #30 + 232 914A B0 13 bcs EnoughEnergy + 233 ; lower than 30 units - check battery + 234 914C A0 21 ldy #ind_Battery________ + 235 914E B1 72 lda (temp),y ; has address of TanksWeaponsTable + 236 9150 F0 0D beq NoBatteries + 237 ; we have batteries - use one + 238 9152 38 sec + 239 9153 E9 01 sbc #1 + 240 9155 91 72 sta (temp),y + 241 9157 A9 63 lda #99 + 242 9159 9D A2 43 sta Energy,x + 243 915C 20 2A 58 jsr MaxForceCalculate + 244 915F EnoughEnergy + 245 915F NoBatteries + 246 915F 60 rts + 247 .endp + 248 ;---------------------------------------------- + 249 9160 .proc PoolsharkDefensives + 250 ; use best defensive :) + 251 ; but not allways + 252 9160 randomize 1 3 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9160 ?rand + 7 9160 AD 1B D4 lda random + 8 9163 C9 01 cmp #1 ;floor + 9 9165 90 F9 bcc ?rand + 10 9167 C9 04 cmp #3+1 ;ceiling + 11 9169 B0 F5 bcs ?rand +Source: ai.asm + 253 916B C9 01 cmp #1 + 254 916D D0 1F bne NoUseDefensive + 255 ; first check check if any is in use + 256 916F BD FD 43 lda ActiveDefenceWeapon,x + 257 9172 D0 1A bne DefensiveInUse + 258 9174 A0 2A ldy #last_real_defensive+1 ;the last defensive weapon + 259 @ + 260 9176 88 dey + 261 9177 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + 262 9179 F0 13 beq NoUseDefensive + 263 917B B1 72 lda (temp),y ; has address of TanksWeaponsTable + 264 917D F0 F7 beq @- + 265 ; decrease in inventory + 266 917F 38 sec + 267 9180 E9 01 sbc #1 + 268 9182 91 72 sta (temp),y ; has address of TanksWeaponsTable + 269 ; activate defensive weapon + 270 9184 98 tya ; number of selectet defensive weapon + 271 9185 9D FD 43 sta ActiveDefenceWeapon,x + 272 9188 B9 1A 60 lda DefensiveEnergy,y + 273 918B 9D A8 43 sta ShieldEnergy,x + 274 918E NoUseDefensive + 275 918E DefensiveInUse + 276 918E 60 rts + 277 .endp + 278 ;---------------------------------------------- + 279 918F .proc Tosser + 280 918F 20 35 91 jsr UseBatteryOrFlag + 281 ; use best defensive :) + 282 9192 20 98 91 jsr TosserDefensives + 283 ; Toosser is like Poolshark but allways uses defensives + 284 9195 4C D4 90 jmp Poolshark.firstShoot + 285 .endp + 286 ;---------------------------------------------- + 287 9198 .proc TosserDefensives + 288 ; use best defensive :) + 289 ; allways + 290 ; first check check if any is in use + 291 9198 BD FD 43 lda ActiveDefenceWeapon,x + 292 919B D0 1A bne DefensiveInUse + 293 919D A0 2A ldy #last_real_defensive+1 ;the last defensive weapon + 294 @ + 295 919F 88 dey + 296 91A0 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + 297 91A2 F0 13 beq NoUseDefensive + 298 91A4 B1 72 lda (temp),y ; has address of TanksWeaponsTable + 299 91A6 F0 F7 beq @- + 300 ; decrease in inventory + 301 91A8 38 sec + 302 91A9 E9 01 sbc #1 + 303 91AB 91 72 sta (temp),y ; has address of TanksWeaponsTable + 304 ; activate defensive weapon + 305 91AD 98 tya ; number of selectet defensive weapon + 306 91AE 9D FD 43 sta ActiveDefenceWeapon,x + 307 91B1 B9 1A 60 lda DefensiveEnergy,y + 308 91B4 9D A8 43 sta ShieldEnergy,x + 309 91B7 DefensiveInUse + 310 91B7 NoUseDefensive + 311 91B7 60 rts + 312 .endp + 313 ;---------------------------------------------- + 314 91B8 .proc Chooser + 315 ; like cyborg but more randomizing force + 316 91B8 20 35 91 jsr UseBatteryOrFlag + 317 ; use defensives like Tosser + 318 91BB 20 98 91 jsr TosserDefensives + 319 ; now select best target + 320 91BE A9 00 lda #$00 ; no prefer humans + 321 91C0 20 81 92 jsr FindBestTarget3 + 322 91C3 8C 31 44 sty TargetTankNr + 323 ; aiming + 324 91C6 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 325 + 326 ; choose the best weapon + 327 91C9 20 F2 95 jsr ChooseBestOffensive + 328 + 329 ; randomizing force +-100 + 330 91CC 38 A5 A4 E9 64 8D + sbw Force #100 RandBoundaryLow + 331 91DB 10 0A bpl NotNegativeEnergy + 332 91DD A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow + 333 91E7 NotNegativeEnergy + 334 91E7 18 A5 A4 69 64 8D + adw Force #100 RandBoundaryHigh + 335 91F6 20 45 59 jsr RandomizeForce + 336 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + 337 91F9 20 08 96 jsr GetDistance + 338 91FC C9 06 cmp #6 ; 24/4 + 339 91FE B0 05 bcs HighForce + 340 9200 A9 00 lda #ind_Baby_Missile___ + 341 9202 9D F7 43 sta ActiveWeapon,x + 342 9205 HighForce + 343 9205 60 rts + 344 .endp + 345 ;---------------------------------------------- + 346 9206 .proc Spoiler + 347 ; like cyborg but little randomizing force + 348 9206 20 35 91 jsr UseBatteryOrFlag + 349 ; use defensives like Tosser + 350 9209 20 98 91 jsr TosserDefensives + 351 ; now select best target + 352 920C A9 00 lda #$00 ; no prefer humans + 353 920E 20 81 92 jsr FindBestTarget3 + 354 9211 8C 31 44 sty TargetTankNr + 355 ; aiming + 356 9214 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 357 + 358 ; choose the best weapon + 359 9217 20 F2 95 jsr ChooseBestOffensive + 360 + 361 ; randomizing force +-50 + 362 921A 38 A5 A4 E9 32 8D + sbw Force #50 RandBoundaryLow + 363 9229 10 0A bpl NotNegativeEnergy + 364 922B A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow + 365 9235 NotNegativeEnergy + 366 9235 18 A5 A4 69 32 8D + adw Force #50 RandBoundaryHigh + 367 9244 20 45 59 jsr RandomizeForce + 368 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + 369 9247 20 08 96 jsr GetDistance + 370 924A C9 06 cmp #6 ; 24/4 + 371 924C B0 05 bcs HighForce + 372 924E A9 00 lda #ind_Baby_Missile___ + 373 9250 9D F7 43 sta ActiveWeapon,x + 374 9253 HighForce + 375 9253 60 rts + 376 .endp + 377 ;---------------------------------------------- + 378 9254 .proc Cyborg + 379 9254 20 35 91 jsr UseBatteryOrFlag + 380 ; use defensives like Tosser + 381 9257 20 98 91 jsr TosserDefensives + 382 ; now select best target + 383 925A A9 64 lda #100 ; prefer humans + 384 925C 20 81 92 jsr FindBestTarget3 + 385 925F 8C 31 44 sty TargetTankNr + 386 ; aiming + 387 9262 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 388 + 389 ; choose the best weapon + 390 9265 A0 04 ldy #ind_Nuke___________+1 + 391 9267 20 F4 95 jsr ChooseBestOffensive.NotFromAll + 392 + 393 926A A5 A4 lda Force + 394 926C 9D D9 43 sta ForceTableL,x + 395 926F A5 A5 lda Force+1 + 396 9271 9D DF 43 sta ForceTableH,x + 397 ; if target distance lower than 32 - set weapon to Baby Missile (for security :) + 398 9274 20 08 96 jsr GetDistance + 399 9277 C9 08 cmp #8 ;32/4 + 400 9279 B0 05 bcs HighForce + 401 927B A9 00 lda #ind_Baby_Missile___ + 402 927D 9D F7 43 sta ActiveWeapon,x + 403 9280 HighForce + 404 9280 60 rts + 405 .endp + 406 + 407 ;---------------------------------------------- + 408 9281 .proc FindBestTarget3 + 409 ; find target with lowest energy + 410 ; X - shooting tank number + 411 ; A - 100 - prefer humans , 0 - equality :) + 412 ; returns target tank number in Y and + 413 ; direcion of shoot in A (0 - left, >0 - right) + 414 ;---------------------------------------------- + 415 9281 85 A2 sta PreferHumansFlag + 416 ; jsr MakeLowResDistances + 417 9283 A9 CA lda #202 + 418 9285 85 74 sta temp2 ; max possible energy + 419 9287 A9 00 lda #0 + 420 9289 85 7E sta tempor2 ; direction of shoot + 421 ;ldx TankNr + 422 928B A4 AE ldy NumberOfPlayers + 423 928D 88 dey + 424 + 425 928E loop01 + 426 928E C4 6C cpy TankNr + 427 9290 F0 26 beq skipThisPlayer + 428 9292 B9 AF 43 lda eXistenZ,y + 429 9295 F0 21 beq skipThisPlayer + 430 + 431 9297 B9 39 41 lda skilltable,y + 432 929A F0 02 beq ItIsHuman + 433 929C A5 A2 lda PreferHumansFlag + 434 929E ItIsHuman + 435 929E 18 clc + 436 929F 79 A2 43 adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) + 437 92A2 C5 74 cmp temp2 ; lowest + 438 92A4 B0 12 bcs lowestIsLower + 439 92A6 85 74 sta temp2 + 440 92A8 84 75 sty temp2+1 ; number of the closest tank + 441 92AA A9 00 85 7E mva #0 tempor2 + 442 92AE BD 1F 44 lda LowResDistances,x + 443 92B1 D9 1F 44 cmp LowResDistances,y + 444 92B4 B0 02 bcs EnemyOnTheLeft + 445 ; enemy on right + 446 92B6 E6 7E inc tempor2 ; set direction to right + 447 + 448 92B8 EnemyOnTheLeft + 449 92B8 lowestIsLower + 450 92B8 skipThisPlayer + 451 92B8 88 dey + 452 92B9 10 D3 bpl loop01 + 453 ; now we have number of the farthest tank in temp2+1 + 454 ; and direction (0 - left, >0 - right) in tempor2 + 455 ; let's move them to registers + 456 ; in temp2 we have energy of target + 457 92BB A4 75 ldy temp2+1 + 458 92BD A5 7E lda tempor2 + 459 92BF 60 rts + 460 .endp + 461 ;---------------------------------------------- + 462 92C0 .proc FindBestTarget2 + 463 ; find nearest tank neighbour + 464 ; X - shooting tank number + 465 ; returns target tank number in Y and + 466 ; direcion of shoot in A (0 - left, >0 - right) + 467 ;---------------------------------------------- + 468 ; jsr MakeLowResDistances + 469 92C0 A9 FF 85 74 mva #$ff temp2 ; min possible distance + 470 92C4 A9 00 85 7E mva #0 tempor2 ; direction of shoot + 471 + 472 ;ldx TankNr + 473 92C8 A4 AE ldy NumberOfPlayers + 474 92CA 88 dey + 475 + 476 92CB loop01 + 477 92CB C4 6C cpy TankNr + 478 92CD F0 2F beq skipThisPlayer + 479 92CF B9 AF 43 lda eXistenZ,y + 480 92D2 F0 2A beq skipThisPlayer + 481 + 482 92D4 BD 1F 44 lda LowResDistances,x + 483 92D7 D9 1F 44 cmp LowResDistances,y + 484 92DA B0 13 bcs EnemyOnTheLeft + 485 ;enemy on the right + 486 92DC 38 sec + 487 92DD B9 1F 44 lda LowResDistances,y + 488 92E0 FD 1F 44 sbc LowResDistances,x + 489 92E3 C5 74 cmp temp2 ; lowest + 490 92E5 B0 17 bcs lowestIsLower + 491 92E7 85 74 sta temp2 + 492 92E9 84 75 sty temp2+1 ; number of the closest tank + 493 92EB E6 7E inc tempor2 ; set direction to right + 494 92ED D0 0F bne lowestIsLower + 495 + 496 92EF EnemyOnTheLeft + 497 92EF 38 sec + 498 92F0 BD 1F 44 lda LowResDistances,x + 499 92F3 F9 1F 44 sbc LowResDistances,y + 500 92F6 C5 74 cmp temp2 ; lowest + 501 92F8 B0 04 bcs lowestIsLower + 502 92FA 85 74 sta temp2 + 503 92FC 84 75 sty temp2+1 ; number of the closest tank + 504 + 505 92FE lowestIsLower + 506 92FE skipThisPlayer + 507 92FE 88 dey + 508 92FF 10 CA bpl loop01 + 509 ; now we have number of the closest tank in temp2+1 + 510 ; and direction (0 - left, >0 - right) in tempor2 + 511 ; let's move them to registers + 512 ; in temp2 we have x distance divided by 8 + 513 9301 A4 75 ldy temp2+1 + 514 9303 A5 7E lda tempor2 + 515 9305 60 rts + 516 .endp + 517 + 518 ;---------------------------------------------- + 519 9306 .proc TakeAim + 520 ; targeting the tank number TargetTankNr (and Y) + 521 ; A (and tempor2) - direction from shooting tank (0 - left, >0 - right) + 522 ; returns angle and power of shoot tank X (TankNr) + 523 ; in the appropriate variables (Angle and Force) + 524 ;---------------------------------------------- + 525 9306 BD F7 43 lda ActiveWeapon,x + 526 9309 48 pha ; store active weapon + 527 930A A9 FF 8D 32 44 mva #$ff SecondTryFlag + 528 ; set initial Angle and Force values + 529 930F AD 41 41 lda OptionsTable+2 ; selected gravity + 530 9312 0A asl + 531 9313 A8 tay + 532 ; force correction - lower tank Y position - higher possible force + 533 9314 38 sec + 534 9315 A9 C8 lda #screenheight + 535 9317 FD 19 44 sbc Ytankstable,x + 536 931A 85 74 sta temp2 + 537 931C 18 clc + 538 931D B9 EA A2 lda AIForceTable,y + 539 9320 8D E4 48 sta RandBoundaryLow + 540 9323 65 74 adc temp2 + 541 9325 8D E6 48 sta RandBoundaryHigh + 542 9328 B9 EB A2 lda AIForceTable+1,y + 543 932B 8D E5 48 sta RandBoundaryLow+1 + 544 932E 69 00 adc #0 + 545 9330 8D E7 48 sta RandBoundaryHigh+1 + 546 9333 20 45 59 jsr RandomizeForce + 547 9336 RepeatAim + 548 9336 20 96 59 jsr Table2Force + 549 ; wind correction 90+(wind/8) + 550 9339 A5 CE 85 74 A5 CF + mwa Wind temp2 + 551 9341 46 75 66 74 46 75 + :7 lsrw temp2 + 552 935D 18 clc + 553 935E A9 5A lda #90 + 554 9360 65 74 adc temp2 + 555 9362 85 D6 sta NewAngle + 556 ; set virtual weapon :) + 557 9364 A9 00 lda #ind_Baby_Missile___ + 558 9366 9D F7 43 sta ActiveWeapon,x + 559 ; now we have initial valuses + 560 9369 A9 C0 85 97 mva #%11000000 TestFlightFlag + 561 ; check targeting direction + 562 936D A5 7E lda tempor2 + 563 936F F0 03 4C 06 94 jne AimingLeft + 564 9374 AimingRight + 565 ; make test Shoot (Flight) + 566 9374 20 7E 94 jsr SetStartAndFlight + 567 9377 A5 BF lda HitFlag + 568 9379 F0 29 beq NoHitInFirstLoopR ; impossible :) + 569 937B 30 08 bmi GroundHitInFirstLoopR + 570 937D TankHitInFirstLoopR + 571 ; tank hit, but which tank? + 572 ; it's our target or not? + 573 937D A4 BF ldy HitFlag + 574 937F 88 dey + 575 9380 CC 31 44 cpy TargetTankNr + 576 9383 F0 28 beq EndOfFirstLoopR ; it's our target! + 577 ; if it's another tank then check position like ground hit + 578 9385 GroundHitInFirstLoopR + 579 ; checking only x position of hit + 580 9385 AC 31 44 ldy TargetTankNr + 581 9388 B9 13 44 lda xTanksTableH,y + 582 938B C5 C2 cmp XHit+1 + 583 938D D0 05 bne @+ + 584 938F B9 0D 44 lda xTanksTableL,y + 585 9392 C5 C1 cmp XHit + 586 @ + 587 9394 B0 15 bcs HitOnRightSideOfTargetR + 588 ; continue targeting + 589 9396 18 clc + 590 9397 A5 D6 lda NewAngle + 591 9399 69 05 adc #5 ; 5 deg to right + 592 939B C9 A0 cmp #(180-20) + 593 ; bcs EndOfFirstLoopR ; if angle 180-20 or higher + 594 939D B0 4F bcs AimSecondTry + 595 939F 85 D6 sta NewAngle + 596 93A1 4C 74 93 jmp AimingRight + 597 93A4 NoHitInFirstLoopR + 598 ; Angle 5 deg to left and end loop + 599 93A4 38 sec + 600 93A5 A5 D6 lda NewAngle + 601 93A7 E9 05 sbc #5 + 602 93A9 85 D6 sta NewAngle + 603 93AB HitOnRightSideOfTargetR + 604 93AB C6 D6 dec NewAngle + 605 93AD EndOfFirstLoopR + 606 93AD A9 05 85 76 mva #5 modify ; set counter (5 turns) + 607 93B1 SecondLoopR + 608 ; make test Shoot (Flight) + 609 93B1 20 7E 94 jsr SetStartAndFlight + 610 93B4 A5 BF lda HitFlag + 611 93B6 F0 2F beq NoHitInSecondLoopR ; impossible :) + 612 93B8 30 08 bmi GroundHitInSecondLoopR + 613 93BA TankHitInSecondLoopR + 614 ; tank hit, but which tank? + 615 ; it's our target or not? + 616 93BA A4 BF ldy HitFlag + 617 93BC 88 dey + 618 93BD CC 31 44 cpy TargetTankNr + 619 93C0 F0 27 beq EndOfSecondLoopR ; it's our target! + 620 ; if it's another tank then check position like ground hit + 621 93C2 GroundHitInSecondLoopR + 622 ; checking only x position of hit + 623 93C2 AC 31 44 ldy TargetTankNr + 624 93C5 B9 13 44 lda xTanksTableH,y + 625 93C8 C5 C2 cmp XHit+1 + 626 93CA D0 05 bne @+ + 627 93CC B9 0D 44 lda xTanksTableL,y + 628 93CF C5 C1 cmp XHit + 629 @ + 630 93D1 90 09 bcc HitOnLeftSideOfTargetR + 631 ; continue targeting + 632 93D3 C6 D6 dec NewAngle ; 1 deg to left + 633 93D5 C6 76 dec modify ; max 5 turns + 634 93D7 F0 10 beq EndOfSecondLoopR + 635 93D9 4C B1 93 jmp SecondLoopR + 636 93DC HitOnLeftSideOfTargetR + 637 ; decrease energy (a little) + 638 93DC 38 A5 A4 E9 05 85 + sbw Force #5 + 639 93E7 NoHitInSecondLoopR + 640 ; Angle 1 deg to right and end loop + 641 93E7 E6 D6 inc NewAngle + 642 93E9 EndOfSecondLoopR + 643 93E9 EndOfAim + 644 93E9 68 pla ; and restore active weapon + 645 93EA 9D F7 43 sta ActiveWeapon,x + 646 93ED 60 rts + 647 + 648 93EE AimSecondTry + 649 93EE 2C 32 44 bit SecondTryFlag + 650 93F1 10 F6 bpl EndOfAim ; closest RTS + 651 93F3 EE 32 44 inc SecondTryFlag + 652 93F6 A9 E8 lda #<1000 + 653 93F8 9D D9 43 sta ForceTableL,x + 654 93FB A9 03 lda #>1000 + 655 93FD 9D DF 43 sta ForceTableH,x + 656 9400 20 79 59 jsr RandomizeForce.LimitForce + 657 9403 4C 36 93 jmp RepeatAim + 658 + 659 9406 AimingLeft + 660 ; make test Shoot (Flight) + 661 9406 20 7E 94 jsr SetStartAndFlight + 662 9409 A5 BF lda HitFlag + 663 940B F0 29 beq NoHitInFirstLoopL ; impossible :) + 664 940D 30 08 bmi GroundHitInFirstLoopL + 665 940F TankHitInFirstLoopL + 666 ; tank hit, but which tank? + 667 ; it's our target or not? + 668 940F A4 BF ldy HitFlag + 669 9411 88 dey + 670 9412 CC 31 44 cpy TargetTankNr + 671 9415 F0 28 beq EndOfFirstLoopL ; it's our target! + 672 ; if it's another tank then check position like ground hit + 673 9417 GroundHitInFirstLoopL + 674 ; checking only x position of hit + 675 9417 AC 31 44 ldy TargetTankNr + 676 941A B9 13 44 lda xTanksTableH,y + 677 941D C5 C2 cmp XHit+1 + 678 941F D0 05 bne @+ + 679 9421 B9 0D 44 lda xTanksTableL,y + 680 9424 C5 C1 cmp XHit + 681 @ + 682 9426 90 15 bcc HitOnLeftSideOfTargetL + 683 ; continue targeting + 684 9428 38 sec + 685 9429 A5 D6 lda NewAngle + 686 942B E9 05 sbc #5 ; 5 deg to left + 687 942D C9 15 cmp #21 + 688 ; bcc EndOfFirstLoopL ; if angle 20 or lower + 689 942F 90 BD bcc AimSecondTry + 690 9431 85 D6 sta NewAngle + 691 9433 4C 06 94 jmp AimingLeft + 692 9436 NoHitInFirstLoopL + 693 ; Angle 5 deg to right and end loop + 694 9436 18 clc + 695 9437 A5 D6 lda NewAngle + 696 9439 69 05 adc #5 + 697 943B 85 D6 sta NewAngle + 698 943D HitOnLeftSideOfTargetL + 699 943D E6 D6 inc NewAngle + 700 943F EndOfFirstLoopL + 701 943F A9 05 85 76 mva #5 modify ; set counter (5 turns) + 702 9443 SecondLoopL + 703 ; make test Shoot (Flight) + 704 9443 20 7E 94 jsr SetStartAndFlight + 705 9446 A5 BF lda HitFlag + 706 9448 F0 2F beq NoHitInSecondLoopL ; impossible :) + 707 944A 30 08 bmi GroundHitInSecondLoopL + 708 944C TankHitInSecondLoopL + 709 ; tank hit, but which tank? + 710 ; it's our target or not? + 711 944C A4 BF ldy HitFlag + 712 944E 88 dey + 713 944F CC 31 44 cpy TargetTankNr + 714 9452 F0 27 beq EndOfSecondLoopL ; it's our target! + 715 ; if it's another tank then check position like ground hit + 716 9454 GroundHitInSecondLoopL + 717 ; checking only x position of hit + 718 9454 AC 31 44 ldy TargetTankNr + 719 9457 B9 13 44 lda xTanksTableH,y + 720 945A C5 C2 cmp XHit+1 + 721 945C D0 05 bne @+ + 722 945E B9 0D 44 lda xTanksTableL,y + 723 9461 C5 C1 cmp XHit + 724 @ + 725 9463 B0 09 bcs HitOnRightSideOfTargetL + 726 ; continue targeting + 727 9465 E6 D6 inc NewAngle ; 1 deg to right + 728 9467 C6 76 dec modify ; max 5 turns + 729 9469 F0 10 beq EndOfSecondLoopL + 730 946B 4C 43 94 jmp SecondLoopL + 731 946E HitOnRightSideOfTargetL + 732 ; decrease energy (a little) + 733 946E 38 A5 A4 E9 05 85 + sbw Force #5 + 734 9479 NoHitInSecondLoopL + 735 ; Angle 1 deg to left and end loop + 736 9479 C6 D6 dec NewAngle + 737 947B EndOfSecondLoopL + 738 947B 4C E9 93 jmp EndOfAim + 739 + 740 947E SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight + 741 ; xtraj+1 and ytraj+1 set + 742 947E 18 clc + 743 947F BD 0D 44 lda xTanksTableL,x + 744 9482 69 04 adc #4 + 745 9484 85 C9 sta xtraj+1 + 746 9486 BD 13 44 lda xTanksTableH,x + 747 9489 69 00 adc #0 + 748 948B 85 CA sta xtraj+2 + 749 948D 38 sec + 750 948E BD 19 44 lda yTanksTable,x + 751 9491 E9 04 sbc #4 + 752 9493 85 CC sta ytraj+1 + 753 9495 A9 00 85 CD mva #0 ytraj+2 + 754 9499 A5 D6 85 A7 mva NewAngle Angle + 755 949D 20 A0 83 jsr Flight + 756 94A0 A6 6C ldx TankNr + 757 94A2 60 rts + 758 .endp + 759 ;---------------------------------------------- + 760 94A3 .proc PurchaseAI ; + 761 ; A - skill of the TankNr + 762 ; makes purchase for AI opponents + 763 ; results of this routine are not visible on the screen + 764 ;---------------------------------------------- + 765 94A3 0A asl + 766 94A4 AA tax + 767 94A5 CA CA :2 dex ;credit KK + 768 94A7 BD B1 94 lda PurchaseAIRoutines+1,x + 769 94AA 48 pha + 770 94AB BD B0 94 lda PurchaseAIRoutines,x + 771 94AE 48 pha + 772 94AF 60 rts + 773 .endp + 774 + 775 ;---------------- + 776 94B0 PurchaseAIRoutines + 777 94B0 BF 94 .word MoronPurchase-1 + 778 94B2 39 95 .word ShooterPurchase-1 ;ShooterPurchase + 779 94B4 60 95 .word PoolsharkPurchase-1 ;PoolsharkPurchase + 780 94B6 89 95 .word TosserPurchase-1 ;TosserPurchase + 781 94B8 89 95 .word TosserPurchase-1 ;ChooserPurchase + 782 94BA BC 95 .word CyborgPurchase-1 ;SpoilerPurchase + 783 94BC BC 95 .word CyborgPurchase-1 ;CyborgPurchase + 784 94BE 89 95 .word TosserPurchase-1 ;UnknownPurchase + 785 + 786 ;---------------------------------------------- + 787 94C0 .proc MoronPurchase + 788 ;Moron buys nothing + 789 94C0 60 rts + 790 .endp + 791 ;------- + 792 94C1 .proc TryToPurchaseOnePiece2 ; for Cyborg + 793 ; A - weapon number, better it will be in range(1,32) + 794 ; TankNr in X + 795 ; DOES NOT CHANGE X + 796 94C1 A8 tay + 797 94C2 85 73 sta temp+1 + 798 94C4 4A 4A 4A :3 lsr ; A=A/8 + 799 94C7 85 72 sta temp + 800 94C9 98 tya + 801 94CA 29 07 and #%00000111 + 802 94CC A8 tay + 803 94CD B9 1C 5C lda bittable,y + 804 94D0 A4 72 ldy temp + 805 94D2 39 04 5D and PurchaseMeTable2,y + 806 94D5 F0 62 beq TryToPurchaseOnePiece.SorryNoPurchase + 807 94D7 4C F0 94 jmp TryToPurchaseOnePiece.PurchaseIt + 808 .endp + 809 ;------- + 810 94DA .proc TryToPurchaseOnePiece + 811 ; A - weapon number, better it will be in range(1,32) + 812 ; TankNr in X + 813 ; DOES NOT CHANGE X + 814 94DA A8 tay + 815 94DB 85 73 sta temp+1 + 816 94DD 4A 4A 4A :3 lsr ; A=A/8 + 817 94E0 85 72 sta temp + 818 94E2 98 tya + 819 94E3 29 07 and #%00000111 + 820 94E5 A8 tay + 821 94E6 B9 1C 5C lda bittable,y + 822 94E9 A4 72 ldy temp + 823 94EB 39 FE 5C and PurchaseMeTable,y + 824 94EE F0 49 beq SorryNoPurchase + 825 94F0 PurchaseIt + 826 94F0 A4 73 ldy temp+1 + 827 94F2 B9 9E 5C lda WeaponPriceL,y + 828 94F5 85 72 sta temp + 829 94F7 B9 6E 5C lda WeaponPriceH,y + 830 94FA 85 73 sta temp+1 + 831 ;price of the weapon in temp + 832 94FC BD 84 43 lda MoneyL,x + 833 94FF 85 74 sta temp2 + 834 9501 BD 7E 43 lda MoneyH,x + 835 9504 85 75 sta temp2+1 + 836 ;current monies in temp2 + 837 9506 A5 75 C5 73 D0 04 + cpw temp2 temp + 838 9510 90 27 bcc SorryNoPurchase + 839 ; deduct monies from the bank account + 840 9512 38 sec + 841 9513 A5 74 lda temp2 + 842 9515 E5 72 sbc temp + 843 9517 9D 84 43 sta MoneyL,x + 844 951A A5 75 lda temp2+1 + 845 951C E5 73 sbc temp+1 + 846 951E 9D 7E 43 sta MoneyH,x + 847 + 848 9521 BD F1 5A lda TanksWeaponsTableL,x + 849 9524 85 72 sta temp + 850 9526 BD F7 5A lda TanksWeaponsTableH,x + 851 9529 85 73 sta temp+1 + 852 + 853 952B B9 CE 5C lda WeaponUnits,y + 854 952E 18 clc + 855 952F 71 72 adc (temp),y + 856 9531 C9 63 cmp #99 ;max number of weapon units + 857 9533 90 02 bcc NotExceeded + 858 9535 A9 63 lda #99 + 859 9537 NotExceeded + 860 9537 91 72 sta (temp),y + 861 + 862 + 863 9539 SorryNoPurchase + 864 9539 60 rts + 865 .endp + 866 + 867 + 868 ;---------------------------------------------- + 869 953A .proc ShooterPurchase + 870 ; first try to buy defensives + 871 ; mva #2 tempXroller; number of offensive purchases to perform + 872 953A A6 6C ldx TankNr + 873 @ + 874 953C randomize ind_Battery________ ind_StrongParachute +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 953C ?rand + 7 953C AD 1B D4 lda random + 8 953F C9 21 cmp #IND_BATTERY________ ;floor + 9 9541 90 F9 bcc ?rand + 10 9543 C9 25 cmp #IND_STRONGPARACHUTE+1 ;ceiling + 11 9545 B0 F5 bcs ?rand +Source: ai.asm + 875 9547 20 DA 94 jsr TryToPurchaseOnePiece + 876 ; dec tempXroller + 877 ; bne @- + 878 + 879 ; and now offensives + 880 954A A9 04 85 78 mva #4 tempXroller; number of offensive purchases to perform + 881 ;ldx TankNr + 882 @ + 883 954E randomize ind_Missile________ ind_Heavy_Roller___ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 954E ?rand + 7 954E AD 1B D4 lda random + 8 9551 C9 01 cmp #IND_MISSILE________ ;floor + 9 9553 90 F9 bcc ?rand + 10 9555 C9 0F cmp #IND_HEAVY_ROLLER___+1 ;ceiling + 11 9557 B0 F5 bcs ?rand +Source: ai.asm + 884 9559 20 DA 94 jsr TryToPurchaseOnePiece + 885 955C C6 78 dec tempXroller + 886 955E D0 EE bne @- + 887 + 888 9560 60 rts + 889 .endp + 890 ;---------------------------------------------- + 891 9561 .proc PoolsharkPurchase + 892 ; first try to buy defensives + 893 ; mva #2 tempXroller; number of offensive purchases to perform + 894 9561 A6 6C ldx TankNr + 895 @ + 896 9563 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9563 ?rand + 7 9563 AD 1B D4 lda random + 8 9566 C9 21 cmp #IND_BATTERY________ ;floor + 9 9568 90 F9 bcc ?rand + 10 956A C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 956C B0 F5 bcs ?rand +Source: ai.asm + 897 956E 20 DA 94 jsr TryToPurchaseOnePiece + 898 9571 C6 78 dec tempXroller + 899 ; bpl @- + 900 + 901 ; and now offensives + 902 9573 A9 06 85 78 mva #6 tempXroller; number of purchases to perform + 903 ;ldx TankNr + 904 @ + 905 9577 randomize ind_Missile________ ind_Dirt_Charge____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9577 ?rand + 7 9577 AD 1B D4 lda random + 8 957A C9 01 cmp #IND_MISSILE________ ;floor + 9 957C 90 F9 bcc ?rand + 10 957E C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling + 11 9580 B0 F5 bcs ?rand +Source: ai.asm + 906 9582 20 DA 94 jsr TryToPurchaseOnePiece + 907 9585 C6 78 dec tempXroller + 908 9587 D0 EE bne @- + 909 + 910 9589 60 rts + 911 .endp + 912 ;---------------------------------------------- + 913 958A .proc TosserPurchase + 914 + 915 ; what is my money level + 916 958A A6 6C ldx TankNr + 917 958C BD 7E 43 lda MoneyH,x ; money / 256 + 918 958F 4A lsr ; /2 + 919 9590 85 78 sta tempXroller ; perform this many purchase attempts + 920 ; first try to buy defensives + 921 ; mva #1 tempXroller; number of defensive purchases to perform + 922 @ + 923 9592 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9592 ?rand + 7 9592 AD 1B D4 lda random + 8 9595 C9 21 cmp #IND_BATTERY________ ;floor + 9 9597 90 F9 bcc ?rand + 10 9599 C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 959B B0 F5 bcs ?rand +Source: ai.asm + 924 959D 20 DA 94 jsr TryToPurchaseOnePiece + 925 95A0 C6 78 dec tempXroller + 926 95A2 10 EE bpl @- + 927 + 928 ; and now offensives + 929 95A4 BD 7E 43 lda MoneyH,x ; money / 256 + 930 95A7 0A asl ;*2 + 931 95A8 85 78 sta tempXroller ; perform this many purchase attempts + 932 @ + 933 95AA randomize ind_Missile________ ind_Dirt_Charge____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95AA ?rand + 7 95AA AD 1B D4 lda random + 8 95AD C9 01 cmp #IND_MISSILE________ ;floor + 9 95AF 90 F9 bcc ?rand + 10 95B1 C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling + 11 95B3 B0 F5 bcs ?rand +Source: ai.asm + 934 95B5 20 DA 94 jsr TryToPurchaseOnePiece + 935 95B8 C6 78 dec tempXroller + 936 95BA 10 EE bpl @- + 937 + 938 95BC 60 rts + 939 .endp + 940 ;---------------------------------------------- + 941 95BD .proc CyborgPurchase + 942 + 943 ; what is my money level + 944 95BD A6 6C ldx TankNr + 945 95BF BD 7E 43 lda MoneyH,x ; money / 256 + 946 95C2 4A lsr ; /2 + 947 95C3 85 78 sta tempXroller ; perform this many purchase attempts + 948 ; first try to buy defensives + 949 ; mva #1 tempXroller; number of defensive purchases to perform + 950 @ + 951 95C5 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95C5 ?rand + 7 95C5 AD 1B D4 lda random + 8 95C8 C9 21 cmp #IND_BATTERY________ ;floor + 9 95CA 90 F9 bcc ?rand + 10 95CC C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 95CE B0 F5 bcs ?rand +Source: ai.asm + 952 95D0 20 C1 94 jsr TryToPurchaseOnePiece2 + 953 95D3 C6 78 dec tempXroller + 954 95D5 10 EE bpl @- + 955 + 956 ; and now offensives + 957 95D7 BD 7E 43 lda MoneyH,x ; money / 256 + 958 95DA 0A 0A 0A :3 asl ;*8 + 959 95DD 85 78 sta tempXroller ; perform this many purchase attempts + 960 @ + 961 95DF randomize first_offensive____ last_offensive_____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95DF ?rand + 7 95DF AD 1B D4 lda random + 8 95E2 C9 00 cmp #FIRST_OFFENSIVE____ ;floor + 9 95E4 90 F9 bcc ?rand + 10 95E6 C9 20 cmp #LAST_OFFENSIVE_____+1 ;ceiling + 11 95E8 B0 F5 bcs ?rand +Source: ai.asm + 962 95EA 20 C1 94 jsr TryToPurchaseOnePiece2 + 963 95ED C6 78 dec tempXroller + 964 95EF 10 EE bpl @- + 965 + 966 95F1 60 rts + 967 .endp + 968 ;---------------------------------------------- + 969 95F2 .proc ChooseBestOffensive + 970 ; choose the best weapon + 971 ; X - TankNr + 972 ;---------------------------------------------- + 973 95F2 A0 1E ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) + 974 95F4 NotFromAll + 975 ; Y - the last offensive weapon to use + 1 + 976 95F4 BD F1 5A lda TanksWeaponsTableL,x + 977 95F7 85 72 sta temp + 978 95F9 BD F7 5A lda TanksWeaponsTableH,x + 979 95FC 85 73 sta temp+1 + 980 95FE loop + 981 95FE 88 dey + 982 95FF B1 72 lda (temp),y + 983 9601 F0 FB beq loop + 984 9603 98 tya + 985 9604 9D F7 43 sta ActiveWeapon,x + 986 9607 60 rts + 987 .endp + 988 ;---------------------------------------------- + 989 9608 .proc GetDistance + 990 ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) + 991 ; result in A + 992 ;---------------------------------------------- + 993 9608 AC 31 44 ldy TargetTankNr + 994 960B BD 1F 44 lda LowResDistances,x + 995 960E D9 1F 44 cmp LowResDistances,y + 996 9611 B0 08 @ bcs YisLower + 997 9613 38 sec + 998 9614 B9 1F 44 lda LowResDistances,y + 999 9617 FD 1F 44 sbc LowResDistances,x + 1000 961A 60 rts + 1001 961B YisLower + 1002 961B BD 1F 44 lda LowResDistances,x + 1003 961E F9 1F 44 sbc LowResDistances,y + 1004 9621 60 rts + 1005 .endp + 354 ;---------------------------------------------- + 355 9622 icl 'artwork/talk.asm' +Source: talk.asm + 1 9622 .proc talk + 2 ; Maximum text length is 63 characters!!! + 3 9622 23 39 2B 21 00 22 + L0 dta d"CYKA BLAT" + 4 962B 24 29 25 01 L1 dta d"DIE!" + 5 962F 25 21 34 00 2D 39 + L2 dta d"EAT MY SHORTS!" + 6 963D 39 2F 35 07 32 25 + L3 dta d"YOU'RE TOAST!" + 7 964A 22 21 2E 3A 21 29 + L4 dta d"BANZAI!" + 8 9651 26 32 2F 2D 00 28 + L5 dta d"FROM HELL'S HEART I STAB AT THEE..." + 9 9674 29 00 24 29 24 2E + L6 dta d"I DIDN'T DO IT. NOBODY SAW ME DO IT." + 10 9698 34 21 2B 25 00 21 + L7 dta d"TAKE A HIKE!" + 11 96A4 39 2F 35 07 32 25 + L8 dta d"YOU'RE DEAD MEAT." + 12 96B5 2D 21 2B 25 00 2D + L9 dta d"MAKE MY DAY." + 13 96C1 23 28 21 32 27 25 + L10 dta d"CHARGE!" + 14 96C8 21 34 34 21 23 2B + L11 dta d"ATTACK!" + 15 96CF 39 2F 35 07 32 25 + L12 dta d"YOU'RE OUTTA HERE." + 16 96E1 37 21 34 34 33 21 + L13 dta d"WATTSA MATTA YOU?" + 17 96F2 26 32 25 25 3A 25 + L14 dta d"FREEZE, OR I'LL SHOOT!" + 18 9708 28 21 00 28 21 00 + L15 dta d"HA HA HA." + 19 9711 37 25 00 23 2F 2D + L16 dta d"WE COME IN PEACE - SHOOT TO KILL!" + 20 9732 29 2E 00 39 2F 35 + L17 dta d"IN YOUR FACE!" + 21 973F 24 29 25 00 23 2F + L18 dta d"DIE COMMIE PIG!" + 22 974E 29 00 2C 2F 36 25 + L19 dta d"I LOVE THE SMELL OF NAPALM IN THE MORNING." + 23 9778 36 29 23 34 2F 32 + L20 dta d"VICTORY!" + 24 9780 33 28 2F 37 00 33 + L21 dta d"SHOW SOME RESPECT." + 25 9792 2A 35 33 34 00 37 + L22 dta d"JUST WHO DO YOU THINK YOU ARE?" + 26 97B0 2C 2F 2F 2B 00 2F + L23 dta d"LOOK OUT BELOW!" + 27 97BF 2B 2E 2F 23 2B 0C + L24 dta d"KNOCK, KNOCK." + 28 97CC 2C 2F 2F 2B 00 2F + L25 dta d"LOOK OVER THERE." + 29 97DC 27 35 25 33 33 00 + L26 dta d"GUESS WHAT'S COMING FOR DINNER?" + 30 97FB 2D 25 32 32 39 00 + L27 dta d"MERRY CHRISTMAS." + 31 980B 2F 30 25 2E 00 37 + L28 dta d"OPEN WIDE!" + 32 9815 28 25 32 25 00 27 + L29 dta d"HERE GOES NOTHING..." + 33 9829 24 2F 2E 07 34 00 + L30 dta d"DON'T WORRY, IT ISN'T A LIVE ROUND." + 34 984C 22 2C 2F 2F 24 0C + L31 dta d"BLOOD, PAIN, VIOLENCE!" + 35 9862 34 21 2B 25 00 34 + L32 dta d"TAKE THIS, SISSY!" + 36 9873 29 00 33 28 21 2C + L33 dta d"I SHALL FLATTEN YOU!" + 37 9887 29 00 33 28 21 2C + L34 dta d"I SHALL SMASH YOUR UGLY TANK!" + 38 98A4 29 00 37 2F 2E 24 + L35 dta d"I WONDER WHAT THIS BUTTON DOES?" + 39 98C3 24 2F 2E 07 34 00 + L36 dta d"DON'T TAKE THIS PERSONALLY." + 40 98DE 37 2F 35 2C 24 00 + L37 dta d"WOULD THIS MAKE YOU MAD?" + 41 98F6 29 00 34 2F 2C 24 + L38 dta d"I TOLD YOU TO LEAVE MY SISTER ALONE!" + 42 991A 29 00 23 2F 35 2C + L39 dta d"I COULD SPARE YOU, BUT WHY?" + 43 9935 2D 39 00 22 2F 2D + L40 dta d"MY BOMB IS BIGGER THAN YOURS." + 44 9952 24 2F 2E 07 34 00 + L41 dta d"DON'T FORGET ABOUT ME!" + 45 9968 28 21 33 34 21 00 + L42 dta d"HASTA LA VISTA, BABY!" + 46 997D 34 28 29 33 00 29 + L43 dta d"THIS IS YOUR BRAIN ON SCORCH." + 47 999A 34 21 2B 25 00 34 + L44 dta d"TAKE THIS!" + 48 99A4 34 28 29 33 00 33 + L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." + 49 99D4 24 29 25 0C 00 21 + L46 dta d"DIE, ALIEN SWINE!" + 50 99E5 21 37 32 35 2B 01 + L47 dta d"AWRUK!!!" + 51 99ED 29 00 33 28 21 2C + L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD." + 52 9A13 24 29 25 0C 00 34 + L49 dta d"DIE, TANK-SCUM!" + 53 9A22 29 07 2D 00 27 2F + L50 dta d"I'M GONNA BREAK YOUR FACE!" + 54 9A3C 2D 21 2D 21 00 33 + L51 dta d"MAMA SAID KNOCK YOU OUT!" + 55 9A54 29 00 28 2F 30 25 + L52 dta d"I HOPE YOU ENJOY PAIN!" + 56 9A6A 28 2F 37 07 24 00 + L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son) + 57 ;-------------------------------- + 58 9A8E 30 21 32 34 29 2E + L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!" + 59 9AB2 35 27 28 01 L55 dta d"UGH!" + 60 9AB6 21 21 32 27 28 01 L56 dta d"AARGH!" + 61 9ABC 21 21 21 27 27 28 + L57 dta d"AAAGGHHH!" + 62 9AC5 29 07 2D 00 2D 25 + L58 dta d"I'M MELTING!" + 63 9AD1 2F 2F 26 0E 0E L59 dta d"OOF.." + 64 9AD6 2F 28 01 L60 dta d"OH!" + 65 9AD9 25 25 25 2B 01 L61 dta d"EEEK!" + 66 9ADE 21 21 23 23 28 01 L62 dta d"AACCH!" + 67 9AE4 29 00 28 21 34 25 + L63 dta d"I HATE IT WHEN THAT HAPPENS." + 68 9B00 2F 2E 25 00 24 29 + L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." + 69 9B27 2F 28 00 2E 2F 01 L65 dta d"OH NO!" + 70 9B2D 2E 2F 34 00 2D 25 + L66 dta d"NOT ME!" + 71 9B34 2F 35 23 28 0E L67 dta d"OUCH." + 72 9B39 2F 28 00 2E 2F 0C + L68 dta d"OH NO, NOT AGAIN." + 73 9B4A 21 2E 2F 34 28 25 + L69 dta d"ANOTHER ONE BITES THE DUST." + 74 9B65 27 2F 2F 24 22 39 + L70 dta d"GOODBYE." + 75 9B6D 28 25 2C 30 00 2D + L71 dta d"HELP ME!" + 76 9B75 26 21 32 25 37 25 + L72 dta d"FAREWELL, CRUEL WORLD." + 77 9B8B 32 25 2D 25 2D 22 + L73 dta d"REMEMBER THE ALAMO!" + 78 9B9E 2F 28 00 2D 21 2E + L74 dta d"OH MAN!" + 79 9BA5 24 2F 2F 35 27 28 + L75 dta d"DOOUGH!" + 80 9BAC 21 2E 2F 34 28 25 + L76 dta d"ANOTHER DAY, ANOTHER BOMB." + 81 9BC6 34 28 29 33 00 29 + L77 dta d"THIS IS THE END, MY ONLY FRIEND." + 82 9BE6 36 25 32 39 00 26 + L78 dta d"VERY FUNNY." + 83 9BF1 34 28 25 00 26 21 + L79 dta d"THE FAT LADY SANG." + 84 9C03 37 28 39 00 24 2F + L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?" + 85 9C24 29 07 2D 00 27 2F + L81 dta d"I'M GOING DOWN." + 86 9C33 29 07 36 25 00 27 + L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS." + 87 9C55 23 32 21 30 2F 2C + L83 dta d"CRAPOLA." + 88 9C5D 30 2F 37 01 L84 dta d"POW!" + 89 9C61 22 29 26 01 L85 dta d"BIF!" + 90 9C65 22 21 2D 01 L86 dta d"BAM!" + 91 9C69 3A 2F 2E 2B 01 L87 dta d"ZONK!" + 92 9C6E 29 00 33 28 2F 35 + L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." + 93 9C92 29 00 37 21 2C 2B + L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." + 94 9CBC 37 28 21 34 00 37 + L90 dta d"WHAT WAS THAT NOISE?" + 95 9CD0 2D 21 2D 21 00 33 + L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." + 96 9CF4 29 34 33 00 2A 35 + L92 dta d"ITS JUST ONE OF THOSE DAYS..." + 97 9D11 29 00 33 25 25 00 + L93 dta d"I SEE A BRIGHT LIGHT..." + 98 9D28 2D 2F 2D 2D 39 1F + L94 dta d"MOMMY? IS THAT YOU?" + 99 9D3B 29 00 2C 25 34 00 + L95 dta d"I LET YOU HIT ME!" + 100 9D4C 33 35 23 2B 25 32 + L96 dta d"SUCKER SHOT!" + 101 9D58 29 00 24 29 24 2E + L97 dta d"I DIDN'T WANT TO LIVE ANYWAY." + 102 9D75 0D 1C 33 2F 22 1E + L98 dta d"--" + 103 9D7C 37 21 33 00 34 28 + L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?" + 104 9DA0 2A 2F 29 2E 00 34 + L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." + 105 9DC7 29 34 00 37 21 33 + L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" + 106 9DF0 29 00 24 29 24 2E + L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" + 107 9E0E 29 00 34 28 2F 35 + L103 dta d"I THOUGHT YOU LIKED ME?" + 108 9E25 23 34 2F 00 38 39 + L104 dta d"CTO XYEB" + 109 9E2D 29 00 34 28 29 2E + L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY." + 110 9E4F 33 2F 2D 25 28 2F + L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." + 111 9E79 28 25 39 01 00 2B + L107 dta d"HEY! KILLIN' AIN'T COOL." + 112 9E91 27 25 25 0E 0E 0E + L108 dta d"GEE... THANKS." + 113 9E9F 29 07 36 25 00 26 + L109 dta d"I'VE FALLEN AND I CAN'T GET UP!" + 114 9EBE 19 11 11 1F L110 dta d"911?" + 115 9EC2 2F 28 00 2E 2F 01 + L111 dta d"OH NO! HERE I BLOW AGAIN!" + 116 9EDB 29 07 2C 2C 00 22 + L112 dta d"I'LL BE BACK..." + 117 9EEA 28 25 39 00 0D 00 + L113 dta d"HEY - I'VE GOT LAWYERS." + 118 9F01 34 29 2D 25 00 34 + L114 dta d"TIME TO CALL 1-900-SUE-TANK." + 119 9F1D 39 2F 35 00 22 29 + L115 dta d"YOU BIG DUMMY!" ;(sanford and son) + 120 9F2B LEND + 121 9F2B OffensiveTextTableL + 122 9F2B 22 2B 2F 3D 4A 51 + dta L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53 + 127 9FD6 9A 9A 9A 9A 9A 9A + dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115 + 128 A014 9F dta >LEND + 129 = 0036 NumberOfOffensiveTexts=54 + 130 = 003E NumberOfDeffensiveTexts=62 + 131 .endp + 132 A015 2D 39 00 28 2F 36 + hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!" + 133 A033 hoverFullEnd + 134 A033 32 35 2E 2E 29 2E + hoverEmpty dta d"RUNNING OUT OF EELS" + 135 A046 hoverEmptyEnd + 356 ;---------------------------------------------- + 357 A046 TankFont + 358 A046 00 00 00 00 00 00 + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only + 359 ;---------------------------------------------- + 360 A1C6 font4x4 + 361 A1C6 FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62 + 362 ;------------------------------------------------- + 363 A246 .proc CheckTankCheat + 364 A246 A0 07 ldy #$07 + 365 A248 A5 6C lda TankNr + 366 A24A 0A asl + 367 A24B 0A asl + 368 A24C 0A asl ; 8 chars per name + 369 A24D AA tax + 370 @ + 371 A24E B9 73 A2 lda CheatName,y + 372 A251 38 sec + 373 A252 FD 09 41 sbc tanksnames,x + 374 A255 C9 27 cmp #$27 + 375 A257 D0 19 bne NoCheat + 376 A259 E8 inx + 377 A25A 88 dey + 378 A25B 10 F1 bpl @- + 379 A25D YesCheat + 380 A25D A6 6C ldx TankNr + 381 A25F BD F1 5A lda TanksWeaponsTableL,x + 382 A262 85 72 sta temp + 383 A264 BD F7 5A lda TanksWeaponsTableH,x + 384 A267 85 73 sta temp+1 + 385 A269 A9 63 lda #99 + 386 A26B C8 @ iny + 387 A26C 91 72 sta (temp),y + 388 A26E C0 2F cpy #(number_of_weapons - 1) + 389 A270 D0 F9 bne @- + 390 A272 NoCheat + 391 A272 60 rts + 392 .endp + 393 A273 CheatName + 394 A273 27 27 27 37 37 3F + dta d" 008.T"+$27 + 395 ;---------------------------------------------- + 396 A27B .proc DLIinterruptBFG + 397 A27B 48 pha + 398 A27C A5 9A lda dliCounter + 399 A27E D0 18 bne EndofBFGDLI + 400 A280 AD BC A2 lda dliColorsFore + 401 A283 2C 1B D4 bit random + 402 A286 30 02 bmi @+ + 403 A288 A5 58 lda DliColorBack + 404 A28A 85 02 @ sta COLPF2 + 405 A28C AD BC A2 lda dliColorsFore + 406 A28F 2C 1B D4 bit random + 407 A292 30 02 bmi @+ + 408 A294 A5 58 lda DliColorBack + 409 A296 85 02 @ sta COLPF1 + 410 A298 EndofBFGDLI + 411 A298 E6 9A inc dliCounter + 412 A29A 68 pla + 413 A29B 40 rti + 414 .endp + 415 ; ------------------------ + 416 A29C .proc BFGblink + 417 ; SetDLI DLIinterruptBFG ; blinking on + 418 A29C A0 32 ldy #50 + 419 A29E 20 9D 5A jsr PauseYFrames + 420 ; SetDLI DLIinterruptGraph ; blinking off + 421 A2A1 60 rts + 422 .endp + 423 ;---------------------------------------------- + 424 A2A2 icl 'constants_top.asm' +Source: constants_top.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 + 6 A2A2 04 03 01 05 00 02 TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 + 7 A2A8 dliColorsBack + 8 A2A8 02 00 02 00 02 00 + :10 .by $02,$00 + 9 A2BC dliColorsFore + 10 A2BC 0A .by $0a ; one mountains color + 11 ; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array + 12 ; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05 + 13 A2BD 0E 0C 0C 0C 0C 0A + .by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new + 14 A2C7 08 08 08 06 06 06 + .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 + 15 A2D1 CashOptionL ;(one zero less than on the screen) + 16 A2D1 00 C8 20 B0 D0 .by 0,<200,<800,<1200,<2000 + 17 A2D6 CashOptionH + 18 A2D6 00 00 03 04 07 .by 0,>200,>800,>1200,>2000 + 19 A2DB 0A 14 19 1E 28 GravityTable .by 10,20,25,30,40 + 20 A2E0 05 14 28 46 63 MaxWindTable .by 5,20,40,70,99 + 21 A2E5 0A 14 1E 28 32 RoundsTable .by 10,20,30,40,50 + 22 A2EA 77 01 D6 01 76 02 + AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity + 23 A2F4 FF 96 4B 23 01 flyDelayTable .by 255,150,75,35,1 + 24 A2F9 FF 2D 19 0F 09 seppukuTable .by 255, 45,25,15,9 + 25 .endif + 425 ;---------------------------------------------- + 426 A2FE NMI + 427 A2FE EE 20 D0 INC $D020 ; change border colour, indication for a NMI + 428 A301 40 RTI ; exit interrupt + 429 ; (not acknowledged!) + 430 diff --git a/scorchC64.prg b/scorchC64.prg index ae26d50655259b73b0b5b8de3a16270621bfd630..1fba9cd494c988291fb05ad211f524dfa286cffa 100644 GIT binary patch delta 5600 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 Rd9;vujTZLy;eBta{~uEG!&m?S delta 5574 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 Date: Tue, 9 May 2023 21:18:53 +0200 Subject: [PATCH 21/65] C64 wall type indicator --- C64/gr_basics.asm | 2 ++ scorchC64.prg | Bin 39683 -> 39690 bytes 2 files changed, 2 insertions(+) diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index e1e8846..5c29ac6 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -219,6 +219,8 @@ next8lines ;-------------------------------------------------- .proc SetMainScreen lda #$b ; Grey background and border + lda WallsType + :4 rol sta $d020 sta $d021 diff --git a/scorchC64.prg b/scorchC64.prg index 1fba9cd494c988291fb05ad211f524dfa286cffa..f866a76bb74b53bc92a20c31c5665ae7faa0c78d 100644 GIT binary patch delta 2354 zcmZux4Ny~87S2rq0s#Th0a5URxQZewItsK}!;9UlK4clCigqPfYl|}F*960F5*|cC zNZ>-<>Hu!^2@j!5Cyq9*(QaAM=b~o2PHflprwaaz)<(BoWLF;}s%m_6-@#&3|^wf{gA$;xO#lzlkE zCJ_$|*p2HBO-T9L)?Q0FuG!kFsC&boy1ws~%N@6D%+203x#O#VUu5oAvG`z;AOj_nFdw2KN-DZthQ>fKwE44ut;S~n0SxdCt+TUxBX`R|XY0s4Z zx%@BX@fDJaCXJ+0#rZKE_#m+qM4=(lS1?`Lr@@!Wg@UNCE(0WIA~%ug#~~KZhv}d% zk>>@oq#+i3iTt9FMqQ+&FfJp^0x+4N=VSmKsvP{xWrpnDW^En`)>%|sG}F&XAxg^b zWH$GHER)+W9^Cp$62a!?DVSWV_|7W{xl=d?rI6sFC|Ktgg~O><70p6nWM>hJsz_*Y zPIzAxH-+hUjS7xkkGW8Y8fKvhsW09R8Glq99u;Q!G+EIQk6e?JovDiZ()Lt^Gfi<{ z)SjlGQ%P*eGNdM(N*0Iqlz-TBKIGQL6h&W(Vxfc%A{`}*A=XzViv*YVs=;{&Hv_`> zd3Vdbq2O{H?IANu<4`V9mfBGo`FH85iKZqV)u;A26WFk-0+tH9cTQduxxum*mN@$m!74t7$5;|MQj|zmaWeL@HYxp47d@S3+ zy<~>*7w_Rco1lsDuo_R=5x3>n5}av@%L$QSiHY-tb6uhTrRST#`lyb#0Qp|W_W~Kz z$G^o-^knhDz?{+XzCbqW`3XS$^?VEvk%3PD(xvBT0U6QrD}X%F&!p>WSaEzXAMBBJ zgMYDOlZu|9W5r$*IMaT*j+E@48?(N~`G9J_K{-dL_HQT}*l(zaya3o+FTJ=y(M{yk z?)YizYrscGGU)DmRT2PRzd~{ZgEl(pgvE2)HHCYbE|Qx?a?Tg>0SuCxksKFof^fnmnEkM4_w!S&68ajE zm207u>&gp}9~mvbhYaLqMGksIR#yH7{gZT5&X-+b*xN1%F4{%+5O-x(L{>d`xgEDR zL_$BUV^2dap4JI_LRHQ7dtS%S@(4_E)e`g->8jd@bS>5CaK5$G^I@&1)*~xb0@q5XQ6`G$__E_u@{(a5acvA5veX!Dl^hDlBQdNjuMS-u2^Oy zp2}$ZA9d3Z(vfTWaQwuA>1N#7tU8?Ev`AqS)#caaJY1yk#5!%1CkiXcWW&5=N|VZ2 zy_pe12dTIOc#&?HCvjUA2H>+TSOe42hqiqBhJ#)5%N2RAM*C zWnTi2;c!(xC&9qsbpvEf~Yhzt!{kPJ`=iy)*-+`x&#F| zUOOLo$Vlz->4|1e0`JTQrNs$5g#LyuFK(jOGGyb3%pCwm}iHj4O88??;9#(S5Jfh@In(rt%vH7m@a6Vp@jmO$lJBqdX zhL(M{Ns+Phl2X%FW11xI$@T*uoz3)BD=FL)Gs(+vA}GUn>hTyE+OuFr@W;GwzYjG3 zD5VmDb~gVvCbD5c;{U;Hd+q0d6hCWY55aq6S$L*6m}nZh10UPqxbK(3NgYqfJd;uy z)QTD6-xxike@X=F&hz09^k*<`x|}4l?)yHBd(aJoUJaPH8>0iP{)6s8wI_uBoc!Gs zFI`T&wh5s@tzKKkedj0i?9kP%$?PHUaR{bAJLrZ1TGbd6(`A6N1@xRh@BF+~={(-5 zR1LPSZ2O?i3jYB7R`NyTR5VKd)>ts-+g2!NnNS)8r3vo;5r5k{Smt^JWfz1oAe<`* zNs&2h`fHW5idsEx^%LNLIee)A2oY@m7jVw20(n3{z__Uhd}Hu^&ij?$2uL9OCh+)8 z2yj6eEr^lF@*Hqu)3w7aky;DuV|7huT{_e)>WWrswGpWdvljQf$lC5s-)rqjL~1hnXQ^_v0^kqE+j;wD`YGo3?&e+?SZRL)ll`n#hK2r zyp|KS{-_N3(x;DplB2{eCOmils9A}<$~rPQ5pxSyWwHH^#dsA-+5QZzCrOEQXuWkT z(JT@7^;xUl>u`>W0@7Aqf)owtAAtx)vdGBbC&Hz|7Wn2jE)Zl$94zS*c& zbgLA-lV)SCvO7-EJ8dTWb_Jocq;gjh+HC!LmyZ;cTc0Fv5hF8Mof?PC*22_s8QM%x z`V}-t2GXzkhM#7vw)WG^#}9=u+ZJwZJGfO!o*YgrsWx?H*rt>o=WJ??+O|cbrq5`) zH6LmEG@of^G(T!C<|XCt%CFE=XwtQr+FY%y(5J9aTcI^*&uF`}f7D*o+O(GnJ}($5 z2rhh4P^o!QNONvX8~)JTd47l!jb%6_t!Cwr&-1zw70r1v7S4rfqXvpNU&dm8#;NCn zM9Q?;A9IUAFe!*}rv_iw;K{?A+5H_oesRnnI4`CxhP^iK!d$b62e0GyGDxmB=M7kQ zlhff1m;03!8PUjwLc1W<+L<=#6=r}q* zhD{j{W>Ua?>a4_{O-WZVDfQw9vl8++bLpDse1CQ?$oGOgjZNc4b}74;ziM%vwc`Ak zHkwUg^4L@+pWVykvT2M44-o2TDDom%M_HsH{#nUyb`}HDVxMwu`>Au=UM9*w>azCF zKU*NgmcEMJ6RYx17khZX2E53e>;SZq$g|g=BP1nzrSI8-1LuZ({`I$56~Ide1 zS3;bT>?jQG?v{Y#HZBkXxjDHFf)^8{fTPCAvYZgKlO*O?(K;eIcFDWE4$|e)o`!SY zry^UpJY7Ugxfm=gxoT8SrgQhB0V}NuMPWtm)yk>(IS^R z*0;#Tb_vz4XT|(WVBXd7QvxB~c@gLi8Og&X@wFkzJ`((*hLgc!zNDV%`8t5~=y(&5 zhdRC+NWWgbk@t2a@pEBvNyp28yrbt`fr#~d5Rhp-9|5FY&xZmT)$_jw@<>mWl(J&^ zTz;;@vkTmddw0^5zm63aHLd4fGN;5;3DM>+3rZ-pJyN#bR@&|>TSt@>Oh=Ud=^nt> z-^K4iP1 zjv1GNn3vWI2D1>dL%XCzaQI6G{^?Ewi^Xa1U&xzG8(dI6(C!LWQ%Z+qW=aVHY&ALV z*;jG1Y7wXdL2Z|e{!H!1y-W}(j3NamgB-&IDU8TpfsgJKmISF`P65xJ;^)I6hsnGG zEnFRAK_)_Err;qeB;OP!qi@KTqTT3w!WKn(+8OqqU4oAuqt24Ai<11eSAv&&At!t! z)YA&K-!2e=C-KE$ZqF z5nK(vbm;G~(Me=u1Do3!*taL2G z3KCEjzD7|?+e&sZVrb$t7Xkg?26V-cJu5u$r;RwXmJ>PLu+GVqGACduduT(H3d=}Q z*%IVO&Xn!+{4;WE>sJYBnl z(lo#n5+^9grSeELPQEMOurSQXNuZj{P$)R!Agl~m@5G1dD3t*m#WCHGtO+JLAgs<= zaQlT<=bUhsW_}(tw`vnUL^3KCK`*GOsDdQFQAyl7Oh$JVjjiN-Ww6VXN!|OL{G(DH zvao(b{q_2~hEEz?8sBSlsqYE62}L{2ds}{x&vf;^0tQzFqe&81wFZ4cimKlCm}tgt zH(mR4WWc+xy?L2!8V+D-8|j%=*{z!k794b)9?x;l8C zljlT`(N|f-6XfsJ%LCnx^D>Kzv&Lz`cT2ShF+NcDJ|fYzYN@OV7ZV@DV)9|Fw{H%KVTa*e86F&lcOn-w35LZU z_3neigSieL>H@h}E0?Y&PKyX%S(86IoDS#*KcT~Xl}#~h2l(iK$AcXlhR(_ug4VS| zQ=~o44Gq~YG^uTtCNAq&DF5H6b)akeTx=_AAkMLb8;ts i{#idiLBuGV>^K=Ur_US_aC3#2-NA@^`pEH Date: Thu, 11 May 2023 00:38:40 +0200 Subject: [PATCH 22/65] Sort bugfix #161 and optimization --- game.asm | 21 ++++----------------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56609 -> 56589 bytes 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/game.asm b/game.asm index 75b3cf9..5836e27 100644 --- a/game.asm +++ b/game.asm @@ -1062,15 +1062,6 @@ SequenceStart cpx #MaxPlayers bne SequenceStart -; we will need a TempResults (TR) table to fiddle with - ldx #0 -movetotemp - lda ResultsTable,x - sta TempResults,x - inx - cpx NumberOfPlayers - bne movetotemp - ; i=0:sortflag=0 ;loop: ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers @@ -1094,8 +1085,10 @@ Bubble stx temp2 ; sortflag=temp2 BubbleBobble - lda TempResults,x - cmp TempResults+1,x + ldy TankSequence,x + lda ResultsTable,y + ldy TankSequence+1,x + cmp ResultsTable,y bcc nextishigher bne swapvalues nextisequal @@ -1110,12 +1103,6 @@ nextisequal ;here we must swap values ;because next is smaller than previous swapvalues - sta temp - lda TempResults+1,x - sta TempResults,x - lda temp - sta TempResults+1,x - ; lda TankSequence,x sta temp lda TankSequence+1,x diff --git a/scorch.bin b/scorch.bin index 32b25cb7dc165f8cbd31248cc6c18793c797017d..86543025a99fc39781dc32c7fae63feed895fbf3 100644 GIT binary patch delta 7542 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 Nvr?UP{ByHA_x}l`{CfZZ delta 7230 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 D1Kn1< From d36d5d31312be68c2b62069c49e2cd7b2405321a Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 11 May 2023 10:52:34 +0200 Subject: [PATCH 23/65] Sort money --- game.asm | 16 ++++++++++++++++ scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56589 -> 56621 bytes 3 files changed, 16 insertions(+) diff --git a/game.asm b/game.asm index 5836e27..1361c94 100644 --- a/game.asm +++ b/game.asm @@ -1097,6 +1097,22 @@ nextisequal lda DirectHits,y ldy TankSequence+1,x cmp DirectHits,y + bcc nextishigher + bne swapvalues +nextisequal2 + ; if results are equal, check money (H) + ldy TankSequence,x + lda moneyH,y + ldy TankSequence+1,x + cmp moneyH,y + bcc nextishigher + bne swapvalues +nextisequal2b + ; if results are equal, check money (L) + ldy TankSequence,x + lda moneyL,y + ldy TankSequence+1,x + cmp moneyL,y ; beq nextishigher ; this is to block hangs when 2 equal values meet bcc nextishigher diff --git a/scorch.bin b/scorch.bin index 86543025a99fc39781dc32c7fae63feed895fbf3..128c8597703c71acc190ec3bdf83cac3fa394851 100644 GIT binary patch delta 7262 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 delta 7247 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 Date: Thu, 11 May 2023 14:59:58 +0200 Subject: [PATCH 24/65] AI symbols on GameOver screen --- Atari/textproc.asm | 13 ++++++++++++- artwork/talk.asm | 4 ++-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56621 -> 56629 bytes 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Atari/textproc.asm b/Atari/textproc.asm index f1ecb58..748e01a 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -1853,8 +1853,19 @@ NextChar adw temp #19 displayposition jsr displaydec5 mva #0 displayposition ; overwrite first digit + ; put AI symbol + ldx TankNr + lda SkillTable,x + beq NotAItank + tay + lda digits,y + ldy #39 + sta (temp),y ; and last zero + dey + lda #$5e ; Computer symbol + sta (temp),y ; and last zero +NotAItank ; put earned money on the screen - ldx TankNr lda EarnedMoneyL,x sta decimal lda EarnedMoneyH,x diff --git a/artwork/talk.asm b/artwork/talk.asm index 7eb46ab..6b17f19 100644 --- a/artwork/talk.asm +++ b/artwork/talk.asm @@ -89,7 +89,7 @@ L84 dta d"POW!" L85 dta d"BIF!" L86 dta d"BAM!" L87 dta d"ZONK!" -L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." +L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER." L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." L90 dta d"WHAT WAS THAT NOISE?" L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." @@ -115,7 +115,7 @@ L110 dta d"911?" L111 dta d"OH NO! HERE I BLOW AGAIN!" L112 dta d"I'LL BE BACK..." L113 dta d"HEY - I'VE GOT LAWYERS." -L114 dta d"TIME TO CALL 1-900-SUE-TANK." +L114 dta d"CALL 1-900-SUE-TANK." L115 dta d"YOU BIG DUMMY!" ;(sanford and son) LEND OffensiveTextTableL diff --git a/scorch.bin b/scorch.bin index 128c8597703c71acc190ec3bdf83cac3fa394851..078a529b5de9b5a4c62e654d941686c12dd8ac01 100644 GIT binary patch delta 4753 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 T_Okmmr#t37VCvUoA9np0F;@e{ delta 4850 zcmZ`+3tSXO(%;!#1eS$a2q+*d4FP3U9`X=;;)5WMQ4lp^d<~#yU_D-n=ErjZ2Z4wp zjflt!B7+PD1@Urc?lzY@6~Ez2%$}YabBT#~5;+rHVhqur;?>N8Ci(I${JN*BtE#K3 zs;mF4(@AwYX}6~h5rn;LT8OXkd7Dp&JNST-vb$7(?2AxdE?SUwxz*xq(&Qe!@~H@>~A-w;NctPBmLNrslz_Nz>2Fspr=K}j;&PM9*vC~7(Pg83X> z%;N~Aqg`v*wwkd+57Q0FN|PIMJJha4u3AK|VBL9zQHBC=x9!CA#y#wH6G3wlQ4oY` zN#4uk$Rm@2pKf$P4-bG^bU|!y)^ZYkE$Mw-^%weqHHn7nLE)`1646y{T2X^_9{Zt5 zjY^8pP%f)w3c>1ftszn{S&0MfTnTF&XO}hEI`6$V9bta^ZY>JUVYf3{7@HN~>vpq= zN~|I)C)~^D2vmui$>-L03OLW|$seIhm{on`G9?FiIoPBgNwQJeHu&Pu`-x}@F0!9Y zNO~LXClbV^-X4chYr-CPyJ@UIUJAarf^WNdyMf2Y-3?9#6VbB-eUf9pY6K1Tdb(#5 z(q~6-ojMm(C_I9sgtB+O=SCTfn!FE5iB23cb&<`(Jd-D9gI*+Z{QvjQ|;@gHRG%F_hr1z_ywpxIPPm%nhZd=h068uo(tM*9; z*FY>G&XL>uRp-$DMB^E-pjlWe1BXugD^Z0XPm3ayc;56>;$&~j^gj|r5>E09BKF{S z{az>jf=~PT6Snx4Upz4l`}_M4EAc95cj7#MFXAxP`>UOQ%1DT22W&l55Z{x9?1#oM zHZ?F9eTlF72f6%|0klD#Q94+{mR#Ipl(V{vhwFBraBAjlh)XzZBn1Ro2oNDE zc6Xp>`R!U7vY>)>(-1~EEK?yY1*g+5yM;iXB|@0Q5!MDxUJY(dF-rSV`%?O{jl-Ob z$re04MjE8SyU8$dpR*JvUJ@RSaSj6KVCqZqcV<5PuOJlgYc--H=^A~JG+#l=-ZBMWVwEqy>;owOQ2coFfqB_x6f$6tqNodiK%W}Em=6U3)HbO~`D_lE|lzRCjSG?UDvFsb6w%2|PvhIaxH2%z0$(;{J0 z4ip~9rV{bWS!r&jLZdrGpaY#RY?1V2GbugUV9kMSh}C)g*{ncf5L<`E5Fg-`VPV7} z{BBq{F&SS7TTC?fT81wn2oD@L`=9o^+nFHZT zrb(Z^gQw4(NtEFYb7xL0%kQf(en*d22DXQ}fuL@*&7C>9EMFX@zYRgG;p9vYmt?LP zs0^FtdfMH~HYVJ!iq_DJQ%x z!bg!(kDM5|0nk^tDk4hyLlwRf@p}B0df>JZ*f<-IaA5knjnxp90rnWA#MOElPRwc8 ztsWKY!dZIA%bbW~6la!Bi)82;$agaZM=tawit+Cky1NwXI44F=voy1dO=jLme4(k?&LBagf;$VAI>D!(C zs)5UwNe~W{Q7iGY#c0bHyErARrQjw)E9X2!g`5IhK`@<=dFsruW2Vl0dA2**&Wopw z{}#8#%{SZVzXz<<3-U%Q@ykpHFLqF~aLE#H;skDAqMvlWuxl6&$>s0K%flpm+I|mL zFjaxyicElPJ{cJc?T?XOOTRn_F|labi~{3n@WCr$q3mDOhNxJQj`$ zr>nLi1xOMp9L39c(;Emh>fQ)hd6_}m;y;o=L<8du^GV}mU>C}$P(-su_yBjcB)eVv zHlyta|3nF~(9_~(B;&p?Z(Ur8MklakRJ65Vsc||QDZoilOQp~qi*kaL{A1Kvs65-2 zrWQXGZakym#oIv_QAK^chjr1AJZZA&0QK^7OW&f>Dp*&Tv|3gL zb~RET<7?5=JRA2IbfkU86*Y649H{!eAj$Bx`U)X!ze~m+_(pn=)+-dNSu-Z zl|xfDi7SaqoKkm-)m znR~I!S6S_=6vF|bfU!ndtx*El608OXGL7h+L>4v)#(Lwd*hv6TD`HcGlJ#wDCb1f? zkGn@0@f*|{>%na^kSb7y=307ID6_W(6nR_ygqQLX#HlmQ`csWX1_HD`m}RaJ4vfA`}#-$)Rk}iwvRM<39l-5R9}li zabcqGy82pr{M|%zGvG4vg?E$phCl^!X+#%mIf=;%eSTQ@(lPa5?gn~qABi?Kvd7_Y zv2AeX;Dtq_v%7e8jeJOHlmgN_2DnDgWz?>8jeC^WF1(a-0r6ZsRueq7Z8n#;sDVU= zn_#^Njc%PH2XmpGi4%%0#eI!{Pu6dzRCt^V)VWx267)C^m#y?HhTB%S_Tg&KL)qmW zjfmR|py32OH1f=E4=|)OoIN(A1fU_9fzEFi%b{rsKVtHNLKyL?@ZF(#xha*OV0v9F zM|E}71w2-HEIWj%Gl0daBTfiqeuj*ys{{19E&gYbG<1+WVYD!`l6*+F&1fs!6{8&_ zwHU{*f@d1muJUx#)d9xQbFFajh4Kyc6y9+c4pN6Pw-P-@@$FTSplHhK>5h_Y%2?O05?o+6R;?s>%j((jpw$c#M^BN$5+a18bO%KZWAJfD zB72N?Fv-A$us9$WK2H6RzfD9N8F!dXe~PH}oVJtwcUsg>da%v!QJQVb}XKHA`w0qVe;Q zgak-%`tQ7o^LJO&AMgBR__>{{r|+D&^lFA4e6ww77!FRf32>(y7u^oeV6||GHT%w5xc%{@2U4c`0($S z?mKCgrI*yPJ(sUNK`~p4$~&(7=ch@NLzcX?bGLr{cNAN1wZ+a`l{U>SFMl{-s~e8l zs>18GD)8p5_Psl|R!Olj-ReyGDH(AZpZ+ETj!hFj($>Uf0ZazYsbQz_kzpU_9Oi6efQjR&pr2S z_kWu^MJGE&=Jnf%;r2JTNyNk=ym5z-xQmJS%fuk=i(ln(H3Ru%p}i?+MG_LF;?M+d zsX7aNnSrWO&>&u$5UFWMSFBiVZ0@zpC2fwD3eqM*$tArq8yZY9?zA|Ql&TS?tRlsj zRm=$WPt=#j5R}QNvWPZldxYpwf+fb;=7S>3jVk1?Lf&heovyOpRuP()PG7eXN=3mN zmQIp-2d!Ag2&gjDxQ{2pHz&)eQCUhzHo)e_BAb*AwR$4264(k2>bX{e8G)gM47@J; zNO{kRL_X!P$IZDU+F#V5;zdkIqtDuWkv-&yD| zl+F;S65rZ6>@=9c_-hk|=qes~_uQNr$-v8iSq#WYjgof47lX>zAv>ME_T}4dHW!`4 z@Y`;R;I%jT78u*V+BJ_LuC{w7-Ebm&@X(&=oLC`e)GzVWwBLDy@18jh+yw_iXVw_r zcI%ZrMuY7MX=;L)ivN}VK8RSKAr}(z_TsEK5sYj(okF4&AKM#2Ji*`Z^?`OQ6$b4B zDi_+1saf-$q%m5mjd_!5XR@g;K>HgCAThrpp@ZwdZ=)fUlYmliXugklFatDHw(-V4SKh;aX4J{-aVIIeu!%2-d?F;suo&YBYk3)Q{ z+TAPbK)cpi+hG60+)gRDcHhT@9xDr$6LNgCAdYBjA6wW#5HYyBD4fvYAB(0C-Pn8o zE5szca{p>#7Cy8;h<=L7v9#FNlSo_>N#7dhCxa+Bok^dy&ZXnRW+A6C z98o;ei%0}wf3{WFpF`(#@3V^O?CyM+W%J1Y3 zh^YdF9^Wr^7jH~NChV*Yf8}(hoIY`G4hX0?kSV9z?j%x5x*f(bFm8TCQnAgC zNp2GF)cTJuN&Ll(Go}is3D(92iF_&B7kej`me{31GH_`zU?(+wG=zZQShbrw zWAjg>bvhjMX*w9iBc7mQ8Amw9Q~a%d3K5N6N){7K@TwBkL~b1`vO2&z$Zu|$NFm2p zN_?H{f;j&?ELlSIVL1+$-Aw}FN-BnmrQ-Ol({Pykf8GZo5YW?1+t^wG9jnjOs}&H! zINtkdrqu_$Z9;vSwSrbP72B!?ZS-nzOdnoe8U{5zwe)r3Z@8;;E>VY{l*)-99RA@F zqN_dS!#@&41nwyNY`oD(wOJ+~rP}XuZL-CPYszUMk&c&D1QQGJyA{)f;yt*sVkV)* z7b|8?)Ta07tlul26#}}I`W!vM<11%P)~54==pEog9V4b%nL&GnKw7-D(%)q$-I7mI zg%E<25qaSQmFa{DORJ_5r`u;$T_e`Iz@1ch#`R4`aY4W1;{x>Tc zM^^_C0a#P*JzJzf(=<@?mp5!b(%dMcjEpm7kkc0jB-BL+n@h-VKU@qhj0<%f9VlZY zltB@M`>KPa2g*6Y2vrPMm!uwcF5l ztCXGEXjhsSu%0n&_m~5>h$$^ulT&mrqEcK9|B5Iq(1igUz zGhf7n)OK*yUy35p;LaV5^uMjq^w-_T&Fkso@;hHc0!gKK>=B>!Hz^dn`kVm#`Q0kZ zLee@JHsA^?UsidT0k^i3+Njz=sd~YHZ&BbIgOay_;F+;_-K@NBN+>4jM|?$I7!~p{>u7ZbAO-m60`mvzx)OkuqkViv$u71!p}R>aZHwX$1?)I$ z7z_ZR-A2c@aF;1yF+h5QNr9W!h|tB7z%8&@MhWA9ZgF+}x+1xVJpdbp6tV}cn?#Cj zg=`ZH=NGYhs}sHT^$}_-u!JmTU2HKdXZ+U+SqJDY7qVlZ%PM63q5GhSoerIM5gP>E z#v*nRbO}Z5La33d%^*PWFC1Z)GA95uas7*Vn3O{%0gG7oGRtp?dky3Pa^vKkF!RiU-;(DM&&xBv%!2ht zy#UBG9rb-xUT(W>^dboqtOMf^XKjcxU@T5S0rdt|g;uVk;XI(%96WN= zotS{#O|ej>(o9K2HvZ0Zm-r9Y$6IDIyOV$q~_Ddu#kL_LC?15>a((=m}DiO*hm>O&hDiD zlXu+0zf-;ZVmzrSlnBR5ntl&$Qd6$br5yjz^hd%K%bPQaNBC58kXVwb$irVXdk6v0 zJ!zilE6Hr}1*oUUI|%=vI^4O;-{BJHP?;nXN45k^l4^kE*HhUo6Nx-r)-uIM@+*5h ze=49Me7&V~`J!Y#y12t~u*kqa9}H0>yiX87^}!^2xp1WnwSv9f^&d2JqnMK3UfB~! zb#BCLpn6aYHXrx*8!1DNQj`{*Go`jfkE4=X)vu4})k>69j(RJQ54Iim5O*7(3^0t25t_MqGeU+ehDM6IU)!CE1N0<|3J6sQ?ZP-LA zcHysDCkp|-J#9taO{D;M3`{-bIajHnlEP!o_MxI1Gc8!&=It{As@4iPQ3AWD3LU`b zdVZVBSlzailXSXm8URMc)6!m985qH3v^v4eqc-_!kZZ?`!!0DY36CfhO&{_yM$zPo zb#xu;Y7>DKVSB(VMwQa2@&MiA#gr1ZkB4^#APxWxIJ3QgOO-JvN*qJVwKb#?$#LC@ z07*u9WJfx_a3UnIuKbhobrlmT7gQEieoBnUI{8TU1h2@9Gs08vfdnDAbF?PenTd zt52mOx&kMh@^|G25DN}f_Hab0xaZW2AgzIQFiW6d6oZbx<^c?MWFQ=0I_0%6T$}Dj zH^d9H8E)v@8uS|rw>=kLD@J<^F9p07t4}|b>_3D=)j0V~sOys|IeiVV;kBM?a37~| z%t54km zB9?7=cW;H!VE?PBslmqcq1bxf4c|FWwhx^bIuM`YN4=#}yBO*L{iEk6jNy@&rN_(W h583Nwsqym2yyE5YQLopYYmA}BtK-}Dwu|ZG{|gYmlR*Fg delta 4901 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 e{S9^gzS)=kecvij!z=({c|M*Ihes Date: Thu, 11 May 2023 15:33:24 +0200 Subject: [PATCH 25/65] And Human symbols on GameOver screen --- Atari/textproc.asm | 19 +++++++++++++------ artwork/talk.asm | 4 ++-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56629 -> 56628 bytes 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Atari/textproc.asm b/Atari/textproc.asm index 748e01a..c4b4d0c 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -1853,18 +1853,25 @@ NextChar adw temp #19 displayposition jsr displaydec5 mva #0 displayposition ; overwrite first digit - ; put AI symbol + ; put AI symbol or joystick ldx TankNr lda SkillTable,x - beq NotAItank tay + bne ThisIsAI + ldy JoyNumber,x + iny ; tricky +ThisIsAI lda digits,y ldy #39 - sta (temp),y ; and last zero - dey - lda #$5e ; Computer symbol - sta (temp),y ; and last zero + sta (temp),y ; AI level or joy number + ldy #$0a ; Joystick symbol + lda SkillTable,x + beq NotAItank + ldy #$5e ; Computer symbol NotAItank + tya + ldy #38 + sta (temp),y ; put earned money on the screen lda EarnedMoneyL,x sta decimal diff --git a/artwork/talk.asm b/artwork/talk.asm index 6b17f19..8ef8985 100644 --- a/artwork/talk.asm +++ b/artwork/talk.asm @@ -77,7 +77,7 @@ L72 dta d"FAREWELL, CRUEL WORLD." L73 dta d"REMEMBER THE ALAMO!" L74 dta d"OH MAN!" L75 dta d"DOOUGH!" -L76 dta d"ANOTHER DAY, ANOTHER BOMB." +L76 dta d"NEW DAY, NEW BOMB." L77 dta d"THIS IS THE END, MY ONLY FRIEND." L78 dta d"VERY FUNNY." L79 dta d"THE FAT LADY SANG." @@ -114,7 +114,7 @@ L109 dta d"I'VE FALLEN AND I CAN'T GET UP!" L110 dta d"911?" L111 dta d"OH NO! HERE I BLOW AGAIN!" L112 dta d"I'LL BE BACK..." -L113 dta d"HEY - I'VE GOT LAWYERS." +L113 dta d"I'VE GOT LAWYERS!" L114 dta d"CALL 1-900-SUE-TANK." L115 dta d"YOU BIG DUMMY!" ;(sanford and son) LEND diff --git a/scorch.bin b/scorch.bin index 078a529b5de9b5a4c62e654d941686c12dd8ac01..7bd3a0c02abbd67e2430bb112e4dbee28cc19278 100644 GIT binary patch delta 4851 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 B6Z8N8 delta 4743 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 RFvw`DJUZ{TcV0|(`Zt0Ll&t^& From 663321be99a4a52fbcd1729b1baba707fb53ab26 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 11 May 2023 23:49:17 +0200 Subject: [PATCH 26/65] Earned money in sort proc! --- game.asm | 8 ++++---- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56628 -> 56628 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/game.asm b/game.asm index 1361c94..a25e9b2 100644 --- a/game.asm +++ b/game.asm @@ -1102,17 +1102,17 @@ nextisequal nextisequal2 ; if results are equal, check money (H) ldy TankSequence,x - lda moneyH,y + lda EarnedMoneyH,y ldy TankSequence+1,x - cmp moneyH,y + cmp EarnedMoneyH,y bcc nextishigher bne swapvalues nextisequal2b ; if results are equal, check money (L) ldy TankSequence,x - lda moneyL,y + lda EarnedMoneyL,y ldy TankSequence+1,x - cmp moneyL,y + cmp EarnedMoneyL,y ; beq nextishigher ; this is to block hangs when 2 equal values meet bcc nextishigher diff --git a/scorch.bin b/scorch.bin index 7bd3a0c02abbd67e2430bb112e4dbee28cc19278..cb8dd471997bd235a400a2333eb97c0983dfe965 100644 GIT binary patch delta 38 rcmZo@U}|V!+HgfsJc)k~FaOOX{s}4<1orUo@5})6Gd8~#6wLzw4x$b! delta 38 rcmZo@U}|V!+HgfsT$q0kFaJ$p{s}4<1orUo@00}dB{#no6wLzw`Iijt diff --git a/scorch.xex b/scorch.xex index 00911f62ab3336a315c0179ef83176553fbbc108..4fc43d96d5190e3409a2d21fa205fdfcfa10cd3c 100644 GIT binary patch delta 38 rcmdn8i+Rf~<_!}0;z|5_c=>N8@lQ~>Ah3sre`f}mpRrj#pEVBvAR7)m delta 38 rcmdn8i+Rf~<_!}0;==rUc=>M%^G{H@Ah3srf2SmvFS%JipEVBv3m**t From 1bfcd57d26d79b1a569609dce78d19694a0dc5b0 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 12 May 2023 12:01:57 +0200 Subject: [PATCH 27/65] Small sort optimization --- game.asm | 30 ++++++++++++++---------------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56628 -> 56624 bytes 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/game.asm b/game.asm index a25e9b2..1c11788 100644 --- a/game.asm +++ b/game.asm @@ -1076,42 +1076,40 @@ SequenceStart ; if sortflag=0 then finished, else repeat... ; ; or something like this :) - ldx NumberOfPlayers - dex - stx temp+1 ; for checking end of the loop only Bubble ldx #0 ;i=x stx temp2 ; sortflag=temp2 + inx ; because NumberOfPlayers start from 1 (not 0) BubbleBobble - ldy TankSequence,x + ldy TankSequence-1,x ; x count from 1 to NumberOfPlayers (we need cout from 0 to NumberOfPlayers-1) lda ResultsTable,y - ldy TankSequence+1,x + ldy TankSequence,x cmp ResultsTable,y bcc nextishigher bne swapvalues nextisequal ; if results are equal, check Direct Hits - ldy TankSequence,x + ldy TankSequence-1,x lda DirectHits,y - ldy TankSequence+1,x + ldy TankSequence,x cmp DirectHits,y bcc nextishigher bne swapvalues nextisequal2 ; if results are equal, check money (H) - ldy TankSequence,x + ldy TankSequence-1,x lda EarnedMoneyH,y - ldy TankSequence+1,x + ldy TankSequence,x cmp EarnedMoneyH,y bcc nextishigher bne swapvalues nextisequal2b ; if results are equal, check money (L) - ldy TankSequence,x + ldy TankSequence-1,x lda EarnedMoneyL,y - ldy TankSequence+1,x + ldy TankSequence,x cmp EarnedMoneyL,y ; beq nextishigher ; this is to block hangs when 2 equal values meet @@ -1119,16 +1117,16 @@ nextisequal2b ;here we must swap values ;because next is smaller than previous swapvalues - lda TankSequence,x + lda TankSequence-1,x sta temp - lda TankSequence+1,x - sta TankSequence,x + lda TankSequence,x + sta TankSequence-1,x lda temp - sta TankSequence+1,x + sta TankSequence,x inc temp2 nextishigher inx - cpx temp+1 ;cpx ^NumberOfPlayers-1 + cpx NumberOfPlayers bne BubbleBobble lda temp2 diff --git a/scorch.bin b/scorch.bin index cb8dd471997bd235a400a2333eb97c0983dfe965..873112ff6f14f9dd496bef4610d7d61095f39af2 100644 GIT binary patch delta 7240 zcmaJl2~-qUwq4!L)-+uuqOu4+7D0Bz1>Ayr5KBd5aYKtm1ltG=8aJ>JEkR=|@C=LE z+9JhJL=;5F!DB0v85x^Nobrr1lQ|R2xDfd!{+<}W#`WK-Mvck*FP^UV-re52@4ma0 zmdZ;@1!I?S+l(Uz~l<*$z8ed0)3Xm%S<2Ck5X4q&rE6cGT9a3 znaQiOA-R4vEIr|6>|)fEj^=IS^{k1vvak8qtdWPbY7N$7kc zDg_`u>g-QGE8v|)f{4|qHVM|QIkyZunoH-;eaKV%5Y|W^n9JLX2(OB9wR*10?P3(R z4Sl)+Eh#{5_`lSiE<+cg(rxJbV)WStMBqU#AL`F;rS~pqYV9${kXA=?9cfjd%<3M> ziU?iPTCeslvv0Wv09kh7~q?l@yanvQ6r|v-S&!No`B&|@}<+O zV&2!_)rD?jj_UH5RtV@koZN`KbZF;V81d+I5}Jm$4f4`^>6ixD9;2GP|Bb!yq(Qc; z=>7#~vNMsqpeDacBr9hMQQ~~LG+$0ujuntN&y?nwWMzOriSt}(o=aNYDqYRaB&!4U z8=Xl`2b}wg?%!<{c&q!h9m;?uCcO9jKy`Jv)+I2KRjPD@bRuRPdjtxU5IuK#FZMdf%UP2#h$IoHy`43nJ zFdtqHm-~G&-^04V!6{R6!y;6Z%(ce1UQ9L=s$2h%Y$#Im_G~Kx8yhgNjbK!80q8}d zaj{zu^#m*^mu-d3sz`2`VIM*l(orB7IYlrQN5S=>ifmPp7AN60Kgj?pO{1N6yi**jp2V9NGr z*kSs_3dv|;{SN9|A?+BQ#VtPm#8Z6L$MXYtMSotwml={YyqjT>26o#(@vjZXDAO@X zPoNZjI_Oga`t)TTc&~svl$`g5mnps*95@0I2k?g@yxq>_@MUZ^@5ZibknKB4?K4rR z3~w5N^m$o3FQE_y9nZ3<%mMatlP*XSk4sNtEK1u)(tsSEkE3;>MFwjNGC^75NBCoF z14X%XU!r_Yn5c@Km*@ZnCQc`g4otX9m;2h}Y#)7SrHD!PUE(f%X`%#olWgZDJPf%i zLm2uH4o8t=c4fg<01x(XN&H9$cZY*>cR*ixS?@r*bmnuZAioRmN4}c0RKdQ}gZ#QY zwM|^Qh`jXYQrXYY)0`%qJC~j3!EWGI<;mEO&E>FcPD^D^pmRAUaG+J$^tcRumZ4a~ z#~VsC{O=7j#nCKHldkh0$!u-sH_2>WqprPHl$Bu`!po|%uXG{dCr*cgYT3_3?!+7J zl05UHRFkr5a5kKw(4?@}1r}CNKZ(}ijkUfJ#9@5UcQR3i|K>YY{xSo5_{D^d&twAb zMCrmBs3^zAOP%=?y($yF`>7^vbFA5e{HZ+E=s}tXlRu^5t$yL7#eJE@eYv;SZa$Y< zRcpzvRPtF>wUXLCTq!bgkr*{;jeAMD0DtA@6P=P}i4fF$D8!Fr#yXOQd6?k9Pi51^ zVK@xCY{N(xzGhd@DLB|a)LpUEIE6I771>@J+fP*0(ghuB{T+#Dn-zjwElai79Cb~$ z&5U=S>eF)C%dNt<3|OgT^Xy&o0o)W28f?gc`FXOr^T1NW4qtPZZB*`y9<6%&aG!(5 z>+!RIn8+`(o3yXalRyxxFrFu^AJSiB_ub|0!i!dd=({lOhAE}w9mNS|M!HS@BAdG# z+pl2nQV!f*_dF*F3)pm#AkCr>?7-o7kw6Iy4sxD?nmcImsQe$K$pHp!BPS95_`8vz z?vGZTI8HSLcJB8L)>}}ey@hF$J5Bw1GmZ>QbKAVMe!uVD;}osQX>c@ONd`B14Id1g z;DMLcH&PYUZIi4)*4apXBNJS@z=M8?@pplN^9G=ITN|k_@ltUohDORn0AkgK3hF6? zF0U2iA3u|A=i1r7q0PBmyL+CJZExkNFALPxK=w1fgx$ca*^kjvyfSF0vudl=SBlqs z2yPD=?4#Ps69!jufJ|btS7IV(+xg)l3aQ%q9u)sI=mX*$b{#cN{|iX&RlQr3iffPU z2V(l(YLOf0>@=UkcJQU_-(ma}4FZ3FrR4XQG{3?UbCH6ifmGqsHE8!5(Y?(82bKU1 z>@|Co|6m+=u>dg~zA6^Of{b-xDOS%e=T)r6q?Mc=xc+^5Hb#CUsf=wNvM{;havl`gmWig-i? z{T;p(?C147slg6SUDHE7Yp?^(CrQh+HWw)fd*K(sqkN{Wfw*k0hCBtWEb5^;(I-j5 zX^?SLJlk$OJtWkjFWJ~Yn!m&ALjnm79}4jxYVg?*8piU_=*f7g;h3gLdtoox`6$(J zTw~r#N}h!0;7&E-or;fRF9c=a`o0J8#|5F2W4g8f3B>BS!n`yfAlr5IPc&dikW7K4 zbiLt2R+RJQv%qxZ(#*tLqTEXVN+D1bf&SjqVp)e8dgIT;Z@<$L<6o1 z_b2{_FN8-Bqws_91;i{oDPknC4rjn`6)unPBhKKK2p{*s`HAt|ZI=<0Re`!oxQjvz zmlZVz?DU(6Xph19u+~>9$osZ)+b@?3O0M+sE~|p}!J(0~=lT4;e0Q!a&yg+TDy-@# zRqVa8ekEH$AIDXZ!<1|D(Rq9#GCHEWB$hjKZ#SFCo$Z&gS->)uJAE&oWw;KQXTZGm ze@Hg7^$95gu{z3kfF%DHB)k7Fl4Vg7i6OWqDvyNl3i%hOjfYfAi@dOA^yGjAh2TP3 zE-XrgYg+7PS=J`Ma%E>OWTlE?^kgH)!-0Ol>qbwsKa#>`n;Y@T(Yn$4LV8*u(ibA@ zo58puSmAxxTrjcNen&PFXiWrA6BRp~(J-7C?U5U=GZE;zn9uUSeqh#JA>3qQIR=~? zIHT?i-htJLs?HST-C5n4-8$jlyyCs3J_a!0W5#&<0}V*%&gf=D;S6MS;-M^5rAj)N8q|U}jtKw>hsXHB z@5M1A;I~)$eKls7>l>y(eIL%+3~YnOP73nUalZ*Bz>ZcHi5h5qMhan|26ZtocZZ;x z3GQBpobm3l{=^#GIyTOJ(FT)!=WzVP*qk9EF}QhqAcpK&q*c&!@JHi(9Btg-F7db- z_Pr(T*;8EbKgWd+f|5tZGHeE$$!3XrD8W_Z{qW@RF2mFt0RpSYd7IT4lDo{Rk}4hj z5oX5c4R_uqc!P;FquvsetX;=uw(DSTRXVuCUVLwS6hYvjF>{C;n2CuYPUE_mSYkZB z7Bih_=x~djK@fg;@r3Jx%A45J<`+$D$9?g)&|HqEOymexd}rb)Vjfmc3ITJBnS_?S z4F&vcn{P!&z>hgcNKg4}n7pC&_Oqx+{h6nK!;$B3I$I zNhtgs_t>|%1Ki(oddmgBoaC!f6q|RE>~44lY!eE>VUwr3wxqD6WD?rNgk$%(;SL%-8mC7}JSom|F!>3Tg&J_%r%*`^ zZwG~O6wZwssVb>KQ7n{-=ozk!n@y0oH!fg7X$>Gdi&(rf5QMYcZGr(z>o#``to&gO z1Mc7y+?Np@EEONP-@pU6t+;bc-b|K(0wcqQgBMO6MI6Lirh0oEEES7#hGW=`Tn4*| z%Y=+H3qnaaZksxiD8)CYmJ&~J+Oz=T7A~H)a+qcp;GYtnhyuY~41(R1*3duVAExDa zIPVZ8DQ%KkufkK4t5hNa)=l>!4q?Oe7>ERyr;i!ryd$@zhq`_BDhX&1K-XcX8EDm$ zjgXm~5>)(9_*L>FB;F9cjqprb;Gs;&A8;NM^56KZz80?K@+sl2bO?TmZ8vkuVP8g( zUT~B~wsp`~GrbV+n-M^Kjyq-;iC(;L<`CjIUOh7r9^3C`Ccv*^mS5=8PeI#urfd|o zfPvG!lip$zSNRBhdh`8VEocHxoaIIICiq)%UY#?Sd{D+)C5}^Au9>0%|b| zh%o@dGPDYyDEHDeX>(a^51c%MwQXJ8u0srQPk{T#XHIy#BKtA zvC;4aDHivqliq{isk4VWiu)Hrkt@!g9q;a1!kreQ6`R4G5u+HJB^g^d{^RT>@^n(; zCx`1?jq5_?-4p;%g*H%lNBGAiCI&+Vu3ufnNF~$O{Ujiurv3ETg)k~knx;aB9Oe^eN>?TJ1*H#h4pD`|W6Ti@^5zPZlD+FL{ zzY>-$%F3Ui3{bzaQJ-m(K(hZt4Qake-S%@7OeS~|K{zDAXIxON^^V}qzn(WrZ5Rbj z5h(LPr7#ax8-mr~@Wt(bBG`jyeUenrDCjs`k}wRqQ=cYef*X38P@pOJ1aR)f@=I;r z`PN)7Ts3zd(SmQyEhHY`Bs$HB_$UlfQ3{lbPt&3B!g}e^#0pH!3kf=%M8_Gp+kyhQ zme8(yxh}BE-?JI5KZ+UGW5~DyY6<{`Gv=YOzc$(vkQX{s>>WYT=6$e<+oE;S%sw!5 z@gt7$*?B>ZtM*w&TE)rTd1Hx**kgX=+<|8YwdlK-_eS{a#+>6!=U!4Y5^$psBcuy? z@4bqIe`0$?VvOg9LEP<{9}d3{=a@hK*@;dCY$aAh{Ym?Yi-2i#qLniYZC`-54DplA?SuA&~Uky2vxDC`>BsoEApyi3x58PkeJ9l>nnqSr| zi@nufazdvL(6{h_zj0_5ea%ZO`5FlzMhQ|upE>{;``QHqcNLdBoJhyZlf4KpyeZi? z<0Ria*T+tL)YujSUi7m1W}Jm7JCoLF*0ikx0LOvKG@*u=@%M3ae4yk#HSV~X{2Tq zBa*1=>3B>o@$&fj5~%WVz0Fop4xX_jazwGwV&7&55q&QlOd@+9r)o)L#DBoae#^(C zM7hSF8GbQ-xa5U$%OUgwE?wq>)yp)4?jMZhZuHx+H@a^?(B1$L^D-Y*rBnBf?hRIo z9*Gw%3s$xqlqkXmZ8_x5-N*y%zIWI`gU%g_<&Fc7<52N6cHf}W@#AH_%g9flR#&z3 z^q5B;jyDG!j%UUkZasYc@JslMGDaC+9%h=^!i0nbR#z7cHfxvKsGIP8sx_0&KKyII zx2e`SjfI`iA=P!JVcqiJ%(s`Eim~HC#{JS6R1IA2E%-8QWcHR8; zxqD2~ntgotKmV<9k6)5eUek7^R~{G=HDOl5yrjkJ4;^c6z4+C?`d_=A;5Dzf&I_aBSe&AGoI;$MM{C9uB|djYm8?|J`*!u2WaI9tA)-lkG>4k_>iUCIE4h0&)bc}gGF4Jprq@UNR&qaCme;FP z7v!HTA-3kU`V9cOC#moX)Vc;OEtQPeA~|uN)Q8QI3iYK*EDn-1rtnT_Kbhe(bbhBv zqn4JL+||-dlkRU=WzyYVA*oHw-(U?iGDT7Y4?3|L#jOQE)aAsRXhV)`bQN`{Am3DU zIt5h#k{t0F&OX{K`A~*&8_?^i0Q-wi>(FDle8IwRB~E$@oB4waB@arVE+I9(3;lYw zp~O;DUyRmlMuFs(Z?IqRGE`BD?rcLRi;+7S_A0+`Nwc-vp2Rx6?1xyV8(Lq} z%{h^~p?Ra-m&N*4K*?@AzZg#W8M^U`#Nd`@y?tXk)*+qVzRuS<3{9zP)}u*!BrFv} z9a`B9Eq+zJ>|_M~lSTH^EMAR@K&7}A*>)*l7*k0gWn~TPh;#-xkW=f3lY@}11{Ols ztLg9k8cAiYVWTc{XN7OQS;W=B5?7O0WZcuFS42d=BA#=GAxkOpdP&sd5;(_By?r)4 zL>x)f1vAlPp>A_X^ee|R0sz0ILXXl4#VuG5bC&>eSvOIWvgXRcYX0RO>E5sCI6&OAqW|4sehvBKoo=hS+J}fvNUP2Fcm*!&+X*%`< z^O4kWxp%fn-PjKf&RJG8E<+7zqII72gEUj2ul2(;(-vRJ16vW;Siga71*3wqqlYQx z6#?DcJ+Po$Y=w<#SuxYJAEC}QD3&CK29Jte<50_f7qu++7X{4&KqC)2p=Gab@U?I7 zERASK=8+=g^`6hJN zIOS+Izi^(g|I2()Dpe;xLjbKSA4S7zc!pli$qp63 zmSs6Sl#l!;Ya_?`b-l-h9k+0m74PxU0!+M*AL*Zn@15^yQ{x`~NDUgHi5K`IBnBmn z-;)i?@<*PB_1>c&MKOV(81Xvj^Tq66P&*CwGa0bfpU7Smq07vWJ#0bj7ke|>DCjf_ zi93^l-$D=9HyZ-QoV*}hEWVJZ!Y|qP0@$9Jfse!SE#P#kbNER$5rN59({P>bMjAfU zWN5FWa@Sd&l2p|>7dnyrKs2DZI{X%u#5|Uy$hO}jDG@`M2(lp}p0SYHh^fp@^4Ex& z8YatXAy*@U$=Jw{xXD>U)b&Ke=teHltLZ&k0mtWM!S?{ytZzw%i+Qj&!yLrI0az~FM;iKe>js-UFXQD(n#6Wb&6URK2HVtDT12y=6x(&j3N!(t0O`lEDgiv zL-V9;Gq}8-CAls9%4|ox>?_4VusLcz#M1d_*;AT{*U;e@7mQwFfg#4t ze42GW$ICfAH^dtbZ&?FN-+*ZsOgW9@rA)*dfq8Bi&{dw|jpSbMeqeGh0672!=D9#1 zwUdR#!6mpuwCH3(5Xfr~gJoZ_!4XvTBl2I*%jEcoDa$725;zH2u=5a_LNs+rh#89>Z^GlY4=- z*-AbgHGw%pbkR>6b+7)K=AtnmQ7g79gnaJ?x-CibYuUW+Rq00nrTwx$3iAICDw@|6 zrS_*C_4&w@Pu=1yaC{5E@%7;&()6dn`$f^vsxF}+Muq(_hmCl(q{TW*f#NJ7jO;fC zSX3vB0T2XRcS5#7?nQ@sd*|iOvoNh-fuS)8aGFIi!vethsc^Akn=P{D>}mFbt&Wt$ z#0>_wFx*abKEXPkY4cM8dN{cs6CE}? zA7Z?{267&hy``J8p#!P%+pxwFdNvc89vkO*E6v=<+MQ%`?8p!aLd_}&HBJaMiMR+t zN}*%5tPu^42GSnOGZJ|eJ8o*-D$`M2v;OQp)^;z$bWCU8$10vk68n8PI5<53L6`~` zTHHJgBMU3J2Q*fVA{*nT4(ZnaF6vwyf&lc7xH$Or8J!aSaJ?0R-&@jGPm0|{BSsO8 z7@t3m7^HmkG%a0IXtGw?j*;%swaiwsZp=8QnH(H5ocWymaZEfjntU~82{WH0#gAYL z$r|{5jg-enGJhn^@nL~O3sUBZ*ZjgcryJ@n5zomyIqXvfg7Ul6WOX^s^NFhGqBv z$Fe+eG805<67yIH(2&)M`gxGM=}|b*j-48{tPp%l>)GWQa5*ai9GPwE3l}PKA=mZX zhJM~EN^qbbN&eW$9*yZZ$KFC(#~Q|#7xHroQF$Ty{_$Ya7Jx`$I2Vj9xz`J40k4Gt zZleVw@%^)|O8K&oEDGTDz)N+llRUA3sya(ncV%~Fbs6M4 zlH0F9JpyQa9UyM^(+&W>>!<7i=AP^U@HZ|xa$_7?^owK{T2Z&q>*rb=W-hQx0!)>y zX z!xAltGcAxz#GWwiFw1=QaKci zs0Cdsv8dV&IIG{0{k|0B*ZKsu^2yZU+V$!6UMi@%t@-4qsU?2i8Pz$m zwmru*lY^_OnD&YS5$MGMMj%(G1$ngR%y`{svsZN%?yUMgB%K$q3c!+@|%%tgRewh6KT!EPmAMjz5C8^f4N|7fM_m zr1>Y&_FBmuiu?&AXT}Ka_F6On10#Aw$c(wnVDj0Fs3jG(K|e~Z#EXdrq;P=$fB9iNpF+|idg{90(iEV4dsDG z%yL|4^X!*H8xMjg;H~01{IZw@S#>s)BxA|(nIo7A^4~Mdn4ihAXQG(v2t5oU+zJR$+!G*$R(xT0y_(nnsq) z3IQCyXcz3jOetkAWi-vj18#>;Cwpc^F3Ec4K7CDuFOGcMj`FWzBc=yw-d3=pfb zXQ#lEJ~ev*{PxX`jC=SR=-=IvgA$hrbnSt4TYFl?*7GN;zJu7(a&u=Znnw6JApNsX~aJ(0=qGV-erB1j;{9cO#%K!p#j< zihL43H`a^pLykj3h%k3v;E)pWZ5sXXI`I^Zia1*_qp_rOZZrFCYSVcu^}J5ciY{=q z#m{9MbrAgw@Is<$IX6_hr&%u!Yl(4pjyV*gaZWoFqXy^6?Xj}A9eptRpwe+q`G}!0 z?}3l?h1L%g58Y6eTo#}es7+Yhm%tHA+7VEci0Neve}ZEEKxiQ3;mK>d%jgSpFV~nIB`c?E)d@WWe<* zC^sOyTEr$^g|FBERSlFRj-WOKw?(Z{LURhQt_YwhMW2(>N~fS_LchP@0h!#Z0kA_; z^(4vfiJJ`a9=YV5YEy_+zb6lh2r94bNfP3-Aef0GBNv1%imP*8mjk7~MbW;dXz1=h zZvwOq^B7-Kj4y-KdX|qN@~G`9246fn9>8FGe_Hm(WH7o7I>xa z7i`uQ?FEuAlciNI2mkrP5Mo-mh&e$%Us%Zen=Iy+d%M3l8gYqkXcalZ$1&H)XZ%+M=iqgI1h4aBc%3SI4wC4?lyN|DB8+lvJpg|J4hf0$ zA*4Dq6%Hitrwkt*WCV)eVknoyn1i@R4PDi}o4cO~LI}5XIEehMHyG%pA}^A%^x)jI zLd8Pq*=Q~b-3Rk**1UiPw?w;r?gp1L^2cUqSDkNsx#>Jguj%gQ9)QcBGbm!aP&$cC zjhKG77Wup+*sFY@j$Y}93)>Cz`>G8B%C1B9Lx`&vn)Um;SekF|T>Etw>x`sb=uq@d z4YX;YSGYTMMCLm+!sAx6AdQB|^&CX)s5OaNl-z)B)JQ6)7kW@nM`gGccDzQ|*TtgJ z2Jsj?QLzbLE;OYD^w+J9uqsWjudIfm^(YO~QZd=IEQm+`uQt~OE5-Le++s*-SCJ;C-A!-Xpdt>Q8j9G^fQQ&EA#m;kbOS!4hNW}03=XffNTv5o*4 zNrb$=EZBoCN0Y&2Pt8#r<#lMnIkO!e&f$u?>Nv<>C;gtuvxRyk=Ah!06a?9q4=4lerxgkZ>)xrGbI7AUp}wU4qxzCM>VPy=4;;F- zA7UQ0^t0?=9?5JZ?aPyx1k$^Fxi;U7tcTE*LnxUnSP{>d$sbmPK9z44@(W+tv8Se? z(LXpcZrtQ&7a%)%YelL~X`2a@g{$Xz;zc$wMZ(dG^T zd>Wb8SfV$@w>QRHvyq+u`0~yC4 z!))rh#IGZFG9xkv?}cuFwza$49&>n}J^JuGA?a}Y;VXw3Gh?0r|1oBv1s5(@umBql z#ei*kXEYfm-N|rf@wtcp6LCAkIlrmU23=Z%Et9;sI>u+<@@!|w(bXX{Qx8K1xs_fV z0~g1({eV&rcWsrw1*brP5de(s2SSZFKp6IzkR+@b5=2?JZ=vI={S5_)TN4~RX#fj} zq#{8DQV~dSVFXJUH8-%Sj)FCT-o}PwZ@%+^<7;l%m`O9ATbW9gB?!=_|xsglY2^FU?r}@)7ZP`v+fq`HkC< z(5Q(S>$V&`cK(yUT>A8?Dt3C7u~s_Wb^Vs^>9yO)>-Mku{6;6vUy)a`*X;W9#v5-C zj}0@(+zr7U&u=iR-_Aeb1~uZz7Y}+hOZcvMKj=-ea8r=yY03OXuP-9#Os-Ko2j5^ zn_!NTTL+`1rFDrYC=vNAHM;!M;=|jaH`CZID?w9v3(ajLvlh()4KgLDHCF_~x4^4T zlV~m`EkmvD7G#xKf_YCgtQeL;kBWq+0&^05G3no>JWJnqA<>9ZSmW9x5*;k4O%z%9 z>|+0F^+gpK=-2IRB9ji1}p)@4%8{xiD*tTo5Cc**v1}vZh6hVa}}z_%eLe@{+h-S@Ofj)QlakMy&CUyS2QW(dkyp)q@FGvlOtCykC5v*~pF)~7%EH|!> z(5A>aN5+W2Nc$`_6|54@552!cztX)^`4CJnjxhqgTt>2MwEGcCUx#ks^j%&f@2s^b zc-MHW z{ckFz++gr|(Is)p?xCTb}>C@Bs46b+W||V1uG9 zPU4II$XKmZx^|pX`ZgMrdD-WvdmCWj(s;CQz@9tb-7ICgspt&?CfR+CJ@=_W$*Vy5 z=kTUkyl6SBpNp@h`zh{6 z@{T4?@~ZFhW&z}y;jLM;oH>r}Y^qbM*w}baW;?qvUc&4!`vTZ}Kayz#jTk&R`=VIt zSDJfEyIaA{)ut=B54E#}ueTI+YLhyGDK(`=FlDvsmQrD@D8oQbQWSfk9r2G@HJVw< z92d9~&$x^0nG2R1?287(f(*$9J4f}1Ap|0v36 zz~eMtI9uZ#{96?5e=|fqs#+Q1Tzk%xq@+eg!~1};F0nogPV}+wa=j-Br~3Fl?$nGP zC+yBF>`v8Ex^vO;qEbt&&Yp`YDixKd*dQ=+6&ckfLJXv4;ebrvP@fpf7+%f=Lw2gt zmyr~VNAXVF3}&71IT}9OZJ%S|vzJ*<`QUdmgH;u)^ixUm^CeqK!+MCKQfgM~2bukd z2{t>0brZqq8~SoYbga$(3r}<>vWe%7d^Zi2EIJEw%N&fK>u%WS6Ll8m5)LOnw6`YYLxl|es`}s^F-(V8YNX03vO;lW#go* zNt&|Qy2Ph#BybG0)3=c@*?o(>WpUx{VQ;r!*a1VOJ?AVA*juW2I|in8PVB9)9+y5~ zSPuY|08+)3$ z^i|%JG>yyuBZ&P2NT{o3h433Q9L!L-?&G+g#;ym1O=AL zXqdH}43d^%sTgP>3+>mq8zfB{cSxoUIYPCAcjoxGJc)~&YaklHXpiKK1!*qk__#wr zl`z{ybFSy@&$f{lOhNc*PVfMTE5nRItBcfe^%n#Y?Wk|@l-!}-*TSnE(8PpJ<&$a$ zVBJJoW;VNu6@weznH%6cF#&1=D2pIptw`xqnovSGe-hR>D#(_B&*cU?rAO$iN%LO( zAa{iK6v!s4A)8nsn}jgi3=%fkvX-}J)s~GoG>;-GuqH2bO3-R;m7*^3Y$0hXSgx&6 zm+sCOj)g;s<2bO;S0zhYGMByKIz(x;L+$D8U-?OFOvrfThBp+3ddiXj z)}6^qyZ5kr&gX(cGSBB&?Wlpcp^)-wN$O5gv03rXOctAGm50c}ZfEt_GkH`6R%$)$ zW0Ft{4%UW_X-^MhPu2zev8+P9_@h!2R(gWOpbV*~Ga}3nqdT+Wk}f-%f^j({T3Rk#IOG-7RaHr57$_ z$3d%gu17D6VN-t7VVEZ`U$036s3?@>KuB00z zEovsZMGbo^Qo|Wu!5a^T5RY)l!Fj~r@%4j~hz6`W6h@4}OAozCoNYaLXchr}bfx68 z{#A9%N%Np%OzU0YnQX4Y=2DiB;h3@j;w@ZQ7DTw>_sYX2IsvJN zli-|64+3&brOyPp294Li<@W8`O*O^_B~u3pTpz}M(&NB<0v`Ey6tE9&zzVoOoIs@| zoC7og#^C#v!)2u_vj|V1%GqYV{k=D)2C!XAi=wb znJM)uWp7+Vr}Dg|+A8!Y=dzChshMO|{WLM4%R9_bMTP zyk4dExRP#s0PcM8NAltW5=d`guU1xKMStRWon&CICE%OK+w3un5!Y&*g+_-hqr{;C(;@)_1Z#2ZliW)DmD}djx333*M zc7!B(_mJvA@S;>w4>0Ah}C%@*n-=s`h;>(N&KbxZ8fXT|>OVKJsy?23U7yQs7R z%YIlWG~aT7*Vs{i$+tAZaCU*Eh<9N(%!Wx%uLi zcTa(MDIQ*684f5h1(s>>N-3~Rg&eSX9WbD7=NjLY29j_|?pF`%E;N0)iptItE(&(k zo&wl!1)$*Uxm+eU_5qgrv)u|cngB|}$9s1SOs!W4H3S}4LBI#PlaKqCq!!@#cq#a{OkN*^_J zrUdF!&Ek~g)BAW%2IjDnkwc@Z=5C&zpz&MdXww`O~=0V9)u5mtv(t8RC)bYMgBg(xgEx>wng(y&Krkv3t@>& zE}5{$KXEHu9&H(glp%H~2`_611~=6-j3ZKUOG8iq4yRUX*&DnalBZL_g={<6=Z8#` z@jpU^_A^vy{v}(5IeezccOtxhZ@`UENjl{f4pCBF`(Yb51WToM?gyh6UcxtCete{J z#(v9it1w`WPau}zw&PDG+|lbPB|H zLgOgn4II@t8lDFlvj`9DW}M>E9&Yx8I+yasD~##VULEc-`r9kgsY3kJs3P33M^orv zMS7F3fKzw?en9{zFu0GQbP)V#&Y~TP5VEkd`NYfyq5T9-u=BxOFPM&v6A(h}? zny~YnWYM79aM20(AZXq_+G>j;Zj2tP{JbZ0uG5x&HOmm|k zEv%T5Uh89(zC&iq^>WoP7E0ZY!xz^Ez9nc-FU~9mC*jjKa=t$G(<5Y{U&b~*^ zOF1{DO31X_K769tYk^~0ozO?#4q^6um2SLEGBvy1;-C}SU-c+SEC;VOk=@%NdWjP< zF|dhq)LZx&mcY-`9vc15cwEa+4dh*+Mt}sPhfr*B=Ml$2odZ=Dx65|05MV>wgRhFKs29Fk^GDJ=2{XRZKUBv&-J_YGu zrv?dRCyRu4fMjJU)4?60T3n?I>rT!F{+CY%ySu3=heMsp5>SDnF9f+^_tw`J!(z6g z_-PXsrCp-!=={h0!h$8>`T$YUn*W|R?)KhygUnxdW zDE*{#O_@*mTjjX?+j3kAhYW%8u|?7RbKukZK9UKihZ0$M#py{Ln{|_KPy{?K5MCm*_2y%?^;d3qdfE>=hiS18aIh@x3!%Q$w|B?rd$mM7!G^ zwJ$+`LKyp;xxpS~>0k1Y60CdgSNns9A+hV;AJt!aIE=jv<>lp$%aGBx19XGQ7vFo| zg_w?iem~IuqY4qx7tb&$`X4;3VlT%7a`y}5k^TPxENXy74OFPL9ha$8Tx#-L6R;1? zQP$AeX`Ws=*F3FqF1@hw~r|X&I`Sa&9>aswv>dMGk_3PQoteG+PpmDDmzk@_o4kN`~B=c+PsLx_`5bwk@B@{LrrBiv%a612#rojt7`7N@yKV!?D@+!#BSb_y#MqE|MT&cpZ?d*bJY0B)Rxrz2GdtJ z@7(+0KZ9mOynCqe9RKxWiT{Fa#azq3ej7OK&9^taqrp{r@#hHq;Kq-l2)0#m{=Ng; z5r6AE7;u(jeqQgy=S}Uo_p>& z=N_9{L z$>a5HE=aDnB`6(lpm<}Q8bzs5zj+qVFYWzAIhvNmUvf|?RyW($N^{H5bg&?|3mxAk zfniK!)oInXGTI*M@UGurk1VpNCcuPJnwWeXGxZ?1Xn`7~Py z(Wkqh?{MdToYs!d1abi^V?ur!l(Pm#0y4%SC!D|d?IK@?x554SB42j!yz9~z2vs$* zB9oH7d&6CPOcc+okrk{vp`@*I=@VY`mASNGiWp7i%cS`-+AvB)WS%I^6KO-3$dLKq zR0)tuJA4g3)4nc3F9;AGdx=3 zRBXpQ*h-&_2v^YB*fKfeEs8=dA8Gt3if%DvuINEU;GaGU)IN(7I`q*l!VLWg7vXLF za2EuIa3P-X&upPxf7V5i>Cd^C->#XDMl9ehv6jUP^qES_iUs<0O2M78An?g9hujEG z2)jm~%r!0YZD$^X$E9)>;8)Q6Qhf73t zfF3vFq-%xKvqQDRm+0U07W#4~00q$80b6gHJ1C5I@}q_nA&*NIe7RLMvXVVaiJ3vO zRbjW7P)iLX_5qe++AO=0&N!6kP9yObvkb1osHFT;=+R2FHpyw#9-#6ic6uB!0qd>; z(@8&)RlFy{g`^$h>>&UQOau#(AMp%`XS~`@F~JATj4uBa`_oF8cplu-HQ`U4?Pzl0 zI@lCECugARqm?lDFlYFi^O9g;Hf1HOc#8bw>EpZwfBk%K{uUT{M(zNSMZJ_INw<~Y zJ-L3=C-_)y6tx=P$sJG4#-Z9tuICagW;{$Ah&OA4hEj=O^k_|F4HNBAd&-*5u+fR| zyMw7y*T=xIJqcZC3ZUWWo;<*9+F@Fvi;d{w-)#ISZegj>o@{Uxl1hz|VSH8+L0*!e zIyD3>*6zmXqNy z7@l?xhr{p%x59-*c>U&~{?&_36KGqvGR?-APO8+%PH#EBxhFNs>5`z48ZL4}SC~&p zc6xU4p$;{#K5G#>RB)4}Yrx&M4adK189H-w3d~#SdMo(u))3oi=V)69y0z-%J+2w_ z?fu0Lw|3^&=sq^zC5`(S(~gk4H#|hDy<{K5Rwcuwl(Ral&KskxO0H8sZ>2$ExZKoA z1G3{be;cm9E9iC`rfo1~Tm=tl!r%5!lXHMJ^x$vDbb59HV>$uI0LVYh2?Cj?Y0%9s z7u_JYoF;NXUZo}9MO5;Y_5i~p^n4Wnamdzj)JeQ->rnq&s}AmCY6e+%goJDD$lz{Q zHMw|B`qmfk*}BBncS*&LkYZ5&`KlTZThamuy=$;n{@8%1B^9-dj=5=;)yS;1%nh07 zb=uY8`FRvxnLkL|g}rU5Wj>EuLUhsBGG+=0OE>74UsdSj8j@~>DO@w(%w0xnQu${8 zG*_?{i140f&110wXIIOUqI}F1XVKes)?BS+J+7;cDS02|y^jnlgvlfa%_KSK1-A!}E$F%MX*S6~GRQ#S zww#t*CMX~)nd7AZ3u&fA>uZ)ZYJDL)HWZNRrDCWOZj%fmbTpT#i}v>CHEBaQjlrcO zlYO3=8f&H+z_BX}hQlV?3;Ov&%$0E)B$uxjT~D;q=d4lqw}PR)A>s_ML@g=Rq}HD! zJD0O}aLl$)_nUDwZfGo4ZS$r4@P=(eg2%oOIUmX$NI6T_wKG<hXayFG`HR?<1_8cL|0y8Ps33(nQTX=}+s{XTC9{ZdR5_^w=W4`0v)fG2nA#`~R8gG?EhX_mWd24(7)CuGwn@m~rN zbq_Bq9134u;oKqjQozf=!T#}51i9I3Nfug9ve19O%tB>F6BH1O)v8*H&N>cHFDj?j z;u}RHDHHC!eE{_(9 z5a~fPUL7|?myYklRz}Zez0>E$@;ANuGmyH@?=o5&9@EgtFWosQ1n(qdmK z0M`|>ZyinVNcZRS(mc34UguCoD`M{Cb-HpowmQA7Fox$kJvffnNkIQq9Kctnqoa7R zeq_{{oEZMdokA{=KiVndl3=A6{_vf2P^tyy2{5<(LUW0h$239WZTgTdmh?Zc6#ic< zm-OSPCfutejs6abM^50?u~6lyVIzelcg@;#;zd;quYxEEF|92@=)q}-wG%~`wxqViHjVhR zAb$NYghZo3p4hEy z0F{En%O<+d*;6TQu+{P$SCf>3{^kjm9tZEXIZd^QyQE$jVHTb%V|!YP>&bk zVZGobC*xFH0++}oNlIa_ouT*>?A6y}BVYiEJaZjA;nF9T=9Fq!xH&kjpJ%T41~^eY zx|U;>HEX!UW)0|8s)19!h7)#1Q%`Z(&KZ=5uk9Q|HDce7W2ljM_Q&r~r&|mkPp04& ze!c7KUVI&Q*cP~-Yq?9lnKm9tB|rj_GDUYf625mvY*Y!^0rJ%1RLJ%4j&p}pbV*9pm&nUc&KU@=l+u3c=4dmB zKdSzavq+A?BP#k0d$q(@-3(nzbc^d2g*R1%c+0YF1vFO(7m2GwgRxNYj?dJ1u9dH| zFEzLcM`G^OHQ1)&XBC5~qj+HD5b%?CD+ly^wxHs)3q0X1R6NeE%<(eEmnMsf=4AaO z2F}WT_a+IVA}0qJ6;|yIaBohY@nV7*AKd+(wx5(>1h3Z~MV7rZWFc?`6$*lfF~np= zgY9r`tgSgWR@GDMr|qX5q>a?3YFBH~=2M%`Zg%84a=+Sgb<2${8Cy4P?bzbj^2?T< zc|Lgoc_?pi-jJ{Cqk8-1SQLGJhFNqWUximo2iHRN_80ZJ$_!jvM*Br^oPX9 zWI>2My+E7lUF~#@H^>=^Cv^8OZQ^#4`KwA^x7d@nr6Ao6aXXj&PF9}g^ z?KSnimSg!D!o&Fo^!cA@7piL{-**d$I7!4DMOyvDeDlzC{ zL67WdhBj>ZTsiutENlfVUsxtJ*1!;#SZ$HL1XdbdXx{-pnnL?Q_=zpDmx`YJ${8=X zl|T_b(eCX?fWC#Con9!tt*;hJ&*<%i(xaLylHT3nMfQO}vbxCrHvDWXvQK~{qFxRH z*vU89xB4@cGP`Hxq#M-)ukmK8In`zT}+O~-{t)*F* zu7%5?fU)7i^Yt{#;P$%kpyS&>h$#keof1k8gxA;8(bw7I*n7X<*zuXrmm)>T3kN|7 zN1!W1exavD90gigfQ*6b1thM9-;s22LvM?4A8C?MvVX@74;aGT^m`I~aDN~*6@R)v zc=lAIp7&uJJ6H#Mta1eJv?4G}|(aqKcZe^ZnrCWjqf%%6rr?{8d!YeM^&UQUVEC-A+Xs*G zR~PW*I@4-X_NlDJH1w@VBo@4!r}5ggC5)eP?SvUeAB?0X;^ha2!FT(?JSqr#TgH2y ziL(VjA2YzCF~8K9M-VICSy32&5hv__|KrE{X3Tgx}O9=y&FdYMPo2w zGwgu>0S@(w@F`S6q*C_5iH!py`)YyWj~K!wP^JK;#+589J@-KfZf+b9?32SECZ#g0 zcZ8JCTvB&SmZYu+jdO56Us3%jGDdLRF_OX`@L6Ua;baHrf#i zZD43$pD%;PFY3S%O#_#mFH?0lw^c$UWW5B);bF_86)3I}Jueev4iD5@8g1rwfs)Hr z#cj}%uH^T@mE&vSCPEurg+AM84>q`VDn%E;huce%wy*;;%>gV@WYv-G^#&*{&+aw6 z*|lAMgWb(Qx^nesom7KfZ=^dmKnRo&3Mo2DICciK#hp|{U_VNUhc$<4A*qvM15%I) z!n@s9M1ln>C#ds;P0qFe=#dx0@9k7Vp+3RU;R)%|P3n%R$Uk}fu4SfD)a!KCLSw8|XN)zwS!Jqmwb|5BI=zj?GjReyKQ_F7rOEEzRd^J z3}hpa;KZoR!Cl_f((AAOp4ua}zg@U?%ROTB^!ZB?*5z03JM+a2g-_T!^H!|YoA&?p z`oG))M#pF94t{$3H#%~3%0?}JMh`EZxz=w&Kk@U)ppnOlv#N%~U_e{lVo1gfq@ zarV9&yg;9{?;LVk;2!Y52K-Gh{Ss(v3v`6oDKXGi9q6BPKG6R}d*DZ33#RHoYiG;R g&;CNWI}MG0`TGQ~5ev*Cp;=*;9#<`sK6lXn3xT~M-~a#s From af101d46e9f2e624ea44275dce4295916d3cb6cc Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 13 May 2023 12:46:15 +0200 Subject: [PATCH 28/65] Calculate gains after sort results bug fixed --- game.asm | 39 ++++++++++++++++++++++----------------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56628 -> 56629 bytes 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/game.asm b/game.asm index a25e9b2..402b3be 100644 --- a/game.asm +++ b/game.asm @@ -45,6 +45,8 @@ MainGameLoop bit escFlag bmi START jvs GoGameOver + + jsr CalculateGains jsr SortSequence @@ -67,10 +69,21 @@ MainGameLoop jsr DemoModeOrKey jsr MakeDarkScreen + + lda GameIsOver + beq NoGameOverYet +GoGameOver + jsr GameOverScreen + jmp START +NoGameOverYet + inc CurrentRoundNr + mva #sfx_silencer sfx_effect - ldx NumberOfPlayers - dex -CalculateGains + jmp MainGameLoop + +;-------------------------------------------------- +.proc CalculateGains +;-------------------------------------------------- ; add gains and substract losses ; gain is what player gets for lost energy of opponents ; energy lost by opponents is added during Round and @@ -80,6 +93,9 @@ CalculateGains ; Important! If player has 10 energy and gets a central hit ; from nuke that would take 90 energy points, his loss ; is 90, not 10 + ldx NumberOfPlayers + dex +CalculateGainsLoop ; adding the remaining energy of the tank to gain ; winner gets more ! :) @@ -155,20 +171,9 @@ ezeromoney eskipzeroing dex - jpl CalculateGains - - lda GameIsOver - beq NoGameOverYet -GoGameOver - jsr GameOverScreen - jmp START -NoGameOverYet - inc CurrentRoundNr - mva #sfx_silencer sfx_effect - - jmp MainGameLoop - - + jpl CalculateGainsLoop + rts +.endp ;-------------------------------------------------- .proc RoundInit ;-------------------------------------------------- diff --git a/scorch.bin b/scorch.bin index cb8dd471997bd235a400a2333eb97c0983dfe965..a93fdd7a684ff5e6db0b0ced7462548763a13206 100644 GIT binary patch delta 7418 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 delta 7433 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 delta 7691 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 From f0077adcdf80b84e78b59f6c438545d4480d22d4 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 13 May 2023 12:59:15 +0200 Subject: [PATCH 29/65] Atari executables update. --- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56629 -> 56625 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/scorch.bin b/scorch.bin index a93fdd7a684ff5e6db0b0ced7462548763a13206..a07c19d2f634b3e1bd6b08027274eb667b4b4964 100644 GIT binary patch delta 7248 zcmaJl30M=?x|t+wAz?;9W#^zEAd7$t)P1W}92F68w_y>)R52*ERUm*KMQRi{7DP#n z$WR7FL9AD7Q|#*%8{Vy**H`WBeP7ioQn|fqT5GLc^!+nI>~h~jzsx!RcFzBw|NP4- zDUp|y$lJbBtr@4qhL?;T6oVaUVGMwGc8W%OS_E_R+o3rI0ZBwAk>K?|1=WkUB3N(K^chyE| z*~<$o=V`nO>A{e=2A$n4fnh940x8R@Y3m4^rxn>$)(F8HxmLqM=th>jqnX2jF ztIT`adoDE6)WQ-j7)8Qh}W0%e{TT~*9#Jc%VA%u0? zM4BhyH}BM;#rfQ3tb@5-0QuZ)f^ysn#E~KN9!F&%Pr=Yk|LXFzkPkBYUO=}< z6LZ0PW7 zXDEOj1&@;|`bm!3lB2dd2*%T-pNEUL>+)>@VJk7NNkTpwrKM5_#7Nf}@)@gw}TwSi$Y-Caz;2{Ti^ zvx^PU!o=mok%0-c%FC*!D6{C-AU}BsbyE^k2 zHai2p`j zFN=aSlAtD?X)n#{$v;K}#HD3gqXjh|0a@dy=^)L*JW_Dtr{mS)Fbakj?87lIe2Ukw zX=L=s2ruOd(-hh=xMX{6LO)ei%j!EejC7{r>|O}#>M+w{57f0;b~oO0s!zx1F189^ zYr#t;pU1tHH_6+<5#jr?VSb)&?tF8FaYvBlf_=0*2z|eH@Z$aq7C%IO4vru5aaNP= z$$1(W!WE|TwCyGKU~)Gk!t49BCyp@($T7Ile}^OVt@9$=G%7$qTc+|K)p zB(&@H-(ksTp;M`I#3O9H;SZQ~mkpjVDy}`DADG#`98nr1q0@XS?%+%C-@#yCu(03* z0HypMME{9OEIIVa1GPcTdQ`DqjAyeTVkJVvdWw(mQ^!Nt3KsL<(?T&1$gl=8*nn5@ zD(q%{MT&9|>-QNv&9ajQPe@cPyTs7;OPIflWA3`SW~v38YDD;$SO{@4T!2r2YptTi zo2k$BfSZ}03-=ywyNHy$uvt*Pcb@*J^8hIekMMvnFtYW)iYooO=8r_p73^JdA$)}I zFUbuKXvX>;=BEY+SnwomozbR|lCdB8H9Ra}#(K!lmTIV1kalwq(~0&b3#Va?BcjR` zWY*{ir>|2?4YcJhDHuJ9Y9jTcy{TGqb~FoPMMT`>11pS2-I{do?WH@vPct5Kv+Sj% zh{AJl)NbNYi+2r5l`}s=Q3Vck;h9v@ z8xaB7g^5fW@;Dnj3~*l$;`EWjz$?llr>Ml$wT-Rioo4b$WDT{2WJkqO$4Fh&Nb2vz z5*1B_lYd1mqUMmv(IHeG$$;N#QXV~mdWRg34)F5KOPb5w)C4j%1-ewky)VRbnK5I* zeZPv1^Y+XGSYL@C?FYXqUT*<{ST7k#NHfje`1566hV5SR{cveLD|p zxel18!@Tte8fUaVqD3Up!~_knD(vWzeGUIe}p$O9%LCTs=>AAr|^(ww5^@XE&;5YFxH>CMAF6vC^euxd2MVkOig2h;J0gRApBmJexHsV?*5Dy zc6J9;Y6kAGag##*^xWIw6gZG}v#4n6PqYvT+G+~HFkX;#Ga%mUk(yMD8%gQN$#K&h zQwq$Eo&My(xa^@KGsJmEV21KpXE&1c3AujiV!iMXeNyYhfA1*mJenH{v~^uMMof{L%PUW2RYM9362n* zuSyy5s@Mc6a3v2pM9M6wgB;zJ!d>mNFfOsXlJ-d`>bdk625ASR4@w%8LY_orIqp1_%D>mY{0SGEQgU6!uKn<|0D0(wV5Ij-VXLn5jz*6QnG_Yo0d_tw(9h zz`1JClNu>Xs#+}V#d9rf#dEbP!%%~-A;b`2$T4Ia0!!X6`D@Aj;`_y)mVQxsy)pO0j-Y($v5#9^8T z6-~US`8m-BG{Jxz$mD509?Toi61qXCK81>Fcn54^V@d9`5LIyvip9_-qMymZX>%xs zT%Q)asI&%%T}3M16&Rv%cbi}Y*Sg6a1qZ)hqlF893eL-f4wocw+WrytYc&Az;#PVsQ6*k#qWdE#S>O*p7mTCC)qSkNWx?lc|zWgl>L(O;4rn8M?-RvZ|lAW^?;aB;TX!@x@~&S|1M zk{d6!s=k5P>9n&Og6X!GG7YZc#z0JP4WmG$qDja3HHSOcq7H^DZBq`0%ON~!Dq87p ztWROoRc?JGeK`N{E{LLPcx8dAz6ZL6t6F$LbKnK z=y~D3XLo}TQv%@nC6odPuWg}YuCZsy2lIx#Ff;$!GEXtlKedS{{tUcEh+lZS5xoJ; z%m-uw+!i2FR{n-$fcuG^`%IgJlKnewXahv4Gq| zF$`Wwz^q_Wn1`#4;cCbN; g_z)^cmO2~-JDn6K4u|Ken#2rlBlk03O^)eZweJ`n_0aJ%mClxMq`xBm3qAj`JwuPK%`#PUp^uB^S;-0TrTC z`QAW=eSaV9;-=`HZ2CTMZ1E$G$=L;=&e{8{AvSSxd%-wr67g9$X8yo6gYNYCO?$Tb zoW|^9+RnYS=p_(bA#+G4^1J&fGG4+xA~QL#FcPxy2MeR%_x{2%`I8#5dC?@7>&X^x zC}3Fy`OBgr>T5DSDMUH6h}}ZgBzZvzy)`M$e`wLk0Fh+Ne)taxK>fg9g33fJKZla; zq>)318GzzXm?ufYIA8=lrFZq-o`F64AXm|>f>+J!> z9h=}C#qcv`Vi< z+FEq}AkvV$WG|=F)$m}6Ldm}5kd>#awa*@1wR|Mxq}lN38oWA2g~lI3Usdxmn=|^M zP8^ls8c=Puc5gS0wjbh-!42XX;bOt_tQHAdtpSzFezhRy-SJT|tMd88ZHdo(dV7=j zs#*Yb+{L4nW9^FRxdN+0rTF~Rj9!xpzH2Axz5<9^5<(>fGzrH>l4n$+Ja2deKto97 zk`V?-x?(*5DZ&In+3G1Ez7oorx1mklX75~KCuIrT(S9`)PU1Gu_03YyvyHMovWFP30Vt+Sd;{ERF&aa7gwTHDP4*q~|LjxL4t8pmS(<6sh=ZkpwjQj6 zW}rb@aSmIg)xN-sWEosHlsq+gA5c-L_gdPzZ~Ut!`}(!=E${ zu#lxAs9bV(X*?B4?k!!a$}ypqgXqdZG@dM47EK)@#moGM=9skW^S6~%R3B<^_Zblp zH*sbnI#1e`CA&$lRa%inQ^(FD%yM7v--5uDKh)WM73GlG%g2NinXHa&4v?_-f?^We z?`TX3+_C;RlDOPwN}O@KC)b!OGZuOxhsEgMFlG%3H!D%D={L8bh}>WPi*oy6^njGE z3?Q17ZbSMHC2&{z9q^UzD^L{{0OtLb0jf%u?kn8|HijKVQdWj5j~|jaB8O~0?8RNl z1?s-%)S*Mp9TvCefR8~3*4TZ8T|<6Y8MKml13GtAOHYqwRQ+5_Nc~*xxcZazSL&a@ zzgSbO=}En|8RsV^CSv`;aByVDv_}04_tI<`?ArQ2BkrWx<~8Pb!n>)ya~a8B6`nD8 zqMhf`y!3i&W~Ce+ANATMop_=_aH1h?57DA}s8qL#5DFl)1nJ%?-1`mL=m8+S?hg_M zh%oZ&Dj)Af_1#;Ud+_S1`Xe@GwGTCc%wO%zOps`_<^a(H!Oc3htoCv-)S4SlcXjt` zyhl%%GCM7&XxH0kKD_(TDP-J?#hXeh-umG4JHL1*EYa<6x%B0CwD-If8RfO@*6WJU zh}em9<}X~byr8~;KiTzM z?PW!UvZ6xS^*2pU=n~Perv$MP)}i(TE1UODui|c9RZ2gju5?jho!K0%t>S*NE^SsQ z&PzX8L+wX1n%4s8mZ-qX(5tIZdbw!ER?&s;iTAKYR3OC?k;TEHs&?dA@g*{A$ng2^ z)T)%?l3GutIJ?&GBdnLD#m33~p~TI@V`mKg1dxtF^8XXnJFt5hWYZ>L-OTr$+KXi(e2f zxfla~G1bw{;+3cr42k!l?p-n%##9nWS>C`pN4Wx>$fa?{O2LS207dBP9{Rk~ASx^k zY}6(0wBcJH7Wp@ViYrrCR8ie(ltt*a2yeT>(cyCB^Q>URWw4K(M#mhwi8zwz7sBWW z@3%2jx8=30K){#mFrv(2p#&RY?iN7);x}2P&qgBgXLqZ;w~7o5t?XSNk1{c$HuNm| zinMWOgXa|kxd=PAAY?+jpMjBx-b_dHh}l2Xj7)|WMYToCUjM6Fx4}|Jo!mLBEw8OsSSLZVV*x(JS^FZNhG!rA?v{Z`?04uAFIWg*bCf8RKmyoeyiAv zePQFAb$QDYbRa{prP$ufs4dpo&S%t?Xhk))A@H$52ipuz1$#$#(=5vZd%0WSK?T?b z3)Qf~irPAa-dTlWNn%)tId+v(DfwR1u-u0-ng@VN@;|0wudLNN)@r%#U)E|VP%RAw zAWQ)0^puVOnu7l&F$S1=Aj>M4+BB@wL-G<<%pZwY7+RN|KkFeWt%@DX>?N6ax&7Hp zoNW*}Y!VTsU$I0ayW4WN|Lu}m$wPF z#zx!+&I+!sMk5aL$8%(-26!L3kpuq87*IDk8Xn2qB^Sa&%y7!29I>)C-A@dxUE&9O zY~jRvwTC%tn`}ogn)n#l+Yjs=fxX1gs6I|9hQWazJXh52umesoYBZV-N20b_=Xd@5 zS#Rlw)|K|=?Ai%_;&5yM;$RlP>KMx6*Tm_#6y!aNPOlODD{;OUh@Wmz)E(mLtQ^`! zN=Kq+HstL%gW?USJrBh~gyFnk{g?RCbZSX{wgJ9?{F05Ugd^$gN_Hv$mXQnJfxe{w zw6$=YZ_gPn{530Awc`x0Gr+{>wL^mw;mo=IE+y{gt%O0NRq+NG#Gv>IFXn+>-ue_M zJVRfyWrDymLLV4(L*7HwPLtzw7AQMMYEXpV$}CB34`x5F$?Bq@w@_&8=`8#zy1S;$ z6eQ#q2IErU=|Tm5)=>js$I2}H8tmT+ad%HXpG=sDApI8^xY2$s12?srjyF=ltF6OC z#h(20XOVPAFrm0c{3;d2+!rMacibjVMm)ldA_WoSnZu+pVmh;nd=xQTrOdTi$rlkJ zBxzJ=?6h1%R9}KAu7ykRZarf!;`nvB@P3JFGq&sD)7+`avIMj6dG4$v&y5Br%|>G{}dJED+_8fT54Fnlw2AWo|K*E94~3bSja1fEln&B z^Ek;%oQ+q};W!wcbr0iVcn|0B*;=hWd`ebpz?U5et_B2$d{fhjPz!b+4n#=WNnf2Jlna>+w}bGdU6!t7}*T^KQ1C`r!5m$65DiR|LBK zwA-iPT>cBJ{0g}hHO2g4ew*=^ZWb7H9+qy_^#uQ6e*abBs?$eOf$FO;?SUz$620Y# za5bpV0|UC=OSq~Z@EHW^2LQ+cD5%g40;y+NP!6Zw6EehE76gI3{X&SO74|!W>;H*{ zuHio%No>k)Zsn@DtF~6|PfgiWZ*41QW$dlop3*Ar zwgL4%L(`);2Ok%Xh2nG6G@C7n!~=}ijXt57>`egnfRnwf&T~Ad|4)D zUl5tv09H62RHz!{-%~(mN_-pw#2+#IhL%WUXELV=8$HR)zVI7N!9{amf<`#59{^GO z-`7%gqUUcV@}T|}fHEGgih_pz8x^foO4A2Riv8|#evl&S%z;+LF>@d!xQ?ArNs!yoVLqC|f)p#$0iG7F zi-+AT(v1j&V5Y#OvJbXPs?*)5PD87$%HB#Y#O-6ABe~;} zn4{$7agoet#6E63Gmcyzx0qQ#^y5b}B_s!)`^b**qZm6mIzBuos3yTwu@@kxjnWGVU`%kKY+Wm!Tp6GBKrAqxo?DmKBG0(F@YAu=R!dQ?U+ z#E_2D%d+6(EDLn5=u)0PzoP)^SnsXq=goo$8@fe|iOK3CnK<7el2;Q=i93qdb0Kk<5Jz@SjAV*P$HZCc zWu;cNJ%apW;+kQU88U<#n4waqydL}_vTjniw_6%`LH(r1)qQ2h^JfH*%ag|W!=*}r z4R|%q#d-3gNZsU7Wa?z!;r^Qe15m`3yM{m%$lX)6$HW(tRg()xaOF}MI9EIBE3+z& zn{e)N6Rd5I3BG0P8OKqL4d`3qg;zPnQ z7C;7eGLjlH%OyF#UZR&S4_q%&YMPstKj7%8m%cIlHU$yeG&Js^^cfFm2c{k66ZM<*$pK9+G1VR|(9!Nuv3 znzfnD-U_%s+l=I2)60A{S$py&&GG!&*&KWdJY$OtG0+bK7z6oYMzH#L{``A0G$eNB z()G!59ua*X-dJphSf zD{hwGEWfnv^KE_GO1776AJ}$t+nsHGmBT7WR7O_DRK{*k+&*RdOWO;#|4?2?{xNg( zlSx?g$DPtmF&KA(IW5vRaN;|qA1D+JHKSxRTtMfwt~p}s;BcF$#TLDAVZak#fHU*~ z3Vac6seVwMccRLDkbN!uB=YpE(VEJAXc7iSbdT(vHIE4-pU#R}jQ0WY5K1Ku0fr>p z(L2OHo%v)WBV7R`=k4w22X!-5Z0 zh{LeOAQc>&c&zr$Wosvd;1fD8!BxT(PMS=xRQU{!+nMH$%g9cU&=og2!0OA6;A5KujL zB8<<>4bdaW=FpvhJ^(Vc84Iwn7k0M>%Qlu5sJOoqS)lYI4H5?QKJlLyB45Wz{Ja=% zx(+E84JWJTr34Kx6Hd@vhF1%xXpX~qvbQ9WcjmRRZ>G1Nv(b3z^4ie@0rJ@=^2{vc zG86cH)IQDwHCDG7g%RyKPuI96oys+%NvDL6=U;7OZ#eJ4=)EfEE%_yc>CQl8)IyU6 zO8#EBN?bBP)5hC9?>0ESBp-BdBkIoK7ga&Ao&XaFAoQ+F%Oq&?Ko3c6idtn(^FU`B zqH;jFsX=<1V##CxgH+S+JnvVd8^q%hZMYjs)(>U23^ z2)rLXpDy2bJoq_Pv`euM{KGl9>rQQEAT-Emw@ybI7UV)?`EkKUztR_hjD0hmpHnM*DS4pb zW&H3O;Vk&+J9xG22U?;12o+k?zKwt*IjIP;mN_*v=-oO{_a*gA{^>e!a{8iUaw2uC z_qsagXcwLQEp;L@i#)O@e&OJGf?MmuBXwU54Xp-y4NDyaVjzTm`C~vmN2@vaL8OfD z<6g>4>KDa9UUe)Q2hSUeDwWDcQnYxQPhYwt7z$e6i=13s#@rx@X`{n}%lPMBaws@# zaCmZX@Gii?`v4A}0>2H_Zb@1aP#g=VT+h7({{RjZg806>%z>`zyJ?YeA!eZXJ%)0L zj3tfV(Y?{4(K3a#%wa7HSco{Z z<)${d<4gdyK%eMb%X6*gP*y{4FLwu`0iD4evj=67*z^e1&3#Bq($WLRtZNkQ{f4188lX7}9lGlD(JS6)Fx+qO8pJqAHYt!-qgEwo(A53t zT7#%?d8412>8JvNrvk4s)by~(yk9s1$4zL3QwXhK1NvyQGrV3kpp}$j06q-Wnniq; z6fFtn(a;y#XbZO#D!Frq>n99uRw#9P)_VcG9c`6MzAMMr{!;kDGD0JVKN-g-ko#0r z;0R_IsaZ1047rpR0FWgtjv1^oP(tEfC}g0l61TYT+pvyGy>NIy3ndd>1L`Z0leHC zL#AhpU~|^U}Qq1D0AvW5bLgQe>uid9dh-{TVIw}G+6nTrVEFi0WJ?P z7H9{L`z$jA3V>UgRrI86%W5!(HP*hu8sHY|@;R$;dCI*b1MT|%s-a}iv{zNxH#Vl& ziyBj`p7s{F;M&_+Ts*IMjfwsVrsh*@71vLhOtkS;Y7mp9UY zrK-Q<^y~Uj_e=YIVFuE$bR@H$oLD-ANg#h;x>RGdpkqzwaub?L7A_mlyh64t3may% z7}gbUsjP0;-x3fqDmE$ku?6UD^4hX=Ke_p3pe+8)d@9i{4-Nh`2rT+jv)f^jk<4Bm zKXRMJsqXTGgkA%?mf3zwQ@1>R{2$QdKagWpq4kzudH*(YWBJc2^8s{=l&uISJ}dnE zzuB)BK8B+3CXb$B?uYI#uU>nIq2Md>}~pxDcrOA5xDs zpFW@$j)06KP*}G1e9Y$_2y(QrP>7v(w6lc@?9{`78c^X2a5_E^K8Bh+@I|`{}G8lgXJ^uY{ha34#p$xDoJiM|b^*mK=n7bTfr8 z0AVSFNGk(_mmKWb47b4tm~ff4XR|~SRy`tPxo@F^s`(uSiCYyClMK9WEYzN|1O>=O zAi<3>Si=Wh@8rf+K|baKt?h5T*ZYls*!bi}Q?iZQs$cz&_rJR{M5mvdxoJmT%eha# zR)kGoT11Xr_}f2+hNb4LsX6fapZdIF<0s8rusD6`s^_h3wiEAN>Hk(WJbd(&rMa74 zZtc1FUza}lf{C4#SJBw<*85j)u#=xE+k5cs>k7Ydi3^smE3dJ*e_naz72>rv2ufqL zc5-0r!yjSrr|smrwGGM>>yCNAC9!k;UhktK{$98p+)fs52=;nQw7e2xmrfct=oz)! Z;zTT(;d>y%ngpE%t9&Iod9%ou`(KJRbe{kK diff --git a/scorch.xex b/scorch.xex index 10a76e8b93bc46bf49193a8820aea037c64657cf..f0647ec34b8156da2d1b10ca87d43e6fb141dbeb 100644 GIT binary patch delta 7465 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 Ww&$c6!&E3H7{psv+Z&(R=>Gx06#FRv delta 7500 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 Ya5lzsdV+B}^eK#Debw=YPwn*o0wi$&EC2ui From 7f0643c47ed697f5d4229cb629d2be916c6cf0fa Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 13 May 2023 18:18:04 +0200 Subject: [PATCH 30/65] C64 executable update --- scorchC64.prg | Bin 39690 -> 39675 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scorchC64.prg b/scorchC64.prg index f866a76bb74b53bc92a20c31c5665ae7faa0c78d..303910fd0630673435c79cad281e2a1bd5100fba 100644 GIT binary patch delta 6334 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 AQ~&?~ From 81ad461f5e75af04d593f708bf5e855c5c18e28e Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 10:52:45 +0200 Subject: [PATCH 31/65] Manuals with graphics --- MANUAL_EN.md => Manuals/MANUAL_EN.md | 0 MANUAL_PL.md => Manuals/MANUAL_PL.md | 8 ++++++-- Manuals/images/ActDefensive.png | Bin 0 -> 4452 bytes Manuals/images/ActOffensive.png | Bin 0 -> 4854 bytes Manuals/images/DiffMenu.png | Bin 0 -> 3993 bytes Manuals/images/MainMenu.png | Bin 0 -> 6702 bytes Manuals/images/PurDefensive.png | Bin 0 -> 8600 bytes Manuals/images/PurOffensive.png | Bin 0 -> 8699 bytes Manuals/images/StatusLine.png | Bin 0 -> 3961 bytes 9 files changed, 6 insertions(+), 2 deletions(-) rename MANUAL_EN.md => Manuals/MANUAL_EN.md (100%) rename MANUAL_PL.md => Manuals/MANUAL_PL.md (98%) create mode 100644 Manuals/images/ActDefensive.png create mode 100644 Manuals/images/ActOffensive.png create mode 100644 Manuals/images/DiffMenu.png create mode 100644 Manuals/images/MainMenu.png create mode 100644 Manuals/images/PurDefensive.png create mode 100644 Manuals/images/PurOffensive.png create mode 100644 Manuals/images/StatusLine.png diff --git a/MANUAL_EN.md b/Manuals/MANUAL_EN.md similarity index 100% rename from MANUAL_EN.md rename to Manuals/MANUAL_EN.md diff --git a/MANUAL_PL.md b/Manuals/MANUAL_PL.md similarity index 98% rename from MANUAL_PL.md rename to Manuals/MANUAL_PL.md index 86a33d0..b2f1598 100644 --- a/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -3,6 +3,7 @@ Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce). ## 1. Wybór opcji gry. +![Ekran wyboru opcji gry.](/images/MainMenu.png) Na pierwszym ekranie możemy skonfigurować opcje rozgrywki: * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość) @@ -28,6 +29,7 @@ Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmien Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. ## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer +![Ekran wyboru graczy i poziomu trudności.](/images/DiffMenu.png) Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje). Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz. Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5]. @@ -38,17 +40,19 @@ Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. ## 3. Ekran zakupów (przed każdą rundą) - +![Ekran zakupów broni ofensywnych.](/images/PurOffensive.png) +![Ekran zakupów broni defensywnych.](/images/PurDefensive.png) Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. +![Ekran aktywacji broni defensywnych.](/images/ActDefensive.png) Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. (oczywiście dla graczy komputerowych ten ekran się nie pojawia) ## 4. Główny ekran gry - +![Główny ekran gry.](/images/StatusLine.png) W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: * nazwa czołgu gracza * numer aktywnego joysticka diff --git a/Manuals/images/ActDefensive.png b/Manuals/images/ActDefensive.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0b1f2e5c2bd08db834c8df4dc0703cf6429d75 GIT binary patch literal 4452 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 literal 0 HcmV?d00001 diff --git a/Manuals/images/ActOffensive.png b/Manuals/images/ActOffensive.png new file mode 100644 index 0000000000000000000000000000000000000000..155eecabf0217f2461c887072b9efeb55322955c GIT binary patch literal 4854 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 literal 0 HcmV?d00001 diff --git a/Manuals/images/DiffMenu.png b/Manuals/images/DiffMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2dc21d9f5879980f6c1c31ca1565022bacbc05 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/Manuals/images/MainMenu.png b/Manuals/images/MainMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..359c4e8d57b721a238df4c3beaafbf8c2c6e1636 GIT binary patch literal 6702 zcma)BXHb*fwg&0aL8KRnluw!vr5Ok)O=+TrUZjRDAVMG%=^e}m1d%F5s&oi7fb^o2 zNQcm+h8k)pmviQvxijaUANS9mz4xryGy7d@J>}g|FLl&uZ*$xxA|j%FuA%aZh=};* z&3upY*3CGzSn`{Qi2dlfit-!SH14t`Uctn@i}-hKJ0snvPai4!8Z|&f2})|=AG#>} z`1b{fgjDW^H&$JR;r9B8Nf%ZG*EM>h1R?^ML^V|em7Z4d5>dQ&^1+o~?I=R+#wFNr zEnc|d&C8Lw0^Olls(YafPbvTJU=@6#W!l@Mdu4CO>wltc{7S~;s>$fF3IiDJw#w<8ZAF}M`wnLW%+{zPl>gm9QzzI+X@4l;4mUql$Wc3J( zd8ACJPGibJd|9X%?(rUo;GLK?IZsf@%rpS_Bv^agj1d5F_Z zFvWOl*c9svf<|SS3DUSiIL!g*1+Qe4MZQ6fEe64<*w2Q&PukTT74I22X|3o0wtB?i zl2|SmLzaJM%Esp5DBy`&-T5teHwI0;ozY0JNukQYODiV@y;LRUFP@?FFoc9$7(k(# zoKC(*y2>nJ8I81sG%r;x8-DTk=hA`?4V)AJLA@Go-1*9?pIR{ZP9=&$HS3{s$~ru0 z3n)nH2j;m7h`#W(gl=}H63X+{hNQ#p^L*WkVdr27kF3JZWOOFLN1DxMh|8HKtrm%R zzhZk(f)}pTc2_@6X8Zly*0IAH_5N*cD3S!e;*xK^@4Rf|P$y7E>s#ATnhsPOuX1#X zr;goLKNnpOGYY9f)^b}{km`L;qBdkHNdrgzLAL8}np^cv*E1iR+NB|jXnAW~bMQ+I z_gX;Y1K;YX*)}xy+-DQpgonaoLhj=2z&gNH+d9OgB7bG*z})jFU>1^0b)Fo){%8I{ z-ScuoPH&rpjgL}42ca;SWr1?#J&shPqH5U^3bNwjk?O24_?aLWK!C`r=mI|q0!SiF zj~d>HmDA`m<)a+lI%~5&@_Aq3C+E@64)dDQN(y1v;Qgvs@hIkZi4ie1w@qcL3!^)69Vtu#f!tC01byRwAaY6db~&|KAamEMaw^r(D)9)01YOB1~qFHaM%4Uf9MWv|}&dK+%26|i4NBO!p@kQ87HQv+U{#7_Hcn^ceO%^SlMp;b+Mx+UR+3-*-|C8CGMie zO7msC@U!gbU@=8;=}4M(w~~}+am5ANUF*nzKPgZ_!y_FFn;fnCYHcR>)!vLz#UEHF z9uJ?nsDB(cvicR6QvAWor#2Q385I90{h~zcp_J>guPcd&Lo%XQ#fsL9Q495JDeAFj z7o-%OPmw!0e1>24nYVpD+{fQf>~Zk+eSqM{sRv*N)@hQu!0&JGny1xT};(Dl){c`%qF;ogmS-zB{*B8II8i+hMw%K9w+oXu>} z0vF!1eZC?e^9nkmfpWeD@J9-hd?jLp2p8%{Cn}_jkScIQWFDIZryJ@P6^kVk7mwIj z9sXZTkJwIo2ImOL)wBFf+IC^`PNPqw-ly1iSh%!OE5d)$L=DQ^|H=X~& zA%tQpPOU@>=#(&0@f^PHglp15p*-pBRivoC3E@OP2w`iA8|BgDCDY`5xq;qBVn?yPR3Z%O zHERHgj8li@)|YGFCVJM9SC7FpaA6)?u-~z9&weJihUdt94fDSn_kT(87xZ-L=V4%i zzke*2q&+YMQ$Mq<~AB!JYL1FLn8acuZ1Z=07Afwi3HPpLo^eH2Ckusf3z2O>SS-Ft@GeGG*9%$@} zS>!D4n9WTP0nhA$FM57EUOq^j-$PL6-)h8Ucs;_L&92leeD1whN7gp@e(jkNwY+@3 zFXc9a-j2pfEa*4O(TLQd5uD+h%rCoe-HrXN$~hQF>7iTWu{C%}Ea@lL~e$;Zz98wRM zi=0FZ?IC$|H-z-5ZUOW-x8FxXj?6pxW{|?nYAj*2zM_$IX|)x)r7Yr;g6Xs3dC{v$ zN{{&_7?N~3QI2t1^kh#W*1J?w1E1EAo!wjpb+MMJ5vxRwVAF%_#tYTO>RqXCM7-o? z>^Ycq)*&xos&P}uHDPLS4C$=iZ?7~MNdCDr2r9UK@^V;_qVh>rJ||C~YIx~E2&F>Z zA5UV$WGxI0Sby{~q7B;^K^`V1!ROI#NR`yvxpPZ>SLgPfx>KVTb+! zHva&(!j@N^7a93)Bc+|~@}8{}LsO6%aPr0U^z6o40Td+NTncpk1p}cb@6dT5&ifcz z-%Z)rNYj;(JWq2)ASYI;nfBW!md}#1JmPP(0Xe1_6jkjmE8&%L57MOX(oBC_6&;Lt z)>+G&J*~uIuX?NCm8!BQQApi}Th1)C*;1(A-4+Mbee)IKn(ly3)tSD&0RGA@n8cxm z=%R=Bqrv#p*0Mwm(V}8Ax;`k0f%&4`c+p{1^v0ANAZsyPy~6O=8>k>-Gch>;56~P! zx=npqM=t$v+77BoRZ8tXEUVpQ8R&jbDzCQO5QAy1Segl_K%fpvAM-q|%2jfA_eYd^Vh2}@#?m&mJrdeG9&4TRcCHsTR-XTkz#kE{PNRr zDm?%%xi z8OpJ$$%{&Kyr+uuczX%*^SD%M_VDAkC|F)cY9qPQhW6mFfugFxK_+nnQh{lyxkggh zq}=VyNxE-M9bgYMQ9)91J?k2C=vwk@q&=Dn%&D?X-U9PuaJsXT=l88_4{<1YsW_Yr z1M1GSEpn~y?WpJ=*Bs8#r>jCutEbjl@}u=0Nq^pLh@CVGK&F7Z;sNVtw*q)9e|?HQ z>L&i49KeK=HE>^^_T%3*5L3RT|4nb>@sJ*A1{Ls&wh`Ka!wW<0RAOqsdVDi`tzB3yMEJ5U$^NQ>>(6otO3Eq_E{= z9V^jCp%Rc``Fs|T1&cdD=kV`6aVKFqs&E>09MPigG6Qor5W@CWeY%xLttAh4; z-4(KQmal2E3E*%2YDuuaFyt`7tV*W#{)AgVGjDen69nvs3#SEOsai>YsYVAt6p_kJ ziA*<1?jKfDiH=wUHs@0yirltqi?n6{p(B2s3wL0Y5vS>j!b44*O}Aq|+ul-Bd0+B@ zm`k#MB+}_HY8EHGu;eG3*h^*+1ziCiIexdb%Y-_mSx5a8&75>s6ydML$d36?M=Xz! zeD`?3hSi%z1U%?1US0CDOPPOuMg#5uUz_=o(tT+bW->Gbs7 z^gnF%yC@tAuc!ECc2FxdD6iII%s0lqqj?;TR9rm9GuRN}C* zMj0c`&;5hy4nRTbrA>+Mbh+*3Z41>nQyYf39C9NL$$pN^w zp;wxfl&(Ys^%$}j&9Xkq;hEOl*Xa?J%kZX_IP;fC4v686-ufm|dt^NpdIG5_djNj8 zP@f!!uthoCOO7aZyl*U#r2)SI=xJNeuq@ww@-3o$XD)K9`_e`4F&_0z$vXU%WH77u zZGucQKY4`Kx1z+}ex0)W1nJVC7`q26lbInVta#j4(?S_bPboI?@K;Kvw{j!;a!h

Zu>ZO}=mkp!c|Fg&`vSfQ5E*R$Nfe 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

!pPYa91L?TA&xQEtL=^El z4m+73c+!YBoZKKg<~NT9eEO4u{HA_=@#cS+!;7v4h4 zjIxaELQQpjQ(ItYRP4N0USADy0WrXNbo=r_g!s6TVCku3FW@?2pr+yCQ&EA=IXKeg z{Vs1u%W%)B7b7+pInQnnsM$4epWnfGa_Ysozk{>&8J|`mdfoV&(Aj|B`{Wm4$^l3n zw@-)T!qff%=bI9lp-~Td$TkE;JQsFi`@(%|eQZOvT!)x?(uB{SjuGx|a+1Uaq#Oul zhSC9j%QkE&)iv7&zaO6zI(yYSX?acEpAC%##I4v?-g@ebn`2S) zUzKN7x1IjZO(>ci5j`tz-kRJZO{JmtPyhbyPxl`A#U-rDC^&HV$kAgbhTSBIf84IF zZSFhwgYSa3(^c3ybVJ}7F?Z>Dx$)^=3(mVR2QwEW_>&9d;Y$}hi5koeG{o#;=`rT# qkYd*Ok5H>E)Dg)M_E2j}XmIghXz-bV(1Kdl*b>?YE!h`E0sjjbX_?vp delta 4853 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 diff --git a/weapons.asm b/weapons.asm index f1a8cdb..a86f328 100644 --- a/weapons.asm +++ b/weapons.asm @@ -2685,7 +2685,6 @@ pressedLeft jsr DecreaseShieldEnergyX ; first erase old tank position jsr ClearTankNr - mva #0 Erase lda XtankstableH,x cmp #0 bne @+ @@ -2703,7 +2702,7 @@ NoLEdge mva #162 AngleTable,x ; then draw tank on new position DrawFloatingTank - jsr DrawTankNr + jsr PutTankNr jsr DisplayStatus jsr WaitOneFrame jsr CalculateSoildown @@ -2782,7 +2781,6 @@ TankBelow ldx TankNr ; first erase old tank position jsr ClearTankNr - mva #0 Erase bit OverTankDir bmi PassLeft PassRight @@ -2798,7 +2796,7 @@ PassLeft mva #162 AngleTable,x Bypassing ; then draw tank on new position - jsr DrawTankNr + jsr PutTankNr jmp CheckForTanksBelow RightFromTheTank LeftFromTheTank From 7c482d798cc87feee0b9f3fb9fa855f0994aeb13 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Thu, 18 May 2023 20:47:50 +0200 Subject: [PATCH 48/65] Quick exit reaction --- scorch.asm | 42 +++++++++++++++++++++++++++++++++++++++ scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56560 -> 56612 bytes scorchC64.asm | 12 ++++++++++++ weapons.asm | 53 ++++++++++++++++++++++++++++---------------------- 5 files changed, 84 insertions(+), 23 deletions(-) diff --git a/scorch.asm b/scorch.asm index fc56e0e..b6d444a 100644 --- a/scorch.asm +++ b/scorch.asm @@ -556,8 +556,50 @@ MakeDarkScreen rts .endp +;-------------------------------------------------- +.proc CheckExitKeys +;-------------------------------------------------- +; Checks keyboard and sets appropriate flags for exit procedures +; If START+OPTION is pressed - exit to GameOver screen +; If 'O' key is pressed - displays "Are you sure?" and - exit to GameOver screen +; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen +; Just setting the right flags!!! + + ; Select and Option + lda CONSOL + and #%00000101 ; Start + Option + beq QuitToGameover + lda SKSTAT + cmp #$ff + jeq nokeys + cmp #$f7 ; SHIFT + jeq nokeys + + lda kbcode + and #%10111111 ; SHIFT elimination + + cmp #@kbcode._O ; $08 ; O + bne CheckEsc + jsr AreYouSure + bit escFlag + bpl nokeys + ;---O pressed-quit game to game over screen--- +QuitToGameover + mva #$40 escFlag + rts +CheckEsc + cmp #@kbcode._esc ; 28 ; ESC + bne nokeys +DisplayAreYouSure + jsr AreYouSure + ;---esc pressed-quit game--- +nokeys + rts +; +.endp ;-------------------------------------------------- .proc ShellDelay +;-------------------------------------------------- lda CONSOL and #%00000101 ; Start + Option bne @+ diff --git a/scorch.bin b/scorch.bin index bba74c163eecc86eee773d5858284308594a75a6..6360dbb977f9ed1d10c81565fd312b89f22c90e1 100644 GIT binary patch delta 7033 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 delta 6936 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 delta 7067 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 Date: Thu, 18 May 2023 21:17:45 +0200 Subject: [PATCH 49/65] Quicker exit reaction --- game.asm | 7 +++++-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56612 -> 56617 bytes 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/game.asm b/game.asm index 16e62db..e73903a 100644 --- a/game.asm +++ b/game.asm @@ -410,8 +410,8 @@ GoFloat jsr TankFlying lda #0 sta ActiveDefenceWeapon,x ; deactivate after use - bit escFlag - bpl ManualShooting ; after floating tank can shoot + lda escFlag + beq ManualShooting ; after floating tank can shoot rts StandardShoot inc noDeathCounter @@ -428,6 +428,9 @@ ShootNow ldy TankNr mva #$00 plot4x4color jsr DisplayOffensiveTextNr + + lda escFlag + seq:rts ; keys Esc or O lda HitFlag ;0 if missed beq missed diff --git a/scorch.bin b/scorch.bin index 6360dbb977f9ed1d10c81565fd312b89f22c90e1..77ed68ae7050e33ee44f6d3406b57e0572735f6d 100644 GIT binary patch delta 7462 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 delta 7715 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 diff --git a/scorch.xex b/scorch.xex index c2c5d4633a280a1300fabf6fbc676b91eaf1082d..560ffa16ca5e005169a7e4ef2b36cfac7f9e9024 100644 GIT binary patch delta 7621 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 Date: Fri, 19 May 2023 10:24:25 +0200 Subject: [PATCH 50/65] Exit optimizations and better delay for C64 --- game.asm | 18 +++++++++--------- scorch.asm | 10 ++-------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56617 -> 56592 bytes scorchC64.asm | 5 ++++- scorchC64.prg | Bin 40021 -> 39996 bytes weapons.asm | 33 ++++++++++----------------------- 7 files changed, 25 insertions(+), 41 deletions(-) diff --git a/game.asm b/game.asm index e73903a..b955ff3 100644 --- a/game.asm +++ b/game.asm @@ -43,8 +43,8 @@ MainGameLoop jsr MainRoundLoop bit escFlag - bmi START jvs GoGameOver + bmi START jsr CalculateGains @@ -369,8 +369,8 @@ RoboTanks cmp #@kbcode._esc ; 28 ; ESC bne @+ jsr AreYouSure -@ lda escFlag - seq:rts ; keys Esc or O +@ bit escFlag + spl:rts ; keys Esc or O jmp AfterManualShooting @@ -382,8 +382,8 @@ ManualShooting lda #%00000000 sta TestFlightFlag ; set "Test Fight" off jsr BeforeFire - lda escFlag - seq:rts ; keys Esc or O + bit escFlag + spl:rts ; keys Esc or O AfterManualShooting mva #$00 plot4x4color @@ -410,8 +410,8 @@ GoFloat jsr TankFlying lda #0 sta ActiveDefenceWeapon,x ; deactivate after use - lda escFlag - beq ManualShooting ; after floating tank can shoot + bit escFlag + bpl ManualShooting ; after floating tank can shoot rts StandardShoot inc noDeathCounter @@ -429,8 +429,8 @@ ShootNow mva #$00 plot4x4color jsr DisplayOffensiveTextNr - lda escFlag - seq:rts ; keys Esc or O + bit escFlag + spl:rts ; keys Esc or O lda HitFlag ;0 if missed beq missed diff --git a/scorch.asm b/scorch.asm index b6d444a..d57ce7b 100644 --- a/scorch.asm +++ b/scorch.asm @@ -126,7 +126,7 @@ FirstZpageVariable = $57 .zpvar RangeLeft .word .zpvar RangeRight .word .zpvar NewAngle .byte - .zpvar escFlag .byte + .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word .zpvar plot4x4color .byte ; $00 / $ff @@ -585,7 +585,7 @@ MakeDarkScreen bpl nokeys ;---O pressed-quit game to game over screen--- QuitToGameover - mva #$40 escFlag + mva #$C0 escFlag ; bits 7 and 6 set rts CheckEsc cmp #@kbcode._esc ; 28 ; ESC @@ -600,12 +600,6 @@ nokeys ;-------------------------------------------------- .proc ShellDelay ;-------------------------------------------------- - lda CONSOL - and #%00000101 ; Start + Option - bne @+ - mva #$40 escFlag -@ and #%00000001 - beq noShellDelay ldx flyDelay DelayLoop lda VCOUNT diff --git a/scorch.bin b/scorch.bin index 77ed68ae7050e33ee44f6d3406b57e0572735f6d..a9d1a3ab153dfb8368b0d5a6593e6dcdd3bb1359 100644 GIT binary patch delta 7237 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 delta 7270 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 Q(3UXCPpXsm*1IwP2PvIii2wiq diff --git a/scorch.xex b/scorch.xex index 560ffa16ca5e005169a7e4ef2b36cfac7f9e9024..2ecc23d5bcac4ab9b49e02cc978880947036195b 100644 GIT binary patch delta 7180 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 delta 7122 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 DvBXl& diff --git a/scorchC64.asm b/scorchC64.asm index 2ecd979..e639b60 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -128,7 +128,7 @@ FirstZpageVariable = $58 ; $57 .zpvar RangeLeft .word .zpvar RangeRight .word .zpvar NewAngle .byte - .zpvar escFlag .byte + .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word .zpvar plot4x4color .byte ; $00 / $ff @@ -334,6 +334,9 @@ MakeDarkScreen ldx flyDelay DelayLoop lda $d012 +@ cmp $d012 + beq @- + lda $d012 @ cmp $d012 beq @- dex diff --git a/scorchC64.prg b/scorchC64.prg index a02c5ec44477de9bc1f3f68bd7fc879bea0d3d66..ef75fc4bf0734ecb48f3d186bbd0473ac74c414f 100644 GIT binary patch delta 6300 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

eka<>Z*~eU3S$}u$3h`r2Dc`lE87zHlB&DG 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 Date: Fri, 19 May 2023 11:31:22 +0200 Subject: [PATCH 51/65] Exit from SoliDown. --- grafproc.asm | 4 ++++ scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56592 -> 56603 bytes 3 files changed, 4 insertions(+) diff --git a/grafproc.asm b/grafproc.asm index d232239..3d7b144 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1419,6 +1419,10 @@ ColumnIsReady bcc FalloutOfLine beq FalloutOfLine + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + bit escFlag + spl:rts ; exit if pressed 'Exit keys' + lda IsEndOfTheFallFlag ; we repeat untill at some point first table reaches ; level of the mountains diff --git a/scorch.bin b/scorch.bin index a9d1a3ab153dfb8368b0d5a6593e6dcdd3bb1359..2edd9280b2ca76b7f7e1a00f07092e433de58215 100644 GIT binary patch delta 3685 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 delta 3553 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 Zu3itfQ#~H3pYv?3$4QgE{L6Hw{{Tg?gtPzv delta 3577 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 From 6447155be580666b83bc9c7db46fb0b5728ec264 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 19 May 2023 11:46:57 +0200 Subject: [PATCH 52/65] Ops... Turbo mode is working again --- scorch.asm | 5 +++-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56603 -> 56602 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scorch.asm b/scorch.asm index d57ce7b..2f1308f 100644 --- a/scorch.asm +++ b/scorch.asm @@ -537,8 +537,6 @@ MakeDarkScreen .proc WaitOneFrame ;-------------------------------------------------- lda CONSOL - and #%00000101 ; Start + Option - sne:mva #$40 escFlag and #%00000001 ; START KEY seq:wait ; or waitRTC ? rts @@ -600,6 +598,9 @@ nokeys ;-------------------------------------------------- .proc ShellDelay ;-------------------------------------------------- + lda CONSOL + and #%00000001 ; START KEY + beq noShellDelay ldx flyDelay DelayLoop lda VCOUNT diff --git a/scorch.bin b/scorch.bin index 2edd9280b2ca76b7f7e1a00f07092e433de58215..93365e5f197c7227121fc4c0562586aed96f4f48 100644 GIT binary patch delta 7046 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 Vy8E7VV=T1!MzIU&eo*L6{T~bk>h%Bs delta 7065 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 Kq~~6d8}o00)sLi2*;|c@fErVbo*C0^J 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 U2uv`>z@^+M-#vOF-?!8M20NztH~;_u delta 7023 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 From 86631ce2b0252e2f627dd7ebc099bba6b7d52848 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 19 May 2023 15:05:15 +0200 Subject: [PATCH 53/65] Exit from MoveBarrel (AI) --- game.asm | 7 ++++++- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56602 -> 56612 bytes 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/game.asm b/game.asm index b955ff3..a684de3 100644 --- a/game.asm +++ b/game.asm @@ -1023,7 +1023,12 @@ MoveBarrel mva #sfx_set_power_2 sfx_effect jsr DrawTankNr jsr DisplayStatus.displayAngle -; ldx TankNr + ; + jsr CheckExitKeys + bit escFlag + spl:rts ;---Exit key pressed-quit game--- + ldx TankNr + ; mva #1 Erase jsr WaitOneFrame jsr DrawTankNr.BarrelChange diff --git a/scorch.bin b/scorch.bin index 93365e5f197c7227121fc4c0562586aed96f4f48..b71a3d206df9c33cf17d0c106ab210337d6cff1a 100644 GIT binary patch delta 7448 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 delta 7242 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 diff --git a/scorch.xex b/scorch.xex index d50948afc8f7b90ab0f87541966887e44b2ab817..14d72f17e634f54c10307d06a583a5000101e0c1 100644 GIT binary patch delta 7414 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 delta 7417 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 P{RyK~j&)4CY$N{<6hzo& From 8486645bc80f1e54a7d073e618ee41a659172047 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Fri, 19 May 2023 15:30:45 +0200 Subject: [PATCH 54/65] Minor optimization --- game.asm | 1 - grafproc.asm | 1 - scorch.asm | 1 + scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56612 -> 56602 bytes weapons.asm | 4 ---- 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/game.asm b/game.asm index a684de3..967980b 100644 --- a/game.asm +++ b/game.asm @@ -1025,7 +1025,6 @@ MoveBarrel jsr DisplayStatus.displayAngle ; jsr CheckExitKeys - bit escFlag spl:rts ;---Exit key pressed-quit game--- ldx TankNr ; diff --git a/grafproc.asm b/grafproc.asm index 3d7b144..0c310d1 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1420,7 +1420,6 @@ ColumnIsReady beq FalloutOfLine jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - bit escFlag spl:rts ; exit if pressed 'Exit keys' lda IsEndOfTheFallFlag diff --git a/scorch.asm b/scorch.asm index 2f1308f..d1d56c9 100644 --- a/scorch.asm +++ b/scorch.asm @@ -592,6 +592,7 @@ DisplayAreYouSure jsr AreYouSure ;---esc pressed-quit game--- nokeys + bit escFlag rts ; .endp diff --git a/scorch.bin b/scorch.bin index b71a3d206df9c33cf17d0c106ab210337d6cff1a..0b5931df1a2bd3ceaa3cff0f7aab633f71a8bd99 100644 GIT binary patch delta 4283 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 diff --git a/scorch.xex b/scorch.xex index 14d72f17e634f54c10307d06a583a5000101e0c1..d6af7c79a3f8b262071b85cf1e238b9e7ebca7f6 100644 GIT binary patch delta 4249 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 diff --git a/weapons.asm b/weapons.asm index adffb57..ca511ac 100644 --- a/weapons.asm +++ b/weapons.asm @@ -1099,7 +1099,6 @@ ContinueToCheckMaxForce2 notpressed jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - bit escFlag spl:rts ; exit if pressed 'Exit keys' ldx TankNr ; for optimize @@ -1764,7 +1763,6 @@ nonowait jsr shellDelay ; jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - bit escFlag spl:rts ; exit if pressed 'Exit keys' ldx TankNr ; @@ -2104,7 +2102,6 @@ mrLoopi ; phx jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - bit escFlag bpl ExitnotPressed plx rts ; exit if pressed 'Exit keys' @@ -2606,7 +2603,6 @@ KeyboardAndJoyCheck LotOfFuel notpressed jsr CheckExitKeys - bit escFlag spl:rts ;---Exit key pressed-quit game--- ldx TankNr From d0e1dc6f18fb4748e11f79de3ae4cbc4d5720dba Mon Sep 17 00:00:00 2001 From: pkali Date: Fri, 19 May 2023 23:16:49 -0400 Subject: [PATCH 55/65] multiple texts improved, tabs elliminated --- Atari/display_purchasedl.asm | 2 +- Atari/display_static.asm | 58 +- Atari/gr_basics.asm | 350 +++--- Atari/interrupts.asm | 278 ++-- Atari/textproc.asm | 996 ++++++++------- C64/gr_basics.asm | 520 ++++---- C64/interrupts.asm | 18 +- C64/textproc.asm | 132 +- ai.asm | 1310 +++++++++---------- artwork/sfx/rmtplayr_modified.asm | 996 +++++++-------- artwork/splash_v2/lzss_player.asm | 34 +- artwork/splash_v2/splash.asm | 338 ++--- constants.asm | 686 +++++----- constants_top.asm | 12 +- definitions.asm | 224 ++-- game.asm | 474 +++---- grafproc.asm | 826 ++++++------ scorch.asm | 384 +++--- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56602 -> 32676 bytes scorchC64.asm | 224 ++-- variables.asm | 34 +- weapons.asm | 1950 ++++++++++++++--------------- 23 files changed, 4918 insertions(+), 4928 deletions(-) diff --git a/Atari/display_purchasedl.asm b/Atari/display_purchasedl.asm index f2d8353..79e3779 100644 --- a/Atari/display_purchasedl.asm +++ b/Atari/display_purchasedl.asm @@ -15,7 +15,7 @@ DLPurTitleAddr .byte $50 .byte $42 .word purchaseTextBuffer - .byte $00+$80 + .byte $00+$80 .byte $20+$80,$10+$80,$42 MoreUpdl .word EmptyLine diff --git a/Atari/display_static.asm b/Atari/display_static.asm index 52e2674..07f6b0d 100644 --- a/Atari/display_static.asm +++ b/Atari/display_static.asm @@ -13,7 +13,7 @@ OptionsScreen .IF TARGET = 800 dta d" Please select option with " - dta $fe,$dc,$dd,$ff ; cursors in inverse + dta $fe,$dc,$dd,$ff ; cursors in inverse dta d" and " dta d"Tab"* dta d" " @@ -40,7 +40,7 @@ NameScreen5 .IF TARGET = 800 dta d"TAB"* dta d" - Port nr " - dta $fe,$dc,$dd,$ff ; cursors in inverse + dta $fe,$dc,$dd,$ff ; cursors in inverse dta d" - Difficulty" dta d" " dta d"INV"* @@ -182,19 +182,19 @@ dl ; MAIN game display list ;----------------------------------------------- OptionsDL .byte $70 - .byte $47 - .word OptionsTitle + .byte $47 + .word OptionsTitle .byte $70,$70 .byte $42 .word OptionsScreen .byte $30,$02,$02,$70 - .byte $42 - .word OptionsHere - .byte $10 + .byte $42 + .word OptionsHere + .byte $10 :maxOptions-1 .by $02,$10 - :(9-maxOptions) .by $70,$10 - .byte $80 - .byte $60 ; to match moved sprites + :(9-maxOptions) .by $70,$10 + .byte $80 + .byte $60 ; to match moved sprites .byte $4f .word (display+140*40) :21 .by $0f ;76 @@ -204,25 +204,25 @@ OptionsDL ;Enter names of tanks DL NameDL .byte $70 - .byte $47 - .word DifficultyTitle - .byte $70,$70 ; 16 empty lines + .byte $47 + .word DifficultyTitle + .byte $70,$70 ; 16 empty lines .byte $42 .word NameScreen - .byte $30 ; 4 empty lines - .byte $42 - .word NameScreen2 - .byte $30+$80 ; 4 empty lines + DLI - .byte $42 - .word NameScreen3 - .byte $10 ; 2 empty lines - .byte $42 - .word NameScreen4 - .byte $02,$02 - .byte $30 ; 4 empty lines - .byte $42 - .word NameScreen5 - .byte $02 + .byte $30 ; 4 empty lines + .byte $42 + .word NameScreen2 + .byte $30+$80 ; 4 empty lines + DLI + .byte $42 + .word NameScreen3 + .byte $10 ; 2 empty lines + .byte $42 + .word NameScreen4 + .byte $02,$02 + .byte $30 ; 4 empty lines + .byte $42 + .word NameScreen5 + .byte $02 .byte $41 .word NameDL ; ------------------------------------------------- @@ -252,8 +252,8 @@ GameOverDL .byte $42 .word GameOverResults :5 .byte $00+$80,$02 - .byte $01 - .word DLCreditsFragm + .byte $01 + .word DLCreditsFragm ; --------------- ; end of "constants" (ROM) ;----------------------------------------------- diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 3dec1df..18219dd 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -41,7 +41,7 @@ MakeUnPlot ;--- tay ldx WhichUnPlot - tya + tya sta oldply,x ldx ydraw @@ -194,43 +194,43 @@ ClearPlot ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify - mva #1 color + mva #1 color drawmountainsloop ldy #0 lda (modify),y - cmp #screenheight - beq NoMountain + cmp #screenheight + beq NoMountain sta ydraw - sty ydraw+1 + sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw sta tempbyte01 jsr plot.MakePlot - ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) + ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) ; jmp IntoDraw ; jumps inside Draw routine ; because one pixel is already plotted (and who cares? :) ) @ - lda (xbyte),y - and bittable2,x - sta (xbyte),y + lda (xbyte),y + and bittable2,x + sta (xbyte),y ;IntoDraw - adw xbyte #screenBytes - dec tempbyte01 - bne @- -; end of Drawline proc + adw xbyte #screenBytes + dec tempbyte01 + bne @- +; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot - inc ydraw - lda ydraw - cmp #screenheight - bne drawline -; end of Drawline proc + inc ydraw + lda ydraw + cmp #screenheight + bne drawline +; end of Drawline proc .ENDIF NoMountain inw modify @@ -261,7 +261,7 @@ NoMountain ldy #7 CopyChar lda (fontind),y - eor #$ff + eor #$ff sta char1,y lda #$ff sta char2,y @@ -272,7 +272,7 @@ CopyChar ldy #7 CopyMask lda (fontind),y - eor #$ff + eor #$ff sta mask1,y lda #$00 sta mask2,y @@ -312,7 +312,7 @@ MakeMask00 .endr sec .rept 8 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough ror char2+# .endr dex @@ -331,12 +331,12 @@ EmptyChar ldx #0 CharLoopi lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y iny lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y dey @@ -345,42 +345,42 @@ CharLoopi cpx #8 bne CharLoopi .ELSE - mvx #7 temp ; line counter (Y) + mvx #7 temp ; line counter (Y) CharLoop1 - mva #7 temp+1 ; pixel counter (X) + mva #7 temp+1 ; pixel counter (X) CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot MakeCharPlot - lda Erase - bne ErasingChar - inc color + lda Erase + bne ErasingChar + inc color ErasingChar NoPlot - jsr plot.MakePlot + jsr plot.MakePlot AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #8 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - clc - lda ydraw - adc #8 - sta ydraw - bne EndPutChar + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #8 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + clc + lda ydraw + adc #8 + sta ydraw + bne EndPutChar NoMaskNoPlot - rol char1,x - jmp AfterCharPlot + rol char1,x + jmp AfterCharPlot .ENDIF EndPutChar rts @@ -397,16 +397,16 @@ EndPutChar ;-------------------------------------------------- cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS - cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + cpw dy #(4) + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS - ; checks ommited. + ; checks ommited. ; char to the table lda CharCode4x4 and #%00000001 - beq Upper4bits - lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) + beq Upper4bits + lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) Upper4bits sta nibbler4x4 lda CharCode4x4 @@ -414,28 +414,28 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table - ldy #0 + ldy #0 ldx #3 CopyChar - lda (fontind),y ; Y must be 0 !!!! - bit nibbler4x4 - bpl GetUpper4bits - :4 rol + lda (fontind),y ; Y must be 0 !!!! + bit nibbler4x4 + bpl GetUpper4bits + :4 rol GetUpper4bits - ora #$0f + ora #$0f sta char1,x lda #$ff sta char2,x ; and 4 bytes as a mask - lda #$f0 + lda #$f0 sta mask1,x lda #$00 sta mask2,x - adw fontind #32 ; next byte of 4x4 font + adw fontind #32 ; next byte of 4x4 font dex bpl CopyChar @@ -451,7 +451,7 @@ GetUpper4bits ; rorw xbyte ; rorw xbyte ;--- - ldy xbyte ; horizontal byte offet stored in Y + ldy xbyte ; horizontal byte offet stored in Y lda dy ; y = y - 3 because left lower. sec sbc #3 @@ -471,75 +471,75 @@ MakeMask01 .endr sec .rept 4 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough ror char2+# .endr dex bne MakeMask01 MaskOK01 - ldx #0 + ldx #0 CharLoopi4x4 lda (xbyte),y - ora mask1,x - bit plot4x4color - bpl PutInColor0_1 ; only mask - no char + ora mask1,x + bit plot4x4color + bpl PutInColor0_1 ; only mask - no char and char1,x PutInColor0_1 sta (xbyte),y iny lda (xbyte),y - ora mask2,x - bit plot4x4color - bpl PutInColor0_2 ; only mask - no char + ora mask2,x + bit plot4x4color + bpl PutInColor0_2 ; only mask - no char and char2,x PutInColor0_2 sta (xbyte),y dey adw xbyte #screenBytes inx - cpx #4 + cpx #4 bne CharLoopi4x4 .ELSE - mwa xdraw char2 - mwa ydraw mask2 - mva color mask2+2 - mwa dx xdraw - mwa dy ydraw - mvx #3 temp ; line counter (Y) + mwa xdraw char2 + mwa ydraw mask2 + mva color mask2+2 + mwa dx xdraw + mwa dy ydraw + mvx #3 temp ; line counter (Y) CharLoop1 - mva #3 temp+1 ; pixel counter (X) + mva #3 temp+1 ; pixel counter (X) CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot MakeCharPlot - lda plot4x4color - beq ErasingChar - inc color + lda plot4x4color + beq ErasingChar + inc color ErasingChar NoPlot - jsr plot.MakePlot + jsr plot.MakePlot AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #4 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - mwa char2 xdraw - mwa mask2 ydraw - mva mask2+2 color - bpl EndPut4x4 + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #4 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + mwa char2 xdraw + mwa mask2 ydraw + mva mask2+2 color + bpl EndPut4x4 NoMaskNoPlot - rol char1,x - jmp AfterCharPlot + rol char1,x + jmp AfterCharPlot .ENDIF EndPut4x4 rts @@ -573,7 +573,7 @@ EndPut4x4 iny cpy #screenheight+1 bne @- - rts + rts .endp ;-------------------------------------------------- .proc SetMainScreen @@ -584,7 +584,7 @@ EndPut4x4 ; and #$fc ; ora #$02 ; 2=normal, 3 = wide screen width sta dmactls - mva WallsType COLBAKS ; set color of background + mva WallsType COLBAKS ; set color of background jsr WaitOneFrame rts .endp @@ -601,79 +601,79 @@ EndPut4x4 ; ------------------------------------------------- mva #sfx_sandhog sfx_effect .IF FASTER_GRAF_PROCS = 1 - ldy #0 ; byte counter (from 0 to 39) + ldy #0 ; byte counter (from 0 to 39) NextColumn - ; big loop - we repat internal loops for each column of bytes - sty magic - ldx #120 ; line counter (from 0 to 60 ) - ; first loop - inverse column of bytes for a while - ldy magic + ; big loop - we repat internal loops for each column of bytes + sty magic + ldx #120 ; line counter (from 0 to 60 ) + ; first loop - inverse column of bytes for a while + ldy magic NextLine1 - jsr InverseScreenByte - dex - dex - bpl NextLine1 - ; - jsr WaitOneFrame ; wait uses A only - ; second loop - inverse again and put random "snow" to column of bytes - ldx #120 - ldy magic - mva #$55 magic+1 + jsr InverseScreenByte + dex + dex + bpl NextLine1 + ; + jsr WaitOneFrame ; wait uses A only + ; second loop - inverse again and put random "snow" to column of bytes + ldx #120 + ldy magic + mva #$55 magic+1 NextLine2 - jsr InverseScreenByte - lda random - ora magic+1 - and (temp),y - sta (temp),y - lda magic+1 - eor #$ff - sta magic+1 - dex - dex - bpl NextLine2 - ; and go to next column - iny - cpy #40 - bne NextColumn + jsr InverseScreenByte + lda random + ora magic+1 + and (temp),y + sta (temp),y + lda magic+1 + eor #$ff + sta magic+1 + dex + dex + bpl NextLine2 + ; and go to next column + iny + cpy #40 + bne NextColumn .ELSE - mva #1 color - mwa #120 ydraw + mva #1 color + mwa #120 ydraw NextLineSlow - lda #0 - sta xdraw - sta xdraw+1 + lda #0 + sta xdraw + sta xdraw+1 NextPixelSlow - bit random - bpl NoPlot - bvc NoPlot - jsr plot.MakePlot + bit random + bpl NoPlot + bvc NoPlot + jsr plot.MakePlot NoPlot - inw xdraw - cpw xdraw #screenwidth - bne NextPixelSlow - dec ydraw - dec ydraw - bpl NextLineSlow + inw xdraw + cpw xdraw #screenwidth + bne NextPixelSlow + dec ydraw + dec ydraw + bpl NextLineSlow .ENDIF - ; and we have "snow" :) - lda #0 - ldx TankNr - sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter - jsr SetFullScreenSoilRange + ; and we have "snow" :) + lda #0 + ldx TankNr + sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + jsr SetFullScreenSoilRange jsr SoilDown2.NoClearTanks - rts + rts - ; in order to optimize the fragment repeated in both internal loops - ; we save 15 bytes :) + ; in order to optimize the fragment repeated in both internal loops + ; we save 15 bytes :) InverseScreenByte - lda LineTableL,x - sta temp - lda LineTableH,x - sta temp+1 - lda (temp),y - eor #$ff - sta (temp),y - rts + lda LineTableL,x + sta temp + lda LineTableH,x + sta temp+1 + lda (temp),y + eor #$ff + sta (temp),y + rts .endp .ENDIF \ No newline at end of file diff --git a/Atari/interrupts.asm b/Atari/interrupts.asm index 175bdb1..e78b4fb 100644 --- a/Atari/interrupts.asm +++ b/Atari/interrupts.asm @@ -1,114 +1,114 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone ;-------------------------------------------------- .proc DLIinterruptGraph - pha - phy - ldy dliCounter - lda dliColorsBack,y + pha + phy + ldy dliCounter + lda dliColorsBack,y .IF TARGET = 800 - nop ; necessary on 800 because DLIs take less time, jitter visible without it - nop - nop + nop ; necessary on 800 because DLIs take less time, jitter visible without it + nop + nop .ENDIF - nop - nop + nop + nop sta COLPF1 - lda GradientNr - bne GoGradient - ldy #$ff ; one mauntain color + lda GradientNr + bne GoGradient + ldy #$ff ; one mauntain color GoGradient - iny - lda (GradientColors),y ; mountains colors array - sta COLPF2 - inc dliCounter + iny + lda (GradientColors),y ; mountains colors array + sta COLPF2 + inc dliCounter ply pla rti .endp ;-------------------------------------------------- .proc DLIinterruptOptions - pha - phy - lda #0 ; background color + pha + phy + lda #0 ; background color sta COLPF1 - ldy GradientNr - beq @+ - ldy #1 -@ lda (GradientColors),y ; mountains colors array - sta COLPF2 - ply + ldy GradientNr + beq @+ + ldy #1 +@ lda (GradientColors),y ; mountains colors array + sta COLPF2 + ply pla rti .endp ;-------------------------------------------------- .proc DLIinterruptGameOver - pha - phy - lda dliCounter - bne EndofPMG - lda #%00100001 ; playfield after P/M - prior=1 - ;STA WSYNC + pha + phy + lda dliCounter + bne EndofPMG + lda #%00100001 ; playfield after P/M - prior=1 + ;STA WSYNC sta PRIOR - bne EndOfDLI_GO + bne EndOfDLI_GO EndofPMG - cmp #1 - bne ColoredLines - lda #%00100100 ; playfield before P/M - ;STA WSYNC + cmp #1 + bne ColoredLines + lda #%00100100 ; playfield before P/M + ;STA WSYNC sta PRIOR - bne EndOfDLI_GO + bne EndOfDLI_GO ColoredLines - cmp #9 - beq CreditsScroll - tay - lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line) - ldy #$0a ; text colour (brightnes) - ;STA WSYNC - sta COLPF2 - sty COLPF1 - bne EndOfDLI_GO + cmp #9 + beq CreditsScroll + tay + lda GameOverColoursTable-3,y ; -2 because this is DLI nr 2 and -1 (labels line) + ldy #$0a ; text colour (brightnes) + ;STA WSYNC + sta COLPF2 + sty COLPF1 + bne EndOfDLI_GO CreditsScroll - lda #$00 - sta COLPF2 + lda #$00 + sta COLPF2 EndOfDLI_GO - inc dliCounter - ply - pla - rti + inc dliCounter + ply + pla + rti .endp ;-------------------------------------------------- .proc DLIinterruptText pha - lda dliCounter - bne MoreBarsColorChange + lda dliCounter + bne MoreBarsColorChange lda #TextBackgroundColor - ;sta WSYNC + ;sta WSYNC sta COLPF2 mva #TextForegroundColor COLPF3 - bne EndOfDLI_Text + bne EndOfDLI_Text MoreBarsColorChange - and #%00000001 - rol - sta COLPF2 + and #%00000001 + rol + sta COLPF2 EndOfDLI_Text - inc dliCounter + inc dliCounter pla DLIinterruptNone - rti - + rti + .endp ;-------------------------------------------------- .proc VBLinterrupt - mva #0 dliCounter - mva #$02 DliColorBack - - lda PAL - and #%00001110 - beq itsPAL - ;it is NTSC here + mva #0 dliCounter + mva #$02 DliColorBack + + lda PAL + and #%00001110 + beq itsPAL + ;it is NTSC here dec NTSCcounter bne itsPAL mva #6 NTSCcounter @@ -118,13 +118,13 @@ DLIinterruptNone itsPAL ; pressTimer is trigger tick counter. always 50 ticks / s bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s - + SkippedIfNTSC - bit RMT_blocked - bmi SkipRMTVBL + bit RMT_blocked + bmi SkipRMTVBL ; ------- RMT ------- - lda sfx_effect + lda sfx_effect bmi lab2 asl @ ; * 2 tay ;Y = 2,4,..,16 instrument number * 2 (0,2,4,..,126) @@ -138,53 +138,53 @@ SkippedIfNTSC lab2 jsr RASTERMUSICTRACKER+3 ;1 play ; ------- RMT ------- -SkipRMTVBL - bit ScrollFlag - bpl EndOfCreditsVBI +SkipRMTVBL + bit ScrollFlag + bpl EndOfCreditsVBI CreditsVBI - inc CreditsVScrol - lda CreditsVScrol - cmp #32 ;not too fast - beq nextlinedisplay - :2 lsr ;not too fast - sta VSCROL - jmp EndOfCreditsVBI + inc CreditsVScrol + lda CreditsVScrol + cmp #32 ;not too fast + beq nextlinedisplay + :2 lsr ;not too fast + sta VSCROL + jmp EndOfCreditsVBI nextlinedisplay - lda #0 - sta CreditsVScrol - sta VSCROL - clc - lda DLCreditsAddr - adc #40 - sta DLCreditsAddr - bcc @+ - inc DLCreditsAddr+1 + lda #0 + sta CreditsVScrol + sta VSCROL + clc + lda DLCreditsAddr + adc #40 + sta DLCreditsAddr + bcc @+ + inc DLCreditsAddr+1 @ - cmp #CreditsLastLine - bne EndOfCreditsVBI -; adw DLCreditsAddr #40 -; cpw DLCreditsAddr #CreditsLastLine -; bne EndOfCreditsVBI - mwa #Credits DLCreditsAddr + cmp #CreditsLastLine + bne EndOfCreditsVBI +; adw DLCreditsAddr #40 +; cpw DLCreditsAddr #CreditsLastLine +; bne EndOfCreditsVBI + mwa #Credits DLCreditsAddr EndOfCreditsVBI - .IF TARGET = 5200 - lda SkStatSimulator - bmi @+ - inc SkStatSimulator + .IF TARGET = 5200 + lda SkStatSimulator + bmi @+ + inc SkStatSimulator @ - lda JoystickNumber ; select port - ora #%00000100 ; Speaker off, Pots enabled + lda JoystickNumber ; select port + ora #%00000100 ; Speaker off, Pots enabled sta CONSOL5200 center = 114 ;Read analog stick and make it look like a digital stick threshold = 60 - - lda JoystickNumber - asl - tax + + lda JoystickNumber + asl + tax lda paddl0,x ;Read POT0 value (horizontal position) cmp #center+threshold ;Compare with right threshold rol stick0 ;Feed carry into digital stick value @@ -201,14 +201,14 @@ EndOfCreditsVBI eor #2+8 and #$0f sta stick0 - - ldx JoystickNumber - ; check shift key (5200 second fire button) - lda SKSTAT - :3 lsr ; third bit - and trig0,x ; and first button - ;lda trig0,x - sta strig0 ;Move hardware to shadow + + ldx JoystickNumber + ; check shift key (5200 second fire button) + lda SKSTAT + :3 lsr ; third bit + and trig0,x ; and first button + ;lda trig0,x + sta strig0 ;Move hardware to shadow mva chbas chbase @@ -224,21 +224,21 @@ EndOfCreditsVBI pla tax pla - rti - .ELSE - ; support for joysticks :) - ldx JoystickNumber - lda STICK0,x - sta STICK0 - lda STRIG0,x - sta STRIG0 - jmp XITVBV - .ENDIF + rti + .ELSE + ; support for joysticks :) + ldx JoystickNumber + lda STICK0,x + sta STICK0 + lda STRIG0,x + sta STRIG0 + jmp XITVBV + .ENDIF .endp .IF TARGET = 5200 .proc kb_continue sta kbcode ;Store key code in shadow. - mva #0 SkStatSimulator + mva #0 SkStatSimulator exit pla tay pla @@ -250,18 +250,18 @@ exit pla ;-------------------------------------------------- .macro SetDLI -; SetDLI #WORD -; Initialises Display List Interrupts +; SetDLI #WORD +; Initialises Display List Interrupts LDY # <:1 LDX # >:1 - jsr _SetDLIproc + jsr _SetDLIproc .endm .proc _SetDLIproc - LDA #$C0 - STY VDSLST - STX VDSLST+1 - STA NMIEN - rts + LDA #$C0 + STY VDSLST + STX VDSLST+1 + STA NMIEN + rts .endp .ENDIF diff --git a/Atari/textproc.asm b/Atari/textproc.asm index 5f358b1..b64ff2e 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -27,45 +27,44 @@ lda #%00111110 ; normal screen width, DL on, P/M on sta dmactls - jsr SetPMWidth + jsr SetPMWidth mva #TextBackgroundColor COLOR2 jsr ColorsOfSprites - mva #$ca COLOR1 - mva #$00 COLBAKS ; set color of background + mva #$ca COLOR1 + mva #$00 COLBAKS ; set color of background SetDLI DLIinterruptOptions ; jsr SetDLI for Options text screen -; -------- setup bottom (tanks) line - lda NumberOfPlayers - pha +; -------- setup bottom (tanks) line + lda NumberOfPlayers + pha lda mountainsDeltaTableH sta mountainDeltaH lda mountainsDeltaTableL sta mountainDeltaL - mva #6 NumberOfPlayers + mva #6 NumberOfPlayers jsr PMoutofScreen ;let P/M disappear ;jsr clearscreen ;let the screen be clean (clean-ish already) - jsr ClearPMmemory + jsr ClearPMmemory jsr placetanks ;let the tanks be evenly placed jsr calculatemountains ;let mountains be easy for the eye jsr drawmountains ;draw them - ldx NumberOfPlayers - dex -@ jsr RandomizeAngle - sta AngleTable,x - dex - bpl @- + ldx NumberOfPlayers + dex +@ jsr RandomizeAngle + sta AngleTable,x + dex + bpl @- jsr drawtanks ;finally draw tanks - pla - sta NumberOfPlayers -; -------- + pla + sta NumberOfPlayers mva #0 OptionsY OptionsMainLoop - lda WindChangeInRound - sta OptionsHere+126 + lda WindChangeInRound + sta OptionsHere+126 jsr OptionsInversion jsr getkey @@ -113,37 +112,39 @@ OptionsNoLeft OptionsNoRight cmp #@kbcode._ret ; $c ;Return key bne OptionsNoReturn - rts ; options selected - + rts ; options selected + OptionsNoReturn - cmp #@kbcode._tab ; Tab key - bne OptionsNoTab - jsr SelectNextGradient + cmp #@kbcode._tab ; Tab key + bne OptionsNoTab + jsr SelectNextGradient OptionsNoTab jmp OptionsMainLoop .endp + .proc SelectNextGradient - lda OptionsY ; if "Wind" option selected - cmp #$03 - bne NotWind - lda WindChangeInRound ; wind change after each turn (not round only) flag - eor #$1f ; '?' character - sta WindChangeInRound - rts + lda OptionsY ; if "Wind" option selected + cmp #$03 + bne NotWind + lda WindChangeInRound ; wind change after each turn (not round only) flag + eor #$1f ; '?' character + sta WindChangeInRound + rts NotWind - ldy GradientNr - iny - cpy #$03 - bne NoGradientLoop - ldy #$00 + ldy GradientNr + iny + cpy #$03 + bne NoGradientLoop + ldy #$00 NoGradientLoop - sty GradientNr - lda GradientAddrL,y - sta GradientColors - lda GradientAddrH,y - sta GradientColors+1 - rts + sty GradientNr + lda GradientAddrL,y + sta GradientColors + lda GradientAddrH,y + sta GradientColors+1 + rts .endp + ;-------- ; inversing selected option (cursor) ;-------- @@ -154,7 +155,7 @@ optionWidth = 6 nameWidth = 10 mwa #OptionsHere temp ; offset of the first option=11 mva #0 YPos ;option number pointer - mva #0 Xpos ;X position in the menu + sta Xpos ;X position in the menu tay ; Y is zero here... OptionsSetMainLoop ldx YPos ; Y position in the menu @@ -204,33 +205,34 @@ invertme rts .endp +.proc CallPurchaseForEveryTank ;------------------------------------------- ; call of the purchase (and activate) screens for each tank -.proc CallPurchaseForEveryTank +;------------------------------------------- - mva #0 TankNr - sta isInventory + mva #0 TankNr + sta isInventory @ - ldx TankNr - lda SkillTable,x - beq ManualPurchase - jsr PurchaseAI ; remember to make ActivateAI :) !!! - jmp AfterManualPurchase + ldx TankNr + lda SkillTable,x + beq ManualPurchase + jsr PurchaseAI ; remember to make ActivateAI :) !!! + jmp AfterManualPurchase ManualPurchase - lda JoyNumber,x - sta JoystickNumber ; set joystick port for player - mva #0 isInventory - jsr Purchase ; purchase weapons - bit escFlag - spl:rts - jsr DefensivesActivate ; activate weapons - bit escFlag - spl:rts + lda JoyNumber,x + sta JoystickNumber ; set joystick port for player + mva #0 isInventory + jsr Purchase ; purchase weapons + bit escFlag + spl:rts + jsr DefensivesActivate ; activate weapons + bit escFlag + spl:rts AfterManualPurchase - inc:lda TankNr - cmp NumberOfPlayers - bne @- - rts + inc:lda TankNr + cmp NumberOfPlayers + bne @- + rts .endp ;-------------------------------------------------- .proc DefensivesActivate @@ -241,7 +243,7 @@ AfterManualPurchase mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 - jmp Purchase.GoToActivation + jmp Purchase.GoToActivation .endp ;-------------------------------------------------- @@ -277,10 +279,10 @@ GoToActivation sta dmactls lda #song_supermarket - bit IsInventory - bpl @+ - lda #song_inventory -@ jsr RmtSongSelect + bit IsInventory + bpl @+ + lda #song_inventory +@ jsr RmtSongSelect ldx tankNr lda TankStatusColoursTable,x @@ -288,10 +290,10 @@ GoToActivation ; there is a tank (player) number in tanknr ; we are displaying name of the player - lda #$ca - sta COLOR1 ; set color of header text - ldy #0 - sty COLBAKS ; set color of background + lda #$ca + sta COLOR1 ; set color of header text + ldy #0 + sty COLBAKS ; set color of background lda tanknr :3 asl ; 8 chars per name tax @@ -302,10 +304,10 @@ NextChar03 iny cpy #$08 bne NextChar03 - ; displaying number of active controller port - ldy JoystickNumber - lda digits+1,y - sta purchaseTextBuffer+17 + ; displaying number of active controller port + ldy JoystickNumber + lda digits+1,y + sta purchaseTextBuffer+17 ; and we display cash of the given player @@ -346,7 +348,7 @@ AfterPurchase cmp IndexesOfWeaponsL1,y beq ?weaponfound iny - cpy #(last_offensive_____ - first_offensive____)+1 ; maxOffensiveWeapons + cpy #(last_offensive - first_offensive )+1 ; maxOffensiveWeapons bne @- ; not found apparently? ; TODO: check border case (the last weapon) @@ -359,7 +361,7 @@ PositionDefensive ?weaponFound ; weapon index in Y sty positionOnTheList - jsr _MakeOffsetDown ; set list screen offset + jsr _MakeOffsetDown ; set list screen offset ; Here we have all we need ; So choose the weapon for purchase ...... @@ -405,7 +407,7 @@ GoUpOffensive ldy HowManyOnTheListOff dey sty PositionOnTheList - jmp MakeOffsetDown + jmp MakeOffsetDown MakeOffsetUp ; If offset is larger than pointer position, ; it must be equal then. @@ -423,16 +425,16 @@ PurchaseKeyDown bne EndGoDownX ldy #0 sty PositionOnTheList - beq MakeOffsetUp + beq MakeOffsetUp GoDownOffensive inc:lda PositionOnTheList cmp HowManyOnTheListOff bne MakeOffsetDown ldy #0 sty PositionOnTheList - beq MakeOffsetUp + beq MakeOffsetUp MakeOffsetDown - jsr _MakeOffsetDown + jsr _MakeOffsetDown EndGoDownX jmp ChoosingItemForPurchase @@ -448,7 +450,7 @@ _MakeOffsetDown sbc #15 sta OffsetDL1 _EndGoDownX - rts + rts ; swapping the displayed list and setting pointer to position 0 ListChange @@ -464,7 +466,7 @@ ListChange beq @+ ; inventory jsr calcPosOffensive - jsr _MakeOffsetDown ; set list screen offset + jsr _MakeOffsetDown ; set list screen offset jmp ChoosingItemForPurchase @ mva #0 PositionOnTheList @@ -481,7 +483,7 @@ DeffensiveSelected jmp ChoosingItemForPurchase .endp -; + ;-------------------------------------------------- .proc CreateList ;-------------------------------------------------- @@ -637,7 +639,7 @@ notInventory NotTheSameAsLastTime ; increase appropriate counter txa - cpx #last_offensive_____+1 + cpx #last_offensive +1 bcs DefenceList ldy HowManyOnTheListOff sta IndexesOfWeaponsL1,y @@ -655,14 +657,14 @@ NoWeapon ; next weapon. If no more weapons then finish! inx - cpx #last_offensive_____+1 + cpx #last_offensive +1 bne NoDefense ; if we got to the defense weapons, ; we switch address to the second table. mwa #ListOfDefensiveWeapons xbyte NoDefense - cpx #last_defensive_____+1 + cpx #last_defensive +1 jne CreateList @@ -697,7 +699,7 @@ WeHaveOffset ldy #0 ClearList1 cpw xbyte #ListOfWeapons1End - beq ListCleared1 + beq ListCleared1 tya ; now there is zero here sta (xbyte),y inw xbyte @@ -722,7 +724,7 @@ ListCleared1 ldy #0 ClearList2 cpw xbyte #ListOfDefensiveWeaponsEnd - beq ListCleared2 + beq ListCleared2 tya ; now there is zero here sta (xbyte),y inw xbyte @@ -773,27 +775,27 @@ positiveMoney sty LastWeapon ; store last purchased weapon ; because we must put screen pointer next to it - ; but if we purchasing "Buy me!" then we must draw the winning weapon. - - cpy #ind_Buy_me_________ - bne NoSuprise - -Suprise ; get a random weapon - lda random - cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) - bcc GetRandomDefensive + ; but if we purchasing "Buy me!" then we must draw the winning weapon. + + cpy #ind_Buy_me + bne NoSuprise + +Suprise ; get a random weapon + lda random + cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) + bcc GetRandomDefensive GetRandomOffensive - randomize ind_Missile________ last_offensive_____ - ;cmp #ind_Buy_me_________ ; buy me do not buy buy me :) - ;beq GetRandomOffensive - tay - bne NoSuprise ; Y always <> 0 + randomize ind_Missile last_offensive + ;cmp #ind_Buy_me ; buy me do not buy buy me :) + ;beq GetRandomOffensive + tay + bne NoSuprise ; Y always <> 0 GetRandomDefensive - randomize ind_Battery________ last_defensive_____ - tay -; lda WeaponUnits,y ; check if weapon exist -; beq GetRandomDefensive - + randomize ind_Battery last_defensive + tay +; lda WeaponUnits,y ; check if weapon exist +; beq GetRandomDefensive + NoSuprise lda TanksWeaponsTableL,x sta weaponPointer @@ -828,48 +830,48 @@ invSelectDef lda IndexesOfWeaponsL2,y tay ldx tankNr - cmp #ind_Battery________ + cmp #ind_Battery bne NotBattery ; if activate battery, we do it differently mva #sfx_battery sfx_effect - phy + phy mva #99 Energy,x - jsr MaxForceCalculate - ply + jsr MaxForceCalculate + ply jmp DecreaseDefensive ; bypass activation NotBattery - cmp #ind_Auto_Defense___ - bne NoAutoDefense + cmp #ind_Auto_Defense + bne NoAutoDefense ; Auto Defense - do it like battery mva #sfx_auto_defense sfx_effect - mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) + mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) jmp DecreaseDefensive ; bypass activation NoAutoDefense - cmp #ind_Lazy_Boy_______ - bne NoLazyBoy - ; Lazy Boy - do it like battery - mva #%01000000 LazyFlag + cmp #ind_Lazy_Boy + bne NoLazyBoy + ; Lazy Boy - do it like battery + mva #%01000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyBoy - cmp #ind_Lazy_Darwin____ - bne NoLazyDarwin - ; Lazy Darwin - do it like battery - mva #%11000000 LazyFlag + cmp #ind_Lazy_Darwin + bne NoLazyDarwin + ; Lazy Darwin - do it like battery + mva #%11000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyDarwin - cmp #ind_Spy_Hard_______ - bne NotSpy - mva #$ff SpyHardFlag - jmp DecreaseDefensive ; bypass activation + cmp #ind_Spy_Hard + bne NotSpy + mva #$ff SpyHardFlag + jmp DecreaseDefensive ; bypass activation NotSpy - cmp #ind_Long_Barrel____ - bne NotBarrel - ; if activate long barrel, we do it differently too - mva #sfx_long_barrel sfx_effect + cmp #ind_Long_Barrel + bne NotBarrel + ; if activate long barrel, we do it differently too + mva #sfx_long_barrel sfx_effect mva #LongBarrel BarrelLength,x - bne DecreaseDefensive ; bypass activation + bne DecreaseDefensive ; bypass activation NotBarrel - cmp #ind_White_Flag_____ + cmp #ind_White_Flag bne NotWhiteFlag cmp ActiveDefenceWeapon,x bne NoDeactivateWhiteFlag @@ -898,11 +900,12 @@ DecreaseDefensive DefActivationEnd jmp WaitForKeyRelease ; rts - .endp -; ----------------------------------------------------- + +;-------------------------------------------------- .proc calcPosDefensive ; calculate positionOnTheList from the activeWeapon (defensives) +;-------------------------------------------------- ldx tankNr lda ActiveDefenceWeapon,x beq ?noWeaponActive @@ -911,7 +914,7 @@ DefActivationEnd cmp IndexesOfWeaponsL2,y beq ?weaponfound iny - cpy #(last_defensive_____ - first_defensive____)+1 ; maxDefensiveWeapon + cpy #(last_defensive - first_defensive )+1 ; maxDefensiveWeapon bne @- ; not found apparently? ; TODO: check border case (the last weapon) @@ -934,7 +937,7 @@ DefActivationEnd cmp IndexesOfWeaponsL1,y beq ?weaponfound iny - cpy #(last_offensive_____ - first_offensive____) ; maxOffensiveWeapon + cpy #(last_offensive - first_offensive ) ; maxOffensiveWeapon bne @- ; not found apparently? ; TODO: check border case (the last weapon) @@ -946,11 +949,13 @@ DefActivationEnd sty positionOnTheList rts .endp -; ----------------------------------------------------- + +;-------------------------------------------------- .proc PutLitteChar +;-------------------------------------------------- ; first let's clear both lists from little chars mwa #ListOfWeapons xbyte - ldx #last_defensive_____ ; there are xx lines total + ldx #last_defensive ; there are xx lines total ldy #$00 EraseLoop tya ; lda #$00 @@ -967,10 +972,10 @@ EraseLoop mwa #ListOfDefensiveWeapons xbyte ldx PositionOnTheList beq SelectList2 ; if there is 0 we add nothing -AddLoop2 - adw xbyte #32 ; narrow screen - dex - bne AddLoop2 +@ + adw xbyte #32 ; narrow screen + dex + bne @- SelectList2 lda #$7f ; little char (tab) - this is the pointer sta (xbyte),y @@ -988,10 +993,10 @@ CharToList1 mwa #ListOfWeapons xbyte ldx PositionOnTheList beq SelectList1 ; if there is 0 we add nothing -AddLoop1 - adw xbyte #32 ; narrow screen - dex - bne AddLoop1 +@ + adw xbyte #32 ; narrow screen + dex + bne @- SelectList1 lda #$7f ; pointer = little char = (tab) sta (xbyte),y @@ -999,10 +1004,10 @@ SelectList1 mwa #ListOfWeapons xbyte ldx OffsetDL1 beq SetWindowList1 ; if zero then add nothing -LoopWindow1 - adw xbyte #32 ; narrow screen - dex - bne LoopWindow1 +@ + adw xbyte #32 ; narrow screen + dex + bne @- SetWindowList1 mwa xbyte WeaponsListDL ; and we change Display List @@ -1042,14 +1047,14 @@ NoArrowDown SetDLI DLIinterruptText ; jsr SetDLI for text (names) screen mva #0 TankNr - sta COLBAKS ; set color of background + sta COLBAKS ; set color of background @ tax lda TankStatusColoursTable,x sta COLOR2 ; set color of player name line jsr EnterPlayerName bit escFlag spl:rts - jsr CheckTankCheat + jsr CheckTankCheat inc TankNr lda TankNr cmp NumberOfPlayers @@ -1072,16 +1077,9 @@ NoArrowDown ldx tanknr lda skillTable,x sta difficultyLevel - lda digits+1,x + lda digits+1,x sta NameScreen2+7 - ; clear tank name editor field - not necessary -; ldx #8 -; lda #0 -;@ sta NameAdr,x -; dex -; bpl @- - ; copy existing name and place cursor at end lda TankNr :3 asl @@ -1089,7 +1087,6 @@ NoArrowDown ldy #0 @ lda TanksNames,x -; beq endOfTankName sta NameAdr,y inx iny @@ -1097,34 +1094,33 @@ NoArrowDown bne @- endOfTankName -@ lda NameAdr,y - and #$7f - bne LastNameChar - dey - bpl @- +@ lda NameAdr,y + and #$7f + bne LastNameChar + dey + bpl @- LastNameChar - cpy #7 - beq @+ - iny -@ sty PositionInName + cpy #7 + seq:iny + sty PositionInName CheckKeys jsr HighlightLevel ; setting choosen level of the opponent (Moron, etc) - ldx TankNr - lda JoyNumber,x + ldx TankNr + lda JoyNumber,x tay - lda digits+1,y - sta NameScreen2+11 ; display joystick port number - lda TankShape,x + lda digits+1,y + sta NameScreen2+11 ; display joystick port number + lda TankShape,x tay - lda digits+1,y - sta NameScreen2+15 ; display tank shape number - jsr CursorDisplay + lda digits+1,y + sta NameScreen2+15 ; display tank shape number + jsr CursorDisplay jsr getkey bit escFlag spl:rts - .IF TARGET = 800 ; only the A800 has a keyboard + .IF TARGET = 800 ; only the A800 has a keyboard ; is the char to be recorded? ldx #keycodesEnd-keycodes ;table was 38 chars long IsLetter @@ -1140,11 +1136,10 @@ YesLetter sta NameAdr,x inx cpx #$08 ; is there 8 characters? - bne @+ - dex -@ stx PositionInName ; if not, we store + sne:dex + stx PositionInName ; if not, we store jmp CheckKeys - .ENDIF + .ENDIF CheckFurtherX01 ; here we check Tab, Return and Del cmp #@kbcode._ret ; $0c ; Return jeq EndOfNick @@ -1158,19 +1153,19 @@ CheckFurtherX01 ; here we check Tab, Return and Del beq ChangeOfLevel3Up cmp #@kbcode._up ; $e ;cursor up beq ChangeOfLevel3Down - cmp #@kbcode._atari ; atari (inverse) key - jeq ChangeOfShapeUp + cmp #@kbcode._atari ; atari (inverse) key + jeq ChangeOfShapeUp cmp #@kbcode._del ; $34 ; Backspace (del) bne CheckKeys ; handling backing one char ldx PositionInName - beq FirstChar ; ferst char - no go back - cpx #7 - bne NotLastChar + beq FirstChar ; ferst char - no go back + cpx #7 + bne NotLastChar lda NameAdr,x - and #$7f - bne LastIsNotSpace ; last char not empty - first clear last char (no go back) + and #$7f + bne LastIsNotSpace ; last char not empty - first clear last char (no go back) NotLastChar dex LastIsNotSpace @@ -1181,65 +1176,54 @@ FirstChar jmp CheckKeys ;---- ChangeOfJoyUp - ldx TankNr - inc JoyNumber,x - lda JoyNumber,x - and #%00000011 ; max 4 joysticks - sta JoyNumber,x - .IF TARGET = 5200 - beq ChangeOfShapeUp ; change tank shape - .ENDIF + ldx TankNr + inc JoyNumber,x + lda JoyNumber,x + and #%00000011 ; max 4 joysticks + sta JoyNumber,x + .IF TARGET = 5200 + beq ChangeOfShapeUp ; change tank shape + .ENDIF jmp CheckKeys ;---- ChangeOfLevelUp ; change difficulty level of computer opponent inc:lda DifficultyLevel cmp #9 ; 9 levels are possible - bne DoNotLoopLevelUp - mva #$0 DifficultyLevel -DoNotLoopLevelUp + sne:mva #$0 DifficultyLevel ; DoNotLoopLevelUp jmp CheckKeys ;---- ChangeOfLevelDown dec:lda DifficultyLevel - bpl DoNotLoopLevelDown - mva #$8 DifficultyLevel -DoNotLoopLevelDown + spl:mva #$8 DifficultyLevel ; DoNotLoopLevelDown jmp CheckKeys ;---- ChangeOfLevel3Up adb DifficultyLevel #3 - cmp #9 - bcc DoNotLoopLevel3Up - - sbb DifficultyLevel #9 - -DoNotLoopLevel3Up + scc:sbb DifficultyLevel #9 ; DoNotLoopLevel3Up jmp CheckKeys ;---- ChangeOfLevel3Down sbb DifficultyLevel #3 - bpl @+ - adb DifficultyLevel #9 -@ + spl:adb DifficultyLevel #9 jmp CheckKeys ;---- ChangeOfShapeUp - ldx TankNr - inc TankShape,x - lda TankShape,x - cmp #$03 - bne @+ - lda #$00 - sta TankShape,x -@ jmp CheckKeys + ldx TankNr + inc TankShape,x + lda TankShape,x + cmp #$03 + bne @+ + lda #$00 + sta TankShape,x +@ jmp CheckKeys ;---- EndOfNick - ; now check long press joy button (or Return...) + ; now check long press joy button (or Return...) mva #0 pressTimer ; reset WaitForLongPress - lda STRIG0 ; wait only for joy long press - bne ShortJoyPress + lda STRIG0 ; wait only for joy long press + bne ShortJoyPress lda pressTimer cmp #25 ; 1/2s bcc WaitForLongPress @@ -1253,9 +1237,9 @@ ShortJoyPress ldx tanknr lda DifficultyLevel sta skilltable,x - beq NotRobot - lda #$03 ; shape for robotanks - sta TankShape,x + beq NotRobot + lda #$03 ; shape for robotanks + sta TankShape,x NotRobot ; storing name of the tank in the right space ; (without cursor!) @@ -1280,129 +1264,129 @@ NotRobot beq MakeDefaultName ldy #0 -nextchar04 - lda NameAdr,y - and #$7f ; remove inverse (Cursor) - sta tanksnames,x - inx - iny - cpy #$08 - bne nextchar04 +@ + lda NameAdr,y + and #$7f ; remove inverse (Cursor) + sta tanksnames,x + inx + iny + cpy #$08 + bne @- rts MakeDefaultName -nextchar05 - lda tanksnamesDefault,x - sta tanksnames,x - inx - iny - cpy #$08 - bne nextchar05 +@ + lda tanksnamesDefault,x + sta tanksnames,x + inx + iny + cpy #$08 + bne @- rts .endp ;-------------------------------------------------- .proc CursorDisplay - ldy #7 + ldy #7 CursorLoop - lda NameAdr,y - and #$7f - cpy #0 - bne NotFirstLetter - and #$3f ; First letter should be Capital letter + lda NameAdr,y + and #$7f + cpy #0 + bne NotFirstLetter + and #$3f ; First letter should be Capital letter ; (nice trick does not affect digits) NotFirstLetter - cpy PositionInName - bne @+ + cpy PositionInName + bne @+ ora #$80 ; place cursor -@ sta NameAdr,y - dey - bpl CursorLoop - rts +@ sta NameAdr,y + dey + bpl CursorLoop + rts .endp ;-------------------------------------------------- .proc EnterNameByJoy mva #sfx_keyclick sfx_effect - jsr CursorDisplay - ldy PositionInName - ; now in Y we have PositionInName - ldx #(keycodesEnd-keycodes) + jsr CursorDisplay + ldy PositionInName + ; now in Y we have PositionInName + ldx #(keycodesEnd-keycodes) SearchCharacter - lda NameAdr,y - and #$7f - cmp #$20 - bcc CharOK ; digit or space - cmp #$60 - bcs CharOK ; not capital letter - ora #$40 + lda NameAdr,y + and #$7f + cmp #$20 + bcc CharOK ; digit or space + cmp #$60 + bcs CharOK ; not capital letter + ora #$40 CharOK - cmp scrcodes,x - beq CharacterFound - dex - bpl SearchCharacter - inx + cmp scrcodes,x + beq CharacterFound + dex + bpl SearchCharacter + inx CharacterFound - ; now in X we have Character (index) on PositionInName - ; wait for centered joy + ; now in X we have Character (index) on PositionInName + ; wait for centered joy mva #128-15 pressTimer ; reset (trick) -@ lda STICK0 - and #$0f - cmp #$0f - beq checkjoy - bit pressTimer ; trick (no A change) - bpl @- -checkjoy - lda STICK0 - and #$0f - cmp #$0f - bne JoyNotCentered +@ lda STICK0 + and #$0f + cmp #$0f + beq checkjoy + bit pressTimer ; trick (no A change) + bpl @- +checkjoy + lda STICK0 + and #$0f + cmp #$0f + bne JoyNotCentered notpressedJoy - ;fire - lda STRIG0 - beq checkjoy ; fire still pressed - rts + ;fire + lda STRIG0 + beq checkjoy ; fire still pressed + rts JoyNotCentered - ; this is a place for code :) - cmp #7 - bne NoRight - ; joy right - cpy #7 - beq GoToMainLoop ; the last character - iny - bne GoToMainLoop + ; this is a place for code :) + cmp #7 + bne NoRight + ; joy right + cpy #7 + beq GoToMainLoop ; the last character + iny + bne GoToMainLoop NoRight - cmp #11 - bne NoLeft - ; joy left - lda #0 - sta NameAdr,y - dey - bpl GoToMainLoop - iny - beq GoToMainLoop + cmp #11 + bne NoLeft + ; joy left + lda #0 + sta NameAdr,y + dey + bpl GoToMainLoop + iny + beq GoToMainLoop NoLeft - cmp #14 - bne NoUp - ; joy up - cpx #(keycodesEnd-keycodes-1) - bne @+ - ldx #$00 ; set to the first character index (loop) - beq CharAndMainLoop -@ inx - bne CharAndMainLoop + cmp #14 + bne NoUp + ; joy up + cpx #(keycodesEnd-keycodes-1) + bne @+ + ldx #$00 ; set to the first character index (loop) + beq CharAndMainLoop +@ inx + bne CharAndMainLoop NoUp - cmp #13 - bne EnterNameByJoy ; not down - ; joy down - dex - bpl CharAndMainLoop - ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop) + cmp #13 + bne EnterNameByJoy ; not down + ; joy down + dex + bpl CharAndMainLoop + ldx #(keycodesEnd-keycodes-1) ; set to the last character index (loop) CharAndMainLoop - lda scrcodes,x - sta NameAdr,y + lda scrcodes,x + sta NameAdr,y GoToMainLoop - sty PositionInName - jmp EnterNameByJoy + sty PositionInName + jmp EnterNameByJoy .endp ;-------------------------------------------------- @@ -1472,24 +1456,24 @@ TooLittle000 dex ;rightnumber ; displaying without leading zeroes (if zeroes exist then display space at this position) ldy #0 - ldx #0 ; digit flag (cut leading zeroes) + ldx #0 ; digit flag (cut leading zeroes) displayloop lda decimalresult,y - cpx #0 - bne noleading0 - cpy #4 - beq noleading0 ; if 00000 - last 0 must stay - cmp zero - bne noleading0 - lda #space - beq displaychar ; space = 0 ! + cpx #0 + bne noleading0 + cpy #4 + beq noleading0 ; if 00000 - last 0 must stay + cmp zero + bne noleading0 + lda #space + beq displaychar ; space = 0 ! noleading0 - inx ; set flag (no leading zeroes to cut) + inx ; set flag (no leading zeroes to cut) displaychar sta (displayposition),y nexdigit iny - cpy #5 + cpy #5 bne displayloop rts @@ -1546,57 +1530,57 @@ displayloop1 ;-------------------------------------------------- .proc GameOverScreen ;-------------------------------------------------- - jsr MakeDarkScreen + jsr MakeDarkScreen jsr WaitForKeyRelease jsr ClearScreen jsr ClearPMmemory - jsr PrepareCredits - jsr GameOverResultsClear + jsr PrepareCredits + jsr GameOverResultsClear jsr CopyFromPurchaseAndGameOver mwa #GameOverDL dlptrs - mva #$ff ScrollFlag ; credits scroll on + mva #$ff ScrollFlag ; credits scroll on lda #%00111110 ; normal screen width, DL on, P/M on sta dmactls lda #%00100100 ; playfield before P/M sta GPRIOR - jsr SetPMWidth + jsr SetPMWidth jsr ColorsOfSprites mva #0 COLOR1 - sta COLBAKS ; set color of background - sta CreditsVScrol - sta JoystickNumber ; set joystick port for player + sta COLBAKS ; set color of background + sta CreditsVScrol + sta JoystickNumber ; set joystick port for player mva #TextForegroundColor COLOR2 SetDLI DLIinterruptGameOver ; jsr SetDLI for Game Over screen - ; make text and color lines for each tank + ; make text and color lines for each tank ldx NumberOfPlayers ;we start from the highest (best) tank dex ;and it is the last one stx ResultOfTankNr ;in TankSequence table - ldy #0 ;witch line we are coloring + ldy #0 ;witch line we are coloring FinalResultOfTheNextPlayer ldx ResultOfTankNr ;we are after a round, so we can use TankNr lda TankSequence,x ;and we keep here real number if the tank - tax + tax stx TankNr ;for which we are displaying results - lda TankStatusColoursTable,x - sta GameOverColoursTable,y - ; Y - line number (from 0 to 5) - ; X - TanNr - ; let's make texts - phy - ; first calculate adres first byte of line - mwa #GameOverResults temp -@ dey - bmi LineAdresReady - adw temp #40 - jmp @- + lda TankStatusColoursTable,x + sta GameOverColoursTable,y + ; Y - line number (from 0 to 5) + ; X - TanNr + ; let's make texts + phy + ; first calculate adres first byte of line + mwa #GameOverResults temp +@ dey + bmi LineAdresReady + adw temp #40 + jmp @- LineAdresReady - ; put position of tank on the screen - pla - pha ; now we have line number in A register - ldy #1 - tax - lda zero+1,x - sta (temp),y + ; put position of tank on the screen + pla + pha ; now we have line number in A register + ldy #1 + tax + lda zero+1,x + sta (temp),y ; puts name of the tank on the screen ldy #$03 lda TankNr @@ -1609,75 +1593,75 @@ NextChar iny cpy #$08+3 bne NextChar - ; put big points on the screen + ; put big points on the screen ldx TankNr lda ResultsTable,x sta decimal mva #0 decimal+1 adw temp #12 displayposition jsr displaydec5 - mva #0 displayposition ; overwrite first digit - ; put hits points on the screen - sta decimal+1 ; pozor!!! A=0 + mva #0 displayposition ; overwrite first digit + ; put hits points on the screen + sta decimal+1 ; pozor!!! A=0 ldx TankNr lda DirectHits,x sta decimal -; lda DirectHitsH,x ; one byte enough +; lda DirectHitsH,x ; one byte enough adw temp #19 displayposition jsr displaydec5 - mva #0 displayposition ; overwrite first digit - ; put AI symbol or joystick - ldx TankNr - lda SkillTable,x - tay - bne ThisIsAI - ldy JoyNumber,x - iny ; tricky + mva #0 displayposition ; overwrite first digit + ; put AI symbol or joystick + ldx TankNr + lda SkillTable,x + tay + bne ThisIsAI + ldy JoyNumber,x + iny ; tricky ThisIsAI - lda digits,y - ldy #39 - sta (temp),y ; AI level or joy number - ldy #$0a ; Joystick symbol - lda SkillTable,x - beq NotAItank - ldy #$5e ; Computer symbol + lda digits,y + ldy #39 + sta (temp),y ; AI level or joy number + ldy #$0a ; Joystick symbol + lda SkillTable,x + beq NotAItank + ldy #$5e ; Computer symbol NotAItank - tya - ldy #38 - sta (temp),y - ; put earned money on the screen + tya + ldy #38 + sta (temp),y + ; put earned money on the screen lda EarnedMoneyL,x sta decimal - lda EarnedMoneyH,x + lda EarnedMoneyH,x sta decimal+1 adw temp #30 displayposition jsr displaydec5 - ldy #35 - lda zero - sta (temp),y ; and last zero - ply - iny + ldy #35 + lda zero + sta (temp),y ; and last zero + ply + iny dec ResultOfTankNr jpl FinalResultOfTheNextPlayer MakeBlackLines - cpy #$06 - beq AllLinesReady - lda #0 ; black line color for rest of tanks - sta GameOverColoursTable,y - iny - bne MakeBlackLines + cpy #$06 + beq AllLinesReady + lda #0 ; black line color for rest of tanks + sta GameOverColoursTable,y + iny + bne MakeBlackLines AllLinesReady ldx #(MaxPlayers-1) MakeAllTanksVisible lda #99 sta eXistenZ,x - lda #0 - sta ActiveDefenceWeapon,x + lda #0 + sta ActiveDefenceWeapon,x dex bpl MakeAllTanksVisible - jsr SetStandardBarrels + jsr SetStandardBarrels - ; start music and animations + ; start music and animations RmtSong song_ending_looped ; initial tank positions randomization ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 @@ -1691,15 +1675,15 @@ MainTanksFloatingLoop AllTanksFloatingDown stx TankNr lda Ytankstable,x - cmp #(72-7) ; tank under screen - no erase - bcs NoEraseTank + cmp #(72-7) ; tank under screen - no erase + bcs NoEraseTank jsr ClearTankNr - sta ATRACT ; reset atract mode + sta ATRACT ; reset atract mode NoEraseTank - ldx TankNr + ldx TankNr inc Ytankstable,x - lda ActiveDefenceWeapon,x - beq NotFastTank + lda ActiveDefenceWeapon,x + beq NotFastTank :3 inc Ytankstable,x NotFastTank lda Ytankstable,x @@ -1714,109 +1698,109 @@ TankUnderScreen TankOnScreen jsr PutTankNr DrawOnlyParachute - lda ActiveDefenceWeapon,x - bne FastTank + lda ActiveDefenceWeapon,x + bne FastTank jsr DrawTankParachute FastTank ; ldx TankNr dex bpl AllTanksFloatingDown - jsr IsKeyPressed + jsr IsKeyPressed bne MainTanksFloatingLoop ; neverending loop - mva #$00 ScrollFlag ; credits scroll off - jsr MakeDarkScreen - jsr GameOverResultsClear + mva #$00 ScrollFlag ; credits scroll off + jsr MakeDarkScreen + jsr GameOverResultsClear rts RandomizeTankPos - randomize 10 (32-7) ; 10 not 8 - barrel !! :) + randomize 10 (32-7) ; 10 not 8 - barrel !! :) sta Ytankstable,x randomize 0 180 sta AngleTable,x randomize 0 (49-8) - ; x correction for P/M - ; -- - .IF XCORRECTION_FOR_PM = 1 + ; x correction for P/M + ; -- + .IF XCORRECTION_FOR_PM = 1 and #%11111110 - .ENDIF - ; -- + .ENDIF + ; -- clc adc XtankOffsetGO_L,x sta XtankstableL,x lda XtankOffsetGO_H,x adc #0 sta XtankstableH,x - lda random - cmp #32 ; like 1:8 - bcc NowFastTank - lda #0 - sta ActiveDefenceWeapon,x + lda random + cmp #32 ; like 1:8 + bcc NowFastTank + lda #0 + sta ActiveDefenceWeapon,x rts NowFastTank - lda #1 - sta ActiveDefenceWeapon,x + lda #1 + sta ActiveDefenceWeapon,x rts GameOverResultsClear - lda #$00 - tax -@ sta GameOverResults,x - inx - cpx #(6*40)+1 - bne @- - rts + lda #$00 + tax +@ sta GameOverResults,x + inx + cpx #(6*40)+1 + bne @- + rts PrepareCredits - ; Rewrites credits and places it in the middle of each line. - mwa #CreditsStart temp ; from - mwa #Credits temp2 ; to + ; Rewrites credits and places it in the middle of each line. + mwa #CreditsStart temp ; from + mwa #Credits temp2 ; to MainRewriteLoop - ldy #0 - cpw temp #CreditsEnd - beq EndOfCredits - ; count characters in this line -@ lda (temp),y - bmi LastCharFound - iny - bne @- + ldy #0 + cpw temp #CreditsEnd + beq EndOfCredits + ; count characters in this line +@ lda (temp),y + bmi LastCharFound + iny + bne @- LastCharFound - ; in Y number of characters reduced by 1 - ; let's count how many spaces add before the text - sec - sty magic - lda #40 - sbc magic - lsr ; now in A we have number of spaces in front - sta magic - ldy #0 - tya - tax + ; in Y number of characters reduced by 1 + ; let's count how many spaces add before the text + sec + sty magic + lda #40 + sbc magic + lsr ; now in A we have number of spaces in front + sta magic + ldy #0 + tya + tax FirstSpaces - sta (temp2),y ; fill the area in front of the text with spaces - iny - cpy magic - bne FirstSpaces + sta (temp2),y ; fill the area in front of the text with spaces + iny + cpy magic + bne FirstSpaces MainText - lda (temp,x) - sta (temp2),y ; rewrite the text to a new place - bmi LastCharWritten - inw temp - iny - bne MainText + lda (temp,x) + sta (temp2),y ; rewrite the text to a new place + bmi LastCharWritten + inw temp + iny + bne MainText LastCharWritten - inw temp - and #%01111111 ; remove inverse - sta (temp2),y - iny - txa ; space to A (0) + inw temp + and #%01111111 ; remove inverse + sta (temp2),y + iny + txa ; space to A (0) LastSpaces - sta (temp2),y ; fill the area behind the text with spaces - iny - cpy #40 - bne LastSpaces + sta (temp2),y ; fill the area behind the text with spaces + iny + cpy #40 + bne LastSpaces NextLine - adw temp2 #40 - jmp MainRewriteLoop + adw temp2 #40 + jmp MainRewriteLoop EndOfCredits - mwa #Credits DLCreditsAddr ; set address in DL to first line - rts + mwa #Credits DLCreditsAddr ; set address in DL to first line + rts .endp ;------------------------------------------------- .proc PutTankNameOnScreen @@ -1824,7 +1808,7 @@ EndOfCredits ; puts name of the tank on the screen ldy #$00 ; lda TankNr - txa ; TankNr in X ! + txa ; TankNr in X ! asl asl asl ; 8 chars per name @@ -1837,20 +1821,20 @@ NextChar02 cpy #$08 bne NextChar02 ;========================= - ; displaying number of active controller port or AI level + ; displaying number of active controller port or AI level ;========================= - ldx TankNr - ldy #$5e ; Computer symbol - lda SkillTable,x - tax - bne ThisIsAI - ldy #$0a ; Joystick symbol - ldx JoystickNumber - inx ; tricky + ldx TankNr + ldy #$5e ; Computer symbol + lda SkillTable,x + tax + bne ThisIsAI + ldy #$0a ; Joystick symbol + ldx JoystickNumber + inx ; tricky ThisIsAI - sty statusBuffer+16 - lda digits,x - sta statusBuffer+17 + sty statusBuffer+16 + lda digits,x + sta statusBuffer+17 ; rts .endp ;------------------------------------------------- @@ -1858,7 +1842,7 @@ ThisIsAI ;------------------------------------------------- ldx TankNr - + ;========================= ;displaying symbol of the weapon ;========================= @@ -1900,11 +1884,11 @@ ThisIsAI ;========================= ;displaying name of the defence weapon (if active) ;========================= - lda AutoDefenseFlag,x ; Auto Defense symbol (space or "A" in inverse) - bpl @+ - lda #$5e ; Auto Defense symbol + lda AutoDefenseFlag,x ; Auto Defense symbol (space or "A" in inverse) + bpl @+ + lda #$5e ; Auto Defense symbol @ - sta statusBuffer+80+21 + sta statusBuffer+80+21 lda #$08 ; ( sta statusBuffer+80+22 lda #$09 ; ) @@ -1973,15 +1957,15 @@ NoShieldEnergy ; display Wind ;========================= mwa Wind temp - lda #space + lda #space bit Wind+3 ; highest byte of 4 byte wind bmi DisplayLeftWind - sta statusBuffer+80+17 ; (space) char + sta statusBuffer+80+17 ; (space) char lda #$7f ; (tab) char sta statusBuffer+80+20 bne DisplayWindValue DisplayLeftWind - sta statusBuffer+80+20 ; (space) char + sta statusBuffer+80+20 ; (space) char lda #$7e ;(del) char sta statusBuffer+80+17 sec ; Wind = -Wind @@ -2021,7 +2005,7 @@ DisplayWindValue ;display Angle ;========================= displayAngle - ldy #space + ldy #space ldx TankNr lda AngleTable,x cmp #90 diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 774a02c..d9feec8 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -16,7 +16,7 @@ unPlotAfterX lda oldplotH,x sta oldplot+1 - ldy #0 + ldy #0 lda oldora,x sta (oldplot),y @@ -31,23 +31,23 @@ CheckX MakeUnPlot ; let's count coordinates taken from xdraw and ydraw lda xdraw - and #%11111000 - ;sta xbyte + and #%11111000 + ;sta xbyte ;--- ldx ydraw - clc + clc adc linetableL,x - sta xbyte - sta oldplot + sta xbyte + sta oldplot lda linetableH,x adc xdraw+1 sta xbyte+1 - sta oldplot+1 + sta oldplot+1 lda xdraw and #$7 tax - ldy #0 + ldy #0 lda color bne ClearUnPlot @@ -117,13 +117,13 @@ MakePlot ; let's calculate coordinates from xdraw and ydraw lda xdraw - and #%11111000 - ;sta xbyte + and #%11111000 + ;sta xbyte ;--- ldx ydraw - clc + clc adc linetableL,x - sta xbyte + sta xbyte lda linetableH,x adc xdraw+1 sta xbyte+1 @@ -131,7 +131,7 @@ MakePlot lda xdraw and #$7 tax - ldy #0 + ldy #0 lda color bne ClearPlot @@ -156,13 +156,13 @@ ClearPlot ; let's calculate coordinates from xdraw and ydraw lda xdraw - and #%11111000 - ;sta xbyte + and #%11111000 + ;sta xbyte ;--- ldx ydraw - clc + clc adc linetableL,x - sta xbyte + sta xbyte lda linetableH,x adc xdraw+1 sta xbyte+1 @@ -170,7 +170,7 @@ ClearPlot lda xdraw and #$7 tax - ldy #0 + ldy #0 lda (xbyte),y eor #$ff and bittable,x @@ -181,55 +181,55 @@ ClearPlot ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify - mva #1 color + mva #1 color drawmountainsloop ldy #0 lda (modify),y - cmp #screenheight - beq NoMountain + cmp #screenheight + beq NoMountain sta ydraw - sty ydraw+1 + sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw sta tempbyte01 jsr plot.MakePlot - ; X - index in bittable (number of bit) and nothing more (for use) in C64 :) + ; X - index in bittable (number of bit) and nothing more (for use) in C64 :) ; jmp IntoDraw ; jumps inside Draw routine ; because one pixel is already plotted (and who cares? :) ) @ - lda (xbyte),y - and bittable2,x - sta (xbyte),y + lda (xbyte),y + and bittable2,x + sta (xbyte),y ;IntoDraw - inc ydraw + inc ydraw lda xdraw - and #%11111000 - ;sta xbyte + and #%11111000 + ;sta xbyte ;--- ldy ydraw - clc + clc adc linetableL,y - sta xbyte + sta xbyte lda linetableH,y adc xdraw+1 sta xbyte+1 - ldy #0 - dec tempbyte01 - bne @- -; end of Drawline proc + ldy #0 + dec tempbyte01 + bne @- +; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot - inc ydraw - lda ydraw - cmp #screenheight - bne drawline -; end of Drawline proc + inc ydraw + lda ydraw + cmp #screenheight + bne drawline +; end of Drawline proc .ENDIF NoMountain inw modify @@ -260,7 +260,7 @@ NoMountain ldy #7 CopyChar lda (fontind),y - eor #$ff + eor #$ff sta char1,y lda #$ff sta char2,y @@ -271,7 +271,7 @@ CopyChar ldy #7 CopyMask lda (fontind),y - eor #$ff + eor #$ff sta mask1,y lda #$00 sta mask2,y @@ -291,16 +291,16 @@ MakeMask00 .endr sec .rept 8 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough ror char2+# .endr dex bne MakeMask00 MaskOK00 - lda ydraw - sec - sbc #7 - sta ydraw + lda ydraw + sec + sbc #7 + sta ydraw ; X = 0 ! lda Erase beq CharLoopi ; it works, because x=0 @@ -314,67 +314,67 @@ EmptyChar ldx #0 CharLoopi ; calculating coordinates from xdraw and ydraw - ldy ydraw + ldy ydraw lda xdraw - and #%11111000 - clc + and #%11111000 + clc adc linetableL,y - sta xbyte + sta xbyte lda linetableH,y adc xdraw+1 sta xbyte+1 ;-- - ldy #0 + ldy #0 lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y - inc ydraw + inc ydraw inx cpx #8 bne CharLoopi .ELSE - mvx #7 temp ; line counter (Y) + mvx #7 temp ; line counter (Y) CharLoop1 - mva #7 temp+1 ; pixel counter (X) + mva #7 temp+1 ; pixel counter (X) CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot MakeCharPlot - lda Erase - bne ErasingChar - inc color + lda Erase + bne ErasingChar + inc color ErasingChar NoPlot - jsr plot.MakePlot + jsr plot.MakePlot AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #8 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - clc - lda ydraw - adc #8 - sta ydraw - bne EndPutChar + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #8 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + clc + lda ydraw + adc #8 + sta ydraw + bne EndPutChar NoMaskNoPlot - rol char1,x - jmp AfterCharPlot + rol char1,x + jmp AfterCharPlot .ENDIF EndPutChar rts @@ -391,16 +391,16 @@ EndPutChar ;-------------------------------------------------- cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS - cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + cpw dy #(4) + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS - ; checks ommited. + ; checks ommited. ; char to the table lda CharCode4x4 and #%00000001 - beq Upper4bits - lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) + beq Upper4bits + lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) Upper4bits sta nibbler4x4 lda CharCode4x4 @@ -408,36 +408,36 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table - ldy #0 + ldy #0 ldx #3 CopyChar - lda (fontind),y ; Y must be 0 !!!! - bit nibbler4x4 - bpl GetUpper4bits - :4 rol + lda (fontind),y ; Y must be 0 !!!! + bit nibbler4x4 + bpl GetUpper4bits + :4 rol GetUpper4bits - ora #$0f + ora #$0f sta char1,x lda #$ff sta char2,x ; and 4 bytes as a mask - lda #$f0 + lda #$f0 sta mask1,x lda #$00 sta mask2,x - adw fontind #32 ; next byte of 4x4 font + adw fontind #32 ; next byte of 4x4 font dex bpl CopyChar .IF FASTER_GRAF_PROCS = 1 ; mask preparation and character shifting - lda dx - and #$7 - tax + lda dx + and #$7 + tax beq MaskOK01 MakeMask01 .rept 4 @@ -446,90 +446,90 @@ MakeMask01 .endr sec .rept 4 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough ror char2+# .endr dex bne MakeMask01 MaskOK01 - lda dy - sec - sbc #3 - sta dy - ldx #0 + lda dy + sec + sbc #3 + sta dy + ldx #0 CharLoopi4x4 ; calculating coordinates from xdraw and ydraw - ldy dy + ldy dy lda dx - and #%11111000 - clc + and #%11111000 + clc adc linetableL,y - sta xbyte + sta xbyte lda linetableH,y adc dx+1 sta xbyte+1 ;-- - ldy #0 + ldy #0 lda (xbyte),y - ora mask1,x - bit plot4x4color - bpl PutInColor0_1 ; only mask - no char + ora mask1,x + bit plot4x4color + bpl PutInColor0_1 ; only mask - no char and char1,x PutInColor0_1 sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x - bit plot4x4color - bpl PutInColor0_2 ; only mask - no char + ora mask2,x + bit plot4x4color + bpl PutInColor0_2 ; only mask - no char and char2,x PutInColor0_2 sta (xbyte),y - inc dy + inc dy inx - cpx #4 + cpx #4 bne CharLoopi4x4 .ELSE - mwa xdraw char2 - mwa ydraw mask2 - mva color mask2+2 - mwa dx xdraw - mwa dy ydraw - mvx #3 temp ; line counter (Y) + mwa xdraw char2 + mwa ydraw mask2 + mva color mask2+2 + mwa dx xdraw + mwa dy ydraw + mvx #3 temp ; line counter (Y) CharLoop1 - mva #3 temp+1 ; pixel counter (X) + mva #3 temp+1 ; pixel counter (X) CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot MakeCharPlot - lda plot4x4color - beq ErasingChar - inc color + lda plot4x4color + beq ErasingChar + inc color ErasingChar NoPlot - jsr plot.MakePlot + jsr plot.MakePlot AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #4 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - mwa char2 xdraw - mwa mask2 ydraw - mva mask2+2 color - bpl EndPut4x4 + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #4 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + mwa char2 xdraw + mwa mask2 ydraw + mva mask2+2 color + bpl EndPut4x4 NoMaskNoPlot - rol char1,x - jmp AfterCharPlot + rol char1,x + jmp AfterCharPlot .ENDIF EndPut4x4 rts @@ -555,59 +555,59 @@ EndPut4x4 mwa #linetableL temp2 mwa #linetableH modify ldy #0 - ldx #0 + ldx #0 @ lda temp sta (temp2),y lda temp+1 sta (modify),y - cpx #7 - bne NotChar - ldx #0 + cpx #7 + bne NotChar + ldx #0 adw temp #(320-7) - jmp next8lines + jmp next8lines NotChar - inw temp - inx + inw temp + inx next8lines iny cpy #screenheight+1 bne @- - rts + rts .endp ;-------------------------------------------------- .proc SetMainScreen - lda #$b ; Grey background and border - lda WallsType - :4 rol - sta $d020 - sta $d021 - - lda $dd00 ; Set video bank to start at 0 - and #252 - ora #3 - sta $dd00 - lda #$18 - sta $d018 + lda #$b ; Grey background and border + lda WallsType + :4 rol + sta $d020 + sta $d021 + + lda $dd00 ; Set video bank to start at 0 + and #252 + ora #3 + sta $dd00 + lda #$18 + sta $d018 -; SwitchVICBank(0) -; SetScreenMemory($2000) - SetHiresBitmapMode ; Hires mode on - lda #$00 - sta 53281 - ; clear color RAM - ldx #0 -@ lda #1 - sta $d800,x - sta $d900,x - sta $da00,x - sta $db00,x - lda #$0f - sta $0400,x - sta $0500,x - sta $0600,x - sta $0700,x - inx - bne @- +; SwitchVICBank(0) +; SetScreenMemory($2000) + SetHiresBitmapMode ; Hires mode on + lda #$00 + sta 53281 + ; clear color RAM + ldx #0 +@ lda #1 + sta $d800,x + sta $d900,x + sta $da00,x + sta $db00,x + lda #$0f + sta $0400,x + sta $0500,x + sta $0600,x + sta $0700,x + inx + bne @- rts .endp ;-------------------------------------------------- @@ -623,86 +623,86 @@ next8lines ; ------------------------------------------------- mva #sfx_sandhog sfx_effect .IF FASTER_GRAF_PROCS = 1 - mvy #0 magic ; byte counter (from 0 to 39) + mvy #0 magic ; byte counter (from 0 to 39) NextColumn - ; big loop - we repat internal loops for each column of bytes - ldx #120 ; line counter (from 0 to 60 ) - ; first loop - inverse column of bytes for a while + ; big loop - we repat internal loops for each column of bytes + ldx #120 ; line counter (from 0 to 60 ) + ; first loop - inverse column of bytes for a while NextLine1 - jsr InverseScreenByte - dex - dex - bpl NextLine1 - ; - jsr WaitOneFrame ; wait uses A only - ; second loop - inverse again and put random "snow" to column of bytes - ldx #120 - mva #$55 magic+1 + jsr InverseScreenByte + dex + dex + bpl NextLine1 + ; + jsr WaitOneFrame ; wait uses A only + ; second loop - inverse again and put random "snow" to column of bytes + ldx #120 + mva #$55 magic+1 NextLine2 - jsr InverseScreenByte - lda random - ora magic+1 - and (temp),y - sta (temp),y - lda magic+1 - eor #$ff - sta magic+1 - dex - dex - bpl NextLine2 - ; and go to next column - inc magic - ldy magic - cpy #40 - bne NextColumn + jsr InverseScreenByte + lda random + ora magic+1 + and (temp),y + sta (temp),y + lda magic+1 + eor #$ff + sta magic+1 + dex + dex + bpl NextLine2 + ; and go to next column + inc magic + ldy magic + cpy #40 + bne NextColumn .ELSE - mva #1 color - mwa #120 ydraw + mva #1 color + mwa #120 ydraw NextLineSlow - lda #0 - sta xdraw - sta xdraw+1 + lda #0 + sta xdraw + sta xdraw+1 NextPixelSlow - bit random - bpl NoPlot - bvc NoPlot - jsr plot.MakePlot + bit random + bpl NoPlot + bvc NoPlot + jsr plot.MakePlot NoPlot - inw xdraw - cpw xdraw #screenwidth - bne NextPixelSlow - dec ydraw - dec ydraw - bpl NextLineSlow + inw xdraw + cpw xdraw #screenwidth + bne NextPixelSlow + dec ydraw + dec ydraw + bpl NextLineSlow .ENDIF - ; and we have "snow" :) - lda #0 - ldx TankNr - sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter - jsr SetFullScreenSoilRange + ; and we have "snow" :) + lda #0 + ldx TankNr + sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + jsr SetFullScreenSoilRange jsr SoilDown2.NoClearTanks - rts + rts - ; in order to optimize the fragment repeated in both internal loops - ; we save 15 bytes :) + ; in order to optimize the fragment repeated in both internal loops + ; we save 15 bytes :) InverseScreenByte - ldy magic - sty temp - ldy #0 - sty temp+1 + ldy magic + sty temp + ldy #0 + sty temp+1 aslw temp rolw temp rolw temp - lda temp - adc LineTableL,x - sta temp - lda LineTableH,x - adc temp+1 - sta temp+1 - lda (temp),y - eor #$ff - sta (temp),y - rts + lda temp + adc LineTableL,x + sta temp + lda LineTableH,x + adc temp+1 + sta temp+1 + lda (temp),y + eor #$ff + sta (temp),y + rts .endp .ENDIF \ No newline at end of file diff --git a/C64/interrupts.asm b/C64/interrupts.asm index 9d9c188..ff565f7 100644 --- a/C64/interrupts.asm +++ b/C64/interrupts.asm @@ -1,22 +1,22 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone DLIinterruptGraph = 0 ;-------------------------------------------------- .macro SetDLI -; SetDLI #WORD -; Initialises Display List Interrupts +; SetDLI #WORD +; Initialises Display List Interrupts LDY # <:1 LDX # >:1 - jsr _SetDLIproc + jsr _SetDLIproc .endm .proc _SetDLIproc -; LDA #$C0 -; STY VDSLST -; STX VDSLST+1 -; STA NMIEN - rts +; LDA #$C0 +; STY VDSLST +; STX VDSLST+1 +; STA NMIEN + rts .endp .ENDIF diff --git a/C64/textproc.asm b/C64/textproc.asm index 877c1f8..34615f4 100644 --- a/C64/textproc.asm +++ b/C64/textproc.asm @@ -2,7 +2,7 @@ .IF *>0 - + WeaponsListDL = 0 NamesOfLevels = 0 ;---------------------------------------- @@ -20,68 +20,68 @@ NamesOfLevels = 0 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight - ldx #$08 -@ lda Autoplay_OptionsTable,x - sta OptionsTable,x - dex - bpl @- + ldx #$08 +@ lda Autoplay_OptionsTable,x + sta OptionsTable,x + dex + bpl @- - rts + rts Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 .endp .proc SelectNextGradient - lda OptionsY ; if "Wind" option selected - cmp #$03 - bne NotWind - lda WindChangeInRound ; wind change after each turn (not round only) flag - eor #$1f ; '?' character - sta WindChangeInRound - rts + lda OptionsY ; if "Wind" option selected + cmp #$03 + bne NotWind + lda WindChangeInRound ; wind change after each turn (not round only) flag + eor #$1f ; '?' character + sta WindChangeInRound + rts NotWind - ldy GradientNr - iny - cpy #$03 - bne NoGradientLoop - ldy #$00 + ldy GradientNr + iny + cpy #$03 + bne NoGradientLoop + ldy #$00 NoGradientLoop - sty GradientNr - lda GradientAddrL,y - sta GradientColors - lda GradientAddrH,y - sta GradientColors+1 - rts + sty GradientNr + lda GradientAddrL,y + sta GradientColors + lda GradientAddrH,y + sta GradientColors+1 + rts .endp ;------------------------------------------- ; call of the purchase (and activate) screens for each tank .proc CallPurchaseForEveryTank - mva #0 TankNr - sta isInventory + mva #0 TankNr + sta isInventory @ - ldx TankNr - lda SkillTable,x - beq ManualPurchase - jsr PurchaseAI ; remember to make ActivateAI :) !!! - jmp AfterManualPurchase + ldx TankNr + lda SkillTable,x + beq ManualPurchase + jsr PurchaseAI ; remember to make ActivateAI :) !!! + jmp AfterManualPurchase ManualPurchase - lda JoyNumber,x - sta JoystickNumber ; set joystick port for player - mva #0 isInventory - jsr Purchase ; purchase weapons - bit escFlag - spl:rts - jsr DefensivesActivate ; activate weapons - bit escFlag - spl:rts + lda JoyNumber,x + sta JoystickNumber ; set joystick port for player + mva #0 isInventory + jsr Purchase ; purchase weapons + bit escFlag + spl:rts + jsr DefensivesActivate ; activate weapons + bit escFlag + spl:rts AfterManualPurchase - inc:lda TankNr - cmp NumberOfPlayers - bne @- - rts + inc:lda TankNr + cmp NumberOfPlayers + bne @- + rts .endp ;-------------------------------------------------- .proc DefensivesActivate @@ -92,7 +92,7 @@ AfterManualPurchase mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 - jmp Purchase.GoToActivation + jmp Purchase.GoToActivation .endp @@ -109,8 +109,8 @@ AfterManualPurchase mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 GoToActivation - rts - + rts + .endp ; ----------------------------------------------------- @@ -118,14 +118,14 @@ GoToActivation ;entering names of players mva #0 TankNr - sta COLBAKS ; set color of background + sta COLBAKS ; set color of background @ tax lda TankStatusColoursTable,x sta COLOR2 ; set color of player name line jsr EnterPlayerName bit escFlag spl:rts - jsr CheckTankCheat + jsr CheckTankCheat inc TankNr lda TankNr cmp NumberOfPlayers @@ -151,12 +151,12 @@ EndOfNick ; level of the computer opponent goes to ; the table of levels (difficulties) ldx tanknr - lda #6 ; Spoiler + lda #6 ; Spoiler sta DifficultyLevel sta skilltable,x - beq NotRobot - lda #$03 ; shape for robotanks - sta TankShape,x + beq NotRobot + lda #$03 ; shape for robotanks + sta TankShape,x NotRobot ; storing name of the tank in the right space ; (without cursor!) @@ -234,24 +234,24 @@ TooLittle000 dex ;rightnumber ; displaying without leading zeroes (if zeroes exist then display space at this position) ldy #0 - ldx #0 ; digit flag (cut leading zeroes) + ldx #0 ; digit flag (cut leading zeroes) displayloop lda decimalresult,y - cpx #0 - bne noleading0 - cpy #4 - beq noleading0 ; if 00000 - last 0 must stay - cmp zero - bne noleading0 - lda #space - beq displaychar ; space = 0 ! + cpx #0 + bne noleading0 + cpy #4 + beq noleading0 ; if 00000 - last 0 must stay + cmp zero + bne noleading0 + lda #space + beq displaychar ; space = 0 ! noleading0 - inx ; set flag (no leading zeroes to cut) + inx ; set flag (no leading zeroes to cut) displaychar sta (displayposition),y nexdigit iny - cpy #5 + cpy #5 bne displayloop rts @@ -313,7 +313,7 @@ displayloop1 ;-------------------------------------------------- .proc GameOverScreen ;-------------------------------------------------- - rts + rts .endp ;------------------------------------------------- .proc PutTankNameOnScreen diff --git a/ai.asm b/ai.asm index ce4b87c..f6f18f1 100644 --- a/ai.asm +++ b/ai.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ; artificial intelligence of tanks goes here! ; in A there is a level of tank's intelligence @@ -22,26 +22,26 @@ pha lda AIRoutines,y pha -; it's no necessary - PrepareAIShoot is next proc :) -; jsr PrepareAIShoot -; rts -.endp +; it's no necessary - PrepareAIShoot is next proc :) +; jsr PrepareAIShoot +; rts +.endp ;---------------------------------------------- .proc PrepareAIShoot - ; create low precision table of positions - ; by dividing positions by 4 - ldy #MaxPlayers-1 + ; create low precision table of positions + ; by dividing positions by 4 + ldy #MaxPlayers-1 loop - lda xtankstableL,y - sta temp - lda xtankstableH,y - sta temp+1 - ;= /4 - :2 lsrw temp - lda temp - sta LowResDistances,y - dey - bpl loop + lda xtankstableL,y + sta temp + lda xtankstableH,y + sta temp+1 + ;= /4 + :2 lsrw temp + lda temp + sta LowResDistances,y + dey + bpl loop ; common values used in AI routines ; address of weapons table (for future use) @@ -50,7 +50,7 @@ WepTableToTemp sta temp lda TanksWeaponsTableH,x sta temp+1 - rts + rts .endp ;---------------- AIRoutines @@ -65,15 +65,15 @@ AIRoutines ;---------------------------------------------- .proc Unknown - ; random robotank (from Poolshark to Cyborg) - randomize 4 13 - and #%11111110 - tay + ; random robotank (from Poolshark to Cyborg) + randomize 4 13 + and #%11111110 + tay lda AIRoutines+1,y pha lda AIRoutines,y pha - rts + rts .endp ;---------------------------------------------- .proc Moron @@ -82,9 +82,9 @@ AIRoutines mwa #80 RandBoundaryLow mwa #800 RandBoundaryHigh jsr RandomizeForce - ; choose the best weapon - ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) - jmp ChooseBestOffensive.NotFromAll + ; choose the best weapon + ldy #ind_Buy_me +1 ; if the cheat is active it will fire the BFG :) + jmp ChooseBestOffensive.NotFromAll ;rts .endp ;---------------------------------------------- @@ -95,10 +95,10 @@ AIRoutines ora PreviousEnergyH,x beq firstShoot - lda PreviousAngle,x - cmp #90 - bcs shootingLeftAtThisMomentOfTime - ; shooting right at this moment of time + lda PreviousAngle,x + cmp #90 + bcs shootingLeftAtThisMomentOfTime + ; shooting right at this moment of time sec sbc #5 cmp #10 @@ -106,41 +106,41 @@ AIRoutines bcc firstShoot ; GET THE aim againg shootingLeftAtThisMomentOfTime - - clc - adc #5 - cmp #170 ; maximum shooter angle + + clc + adc #5 + cmp #170 ; maximum shooter angle bcs firstShoot @ - sta NewAngle + sta NewAngle - sec - lda PreviousEnergyL,x - sbc #5 - sta ForceTableL,x - lda PreviousEnergyH,x - sbc #0 - sta ForceTableH,x - jmp endo + sec + lda PreviousEnergyL,x + sbc #5 + sta ForceTableL,x + lda PreviousEnergyH,x + sbc #0 + sta ForceTableH,x + jmp endo firstShoot - ; compare the x position with the middle of the screen + ; compare the x position with the middle of the screen lda xTanksTableH,x cmp #>(screenwidth/2) bne @+ - lda xTanksTableL,x - cmp #<(screenwidth/2) -@ bcc tankIsOnTheRight + lda xTanksTableL,x + cmp #<(screenwidth/2) +@ bcc tankIsOnTheRight ; enemy tank is on the left - randomize 95 125 - sta NewAngle - bne forceNow + randomize 95 125 + sta NewAngle + bne forceNow tankIsOnTheRight randomize 55 85 sta NewAngle - + forceNow mwa #100 RandBoundaryLow mwa #800 RandBoundaryHigh @@ -148,262 +148,262 @@ forceNow jsr RandomizeForce endo - ;ldx TankNr ;this is possibly not necessary + ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce.LimitForce - lda NewAngle - sta PreviousAngle,x - lda ForceTableL,x - sta PreviousEnergyL,x - lda ForceTableH,x - sta PreviousEnergyH,x - - ; choose the best weapon - - jmp ChooseBestOffensive + lda NewAngle + sta PreviousAngle,x + lda ForceTableL,x + sta PreviousEnergyL,x + lda ForceTableH,x + sta PreviousEnergyH,x + + ; choose the best weapon + + jmp ChooseBestOffensive ;rts .endp ;---------------------------------------------- .proc Poolshark - jsr UseBatteryOrFlag - ; defensives - jsr PoolsharkDefensives + jsr UseBatteryOrFlag + ; defensives + jsr PoolsharkDefensives firstShoot - ;find nearest tank neighbour - jsr FindBestTarget2 - beq EnemyOnLeft - ; calculate index to shotangle table - ; in temp2 we have x distance divided by 8 - lda temp2 - :3 lsr @ - and #%00000111 - clc - adc #8 - sta AngleTablePointer - bne AngleIsSet + ;find nearest tank neighbour + jsr FindBestTarget2 + beq EnemyOnLeft + ; calculate index to shotangle table + ; in temp2 we have x distance divided by 8 + lda temp2 + :3 lsr @ + and #%00000111 + clc + adc #8 + sta AngleTablePointer + bne AngleIsSet EnemyOnLeft - lda temp2 - :3 lsr @ - and #%00000111 - eor #%00000111 - sta AngleTablePointer + lda temp2 + :3 lsr @ + and #%00000111 + eor #%00000111 + sta AngleTablePointer AngleIsSet - - randomize 0 8 - ldy AngleTablePointer - clc - adc AngleTable,y - sta NewAngle - + + randomize 0 8 + ldy AngleTablePointer + clc + adc AngleTable,y + sta NewAngle + forceNow mwa #300 RandBoundaryLow mwa #700 RandBoundaryHigh ldx TankNr jsr RandomizeForce -endo - ; choose the best weapon - - jsr ChooseBestOffensive +endo + ; choose the best weapon + + jsr ChooseBestOffensive rts ;---------------------------------------------- -AngleTable ; 16 bytes ;ba w $348b L$3350 - .by 106,114,122,130,138,146,154,162 - .by 18,26,34,43,50,58,66,74 +AngleTable ; 16 bytes ;ba w $348b L$3350 + .by 106,114,122,130,138,146,154,162 + .by 18,26,34,43,50,58,66,74 .endp ;---------------------------------------------- .proc UseBatteryOrFlag - jsr UseBattery ; as subroutine for reuse in AutoDefense - ; if very low energy and no battery then use White Flag - lda Energy,x - cmp #5 - bcs EnoughEnergy - ; lower than 5 units - white flag - jsr ClearTankNr ; we must hide tank to erase shields (issue #138) - lda #ind_White_Flag_____ - sta ActiveDefenceWeapon,x - jsr PutTankNr ; and draw tank witch Flag + jsr UseBattery ; as subroutine for reuse in AutoDefense + ; if very low energy and no battery then use White Flag + lda Energy,x + cmp #5 + bcs EnoughEnergy + ; lower than 5 units - white flag + jsr ClearTankNr ; we must hide tank to erase shields (issue #138) + lda #ind_White_Flag + sta ActiveDefenceWeapon,x + jsr PutTankNr ; and draw tank witch Flag EnoughEnergy - rts + rts .endp ; .proc UseBattery - ; if low energy ten use battery - lda Energy,x - cmp #30 - bcs EnoughEnergy - ; lower than 30 units - check battery - ldy #ind_Battery________ - lda (temp),y ; has address of TanksWeaponsTable - beq NoBatteries - ; we have batteries - use one - sec - sbc #1 - sta (temp),y - lda #99 - sta Energy,x - jsr MaxForceCalculate + ; if low energy ten use battery + lda Energy,x + cmp #30 + bcs EnoughEnergy + ; lower than 30 units - check battery + ldy #ind_Battery + lda (temp),y ; has address of TanksWeaponsTable + beq NoBatteries + ; we have batteries - use one + sec + sbc #1 + sta (temp),y + lda #99 + sta Energy,x + jsr MaxForceCalculate EnoughEnergy NoBatteries - rts + rts .endp ;---------------------------------------------- .proc PoolsharkDefensives - ; use best defensive :) - ; but not allways - randomize 1 3 - cmp #1 - bne NoUseDefensive - ; first check check if any is in use - lda ActiveDefenceWeapon,x - bne DefensiveInUse - ldy #last_real_defensive+1 ;the last defensive weapon + ; use best defensive :) + ; but not allways + randomize 1 3 + cmp #1 + bne NoUseDefensive + ; first check check if any is in use + lda ActiveDefenceWeapon,x + bne DefensiveInUse + ldy #last_real_defensive+1 ;the last defensive weapon @ - dey - cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - beq NoUseDefensive - lda (temp),y ; has address of TanksWeaponsTable - beq @- - ; decrease in inventory - sec - sbc #1 - sta (temp),y ; has address of TanksWeaponsTable - ; activate defensive weapon - tya ; number of selectet defensive weapon - sta ActiveDefenceWeapon,x + dey + cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + beq NoUseDefensive + lda (temp),y ; has address of TanksWeaponsTable + beq @- + ; decrease in inventory + sec + sbc #1 + sta (temp),y ; has address of TanksWeaponsTable + ; activate defensive weapon + tya ; number of selectet defensive weapon + sta ActiveDefenceWeapon,x lda DefensiveEnergy,y sta ShieldEnergy,x NoUseDefensive DefensiveInUse - rts + rts .endp ;---------------------------------------------- .proc Tosser - jsr UseBatteryOrFlag - ; use best defensive :) - jsr TosserDefensives - ; Toosser is like Poolshark but allways uses defensives - jmp Poolshark.firstShoot + jsr UseBatteryOrFlag + ; use best defensive :) + jsr TosserDefensives + ; Toosser is like Poolshark but allways uses defensives + jmp Poolshark.firstShoot .endp ;---------------------------------------------- .proc TosserDefensives - ; use best defensive :) - ; allways - ; first check check if any is in use - lda ActiveDefenceWeapon,x - bne DefensiveInUse - ldy #last_real_defensive+1 ;the last defensive weapon + ; use best defensive :) + ; allways + ; first check check if any is in use + lda ActiveDefenceWeapon,x + bne DefensiveInUse + ldy #last_real_defensive+1 ;the last defensive weapon @ - dey - cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - beq NoUseDefensive - lda (temp),y ; has address of TanksWeaponsTable - beq @- - ; decrease in inventory - sec - sbc #1 - sta (temp),y ; has address of TanksWeaponsTable - ; activate defensive weapon - tya ; number of selectet defensive weapon - sta ActiveDefenceWeapon,x + dey + cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + beq NoUseDefensive + lda (temp),y ; has address of TanksWeaponsTable + beq @- + ; decrease in inventory + sec + sbc #1 + sta (temp),y ; has address of TanksWeaponsTable + ; activate defensive weapon + tya ; number of selectet defensive weapon + sta ActiveDefenceWeapon,x lda DefensiveEnergy,y sta ShieldEnergy,x DefensiveInUse NoUseDefensive - rts + rts .endp ;---------------------------------------------- .proc Chooser - ; like cyborg but more randomizing force - jsr UseBatteryOrFlag - ; use defensives like Tosser - jsr TosserDefensives - ; now select best target - lda #$00 ; no prefer humans - jsr FindBestTarget3 - sty TargetTankNr - ; aiming - jsr TakeAim ; direction still in A (0 - left, >0 - right) - - ; choose the best weapon - jsr ChooseBestOffensive + ; like cyborg but more randomizing force + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + lda #$00 ; no prefer humans + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + jsr ChooseBestOffensive - ; randomizing force +-100 - sbw Force #100 RandBoundaryLow - bpl NotNegativeEnergy - mwa #1 RandBoundaryLow + ; randomizing force +-100 + sbw Force #100 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow NotNegativeEnergy - adw Force #100 RandBoundaryHigh + adw Force #100 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - jsr GetDistance - cmp #6 ; 24/4 - bcs HighForce - lda #ind_Baby_Missile___ - sta ActiveWeapon,x + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + jsr GetDistance + cmp #6 ; 24/4 + bcs HighForce + lda #ind_Baby_Missile + sta ActiveWeapon,x HighForce - rts + rts .endp ;---------------------------------------------- .proc Spoiler - ; like cyborg but little randomizing force - jsr UseBatteryOrFlag - ; use defensives like Tosser - jsr TosserDefensives - ; now select best target - lda #$00 ; no prefer humans - jsr FindBestTarget3 - sty TargetTankNr - ; aiming - jsr TakeAim ; direction still in A (0 - left, >0 - right) - - ; choose the best weapon - jsr ChooseBestOffensive + ; like cyborg but little randomizing force + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + lda #$00 ; no prefer humans + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + jsr ChooseBestOffensive - ; randomizing force +-50 - sbw Force #50 RandBoundaryLow - bpl NotNegativeEnergy - mwa #1 RandBoundaryLow + ; randomizing force +-50 + sbw Force #50 RandBoundaryLow + bpl NotNegativeEnergy + mwa #1 RandBoundaryLow NotNegativeEnergy - adw Force #50 RandBoundaryHigh + adw Force #50 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - jsr GetDistance - cmp #6 ; 24/4 - bcs HighForce - lda #ind_Baby_Missile___ - sta ActiveWeapon,x + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + jsr GetDistance + cmp #6 ; 24/4 + bcs HighForce + lda #ind_Baby_Missile + sta ActiveWeapon,x HighForce - rts + rts .endp ;---------------------------------------------- .proc Cyborg - jsr UseBatteryOrFlag - ; use defensives like Tosser - jsr TosserDefensives - ; now select best target - lda #100 ; prefer humans - jsr FindBestTarget3 - sty TargetTankNr - ; aiming - jsr TakeAim ; direction still in A (0 - left, >0 - right) - - ; choose the best weapon - ldy #ind_Nuke___________+1 - jsr ChooseBestOffensive.NotFromAll + jsr UseBatteryOrFlag + ; use defensives like Tosser + jsr TosserDefensives + ; now select best target + lda #100 ; prefer humans + jsr FindBestTarget3 + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + + ; choose the best weapon + ldy #ind_Nuke +1 + jsr ChooseBestOffensive.NotFromAll - lda Force - sta ForceTableL,x - lda Force+1 - sta ForceTableH,x - ; if target distance lower than 32 - set weapon to Baby Missile (for security :) - jsr GetDistance - cmp #8 ;32/4 - bcs HighForce - lda #ind_Baby_Missile___ - sta ActiveWeapon,x + lda Force + sta ForceTableL,x + lda Force+1 + sta ForceTableH,x + ; if target distance lower than 32 - set weapon to Baby Missile (for security :) + jsr GetDistance + cmp #8 ;32/4 + bcs HighForce + lda #ind_Baby_Missile + sta ActiveWeapon,x HighForce - rts + rts .endp ;---------------------------------------------- @@ -414,51 +414,51 @@ HighForce ; returns target tank number in Y and ; direcion of shoot in A (0 - left, >0 - right) ;---------------------------------------------- - sta PreferHumansFlag -; jsr MakeLowResDistances - lda #202 - sta temp2 ; max possible energy - lda #0 - sta tempor2 ; direction of shoot - ;ldx TankNr - ldy NumberOfPlayers - dey - + sta PreferHumansFlag +; jsr MakeLowResDistances + lda #202 + sta temp2 ; max possible energy + lda #0 + sta tempor2 ; direction of shoot + ;ldx TankNr + ldy NumberOfPlayers + dey + loop01 - cpy TankNr - beq skipThisPlayer - lda eXistenZ,y - beq skipThisPlayer + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer - lda skilltable,y - beq ItIsHuman - lda PreferHumansFlag + lda skilltable,y + beq ItIsHuman + lda PreferHumansFlag ItIsHuman - clc - adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank - mva #0 tempor2 - lda LowResDistances,x - cmp LowResDistances,y - bcs EnemyOnTheLeft - ; enemy on right - inc tempor2 ; set direction to right - -EnemyOnTheLeft + clc + adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + mva #0 tempor2 + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ; enemy on right + inc tempor2 ; set direction to right + +EnemyOnTheLeft lowestIsLower skipThisPlayer - dey - bpl loop01 - ; now we have number of the farthest tank in temp2+1 - ; and direction (0 - left, >0 - right) in tempor2 - ; let's move them to registers - ; in temp2 we have energy of target - ldy temp2+1 - lda tempor2 - rts + dey + bpl loop01 + ; now we have number of the farthest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have energy of target + ldy temp2+1 + lda tempor2 + rts .endp ;---------------------------------------------- .proc FindBestTarget2 @@ -467,54 +467,54 @@ skipThisPlayer ; returns target tank number in Y and ; direcion of shoot in A (0 - left, >0 - right) ;---------------------------------------------- -; jsr MakeLowResDistances - mva #$ff temp2 ; min possible distance - mva #0 tempor2 ; direction of shoot +; jsr MakeLowResDistances + mva #$ff temp2 ; min possible distance + mva #0 tempor2 ; direction of shoot - ;ldx TankNr - ldy NumberOfPlayers - dey - + ;ldx TankNr + ldy NumberOfPlayers + dey + loop01 - cpy TankNr - beq skipThisPlayer - lda eXistenZ,y - beq skipThisPlayer - - lda LowResDistances,x - cmp LowResDistances,y - bcs EnemyOnTheLeft - ;enemy on the right - sec - lda LowResDistances,y - sbc LowResDistances,x - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank - inc tempor2 ; set direction to right - bne lowestIsLower + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + sec + lda LowResDistances,y + sbc LowResDistances,x + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + inc tempor2 ; set direction to right + bne lowestIsLower EnemyOnTheLeft - sec - lda LowResDistances,x - sbc LowResDistances,y - cmp temp2 ; lowest - bcs lowestIsLower - sta temp2 - sty temp2+1 ; number of the closest tank - + sec + lda LowResDistances,x + sbc LowResDistances,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + lowestIsLower skipThisPlayer - dey - bpl loop01 - ; now we have number of the closest tank in temp2+1 - ; and direction (0 - left, >0 - right) in tempor2 - ; let's move them to registers - ; in temp2 we have x distance divided by 8 - ldy temp2+1 - lda tempor2 - rts + dey + bpl loop01 + ; now we have number of the closest tank in temp2+1 + ; and direction (0 - left, >0 - right) in tempor2 + ; let's move them to registers + ; in temp2 we have x distance divided by 8 + ldy temp2+1 + lda tempor2 + rts .endp ;---------------------------------------------- @@ -524,239 +524,239 @@ skipThisPlayer ; returns angle and power of shoot tank X (TankNr) ; in the appropriate variables (Angle and Force) ;---------------------------------------------- - lda ActiveWeapon,x - pha ; store active weapon - mva #$ff SecondTryFlag - ; set initial Angle and Force values - lda OptionsTable+2 ; selected gravity - asl - tay - ; force correction - lower tank Y position - higher possible force - sec - lda #screenheight - sbc Ytankstable,x - sta temp2 - clc - lda AIForceTable,y - sta RandBoundaryLow - adc temp2 - sta RandBoundaryHigh - lda AIForceTable+1,y - sta RandBoundaryLow+1 - adc #0 - sta RandBoundaryHigh+1 + lda ActiveWeapon,x + pha ; store active weapon + mva #$ff SecondTryFlag + ; set initial Angle and Force values + lda OptionsTable+2 ; selected gravity + asl + tay + ; force correction - lower tank Y position - higher possible force + sec + lda #screenheight + sbc Ytankstable,x + sta temp2 + clc + lda AIForceTable,y + sta RandBoundaryLow + adc temp2 + sta RandBoundaryHigh + lda AIForceTable+1,y + sta RandBoundaryLow+1 + adc #0 + sta RandBoundaryHigh+1 jsr RandomizeForce RepeatAim - jsr Table2Force - ; wind correction 90+(wind/8) - mwa Wind temp2 - :7 lsrw temp2 - clc - lda #90 - adc temp2 - sta NewAngle - ; set virtual weapon :) - lda #ind_Baby_Missile___ - sta ActiveWeapon,x - ; now we have initial valuses - mva #%11000000 TestFlightFlag - ; check targeting direction - lda tempor2 - jne AimingLeft + jsr Table2Force + ; wind correction 90+(wind/8) + mwa Wind temp2 + :7 lsrw temp2 + clc + lda #90 + adc temp2 + sta NewAngle + ; set virtual weapon :) + lda #ind_Baby_Missile + sta ActiveWeapon,x + ; now we have initial valuses + mva #%11000000 TestFlightFlag + ; check targeting direction + lda tempor2 + jne AimingLeft AimingRight - ; make test Shoot (Flight) - jsr SetStartAndFlight - lda HitFlag - beq NoHitInFirstLoopR ; impossible :) - bmi GroundHitInFirstLoopR + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInFirstLoopR ; impossible :) + bmi GroundHitInFirstLoopR TankHitInFirstLoopR - ; tank hit, but which tank? - ; it's our target or not? - ldy HitFlag - dey - cpy TargetTankNr - beq EndOfFirstLoopR ; it's our target! - ; if it's another tank then check position like ground hit + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfFirstLoopR ; it's our target! + ; if it's another tank then check position like ground hit GroundHitInFirstLoopR - ; checking only x position of hit - ldy TargetTankNr - lda xTanksTableH,y - cmp XHit+1 - bne @+ - lda xTanksTableL,y - cmp XHit + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit @ - bcs HitOnRightSideOfTargetR - ; continue targeting - clc - lda NewAngle - adc #5 ; 5 deg to right - cmp #(180-20) -; bcs EndOfFirstLoopR ; if angle 180-20 or higher - bcs AimSecondTry - sta NewAngle - jmp AimingRight + bcs HitOnRightSideOfTargetR + ; continue targeting + clc + lda NewAngle + adc #5 ; 5 deg to right + cmp #(180-20) +; bcs EndOfFirstLoopR ; if angle 180-20 or higher + bcs AimSecondTry + sta NewAngle + jmp AimingRight NoHitInFirstLoopR - ; Angle 5 deg to left and end loop - sec - lda NewAngle - sbc #5 - sta NewAngle + ; Angle 5 deg to left and end loop + sec + lda NewAngle + sbc #5 + sta NewAngle HitOnRightSideOfTargetR - dec NewAngle + dec NewAngle EndOfFirstLoopR - mva #5 modify ; set counter (5 turns) + mva #5 modify ; set counter (5 turns) SecondLoopR - ; make test Shoot (Flight) - jsr SetStartAndFlight - lda HitFlag - beq NoHitInSecondLoopR ; impossible :) - bmi GroundHitInSecondLoopR + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInSecondLoopR ; impossible :) + bmi GroundHitInSecondLoopR TankHitInSecondLoopR - ; tank hit, but which tank? - ; it's our target or not? - ldy HitFlag - dey - cpy TargetTankNr - beq EndOfSecondLoopR ; it's our target! - ; if it's another tank then check position like ground hit + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfSecondLoopR ; it's our target! + ; if it's another tank then check position like ground hit GroundHitInSecondLoopR - ; checking only x position of hit - ldy TargetTankNr - lda xTanksTableH,y - cmp XHit+1 - bne @+ - lda xTanksTableL,y - cmp XHit + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit @ - bcc HitOnLeftSideOfTargetR - ; continue targeting - dec NewAngle ; 1 deg to left - dec modify ; max 5 turns - beq EndOfSecondLoopR - jmp SecondLoopR + bcc HitOnLeftSideOfTargetR + ; continue targeting + dec NewAngle ; 1 deg to left + dec modify ; max 5 turns + beq EndOfSecondLoopR + jmp SecondLoopR HitOnLeftSideOfTargetR - ; decrease energy (a little) - sbw Force #5 + ; decrease energy (a little) + sbw Force #5 NoHitInSecondLoopR - ; Angle 1 deg to right and end loop - inc NewAngle + ; Angle 1 deg to right and end loop + inc NewAngle EndOfSecondLoopR EndOfAim - pla ; and restore active weapon - sta ActiveWeapon,x - rts + pla ; and restore active weapon + sta ActiveWeapon,x + rts AimSecondTry - bit SecondTryFlag - bpl EndOfAim ; closest RTS - inc SecondTryFlag - lda #<1000 - sta ForceTableL,x - lda #>1000 - sta ForceTableH,x - jsr RandomizeForce.LimitForce - jmp RepeatAim - + bit SecondTryFlag + bpl EndOfAim ; closest RTS + inc SecondTryFlag + lda #<1000 + sta ForceTableL,x + lda #>1000 + sta ForceTableH,x + jsr RandomizeForce.LimitForce + jmp RepeatAim + AimingLeft - ; make test Shoot (Flight) - jsr SetStartAndFlight - lda HitFlag - beq NoHitInFirstLoopL ; impossible :) - bmi GroundHitInFirstLoopL + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInFirstLoopL ; impossible :) + bmi GroundHitInFirstLoopL TankHitInFirstLoopL - ; tank hit, but which tank? - ; it's our target or not? - ldy HitFlag - dey - cpy TargetTankNr - beq EndOfFirstLoopL ; it's our target! - ; if it's another tank then check position like ground hit + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfFirstLoopL ; it's our target! + ; if it's another tank then check position like ground hit GroundHitInFirstLoopL - ; checking only x position of hit - ldy TargetTankNr - lda xTanksTableH,y - cmp XHit+1 - bne @+ - lda xTanksTableL,y - cmp XHit + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit @ - bcc HitOnLeftSideOfTargetL - ; continue targeting - sec - lda NewAngle - sbc #5 ; 5 deg to left - cmp #21 -; bcc EndOfFirstLoopL ; if angle 20 or lower - bcc AimSecondTry - sta NewAngle - jmp AimingLeft + bcc HitOnLeftSideOfTargetL + ; continue targeting + sec + lda NewAngle + sbc #5 ; 5 deg to left + cmp #21 +; bcc EndOfFirstLoopL ; if angle 20 or lower + bcc AimSecondTry + sta NewAngle + jmp AimingLeft NoHitInFirstLoopL - ; Angle 5 deg to right and end loop - clc - lda NewAngle - adc #5 - sta NewAngle + ; Angle 5 deg to right and end loop + clc + lda NewAngle + adc #5 + sta NewAngle HitOnLeftSideOfTargetL - inc NewAngle + inc NewAngle EndOfFirstLoopL - mva #5 modify ; set counter (5 turns) + mva #5 modify ; set counter (5 turns) SecondLoopL - ; make test Shoot (Flight) - jsr SetStartAndFlight - lda HitFlag - beq NoHitInSecondLoopL ; impossible :) - bmi GroundHitInSecondLoopL + ; make test Shoot (Flight) + jsr SetStartAndFlight + lda HitFlag + beq NoHitInSecondLoopL ; impossible :) + bmi GroundHitInSecondLoopL TankHitInSecondLoopL - ; tank hit, but which tank? - ; it's our target or not? - ldy HitFlag - dey - cpy TargetTankNr - beq EndOfSecondLoopL ; it's our target! - ; if it's another tank then check position like ground hit + ; tank hit, but which tank? + ; it's our target or not? + ldy HitFlag + dey + cpy TargetTankNr + beq EndOfSecondLoopL ; it's our target! + ; if it's another tank then check position like ground hit GroundHitInSecondLoopL - ; checking only x position of hit - ldy TargetTankNr - lda xTanksTableH,y - cmp XHit+1 - bne @+ - lda xTanksTableL,y - cmp XHit + ; checking only x position of hit + ldy TargetTankNr + lda xTanksTableH,y + cmp XHit+1 + bne @+ + lda xTanksTableL,y + cmp XHit @ - bcs HitOnRightSideOfTargetL - ; continue targeting - inc NewAngle ; 1 deg to right - dec modify ; max 5 turns - beq EndOfSecondLoopL - jmp SecondLoopL + bcs HitOnRightSideOfTargetL + ; continue targeting + inc NewAngle ; 1 deg to right + dec modify ; max 5 turns + beq EndOfSecondLoopL + jmp SecondLoopL HitOnRightSideOfTargetL - ; decrease energy (a little) - sbw Force #5 + ; decrease energy (a little) + sbw Force #5 NoHitInSecondLoopL - ; Angle 1 deg to left and end loop - dec NewAngle + ; Angle 1 deg to left and end loop + dec NewAngle EndOfSecondLoopL - jmp EndOfAim - -SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight - ; xtraj+1 and ytraj+1 set - clc - lda xTanksTableL,x - adc #4 - sta xtraj+1 - lda xTanksTableH,x - adc #0 - sta xtraj+2 - sec - lda yTanksTable,x - sbc #4 - sta ytraj+1 - mva #0 ytraj+2 - mva NewAngle Angle - jsr Flight - ldx TankNr - rts + jmp EndOfAim + +SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight + ; xtraj+1 and ytraj+1 set + clc + lda xTanksTableL,x + adc #4 + sta xtraj+1 + lda xTanksTableH,x + adc #0 + sta xtraj+2 + sec + lda yTanksTable,x + sbc #4 + sta ytraj+1 + mva #0 ytraj+2 + mva NewAngle Angle + jsr Flight + ldx TankNr + rts .endp ;---------------------------------------------- .proc PurchaseAI ; @@ -771,8 +771,8 @@ SetStartAndFlight ; set start point (virtual barrel end :) ) and make test fligh pha lda PurchaseAIRoutines,x pha - rts - .endp + rts + .endp ;---------------- PurchaseAIRoutines @@ -791,125 +791,125 @@ PurchaseAIRoutines rts .endp ;------- -.proc TryToPurchaseOnePiece2 ; for Cyborg - ; A - weapon number, better it will be in range(1,32) - ; TankNr in X +.proc TryToPurchaseOnePiece2 ; for Cyborg + ; A - weapon number, better it will be in range(1,32) + ; TankNr in X ; DOES NOT CHANGE X - tay - sta temp+1 - :3 lsr ; A=A/8 - sta temp - tya - and #%00000111 - tay - lda bittable,y - ldy temp - and PurchaseMeTable2,y - beq TryToPurchaseOnePiece.SorryNoPurchase - jmp TryToPurchaseOnePiece.PurchaseIt + tay + sta temp+1 + :3 lsr ; A=A/8 + sta temp + tya + and #%00000111 + tay + lda bittable,y + ldy temp + and PurchaseMeTable2,y + beq TryToPurchaseOnePiece.SorryNoPurchase + jmp TryToPurchaseOnePiece.PurchaseIt .endp ;------- .proc TryToPurchaseOnePiece - ; A - weapon number, better it will be in range(1,32) - ; TankNr in X + ; A - weapon number, better it will be in range(1,32) + ; TankNr in X ; DOES NOT CHANGE X - tay - sta temp+1 - :3 lsr ; A=A/8 - sta temp - tya - and #%00000111 - tay - lda bittable,y - ldy temp - and PurchaseMeTable,y - beq SorryNoPurchase + tay + sta temp+1 + :3 lsr ; A=A/8 + sta temp + tya + and #%00000111 + tay + lda bittable,y + ldy temp + and PurchaseMeTable,y + beq SorryNoPurchase PurchaseIt - ldy temp+1 - lda WeaponPriceL,y - sta temp - lda WeaponPriceH,y - sta temp+1 - ;price of the weapon in temp - lda MoneyL,x - sta temp2 - lda MoneyH,x - sta temp2+1 - ;current monies in temp2 - cpw temp2 temp - bcc SorryNoPurchase - ; deduct monies from the bank account - sec - lda temp2 - sbc temp - sta MoneyL,x - lda temp2+1 - sbc temp+1 - sta MoneyH,x - - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 + ldy temp+1 + lda WeaponPriceL,y + sta temp + lda WeaponPriceH,y + sta temp+1 + ;price of the weapon in temp + lda MoneyL,x + sta temp2 + lda MoneyH,x + sta temp2+1 + ;current monies in temp2 + cpw temp2 temp + bcc SorryNoPurchase + ; deduct monies from the bank account + sec + lda temp2 + sbc temp + sta MoneyL,x + lda temp2+1 + sbc temp+1 + sta MoneyH,x + + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 - lda WeaponUnits,y - clc - adc (temp),y - cmp #99 ;max number of weapon units - bcc NotExceeded - lda #99 + lda WeaponUnits,y + clc + adc (temp),y + cmp #99 ;max number of weapon units + bcc NotExceeded + lda #99 NotExceeded - sta (temp),y - - + sta (temp),y + + SorryNoPurchase - rts - .endp - + rts + .endp + ;---------------------------------------------- .proc ShooterPurchase - ; first try to buy defensives -; mva #2 tempXroller; number of offensive purchases to perform - ldx TankNr + ; first try to buy defensives +; mva #2 tempXroller; number of offensive purchases to perform + ldx TankNr @ - randomize ind_Battery________ ind_StrongParachute - jsr TryToPurchaseOnePiece -; dec tempXroller -; bne @- - - ; and now offensives - mva #4 tempXroller; number of offensive purchases to perform - ;ldx TankNr + randomize ind_Battery ind_StrongParachute + jsr TryToPurchaseOnePiece +; dec tempXroller +; bne @- + + ; and now offensives + mva #4 tempXroller; number of offensive purchases to perform + ;ldx TankNr @ - randomize ind_Missile________ ind_Heavy_Roller___ - jsr TryToPurchaseOnePiece - dec tempXroller - bne @- + randomize ind_Missile ind_Heavy_Roller + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- - rts + rts .endp ;---------------------------------------------- .proc PoolsharkPurchase - ; first try to buy defensives -; mva #2 tempXroller; number of offensive purchases to perform - ldx TankNr + ; first try to buy defensives +; mva #2 tempXroller; number of offensive purchases to perform + ldx TankNr @ - randomize ind_Battery________ ind_Bouncy_Castle__ - jsr TryToPurchaseOnePiece - dec tempXroller -; bpl @- - - ; and now offensives - mva #6 tempXroller; number of purchases to perform - ;ldx TankNr + randomize ind_Battery ind_Bouncy_Castle + jsr TryToPurchaseOnePiece + dec tempXroller +; bpl @- + + ; and now offensives + mva #6 tempXroller; number of purchases to perform + ;ldx TankNr @ - randomize ind_Missile________ ind_Dirt_Charge____ - jsr TryToPurchaseOnePiece - dec tempXroller - bne @- + randomize ind_Missile ind_Dirt_Charge + jsr TryToPurchaseOnePiece + dec tempXroller + bne @- - rts + rts .endp ;---------------------------------------------- .proc TosserPurchase @@ -917,12 +917,12 @@ SorryNoPurchase ; what is my money level ldx TankNr lda MoneyH,x ; money / 256 - lsr ; /2 + lsr ; /2 sta tempXroller ; perform this many purchase attempts ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery________ ind_Bouncy_Castle__ + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece dec tempXroller bpl @- @@ -932,7 +932,7 @@ SorryNoPurchase asl ;*2 sta tempXroller ; perform this many purchase attempts @ - randomize ind_Missile________ ind_Dirt_Charge____ + randomize ind_Missile ind_Dirt_Charge jsr TryToPurchaseOnePiece dec tempXroller bpl @- @@ -945,12 +945,12 @@ SorryNoPurchase ; what is my money level ldx TankNr lda MoneyH,x ; money / 256 - lsr ; /2 + lsr ; /2 sta tempXroller ; perform this many purchase attempts ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery________ ind_Bouncy_Castle__ + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- @@ -960,7 +960,7 @@ SorryNoPurchase :3 asl ;*8 sta tempXroller ; perform this many purchase attempts @ - randomize first_offensive____ last_offensive_____ + randomize first_offensive last_offensive jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- @@ -972,36 +972,36 @@ SorryNoPurchase ; choose the best weapon ; X - TankNr ;---------------------------------------------- - ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) -NotFromAll + ldy #ind_Dirt_Charge +1 ;the last weapon to choose +1 (not BFG or Laser :) ) +NotFromAll ; Y - the last offensive weapon to use + 1 - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 loop - dey - lda (temp),y - beq loop - tya - sta ActiveWeapon,x - rts + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + rts .endp ;---------------------------------------------- .proc GetDistance ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) ; result in A ;---------------------------------------------- - ldy TargetTankNr - lda LowResDistances,x - cmp LowResDistances,y -@ bcs YisLower - sec - lda LowResDistances,y - sbc LowResDistances,x - rts + ldy TargetTankNr + lda LowResDistances,x + cmp LowResDistances,y +@ bcs YisLower + sec + lda LowResDistances,y + sbc LowResDistances,x + rts YisLower - lda LowResDistances,x - sbc LowResDistances,y - rts + lda LowResDistances,x + sbc LowResDistances,y + rts .endp \ No newline at end of file diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm index 506b580..dfbe15c 100644 --- a/artwork/sfx/rmtplayr_modified.asm +++ b/artwork/sfx/rmtplayr_modified.asm @@ -8,7 +8,7 @@ ; 1. RMT player routine needs 19 itself reserved bytes in zero page (no accessed ; from any other routines) as well as cca 1KB of memory before the "PLAYER" ; address for frequency tables and functionary variables. It's: -; a) from PLAYER-$03c0 to PLAYER for stereo RMTplayer +; a) from PLAYER-$03c0 to PLAYER for stereo RMTplayer ; b) from PLAYER-$0320 to PLAYER for mono RMTplayer ; ; 2. RMT player routine MUST (!!!) be compiled from the begin of the memory page. @@ -16,15 +16,15 @@ ; ; 3. Because of RMTplayer provides a lot of effects, it spent a lot of CPU time. ; -; STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono -; ;1 => compile RMTplayer for 8 tracks stereo -; ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 -; ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 +; STEREOMODE equ 0..3 ;0 => compile RMTplayer for 4 tracks mono +; ;1 => compile RMTplayer for 8 tracks stereo +; ;2 => compile RMTplayer for 4 tracks stereo L1 R2 R3 L4 +; ;3 => compile RMTplayer for 4 tracks stereo L1 L2 R3 R4 -TRACKS equ 4 +TRACKS equ 4 ; RMT FEATures definitions file ; For optimizations of RMT player routine to concrete RMT modul only! - icl "feat.txt" + icl "feat.txt" ;FEAT_EFFECTS equ FEAT_EFFECTVIBRATO||FEAT_EFFECTFSHIFT ; ; RMT ZeroPage addresses @@ -37,7 +37,7 @@ p_instrstable = p_tis .zpvar nr .word .zpvar nt .byte .zpvar reg1 .byte -.zpvar reg2 .byte +.zpvar reg2 .byte .zpvar reg3 .byte .zpvar tmp .byte .zpvar v_audctl .byte ; de-self-modification vars @@ -49,43 +49,43 @@ p_instrstable = p_tis .zpvar RMTSFXVOLUME .byte ; MOVED TO variables.asm -; org PLAYER-$400+$e0 +; org PLAYER-$400+$e0 ;track_variables -;trackn_db .ds TRACKS -;trackn_hb .ds TRACKS -;trackn_idx .ds TRACKS -;trackn_pause .ds TRACKS -;trackn_note .ds TRACKS -;trackn_volume .ds TRACKS -;trackn_distor .ds TRACKS -;trackn_shiftfrq .ds TRACKS -;trackn_instrx2 .ds TRACKS -;trackn_instrdb .ds TRACKS -;trackn_instrhb .ds TRACKS -;trackn_instridx .ds TRACKS -;trackn_instrlen .ds TRACKS -;trackn_instrlop .ds TRACKS -;trackn_instrreachend .ds TRACKS +;trackn_db .ds TRACKS +;trackn_hb .ds TRACKS +;trackn_idx .ds TRACKS +;trackn_pause .ds TRACKS +;trackn_note .ds TRACKS +;trackn_volume .ds TRACKS +;trackn_distor .ds TRACKS +;trackn_shiftfrq .ds TRACKS +;trackn_instrx2 .ds TRACKS +;trackn_instrdb .ds TRACKS +;trackn_instrhb .ds TRACKS +;trackn_instridx .ds TRACKS +;trackn_instrlen .ds TRACKS +;trackn_instrlop .ds TRACKS +;trackn_instrreachend .ds TRACKS ;trackn_volumeslidedepth .ds TRACKS ;trackn_volumeslidevalue .ds TRACKS -;trackn_effdelay .ds TRACKS -;trackn_effvibratoa .ds TRACKS -;trackn_effshift .ds TRACKS +;trackn_effdelay .ds TRACKS +;trackn_effvibratoa .ds TRACKS +;trackn_effshift .ds TRACKS ;trackn_tabletypespeed .ds TRACKS -;trackn_tablenote .ds TRACKS -;trackn_tablea .ds TRACKS -;trackn_tableend .ds TRACKS -;trackn_tablelop .ds TRACKS -;trackn_tablespeeda .ds TRACKS -;trackn_command .ds TRACKS -;trackn_filter .ds TRACKS -;trackn_audf .ds TRACKS -;trackn_audc .ds TRACKS -;trackn_audctl .ds TRACKS -;v_aspeed .ds 1 +;trackn_tablenote .ds TRACKS +;trackn_tablea .ds TRACKS +;trackn_tableend .ds TRACKS +;trackn_tablelop .ds TRACKS +;trackn_tablespeeda .ds TRACKS +;trackn_command .ds TRACKS +;trackn_filter .ds TRACKS +;trackn_audf .ds TRACKS +;trackn_audc .ds TRACKS +;trackn_audctl .ds TRACKS +;v_aspeed .ds 1 ;track_endvariables -INSTRPAR equ 12 +INSTRPAR equ 12 tabbeganddistor dta frqtabpure-frqtab,$00 dta frqtabpure-frqtab,$20 @@ -96,451 +96,451 @@ tabbeganddistor dta frqtabbass1-frqtab,$c0 dta frqtabbass2-frqtab,$c0 vibtabbeg dta 0,vib1-vib0,vib2-vib0,vib3-vib0 -vib0 dta 0 -vib1 dta 1,-1,-1,1 -vib2 dta 1,0,-1,-1,0,1 -vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 +vib0 dta 0 +vib1 dta 1,-1,-1,1 +vib2 dta 1,0,-1,-1,0,1 +vib3 dta 1,1,0,-1,-1,-1,-1,0,1,1 vibtabnext - dta vib0-vib0+0 - dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 - dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 - dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 + dta vib0-vib0+0 + dta vib1-vib0+1,vib1-vib0+2,vib1-vib0+3,vib1-vib0+0 + dta vib2-vib0+1,vib2-vib0+2,vib2-vib0+3,vib2-vib0+4,vib2-vib0+5,vib2-vib0+0 + dta vib3-vib0+1,vib3-vib0+2,vib3-vib0+3,vib3-vib0+4,vib3-vib0+5,vib3-vib0+6,vib3-vib0+7,vib3-vib0+8,vib3-vib0+9,vib3-vib0+0 .align $100 frqtab - ERT [255 -; ldy #0 -; tya -;ri0 sta track_variables,y -; sta track_endvariables-$100,y -; iny -; bne ri0 -; ELS - ldy #track_endvariables-track_variables - lda #0 -ri0 sta track_variables-1,y - dey - bne ri0 -; EIF - ldy #4 - lda (ns),y - sta v_maxtracklen - iny - lda (ns),y - sta v_speed - ldy #8 -ri1 lda (ns),y - sta p_tis-8,y - iny - cpy #8+8 - bne ri1 - pla - pha - asl @ - asl @ - clc - adc p_song - sta p_song - pla - php - and #$c0 - asl @ - rol @ - rol @ - plp - adc p_song+1 - sta p_song+1 - jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 + stx ns + sty ns+1 + pha +; IFT track_endvariables-track_variables>255 +; ldy #0 +; tya +;ri0 sta track_variables,y +; sta track_endvariables-$100,y +; iny +; bne ri0 +; ELS + ldy #track_endvariables-track_variables + lda #0 +ri0 sta track_variables-1,y + dey + bne ri0 +; EIF + ldy #4 + lda (ns),y + sta v_maxtracklen + iny + lda (ns),y + sta v_speed + ldy #8 +ri1 lda (ns),y + sta p_tis-8,y + iny + cpy #8+8 + bne ri1 + pla + pha + asl @ + asl @ + clc + adc p_song + sta p_song + pla + php + and #$c0 + asl @ + rol @ + rol @ + plp + adc p_song+1 + sta p_song+1 + jsr GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 rmt_silence - lda #0 - sta $d208 - ldy #3 - sty $d20f - ldy #8 -si1 sta $d200,y - dey - bpl si1 - lda #FEAT_INSTRSPEED - rts + lda #0 + sta $d208 + ldy #3 + sty $d20f + ldy #8 +si1 sta $d200,y + dey + bpl si1 + lda #FEAT_INSTRSPEED + rts GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 GetSongLine - ldx #0 - stx v_abeat + ldx #0 + stx v_abeat nn0 -nn1 txa - tay - lda (p_song),y - cmp #$fe - bcs nn2 - tay - lda (p_trackslbstable),y - sta trackn_db,x - lda (p_trackshbstable),y +nn1 txa + tay + lda (p_song),y + cmp #$fe + bcs nn2 + tay + lda (p_trackslbstable),y + sta trackn_db,x + lda (p_trackshbstable),y nn1a sta trackn_hb,x - lda #0 - sta trackn_idx,x - lda #1 + lda #0 + sta trackn_idx,x + lda #1 nn1a2 sta trackn_pause,x - lda #$80 - sta trackn_instrx2,x - inx -xtracks01 cpx #TRACKS - bne nn1 - lda p_song - clc -xtracks02 adc #TRACKS - sta p_song - bcc GetTrackLine - inc p_song+1 + lda #$80 + sta trackn_instrx2,x + inx +xtracks01 cpx #TRACKS + bne nn1 + lda p_song + clc +xtracks02 adc #TRACKS + sta p_song + bcc GetTrackLine + inc p_song+1 nn1b - jmp GetTrackLine + jmp GetTrackLine nn2 - beq nn3 + beq nn3 nn2a - lda #0 - beq nn1a2 + lda #0 + beq nn1a2 nn3 - ldy #2 - lda (p_song),y - tax - iny - lda (p_song),y - sta p_song+1 - stx p_song - ldx #0 - beq nn0 + ldy #2 + lda (p_song),y + tax + iny + lda (p_song),y + sta p_song+1 + stx p_song + ldx #0 + beq nn0 GetTrackLine oo0 oo0a - lda v_speed + lda v_speed - sta v_bspeed - ldx #-1 + sta v_bspeed + ldx #-1 oo1 - inx - dec trackn_pause,x - bne oo1x + inx + dec trackn_pause,x + bne oo1x oo1b - lda trackn_db,x - sta ns - lda trackn_hb,x - sta ns+1 + lda trackn_db,x + sta ns + lda trackn_hb,x + sta ns+1 oo1i - ldy trackn_idx,x - inc trackn_idx,x - lda (ns),y - sta reg1 - and #$3f - cmp #61 - beq oo1a - bcs oo2 - sta trackn_note,x - iny - lda (ns),y - lsr @ - and #$3f*2 - sta trackn_instrx2,x + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + sta reg1 + and #$3f + cmp #61 + beq oo1a + bcs oo2 + sta trackn_note,x + iny + lda (ns),y + lsr @ + and #$3f*2 + sta trackn_instrx2,x oo1a - lda #1 - sta trackn_pause,x - ldy trackn_idx,x - inc trackn_idx,x - lda (ns),y - lsr @ - ror reg1 - lsr @ - ror reg1 - lda reg1 - and #$f0 - sta trackn_volume,x + lda #1 + sta trackn_pause,x + ldy trackn_idx,x + inc trackn_idx,x + lda (ns),y + lsr @ + ror reg1 + lsr @ + ror reg1 + lda reg1 + and #$f0 + sta trackn_volume,x oo1x -xtracks03sub1 cpx #TRACKS-1 - bne oo1 - lda v_bspeed +xtracks03sub1 cpx #TRACKS-1 + bne oo1 + lda v_bspeed - sta v_speed - sta v_aspeed - jmp InitOfNewSetInstrumentsOnly + sta v_speed + sta v_aspeed + jmp InitOfNewSetInstrumentsOnly oo2 - cmp #63 - beq oo63 - lda reg1 - and #$c0 - beq oo62_b - asl @ - rol @ - rol @ - sta trackn_pause,x - jmp oo1x + cmp #63 + beq oo63 + lda reg1 + and #$c0 + beq oo62_b + asl @ + rol @ + rol @ + sta trackn_pause,x + jmp oo1x oo62_b - iny - lda (ns),y - sta trackn_pause,x - inc trackn_idx,x - jmp oo1x + iny + lda (ns),y + sta trackn_pause,x + inc trackn_idx,x + jmp oo1x oo63 - lda reg1 - bmi oo63_1X - iny - lda (ns),y - sta v_bspeed - inc trackn_idx,x - jmp oo1i + lda reg1 + bmi oo63_1X + iny + lda (ns),y + sta v_bspeed + inc trackn_idx,x + jmp oo1i oo63_1X - cmp #255 - beq oo63_11 - iny - lda (ns),y - sta trackn_idx,x - jmp oo1i + cmp #255 + beq oo63_11 + iny + lda (ns),y + sta trackn_idx,x + jmp oo1i oo63_11 - jmp GetSongLine -p2xrmtp3 jmp rmt_p3 + jmp GetSongLine +p2xrmtp3 jmp rmt_p3 p2x0 dex - bmi p2xrmtp3 + bmi p2xrmtp3 InitOfNewSetInstrumentsOnly p2x1 ldy trackn_instrx2,x - bmi p2x0 - jsr SetUpInstrumentY2 - jmp p2x0 + bmi p2x0 + jsr SetUpInstrumentY2 + jmp p2x0 rmt_sfx - sta trackn_note,x - lda RMTSFXVOLUME ;* sfx note volume*16 - ;* label for sfx note volume parameter overwriting - sta trackn_volume,x + sta trackn_note,x + lda RMTSFXVOLUME ;* sfx note volume*16 + ;* label for sfx note volume parameter overwriting + sta trackn_volume,x SetUpInstrumentY2 - lda (p_instrstable),y - sta trackn_instrdb,x - sta nt - iny - lda (p_instrstable),y - sta trackn_instrhb,x - sta nt+1 - lda #1 - sta trackn_filter,x - tay - lda (nt),y - sta trackn_tablelop,x - iny - lda (nt),y - sta trackn_instrlen,x - iny - lda (nt),y - sta trackn_instrlop,x - iny - lda (nt),y - sta trackn_tabletypespeed,x - sta trackn_tablespeeda,x - iny - lda (nt),y - sta trackn_audctl,x - iny - lda (nt),y - sta trackn_volumeslidedepth,x - ldy #8 - lda (nt),y - sta trackn_effdelay,x - iny - lda (nt),y - tay - lda vibtabbeg,y - sta trackn_effvibratoa,x - ldy #10 - lda (nt),y - sta trackn_effshift,x - lda #128 - sta trackn_volumeslidevalue,x - sta trackn_instrx2,x - asl @ - sta trackn_instrreachend,x - sta trackn_shiftfrq,x - tay - lda (nt),y - sta trackn_tableend,x - adc #0 - sta trackn_instridx,x - lda #INSTRPAR - sta trackn_tablea,x - tay - lda (nt),y - sta trackn_tablenote,x + lda (p_instrstable),y + sta trackn_instrdb,x + sta nt + iny + lda (p_instrstable),y + sta trackn_instrhb,x + sta nt+1 + lda #1 + sta trackn_filter,x + tay + lda (nt),y + sta trackn_tablelop,x + iny + lda (nt),y + sta trackn_instrlen,x + iny + lda (nt),y + sta trackn_instrlop,x + iny + lda (nt),y + sta trackn_tabletypespeed,x + sta trackn_tablespeeda,x + iny + lda (nt),y + sta trackn_audctl,x + iny + lda (nt),y + sta trackn_volumeslidedepth,x + ldy #8 + lda (nt),y + sta trackn_effdelay,x + iny + lda (nt),y + tay + lda vibtabbeg,y + sta trackn_effvibratoa,x + ldy #10 + lda (nt),y + sta trackn_effshift,x + lda #128 + sta trackn_volumeslidevalue,x + sta trackn_instrx2,x + asl @ + sta trackn_instrreachend,x + sta trackn_shiftfrq,x + tay + lda (nt),y + sta trackn_tableend,x + adc #0 + sta trackn_instridx,x + lda #INSTRPAR + sta trackn_tablea,x + tay + lda (nt),y + sta trackn_tablenote,x xata_rtshere - rts + rts rmt_play rmt_p0 - jsr SetPokey + jsr SetPokey rmt_p1 rmt_p2 - dec v_aspeed - bne rmt_p3 - inc v_abeat - lda v_abeat + dec v_aspeed + bne rmt_p3 + inc v_abeat + lda v_abeat - cmp v_maxtracklen + cmp v_maxtracklen - beq p2o3 - jmp GetTrackLine + beq p2o3 + jmp GetTrackLine p2o3 - jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 -go_ppnext jmp ppnext + jmp GetSongLineTrackLineInitOfNewSetInstrumentsOnlyRmtp3 +go_ppnext jmp ppnext rmt_p3 - lda #>frqtab - sta nr+1 -xtracks05sub1 ldx #TRACKS-1 + lda #>frqtab + sta nr+1 +xtracks05sub1 ldx #TRACKS-1 pp1 - lda trackn_instrhb,x - beq go_ppnext - sta ns+1 - lda trackn_instrdb,x - sta ns - ldy trackn_instridx,x - lda (ns),y - sta reg1 - iny - lda (ns),y - sta reg2 - iny - lda (ns),y - sta reg3 - iny - tya - cmp trackn_instrlen,x - bcc pp2 - beq pp2 - lda #$80 - sta trackn_instrreachend,x + lda trackn_instrhb,x + beq go_ppnext + sta ns+1 + lda trackn_instrdb,x + sta ns + ldy trackn_instridx,x + lda (ns),y + sta reg1 + iny + lda (ns),y + sta reg2 + iny + lda (ns),y + sta reg3 + iny + tya + cmp trackn_instrlen,x + bcc pp2 + beq pp2 + lda #$80 + sta trackn_instrreachend,x pp1b - lda trackn_instrlop,x -pp2 sta trackn_instridx,x - lda reg1 - and #$0f - ora trackn_volume,x - tay - lda volumetab,y - sta tmp - lda reg2 - and #$0e - tay - lda tabbeganddistor,y - sta nr - lda tmp - ora tabbeganddistor+1,y - sta trackn_audc,x + lda trackn_instrlop,x +pp2 sta trackn_instridx,x + lda reg1 + and #$0f + ora trackn_volume,x + tay + lda volumetab,y + sta tmp + lda reg2 + and #$0e + tay + lda tabbeganddistor,y + sta nr + lda tmp + ora tabbeganddistor+1,y + sta trackn_audc,x InstrumentsEffects - lda trackn_effdelay,x - beq ei2 - cmp #1 - bne ei1 - lda trackn_shiftfrq,x - clc - adc trackn_effshift,x - clc - ldy trackn_effvibratoa,x - adc vib0,y - sta trackn_shiftfrq,x - lda vibtabnext,y - sta trackn_effvibratoa,x - jmp ei2 + lda trackn_effdelay,x + beq ei2 + cmp #1 + bne ei1 + lda trackn_shiftfrq,x + clc + adc trackn_effshift,x + clc + ldy trackn_effvibratoa,x + adc vib0,y + sta trackn_shiftfrq,x + lda vibtabnext,y + sta trackn_effvibratoa,x + jmp ei2 ei1 - dec trackn_effdelay,x + dec trackn_effdelay,x ei2 - ldy trackn_tableend,x - cpy #INSTRPAR+1 - bcc ei3 - lda trackn_tablespeeda,x - bpl ei2f + ldy trackn_tableend,x + cpy #INSTRPAR+1 + bcc ei3 + lda trackn_tablespeeda,x + bpl ei2f ei2c - tya - cmp trackn_tablea,x - bne ei2c2 - lda trackn_tablelop,x - sta trackn_tablea,x - bne ei2a + tya + cmp trackn_tablea,x + bne ei2c2 + lda trackn_tablelop,x + sta trackn_tablea,x + bne ei2a ei2c2 - inc trackn_tablea,x + inc trackn_tablea,x ei2a - lda trackn_instrdb,x - sta nt - lda trackn_instrhb,x - sta nt+1 - ldy trackn_tablea,x - lda (nt),y - sta trackn_tablenote,x - lda trackn_tabletypespeed,x + lda trackn_instrdb,x + sta nt + lda trackn_instrhb,x + sta nt+1 + ldy trackn_tablea,x + lda (nt),y + sta trackn_tablenote,x + lda trackn_tabletypespeed,x ei2f - sec - sbc #1 - sta trackn_tablespeeda,x + sec + sbc #1 + sta trackn_tablespeeda,x ei3 - lda trackn_instrreachend,x - bpl ei4 - lda trackn_volume,x - beq ei4 - tay - lda trackn_volumeslidevalue,x - clc - adc trackn_volumeslidedepth,x - sta trackn_volumeslidevalue,x - bcc ei4 - tya - sbc #16 - sta trackn_volume,x + lda trackn_instrreachend,x + bpl ei4 + lda trackn_volume,x + beq ei4 + tay + lda trackn_volumeslidevalue,x + clc + adc trackn_volumeslidedepth,x + sta trackn_volumeslidevalue,x + bcc ei4 + tya + sbc #16 + sta trackn_volume,x ei4 - lda reg2 - sta trackn_command,x - and #$70 - beq cmd0 + lda reg2 + sta trackn_command,x + and #$70 + beq cmd0 cmd1 - lda reg3 - jmp cmd0c + lda reg3 + jmp cmd0c cmd2 cmd3 cmd4 @@ -548,101 +548,101 @@ cmd5 cmd6 cmd7 cmd0 - lda trackn_note,x - clc - adc reg3 + lda trackn_note,x + clc + adc reg3 cmd0a - clc - adc trackn_tablenote,x - cmp #61 - bcc cmd0a1 - lda #0 - sta trackn_audc,x - lda #63 + clc + adc trackn_tablenote,x + cmp #61 + bcc cmd0a1 + lda #0 + sta trackn_audc,x + lda #63 cmd0a1 - tay - lda (nr),y - clc - adc trackn_shiftfrq,x + tay + lda (nr),y + clc + adc trackn_shiftfrq,x cmd0c - sta trackn_audf,x + sta trackn_audf,x pp9 ppnext - dex - bmi rmt_p4 - jmp pp1 + dex + bmi rmt_p4 + jmp pp1 rmt_p4 - lda trackn_audctl+0 - ora trackn_audctl+1 - ora trackn_audctl+2 - ora trackn_audctl+3 - tax + lda trackn_audctl+0 + ora trackn_audctl+1 + ora trackn_audctl+2 + ora trackn_audctl+3 + tax qq1 - stx v_audctl - lda trackn_command+0 - bpl qq2 - lda trackn_audc+0 - and #$0f - beq qq2 - lda trackn_audf+0 - clc - adc trackn_filter+0 - sta trackn_audf+2 - lda #0 - sta trackn_audc+2 + stx v_audctl + lda trackn_command+0 + bpl qq2 + lda trackn_audc+0 + and #$0f + beq qq2 + lda trackn_audf+0 + clc + adc trackn_filter+0 + sta trackn_audf+2 + lda #0 + sta trackn_audc+2 qq1a - txa - ora #4 - tax + txa + ora #4 + tax qq2 - lda trackn_command+1 - bpl qq3 - lda trackn_audc+1 - and #$0f - beq qq3 - lda trackn_audf+1 - clc - adc trackn_filter+1 - sta trackn_audf+3 - lda #0 - sta trackn_audc+3 + lda trackn_command+1 + bpl qq3 + lda trackn_audc+1 + and #$0f + beq qq3 + lda trackn_audf+1 + clc + adc trackn_filter+1 + sta trackn_audf+3 + lda #0 + sta trackn_audc+3 qq2a - txa - ora #2 - tax + txa + ora #2 + tax qq3 - cpx v_audctl - bne qq5 + cpx v_audctl + bne qq5 qq5 - stx v_audctl + stx v_audctl rmt_p5 -; lda v_ainstrspeed +; lda v_ainstrspeed .IF TARGET = 800 - ldx #$10 ; pseudo stereo - bne SetPokey_OffsetX ; pseudo stereo + ldx #$10 ; pseudo stereo + bne SetPokey_OffsetX ; pseudo stereo .ELSE - rts + rts .ENDIF SetPokey - ldx #0 ; POKEY registers offset (for stereo) + ldx #0 ; POKEY registers offset (for stereo) SetPokey_OffsetX - lda trackn_audf+0 - sta AUDF1,x - lda trackn_audc+0 - sta AUDC1,x - lda trackn_audf+1 - sta AUDF2,x - lda trackn_audc+1 - sta AUDC2,x - lda trackn_audf+2 - sta AUDF3,x - lda trackn_audc+2 - sta AUDC3,x - lda trackn_audf+3 - sta AUDF4,x - lda trackn_audc+3 - sta AUDC4,x - lda v_audctl - sta AUDCTL,x - rts + lda trackn_audf+0 + sta AUDF1,x + lda trackn_audc+0 + sta AUDC1,x + lda trackn_audf+1 + sta AUDF2,x + lda trackn_audc+1 + sta AUDC2,x + lda trackn_audf+2 + sta AUDF3,x + lda trackn_audc+2 + sta AUDC3,x + lda trackn_audf+3 + sta AUDF4,x + lda trackn_audc+3 + sta AUDC4,x + lda v_audctl + sta AUDCTL,x + rts RMTPLAYEREND diff --git a/artwork/splash_v2/lzss_player.asm b/artwork/splash_v2/lzss_player.asm index 6a0bdfd..f3c6eff 100644 --- a/artwork/splash_v2/lzss_player.asm +++ b/artwork/splash_v2/lzss_player.asm @@ -6,8 +6,8 @@ song_end buffers .ds 256 * 9 - -POKEY2 = POKEY+$10 ; stereo + +POKEY2 = POKEY+$10 ; stereo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Song Initialization - this runs in the first tick: @@ -15,9 +15,9 @@ POKEY2 = POKEY+$10 ; stereo .proc init_song ; pokeys init - lda #3 ; stereo - sta POKEY+$0f ; stereo - sta POKEY2+$0f ; stereo + lda #3 ; stereo + sta POKEY+$0f ; stereo + sta POKEY2+$0f ; stereo mva #1 bit_data @@ -32,8 +32,8 @@ clear ; Read just init value and store into buffer and POKEY jsr get_byte sta POKEY, x - sta POKEY2,x ; stereo - sta stereo_buff,x ; stereo + sta POKEY2,x ; stereo + sta stereo_buff,x ; stereo sty chn_copy, x cbuf sta buffers + 255 @@ -62,12 +62,12 @@ delay ; Play one frame of the song ; .proc play_frame - ldx #8 ; stereo -@ lda stereo_buff,x ; stereo - sta POKEY2,x ; stereo - dex ;stereo - bpl @- ; stereo - + ldx #8 ; stereo +@ lda stereo_buff,x ; stereo + sta POKEY2,x ; stereo + dex ;stereo + bpl @- ; stereo + lda #>buffers sta bptr+1 @@ -110,7 +110,7 @@ do_copy_byte: store: ldy cur_pos sta POKEY,x ; Store to output and buffer - sta stereo_buff,x ; stereo + sta stereo_buff,x ; stereo sta (bptr), y skip_chn: @@ -148,6 +148,6 @@ skip rts .endp -stereo_buff ; stereo - .ds 9 ; stereo - \ No newline at end of file +stereo_buff ; stereo + .ds 9 ; stereo + \ No newline at end of file diff --git a/artwork/splash_v2/splash.asm b/artwork/splash_v2/splash.asm index 2a0edba..5b4f552 100644 --- a/artwork/splash_v2/splash.asm +++ b/artwork/splash_v2/splash.asm @@ -3,8 +3,8 @@ /* Mode: GED- (bitmap mode) */ /***************************************/ - icl "splash.h" - + icl "splash.h" + ; --- dmsc LZSS player routine on zero page org $80 @@ -17,172 +17,172 @@ chn_bits .ds 1 bit_data .ds 1 ; --- - org $00 + org $00 -fcnt .ds 2 -fadr .ds 2 -fhlp .ds 2 -cloc .ds 1 -regA .ds 1 -regX .ds 1 -regY .ds 1 -byt2 .ds 1 +fcnt .ds 2 +fadr .ds 2 +fhlp .ds 2 +cloc .ds 1 +regA .ds 1 +regX .ds 1 +regY .ds 1 +byt2 .ds 1 -zc .ds ZCOLORS +zc .ds ZCOLORS -* --- BASIC switch OFF - org $2000\ mva #$ff portb\ rts\ ini $2000 +* --- BASIC switch OFF + org $2000\ mva #$ff portb\ rts\ ini $2000 -* --- MAIN PROGRAM - org $2010 - IFT PIC_HEIGHT>=204 -scr ins "output.png.mic", 0, 8160 - :16 .byte 0 - ins "output.png.mic" , +8160 - ELS -scr ins "output.png.mic" - EIF +* --- MAIN PROGRAM + org $2010 + IFT PIC_HEIGHT>=204 +scr ins "output.png.mic", 0, 8160 + :16 .byte 0 + ins "output.png.mic" , +8160 + ELS +scr ins "output.png.mic" + EIF - .ifdef nil_used -nil :8*40 brk - eif + .ifdef nil_used +nil :8*40 brk + eif - .ALIGN $0400 -ant ANTIC_PROGRAM scr,ant + .ALIGN $0400 +ant ANTIC_PROGRAM scr,ant fnt - ift USESPRITES - .ALIGN $0800 - .ds $0300 -pmg SPRITES - eif - + ift USESPRITES + .ALIGN $0800 + .ds $0300 +pmg SPRITES + eif + FontSplash ins '../../artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' mother -; dta d" The Mother of All Games " - dta d" Father Unknown of All Games " - icl "lzss_player.asm" ; player (and data) for splash music +; dta d" The Mother of All Games " + dta d" Father Unknown of All Games " + icl "lzss_player.asm" ; player (and data) for splash music main jsr init_song -* --- init PMG +* --- init PMG - ift USESPRITES - mva >pmg pmbase ;missiles and players data address - mva #$03 pmcntl ;enable players and missiles - eif + ift USESPRITES + mva >pmg pmbase ;missiles and players data address + mva #$03 pmcntl ;enable players and missiles + eif - lda:cmp:req $14 ;wait 1 frame + lda:cmp:req $14 ;wait 1 frame - sei ;stop interrups - mva #$00 nmien ;stop all interrupts - mva #$fe portb ;switch off ROM to get 16k more ram + sei ;stop interrups + mva #$00 nmien ;stop all interrupts + mva #$fe portb ;switch off ROM to get 16k more ram - ZPINIT + ZPINIT //////////////////// // RASTER PROGRAM // //////////////////// -; jmp line239 - jmp raster_program_end +; jmp line239 + jmp raster_program_end -LOOP lda vcount ;synchronization for the first screen (picture) line - cmp #$02 - ;sta colpf0 - ;sta colpm0 - ;sta colbak - bne LOOP +LOOP lda vcount ;synchronization for the first screen (picture) line + cmp #$02 + ;sta colpf0 + ;sta colpm0 + ;sta colbak + bne LOOP - mva #%00111110 dmactl ;set new screen width - mva ant dlptr+1 + mva #%00111110 dmactl ;set new screen width + mva ant dlptr+1 icl "output.png.rp.ini" - + ;--- 16 lines down ---- !!! - :16 sta wsync - - ; wait 13 cycles !!! - :4 nop - inc byt2 - + :16 sta wsync + + ; wait 13 cycles !!! + :4 nop + inc byt2 + ;--- wait 18 cycles -; jsr _rts -; inc byt3 +; jsr _rts +; inc byt3 ;--- set global offset (23 cycles) - jsr _rts - cmp byt3\ pha:pla + jsr _rts + cmp byt3\ pha:pla ;--- empty line - jsr wait54cycle - inc byt2 + jsr wait54cycle + inc byt2 icl "output.png.rp" raster_program_end - lda >FontSplash - sta chbase -c0 lda #$00 - sta colbak -c1 lda #$00 - sta colpf0 -c2 lda #$02 - sta colpf1 -c3 lda #$08 - sta colpf2 -c4 lda #$00 - sta colpf3 -s0 lda #$03 - sta sizep0 - sta sizep1 - sta sizep2 - sta sizep3 - mva #$ff sizem - sta grafm - mva #$20 hposm0 - mva #$28 hposm1 - mva #$d0 hposm2 - mva #$d8 hposm3 - mva #$02 pmcntl - lda #$14 - sta gtictl + lda >FontSplash + sta chbase +c0 lda #$00 + sta colbak +c1 lda #$00 + sta colpf0 +c2 lda #$02 + sta colpf1 +c3 lda #$08 + sta colpf2 +c4 lda #$00 + sta colpf3 +s0 lda #$03 + sta sizep0 + sta sizep1 + sta sizep2 + sta sizep3 + mva #$ff sizem + sta grafm + mva #$20 hposm0 + mva #$28 hposm1 + mva #$d0 hposm2 + mva #$d8 hposm3 + mva #$02 pmcntl + lda #$14 + sta gtictl //-------------------- -// EXIT +// EXIT //-------------------- - lda trig0 ; FIRE #0 - beq stop + lda trig0 ; FIRE #0 + beq stop - lda trig1 ; FIRE #1 - beq stop + lda trig1 ; FIRE #1 + beq stop - lda consol ; START - and #1 - beq stop + lda consol ; START + and #1 + beq stop - lda skctl ; ANY KEY - and #$04 - bne skp + lda skctl ; ANY KEY + and #$04 + bne skp -stop mva #$00 pmcntl ;PMG disabled - tax - sta:rne hposp0,x+ +stop mva #$00 pmcntl ;PMG disabled + tax + sta:rne hposp0,x+ - ; silent - lda #0 + ; silent + lda #0 ldx #8 @ sta POKEY,x - sta POKEY2,x ; stereo + sta POKEY2,x ; stereo dex bpl @- @@ -192,90 +192,90 @@ stop mva #$00 pmcntl ;PMG disabled sta $022F ;dmactls - mva #$ff portb ;ROM switch on - mva #$40 nmien ;only NMI interrupts, DLI disabled - cli ;IRQ enabled + mva #$ff portb ;ROM switch on + mva #$40 nmien ;only NMI interrupts, DLI disabled + cli ;IRQ enabled - rts ;return to ... DOS + rts ;return to ... DOS skp //-------------------- jsr play_frame - jmp LOOP + jmp LOOP ;--- wait54cycle - :2 inc byt2 + :2 inc byt2 wait44cycle - inc byt3 - nop + inc byt3 + nop wait36cycle - inc byt3 - jsr _rts + inc byt3 + jsr _rts wait18cycle - inc byt3 -_rts rts + inc byt3 +_rts rts -byt3 brk +byt3 brk ;--- -.MACRO ANTIC_PROGRAM - dta $70,$70 - :+8 dta $4e,a(:1+$0000+#*40) - :+8 dta $4e,a(:1+$0140+#*40) - :+8 dta $4e,a(:1+$0280+#*40) - :+8 dta $4e,a(:1+$03C0+#*40) - :+8 dta $4e,a(:1+$0500+#*40) - :+8 dta $4e,a(:1+$0640+#*40) - :+8 dta $4e,a(:1+$0780+#*40) - :+8 dta $4e,a(:1+$08C0+#*40) - :+8 dta $4e,a(:1+$0A00+#*40) - :+8 dta $4e,a(:1+$0B40+#*40) - :+8 dta $4e,a(:1+$0C80+#*40) - :+8 dta $4e,a(:1+$0DC0+#*40) - :+8 dta $4e,a(:1+$0F00+#*40) - :+8 dta $4e,a(:1+$1040+#*40) - :+8 dta $4e,a(:1+$1180+#*40) - :+8 dta $4e,a(:1+$12C0+#*40) - :+8 dta $4e,a(:1+$1400+#*40) - :+8 dta $4e,a(:1+$1540+#*40) - :+8 dta $4e,a(:1+$1680+#*40) - :+8 dta $4e,a(:1+$17C0+#*40) - :+8 dta $4e,a(:1+$1900+#*40) - :+8 dta $4e,a(:1+$1A40+#*40) - :+8 dta $4e,a(:1+$1B80+#*40) - :+8 dta $4e,a(:1+$1CC0+#*40) - :+8 dta $4e,a(:1+$1E00+#*40) -; :+4 dta $4e,a(:1+$1F40+#*40) -; :+4 dta $4e,a(:1+$1FF0+#*40) -; :+8 dta $4e,a(:1+$2090+#*40) -; :+8 dta $4e,a(:1+$21D0+#*40) -; :+8 dta $4e,a(:1+$2310+#*40) -; :+8 dta $4e,a(:1+$2450+#*40) - dta $00 - dta $42,a(mother) - dta $41,a(:2) +.MACRO ANTIC_PROGRAM + dta $70,$70 + :+8 dta $4e,a(:1+$0000+#*40) + :+8 dta $4e,a(:1+$0140+#*40) + :+8 dta $4e,a(:1+$0280+#*40) + :+8 dta $4e,a(:1+$03C0+#*40) + :+8 dta $4e,a(:1+$0500+#*40) + :+8 dta $4e,a(:1+$0640+#*40) + :+8 dta $4e,a(:1+$0780+#*40) + :+8 dta $4e,a(:1+$08C0+#*40) + :+8 dta $4e,a(:1+$0A00+#*40) + :+8 dta $4e,a(:1+$0B40+#*40) + :+8 dta $4e,a(:1+$0C80+#*40) + :+8 dta $4e,a(:1+$0DC0+#*40) + :+8 dta $4e,a(:1+$0F00+#*40) + :+8 dta $4e,a(:1+$1040+#*40) + :+8 dta $4e,a(:1+$1180+#*40) + :+8 dta $4e,a(:1+$12C0+#*40) + :+8 dta $4e,a(:1+$1400+#*40) + :+8 dta $4e,a(:1+$1540+#*40) + :+8 dta $4e,a(:1+$1680+#*40) + :+8 dta $4e,a(:1+$17C0+#*40) + :+8 dta $4e,a(:1+$1900+#*40) + :+8 dta $4e,a(:1+$1A40+#*40) + :+8 dta $4e,a(:1+$1B80+#*40) + :+8 dta $4e,a(:1+$1CC0+#*40) + :+8 dta $4e,a(:1+$1E00+#*40) +; :+4 dta $4e,a(:1+$1F40+#*40) +; :+4 dta $4e,a(:1+$1FF0+#*40) +; :+8 dta $4e,a(:1+$2090+#*40) +; :+8 dta $4e,a(:1+$21D0+#*40) +; :+8 dta $4e,a(:1+$2310+#*40) +; :+8 dta $4e,a(:1+$2450+#*40) + dta $00 + dta $42,a(mother) + dta $41,a(:2) .ENDM CL -.MACRO ZPINIT +.MACRO ZPINIT .ENDM -ZCOLORS = 0 +ZCOLORS = 0 ;--- - ini main + ini main ;--- - opt l- + opt l- -.MACRO SPRITES - icl "output.png.pmg" +.MACRO SPRITES + icl "output.png.pmg" .ENDM USESPRITES = 1 diff --git a/constants.asm b/constants.asm index 4ec1a8f..f1b7ca4 100644 --- a/constants.asm +++ b/constants.asm @@ -32,18 +32,18 @@ LevelNameBeginH .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) ;-------------- TanksWeaponsTableL - .REPT MaxPlayers, #+1 - .by TanksWeapon:1 - .ENDR + .REPT MaxPlayers, #+1 + .by >TanksWeapon:1 + .ENDR ;-------------- XtankOffsetGO_L - .by 6,56,106,156,206,0 + .by 6,56,106,156,206,0 XtankOffsetGO_H - .by 0,0,0,0,0,1 + .by 0,0,0,0,0,1 ;-----4x4 texts----- LineTop dta d"(%%%%%%%%%%%%)" @@ -59,7 +59,12 @@ LineGameOver seppukuText dta d"# SEPPUKU! #" areYouSureText - dta d"# SURE? Y/N #" + .IF target != 5200 + dta d"# SURE? Y/N #" + .ELSE + dta d"#END? Y-1/N-0#" + .ENDIF + lineClear dta d" " @@ -68,17 +73,17 @@ TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order ;----------- GradientAddrL - .by dliColorsFore, >dliColorsFore, >dliColorsFore2 -dliColorsFore2 ; colors for NTSC - .by $0a ; one mountains color - .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 -dliColorsFore2PAL ; colors for PAL - .by $0a ; one mountains color - .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 + .by >dliColorsFore, >dliColorsFore, >dliColorsFore2 +dliColorsFore2 ; colors for NTSC + .by $0a ; one mountains color + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 +dliColorsFore2PAL ; colors for PAL + .by $0a ; one mountains color + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 ;----------- pmtableL ; addressess of the P/M memory for 6 tanks @@ -222,113 +227,114 @@ SlideLeftTableLen = *-SlideLeftTable TanksNamesDefault dta d"1st.Tank" dta d"2nd.Tank" -.REPT MaxPlayers-2, #+3 - dta d":1rd.Tank" + dta d"3rd.Tank" +.REPT MaxPlayers-3, #+4 + dta d":1th.Tank" .ENDR ;------------------------------------------------- -TankShapesTable .BYTE char_tank1___________ - .BYTE char_tank2___________ - .BYTE char_tank3___________ - .BYTE char_tank4___________ -;------------------------------------------------- +TankShapesTable .BYTE char_tank1 + .BYTE char_tank2 + .BYTE char_tank3 + .BYTE char_tank4 +;------------------------------------------------- WeaponPriceH ; weapons prices (tables with prices of weapons) - .by >price_Baby_Missile___ - .by >price_Missile________ - .by >price_Baby_Nuke______ - .by >price_Nuke___________ - .by >price_LeapFrog_______ - .by >price_Funky_Bomb_____ - .by >price_MIRV___________ - .by >price_Death_s_Head___ - .by >price_Napalm_________ - .by >price_Hot_Napalm_____ - .by >price_Tracer_________ - .by >price_Smoke_Tracer___ - .by >price_Baby_Roller____ - .by >price_Roller_________ - .by >price_Heavy_Roller___ - .by >price_Riot_Charge____ - .by >price_Riot_Blast_____ - .by >price_Riot_Bomb______ + .by >price_Baby_Missile + .by >price_Missile + .by >price_Baby_Nuke + .by >price_Nuke + .by >price_LeapFrog + .by >price_Funky_Bomb + .by >price_MIRV + .by >price_Death_s_Head + .by >price_Napalm + .by >price_Hot_Napalm + .by >price_Tracer + .by >price_Smoke_Tracer + .by >price_Baby_Roller + .by >price_Roller + .by >price_Heavy_Roller + .by >price_Riot_Charge + .by >price_Riot_Blast + .by >price_Riot_Bomb .by >price_Heavy_Riot_Bomb - .by >price_Baby_Digger____ - .by >price_Digger_________ - .by >price_Heavy_Digger___ - .by >price_Baby_Sandhog___ - .by >price_Sandhog________ - .by >price_Heavy_Sandhog__ - .by >price_Dirt_Clod______ - .by >price_Dirt_Ball______ - .by >price_Ton_of_Dirt____ - .by >price_Liquid_Dirt____ - .by >price_Dirt_Charge____ - .by >price_Buy_me_________ - .by >price_Laser__________ - .by >price_White_Flag_____ - .by >price_Battery________ - .by >price_Hovercraft_____ - .by >price_Parachute______ + .by >price_Baby_Digger + .by >price_Digger + .by >price_Heavy_Digger + .by >price_Baby_Sandhog + .by >price_Sandhog + .by >price_Heavy_Sandhog + .by >price_Dirt_Clod + .by >price_Dirt_Ball + .by >price_Ton_of_Dirt + .by >price_Liquid_Dirt + .by >price_Dirt_Charge + .by >price_Buy_me + .by >price_Laser + .by >price_White_Flag + .by >price_Battery + .by >price_Hovercraft + .by >price_Parachute .by >price_StrongParachute - .by >price_Mag_Deflector__ - .by >price_Shield_________ - .by >price_Heavy_Shield___ - .by >price_Force_Shield___ - .by >price_Bouncy_Castle__ - .by >price_Long_Barrel____ + .by >price_Mag_Deflector + .by >price_Shield + .by >price_Heavy_Shield + .by >price_Force_Shield + .by >price_Bouncy_Castle + .by >price_Long_Barrel .by >price_Nuclear_Winter_ - .by >price_Lazy_Boy_______ - .by >price_Lazy_Darwin____ - .by >price_Auto_Defense___ - .by >price_Spy_Hard_______ + .by >price_Lazy_Boy + .by >price_Lazy_Darwin + .by >price_Auto_Defense + .by >price_Spy_Hard WeaponPriceL - .by WeaponFont chbas @@ -844,7 +844,7 @@ SetunPlots sta oldplotH,x lda #0 sta oldply,x - lda #$ff + lda #$ff sta oldora,x dex bpl SetunPlots @@ -854,7 +854,7 @@ SetunPlots sta pmbase lda #$03 ; P/M on sta GRACTL - jsr SetPMWidth + jsr SetPMWidth lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 sta GPRIOR jsr PMoutofScreen @@ -878,13 +878,13 @@ MakeTanksVisible ; for all tanks ;-------------------------------------------------- ldx #maxPlayers-1 -@ lda #StandardBarrel ; standard barrel length - sta BarrelLength,x - lda #$00 ; deactivate Auto Defense - sta AutoDefenseFlag,x - dex - bpl @- - rts +@ lda #StandardBarrel ; standard barrel length + sta BarrelLength,x + lda #$00 ; deactivate Auto Defense + sta AutoDefenseFlag,x + dex + bpl @- + rts .endp ;---------------------------------------------- /* .proc RandomizeSequence0 @@ -973,7 +973,7 @@ UsageLoop lda RANDOM and #%00000011 ;(0..1023) sta temp2+1 - + cpw RandBoundaryLow temp2 seq:bcs RandomizeForce @@ -1007,45 +1007,45 @@ LimitForce ;---------------------------------------------- .proc Table2Force ;---------------------------------------------- - lda ForceTableL,x - sta Force - lda ForceTableH,x - sta Force+1 - rts + lda ForceTableL,x + sta Force + lda ForceTableH,x + sta Force+1 + rts .endp ;---------------------------------------------- .proc MoveBarrelToNewPosition ;---------------------------------------------- - mva #1 Erase - jsr DrawTankNr.BarrelChange - mva #0 Erase + mva #1 Erase + jsr DrawTankNr.BarrelChange + mva #0 Erase MoveBarrel mva #sfx_set_power_2 sfx_effect - jsr DrawTankNr - jsr DisplayStatus.displayAngle - ; - jsr CheckExitKeys + jsr DrawTankNr + jsr DisplayStatus.displayAngle + ; + jsr CheckExitKeys spl:rts ;---Exit key pressed-quit game--- - ldx TankNr - ; - mva #1 Erase - jsr WaitOneFrame - jsr DrawTankNr.BarrelChange - mva #0 Erase - lda NewAngle - cmp AngleTable,x - beq BarrelPositionIsFine - bcc rotateLeft -rotateRight ; older is lower - inc angleTable,x - jmp MoveBarrel -rotateLeft ; older is bigger - dec angleTable,x - jmp MoveBarrel + ldx TankNr + ; + mva #1 Erase + jsr WaitOneFrame + jsr DrawTankNr.BarrelChange + mva #0 Erase + lda NewAngle + cmp AngleTable,x + beq BarrelPositionIsFine + bcc rotateLeft +rotateRight ; older is lower + inc angleTable,x + jmp MoveBarrel +rotateLeft ; older is bigger + dec angleTable,x + jmp MoveBarrel BarrelPositionIsFine - jsr DrawTankNr - rts - + jsr DrawTankNr + rts + .endp ;---------------------------------------------- @@ -1091,39 +1091,39 @@ SequenceStart Bubble ldx #0 ;i=x stx temp2 ; sortflag=temp2 - inx ; because NumberOfPlayers start from 1 (not 0) + inx ; because NumberOfPlayers start from 1 (not 0) BubbleBobble - ldy TankSequence-1,x ; x count from 1 to NumberOfPlayers (we need cout from 0 to NumberOfPlayers-1) - lda ResultsTable,y - ldy TankSequence,x - cmp ResultsTable,y + ldy TankSequence-1,x ; x count from 1 to NumberOfPlayers (we need cout from 0 to NumberOfPlayers-1) + lda ResultsTable,y + ldy TankSequence,x + cmp ResultsTable,y bcc nextishigher - bne swapvalues + bne swapvalues nextisequal - ; if results are equal, check Direct Hits - ldy TankSequence-1,x - lda DirectHits,y - ldy TankSequence,x - cmp DirectHits,y + ; if results are equal, check Direct Hits + ldy TankSequence-1,x + lda DirectHits,y + ldy TankSequence,x + cmp DirectHits,y bcc nextishigher - bne swapvalues + bne swapvalues nextisequal2 - ; if results are equal, check money (H) - ldy TankSequence-1,x - lda EarnedMoneyH,y - ldy TankSequence,x - cmp EarnedMoneyH,y + ; if results are equal, check money (H) + ldy TankSequence-1,x + lda EarnedMoneyH,y + ldy TankSequence,x + cmp EarnedMoneyH,y bcc nextishigher - bne swapvalues + bne swapvalues nextisequal2b - ; if results are equal, check money (L) - ldy TankSequence-1,x - lda EarnedMoneyL,y - ldy TankSequence,x - cmp EarnedMoneyL,y - ; - beq nextishigher ; this is to block hangs when 2 equal values meet + ; if results are equal, check money (L) + ldy TankSequence-1,x + lda EarnedMoneyL,y + ldy TankSequence,x + cmp EarnedMoneyL,y + ; + beq nextishigher ; this is to block hangs when 2 equal values meet bcc nextishigher ;here we must swap values ;because next is smaller than previous @@ -1149,20 +1149,20 @@ nextishigher ;-------------------------------------------------- .proc SetWallsType ;-------------------------------------------------- - mva #0 WallsType - lda OptionsTable+8 - cmp #4 - beq SetRandomWalls - lsr - ror WallsType - lsr - ror WallsType - rts + mva #0 WallsType + lda OptionsTable+8 + cmp #4 + beq SetRandomWalls + lsr + ror WallsType + lsr + ror WallsType + rts SetRandomWalls - lda random - and #%11000000 - sta WallsType - rts + lda random + and #%11000000 + sta WallsType + rts .endp ; -------------------------------------- ; Sets the appropriate variables based on the options table @@ -1321,7 +1321,7 @@ ResultOfTheNextPlayer ; overwrite the second digit of the points (max 255) ;it means ":" mva #26 ResultLineBuffer+9 - + ldx #0 lda TankNr asl @@ -1337,7 +1337,7 @@ TankNameCopyLoop iny cpx #8 ; end of name bne TankNameCopyLoop - ; last letter of tank name overwrites first digit of the points (max 255) + ; last letter of tank name overwrites first digit of the points (max 255) ;just after the digits diff --git a/grafproc.asm b/grafproc.asm index 0c310d1..f1351bc 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone @@ -142,10 +142,10 @@ LineParametersReady ora DX+1 ora DY ora DY+1 - bne NotOnePoint - ; length=0 - sta LineLength - sta LineLength+1 + bne NotOnePoint + ; length=0 + sta LineLength + sta LineLength+1 jmp EndOfDraw NotOnePoint @@ -226,8 +226,8 @@ PutPixelinDraw bit drawFunction bpl @+ inw LineLength - bit Vdebug - bmi MeasureVisualisation + bit Vdebug + bmi MeasureVisualisation jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff @ bvc @+ @@ -239,7 +239,7 @@ yestrace jsr plot notrace ;aftertrace - ;key + ;key lda HitFlag bne StopHitChecking @@ -252,13 +252,13 @@ CheckCollisionDraw lda HitFlag bne StopHitChecking - clc - lda xdraw - adc #mountaintable - sta temp+1 + clc + lda xdraw + adc #mountaintable + sta temp+1 ldy #0 lda ydraw @@ -266,11 +266,11 @@ CheckCollisionDraw bcc StopHitChecking mwa xdraw XHit - lda (temp),y - sec - sbc #1 - sta YHit - sty YHit+1 + lda (temp),y + sec + sbc #1 + sta YHit + sty YHit+1 mva #$ff HitFlag StopHitChecking jmp ContinueDraw @@ -398,19 +398,19 @@ endcircleloop adc YC sta ydraw sta tempcir - lda ycircle+1 - adc #$00 - sta ydraw+1 - sta tempcir+1 + lda ycircle+1 + adc #$00 + sta ydraw+1 + sta tempcir+1 jsr plot sec lda ycircle sbc YC sta ydraw - lda ycircle+1 - sbc #$00 - sta ydraw+1 + lda ycircle+1 + sbc #$00 + sta ydraw+1 jsr plot sec @@ -424,8 +424,8 @@ endcircleloop lda tempcir sta ydraw - lda tempcir+1 - sta ydraw+1 + lda tempcir+1 + sta ydraw+1 jsr plot ;--- clc @@ -440,19 +440,19 @@ endcircleloop adc xC sta ydraw sta tempcir - lda ycircle+1 - adc #$00 - sta ydraw+1 - sta tempcir+1 + lda ycircle+1 + adc #$00 + sta ydraw+1 + sta tempcir+1 jsr plot sec lda ycircle sbc xC sta ydraw - lda ycircle+1 - sbc #$00 - sta ydraw+1 + lda ycircle+1 + sbc #$00 + sta ydraw+1 jsr plot sec @@ -466,8 +466,8 @@ endcircleloop lda tempcir sta ydraw - lda tempcir+1 - sta ydraw+1 + lda tempcir+1 + sta ydraw+1 jsr plot RTS @@ -495,7 +495,7 @@ endcircleloop mwa #0 temptankX - mva #0 temptankNr ;player number + sta temptankNr ;player number StillRandomize ldx NumberOfPlayers lda random @@ -542,15 +542,15 @@ NotHigherByte02 sec lda xtankstableL,x sbc #$0f - ; and clear lowest bit to be sure that the X coordinate is even - ; (this is to have P/M background look nice) - ; "AND" does not change "Carry" bit. - ; x correction for P/M - ; -- - .IF XCORRECTION_FOR_PM = 1 - and #$fe - .ENDIF - ; -- + ; and clear lowest bit to be sure that the X coordinate is even + ; (this is to have P/M background look nice) + ; "AND" does not change "Carry" bit. + ; x correction for P/M + ; -- + .IF XCORRECTION_FOR_PM = 1 + and #$fe + .ENDIF + ; -- sta xtankstableL,x bcs NotHigherByte01 dec xtankstableH,x @@ -588,8 +588,8 @@ UnequalTanks ;------------------------------------------------- .proc ClearTanks - jsr PMoutofScreen - mva #1 Erase ; erase tanks flag + jsr PMoutofScreen + mva #1 Erase ; erase tanks flag .endp ;-- .proc drawtanks @@ -609,15 +609,15 @@ DrawNextTank pla sta TankNr - mva #0 Erase ; no erase tanks flag + mva #0 Erase ; no erase tanks flag rts .endp ;--------- ClearTankNr - mva #1 Erase - bne DrawTankNr + mva #1 Erase + bne DrawTankNr PutTankNr - mva #0 Erase + mva #0 Erase .proc DrawTankNr ldx tankNr ; let's check the energy @@ -625,35 +625,35 @@ PutTankNr bne SkipHidingPM ; if energy=0 then no tank ; hide P/M - lda TanksPMOrder,x - tax + lda TanksPMOrder,x + tax lda #0 cpx #$4 ; 5th tank is defferent bne No5thTankHide - sta hposp0+4 - sta hposp0+5 - beq @+ + sta hposp0+4 + sta hposp0+5 + beq @+ No5thTankHide - cpx #$5 ; 6th tank is defferent - bne No6thTankHide - sta hposp0+6 - sta hposp0+7 - beq @+ + cpx #$5 ; 6th tank is defferent + bne No6thTankHide + sta hposp0+6 + sta hposp0+7 + beq @+ No6thTankHide sta hposp0,x @ - ldx TankNr + ldx TankNr jmp DoNotDrawTankNr SkipHidingPM - lda TankShape,x - tax - ldy TankShapesTable,x - ldx TankNr + lda TankShape,x + tax + ldy TankShapesTable,x + ldx TankNr lda AngleTable,x - cmp #91 ; left or right tank shape - bcs LeftTank - :2 iny ; right tank + cmp #91 ; left or right tank shape + bcs LeftTank + :2 iny ; right tank LeftTank sty CharCode DrawTankNrX @@ -661,13 +661,13 @@ DrawTankNrX jsr SetupXYdraw jsr TypeChar - lda Erase - jne noTankNoPM + lda Erase + jne noTankNoPM ; now P/M graphics on the screen (only for 5 tanks) ; horizontal position ldx TankNr - lda TanksPMOrder,x - tax + lda TanksPMOrder,x + tax mwa xdraw xbyte rorw xbyte ; divide by 2 (carry does not matter) lda xbyte @@ -677,17 +677,17 @@ DrawTankNrX bne No5thTank clc adc #$04 ; missile offset offset - sta hposp0+4 - sta hposp0+5 - bne NoMissile + sta hposp0+4 + sta hposp0+5 + bne NoMissile No5thTank - cpx #$5 ; 6th tank are joined missiles and offset is defferent - bne Tanks1to4 + cpx #$5 ; 6th tank are joined missiles and offset is defferent + bne Tanks1to4 clc adc #$04 ; missile offset offset - sta hposp0+6 - sta hposp0+7 - bne NoMissile + sta hposp0+6 + sta hposp0+7 + bne NoMissile Tanks1to4 sta hposp0,x @@ -707,81 +707,81 @@ NoMissile cpx #$5 bcs PMForTank6 ; clear sprite and put 3 lines on the tank at the same time - ldx #3 ; three lines of PM + ldx #3 ; three lines of PM ClearPM cpy temp bne ZeroesToGo -@ lda (xbyte),y - and #%11110000 +@ lda (xbyte),y + and #%11110000 ora #%00001111 ; (2 bits set) we set on two pixels in three lines sta (xbyte),y dey - dex - bne @- + dex + bne @- ZeroesToGo lda (xbyte),y - and #%11110000 + and #%11110000 sta (xbyte),y dey bne ClearPM - beq NoPlayerMissile + beq NoPlayerMissile PMForTank6 ; clear sprite and put 3 lines on the tank at the same time - ldx #3 ; three lines of PM + ldx #3 ; three lines of PM ClearPM6 cpy temp bne ZeroesToGo6 -@ lda (xbyte),y - and #%00001111 +@ lda (xbyte),y + and #%00001111 ora #%11110000 ; (2 bits set) we set on two pixels in three lines sta (xbyte),y dey - dex - bne @- + dex + bne @- ZeroesToGo6 lda (xbyte),y - and #%00001111 + and #%00001111 sta (xbyte),y dey bne ClearPM6 NoPlayerMissile noTankNoPM - ldy #$01 - lda Erase - beq @+ - dey -@ sty color - ; draw defensive weapons like shield ( tank number in X ) - ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char + ldy #$01 + lda Erase + beq @+ + dey +@ sty color + ; draw defensive weapons like shield ( tank number in X ) + ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ldx TankNr - lda ActiveDefenceWeapon,x - cmp #ind_Shield_________ ; one shot shield - beq DrawTankSh - cmp #ind_Force_Shield___ ; shield with energy and parachute - beq DrawTankShieldBold - cmp #ind_Heavy_Shield___ ; shield with energy - beq DrawTankShieldBold - cmp #ind_Bouncy_Castle__ ; Auto Defence - beq DrawTankShieldWihHorns - cmp #ind_Mag_Deflector__ ; Mag Deflector - beq DrawTankShieldWihHorns - cmp #ind_White_Flag_____ ; White Flag - beq DrawTankFlag - bne NoShieldDraw + lda ActiveDefenceWeapon,x + cmp #ind_Shield ; one shot shield + beq DrawTankSh + cmp #ind_Force_Shield ; shield with energy and parachute + beq DrawTankShieldBold + cmp #ind_Heavy_Shield ; shield with energy + beq DrawTankShieldBold + cmp #ind_Bouncy_Castle ; Auto Defence + beq DrawTankShieldWihHorns + cmp #ind_Mag_Deflector ; Mag Deflector + beq DrawTankShieldWihHorns + cmp #ind_White_Flag ; White Flag + beq DrawTankFlag + bne NoShieldDraw DrawTankSh - jsr DrawTankShield - jmp NoShieldDraw + jsr DrawTankShield + jmp NoShieldDraw DrawTankShieldWihHorns - jsr DrawTankShield - jsr DrawTankShieldHorns - jmp NoShieldDraw + jsr DrawTankShield + jsr DrawTankShieldHorns + jmp NoShieldDraw DrawTankShieldBold - jsr DrawTankShield - jsr DrawTankShieldBoldLine - jmp NoShieldDraw + jsr DrawTankShield + jsr DrawTankShieldBoldLine + jmp NoShieldDraw DrawTankFlag - lda #char_flag____________ ; flag symbol + lda #char_flag ; flag symbol sta CharCode lda Ytankstable,x sec @@ -790,41 +790,41 @@ DrawTankFlag jsr TypeChar NoShieldDraw BarrelChange - ldy #$01 - lda Erase - beq @+ - dey -@ sty color - jsr DrawBarrel - ldx TankNr + ldy #$01 + lda Erase + beq @+ + dey +@ sty color + jsr DrawBarrel + ldx TankNr DoNotDrawTankNr - rts + rts .endp ; ------------------------------------- .proc FlashTank ; ------------------------------------- ; number of blinking tank in TankNr - mva #18 fs ; temp, how many times flash the tank + mva #18 fs ; temp, how many times flash the tank tankflash_loop lda CONSOL ; turbo mode - and #%00000001 ; START KEY + and #%00000001 ; START KEY sne:mva #1 fs ; finish it mva #1 Erase - ldx TankNr - jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! - ;PAUSE 2 + ldx TankNr + jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! + ;PAUSE 2 ldy #1 jsr PauseYFrames mva #0 Erase - ldx TankNr + ldx TankNr jsr DrawTankNr.SkipHidingPM ;PAUSE 2 ldy #1 jsr PauseYFrames dec fs jne tankflash_loop - rts + rts .endp ;-------------------------------------------------- @@ -836,45 +836,45 @@ tankflash_loop ; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- - sbw xdraw #$03 ; 3 pixels to left - ; draw left vertical line of shield ( | ) - mva #7 temp ; strange !!! + sbw xdraw #$03 ; 3 pixels to left + ; draw left vertical line of shield ( | ) + mva #7 temp ; strange !!! @ - jsr plot -.nowarn dew ydraw - dec temp - bne @- - ; draw left oblique line of shield ( / ) - mva #3 temp + jsr plot +.nowarn dew ydraw + dec temp + bne @- + ; draw left oblique line of shield ( / ) + mva #3 temp @ - jsr plot -.nowarn dew ydraw - inw xdraw - dec temp - bne @- - ; draw top horizontal line of shield ( _ ) - mva #7 temp + jsr plot +.nowarn dew ydraw + inw xdraw + dec temp + bne @- + ; draw top horizontal line of shield ( _ ) + mva #7 temp @ - jsr plot - inw xdraw - dec temp - bne @- - ; draw right oblique line of shield ( \ ) - mva #3 temp + jsr plot + inw xdraw + dec temp + bne @- + ; draw right oblique line of shield ( \ ) + mva #3 temp @ - jsr plot - inw ydraw - inw xdraw - dec temp - bne @- - ; draw right vertical line of shield ( | ) - mva #7 temp + jsr plot + inw ydraw + inw xdraw + dec temp + bne @- + ; draw right vertical line of shield ( | ) + mva #7 temp @ - jsr plot - inw ydraw - dec temp - bne @- - rts + jsr plot + inw ydraw + dec temp + bne @- + rts .endp ;-------------------------------------------------- .proc DrawTankShieldHorns @@ -882,18 +882,18 @@ tankflash_loop ; this proc draws a little "horns" on shield. ; Symbol of defensive but aggressive :) weapon ;-------------------------------------------------- -.nowarn dew xdraw ; 1 pixel left - sbw ydraw #$0a ; 10 pixels up - jsr plot -.nowarn dew ydraw - inw xdraw - jsr plot - sbw xdraw #$0d ; 13 pixels left - jsr plot - inw xdraw - inw ydraw - jsr plot - rts +.nowarn dew xdraw ; 1 pixel left + sbw ydraw #$0a ; 10 pixels up + jsr plot +.nowarn dew ydraw + inw xdraw + jsr plot + sbw xdraw #$0d ; 13 pixels left + jsr plot + inw xdraw + inw ydraw + jsr plot + rts .endp ;-------------------------------------------------- .proc DrawTankShieldBoldLine @@ -901,34 +901,34 @@ tankflash_loop ; this proc draws bold top on shield. ; Symbol of ablative shield ? :) ;-------------------------------------------------- - sbw xdraw #$04 ; 5 pixels left - sbw ydraw #$0b ; 11 pixels up - ; draw additional top horizontal line of shield ( _ ) - mva #6 temp + sbw xdraw #$04 ; 5 pixels left + sbw ydraw #$0b ; 11 pixels up + ; draw additional top horizontal line of shield ( _ ) + mva #6 temp @ - jsr plot -.nowarn dew xdraw - dec temp - bne @- - rts + jsr plot +.nowarn dew xdraw + dec temp + bne @- + rts .endp ;-------------------------------------------------- .proc DrawTankParachute ;Tank number in X ;-------------------------------------------------- - lda #char_parachute_______ ; parachute symbol + lda #char_parachute ; parachute symbol sta CharCode lda Ytankstable,x - cmp #16 - bcc ToHighToParachute + cmp #16 + bcc ToHighToParachute ;sec sbc #8 sta ydraw jsr SetupXYdraw.X jsr TypeChar ToHighToParachute - ldx TankNr - rts + ldx TankNr + rts .endp ;-------------------------------------------------- @@ -937,47 +937,47 @@ ToHighToParachute ; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- - clc - lda Ytankstable,x - adc #2 ; 1 pixel down - sta ydraw - mva #0 ydraw+1 - - clc - lda XtanksTableL,x - adc #2 ; 2 pixels to right - sta xdraw - lda XtanksTableH,x - adc #0 - sta xdraw+1 + clc + lda Ytankstable,x + adc #2 ; 1 pixel down + sta ydraw + mva #0 ydraw+1 + + clc + lda XtanksTableL,x + adc #2 ; 2 pixels to right + sta xdraw + lda XtanksTableH,x + adc #0 + sta xdraw+1 - ; draw first horizontal line - mva #5 temp + ; draw first horizontal line + mva #5 temp @ - jsr plot - inw xdraw - dec temp - bne @- - - sbw xdraw #2 ; 2 pixels left - inw ydraw ; 1 pixel down - - ; draw second horizontal line - mva #3 temp + jsr plot + inw xdraw + dec temp + bne @- + + sbw xdraw #2 ; 2 pixels left + inw ydraw ; 1 pixel down + + ; draw second horizontal line + mva #3 temp @ - jsr plot -.nowarn dew xdraw - dec temp - bne @- + jsr plot +.nowarn dew xdraw + dec temp + bne @- - adw xdraw #2 ; 2 pixels right - inw ydraw ; 1 pixel down + adw xdraw #2 ; 2 pixels right + inw ydraw ; 1 pixel down - ; and last pixel - jsr plot + ; and last pixel + jsr plot - ldx TankNr - rts + ldx TankNr + rts .endp ;-------------------------------------------------- .proc DrawTankEngine @@ -985,63 +985,63 @@ ToHighToParachute ; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- - ; one pixel under tank - clc - lda Ytankstable,x - adc #1 - sta ydraw - mva #0 ydraw+1 - lda XtankstableL,x - sta xdraw - lda XtankstableH,x - sta xdraw+1 - ; clear first pixel under tank - mva #0 color - jsr plot - inw xdraw - ; plot 6 random color pixels - mva #6 temp -@ lda Erase - eor #%00000001 - and random - and #%00000001 - sta color - jsr plot - inw xdraw - dec temp - bne @- - ; clear last pixel under tank - mva #0 color - jsr plot - ldx TankNr - rts + ; one pixel under tank + clc + lda Ytankstable,x + adc #1 + sta ydraw + mva #0 ydraw+1 + lda XtankstableL,x + sta xdraw + lda XtankstableH,x + sta xdraw+1 + ; clear first pixel under tank + mva #0 color + jsr plot + inw xdraw + ; plot 6 random color pixels + mva #6 temp +@ lda Erase + eor #%00000001 + and random + and #%00000001 + sta color + jsr plot + inw xdraw + dec temp + bne @- + ; clear last pixel under tank + mva #0 color + jsr plot + ldx TankNr + rts .endp ;-------------------------------------------------- .proc TankFalls; ;-------------------------------------------------- lda #0 - sta PreviousFall ; bit 7 - left, bit 6 - right + sta PreviousFall ; bit 7 - left, bit 6 - right sta EndOfTheFallFlag sta Parachute - mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop + mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop ; let's check if the given tank has got the parachute - ldx TankNr - lda ActiveDefenceWeapon,x - cmp #ind_Parachute______ ; parachute - beq ParachuteActive - cmp #ind_StrongParachute ; strong parachute - beq ParachuteActive - cmp #ind_Force_Shield___ ; shield witch energy and parachute + ldx TankNr + lda ActiveDefenceWeapon,x + cmp #ind_Parachute ; parachute + beq ParachuteActive + cmp #ind_StrongParachute ; strong parachute + beq ParachuteActive + cmp #ind_Force_Shield ; shield witch energy and parachute bne TankFallsX ParachuteActive inc Parachute TankFallsX - ; sound only if really falls - lda Parachute - and FallingSoundBit ; bit 1 - beq NoFallingSound - mva #0 FallingSoundBit + ; sound only if really falls + lda Parachute + and FallingSoundBit ; bit 1 + beq NoFallingSound + mva #0 FallingSoundBit mva #sfx_shield_off sfx_effect NoFallingSound ; clear previous position @@ -1057,8 +1057,8 @@ NoFallingSound DoNotClearParachute mva #0 Erase ; ldx TankNr - lda EndOfTheFallFlag ; We only get byte below the tank if still falling - bne NoGroundCheck + lda EndOfTheFallFlag ; We only get byte below the tank if still falling + bne NoGroundCheck ; coordinates of the first pixel under the tank ldx TankNr jsr SetupXYdraw.X @@ -1068,58 +1068,58 @@ DoNotClearParachute ; time in our lives! Tada! It opens a new chapter!!! sta ydraw ; -; UnderTank1 ; byte under tank -; UnderTank2 ; byte under tank reversed (for simple check right direction) +; UnderTank1 ; byte under tank +; UnderTank2 ; byte under tank reversed (for simple check right direction) lda #08 sta temp ; Loop Counter ByteBelowTank jsr point_plot beq EmptyPoint2 sec - ror UnderTank2 - sec + ror UnderTank2 + sec bcs ROLPoint2 EmptyPoint2 clc - ror UnderTank2 - clc + ror UnderTank2 + clc ROLPoint2 rol UnderTank1 inw xdraw dec temp - bne ByteBelowTank + bne ByteBelowTank NoGroundCheck ldx TankNr - lda Ytankstable,x - cmp #screenheight-1 ; tank on lowest position (no falling down) - jcs EndOfFall - lda UnderTank1 - bne NoFallingDown - ; Tank falling down ---- - lda Parachute + lda Ytankstable,x + cmp #screenheight-1 ; tank on lowest position (no falling down) + jcs EndOfFall + lda UnderTank1 + bne NoFallingDown + ; Tank falling down ---- + lda Parachute and #1 bne ParachutePresent ; decreasing energy ldy #2 ; how much energy to substract if no parachute jsr DecreaseEnergyX ParachutePresent - ; check parachute type - lda ActiveDefenceWeapon,x + ; check parachute type + lda ActiveDefenceWeapon,x cmp #ind_StrongParachute ; strong parachute - bne OneTimeParachute + bne OneTimeParachute ; decreasing energy of parachute ldy #1 ; how much parachute energy to substract - jsr DecreaseShieldEnergyX - cpy #0 ; is necessary to reduce tenk energy ? - beq @+ + jsr DecreaseShieldEnergyX + cpy #0 ; is necessary to reduce tenk energy ? + beq @+ jsr DecreaseEnergyX @ - ; check energy of parachute - lda ShieldEnergy,x - bne OneTimeParachute - lda #$00 - sta Parachute - sta ActiveDefenceWeapon,x ; deactivate defence + ; check energy of parachute + lda ShieldEnergy,x + bne OneTimeParachute + lda #$00 + sta Parachute + sta ActiveDefenceWeapon,x ; deactivate defence OneTimeParachute lda Parachute ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) @@ -1129,28 +1129,28 @@ OneTimeParachute clc adc #1 sta Ytankstable,x - jmp EndOfFCycle + jmp EndOfFCycle NoFallingDown - ; check direction (left or right) - ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) -@ lda SlideLeftTable,y - cmp UnderTank1 - beq FallingLeft - cmp UnderTank2 - beq FallingRight - dey - bpl @- - bmi NoLeftOrRight + ; check direction (left or right) + ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) +@ lda SlideLeftTable,y + cmp UnderTank1 + beq FallingLeft + cmp UnderTank2 + beq FallingRight + dey + bpl @- + bmi NoLeftOrRight FallingRight - ; tank is falling right - bit PreviousFall ; bit 6 - left - bvs EndRightFall + ; tank is falling right + bit PreviousFall ; bit 6 - left + bvs EndRightFall ; we finish falling right if the tank reached the edge of the screen lda XtanksTableH,x - cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank - bne @+ + cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + bne @+ lda XtanksTableL,x - cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank @ bcs EndRightFall NotRightEdge ; tank is falling right - modify coorinates @@ -1161,17 +1161,17 @@ NotRightEdge lda XtankstableH,x adc #0 sta XtankstableH,x - mva #%10000000 PreviousFall ; set bit 7 - right - bne EndOfFCycle + mva #%10000000 PreviousFall ; set bit 7 - right + bne EndOfFCycle FallingLeft - ; tank is falling left - bit PreviousFall ; bit 7 - right - bmi EndLeftFall + ; tank is falling left + bit PreviousFall ; bit 7 - right + bmi EndLeftFall ; we finish falling left if the tank reached the edge of the screen lda XtanksTableH,x bne NotLeftEdge lda XtanksTableL,x - cmp #3 ; 2 pixels correction due to a barrel wider than tank + cmp #3 ; 2 pixels correction due to a barrel wider than tank bcc EndLeftFall NotLeftEdge ; tank is falling left - modify coorinates @@ -1182,51 +1182,51 @@ NotLeftEdge lda XtankstableH,x sbc #0 sta XtankstableH,x - mva #%01000000 PreviousFall ; set bit 6 - left - bne EndOfFCycle + mva #%01000000 PreviousFall ; set bit 6 - left + bne EndOfFCycle EndLeftFall EndRightFall NoLeftOrRight inc EndOfTheFallFlag ; after this is shouldn't fall EndOfFCycle - ; draw tank on new position - jsr DrawTankNr ; ew have TankNr in X (I hope :) ) + ; draw tank on new position + jsr DrawTankNr ; ew have TankNr in X (I hope :) ) ; checking is parachute present and if so, draw it lda Parachute - cmp #3 ; parachute and falling - bne DoNotDrawParachute + cmp #3 ; parachute and falling + bne DoNotDrawParachute ; here we draw parachute ; ldx TankNr jsr DrawTankParachute - jsr WaitOneFrame ; only if tank with parachute + jsr WaitOneFrame ; only if tank with parachute RapidFalling DoNotDrawParachute - lda EndOfTheFallFlag - jeq TankFallsX + lda EndOfTheFallFlag + jeq TankFallsX ; Tank falling down already finished, but it is not sure that ; the horizontal coordinate is even. ; If it is odd then it must be corrected because otherwise ; P/M graphics background would not look OK ; ldx TankNr - ; x correction for P/M - ; -- - .IF XCORRECTION_FOR_PM = 1 + ; x correction for P/M + ; -- + .IF XCORRECTION_FOR_PM = 1 lda XtanksTableL,x and #$01 beq EndOfFall ; if it is even then it is the end ; and if not, we push it one pixel the way it was falling before - lda #%10000000 ; set "virtual ground" for right falling - ldy #%00000001 - bit PreviousFall - bmi ForceFallLeft - tay ; tricky - replaces ldy #%10000000 - lda #%00000001 ; set "virtual ground" for left falling + lda #%10000000 ; set "virtual ground" for right falling + ldy #%00000001 + bit PreviousFall + bmi ForceFallLeft + tay ; tricky - replaces ldy #%10000000 + lda #%00000001 ; set "virtual ground" for left falling ForceFallLeft - sta UnderTank1 - sty UnderTank2 - jmp TankFallsX - .ENDIF - ; -- + sta UnderTank1 + sty UnderTank2 + jmp TankFallsX + .ENDIF + ; -- EndOfFall mva #1 Erase ; ldx TankNr @@ -1235,11 +1235,11 @@ EndOfFall lda Parachute cmp #$03 ; was falling down and the parachute bne NoParachuteWeapon - ; first we check type of parachute - lda ActiveDefenceWeapon,x - cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) - bne NoParachuteWeapon - mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) + ; first we check type of parachute + lda ActiveDefenceWeapon,x + cmp #ind_Parachute ; deactivate weapon only if parachute (54) + bne NoParachuteWeapon + mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) NoParachuteWeapon ; now we clear parachute on the screen if present lda Parachute @@ -1247,8 +1247,8 @@ NoParachuteWeapon beq ThereWasNoParachute jsr DrawTankParachute ThereWasNoParachute -; ldx TankNr - jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) +; ldx TankNr + jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) mva #sfx_silencer sfx_effect rts @@ -1258,21 +1258,21 @@ ThereWasNoParachute .proc ClearPMmemory ;-------------------------------------------------- - lda #$00 - tay -@ sta pmgraph+$300,y - sta pmgraph+$400,y - sta pmgraph+$500,y - sta pmgraph+$600,y - sta pmgraph+$700,y - iny - bne @- - rts + lda #$00 + tay +@ sta pmgraph+$300,y + sta pmgraph+$400,y + sta pmgraph+$500,y + sta pmgraph+$600,y + sta pmgraph+$700,y + iny + bne @- + rts .endp /* ;-------------------------------------------------- -drawmountainspixel ; never used ? +drawmountainspixel ; never used ? ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify @@ -1280,7 +1280,7 @@ drawmountainspixelloop ldy #0 lda (modify),y sta ydraw - sty ydraw+1 + sty ydraw+1 jsr plot inw modify inw xdraw @@ -1315,17 +1315,17 @@ drawmountainspixelloop ; how it works. I have just translated Polish comment ; but I do not understand a word of it :) ; If you know how it works, please write here :)))) - jsr ClearTanks + jsr ClearTanks NoClearTanks ; Fix for lonely pixel after nuclear winter :) #103 - lda #0 - sta xdraw - sta xdraw+1 - sta ydraw - sta ydraw+1 - sta color - jsr plot + lda #0 + sta xdraw + sta xdraw+1 + sta ydraw + sta ydraw+1 + sta color + jsr plot ; First we look for highest pixels and fill with their coordinates ; both tables @@ -1335,7 +1335,7 @@ NoClearTanks adw RangeLeft #mountaintable2 tempor2 cpw xdraw RangeRight - jcs NothingToFall + jcs NothingToFall NextColumn1 mwa #0 ydraw @@ -1351,9 +1351,9 @@ StillNothing inc ydraw lda ydraw cmp #screenheight - bne NextPoint1 - ; no pixels on whole column !!! - ldy #0 + bne NextPoint1 + ; no pixels on whole column !!! + ldy #0 lda ydraw sta (tempor2),y sta (temp),y @@ -1419,18 +1419,18 @@ ColumnIsReady bcc FalloutOfLine beq FalloutOfLine - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - spl:rts ; exit if pressed 'Exit keys' + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + spl:rts ; exit if pressed 'Exit keys' lda IsEndOfTheFallFlag ; we repeat untill at some point first table reaches ; level of the mountains jeq MainFallout2 ; now correct heights are in the mountaintable - sta color ; Pozor! :) we know - now A=1 + sta color ; Pozor! :) we know - now A=1 NothingToFall mva #sfx_silencer sfx_effect - jsr DrawTanks + jsr DrawTanks rts .endp @@ -1548,14 +1548,14 @@ EndDrawing ;-------------------------------------------------- mwa #0 xdraw nextPointDrawing - adw xdraw #mountaintable modify + adw xdraw #mountaintable modify lda #screenheight ldy #0 sta (modify),y inw xdraw cpw xdraw #screenwidth bne nextPointDrawing - ldx NumberOfPlayers + ldx NumberOfPlayers dex SetYofNextTank lda #screenheight-1 @@ -1574,17 +1574,17 @@ SetYofNextTank ldy #0 ldx #screenheight-1 nextPointChecking - txa + txa cmp (modify),y - bcc NotHigher + bcc NotHigher lda (modify),y - tax + tax NotHigher inw modify cpw modify #(mountaintable+screenwidth) bne nextPointChecking - txa - rts + txa + rts .endp ;-------------------------------------------------------- @@ -1605,7 +1605,7 @@ NotHigher ;jsr Display4x4AboveTank ;rts - ; POZOR !!! + ; POZOR !!! .endp ;-------------------------------------------------------- @@ -1782,7 +1782,7 @@ TypeLine4x4Loop sta CharCode4x4 mwa LineXdraw dx mva LineYdraw dy - mva #0 dy+1 ; dy is 2 bytes value + mva #0 dy+1 ; dy is 2 bytes value jsr PutChar4x4 ;type empty pixels as well! adw LineXdraw #4 inc:lda LineCharNr @@ -1852,7 +1852,7 @@ quit_areyousure mva #20 fs ; temp, how many times blink the billboard seppuku_loop lda CONSOL ; turbo mode - and #%00000001 ; START KEY + and #%00000001 ; START KEY sne:mva #1 fs ; finish it mva #4 ResultY ; where seppuku text starts Y-wise on the screen @@ -1922,8 +1922,8 @@ X lda XtanksTableL,x ; mva #1 color ldx TankNr jsr SetupXYdraw - lda BarrelLength,x - sta yc ; current tank barrel length + lda BarrelLength,x + sta yc ; current tank barrel length lda angleTable,x sta Angle jsr DrawBarrelTech @@ -1979,7 +1979,7 @@ YangleUnder90 lda #0 ; all arithmetic to zero sta vx+1 sta vy+1 - lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) + lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) sta fx sta fy @@ -2044,20 +2044,20 @@ ybarrel .proc PMoutofScreen ;-------------------------------------------------- lda #$00 ; let all P/M disappear - ldy #7 -@ sta hposp0,y - dey - bpl @- - ;:8 sta hposp0+# ; optimized... but Y! + ldy #7 +@ sta hposp0,y + dey + bpl @- + ;:8 sta hposp0+# ; optimized... but Y! rts .endp ;-------------------------------------------------- .proc ColorsOfSprites - ldy #3 -@ lda TankColoursTable,y ; colours of sprites under tanks - sta PCOLR0,y - dey - bpl @- + ldy #3 +@ lda TankColoursTable,y ; colours of sprites under tanks + sta PCOLR0,y + dey + bpl @- LDA TankColoursTable+4 STA COLOR3 ; joined missiles (5th tank) rts diff --git a/scorch.asm b/scorch.asm index d1d56c9..7da368b 100644 --- a/scorch.asm +++ b/scorch.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ;Atari 8-bit Scorched Earth source code ;--------------------------------------------------- ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski @@ -6,7 +6,9 @@ ;Miami & Warsaw 2022, 2023 ;--------------------------------------------------- -.def TARGET = 800 ; 5200 ; or 800 +.IFNDEF TARGET + .def TARGET = 800 ; 5200 ; or 64 +.ENDIF ;atari800 -5200 -cart ${outputFilePath} -cart-type 4 ;atari800 -run ${outputFilePath} ;--------------------------------------------------- @@ -17,11 +19,11 @@ ; (direct writes to screen memory - atari only :) ) ;--------------------------------------------------- - ;OPT r+ ; saves 12 bytes :O + ; OPT r+ ; saves 12 bytes :O ;--------------------------------------------------- .macro build - dta d"1.30" ; number of this build (4 bytes) + dta d"1.30" ; number of this build (4 bytes) .endm .macro RMTSong @@ -34,14 +36,14 @@ ;--------------------------------------------------- FirstZpageVariable = $57 - .zpvar DliColorBack .byte = FirstZpageVariable - .zpvar GradientNr .byte - .zpvar GradientColors .word - .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) - .zpvar JoystickNumber .byte - .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing - .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory - .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) + .zpvar DliColorBack .byte = FirstZpageVariable + .zpvar GradientNr .byte + .zpvar GradientColors .word + .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) + .zpvar JoystickNumber .byte + .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing + .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory + .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) .zpvar xdraw .word ;= $64 ;variable X for plot .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) .zpvar xbyte .word @@ -59,7 +61,7 @@ FirstZpageVariable = $57 .zpvar xtempDRAW .word ;same as above for XDRAW routine .zpvar ytempDRAW .word ;same as above for XDRAW routine .zpvar tempor2 .word - .zpvar CreditsVScrol .byte + .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine .zpvar fx .byte @@ -74,21 +76,21 @@ FirstZpageVariable = $57 .zpvar di .word .zpvar dp .word ;---------------------------- - .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank1 .byte + .zpvar UnderTank2 .byte ;---------------------------- - .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) + .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word - .zpvar dliCounter .byte - .zpvar pressTimer .byte - .zpvar NTSCcounter .byte - .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling - .zpvar sfx_effect .byte - .zpvar RMT_blocked .byte - .zpvar ScrollFlag .byte - .zpvar SkStatSimulator .byte - .zpvar FloatingAlt .byte ; floating tank altitude - .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen + .zpvar dliCounter .byte + .zpvar pressTimer .byte + .zpvar NTSCcounter .byte + .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling + .zpvar sfx_effect .byte + .zpvar RMT_blocked .byte + .zpvar ScrollFlag .byte + .zpvar SkStatSimulator .byte + .zpvar FloatingAlt .byte ; floating tank altitude + .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen ; --------------OPTIMIZATION VARIABLES-------------- .zpvar Force .word @@ -103,7 +105,7 @@ FirstZpageVariable = $57 .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) .zpvar Counter .byte ;temporary Counter for outside loops .zpvar ExplosionRadius .byte - .zpvar FunkyBombCounter .byte + .zpvar FunkyBombCounter .byte .zpvar ResultY .byte .zpvar xcircle .word .zpvar ycircle .word @@ -126,10 +128,10 @@ FirstZpageVariable = $57 .zpvar RangeLeft .word .zpvar RangeRight .word .zpvar NewAngle .byte - .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing + .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -141,7 +143,7 @@ FirstZpageVariable = $57 .zpvar goleft .byte .zpvar OffsetDL1 .byte .zpvar L1 .byte - HotNapalmFlag = FunkyBombCounter ; reuse variable! + HotNapalmFlag = FunkyBombCounter ; reuse variable! ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 displayposition = modify @@ -187,14 +189,14 @@ FirstZpageVariable = $57 _del = $fc ;$0c ;not used in 5200 _M = $0d _S = $0e - _atari = $fd ; not used in 5200 + _atari = $fd ; not used in 5200 _none = $0f .ende .ELSE icl 'Atari/lib/ATARISYS.ASM' icl 'Atari/lib/MACRO.ASM' - icl 'artwork/splash_v2/splash.asm' ; splash screen and musix + ; icl 'artwork/splash_v2/splash.asm' ; splash screen and musix .ENDIF ;----------------------------------------------- @@ -283,83 +285,83 @@ rom2joy ; modify the text splash_text = $3c80 ; '.scorch.supersystem.copyright.19xx.atari' splash_year = splash_text + $1e - splash_copyright = splash_text + $14 - ldy #19 ; 20 characters -@ lda NewSplashText,y - sta splash_copyright,y - dey - bpl @- + splash_copyright = splash_text + $14 + ldy #19 ; 20 characters +@ lda NewSplashText,y + sta splash_copyright,y + dey + bpl @- ; splash screen delay. maybe add fire to speed up? @ cpx RTCLOK+1 bne @- no5200splash .ENDIF - jsr MakeDarkScreen + jsr MakeDarkScreen - ; one time zero variables in RAM (non zero page) - lda #0 - ldy #OneTimeZeroVariablesCount-1 -@ sta OneTimeZeroVariables,y - dey - bpl @- - - ; one time zero variables in RAM (zero page) - ldy #FirstZpageVariable -@ sta $0000,y - iny - bne @- - - ; initialize variables in RAM (non zero page) - ldy #initialvaluesCount-1 -@ lda initialvaluesStart,y - sta variablesToInitialize,y - dey - bpl @- + ; one time zero variables in RAM (non zero page) + lda #0 + ldy #OneTimeZeroVariablesCount-1 +@ sta OneTimeZeroVariables,y + dey + bpl @- + + ; one time zero variables in RAM (zero page) + ldy #FirstZpageVariable +@ sta $0000,y + iny + bne @- + + ; initialize variables in RAM (non zero page) + ldy #initialvaluesCount-1 +@ lda initialvaluesStart,y + sta variablesToInitialize,y + dey + bpl @- ; set gradient to the full LGBTIQQAAPP+ flag on start - mva #0 GradientNr ; #1 to set gradient number 2 :) (next one) - jsr SelectNextGradient.NotWind + mva #0 GradientNr ; #1 to set gradient number 2 :) (next one) + jsr SelectNextGradient.NotWind ; generate linetables - jsr GenerateLineTable + jsr GenerateLineTable .IF TARGET = 800 ; pokeys init - lda #3 ; stereo - sta POKEY+$0f ; stereo - sta POKEY+$1f ; stereo + lda #3 ; stereo + sta POKEY+$0f ; stereo + sta POKEY+$1f ; stereo - lda PAL - and #%00001110 - bne NoRMT_PALchange - ;it is PAL here - ; Change RMT to PAL version - ; 5 values in RMT file - ; not elegant :( - mva #$06 MODUL-6+$967 ; $07 > $06 - ;mva #$06 MODUL-6+$bc3 ; $07 > $06 - ;mva #$06 MODUL-6+$e69 ; $08 > $06 - ;mva #$06 MODUL-6+$ebc ; $08 > $06 - sta MODUL-6+$bc3 ; $07 > $06 - sta MODUL-6+$e69 ; $08 > $06 - sta MODUL-6+$ebc ; $08 > $06 - mva #$10 MODUL-6+$a69 ; $12 > $10 - mva #$04 MODUL-6+$bf8 ; $05 > $04 - mva #$08 MODUL-6+$e3d ; $0a > $08 - - ; and mountains colors table address - mva #dliColorsFore2PAL GradientAddrH+2 -; mva #$c4 dliColorsFore2+16 -; mva #$c6 dliColorsFore2+17 -; mva #$a4 dliColorsFore2+18 -; mva #$a6 dliColorsFore2+19 -; sta dliColorsFore2+20 + lda PAL + and #%00001110 + bne NoRMT_PALchange + ;it is PAL here + ; Change RMT to PAL version + ; 5 values in RMT file + ; not elegant :( + mva #$06 MODUL-6+$967 ; $07 > $06 + ;mva #$06 MODUL-6+$bc3 ; $07 > $06 + ;mva #$06 MODUL-6+$e69 ; $08 > $06 + ;mva #$06 MODUL-6+$ebc ; $08 > $06 + sta MODUL-6+$bc3 ; $07 > $06 + sta MODUL-6+$e69 ; $08 > $06 + sta MODUL-6+$ebc ; $08 > $06 + mva #$10 MODUL-6+$a69 ; $12 > $10 + mva #$04 MODUL-6+$bf8 ; $05 > $04 + mva #$08 MODUL-6+$e3d ; $0a > $08 + + ; and mountains colors table address + mva #dliColorsFore2PAL GradientAddrH+2 +; mva #$c4 dliColorsFore2+16 +; mva #$c6 dliColorsFore2+17 +; mva #$a4 dliColorsFore2+18 +; mva #$a6 dliColorsFore2+19 +; sta dliColorsFore2+20 NoRMT_PALchange - .ELSE - mva #$7f SkStatSimulator + .ELSE + mva #$7f SkStatSimulator .ENDIF @@ -377,16 +379,16 @@ NoRMT_PALchange mva #$04 CONSOL5200 ;Speaker off, Pots enabled, port #1 selected mwa #kb_continue VKEYCNT ;Keyboard handler .ENDIF - VMAIN VBLinterrupt,7 ;jsr SetVBL - - mva #2 chactl ; necessary for 5200 + VMAIN VBLinterrupt,7 ;jsr SetVBL + + mva #2 chactl ; necessary for 5200 ;-------------------------------------------------- ; Main program of the game icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -401,10 +403,10 @@ NoRMT_PALchange beq checkJoyGetKey ; key not pressed, check Joy cmp #$f7 ; SHIFT beq checkJoyGetKey - .ELSE - lda SkStatSimulator - and #%11111110 - bne checkJoyGetKey ; key not pressed, check Joy + .ELSE + lda SkStatSimulator + and #%11111110 + bne checkJoyGetKey ; key not pressed, check Joy .ENDIF lda kbcode cmp #@kbcode._none @@ -428,30 +430,30 @@ checkJoyGetKey bne getkeyend notpressedJoyGetKey - ;fire - lda STRIG0 - beq JoyButton - .IF TARGET = 800 ; Select and Option key only on A800 - bne checkSelectKey + ;fire + lda STRIG0 + beq JoyButton + .IF TARGET = 800 ; Select and Option key only on A800 + bne checkSelectKey checkSelectKey - lda CONSOL - and #%00000010 ; Select - beq SelectPressed - lda CONSOL - and #%00000100 ; Option - .ENDIF + lda CONSOL + and #%00000010 ; Select + beq SelectPressed + lda CONSOL + and #%00000100 ; Option + .ENDIF bne @- OptionPressed - lda #@kbcode._atari ; Option key - bne getkeyend + lda #@kbcode._atari ; Option key + bne getkeyend SelectPressed - lda #@kbcode._tab ; Select key - bne getkeyend + lda #@kbcode._tab ; Select key + bne getkeyend JoyButton lda #@kbcode._ret ;Return key getkeyend - ldy #0 - sty ATRACT ; reset atract mode + ldy #0 + sty ATRACT ; reset atract mode mvy #sfx_keyclick sfx_effect rts .endp @@ -468,10 +470,10 @@ getkeyend ;-------------------------------------------------- .proc WaitForKeyRelease ;-------------------------------------------------- - mva #128-KeyRepeatSpeed pressTimer ; tricky -StillWait - bit pressTimer - bmi KeyReleased + mva #128-KeyRepeatSpeed pressTimer ; tricky +StillWait + bit pressTimer + bmi KeyReleased lda STICK0 and #$0f cmp #$0f @@ -483,13 +485,13 @@ StillWait cmp #$ff bne StillWait lda CONSOL - and #%00000110 ; Select and Option only + and #%00000110 ; Select and Option only cmp #%00000110 bne StillWait - .ELSE - lda SkStatSimulator - and #%11111110 - beq StillWait + .ELSE + lda SkStatSimulator + and #%11111110 + beq StillWait .ENDIF KeyReleased rts @@ -498,12 +500,12 @@ KeyReleased .proc IsKeyPressed ; result: A=0 - yes , A>0 - no ;-------------------------------------------------- - lda SKSTAT - and #%00000100 - beq @+ - lda #1 -@ and STRIG0 - rts + lda SKSTAT + and #%00000100 + beq @+ + lda #1 +@ and STRIG0 + rts .endp ;-------------------------------------------------- .proc DemoModeOrKey @@ -530,15 +532,15 @@ peopleAreHere ;-------------------------------------------------- MakeDarkScreen ;-------------------------------------------------- - jsr PMoutofScreen ; hide P/M - mva #0 dmactls ; dark screen - ; and wait one frame :) + jsr PMoutofScreen ; hide P/M + mva #0 dmactls ; dark screen + ; and wait one frame :) ;-------------------------------------------------- .proc WaitOneFrame ;-------------------------------------------------- - lda CONSOL - and #%00000001 ; START KEY - seq:wait ; or waitRTC ? + lda CONSOL + and #%00000001 ; START KEY + seq:wait ; or waitRTC ? rts .endp @@ -563,10 +565,10 @@ MakeDarkScreen ; If 'Esc' key is pressed - displays "Are you sure?" and - exit to Menu screen ; Just setting the right flags!!! - ; Select and Option - lda CONSOL - and #%00000101 ; Start + Option - beq QuitToGameover + ; Select and Option + lda CONSOL + and #%00000101 ; Start + Option + beq QuitToGameover lda SKSTAT cmp #$ff jeq nokeys @@ -578,12 +580,12 @@ MakeDarkScreen cmp #@kbcode._O ; $08 ; O bne CheckEsc - jsr AreYouSure - bit escFlag - bpl nokeys + jsr AreYouSure + bit escFlag + bpl nokeys ;---O pressed-quit game to game over screen--- QuitToGameover - mva #$C0 escFlag ; bits 7 and 6 set + mva #$C0 escFlag ; bits 7 and 6 set rts CheckEsc cmp #@kbcode._esc ; 28 ; ESC @@ -592,16 +594,16 @@ DisplayAreYouSure jsr AreYouSure ;---esc pressed-quit game--- nokeys - bit escFlag + bit escFlag rts ; .endp ;-------------------------------------------------- .proc ShellDelay ;-------------------------------------------------- - lda CONSOL - and #%00000001 ; START KEY - beq noShellDelay + lda CONSOL + and #%00000001 ; START KEY + beq noShellDelay ldx flyDelay DelayLoop lda VCOUNT @@ -617,17 +619,17 @@ noShellDelay .proc RmtSongSelect ; starting song line 0-255 to A reg ;-------------------------------------------------- - cmp #song_ingame - bne noingame ; noMusic blocks only ingame song + cmp #song_ingame + bne noingame ; noMusic blocks only ingame song bit noMusic spl:lda #song_silencio noingame - mvx #$ff RMT_blocked + mvx #$ff RMT_blocked ldx #MODUL ;hi byte of RMT module to Y reg jsr RASTERMUSICTRACKER ;Init - mva #0 RMT_blocked - rts + mva #0 RMT_blocked + rts .endp ;------------------------------------------------- .proc CopyFromROM @@ -653,7 +655,7 @@ noingame rts .endp ;-------------------------------------------------- - icl 'Atari/interrupts.asm' + icl 'Atari/interrupts.asm' ;---------------------------------------------- icl 'constants.asm' ;---------------------------------------------- @@ -669,7 +671,7 @@ noingame icl 'artwork/talk.asm' ;---------------------------------------------- TankFont - ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only ;---------------------------------------------- font4x4 ins 'artwork/font4x4s.bmp',+62 @@ -686,60 +688,60 @@ font4x4 tax @ lda CheatName,y - sec + sec sbc tanksnames,x - cmp #$27 - bne NoCheat + cmp #$27 + bne NoCheat inx dey bpl @- YesCheat - ldx TankNr - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 - lda #99 -@ iny - sta (temp),y - cpy #(number_of_weapons - 1) - bne @- + ldx TankNr + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + lda #99 +@ iny + sta (temp),y + cpy #(number_of_weapons - 1) + bne @- NoCheat rts .endp CheatName - dta d" 008.T"+$27 + dta d" 008.T"+$27 ;---------------------------------------------- .proc DLIinterruptBFG - pha - lda dliCounter - bne EndofBFGDLI - lda dliColorsFore - bit random - bmi @+ - lda DliColorBack -@ sta COLPF2 - lda dliColorsFore - bit random - bmi @+ - lda DliColorBack -@ sta COLPF1 + pha + lda dliCounter + bne EndofBFGDLI + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF2 + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF1 EndofBFGDLI - inc dliCounter + inc dliCounter pla rti .endp ; ------------------------ .proc BFGblink - SetDLI DLIinterruptBFG ; blinking on - ldy #50 - jsr PauseYFrames - SetDLI DLIinterruptGraph ; blinking off - rts + SetDLI DLIinterruptBFG ; blinking on + ldy #50 + jsr PauseYFrames + SetDLI DLIinterruptGraph ; blinking off + rts .endp ;-------------------------------------------------- .IF * > MODUL-1 - .ECHO * + .ECHO * .ERROR 'Code and data too long' .ENDIF .ECHO "Bytes left: ",$b000-* diff --git a/scorch.bin b/scorch.bin index 0b5931df1a2bd3ceaa3cff0f7aab633f71a8bd99..1354380c7ae039280d638eab9d8cd0887ad6ddbf 100644 GIT binary patch delta 5707 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 t7S2s)K$MeT$_ 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 F`!^8=XQKcB diff --git a/scorchC64.asm b/scorchC64.asm index e639b60..974b125 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm ;C64 8-bit Scorched Earth source code ;--------------------------------------------------- ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski @@ -20,15 +20,15 @@ org $801 org [a($801)],$801 basic_start(FirstSTART) - - + + ;--------------------------------------------------- .macro build - dta d"1.28" ; number of this build (4 bytes) + dta d"1.28" ; number of this build (4 bytes) .endm .macro RMTSong - lda #:1 ; do nothing in C64 + lda #:1 ; do nothing in C64 .endm ;--------------------------------------------------- @@ -36,14 +36,14 @@ ;--------------------------------------------------- FirstZpageVariable = $58 ; $57 - .zpvar DliColorBack .byte = FirstZpageVariable - .zpvar GradientNr .byte - .zpvar GradientColors .word - .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) - .zpvar JoystickNumber .byte - .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing - .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory - .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) + .zpvar DliColorBack .byte = FirstZpageVariable + .zpvar GradientNr .byte + .zpvar GradientColors .word + .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) + .zpvar JoystickNumber .byte + .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing + .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory + .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) .zpvar xdraw .word ;= $64 ;variable X for plot .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) .zpvar xbyte .word @@ -61,7 +61,7 @@ FirstZpageVariable = $58 ; $57 .zpvar xtempDRAW .word ;same as above for XDRAW routine .zpvar ytempDRAW .word ;same as above for XDRAW routine .zpvar tempor2 .word - .zpvar CreditsVScrol .byte + .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine .zpvar fx .byte @@ -76,21 +76,21 @@ FirstZpageVariable = $58 ; $57 .zpvar di .word .zpvar dp .word ;---------------------------- - .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank1 .byte + .zpvar UnderTank2 .byte ;---------------------------- - .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) + .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word - .zpvar dliCounter .byte - .zpvar pressTimer .byte - .zpvar NTSCcounter .byte - .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling - .zpvar sfx_effect .byte - .zpvar RMT_blocked .byte - .zpvar ScrollFlag .byte - .zpvar SkStatSimulator .byte - .zpvar FloatingAlt .byte ; floating tank altitude - .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen + .zpvar dliCounter .byte + .zpvar pressTimer .byte + .zpvar NTSCcounter .byte + .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling + .zpvar sfx_effect .byte + .zpvar RMT_blocked .byte + .zpvar ScrollFlag .byte + .zpvar SkStatSimulator .byte + .zpvar FloatingAlt .byte ; floating tank altitude + .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen ; --------------OPTIMIZATION VARIABLES-------------- .zpvar Force .word @@ -105,7 +105,7 @@ FirstZpageVariable = $58 ; $57 .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) .zpvar Counter .byte ;temporary Counter for outside loops .zpvar ExplosionRadius .byte - .zpvar FunkyBombCounter .byte + .zpvar FunkyBombCounter .byte .zpvar ResultY .byte .zpvar xcircle .word .zpvar ycircle .word @@ -128,10 +128,10 @@ FirstZpageVariable = $58 ; $57 .zpvar RangeLeft .word .zpvar RangeRight .word .zpvar NewAngle .byte - .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing + .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -143,7 +143,7 @@ FirstZpageVariable = $58 ; $57 .zpvar goleft .byte .zpvar OffsetDL1 .byte .zpvar L1 .byte - HotNapalmFlag = FunkyBombCounter ; reuse variable! + HotNapalmFlag = FunkyBombCounter ; reuse variable! ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 displayposition = modify @@ -172,18 +172,18 @@ WeaponFont ; Game Code ;-------------------------------------------------- FirstSTART - DL = 0 - StatusBufferROM = 0 - ;StatusBufferCopy = 0 - StatusBufferCopyEnd = 0 - TRACKS = 4 - DisplayCopyPurchaseEnd = 0 - DisplayCopyPurchaseStart = 0 - displayC64 = $2000 ; graphics screen memory start + DL = 0 + StatusBufferROM = 0 + ;StatusBufferCopy = 0 + StatusBufferCopyEnd = 0 + TRACKS = 4 + DisplayCopyPurchaseEnd = 0 + DisplayCopyPurchaseStart = 0 + displayC64 = $2000 ; graphics screen memory start SEI ; disable IRQ - LDA #$36 - STA $0001 ; Turn Off BASIC ROM + LDA #$36 + STA $0001 ; Turn Off BASIC ROM LDA #NMI ; to our routine @@ -199,43 +199,43 @@ FirstSTART ; from here on NMI is disabled - - jsr MakeDarkScreen - - ; one time zero variables in RAM (non zero page) - lda #0 - ldy #OneTimeZeroVariablesCount-1 -@ sta OneTimeZeroVariables,y - dey - bpl @- - - ; one time zero variables in RAM (zero page) - ldy #FirstZpageVariable -@ sta $0000,y - iny - bne @- - - ; initialize variables in RAM (non zero page) - ldy #initialvaluesCount-1 -@ lda initialvaluesStart,y - sta variablesToInitialize,y - dey - bpl @- + + jsr MakeDarkScreen + + ; one time zero variables in RAM (non zero page) + lda #0 + ldy #OneTimeZeroVariablesCount-1 +@ sta OneTimeZeroVariables,y + dey + bpl @- + + ; one time zero variables in RAM (zero page) + ldy #FirstZpageVariable +@ sta $0000,y + iny + bne @- + + ; initialize variables in RAM (non zero page) + ldy #initialvaluesCount-1 +@ lda initialvaluesStart,y + sta variablesToInitialize,y + dey + bpl @- ; generate linetables - jsr GenerateLineTable + jsr GenerateLineTable ; Random INIT - InitializeSIDrnd + InitializeSIDrnd ;-------------------------------------------------- ; Main program of the game icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -243,9 +243,9 @@ FirstSTART ; result: A=keycode ;-------------------------------------------------- jsr WaitForKeyRelease - lda #0 - sta escFlag - lda #$ff + lda #0 + sta escFlag + lda #$ff rts .endp @@ -268,8 +268,8 @@ StillWait .proc IsKeyPressed ; result: A=0 - yes , A>0 - no ;-------------------------------------------------- - lda #1 - rts + lda #1 + rts .endp ;-------------------------------------------------- .proc DemoModeOrKey @@ -296,12 +296,12 @@ peopleAreHere ;-------------------------------------------------- MakeDarkScreen ;-------------------------------------------------- -; mva #0 dmactls ; dark screen - ; and wait one frame :) +; mva #0 dmactls ; dark screen + ; and wait one frame :) ;-------------------------------------------------- .proc WaitOneFrame ;-------------------------------------------------- - wait ; or waitRTC ? + wait ; or waitRTC ? rts .endp @@ -348,20 +348,20 @@ noShellDelay .proc RmtSongSelect ; starting song line 0-255 to A reg ;-------------------------------------------------- - rts + rts .endp .proc CopyFromRom - rts + rts .endp ;-------------------------------------------------- - icl 'C64/interrupts.asm' + icl 'C64/interrupts.asm' ;---------------------------------------------- icl 'constants.asm' ;---------------------------------------------- icl 'C64/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' - icl 'C64/gr_basics.asm' + icl 'C64/gr_basics.asm' ;---------------------------------------------- icl 'weapons.asm' ;---------------------------------------------- @@ -370,7 +370,7 @@ noShellDelay icl 'artwork/talk.asm' ;---------------------------------------------- TankFont - ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only ;---------------------------------------------- font4x4 ins 'artwork/font4x4s.bmp',+62 @@ -384,56 +384,56 @@ font4x4 tax @ lda CheatName,y - sec + sec sbc tanksnames,x - cmp #$27 - bne NoCheat + cmp #$27 + bne NoCheat inx dey bpl @- YesCheat - ldx TankNr - lda TanksWeaponsTableL,x - sta temp - lda TanksWeaponsTableH,x - sta temp+1 - lda #99 -@ iny - sta (temp),y - cpy #(number_of_weapons - 1) - bne @- + ldx TankNr + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + lda #99 +@ iny + sta (temp),y + cpy #(number_of_weapons - 1) + bne @- NoCheat rts .endp CheatName - dta d" 008.T"+$27 + dta d" 008.T"+$27 ;---------------------------------------------- .proc DLIinterruptBFG - pha - lda dliCounter - bne EndofBFGDLI - lda dliColorsFore - bit random - bmi @+ - lda DliColorBack -@ sta COLPF2 - lda dliColorsFore - bit random - bmi @+ - lda DliColorBack -@ sta COLPF1 + pha + lda dliCounter + bne EndofBFGDLI + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF2 + lda dliColorsFore + bit random + bmi @+ + lda DliColorBack +@ sta COLPF1 EndofBFGDLI - inc dliCounter + inc dliCounter pla rti .endp ; ------------------------ .proc BFGblink -; SetDLI DLIinterruptBFG ; blinking on - ldy #50 - jsr PauseYFrames -; SetDLI DLIinterruptGraph ; blinking off - rts +; SetDLI DLIinterruptBFG ; blinking on + ldy #50 + jsr PauseYFrames +; SetDLI DLIinterruptGraph ; blinking off + rts .endp ;---------------------------------------------- icl 'constants_top.asm' diff --git a/variables.asm b/variables.asm index 209793e..38f4b83 100644 --- a/variables.asm +++ b/variables.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone ;===================================================== @@ -18,7 +18,7 @@ noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX ;---------------------------------------------------- ; Color table for Game Over Screen (created in a gameover routine) - .ds 1 ;.by $00 ; labels line color + .ds 1 ;.by $00 ; labels line color GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 ;---------------------------------------------------- TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 @@ -102,7 +102,7 @@ ResultsTable ;the results in the gameeeeee .DS MaxPlayers TempResults .DS MaxPlayers -;DirectHitsH ; one byte enough +;DirectHitsH ; one byte enough ; .DS MaxPlayers DirectHits .DS MaxPlayers @@ -149,7 +149,7 @@ WindOrientation .DS 1 ;(0-right,1-left) ;---------------------------------------------------- ;Counter .DS 1 ;temporary Counter for outside loops ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank -WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy +WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy ;---------------------------------------------------- xtankstableL ;X positions of tanks (lower left point) .DS MaxPlayers @@ -159,15 +159,15 @@ ytankstable ;Y positions of tanks (lower left point) .DS MaxPlayers LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) .DS MaxPlayers -JoyNumber ; Joystick port number (from 0 to 3) - .DS MaxPlayers -TankShape ; Tank shape number (from 0 to 2) - .DS MaxPlayers +JoyNumber ; Joystick port number (from 0 to 3) + .DS MaxPlayers +TankShape ; Tank shape number (from 0 to 2) + .DS MaxPlayers ;---------------------------------------------------- -TargetTankNr ; Target tank index (for AI routines) - .DS 1 -SecondTryFlag ; For precise AI aiming - .DS 1 +TargetTankNr ; Target tank index (for AI routines) + .DS 1 +SecondTryFlag ; For precise AI aiming + .DS 1 ;---------------------------------------------------- ;Erase .DS 1 ; if 1 only mask of the character is printed ; on the graphics screen. if 0 character is printed normally @@ -218,8 +218,8 @@ FallingSoundBit .DS 1 PreviousFall .DS 1 EndOfTheFallFlag .DS 1 ; in case of the infinite fall ;Parachute .DS 1 ; are you insured with parachute? -;FloatingAlt .DS 1 ; floating tank altitude -FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! +;FloatingAlt .DS 1 ; floating tank altitude +FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc ;---------------------------------------------------- ;Flight @@ -235,7 +235,7 @@ MirvDown .DS [5] ; is given missile down? MirvMissileCounter .DS 1 ; missile Counter (mainly for X) SmokeTracerFlag .DS 1 ; if Smoketracer LaserFlag .DS 1 ; $ff if Laser -XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) +XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) ;---------------------------------------------------- ;CheckCollisionWithTank @@ -287,9 +287,9 @@ AfterBFGflag .DS 1 ; tables with indexes of weapons on the right lists ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive IndexesOfWeaponsL1 - .ds (last_offensive_____ - first_offensive____+1) + .ds (last_offensive - first_offensive +1) IndexesOfWeaponsL2 - .ds (last_defensive_____ - first_defensive____+1) + .ds (last_defensive - first_defensive +1) ;---------------------------------------------------- ; variables storing amount of weapons on the first and second diff --git a/weapons.asm b/weapons.asm index ca511ac..23f5809 100644 --- a/weapons.asm +++ b/weapons.asm @@ -1,4 +1,4 @@ -; @com.wudsn.ide.asm.mainsourcefile=scorch.asm +; @com.wudsn.ide.asm.mainsourcefile=scorch.asm .IF *>0 ;this is a trick that prevents compiling this file alone ;-------------------------------------------------- @@ -8,7 +8,7 @@ ; ActiveWeapon(TankNr) - weapon that tank fires ;-------------------------------------------------- ;cleanup of the soil fall down ranges (left and right) - jsr ClearScreenSoilRange + jsr ClearScreenSoilRange ldx TankNr lda ActiveWeapon,x @@ -22,38 +22,38 @@ pha rts ExplosionRoutines - .word babymissile-1 ;Baby_Missile___;_00 - .word missile-1 ;Missile________;_01 - .word babynuke-1 ;Baby_Nuke______;_02 - .word nuke-1 ;Nuke___________;_03 - .word leapfrog-1 ;LeapFrog_______;_04 - .word funkybomb-1 ;Funky_Bomb_____;_05 - .word mirv-1 ;MIRV___________;_06 - .word deathshead-1 ;Death_s_Head___;_07 - .word napalm-1 ;Napalm_________;_08 - .word hotnapalm-1 ;Hot_Napalm_____;_09 - .word tracer-1 ;Tracer_________;_10 - .word tracer-1 ;Smoke_Tracer___;_11 - .word babyroller-1 ;Baby_Roller____;_12 - .word roller-1 ;Roller_________;_13 - .word heavyroller-1 ;Heavy_Roller___;_14 - .word riotcharge-1 ;Riot_Charge____;_15 - .word riotblast-1 ;Riot_Blast_____;_16 - .word riotbomb-1 ;Riot_Bomb______;_17 + .word babymissile-1 ;Baby_Missile ;_00 + .word missile-1 ;Missile ;_01 + .word babynuke-1 ;Baby_Nuke ;_02 + .word nuke-1 ;Nuke ;_03 + .word leapfrog-1 ;LeapFrog ;_04 + .word funkybomb-1 ;Funky_Bomb ;_05 + .word mirv-1 ;MIRV ;_06 + .word deathshead-1 ;Death_s_Head ;_07 + .word napalm-1 ;Napalm ;_08 + .word hotnapalm-1 ;Hot_Napalm ;_09 + .word tracer-1 ;Tracer ;_10 + .word tracer-1 ;Smoke_Tracer ;_11 + .word babyroller-1 ;Baby_Roller ;_12 + .word roller-1 ;Roller ;_13 + .word heavyroller-1 ;Heavy_Roller ;_14 + .word riotcharge-1 ;Riot_Charge ;_15 + .word riotblast-1 ;Riot_Blast ;_16 + .word riotbomb-1 ;Riot_Bomb ;_17 .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 - .word babydigger-1 ;Baby_Digger____;_19 - .word digger-1 ;Digger_________;_20 - .word heavydigger-1 ;Heavy_Digger___;_21 - .word babysandhog-1 ;Baby_Sandhog___;_22 - .word sandhog-1 ;Sandhog________;_23 - .word heavysandhog-1 ;Heavy_Sandhog__;_24 - .word dirtclod-1 ;Dirt_Clod______;_25 - .word dirtball-1 ;Dirt_Ball______;_26 - .word tonofdirt-1 ;Ton_of_Dirt____;_27 - .word liquiddirt-1 ;Liquid_Dirt____;_28 - .word dirtcharge-1 ;Dirt_Charge____;_29 - .word BFG-1 ;Buy_me_________;_30 - .word laser-1 ;Laser__________;_31 + .word babydigger-1 ;Baby_Digger ;_19 + .word digger-1 ;Digger ;_20 + .word heavydigger-1 ;Heavy_Digger ;_21 + .word babysandhog-1 ;Baby_Sandhog ;_22 + .word sandhog-1 ;Sandhog ;_23 + .word heavysandhog-1 ;Heavy_Sandhog ;_24 + .word dirtclod-1 ;Dirt_Clod ;_25 + .word dirtball-1 ;Dirt_Ball ;_26 + .word tonofdirt-1 ;Ton_of_Dirt ;_27 + .word liquiddirt-1 ;Liquid_Dirt ;_28 + .word dirtcharge-1 ;Dirt_Charge ;_29 + .word BFG-1 ;Buy_me ;_30 + .word laser-1 ;Laser ;_31 VOID tracer @@ -61,19 +61,19 @@ tracer .endp .proc BFG mva #sfx_plasma_2_2 sfx_effect - jsr BFGblink - ; Kill all :) + jsr BFGblink + ; Kill all :) ldx NumberOfPlayers dex - lda #$00 + lda #$00 CheckNextTankBFG - cpx TankNr ; not me! - beq @+ + cpx TankNr ; not me! + beq @+ sta Energy,x @ dex bpl CheckNextTankBFG - stx AfterBFGflag ; $ff - rts + stx AfterBFGflag ; $ff + rts .endp ; ------------------------ .proc babymissile @@ -86,21 +86,21 @@ GoXmissile ; ------------------------ .proc missile ; mva #17 ExplosionRadius - bne babymissile.GoBabyMissileSFX + bne babymissile.GoBabyMissileSFX ; jmp xmissile .endp ; ------------------------ .proc babynuke mva #25 ExplosionRadius GoBabyNukeSFX - mva #sfx_nuke sfx_effect ; allways <>0 - bne babymissile.GoXmissile + mva #sfx_nuke sfx_effect ; allways <>0 + bne babymissile.GoXmissile ; jmp xmissile .endp ; ------------------------ .proc nuke mva #30 ExplosionRadius - bne babynuke.GoBabyNukeSFX + bne babynuke.GoBabyNukeSFX ; jmp xmissile .endp ; ------------------------ @@ -110,8 +110,8 @@ GoBabyNukeSFX ; jsr xmissile jsr babymissile.GoBabyMissileSFX - jsr SecondRepeat - + jsr SecondRepeat + SecondRepeat ; soil must fall down now! there is no other way... ; hide tanks or they fall down with soil @@ -126,7 +126,7 @@ SecondRepeat ror Force mva LeapFrogAngle Angle mva #sfx_funky_hit sfx_effect - sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) jsr Flight lda HitFlag beq EndOfLeapping @@ -145,7 +145,7 @@ EndOfLeapping .proc funkybomb ; mva #sfx_baby_missile sfx_effect mwa xtraj+1 xtrajfb - sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) ;central Explosion mva #21 ExplosionRadius jsr CalculateExplosionRange0 @@ -153,9 +153,9 @@ EndOfLeapping jsr SoilDown2 ; - jsr cleartanks ; maybe not? - mva #1 color - mva #0 FunkyWallFlag + jsr cleartanks ; maybe not? + mva #1 color + mva #0 FunkyWallFlag mva #5 FunkyBombCounter FunkyBombLoop mva #1 tracerflag @@ -174,19 +174,19 @@ FunkyBombLoop mwa ytrajfb ytraj+1 mva #sfx_funky_hit sfx_effect jsr Flight - mva #0 ExplosionRadius ; if no explosion (off screen) - ; if xdraw if over range then fix it - lda xdraw+1 - bpl NoOnLeftEdge - lda #0 - sta xdraw - sta xdraw+1 + mva #0 ExplosionRadius ; if no explosion (off screen) + ; if xdraw if over range then fix it + lda xdraw+1 + bpl NoOnLeftEdge + lda #0 + sta xdraw + sta xdraw+1 NoOnLeftEdge - cpw xdraw #screenwidth - bcc NoOnRightEdge - mwa #screenwidth xdraw + cpw xdraw #screenwidth + bcc NoOnRightEdge + mwa #screenwidth xdraw NoOnRightEdge - jsr CalculateExplosionRange ; add end of flight coordinates to soildown range + jsr CalculateExplosionRange ; add end of flight coordinates to soildown range lda HitFlag beq NoExplosionInFunkyBomb mva #sfx_baby_missile sfx_effect @@ -196,9 +196,9 @@ NoExplosionInFunkyBomb dec FunkyBombCounter bne FunkyBombLoop mva #0 tracerflag - lda FunkyWallFlag - beq NoWallsInFunky - jsr SetFullScreenSoilRange + lda FunkyWallFlag + beq NoWallsInFunky + jsr SetFullScreenSoilRange NoWallsInFunky rts .endp @@ -242,121 +242,121 @@ GoXmissileWithSaveXYdraw .endp ; ------------------------ .proc napalm - mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm - beq xnapalm + mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm + beq xnapalm .endp ; ------------------------ .proc hotnapalm - mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm -; jmp xnapalm + mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm +; jmp xnapalm .endp ; ------------------------ .proc xnapalm mva #sfx_napalm sfx_effect - mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) + mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) jsr CalculateExplosionRange - ; - mwa xdraw xcircle ; store hitpoint for future repeats - ldy #30 ; repeat 30 times - sty magic -RepeatNapalm ; external loop (for fire animation) - mwa xcircle xdraw - sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point - ldy #0 - sty magic+1 -RepeatFlame ; internal loop (draw flames) - ldy #0 - adw xdraw #mountaintable temp - sty ydraw+1 - lda (temp),y - sec - sbc #1 ; over ground - sta ydraw - lda xdraw - and HotNapalmFlag ; if hotnapalm and x is odd: - :2 asl ; modify y position 4 pixels up - ldy ydraw - sta ydraw - tya - sec - sbc ydraw - sta ydraw - sbw xdraw #4 ; half character correction - ; draw flame symbol - lda magic ; if last repeat - clear flames - beq LastNapalmRepeat - lda random - and #%00000110 - clc - adc #char_flame___________ - bne PutFlameChar + ; + mwa xdraw xcircle ; store hitpoint for future repeats + ldy #30 ; repeat 30 times + sty magic +RepeatNapalm ; external loop (for fire animation) + mwa xcircle xdraw + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point + ldy #0 + sty magic+1 +RepeatFlame ; internal loop (draw flames) + ldy #0 + adw xdraw #mountaintable temp + sty ydraw+1 + lda (temp),y + sec + sbc #1 ; over ground + sta ydraw + lda xdraw + and HotNapalmFlag ; if hotnapalm and x is odd: + :2 asl ; modify y position 4 pixels up + ldy ydraw + sta ydraw + tya + sec + sbc ydraw + sta ydraw + sbw xdraw #4 ; half character correction + ; draw flame symbol + lda magic ; if last repeat - clear flames + beq LastNapalmRepeat + lda random + and #%00000110 + clc + adc #char_flame + bne PutFlameChar LastNapalmRepeat - lda #char_clear_flame_____ ; clear flame symbol + lda #char_clear_flame ; clear flame symbol PutFlameChar - sta CharCode - ; check coordinates - cpw xdraw #(screenwidth-7) - bcs CharOffTheScreen - lda ydraw - cmp #7 - bcc CharOffTheScreen - cmp #(screenHeight-1) - bcs CharOffTheScreen - jsr TypeChar + sta CharCode + ; check coordinates + cpw xdraw #(screenwidth-7) + bcs CharOffTheScreen + lda ydraw + cmp #7 + bcc CharOffTheScreen + cmp #(screenHeight-1) + bcs CharOffTheScreen + jsr TypeChar CharOffTheScreen - adw xdraw #4 ; reverse half character correction (we need positon of character center) - adw xdraw #1 ; next char 1 pixels to right - inc magic+1 - lda magic+1 - cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center - jne RepeatFlame - dec magic - jpl RepeatNapalm - ; after napalm + adw xdraw #4 ; reverse half character correction (we need positon of character center) + adw xdraw #1 ; next char 1 pixels to right + inc magic+1 + lda magic+1 + cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center + jne RepeatFlame + dec magic + jpl RepeatNapalm + ; after napalm ;now we must check tanks in range ldx NumberOfPlayers - dex + dex BurnedCheckLoop lda eXistenZ,x beq EndNurnedCheckLoop ;here the tank exist - ; calculate right edge of the fire - adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction - ; now we compare tank position with right edge of the fire (napalm) + ; calculate right edge of the fire + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction + ; now we compare tank position with right edge of the fire (napalm) lda XtankstableH,x - cmp xdraw+1 - bne @+ + cmp xdraw+1 + bne @+ lda XtankstableL,x - cmp xdraw + cmp xdraw @ - bcs TankOutOfFire - ; let's calculate left edge of the fire - sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction - bpl @+ - mwa #0 xdraw ; left screen edge + bcs TankOutOfFire + ; let's calculate left edge of the fire + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction + bpl @+ + mwa #0 xdraw ; left screen edge @ - ; now we compare tank position with left edge of the fire (napalm) + ; now we compare tank position with left edge of the fire (napalm) lda XtankstableH,x - cmp xdraw+1 - bne @+ + cmp xdraw+1 + bne @+ lda XtankstableL,x - cmp xdraw + cmp xdraw @ - bcc TankOutOfFire + bcc TankOutOfFire - ldy #40 ; energy decrease (napalm) - but if hotnapalm: - lda HotNapalmFlag - beq NotHot - ldy #80 ; energy decrease (hotnapalm) + ldy #40 ; energy decrease (napalm) - but if hotnapalm: + lda HotNapalmFlag + beq NotHot + ldy #80 ; energy decrease (hotnapalm) NotHot - ; check shields ( joke :) ) + ; check shields ( joke :) ) jsr DecreaseEnergyX TankOutOfFire EndNurnedCheckLoop dex bpl BurnedCheckLoop mva #sfx_silencer sfx_effect - rts + rts .endp ; ------------------------ .proc babyroller @@ -367,13 +367,13 @@ GoRoller ; ------------------------ .proc roller ; mva #21 ExplosionRadius - bne babyroller.GoRoller ; 1 byte saved + bne babyroller.GoRoller ; 1 byte saved ; jmp xroller .endp ; ------------------------ .proc heavyroller mva #30 ExplosionRadius - bne babyroller.GoRoller ; 1 byte saved + bne babyroller.GoRoller ; 1 byte saved ; jmp xroller .endp ; ------------------------ @@ -386,7 +386,7 @@ GoRiotBomb ; ------------------------ .proc heavyriotbomb mva #29 ExplosionRadius - bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) + bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) ; jsr CalculateExplosionRange ; jmp xriotbomb .endp @@ -394,7 +394,7 @@ GoRiotBomb .proc babydigger mva #1 diggery ; how many branches (-1) GoBabydiggerSFX - mva #sfx_digger sfx_effect + mva #sfx_digger sfx_effect mva #0 sandhogflag mva #13 DigLong bne xdigger @@ -536,7 +536,7 @@ DiggerCharacter lda random and #$06 clc - adc #char_digger__________ + adc #char_digger adc sandhogflag sta CharCode cpw xdraw #(screenwidth-6) @@ -606,13 +606,13 @@ dirtLoop ; ------------------------ .proc liquiddirt mva #sfx_liquid_dirt sfx_effect - mwa #510 FillCounter + mwa #510 FillCounter ; ----- - mwa xdraw TempXfill + mwa xdraw TempXfill RepeatFill - mwa TempXfill xdraw - jsr checkRollDirection - ; HowMuchToFall - direction + mwa TempXfill xdraw + jsr checkRollDirection + ; HowMuchToFall - direction ; $FF - we are in a hole (flying in missile direction) ; 1 - right, 2 - left adw xdraw #mountaintable tempXROLLER @@ -638,10 +638,10 @@ UpNotYet2 cmp #1 beq HowMuchToFallRight3 .NOWARN dew xdraw - lda xdraw - and xdraw+1 - cmp #$ff ; like cpw xdraw #$ffff - ;ora xdraw+1 ; like cpw xdraw #$0000 + lda xdraw + and xdraw+1 + cmp #$ff ; like cpw xdraw #$ffff + ;ora xdraw+1 ; like cpw xdraw #$0000 jne RollinContinuesLiquid beq FillNow HowMuchToFallRight3 @@ -651,29 +651,29 @@ HowMuchToFallRight3 FillNow ; finally one pixel more ldy #0 - lda HowMuchToFall - bmi FillHole - cmp #1 - beq FillLeft - inw xdraw - inw xdraw ; tricky but we must rollback xdraw in proper direction + lda HowMuchToFall + bmi FillHole + cmp #1 + beq FillLeft + inw xdraw + inw xdraw ; tricky but we must rollback xdraw in proper direction FillLeft -.nowarn dew xdraw +.nowarn dew xdraw FillHole adw xdraw #mountaintable tempXROLLER - lda (tempXROLLER),y - sta ydraw - beq ToHighFill ; if we filled all playfield (very rare but possible) - dec ydraw ; one pixel up - lda ydraw - sta (tempXROLLER),y ;mountaintable update - mva #1 color - jsr plot.MakePlot + lda (tempXROLLER),y + sta ydraw + beq ToHighFill ; if we filled all playfield (very rare but possible) + dec ydraw ; one pixel up + lda ydraw + sta (tempXROLLER),y ;mountaintable update + mva #1 color + jsr plot.MakePlot ToHighFill .nowarn dew FillCounter - lda FillCounter - ora FillCounter+1 - jne RepeatFill + lda FillCounter + ora FillCounter+1 + jne RepeatFill rts .endp ; ------------------------ @@ -688,7 +688,7 @@ ToHighFill mwa EndOfTheBarrelX xbyte mva EndOfTheBarrelY ybyte mva #0 ybyte+1 - sta LaserFlag ; turn on gravity and wind after shot :) + sta LaserFlag ; turn on gravity and wind after shot :) mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 @@ -696,29 +696,29 @@ ToHighFill mwa ybyte LaserCoordinate+6 mva #sfx_lightning sfx_effect - + mva #%10000000 drawFunction ;the above switches Draw to measuring length jsr draw mva #0 drawFunction - lsr LineLength+1 ; LineLength / 8 - ror LineLength - lsr LineLength ; max line lenght is about 380 (9 bits) - lsr LineLength - sec - lda #60 - sbc LineLength - sta yc ; laser blink counter 60-(LineLength/8) + lsr LineLength+1 ; LineLength / 8 + ror LineLength + lsr LineLength ; max line lenght is about 380 (9 bits) + lsr LineLength + sec + lda #60 + sbc LineLength + sta yc ; laser blink counter 60-(LineLength/8) @ lda yc - and #$01 - eor #$01 + and #$01 + eor #$01 sta color mwa LaserCoordinate xdraw mwa LaserCoordinate+2 ydraw mwa LaserCoordinate+4 xbyte mwa LaserCoordinate+6 ybyte - mva #sfx_lightning sfx_effect + mva #sfx_lightning sfx_effect jsr draw dec yc @@ -775,7 +775,7 @@ ExplosionLoop2 ;calculation ldx NumberOfPlayers - dex + dex DistanceCheckLoop lda eXistenZ,x jeq EndOfDistanceCheckLoop @@ -811,40 +811,40 @@ DistanceCheckLoop adc #1 :3 asl tay - ; check shields - lda ActiveDefenceWeapon,x - cmp #ind_Shield_________ ; one hit shield - beq UseShield - cmp #ind_Force_Shield___ ; shield with energy and parachute - beq UseShieldWithEnergy - cmp #ind_Heavy_Shield___ ; shield with energy - beq UseShieldWithEnergy - cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - beq UseShieldWithEnergy - cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - beq UseShieldWithEnergy + ; check shields + lda ActiveDefenceWeapon,x + cmp #ind_Shield ; one hit shield + beq UseShield + cmp #ind_Force_Shield ; shield with energy and parachute + beq UseShieldWithEnergy + cmp #ind_Heavy_Shield ; shield with energy + beq UseShieldWithEnergy + cmp #ind_Bouncy_Castle ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + beq UseShieldWithEnergy + cmp #ind_Mag_Deflector ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + beq UseShieldWithEnergy jsr DecreaseEnergyX - jmp EndOfDistanceCheckLoop + jmp EndOfDistanceCheckLoop UseShieldWithEnergy - jsr DecreaseShieldEnergyX - cpy #0 ; is necessary to reduce tenk energy ? - beq ShieldCoveredTank + jsr DecreaseShieldEnergyX + cpy #0 ; is necessary to reduce tenk energy ? + beq ShieldCoveredTank jsr DecreaseEnergyX -ShieldCoveredTank - lda ShieldEnergy,x - jne EndOfDistanceCheckLoop -ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) +ShieldCoveredTank + lda ShieldEnergy,x + jne EndOfDistanceCheckLoop +ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield - lda TankNr - pha ; store TankNr - stx TankNr ; store X in TankNr :) - jsr ClearTankNr ; now erase tank with shield (to erase shield) - lda #0 - sta ActiveDefenceWeapon,x ; deactivate defense weapons - jsr PutTankNr ; draw tank without shield - ldx TankNr ; restore X value :) - pla - sta TankNr ; restore TankNr value :) + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr ClearTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate defense weapons + jsr PutTankNr ; draw tank without shield + ldx TankNr ; restore X value :) + pla + sta TankNr ; restore TankNr value :) TankIsNotWithinTheRange EndOfDistanceCheckLoop dex @@ -872,8 +872,8 @@ rbombLoop .proc xroller ; ; now collisions are detected with modified draw routine ; therefore YDRAW value must be taken from mountaintable - jsr checkRollDirection - ; HowMuchToFall - direction + jsr checkRollDirection + ; HowMuchToFall - direction ; $FF - we are in a hole (flying in missile direction) ; 1 - right, 2 - left Rollin @@ -891,7 +891,7 @@ RollinContinues ldy #0 lda (tempXROLLER),y sta ydraw - sty ydraw+1 + sty ydraw+1 beq ExplodeNow cmp HeightRol beq UpNotYet @@ -902,7 +902,7 @@ UpNotYet sbc #1 sta ydraw ;check tank collision prior to PLOT - sty HitFlag ; set to 0 + sty HitFlag ; set to 0 jsr CheckCollisionWithTank @@ -915,8 +915,8 @@ UpNotYet beq HowMuchToFallRight2 .nowarn dew xdraw lda xdraw - ora xdraw+1 - jne RollinContinues ; like cpw xdraw #0 + ora xdraw+1 + jne RollinContinues ; like cpw xdraw #0 beq ExplodeNow HowMuchToFallRight2 inw xdraw @@ -951,7 +951,7 @@ ExplodeNow adw xdraw #mountaintable tempXROLLER lda (tempXROLLER),y sta ydraw - sty ydraw+1 + sty ydraw+1 lda vx+3 ; if horizontal velocity is negative then change the direction @@ -967,19 +967,19 @@ PositiveVelocity mva #$ff HowMuchToFall mva ydraw HeightRol SeekLeft - cpw tempXROLLER #mountaintable - beq GoRightNow ; "bounce" if we have on left end + cpw tempXROLLER #mountaintable + beq GoRightNow ; "bounce" if we have on left end .nowarn dew tempXROLLER lda (tempXROLLER),y ;fukk! beware of Y value cmp HeightRol HowMuchToFallLeft bcs GoRightNow - mva #1 HowMuchToFall + mva #1 HowMuchToFall GoRightNow adw xdraw #mountaintable tempXROLLER SeekRight - cpw tempXROLLER #(mountaintable+screenwidth) - beq HowMuchToFallKnown ; "stop" if we have on left end + cpw tempXROLLER #(mountaintable+screenwidth) + beq HowMuchToFallKnown ; "stop" if we have on left end inw tempXROLLER lda (tempXROLLER),y cmp HeightRol @@ -999,7 +999,7 @@ HowMuchToFallKnown adc goleft sta HowMuchToFall DirectionChecked - rts + rts .endp ; -------------------------------------------------- @@ -1080,15 +1080,15 @@ ContinueToCheckMaxForce2 sta ForceTableL,x @ jsr PutTankNameOnScreen -; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen jsr PutTankNr jsr WaitOneFrame ; best after drawing a tank - bit TestFlightFlag - bpl @+ - jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation + bit TestFlightFlag + bpl @+ + jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation @ ;keyboard reading ; KBCODE keeps code of last keybi @@ -1098,18 +1098,18 @@ ContinueToCheckMaxForce2 ; $f3 - shift+key notpressed - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - spl:rts ; exit if pressed 'Exit keys' + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + spl:rts ; exit if pressed 'Exit keys' - ldx TankNr ; for optimize - ; Select and Option - lda CONSOL - tay - and #%00000100 - beq callActivation ; Option key - tya - and #%00000010 - jeq pressedTAB ; Select key + ldx TankNr ; for optimize + ; Select and Option + lda CONSOL + tay + and #%00000100 + beq callActivation ; Option key + tya + and #%00000010 + jeq pressedTAB ; Select key lda SKSTAT cmp #$ff jeq checkJoy @@ -1124,31 +1124,31 @@ notpressed callActivation ; Hide all tanks - after inventory they may have other shapes jsr ClearTanks - jsr DefensivesActivate - jmp afterInventory + jsr DefensivesActivate + jmp afterInventory -@ +@ cmp #@kbcode._I ; $0d ; I bne @+ callInventory ; Hide all tanks - after inventory they may have other shapes jsr ClearTanks - ; + ; mva #$ff isInventory jsr Purchase afterInventory - jsr MakeDarkScreen + jsr MakeDarkScreen jsr DisplayStatus jsr SetMainScreen jsr DrawTanks ;jsr WaitOneFrame ; not necessary - bit LazyFlag - bvc NoLazy - jsr LazyBoys + bit LazyFlag + bvc NoLazy + jsr LazyBoys NoLazy - bit SpyHardFlag - bpl NoSpyHard - jsr SpyHard + bit SpyHardFlag + bpl NoSpyHard + jsr SpyHard NoSpyHard RmtSong song_ingame mva #0 escFlag @@ -1162,15 +1162,15 @@ NoSpyHard jeq CTRLPressedTAB jumpFromStick - .IF TARGET = 800 - cmp #$80|17 ; Ctrl+Help - bne NoVdebugSwitch - lda Vdebug - eor #$ff - sta Vdebug - jmp ReleaseAndLoop -NoVdebugSwitch - .ENDIF + .IF TARGET = 800 + cmp #$80|17 ; Ctrl+Help + bne NoVdebugSwitch + lda Vdebug + eor #$ff + sta Vdebug + jmp ReleaseAndLoop +NoVdebugSwitch + .ENDIF and #$3f ;CTRL and SHIFT ellimination cmp #@kbcode._up ; $e jeq pressedUp @@ -1188,14 +1188,14 @@ NoVdebugSwitch jeq pressedM cmp #@kbcode._S ; $3e ; S jeq pressedS - .IF TARGET = 800 - cmp #61 ; G - bne EndKeys - jsr SelectNextGradient.NotWind - jmp ReleaseAndLoop - .ENDIF + .IF TARGET = 800 + cmp #61 ; G + bne EndKeys + jsr SelectNextGradient.NotWind + jmp ReleaseAndLoop + .ENDIF EndKeys - jmp notpressed + jmp notpressed checkJoy ;------------JOY------------- ;happy happy joy joy @@ -1205,7 +1205,7 @@ checkJoy cmp #$0f beq notpressedJoy tay - mva #0 ATRACT ; reset atract mode + mva #0 ATRACT ; reset atract mode lda joyToKeyTable,y jmp jumpFromStick notpressedJoy @@ -1224,11 +1224,11 @@ pressedUp ;force increaseeee! - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized inc ForceTableL,x bne CheckingMaxForce inc ForceTableH,x - + CheckingMaxForce mva #sfx_set_power_1 sfx_effect @@ -1249,7 +1249,7 @@ FurtherCheckMaxForce jmp BeforeFire CTRLPressedUp - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized lda ForceTableL,x clc adc #10 @@ -1267,7 +1267,7 @@ pressedDown mva #sfx_set_power_1 sfx_effect - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized dec ForceTableL,x lda ForceTableL,x cmp #$ff @@ -1284,7 +1284,7 @@ ForceGoesZero CTRLPressedDown mva #sfx_set_power_1 sfx_effect - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized sec lda ForceTableL,x sbc #10 @@ -1295,15 +1295,15 @@ CTRLPressedDown jmp BeforeFire pressedRight - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedRight mva #sfx_set_power_2 sfx_effect - mva #1 Erase - jsr DrawTankNr.BarrelChange + mva #1 Erase + jsr DrawTankNr.BarrelChange dec:lda AngleTable,x cmp #255 ; -1 jne BeforeFire @@ -1312,10 +1312,10 @@ pressedRight jmp BeforeFire CTRLPressedRight - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized mva #sfx_set_power_2 sfx_effect - mva #1 Erase - jsr DrawTankNr.BarrelChange + mva #1 Erase + jsr DrawTankNr.BarrelChange lda AngleTable,x sec sbc #4 @@ -1328,15 +1328,15 @@ CTRLPressedRight pressedLeft - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized lda pressTimer spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedLeft mva #sfx_set_power_2 sfx_effect - mva #1 Erase - jsr DrawTankNr.BarrelChange + mva #1 Erase + jsr DrawTankNr.BarrelChange INC AngleTable,x lda AngleTable,x cmp #180 @@ -1346,10 +1346,10 @@ pressedLeft jmp BeforeFire CTRLPressedLeft - ;ldx TankNr ; optimized + ;ldx TankNr ; optimized mva #sfx_set_power_2 sfx_effect - mva #1 Erase - jsr DrawTankNr.BarrelChange + mva #1 Erase + jsr DrawTankNr.BarrelChange lda AngleTable,x clc adc #4 @@ -1362,14 +1362,14 @@ CTRLPressedLeft pressedTAB mva #sfx_purchase sfx_effect - ;ldx TankNr ; optimized - lda ActiveWeapon,x - cmp #last_offensive_____ ; the last possible offensive weapon - bne ?notlasttofirst - lda #first_offensive____ ; #0 + ;ldx TankNr ; optimized + lda ActiveWeapon,x + cmp #last_offensive ; the last possible offensive weapon + bne ?notlasttofirst + lda #first_offensive ; #0 sta ActiveWeapon,x - beq @+ ; allways = 0 -?notlasttofirst + beq @+ ; allways = 0 +?notlasttofirst inc ActiveWeapon,x @ lda ActiveWeapon,x @@ -1379,13 +1379,13 @@ pressedTAB CTRLpressedTAB mva #sfx_purchase sfx_effect - ;ldx TankNr ; optimized - lda ActiveWeapon,x - cmp #first_offensive____ ; #0 - bne ?notfirsttolast - lda #last_offensive_____ ; the last possible offensive weapon + ;ldx TankNr ; optimized + lda ActiveWeapon,x + cmp #first_offensive ; #0 + bne ?notfirsttolast + lda #last_offensive ; the last possible offensive weapon sta ActiveWeapon,x - bne @+ ; allways <> 0 + bne @+ ; allways <> 0 ?notfirsttolast dec ActiveWeapon,x @ @@ -1412,8 +1412,8 @@ ReleaseAndLoop pressedSpace ;================================= ;we shoot here!!! - lda #0 - sta ATRACT ; reset atract mode + lda #0 + sta ATRACT ; reset atract mode sta pressTimer ; reset jsr WaitForKeyRelease.StillWait lda pressTimer @@ -1433,7 +1433,7 @@ fire ;with much more separate blocks, but you know - ;- do not touch it if it works... - mva #0 TestFlightFlag + mva #0 TestFlightFlag ;the latest addition to this routine is ;displaying offensive texts! @@ -1447,26 +1447,26 @@ RandomizeOffensiveText ldy TankNr mva #$ff plot4x4color jsr DisplayOffensiveTextNr - + AfterOffensiveText - mva #0 LaserFlag ; $ff - Laser - ldx TankNr - lda ActiveWeapon,x - cmp #ind_Laser__________ ; laser - bne NotStrongShoot - ; Laser: (not)very strong - invisible - shot for laser beam end coordinates - bit Vdebug - bmi @+ - mva #0 color -@ lda #1 - sta Force - sta Force+1 - mva #$ff LaserFlag ; $ff - Laser - bne AfterStrongShoot + mva #0 LaserFlag ; $ff - Laser + ldx TankNr + lda ActiveWeapon,x + cmp #ind_Laser ; laser + bne NotStrongShoot + ; Laser: (not)very strong - invisible - shot for laser beam end coordinates + bit Vdebug + bmi @+ + mva #0 color +@ lda #1 + sta Force + sta Force+1 + mva #$ff LaserFlag ; $ff - Laser + bne AfterStrongShoot NotStrongShoot - jsr Table2Force - bit TestFlightFlag - bmi AfterStrongShoot + jsr Table2Force + bit TestFlightFlag + bmi AfterStrongShoot mva #sfx_shoot sfx_effect AfterStrongShoot lda AngleTable,x @@ -1477,29 +1477,29 @@ AfterStrongShoot ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - - mwa EndOfTheBarrelX xtraj+1 - mva EndOfTheBarrely ytraj+1 + + mwa EndOfTheBarrelX xtraj+1 + mva EndOfTheBarrely ytraj+1 lda #0 sta Force+2 - sta ytraj+2 + sta ytraj+2 sta xtraj sta ytraj - ; checking if the shot is underground (no Flight but Hit :) ) - tay ; A=0 ! - adw xtraj+1 #mountaintable temp + ; checking if the shot is underground (no Flight but Hit :) ) + tay ; A=0 ! + adw xtraj+1 #mountaintable temp lda ytraj+1 - cmp (temp),y ; check collision with mountains + cmp (temp),y ; check collision with mountains bcs ShotUnderGround jsr Flight mva #1 color rts ShotUnderGround - mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? - mwa ytraj+1 ydraw - mva #$ff HitFlag - rts + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? + mwa ytraj+1 ydraw + mva #$ff HitFlag + rts .endp ;-------------------------------------------------- @@ -1524,18 +1524,18 @@ ShotUnderGround ; smoke tracer :) ldy #0 - bit TestFlightFlag ; if test flight for AI or Lazy Darwin - bmi noSmokeTracer ; no Smoke Tracer display + bit TestFlightFlag ; if test flight for AI or Lazy Darwin + bmi noSmokeTracer ; no Smoke Tracer display ldx TankNr lda ActiveWeapon,x - cmp #ind_Smoke_Tracer___ ; Smoke tracer - bne noSmokeTracer - iny + cmp #ind_Smoke_Tracer ; Smoke tracer + bne noSmokeTracer + iny noSmokeTracer - sty SmokeTracerFlag + sty SmokeTracerFlag RepeatIfSmokeTracer -RepeatFlight +RepeatFlight mwa ytraj+1 Ytrajold+1 mwa xtraj+1 Xtrajold+1 mva #%01000000 drawFunction @@ -1687,8 +1687,8 @@ Loopi sbc vy+3 sta ytraj+2 - bit LaserFlag ; no gravity if Laser - bmi NoGravity + bit LaserFlag ; no gravity if Laser + bmi NoGravity ;vy=vy-g (again without least significant byte of vy) sec lda vy+1 @@ -1703,11 +1703,11 @@ Loopi bpl StillUp ; where we know that the bullet starts to fall down ; we check if it is MIRV and if so, jump to MIRV routine - bit TestFlightFlag - bmi NoTestForMIRV + bit TestFlightFlag + bmi NoTestForMIRV ldx TankNr lda ActiveWeapon,x - cmp #ind_MIRV___________ ; MIRV + cmp #ind_MIRV ; MIRV jeq MIRVdownLoop NoTestForMIRV NoGravity @@ -1724,8 +1724,8 @@ StillUp adc vx+3 sta xtraj+2 - bit LaserFlag ; no wind if Laser - bmi NoWind + bit LaserFlag ; no wind if Laser + bmi NoWind clc .rept 4 lda vx+# @@ -1739,51 +1739,51 @@ NoWind mwa ytraj+1 ybyte jsr draw ;key - bit LaserFlag - bmi LaserNoWalls - ; Check for walls - jsr MakeWalls - ; + bit LaserFlag + bmi LaserNoWalls + ; Check for walls + jsr MakeWalls + ; LaserNoWalls mwa xtraj+1 XtrajOld+1 mwa ytraj+1 YtrajOld+1 - bit TestFlightFlag - bmi nowait - bit LaserFlag ; faster laser prepare - bpl nolaserwait - bit Vdebug - bpl nowait + bit TestFlightFlag + bmi nowait + bit LaserFlag ; faster laser prepare + bpl nolaserwait + bit Vdebug + bpl nowait nolaserwait lda color - beq nonowait ; smoke tracer erases slowly - lda tracerflag - bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) + beq nonowait ; smoke tracer erases slowly + lda tracerflag + bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) nonowait jsr shellDelay - ; - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - spl:rts ; exit if pressed 'Exit keys' - ldx TankNr + ; + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + spl:rts ; exit if pressed 'Exit keys' + ldx TankNr ; nowait lda HitFlag bne Hit - ; --- only for Laser - bit LaserFlag + ; --- only for Laser + bit LaserFlag bpl NoCheckEdgesForLaser - ; If laser fires, edges of the screen finish "flying" and laser hits. - lda ytraj+2 - bmi LaserHitEdge - cpw xtraj+1 #screenwidth ;+1 - bcc LaserNoHitEdge + ; If laser fires, edges of the screen finish "flying" and laser hits. + lda ytraj+2 + bmi LaserHitEdge + cpw xtraj+1 #screenwidth ;+1 + bcc LaserNoHitEdge LaserHitEdge mwa xdraw XHit mwa ydraw YHit - mva #$ff HitFlag ; screen edgs like ground (only for Laser) - jmp EndOfFlight + mva #$ff HitFlag ; screen edgs like ground (only for Laser) + jmp EndOfFlight LaserNoHitEdge - ; ------------------ + ; ------------------ NoCheckEdgesForLaser cpw ytraj+1 #screenheight+1 @@ -1797,17 +1797,17 @@ SkipCollisionCheck mwa xtraj+1 xdraw mwa ytraj+1 ydraw - - bit TestFlightFlag - bvc NoTestFlight - bit Vdebug - bpl NoUnplot - jsr WaitOneFrame ; visualize AI targeting - jmp YesUnPlot + + bit TestFlightFlag + bvc NoTestFlight + bit Vdebug + bpl NoUnplot + jsr WaitOneFrame ; visualize AI targeting + jmp YesUnPlot NoTestFlight - lda tracerflag + lda tracerflag bne NoUnPlot - + YesUnPlot jsr UnPlot @@ -1818,8 +1818,8 @@ NoUnPlot Hit mwa XHit xdraw mwa YHit ydraw - bit TestFlightFlag - bvs EndOfFlight + bit TestFlightFlag + bvs EndOfFlight jsr unPlot EndOfFlight mwa xdraw xcircle ; we must store for a little while @@ -1830,133 +1830,133 @@ EndOfFlight mwa xcircle xdraw mwa ycircle ydraw - ldy SmokeTracerFlag - beq EndOfFlight2 - dey - sty SmokeTracerFlag - jmp SecondFlight + ldy SmokeTracerFlag + beq EndOfFlight2 + dey + sty SmokeTracerFlag + jmp SecondFlight EndOfFlight2 - mva #0 tracerflag ; don't know why - - bit TestFlightFlag - jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check - ; and now check for defensive-aggressive weapon - lda HitFlag - jeq NoHitAtEndOfFight ; RTS only !!! - jmi NoTankHitAtEndOfFight - ; tank hit - increase direct hits points - ldx TankNr - inx - cpx HitFlag ; we don't count suicides :) - beq @+ - dex - inc DirectHits,x -; bne @+ ; one byte enough -; inc DirectHitsH,x + mva #0 tracerflag ; don't know why + + bit TestFlightFlag + jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check + ; and now check for defensive-aggressive weapon + lda HitFlag + jeq NoHitAtEndOfFight ; RTS only !!! + jmi NoTankHitAtEndOfFight + ; tank hit - increase direct hits points + ldx TankNr + inx + cpx HitFlag ; we don't count suicides :) + beq @+ + dex + inc DirectHits,x +; bne @+ ; one byte enough +; inc DirectHitsH,x @ - ; tank hit - check defensive weapon of this tank - tax - dex ; index of hitted tank in X - ldy TankNr - lda ActiveWeapon,y - cmp #ind_Tracer_________ ; defence not fire by tracers - beq JNoDefence - cmp #ind_Smoke_Tracer___ - beq JNoDefence - cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser - beq JNoDefence - lda ActiveDefenceWeapon,x - cmp #ind_Bouncy_Castle__ ; Auto Defence - jeq BouncyCastle - cmp #ind_Mag_Deflector__ ; Mag Deflector - beq MagDeflector + ; tank hit - check defensive weapon of this tank + tax + dex ; index of hitted tank in X + ldy TankNr + lda ActiveWeapon,y + cmp #ind_Tracer ; defence not fire by tracers + beq JNoDefence + cmp #ind_Smoke_Tracer + beq JNoDefence + cmp #ind_Laser ; Bouncy and Mag not fire by Laser + beq JNoDefence + lda ActiveDefenceWeapon,x + cmp #ind_Bouncy_Castle ; Auto Defence + jeq BouncyCastle + cmp #ind_Mag_Deflector ; Mag Deflector + beq MagDeflector JNoDefence - jmp NoDefence + jmp NoDefence MagDeflector - ; now run defensive-aggressive weapon - Mag Deflector! - ; get tank position - clc - lda xtankstableL,x - adc #$04 ; almost in tak center :) - sta XHit - lda xtankstableH,x - adc #$00 - sta XHit+1 - lda #$ff ; change to ground hit (we hope) - sta HitFlag - bit random ; left or right deflection ? - bpl RightDeflection + ; now run defensive-aggressive weapon - Mag Deflector! + ; get tank position + clc + lda xtankstableL,x + adc #$04 ; almost in tak center :) + sta XHit + lda xtankstableH,x + adc #$00 + sta XHit+1 + lda #$ff ; change to ground hit (we hope) + sta HitFlag + bit random ; left or right deflection ? + bpl RightDeflection LeftDeflection - sbw XHit #18 ; 18 pixels to left and explode... - bit XHit+1 ; if off-screen ... - bpl EndOfMagDeflector ; hit of course but we need RTS - adw XHit #36 ; change to right :) - jmp EndOfMagDeflector + sbw XHit #18 ; 18 pixels to left and explode... + bit XHit+1 ; if off-screen ... + bpl EndOfMagDeflector ; hit of course but we need RTS + adw XHit #36 ; change to right :) + jmp EndOfMagDeflector RightDeflection - adw XHit #18 ; 18 pixels to right and explode... - cpw XHit screenwidth ; if off-screen ... - bcs EndOfMagDeflector ; hit of course but we need RTS - sbw XHit #36 ; change to left + adw XHit #18 ; 18 pixels to right and explode... + cpw XHit screenwidth ; if off-screen ... + bcs EndOfMagDeflector ; hit of course but we need RTS + sbw XHit #36 ; change to left EndOfMagDeflector - lda TankNr - pha ; store TankNr - stx TankNr ; store X in TankNr :) - jsr ClearTankNr ; now erase tank with shield (to erase shield) - lda #0 - sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon - sta ShieldEnergy,x - jsr PutTankNr ; draw tank without shield - ldx TankNr ; restore X value :) - pla - sta TankNr ; restore TankNr value :) - mwa XHit xdraw ; why? !!! + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr ClearTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon + sta ShieldEnergy,x + jsr PutTankNr ; draw tank without shield + ldx TankNr ; restore X value :) + pla + sta TankNr ; restore TankNr value :) + mwa XHit xdraw ; why? !!! NoTankHitAtEndOfFight NoHitAtEndOfFight NoDefence - lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 - rts ; END !!! + lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 + rts ; END !!! BouncyCastle - ; now in Y we have number of of the attacking player (TankNr) ! - lda ActiveWeapon,y - ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down - cmp #ind_Funky_Bomb_____ - bne @+ - jsr SetFullScreenSoilRange + ; now in Y we have number of of the attacking player (TankNr) ! + lda ActiveWeapon,y + ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down + cmp #ind_Funky_Bomb + bne @+ + jsr SetFullScreenSoilRange @ mva #sfx_shield_on sfx_effect - ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! - lda TankNr - pha ; store TankNr - stx TankNr ; store X in TankNr :) - jsr ClearTankNr ; now erase tank with shield (to erase shield) - lda #0 - sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon - sta ShieldEnergy,x - sta xtraj ; prepare coordinates + ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! + lda TankNr + pha ; store TankNr + stx TankNr ; store X in TankNr :) + jsr ClearTankNr ; now erase tank with shield (to erase shield) + lda #0 + sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon + sta ShieldEnergy,x + sta xtraj ; prepare coordinates sta ytraj -; sta xtraj+2 -; sta ytraj+2 - jsr PutTankNr ; draw tank without shield -; ldx TankNr ; restore X value :) ... but we don't need X now .. - pla - sta TankNr ; restore TankNr value :) - sec - lda #180 - sbc LeapFrogAngle - sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) - lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 - mwa XHit xtraj+1 - sbw YHit #5 ytraj+1 - mva #1 color - jmp RepeatFlight ; and repeat Fight +; sta xtraj+2 +; sta ytraj+2 + jsr PutTankNr ; draw tank without shield +; ldx TankNr ; restore X value :) ... but we don't need X now .. + pla + sta TankNr ; restore TankNr value :) + sec + lda #180 + sbc LeapFrogAngle + sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) + lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 + mwa XHit xtraj+1 + sbw YHit #5 ytraj+1 + mva #1 color + jmp RepeatFlight ; and repeat Fight .endp .proc SecondFlight ; ---------------- copied code fragment from before firing. not too elegant. ; ---------------- get fire parameters again - ldx TankNr - jsr Table2Force + ldx TankNr + jsr Table2Force lda AngleTable,x sta Angle @@ -1965,22 +1965,22 @@ BouncyCastle ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - - mwa EndOfTheBarrelX xtraj+1 - mva EndOfTheBarrely ytraj+1 + + mwa EndOfTheBarrelX xtraj+1 + mva EndOfTheBarrely ytraj+1 lda #0 sta Force+2 - sta ytraj+2 + sta ytraj+2 sta xtraj sta ytraj - sta color + sta color - + ldy #100 ; ??? - mva #1 tracerflag ; I do not know (I mean I think I know ;) ) - ; 10 years later - I do not know!!! + mva #1 tracerflag ; I do not know (I mean I think I know ;) ) + ; 10 years later - I do not know!!! ; 20 years later - still do not know :] - jmp Flight.RepeatIfSmokeTracer + jmp Flight.RepeatIfSmokeTracer .endp ; ------------------------------------------------- @@ -2057,18 +2057,18 @@ MIRVcopyParameters sta vx03+4 ; clearing ranges of soil down registers - jsr ClearScreenSoilRange + jsr ClearScreenSoilRange ldx #$FF ; it will turn 0 in a moment anyway stx MirvMissileCounter mrLoopi - ldx MirvMissileCounter - inx - cpx #5 - bne @+ - ldx #0 -@ stx MirvMissileCounter - + ldx MirvMissileCounter + inx + cpx #5 + bne @+ + ldx #0 +@ stx MirvMissileCounter + ; Y changes only for bullet number 0 ; because rest of the bullets have the same Y (height) @@ -2099,14 +2099,14 @@ mrLoopi sta vy+3 jsr ShellDelay - ; - phx - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys - bpl ExitnotPressed - plx - rts ; exit if pressed 'Exit keys' + ; + phx + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + bpl ExitnotPressed + plx + rts ; exit if pressed 'Exit keys' ExitnotPressed - plx + plx ; MIRVdoNotChangeY @@ -2134,63 +2134,63 @@ MIRVdoNotChangeY sta vx+# .endr - ; rules for a falling MIRV bulets. - ; if Y is negative and any X (bullet over the screen) - continue flying - ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying - ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision - ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit - ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) - - ; check bullet position and set flags: - ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) - ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) - lda #$00 - sta XposFlag - sta YposFlag - lda ytraj+2 ; Y high byte - bpl @+ - mva #%10000000 YposFlag ; bullet over the screen (Y) - bmi MIRVsetXflag + ; rules for a falling MIRV bulets. + ; if Y is negative and any X (bullet over the screen) - continue flying + ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying + ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision + ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit + ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) + + ; check bullet position and set flags: + ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) + ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) + lda #$00 + sta XposFlag + sta YposFlag + lda ytraj+2 ; Y high byte + bpl @+ + mva #%10000000 YposFlag ; bullet over the screen (Y) + bmi MIRVsetXflag @ - lda ytraj+1 ; Y low byte - cmp #screenheight - bcc MIRVsetXflag ; bullet on screen (Y) - mva #%01000000 YposFlag ; bullet under the screen (Y) + lda ytraj+1 ; Y low byte + cmp #screenheight + bcc MIRVsetXflag ; bullet on screen (Y) + mva #%01000000 YposFlag ; bullet under the screen (Y) MIRVsetXflag - lda xtraj02,x ; X high byte + lda xtraj02,x ; X high byte cmp #>screenwidth - bne @+ - lda xtraj01,x ; X low byte + bne @+ + lda xtraj01,x ; X low byte cmp #mountaintable sta temp+1 lda (temp),y - sec - sbc #1 + sec + sbc #1 sta ydraw sty ydraw+1 ;we know that y=0 jsr missile ; explode .... @@ -2305,61 +2305,61 @@ MIRValreadyAll ; temporary removing tanks from the screen (otherwise they will fall down with soil) jsr SoilDown2 - mva #$ff HitFlag ; but why ?? + mva #$ff HitFlag ; but why ?? rts .endp ; ------------------------------------------------- .proc MakeWalls ; ------------------------------------------------- - bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy - bpl WrapAndNone - bvc MakeBump - ; top bounce - bit ytraj+2 - bpl NoOnTop - bit vy+3 - bmi FlyingDown - sec - .rept 4 + bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + bpl WrapAndNone + bvc MakeBump + ; top bounce + bit ytraj+2 + bpl NoOnTop + bit vy+3 + bmi FlyingDown + sec + .rept 4 lda #$00 sbc vy+# sta vy+# - .endr + .endr FlyingDown NoOnTop MakeBump - cpw xtraj+1 #screenwidth - bcc OnScreen - ; inverse vx (bouncing wall) - sec - .rept 4 + cpw xtraj+1 #screenwidth + bcc OnScreen + ; inverse vx (bouncing wall) + sec + .rept 4 lda #$00 sbc vx+# sta vx+# .endr - ; and bouce feapfrog :) - sec - lda #180 - sbc LeapFrogAngle - sta LeapFrogAngle ; swap angle (LeapFrogAngle) - inc FunkyWallFlag - rts + ; and bouce feapfrog :) + sec + lda #180 + sbc LeapFrogAngle + sta LeapFrogAngle ; swap angle (LeapFrogAngle) + inc FunkyWallFlag + rts WrapAndNone - bvc NoWall - cpw xtraj+1 #screenwidth - bcc OnScreen - ; (wrapping wall) - inc FunkyWallFlag - bit xtraj+2 - bmi LeftWrap + bvc NoWall + cpw xtraj+1 #screenwidth + bcc OnScreen + ; (wrapping wall) + inc FunkyWallFlag + bit xtraj+2 + bmi LeftWrap RightWrap - sbw xtraj+1 #screenwidth - rts + sbw xtraj+1 #screenwidth + rts LeftWrap - adw xtraj+1 #screenwidth + adw xtraj+1 #screenwidth OnScreen NoWall - rts + rts .endp ; ------------------------------------------------- .proc WhiteFlag @@ -2368,20 +2368,20 @@ NoWall ; and replaces Shoot and Flight routines ; X and TankNr - index of shooting tank ; ------------------------------------------------- - mva #sfx_death_begin sfx_effect - jsr FlashTank ; first we flash tank - jsr ClearTankNr ; and erase tank - lda #0 - sta Erase - ldx TankNr - sta Energy,x ; clear tank energy - sta eXistenZ,x ; erase from existence - sta LASTeXistenZ,x ; to prevent explosion - sta ActiveDefenceWeapon,x ; deactivate White Flag - jsr PMoutofScreen - jsr drawtanks ; for restore PM + mva #sfx_death_begin sfx_effect + jsr FlashTank ; first we flash tank + jsr ClearTankNr ; and erase tank + lda #0 + sta Erase + ldx TankNr + sta Energy,x ; clear tank energy + sta eXistenZ,x ; erase from existence + sta LASTeXistenZ,x ; to prevent explosion + sta ActiveDefenceWeapon,x ; deactivate White Flag + jsr PMoutofScreen + jsr drawtanks ; for restore PM mva #sfx_silencer sfx_effect - rts + rts .endp ; ------------------------------------------------- @@ -2390,92 +2390,92 @@ NoWall ; This routine is run from inside of the main loop ; X - index of tank ; ------------------------------------------------- - jsr PrepareAIShoot.WepTableToTemp - jsr UseBattery - jsr TosserDefensives - rts + jsr PrepareAIShoot.WepTableToTemp + jsr UseBattery + jsr TosserDefensives + rts .endp ; ------------------------------------------------- .proc SpyHard ; ------------------------------------------------- - mvx TankNr TargetTankNr ; save + mvx TankNr TargetTankNr ; save RepeatSpy - mvx #0 TankNr - stx SpyHardFlag ; 0 - optimization + mvx #0 TankNr + stx SpyHardFlag ; 0 - optimization CheckNextTankSH - cpx TargetTankNr - beq ThisTankItsMe - lda Energy,x ; only active players + cpx TargetTankNr + beq ThisTankItsMe + lda Energy,x ; only active players beq ThisTankIsDead - ; run SpyHard for tank in X - jsr DisplaySpyInfo - jsr FlashTank -@ jsr GetKey + ; run SpyHard for tank in X + jsr DisplaySpyInfo + jsr FlashTank +@ jsr GetKey bit escFlag bmi SpyHardEnd - cmp #@kbcode._space ; $21 ; Space - beq SpyHardEnd - cmp #@kbcode._ret ; Return key (5200 - fire) - beq SpyHardEnd + cmp #@kbcode._space ; $21 ; Space + beq SpyHardEnd + cmp #@kbcode._ret ; Return key (5200 - fire) + beq SpyHardEnd cmp #@kbcode._left ; $6 - beq SelectNextTank + beq SelectNextTank cmp #@kbcode._right ; $07 ; cursor right - bne @- + bne @- ThisTankIsDead ThisTankItsMe SelectNextTank inc TankNr - ldx TankNr - cpx NumberOfPlayers + ldx TankNr + cpx NumberOfPlayers bne CheckNextTankSH - beq RepeatSpy + beq RepeatSpy SpyHardEnd - mvx TargetTankNr TankNr ; restore - jsr DisplaySpyInfo - rts + mvx TargetTankNr TankNr ; restore + jsr DisplaySpyInfo + rts .endp .proc DisplaySpyInfo lda TankStatusColoursTable,x sta COLOR2 ; set color of status line jsr PutTankNameOnScreen -; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - rts +; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + rts .endp ; ------------------------------------------------- .proc LazyBoys ; ------------------------------------------------- mva #sfx_lazy_boys sfx_effect - jsr PrepareAIShoot - ldx TankNr - bit LazyFlag - bmi GoDarwin - jsr FindBestTarget2 ; find nearest tank neighbour - jsr LazyAim - lda #%00000000 ; set "visual aiming" off - beq EndLazy + jsr PrepareAIShoot + ldx TankNr + bit LazyFlag + bmi GoDarwin + jsr FindBestTarget2 ; find nearest tank neighbour + jsr LazyAim + lda #%00000000 ; set "visual aiming" off + beq EndLazy GoDarwin - jsr FindBestTarget3 ; find target with lowest energy - jsr LazyAim - lda #%10000000 + jsr FindBestTarget3 ; find target with lowest energy + jsr LazyAim + lda #%10000000 EndLazy - sta TestFlightFlag ; set "visual aiming" on - mva #0 LazyFlag - rts + sta TestFlightFlag ; set "visual aiming" on + mva #0 LazyFlag + rts .endp .proc LazyAim - ; aiming proc for Lazy ... weapons - ; as proc for memory optimisation - ; Y - target tan nr - ; A - target direction - sty TargetTankNr - ; aiming - jsr TakeAim ; direction still in A (0 - left, >0 - right) - lda Force - sta ForceTableL,x - lda Force+1 - sta ForceTableH,x - jsr MoveBarrelToNewPosition - rts + ; aiming proc for Lazy ... weapons + ; as proc for memory optimisation + ; Y - target tan nr + ; A - target direction + sty TargetTankNr + ; aiming + jsr TakeAim ; direction still in A (0 - left, >0 - right) + lda Force + sta ForceTableL,x + lda Force+1 + sta ForceTableH,x + jsr MoveBarrelToNewPosition + rts .endp ; ------------------------------------------------- .proc TankFlying @@ -2484,100 +2484,100 @@ EndLazy ; and replaces Shoot and Flight routines ; X and TankNr - index of flying tank ; ------------------------------------------------- - ; Let's designate the flight altitude. - jsr CheckMaxMountain - cmp #(12+18) ; tank with shield (12) and max alt (18) check - bcc IsToHigh - sbc #12 ; tank with shield high correction - bne StoreMaxAlt -IsToHigh - lda #18 + ; Let's designate the flight altitude. + jsr CheckMaxMountain + cmp #(12+18) ; tank with shield (12) and max alt (18) check + bcc IsToHigh + sbc #12 ; tank with shield high correction + bne StoreMaxAlt +IsToHigh + lda #18 StoreMaxAlt - sta FloatingAlt -; mva #18 FloatingAlt ; for testing + sta FloatingAlt +; mva #18 FloatingAlt ; for testing mva #sfx_plasma_2_2 sfx_effect - ; display text 4x4 - fuel full + ; display text 4x4 - fuel full mwa #hoverFull LineAddress4x4 mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - mva #hoverFullEnd-hoverFull-1 fx ; length - sec - lda FloatingAlt - sbc #12 + mva #hoverFullEnd-hoverFull fx ; length + sec + lda FloatingAlt + sbc #12 sta LineYdraw jsr TypeLine4x4.variableLength - ldx TankNr - - ; TankNr in X reg. - ; now animate Up - mva #0 modify ; it's a counter + ldx TankNr + + ; TankNr in X reg. + ; now animate Up + mva #0 modify ; it's a counter TankGoUp - lda ytankstable,x - cmp FloatingAlt ; Floating altitude - bcc ReachSky - ; first erase old tank position + lda ytankstable,x + cmp FloatingAlt ; Floating altitude + bcc ReachSky + ; first erase old tank position jsr ClearTankNr - lda modify - cmp #5 - bcc NoEngineClear - mva #0 color - jsr DrawTankRocketEngine + lda modify + cmp #5 + bcc NoEngineClear + mva #0 color + jsr DrawTankRocketEngine NoEngineClear - dec ytankstable,x - inc modify - ; then draw tank on new position + dec ytankstable,x + inc modify + ; then draw tank on new position jsr PutTankNr - lda modify - cmp #5 - bcc NoEngine - lda random - and #%00000001 - sta color - jsr DrawTankRocketEngine + lda modify + cmp #5 + bcc NoEngine + lda random + and #%00000001 + sta color + jsr DrawTankRocketEngine NoEngine -; jsr WaitOneFrame - jmp TankGoUp +; jsr WaitOneFrame + jmp TankGoUp ReachSky - ; engine symbol erase - mva #0 color - jsr DrawTankRocketEngine + ; engine symbol erase + mva #0 color + jsr DrawTankRocketEngine - ; display text 4x4 - fuel full (clear text) + ; display text 4x4 - fuel full (clear text) mwa #hoverFull LineAddress4x4 mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - mva #(hoverFullEnd-hoverFull-1) fx ; length - sec - lda FloatingAlt - sbc #12 + mva #(hoverFullEnd-hoverFull) fx ; length + sec + lda FloatingAlt + sbc #12 sta LineYdraw lda #$00 jsr TypeLine4x4.staplot4x4color - ; and Soildown at the start (for correct mountaintable if tank was buried) - ; calculate range - ldx TankNr - sec - lda XtankstableL,x - sbc #2 - sta RangeLeft - lda XtankstableH,x - sbc #0 - sta RangeLeft+1 - clc - lda XtankstableL,x - adc #10 - sta RangeRight - lda XtankstableH,x - adc #0 - sta RangeRight+1 - ; hide tanks and ... - jsr SoilDown2 - jsr ClearScreenSoilRange - ldx TankNr + ; and Soildown at the start (for correct mountaintable if tank was buried) + ; calculate range + ldx TankNr + sec + lda XtankstableL,x + sbc #2 + sta RangeLeft + lda XtankstableH,x + sbc #0 + sta RangeLeft+1 + clc + lda XtankstableL,x + adc #10 + sta RangeRight + lda XtankstableH,x + adc #0 + sta RangeRight+1 + ; hide tanks and ... + jsr SoilDown2 + jsr ClearScreenSoilRange + ldx TankNr - ; check keyboard/joy and move tank left/right - code copied from BeforeFire + ; check keyboard/joy and move tank left/right - code copied from BeforeFire ;keyboard reading ; KBCODE keeps code of last keybi ; SKSTAT $ff - nothing pressed @@ -2586,30 +2586,30 @@ ReachSky ; $f3 - shift+key KeyboardAndJoyCheck mva #sfx_tank_move sfx_effect - lda ShieldEnergy,x - cmp #20 - bne LotOfFuel - - ; display text 4x4 - low fuel + lda ShieldEnergy,x + cmp #20 + bne LotOfFuel + + ; display text 4x4 - low fuel mwa #hoverEmpty LineAddress4x4 mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - sec - lda FloatingAlt - sbc #12 + mva #hoverEmptyEnd-hoverEmpty fx ; length + sec + lda FloatingAlt + sbc #12 sta LineYdraw jsr TypeLine4x4.variableLength LotOfFuel notpressed - jsr CheckExitKeys + jsr CheckExitKeys spl:rts ;---Exit key pressed-quit game--- - ldx TankNr + ldx TankNr - ; let's animate "engine" - jsr DrawTankEngine - ; enimation ends - + ; let's animate "engine" + jsr DrawTankEngine + ; enimation ends + lda SKSTAT cmp #$ff jeq checkJoy @@ -2646,118 +2646,118 @@ notpressedJoy pressedRight - lda ShieldEnergy,x - jeq pressedSpace - ldy #1 - jsr DecreaseShieldEnergyX - ; first erase old tank position + lda ShieldEnergy,x + jeq pressedSpace + ldy #1 + jsr DecreaseShieldEnergyX + ; first erase old tank position jsr ClearTankNr - mva #0 Erase - lda XtankstableH,x - cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 - bne @+ - lda XtankstableL,x - cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels -@ bcs RightScreenEdge - inc XtankstableL,x - sne:inc XtankstableH,x - jmp NoREdge + mva #0 Erase + lda XtankstableH,x + cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 + bne @+ + lda XtankstableL,x + cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels +@ bcs RightScreenEdge + inc XtankstableL,x + sne:inc XtankstableH,x + jmp NoREdge RightScreenEdge mva #sfx_dunno sfx_effect NoREdge - mva #18 AngleTable,x - bne DrawFloatingTank ; then draw tank on new position + mva #18 AngleTable,x + bne DrawFloatingTank ; then draw tank on new position pressedLeft - lda ShieldEnergy,x - beq pressedSpace - ldy #1 - jsr DecreaseShieldEnergyX - ; first erase old tank position + lda ShieldEnergy,x + beq pressedSpace + ldy #1 + jsr DecreaseShieldEnergyX + ; first erase old tank position jsr ClearTankNr - lda XtankstableH,x - cmp #0 - bne @+ - lda XtankstableL,x - cmp #5 ; 4 pixles from left edge -@ bcc LeftScreenEdge - dec XtankstableL,x - lda XtankstableL,x - cmp #$ff - sne:dec XtankstableH,x - jmp NoLEdge + lda XtankstableH,x + cmp #0 + bne @+ + lda XtankstableL,x + cmp #5 ; 4 pixles from left edge +@ bcc LeftScreenEdge + dec XtankstableL,x + lda XtankstableL,x + cmp #$ff + sne:dec XtankstableH,x + jmp NoLEdge LeftScreenEdge mva #sfx_dunno sfx_effect NoLEdge - mva #162 AngleTable,x - ; then draw tank on new position + mva #162 AngleTable,x + ; then draw tank on new position DrawFloatingTank jsr PutTankNr - jsr DisplayStatus - jsr WaitOneFrame - jsr CalculateSoildown + jsr DisplayStatus + jsr WaitOneFrame + jsr CalculateSoildown jmp KeyboardAndJoyCheck pressedSpace - ; display text 4x4 - low fuel (clear text) + ; display text 4x4 - low fuel (clear text) mwa #hoverEmpty LineAddress4x4 mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - sec - lda FloatingAlt - sbc #12 + mva #hoverEmptyEnd-hoverEmpty fx ; length + sec + lda FloatingAlt + sbc #12 sta LineYdraw lda #$00 jsr TypeLine4x4.staplot4x4color - ldx TankNr + ldx TankNr ;================================= - ; left or right from center of screen ? - ldy #0 + ; left or right from center of screen ? + ldy #0 lda XtankstableH,x - cmp #>((screenwidth/2)-TankWidth) - bne @+ + cmp #>((screenwidth/2)-TankWidth) + bne @+ lda XtankstableL,x - cmp #<((screenwidth/2)-TankWidth) -@ bcc TankOnLeftSide + cmp #<((screenwidth/2)-TankWidth) +@ bcc TankOnLeftSide TankOnRightSide - dey + dey TankOnLeftSide - sty OverTankDir ; (0 go right, $ff go left) - ; now we have direction of bypassing tanks on screen + sty OverTankDir ; (0 go right, $ff go left) + ; now we have direction of bypassing tanks on screen - ; clear "engine pixels" under tank + ; clear "engine pixels" under tank mva #1 erase - jsr DrawTankEngine + jsr DrawTankEngine CheckForTanksBelow - lda XtankstableL,x - sta xdraw - lda XtankstableH,x - sta xdraw+1 - ldx NumberOfPlayers - dex + lda XtankstableL,x + sta xdraw + lda XtankstableH,x + sta xdraw+1 + ldx NumberOfPlayers + dex CheckCollisionWithTankLoop - cpx TankNr - beq ItIsMe - lda eXistenZ,x - beq DeadTank - ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - ; it is tricky but fast and much shorter + cpx TankNr + beq ItIsMe + lda eXistenZ,x + beq DeadTank + ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + ; it is tricky but fast and much shorter lda xtankstableL,x - sec - sbc #9 ; 2 pixels more on left side + tank width - tay - lda xtankstableH,x - sbc #0 - ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + sec + sbc #9 ; 2 pixels more on left side + tank width + tay + lda xtankstableH,x + sbc #0 + ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! cmp xdraw+1 bne @+ cpy xdraw @ bcs LeftFromTheTank - tya ;add 20 (tank size*2 +2 and +2) + tya ;add 20 (tank size*2 +2 and +2) clc - adc #20 + adc #20 tay lda xtankstableH,x adc #0 @@ -2767,105 +2767,105 @@ CheckCollisionWithTankLoop @ bcc RightFromTheTank TankBelow - ; tank below - we must move our tank - ldx TankNr - ; first erase old tank position + ; tank below - we must move our tank + ldx TankNr + ; first erase old tank position jsr ClearTankNr - bit OverTankDir - bmi PassLeft + bit OverTankDir + bmi PassLeft PassRight - inc XtankstableL,x - sne:inc XtankstableH,x - mva #18 AngleTable,x - bne Bypassing + inc XtankstableL,x + sne:inc XtankstableH,x + mva #18 AngleTable,x + bne Bypassing PassLeft - dec XtankstableL,x - lda XtankstableL,x - cmp #$ff - sne:dec XtankstableH,x - mva #162 AngleTable,x + dec XtankstableL,x + lda XtankstableL,x + cmp #$ff + sne:dec XtankstableH,x + mva #162 AngleTable,x Bypassing - ; then draw tank on new position + ; then draw tank on new position jsr PutTankNr - jmp CheckForTanksBelow + jmp CheckForTanksBelow RightFromTheTank LeftFromTheTank DeadTank ItIsMe dex bpl CheckCollisionWithTankLoop - ldx TankNr + ldx TankNr mva #sfx_shield_off sfx_effect jsr ClearTankNr - mva #0 Erase - ; x correction for P/M - ; -- - .IF XCORRECTION_FOR_PM = 1 - lda XtankstableL,x - and #%11111110 ; correction for PM - sta XtankstableL,x - .ENDIF - ; -- + mva #0 Erase + ; x correction for P/M + ; -- + .IF XCORRECTION_FOR_PM = 1 + lda XtankstableL,x + and #%11111110 ; correction for PM + sta XtankstableL,x + .ENDIF + ; -- GoDown - mwa #mountaintable temp - clc - lda temp - adc XtankstableL,x - sta temp - lda temp+1 - adc XtankstableH,x - sta temp+1 - adw temp #4 ; center of the tank - ldy #0 - lda (temp),y - sta OverTankDir ; not elegant!!! Reuse as height of tank flight + mwa #mountaintable temp + clc + lda temp + adc XtankstableL,x + sta temp + lda temp+1 + adc XtankstableH,x + sta temp+1 + adw temp #4 ; center of the tank + ldy #0 + lda (temp),y + sta OverTankDir ; not elegant!!! Reuse as height of tank flight FloatDown - lda ytankstable,x - cmp OverTankDir - bcs OnGround - ; first erase old tank position + lda ytankstable,x + cmp OverTankDir + bcs OnGround + ; first erase old tank position jsr ClearTankNr jsr DrawTankParachute - inc ytankstable,x - ; then draw tank on new position + inc ytankstable,x + ; then draw tank on new position jsr PutTankNr jsr DrawTankParachute - jsr WaitOneFrame - jmp FloatDown + jsr WaitOneFrame + jmp FloatDown OnGround - ; clear parachute - mva #1 Erase + ; clear parachute + mva #1 Erase jsr DrawTankParachute - mva #0 Erase + mva #0 Erase jsr WaitForKeyRelease - ; and Soildown at the end (for correct mountaintable) - ; If tank did not fly at maximum altitude there is no need to soildown to much - lda FloatingAlt - cmp #18 - beq NotHighest + ; and Soildown at the end (for correct mountaintable) + ; If tank did not fly at maximum altitude there is no need to soildown to much + lda FloatingAlt + cmp #18 + beq NotHighest SoilDownAfterLanding - jsr ClearScreenSoilRange + jsr ClearScreenSoilRange NotHighest - ; calculate range - jsr CalculateSoildown - ; hide tanks and ... - jsr SoilDown2 - ldx TankNr - rts - + ; calculate range + jsr CalculateSoildown + ; hide tanks and ... + jsr SoilDown2 + ldx TankNr + rts + CalculateSoildown - ldx TankNr - clc - lda XtankstableL,x - adc #4 - sta xdraw - lda XtankstableH,x - adc #0 - sta xdraw+1 - mva #$04 ExplosionRadius - jsr CalculateExplosionRange - rts + ldx TankNr + clc + lda XtankstableL,x + adc #4 + sta xdraw + lda XtankstableH,x + adc #0 + sta xdraw+1 + mva #$04 ExplosionRadius + jsr CalculateExplosionRange + rts .endp ; ------------------------------------------------- @@ -2879,28 +2879,28 @@ CalculateSoildown ; X - index of the hit tank ldx NumberOfPlayers - dex + dex CheckCollisionWithTankLoop - lda eXistenZ,x - beq DeadTank - ; first we test top and bottom (same with and without shield!) + lda eXistenZ,x + beq DeadTank + ; first we test top and bottom (same with and without shield!) lda ytankstable,x cmp ydraw ; check range bcc BelowTheTank ;(ytankstable,ytankstable+3) sbc #3 ; hitbox height cmp ydraw bcs OverTheTank - ; with or without shield ? + ; with or without shield ? - lda ActiveDefenceWeapon,x - cmp #ind_Mag_Deflector__ ; first shielded weapon - bcc CheckCollisionWithNotShieldedTank - cmp #ind_Bouncy_Castle__+1 ; last shielded weapon - bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) - - ;lda ShieldEnergy,x ; there is wrong method to check shield :) - ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) - + lda ActiveDefenceWeapon,x + cmp #ind_Mag_Deflector ; first shielded weapon + bcc CheckCollisionWithNotShieldedTank + cmp #ind_Bouncy_Castle +1 ; last shielded weapon + bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) + + ;lda ShieldEnergy,x ; there is wrong method to check shield :) + ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) + CheckCollisionWithNotShieldedTank lda xtankstableH,x cmp xdraw+1 @@ -2909,9 +2909,9 @@ CheckCollisionWithNotShieldedTank cmp xdraw @ bcs LeftFromTheTank - ; add 8 double byte - ; now we use Y as low byte and A as high byte of checked position (right edge of tank) - ; it is tricky but fast and much shorter + ; add 8 double byte + ; now we use Y as low byte and A as high byte of checked position (right edge of tank) + ; it is tricky but fast and much shorter clc lda xtankstableL,x adc #TankWidth @@ -2924,9 +2924,9 @@ CheckCollisionWithNotShieldedTank @ bcc RightFromTheTank TankHit - inx - stx HitFlag ; index of hit tank+1 - dex + inx + stx HitFlag ; index of hit tank+1 + dex mwa xdraw XHit mwa ydraw YHit rts ; in X there is an index of the hit tank @@ -2939,23 +2939,23 @@ DeadTank bpl CheckCollisionWithTankLoop rts CheckCollisionWithShieldedTank - ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - ; it is tricky but fast and much shorter + ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + ; it is tricky but fast and much shorter lda xtankstableL,x - sec - sbc #4 ; 5 pixels more on left side - tay - lda xtankstableH,x - sbc #0 - ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + sec + sbc #4 ; 5 pixels more on left side + tay + lda xtankstableH,x + sbc #0 + ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! cmp xdraw+1 bne @+ cpy xdraw @ bcs LeftFromTheTank - tya ;add 16 double byte + tya ;add 16 double byte clc - adc #TankWidth+4+4 + adc #TankWidth+4+4 tay lda xtankstableH,x adc #0 @@ -2964,7 +2964,7 @@ CheckCollisionWithShieldedTank cpy xdraw @ bcc RightFromTheTank - bcs TankHit + bcs TankHit .endp ;-------------------------------------------------- CalculateExplosionRange0 @@ -2974,39 +2974,39 @@ CalculateExplosionRange0 ;(for the first or single explosion) ;zero soil fall out ranges - jsr ClearScreenSoilRange + jsr ClearScreenSoilRange ;-------------------------------------------------- .proc CalculateExplosionRange ;-------------------------------------------------- ;calculates total horizontal range of explosion by ;"summing up" ranges of all separate explosions - ; WeaponRangeRight = xdraw + ExplosionRadius - clc - lda xdraw - adc ExplosionRadius - sta WeaponRangeRight - lda xdraw+1 - adc #$00 - sta WeaponRangeRight+1 + ; WeaponRangeRight = xdraw + ExplosionRadius + clc + lda xdraw + adc ExplosionRadius + sta WeaponRangeRight + lda xdraw+1 + adc #$00 + sta WeaponRangeRight+1 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now ; cpw WeaponRangeRight #screenwidth-1 - cmp #>(screenwidth-1) - bne @+ - lda WeaponRangeRight - cmp #<(screenwidth-1) -@ bcc NotOutOfTheScreenRight + cmp #>(screenwidth-1) + bne @+ + lda WeaponRangeRight + cmp #<(screenwidth-1) +@ bcc NotOutOfTheScreenRight mwa #screenwidth-1 WeaponRangeRight NotOutOfTheScreenRight - ; WeaponRangeLeft = xdraw - ExplosionRadius - sec - lda xdraw - sbc ExplosionRadius - sta WeaponRangeLeft - lda xdraw+1 - sbc #$00 - sta WeaponRangeLeft+1 + ; WeaponRangeLeft = xdraw - ExplosionRadius + sec + lda xdraw + sbc ExplosionRadius + sta WeaponRangeLeft + lda xdraw+1 + sbc #$00 + sta WeaponRangeLeft+1 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now ; lda WeaponRangeLeft+1 bpl NotOutOfTheScreenLeft @@ -3031,21 +3031,21 @@ RangesChecked .proc SetFullScreenSoilRange ; whole screen in range of soil down ;-------------------------------------------------- - lda #0 - sta RangeLeft - sta RangeLeft+1 - mwa #screenwidth RangeRight - rts + lda #0 + sta RangeLeft + sta RangeLeft+1 + mwa #screenwidth RangeRight + rts .endp ;-------------------------------------------------- .proc ClearScreenSoilRange ; cleanup of the soil fall down ranges (left and right) ;-------------------------------------------------- - mwa #screenwidth RangeLeft - lda #0 - sta RangeRight - sta RangeRight+1 - rts + mwa #screenwidth RangeLeft + lda #0 + sta RangeRight + sta RangeRight+1 + rts .endp ;-------------------------------------------------- .proc DecreaseWeaponBeforeShoot @@ -3065,7 +3065,7 @@ RangesChecked ; decreases 1 bullet from a weapon(A) of tank(TankNr) ;-------------------------------------------------- jsr HowManyBullets - beq noBullets ; no bullets - no decreasing (additional check) + beq noBullets ; no bullets - no decreasing (additional check) cpy #0 beq defaultWeapon ; no decreasing Baby Missile sec From ff465e11f0c2122976ed4ee183e0e80d797060fe Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 20 May 2023 11:28:02 +0200 Subject: [PATCH 56/65] Missing splash screen --- scorch.asm | 2 +- scorch.xex | Bin 32676 -> 56598 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/scorch.asm b/scorch.asm index 7da368b..b89fcf4 100644 --- a/scorch.asm +++ b/scorch.asm @@ -196,7 +196,7 @@ FirstZpageVariable = $57 .ELSE icl 'Atari/lib/ATARISYS.ASM' icl 'Atari/lib/MACRO.ASM' - ; icl 'artwork/splash_v2/splash.asm' ; splash screen and musix + icl 'artwork/splash_v2/splash.asm' ; splash screen and musix .ENDIF ;----------------------------------------------- diff --git a/scorch.xex b/scorch.xex index 072dc4de2e483474f13d8c71353ba0a770ca19ff..3af8e333ab5c7056d82567d45544870ec17f33ba 100644 GIT binary patch delta 22916 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 delta 23 fcmbQXi+Ra^Mz;U|865sQZ{DxU$g;UIac(sLhAs-f From 0becca7a87399ca7e08a33f7cba54c04237c4991 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 20 May 2023 12:58:42 +0200 Subject: [PATCH 57/65] Hovercraft texts display optimization --- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56598 -> 56553 bytes weapons.asm | 51 ++++++++++++++++++++++----------------------------- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/scorch.bin b/scorch.bin index 1354380c7ae039280d638eab9d8cd0887ad6ddbf..32731b5d2e1a3fb99bbbce3eb94e37c0b4e9f1da 100644 GIT binary patch delta 1322 zcmZuv4NOy46y`n(6oi&yVQmBTii&nXfw@H)W4fY_lm@00%3o($m{>YkK#&M7qRE?z z)HtvGq3vS`yskIIQF#jqWHn^jnh;n*bX~yB{Upjyj9M3Eni#iRG`cLFo1A;z`M&$z z^Uk?lT~t>W<^3{_x@AQd<4Qm=x*wMaCb%d;R!lds6E`u26C-3QTiK zh$$*y<>phr;D`24(kFJ?itiX>KXxTYP!k!nQgdDCdgaDF9JF(?+(z z=;18+odCFyXvb?{7%6sK0qJOIM+WhUJ6nMgb?;0esAuOlK*{OflK_%BtU6BoBh@tV z-xuUal~&F4Ni3onypA53<*!Eh^axaPf?a(;;I^<=f)V|7Ft@}&aud5DAQk?y=TbN+ z7tLUm)cf=BMTR{RJIb2BCJA{g5*^uBmUiFjHf_{r$H1jtc<($8 z3-Tdejk;(n4x{yk9={MO(Sv=d;qZ_J<&@^erXm7(AbTj3I9sYn7$zE|PR5rnoD$DQ z!fp%tv-EXY`2~#&u~LO_N*IjtjOW*A#t*zUhdLGN^6SIliaRKVrO3~G_lVnI$X0!9}#0!X>5q(~K<}Vf6!tkrAzq#Q|jq zR%WfsW~L&&5jc$LA@#q4(^Q$Id-gI4wO^9h4-Oj^+<+D>6EYmBcU(6 zq;D3PoZHz!A~NWu{6qeLMue_br{~N&3w?9WLc^l7)^*BtnXH>+U3M8fbc6SDSHHXKHdE4Kt01x1av5#O(WJmyO?^OzSF zPolp68d^CZN5c9fq^OsyVP6_oTt7;oS!3pC!`I>902*n$z%R%2U+g2P4iz;?qZ%;N NCmTP;nVKx3e*y9;J+lA+ delta 1319 zcmaJ<4NOy46y}ze77$7+WwZib7{OH(WXuT+1abTb%^*;qP&(_)aBurWgSDGS^~G^StXD@p@n2VpxeTo}kuBOxfqH1arrmo9wmB?Ohr+IK~vF?*&|6qK>Ms zqZxh15dfS>kogRlL(s*qy+>?Zzd*Yd2722Vgf3e;FkwMuuD%}@^H>*U}}*XV>3Ar;0}MxJ@1Pf zMqLGw-oEJqDI0&s^~wsEW4{ z!-L=Tdv`j*K>H9Xb+>~LmFSO>m`!vEF-4yx7+OQjVd@$kMYN|-!*@3j-y?BpYHS+9 zs0~uh|0jI4R4SM=She`SNP7m~89Ez9A4c6}V$@%{RWjHo`vp;ADc{NWaBb5W)v||( zl6a0_biPyydjzHrWf_0ZjF)vB%9aQg_qj!mfTHh!HCae!ufZ8jjPtP>A!dpYu7 zHuMbg)esx&ERW{o8uO=f&{DZHR%`4wMwo7zHuP8Z+xq3k^8xpq>{F}G;K>Klhqmc| zh3OSBU?19Fv5VzrLZ*uHz&sLmnBWByHXN;1YzHl9iy~5#N2=?a-f8dZHIE1-G4ao* zWfwp*s#NUfVez6#_N)nARzwTeUT7aYqP4M@VIEpmByLubPQOVG?L&6sKA)o5Q<<3X z6piL_oil8>kEBM)20k@Lw(y|}4OafeRt`WH+M$d>pH>A6oaPkDeV0SH9d4RKv|{F< zGAi(tzr*cl^@Pa$1`u2M9Q%ZM?Z`HPav+>?*J1hXC-N-<(?AL}ii?a+vK(U$w`@0} zl<`S^mV7(MlCKW6oU~l9+`x~36p%M8Y8%m1P*6ZLnxyzL{9Q5Dn7W|wye7**p!!gH zq6Lqt&1*Wqrt>Esz(k9qZT3DMsTYjK;MR4J_Io0X@?z**wM6WdhupVs z$cN)oA77m3Zpy4~K5iVn{KY-tOO=P;GGDp=tA9}3&fKb6@=**TdrdfU)ri<5IM8B^ yG-!-^6jrO1iGF>GHB~?E3lN$(*vC6Y6Ted{;to{UAm$ora!@jTj?p&g1^)n1W<be$e(+5DI;XXv+hnbk#owC@`R5tC3_InF))CA!LII(cx}!!(`jN$$9Ud-^t0j zCs)(UpSJU@y9!YUx4W>$8wub}@!MgasHK6qI1*SdrjCla6=;{w`cim8!|f@+}m6nhCxznm2L_ztjbcb`SmFDhxP~ptyK2{$PpbBoR;Wgy5 zKo^;di!7Yja1x0f8a!Shcb*TR%bf46p%u2Ww;tD)$?*`_jMq>O9A=UTGE8}-Ok=(_ z=g$ghhV`ef;2wIw>Z)PA=sV`7IX-qkim4OHxG7T@LNZvs@Hs(c<1j&K(`JGvnl_NJ zrpbiX_N$4Lu(1%&=gP5+%WB4mB;Vh1lTR)J$rg#{K2l4906C!Y(jpq-4z&k*B+AQb zBudg^l@3qpKw^F8`9N)JNlZbCANJ8>e^S<*2;Xe*{3&S-$yOj&4NzDHI%_l^*Qvp6 z%?Q{|WV8ie_|!wB+7g0?G_56UB+WQ8sljzFZ_KKJwk1j`>ZLulstQYBcrB^-9fE(Q}#O5)B-c})bswxumzZxdp+&rBM zBi-S!^(wXLf7FGmj*SAmjWIVfrIfjaDW`BAD6T#d$PBn26g^2n4t=`WJuRf&18(vX zD+v3lJpx90e0hs{xZM*kIIbt0z@8K&GlZGlMMU}QQ)OJxIfEyQkZ!i}23iK((iEt& zCvI3YWIG=ivgO`JrLoQEBAd_f85cP0Vw47M`=OVkjI4k@;wc!Bf+_0)jxr7$am~tG zOFU#0AvgX_vffXH5grbdz2RFt^1xYV2<7*$=?YJ5$SCK@=pQo?jP{C=h`ZYx=XGXXNdv`a*sE#>4~fkms^?esCDr-q9Jq*v!43HC*ZYW#*ZrE%`;K z4L0}EpZtI@364#Cv$VWgS$nDToAIgpzYAkivi2+Ljg2jq_OYckn{z)pdREe7_JWb3zzLg{{R30 delta 1339 zcmaKq3rt&87{@t%KzT@cO!AiN4}0vj2dG7Sp}Vntqfj_^oeJSJN~LG%RO zU}GHUgZ36mY3+3u+g@H5Q`7~!RWikef*9j;ixbo=NJiKk+q?y2CNn!H`OdlD_xt|$ zJKs4AG+RE#w(OUJD^!8B%@d^Jt7R_>E_I0m@?az;J%|o|%uE0+x#7)+o(k&u@@+w^ zPz@z}dw|7?Qc#IapYz=7A0H^#V2OIKb($C0VnjCksu5B1Zd+|{p-Q@nIiQdFR<#d! zMWa$fSt&^g)r~+nFNc?pN$l-@sLEdW7^=2bJ$L_Xl?1L}t7aV3;iE({V+o=*QYJTy zFZz;PM3BDdQ#gtomZ>(<16?)f7TItfr)UR(jQUk806>QC^}Ng2rrt@$igl@seMc9{ zgylLd@L%d;l(@Z8cr#A|WmJ|P0;clA{TJEHLGU(HxcfX}lZXT6@mrtV0xMLdIlzrH z4Rirsp#suM=%>QrmIHB_3S)UpQHl@T*$sV}W-apIvdX<{LUN|IB1x-*4`ocC&%7qy+G&2DwOG&iF|sCr8a!Z4PbWJ` zHq+Za;!p_OTLtsWVMPI)>k`l6NBp6~b_(3at+xGuz(3m_=d8%#9RAxD&XUQom}&tl zc$&iAL5emlUjmut9vzJ09#Q1bQY;@7#hg@}Q#_?)sghJDR2Nh=3bW5;C#U_k)8Dcz zx@V%-!E1xjpagpk?PA3$@iRjQeToUFSHfu}+=+XJwgZg684BN0Oi0SAWz8o$y8D8{ zqLb40WaUD-WB3gogZin&SxUTjI4WrEgY;nTXzgCQVKMF=eloU!aC%y}%u{b=s(hFs zG7S2KG~7EJhIu3W?f*kdHx+w1u!Jz^i3+}@?~4 z@h^WtPT`v^a?8b^SaFFdyR&m&$Uju8)|t%XbH6Oy4-&$({G!VCo-du3zH|Ms8n@^5 z`VPbJ`776bQeQoOMnPY@T%wr&}*0^v|;olRWVr~_z&|3d9(lk diff --git a/weapons.asm b/weapons.asm index 23f5809..fbfc947 100644 --- a/weapons.asm +++ b/weapons.asm @@ -2498,14 +2498,7 @@ StoreMaxAlt mva #sfx_plasma_2_2 sfx_effect ; display text 4x4 - fuel full - - mwa #hoverFull LineAddress4x4 - mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - mva #hoverFullEnd-hoverFull fx ; length - sec - lda FloatingAlt - sbc #12 - sta LineYdraw + jsr SetFuelFullText jsr TypeLine4x4.variableLength ldx TankNr @@ -2546,13 +2539,7 @@ ReachSky jsr DrawTankRocketEngine ; display text 4x4 - fuel full (clear text) - mwa #hoverFull LineAddress4x4 - mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - mva #(hoverFullEnd-hoverFull) fx ; length - sec - lda FloatingAlt - sbc #12 - sta LineYdraw + jsr SetFuelFullText lda #$00 jsr TypeLine4x4.staplot4x4color ; and Soildown at the start (for correct mountaintable if tank was buried) @@ -2591,13 +2578,7 @@ KeyboardAndJoyCheck bne LotOfFuel ; display text 4x4 - low fuel - mwa #hoverEmpty LineAddress4x4 - mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - mva #hoverEmptyEnd-hoverEmpty fx ; length - sec - lda FloatingAlt - sbc #12 - sta LineYdraw + jsr SetLowFuelText jsr TypeLine4x4.variableLength LotOfFuel @@ -2700,13 +2681,7 @@ DrawFloatingTank pressedSpace ; display text 4x4 - low fuel (clear text) - mwa #hoverEmpty LineAddress4x4 - mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - mva #hoverEmptyEnd-hoverEmpty fx ; length - sec - lda FloatingAlt - sbc #12 - sta LineYdraw + jsr SetLowFuelText lda #$00 jsr TypeLine4x4.staplot4x4color ldx TankNr @@ -2866,6 +2841,24 @@ CalculateSoildown mva #$04 ExplosionRadius jsr CalculateExplosionRange rts + +SetFuelFullText + mwa #hoverFull LineAddress4x4 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering + mva #hoverFullEnd-hoverFull fx ; length + bne SetTextLevel ; !! length<>0 + sec +SetLowFuelText + mwa #hoverEmpty LineAddress4x4 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering + mva #hoverEmptyEnd-hoverEmpty fx ; length +SetTextLevel + sec + lda FloatingAlt + sbc #12 + sta LineYdraw + rts + .endp ; ------------------------------------------------- From 401d94eec91aedee1cbbad67a8e01b1203e494c1 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Sat, 20 May 2023 13:03:25 +0200 Subject: [PATCH 58/65] Lonely SEC --- weapons.asm | 1 - 1 file changed, 1 deletion(-) diff --git a/weapons.asm b/weapons.asm index fbfc947..f4a3984 100644 --- a/weapons.asm +++ b/weapons.asm @@ -2847,7 +2847,6 @@ SetFuelFullText mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering mva #hoverFullEnd-hoverFull fx ; length bne SetTextLevel ; !! length<>0 - sec SetLowFuelText mwa #hoverEmpty LineAddress4x4 mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering From 4fa861af3d9e660178f8f142f8e72c9b2d304c9e Mon Sep 17 00:00:00 2001 From: pkali Date: Sat, 20 May 2023 09:48:28 -0400 Subject: [PATCH 59/65] source clean-up --- .gitignore | 6 +- Atari/display_main_menu.asm | 2 +- Atari/display_static.asm | 115 +- Atari/gr_basics.asm | 28 +- Atari/interrupts.asm | 42 +- Atari/textproc.asm | 138 +- C64/gr_basics.asm | 28 +- C64/textproc.asm | 20 +- ai.asm | 158 +- artwork/joytest.asm | 11 +- artwork/sfx/rmtplayr_modified.asm | 2 +- artwork/splash_v2/lzss_player.asm | 7 +- artwork/splash_v2/splash.asm | 12 +- constants.asm | 320 +- constants_top.asm | 2 +- definitions.asm | 52 +- game.asm | 108 +- grafproc.asm | 118 +- scorch.asm | 208 +- scorchC64.asm | 33 +- scorchC64.lst | 11712 ---------------------------- variables.asm | 14 +- weapons.asm | 209 +- 23 files changed, 805 insertions(+), 12540 deletions(-) delete mode 100644 scorchC64.lst diff --git a/.gitignore b/.gitignore index 015326c..8cb7caf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ .project *.bak -scorch.lab -scorch.lst -textproc.lab -textproc.lst +*.lab +*.lst artwork/talk.as_ diff --git a/Atari/display_main_menu.asm b/Atari/display_main_menu.asm index 44ae147..94661e1 100644 --- a/Atari/display_main_menu.asm +++ b/Atari/display_main_menu.asm @@ -4,7 +4,7 @@ ;----------------------------------------------- ; start of "variables" (RAM) ;----------------------------------------------- -OptionsHere +OptionsHere ; 0123456789012345678901234567890123456789 dta d"Players : 2 3 4 5 6 " dta d"Cash : none 2K 8K 12K 20K " diff --git a/Atari/display_static.asm b/Atari/display_static.asm index 07f6b0d..f56a21f 100644 --- a/Atari/display_static.asm +++ b/Atari/display_static.asm @@ -8,54 +8,54 @@ ;----------------------------------------------- OptionsScreen dta d"Welcome to Scorch v. " - build ; 4 bytes from scorch.asm (fancy method) :) + build ; 4 bytes from scorch.asm (fancy method) :) dta d" (un)2000-2023" .IF TARGET = 800 - dta d" Please select option with " - dta $fe,$dc,$dd,$ff ; cursors in inverse - dta d" and " - dta d"Tab"* - dta d" " - dta d" Press " - dta d"Return"* - dta d" to proceed " + dta d" Please select option with " + dta $fe,$dc,$dd,$ff ; cursors in inverse + dta d" and " + dta d"Tab"* + dta d" " + dta d" Press " + dta d"Return"* + dta d" to proceed " .ELIF TARGET = 5200 - dta d" Please select option with joystick one " - dta d" and press FIRE to proceed " + dta d" Please select option with joystick one " + dta d" and press FIRE to proceed " .ENDIF ; 0123456789012345678901234567890123456789 ;----------------------------------------------- NameScreen .IF TARGET = 800 - dta d" Enter names of players " + dta d" Enter names of players " .ELIF TARGET = 5200 - dta d"Hold " - dta d "FIRE"* - dta d " to enter player names " + dta d"Hold " + dta d "FIRE"* + dta d " to enter player names " .ENDIF NameScreen3 dta d" Human/Atari (difficulty level) " NameScreen5 .IF TARGET = 800 - dta d"TAB"* - dta d" - Port nr " - dta $fe,$dc,$dd,$ff ; cursors in inverse - dta d" - Difficulty" - dta d" " - dta d"INV"* - dta d" - Shape " - dta d"Return"* - dta d" - Proceed " + dta d"TAB"* + dta d" - Port nr " + dta $fe,$dc,$dd,$ff ; cursors in inverse + dta d" - Difficulty" + dta d" " + dta d"INV"* + dta d" - Shape " + dta d"Return"* + dta d" - Proceed " .ELIF TARGET = 5200 - dta d" " - dta d"(5)"* - dta d" - Port/Shape " - dta d"Joy"* - dta d" - Diffic. " - dta d" " - dta d"FIRE"* - dta d" - Proceed " + dta d" " + dta d"(5)"* + dta d" - Port/Shape " + dta d"Joy"* + dta d" - Diffic. " + dta d" " + dta d"FIRE"* + dta d" - Proceed " .ENDIF ;----------------------------------------------- MoreUp @@ -73,51 +73,46 @@ MoreDown WeaponsDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Tab"* - dta d ": Defensive/Offensive weapon " + dta d"Tab"* + dta d ": Defensive/Offensive weapon " .ELIF TARGET = 5200 - dta d"Left"* - dta d ": Defensive/Offensive weapon" + dta d"Left"* + dta d ": Defensive/Offensive weapon" .ENDIF PurchaseDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Space"* - dta d": Purchase " - dta d"Return"* - dta d": Finish " + dta d"Space"* + dta d": Purchase " + dta d"Return"* + dta d": Finish " .ELIF TARGET = 5200 - dta d"Right"* - dta d": Purchase " - dta d"FIRE"* - dta d": Finish " + dta d"Right"* + dta d": Purchase " + dta d"FIRE"* + dta d": Finish " .ENDIF ActivateDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Space"* - dta d": Activate " - dta d"Return"* - dta d": Finish " + dta d"Space"* + dta d": Activate " + dta d"Return"* + dta d": Finish " .ELIF TARGET = 5200 - dta d"Right"* - dta d": Activate " - dta d"FIRE"* - dta d": Finish " + dta d"Right"* + dta d": Activate " + dta d"FIRE"* + dta d": Finish " .ENDIF EmptyLine dta d" " ;--------------------------------------------------- OptionsTitle .IF TARGET = 800 - dta d" scorch "* + dta d" scorch "* .ELIF TARGET = 5200 - dta d" scorch supersystem "* -; dta d" scorch "* -; dta d"5" -; dta d"k"* -; dta d"2" -; dta d" "* + dta d" scorch supersystem "* .ENDIF DifficultyTitle dta d" difficulty "* @@ -135,7 +130,7 @@ GameOverTitle2 dl ; MAIN game display list .byte $70 - .byte $42 + .byte $42 .word statusBuffer .byte $02, $02 .byte $10+$80 ; 2 blank lines + DLI diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 18219dd..46858ca 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -113,7 +113,7 @@ EndOfUnPlot ; game. If you are going to speed up the game, start with ; plot - it is used by every single effect starting from explosions ; through line drawing and small text output!!! -; +; ; Optimized by 0xF (Fox) THXXXX!!! ; ----------------------------------------- @@ -122,7 +122,7 @@ EndOfUnPlot bcs unPlot.EndOfUnPlot ;nearest RTS CheckX02 cpw xdraw #screenwidth - bcs EndOfPlot + bcs EndOfPlot MakePlot ; let's calculate coordinates from xdraw and ydraw @@ -190,7 +190,7 @@ ClearPlot rts .endp ;-------------------------------------------------- -.proc drawmountains +.proc drawmountains ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify @@ -204,7 +204,7 @@ drawmountainsloop sta ydraw sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw @@ -223,7 +223,7 @@ drawmountainsloop bne @- ; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot inc ydraw @@ -331,12 +331,12 @@ EmptyChar ldx #0 CharLoopi lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y iny lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y dey @@ -398,7 +398,7 @@ EndPutChar cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS ; checks ommited. @@ -414,7 +414,7 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table @@ -480,7 +480,7 @@ MaskOK01 ldx #0 CharLoopi4x4 lda (xbyte),y - ora mask1,x + ora mask1,x bit plot4x4color bpl PutInColor0_1 ; only mask - no char and char1,x @@ -488,7 +488,7 @@ PutInColor0_1 sta (xbyte),y iny lda (xbyte),y - ora mask2,x + ora mask2,x bit plot4x4color bpl PutInColor0_2 ; only mask - no char and char2,x @@ -555,7 +555,7 @@ EndPut4x4 inw temp cpw temp #display+screenheight*screenBytes+1 bne @- - rts + rts .endp ;-------------------------------------------------- @@ -577,14 +577,14 @@ EndPut4x4 .endp ;-------------------------------------------------- .proc SetMainScreen -; mva #0 dmactls +; mva #0 dmactls SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen mwa #dl dlptrs ; issue #72 (glitches when switches) lda #%00111110 ; and #$fc ; ora #$02 ; 2=normal, 3 = wide screen width sta dmactls - mva WallsType COLBAKS ; set color of background + mva WallsType COLBAKS ; set color of background jsr WaitOneFrame rts .endp diff --git a/Atari/interrupts.asm b/Atari/interrupts.asm index e78b4fb..21bfd42 100644 --- a/Atari/interrupts.asm +++ b/Atari/interrupts.asm @@ -98,13 +98,13 @@ EndOfDLI_Text pla DLIinterruptNone rti - + .endp ;-------------------------------------------------- .proc VBLinterrupt mva #0 dliCounter mva #$02 DliColorBack - + lda PAL and #%00001110 beq itsPAL @@ -118,7 +118,7 @@ DLIinterruptNone itsPAL ; pressTimer is trigger tick counter. always 50 ticks / s bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s - + SkippedIfNTSC bit RMT_blocked @@ -138,7 +138,7 @@ SkippedIfNTSC lab2 jsr RASTERMUSICTRACKER+3 ;1 play ; ------- RMT ------- -SkipRMTVBL +SkipRMTVBL bit ScrollFlag bpl EndOfCreditsVBI CreditsVBI @@ -170,7 +170,15 @@ nextlinedisplay ; bne EndOfCreditsVBI mwa #Credits DLCreditsAddr EndOfCreditsVBI - .IF TARGET = 5200 + .IF TARGET = 800 + ; support for joysticks :) + ldx JoystickNumber + lda STICK0,x + sta STICK0 + lda STRIG0,x + sta STRIG0 + jmp XITVBV + .ELIF TARGET = 5200 lda SkStatSimulator bmi @+ inc SkStatSimulator @@ -181,7 +189,7 @@ EndOfCreditsVBI center = 114 ;Read analog stick and make it look like a digital stick threshold = 60 - + lda JoystickNumber asl tax @@ -190,28 +198,28 @@ EndOfCreditsVBI rol stick0 ;Feed carry into digital stick value cmp #center-threshold ;Compare with left threshold rol stick0 ;Feed carry into digital stick value - + lda paddl1,x ;Read POT1 value (vertical position) cmp #center+threshold ;Compare with down threshold rol stick0 ;Feed carry into digital stick value cmp #center-threshold ;Compare with down threshold rol stick0 ;Feed carry into digital stick value - + lda stick0 ;0 indicates a press so the right/down values need to be inverted eor #2+8 and #$0f sta stick0 - + ldx JoystickNumber ; check shift key (5200 second fire button) lda SKSTAT :3 lsr ; third bit - and trig0,x ; and first button + and trig0,x ; and first button ;lda trig0,x sta strig0 ;Move hardware to shadow - + mva chbas chbase - + lda skstat ;Reset consol key shadow is no key is pressed anymore and #4 beq @+ @@ -225,14 +233,6 @@ EndOfCreditsVBI tax pla rti - .ELSE - ; support for joysticks :) - ldx JoystickNumber - lda STICK0,x - sta STICK0 - lda STRIG0,x - sta STRIG0 - jmp XITVBV .ENDIF .endp .IF TARGET = 5200 @@ -245,7 +245,7 @@ exit pla tax pla rti -.endp +.endp .ENDIF ;-------------------------------------------------- diff --git a/Atari/textproc.asm b/Atari/textproc.asm index b64ff2e..dbf0abe 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -32,7 +32,7 @@ jsr ColorsOfSprites mva #$ca COLOR1 mva #$00 COLBAKS ; set color of background - + SetDLI DLIinterruptOptions ; jsr SetDLI for Options text screen ; -------- setup bottom (tanks) line @@ -70,7 +70,7 @@ OptionsMainLoop jsr getkey bit escFlag spl:rts - + cmp #@kbcode._down ; $f ;cursor down bne OptionsNoDown inc:lda OptionsY @@ -113,7 +113,7 @@ OptionsNoRight cmp #@kbcode._ret ; $c ;Return key bne OptionsNoReturn rts ; options selected - + OptionsNoReturn cmp #@kbcode._tab ; Tab key bne OptionsNoTab @@ -141,7 +141,7 @@ NoGradientLoop lda GradientAddrL,y sta GradientColors lda GradientAddrH,y - sta GradientColors+1 + sta GradientColors+1 rts .endp @@ -174,7 +174,7 @@ OptionsLoop cpy #optionWidth ; width of the option highlight bne OptionsLoop ldy #0 - ; next X position of the + ; next X position of the adw temp #optionWidth ; width of the option highlight inc:lda XPos cmp #5 ; number of options in a row @@ -191,12 +191,12 @@ OptionsLoop _inverter beq invertme ; clean inversion otherwise - lda (temp),y + lda (temp),y and #$7f ; clear the top bit sta (temp),y bpl @+ ; JMP invertme - lda (temp),y + lda (temp),y ora #$80 ; set the top bit sta (temp),y @ @@ -227,7 +227,7 @@ ManualPurchase spl:rts jsr DefensivesActivate ; activate weapons bit escFlag - spl:rts + spl:rts AfterManualPurchase inc:lda TankNr cmp NumberOfPlayers @@ -238,8 +238,8 @@ AfterManualPurchase .proc DefensivesActivate ;-------------------------------------------------- ; This proc call Inventory and set Defensives activation first - - mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 @@ -265,7 +265,7 @@ AfterManualPurchase jsr CopyFromPurchaseAndGameOver mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons - + ; we are clearing list of the weapons mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 @@ -283,7 +283,7 @@ GoToActivation bpl @+ lda #song_inventory @ jsr RmtSongSelect - + ldx tankNr lda TankStatusColoursTable,x sta COLOR2 @@ -331,15 +331,15 @@ AfterPurchase ldx #$00 ; index of the checked weapon stx HowManyOnTheListOff ; amounts of weapons (shells, bullets) in both lists stx HowManyOnTheListDef - + jsr CreateList - bit isInventory ; + bit isInventory ; bpl ChoosingItemForPurchase - + lda whichList bne PositionDefensive - + ; calculate positionOnTheList from the activeWeapon (offensives) ldx tankNr lda activeWeapon,x @@ -356,7 +356,7 @@ AfterPurchase beq ?weaponFound ; jmp PositionDefensive jsr calcPosDefensive - + ?weaponFound ; weapon index in Y @@ -368,7 +368,7 @@ PositionDefensive ;-------------------------------------------------- ChoosingItemForPurchase ;-------------------------------------------------- - + jsr PutLitteChar ; Places pointer at the right position jsr getkey bit escFlag @@ -497,11 +497,11 @@ CreateList lda WeaponUnits,x jeq NoWeapon - ldy tanknr - + ldy tanknr + bit isInventory jmi itIsInventory - + ; put "Purchase" on the screen mwa #PurchaseDescription PurActDescAddr ; and Title @@ -516,7 +516,7 @@ CreateList cmp WeaponPriceL,x @ jcc TooLittleCash - + ; we have enough cash and the weapon can be ; added to the list @@ -585,7 +585,7 @@ notInventory jsr HowManyBullets sta decimal - adw xbyte #1 displayposition + adw xbyte #1 displayposition jsr displaybyte ldx temp ;weapon index @@ -665,7 +665,7 @@ NoWeapon mwa #ListOfDefensiveWeapons xbyte NoDefense cpx #last_defensive +1 - + jne CreateList ; offset may be only too big @@ -686,14 +686,14 @@ WeHaveOffset lda HowManyOnTheListOff sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; + lda #$00 ; sta xbyte+1 ; higher byte of the Result ldx #$05 ; 2^5 @ asl xbyte rol xbyte+1 dex bne @- - + ; add to the address of the list adw xbyte #ListOfWeapons ldy #0 @@ -711,7 +711,7 @@ ListCleared1 ; of the first erased char. lda HowManyOnTheListDef sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; + lda #$00 ; sta xbyte+1 ; higher byte of the Result ldx #$05 ; 2^5 @ asl xbyte @@ -766,36 +766,36 @@ PurchaseAll lda moneyH,x sbc WeaponPriceH,y sta moneyH,x - -positiveMoney + +positiveMoney ; now we have to get address of ; the table of the weapon of the tank ; and add appropriate number of shells sty LastWeapon ; store last purchased weapon ; because we must put screen pointer next to it - + ; but if we purchasing "Buy me!" then we must draw the winning weapon. - - cpy #ind_Buy_me + + cpy #ind_Buy_me bne NoSuprise - + Suprise ; get a random weapon lda random cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) bcc GetRandomDefensive GetRandomOffensive - randomize ind_Missile last_offensive + randomize ind_Missile last_offensive ;cmp #ind_Buy_me ; buy me do not buy buy me :) ;beq GetRandomOffensive tay bne NoSuprise ; Y always <> 0 GetRandomDefensive - randomize ind_Battery last_defensive + randomize ind_Battery last_defensive tay ; lda WeaponUnits,y ; check if weapon exist ; beq GetRandomDefensive - + NoSuprise lda TanksWeaponsTableL,x sta weaponPointer @@ -824,13 +824,13 @@ inventorySelect ldx tankNr sta activeWeapon,x jmp WaitForKeyRelease ; rts - + invSelectDef ldy PositionOnTheList lda IndexesOfWeaponsL2,y tay ldx tankNr - cmp #ind_Battery + cmp #ind_Battery bne NotBattery ; if activate battery, we do it differently mva #sfx_battery sfx_effect @@ -840,38 +840,38 @@ invSelectDef ply jmp DecreaseDefensive ; bypass activation NotBattery - cmp #ind_Auto_Defense + cmp #ind_Auto_Defense bne NoAutoDefense ; Auto Defense - do it like battery mva #sfx_auto_defense sfx_effect mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) jmp DecreaseDefensive ; bypass activation NoAutoDefense - cmp #ind_Lazy_Boy + cmp #ind_Lazy_Boy bne NoLazyBoy ; Lazy Boy - do it like battery mva #%01000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyBoy - cmp #ind_Lazy_Darwin + cmp #ind_Lazy_Darwin bne NoLazyDarwin ; Lazy Darwin - do it like battery mva #%11000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyDarwin - cmp #ind_Spy_Hard + cmp #ind_Spy_Hard bne NotSpy mva #$ff SpyHardFlag - jmp DecreaseDefensive ; bypass activation + jmp DecreaseDefensive ; bypass activation NotSpy - cmp #ind_Long_Barrel + cmp #ind_Long_Barrel bne NotBarrel ; if activate long barrel, we do it differently too mva #sfx_long_barrel sfx_effect mva #LongBarrel BarrelLength,x - bne DecreaseDefensive ; bypass activation + bne DecreaseDefensive ; bypass activation NotBarrel - cmp #ind_White_Flag + cmp #ind_White_Flag bne NotWhiteFlag cmp ActiveDefenceWeapon,x bne NoDeactivateWhiteFlag @@ -897,7 +897,7 @@ DecreaseDefensive sec sbc #1 sta (weaponPointer),y - + DefActivationEnd jmp WaitForKeyRelease ; rts .endp @@ -1084,7 +1084,7 @@ NoArrowDown lda TankNr :3 asl tax - + ldy #0 @ lda TanksNames,x sta NameAdr,y @@ -1114,12 +1114,12 @@ CheckKeys lda TankShape,x tay lda digits+1,y - sta NameScreen2+15 ; display tank shape number + sta NameScreen2+15 ; display tank shape number jsr CursorDisplay jsr getkey bit escFlag spl:rts - + .IF TARGET = 800 ; only the A800 has a keyboard ; is the char to be recorded? ldx #keycodesEnd-keycodes ;table was 38 chars long @@ -1256,7 +1256,7 @@ NotRobot ; check if all chars are empty (" ") ldy #7 lda #0 -@ ora NameAdr,y +@ ora NameAdr,y and #$7F ; remove inverse (Cursor) dey bpl @- @@ -1333,7 +1333,7 @@ CharacterFound beq checkjoy bit pressTimer ; trick (no A change) bpl @- -checkjoy +checkjoy lda STICK0 and #$0f cmp #$0f @@ -1543,7 +1543,7 @@ displayloop1 sta dmactls lda #%00100100 ; playfield before P/M sta GPRIOR - jsr SetPMWidth + jsr SetPMWidth jsr ColorsOfSprites mva #0 COLOR1 sta COLBAKS ; set color of background @@ -1628,7 +1628,7 @@ ThisIsAI NotAItank tya ldy #38 - sta (temp),y + sta (temp),y ; put earned money on the screen lda EarnedMoneyL,x sta decimal @@ -1669,10 +1669,10 @@ MakeAllTanksVisible jsr RandomizeTankPos dex bpl @- -MainTanksFloatingLoop +MainTanksFloatingLoop ; main tanks floating loop ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 -AllTanksFloatingDown +AllTanksFloatingDown stx TankNr lda Ytankstable,x cmp #(72-7) ; tank under screen - no erase @@ -1842,7 +1842,7 @@ ThisIsAI ;------------------------------------------------- ldx TankNr - + ;========================= ;displaying symbol of the weapon ;========================= @@ -1872,7 +1872,7 @@ ThisIsAI aslw temp dey bpl @- - + adw temp #NamesOfWeapons ldy #15 @ @@ -1900,7 +1900,7 @@ ThisIsAI sta statusBuffer+80+22 sta statusBuffer+80+39 mwa #emptyLine temp - jmp ClearingOnly + jmp ClearingOnly ActiveDefence sta temp ;get back number of the weapon mva #0 temp+1 @@ -1910,7 +1910,7 @@ ActiveDefence aslw temp dey bpl @- - + adw temp #NamesOfWeapons ClearingOnly ldy #15 @@ -1950,7 +1950,7 @@ ClearingOnly jsr displaybyte lda #$09 ; ) sta statusBuffer+40+13 -NoDefenceWeapon +NoDefenceWeapon NoShieldEnergy ;========================= @@ -1981,7 +1981,7 @@ DisplayWindValue sta decimal mwa #statusBuffer+80+18 displayposition jsr displaybyte - + ;========================= ;display round number ;========================= @@ -2027,7 +2027,7 @@ AngleToLeft sty statusBuffer+40+25 ; (space) character lda #$7e ;(del) char sta statusBuffer+40+22 - bne AngleDisplay + bne AngleDisplay VerticallyUp ; now we have value 90 sta decimal @@ -2037,7 +2037,7 @@ VerticallyUp AngleDisplay mwa #statusBuffer+40+23 displayposition jsr displaybyte - ldx TankNr + ldx TankNr rts .endp ;------------------------------------------------- @@ -2047,7 +2047,7 @@ AngleDisplay dey lda gameOverSpritesTop,y sta temp - + ; clean the whole sprite lda #0 tax @@ -2055,11 +2055,11 @@ AngleDisplay sta PMGraph+$500,x dex bne @- - + lda #$01 sta sizep0 ; P0-P1 widths sta sizep0+1 - + ; set background lda #$ff ldx #100+7 ; top of the sprites @@ -2071,10 +2071,10 @@ AngleDisplay GOSbeg = 112 mva #GOSbeg hposp0 mva #GOSbeg+12 hposp0+1 - + mva #15 PCOLR0 sta PCOLR1 - + rts .endp diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index d9feec8..78fb207 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -103,7 +103,7 @@ EndOfUnPlot ; game. If you are going to speed up the game, start with ; plot - it is used by every single effect starting from explosions ; through line drawing and small text output!!! -; +; ; Optimized by 0xF (Fox) THXXXX!!! ; ----------------------------------------- @@ -112,7 +112,7 @@ EndOfUnPlot bcs unPlot.EndOfUnPlot ;nearest RTS CheckX02 cpw xdraw #screenwidth - bcs EndOfPlot + bcs EndOfPlot MakePlot ; let's calculate coordinates from xdraw and ydraw @@ -177,7 +177,7 @@ ClearPlot rts .endp ;-------------------------------------------------- -.proc drawmountains +.proc drawmountains ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify @@ -191,7 +191,7 @@ drawmountainsloop sta ydraw sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw @@ -217,12 +217,12 @@ drawmountainsloop lda linetableH,y adc xdraw+1 sta xbyte+1 - ldy #0 + ldy #0 dec tempbyte01 bne @- ; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot inc ydraw @@ -326,12 +326,12 @@ CharLoopi ;-- ldy #0 lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y inc ydraw @@ -392,7 +392,7 @@ EndPutChar cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS ; checks ommited. @@ -408,7 +408,7 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table @@ -471,7 +471,7 @@ CharLoopi4x4 ;-- ldy #0 lda (xbyte),y - ora mask1,x + ora mask1,x bit plot4x4color bpl PutInColor0_1 ; only mask - no char and char1,x @@ -479,7 +479,7 @@ PutInColor0_1 sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x + ora mask2,x bit plot4x4color bpl PutInColor0_2 ; only mask - no char and char2,x @@ -545,7 +545,7 @@ EndPut4x4 inw temp cpw temp #displayC64+screenheight*screenBytes+1 bne @- - rts + rts .endp ;-------------------------------------------------- @@ -581,7 +581,7 @@ next8lines :4 rol sta $d020 sta $d021 - + lda $dd00 ; Set video bank to start at 0 and #252 ora #3 diff --git a/C64/textproc.asm b/C64/textproc.asm index 34615f4..3c770bc 100644 --- a/C64/textproc.asm +++ b/C64/textproc.asm @@ -2,7 +2,7 @@ .IF *>0 - + WeaponsListDL = 0 NamesOfLevels = 0 ;---------------------------------------- @@ -27,7 +27,7 @@ NamesOfLevels = 0 bpl @- rts - + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 .endp @@ -51,7 +51,7 @@ NoGradientLoop lda GradientAddrL,y sta GradientColors lda GradientAddrH,y - sta GradientColors+1 + sta GradientColors+1 rts .endp @@ -76,7 +76,7 @@ ManualPurchase spl:rts jsr DefensivesActivate ; activate weapons bit escFlag - spl:rts + spl:rts AfterManualPurchase inc:lda TankNr cmp NumberOfPlayers @@ -87,8 +87,8 @@ AfterManualPurchase .proc DefensivesActivate ;-------------------------------------------------- ; This proc call Inventory and set Defensives activation first - - mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 @@ -104,13 +104,13 @@ AfterManualPurchase ; Rest of the data is taken from appropriate tables ; and during the purchase these tables are modified. - + ; we are clearing list of the weapons mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 GoToActivation rts - + .endp ; ----------------------------------------------------- @@ -173,7 +173,7 @@ NotRobot ; check if all chars are empty (" ") ldy #7 lda #0 -@ ora #0 ; NameAdr,y +@ ora #0 ; NameAdr,y and #$7F ; remove inverse (Cursor) dey bpl @- @@ -306,7 +306,7 @@ displayloop1 .endp ;------------------------------------------------- .proc RoundOverSprites - ; fill sprites with bytes + ; fill sprites with bytes rts .endp diff --git a/ai.asm b/ai.asm index f6f18f1..564a9f2 100644 --- a/ai.asm +++ b/ai.asm @@ -25,9 +25,9 @@ ; it's no necessary - PrepareAIShoot is next proc :) ; jsr PrepareAIShoot ; rts -.endp +.endp ;---------------------------------------------- -.proc PrepareAIShoot +.proc PrepareAIShoot ; create low precision table of positions ; by dividing positions by 4 ldy #MaxPlayers-1 @@ -76,11 +76,11 @@ AIRoutines rts .endp ;---------------------------------------------- -.proc Moron +.proc Moron jsr RandomizeAngle sta NewAngle mwa #80 RandBoundaryLow - mwa #800 RandBoundaryHigh + mwa #800 RandBoundaryHigh jsr RandomizeForce ; choose the best weapon ldy #ind_Buy_me +1 ; if the cheat is active it will fire the BFG :) @@ -88,13 +88,13 @@ AIRoutines ;rts .endp ;---------------------------------------------- -.proc Shooter +.proc Shooter lda PreviousAngle,x ora PreviousEnergyL,x ora PreviousEnergyH,x beq firstShoot - + lda PreviousAngle,x cmp #90 bcs shootingLeftAtThisMomentOfTime @@ -104,9 +104,9 @@ AIRoutines cmp #10 bcs @+ ;not smaller than 10 bcc firstShoot ; GET THE aim againg - + shootingLeftAtThisMomentOfTime - + clc adc #5 cmp #170 ; maximum shooter angle @@ -115,7 +115,7 @@ shootingLeftAtThisMomentOfTime sta NewAngle sec - lda PreviousEnergyL,x + lda PreviousEnergyL,x sbc #5 sta ForceTableL,x lda PreviousEnergyH,x @@ -140,10 +140,10 @@ firstShoot tankIsOnTheRight randomize 55 85 sta NewAngle - + forceNow mwa #100 RandBoundaryLow - mwa #800 RandBoundaryHigh + mwa #800 RandBoundaryHigh ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce @@ -153,12 +153,12 @@ endo lda NewAngle sta PreviousAngle,x lda ForceTableL,x - sta PreviousEnergyL,x + sta PreviousEnergyL,x lda ForceTableH,x sta PreviousEnergyH,x - + ; choose the best weapon - + jmp ChooseBestOffensive ;rts .endp @@ -172,40 +172,40 @@ firstShoot jsr FindBestTarget2 beq EnemyOnLeft ; calculate index to shotangle table - ; in temp2 we have x distance divided by 8 + ; in temp2 we have x distance divided by 8 lda temp2 :3 lsr @ and #%00000111 clc adc #8 sta AngleTablePointer - bne AngleIsSet + bne AngleIsSet EnemyOnLeft lda temp2 :3 lsr @ and #%00000111 eor #%00000111 - sta AngleTablePointer + sta AngleTablePointer AngleIsSet - + randomize 0 8 ldy AngleTablePointer clc adc AngleTable,y sta NewAngle - + forceNow mwa #300 RandBoundaryLow - mwa #700 RandBoundaryHigh + mwa #700 RandBoundaryHigh ldx TankNr jsr RandomizeForce -endo +endo ; choose the best weapon - + jsr ChooseBestOffensive rts - + ;---------------------------------------------- AngleTable ; 16 bytes ;ba w $348b L$3350 .by 106,114,122,130,138,146,154,162 @@ -220,7 +220,7 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 bcs EnoughEnergy ; lower than 5 units - white flag jsr ClearTankNr ; we must hide tank to erase shields (issue #138) - lda #ind_White_Flag + lda #ind_White_Flag sta ActiveDefenceWeapon,x jsr PutTankNr ; and draw tank witch Flag EnoughEnergy @@ -233,7 +233,7 @@ EnoughEnergy cmp #30 bcs EnoughEnergy ; lower than 30 units - check battery - ldy #ind_Battery + ldy #ind_Battery lda (temp),y ; has address of TanksWeaponsTable beq NoBatteries ; we have batteries - use one @@ -263,7 +263,7 @@ NoBatteries cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) beq NoUseDefensive lda (temp),y ; has address of TanksWeaponsTable - beq @- + beq @- ; decrease in inventory sec sbc #1 @@ -292,13 +292,13 @@ DefensiveInUse ; first check check if any is in use lda ActiveDefenceWeapon,x bne DefensiveInUse - ldy #last_real_defensive+1 ;the last defensive weapon + ldy #last_real_defensive+1 ;the last defensive weapon @ dey cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) beq NoUseDefensive lda (temp),y ; has address of TanksWeaponsTable - beq @- + beq @- ; decrease in inventory sec sbc #1 @@ -324,7 +324,7 @@ NoUseDefensive sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon jsr ChooseBestOffensive @@ -335,11 +335,11 @@ NoUseDefensive NotNegativeEnergy adw Force #100 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #6 ; 24/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -356,7 +356,7 @@ HighForce sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon jsr ChooseBestOffensive @@ -367,11 +367,11 @@ HighForce NotNegativeEnergy adw Force #50 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #6 ; 24/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -387,7 +387,7 @@ HighForce sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon ldy #ind_Nuke +1 jsr ChooseBestOffensive.NotFromAll @@ -396,11 +396,11 @@ HighForce sta ForceTableL,x lda Force+1 sta ForceTableH,x - ; if target distance lower than 32 - set weapon to Baby Missile (for security :) + ; if target distance lower than 32 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #8 ;32/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -423,7 +423,7 @@ HighForce ;ldx TankNr ldy NumberOfPlayers dey - + loop01 cpy TankNr beq skipThisPlayer @@ -446,8 +446,8 @@ ItIsHuman bcs EnemyOnTheLeft ; enemy on right inc tempor2 ; set direction to right - -EnemyOnTheLeft + +EnemyOnTheLeft lowestIsLower skipThisPlayer dey @@ -455,7 +455,7 @@ skipThisPlayer ; now we have number of the farthest tank in temp2+1 ; and direction (0 - left, >0 - right) in tempor2 ; let's move them to registers - ; in temp2 we have energy of target + ; in temp2 we have energy of target ldy temp2+1 lda tempor2 rts @@ -474,13 +474,13 @@ skipThisPlayer ;ldx TankNr ldy NumberOfPlayers dey - + loop01 cpy TankNr beq skipThisPlayer lda eXistenZ,y beq skipThisPlayer - + lda LowResDistances,x cmp LowResDistances,y bcs EnemyOnTheLeft @@ -503,7 +503,7 @@ EnemyOnTheLeft bcs lowestIsLower sta temp2 sty temp2+1 ; number of the closest tank - + lowestIsLower skipThisPlayer dey @@ -511,7 +511,7 @@ skipThisPlayer ; now we have number of the closest tank in temp2+1 ; and direction (0 - left, >0 - right) in tempor2 ; let's move them to registers - ; in temp2 we have x distance divided by 8 + ; in temp2 we have x distance divided by 8 ldy temp2+1 lda tempor2 rts @@ -529,7 +529,7 @@ skipThisPlayer mva #$ff SecondTryFlag ; set initial Angle and Force values lda OptionsTable+2 ; selected gravity - asl + asl tay ; force correction - lower tank Y position - higher possible force sec @@ -556,7 +556,7 @@ RepeatAim adc temp2 sta NewAngle ; set virtual weapon :) - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x ; now we have initial valuses mva #%11000000 TestFlightFlag @@ -597,11 +597,11 @@ GroundHitInFirstLoopR sta NewAngle jmp AimingRight NoHitInFirstLoopR - ; Angle 5 deg to left and end loop + ; Angle 5 deg to left and end loop sec lda NewAngle sbc #5 - sta NewAngle + sta NewAngle HitOnRightSideOfTargetR dec NewAngle EndOfFirstLoopR @@ -639,7 +639,7 @@ HitOnLeftSideOfTargetR ; decrease energy (a little) sbw Force #5 NoHitInSecondLoopR - ; Angle 1 deg to right and end loop + ; Angle 1 deg to right and end loop inc NewAngle EndOfSecondLoopR EndOfAim @@ -657,7 +657,7 @@ AimSecondTry sta ForceTableH,x jsr RandomizeForce.LimitForce jmp RepeatAim - + AimingLeft ; make test Shoot (Flight) jsr SetStartAndFlight @@ -692,11 +692,11 @@ GroundHitInFirstLoopL sta NewAngle jmp AimingLeft NoHitInFirstLoopL - ; Angle 5 deg to right and end loop + ; Angle 5 deg to right and end loop clc lda NewAngle adc #5 - sta NewAngle + sta NewAngle HitOnLeftSideOfTargetL inc NewAngle EndOfFirstLoopL @@ -734,11 +734,11 @@ HitOnRightSideOfTargetL ; decrease energy (a little) sbw Force #5 NoHitInSecondLoopL - ; Angle 1 deg to left and end loop + ; Angle 1 deg to left and end loop dec NewAngle EndOfSecondLoopL jmp EndOfAim - + SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight ; xtraj+1 and ytraj+1 set clc @@ -759,7 +759,7 @@ SetStartAndFlight ; set start point (virtual barrel end :) ) and make test fl rts .endp ;---------------------------------------------- -.proc PurchaseAI ; +.proc PurchaseAI ; ; A - skill of the TankNr ; makes purchase for AI opponents ; results of this routine are not visible on the screen @@ -804,7 +804,7 @@ PurchaseAIRoutines tay lda bittable,y ldy temp - and PurchaseMeTable2,y + and PurchaseMeTable2,y beq TryToPurchaseOnePiece.SorryNoPurchase jmp TryToPurchaseOnePiece.PurchaseIt .endp @@ -846,7 +846,7 @@ PurchaseIt lda temp2+1 sbc temp+1 sta MoneyH,x - + lda TanksWeaponsTableL,x sta temp lda TanksWeaponsTableH,x @@ -860,12 +860,12 @@ PurchaseIt lda #99 NotExceeded sta (temp),y - - + + SorryNoPurchase - rts + rts .endp - + ;---------------------------------------------- .proc ShooterPurchase @@ -877,17 +877,17 @@ SorryNoPurchase jsr TryToPurchaseOnePiece ; dec tempXroller ; bne @- - + ; and now offensives mva #4 tempXroller; number of offensive purchases to perform ;ldx TankNr @ - randomize ind_Missile ind_Heavy_Roller + randomize ind_Missile ind_Heavy_Roller jsr TryToPurchaseOnePiece dec tempXroller bne @- - rts + rts .endp ;---------------------------------------------- .proc PoolsharkPurchase @@ -895,21 +895,21 @@ SorryNoPurchase ; mva #2 tempXroller; number of offensive purchases to perform ldx TankNr @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece dec tempXroller ; bpl @- - + ; and now offensives mva #6 tempXroller; number of purchases to perform ;ldx TankNr @ - randomize ind_Missile ind_Dirt_Charge + randomize ind_Missile ind_Dirt_Charge jsr TryToPurchaseOnePiece dec tempXroller bne @- - rts + rts .endp ;---------------------------------------------- .proc TosserPurchase @@ -922,22 +922,22 @@ SorryNoPurchase ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece dec tempXroller bpl @- - + ; and now offensives lda MoneyH,x ; money / 256 asl ;*2 sta tempXroller ; perform this many purchase attempts @ - randomize ind_Missile ind_Dirt_Charge + randomize ind_Missile ind_Dirt_Charge jsr TryToPurchaseOnePiece dec tempXroller bpl @- - rts + rts .endp ;---------------------------------------------- .proc CyborgPurchase @@ -950,22 +950,22 @@ SorryNoPurchase ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- - + ; and now offensives lda MoneyH,x ; money / 256 :3 asl ;*8 sta tempXroller ; perform this many purchase attempts @ - randomize first_offensive last_offensive + randomize first_offensive last_offensive jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- - rts + rts .endp ;---------------------------------------------- .proc ChooseBestOffensive @@ -973,7 +973,7 @@ SorryNoPurchase ; X - TankNr ;---------------------------------------------- ldy #ind_Dirt_Charge +1 ;the last weapon to choose +1 (not BFG or Laser :) ) -NotFromAll +NotFromAll ; Y - the last offensive weapon to use + 1 lda TanksWeaponsTableL,x sta temp @@ -982,7 +982,7 @@ NotFromAll loop dey lda (temp),y - beq loop + beq loop tya sta ActiveWeapon,x rts diff --git a/artwork/joytest.asm b/artwork/joytest.asm index 0dbf434..0bd66ce 100644 --- a/artwork/joytest.asm +++ b/artwork/joytest.asm @@ -1,10 +1,10 @@ icl '../lib/atari.hea' - + org $2000 -joytest +joytest mva #0 dmactls - + @ lda trig0 beq pressed @@ -15,6 +15,5 @@ pressed ;ora jstick0 sta colbak jmp @- - - run joytest - \ No newline at end of file + + run joytest diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm index dfbe15c..0ba35d0 100644 --- a/artwork/sfx/rmtplayr_modified.asm +++ b/artwork/sfx/rmtplayr_modified.asm @@ -620,7 +620,7 @@ rmt_p5 .IF TARGET = 800 ldx #$10 ; pseudo stereo bne SetPokey_OffsetX ; pseudo stereo -.ELSE +.ELIF TARGET = 5200 rts .ENDIF SetPokey diff --git a/artwork/splash_v2/lzss_player.asm b/artwork/splash_v2/lzss_player.asm index f3c6eff..f276135 100644 --- a/artwork/splash_v2/lzss_player.asm +++ b/artwork/splash_v2/lzss_player.asm @@ -6,7 +6,7 @@ song_end buffers .ds 256 * 9 - + POKEY2 = POKEY+$10 ; stereo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -22,7 +22,7 @@ POKEY2 = POKEY+$10 ; stereo mva #1 bit_data ; Example: here initializes song pointer: - + ;mwa #song_data song_ptr ; Init all channels: @@ -67,7 +67,7 @@ delay sta POKEY2,x ; stereo dex ;stereo bpl @- ; stereo - + lda #>buffers sta bptr+1 @@ -150,4 +150,3 @@ skip stereo_buff ; stereo .ds 9 ; stereo - \ No newline at end of file diff --git a/artwork/splash_v2/splash.asm b/artwork/splash_v2/splash.asm index 5b4f552..93accb2 100644 --- a/artwork/splash_v2/splash.asm +++ b/artwork/splash_v2/splash.asm @@ -4,7 +4,7 @@ /***************************************/ icl "splash.h" - + ; --- dmsc LZSS player routine on zero page org $80 @@ -57,7 +57,7 @@ fnt .ds $0300 pmg SPRITES eif - + FontSplash ins '../../artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' @@ -103,14 +103,14 @@ LOOP lda vcount ;synchronization for the first screen (picture) line mva >ant dlptr+1 icl "output.png.rp.ini" - + ;--- 16 lines down ---- !!! :16 sta wsync - + ; wait 13 cycles !!! :4 nop inc byt2 - + ;--- wait 18 cycles ; jsr _rts ; inc byt3 @@ -185,7 +185,7 @@ stop mva #$00 pmcntl ;PMG disabled sta POKEY2,x ; stereo dex bpl @- - + ;no glitching please (issue #67) lda #0 sta $D400 ;dmactl diff --git a/constants.asm b/constants.asm index f1b7ca4..cf10a5e 100644 --- a/constants.asm +++ b/constants.asm @@ -59,11 +59,11 @@ LineGameOver seppukuText dta d"# SEPPUKU! #" areYouSureText - .IF target != 5200 + .IF TARGET = 800 dta d"# SURE? Y/N #" - .ELSE + .ELIF TARGET = 5200 dta d"#END? Y-1/N-0#" - .ENDIF + .ENDIF lineClear dta d" " @@ -232,109 +232,109 @@ TanksNamesDefault dta d":1th.Tank" .ENDR ;------------------------------------------------- -TankShapesTable .BYTE char_tank1 - .BYTE char_tank2 - .BYTE char_tank3 - .BYTE char_tank4 -;------------------------------------------------- +TankShapesTable .BYTE char_tank1 + .BYTE char_tank2 + .BYTE char_tank3 + .BYTE char_tank4 +;------------------------------------------------- WeaponPriceH ; weapons prices (tables with prices of weapons) - .by >price_Baby_Missile - .by >price_Missile - .by >price_Baby_Nuke - .by >price_Nuke - .by >price_LeapFrog - .by >price_Funky_Bomb - .by >price_MIRV - .by >price_Death_s_Head - .by >price_Napalm - .by >price_Hot_Napalm - .by >price_Tracer - .by >price_Smoke_Tracer - .by >price_Baby_Roller - .by >price_Roller - .by >price_Heavy_Roller - .by >price_Riot_Charge - .by >price_Riot_Blast - .by >price_Riot_Bomb + .by >price_Baby_Missile + .by >price_Missile + .by >price_Baby_Nuke + .by >price_Nuke + .by >price_LeapFrog + .by >price_Funky_Bomb + .by >price_MIRV + .by >price_Death_s_Head + .by >price_Napalm + .by >price_Hot_Napalm + .by >price_Tracer + .by >price_Smoke_Tracer + .by >price_Baby_Roller + .by >price_Roller + .by >price_Heavy_Roller + .by >price_Riot_Charge + .by >price_Riot_Blast + .by >price_Riot_Bomb .by >price_Heavy_Riot_Bomb - .by >price_Baby_Digger - .by >price_Digger - .by >price_Heavy_Digger - .by >price_Baby_Sandhog - .by >price_Sandhog - .by >price_Heavy_Sandhog - .by >price_Dirt_Clod - .by >price_Dirt_Ball - .by >price_Ton_of_Dirt - .by >price_Liquid_Dirt - .by >price_Dirt_Charge - .by >price_Buy_me - .by >price_Laser - .by >price_White_Flag - .by >price_Battery - .by >price_Hovercraft - .by >price_Parachute + .by >price_Baby_Digger + .by >price_Digger + .by >price_Heavy_Digger + .by >price_Baby_Sandhog + .by >price_Sandhog + .by >price_Heavy_Sandhog + .by >price_Dirt_Clod + .by >price_Dirt_Ball + .by >price_Ton_of_Dirt + .by >price_Liquid_Dirt + .by >price_Dirt_Charge + .by >price_Buy_me + .by >price_Laser + .by >price_White_Flag + .by >price_Battery + .by >price_Hovercraft + .by >price_Parachute .by >price_StrongParachute - .by >price_Mag_Deflector - .by >price_Shield - .by >price_Heavy_Shield - .by >price_Force_Shield - .by >price_Bouncy_Castle - .by >price_Long_Barrel + .by >price_Mag_Deflector + .by >price_Shield + .by >price_Heavy_Shield + .by >price_Force_Shield + .by >price_Bouncy_Castle + .by >price_Long_Barrel .by >price_Nuclear_Winter_ - .by >price_Lazy_Boy - .by >price_Lazy_Darwin - .by >price_Auto_Defense - .by >price_Spy_Hard + .by >price_Lazy_Boy + .by >price_Lazy_Darwin + .by >price_Auto_Defense + .by >price_Spy_Hard WeaponPriceL - .by 0 diff --git a/constants_top.asm b/constants_top.asm index 7ba3afe..9ee1268 100644 --- a/constants_top.asm +++ b/constants_top.asm @@ -14,7 +14,7 @@ dliColorsFore .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 CashOptionL ;(one zero less than on the screen) .by 0,<200,<800,<1200,<2000 -CashOptionH +CashOptionH .by 0,>200,>800,>1200,>2000 GravityTable .by 10,20,25,30,40 MaxWindTable .by 5,20,40,70,99 diff --git a/definitions.asm b/definitions.asm index f6c6f3d..536388b 100644 --- a/definitions.asm +++ b/definitions.asm @@ -34,7 +34,7 @@ char_flame = $14 char_clear_flame = $1c char_digger = $04 char_sandhog = $0c -char_sandhog_offset = char_sandhog - char_digger +char_sandhog_offset = char_sandhog - char_digger char_tank1 = $20 char_tank2 = $24 char_tank3 = $2c @@ -74,16 +74,16 @@ price_Dirt_Charge = 343 ;_29 price_Buy_me = 170 ;_30 price_Laser = 277 ;_31 price_White_Flag = $0 ;_32 -price_Battery = 300 ;_33 -price_Hovercraft = 352 ;_34 -price_Parachute = 234 ;_35 -price_StrongParachute = 1000 ;_36 -price_Mag_Deflector = 745 ;_37 -price_Shield = 224 ;_38 -price_Heavy_Shield = 628 ;_39 -price_Force_Shield = 1100 ;_40 -price_Bouncy_Castle = 512 ;_41 -price_Long_Barrel = 2100 ;_42 +price_Battery = 300 ;_33 +price_Hovercraft = 352 ;_34 +price_Parachute = 234 ;_35 +price_StrongParachute = 1000 ;_36 +price_Mag_Deflector = 745 ;_37 +price_Shield = 224 ;_38 +price_Heavy_Shield = 628 ;_39 +price_Force_Shield = 1100 ;_40 +price_Bouncy_Castle = 512 ;_41 +price_Long_Barrel = 2100 ;_42 price_Nuclear_Winter_ = 1000 ;_43 price_Lazy_Boy = 500 ;_44 price_Lazy_Darwin = 730 ;_45 @@ -91,7 +91,7 @@ price_Auto_Defense = 250 ;_46 price_Spy_Hard = 83 ;_47 ;Weapon indexes (numbers) ind_Baby_Missile = 0 -first_offensive = ind_Baby_Missile +first_offensive = ind_Baby_Missile ind_Missile = 1 ind_Baby_Nuke = 2 ind_Nuke = 3 @@ -123,26 +123,26 @@ ind_Liquid_Dirt = 28 ind_Dirt_Charge = 29 ind_Buy_me = 30 ind_Laser = 31 -last_offensive = ind_Laser +last_offensive = ind_Laser ind_White_Flag = 32 -first_defensive = ind_White_Flag -ind_Battery = 33 -ind_Hovercraft = 34 -ind_Parachute = 35 -ind_StrongParachute = 36 -ind_Mag_Deflector = 37 -ind_Shield = 38 -ind_Heavy_Shield = 39 -ind_Force_Shield = 40 -ind_Bouncy_Castle = 41 -ind_Long_Barrel = 42 +first_defensive = ind_White_Flag +ind_Battery = 33 +ind_Hovercraft = 34 +ind_Parachute = 35 +ind_StrongParachute = 36 +ind_Mag_Deflector = 37 +ind_Shield = 38 +ind_Heavy_Shield = 39 +ind_Force_Shield = 40 +ind_Bouncy_Castle = 41 +ind_Long_Barrel = 42 ind_Nuclear_Winter_ = 43 ind_Lazy_Boy = 44 ind_Lazy_Darwin = 45 ind_Auto_Defense = 46 ind_Spy_Hard = 47 -last_defensive = ind_Spy_Hard -last_real_defensive = ind_Bouncy_Castle +last_defensive = ind_Spy_Hard +last_real_defensive = ind_Bouncy_Castle number_of_offensives = last_offensive - first_offensive +1 number_of_defensives = (last_defensive - first_defensive +1) number_of_weapons = number_of_offensives + number_of_defensives diff --git a/game.asm b/game.asm index ad57161..c08763d 100644 --- a/game.asm +++ b/game.asm @@ -8,7 +8,7 @@ START jsr Initialize ;jsr GameOverScreen ; only for test !!! - + RMTSong song_main_menu jsr Options ;startup screen @@ -24,7 +24,7 @@ START jsr RandomizeSequence ; for the round #1 shooting sequence is random - + MainGameLoop jsr SetWallsType ; first set default barrel lengths (fix for Long Schlong activation :) ) @@ -40,20 +40,20 @@ MainGameLoop jsr GetRandomWind jsr RoundInit - + jsr MainRoundLoop bit escFlag jvs GoGameOver bmi START jsr CalculateGains - + jsr SortSequence - - mva #0 TankNr ; + + mva #0 TankNr ; sta COLBAKS ; set background color to black sta JoystickNumber ; set joystick port for player - + ; Hide all (easier than hide last ;) ) tanks jsr cleartanks ; A=0 @@ -69,7 +69,7 @@ MainGameLoop jsr DemoModeOrKey jsr MakeDarkScreen - + lda GameIsOver beq NoGameOverYet GoGameOver @@ -80,7 +80,7 @@ NoGameOverYet mva #sfx_silencer sfx_effect jmp MainGameLoop - + ;-------------------------------------------------- .proc CalculateGains ;-------------------------------------------------- @@ -96,7 +96,7 @@ NoGameOverYet ldx NumberOfPlayers dex CalculateGainsLoop - + ; adding the remaining energy of the tank to gain ; winner gets more ! :) lda Energy,x @@ -104,7 +104,7 @@ CalculateGainsLoop sta gainL,x bcc @+ inc gainH,x -@ +@ ; add gain * 2 asl gainL,x rol gainH,x @@ -175,7 +175,7 @@ eskipzeroing rts .endp ;-------------------------------------------------- -.proc RoundInit +.proc RoundInit ;-------------------------------------------------- ; at the beginning of each Round we set energy ; of all players to 99 @@ -191,7 +191,7 @@ eskipzeroing sta AfterBFGflag ; reset BFG flag sta COLOR2 ; status line "off" sta COLOR1 - + tax @ sta singleRoundVars,x inx @@ -219,7 +219,7 @@ SettingEnergies sta ForceTableL,x lda #>350 sta ForceTableH,x - + ;lda #(255-45) ;it does not look good when all tanks have ;barrels pointing the same direction @@ -227,7 +227,7 @@ SettingEnergies ;angles jsr RandomizeAngle sta AngleTable,x - + dex bpl SettingEnergies @@ -312,10 +312,10 @@ DoNotFinishTheRound lda noDeathCounter cmp seppukuVal bcc @+ - + mva #0 noDeathCounter mva #sfx_seppuku sfx_effect - + jsr DisplaySeppuku jmp Seppuku @@ -342,10 +342,10 @@ CheckNextTankAD jeq NextPlayerShoots - + mva #$ff plot4x4color jsr DisplayTankNameAbove - + mva #1 color ;to display flying point ldx tankNr @@ -358,7 +358,7 @@ CheckNextTankAD beq ManualShooting RoboTanks - ; robotanks shoot here + ; robotanks shoot here ; TankNr still in X jsr ArtificialIntelligence ;pause 30 @@ -391,7 +391,7 @@ AfterManualShooting ; defensive weapons without flight handling ldx TankNr lda ActiveDefenceWeapon,x - cmp #ind_Hovercraft + cmp #ind_Hovercraft beq GoFloat cmp #ind_White_Flag ; White Flag beq ShootWhiteFlag @@ -431,10 +431,10 @@ ShootNow bit escFlag spl:rts ; keys Esc or O - + lda HitFlag ;0 if missed beq missed - + jsr Explosion continueMainRoundLoopAfterSeppuku @@ -461,7 +461,7 @@ missed bne @+ ldx TankNr tya - sta ActiveWeapon,x + sta ActiveWeapon,x @ ;here we clear offensive text (after a shoot) @@ -477,7 +477,7 @@ NextPlayerShoots SeteXistenZ lda Energy,x sta eXistenZ,x - + jsr MaxForceCalculate dex @@ -504,7 +504,7 @@ PlayersAgain ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ mva #sfx_next_player sfx_effect - + ldx NumberOfPlayers dex CheckingPlayersDeath @@ -521,7 +521,7 @@ NoPlayerNoDeath cmp NumberOfPlayers bne NotLastPlayerInRound mva #0 TankSequencePointer - + lda WindChangeInRound beq NoWindChangeNow jsr GetRandomWind ; wind change after each turn (not round only) @@ -529,7 +529,7 @@ NoWindChangeNow NotLastPlayerInRound jmp MainRoundLoop .endp - + ;--------------------------------- .proc PlayerXdeath ; this tank should not explode anymore: @@ -560,9 +560,9 @@ NotLastPlayerInRound adc ResultsTable,x sta ResultsTable,x ;inc CurrentResult - + ; RandomizeDeffensiveText - randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) + randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) TextAfterBFG sta TextNumberOff inc CurrentResult ; ... but increase result of winner (BFG) @@ -574,7 +574,7 @@ TextAfterBFG mva TankNr temp2 ; not elegant, and probably unnecessary sty TankNr jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) - mva temp2 TankNr + mva temp2 TankNr ;Deffensive text cleanup ;here we clear Deffensive text (after a shoot) @@ -752,7 +752,7 @@ NotNegativeShieldEnergy ; Energy of tank X in A ;-------------------------------------------------- sta L1 - + ;DATA L1,L2 ;Multiplication 8bit*8bit, ;result 16bit @@ -786,7 +786,7 @@ B0 dey @ lda #$0 cpx #ind_White_Flag ; White Flag bne no99 -set99 lda #99 +set99 lda #99 no99 .REPT MaxPlayers, #+1 sta TanksWeapon:1,x @@ -823,16 +823,16 @@ deletePtr = temp iny sty TankShape+2 sty TankShape+5 - + mwa #1024 RandBoundaryHigh mva #$ff LastWeapon sta HowMuchToFall mva #1 color - + jsr SetStandardBarrels - jsr WeaponCleanup - + jsr WeaponCleanup + mva #>WeaponFont chbas ;parameter for old plot (unPlot) max 5 points @@ -869,7 +869,7 @@ MakeTanksVisible mva #1 CurrentRoundNr ;we start from round 1 mva #6 NTSCcounter - + rts .endp ;-------------------------------------------------- @@ -973,7 +973,7 @@ UsageLoop lda RANDOM and #%00000011 ;(0..1023) sta temp2+1 - + cpw RandBoundaryLow temp2 seq:bcs RandomizeForce @@ -984,9 +984,9 @@ UsageLoop sta ForceTableL,x lda temp2+1 sta ForceTableH,x - + ;--------- -LimitForce +LimitForce ; in X must be TankNr ; cuts force to MaxForceTable lda MaxForceTableH,x @@ -995,7 +995,7 @@ LimitForce lda MaxForceTableL,x cmp ForceTableL,x @ bcs @+ - + lda MaxForceTableL,x sta ForceTableL,x lda MaxForceTableH,x @@ -1045,7 +1045,7 @@ rotateLeft ; older is bigger BarrelPositionIsFine jsr DrawTankNr rts - + .endp ;---------------------------------------------- @@ -1166,7 +1166,7 @@ SetRandomWalls .endp ; -------------------------------------- ; Sets the appropriate variables based on the options table -; +; .proc SetVariablesFromOptions ;first option ldy OptionsTable @@ -1196,29 +1196,29 @@ SetRandomWalls ldy OptionsTable+3 lda MaxWindTable,y sta MaxWind - + ;fifth option (no of rounds) ldy OptionsTable+4 lda RoundsTable,y sta RoundsInTheGame - + ;6th option (shell speed) ldy OptionsTable+5 lda flyDelayTable,y sta flyDelay - + ;7th option (Airstrike after how many missess) ldy OptionsTable+6 lda seppukuTable,y sta seppukuVal - + ;8th option (how aggressive are mountains) ldy OptionsTable+7 lda mountainsDeltaTableH,y sta mountainDeltaH lda mountainsDeltaTableL,y sta mountainDeltaL - + rts .endp @@ -1228,9 +1228,9 @@ SetRandomWalls ;using 4x4 font jsr RoundOverSprites - + mva #$ff plot4x4color - + ;centering the result screen mva #((ScreenHeight/2)-(8*4)) ResultY @@ -1246,7 +1246,7 @@ SetRandomWalls lda CurrentRoundNr cmp RoundsInTheGame beq GameOver4x4 - + sta decimal mwa #RoundNrDisplay displayposition jsr displaybyte ;decimal (byte), displayposition (word) @@ -1264,7 +1264,7 @@ GameOver4x4 mva ResultY LineYdraw jsr TypeLine4x4 mva #1 GameIsOver - + @ adb ResultY #4 ;next line @@ -1321,7 +1321,7 @@ ResultOfTheNextPlayer ; overwrite the second digit of the points (max 255) ;it means ":" mva #26 ResultLineBuffer+9 - + ldx #0 lda TankNr asl diff --git a/grafproc.asm b/grafproc.asm index f1351bc..cbe8eb4 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -4,7 +4,7 @@ ;-------------------------------------------------- -.proc draw ;;fuxxing good draw :) +.proc draw ;;fuxxing good draw :) ; xdraw,ydraw (word) - coordinates of first point ; xbyte,ybyte (word) - coordinates of last point ;-------------------------------------------------- @@ -221,7 +221,7 @@ LineGoesLeft ; line goes left - we are reversing X sbw xtempDRAW temp xdraw ; XI PutPixelinDraw - + ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) bit drawFunction bpl @+ @@ -276,7 +276,7 @@ StopHitChecking jmp ContinueDraw @ MeasureVisualisation - jsr plot + jsr plot ContinueDraw ; XI=XI+1 @@ -292,9 +292,9 @@ EndOfDraw .endp ;-------------------------------------------------- -.proc circle ;fxxxing good circle drawing :) +.proc circle ;fxxxing good circle drawing :) ; xdraw,ydraw (word) - coordinates of circle center -; radius (byte) - radius of circle +; radius (byte) - radius of circle ;-------------------------------------------------- ;Turbo Basic source ; R=30 @@ -483,10 +483,10 @@ endcircleloop ; it is necessary, because randomizing checks ; if the given tank is already placed ; after check if its position is not (0,0) - + ; I will be honest with you - I have no idea ; what the above comment was intending to mean :) - + sta XtankstableL,x sta XtankstableH,x sta Ytankstable,x @@ -708,7 +708,7 @@ NoMissile bcs PMForTank6 ; clear sprite and put 3 lines on the tank at the same time ldx #3 ; three lines of PM -ClearPM +ClearPM cpy temp bne ZeroesToGo @ lda (xbyte),y @@ -728,7 +728,7 @@ ZeroesToGo PMForTank6 ; clear sprite and put 3 lines on the tank at the same time ldx #3 ; three lines of PM -ClearPM6 +ClearPM6 cpy temp bne ZeroesToGo6 @ lda (xbyte),y @@ -756,7 +756,7 @@ noTankNoPM ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ldx TankNr lda ActiveDefenceWeapon,x - cmp #ind_Shield ; one shot shield + cmp #ind_Shield ; one shot shield beq DrawTankSh cmp #ind_Force_Shield ; shield with energy and parachute beq DrawTankShieldBold @@ -809,7 +809,7 @@ DoNotDrawTankNr tankflash_loop lda CONSOL ; turbo mode and #%00000001 ; START KEY - sne:mva #1 fs ; finish it + sne:mva #1 fs ; finish it mva #1 Erase ldx TankNr jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! @@ -833,7 +833,7 @@ tankflash_loop ; if use DrawInPosition entry point then: ; xdraw, ydraw - coordinates left LOWER corner of Tank char ; values remain there after a DrawTankNr proc. -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- sbw xdraw #$03 ; 3 pixels to left @@ -934,7 +934,7 @@ ToHighToParachute ;-------------------------------------------------- .proc DrawTankRocketEngine ; X - tank number -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- clc @@ -942,7 +942,7 @@ ToHighToParachute adc #2 ; 1 pixel down sta ydraw mva #0 ydraw+1 - + clc lda XtanksTableL,x adc #2 ; 2 pixels to right @@ -951,18 +951,18 @@ ToHighToParachute adc #0 sta xdraw+1 - ; draw first horizontal line + ; draw first horizontal line mva #5 temp @ jsr plot inw xdraw dec temp bne @- - - sbw xdraw #2 ; 2 pixels left + + sbw xdraw #2 ; 2 pixels left inw ydraw ; 1 pixel down - - ; draw second horizontal line + + ; draw second horizontal line mva #3 temp @ jsr plot @@ -970,7 +970,7 @@ ToHighToParachute dec temp bne @- - adw xdraw #2 ; 2 pixels right + adw xdraw #2 ; 2 pixels right inw ydraw ; 1 pixel down ; and last pixel @@ -982,7 +982,7 @@ ToHighToParachute ;-------------------------------------------------- .proc DrawTankEngine ; X - tank number -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- ; one pixel under tank @@ -1087,7 +1087,7 @@ ROLPoint2 rol UnderTank1 inw xdraw dec temp - bne ByteBelowTank + bne ByteBelowTank NoGroundCheck ldx TankNr lda Ytankstable,x @@ -1099,7 +1099,7 @@ NoGroundCheck lda Parachute and #1 bne ParachutePresent - ; decreasing energy + ; decreasing energy ldy #2 ; how much energy to substract if no parachute jsr DecreaseEnergyX ParachutePresent @@ -1114,7 +1114,7 @@ ParachutePresent beq @+ jsr DecreaseEnergyX @ - ; check energy of parachute + ; check energy of parachute lda ShieldEnergy,x bne OneTimeParachute lda #$00 @@ -1187,7 +1187,7 @@ NotLeftEdge EndLeftFall EndRightFall NoLeftOrRight - inc EndOfTheFallFlag ; after this is shouldn't fall + inc EndOfTheFallFlag ; after this is shouldn't fall EndOfFCycle ; draw tank on new position jsr DrawTankNr ; ew have TankNr in X (I hope :) ) @@ -1247,7 +1247,7 @@ NoParachuteWeapon beq ThereWasNoParachute jsr DrawTankParachute ThereWasNoParachute -; ldx TankNr +; ldx TankNr jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) mva #sfx_silencer sfx_effect rts @@ -1267,7 +1267,7 @@ ThereWasNoParachute sta pmgraph+$700,y iny bne @- - rts + rts .endp /* @@ -1419,7 +1419,7 @@ ColumnIsReady bcc FalloutOfLine beq FalloutOfLine - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' lda IsEndOfTheFallFlag @@ -1539,7 +1539,7 @@ EndDrawing rts .endp -/* +/* ;-------------------------------------------------- .proc calculatemountains0 ; Only for testing - makes ground flat (0 pixels) @@ -1601,7 +1601,7 @@ NotHigher sta temp ; opty possible ; substract address of the next text from previous to get text length sbw temp LineAddress4x4 temp2 - mva temp2 fx + mva temp2 fx ;jsr Display4x4AboveTank ;rts @@ -1745,7 +1745,7 @@ DOTOldLowestValue bne end_found dey bne @- - + end_found iny sty fx @@ -1797,21 +1797,21 @@ EndOfTypeLine4x4 ;-------------------------------- .proc AreYouSure ;using 4x4 font - + mva #4 ResultY ; where seppuku text starts Y-wise on the screen - + ;top frame mva ResultY LineYdraw jsr TL4x4_top adb ResultY #4 ;next line - + ;sure? mwa #areYouSureText LineAddress4x4 - jsr _sep_opty + jsr _sep_opty ;bottom frame mva ResultY LineYdraw jsr TL4x4_bottom - + jsr GetKey cmp #@kbcode._Y ; $2b ; "Y" @@ -1821,14 +1821,14 @@ EndOfTypeLine4x4 @ mva #0 escFlag skip01 jsr WaitForKeyRelease - + ;clean mva #3 di mva #4 ResultY @ mva #$ff plot4x4color mwa #lineClear LineAddress4x4 - jsr _sep_opty + jsr _sep_opty dec di bne @- @@ -1847,31 +1847,31 @@ quit_areyousure ;-------------------------------- .proc DisplaySeppuku ;using 4x4 font - + mva #20 fs ; temp, how many times blink the billboard seppuku_loop lda CONSOL ; turbo mode and #%00000001 ; START KEY - sne:mva #1 fs ; finish it + sne:mva #1 fs ; finish it mva #4 ResultY ; where seppuku text starts Y-wise on the screen - + ;top frame mva ResultY LineYdraw jsr TL4x4_top adb ResultY #4 ;next line - + ;seppuku mwa #seppukuText LineAddress4x4 jsr _sep_opty - + ;bottom frame mva ResultY LineYdraw jsr TL4x4_bottom ; just go ;clean seppuku - + mva #3 di ;mva #4 ResultY lda #4 @@ -1879,7 +1879,7 @@ seppuku_loop loplop ;@ mwa #lineClear LineAddress4x4 jsr _sep_opty - + dec di bne loplop ;@- @@ -1888,7 +1888,7 @@ loplop ;@ quit_seppuku rts - + .endp ; ------------------------------------- @@ -1909,7 +1909,7 @@ X lda XtanksTableL,x ;-------------------------------------------------- ;vx calculation ;vx = sin(90-Angle) for Angle <=90 - ;vx = -sin(Angle-90) for 90 < Angle <= 180 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 ; erase previous barrel @@ -1918,7 +1918,7 @@ X lda XtanksTableL,x ; lda previousBarrelAngle,x ; sta Angle ; jsr DrawBarrelTech - ; + ; ; mva #1 color ldx TankNr jsr SetupXYdraw @@ -1932,11 +1932,11 @@ X lda XtanksTableL,x .proc DrawBarrelTech ; angle in Angle and A - + mvx #0 goleft cmp #91 bcc angleUnder90 - + ;over 90 sec sbc #90 @@ -1953,8 +1953,8 @@ angleUnder90 tax ; barrel start offset under 90deg adw xdraw #3 xdraw - -@ + +@ sbw ydraw #3 ydraw lda sintable,x ; cos(X) sta vx @@ -1967,7 +1967,7 @@ angleUnder90 lda Angle cmp #91 bcc YangleUnder90 - + lda #180 sec sbc Angle @@ -1984,14 +1984,14 @@ YangleUnder90 sta fy ; draw by vx vy - ; in each step + ; in each step ; 1. plot(xdraw, ydraw) ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy ; 3 check length, if shorter, go to 1. - + ; mva #6 yc ; barrel length barrelLoop - + lda goleft bne goright clc @@ -2029,15 +2029,15 @@ ybarrel sta ydraw bcs @+ dec ydraw+1 -@ +@ jsr plot ;.MakePlot dec yc bne barrelLoop - + mwa xdraw EndOfTheBarrelX mva ydraw EndOfTheBarrelY - + rts .endp ;-------------------------------------------------- diff --git a/scorch.asm b/scorch.asm index b89fcf4..9a14dbd 100644 --- a/scorch.asm +++ b/scorch.asm @@ -7,7 +7,7 @@ ;--------------------------------------------------- .IFNDEF TARGET - .def TARGET = 800 ; 5200 ; or 64 + .def TARGET = 800 ; 5200 .ENDIF ;atari800 -5200 -cart ${outputFilePath} -cart-type 4 ;atari800 -run ${outputFilePath} @@ -64,7 +64,7 @@ FirstZpageVariable = $57 .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine - .zpvar fx .byte + .zpvar fx .byte .zpvar yi .word ;Y (word) in draw routine .zpvar fy .byte .zpvar xk .word @@ -77,7 +77,7 @@ FirstZpageVariable = $57 .zpvar dp .word ;---------------------------- .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank2 .byte ;---------------------------- .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word @@ -131,7 +131,7 @@ FirstZpageVariable = $57 .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -152,11 +152,15 @@ FirstZpageVariable = $57 ;----------------------------------------------- ; libraries ;----------------------------------------------- - .IF TARGET = 5200 + .IF TARGET = 800 + icl 'Atari/lib/ATARISYS.ASM' + icl 'Atari/lib/MACRO.ASM' + icl 'artwork/splash_v2/splash.asm' ; splash screen and musix + .ELIF TARGET = 5200 OPT h-f+ ; no headers, single block --> cart bin file icl 'Atari/lib/5200SYS.ASM' icl 'Atari/lib/5200MACRO.ASM' - .enum @kbcode + .enum @kbcode /* _0 _1 @@ -193,21 +197,17 @@ FirstZpageVariable = $57 _none = $0f .ende - .ELSE - icl 'Atari/lib/ATARISYS.ASM' - icl 'Atari/lib/MACRO.ASM' - icl 'artwork/splash_v2/splash.asm' ; splash screen and musix .ENDIF - + ;----------------------------------------------- ; variable declarations in RAM (no code) ;----------------------------------------------- ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) icl 'variables.asm' - + ; Game loading address ORG $4000 - + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' @@ -220,25 +220,25 @@ DisplayCopyStart icl 'Atari/display_main_menu.asm' DisplayCopyEnd org DisplayCopyRom + (DisplayCopyEnd - DisplayCopyStart) - + DisplayCopyPurchaseDlROM = * org DisplayCopyPurchase, DisplayCopyPurchaseDlROM DisplayCopyPurchaseStart icl 'Atari/display_purchasedl.asm' DisplayCopyPurchaseEnd org DisplayCopyPurchaseDlROM + (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart) - + StatusBufferROM = * org StatusBufferCopy, StatusBufferROM StatusBufferCopyStart icl 'Atari/display_status.asm' StatusBufferCopyEnd org StatusBufferROM + (StatusBufferCopyEnd - StatusBufferCopyStart) - + icl 'Atari/display_static.asm' ;---------------------------------------------- - + ;-------------------------------------------------- ; Game Code ;-------------------------------------------------- @@ -246,16 +246,11 @@ FirstSTART .IF TARGET = 5200 ; start in 5200 diagnostic mode ; move original startup procedure to RAM + Modified5200Splash = $2100 ; apparently there is some free space here - ; 6502 initialization - ; SEI - ; CLD - ; LDX #$FF - ; TXS - ; check kernel version Atari5200KernelByte = $fff8 - ; $32 - 4 joy + ; $32 - 4 joy ; $00 - 2 joy ; $ff - Altirra kernel @@ -276,11 +271,11 @@ rom2joy @ mwa $fffc temp ; startup proc address mwa #Modified5200Splash temp2 - jsr CopyFromROM + jsr CopyFromROM ; modify the end of the splash procedure lda #$60 ; rts sta (temp2),y - + jsr Modified5200Splash+$0f ; after the diag cart detection ; modify the text splash_text = $3c80 ; '.scorch.supersystem.copyright.19xx.atari' @@ -290,12 +285,12 @@ rom2joy @ lda NewSplashText,y sta splash_copyright,y dey - bpl @- - + bpl @- + ; splash screen delay. maybe add fire to speed up? @ cpx RTCLOK+1 bne @- -no5200splash +no5200splash .ENDIF jsr MakeDarkScreen @@ -305,13 +300,13 @@ no5200splash @ sta OneTimeZeroVariables,y dey bpl @- - + ; one time zero variables in RAM (zero page) ldy #FirstZpageVariable @ sta $0000,y iny bne @- - + ; initialize variables in RAM (non zero page) ldy #initialvaluesCount-1 @ lda initialvaluesStart,y @@ -327,41 +322,32 @@ no5200splash jsr GenerateLineTable .IF TARGET = 800 - -; pokeys init - lda #3 ; stereo - sta POKEY+$0f ; stereo - sta POKEY+$1f ; stereo - - lda PAL - and #%00001110 - bne NoRMT_PALchange - ;it is PAL here - ; Change RMT to PAL version - ; 5 values in RMT file - ; not elegant :( - mva #$06 MODUL-6+$967 ; $07 > $06 - ;mva #$06 MODUL-6+$bc3 ; $07 > $06 - ;mva #$06 MODUL-6+$e69 ; $08 > $06 - ;mva #$06 MODUL-6+$ebc ; $08 > $06 - sta MODUL-6+$bc3 ; $07 > $06 - sta MODUL-6+$e69 ; $08 > $06 - sta MODUL-6+$ebc ; $08 > $06 - mva #$10 MODUL-6+$a69 ; $12 > $10 - mva #$04 MODUL-6+$bf8 ; $05 > $04 - mva #$08 MODUL-6+$e3d ; $0a > $08 - - ; and mountains colors table address - mva #dliColorsFore2PAL GradientAddrH+2 -; mva #$c4 dliColorsFore2+16 -; mva #$c6 dliColorsFore2+17 -; mva #$a4 dliColorsFore2+18 -; mva #$a6 dliColorsFore2+19 -; sta dliColorsFore2+20 + ; pokeys init + lda #3 ; stereo + sta POKEY+$0f ; stereo + sta POKEY+$1f ; stereo + + lda PAL + and #%00001110 + bne NoRMT_PALchange + ;it is PAL here + ; Change RMT to PAL version + ; 5 values in RMT file + ; not elegant :( + mva #$06 MODUL-6+$967 ; $07 > $06 + sta MODUL-6+$bc3 ; $07 > $06 + sta MODUL-6+$e69 ; $08 > $06 + sta MODUL-6+$ebc ; $08 > $06 + mva #$10 MODUL-6+$a69 ; $12 > $10 + mva #$04 MODUL-6+$bf8 ; $05 > $04 + mva #$08 MODUL-6+$e3d ; $0a > $08 + + ; and mountains colors table address + mva #dliColorsFore2PAL GradientAddrH+2 NoRMT_PALchange - .ELSE - mva #$7f SkStatSimulator + .ELIF TARGET = 5200 + mva #$7f SkStatSimulator .ENDIF @@ -380,7 +366,7 @@ NoRMT_PALchange mwa #kb_continue VKEYCNT ;Keyboard handler .ENDIF VMAIN VBLinterrupt,7 ;jsr SetVBL - + mva #2 chactl ; necessary for 5200 ;-------------------------------------------------- @@ -388,7 +374,7 @@ NoRMT_PALchange icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -396,26 +382,26 @@ NoRMT_PALchange ; result: A=keycode ;-------------------------------------------------- jsr WaitForKeyRelease -@ - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - beq checkJoyGetKey ; key not pressed, check Joy - cmp #$f7 ; SHIFT - beq checkJoyGetKey - .ELSE - lda SkStatSimulator - and #%11111110 - bne checkJoyGetKey ; key not pressed, check Joy - .ENDIF - lda kbcode - cmp #@kbcode._none - beq checkJoyGetKey - and #$3f ;CTRL and SHIFT ellimination - cmp #@kbcode._esc ; 28 ; ESC - bne getkeyend - mvy #$80 escFlag - bne getkeyend +getKeyAfterWait + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 ; SHIFT + beq checkJoyGetKey + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + bne checkJoyGetKey ; key not pressed, check Joy + .ENDIF + lda kbcode + cmp #@kbcode._none + beq checkJoyGetKey + and #$3f ;CTRL and SHIFT ellimination + cmp #@kbcode._esc ; 28 ; ESC + bne getkeyend + mvy #$80 escFlag + bne getkeyend checkJoyGetKey ;------------JOY------------- @@ -425,7 +411,7 @@ checkJoyGetKey and #$0f cmp #$0f beq notpressedJoyGetKey - tay + tay lda joyToKeyTable,y bne getkeyend @@ -434,26 +420,26 @@ notpressedJoyGetKey lda STRIG0 beq JoyButton .IF TARGET = 800 ; Select and Option key only on A800 - bne checkSelectKey + bne checkSelectKey checkSelectKey - lda CONSOL - and #%00000010 ; Select - beq SelectPressed - lda CONSOL - and #%00000100 ; Option + lda CONSOL + and #%00000010 ; Select + beq SelectPressed + lda CONSOL + and #%00000100 ; Option .ENDIF - bne @- + bne getKeyAfterWait OptionPressed lda #@kbcode._atari ; Option key - bne getkeyend + bne getkeyend SelectPressed lda #@kbcode._tab ; Select key bne getkeyend JoyButton - lda #@kbcode._ret ;Return key + lda #@kbcode._ret ;Return key getkeyend ldy #0 - sty ATRACT ; reset atract mode + sty ATRACT ; reset atract mode mvy #sfx_keyclick sfx_effect rts .endp @@ -461,7 +447,7 @@ getkeyend ;-------------------------------------------------- .proc getkeynowait ;-------------------------------------------------- - jsr WaitForKeyRelease + jsr WaitForKeyRelease lda kbcode and #$3f ;CTRL and SHIFT ellimination rts @@ -471,7 +457,7 @@ getkeyend .proc WaitForKeyRelease ;-------------------------------------------------- mva #128-KeyRepeatSpeed pressTimer ; tricky -StillWait +StillWait bit pressTimer bmi KeyReleased lda STICK0 @@ -488,10 +474,10 @@ StillWait and #%00000110 ; Select and Option only cmp #%00000110 bne StillWait - .ELSE - lda SkStatSimulator - and #%11111110 - beq StillWait + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + beq StillWait .ENDIF KeyReleased rts @@ -745,19 +731,21 @@ EndofBFGDLI .ERROR 'Code and data too long' .ENDIF .ECHO "Bytes left: ",$b000-* - - + + org $b000 ;address of RMT module -MODUL +MODUL ;RMT module is standard Atari binary file already ins "artwork/sfx/scorch_str9-NTSC.rmt",+6 ;include music RMT module MODULEND ;---------------------------------------------- icl 'constants_top.asm' ;---------------------------------------------- - + .ECHO "Bytes on top left: ",$bfe8-* ;ROM_SETTINGS-* - .IF target = 5200 + .IF TARGET = 800 + run FirstSTART + .ELIF TARGET = 5200 .IF * > ROM_SETTINGS-1 .ERROR 'Code and RMT song too long to fit in 5200' .ENDIF @@ -766,6 +754,4 @@ MODULEND .byte " scorch supersystem " ;20 characters title .byte " ", $ff ;$BFFD == $ff means diagnostic cart, no splash screen .word FirstSTART - .ELSE - run FirstSTART .ENDIF diff --git a/scorchC64.asm b/scorchC64.asm index 974b125..1387312 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -20,8 +20,8 @@ org $801 org [a($801)],$801 basic_start(FirstSTART) - - + + ;--------------------------------------------------- .macro build dta d"1.28" ; number of this build (4 bytes) @@ -64,7 +64,7 @@ FirstZpageVariable = $58 ; $57 .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine - .zpvar fx .byte + .zpvar fx .byte .zpvar yi .word ;Y (word) in draw routine .zpvar fy .byte .zpvar xk .word @@ -77,7 +77,7 @@ FirstZpageVariable = $58 ; $57 .zpvar dp .word ;---------------------------- .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank2 .byte ;---------------------------- .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word @@ -131,7 +131,7 @@ FirstZpageVariable = $58 ; $57 .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -155,19 +155,19 @@ FirstZpageVariable = $58 ; $57 icl 'C64/lib/C64_ATARISYS.ASM' icl 'C64/lib/C64SYS.ASM' icl 'C64/lib/MACRO.ASM' - + ;----------------------------------------------- ; variable declarations in RAM (no code) ;----------------------------------------------- - + ; Game loading address ORG $4100 icl 'variables.asm' - + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' - + ;-------------------------------------------------- ; Game Code ;-------------------------------------------------- @@ -199,22 +199,22 @@ FirstSTART ; from here on NMI is disabled - + jsr MakeDarkScreen - + ; one time zero variables in RAM (non zero page) lda #0 ldy #OneTimeZeroVariablesCount-1 @ sta OneTimeZeroVariables,y dey bpl @- - + ; one time zero variables in RAM (zero page) ldy #FirstZpageVariable @ sta $0000,y iny bne @- - + ; initialize variables in RAM (non zero page) ldy #initialvaluesCount-1 @ lda initialvaluesStart,y @@ -235,7 +235,7 @@ FirstSTART icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -252,7 +252,7 @@ FirstSTART ;-------------------------------------------------- .proc getkeynowait ;-------------------------------------------------- - jsr WaitForKeyRelease + jsr WaitForKeyRelease lda kbcode and #$3f ;CTRL and SHIFT ellimination rts @@ -361,7 +361,7 @@ noShellDelay icl 'C64/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' - icl 'C64/gr_basics.asm' + icl 'C64/gr_basics.asm' ;---------------------------------------------- icl 'weapons.asm' ;---------------------------------------------- @@ -442,4 +442,3 @@ NMI INC $D020 ; change border colour, indication for a NMI RTI ; exit interrupt ; (not acknowledged!) - \ No newline at end of file diff --git a/scorchC64.lst b/scorchC64.lst deleted file mode 100644 index f581145..0000000 --- a/scorchC64.lst +++ /dev/null @@ -1,11712 +0,0 @@ -mads 2.1.5 build 3 (21 Feb 22) -Source: scorchC64.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 ;C64 8-bit Scorched Earth source code - 3 ;--------------------------------------------------- - 4 ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski - 5 ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 - 6 ;Miami & Warsaw 2022, 2023 - 7 - 8 ;--------------------------------------------------- - 9 = 0040 .def TARGET = 64 ; :) - 10 ;--------------------------------------------------- - 11 = 0000 .def XCORRECTION_FOR_PM = 0 - 12 ; if 1 - active x position of tanks correction fo PMG - 13 = 0000 .def FASTER_GRAF_PROCS = 0 - 14 ; if 1 - activates faster graphics routines - 15 ; (direct writes to screen memory - atari only :) ) - 16 ;--------------------------------------------------- - 17 - 18 - 19 opt h-f+ - 20 org $801 - 21 0801 01 08 org [a($801)],$801 - 22 0801 basic_start(FirstSTART) -Macro: BASIC_START [Source: MACRO.ASM] - 2 0801 0C 08 .word upstartEnd // link address - 3 0803 0A 00 .word 10 // line num - 4 0805 9E .byte $9e // sys - 6 = 0000 ?a=0 - 7 = 0000 ?b=0 - 8 = 0000 ?c=0 - 9 = 0000 ?d=0 - 10 = 0000 ?e=0 - 12 = 536A ?v = (FIRSTSTART) - 15 = 0002 ?a=?v/10000 - 16 = 054A ?v=?v-(?a*10000) - 20 = 0001 ?b=?v/1000 - 21 = 0162 ?v=?v-(?b*1000) - 25 = 0003 ?c=?v/100 - 26 = 0036 ?v=?v-(?c*100) - 30 = 0005 ?d=?v/10 - 31 = 0004 ?v=?v-(?d*10) - 34 = 0004 ?e=?v%10 - 36 0806 32 31 33 35 34 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 - 38 080B 00 .byte 0 - 39 080C upstartEnd - 40 080C 00 00 .word 0 // empty link signals the end of the program -Source: scorchC64.asm - 23 - 24 - 25 ;--------------------------------------------------- - 26 .macro build - 27 dta d"1.28" ; number of this build (4 bytes) - 28 .endm - 29 - 30 .macro RMTSong - 31 lda #:1 ; do nothing in C64 - 32 .endm - 33 - 34 ;--------------------------------------------------- - 35 080E icl 'definitions.asm' -Source: definitions.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 = 00C8 screenheight = 200 - 4 = 0028 screenBytes = 40 - 5 = 0140 screenwidth = screenBytes*8 ; Max screenwidth = 512!!! - 6 - 7 = 0008 TankWidth = 8 - 8 ;---------------------------------------------- - 9 ; Player/missile memory - 10 = 1800 PMGraph = $1800 ; real PM start = PMGraph + $0300 - 11 ; Generated tables - 12 = 2010 display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) - 13 ;---------------------------------------------- - 14 - 15 = 0028 margin = 40 ;mountain drawing Y variable margin - 16 = 0006 MaxPlayers = 6 - 17 = 0009 maxOptions = 9 ;number of all options - 18 = 002C PMOffsetX = $2C ; P/M to graphics offset - 19 = 002A PMOffsetY = $2A ; P/M to graphics offset - 20 = 000A napalmRadius = 10 - 21 = 0006 StandardBarrel = 6 ; standard tank barrel length - 22 = 0014 LongBarrel = 20 ; long barrel length - 23 - 24 = 0002 TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor - 25 = 000A TextForegroundColor = $0A - 26 = 0000 space = 0 ; space in screencodes - 27 - 28 = 000A KeyRepeatSpeed = 10 ; (max 127 !!!) - 29 - 30 ;character codes for symbols (tank, parachute, etc. ) - 31 = 0002 char_parachute_______ = $02 - 32 = 001E char_flag____________ = $1e - 33 = 0014 char_flame___________ = $14 - 34 = 001C char_clear_flame_____ = $1c - 35 = 0004 char_digger__________ = $04 - 36 = 000C char_sandhog_________ = $0c - 37 = 0008 char_sandhog_offset = char_sandhog_________ - char_digger__________ - 38 = 0020 char_tank1___________ = $20 - 39 = 0024 char_tank2___________ = $24 - 40 = 002C char_tank3___________ = $2c - 41 = 0028 char_tank4___________ = $28 ; robotank shape - 42 - 43 ;Weapon prices (*10 on screen) - 44 = 0000 price_Baby_Missile___ = 0 ;_00 - 45 = 0060 price_Missile________ = 96 ;_01 - 46 = 006F price_Baby_Nuke______ = 111 ;_02 - 47 = 0090 price_Nuke___________ = 144 ;_03 - 48 = 00C0 price_LeapFrog_______ = 192 ;_04 - 49 = 0125 price_Funky_Bomb_____ = 293 ;_05 - 50 = 01C8 price_MIRV___________ = 456 ;_06 - 51 = 0151 price_Death_s_Head___ = 337 ;_07 - 52 = 007D price_Napalm_________ = 125 ;_08 - 53 = 00A2 price_Hot_Napalm_____ = 162 ;_09 - 54 = 0066 price_Tracer_________ = 102 ;_10 - 55 = 0123 price_Smoke_Tracer___ = 291 ;_11 - 56 = 00D3 price_Baby_Roller____ = 211 ;_12 - 57 = 00F4 price_Roller_________ = 244 ;_13 - 58 = 0146 price_Heavy_Roller___ = 326 ;_14 - 59 = 00E6 price_Riot_Charge____ = 230 ;_15 - 60 = 00F1 price_Riot_Blast_____ = 241 ;_16 - 61 = 0103 price_Riot_Bomb______ = 259 ;_17 - 62 = 0110 price_Heavy_Riot_Bomb = 272 ;_18 - 63 = 0088 price_Baby_Digger____ = 136 ;_19 - 64 = 00B0 price_Digger_________ = 176 ;_20 - 65 = 00CF price_Heavy_Digger___ = 207 ;_21 - 66 = 009E price_Baby_Sandhog___ = 158 ;_22 - 67 = 00BF price_Sandhog________ = 191 ;_23 - 68 = 00DF price_Heavy_Sandhog__ = 223 ;_24 - 69 = 0068 price_Dirt_Clod______ = 104 ;_25 - 70 = 0082 price_Dirt_Ball______ = 130 ;_26 - 71 = 00AB price_Ton_of_Dirt____ = 171 ;_27 - 72 = 014A price_Liquid_Dirt____ = 330 ;_28 - 73 = 0157 price_Dirt_Charge____ = 343 ;_29 - 74 = 00AA price_Buy_me_________ = 170 ;_30 - 75 = 0115 price_Laser__________ = 277 ;_31 - 76 = 0000 price_White_Flag_____ = $0 ;_32 - 77 = 012C price_Battery________ = 300 ;_33 - 78 = 0160 price_Hovercraft_____ = 352 ;_34 - 79 = 00EA price_Parachute______ = 234 ;_35 - 80 = 03E8 price_StrongParachute = 1000 ;_36 - 81 = 02E9 price_Mag_Deflector__ = 745 ;_37 - 82 = 00E0 price_Shield_________ = 224 ;_38 - 83 = 0274 price_Heavy_Shield___ = 628 ;_39 - 84 = 044C price_Force_Shield___ = 1100 ;_40 - 85 = 0200 price_Bouncy_Castle__ = 512 ;_41 - 86 = 0834 price_Long_Barrel____ = 2100 ;_42 - 87 = 03E8 price_Nuclear_Winter_ = 1000 ;_43 - 88 = 01F4 price_Lazy_Boy_______ = 500 ;_44 - 89 = 02DA price_Lazy_Darwin____ = 730 ;_45 - 90 = 00FA price_Auto_Defense___ = 250 ;_46 - 91 = 0053 price_Spy_Hard_______ = 83 ;_47 - 92 ;Weapon indexes (numbers) - 93 = 0000 ind_Baby_Missile___ = 0 - 94 = 0000 first_offensive____ = ind_Baby_Missile___ - 95 = 0001 ind_Missile________ = 1 - 96 = 0002 ind_Baby_Nuke______ = 2 - 97 = 0003 ind_Nuke___________ = 3 - 98 = 0004 ind_LeapFrog_______ = 4 - 99 = 0005 ind_Funky_Bomb_____ = 5 - 100 = 0006 ind_MIRV___________ = 6 - 101 = 0007 ind_Death_s_Head___ = 7 - 102 = 0008 ind_Napalm_________ = 8 - 103 = 0009 ind_Hot_Napalm_____ = 9 - 104 = 000A ind_Tracer_________ = 10 - 105 = 000B ind_Smoke_Tracer___ = 11 - 106 = 000C ind_Baby_Roller____ = 12 - 107 = 000D ind_Roller_________ = 13 - 108 = 000E ind_Heavy_Roller___ = 14 - 109 = 000F ind_Riot_Charge____ = 15 - 110 = 0010 ind_Riot_Blast_____ = 16 - 111 = 0011 ind_Riot_Bomb______ = 17 - 112 = 0012 ind_Heavy_Riot_Bomb = 18 - 113 = 0013 ind_Baby_Digger____ = 19 - 114 = 0014 ind_Digger_________ = 20 - 115 = 0015 ind_Heavy_Digger___ = 21 - 116 = 0016 ind_Baby_Sandhog___ = 22 - 117 = 0017 ind_Sandhog________ = 23 - 118 = 0018 ind_Heavy_Sandhog__ = 24 - 119 = 0019 ind_Dirt_Clod______ = 25 - 120 = 001A ind_Dirt_Ball______ = 26 - 121 = 001B ind_Ton_of_Dirt____ = 27 - 122 = 001C ind_Liquid_Dirt____ = 28 - 123 = 001D ind_Dirt_Charge____ = 29 - 124 = 001E ind_Buy_me_________ = 30 - 125 = 001F ind_Laser__________ = 31 - 126 = 001F last_offensive_____ = ind_Laser__________ - 127 = 0020 ind_White_Flag_____ = 32 - 128 = 0020 first_defensive____ = ind_White_Flag_____ - 129 = 0021 ind_Battery________ = 33 - 130 = 0022 ind_Hovercraft_____ = 34 - 131 = 0023 ind_Parachute______ = 35 - 132 = 0024 ind_StrongParachute = 36 - 133 = 0025 ind_Mag_Deflector__ = 37 - 134 = 0026 ind_Shield_________ = 38 - 135 = 0027 ind_Heavy_Shield___ = 39 - 136 = 0028 ind_Force_Shield___ = 40 - 137 = 0029 ind_Bouncy_Castle__ = 41 - 138 = 002A ind_Long_Barrel____ = 42 - 139 = 002B ind_Nuclear_Winter_ = 43 - 140 = 002C ind_Lazy_Boy_______ = 44 - 141 = 002D ind_Lazy_Darwin____ = 45 - 142 = 002E ind_Auto_Defense___ = 46 - 143 = 002F ind_Spy_Hard_______ = 47 - 144 = 002F last_defensive_____ = ind_Spy_Hard_______ - 145 = 0029 last_real_defensive = ind_Bouncy_Castle__ - 146 = 0020 number_of_offensives = last_offensive_____ - first_offensive____+1 - 147 = 0010 number_of_defensives = (last_defensive_____ - first_defensive____+1) - 148 = 0030 number_of_weapons = number_of_offensives + number_of_defensives - 149 ;-------------------------------- - 150 ; names of RMT instruments (sfx) - 151 ;-------------------------------- - 152 = 0000 sfx_set_power_1 = $00 ;A - 153 = 0001 sfx_set_power_2 = $01 ;b - 154 = 0002 sfx_lightning = $02 ;c - 155 = 0003 sfx_dunno = $03 ;d - 156 = 0004 sfx_nuke = $04 ;e - 157 = 0005 sfx_baby_missile= $05 ;f - 158 = 0006 sfx_death_begin = $06 ;g - 159 = 0007 sfx_plasma_1_2 = $07 ;h - 160 = 0008 sfx_plasma_2_2 = $08 ;i - 161 = 0009 sfx_napalm = $09 ;j - 162 = 000A sfx_dirt_charge = $0a ;k - 163 = 000B sfx_missile_hit = $0b ;l - 164 = 000C sfx_funky_hit = $0c ;m - 165 = 000D sfx_shield_on = $0d ;n - 166 = 000E sfx_shield_off = $0e ;o - 167 = 000F sfx_parachute = $0f ;p - 168 = 0010 sfx_smoke_cloud = $10 ;q - 169 = 0011 sfx_riot_blast = $11 ;r - 170 = 0012 sfx_sandhog = $12 ;s - 171 = 0013 sfx_dirt_chrg_s = $13 ;t - 172 = 0014 sfx_digger = $14 ;u - 173 = 0015 sfx_silencer = $15 ;v - 174 = 0016 sfx_next_player = $16 ;w - 175 = 0017 sfx_purchase = $17 ;x - 176 = 0018 sfx_keyclick = $18 ;y - 177 = 0019 sfx_shoot = $19 ;z - 178 = 001A sfx_seppuku = $1a ;1 - 179 = 001B sfx_liquid_dirt = $1b ;2 - 180 = 001C sfx_battery = $1c ;3 - 181 = 001D sfx_white_flag = $1d ;4 - 182 = 001E sfx_long_barrel = $1e - 183 = 001F sfx_tank_move = $1f - 184 = 002B sfx_auto_defense= $2b - 185 = 002C sfx_lazy_boys = $2c - 186 ;-------------------------------- - 187 ; RMT songs (lines) - 188 ;-------------------------------- - 189 = 0000 song_silencio = $00 - 190 = 0002 song_main_menu = $02 - 191 = 0006 song_ingame = $06 - 192 = 000B song_round_over = $0b - 193 = 000E song_ending_looped = $0e - 194 = 001B song_supermarket = $1b - 195 = 001D song_inventory = $1d - 36 ;--------------------------------------------------- - 37 - 38 = 0058 FirstZpageVariable = $58 ; $57 - 39 080E .zpvar DliColorBack .byte = FirstZpageVariable - 40 080E .zpvar GradientNr .byte - 41 080E .zpvar GradientColors .word - 42 080E .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) - 43 080E .zpvar JoystickNumber .byte - 44 080E .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing - 45 080E .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory - 46 080E .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) - 47 080E .zpvar xdraw .word ;= $64 ;variable X for plot - 48 080E .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) - 49 080E .zpvar xbyte .word - 50 080E .zpvar ybyte .word - 51 080E .zpvar CharCode .byte - 52 080E .zpvar fontind .word - 53 080E .zpvar tanknr .byte - 54 080E .zpvar TankSequencePointer .byte - 55 080E .zpvar oldplot .word - 56 080E .zpvar xc .word - 57 080E .zpvar temp .word ;temporary word for the most embeded loops only - 58 080E .zpvar temp2 .word ;same as above - 59 080E .zpvar modify .word ;origially used to replace self-modyfying code - 60 080E .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) - 61 080E .zpvar xtempDRAW .word ;same as above for XDRAW routine - 62 080E .zpvar ytempDRAW .word ;same as above for XDRAW routine - 63 080E .zpvar tempor2 .word - 64 080E .zpvar CreditsVScrol .byte - 65 ;--------------temps used in circle routine - 66 080E .zpvar xi .word ;X (word) in draw routine - 67 080E .zpvar fx .byte - 68 080E .zpvar yi .word ;Y (word) in draw routine - 69 080E .zpvar fy .byte - 70 080E .zpvar xk .word - 71 080E .zpvar fs .byte - 72 080E .zpvar yc .byte ;ycircle - temporary for circle - 73 080E .zpvar dx .word - 74 080E .zpvar dy .word - 75 080E .zpvar dd .word - 76 080E .zpvar di .word - 77 080E .zpvar dp .word - 78 ;---------------------------- - 79 080E .zpvar UnderTank1 .byte - 80 080E .zpvar UnderTank2 .byte - 81 ;---------------------------- - 82 080E .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) - 83 080E .zpvar weaponPointer .word - 84 080E .zpvar dliCounter .byte - 85 080E .zpvar pressTimer .byte - 86 080E .zpvar NTSCcounter .byte - 87 080E .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling - 88 080E .zpvar sfx_effect .byte - 89 080E .zpvar RMT_blocked .byte - 90 080E .zpvar ScrollFlag .byte - 91 080E .zpvar SkStatSimulator .byte - 92 080E .zpvar FloatingAlt .byte ; floating tank altitude - 93 080E .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen - 94 - 95 ; --------------OPTIMIZATION VARIABLES-------------- - 96 080E .zpvar Force .word - 97 080E .zpvar Force_ .byte ; Force is 3 bytes long - 98 080E .zpvar Angle .byte - 99 080E .zpvar Parachute .byte ; are you insured with parachute? - 100 080E .zpvar color .byte - 101 080E .zpvar Erase .byte ; if 1 only mask of the character is printed - 102 ; on the graphics screen. if 0 character is printed normally - 103 080E .zpvar radius .byte - 104 080E .zpvar decimal .word - 105 080E .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) - 106 080E .zpvar Counter .byte ;temporary Counter for outside loops - 107 080E .zpvar ExplosionRadius .byte - 108 080E .zpvar FunkyBombCounter .byte - 109 080E .zpvar ResultY .byte - 110 080E .zpvar xcircle .word - 111 080E .zpvar ycircle .word - 112 080E .zpvar vy .word - 113 080E .zpvar vy_ .word ; 4 bytes - 114 080E .zpvar vx .word - 115 080E .zpvar vx_ .word ; 4 bytes - 116 080E .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank - 117 080E .zpvar PositionOnTheList .byte ; pointer position on the list being displayed - 118 080E .zpvar XHit .word - 119 080E .zpvar delta .word - 120 080E .zpvar HowMuchToFall .byte - 121 080E .zpvar magic .word - 122 080E .zpvar xtraj .word - 123 080E .zpvar xtraj_ .byte ; 3 bytes - 124 080E .zpvar ytraj .word - 125 080E .zpvar ytraj_ .byte ; 3 bytes - 126 080E .zpvar Wind .word - 127 080E .zpvar Wind_ .word ; 4 bytes - 128 080E .zpvar RangeLeft .word - 129 080E .zpvar RangeRight .word - 130 080E .zpvar NewAngle .byte - 131 080E .zpvar escFlag .byte - 132 080E .zpvar LineYdraw .byte - 133 080E .zpvar LineXdraw .word - 134 080E .zpvar plot4x4color .byte ; $00 / $ff - 135 080E .zpvar Multiplier .word - 136 080E .zpvar Multiplier_ .byte ; 3 bytes - 137 080E .zpvar HowToDraw .byte - 138 080E .zpvar gravity .byte - 139 080E .zpvar LineLength .word - 140 080E .zpvar tracerflag .byte - 141 080E .zpvar isInventory .byte - 142 080E .zpvar DifficultyLevel .byte - 143 080E .zpvar goleft .byte - 144 080E .zpvar OffsetDL1 .byte - 145 080E .zpvar L1 .byte - 146 = 00B1 HotNapalmFlag = FunkyBombCounter ; reuse variable! - 147 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 - 148 - 149 = 0076 displayposition = modify - 150 = 00B3 LineAddress4x4 = xcircle - 151 - 152 ;----------------------------------------------- - 153 ; libraries - 154 ;----------------------------------------------- - 155 080E icl 'C64/lib/C64_ATARISYS.ASM' -Source: C64_ATARISYS.ASM - 1 ;**************************************************************************** - 2 ;* ATARI PERSONAL COMPUTER * - 3 ;* SYSTEM EQUATES * - 4 ;**************************************************************************** - 5 - 6 = 0002 FAKEADDR EQU $0002 - 7 - 8 = 0002 ATRACT EQU FAKEADDR - 9 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK - 10 ; - 11 ; PAGE TWO RAM ASSIGNMENTS - 12 ; - 13 = 0002 VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR - 14 = 0002 VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR - 15 = 0002 VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR - 16 = 0002 VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR - 17 = 0002 VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR - 18 = 0002 VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ - 19 = 0002 VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY - 20 = 0002 VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE - 21 = 0002 VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ - 22 = 0002 VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ - 23 = 0002 VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ - 24 = 0002 VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR - 25 = 0002 CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1 - 26 = 0002 CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2 - 27 = 0002 CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3 - 28 = 0002 CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4 - 29 = 0002 CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5 - 30 = 0002 VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR - 31 = 0002 VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR - 32 = 0002 CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS - 33 = 0002 CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS - 34 = 0002 CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG - 35 = 0002 SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR - 36 = 0002 CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG - 37 = 0002 INTEMP EQU FAKEADDR ;IAN'S TEMP - 38 = 0002 CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG - 39 = 0002 DMACTLS EQU FAKEADDR ;SAVE DMACTL REG - 40 = 0002 DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO - 41 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI - 42 = 0002 SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM - 43 = 0002 LCOUNT EQU FAKEADDR ;LOADER TEMP - 44 = 0002 LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL - 45 = 0002 LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL - 46 = 0002 BRKKY EQU FAKEADDR ;BREAK KEY VECTOR - 47 = 0002 RELADR EQU FAKEADDR ;LOADER REL ADDR - 48 = 0002 CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV - 49 = 0002 CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND - 50 = 0002 CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1 - 51 = 0002 CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2 - 52 ;TEMP EQU $023E ;TEMPORARY RAM CELL - 53 = 0002 ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG - 54 = 0002 DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1) - 55 = 0002 DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS - 56 = 0002 BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS - 57 = 0002 COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS - 58 = 0002 RECLEN EQU FAKEADDR ;LOADER LENGTH - 59 = 0002 DSKTIM EQU FAKEADDR ;DISK TIME OUT REG - 60 = 0002 VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP - 61 = 0002 KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG - 62 = 0002 FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200) - 63 = 0002 GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY - 64 = 0002 PADDL0 EQU FAKEADDR ;POT 0 RAM CELL - 65 = 0002 PADDL1 EQU FAKEADDR - 66 = 0002 PADDL2 EQU FAKEADDR - 67 = 0002 PADDL3 EQU FAKEADDR - 68 = 0002 STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL - 69 = 0002 STICK1 EQU FAKEADDR - 70 = 0002 PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0 - 71 = 0002 PTRIG1 EQU FAKEADDR - 72 = 0002 PTRIG2 EQU FAKEADDR - 73 = 0002 PTRIG3 EQU FAKEADDR - 74 = 0002 STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0 - 75 = 0002 STRIG1 EQU FAKEADDR - 76 = 0002 HIBYTE EQU FAKEADDR ;LOADER - 77 = 0002 WMODE EQU FAKEADDR ;CASSETTE R/W MODE - 78 = 0002 BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE - 79 = 0002 IMASK EQU FAKEADDR - 80 = 0002 JVECK EQU FAKEADDR ;JUMP VECTOR - 81 = 0002 NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS - 82 = 0002 TXTROW EQU FAKEADDR ;TEXT ROWCRS - 83 = 0002 TXTCOL EQU FAKEADDR ;TEXT COLCRS - 84 = 0002 TINDEX EQU FAKEADDR ;TEXT INDEX - 85 = 0002 TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD - 86 = 0002 TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL - 87 = 0002 CRETRY EQU FAKEADDR ;# COMMAND RETRIES - 88 = 0002 HOLD3 EQU FAKEADDR - 89 = 0002 SUBTMP EQU FAKEADDR - 90 = 0002 HOLD2 EQU FAKEADDR - 91 = 0002 DMASK EQU FAKEADDR ;PIXEL LOCATION MASK - 92 = 0002 TMPLBT EQU FAKEADDR - 93 = 0002 ESCFLG EQU FAKEADDR ;ESCAPE FLAG - 94 = 0002 TABMAP EQU FAKEADDR ;TAB STOP MAP - 95 = 0002 LOGMAP EQU FAKEADDR ;LINE START BIT MAP - 96 = 0002 INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG - 97 = 0002 FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW - 98 = 0002 TMPROW EQU FAKEADDR - 99 = 0002 TMPCOL EQU FAKEADDR - 100 = 0002 SCRFLG EQU FAKEADDR ;SET IF SCROLLING - 101 = 0002 HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW - 102 = 0002 DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES - 103 = 0002 SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG - 104 = 0002 BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN - 105 = 0002 PCOLR0 EQU FAKEADDR ;P0 COLOR - 106 = 0002 PCOLR1 EQU FAKEADDR ;P1 COLOR - 107 = 0002 PCOLR2 EQU FAKEADDR ;P2 COLOR - 108 = 0002 PCOLR3 EQU FAKEADDR ;P3 COLOR - 109 = 0002 COLOR0 EQU FAKEADDR ;COLOR 0 - 110 = 0002 COLOR1 EQU FAKEADDR - 111 = 0002 COLOR2 EQU FAKEADDR - 112 = 0002 COLOR3 EQU FAKEADDR - 113 = 0002 COLOR4 EQU FAKEADDR - 114 = 0002 COLBAKS EQU COLOR4 - 115 = 0002 CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM - 116 ; - 117 ; COLLEEN MNEMONICS - 118 ; - 119 ; --------------------------------------------------------------------------- - 120 = 0002 POKEY EQU FAKEADDR - 121 ; --------------------------------------------------------------------------- - 122 ; - 123 ; READ - 124 ; - 125 = 0002 POT0 EQU POKEY+$00 - 126 = 0002 POT1 EQU POKEY+$00 - 127 = 0002 POT2 EQU POKEY+$00 - 128 = 0002 POT3 EQU POKEY+$00 - 129 = 0002 POT4 EQU POKEY+$00 - 130 = 0002 POT5 EQU POKEY+$00 - 131 = 0002 POT6 EQU POKEY+$00 - 132 = 0002 POT7 EQU POKEY+$00 - 133 = 0002 ALLPOT EQU POKEY+$00 - 134 = 0002 KBCODE EQU POKEY+$00 - 135 ; !!!!! - 136 ;RANDOM EQU POKEY+$00 - 137 ; - 138 = 0002 POTGO EQU POKEY+$00 - 139 = 0002 SERIN EQU POKEY+$00 - 140 = 0002 IRQST EQU POKEY+$00 - 141 = 0002 SKSTAT EQU POKEY+$00 - 142 ; - 143 ; WRITE - 144 ; - 145 = 0002 AUDF1 EQU POKEY+$00 - 146 = 0002 AUDC1 EQU POKEY+$00 - 147 = 0002 AUDF2 EQU POKEY+$00 - 148 = 0002 AUDC2 EQU POKEY+$00 - 149 = 0002 AUDF3 EQU POKEY+$00 - 150 = 0002 AUDC3 EQU POKEY+$00 - 151 = 0002 AUDF4 EQU POKEY+$00 - 152 = 0002 AUDC4 EQU POKEY+$00 - 153 = 0002 AUDCTL EQU POKEY+$00 - 154 = 0002 STIMER EQU POKEY+$00 - 155 = 0002 SKRES EQU POKEY+$00 - 156 = 0002 SEROUT EQU POKEY+$00 - 157 = 0002 IRQEN EQU POKEY+$00 - 158 = 0002 SKCTL EQU POKEY+$00 - 159 ; - 160 ; - 161 ; - 162 ; --------------------------------------------------------------------------- - 163 = 0002 GTIA EQU FAKEADDR - 164 ; --------------------------------------------------------------------------- - 165 ; - 166 ; WRITE - 167 ; - 168 = 0002 HPOSP0 EQU GTIA+$00 - 169 = 0002 HPOSP1 EQU GTIA+$00 - 170 = 0002 HPOSP2 EQU GTIA+$00 - 171 = 0002 HPOSP3 EQU GTIA+$00 - 172 = 0002 HPOSM0 EQU GTIA+$00 - 173 = 0002 HPOSM1 EQU GTIA+$00 - 174 = 0002 HPOSM2 EQU GTIA+$00 - 175 = 0002 HPOSM3 EQU GTIA+$00 - 176 = 0002 SIZEP0 EQU GTIA+$00 - 177 = 0002 SIZEP1 EQU GTIA+$00 - 178 = 0002 SIZEP2 EQU GTIA+$00 - 179 = 0002 SIZEP3 EQU GTIA+$00 - 180 = 0002 SIZEM EQU GTIA+$00 - 181 = 0002 GRAFP0 EQU GTIA+$00 - 182 = 0002 GRAFP1 EQU GTIA+$00 - 183 = 0002 GRAFP2 EQU GTIA+$00 - 184 = 0002 GRAFP3 EQU GTIA+$00 - 185 = 0002 GRAFM EQU GTIA+$00 - 186 = 0002 COLPM0 EQU GTIA+$00 - 187 = 0002 COLPM1 EQU GTIA+$00 - 188 = 0002 COLPM2 EQU GTIA+$00 - 189 = 0002 COLPM3 EQU GTIA+$00 - 190 = 0002 COLPF0 EQU GTIA+$00 - 191 = 0002 COLPF1 EQU GTIA+$00 - 192 = 0002 COLPF2 EQU GTIA+$00 - 193 = 0002 COLPF3 EQU GTIA+$00 - 194 = 0002 COLBAK EQU GTIA+$00 - 195 = 0002 PRIOR EQU GTIA+$00 - 196 = 0002 VDELAY EQU GTIA+$00 - 197 = 0002 GRACTL EQU GTIA+$00 - 198 = 0002 HITCLR EQU GTIA+$00 - 199 = 0002 CONSOL EQU GTIA+$00 - 200 ; - 201 ; READ - 202 ; - 203 = 0002 M0PF EQU GTIA+$00 - 204 = 0002 M1PF EQU GTIA+$00 - 205 = 0002 M2PF EQU GTIA+$00 - 206 = 0002 M3PF EQU GTIA+$00 - 207 = 0002 P0PF EQU GTIA+$00 - 208 = 0002 P1PF EQU GTIA+$00 - 209 = 0002 P2PF EQU GTIA+$00 - 210 = 0002 P3PF EQU GTIA+$00 - 211 = 0002 M0PL EQU GTIA+$00 - 212 = 0002 M1PL EQU GTIA+$00 - 213 = 0002 M2PL EQU GTIA+$00 - 214 = 0002 M3PL EQU GTIA+$00 - 215 = 0002 P0PL EQU GTIA+$00 - 216 = 0002 P1PL EQU GTIA+$00 - 217 = 0002 P2PL EQU GTIA+$00 - 218 = 0002 P3PL EQU GTIA+$00 - 219 = 0002 TRIG0 EQU GTIA+$00 - 220 = 0002 TRIG1 EQU GTIA+$00 - 221 = 0002 TRIG2 EQU GTIA+$00 - 222 = 0002 TRIG3 EQU GTIA+$00 - 223 = 0002 PAL EQU GTIA+$00 - 224 ; - 225 ; - 226 ; --------------------------------------------------------------------------- - 227 = 0002 ANTIC EQU FAKEADDR - 228 ; --------------------------------------------------------------------------- - 229 ; - 230 = 0002 DMACTL EQU ANTIC+$00 - 231 = 0002 CHACTL EQU ANTIC+$00 - 232 = 0002 DLPTR EQU ANTIC+$00 - 233 ;DLISTH EQU ANTIC+$00 - 234 = 0002 HSCROL EQU ANTIC+$00 - 235 = 0002 VSCROL EQU ANTIC+$00 - 236 = 0002 PMBASE EQU ANTIC+$00 - 237 = 0002 CHBASE EQU ANTIC+$00 - 238 = 0002 WSYNC EQU ANTIC+$00 - 239 ; !!!! - 240 = 0002 VCOUNT EQU ANTIC+$00 - 241 ; ---- - 242 = 0002 PENH EQU ANTIC+$00 - 243 = 0002 PENV EQU ANTIC+$00 - 244 = 0002 NMIEN EQU ANTIC+$00 - 245 = 0002 NMIRES EQU ANTIC+$00 - 246 = 0002 NMIST EQU ANTIC+$00 - 247 ; - 248 ; - 249 ; --------------------------------------------------------------------------- - 250 = 0002 PIA EQU FAKEADDR - 251 ; --------------------------------------------------------------------------- - 252 ; - 253 = 0002 PORTA EQU PIA+0 - 254 = 0002 PORTB EQU PIA+0 - 255 = 0002 PACTL EQU PIA+0 - 256 = 0002 PBCTL EQU PIA+0 - 257 ; - 258 ; --------------------------------------------------------------------------- - 259 ; Atari ANTIC chip display list equates - 260 ; --------------------------------------------------------------------------- - 261 ; - 262 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte) - 263 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3) - 264 ; - 265 = 0010 SCH EQU $10 ; display list horizontal scrolling - 266 = 0020 SCV EQU $20 ; display list vertical scrolling - 267 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte) - 268 = 0080 DLII EQU $80 ; display list interrupt instruction - 269 ; - 270 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction - 271 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction - 272 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction - 273 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction - 274 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction - 275 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction - 276 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction - 277 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction - 278 ; - 279 = 0002 MODE2 EQU $02 ; display list mode 2 - 280 = 0004 MODE4 EQU $04 ; display list mode 4 - 281 = 0008 MODE8 EQU $08 ; display list mode 8 - 282 = 000E MODEE EQU $0E ; display list mode E - 283 = 000F MODEF EQU $0F ; display list mode F - 284 - 285 ; --------------------------------------------------------------------------- - 286 ; KBCODEs - 287 ; --------------------------------------------------------------------------- - 288 080E .enum @kbcode - 289 = 00FF _none = 255 - 290 = 001C _esc = 28 - 291 = 001F _1 = 31 - 292 = 001E _2 = 30 - 293 = 001A _3 = 26 - 294 = 0018 _4 = 24 - 295 = 001D _5 = 29 - 296 = 001B _6 = 27 - 297 = 0033 _7 = 51 - 298 = 0035 _8 = 53 - 299 = 0030 _9 = 48 - 300 = 0032 _0 = 50 - 301 = 0036 _lt = 54 - 302 = 0037 _gt = 55 - 303 = 0034 _del = 52 - 304 = 002C _tab = 44 - 305 = 002F _Q = 47 - 306 = 002E _W = 46 - 307 = 002A _E = 42 - 308 = 0028 _R = 40 - 309 = 002D _T = 45 - 310 = 002B _Y = 43 - 311 = 000B _U = 11 - 312 = 000D _I = 13 - 313 = 0008 _O = 8 - 314 = 000A _P = 10 - 315 = 000E _min = 14 - 316 = 000E _up = 14 ; cursor function - 317 = 000F _eq = 15 - 318 = 000F _down = 15 ; cursor function - 319 = 000C _ret = 12 - 320 = 003F _A = 63 - 321 = 003E _S = 62 - 322 = 003A _D = 58 - 323 = 0038 _F = 56 - 324 = 003D _G = 61 - 325 = 0039 _H = 57 - 326 = 0001 _J = 1 - 327 = 0005 _K = 5 - 328 = 0000 _L = 0 - 329 = 0002 _semicolon = 2 - 330 = 0006 _plus = 6 - 331 = 0006 _left = 6 ; cursor function - 332 = 0007 _asterisk = 7 - 333 = 0007 _right = 7 ; cursor function - 334 = 003C _caps = 60 - 335 = 0017 _Z = 23 - 336 = 0016 _X = 22 - 337 = 0012 _C = 18 - 338 = 0010 _V = 16 - 339 = 0015 _B = 21 - 340 = 0024 _N = 36 - 341 = 0025 _M = 37 - 342 = 0020 _comma = 32 - 343 = 0022 _dot = 34 - 344 = 0026 _slash = 38 - 345 = 0027 _atari = 39 - 346 = 0011 _help = 17 - 347 = 0003 _F1 = 3 - 348 = 0004 _F2 = 4 - 349 = 0013 _F3 = 19 - 350 = 0014 _F4 = 20 - 351 = 0021 _space = 33 - 352 .ende - 352 = 0058 DLICOLORBACK - 352 = 0059 GRADIENTNR - 352 = 005A GRADIENTCOLORS - 352 = 005C WINDCHANGEINROUND - 352 = 005D JOYSTICKNUMBER - 352 = 005E LAZYFLAG - 352 = 005F SPYHARDFLAG - 352 = 0060 VDEBUG - 352 = 0061 XDRAW - 352 = 0063 YDRAW - 352 = 0065 XBYTE - 352 = 0067 YBYTE - 352 = 0069 CHARCODE - 352 = 006A FONTIND - 352 = 006C TANKNR - 352 = 006D TANKSEQUENCEPOINTER - 352 = 006E OLDPLOT - 352 = 0070 XC - 352 = 0072 TEMP - 352 = 0074 TEMP2 - 352 = 0076 MODIFY - 352 = 0078 TEMPXROLLER - 352 = 007A XTEMPDRAW - 352 = 007C YTEMPDRAW - 352 = 007E TEMPOR2 - 352 = 0080 CREDITSVSCROL - 352 = 0081 XI - 352 = 0083 FX - 352 = 0084 YI - 352 = 0086 FY - 352 = 0087 XK - 352 = 0089 FS - 352 = 008A YC - 352 = 008B DX - 352 = 008D DY - 352 = 008F DD - 352 = 0091 DI - 352 = 0093 DP - 352 = 0095 UNDERTANK1 - 352 = 0096 UNDERTANK2 - 352 = 0097 TESTFLIGHTFLAG - 352 = 0098 WEAPONPOINTER - 352 = 009A DLICOUNTER - 352 = 009B PRESSTIMER - 352 = 009C NTSCCOUNTER - 352 = 009D ISENDOFTHEFALLFLAG - 352 = 009E SFX_EFFECT - 352 = 009F RMT_BLOCKED - 352 = 00A0 SCROLLFLAG - 352 = 00A1 SKSTATSIMULATOR - 352 = 00A2 FLOATINGALT - 352 = 00A3 OVERTANKDIR - 352 = 00A4 FORCE - 352 = 00A6 FORCE_ - 352 = 00A7 ANGLE - 352 = 00A8 PARACHUTE - 352 = 00A9 COLOR - 352 = 00AA ERASE - 352 = 00AB RADIUS - 352 = 00AC DECIMAL - 352 = 00AE NUMBEROFPLAYERS - 352 = 00AF COUNTER - 352 = 00B0 EXPLOSIONRADIUS - 352 = 00B1 FUNKYBOMBCOUNTER - 352 = 00B2 RESULTY - 352 = 00B3 XCIRCLE - 352 = 00B5 YCIRCLE - 352 = 00B7 VY - 352 = 00B9 VY_ - 352 = 00BB VX - 352 = 00BD VX_ - 352 = 00BF HITFLAG - 352 = 00C0 POSITIONONTHELIST - 352 = 00C1 XHIT - 352 = 00C3 DELTA - 352 = 00C5 HOWMUCHTOFALL - 352 = 00C6 MAGIC - 352 = 00C8 XTRAJ - 352 = 00CA XTRAJ_ - 352 = 00CB YTRAJ - 352 = 00CD YTRAJ_ - 352 = 00CE WIND - 352 = 00D0 WIND_ - 352 = 00D2 RANGELEFT - 352 = 00D4 RANGERIGHT - 352 = 00D6 NEWANGLE - 352 = 00D7 ESCFLAG - 352 = 00D8 LINEYDRAW - 352 = 00D9 LINEXDRAW - 352 = 00DB PLOT4X4COLOR - 352 = 00DC MULTIPLIER - 352 = 00DE MULTIPLIER_ - 352 = 00DF HOWTODRAW - 352 = 00E0 GRAVITY - 352 = 00E1 LINELENGTH - 352 = 00E3 TRACERFLAG - 352 = 00E4 ISINVENTORY - 352 = 00E5 DIFFICULTYLEVEL - 352 = 00E6 GOLEFT - 352 = 00E7 OFFSETDL1 - 352 = 00E8 L1 - 156 080E icl 'C64/lib/C64SYS.ASM' -Source: C64SYS.ASM - 1 = D000 vic_spr0_x = $D000 - 2 = D001 vic_spr0_y = $D001 - 3 = D002 vic_spr1_x = $D002 - 4 = D003 vic_spr1_y = $D003 - 5 = D004 vic_spr2_x = $D004 - 6 = D005 vic_spr2_y = $D005 - 7 = D006 vic_spr3_x = $D006 - 8 = D007 vic_spr3_y = $D007 - 9 = D008 vic_spr4_x = $D008 - 10 = D009 vic_spr4_y = $D009 - 11 = D00A vic_spr5_x = $D00A - 12 = D00B vic_spr5_y = $D00B - 13 = D00C vic_spr6_x = $D00C - 14 = D00D vic_spr6_y = $D00D - 15 = D00E vic_spr7_x = $D00E - 16 = D00F vic_spr7_y = $D00F - 17 = D010 vic_spr_hi_x = $D010 - 18 = D011 vic_cr1 = $D011 - 19 = D012 vic_raster = $D012 - 20 = D013 vic_lp_x = $D013 - 21 = D014 vic_lp_y = $D014 - 22 = D015 vic_spr_ena = $D015 - 23 = D016 vic_cr2 = $D016 - 24 = D017 vic_spr_exp_y = $D017 - 25 = D018 vic_mem = $D018 - 26 = D019 vic_irq = $D019 - 27 = D01A vic_irq_ena = $D01A - 28 = D01B vic_spr_dp = $D01B - 29 = D01C vic_spr_mcolor = $D01C - 30 = D01D vic_spr_exp_x = $D01D - 31 = D01E vic_spr_ss_col = $D01E - 32 = D01F vic_spr_sd_col = $D01F - 33 = D020 vic_border = $D020 - 34 = D021 vic_bg_color0 = $D021 - 35 = D022 vic_bg_color1 = $D022 - 36 = D023 vic_bg_color2 = $D023 - 37 = D024 vic_bg_color3 = $D024 - 38 = D025 vic_spr_color1 = $D025 - 39 = D026 vic_spr_color2 = $D026 - 40 = D027 vic_spr0_color = $D027 - 41 = D028 vic_spr1_color = $D028 - 42 = D029 vic_spr2_color = $D029 - 43 = D02A vic_spr3_color = $D02A - 44 = D02B vic_spr4_color = $D02B - 45 = D02C vic_spr5_color = $D02C - 46 = D02D vic_spr6_color = $D02D - 47 = D02E vic_spr7_color = $D02E - 48 - 49 = D41B RANDOM = $D41B - 157 080E icl 'C64/lib/MACRO.ASM' -Source: MACRO.ASM - 1 - 2 - 3 - 4 .macro basic_start(addr) - 5 - 6 .word upstartEnd // link address - 7 .word 10 // line num - 8 .byte $9e // sys - 9 - 10 ?a=0 - 11 ?b=0 - 12 ?c=0 - 13 ?d=0 - 14 ?e=0 - 15 - 16 ?v = %%addr - 17 - 18 ift ?v>=10000 - 19 ?a=?v/10000 - 20 ?v=?v-(?a*10000) - 21 eif - 22 - 23 ift ?v>=1000 - 24 ?b=?v/1000 - 25 ?v=?v-(?b*1000) - 26 eif - 27 - 28 ift ?v>=100 - 29 ?c=?v/100 - 30 ?v=?v-(?c*100) - 31 eif - 32 - 33 ift ?v>=10 - 34 ?d=?v/10 - 35 ?v=?v-(?d*10) - 36 eif - 37 - 38 ?e=?v%10 - 39 - 40 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 - 41 - 42 .byte 0 - 43 upstartEnd - 44 .word 0 // empty link signals the end of the program - 45 - 46 .endm - 47 - 48 - 49 // - 50 // Switch bank in VIC-II - 51 // - 52 // Args: - 53 // bank: bank number to switch to. Valid values: 0-3. - 54 // - 55 .macro SwitchVICBank(bank) - 56 // - 57 // The VIC-II chip can only access 16K bytes at a time. In order to - 58 // have it access all of the 64K available, we have to tell it to look - 59 // at one of four banks. - 60 // - 61 // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2). - 62 // - 63 // +------+-------+----------+-------------------------------------+ - 64 // | BITS | BANK | STARTING | VIC-II CHIP RANGE | - 65 // | | | LOCATION | | - 66 // +------+-------+----------+-------------------------------------+ - 67 // | 00 | 3 | 49152 | ($C000-$FFFF)* | - 68 // | 01 | 2 | 32768 | ($8000-$BFFF) | - 69 // | 10 | 1 | 16384 | ($4000-$7FFF)* | - 70 // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) | - 71 // +------+-------+----------+-------------------------------------+ - 72 ?bits=%11 - 73 - 74 ift (%%bank==0) - 75 ?bits=%11 - 76 eli (%%bank==1) - 77 ?bits=%10 - 78 eli (%%bank==2) - 79 ?bits=%01 - 80 eli (%%bank==3) - 81 ?bits=%00 - 82 eif - 83 - 84 // - 85 // Set Data Direction for CIA #2, Port A to output - 86 // - 87 lda $dd02 - 88 and #%11111100 // Mask the bits were interested in. - 89 ora #$03 // Set bits 0 and 1. - 90 sta $dd02 - 91 - 92 // - 93 // Tell VIC-II to switch to bank - 94 // - 95 lda $dd00 - 96 and #%11111100 - 97 ora #?bits - 98 sta $dd00 - 99 .endm - 100 - 101 - 102 // - 103 // Enter hires bitmap mode (a.k.a. standard bitmap mode) - 104 // - 105 .macro SetHiresBitmapMode - 106 // - 107 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) - 108 // - 109 lda $d011 - 110 and #%10111111 - 111 ora #%00100000 - 112 sta $d011 - 113 - 114 // - 115 // Clear multi color mode (bit 4) - 116 // - 117 lda $d016 - 118 and #%11101111 - 119 sta $d016 - 120 .endm - 121 - 122 - 123 // - 124 // Enter hires bitmap mode (a.k.a. standard bitmap mode) - 125 // - 126 .macro SetMulticolorBitmapMode - 127 // - 128 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) - 129 // - 130 lda $d011 - 131 and #%10111111 - 132 ora #%00100000 - 133 sta $d011 - 134 - 135 // - 136 // Clear multi color mode (bit 4) - 137 // - 138 lda $d016 - 139 ora #%00010000 - 140 sta $d016 - 141 .endm - 142 - 143 - 144 // - 145 // Switch location of screen memory. - 146 // - 147 // Args: - 148 // address: Address relative to current VIC-II bank base address. - 149 // Valid values: $0000-$3c00. Must be a multiple of $0400. - 150 // - 151 .macro SetScreenMemory(address) - 152 // - 153 // The most significant nibble of $D018 selects where the screen is - 154 // located in the current VIC-II bank. - 155 // - 156 // +------------+-----------------------------+ - 157 // | | LOCATION* | - 158 // | BITS +---------+-------------------+ - 159 // | | DECIMAL | HEX | - 160 // +------------+---------+-------------------+ - 161 // | 0000XXXX | 0 | $0000 | - 162 // | 0001XXXX | 1024 | $0400 (DEFAULT) | - 163 // | 0010XXXX | 2048 | $0800 | - 164 // | 0011XXXX | 3072 | $0C00 | - 165 // | 0100XXXX | 4096 | $1000 | - 166 // | 0101XXXX | 5120 | $1400 | - 167 // | 0110XXXX | 6144 | $1800 | - 168 // | 0111XXXX | 7168 | $1C00 | - 169 // | 1000XXXX | 8192 | $2000 | - 170 // | 1001XXXX | 9216 | $2400 | - 171 // | 1010XXXX | 10240 | $2800 | - 172 // | 1011XXXX | 11264 | $2C00 | - 173 // | 1100XXXX | 12288 | $3000 | - 174 // | 1101XXXX | 13312 | $3400 | - 175 // | 1110XXXX | 14336 | $3800 | - 176 // | 1111XXXX | 15360 | $3C00 | - 177 // +------------+---------+-------------------+ - 178 // - 179 ?bits = (%%address / $0400) << 4 - 180 - 181 lda $d018 - 182 and #%00001111 - 183 ora #?bits - 184 sta $d018 - 185 .endm - 186 - 187 - 188 // - 189 // Set location of bitmap. - 190 // - 191 // Args: - 192 // address: Address relative to VIC-II bank address. - 193 // Valid values: $0000 (bitmap at $0000-$1FFF) - 194 // $2000 (bitmap at $2000-$3FFF) - 195 // - 196 .macro SetBitmapAddress(address) - 197 // - 198 // In standard bitmap mode the location of the bitmap area can - 199 // be set to either BANK address + $0000 or BANK address + $2000 - 200 // - 201 // By setting bit 3, we can configure which of the locations to use. - 202 // - 203 - 204 lda $d018 - 205 - 206 ift %%address == $0000 - 207 and #%11110111 - 208 eli %%address == $2000 - 209 ora #%00001000 - 210 eif - 211 - 212 sta $d018 - 213 .endm - 214 - 215 // - 216 // Once this is done, random values appear in location $D41B (RANDOM) - 217 // - 218 .macro InitializeSIDrnd - 219 LDA #$FF ; maximum frequency value - 220 STA $D40E ; voice 3 frequency low byte - 221 STA $D40F ; voice 3 frequency high byte - 222 LDA #$80 ; noise waveform, gate bit off - 223 STA $D412 ; voice 3 control register - 224 .endm - 225 - 226 ;------------------------------------- - 227 .MACRO rolw - 228 ROL :1 - 229 ROL :1+1 - 230 .ENDM - 231 ;------------------------------------- - 232 .MACRO aslw - 233 ASL :1 - 234 ROL :1+1 - 235 .ENDM - 236 ;------------------------------------- - 237 .MACRO rorw - 238 ROR :1+1 - 239 ROR :1 - 240 .ENDM - 241 ;------------------------------------- - 242 .MACRO lsrw - 243 LSR :1+1 - 244 ROR :1 - 245 .ENDM - 246 ;------------------------------------- - 247 .macro randomize - 248 ;usage: randomize floor ceiling - 249 ;returns (in A) a random .byte between "floor" and "ceiling" - 250 .if :2 < :1 - 251 .error "floor higher than ceiling" - 252 .endif - 253 ?rand - 254 lda random - 255 cmp #:1 ;floor - 256 bcc ?rand - 257 cmp #:2+1 ;ceiling - 258 bcs ?rand - 259 .endm - 260 ;------------------------------------- - 261 .macro phx - 262 txa - 263 pha - 264 .endm - 265 ;------------------------------------- - 266 .macro phy - 267 tya - 268 pha - 269 .endm - 270 ;------------------------------------- - 271 .macro plx - 272 pla - 273 tax - 274 .endm - 275 ;------------------------------------- - 276 .macro ply - 277 pla - 278 tay - 279 .endm - 280 ;------------------------------------- - 281 .MACRO WAIT - 282 ; WAIT - 283 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) - 284 ?ze LDA $D012 - 285 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) - 286 bcc ?ze - 287 sbc #10 ; last lines correction - 288 ?wa cmp $D012 - 289 bcc ?wa - 290 ?wf cmp $D012 - 291 bcs ?wf - 292 .ENDM - 293 ;------------------------------------- - 294 .macro halt - 295 ?s jmp ?s - 296 .endm - 158 - 159 ;----------------------------------------------- - 160 ; variable declarations in RAM (no code) - 161 ;----------------------------------------------- - 162 - 163 ; Game loading address - 164 ORG $4100 - 165 4100 icl 'variables.asm' -Source: variables.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 ;===================================================== - 5 ; most important non-zero page variables - 6 ; used by the given subroutines - 7 ; moved to one place for easier - 8 ; compilation to e.g. cartridge - 9 ; zero page variables are declared in program.s65 module - 10 ;===================================================== - 11 4100 OneTimeZeroVariables - 12 = 003F OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! - 13 .if OneTimeZeroVariablesCount > 127 - 14 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount - 15 .endif - 16 - 17 = 4100 noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music - 18 = 4101 noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX - 19 ;---------------------------------------------------- - 20 ; Color table for Game Over Screen (created in a gameover routine) - 21 = 4102 .ds 1 ;.by $00 ; labels line color - 22 = 4103 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 - 23 ;---------------------------------------------------- - 24 4109 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 - 25 ;:6 dta d" " - 26 = 4109 .ds 6*8 - 27 ;---------------------------------------------------- - 28 4139 skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) - 29 = 4139 .DS MaxPlayers - 30 ;---------------------------------------------------- - 31 413F variablesToInitialize - 32 ;Options DO NOT ZERO ON RESTART GAME - ticket #27 - 33 = 413F OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0 - 34 = 4148 RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game - 35 = 4149 seppukuVal .ds 1 ;.by 75 - 36 = 414A mountainDeltaH .ds 1 ;.by 3 - 37 = 414B mountainDeltaL .ds 1 ;.by $ff - 38 ;---------------------------------------------------- - 39 414C LineHeader1 - 40 = 414C .ds 9 ;dta d"# ROUND: " - 41 4155 RoundNrDisplay - 42 = 4155 .ds 5 ;dta d" #", $ff - 43 ; 4x4 text buffer - 44 415A ResultLineBuffer - 45 = 415A .ds 14 ;dta d" ", $ff - 46 4168 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 - 47 = 4168 .ds (screenHeight+1) - 48 4231 linetableH ; = PMGraph + $0300 - (screenHeight+1) - 49 = 4231 .ds (screenHeight+1) - 50 42FA DisplayCopyPurchase - 51 = 42FA .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1) - 52 42FB StatusBufferCopy - 53 = 42FB .ds screenBytes*3 - 54 ;===================================================== - 55 4373 variablesStart ; zeroing starts here - 56 ;===================================================== - 57 ;isInventory .ds 1 ; 0 - purchase, $ff - inventory - 58 ;-------------- - 59 = 4373 drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) - 60 ;-------------- - 61 = 4374 noDeathCounter .ds 1 - 62 ;-------------- - 63 = 4375 OptionsY .ds 1 ;vertical position of cursor on Options screen - 64 = 4376 flyDelay .ds 1 - 65 ;-------------- - 66 ;NumberOfPlayers .DS 1 ;current number of players (counted from 1) - 67 = 4377 TankSequence .DS MaxPlayers ;sequence of shooting during the Round - 68 = 437D GameIsOver .DS 1 ; 1 means it was the last round in the game - 69 ;---------------------------------------------------- - 70 437E moneyH ;we place zero at the end of prices and money - 71 ;and have range from 0 to 99990 (not too much) - 72 ;money players have (maybe one more byte is needed?) - 73 = 437E .DS MaxPlayers - 74 4384 moneyL - 75 = 4384 .DS MaxPlayers - 76 ;---------------------------------------------------- - 77 438A gainH ;how much money player gets after the round - 78 ;it is gathered during the round basing on energy - 79 ;opponents lose after player's shoots - 80 = 438A .DS MaxPlayers - 81 4390 gainL - 82 = 4390 .DS MaxPlayers - 83 ;---------------------------------------------------- - 84 4396 loseH ;how much player looses after the round - 85 ;calculated from REAL energy loss - 86 ;(not only to zero energy) - 87 = 4396 .DS MaxPlayers - 88 439C loseL - 89 = 439C .DS MaxPlayers - 90 ;---------------------------------------------------- - 91 43A2 Energy - 92 = 43A2 .DS MaxPlayers - 93 43A8 ShieldEnergy - 94 = 43A8 .DS MaxPlayers - 95 = 43AE EnergyDecrease .DS 1 - 96 43AF eXistenZ - 97 = 43AF .DS MaxPlayers - 98 43B5 LASTeXistenZ ; eXistenZ before shoot - 99 = 43B5 .DS MaxPlayers - 100 - 101 43BB ResultsTable ;the results in the gameeeeee - 102 = 43BB .DS MaxPlayers - 103 43C1 TempResults - 104 = 43C1 .DS MaxPlayers - 105 ;DirectHitsH ; one byte enough - 106 ; .DS MaxPlayers - 107 43C7 DirectHits - 108 = 43C7 .DS MaxPlayers - 109 43CD EarnedMoneyH - 110 = 43CD .DS MaxPlayers - 111 43D3 EarnedMoneyL - 112 = 43D3 .DS MaxPlayers - 113 ;---------------------------------------------------- - 114 43D9 ForceTableL ;shooting Force of the tank during the round - 115 = 43D9 .DS MaxPlayers - 116 43DF ForceTableH - 117 = 43DF .DS MaxPlayers ;maxplayers=6 - 118 43E5 MaxForceTableL ;Energy of the tank during the round - 119 ;(limes superior force of the Shoot) - 120 = 43E5 .DS MaxPlayers ;1000 is the default - 121 43EB MaxForceTableH - 122 = 43EB .DS MaxPlayers - 123 ;---------------------------------------------------- - 124 43F1 BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! - 125 = 43F1 .DS MaxPlayers - 126 43F7 ActiveWeapon ;number of the selected weapon - 127 = 43F7 .DS MaxPlayers - 128 43FD ActiveDefenceWeapon ;number of the activated defence weapon - 0 - 129 = 43FD .DS MaxPlayers - 130 4403 AutoDefenseFlag ; 0 - not activated, >$7f - activated - 131 = 4403 .DS MaxPlayers - 132 = 4409 WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile - 133 ;---------------------------------------------------- - 134 - 135 ;format of the 3-byte static point number used in the game - 136 ; 20203.5 => 128 : <20203 : >20203 - 137 ;---------------------------------------------------- - 138 - 139 ;L1 .DS 1 ; variable used in multiplications (by 10:) - 140 ;gravity .DS 1 ;only the decimal part (1/10 = 25) - 141 ;---------------------------------------------------- - 142 - 143 ;Wind .ds 4 ;format: 0000.hhll - 144 ;walue displayed on the screen is - 145 ;decimal portion divided by 16 (>>4) - 146 ;---------------------------------------------------- - 147 = 440A MaxWind .ds 1 ; - 148 = 440B WindOrientation .DS 1 ;(0-right,1-left) - 149 ;---------------------------------------------------- - 150 ;Counter .DS 1 ;temporary Counter for outside loops - 151 ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank - 152 = 440C WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy - 153 ;---------------------------------------------------- - 154 440D xtankstableL ;X positions of tanks (lower left point) - 155 = 440D .DS MaxPlayers - 156 4413 xtankstableH - 157 = 4413 .DS MaxPlayers - 158 4419 ytankstable ;Y positions of tanks (lower left point) - 159 = 4419 .DS MaxPlayers - 160 441F LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) - 161 = 441F .DS MaxPlayers - 162 4425 JoyNumber ; Joystick port number (from 0 to 3) - 163 = 4425 .DS MaxPlayers - 164 442B TankShape ; Tank shape number (from 0 to 2) - 165 = 442B .DS MaxPlayers - 166 ;---------------------------------------------------- - 167 4431 TargetTankNr ; Target tank index (for AI routines) - 168 = 4431 .DS 1 - 169 4432 SecondTryFlag ; For precise AI aiming - 170 = 4432 .DS 1 - 171 ;---------------------------------------------------- - 172 ;Erase .DS 1 ; if 1 only mask of the character is printed - 173 ; on the graphics screen. if 0 character is printed normally - 174 - 175 ;---------------------------------------------------- - 176 ;RangeLeft .DS 2 ;range of the soil to be fallen down - 177 ;RangeRight .DS 2 ;it is being set by all Explosions - 178 ;---------------------------------------------------- - 179 = 4433 WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon - 180 = 4435 WeaponRangeRight .DS 2 - 181 ;---------------------------------------------------- - 182 ;xroller - 183 ;HowMuchToFall .ds 1 - 184 = 4437 HeightRol .DS 1 - 185 ;digger - 186 ;digstartx .DS 2 - 187 ;digstarty .DS 2 - 188 = 4438 diggery .DS 1 - 189 = 4439 DigLong .DS 1 - 190 = 443A digtabxL .DS [8] - 191 = 4442 digtabxH .DS [8] - 192 = 444A digtabyL .DS [8] - 193 = 4452 digtabyH .DS [8] - 194 ; liquiddirt - 195 = 445A TempXfill .ds 2 - 196 = 445C FillCounter .ds 2 - 197 ;sandhog - 198 = 445E sandhogflag .DS 1 ; (0 digger, 8 sandhog) - 199 ;ofdirt - 200 ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65) - 201 ;draw - 202 ;HowToDraw .DS 1 - 203 ; bits here mean - 204 ; 0 - negative X (go up) - 205 ; 1 - negative Y (left) - 206 ; 2 - directional value > 1 (more than 45 degrees) - 207 ; if all 0 then standart routine - 208 ;XHit .DS 2 - 209 = 445F YHit .DS 2 - 210 ;LineLength .DS 2 - 211 ;circle - 212 ;radius .DS 1 - 213 ;xcircle .DS 2 - 214 ;ycircle .DS 2 - 215 = 4461 tempcir .DS 2 - 216 ;TankFalls - 217 = 4463 FallingSoundBit .DS 1 - 218 = 4464 PreviousFall .DS 1 - 219 = 4465 EndOfTheFallFlag .DS 1 ; in case of the infinite fall - 220 ;Parachute .DS 1 ; are you insured with parachute? - 221 ;FloatingAlt .DS 1 ; floating tank altitude - 222 = 00A2 FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! - 223 = 00A2 PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc - 224 ;---------------------------------------------------- - 225 ;Flight - 226 ;variables for 5 missiles (used for mirv) - 227 = 4466 xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte - 228 = 446B xtraj01 .DS [5] ; middle byte - 229 = 4470 xtraj02 .DS [5] ; high byte - 230 ;vx00 .DS [5] ; looks like it is not really used anywhere - 231 = 4475 vx01 .DS [5] - 232 = 447A vx02 .DS [5] - 233 = 447F vx03 .DS [5] - 234 = 4484 MirvDown .DS [5] ; is given missile down? - 235 = 4489 MirvMissileCounter .DS 1 ; missile Counter (mainly for X) - 236 = 448A SmokeTracerFlag .DS 1 ; if Smoketracer - 237 = 448B LaserFlag .DS 1 ; $ff if Laser - 238 = 448C XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) - 239 = 448D YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) - 240 ;---------------------------------------------------- - 241 ;CheckCollisionWithTank - 242 ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) - 243 ;vy .ds 4 ;0,0,0,0 - 244 ;xtraj .ds 3 ; 0,0,0 - 245 ;ytraj .ds 3 ; 0,0,0 - 246 = 448E xtrajold .ds 3 ; 0,0,0 - 247 = 4491 ytrajold .ds 3 ; 0,0,0 - 248 ;Angle .DS 1 - 249 ;Force .ds 3 ; 0,0,0 - 250 ;Multiplier .ds 3 ; 0,0,0 - 251 = 4494 Multiplee .ds 2 ; 0,0 - 252 ;goleft .DS 1 ;if 1 then flights left - 253 ;---------------------------------------------------- - 254 ;unPlot - 255 = 4496 WhichUnPlot .DS 1 - 256 ; max 5 concurrent unPlots - 257 = 4497 oldplotH .DS [5] - 258 = 449C oldplotL .DS [5] - 259 = 44A1 oldora .DS [5] - 260 = 44A6 oldply .DS [5] - 261 = 44AB OldOraTemp .DS 1 - 262 = 44AC xtrajfb .DS 2 - 263 = 44AE ytrajfb .DS 2 - 264 ; - 265 ;tracerflag .DS 1 - 266 ;---------------------------------------------------- - 267 ;TypeChar - 268 = 44B0 mask1 .DS [8] - 269 = 44B8 mask2 .DS [8] - 270 - 271 = 44C0 char1 .DS [8] - 272 = 44C8 char2 .DS [8] - 273 ;color .DS 1 - 274 = 44D0 ybit .DS 1 - 275 = 44D1 tempbyte01 .DS 1 - 276 ;delta .DS 2 - 277 = 44D2 yfloat .DS 2 - 278 = 44D4 deltaX .DS 1 - 279 = 44D5 UpNdown .DS 1 - 280 - 281 = 44D6 temptankX .DS 2 - 282 = 44D8 temptankNr .DS 1 - 283 = 44D9 AfterBFGflag .DS 1 - 284 - 285 ;---------------------------------------------------- - 286 ;Variables from textproc.s65 - 287 ; tables with indexes of weapons on the right lists - 288 ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive - 289 44DA IndexesOfWeaponsL1 - 290 = 44DA .ds (last_offensive_____ - first_offensive____+1) - 291 44FA IndexesOfWeaponsL2 - 292 = 44FA .ds (last_defensive_____ - first_defensive____+1) - 293 ;---------------------------------------------------- - 294 - 295 ; variables storing amount of weapons on the first and second - 296 ; list and pointer position - 297 - 298 450A HowManyOnTheListOff - 299 = 450A .DS 1 - 300 450B HowManyOnTheListDef - 301 = 450B .DS 1 - 302 ;PositionOnTheList ; pointer position on the list being displayed - 303 ; .DS 1 - 304 450C LastWeapon - 305 ; number of the last previously purchased weapon - 306 ; it is necessary when after purchase some weapon - 307 ; is removed from the list (because too expensive) - 308 ; and the cursor must be placed elsewhere - 309 = 450C .DS 1 - 310 450D WhichList ; list currently on the screen - 311 ; (0-offensive, %10000000 - defensive (check with bit:bmi for defensives) - 312 = 450D .DS 1 - 313 ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines).... - 314 - 315 - 316 ;---------------------------------------------------- - 317 - 318 ;mark the level - 319 450E PositionInName ; cursor position in name of the player when name input - 320 = 450E .DS 1 - 321 ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu) - 322 - 323 ;---------------------------------------------------- - 324 ;displaydecimal - 325 ;decimal .DS 2 - 326 = 450F decimalresult .DS 5 - 327 - 328 ;xmissile - 329 ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte - 330 ;round - 331 = 4514 CurrentRoundNr .DS 1 - 332 ;FallDown2 .DS 1 - 333 ;leapfrog - 334 = 4515 LeapFrogAngle .DS 1 - 335 ;laser - 336 = 4516 LaserCoordinate .DS 8 ; 2,2,2,2 - 337 ;---------------------------------------------------- - 338 ; Here go tables with weapons possesed by a given tank - 339 ; Index in the table means weapon type - 340 ; number entered means ammo for given weapon possessed (max 99) - 341 ; Let 0 be "baby missile" - 342 ; from $30 the defensive weapons begin - 343 451E TanksWeapons - 344 451E TanksWeapon1 - 345 = 451E .DS number_of_weapons - 346 454E TanksWeapon2 - 347 = 454E .DS number_of_weapons - 348 457E TanksWeapon3 - 349 = 457E .DS number_of_weapons - 350 45AE TanksWeapon4 - 351 = 45AE .DS number_of_weapons - 352 45DE TanksWeapon5 - 353 = 45DE .DS number_of_weapons - 354 460E TanksWeapon6 - 355 = 460E .DS number_of_weapons - 356 - 357 463E mountaintable ;table of mountains (size=screenwidth) - 358 = 463E .DS [screenwidth] - 359 = 477E .DS 1 ; additional byte for fallout (sometimes 1 pixel) - 360 477F mountaintable2 ;table of mountains (size=screenwidth) - 361 = 477F .DS [screenwidth] - 362 = 48BF .DS 1 ; additional byte for fallout (sometimes 1 pixel) - 363 48C0 MountaintableEnd ;good for table clearing - 364 ;---------------------------------------------------- - 365 = 48C0 TextNumberOff .DS 1 - 366 ;-------------- - 367 48C1 TankTempY - 368 = 48C1 .DS 1 - 369 ;---------------------------------------------------- - 370 ;-------------- single round variables -------------- - 371 ;---------------------------------------------------- - 372 48C2 singleRoundVars - 373 ;-------------- - 374 ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed - 375 ;-------------- - 376 48C2 CurrentResult - 377 = 48C2 .DS 1 - 378 ;-------------- - 379 48C3 AngleTable ;Angle of the barrel of each tank during the round - 380 = 48C3 .DS MaxPlayers - 381 48C9 EndOfTheBarrelX - 382 = 48C9 .ds 2 - 383 48CB EndOfTheBarrelY - 384 = 48CB .ds 1 - 385 ;---------------------------------------------------- - 386 48CC previousAngle - 387 = 48CC .DS MaxPlayers - 388 48D2 previousEnergyL - 389 = 48D2 .DS MaxPlayers - 390 48D8 previousLeftRange - 391 = 48D8 .DS MaxPlayers - 392 48DE previousEnergyH - 393 = 48DE .DS MaxPlayers - 394 48E4 RandBoundaryLow - 395 = 48E4 .ds 2 - 396 48E6 RandBoundaryHigh - 397 = 48E6 .ds 2 - 398 48E8 AngleTablePointer - 399 = 48E8 .DS 1 - 400 48E9 singleRoundVarsEnd - 401 ;---------------------------------------------------- - 402 ; 4x4 texts - 403 ;---------------------------------------------------- - 404 ;LineAddress4x4 .DS 2 - 405 = 48E9 LineCharNr .DS 1 - 406 ;LineXdraw .DS 2 - 407 ;LineYdraw .DS 1 - 408 - 409 ;----------- - 410 48EA ResultOfTankNr - 411 = 48EA .DS 1 - 412 - 413 ;---------------------------------------------------- - 414 ;PutChar4x4 - 415 ;---------------------------------------------------- - 416 = 48EB nibbler4x4 .DS 1 - 417 = 48EC CharCode4x4 .DS 1 - 418 ;plot4x4color .DS 1 ;1-white, 0-background - 419 ; This is moved from display.asm to be easier to relocate - 420 48ED ListOfWeapons - 421 ; 0123456789012345678901234567890123456789 - 422 ; :number_of_offensives dta d" " - 423 ;:32 dta d" " - 424 = 48ED .ds 32*32 - 425 4CED ListOfWeapons1End - 426 4CED ListOfDefensiveWeapons - 427 ; :number_of_defensives dta d" " - 428 ;:16 dta d" " - 429 = 4CED .ds 16*32 - 430 4EED ListOfDefensiveWeaponsEnd ;constant useful when clearing - 431 4EED track_variables - 432 = 4EED trackn_db .ds TRACKS - 433 = 4EF1 trackn_hb .ds TRACKS - 434 = 4EF5 trackn_idx .ds TRACKS - 435 = 4EF9 trackn_pause .ds TRACKS - 436 = 4EFD trackn_note .ds TRACKS - 437 = 4F01 trackn_volume .ds TRACKS - 438 = 4F05 trackn_distor .ds TRACKS - 439 = 4F09 trackn_shiftfrq .ds TRACKS - 440 = 4F0D trackn_instrx2 .ds TRACKS - 441 = 4F11 trackn_instrdb .ds TRACKS - 442 = 4F15 trackn_instrhb .ds TRACKS - 443 = 4F19 trackn_instridx .ds TRACKS - 444 = 4F1D trackn_instrlen .ds TRACKS - 445 = 4F21 trackn_instrlop .ds TRACKS - 446 = 4F25 trackn_instrreachend .ds TRACKS - 447 = 4F29 trackn_volumeslidedepth .ds TRACKS - 448 = 4F2D trackn_volumeslidevalue .ds TRACKS - 449 = 4F31 trackn_effdelay .ds TRACKS - 450 = 4F35 trackn_effvibratoa .ds TRACKS - 451 = 4F39 trackn_effshift .ds TRACKS - 452 = 4F3D trackn_tabletypespeed .ds TRACKS - 453 = 4F41 trackn_tablenote .ds TRACKS - 454 = 4F45 trackn_tablea .ds TRACKS - 455 = 4F49 trackn_tableend .ds TRACKS - 456 = 4F4D trackn_tablelop .ds TRACKS - 457 = 4F51 trackn_tablespeeda .ds TRACKS - 458 = 4F55 trackn_command .ds TRACKS - 459 = 4F59 trackn_filter .ds TRACKS - 460 = 4F5D trackn_audf .ds TRACKS - 461 = 4F61 trackn_audc .ds TRACKS - 462 = 4F65 trackn_audctl .ds TRACKS - 463 = 4F69 v_aspeed .ds 1 - 464 4F6A track_endvariables - 465 - 466 4F6A variablesEnd - 467 ;---------------------------------------------------- - 468 - 469 .endif - 166 - 167 4F6A WeaponFont - 168 4F6A 00 00 00 00 00 00 + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' - 169 - 170 - 171 ;-------------------------------------------------- - 172 ; Game Code - 173 ;-------------------------------------------------- - 174 536A FirstSTART - 175 = 0000 DL = 0 - 176 = 0000 StatusBufferROM = 0 - 177 ;StatusBufferCopy = 0 - 178 = 0000 StatusBufferCopyEnd = 0 - 179 = 0004 TRACKS = 4 - 180 = 0000 DisplayCopyPurchaseEnd = 0 - 181 = 0000 DisplayCopyPurchaseStart = 0 - 182 = 2000 displayC64 = $2000 ; graphics screen memory start - 183 - 184 536A 78 SEI ; disable IRQ - 185 536B A9 36 LDA #$36 - 186 536D 85 01 STA $0001 ; Turn Off BASIC ROM - 187 536F A9 FE LDA #NMI ; to our routine - 190 5376 8D 19 03 STA $0319 ; - 191 5379 A9 00 LDA #$00 ; stop Timer A - 192 537B 8D 0E DD STA $DD0E ; - 193 537E 8D 04 DD STA $DD04 ; set Timer A to 0, after starting - 194 5381 8D 05 DD STA $DD05 ; NMI will occur immediately - 195 5384 A9 81 LDA #$81 ; - 196 5386 8D 0D DD STA $DD0D ; set Timer A as source for NMI - 197 5389 A9 01 LDA #$01 ; - 198 538B 8D 0E DD STA $DD0E ; start Timer A -> NMI - 199 - 200 ; from here on NMI is disabled - 201 - 202 - 203 538E 20 89 5A jsr MakeDarkScreen - 204 - 205 ; one time zero variables in RAM (non zero page) - 206 5391 A9 00 lda #0 - 207 5393 A0 3E ldy #OneTimeZeroVariablesCount-1 - 208 5395 99 00 41 @ sta OneTimeZeroVariables,y - 209 5398 88 dey - 210 5399 10 FA bpl @- - 211 - 212 ; one time zero variables in RAM (zero page) - 213 539B A0 58 ldy #FirstZpageVariable - 214 539D 99 00 00 @ sta $0000,y - 215 53A0 C8 iny - 216 53A1 D0 FA bne @- - 217 - 218 ; initialize variables in RAM (non zero page) - 219 53A3 A0 1B ldy #initialvaluesCount-1 - 220 53A5 B9 B9 5A @ lda initialvaluesStart,y - 221 53A8 99 3F 41 sta variablesToInitialize,y - 222 53AB 88 dey - 223 53AC 10 F7 bpl @- - 224 - 225 - 226 ; generate linetables - 227 53AE 20 9D 76 jsr GenerateLineTable - 228 - 229 - 230 ; Random INIT - 231 53B1 InitializeSIDrnd -Macro: INITIALIZESIDRND [Source: MACRO.ASM] - 1 53B1 A9 FF LDA #$FF ; maximum frequency value - 2 53B3 8D 0E D4 STA $D40E ; voice 3 frequency low byte - 3 53B6 8D 0F D4 STA $D40F ; voice 3 frequency high byte - 4 53B9 A9 80 LDA #$80 ; noise waveform, gate bit off - 5 53BB 8D 12 D4 STA $D412 ; voice 3 control register -Source: scorchC64.asm - 232 - 233 ;-------------------------------------------------- - 234 ; Main program of the game - 235 53BE icl 'game.asm' -Source: game.asm - 1 .IF *>0 ;this is a trick that prevents compiling this file alone - 2 - 3 ; All main procedures of the game not dependent on hardware (I hope) :) - 4 - 5 53BE START - 6 53BE 20 89 5A jsr MakeDarkScreen - 7 ; Startup sequence - 8 53C1 20 6A 58 jsr Initialize - 9 - 10 ;jsr GameOverScreen ; only for test !!! - 11 - 12 53C4 RMTSong song_main_menu -Macro: RMTSONG [Source: scorchC64.asm] - 1 53C4 A9 02 lda #SONG_MAIN_MENU ; do nothing in C64 -Source: game.asm - 13 - 14 53C6 20 E5 62 jsr Options ;startup screen - 15 53C9 20 1E 63 jsr SetVariablesFromOptions - 16 53CC 20 89 5A jsr MakeDarkScreen - 17 53CF 24 D7 bit escFlag - 18 53D1 30 EB bmi START - 19 - 20 53D3 20 C6 63 jsr EnterPlayerNames - 21 53D6 20 89 5A jsr MakeDarkScreen - 22 53D9 24 D7 bit escFlag - 23 53DB 30 E1 bmi START - 24 - 25 53DD 20 0B 59 jsr RandomizeSequence - 26 ; for the round #1 shooting sequence is random - 27 - 28 53E0 MainGameLoop - 29 53E0 20 41 5A jsr SetWallsType - 30 ; first set default barrel lengths (fix for Long Schlong activation :) ) - 31 ; we must do it before purchase/activate - 32 ; and set Auto Defense to off - 33 53E3 20 FB 58 jsr SetStandardBarrels - 34 - 35 53E6 20 77 63 jsr CallPurchaseForEveryTank - 36 53E9 20 89 5A jsr MakeDarkScreen - 37 53EC 24 D7 bit escFlag - 38 53EE 30 CE bmi START - 39 - 40 53F0 20 E7 57 jsr GetRandomWind - 41 - 42 53F3 20 D3 54 jsr RoundInit - 43 - 44 53F6 20 5F 55 jsr MainRoundLoop - 45 53F9 24 D7 bit escFlag - 46 53FB 30 C1 bmi START - 47 53FD 50 03 4C C3 54 jvs GoGameOver - 48 - 49 5402 20 DD 59 jsr SortSequence - 50 - 51 5405 A9 00 85 6C mva #0 TankNr ; - 52 5409 85 02 sta COLBAKS ; set background color to black - 53 540B 85 5D sta JoystickNumber ; set joystick port for player - 54 - 55 ; Hide all (easier than hide last ;) ) tanks - 56 540D 20 0B 6A jsr cleartanks ; A=0 - 57 - 58 ; here gains and losses should be displayed (dollars) - 59 ; finally we have changed our minds and money of players - 60 ; is displayed only in weapons shop - 61 - 62 ; Results are number of other deaths - 63 ; before the player dies itself - 64 - 65 5410 RmtSong song_round_over -Macro: RMTSONG [Source: scorchC64.asm] - 1 5410 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 -Source: game.asm - 66 5412 20 A3 64 jsr DisplayResults - 67 - 68 5415 20 75 5A jsr DemoModeOrKey - 69 5418 20 89 5A jsr MakeDarkScreen - 70 - 71 541B A6 AE ldx NumberOfPlayers - 72 541D CA dex - 73 541E CalculateGains - 74 ; add gains and substract losses - 75 ; gain is what player gets for lost energy of opponents - 76 ; energy lost by opponents is added during Round and - 77 ; little below in source, multiplied by 2 to get "dollars". - 78 ; By analogy, loss is energy that given player losses during - 79 ; each Round. - 80 ; Important! If player has 10 energy and gets a central hit - 81 ; from nuke that would take 90 energy points, his loss - 82 ; is 90, not 10 - 83 - 84 ; adding the remaining energy of the tank to gain - 85 ; winner gets more ! :) - 86 541E BD A2 43 lda Energy,x - 87 5421 7D 90 43 adc gainL,x - 88 5424 9D 90 43 sta gainL,x - 89 5427 90 03 bcc @+ - 90 5429 FE 8A 43 inc gainH,x - 91 @ - 92 ; add gain * 2 - 93 542C 1E 90 43 asl gainL,x - 94 542F 3E 8A 43 rol gainH,x - 95 5432 18 clc - 96 5433 BD 84 43 lda moneyL,x - 97 5436 7D 90 43 adc gainL,x - 98 5439 9D 84 43 sta moneyL,x - 99 543C BD 7E 43 lda moneyH,x - 100 543F 7D 8A 43 adc gainH,x - 101 5442 9D 7E 43 sta moneyH,x - 102 ; substract lose - 103 ; if lose is greater than money then zero money - 104 5445 BD 7E 43 lda moneyH,x - 105 5448 DD 96 43 cmp loseH,x - 106 544B 90 20 bcc zeromoney - 107 544D D0 08 bne substractlose - 108 544F BD 84 43 lda moneyL,x - 109 5452 DD 9C 43 cmp loseL,x - 110 5455 90 16 bcc zeromoney - 111 5457 substractlose - 112 5457 38 sec - 113 5458 BD 84 43 lda moneyL,x - 114 545B FD 9C 43 sbc loseL,x - 115 545E 9D 84 43 sta moneyL,x - 116 5461 BD 7E 43 lda moneyH,x - 117 5464 FD 96 43 sbc loseH,x - 118 5467 9D 7E 43 sta moneyH,x - 119 546A 4C 75 54 jmp skipzeroing - 120 546D zeromoney - 121 546D A9 00 lda #0 - 122 546F 9D 84 43 sta moneyL,x - 123 5472 9D 7E 43 sta moneyH,x - 124 5475 skipzeroing - 125 ; and earned money for summary - 126 5475 18 clc - 127 5476 BD D3 43 lda EarnedMoneyL,x - 128 5479 7D 90 43 adc gainL,x - 129 547C 9D D3 43 sta EarnedMoneyL,x - 130 547F BD CD 43 lda EarnedMoneyH,x - 131 5482 7D 8A 43 adc gainH,x - 132 5485 9D CD 43 sta EarnedMoneyH,x - 133 ; substract lose - 134 ; if lose is greater than money then zero money - 135 5488 BD CD 43 lda EarnedMoneyH,x - 136 548B DD 96 43 cmp loseH,x - 137 548E 90 20 bcc ezeromoney - 138 5490 D0 08 bne esubstractlose - 139 5492 BD D3 43 lda EarnedMoneyL,x - 140 5495 DD 9C 43 cmp loseL,x - 141 5498 90 16 bcc ezeromoney - 142 549A esubstractlose - 143 549A 38 sec - 144 549B BD D3 43 lda EarnedMoneyL,x - 145 549E FD 9C 43 sbc loseL,x - 146 54A1 9D D3 43 sta EarnedMoneyL,x - 147 54A4 BD CD 43 lda EarnedMoneyH,x - 148 54A7 FD 96 43 sbc loseH,x - 149 54AA 9D CD 43 sta EarnedMoneyH,x - 150 54AD 4C B8 54 jmp eskipzeroing - 151 54B0 ezeromoney - 152 54B0 A9 00 lda #0 - 153 54B2 9D D3 43 sta EarnedMoneyL,x - 154 54B5 9D CD 43 sta EarnedMoneyH,x - 155 54B8 eskipzeroing - 156 - 157 54B8 CA dex - 158 54B9 30 03 4C 1E 54 jpl CalculateGains - 159 - 160 54BE AD 7D 43 lda GameIsOver - 161 54C1 F0 06 beq NoGameOverYet - 162 54C3 GoGameOver - 163 54C3 20 0E 66 jsr GameOverScreen - 164 54C6 4C BE 53 jmp START - 165 54C9 NoGameOverYet - 166 54C9 EE 14 45 inc CurrentRoundNr - 167 54CC A9 15 85 9E mva #sfx_silencer sfx_effect - 168 - 169 54D0 4C E0 53 jmp MainGameLoop - 170 - 171 - 172 ;-------------------------------------------------- - 173 54D3 .proc RoundInit - 174 ;-------------------------------------------------- - 175 ; at the beginning of each Round we set energy - 176 ; of all players to 99 - 177 ; the maximum shooting energy to 990 (it is 10*energy) - 178 ; the default shooting energy to 350 - 179 ; the shooting angle is randomized - 180 ; of course gains an loses are zeroed - 181 - 182 54D3 RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 54D3 A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: game.asm - 183 - 184 54D5 20 62 75 jsr SetPMWidth ; A=0 - 185 54D8 A9 00 lda #0 - 186 54DA 8D D9 44 sta AfterBFGflag ; reset BFG flag - 187 54DD 85 02 sta COLOR2 ; status line "off" - 188 54DF 85 02 sta COLOR1 - 189 - 190 54E1 AA tax - 191 54E2 9D C2 48 @ sta singleRoundVars,x - 192 54E5 E8 inx - 193 54E6 E0 27 cpx #(singleRoundVarsEnd-singleRoundVars) - 194 54E8 D0 F8 bne @- - 195 - 196 54EA A2 05 ldx #(MaxPlayers-1) - 197 54EC SettingEnergies - 198 54EC A9 00 lda #$00 - 199 54EE 9D 90 43 sta gainL,x - 200 54F1 9D 8A 43 sta gainH,x - 201 54F4 9D 9C 43 sta loseL,x - 202 54F7 9D 96 43 sta loseH,x - 203 54FA A9 63 lda #99 - 204 54FC 9D A2 43 sta Energy,x - 205 54FF 9D AF 43 sta eXistenZ,x - 206 5502 9D B5 43 sta LASTeXistenZ,x - 207 ; anything in eXistenZ table means that this tank exist - 208 ; in the given round - 209 5505 A9 E8 lda #<1000 - 210 5507 9D E5 43 sta MaxForceTableL,x - 211 550A A9 03 lda #>1000 - 212 550C 9D EB 43 sta MaxForceTableH,x - 213 550F A9 5E lda #<350 - 214 5511 9D D9 43 sta ForceTableL,x - 215 5514 A9 01 lda #>350 - 216 5516 9D DF 43 sta ForceTableH,x - 217 - 218 ;lda #(255-45) - 219 ;it does not look good when all tanks have - 220 ;barrels pointing the same direction - 221 ;so it would be nice to have more or less random - 222 ;angles - 223 5519 20 3D 59 jsr RandomizeAngle - 224 551C 9D C3 48 sta AngleTable,x - 225 - 226 551F CA dex - 227 5520 10 CA bpl SettingEnergies - 228 - 229 ;generating the new landscape - 230 5522 20 46 75 jsr PMoutofScreen ;let P/M disappear - 231 5525 20 7C 76 jsr clearscreen ;let the screen be clean - 232 5528 20 9C 6E jsr ClearPMmemory - 233 552B 20 6A 69 jsr placetanks ;let the tanks be evenly placed - 234 552E 20 04 70 jsr calculatemountains ;let mountains be easy for the eye - 235 ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height - 236 - 237 - 238 5531 A9 00 85 72 85 73 mwa #StatusBufferROM temp - 239 5537 A9 FB 85 74 A9 42 + mwa #StatusBufferCopy temp2 - 240 553F A9 01 85 76 A9 00 + mwa #StatusBufferCopyEnd+1 modify - 241 5547 20 B7 5A jsr CopyFromROM - 242 - 243 554A 20 E4 76 jsr SetMainScreen - 244 554D 20 51 75 jsr ColorsOfSprites - 245 - 246 5550 20 B2 6E jsr drawmountains ;draw them - 247 5553 20 12 6A jsr drawtanks ;finally draw tanks - 248 - 249 5556 A9 00 85 6D mva #$00 TankSequencePointer - 250 - 251 ;---------round screen is ready--------- - 252 555A A9 0A 85 02 mva #TextForegroundColor COLOR1 ; status line "on" - 253 555E 60 rts - 254 .endp - 255 - 256 ;-------------------------------------------------- - 257 555F .proc MainRoundLoop - 258 ; here we must check if by a chance there is only one - 259 ; tank with energy greater than 0 left - 260 ;-------------------------------------------------- - 261 - 262 555F A0 00 ldy #0 ; in Y - number of tanks with energy greater than zero - 263 5561 84 02 sty ATRACT ; reset atract mode - 264 5563 A6 AE ldx NumberOfPlayers - 265 5565 CA dex - 266 5566 CheckingIfRoundIsFinished - 267 5566 BD AF 43 lda eXistenZ,x - 268 5569 F0 01 beq NoEnergy - 269 556B C8 iny - 270 556C NoEnergy - 271 556C CA dex - 272 556D 10 F7 bpl CheckingIfRoundIsFinished - 273 - 274 556F C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ? - 275 5571 B0 17 bcs DoNotFinishTheRound - 276 - 277 ;points for the last living tank - 278 5573 A6 AE ldx NumberOfPlayers - 279 5575 CA dex - 280 5576 WhichTankWonLoop - 281 5576 BD AF 43 lda eXistenZ,x - 282 5579 D0 04 bne ThisOneWon - 283 557B CA dex - 284 557C 10 F8 bpl WhichTankWonLoop - 285 ;error was here!!! - 286 ; somehow I believed program will be never here - 287 ; but it was a bad assumption - 288 ; god knows when there is such a situation - 289 ; (we've got a SITUATION here, if you know what I mean) - 290 ; there are two tanks left. - 291 ; one of them is killed by the second tank - 292 ; second tank explodes and kills the first one. - 293 ; and code lands here... - 294 ; looks like no one won! - 295 557E 60 rts - 296 - 297 557F ThisOneWon - 298 557F AD C2 48 lda CurrentResult - 299 5582 18 clc - 300 5583 7D BB 43 adc ResultsTable,x - 301 5586 9D BB 43 sta ResultsTable,x - 302 - 303 5589 60 rts ; this Round is finished - 304 - 305 558A DoNotFinishTheRound - 306 ; Seppuku here - 307 558A AD 74 43 lda noDeathCounter - 308 558D CD 49 41 cmp seppukuVal - 309 5590 90 0F bcc @+ - 310 - 311 5592 A9 00 8D 74 43 mva #0 noDeathCounter - 312 5597 A9 1A 85 9E mva #sfx_seppuku sfx_effect - 313 - 314 559B 20 19 74 jsr DisplaySeppuku - 315 559E 4C D0 57 jmp Seppuku - 316 - 317 @ - 318 ; Auto Defense - activates defensives - 319 55A1 A6 AE ldx NumberOfPlayers - 320 55A3 CA dex - 321 55A4 CheckNextTankAD - 322 55A4 BD A2 43 lda Energy,x ; only active players - 323 55A7 F0 08 beq @+ - 324 55A9 BD 03 44 lda AutoDefenseFlag,x ; with Auto Defence activated - 325 55AC F0 03 beq @+ - 326 ; run auto defense for tank in X - 327 55AE 20 F2 8A jsr AutoDefense - 328 55B1 CA @ dex - 329 55B2 10 F0 bpl CheckNextTankAD - 330 55B4 20 12 6A jsr DrawTanks ; redraw tanks with new defences - 331 ; - 332 55B7 A6 6D ldx TankSequencePointer - 333 55B9 BD 77 43 lda TankSequence,x - 334 55BC 85 6C sta TankNr - 335 55BE AA tax - 336 55BF BD A2 43 lda Energy,x ;skip if no energy - 337 55C2 D0 03 4C 90 56 jeq NextPlayerShoots - 338 - 339 - 340 - 341 55C7 A9 FF 85 DB mva #$ff plot4x4color - 342 55CB 20 44 73 jsr DisplayTankNameAbove - 343 - 344 55CE A9 01 85 A9 mva #1 color ;to display flying point - 345 - 346 55D2 A6 6C ldx tankNr - 347 55D4 BD 7F 5B lda TankStatusColoursTable,x - 348 55D7 85 02 sta COLOR2 ; set color of status line - 349 55D9 20 0F 66 jsr PutTankNameOnScreen - 350 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 351 - 352 55DC BD 39 41 lda SkillTable,x - 353 55DF F0 1C beq ManualShooting - 354 - 355 55E1 RoboTanks - 356 ; robotanks shoot here - 357 ; TankNr still in X - 358 55E1 20 C3 8F jsr ArtificialIntelligence - 359 ;pause 30 - 360 55E4 A6 6C ldx TankNr - 361 55E6 20 0F 66 jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) - 362 55E9 20 A1 59 jsr MoveBarrelToNewPosition - 363 55EC A5 02 lda kbcode - 364 55EE C9 1C cmp #@kbcode._esc ; 28 ; ESC - 365 55F0 D0 03 bne @+ - 366 55F2 20 AE 73 jsr AreYouSure - 367 55F5 A5 D7 @ lda escFlag - 368 55F7 F0 01 60 seq:rts ; keys Esc or O - 369 - 370 - 371 55FA 4C 11 56 jmp AfterManualShooting - 372 - 373 55FD ManualShooting - 374 55FD BD 25 44 lda JoyNumber,x - 375 5600 85 5D sta JoystickNumber ; set joystick port for player - 376 5602 20 71 5A jsr WaitForKeyRelease - 377 5605 A9 00 lda #%00000000 - 378 5607 85 97 sta TestFlightFlag ; set "Test Fight" off - 379 5609 20 4D 80 jsr BeforeFire - 380 560C A5 D7 lda escFlag - 381 560E F0 01 60 seq:rts ; keys Esc or O - 382 - 383 5611 AfterManualShooting - 384 5611 A9 00 85 DB mva #$00 plot4x4color - 385 5615 20 44 73 jsr DisplayTankNameAbove - 386 ; defensive weapons without flight handling - 387 5618 A6 6C ldx TankNr - 388 561A BD FD 43 lda ActiveDefenceWeapon,x - 389 561D C9 22 cmp #ind_Hovercraft_____ - 390 561F F0 14 beq GoFloat - 391 5621 C9 20 cmp #ind_White_Flag_____ ; White Flag - 392 5623 F0 0A beq ShootWhiteFlag - 393 5625 C9 2B cmp #ind_Nuclear_Winter_ - 394 5627 D0 19 bne StandardShoot - 395 5629 ShootAtomicWinter - 396 ; --- atomic winter --- - 397 5629 20 9B 8A jsr AtomicWinter - 398 562C 4C 90 56 jmp NextPlayerShoots ; and we skip shoot - 399 562F ShootWhiteFlag - 400 ; --- white flag --- - 401 562F 20 70 8A jsr WhiteFlag - 402 5632 4C 90 56 jmp NextPlayerShoots ; and we skip shoot - 403 5635 GoFloat - 404 5635 20 84 8B jsr TankFlying - 405 5638 A9 00 lda #0 - 406 563A 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate after use - 407 563D 24 D7 bit escFlag - 408 563F 10 BC bpl ManualShooting ; after floating tank can shoot - 409 5641 60 rts - 410 5642 StandardShoot - 411 5642 EE 74 43 inc noDeathCounter - 412 - 413 5645 20 98 8F jsr DecreaseWeaponBeforeShoot - 414 5648 20 0F 66 jsr DisplayStatus - 415 - 416 ; ldx TankNr - 417 564B DE A2 43 dec Energy,x ; lower energy to eventually let tanks commit suicide - 418 - 419 564E ShootNow - 420 564E 20 0C 83 jsr Shoot - 421 ;here we clear offensive text (after a shoot) - 422 5651 A4 6C ldy TankNr - 423 5653 A9 00 85 DB mva #$00 plot4x4color - 424 5657 20 88 72 jsr DisplayOffensiveTextNr - 425 - 426 565A A5 BF lda HitFlag ;0 if missed - 427 565C F0 1E beq missed - 428 - 429 565E 20 34 77 jsr Explosion - 430 - 431 5661 continueMainRoundLoopAfterSeppuku - 432 - 433 5661 AfterExplode - 434 5661 20 F4 6E jsr SoilDown2 ; allways - 435 5664 NoFallDown2 - 436 ;here tanks are falling down - 437 5664 A5 6C 85 7E mva tankNr tempor2 - 438 5668 A6 AE ldx NumberOfPlayers - 439 566A CA dex - 440 566B TanksFallDown - 441 566B 86 6C stx TankNr - 442 566D BD AF 43 lda eXistenZ,x - 443 5670 F0 03 beq NoExistNoFall - 444 5672 20 2E 6D jsr TankFalls - 445 5675 NoExistNoFall - 446 5675 CA dex - 447 5676 10 F3 bpl TanksFallDown - 448 5678 A6 7E 86 6C mvx tempor2 TankNr - 449 - 450 567C missed - 451 567C AC 09 44 ldy WeaponDepleted - 452 567F D0 06 bne @+ - 453 5681 A6 6C ldx TankNr - 454 5683 98 tya - 455 5684 9D F7 43 sta ActiveWeapon,x - 456 @ - 457 - 458 ;here we clear offensive text (after a shoot) - 459 5687 A4 6C ldy TankNr - 460 5689 A9 00 85 DB mva #$00 plot4x4color - 461 568D 20 88 72 jsr DisplayOffensiveTextNr - 462 - 463 5690 NextPlayerShoots - 464 ;before it shoots, the eXistenZ table must be updated - 465 ;accordingly to actual energy (was forgotten, sorry to ourselves) - 466 - 467 5690 A2 05 ldx #(MaxPlayers-1) - 468 5692 SeteXistenZ - 469 5692 BD A2 43 lda Energy,x - 470 5695 9D AF 43 sta eXistenZ,x - 471 - 472 5698 20 2A 58 jsr MaxForceCalculate - 473 - 474 569B CA dex - 475 569C 10 F4 bpl SeteXistenZ - 476 - 477 ;was setup of maximum energy for players - 478 - 479 - 480 569E PlayersAgain - 481 - 482 ; In LASTeXistenZ there are values of eXistenZ before shoot - 483 ; from the next tank. - 484 ; Now it must be checked if by a chance something that had - 485 ; LASTeXistenZ>0 is not equal to 0 right now, - 486 ; because it means this tank died during this round. - 487 ; Most important thing is: - 488 ; after each explosion of the tank these operations must be - 489 ; performed from the beginning! - 490 ; (it is made by another jump into the after explosion routines) - 491 ; It is because exploding tank can destroy their neighbours, - 492 ; additionally this tank just have had LASTeXistenZ set to 0, - 493 ; otherwise it would explode again and again. - 494 ; OK, text how to do it is ready, now comes coding . - 495 ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ - 496 - 497 569E A9 16 85 9E mva #sfx_next_player sfx_effect - 498 - 499 56A2 A6 AE ldx NumberOfPlayers - 500 56A4 CA dex - 501 56A5 CheckingPlayersDeath - 502 56A5 BD B5 43 lda LASTeXistenZ,x - 503 56A8 F0 05 beq NoPlayerNoDeath - 504 56AA BD AF 43 lda eXistenZ,x - 505 56AD F0 19 beq PlayerXdeath - 506 56AF NoPlayerNoDeath - 507 56AF CA dex - 508 56B0 10 F3 bpl CheckingPlayersDeath - 509 ; if processor is here it means there are no more explosions - 510 - 511 56B2 E6 6D A5 6D inc:lda TankSequencePointer - 512 56B6 C5 AE cmp NumberOfPlayers - 513 56B8 D0 0B bne NotLastPlayerInRound - 514 56BA A9 00 85 6D mva #0 TankSequencePointer - 515 - 516 56BE A5 5C lda WindChangeInRound - 517 56C0 F0 03 beq NoWindChangeNow - 518 56C2 20 E7 57 jsr GetRandomWind ; wind change after each turn (not round only) - 519 56C5 NoWindChangeNow - 520 56C5 NotLastPlayerInRound - 521 56C5 4C 5F 55 jmp MainRoundLoop - 522 .endp - 523 - 524 ;--------------------------------- - 525 56C8 .proc PlayerXdeath - 526 ; this tank should not explode anymore: - 527 ; there is 0 in A, and Tank Number in X, so... - 528 ;--------------------------------- - 529 - 530 56C8 9D B5 43 sta LASTeXistenZ,x - 531 ; save x somewhere - 532 56CB 8E C1 48 stx TankTempY - 533 - 534 ;clear NoDeathCounter here - 535 56CE 8D 74 43 sta noDeathCounter - 536 - 537 56D1 A9 06 85 9E mva #sfx_death_begin sfx_effect - 538 - 539 ; display defensive text here (well, defensive - 540 ; is not the real meaning, it should be pre-death, - 541 ; but I am too lazy to change names of variables) - 542 - 543 ; in X there is a number of tank that died - 544 - 545 56D5 A9 4E lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") - 546 56D7 2C D9 44 bit AfterBFGflag ; check BFG flag - 547 56DA 30 15 bmi TextAfterBFG - 548 ; if BFG then no points for dead tanks ... - 549 56DC AD C2 48 lda CurrentResult - 550 56DF 18 clc - 551 56E0 7D BB 43 adc ResultsTable,x - 552 56E3 9D BB 43 sta ResultsTable,x - 553 ;inc CurrentResult - 554 - 555 ; RandomizeDeffensiveText - 556 56E6 randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 56E6 ?rand - 7 56E6 AD 1B D4 lda random - 8 56E9 C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor - 9 56EB 90 F9 bcc ?rand - 10 56ED C9 74 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling - 11 56EF B0 F5 bcs ?rand -Source: game.asm - 557 56F1 TextAfterBFG - 558 56F1 8D C0 48 sta TextNumberOff - 559 56F4 EE C2 48 inc CurrentResult ; ... but increase result of winner (BFG) - 560 56F7 AC C1 48 ldy TankTempY - 561 56FA A9 FF 85 DB mva #$ff plot4x4color - 562 56FE 20 88 72 jsr DisplayOffensiveTextNr - 563 ; tank flash - 564 5701 AC C1 48 ldy TankTempY - 565 5704 A5 6C 85 74 mva TankNr temp2 ; not elegant, and probably unnecessary - 566 5708 84 6C sty TankNr - 567 570A 20 57 6B jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) - 568 570D A5 74 85 6C mva temp2 TankNr - 569 - 570 ;Deffensive text cleanup - 571 ;here we clear Deffensive text (after a shoot) - 572 5711 AC C1 48 ldy TankTempY - 573 5714 A9 00 85 DB mva #$00 plot4x4color - 574 5718 20 88 72 jsr DisplayOffensiveTextNr - 575 - 576 ; calculate position of the explosion (the post-death one) - 577 571B AE C1 48 ldx TankTempY - 578 571E 18 clc - 579 571F BD 0D 44 lda xtankstableL,x - 580 5722 69 04 adc #4 ; more or less in the middle of the tank - 581 5724 85 61 sta xdraw - 582 5726 BD 13 44 lda xtankstableH,x - 583 5729 69 00 adc #0 - 584 572B 85 62 sta xdraw+1 - 585 572D 38 sec - 586 572E BD 19 44 lda ytankstable,x - 587 5731 E9 04 sbc #4 - 588 5733 85 63 sta ydraw - 589 5735 A9 00 lda #0 - 590 5737 85 64 sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit - 591 - 592 ;cleanup of the soil fall down ranges (left and right) - 593 5739 85 D4 sta RangeRight - 594 573B 85 D5 sta RangeRight+1 - 595 573D A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft - 596 - 597 ; We are randomizing the weapon now. - 598 ; jumping into the middle of the explosion - 599 ; routine - 600 5745 MetodOfDeath - 601 5745 AD 1B D4 lda random - 602 5748 29 1F and #%00011111 ; range 0-31 - 603 574A C9 10 cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) - 604 574C B0 F7 bcs MetodOfDeath - 605 574E A8 tay - 606 574F B9 4A 60 lda weaponsOfDeath,y - 607 5752 20 3C 77 jsr ExplosionDirect - 608 5755 A9 15 85 9E mva #sfx_silencer sfx_effect - 609 - 610 ; Clear current Shooter settings. After that, Shooter will "search" for the target again - 611 5759 A6 AE ldx NumberOfPlayers - 612 575B CA dex - 613 575C BD 39 41 @ lda skillTable,x - 614 575F C9 02 cmp #2 ; clear variables only if Shooter - 615 5761 D0 0B bne NotShooter - 616 5763 A9 00 lda #0 - 617 5765 9D CC 48 sta PreviousAngle,x - 618 5768 9D D2 48 sta PreviousEnergyL,x - 619 576B 9D DE 48 sta PreviousEnergyH,x - 620 576E NotShooter - 621 576E CA dex - 622 576F 10 EB bpl @- - 623 - 624 ; jump to after explosion routines (soil fallout, etc.) - 625 ; After going through these routines we are back - 626 ; to checking if a tank exploded and maybe we have - 627 ; a deadly shot here again. - 628 5771 4C 61 56 jmp MainRoundLoop.AfterExplode - 629 .endp - 630 - 631 ;-------------------------------------------------- - 632 5774 .proc DecreaseEnergyX - 633 ;Decreases energy of player nr X by the value Y - 634 ;increases his financial loss - 635 ;increases gain of tank TankNr - 636 ;-------------------------------------------------- - 637 5774 8C AE 43 sty EnergyDecrease - 638 ; Lose increase - 639 5777 BD 9C 43 lda loseL,x - 640 577A 18 clc - 641 577B 6D AE 43 adc EnergyDecrease - 642 577E 9D 9C 43 sta loseL,x - 643 5781 BD 96 43 lda loseH,x - 644 5784 69 00 adc #$00 - 645 5786 9D 96 43 sta loseH,x - 646 ; Energy now, not less than 0 - 647 5789 BD A2 43 lda Energy,x - 648 578C CD AE 43 cmp EnergyDecrease - 649 578F 90 05 bcc ldahashzero - 650 ;sec - 651 5791 ED AE 43 sbc EnergyDecrease - 652 5794 10 02 bpl NotNegativeEnergy - 653 5796 ldahashzero - 654 5796 A9 00 lda #0 - 655 5798 NotNegativeEnergy - 656 5798 9D A2 43 sta Energy,x - 657 ;now increase the gain of the shooting tank - 658 579B A4 6C ldy TankNr - 659 579D 18 clc - 660 579E B9 90 43 lda gainL,y - 661 57A1 6D AE 43 adc EnergyDecrease - 662 57A4 99 90 43 sta gainL,y - 663 57A7 B9 8A 43 lda gainH,y - 664 57AA 69 00 adc #$00 - 665 57AC 99 8A 43 sta gainH,y - 666 57AF 60 rts - 667 .endp - 668 - 669 ;-------------------------------------------------- - 670 57B0 .proc DecreaseShieldEnergyX - 671 ; Decreases energy of shield player nr X by the value Y - 672 ; if shield energy is 0 after decrease then in Y we have - 673 ; rest of the energy - to decrease tank energy - 674 ;-------------------------------------------------- - 675 57B0 8C AE 43 sty EnergyDecrease - 676 57B3 A0 00 ldy #0 ; if Shield survive then no decrease tank anergy - 677 ; Energy cannot be less than 0 - 678 57B5 BD A8 43 lda ShieldEnergy,x - 679 57B8 CD AE 43 cmp EnergyDecrease - 680 57BB 90 05 bcc UseAllShieldEnergy - 681 ;sec - 682 57BD ED AE 43 sbc EnergyDecrease - 683 57C0 10 0A bpl NotNegativeShieldEnergy ; jump allways - 684 57C2 UseAllShieldEnergy - 685 ; now calculate rest of energy for future tank energy decrease - 686 57C2 38 sec - 687 57C3 AD AE 43 lda EnergyDecrease - 688 57C6 FD A8 43 sbc ShieldEnergy,x - 689 57C9 A8 tay - 690 57CA A9 00 lda #0 - 691 57CC NotNegativeShieldEnergy - 692 57CC 9D A8 43 sta ShieldEnergy,x - 693 57CF 60 rts - 694 .endp - 695 - 696 ;--------------------------------- - 697 57D0 .proc Seppuku - 698 ;--------------------------------- - 699 57D0 A9 00 lda #0 - 700 57D2 85 64 sta ydraw+1 - 701 ; get position of the tank - 702 57D4 A6 6C ldx TankNr - 703 ; lda #0 ; turn off defense weapons when hara-kiring - 704 57D6 9D FD 43 sta ActiveDefenceWeapon,x - 705 57D9 9D A8 43 sta ShieldEnergy,x - 706 57DC 20 67 74 jsr SetupXYdraw - 707 57DF A9 01 lda #1 ; Missile - 708 57E1 20 3C 77 jsr ExplosionDirect - 709 57E4 4C 61 56 jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku - 710 .endp - 711 - 712 ;-------------------------------------------------- - 713 57E7 .proc GetRandomWind - 714 ;in: MaxWind (byte) - 715 ;out: Wind (word) - 716 ;uses: _ - 717 ;-------------------------------------------------- - 718 57E7 AD 1B D4 lda random - 719 57EA CD 0A 44 cmp MaxWind - 720 57ED B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again - 721 57EF 85 CE sta Wind - 722 57F1 A9 00 85 CF mva #$00 Wind+1 - 723 57F5 85 D0 sta Wind+2 - 724 57F7 85 D1 sta Wind+3 - 725 ; multiply Wind by 16 - 726 ; two bytes of Wind are treated as a decimal part of vx variable - 727 57F9 06 CE 26 CF 06 CE + :4 aslw Wind - 728 ; decide the direction - 729 5809 AD 1B D4 lda random - 730 580C 29 01 and #$01 - 731 580E F0 19 beq @+ - 732 5810 38 sec ; Wind = -Wind - 733 .rept 4 - 734 LDA #$00 - 735 SBC WIND+# - 736 STA WIND+# - 737 .endr -Source: REPT - 734 5811 A9 00 LDA #$00 - 734 5813 E5 CE SBC WIND+# - 734 5815 85 CE STA WIND+# - 734 5817 A9 00 LDA #$00 - 734 5819 E5 CF SBC WIND+# - 734 581B 85 CF STA WIND+# - 734 581D A9 00 LDA #$00 - 734 581F E5 D0 SBC WIND+# - 734 5821 85 D0 STA WIND+# - 734 5823 A9 00 LDA #$00 - 734 5825 E5 D1 SBC WIND+# - 734 5827 85 D1 STA WIND+# -Source: game.asm - 738 5829 60 @ rts - 739 .endp - 740 ;-------------------------------------------------- - 741 582A .proc MaxForceCalculate - 742 ; calculates max force for tank (tanknr in X) - 743 ; Energy of tank X in A - 744 ;-------------------------------------------------- - 745 582A 85 E8 sta L1 - 746 - 747 ;DATA L1,L2 - 748 ;Multiplication 8bit*8bit, - 749 ;result 16bit - 750 ;this algiorithm is a little longer than one in Ruszczyc 6502 book - 751 ;but it is faster - 752 - 753 582C A0 08 ldy #8 - 754 582E A9 00 lda #0 - 755 5830 18 clc - 756 5831 6A LP0 ror - 757 5832 66 E8 ror L1 - 758 5834 90 03 bcc B0 - 759 5836 18 clc - 760 5837 69 0A adc #10 ; (L2) multiplication by 10 - 761 5839 88 B0 dey - 762 583A D0 F5 bne LP0 - 763 583C 6A ror - 764 583D 66 E8 ror L1 - 765 583F 9D EB 43 sta MaxForceTableH,x - 766 5842 A5 E8 lda L1 - 767 5844 9D E5 43 sta MaxForceTableL,x - 768 5847 60 rts - 769 .endp - 770 - 771 ;-------------------------------------------------- - 772 5848 .proc WeaponCleanup - 773 ; cleaning of the weapon possesion tables - 774 ; 99 of Baby Missles and White Flags, all other weapons=0) - 775 ;-------------------------------------------------- - 776 5848 A2 2F ldx #(number_of_weapons - 1) - 777 584A A9 00 @ lda #$0 - 778 584C E0 20 cpx #ind_White_Flag_____ ; White Flag - 779 584E D0 02 bne no99 - 780 5850 A9 63 set99 lda #99 - 781 5852 9D 1E 45 no99 sta TanksWeapon1,x - 782 5855 9D 4E 45 sta TanksWeapon2,x - 783 5858 9D 7E 45 sta TanksWeapon3,x - 784 585B 9D AE 45 sta TanksWeapon4,x - 785 585E 9D DE 45 sta TanksWeapon5,x - 786 5861 9D 0E 46 sta TanksWeapon6,x - 787 5864 CA dex - 788 5865 F0 E9 beq set99 ; Baby Missile (index=0) - 789 5867 10 E1 bpl @- - 790 5869 60 rts - 791 .endp - 792 - 793 ;-------------------------------------------------- - 794 586A .proc Initialize - 795 ;Initialization sequence - 796 ;uses: temp, ... - 797 ;-------------------------------------------------- - 798 = 0072 deletePtr = temp - 799 - 800 ; clean variables - 801 586A A9 00 lda #0 - 802 586C 85 D7 sta escFlag - 803 586E 85 5D sta JoystickNumber - 804 5870 A8 tay - 805 5871 A9 73 85 72 A9 43 + mwa #variablesStart deletePtr - 806 5879 98 @ tya - 807 587A 91 72 sta (deletePtr),y - 808 587C E6 72 D0 02 E6 73 inw deletePtr - 809 5882 A5 73 C9 4F D0 04 + cpw deletePtr #variablesEnd - 810 588C D0 EB bne @- - 811 - 812 ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) - 813 588E A0 01 ldy #1 - 814 5890 8C 2C 44 sty TankShape+1 - 815 5893 8C 2F 44 sty TankShape+4 - 816 5896 C8 iny - 817 5897 8C 2D 44 sty TankShape+2 - 818 589A 8C 30 44 sty TankShape+5 - 819 - 820 - 821 589D A9 00 8D E6 48 A9 + mwa #1024 RandBoundaryHigh - 822 58A7 A9 FF 8D 0C 45 mva #$ff LastWeapon - 823 58AC 85 C5 sta HowMuchToFall - 824 58AE A9 01 85 A9 mva #1 color - 825 - 826 58B2 20 FB 58 jsr SetStandardBarrels - 827 58B5 20 48 58 jsr WeaponCleanup - 828 - 829 58B8 A9 4F 85 02 mva #>WeaponFont chbas - 830 - 831 ;parameter for old plot (unPlot) max 5 points - 832 58BC A2 04 ldx #4 - 833 58BE SetunPlots - 834 58BE A9 10 lda #display - 837 58C5 9D 97 44 sta oldplotH,x - 838 58C8 A9 00 lda #0 - 839 58CA 9D A6 44 sta oldply,x - 840 58CD A9 FF lda #$ff - 841 58CF 9D A1 44 sta oldora,x - 842 58D2 CA dex - 843 58D3 10 E9 bpl SetunPlots - 844 - 845 ;setting up P/M graphics - 846 58D5 A9 18 lda #>pmgraph - 847 58D7 85 02 sta pmbase - 848 58D9 A9 03 lda #$03 ; P/M on - 849 58DB 85 02 sta GRACTL - 850 58DD 20 62 75 jsr SetPMWidth - 851 58E0 A9 21 lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 - 852 58E2 85 02 sta GPRIOR - 853 58E4 20 46 75 jsr PMoutofScreen - 854 - 855 ;let the tanks be visible! - 856 58E7 A2 05 ldx #(maxPlayers-1) - 857 58E9 A9 63 lda #99 ; tank is visible - 858 58EB MakeTanksVisible - 859 58EB 9D AF 43 sta eXistenZ,x - 860 58EE CA dex - 861 58EF 10 FA bpl MakeTanksVisible - 862 - 863 58F1 A9 01 8D 14 45 mva #1 CurrentRoundNr ;we start from round 1 - 864 58F6 A9 06 85 9C mva #6 NTSCcounter - 865 - 866 58FA 60 rts - 867 .endp - 868 ;-------------------------------------------------- - 869 58FB .proc SetStandardBarrels - 870 ; set standart barrel length and deactivate Auto Defense - 871 ; for all tanks - 872 ;-------------------------------------------------- - 873 58FB A2 05 ldx #maxPlayers-1 - 874 58FD A9 06 @ lda #StandardBarrel ; standard barrel length - 875 58FF 9D F1 43 sta BarrelLength,x - 876 5902 A9 00 lda #$00 ; deactivate Auto Defense - 877 5904 9D 03 44 sta AutoDefenseFlag,x - 878 5907 CA dex - 879 5908 10 F3 bpl @- - 880 590A 60 rts - 881 .endp - 882 ;---------------------------------------------- - 883 /* .proc RandomizeSequence0 - 884 ldx #0 - 885 @ txa - 886 sta TankSequence,x - 887 inx - 888 cpx #MaxPlayers - 889 bne @- - 890 rts - 891 .endp */ - 891 - 892 ;-------------------------------------------------- - 893 590B .proc RandomizeSequence - 894 ; in: NumberOfPlayers - 895 ; out: TankSequence - 896 ; how: get random number lower than NumberOfPlayers - 897 ; put it in the first slot. - 898 ; get another random number lower than NumberOfPlayers - 899 ; check if was previously saved in first slot - 900 ; if not then save it in second slot - 901 ; repeat untill NumberOfPlayers - 902 - 903 590B A2 00 ldx #0 - 904 590D GetRandomAgain0 - 905 590D AD 1B D4 lda RANDOM - 906 5910 29 07 and #$07 ;NumberOfPlayers < 7 - 907 5912 C5 AE cmp NumberOfPlayers - 908 5914 B0 F7 bcs GetRandomAgain0 - 909 5916 9D 77 43 sta TankSequence,x - 910 ;now first slot is ready, nexts slots are handled - 911 ;in a more complicated way - 912 - 913 5919 GetRandomAgainX - 914 5919 AD 1B D4 lda RANDOM - 915 591C 29 07 and #$07 ;NumberOfPlayers < 7 - 916 591E C5 AE cmp NumberOfPlayers - 917 5920 B0 F7 bcs GetRandomAgainX - 918 - 919 ;now we have to check if the value was not used - 920 ;in previous slots - 921 - 922 5922 86 72 stx temp - 923 5924 A4 72 ldy temp - 924 5926 UsageLoop - 925 5926 D9 77 43 cmp TankSequence,y - 926 5929 F0 EE beq GetRandomAgainX ;apparently we have already used this value - 927 592B 88 dey - 928 592C 10 F8 bpl UsageLoop - 929 - 930 ;well, looks like this value is new! - 931 592E E8 inx - 932 592F 9D 77 43 sta TankSequence,x - 933 - 934 5932 86 72 stx temp - 935 5934 E6 72 A5 72 inc:lda temp ;x+1 - 936 - 937 5938 C5 AE cmp NumberOfPlayers - 938 593A D0 DD bne GetRandomAgainX - 939 593C 60 rts - 940 .endp - 941 ;---------------------------------------------- - 942 593D .proc RandomizeAngle - 943 ; routine returns in A - 944 ; a valid angle for the tank's barrel. - 945 ; X is not changed - 946 ;---------------------------------------------- - 947 - 948 ; lets randomize someting between 0 and 180 - 949 593D AD 1B D4 lda RANDOM - 950 5940 C9 B4 cmp #180 - 951 5942 B0 F9 bcs RandomizeAngle - 952 5944 60 rts - 953 .endp - 954 ;---------------------------------------------- - 955 5945 .proc RandomizeForce - 956 ; routine returns in ForceTable/L/H - 957 ; valid force of shooting for TankNr - 958 ; in X must be TankNr - 959 ; low and high randomize boundary passed as word value - 960 ; RandBoundaryLow - 961 ; RandBoundaryHigh - 962 ;---------------------------------------------- - 963 - 964 5945 AD 1B D4 lda RANDOM - 965 5948 85 74 sta temp2 - 966 594A AD 1B D4 lda RANDOM - 967 594D 29 03 and #%00000011 ;(0..1023) - 968 594F 85 75 sta temp2+1 - 969 - 970 5951 AD E5 48 C5 75 D0 + cpw RandBoundaryLow temp2 - 971 595D F0 02 B0 E4 seq:bcs RandomizeForce - 972 - 973 5961 AD E7 48 C5 75 D0 + cpw RandBoundaryHigh temp2 - 974 596D 90 D6 bcc RandomizeForce - 975 - 976 596F A5 74 lda temp2 - 977 5971 9D D9 43 sta ForceTableL,x - 978 5974 A5 75 lda temp2+1 - 979 5976 9D DF 43 sta ForceTableH,x - 980 - 981 ;--------- - 982 5979 LimitForce - 983 ; in X must be TankNr - 984 ; cuts force to MaxForceTable - 985 5979 BD EB 43 lda MaxForceTableH,x - 986 597C DD DF 43 cmp ForceTableH,x - 987 597F D0 06 bne @+ - 988 5981 BD E5 43 lda MaxForceTableL,x - 989 5984 DD D9 43 cmp ForceTableL,x - 990 5987 B0 0C @ bcs @+ - 991 - 992 5989 BD E5 43 lda MaxForceTableL,x - 993 598C 9D D9 43 sta ForceTableL,x - 994 598F BD EB 43 lda MaxForceTableH,x - 995 5992 9D DF 43 sta ForceTableH,x - 996 @ - 997 5995 60 rts - 998 - 999 .endp - 1000 ;---------------------------------------------- - 1001 5996 .proc Table2Force - 1002 ;---------------------------------------------- - 1003 5996 BD D9 43 lda ForceTableL,x - 1004 5999 85 A4 sta Force - 1005 599B BD DF 43 lda ForceTableH,x - 1006 599E 85 A5 sta Force+1 - 1007 59A0 60 rts - 1008 .endp - 1009 ;---------------------------------------------- - 1010 59A1 .proc MoveBarrelToNewPosition - 1011 ;---------------------------------------------- - 1012 59A1 A9 01 85 AA mva #1 Erase - 1013 59A5 20 48 6B jsr DrawTankNr.BarrelChange - 1014 59A8 A9 00 85 AA mva #0 Erase - 1015 59AC MoveBarrel - 1016 59AC A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1017 59B0 20 2C 6A jsr DrawTankNr - 1018 59B3 20 0F 66 jsr DisplayStatus.displayAngle - 1019 ; ldx TankNr - 1020 59B6 A9 01 85 AA mva #1 Erase - 1021 59BA 20 89 5A jsr WaitOneFrame - 1022 59BD 20 48 6B jsr DrawTankNr.BarrelChange - 1023 59C0 A9 00 85 AA mva #0 Erase - 1024 59C4 A5 D6 lda NewAngle - 1025 59C6 DD C3 48 cmp AngleTable,x - 1026 59C9 F0 0E beq BarrelPositionIsFine - 1027 59CB 90 06 bcc rotateLeft - 1028 59CD rotateRight ; older is lower - 1029 59CD FE C3 48 inc angleTable,x - 1030 59D0 4C AC 59 jmp MoveBarrel - 1031 59D3 rotateLeft ; older is bigger - 1032 59D3 DE C3 48 dec angleTable,x - 1033 59D6 4C AC 59 jmp MoveBarrel - 1034 59D9 BarrelPositionIsFine - 1035 59D9 20 2C 6A jsr DrawTankNr - 1036 59DC 60 rts - 1037 - 1038 .endp - 1039 - 1040 ;---------------------------------------------- - 1041 59DD .proc SortSequence ; - 1042 ;---------------------------------------------- - 1043 ; here we try to get a sequence of tanks for two - 1044 ; purposes: - 1045 ; 1. to make up shooting sequence for the next round (from down to top) - 1046 ; 2. to display game results more nicely (from top to down) - 1047 ; - 1048 ; I think I will go for a stupid bubble sort... - 1049 ; it is easy to test :) - 1050 ; - 1051 ; Results are in ResultsTable, in TankSequence (Sorted Table) we want to - 1052 ; have numbers of tanks from the worst to the best. - 1053 ; in other words, if ResultsTable=(5,4,65,23,3,6) - 1054 ; the TankSequence=(4,1,0,5,3,2) - 1055 ; let's assume initially the TankSequence=(0,1,2,3,4,5) - 1056 - 1057 59DD A2 00 ldx #0 - 1058 59DF SequenceStart - 1059 59DF 8A txa - 1060 59E0 9D 77 43 sta TankSequence,x - 1061 59E3 E8 inx - 1062 59E4 E0 06 cpx #MaxPlayers - 1063 59E6 D0 F7 bne SequenceStart - 1064 - 1065 ; we will need a TempResults (TR) table to fiddle with - 1066 59E8 A2 00 ldx #0 - 1067 59EA movetotemp - 1068 59EA BD BB 43 lda ResultsTable,x - 1069 59ED 9D C1 43 sta TempResults,x - 1070 59F0 E8 inx - 1071 59F1 E4 AE cpx NumberOfPlayers - 1072 59F3 D0 F5 bne movetotemp - 1073 - 1074 ; i=0:sortflag=0 - 1075 ;loop: - 1076 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers - 1077 ; or goto loop: - 1078 ; else - 1079 ; temp=TR(i): tempo=TankSequence(i) - 1080 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) - 1081 ; TR(i+1)=temp: TankSequence(i+1)=tempo - 1082 ; i=i+1 - 1083 ; sortflag=sortflag+1 - 1084 ; go loop: - 1085 ; if sortflag=0 then finished, else repeat... - 1086 ; - 1087 ; or something like this :) - 1088 59F5 A6 AE ldx NumberOfPlayers - 1089 59F7 CA dex - 1090 59F8 86 73 stx temp+1 ; for checking end of the loop only - 1091 - 1092 59FA Bubble - 1093 59FA A2 00 ldx #0 ;i=x - 1094 59FC 86 74 stx temp2 ; sortflag=temp2 - 1095 - 1096 59FE BubbleBobble - 1097 59FE BD C1 43 lda TempResults,x - 1098 5A01 DD C2 43 cmp TempResults+1,x - 1099 5A04 90 31 bcc nextishigher - 1100 5A06 D0 10 bne swapvalues - 1101 5A08 nextisequal - 1102 ; if results are equal, check Direct Hits - 1103 5A08 BC 77 43 ldy TankSequence,x - 1104 5A0B B9 C7 43 lda DirectHits,y - 1105 5A0E BC 78 43 ldy TankSequence+1,x - 1106 5A11 D9 C7 43 cmp DirectHits,y - 1107 ; - 1108 5A14 F0 21 beq nextishigher ; this is to block hangs when 2 equal values meet - 1109 5A16 90 1F bcc nextishigher - 1110 ;here we must swap values - 1111 ;because next is smaller than previous - 1112 5A18 swapvalues - 1113 5A18 85 72 sta temp - 1114 5A1A BD C2 43 lda TempResults+1,x - 1115 5A1D 9D C1 43 sta TempResults,x - 1116 5A20 A5 72 lda temp - 1117 5A22 9D C2 43 sta TempResults+1,x - 1118 ; - 1119 5A25 BD 77 43 lda TankSequence,x - 1120 5A28 85 72 sta temp - 1121 5A2A BD 78 43 lda TankSequence+1,x - 1122 5A2D 9D 77 43 sta TankSequence,x - 1123 5A30 A5 72 lda temp - 1124 5A32 9D 78 43 sta TankSequence+1,x - 1125 5A35 E6 74 inc temp2 - 1126 5A37 nextishigher - 1127 5A37 E8 inx - 1128 5A38 E4 73 cpx temp+1 ;cpx ^NumberOfPlayers-1 - 1129 5A3A D0 C2 bne BubbleBobble - 1130 - 1131 5A3C A5 74 lda temp2 - 1132 - 1133 5A3E D0 BA bne Bubble - 1134 - 1135 5A40 60 rts - 1136 .endp - 1137 ;-------------------------------------------------- - 1138 5A41 .proc SetWallsType - 1139 ;-------------------------------------------------- - 1140 5A41 A9 00 8D 0C 44 mva #0 WallsType - 1141 5A46 AD 47 41 lda OptionsTable+8 - 1142 5A49 C9 04 cmp #4 - 1143 5A4B F0 09 beq SetRandomWalls - 1144 5A4D 4A lsr - 1145 5A4E 6E 0C 44 ror WallsType - 1146 5A51 4A lsr - 1147 5A52 6E 0C 44 ror WallsType - 1148 5A55 60 rts - 1149 5A56 SetRandomWalls - 1150 5A56 AD 1B D4 lda random - 1151 5A59 29 C0 and #%11000000 - 1152 5A5B 8D 0C 44 sta WallsType - 1153 5A5E 60 rts - 1154 .endp - 1155 - 1156 .ENDIF - 236 ;-------------------------------------------------- - 237 - 238 - 239 ;-------------------------------------------------- - 240 5A5F .proc GetKey - 241 ; waits for pressing a key and returns pressed value in A - 242 ; when [ESC] is pressed, escFlag is set - 243 ; result: A=keycode - 244 ;-------------------------------------------------- - 245 5A5F 20 71 5A jsr WaitForKeyRelease - 246 5A62 A9 00 lda #0 - 247 5A64 85 D7 sta escFlag - 248 5A66 A9 FF lda #$ff - 249 5A68 60 rts - 250 .endp - 251 - 252 ;-------------------------------------------------- - 253 5A69 .proc getkeynowait - 254 ;-------------------------------------------------- - 255 5A69 20 71 5A jsr WaitForKeyRelease - 256 5A6C A5 02 lda kbcode - 257 5A6E 29 3F and #$3f ;CTRL and SHIFT ellimination - 258 5A70 60 rts - 259 .endp - 260 - 261 ;-------------------------------------------------- - 262 5A71 .proc WaitForKeyRelease - 263 ;-------------------------------------------------- - 264 5A71 StillWait - 265 5A71 60 rts - 266 .endp - 267 ;-------------------------------------------------- - 268 5A72 .proc IsKeyPressed - 269 ; result: A=0 - yes , A>0 - no - 270 ;-------------------------------------------------- - 271 5A72 A9 01 lda #1 - 272 5A74 60 rts - 273 .endp - 274 ;-------------------------------------------------- - 275 5A75 .proc DemoModeOrKey - 276 ; Waits for the key pressed if at least one human is playing. - 277 ; Otherwise, waits 3 seconds (demo mode). - 278 ;-------------------------------------------------- - 279 ;check demo mode - 280 5A75 A6 AE ldx numberOfPlayers - 281 5A77 CA dex - 282 5A78 checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE - 283 5A78 BD 39 41 lda skillTable,x - 284 5A7B F0 09 beq peopleAreHere - 285 5A7D CA dex - 286 5A7E 10 F8 bpl checkForHuman - 287 ; no people, just wait a bit - 288 ;pause 150 - 289 5A80 A0 4B ldy #75 - 290 5A82 20 9D 5A jsr PauseYFrames - 291 5A85 60 rts - 292 5A86 peopleAreHere - 293 5A86 4C 5F 5A jmp getkey ; jsr:rts - 294 .endp - 295 - 296 ;-------------------------------------------------- - 297 5A89 MakeDarkScreen - 298 ;-------------------------------------------------- - 299 ; mva #0 dmactls ; dark screen - 300 ; and wait one frame :) - 301 ;-------------------------------------------------- - 302 5A89 .proc WaitOneFrame - 303 ;-------------------------------------------------- - 304 5A89 wait ; or waitRTC ? -Macro: WAIT [Source: MACRO.ASM] - 3 5A89 AD 12 D0 ?ze LDA $D012 - 4 5A8C C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) - 5 5A8E 90 F9 bcc ?ze - 6 5A90 E9 0A sbc #10 ; last lines correction - 7 5A92 CD 12 D0 ?wa cmp $D012 - 8 5A95 90 FB bcc ?wa - 9 5A97 CD 12 D0 ?wf cmp $D012 - 10 5A9A B0 FB bcs ?wf -Source: scorchC64.asm - 305 5A9C 60 rts - 306 .endp - 307 - 308 ;-------------------------------------------------- - 309 5A9D .proc PauseYFrames - 310 ; Y - number of frames to wait (divided by 2) - 311 ; pauses for maximally 510 frames (255 * 2) - 312 ;-------------------------------------------------- - 313 5A9D 20 89 5A @ jsr WaitOneFrame - 314 5AA0 20 89 5A jsr WaitOneFrame - 315 5AA3 88 dey - 316 5AA4 D0 F7 bne @- - 317 5AA6 60 rts - 318 .endp - 319 - 320 ;-------------------------------------------------- - 321 5AA7 .proc ShellDelay - 322 5AA7 AE 76 43 ldx flyDelay - 323 5AAA DelayLoop - 324 5AAA AD 12 D0 lda $d012 - 325 5AAD CD 12 D0 @ cmp $d012 - 326 5AB0 F0 FB beq @- - 327 5AB2 CA dex - 328 5AB3 D0 F5 bne DelayLoop - 329 5AB5 noShellDelay - 330 5AB5 60 rts - 331 .endp - 332 ;-------------------------------------------------- - 333 5AB6 .proc RmtSongSelect - 334 ; starting song line 0-255 to A reg - 335 ;-------------------------------------------------- - 336 5AB6 60 rts - 337 .endp - 338 5AB7 .proc CopyFromRom - 339 5AB7 60 rts - 340 .endp - 341 ;-------------------------------------------------- - 342 5AB8 icl 'C64/interrupts.asm' -Source: interrupts.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 = 0000 DLIinterruptGraph = 0 - 6 ;-------------------------------------------------- - 7 .macro SetDLI - 8 ; SetDLI #WORD - 9 ; Initialises Display List Interrupts - 10 LDY # <:1 - 11 LDX # >:1 - 12 jsr _SetDLIproc - 13 .endm - 14 5AB8 .proc _SetDLIproc - 15 ; LDA #$C0 - 16 ; STY VDSLST - 17 ; STX VDSLST+1 - 18 ; STA NMIEN - 19 5AB8 60 rts - 20 .endp - 21 - 22 .ENDIF - 343 ;---------------------------------------------- - 344 5AB9 icl 'constants.asm' -Source: constants.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 ; initial values for some variables - 6 5AB9 initialvaluesStart - 7 5AB9 00 01 02 02 00 01 + I_OptionsTable .by 0,1,2,2,0,1,3,2,0 - 8 5AC2 0A I_RoundsInTheGame .by 10 ;how many rounds in the current game - 9 5AC3 4B I_seppukuVal .by 75 - 10 5AC4 03 I_mountainDeltaH .by 3 - 11 5AC5 FF I_mountainDeltaL .by $ff - 12 ;---------------------------------------------------- - 13 5AC6 I_LineHeader1 - 14 5AC6 03 00 32 2F 35 2E + dta d"# ROUND: " - 15 5ACF I_RoundNrDisplay - 16 5ACF 00 00 00 00 03 FF dta d" #", $ff - 17 = 001C initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes ! - 18 ;=================================================================================== - 19 ;==========================CONSTANT TABLES, do not erase!=========================== - 20 ;=================================================================================== - 21 - 22 5AD5 00 01 03 05 07 mountainsDeltaTableH .by 0,1,3,5,7 - 23 5ADA 1F 7F FF 7F FF mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff - 24 ;------------------------------------------------ - 25 5ADF LevelNameBeginL ; begins of level names - 26 5ADF 00 0A 14 .by NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) - 31 5AEB 00 00 00 .by >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) - 32 5AEE 00 00 00 .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) - 33 ;-------------- - 34 5AF1 TanksWeaponsTableL - 35 5AF1 1E 4E 7E AE DE 0E .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 - 38 ;-------------- - 39 5AFD XtankOffsetGO_L - 40 5AFD 06 38 6A 9C CE 00 .by 6,56,106,156,206,0 - 41 5B03 XtankOffsetGO_H - 42 5B03 00 00 00 00 00 01 .by 0,0,0,0,0,1 - 43 ;-----4x4 texts----- - 44 5B09 LineTop - 45 5B09 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%%)" - 46 ;# - vertical, () * +, % - horizontal - 47 5B17 LineBottom - 48 5B17 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%%+" - 49 5B25 LineEmpty - 50 5B25 03 00 00 00 00 00 + dta d"# #" - 51 5B33 LineHeader2 - 52 5B33 03 00 00 32 25 33 + dta d"# RESULTS #" - 53 5B41 LineGameOver - 54 5B41 03 00 27 21 2D 25 + dta d"# GAME OVER #" - 55 5B4F seppukuText - 56 5B4F 03 00 00 33 25 30 + dta d"# SEPPUKU! #" - 57 5B5D areYouSureText - 58 5B5D 03 00 33 35 32 25 + dta d"# SURE? Y/N #" - 59 5B6B lineClear - 60 5B6B 00 00 00 00 00 00 + dta d" " - 61 - 62 5B79 58 2A 96 CA 7A ED TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed - 63 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order - 64 5B7F 74 C4 24 E4 54 94 TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order - 65 ;----------- - 66 5B85 GradientAddrL - 67 5B85 BC BC 8B .by dliColorsFore, >dliColorsFore, >dliColorsFore2 - 70 5B8B dliColorsFore2 ; colors for NTSC - 71 5B8B 0A .by $0a ; one mountains color - 72 5B8C 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - 73 5B96 3A 1A 1A EA EA D8 + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 - 74 5BA0 dliColorsFore2PAL ; colors for PAL - 75 5BA0 0A .by $0a ; one mountains color - 76 5BA1 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - 77 5BAB 3A 1A 1A EA EA C8 + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 - 78 - 79 ;----------- - 80 5BB5 pmtableL ; addressess of the P/M memory for 6 tanks - 81 5BB5 00 .by <(pmgraph+$400) - 82 5BB6 00 .by <(pmgraph+$500) - 83 5BB7 00 .by <(pmgraph+$600) - 84 5BB8 00 .by <(pmgraph+$700) - 85 5BB9 00 .by <(pmgraph+$300) ; this is a missile background - 86 5BBA 00 .by <(pmgraph+$300) ; this is a missile background - 87 5BBB pmtableH - 88 5BBB 1C .by >(pmgraph+$400) - 89 5BBC 1D .by >(pmgraph+$500) - 90 5BBD 1E .by >(pmgraph+$600) - 91 5BBE 1F .by >(pmgraph+$700) - 92 5BBF 1B .by >(pmgraph+$300) - 93 5BC0 1B .by >(pmgraph+$300) - 94 ;----------- - 95 5BC1 sintable - 96 5BC1 01 .by 1 - 97 5BC2 04 .by 4 - 98 5BC3 08 .by 8 - 99 5BC4 0D .by 13 - 100 5BC5 11 .by 17 - 101 5BC6 16 .by 22 - 102 5BC7 1A .by 26 - 103 5BC8 1F .by 31 - 104 5BC9 23 .by 35 - 105 5BCA 28 .by 40 - 106 5BCB 2C .by 44 - 107 5BCC 30 .by 48 - 108 5BCD 35 .by 53 - 109 5BCE 39 .by 57 - 110 5BCF 3D .by 61 - 111 5BD0 42 .by 66 - 112 5BD1 46 .by 70 - 113 5BD2 4A .by 74 - 114 5BD3 4F .by 79 - 115 5BD4 53 .by 83 - 116 5BD5 57 .by 87 - 117 5BD6 5B .by 91 - 118 5BD7 5F .by 95 - 119 5BD8 64 .by 100 - 120 5BD9 68 .by 104 - 121 5BDA 6C .by 108 - 122 5BDB 70 .by 112 - 123 5BDC 74 .by 116 - 124 5BDD 78 .by 120 - 125 5BDE 7C .by 124 - 126 5BDF 80 .by 128 - 127 5BE0 83 .by 131 - 128 5BE1 87 .by 135 - 129 5BE2 8B .by 139 - 130 5BE3 8F .by 143 - 131 5BE4 92 .by 146 - 132 5BE5 96 .by 150 - 133 5BE6 9A .by 154 - 134 5BE7 9D .by 157 - 135 5BE8 A1 .by 161 - 136 5BE9 A4 .by 164 - 137 5BEA A7 .by 167 - 138 5BEB AB .by 171 - 139 5BEC AE .by 174 - 140 5BED B1 .by 177 - 141 5BEE B5 .by 181 - 142 5BEF B8 .by 184 - 143 5BF0 BB .by 187 - 144 5BF1 BE .by 190 - 145 5BF2 C1 .by 193 - 146 5BF3 C4 .by 196 - 147 5BF4 C6 .by 198 - 148 5BF5 C9 .by 201 - 149 5BF6 CC .by 204 - 150 5BF7 CF .by 207 - 151 5BF8 D1 .by 209 - 152 5BF9 D4 .by 212 - 153 5BFA D6 .by 214 - 154 5BFB D9 .by 217 - 155 5BFC DB .by 219 - 156 5BFD DD .by 221 - 157 5BFE DF .by 223 - 158 5BFF E2 .by 226 - 159 5C00 E4 .by 228 - 160 5C01 E6 .by 230 - 161 5C02 E8 .by 232 - 162 5C03 E9 .by 233 - 163 5C04 EB .by 235 - 164 5C05 ED .by 237 - 165 5C06 EE .by 238 - 166 5C07 F0 .by 240 - 167 5C08 F2 .by 242 - 168 5C09 F3 .by 243 - 169 5C0A F4 .by 244 - 170 5C0B F6 .by 246 - 171 5C0C F7 .by 247 - 172 5C0D F8 .by 248 - 173 5C0E F9 .by 249 - 174 5C0F FA .by 250 - 175 5C10 FB .by 251 - 176 5C11 FC .by 252 - 177 5C12 FC .by 252 - 178 5C13 FD .by 253 - 179 5C14 FE .by 254 - 180 5C15 FE .by 254 - 181 5C16 FF .by 255 - 182 5C17 FF .by 255 - 183 5C18 FF .by 255 - 184 5C19 FF .by 255 - 185 5C1A FF .by 255 - 186 5C1B FF .by 255 ;anti self destruction byte - 187 - 188 ;linetableL - 189 ; :screenheight+1 .by <(display+screenBytes*#) - 190 ;linetableH - 191 ; :screenheight+1 .by >(display+screenBytes*#) - 192 ;---------------------------- - 193 5C1C bittable - 194 5C1C 80 40 20 10 08 04 + .by $80,$40,$20,$10,$08,$04,$02,$01 - 195 5C24 bittable2 - 196 5C24 7F BF DF EF F7 FB + .by $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe - 197 ;---------------------------- - 198 5C2C disktance ;tanks distance - 199 5C2C 00 00 .by 0,0 - 200 5C2E 6A .by screenwidth/3 - 201 5C2F 50 .by screenwidth/4 - 202 5C30 40 .by screenwidth/5 - 203 5C31 35 .by screenwidth/6 - 204 5C32 2D .by screenwidth/7 - 205 ;max number of players=6 - 206 - 207 ; this table is for deciding where a tank should slide - 208 ; accordingly to what is below the tank - 209 ; values in table mean that tank is moving to the left - 210 5C33 SlideLeftTable - 211 5C33 01 .BY %00000001 - 212 5C34 02 .BY %00000010 - 213 5C35 03 .BY %00000011 - 214 5C36 04 .BY %00000100 - 215 5C37 05 .BY %00000101 - 216 5C38 06 .BY %00000110 - 217 5C39 07 .BY %00000111 - 218 ; .BY %00001100 - 219 = 0007 SlideLeftTableLen = *-SlideLeftTable - 220 ;------------------------------------------------- - 221 5C3A TanksNamesDefault - 222 5C3A 11 73 74 0E 34 61 + dta d"1st.Tank" - 223 5C42 12 6E 64 0E 34 61 + dta d"2nd.Tank" - 224 5C4A 13 72 64 0E 34 61 + dta d"3rd.Tank" - 225 5C52 14 74 68 0E 34 61 + dta d"4th.Tank" - 226 5C5A 15 74 68 0E 34 61 + dta d"5th.Tank" - 227 5C62 16 74 68 0E 34 61 + dta d"6th.Tank" - 228 ;------------------------------------------------- - 229 5C6A 20 TankShapesTable .BYTE char_tank1___________ - 230 5C6B 24 .BYTE char_tank2___________ - 231 5C6C 2C .BYTE char_tank3___________ - 232 5C6D 28 .BYTE char_tank4___________ - 233 ;------------------------------------------------- - 234 5C6E WeaponPriceH ; weapons prices (tables with prices of weapons) - 235 5C6E 00 .by >price_Baby_Missile___ - 236 5C6F 00 .by >price_Missile________ - 237 5C70 00 .by >price_Baby_Nuke______ - 238 5C71 00 .by >price_Nuke___________ - 239 5C72 00 .by >price_LeapFrog_______ - 240 5C73 01 .by >price_Funky_Bomb_____ - 241 5C74 01 .by >price_MIRV___________ - 242 5C75 01 .by >price_Death_s_Head___ - 243 5C76 00 .by >price_Napalm_________ - 244 5C77 00 .by >price_Hot_Napalm_____ - 245 5C78 00 .by >price_Tracer_________ - 246 5C79 01 .by >price_Smoke_Tracer___ - 247 5C7A 00 .by >price_Baby_Roller____ - 248 5C7B 00 .by >price_Roller_________ - 249 5C7C 01 .by >price_Heavy_Roller___ - 250 5C7D 00 .by >price_Riot_Charge____ - 251 5C7E 00 .by >price_Riot_Blast_____ - 252 5C7F 01 .by >price_Riot_Bomb______ - 253 5C80 01 .by >price_Heavy_Riot_Bomb - 254 5C81 00 .by >price_Baby_Digger____ - 255 5C82 00 .by >price_Digger_________ - 256 5C83 00 .by >price_Heavy_Digger___ - 257 5C84 00 .by >price_Baby_Sandhog___ - 258 5C85 00 .by >price_Sandhog________ - 259 5C86 00 .by >price_Heavy_Sandhog__ - 260 5C87 00 .by >price_Dirt_Clod______ - 261 5C88 00 .by >price_Dirt_Ball______ - 262 5C89 00 .by >price_Ton_of_Dirt____ - 263 5C8A 01 .by >price_Liquid_Dirt____ - 264 5C8B 01 .by >price_Dirt_Charge____ - 265 5C8C 00 .by >price_Buy_me_________ - 266 5C8D 01 .by >price_Laser__________ - 267 5C8E 00 .by >price_White_Flag_____ - 268 5C8F 01 .by >price_Battery________ - 269 5C90 01 .by >price_Hovercraft_____ - 270 5C91 00 .by >price_Parachute______ - 271 5C92 03 .by >price_StrongParachute - 272 5C93 02 .by >price_Mag_Deflector__ - 273 5C94 00 .by >price_Shield_________ - 274 5C95 02 .by >price_Heavy_Shield___ - 275 5C96 04 .by >price_Force_Shield___ - 276 5C97 02 .by >price_Bouncy_Castle__ - 277 5C98 08 .by >price_Long_Barrel____ - 278 5C99 03 .by >price_Nuclear_Winter_ - 279 5C9A 01 .by >price_Lazy_Boy_______ - 280 5C9B 02 .by >price_Lazy_Darwin____ - 281 5C9C 00 .by >price_Auto_Defense___ - 282 5C9D 00 .by >price_Spy_Hard_______ - 283 5C9E WeaponPriceL - 284 5C9E 00 .by 0 - 5 - 6 = 0000 WeaponsListDL = 0 - 7 = 0000 NamesOfLevels = 0 - 8 ;---------------------------------------- - 9 ; this module contains routines used in text mode - 10 ; like shop and start-up options - 11 ;---------------------------------------- - 12 - 13 ;-------------------------------------------------- - 14 62E5 .proc Options - 15 ;-------------------------------------------------- - 16 ; start-up screen - options, etc. - 17 ; this function returns: - 18 ; - number of players (NumberOfPlayers) - 19 ; - money each player has on the beginning of the game (moneyL i moneyH) - 20 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight - 21 - 22 - 23 62E5 A2 08 ldx #$08 - 24 62E7 BD F1 62 @ lda Autoplay_OptionsTable,x - 25 62EA 9D 3F 41 sta OptionsTable,x - 26 62ED CA dex - 27 62EE 10 F7 bpl @- - 28 - 29 62F0 60 rts - 30 - 31 62F1 04 04 02 02 04 01 + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 - 32 - 33 .endp - 34 - 35 62FA .proc SelectNextGradient - 36 62FA AD 75 43 lda OptionsY ; if "Wind" option selected - 37 62FD C9 03 cmp #$03 - 38 62FF D0 07 bne NotWind - 39 6301 A5 5C lda WindChangeInRound ; wind change after each turn (not round only) flag - 40 6303 49 1F eor #$1f ; '?' character - 41 6305 85 5C sta WindChangeInRound - 42 6307 60 rts - 43 6308 NotWind - 44 6308 A4 59 ldy GradientNr - 45 630A C8 iny - 46 630B C0 03 cpy #$03 - 47 630D D0 02 bne NoGradientLoop - 48 630F A0 00 ldy #$00 - 49 6311 NoGradientLoop - 50 6311 84 59 sty GradientNr - 51 6313 B9 85 5B lda GradientAddrL,y - 52 6316 85 5A sta GradientColors - 53 6318 B9 88 5B lda GradientAddrH,y - 54 631B 85 5B sta GradientColors+1 - 55 631D 60 rts - 56 .endp - 57 - 58 ; -------------------------------------- - 59 ; Sets the appropriate variables based on the options table - 60 ; - 61 631E .proc SetVariablesFromOptions - 62 ;first option - 63 631E AC 3F 41 ldy OptionsTable - 64 6321 C8 iny - 65 6322 C8 iny - 66 6323 84 AE sty NumberOfPlayers ;1=1 player (but minimum is 2) - 67 - 68 ;second option (cash) - 69 - 70 - 71 6325 AC 40 41 ldy OptionsTable+1 - 72 6328 A2 00 ldx #0 - 73 @ - 74 632A B9 D1 A2 lda CashOptionL,y - 75 632D 9D 84 43 sta moneyL,x - 76 6330 B9 D6 A2 lda CashOptionH,y - 77 6333 9D 7E 43 sta moneyH,x - 78 6336 E8 inx - 79 6337 E4 AE cpx NumberOfPlayers - 80 6339 D0 EF bne @- - 81 - 82 ;third option (gravity) - 83 633B AC 41 41 ldy OptionsTable+2 - 84 633E B9 DB A2 lda GravityTable,y - 85 6341 85 E0 sta gravity - 86 - 87 ;fourth option (wind) - 88 6343 AC 42 41 ldy OptionsTable+3 - 89 6346 B9 E0 A2 lda MaxWindTable,y - 90 6349 8D 0A 44 sta MaxWind - 91 - 92 ;fifth option (no of rounds) - 93 634C AC 43 41 ldy OptionsTable+4 - 94 634F B9 E5 A2 lda RoundsTable,y - 95 6352 8D 48 41 sta RoundsInTheGame - 96 - 97 ;6th option (shell speed) - 98 6355 AC 44 41 ldy OptionsTable+5 - 99 6358 B9 F4 A2 lda flyDelayTable,y - 100 635B 8D 76 43 sta flyDelay - 101 - 102 ;7th option (Airstrike after how many missess) - 103 635E AC 45 41 ldy OptionsTable+6 - 104 6361 B9 F9 A2 lda seppukuTable,y - 105 6364 8D 49 41 sta seppukuVal - 106 - 107 ;8th option (how aggressive are mountains) - 108 6367 AC 46 41 ldy OptionsTable+7 - 109 636A B9 D5 5A lda mountainsDeltaTableH,y - 110 636D 8D 4A 41 sta mountainDeltaH - 111 6370 B9 DA 5A lda mountainsDeltaTableL,y - 112 6373 8D 4B 41 sta mountainDeltaL - 113 - 114 - 115 6376 60 rts - 116 .endp - 117 - 118 ;------------------------------------------- - 119 ; call of the purchase (and activate) screens for each tank - 120 6377 .proc CallPurchaseForEveryTank - 121 - 122 6377 A9 00 85 6C mva #0 TankNr - 123 637B 85 E4 sta isInventory - 124 @ - 125 637D A6 6C ldx TankNr - 126 637F BD 39 41 lda SkillTable,x - 127 6382 F0 06 beq ManualPurchase - 128 6384 20 A3 94 jsr PurchaseAI ; remember to make ActivateAI :) !!! - 129 6387 4C A3 63 jmp AfterManualPurchase - 130 638A ManualPurchase - 131 638A BD 25 44 lda JoyNumber,x - 132 638D 85 5D sta JoystickNumber ; set joystick port for player - 133 638F A9 00 85 E4 mva #0 isInventory - 134 6393 20 C0 63 jsr Purchase ; purchase weapons - 135 6396 24 D7 bit escFlag - 136 6398 10 01 60 spl:rts - 137 639B 20 AC 63 jsr DefensivesActivate ; activate weapons - 138 639E 24 D7 bit escFlag - 139 63A0 10 01 60 spl:rts - 140 63A3 AfterManualPurchase - 141 63A3 E6 6C A5 6C inc:lda TankNr - 142 63A7 C5 AE cmp NumberOfPlayers - 143 63A9 D0 D2 bne @- - 144 63AB 60 rts - 145 .endp - 146 ;-------------------------------------------------- - 147 63AC .proc DefensivesActivate - 148 ;-------------------------------------------------- - 149 ; This proc call Inventory and set Defensives activation first - 150 - 151 63AC A9 ED 85 00 A9 4C + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons - 152 63B4 A9 FF 85 E4 mva #$ff IsInventory - 153 63B8 A9 80 8D 0D 45 mva #%10000000 WhichList - 154 ; offensive weapon - 0, defensive - %10000000 - 155 63BD 4C C5 63 jmp Purchase.GoToActivation - 156 .endp - 157 - 158 - 159 ;-------------------------------------------------- - 160 63C0 .proc Purchase ; - 161 ;-------------------------------------------------- - 162 ; In tanknr there is a number of the tank (player) - 163 ; that is buying weapons now (from 0). - 164 ; Rest of the data is taken from appropriate tables - 165 ; and during the purchase these tables are modified. - 166 - 167 - 168 ; we are clearing list of the weapons - 169 63C0 A9 00 8D 0D 45 mva #$00 WhichList - 170 ; offensive weapon - 0, deffensive - %10000000 - 171 63C5 GoToActivation - 172 63C5 60 rts - 173 - 174 .endp - 175 - 176 ; ----------------------------------------------------- - 177 63C6 .proc EnterPlayerNames - 178 ;entering names of players - 179 - 180 63C6 A9 00 85 6C mva #0 TankNr - 181 63CA 85 02 sta COLBAKS ; set color of background - 182 63CC AA @ tax - 183 63CD BD 7F 5B lda TankStatusColoursTable,x - 184 63D0 85 02 sta COLOR2 ; set color of player name line - 185 63D2 20 E6 63 jsr EnterPlayerName - 186 63D5 24 D7 bit escFlag - 187 63D7 10 01 60 spl:rts - 188 63DA 20 46 A2 jsr CheckTankCheat - 189 63DD E6 6C inc TankNr - 190 63DF A5 6C lda TankNr - 191 63E1 C5 AE cmp NumberOfPlayers - 192 63E3 D0 E7 bne @- - 193 63E5 60 rts - 194 .endp - 195 ; ----------------------------------------------------- - 196 63E6 .proc EnterPlayerName - 197 ; in: TankNr - 198 ; Out: TanksNames, SkillTable - 199 - 200 ; this little thing is for choosing Player's skill (if computer) - 201 ; and entering his name - 202 ; If no name entered, there should be name "1st Tank", etc. - 203 ; Default tanks names are in table TanksNamesDefault - 204 ; ----------------------------------------------------- - 205 - 206 ; - 207 - 208 63E6 EndOfNick - 209 ; storing name of the player and its level - 210 - 211 ; level of the computer opponent goes to - 212 ; the table of levels (difficulties) - 213 63E6 A6 6C ldx tanknr - 214 63E8 A9 06 lda #6 ; Spoiler - 215 63EA 85 E5 sta DifficultyLevel - 216 63EC 9D 39 41 sta skilltable,x - 217 63EF F0 05 beq NotRobot - 218 63F1 A9 03 lda #$03 ; shape for robotanks - 219 63F3 9D 2B 44 sta TankShape,x - 220 63F6 NotRobot - 221 ; storing name of the tank in the right space - 222 ; (without cursor!) - 223 63F6 A0 00 ldy #$00 - 224 63F8 8A txa ; ldx TankNr - 225 63F9 0A asl - 226 63FA 0A asl - 227 63FB 0A asl ; 8 chars per name - 228 63FC AA tax ; in X where to put new name - 229 - 230 63FD A9 16 85 9E mva #sfx_next_player sfx_effect - 231 - 232 - 233 ; check if all chars are empty (" ") - 234 6401 A0 07 ldy #7 - 235 6403 A9 00 lda #0 - 236 6405 09 00 @ ora #0 ; NameAdr,y - 237 6407 29 7F and #$7F ; remove inverse (Cursor) - 238 6409 88 dey - 239 640A 10 F9 bpl @- - 240 640C A8 tay - 241 640D F0 10 beq MakeDefaultName - 242 - 243 640F A0 00 ldy #0 - 244 6411 nextchar04 - 245 6411 A9 00 lda #0 ; NameAdr,y - 246 6413 29 7F and #$7f ; remove inverse (Cursor) - 247 6415 9D 09 41 sta tanksnames,x - 248 6418 E8 inx - 249 6419 C8 iny - 250 641A C0 08 cpy #$08 - 251 641C D0 F3 bne nextchar04 - 252 641E 60 rts - 253 641F MakeDefaultName - 254 641F nextchar05 - 255 641F BD 3A 5C lda tanksnamesDefault,x - 256 6422 9D 09 41 sta tanksnames,x - 257 6425 E8 inx - 258 6426 C8 iny - 259 6427 C0 08 cpy #$08 - 260 6429 D0 F4 bne nextchar05 - 261 642B 60 rts - 262 .endp - 263 ;-------------------------------------------------- - 264 642C .proc displaydec5 ;decimal (word), displayposition (word) - 265 ;-------------------------------------------------- - 266 ; displays decimal number as in parameters (in text mode) - 267 ; leading zeroes are removed - 268 ; the range is (00000..65565 - two bytes) - 269 - 270 642C A0 04 ldy #4 ; there will be 5 digits - 271 642E NextDigit - 272 642E A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times - 273 6430 A9 00 lda #$00 - 274 6432 Rotate000 - 275 6432 aslw decimal -Macro: ASLW [Source: MACRO.ASM] - 1 6432 06 AC ASL DECIMAL - 2 6434 26 AD ROL DECIMAL+1 -Source: textproc.asm - 276 6436 2A rol ; scroll dividee - 277 ; (as highest byte - additional - byte is A) - 278 6437 C9 0A cmp #10 ; divider - 279 6439 90 04 bcc TooLittle000 ; if A is smaller than divider - 280 ; there is nothing to substract - 281 643B E9 0A sbc #10 ; divider - 282 643D E6 AC inc decimal ; lowest bit set to 1 - 283 ; because it is 0 and this is the fastest way - 284 643F CA TooLittle000 dex - 285 6440 D0 F0 bne Rotate000 ; and Rotate 16 times, Result will be in decimal - 286 6442 AA tax ; and the rest in A - 287 ; (and it goes to X because - 288 ; it is our decimal digit) - 289 6443 BD AA 60 lda digits,x - 290 6446 99 0F 45 sta decimalresult,y - 291 6449 88 dey - 292 644A 10 E2 bpl NextDigit ; Result again /10 and we have next digit - 293 - 294 ;rightnumber - 295 ; displaying without leading zeroes (if zeroes exist then display space at this position) - 296 644C A0 00 ldy #0 - 297 644E A2 00 ldx #0 ; digit flag (cut leading zeroes) - 298 6450 displayloop - 299 6450 B9 0F 45 lda decimalresult,y - 300 6453 E0 00 cpx #0 - 301 6455 D0 0D bne noleading0 - 302 6457 C0 04 cpy #4 - 303 6459 F0 09 beq noleading0 ; if 00000 - last 0 must stay - 304 645B CD AA 60 cmp zero - 305 645E D0 04 bne noleading0 - 306 6460 A9 00 lda #space - 307 6462 F0 01 beq displaychar ; space = 0 ! - 308 6464 noleading0 - 309 6464 E8 inx ; set flag (no leading zeroes to cut) - 310 6465 displaychar - 311 6465 91 76 sta (displayposition),y - 312 6467 nexdigit - 313 6467 C8 iny - 314 6468 C0 05 cpy #5 - 315 646A D0 E4 bne displayloop - 316 - 317 646C 60 rts - 318 .endp - 319 ;-------------------------------------------------- - 320 646D .proc displaybyte ;decimal (byte), displayposition (word) - 321 ;-------------------------------------------------- - 322 ; displays decimal number as in parameters (in text mode) - 323 ; leading zeores are removed - 324 ; the range is (00..99 - one byte) - 325 - 326 646D A0 01 ldy #1 ; there will be 2 digits - 327 646F NextDigit2 - 328 646F A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times - 329 6471 A9 00 lda #$00 - 330 6473 Rotate001 - 331 6473 06 AC asl decimal - 332 6475 2A rol ; scroll dividee - 333 ; (as highest byte - additional - byte is A) - 334 6476 C9 0A cmp #10 ; divider - 335 6478 90 04 bcc TooLittle001 ; if A is smaller than divider - 336 ; there is nothing to substract - 337 647A E9 0A sbc #10 ; divider - 338 647C E6 AC inc decimal ; because it is 0 and this is the fastest way - 339 647E CA TooLittle001 dex - 340 647F D0 F2 bne Rotate001 ; and Rotate 8 times, Result will be in decimal - 341 6481 AA tax ; and the rest in A - 342 ; (and it goes to X because - 343 ; it is our decimal digit) - 344 6482 BD AA 60 lda digits,x - 345 6485 99 0F 45 sta decimalresult,y - 346 6488 88 dey - 347 6489 10 E4 bpl NextDigit2 ; Result again /10 and we have next digit - 348 - 349 ; now cut leading zeroes (02 goes 2) - 350 648B AD 0F 45 lda decimalresult - 351 648E CD AA 60 cmp zero - 352 6491 D0 05 bne decimalend1 - 353 6493 A9 00 lda #space - 354 6495 8D 0F 45 sta decimalresult - 355 - 356 6498 decimalend1 - 357 ; displaying - 358 6498 A0 01 ldy #1 - 359 649A displayloop1 - 360 649A B9 0F 45 lda decimalresult,y - 361 649D 91 76 sta (displayposition),y - 362 649F 88 dey - 363 64A0 10 F8 bpl displayloop1 - 364 - 365 64A2 60 rts - 366 .endp - 367 - 368 ;-------------------------------- - 369 64A3 .proc DisplayResults ; - 370 ;displays results of the round - 371 ;using 4x4 font - 372 - 373 - 374 64A3 A9 FF 85 DB mva #$ff plot4x4color - 375 - 376 ;centering the result screen - 377 64A7 A9 44 85 B2 mva #((ScreenHeight/2)-(8*4)) ResultY - 378 - 379 - 380 ;upper frame - 381 64AB A5 B2 85 D8 mva ResultY LineYdraw - 382 64AF 20 E8 65 jsr TL4x4_top - 383 - 384 64B2 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 385 - 386 ;Header1 - 387 ;Displays round number - 388 64B9 AD 14 45 lda CurrentRoundNr - 389 64BC CD 48 41 cmp RoundsInTheGame - 390 64BF F0 26 beq GameOver4x4 - 391 - 392 64C1 85 AC sta decimal - 393 64C3 A9 55 85 76 A9 41 + mwa #RoundNrDisplay displayposition - 394 64CB 20 6D 64 jsr displaybyte ;decimal (byte), displayposition (word) - 395 - 396 64CE A9 4C 85 B3 A9 41 + mwa #LineHeader1 LineAddress4x4 - 397 64D6 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 398 64DE A5 B2 85 D8 mva ResultY LineYdraw - 399 64E2 20 6E 73 jsr TypeLine4x4 - 400 64E5 F0 1E beq @+ ;unconditional jump, because TypeLine4x4 ends with beq - 401 - 402 64E7 GameOver4x4 - 403 64E7 RmtSong song_round_over -Macro: RMTSONG [Source: scorchC64.asm] - 1 64E7 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 -Source: textproc.asm - 404 64E9 A9 41 85 B3 A9 5B + mwa #LineGameOver LineAddress4x4 - 405 64F1 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 406 64F9 A5 B2 85 D8 mva ResultY LineYdraw - 407 64FD 20 6E 73 jsr TypeLine4x4 - 408 6500 A9 01 8D 7D 43 mva #1 GameIsOver - 409 - 410 @ - 411 6505 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 412 - 413 ;Empty line - 414 650C A5 B2 85 D8 mva ResultY LineYdraw - 415 6510 20 FB 65 jsr TL4x4_empty - 416 - 417 6513 A5 B2 18 69 02 85 + adb ResultY #2 ;next line - 418 - 419 - 420 ;Header2 - 421 651A A9 33 85 B3 A9 5B + mwa #LineHeader2 LineAddress4x4 - 422 6522 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 423 652A A5 B2 85 D8 mva ResultY LineYdraw - 424 652E 20 6E 73 jsr TypeLine4x4 - 425 - 426 6531 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 427 - 428 ;Empty line - 429 6538 A5 B2 85 D8 mva ResultY LineYdraw - 430 653C 20 FB 65 jsr TL4x4_empty - 431 - 432 653F A5 B2 38 E9 02 85 + sbb ResultY #2 ;next line (was empty) - 433 - 434 6546 A6 AE ldx NumberOfPlayers ;we start from the highest (best) tank - 435 6548 CA dex ;and it is the last one - 436 6549 8E EA 48 stx ResultOfTankNr ;in TankSequence table - 437 - 438 654C A9 09 85 78 A9 41 + mwa #TanksNames tempXROLLER - 439 - 440 6554 ResultOfTheNextPlayer - 441 6554 AE EA 48 ldx ResultOfTankNr ;we are after a round, so we can use TankNr - 442 6557 BD 77 43 lda TankSequence,x ;and we keep here real number if the tank - 443 655A 85 6C sta TankNr ;for which we are displaying results - 444 - 445 - 446 - 447 - 448 655C A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 449 - 450 ;there are at least 2 players, so we can safely - 451 ;start displaying the result - 452 - 453 6563 A9 03 lda #3 ;it means | - 454 6565 8D 5A 41 sta ResultLineBuffer - 455 - 456 6568 A4 6C ldy TankNr - 457 656A B9 BB 43 lda ResultsTable,y - 458 656D 85 AC sta decimal - 459 656F A9 00 85 AD mva #0 decimal+1 - 460 6573 A9 62 85 76 A9 41 + mwa #(ResultLineBuffer+8) displayposition - 461 657B 20 2C 64 jsr displaydec5 ;decimal (byte), displayposition (word) - 462 - 463 ; overwrite the second digit of the points (max 255) - 464 ;it means ":" - 465 657E A9 1A 8D 63 41 mva #26 ResultLineBuffer+9 - 466 - 467 6583 A2 00 ldx #0 - 468 6585 A5 6C lda TankNr - 469 6587 0A asl - 470 6588 0A asl ; times 8, because it is lengtgh - 471 6589 0A asl ; of the names of the tanks - 472 658A A8 tay - 473 - 474 658B TankNameCopyLoop - 475 658B B1 78 lda (tempXROLLER),y ;XROLLER is not working now - 476 658D 29 3F and #$3f ;always CAPITAL letters - 477 658F E8 inx - 478 6590 9D 5A 41 sta ResultLineBuffer,x - 479 6593 C8 iny - 480 6594 E0 08 cpx #8 ; end of name - 481 6596 D0 F3 bne TankNameCopyLoop - 482 ; last letter of tank name overwrites first digit of the points (max 255) - 483 - 484 - 485 ;just after the digits - 486 ;it means | - 487 6598 A9 03 8D 67 41 mva #$3 ResultLineBuffer+13 - 488 - 489 ;result line display - 490 659D A9 5A 85 B3 A9 41 + mwa #ResultLineBuffer LineAddress4x4 - 491 65A5 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 492 65AD A5 B2 85 D8 mva ResultY LineYdraw - 493 65B1 20 6E 73 jsr TypeLine4x4 - 494 - 495 65B4 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 496 - 497 ;Empty line - 498 65BB A5 B2 85 D8 mva ResultY LineYdraw - 499 65BF 20 FB 65 jsr TL4x4_empty - 500 - 501 65C2 CE EA 48 dec ResultOfTankNr - 502 65C5 30 0A bmi FinishResultDisplay - 503 - 504 65C7 A5 B2 38 E9 02 85 + sbb ResultY #2 ;distance between lines is smaller - 505 - 506 65CE 4C 54 65 jmp ResultOfTheNextPlayer - 507 - 508 65D1 FinishResultDisplay - 509 65D1 A5 B2 85 D8 mva ResultY LineYdraw - 510 ;jmp TL4x4_bottom ; just go - 511 .endp - 512 - 513 65D5 .proc TL4x4_bottom - 514 ;bottom of the frame - 515 65D5 A9 17 85 B3 A9 5B + mwa #LineBottom LineAddress4x4 - 516 65DD A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 517 65E5 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 518 .endp - 519 - 520 65E8 .proc TL4x4_top - 521 ;bottom of the frame - 522 65E8 A9 09 85 B3 A9 5B + mwa #LineTop LineAddress4x4 - 523 65F0 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 524 65F8 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 525 .endp - 526 - 527 65FB .proc TL4x4_empty - 528 ;empty frame - 529 65FB A9 25 85 B3 A9 5B + mwa #LineEmpty LineAddress4x4 - 530 6603 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 531 660B 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 532 .endp - 533 - 534 ;-------------------------------------------------- - 535 660E .proc GameOverScreen - 536 ;-------------------------------------------------- - 537 - 538 660E 60 rts - 539 .endp - 540 ;------------------------------------------------- - 541 660F .proc PutTankNameOnScreen - 542 ;------------------------------------------------- - 543 - 544 .endp - 545 ;------------------------------------------------- - 546 660F .proc DisplayStatus - 547 ;------------------------------------------------- - 548 660F DisplayAngle - 549 660F A6 6C ldx TankNr - 550 6611 60 rts - 551 .endp - 552 ;------------------------------------------------- - 553 - 554 - 555 .endif - 347 ;---------------------------------------------- - 348 6612 icl 'grafproc.asm' -Source: grafproc.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 - 6 ;-------------------------------------------------- - 7 6612 .proc draw ;;fuxxing good draw :) - 8 ; xdraw,ydraw (word) - coordinates of first point - 9 ; xbyte,ybyte (word) - coordinates of last point - 10 ;-------------------------------------------------- - 11 ;creditz to Dr Jankowski / MIM U.W. - 12 ; (xi,yi)-----(xk,yk) - 13 ;20 DX=XK-XI - 14 ;30 DY=YK-YI - 15 ;40 DP=2*DY - 16 ;50 DD=2*(DY-DX) - 17 ;60 DI=2*DY-DX - 18 ;70 REPEAT - 19 ;80 IF DI>=0 - 20 ;90 DI=DI+DD - 21 ;100 YI=YI+1 - 22 ;110 ELSE - 23 ;120 DI=DI+DP - 24 ;130 ENDIF - 25 ;140 plot XI,YI - 26 ;150 XI=XI+1 - 27 ;160 UNTIL XI=XK - 28 - 29 - 30 ; begin: xdraw,ydraw - end: xbyte,ybyte - 31 ; let's store starting coordinates - 32 ; will be needed, because everything is calculated relatively - 33 6612 A9 FF 85 E1 85 E2 mwa #$ffff LineLength - 34 6618 A5 61 85 7A A5 62 + mwa xdraw xtempDRAW - 35 6620 A5 63 85 7C A5 64 + mwa ydraw ytempDRAW - 36 - 37 ; if line goes our of the screen we are not drawing it, but... - 38 - 39 6628 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 40 6632 B0 14 bcs DrawOutOfTheScreen - 41 6634 A5 66 C9 01 D0 04 + cpw xbyte #screenwidth - 42 663E B0 08 bcs DrawOutOfTheScreen - 43 ;cpw ydraw #screenheight - 44 ;bcs DrawOutOfTheScreen - 45 ;cpw ybyte #screenheight - 46 ;bcc DrawOnTheScreen - 47 6640 A5 64 lda ydraw+1 - 48 6642 30 04 bmi DrawOutOfTheScreen - 49 6644 A5 68 lda ybyte+1 - 50 6646 10 01 bpl DrawOnTheScreen - 51 6648 DrawOutOfTheScreen - 52 ;jsr DrawJumpPad - 53 6648 60 rts - 54 6649 DrawOnTheScreen - 55 ; constant parameters - 56 ; XI=0 ,YI=0 - 57 6649 A9 00 lda #0 - 58 664B 85 81 sta XI - 59 664D 85 82 sta XI+1 - 60 664F 85 84 sta YI - 61 6651 85 85 sta YI+1 - 62 - 63 ; setting the direction controll bits - 64 6653 A5 64 C5 68 D0 04 + cpw ydraw ybyte - 65 665D 90 14 bcc LineDown - 66 ; here one line up - 67 ; we are setting bit 0 - 68 665F A9 01 85 DF mva #1 HowToDraw ;here we can because it's first operation - 69 ; we are subctracting Yend from Ybegin (reverse order) - 70 ; DY=YI-YK - 71 6663 38 A5 63 E5 67 85 + sbw ydraw ybyte DY - 72 6670 4C 84 66 jmp CheckDirectionX - 73 6673 LineDown - 74 ; one line down here - 75 ; we are setting bit 0 - 76 6673 A9 00 85 DF mva #0 HowToDraw ;here we can because it's first operation - 77 ; substract Ybegin from Yend (normal order) - 78 ; DY=YK-YI - 79 6677 38 A5 67 E5 63 85 + sbw ybyte ydraw DY - 80 6684 CheckDirectionX - 81 6684 A5 62 C5 66 D0 04 + cpw xdraw xbyte - 82 668E 90 16 bcc LineRight - 83 ; here goes line to the left - 84 ; we set bit 1 - 85 - 86 6690 A5 DF lda HowToDraw - 87 6692 09 02 ora #$02 - 88 6694 85 DF sta HowToDraw - 89 ; substract Xend from Xbegin (reverse) - 90 ; DX=XI-XK - 91 6696 38 A5 61 E5 65 85 + sbw xdraw xbyte DX - 92 66A3 4C B3 66 jmp CheckDirectionFactor - 93 66A6 LineRight - 94 ; here goes one line to the right - 95 ; we clear bit 0 - 96 ; we can do nothing because the bit is cleared! - 97 - 98 ;lda HowToDraw - 99 ;and #$FD - 100 ;sta HowToDraw - 101 - 102 ; substracting Xbegin from Xend (normal way) - 103 ; DX=XK-XI - 104 66A6 38 A5 65 E5 61 85 + sbw xbyte xdraw DX - 105 66B3 CheckDirectionFactor - 106 ; here we check Direction Factor - 107 ; I do not know if we are using proper English word - 108 ; but the meaning is 'a' in y=ax+b - 109 - 110 ; lda DX - 111 ; we already have DX in A - 112 66B3 A5 8C C5 8E D0 04 + cpw DX DY - 113 - 114 66BD 90 0B bcc SwapXY - 115 ; 'a' factor is fire, so we copy parameters - 116 ; XK=DX - 117 66BF A5 8B 85 87 A5 8C + mwa DX XK - 118 ; and clearing bit 2 - 119 ; and bit 2 clear - 120 ; (is not needed because already cleared) - 121 ;lda HowToDraw - 122 ;and #$FB - 123 ;sta HowToDraw - 124 66C7 4C E8 66 jmp LineParametersReady - 125 66CA SwapXY - 126 ; not this half of a quarter! - parameters must be swapped - 127 ; XK=DY - 128 ; DY=DX - 129 ; DX=XK - because DY is there so DY and DX are swapped - 130 ; YK ... not used - 131 66CA A5 8D 85 87 A5 8E + mwa DY XK - 132 66D2 A5 8B 85 8D A5 8C + mwa DX DY - 133 66DA A5 87 85 8B A5 88 + mwa XK DX - 134 - 135 ; and let's set bit 2 - 136 66E2 A5 DF lda HowToDraw - 137 66E4 09 04 ora #$04 - 138 66E6 85 DF sta HowToDraw - 139 66E8 LineParametersReady - 140 ; let's check if length is not zero - 141 66E8 A5 8B lda DX - 142 66EA 05 8C ora DX+1 - 143 66EC 05 8D ora DY - 144 66EE 05 8E ora DY+1 - 145 66F0 D0 07 bne NotOnePoint - 146 ; length=0 - 147 66F2 85 E1 sta LineLength - 148 66F4 85 E2 sta LineLength+1 - 149 66F6 4C 39 68 jmp EndOfDraw - 150 - 151 66F9 NotOnePoint - 152 ; here we have DX,DY,XK and we know which operations - 153 ; are to be performed with these factors when doing PLOT - 154 ; (accordingly to given bits of 'HowToDraw') - 155 ; Now we must calculate DP, DD and DI - 156 ; DP=2*DY - 157 ; DD=2*(DY-DX) - 158 ; DI=2*DY-DX - 159 - 160 66F9 A5 8D 85 93 A5 8E + mwa DY DP - 161 6701 aslw DP -Macro: ASLW [Source: MACRO.ASM] - 1 6701 06 93 ASL DP - 2 6703 26 94 ROL DP+1 -Source: grafproc.asm - 162 - 163 6705 38 A5 8D E5 8B 85 + sbw DY DX DD - 164 6712 aslw DD -Macro: ASLW [Source: MACRO.ASM] - 1 6712 06 8F ASL DD - 2 6714 26 90 ROL DD+1 -Source: grafproc.asm - 165 - 166 6716 A5 8D 85 91 A5 8E + mwa DY DI - 167 671E aslw DI -Macro: ASLW [Source: MACRO.ASM] - 1 671E 06 91 ASL DI - 2 6720 26 92 ROL DI+1 -Source: grafproc.asm - 168 6722 38 A5 91 E5 8B 85 + sbw DI DX - 169 - 170 672F DrawLoop - 171 ; REPEAT - 172 ; IF DI>=0 - 173 672F A5 92 lda DI+1 - 174 6731 30 16 bmi DINegative - 175 ; DI=DI+DD - 176 ; YI=YI+1 - 177 6733 18 A5 91 65 8F 85 + adw DI DD - 178 6740 E6 84 D0 02 E6 85 inw YI - 179 6746 4C 56 67 jmp drplot - 180 6749 DINegative - 181 ; ELSE - 182 ; DI=DI+DP - 183 6749 18 A5 91 65 93 85 + adw DI DP - 184 - 185 6756 drplot ; Our plot that checks how to calculate pixels. - 186 ; In xtempDRAW and ycircle there are begin coordinates - 187 ; of our line - 188 ; First we check the 'a' factor (like in y=ax+b) - 189 ; If necessary we swap XI and YI - 190 ; (as we can not change XI and YI we move XI to temp2 - 191 ; and YI to temp) - 192 - 193 - 194 6756 A5 DF lda HowToDraw - 195 6758 29 04 and #$04 - 196 675A D0 13 bne SwappedXY - 197 675C A5 81 85 72 A5 82 + mwa XI temp - 198 6764 A5 84 85 74 A5 85 + mwa YI temp2 - 199 676C 4C 7F 67 jmp CheckPlotY - 200 676F SwappedXY - 201 676F A5 81 85 74 A5 82 + mwa XI temp2 - 202 6777 A5 84 85 72 A5 85 + mwa YI temp - 203 677F CheckPlotY - 204 677F A5 DF lda HowToDraw - 205 6781 29 01 and #01 - 206 6783 D0 10 bne LineGoesUp - 207 ; here we know that line goes down and we are not changing Y - 208 6785 18 A5 74 65 7C 85 + adw temp2 ytempDRAW ydraw ; YI - 209 6792 4C A2 67 jmp CheckPlotX - 210 6795 LineGoesUp - 211 ; line goes up here - we are reversing Y - 212 6795 38 A5 7C E5 74 85 + sbw ytempDRAW temp2 ydraw ; YI - 213 67A2 CheckPlotX - 214 67A2 A5 DF lda HowToDraw - 215 67A4 29 02 and #02 - 216 67A6 D0 10 bne LineGoesLeft - 217 ; here we know that line goes right and we are not changing X - 218 67A8 18 A5 72 65 7A 85 + adw temp xtempDRAW xdraw ; XI - 219 67B5 4C C5 67 jmp PutPixelinDraw - 220 67B8 LineGoesLeft - 221 ; line goes left - we are reversing X - 222 67B8 38 A5 7A E5 72 85 + sbw xtempDRAW temp xdraw ; XI - 223 67C5 PutPixelinDraw - 224 - 225 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) - 226 67C5 2C 73 43 bit drawFunction - 227 67C8 10 0D bpl @+ - 228 67CA E6 E1 D0 02 E6 E2 inw LineLength - 229 67D0 24 60 bit Vdebug - 230 67D2 30 4D bmi MeasureVisualisation - 231 67D4 4C 24 68 jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff - 232 @ - 233 67D7 50 48 bvc @+ - 234 67D9 DrawCheck - 235 67D9 A5 E3 lda tracerflag - 236 67DB 0D 8A 44 ora SmokeTracerFlag - 237 67DE yestrace - 238 67DE F0 03 beq notrace - 239 67E0 20 14 76 jsr plot - 240 67E3 notrace - 241 ;aftertrace - 242 ;key - 243 67E3 A5 BF lda HitFlag - 244 67E5 D0 37 bne StopHitChecking - 245 - 246 67E7 CheckCollisionDraw - 247 ; checking collision! - 248 67E7 A5 64 lda ydraw+1 - 249 67E9 30 33 bmi StopHitChecking - 250 - 251 67EB 20 84 8E jsr CheckCollisionWithTank - 252 67EE A5 BF lda HitFlag - 253 67F0 D0 2C bne StopHitChecking - 254 - 255 67F2 18 clc - 256 67F3 A5 61 lda xdraw - 257 67F5 69 3E adc #mountaintable - 261 67FD 85 73 sta temp+1 - 262 - 263 67FF A0 00 ldy #0 - 264 6801 A5 63 lda ydraw - 265 6803 D1 72 cmp (temp),y - 266 6805 90 17 bcc StopHitChecking - 267 - 268 6807 A5 61 85 C1 A5 62 + mwa xdraw XHit - 269 680F B1 72 lda (temp),y - 270 6811 38 sec - 271 6812 E9 01 sbc #1 - 272 6814 8D 5F 44 sta YHit - 273 6817 8C 60 44 sty YHit+1 - 274 681A A9 FF 85 BF mva #$ff HitFlag - 275 681E StopHitChecking - 276 681E 4C 24 68 jmp ContinueDraw - 277 @ - 278 6821 MeasureVisualisation - 279 6821 20 14 76 jsr plot - 280 - 281 6824 ContinueDraw - 282 ; XI=XI+1 - 283 ; UNTIL XI=XK - 284 6824 E6 81 D0 02 E6 82 inw XI - 285 682A A5 82 C5 88 D0 04 + cpw XI XK - 286 6834 F0 03 4C 2F 67 jne DrawLoop - 287 - 288 6839 EndOfDraw - 289 6839 A5 7A 85 61 A5 7B + mwa xtempDRAW xdraw - 290 6841 A5 7C 85 63 A5 7D + mwa ytempDRAW ydraw - 291 6849 60 rts - 292 .endp - 293 - 294 ;-------------------------------------------------- - 295 684A .proc circle ;fxxxing good circle drawing :) - 296 ; xdraw,ydraw (word) - coordinates of circle center - 297 ; radius (byte) - radius of circle - 298 ;-------------------------------------------------- - 299 ;Turbo Basic source - 300 ; R=30 - 301 ; XC=0:YC=R - 302 ; FX=0:FY=8*R:FS=4*R+3 - 303 ; WHILE FX0 - 308 ; FS=FS-FX-4 - 309 ; ELSE - 310 ; YC=YC-1 - 311 ; FY=FY-8 - 312 ; FS=FS-FX-4+FY - 313 ; ENDIF - 314 ; WEND - 315 ; splot8 - 316 - 317 684A A5 61 85 B3 A5 62 + mwa xdraw xcircle - 318 6852 A5 63 85 B5 A5 64 + mwa ydraw ycircle - 319 - 320 685A A9 00 85 70 85 71 mwa #0 xc - 321 6860 A5 AB 85 8A mva radius yc - 322 6864 A9 00 85 83 mva #0 fx - 323 6868 A5 AB 85 86 mva radius fy - 324 686C 06 86 asl FY - 325 686E 06 86 asl FY - 326 6870 A5 86 85 89 mva FY FS - 327 6874 06 86 asl FY - 328 6876 18 clc - 329 6877 A5 89 lda FS - 330 6879 69 03 adc #3 - 331 687B 85 89 sta FS - 332 - 333 687D circleloop - 334 687D A5 83 lda FX - 335 687F C5 86 cmp FY - 336 6881 B0 34 bcs endcircleloop - 337 6883 20 CB 68 jsr splot8 - 338 6886 E6 70 inc XC - 339 - 340 6888 18 clc - 341 6889 A5 83 lda FX - 342 688B 69 08 adc #8 - 343 688D 85 83 sta FX - 344 - 345 688F A5 89 lda FS - 346 6891 F0 0C beq else01 - 347 6893 30 0A bmi else01 - 348 6895 38 sec - 349 6896 E5 83 sbc FX - 350 6898 E9 04 sbc #4 - 351 689A 85 89 sta FS - 352 689C 4C B4 68 jmp endif01 - 353 689F else01 - 354 689F C6 8A dec YC - 355 68A1 38 sec - 356 68A2 A5 86 lda FY - 357 68A4 E9 08 sbc #8 - 358 68A6 85 86 sta FY - 359 - 360 68A8 A5 89 lda FS - 361 68AA 38 sec - 362 68AB E5 83 sbc FX - 363 68AD E9 04 sbc #4 - 364 68AF 18 clc - 365 68B0 65 86 adc FY - 366 68B2 85 89 sta FS - 367 68B4 endif01 - 368 68B4 4C 7D 68 jmp circleloop - 369 68B7 endcircleloop - 370 - 371 68B7 20 CB 68 jsr splot8 - 372 - 373 68BA A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 374 68C2 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 375 68CA 60 rts - 376 .endp - 377 ;---- - 378 68CB .proc splot8 - 379 ; plot xcircle+XC,ycircle+YC - 380 ; plot xcircle+XC,ycircle-YC - 381 ; plot xcircle-XC,ycircle-YC - 382 ; plot xcircle-XC,ycircle+YC - 383 - 384 ; plot xcircle+YC,ycircle+XC - 385 ; plot xcircle+YC,ycircle-XC - 386 ; plot xcircle-YC,ycircle-XC - 387 ; plot xcircle-YC,ycircle+XC - 388 - 389 68CB 18 clc - 390 68CC A5 B3 lda xcircle - 391 68CE 65 70 adc XC - 392 68D0 85 61 sta xdraw - 393 68D2 A5 B4 lda xcircle+1 - 394 68D4 69 00 adc #0 - 395 68D6 85 62 sta xdraw+1 - 396 ;clc - 397 68D8 A5 B5 lda ycircle - 398 68DA 65 8A adc YC - 399 68DC 85 63 sta ydraw - 400 68DE 8D 61 44 sta tempcir - 401 68E1 A5 B6 lda ycircle+1 - 402 68E3 69 00 adc #$00 - 403 68E5 85 64 sta ydraw+1 - 404 68E7 8D 62 44 sta tempcir+1 - 405 68EA 20 14 76 jsr plot - 406 - 407 68ED 38 sec - 408 68EE A5 B5 lda ycircle - 409 68F0 E5 8A sbc YC - 410 68F2 85 63 sta ydraw - 411 68F4 A5 B6 lda ycircle+1 - 412 68F6 E9 00 sbc #$00 - 413 68F8 85 64 sta ydraw+1 - 414 68FA 20 14 76 jsr plot - 415 - 416 68FD 38 sec - 417 68FE A5 B3 lda xcircle - 418 6900 E5 70 sbc XC - 419 6902 85 61 sta xdraw - 420 6904 A5 B4 lda xcircle+1 - 421 6906 E9 00 sbc #0 - 422 6908 85 62 sta xdraw+1 - 423 690A 20 14 76 jsr plot - 424 - 425 690D AD 61 44 lda tempcir - 426 6910 85 63 sta ydraw - 427 6912 AD 62 44 lda tempcir+1 - 428 6915 85 64 sta ydraw+1 - 429 6917 20 14 76 jsr plot - 430 ;--- - 431 691A 18 clc - 432 691B A5 B3 lda xcircle - 433 691D 65 8A adc yC - 434 691F 85 61 sta xdraw - 435 6921 A5 B4 lda xcircle+1 - 436 6923 69 00 adc #0 - 437 6925 85 62 sta xdraw+1 - 438 ;clc - 439 6927 A5 B5 lda ycircle - 440 6929 65 70 adc xC - 441 692B 85 63 sta ydraw - 442 692D 8D 61 44 sta tempcir - 443 6930 A5 B6 lda ycircle+1 - 444 6932 69 00 adc #$00 - 445 6934 85 64 sta ydraw+1 - 446 6936 8D 62 44 sta tempcir+1 - 447 6939 20 14 76 jsr plot - 448 - 449 693C 38 sec - 450 693D A5 B5 lda ycircle - 451 693F E5 70 sbc xC - 452 6941 85 63 sta ydraw - 453 6943 A5 B6 lda ycircle+1 - 454 6945 E9 00 sbc #$00 - 455 6947 85 64 sta ydraw+1 - 456 6949 20 14 76 jsr plot - 457 - 458 694C 38 sec - 459 694D A5 B3 lda xcircle - 460 694F E5 8A sbc yC - 461 6951 85 61 sta xdraw - 462 6953 A5 B4 lda xcircle+1 - 463 6955 E9 00 sbc #0 - 464 6957 85 62 sta xdraw+1 - 465 6959 20 14 76 jsr plot - 466 - 467 695C AD 61 44 lda tempcir - 468 695F 85 63 sta ydraw - 469 6961 AD 62 44 lda tempcir+1 - 470 6964 85 64 sta ydraw+1 - 471 6966 20 14 76 jsr plot - 472 - 473 6969 60 RTS - 474 .endp - 475 - 476 ;-------------------------------*------------------ - 477 696A .proc placetanks - 478 ;-------------------------------------------------- - 479 696A A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 - 480 696C A9 00 lda #0 - 481 @ - 482 ; clearing the tables with coordinates of the tank - 483 ; it is necessary, because randomizing checks - 484 ; if the given tank is already placed - 485 ; after check if its position is not (0,0) - 486 - 487 ; I will be honest with you - I have no idea - 488 ; what the above comment was intending to mean :) - 489 - 490 696E 9D 0D 44 sta XtankstableL,x - 491 6971 9D 13 44 sta XtankstableH,x - 492 6974 9D 19 44 sta Ytankstable,x - 493 6977 CA dex - 494 6978 10 F4 bpl @- - 495 - 496 - 497 697A A9 00 8D D6 44 8D + mwa #0 temptankX - 498 6982 A9 00 8D D8 44 mva #0 temptankNr ;player number - 499 6987 StillRandomize - 500 6987 A6 AE ldx NumberOfPlayers - 501 6989 AD 1B D4 lda random - 502 698C 29 07 and #$07 - 503 698E A8 tay - 504 698F C4 AE cpy NumberOfPlayers - 505 6991 B0 F4 bcs StillRandomize - 506 6993 B9 0D 44 lda xtankstableL,y - 507 6996 D0 EF bne StillRandomize - 508 6998 B9 13 44 lda xtankstableH,y - 509 699B D0 EA bne StillRandomize - 510 ; here we know that we got a random number - 511 ; of the tank that is not in use - 512 ; this number is in Y - 513 - 514 699D 18 clc - 515 699E AD D6 44 lda temptankX - 516 69A1 7D 2C 5C adc disktance,x - 517 69A4 8D D6 44 sta temptankX - 518 69A7 99 0D 44 sta xtankstableL,y - 519 69AA 90 03 bcc NotHigherByte03 - 520 69AC EE D7 44 inc temptankX+1 - 521 69AF NotHigherByte03 - 522 69AF AD D7 44 lda temptankX+1 - 523 69B2 99 13 44 sta xtankstableH,y - 524 69B5 EE D8 44 INC temptankNr - 525 69B8 AE D8 44 ldx temptankNr - 526 69BB E4 AE Cpx NumberOfPlayers - 527 69BD D0 C8 bne StillRandomize - 528 - 529 ; getting random displacements relative to even positions - 530 69BF A2 00 ldx #$00 - 531 69C1 StillRandomize02 - 532 69C1 AD 1B D4 lda random - 533 69C4 29 1F and #$1f ; maximal displacement is 31 pixels - 534 - 535 69C6 18 clc - 536 69C7 7D 0D 44 adc xtankstableL,x - 537 69CA 9D 0D 44 sta xtankstableL,x - 538 69CD 90 03 bcc NotHigherByte02 - 539 69CF FE 13 44 inc xtankstableH,x - 540 69D2 NotHigherByte02 - 541 ; and we deduct 15 to make the displacement work two ways - 542 69D2 38 sec - 543 69D3 BD 0D 44 lda xtankstableL,x - 544 69D6 E9 0F sbc #$0f - 545 ; and clear lowest bit to be sure that the X coordinate is even - 546 ; (this is to have P/M background look nice) - 547 ; "AND" does not change "Carry" bit. - 548 ; x correction for P/M - 549 ; -- - 550 .IF XCORRECTION_FOR_PM = 1 - 551 and #$fe - 552 .ENDIF - 553 ; -- - 554 69D8 9D 0D 44 sta xtankstableL,x - 555 69DB B0 03 bcs NotHigherByte01 - 556 69DD DE 13 44 dec xtankstableH,x - 557 69E0 NotHigherByte01 - 558 - 559 69E0 E8 inx - 560 69E1 E4 AE Cpx NumberOfPlayers - 561 69E3 D0 DC bne StillRandomize02 - 562 69E5 60 rts - 563 - 564 ; during calculating heights of thw mountains - 565 ; check if the tank is not somewhere around - 566 ; if so, make horizontal line 8 pixels long - 567 69E6 CheckTank - 568 69E6 A6 AE ldx NumberOfPlayers - 569 69E8 CA dex - 570 69E9 CheckNextTank - 571 69E9 BD 0D 44 lda xtankstableL,x - 572 69EC C5 61 cmp xdraw - 573 69EE D0 17 bne UnequalTanks - 574 69F0 BD 13 44 lda xtankstableH,x - 575 69F3 C5 62 cmp xdraw+1 - 576 69F5 D0 10 bne UnequalTanks - 577 69F7 A5 63 lda ydraw - 578 ;sec - 579 ;sbc #$01 ; minus 1, because it was 1 pixel too high - 580 69F9 9D 19 44 sta ytankstable,x ; what's the heck is that????!!!! - 581 69FC A9 07 8D D4 44 mva #7 deltaX - 582 6A01 A9 00 85 C3 85 C4 mwa #0 delta - 583 6A07 UnequalTanks - 584 6A07 CA dex - 585 6A08 10 DF bpl CheckNextTank - 586 6A0A 60 rts - 587 .endp - 588 - 589 ;------------------------------------------------- - 590 6A0B .proc ClearTanks - 591 6A0B 20 46 75 jsr PMoutofScreen - 592 6A0E A9 01 85 AA mva #1 Erase ; erase tanks flag - 593 .endp - 594 ;-- - 595 6A12 .proc drawtanks - 596 ;------------------------------------------------- - 597 6A12 A5 6C lda TankNr - 598 6A14 48 pha - 599 6A15 A2 00 ldx #$00 - 600 6A17 86 6C stx TankNr - 601 - 602 6A19 DrawNextTank - 603 6A19 20 2C 6A jsr drawtanknr - 604 6A1C E6 6C inc TankNr - 605 6A1E A6 6C ldx TankNr - 606 6A20 E4 AE Cpx NumberOfPlayers - 607 6A22 D0 F5 bne DrawNextTank - 608 - 609 6A24 68 pla - 610 6A25 85 6C sta TankNr - 611 - 612 6A27 A9 00 85 AA mva #0 Erase ; no erase tanks flag - 613 6A2B 60 rts - 614 .endp - 615 ;--------- - 616 6A2C .proc DrawTankNr - 617 6A2C A6 6C ldx tankNr - 618 ; let's check the energy - 619 6A2E BD AF 43 lda eXistenZ,x - 620 6A31 D0 21 bne SkipHidingPM ; if energy=0 then no tank - 621 - 622 ; hide P/M - 623 6A33 BD A2 A2 lda TanksPMOrder,x - 624 6A36 AA tax - 625 6A37 A9 00 lda #0 - 626 6A39 E0 04 cpx #$4 ; 5th tank is defferent - 627 6A3B D0 06 bne No5thTankHide - 628 6A3D 85 06 sta hposp0+4 - 629 6A3F 85 07 sta hposp0+5 - 630 6A41 F0 0C beq @+ - 631 6A43 No5thTankHide - 632 6A43 E0 05 cpx #$5 ; 6th tank is defferent - 633 6A45 D0 06 bne No6thTankHide - 634 6A47 85 08 sta hposp0+6 - 635 6A49 85 09 sta hposp0+7 - 636 6A4B F0 02 beq @+ - 637 6A4D No6thTankHide - 638 6A4D 95 02 sta hposp0,x - 639 @ - 640 6A4F A6 6C ldx TankNr - 641 6A51 4C 56 6B jmp DoNotDrawTankNr - 642 6A54 SkipHidingPM - 643 - 644 6A54 BD 2B 44 lda TankShape,x - 645 6A57 AA tax - 646 6A58 BC 6A 5C ldy TankShapesTable,x - 647 6A5B A6 6C ldx TankNr - 648 6A5D BD C3 48 lda AngleTable,x - 649 6A60 C9 5B cmp #91 ; left or right tank shape - 650 6A62 B0 02 bcs LeftTank - 651 6A64 C8 C8 :2 iny ; right tank - 652 6A66 LeftTank - 653 6A66 84 69 sty CharCode - 654 6A68 DrawTankNrX - 655 6A68 A6 6C ldx tanknr - 656 6A6A 20 67 74 jsr SetupXYdraw - 657 - 658 6A6D 20 E7 70 jsr TypeChar - 659 6A70 A5 AA lda Erase - 660 6A72 F0 03 4C F9 6A jne noTankNoPM - 661 ; now P/M graphics on the screen (only for 5 tanks) - 662 ; horizontal position - 663 6A77 A6 6C ldx TankNr - 664 6A79 BD A2 A2 lda TanksPMOrder,x - 665 6A7C AA tax - 666 6A7D A5 61 85 65 A5 62 + mwa xdraw xbyte - 667 6A85 rorw xbyte ; divide by 2 (carry does not matter) -Macro: RORW [Source: MACRO.ASM] - 1 6A85 66 66 ROR XBYTE+1 - 2 6A87 66 65 ROR XBYTE -Source: grafproc.asm - 668 6A89 A5 65 lda xbyte - 669 6A8B 18 clc - 670 6A8C 69 2C adc #PMOffsetX ; P/M to graphics offset - 671 6A8E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent - 672 6A90 D0 09 bne No5thTank - 673 6A92 18 clc - 674 6A93 69 04 adc #$04 ; missile offset offset - 675 6A95 85 06 sta hposp0+4 - 676 6A97 85 07 sta hposp0+5 - 677 6A99 D0 0F bne NoMissile - 678 6A9B No5thTank - 679 6A9B E0 05 cpx #$5 ; 6th tank are joined missiles and offset is defferent - 680 6A9D D0 09 bne Tanks1to4 - 681 6A9F 18 clc - 682 6AA0 69 04 adc #$04 ; missile offset offset - 683 6AA2 85 08 sta hposp0+6 - 684 6AA4 85 09 sta hposp0+7 - 685 6AA6 D0 02 bne NoMissile - 686 6AA8 Tanks1to4 - 687 6AA8 95 02 sta hposp0,x - 688 - 689 6AAA NoMissile - 690 ; vertical position - 691 6AAA BD B5 5B lda pmtableL,x - 692 6AAD 85 65 sta xbyte - 693 6AAF BD BB 5B lda pmtableH,x - 694 6AB2 85 66 sta xbyte+1 - 695 - 696 ; calculate start position of the tank - 697 6AB4 A5 63 lda ydraw - 698 6AB6 18 clc - 699 6AB7 69 2A adc #PMOffsetY - 700 6AB9 85 72 sta temp - 701 6ABB A0 00 ldy #$00 - 702 6ABD E0 05 cpx #$5 - 703 6ABF B0 1D bcs PMForTank6 - 704 ; clear sprite and put 3 lines on the tank at the same time - 705 6AC1 A2 03 ldx #3 ; three lines of PM - 706 6AC3 ClearPM - 707 6AC3 C4 72 cpy temp - 708 6AC5 D0 0C bne ZeroesToGo - 709 6AC7 B1 65 @ lda (xbyte),y - 710 6AC9 29 F0 and #%11110000 - 711 6ACB 09 0F ora #%00001111 ; (2 bits set) we set on two pixels in three lines - 712 6ACD 91 65 sta (xbyte),y - 713 6ACF 88 dey - 714 6AD0 CA dex - 715 6AD1 D0 F4 bne @- - 716 6AD3 ZeroesToGo - 717 6AD3 B1 65 lda (xbyte),y - 718 6AD5 29 F0 and #%11110000 - 719 6AD7 91 65 sta (xbyte),y - 720 6AD9 88 dey - 721 6ADA D0 E7 bne ClearPM - 722 6ADC F0 1B beq NoPlayerMissile - 723 6ADE PMForTank6 - 724 ; clear sprite and put 3 lines on the tank at the same time - 725 6ADE A2 03 ldx #3 ; three lines of PM - 726 6AE0 ClearPM6 - 727 6AE0 C4 72 cpy temp - 728 6AE2 D0 0C bne ZeroesToGo6 - 729 6AE4 B1 65 @ lda (xbyte),y - 730 6AE6 29 0F and #%00001111 - 731 6AE8 09 F0 ora #%11110000 ; (2 bits set) we set on two pixels in three lines - 732 6AEA 91 65 sta (xbyte),y - 733 6AEC 88 dey - 734 6AED CA dex - 735 6AEE D0 F4 bne @- - 736 6AF0 ZeroesToGo6 - 737 6AF0 B1 65 lda (xbyte),y - 738 6AF2 29 0F and #%00001111 - 739 6AF4 91 65 sta (xbyte),y - 740 6AF6 88 dey - 741 6AF7 D0 E7 bne ClearPM6 - 742 - 743 6AF9 NoPlayerMissile - 744 6AF9 noTankNoPM - 745 6AF9 A0 01 ldy #$01 - 746 6AFB A5 AA lda Erase - 747 6AFD F0 01 beq @+ - 748 6AFF 88 dey - 749 6B00 84 A9 @ sty color - 750 ; draw defensive weapons like shield ( tank number in X ) - 751 ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char - 752 6B02 A6 6C ldx TankNr - 753 6B04 BD FD 43 lda ActiveDefenceWeapon,x - 754 6B07 C9 26 cmp #ind_Shield_________ ; one shot shield - 755 6B09 F0 16 beq DrawTankSh - 756 6B0B C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute - 757 6B0D F0 21 beq DrawTankShieldBold - 758 6B0F C9 27 cmp #ind_Heavy_Shield___ ; shield with energy - 759 6B11 F0 1D beq DrawTankShieldBold - 760 6B13 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence - 761 6B15 F0 10 beq DrawTankShieldWihHorns - 762 6B17 C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector - 763 6B19 F0 0C beq DrawTankShieldWihHorns - 764 6B1B C9 20 cmp #ind_White_Flag_____ ; White Flag - 765 6B1D F0 1A beq DrawTankFlag - 766 6B1F D0 27 bne NoShieldDraw - 767 6B21 DrawTankSh - 768 6B21 20 86 6B jsr DrawTankShield - 769 6B24 4C 48 6B jmp NoShieldDraw - 770 6B27 DrawTankShieldWihHorns - 771 6B27 20 86 6B jsr DrawTankShield - 772 6B2A 20 F7 6B jsr DrawTankShieldHorns - 773 6B2D 4C 48 6B jmp NoShieldDraw - 774 6B30 DrawTankShieldBold - 775 6B30 20 86 6B jsr DrawTankShield - 776 6B33 20 3C 6C jsr DrawTankShieldBoldLine - 777 6B36 4C 48 6B jmp NoShieldDraw - 778 6B39 DrawTankFlag - 779 6B39 A9 1E lda #char_flag____________ ; flag symbol - 780 6B3B 85 69 sta CharCode - 781 6B3D BD 19 44 lda Ytankstable,x - 782 6B40 38 sec - 783 6B41 E9 08 sbc #8 - 784 6B43 85 63 sta ydraw - 785 6B45 20 E7 70 jsr TypeChar - 786 6B48 NoShieldDraw - 787 6B48 BarrelChange - 788 6B48 A0 01 ldy #$01 - 789 6B4A A5 AA lda Erase - 790 6B4C F0 01 beq @+ - 791 6B4E 88 dey - 792 6B4F 84 A9 @ sty color - 793 6B51 20 7B 74 jsr DrawBarrel - 794 6B54 A6 6C ldx TankNr - 795 6B56 DoNotDrawTankNr - 796 6B56 60 rts - 797 .endp - 798 - 799 ; ------------------------------------- - 800 6B57 .proc FlashTank - 801 ; ------------------------------------- - 802 ; number of blinking tank in TankNr - 803 6B57 A9 12 85 89 mva #18 fs ; temp, how many times flash the tank - 804 6B5B tankflash_loop - 805 6B5B A5 02 lda CONSOL ; turbo mode - 806 6B5D 29 01 and #%00000001 ; START KEY - 807 6B5F D0 04 A9 01 85 89 sne:mva #1 fs ; finish it - 808 6B65 A9 01 85 AA mva #1 Erase - 809 6B69 A6 6C ldx TankNr - 810 6B6B 20 54 6A jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! - 811 ;PAUSE 2 - 812 6B6E A0 01 ldy #1 - 813 6B70 20 9D 5A jsr PauseYFrames - 814 6B73 A9 00 85 AA mva #0 Erase - 815 6B77 A6 6C ldx TankNr - 816 6B79 20 54 6A jsr DrawTankNr.SkipHidingPM - 817 ;PAUSE 2 - 818 6B7C A0 01 ldy #1 - 819 6B7E 20 9D 5A jsr PauseYFrames - 820 6B81 C6 89 dec fs - 821 6B83 D0 D6 jne tankflash_loop - 822 6B85 60 rts - 823 .endp - 824 - 825 ;-------------------------------------------------- - 826 6B86 .proc DrawTankShield - 827 ; X - tank number - 828 ; if use DrawInPosition entry point then: - 829 ; xdraw, ydraw - coordinates left LOWER corner of Tank char - 830 ; values remain there after a DrawTankNr proc. - 831 ; - 832 ; this proc change xdraw, ydraw and temp! - 833 ;-------------------------------------------------- - 834 6B86 38 A5 61 E9 03 85 + sbw xdraw #$03 ; 3 pixels to left - 835 ; draw left vertical line of shield ( | ) - 836 6B91 A9 07 85 72 mva #7 temp ; strange !!! - 837 @ - 838 6B95 20 14 76 jsr plot - 839 6B98 A5 63 D0 02 C6 64 + .nowarn dew ydraw - 840 6BA0 C6 72 dec temp - 841 6BA2 D0 F1 bne @- - 842 ; draw left oblique line of shield ( / ) - 843 6BA4 A9 03 85 72 mva #3 temp - 844 @ - 845 6BA8 20 14 76 jsr plot - 846 6BAB A5 63 D0 02 C6 64 + .nowarn dew ydraw - 847 6BB3 E6 61 D0 02 E6 62 inw xdraw - 848 6BB9 C6 72 dec temp - 849 6BBB D0 EB bne @- - 850 ; draw top horizontal line of shield ( _ ) - 851 6BBD A9 07 85 72 mva #7 temp - 852 @ - 853 6BC1 20 14 76 jsr plot - 854 6BC4 E6 61 D0 02 E6 62 inw xdraw - 855 6BCA C6 72 dec temp - 856 6BCC D0 F3 bne @- - 857 ; draw right oblique line of shield ( \ ) - 858 6BCE A9 03 85 72 mva #3 temp - 859 @ - 860 6BD2 20 14 76 jsr plot - 861 6BD5 E6 63 D0 02 E6 64 inw ydraw - 862 6BDB E6 61 D0 02 E6 62 inw xdraw - 863 6BE1 C6 72 dec temp - 864 6BE3 D0 ED bne @- - 865 ; draw right vertical line of shield ( | ) - 866 6BE5 A9 07 85 72 mva #7 temp - 867 @ - 868 6BE9 20 14 76 jsr plot - 869 6BEC E6 63 D0 02 E6 64 inw ydraw - 870 6BF2 C6 72 dec temp - 871 6BF4 D0 F3 bne @- - 872 6BF6 60 rts - 873 .endp - 874 ;-------------------------------------------------- - 875 6BF7 .proc DrawTankShieldHorns - 876 ; use only directly after DrawTankShield - 877 ; this proc draws a little "horns" on shield. - 878 ; Symbol of defensive but aggressive :) weapon - 879 ;-------------------------------------------------- - 880 6BF7 A5 61 D0 02 C6 62 + .nowarn dew xdraw ; 1 pixel left - 881 6BFF 38 A5 63 E9 0A 85 + sbw ydraw #$0a ; 10 pixels up - 882 6C0A 20 14 76 jsr plot - 883 6C0D A5 63 D0 02 C6 64 + .nowarn dew ydraw - 884 6C15 E6 61 D0 02 E6 62 inw xdraw - 885 6C1B 20 14 76 jsr plot - 886 6C1E 38 A5 61 E9 0D 85 + sbw xdraw #$0d ; 13 pixels left - 887 6C29 20 14 76 jsr plot - 888 6C2C E6 61 D0 02 E6 62 inw xdraw - 889 6C32 E6 63 D0 02 E6 64 inw ydraw - 890 6C38 20 14 76 jsr plot - 891 6C3B 60 rts - 892 .endp - 893 ;-------------------------------------------------- - 894 6C3C .proc DrawTankShieldBoldLine - 895 ; use only directly after DrawTankShield - 896 ; this proc draws bold top on shield. - 897 ; Symbol of ablative shield ? :) - 898 ;-------------------------------------------------- - 899 6C3C 38 A5 61 E9 04 85 + sbw xdraw #$04 ; 5 pixels left - 900 6C47 38 A5 63 E9 0B 85 + sbw ydraw #$0b ; 11 pixels up - 901 ; draw additional top horizontal line of shield ( _ ) - 902 6C52 A9 06 85 72 mva #6 temp - 903 @ - 904 6C56 20 14 76 jsr plot - 905 6C59 A5 61 D0 02 C6 62 + .nowarn dew xdraw - 906 6C61 C6 72 dec temp - 907 6C63 D0 F1 bne @- - 908 6C65 60 rts - 909 .endp - 910 ;-------------------------------------------------- - 911 6C66 .proc DrawTankParachute - 912 ;Tank number in X - 913 ;-------------------------------------------------- - 914 6C66 A9 02 lda #char_parachute_______ ; parachute symbol - 915 6C68 85 69 sta CharCode - 916 6C6A BD 19 44 lda Ytankstable,x - 917 6C6D C9 10 cmp #16 - 918 6C6F 90 0A bcc ToHighToParachute - 919 ;sec - 920 6C71 E9 08 sbc #8 - 921 6C73 85 63 sta ydraw - 922 6C75 20 70 74 jsr SetupXYdraw.X - 923 6C78 20 E7 70 jsr TypeChar - 924 6C7B ToHighToParachute - 925 6C7B A6 6C ldx TankNr - 926 6C7D 60 rts - 927 .endp - 928 - 929 ;-------------------------------------------------- - 930 6C7E .proc DrawTankRocketEngine - 931 ; X - tank number - 932 ; - 933 ; this proc change xdraw, ydraw and temp! - 934 ;-------------------------------------------------- - 935 6C7E 18 clc - 936 6C7F BD 19 44 lda Ytankstable,x - 937 6C82 69 02 adc #2 ; 1 pixel down - 938 6C84 85 63 sta ydraw - 939 6C86 A9 00 85 64 mva #0 ydraw+1 - 940 - 941 6C8A 18 clc - 942 6C8B BD 0D 44 lda XtanksTableL,x - 943 6C8E 69 02 adc #2 ; 2 pixels to right - 944 6C90 85 61 sta xdraw - 945 6C92 BD 13 44 lda XtanksTableH,x - 946 6C95 69 00 adc #0 - 947 6C97 85 62 sta xdraw+1 - 948 - 949 ; draw first horizontal line - 950 6C99 A9 05 85 72 mva #5 temp - 951 @ - 952 6C9D 20 14 76 jsr plot - 953 6CA0 E6 61 D0 02 E6 62 inw xdraw - 954 6CA6 C6 72 dec temp - 955 6CA8 D0 F3 bne @- - 956 - 957 6CAA 38 A5 61 E9 02 85 + sbw xdraw #2 ; 2 pixels left - 958 6CB5 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down - 959 - 960 ; draw second horizontal line - 961 6CBB A9 03 85 72 mva #3 temp - 962 @ - 963 6CBF 20 14 76 jsr plot - 964 6CC2 A5 61 D0 02 C6 62 + .nowarn dew xdraw - 965 6CCA C6 72 dec temp - 966 6CCC D0 F1 bne @- - 967 - 968 6CCE 18 A5 61 69 02 85 + adw xdraw #2 ; 2 pixels right - 969 6CD9 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down - 970 - 971 ; and last pixel - 972 6CDF 20 14 76 jsr plot - 973 - 974 6CE2 A6 6C ldx TankNr - 975 6CE4 60 rts - 976 .endp - 977 ;-------------------------------------------------- - 978 6CE5 .proc DrawTankEngine - 979 ; X - tank number - 980 ; - 981 ; this proc change xdraw, ydraw and temp! - 982 ;-------------------------------------------------- - 983 ; one pixel under tank - 984 6CE5 18 clc - 985 6CE6 BD 19 44 lda Ytankstable,x - 986 6CE9 69 01 adc #1 - 987 6CEB 85 63 sta ydraw - 988 6CED A9 00 85 64 mva #0 ydraw+1 - 989 6CF1 BD 0D 44 lda XtankstableL,x - 990 6CF4 85 61 sta xdraw - 991 6CF6 BD 13 44 lda XtankstableH,x - 992 6CF9 85 62 sta xdraw+1 - 993 ; clear first pixel under tank - 994 6CFB A9 00 85 A9 mva #0 color - 995 6CFF 20 14 76 jsr plot - 996 6D02 E6 61 D0 02 E6 62 inw xdraw - 997 ; plot 6 random color pixels - 998 6D08 A9 06 85 72 mva #6 temp - 999 6D0C A5 AA @ lda Erase - 1000 6D0E 49 01 eor #%00000001 - 1001 6D10 2D 1B D4 and random - 1002 6D13 29 01 and #%00000001 - 1003 6D15 85 A9 sta color - 1004 6D17 20 14 76 jsr plot - 1005 6D1A E6 61 D0 02 E6 62 inw xdraw - 1006 6D20 C6 72 dec temp - 1007 6D22 D0 E8 bne @- - 1008 ; clear last pixel under tank - 1009 6D24 A9 00 85 A9 mva #0 color - 1010 6D28 20 14 76 jsr plot - 1011 6D2B A6 6C ldx TankNr - 1012 6D2D 60 rts - 1013 .endp - 1014 ;-------------------------------------------------- - 1015 6D2E .proc TankFalls; - 1016 ;-------------------------------------------------- - 1017 6D2E A9 00 lda #0 - 1018 6D30 8D 64 44 sta PreviousFall ; bit 7 - left, bit 6 - right - 1019 6D33 8D 65 44 sta EndOfTheFallFlag - 1020 6D36 85 A8 sta Parachute - 1021 6D38 A9 02 8D 63 44 mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop - 1022 - 1023 ; let's check if the given tank has got the parachute - 1024 6D3D A6 6C ldx TankNr - 1025 6D3F BD FD 43 lda ActiveDefenceWeapon,x - 1026 6D42 C9 23 cmp #ind_Parachute______ ; parachute - 1027 6D44 F0 08 beq ParachuteActive - 1028 6D46 C9 24 cmp #ind_StrongParachute ; strong parachute - 1029 6D48 F0 04 beq ParachuteActive - 1030 6D4A C9 28 cmp #ind_Force_Shield___ ; shield witch energy and parachute - 1031 6D4C D0 02 bne TankFallsX - 1032 6D4E ParachuteActive - 1033 6D4E E6 A8 inc Parachute - 1034 6D50 TankFallsX - 1035 ; sound only if really falls - 1036 6D50 A5 A8 lda Parachute - 1037 6D52 2D 63 44 and FallingSoundBit ; bit 1 - 1038 6D55 F0 09 beq NoFallingSound - 1039 6D57 A9 00 8D 63 44 mva #0 FallingSoundBit - 1040 6D5C A9 0E 85 9E mva #sfx_shield_off sfx_effect - 1041 6D60 NoFallingSound - 1042 ; clear previous position - 1043 6D60 A9 01 85 AA mva #1 Erase - 1044 6D64 20 2C 6A jsr DrawTankNr - 1045 ; and the parachute (if present) - 1046 6D67 A5 A8 lda Parachute - 1047 6D69 29 01 and #01 - 1048 6D6B F0 03 beq DoNotClearParachute - 1049 ; here we clear the parachute - 1050 ; ldx TankNr - 1051 6D6D 20 66 6C jsr DrawTankParachute - 1052 6D70 DoNotClearParachute - 1053 6D70 A9 00 85 AA mva #0 Erase - 1054 ; ldx TankNr - 1055 6D74 AD 65 44 lda EndOfTheFallFlag ; We only get byte below the tank if still falling - 1056 6D77 D0 2C bne NoGroundCheck - 1057 ; coordinates of the first pixel under the tank - 1058 6D79 A6 6C ldx TankNr - 1059 6D7B 20 70 74 jsr SetupXYdraw.X - 1060 6D7E BD 19 44 lda Ytankstable,x - 1061 6D81 18 clc - 1062 6D82 69 01 adc #1 ; in this point the comment helped us! For the very first - 1063 ; time in our lives! Tada! It opens a new chapter!!! - 1064 6D84 85 63 sta ydraw - 1065 ; - 1066 ; UnderTank1 ; byte under tank - 1067 ; UnderTank2 ; byte under tank reversed (for simple check right direction) - 1068 6D86 A9 08 lda #08 - 1069 6D88 85 72 sta temp ; Loop Counter - 1070 6D8A ByteBelowTank - 1071 6D8A 20 5A 76 jsr point_plot - 1072 6D8D F0 06 beq EmptyPoint2 - 1073 6D8F 38 sec - 1074 6D90 66 96 ror UnderTank2 - 1075 6D92 38 sec - 1076 6D93 B0 04 bcs ROLPoint2 - 1077 6D95 EmptyPoint2 - 1078 6D95 18 clc - 1079 6D96 66 96 ror UnderTank2 - 1080 6D98 18 clc - 1081 6D99 ROLPoint2 - 1082 6D99 26 95 rol UnderTank1 - 1083 6D9B E6 61 D0 02 E6 62 inw xdraw - 1084 6DA1 C6 72 dec temp - 1085 6DA3 D0 E5 bne ByteBelowTank - 1086 6DA5 NoGroundCheck - 1087 6DA5 A6 6C ldx TankNr - 1088 6DA7 BD 19 44 lda Ytankstable,x - 1089 6DAA C9 C7 cmp #screenheight-1 ; tank on lowest position (no falling down) - 1090 6DAC 90 03 4C 71 6E jcs EndOfFall - 1091 6DB1 A5 95 lda UnderTank1 - 1092 6DB3 D0 3C bne NoFallingDown - 1093 ; Tank falling down ---- - 1094 6DB5 A5 A8 lda Parachute - 1095 6DB7 29 01 and #1 - 1096 6DB9 D0 05 bne ParachutePresent - 1097 ; decreasing energy - 1098 6DBB A0 02 ldy #2 ; how much energy to substract if no parachute - 1099 6DBD 20 74 57 jsr DecreaseEnergyX - 1100 6DC0 ParachutePresent - 1101 ; check parachute type - 1102 6DC0 BD FD 43 lda ActiveDefenceWeapon,x - 1103 6DC3 C9 24 cmp #ind_StrongParachute ; strong parachute - 1104 6DC5 D0 18 bne OneTimeParachute - 1105 ; decreasing energy of parachute - 1106 6DC7 A0 01 ldy #1 ; how much parachute energy to substract - 1107 6DC9 20 B0 57 jsr DecreaseShieldEnergyX - 1108 6DCC C0 00 cpy #0 ; is necessary to reduce tenk energy ? - 1109 6DCE F0 03 beq @+ - 1110 6DD0 20 74 57 jsr DecreaseEnergyX - 1111 @ - 1112 ; check energy of parachute - 1113 6DD3 BD A8 43 lda ShieldEnergy,x - 1114 6DD6 D0 07 bne OneTimeParachute - 1115 6DD8 A9 00 lda #$00 - 1116 6DDA 85 A8 sta Parachute - 1117 6DDC 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defence - 1118 6DDF OneTimeParachute - 1119 6DDF A5 A8 lda Parachute - 1120 6DE1 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) - 1121 6DE3 85 A8 sta Parachute - 1122 ; tank is falling down - modify coorinates - 1123 6DE5 BD 19 44 lda Ytankstable,x - 1124 6DE8 18 clc - 1125 6DE9 69 01 adc #1 - 1126 6DEB 9D 19 44 sta Ytankstable,x - 1127 6DEE 4C 5A 6E jmp EndOfFCycle - 1128 6DF1 NoFallingDown - 1129 ; check direction (left or right) - 1130 6DF1 A0 06 ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) - 1131 6DF3 B9 33 5C @ lda SlideLeftTable,y - 1132 6DF6 C5 95 cmp UnderTank1 - 1133 6DF8 F0 34 beq FallingLeft - 1134 6DFA C5 96 cmp UnderTank2 - 1135 6DFC F0 05 beq FallingRight - 1136 6DFE 88 dey - 1137 6DFF 10 F2 bpl @- - 1138 6E01 30 54 bmi NoLeftOrRight - 1139 6E03 FallingRight - 1140 ; tank is falling right - 1141 6E03 2C 64 44 bit PreviousFall ; bit 6 - left - 1142 6E06 70 4F bvs EndRightFall - 1143 ; we finish falling right if the tank reached the edge of the screen - 1144 6E08 BD 13 44 lda XtanksTableH,x - 1145 6E0B C9 01 cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank - 1146 6E0D D0 05 bne @+ - 1147 6E0F BD 0D 44 lda XtanksTableL,x - 1148 6E12 C9 36 cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank - 1149 6E14 B0 41 @ bcs EndRightFall - 1150 6E16 NotRightEdge - 1151 ; tank is falling right - modify coorinates - 1152 6E16 18 clc - 1153 6E17 BD 0D 44 lda XtankstableL,x - 1154 6E1A 69 01 adc #1 - 1155 6E1C 9D 0D 44 sta XtankstableL,x - 1156 6E1F BD 13 44 lda XtankstableH,x - 1157 6E22 69 00 adc #0 - 1158 6E24 9D 13 44 sta XtankstableH,x - 1159 6E27 A9 80 8D 64 44 mva #%10000000 PreviousFall ; set bit 7 - right - 1160 6E2C D0 2C bne EndOfFCycle - 1161 6E2E FallingLeft - 1162 ; tank is falling left - 1163 6E2E 2C 64 44 bit PreviousFall ; bit 7 - right - 1164 6E31 30 24 bmi EndLeftFall - 1165 ; we finish falling left if the tank reached the edge of the screen - 1166 6E33 BD 13 44 lda XtanksTableH,x - 1167 6E36 D0 07 bne NotLeftEdge - 1168 6E38 BD 0D 44 lda XtanksTableL,x - 1169 6E3B C9 03 cmp #3 ; 2 pixels correction due to a barrel wider than tank - 1170 6E3D 90 18 bcc EndLeftFall - 1171 6E3F NotLeftEdge - 1172 ; tank is falling left - modify coorinates - 1173 6E3F 38 sec - 1174 6E40 BD 0D 44 lda XtankstableL,x - 1175 6E43 E9 01 sbc #1 - 1176 6E45 9D 0D 44 sta XtankstableL,x - 1177 6E48 BD 13 44 lda XtankstableH,x - 1178 6E4B E9 00 sbc #0 - 1179 6E4D 9D 13 44 sta XtankstableH,x - 1180 6E50 A9 40 8D 64 44 mva #%01000000 PreviousFall ; set bit 6 - left - 1181 6E55 D0 03 bne EndOfFCycle - 1182 6E57 EndLeftFall - 1183 6E57 EndRightFall - 1184 6E57 NoLeftOrRight - 1185 6E57 EE 65 44 inc EndOfTheFallFlag ; after this is shouldn't fall - 1186 6E5A EndOfFCycle - 1187 ; draw tank on new position - 1188 6E5A 20 2C 6A jsr DrawTankNr ; ew have TankNr in X (I hope :) ) - 1189 ; checking is parachute present and if so, draw it - 1190 6E5D A5 A8 lda Parachute - 1191 6E5F C9 03 cmp #3 ; parachute and falling - 1192 6E61 D0 06 bne DoNotDrawParachute - 1193 ; here we draw parachute - 1194 ; ldx TankNr - 1195 6E63 20 66 6C jsr DrawTankParachute - 1196 6E66 20 89 5A jsr WaitOneFrame ; only if tank with parachute - 1197 6E69 RapidFalling - 1198 6E69 DoNotDrawParachute - 1199 6E69 AD 65 44 lda EndOfTheFallFlag - 1200 6E6C D0 03 4C 50 6D jeq TankFallsX - 1201 ; Tank falling down already finished, but it is not sure that - 1202 ; the horizontal coordinate is even. - 1203 ; If it is odd then it must be corrected because otherwise - 1204 ; P/M graphics background would not look OK - 1205 ; ldx TankNr - 1206 ; x correction for P/M - 1207 ; -- - 1208 .IF XCORRECTION_FOR_PM = 1 - 1209 lda XtanksTableL,x - 1210 and #$01 - 1211 beq EndOfFall ; if it is even then it is the end - 1212 ; and if not, we push it one pixel the way it was falling before - 1213 lda #%10000000 ; set "virtual ground" for right falling - 1214 ldy #%00000001 - 1215 bit PreviousFall - 1216 bmi ForceFallLeft - 1217 tay ; tricky - replaces ldy #%10000000 - 1218 lda #%00000001 ; set "virtual ground" for left falling - 1219 ForceFallLeft - 1220 sta UnderTank1 - 1221 sty UnderTank2 - 1222 jmp TankFallsX - 1223 .ENDIF - 1224 ; -- - 1225 6E71 EndOfFall - 1226 6E71 A9 01 85 AA mva #1 Erase - 1227 ; ldx TankNr - 1228 ; if tank was falling down having parachute, - 1229 ; we must deduct one parachute - 1230 6E75 A5 A8 lda Parachute - 1231 6E77 C9 03 cmp #$03 ; was falling down and the parachute - 1232 6E79 D0 0C bne NoParachuteWeapon - 1233 ; first we check type of parachute - 1234 6E7B BD FD 43 lda ActiveDefenceWeapon,x - 1235 6E7E C9 23 cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) - 1236 6E80 D0 05 bne NoParachuteWeapon - 1237 6E82 A9 00 9D FD 43 mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) - 1238 6E87 NoParachuteWeapon - 1239 ; now we clear parachute on the screen if present - 1240 6E87 A5 A8 lda Parachute - 1241 6E89 29 01 and #01 - 1242 6E8B F0 03 beq ThereWasNoParachute - 1243 6E8D 20 66 6C jsr DrawTankParachute - 1244 6E90 ThereWasNoParachute - 1245 6E90 A9 00 85 AA mva #0 Erase - 1246 ; ldx TankNr - 1247 6E94 20 2C 6A jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) - 1248 6E97 A9 15 85 9E mva #sfx_silencer sfx_effect - 1249 6E9B 60 rts - 1250 - 1251 .endp - 1252 - 1253 ;-------------------------------------------------- - 1254 6E9C .proc ClearPMmemory - 1255 ;-------------------------------------------------- - 1256 - 1257 6E9C A9 00 lda #$00 - 1258 6E9E A8 tay - 1259 6E9F 99 00 1B @ sta pmgraph+$300,y - 1260 6EA2 99 00 1C sta pmgraph+$400,y - 1261 6EA5 99 00 1D sta pmgraph+$500,y - 1262 6EA8 99 00 1E sta pmgraph+$600,y - 1263 6EAB 99 00 1F sta pmgraph+$700,y - 1264 6EAE C8 iny - 1265 6EAF D0 EE bne @- - 1266 6EB1 60 rts - 1267 .endp - 1268 - 1269 ;-------------------------------------------------- - 1270 6EB2 .proc drawmountains - 1271 ;-------------------------------------------------- - 1272 6EB2 A9 00 85 61 85 62 mwa #0 xdraw - 1273 6EB8 A9 3E 85 76 A9 46 + mwa #mountaintable modify - 1274 6EC0 A9 01 85 A9 mva #1 color - 1275 - 1276 6EC4 drawmountainsloop - 1277 6EC4 A0 00 ldy #0 - 1278 6EC6 B1 76 lda (modify),y - 1279 6EC8 C9 C8 cmp #screenheight - 1280 6ECA F0 0F beq NoMountain - 1281 6ECC 85 63 sta ydraw - 1282 6ECE 84 64 sty ydraw+1 - 1283 .IF FASTER_GRAF_PROCS = 1 - 1284 ; there was Drawline proc - 1285 lda #screenheight - 1286 sec - 1287 sbc ydraw - 1288 sta tempbyte01 - 1289 jsr plot.MakePlot - 1290 ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) - 1291 ; jmp IntoDraw ; jumps inside Draw routine - 1292 ; because one pixel is already plotted (and who cares? :) ) - 1293 @ - 1294 lda (xbyte),y - 1295 and bittable2,x - 1296 sta (xbyte),y - 1297 ;IntoDraw - 1298 adw xbyte #screenBytes - 1299 dec tempbyte01 - 1300 bne @- - 1301 ; end of Drawline proc - 1302 .ELSE - 1303 ; there was Drawline proc - 1304 6ED0 drawline - 1305 6ED0 20 2C 76 jsr plot.MakePlot - 1306 6ED3 E6 63 inc ydraw - 1307 6ED5 A5 63 lda ydraw - 1308 6ED7 C9 C8 cmp #screenheight - 1309 6ED9 D0 F5 bne drawline - 1310 ; end of Drawline proc - 1311 .ENDIF - 1312 6EDB NoMountain - 1313 6EDB E6 76 D0 02 E6 77 inw modify - 1314 6EE1 E6 61 D0 02 E6 62 inw xdraw - 1315 6EE7 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 1316 6EF1 D0 D1 bne drawmountainsloop - 1317 6EF3 60 rts - 1318 /* - 1319 ;-------------------------------------------------- - 1320 drawmountainspixel ; never used ? - 1321 ;-------------------------------------------------- - 1322 mwa #0 xdraw - 1323 mwa #mountaintable modify - 1324 drawmountainspixelloop - 1325 ldy #0 - 1326 lda (modify),y - 1327 sta ydraw - 1328 sty ydraw+1 - 1329 jsr plot - 1330 inw modify - 1331 inw xdraw - 1332 cpw xdraw #screenwidth - 1333 bne drawmountainspixelloop - 1334 rts - 1335 */ - 1335 - 1336 .endp - 1337 ;-------------------------------------------------- - 1338 6EF4 .proc SoilDown2 - 1339 ;-------------------------------------------------- - 1340 - 1341 ; how it is supposed to work: - 1342 ; first loop is looking for the highest pixels - 1343 ; and fills with their Y coordinates both temporary tables - 1344 ; - 1345 ; second (main) loop works this way: - 1346 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) - 1347 ; goes through the horizontal line checking if - 1348 ; Y coordinate from the first table equals to height of the peak - 1349 ; if so, it goes further - 1350 ; if not: - 1351 ; sets end-of-soil-fall-down-flag to 0 - 1352 ; increases Y from the first table - 1353 ; if there is no pixel there it plots here and - 1354 ; zeroes pixel from the second table and after that - 1355 ; increases Y of the second table - 1356 ; repeats with next pixels au to the end of the line - 1357 ; if the flag is 0 then repeat the main loop - 1358 ; and that's it :) - 1359 ; - 1360 ; I am sorry but after these 4 years I have no idea - 1361 ; how it works. I have just translated Polish comment - 1362 ; but I do not understand a word of it :) - 1363 ; If you know how it works, please write here :)))) - 1364 6EF4 20 0B 6A jsr ClearTanks - 1365 6EF7 NoClearTanks - 1366 - 1367 ; Fix for lonely pixel after nuclear winter :) #103 - 1368 6EF7 A9 00 lda #0 - 1369 6EF9 85 61 sta xdraw - 1370 6EFB 85 62 sta xdraw+1 - 1371 6EFD 85 63 sta ydraw - 1372 6EFF 85 64 sta ydraw+1 - 1373 6F01 85 A9 sta color - 1374 6F03 20 14 76 jsr plot - 1375 - 1376 ; First we look for highest pixels and fill with their coordinates - 1377 ; both tables - 1378 - 1379 6F06 A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw - 1380 6F0E 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp - 1381 6F1B 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 - 1382 - 1383 6F28 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1384 6F32 90 03 4C FC 6F jcs NothingToFall - 1385 - 1386 6F37 NextColumn1 - 1387 6F37 A9 00 85 63 85 64 mwa #0 ydraw - 1388 6F3D NextPoint1 - 1389 6F3D 20 5A 76 jsr point_plot - 1390 6F40 F0 0B beq StillNothing - 1391 6F42 A0 00 ldy #0 - 1392 6F44 A5 63 lda ydraw - 1393 6F46 91 7E sta (tempor2),y - 1394 6F48 91 72 sta (temp),y - 1395 6F4A 4C 5D 6F jmp FoundPeek1 - 1396 6F4D StillNothing - 1397 6F4D E6 63 inc ydraw - 1398 6F4F A5 63 lda ydraw - 1399 6F51 C9 C8 cmp #screenheight - 1400 6F53 D0 E8 bne NextPoint1 - 1401 ; no pixels on whole column !!! - 1402 6F55 A0 00 ldy #0 - 1403 6F57 A5 63 lda ydraw - 1404 6F59 91 7E sta (tempor2),y - 1405 6F5B 91 72 sta (temp),y - 1406 6F5D FoundPeek1 - 1407 6F5D E6 7E D0 02 E6 7F inw tempor2 - 1408 6F63 E6 72 D0 02 E6 73 inw temp - 1409 6F69 E6 61 D0 02 E6 62 inw xdraw - 1410 ;vcmp xdraw,screenwidth,NextColumn1 - 1411 6F6F A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1412 6F79 90 BC bcc NextColumn1 - 1413 6F7B F0 BA beq NextColumn1 - 1414 ; we have both tables filled with starting values - 1415 - 1416 ; main loop starts here - 1417 6F7D MainFallout2 - 1418 6F7D A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw - 1419 6F85 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp - 1420 6F92 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 - 1421 - 1422 6F9F A9 01 85 9D mva #1 IsEndOfTheFallFlag - 1423 6FA3 FalloutOfLine - 1424 6FA3 A0 00 ldy #0 - 1425 - 1426 ; is Y coordinate from the first table - 1427 ; equal to peak height, if so, go ahead - 1428 6FA5 B1 7E lda (tempor2),y - 1429 6FA7 C9 C7 cmp #screenheight-1 ;cmp (temp),y - 1430 6FA9 B0 2B bcs ColumnIsReady - 1431 ; in the other case there are things to be done - 1432 6FAB 84 9D sty IsEndOfTheFallFlag ; flag to 0 - 1433 ; we are increasing Y in the first table - 1434 ;lda (tempor2),y - 1435 6FAD 18 clc - 1436 6FAE 69 01 adc #1 - 1437 6FB0 91 7E sta (tempor2),y - 1438 ; and checking if there is a pixel there - 1439 6FB2 85 63 sta ydraw - 1440 6FB4 20 5A 76 jsr point_plot - 1441 6FB7 D0 1D bne ThereIsPixelHere - 1442 ; if no pixel we plot it - 1443 6FB9 A9 01 85 A9 mva #1 color - 1444 6FBD 20 2C 76 jsr plot.MakePlot - 1445 ; zeroing pixel from the second table - 1446 ; and increase Y in second table - 1447 6FC0 A0 00 ldy #0 - 1448 6FC2 B1 72 lda (temp),y - 1449 6FC4 85 63 sta ydraw - 1450 6FC6 B1 72 lda (temp),y - 1451 6FC8 18 clc - 1452 6FC9 69 01 adc #1 - 1453 6FCB 91 72 sta (temp),y - 1454 6FCD 84 A9 sty color - 1455 6FCF 20 2C 76 jsr plot.MakePlot - 1456 6FD2 A9 15 85 9E mva #sfx_silencer sfx_effect - 1457 - 1458 6FD6 ThereIsPixelHere - 1459 6FD6 ColumnIsReady - 1460 6FD6 E6 72 D0 02 E6 73 inw temp - 1461 6FDC E6 7E D0 02 E6 7F inw tempor2 - 1462 6FE2 E6 61 D0 02 E6 62 inw xdraw - 1463 ;vcmp xdraw,screenwidth,FalloutOfLine - 1464 6FE8 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1465 6FF2 90 AF bcc FalloutOfLine - 1466 6FF4 F0 AD beq FalloutOfLine - 1467 - 1468 6FF6 A5 9D lda IsEndOfTheFallFlag - 1469 ; we repeat untill at some point first table reaches - 1470 ; level of the mountains - 1471 6FF8 F0 83 jeq MainFallout2 - 1472 ; now correct heights are in the mountaintable - 1473 6FFA 85 A9 sta color ; Pozor! :) we know - now A=1 - 1474 6FFC NothingToFall - 1475 6FFC A9 15 85 9E mva #sfx_silencer sfx_effect - 1476 7000 20 12 6A jsr DrawTanks - 1477 7003 60 rts - 1478 .endp - 1479 - 1480 ;-------------------------------------------------- - 1481 7004 .proc calculatemountains - 1482 ;-------------------------------------------------- - 1483 7004 A9 00 85 61 85 62 mwa #0 xdraw - 1484 - 1485 ; starting point - 1486 700A getrandomY ;getting random Y coordinate - 1487 700A 38 sec - 1488 700B AD 1B D4 lda random - 1489 700E C9 28 cmp #screenheight-(margin*4) ;it means that max line=199 - 1490 7010 B0 F8 bcs getrandomY - 1491 7012 18 clc - 1492 7013 69 50 adc #(margin*2) - 1493 7015 85 63 sta ydraw - 1494 7017 8D D3 44 sta yfloat+1 - 1495 701A A9 00 8D D2 44 mva #0 yfloat ;yfloat equals to e.g. 140.0 - 1496 701F A9 9B 8D D3 44 mva #screenheight-margin-5 yfloat+1 - 1497 7024 85 63 sta ydraw - 1498 - 1499 ; how to make nice looking mountains? - 1500 ; randomize points and join them with lines - 1501 ; Here we do it simpler way - we randomize X (or deltaX) - 1502 ; and "delta" (change of Y coordinate) - 1503 - 1504 7026 NextPart - 1505 7026 AD 1B D4 lda random - 1506 7029 2D 4B 41 and mountainDeltaL - 1507 702C 85 C3 sta delta ; it is after the dot (xxx.delta) - 1508 702E AD 1B D4 lda random - 1509 7031 2D 4A 41 and mountainDeltaH ;(max delta) - 1510 7034 85 C4 sta delta+1 ; before the dot (delta+1.delta) - 1511 - 1512 7036 AD 1B D4 lda random - 1513 7039 29 01 and #$01 ;random sign (+/- or up/down) - 1514 703B 8D D5 44 sta UpNdown - 1515 - 1516 ; theoretically we have here ready - 1517 ; fixed-point delta value - 1518 ; (-1*(UpNdown))*(delta+1.delta) - 1519 - 1520 ;loop drawing one line - 1521 - 1522 703E ChangingDirection - 1523 703E AD 1B D4 lda random ;length of the line - 1524 7041 29 0F and #$0f ;max line length - 1525 7043 AA tax - 1526 7044 E8 inx - 1527 7045 E8 inx - 1528 7046 E8 inx - 1529 7047 8E D4 44 stx deltaX - 1530 - 1531 704A OnePart - 1532 704A 20 E6 69 jsr placeTanks.CheckTank - 1533 ; checks if at a given X coordinate - 1534 ; is any tank and if so - 1535 ; changes parameters of drawing - 1536 ; to generate flat 8 pixels - 1537 ; (it will be the place for the tank) - 1538 ; it also stores Y position of the tank - 1539 704D 18 A5 61 69 3E 85 + adw xdraw #mountaintable modify - 1540 - 1541 705A A5 63 lda ydraw - 1542 705C A0 00 ldy #0 - 1543 705E 91 76 sta (modify),y - 1544 - 1545 ; Up or Down - 1546 7060 AD D5 44 lda UpNdown - 1547 7063 F0 20 beq ToBottom - 1548 - 1549 7065 ToTop ;it means substracting - 1550 - 1551 7065 38 AD D2 44 E5 C3 + sbw yfloat delta - 1552 7076 AD D3 44 lda yfloat+1 - 1553 7079 C9 28 cmp #margin - 1554 707B B0 25 bcs @+ - 1555 ; if smaller than 10 - 1556 707D A2 00 ldx #$00 - 1557 707F 8E D5 44 stx UpNdown - 1558 7082 4C A2 70 jmp @+ - 1559 - 1560 7085 ToBottom - 1561 7085 18 AD D2 44 65 C3 + adw yfloat delta - 1562 7096 AD D3 44 lda yfloat+1 - 1563 7099 C9 A0 cmp #screenheight-margin - 1564 709B 90 05 bcc @+ - 1565 ; if higher than screen - 1566 709D A2 01 ldx #$01 - 1567 709F 8E D5 44 stx UpNdown - 1568 @ - 1569 70A2 85 63 sta ydraw - 1570 - 1571 70A4 E6 61 D0 02 E6 62 inw xdraw - 1572 - 1573 70AA A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 1574 70B4 F0 08 beq EndDrawing - 1575 - 1576 70B6 CE D4 44 dec deltaX - 1577 70B9 D0 8F bne OnePart - 1578 - 1579 70BB 4C 26 70 jmp NextPart - 1580 70BE EndDrawing - 1581 - 1582 70BE 60 rts - 1583 .endp - 1584 - 1585 /* - 1586 ;-------------------------------------------------- - 1587 .proc calculatemountains0 - 1588 ; Only for testing - makes ground flat (0 pixels) - 1589 ; and places tanks on it - 1590 ; remember to remove in final compilation :) - 1591 ;-------------------------------------------------- - 1592 mwa #0 xdraw - 1593 nextPointDrawing - 1594 adw xdraw #mountaintable modify - 1595 lda #screenheight - 1596 ldy #0 - 1597 sta (modify),y - 1598 inw xdraw - 1599 cpw xdraw #screenwidth - 1600 bne nextPointDrawing - 1601 ldx NumberOfPlayers - 1602 dex - 1603 SetYofNextTank - 1604 lda #screenheight-1 - 1605 sta ytankstable,x - 1606 dex - 1607 bpl SetYofNextTank - 1608 rts - 1609 .endp - 1610 */ - 1610 - 1611 - 1612 ;-------------------------------------------------- - 1613 70BF .proc CheckMaxMountain - 1614 ; in A return y coordinate of highest mountain - 1615 ;-------------------------------------------------- - 1616 70BF A9 3E 85 76 A9 46 + mwa #mountaintable modify - 1617 70C7 A0 00 ldy #0 - 1618 70C9 A2 C7 ldx #screenheight-1 - 1619 70CB nextPointChecking - 1620 70CB 8A txa - 1621 70CC D1 76 cmp (modify),y - 1622 70CE 90 03 bcc NotHigher - 1623 70D0 B1 76 lda (modify),y - 1624 70D2 AA tax - 1625 70D3 NotHigher - 1626 70D3 E6 76 D0 02 E6 77 inw modify - 1627 70D9 A5 77 C9 47 D0 04 + cpw modify #(mountaintable+screenwidth) - 1628 70E3 D0 E6 bne nextPointChecking - 1629 70E5 8A txa - 1630 70E6 60 rts - 1631 .endp - 1632 - 1633 - 1634 ;-------------------------------------------------- - 1635 70E7 .proc TypeChar - 1636 ; puts char on the graphics screen - 1637 ; in: CharCode - 1638 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) - 1639 ;-------------------------------------------------- - 1640 ; char to the table - 1641 70E7 A5 69 lda CharCode - 1642 70E9 85 6A sta fontind - 1643 70EB A9 00 lda #$00 - 1644 70ED 85 6B sta fontind+1 - 1645 ; char intex times 8 - 1646 70EF aslw fontind -Macro: ASLW [Source: MACRO.ASM] - 1 70EF 06 6A ASL FONTIND - 2 70F1 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1647 70F3 rolw fontind -Macro: ROLW [Source: MACRO.ASM] - 1 70F3 26 6A ROL FONTIND - 2 70F5 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1648 70F7 rolw fontind -Macro: ROLW [Source: MACRO.ASM] - 1 70F7 26 6A ROL FONTIND - 2 70F9 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1649 - 1650 70FB 18 A5 6A 69 46 85 + adw fontind #TankFont - 1651 - 1652 ; and 8 bytes to the table - 1653 7108 A0 07 ldy #7 - 1654 710A CopyChar - 1655 710A B1 6A lda (fontind),y - 1656 710C 49 FF eor #$ff - 1657 710E 99 C0 44 sta char1,y - 1658 7111 A9 FF lda #$ff - 1659 7113 99 C8 44 sta char2,y - 1660 7116 88 dey - 1661 7117 10 F1 bpl CopyChar - 1662 ; and 8 subsequent bytes as a mask - 1663 7119 18 A5 6A 69 08 85 + adw fontind #8 - 1664 7124 A0 07 ldy #7 - 1665 7126 CopyMask - 1666 7126 B1 6A lda (fontind),y - 1667 7128 49 FF eor #$ff - 1668 712A 99 B0 44 sta mask1,y - 1669 712D A9 00 lda #$00 - 1670 712F 99 B8 44 sta mask2,y - 1671 7132 88 dey - 1672 7133 10 F1 bpl CopyMask - 1673 - 1674 .IF FASTER_GRAF_PROCS = 1 - 1675 ; calculating coordinates from xdraw and ydraw - 1676 mwa xdraw xbyte - 1677 - 1678 lda xbyte - 1679 and #$7 - 1680 sta ybit - 1681 - 1682 lsrw xbyte ; div 8 - 1683 rorw xbyte - 1684 rorw xbyte - 1685 ;--- - 1686 ldy xbyte - 1687 - 1688 lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? - 1689 sec - 1690 sbc #7 - 1691 tax - 1692 - 1693 lda linetableL,x - 1694 sta xbyte - 1695 lda linetableH,x - 1696 sta xbyte+1 - 1697 ; mask preparation and character shifting - 1698 ldx ybit - 1699 beq MaskOK00 - 1700 MakeMask00 - 1701 .rept 8 - 1702 lsr mask1+# - 1703 ror mask2+# - 1704 .endr - 1705 sec - 1706 .rept 8 - 1707 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 1708 ror char2+# - 1709 .endr - 1710 dex - 1711 bne MakeMask00 - 1712 MaskOK00 - 1713 ; here x=0 - 1714 lda Erase - 1715 beq CharLoopi ; it works, because x=0 - 1716 lda #$ff - 1717 ldx #7 - 1718 EmptyChar - 1719 sta char1,x - 1720 sta char2,x - 1721 dex - 1722 bpl EmptyChar - 1723 ldx #0 - 1724 CharLoopi - 1725 lda (xbyte),y - 1726 ora mask1,x - 1727 and char1,x - 1728 sta (xbyte),y - 1729 iny - 1730 lda (xbyte),y - 1731 ora mask2,x - 1732 and char2,x - 1733 sta (xbyte),y - 1734 dey - 1735 adw xbyte #screenBytes - 1736 inx - 1737 cpx #8 - 1738 bne CharLoopi - 1739 .ELSE - 1740 7135 A2 07 86 72 mvx #7 temp ; line counter (Y) - 1741 7139 CharLoop1 - 1742 7139 A9 07 85 73 mva #7 temp+1 ; pixel counter (X) - 1743 713D CharLoop2 - 1744 713D A9 00 85 A9 mva #0 color - 1745 7141 3E B0 44 rol mask1,x - 1746 7144 90 38 bcc NoMaskNoPlot - 1747 7146 3E C0 44 rol char1,x - 1748 7149 B0 06 bcs NoPlot - 1749 714B MakeCharPlot - 1750 714B A5 AA lda Erase - 1751 714D D0 02 bne ErasingChar - 1752 714F E6 A9 inc color - 1753 7151 ErasingChar - 1754 7151 NoPlot - 1755 7151 20 2C 76 jsr plot.MakePlot - 1756 7154 AfterCharPlot - 1757 7154 E6 61 D0 02 E6 62 inw xdraw - 1758 715A A6 72 ldx temp - 1759 715C C6 73 dec temp+1 - 1760 715E 10 DD bpl CharLoop2 - 1761 7160 38 sec - 1762 7161 38 A5 61 E9 08 85 + sbw xdraw #8 - 1763 716C C6 63 dec ydraw - 1764 716E A6 72 ldx temp - 1765 7170 CA dex - 1766 7171 86 72 stx temp - 1767 7173 10 C4 bpl CharLoop1 - 1768 7175 18 clc - 1769 7176 A5 63 lda ydraw - 1770 7178 69 08 adc #8 - 1771 717A 85 63 sta ydraw - 1772 717C D0 06 bne EndPutChar - 1773 717E NoMaskNoPlot - 1774 717E 3E C0 44 rol char1,x - 1775 7181 4C 54 71 jmp AfterCharPlot - 1776 .ENDIF - 1777 7184 EndPutChar - 1778 7184 60 rts - 1779 .endp - 1780 - 1781 ;-------------------------------------------------- - 1782 7185 .proc PutChar4x4 - 1783 ; puts 4x4 pixels char on the graphics screen - 1784 ; in: dx, dy (LOWER left corner of the char) - 1785 ; in: CharCode4x4 (.sbyte) - 1786 ; in: plot4x4color (0/255) - 1787 ; all pixels are being drawn - 1788 ; (empty and not empty) - 1789 ;-------------------------------------------------- - 1790 7185 A5 8E C9 00 D0 04 + cpw dy #(screenheight-1) - 1791 718F B0 F3 jcs TypeChar.EndPutChar ;nearest RTS - 1792 7191 A5 8E C9 00 D0 04 + cpw dy #(4) - 1793 719B 90 E7 jcc TypeChar.EndPutChar ;nearest RTS - 1794 719D A5 8C C9 01 D0 04 + cpw dx #(screenwidth-4) - 1795 71A7 B0 DB jcs TypeChar.EndPutChar ;nearest RTS - 1796 ; checks ommited. - 1797 ; char to the table - 1798 71A9 AD EC 48 lda CharCode4x4 - 1799 71AC 29 01 and #%00000001 - 1800 71AE F0 02 beq Upper4bits - 1801 71B0 A9 FF lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) - 1802 71B2 Upper4bits - 1803 71B2 8D EB 48 sta nibbler4x4 - 1804 71B5 AD EC 48 lda CharCode4x4 - 1805 71B8 4A lsr - 1806 71B9 85 6A sta fontind - 1807 71BB A9 00 lda #$00 - 1808 71BD 85 6B sta fontind+1 - 1809 - 1810 71BF 18 A5 6A 69 C6 85 + adw fontind #font4x4 - 1811 - 1812 ; and 4 bytes to the table - 1813 71CC A0 00 ldy #0 - 1814 71CE A2 03 ldx #3 - 1815 71D0 CopyChar - 1816 71D0 B1 6A lda (fontind),y ; Y must be 0 !!!! - 1817 71D2 2C EB 48 bit nibbler4x4 - 1818 71D5 10 04 bpl GetUpper4bits - 1819 71D7 2A 2A 2A 2A :4 rol - 1820 71DB GetUpper4bits - 1821 71DB 09 0F ora #$0f - 1822 71DD 9D C0 44 sta char1,x - 1823 71E0 A9 FF lda #$ff - 1824 71E2 9D C8 44 sta char2,x - 1825 ; and 4 bytes as a mask - 1826 71E5 A9 F0 lda #$f0 - 1827 71E7 9D B0 44 sta mask1,x - 1828 71EA A9 00 lda #$00 - 1829 71EC 9D B8 44 sta mask2,x - 1830 71EF 18 A5 6A 69 20 85 + adw fontind #32 ; next byte of 4x4 font - 1831 71FA CA dex - 1832 71FB 10 D3 bpl CopyChar - 1833 - 1834 .IF FASTER_GRAF_PROCS = 1 - 1835 ; calculating coordinates from xdraw and ydraw - 1836 mwa dx xbyte - 1837 - 1838 lda xbyte - 1839 and #$7 - 1840 sta ybit - 1841 - 1842 :3 lsrw xbyte ; div 8 - 1843 ; rorw xbyte - 1844 ; rorw xbyte - 1845 ;--- - 1846 ldy xbyte ; horizontal byte offet stored in Y - 1847 lda dy ; y = y - 3 because left lower. - 1848 sec - 1849 sbc #3 - 1850 tax - 1851 - 1852 lda linetableL,x - 1853 sta xbyte - 1854 lda linetableH,x - 1855 sta xbyte+1 - 1856 ; mask preparation and character shifting - 1857 ldx ybit - 1858 beq MaskOK01 - 1859 MakeMask01 - 1860 .rept 4 - 1861 lsr mask1+# - 1862 ror mask2+# - 1863 .endr - 1864 sec - 1865 .rept 4 - 1866 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 1867 ror char2+# - 1868 .endr - 1869 dex - 1870 bne MakeMask01 - 1871 MaskOK01 - 1872 ldx #0 - 1873 CharLoopi4x4 - 1874 lda (xbyte),y - 1875 ora mask1,x - 1876 bit plot4x4color - 1877 bpl PutInColor0_1 ; only mask - no char - 1878 and char1,x - 1879 PutInColor0_1 - 1880 sta (xbyte),y - 1881 iny - 1882 lda (xbyte),y - 1883 ora mask2,x - 1884 bit plot4x4color - 1885 bpl PutInColor0_2 ; only mask - no char - 1886 and char2,x - 1887 PutInColor0_2 - 1888 sta (xbyte),y - 1889 dey - 1890 adw xbyte #screenBytes - 1891 inx - 1892 cpx #4 - 1893 bne CharLoopi4x4 - 1894 .ELSE - 1895 71FD A5 61 8D C8 44 A5 + mwa xdraw char2 - 1896 7207 A5 63 8D B8 44 A5 + mwa ydraw mask2 - 1897 7211 A5 A9 8D BA 44 mva color mask2+2 - 1898 7216 A5 8B 85 61 A5 8C + mwa dx xdraw - 1899 721E A5 8D 85 63 A5 8E + mwa dy ydraw - 1900 7226 A2 03 86 72 mvx #3 temp ; line counter (Y) - 1901 722A CharLoop1 - 1902 722A A9 03 85 73 mva #3 temp+1 ; pixel counter (X) - 1903 722E CharLoop2 - 1904 722E A9 00 85 A9 mva #0 color - 1905 7232 3E B0 44 rol mask1,x - 1906 7235 90 4A bcc NoMaskNoPlot - 1907 7237 3E C0 44 rol char1,x - 1908 723A B0 06 bcs NoPlot - 1909 723C MakeCharPlot - 1910 723C A5 DB lda plot4x4color - 1911 723E F0 02 beq ErasingChar - 1912 7240 E6 A9 inc color - 1913 7242 ErasingChar - 1914 7242 NoPlot - 1915 7242 20 2C 76 jsr plot.MakePlot - 1916 7245 AfterCharPlot - 1917 7245 E6 61 D0 02 E6 62 inw xdraw - 1918 724B A6 72 ldx temp - 1919 724D C6 73 dec temp+1 - 1920 724F 10 DD bpl CharLoop2 - 1921 7251 38 sec - 1922 7252 38 A5 61 E9 04 85 + sbw xdraw #4 - 1923 725D C6 63 dec ydraw - 1924 725F A6 72 ldx temp - 1925 7261 CA dex - 1926 7262 86 72 stx temp - 1927 7264 10 C4 bpl CharLoop1 - 1928 7266 AD C8 44 85 61 AD + mwa char2 xdraw - 1929 7270 AD B8 44 85 63 AD + mwa mask2 ydraw - 1930 727A AD BA 44 85 A9 mva mask2+2 color - 1931 727F 10 06 bpl EndPut4x4 - 1932 7281 NoMaskNoPlot - 1933 7281 3E C0 44 rol char1,x - 1934 7284 4C 45 72 jmp AfterCharPlot - 1935 .ENDIF - 1936 7287 EndPut4x4 - 1937 7287 60 rts - 1938 .endp - 1939 - 1940 ;-------------------------------------------------------- - 1941 7288 .proc DisplayOffensiveTextNr ; - 1942 7288 AE C0 48 ldx TextNumberOff - 1943 728B BD 2B 9F lda talk.OffensiveTextTableL,x - 1944 728E 85 B3 sta LineAddress4x4 - 1945 7290 BD A0 9F lda talk.OffensiveTextTableH,x - 1946 7293 85 B4 sta LineAddress4x4+1 - 1947 7295 E8 inx ; the next text - 1948 7296 BD A0 9F lda talk.OffensiveTextTableH,x - 1949 7299 85 73 sta temp+1 - 1950 729B BD 2B 9F lda talk.OffensiveTextTableL,x - 1951 729E 85 72 sta temp ; opty possible - 1952 ; substract address of the next text from previous to get text length - 1953 72A0 38 A5 72 E5 B3 85 + sbw temp LineAddress4x4 temp2 - 1954 72AD A5 74 85 83 mva temp2 fx - 1955 - 1956 ;jsr Display4x4AboveTank - 1957 ;rts - 1958 ; POZOR !!! - 1959 .endp - 1960 - 1961 ;-------------------------------------------------------- - 1962 72B1 .proc Display4x4AboveTank ; - 1963 ; Displays texts using PutChar4x4 above tank and mountains. - 1964 ; Pretty cool, eh! - 1965 ;parameters are: - 1966 ;Y - number of tank above which text is displayed - 1967 ;fx - length of text - 1968 ;LineAddress4x4 - address of the text - 1969 - 1970 ;lets calculate position of the text first! - 1971 ;that's easy because we have number of tank - 1972 ;and xtankstableL and H keep X position of a given tank - 1973 - 1974 72B1 B9 0D 44 lda xtankstableL,y - 1975 72B4 85 72 sta temp - 1976 72B6 B9 13 44 lda xtankstableH,y - 1977 72B9 85 73 sta temp+1 - 1978 ;now we should substract length of the text-1 - 1979 ;temp2 = (fx-1)*2 - 1980 72BB A4 83 ldy fx - 1981 72BD 88 dey - 1982 72BE 98 tya - 1983 72BF 0A asl - 1984 72C0 85 74 sta temp2 - 1985 72C2 A9 00 85 75 mva #0 temp2+1 - 1986 ;now we have HALF length in pixels - 1987 ;stored in temp2 - 1988 - 1989 ;here we assume max length of text - 1990 ;to display is 127 chars, but later it turns out it must be max 63! - 1991 - 1992 72C6 38 A5 72 E5 74 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!! - 1993 ;now we should check overflows - 1994 ;lda temp+1 ; opty - 1995 72D3 10 08 bpl DOTNnotLessThanZero - 1996 ;less than zero, so should be zero - 1997 72D5 A9 00 85 72 85 73 mwa #0 temp - 1998 72DB F0 32 beq DOTNnoOverflow - 1999 - 2000 72DD DOTNnotLessThanZero - 2001 ;so check if end larger than screenwidth - 2002 - 2003 - 2004 72DD A5 83 lda fx - 2005 72DF 0A asl - 2006 72E0 0A asl - 2007 ;length in pixels - - 2008 ;text length max 63 chars !!!!!!!! - 2009 - 2010 - 2011 72E1 18 clc - 2012 72E2 65 72 adc temp - 2013 72E4 85 74 sta temp2 - 2014 72E6 A9 00 lda #0 - 2015 72E8 65 73 adc temp+1 - 2016 72EA 85 75 sta temp2+1 - 2017 ;now in temp2 is end of the text in pixels - 2018 ;so check if not greater than screenwitdth - 2019 72EC A5 75 C9 01 D0 04 + cpw temp2 #screenwidth - 2020 72F6 90 17 bcc DOTNnoOverflow - 2021 - 2022 ;if end is greater than screenwidth - 2023 ;then screenwidth - length is fine - 2024 72F8 A5 83 lda fx - 2025 72FA 0A asl - 2026 72FB 0A asl - 2027 72FC 85 72 sta temp - 2028 72FE A9 00 85 73 mva #0 temp+1 - 2029 - 2030 7302 38 sec - 2031 7303 A9 3F lda #<(screenwidth-1) - 2032 7305 E5 72 sbc temp - 2033 7307 85 72 sta temp - 2034 7309 A9 01 lda #>(screenwidth-1) - 2035 730B E5 73 sbc temp+1 - 2036 730D 85 73 sta temp+1 - 2037 730F DOTNnoOverflow - 2038 ;here in temp we have really good x position of text - 2039 - 2040 730F A5 72 85 D9 A5 73 + mwa temp LineXdraw - 2041 - 2042 ;now let's get y position - 2043 ;we will try to put text as low as possible - 2044 ;just above mountains (so mountaintable will be checked) - 2045 7317 A5 83 lda fx - 2046 7319 0A asl - 2047 731A 0A asl - 2048 731B A8 tay - 2049 ;in temp there still is X position of text - 2050 ;if we add temp and Y we will get end of the text - 2051 ;so, lets go through mountaintable and look for - 2052 ;the lowest value within - 2053 ;Mountaitable+temp and Mountaitable+temp+Y - 2054 - 2055 731C 18 A5 72 69 3E 85 + adw temp #MountainTable - 2056 - 2057 7329 A9 C8 85 74 mva #screenheight temp2 ;initialisation of the lowest value - 2058 - 2059 732D DOTLowestMountainValueLoop - 2060 732D B1 72 lda (temp),y - 2061 732F C5 74 cmp temp2 - 2062 7331 B0 02 bcs DOTOldLowestValue ;old lowest value - 2063 ;new lowest value - 2064 7333 85 74 sta temp2 - 2065 7335 DOTOldLowestValue - 2066 7335 88 dey - 2067 7336 C0 FF cpy #$ff - 2068 7338 D0 F3 bne DOTLowestMountainValueLoop - 2069 - 2070 733A 38 sec - 2071 733B A5 74 lda temp2 - 2072 733D E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...) - 2073 733F 85 D8 sta LineYdraw - 2074 - 2075 7341 4C 76 73 jmp TypeLine4x4.noLengthNoColor ; rts - 2076 - 2077 .endp - 2078 - 2079 ;-------------------------------------------------------- - 2080 7344 .proc DisplayTankNameAbove ; - 2081 7344 A5 6C lda tankNr - 2082 7346 0A 0A 0A :3 asl ; *8 - 2083 7349 18 clc - 2084 734A 69 09 adc #Tanksnames - 2088 7352 85 73 sta temp+1 ; TextAddress+1 - 2089 7354 A5 72 85 B3 A5 73 + mwa temp LineAddress4x4 - 2090 - 2091 ;find length of the tank's name - 2092 735C A0 07 ldy #7 - 2093 @ - 2094 735E B1 72 lda (temp),y - 2095 7360 D0 03 bne end_found - 2096 7362 88 dey - 2097 7363 D0 F9 bne @- - 2098 - 2099 7365 end_found - 2100 7365 C8 iny - 2101 7366 84 83 sty fx - 2102 7368 A4 6C ldy tankNr - 2103 736A 20 B1 72 jsr Display4x4AboveTank - 2104 736D 60 rts - 2105 .endp - 2106 - 2107 ;------------------------------- - 2108 736E .proc TypeLine4x4 ; - 2109 ;------------------------------- - 2110 ;this routine prints line of length `fx` - 2111 ;address in LineAddress4x4 - 2112 ;starting from LineXdraw, LineYdraw - 2113 - 2114 736E A9 0E lda #14 ; default length of 4x4 texts - 2115 7370 85 83 sta fx - 2116 - 2117 7372 variableLength - 2118 7372 A9 FF lda #$ff ; $ff - visible characters, $00 - clearing - 2119 - 2120 7374 staplot4x4color - 2121 7374 85 DB sta plot4x4color - 2122 7376 noLengthNoColor - 2123 - 2124 7376 A0 00 ldy #0 - 2125 7378 8C E9 48 sty LineCharNr - 2126 - 2127 737B TypeLine4x4Loop - 2128 737B AC E9 48 ldy LineCharNr - 2129 - 2130 737E B1 B3 lda (LineAddress4x4),y - 2131 7380 29 3F and #$3f ;always CAPITAL letters - 2132 7382 8D EC 48 sta CharCode4x4 - 2133 7385 A5 D9 85 8B A5 DA + mwa LineXdraw dx - 2134 738D A5 D8 85 8D mva LineYdraw dy - 2135 7391 A9 00 85 8E mva #0 dy+1 ; dy is 2 bytes value - 2136 7395 20 85 71 jsr PutChar4x4 ;type empty pixels as well! - 2137 7398 18 A5 D9 69 04 85 + adw LineXdraw #4 - 2138 73A3 EE E9 48 AD E9 48 inc:lda LineCharNr - 2139 73A9 C5 83 cmp fx - 2140 73AB D0 CE bne TypeLine4x4Loop - 2141 - 2142 73AD EndOfTypeLine4x4 - 2143 73AD 60 rts - 2144 .endp - 2145 - 2146 - 2147 ;-------------------------------- - 2148 73AE .proc AreYouSure - 2149 ;using 4x4 font - 2150 - 2151 73AE A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen - 2152 - 2153 ;top frame - 2154 73B2 A5 B2 85 D8 mva ResultY LineYdraw - 2155 73B6 20 E8 65 jsr TL4x4_top - 2156 73B9 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2157 - 2158 ;sure? - 2159 73C0 A9 5D 85 B3 A9 5B + mwa #areYouSureText LineAddress4x4 - 2160 73C8 20 02 74 jsr _sep_opty - 2161 ;bottom frame - 2162 73CB A5 B2 85 D8 mva ResultY LineYdraw - 2163 73CF 20 D5 65 jsr TL4x4_bottom - 2164 - 2165 - 2166 73D2 20 5F 5A jsr GetKey - 2167 73D5 C9 2B cmp #@kbcode._Y ; $2b ; "Y" - 2168 73D7 D0 06 bne @+ - 2169 73D9 A9 80 85 D7 mva #$80 escFlag - 2170 73DD D0 04 bne skip01 - 2171 73DF A9 00 85 D7 @ mva #0 escFlag - 2172 73E3 skip01 - 2173 73E3 20 71 5A jsr WaitForKeyRelease - 2174 - 2175 ;clean - 2176 73E6 A9 03 85 91 mva #3 di - 2177 73EA A9 04 85 B2 mva #4 ResultY - 2178 @ - 2179 73EE A9 FF 85 DB mva #$ff plot4x4color - 2180 73F2 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 - 2181 73FA 20 02 74 jsr _sep_opty - 2182 73FD C6 91 dec di - 2183 73FF D0 ED bne @- - 2184 - 2185 7401 quit_areyousure - 2186 7401 60 rts - 2187 .endp - 2188 - 2189 7402 .proc _sep_opty - 2190 7402 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering - 2191 740A A5 B2 85 D8 mva ResultY LineYdraw - 2192 740E 20 6E 73 jsr TypeLine4x4 - 2193 7411 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2194 7418 60 rts - 2195 .endp - 2196 - 2197 ;-------------------------------- - 2198 7419 .proc DisplaySeppuku - 2199 ;using 4x4 font - 2200 - 2201 - 2202 7419 A9 14 85 89 mva #20 fs ; temp, how many times blink the billboard - 2203 741D seppuku_loop - 2204 741D A5 02 lda CONSOL ; turbo mode - 2205 741F 29 01 and #%00000001 ; START KEY - 2206 7421 D0 04 A9 01 85 89 sne:mva #1 fs ; finish it - 2207 - 2208 7427 A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen - 2209 - 2210 ;top frame - 2211 742B A5 B2 85 D8 mva ResultY LineYdraw - 2212 742F 20 E8 65 jsr TL4x4_top - 2213 7432 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2214 - 2215 ;seppuku - 2216 7439 A9 4F 85 B3 A9 5B + mwa #seppukuText LineAddress4x4 - 2217 7441 20 02 74 jsr _sep_opty - 2218 - 2219 ;bottom frame - 2220 7444 A5 B2 85 D8 mva ResultY LineYdraw - 2221 7448 20 D5 65 jsr TL4x4_bottom ; just go - 2222 - 2223 ;clean seppuku - 2224 - 2225 744B A9 03 85 91 mva #3 di - 2226 ;mva #4 ResultY - 2227 744F A9 04 lda #4 - 2228 7451 85 B2 sta ResultY - 2229 7453 loplop ;@ - 2230 7453 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 - 2231 745B 20 02 74 jsr _sep_opty - 2232 - 2233 745E C6 91 dec di - 2234 7460 D0 F1 bne loplop ;@- - 2235 - 2236 7462 C6 89 dec fs - 2237 7464 D0 B7 jne seppuku_loop - 2238 - 2239 7466 quit_seppuku - 2240 7466 60 rts - 2241 - 2242 .endp - 2243 - 2244 ; ------------------------------------- - 2245 7467 .proc SetupXYdraw - 2246 7467 BD 19 44 lda ytankstable,x - 2247 746A 85 63 sta ydraw - 2248 746C A9 00 85 64 mva #0 ydraw+1 - 2249 7470 BD 0D 44 X lda XtanksTableL,x - 2250 7473 85 61 sta xdraw - 2251 7475 BD 13 44 lda XtanksTableH,x - 2252 7478 85 62 sta xdraw+1 - 2253 747A 60 rts - 2254 .endp - 2255 ;-------------------------------------------------- - 2256 747B .proc DrawBarrel - 2257 ; X - tankNr - 2258 ; changes xdraw, ydraw, fx, fy - 2259 ;-------------------------------------------------- - 2260 ;vx calculation - 2261 ;vx = sin(90-Angle) for Angle <=90 - 2262 ;vx = -sin(Angle-90) for 90 < Angle <= 180 - 2263 - 2264 ; erase previous barrel - 2265 - 2266 ;cos(Angle) (but we use sin table only so some shenanigans happen) - 2267 ; mva #0 color - 2268 ; lda previousBarrelAngle,x - 2269 ; sta Angle - 2270 ; jsr DrawBarrelTech - 2271 ; - 2272 ; mva #1 color - 2273 747B A6 6C ldx TankNr - 2274 747D 20 67 74 jsr SetupXYdraw - 2275 7480 BD F1 43 lda BarrelLength,x - 2276 7483 85 8A sta yc ; current tank barrel length - 2277 7485 BD C3 48 lda angleTable,x - 2278 7488 85 A7 sta Angle - 2279 748A 20 8E 74 jsr DrawBarrelTech - 2280 748D 60 rts - 2281 .endp - 2282 - 2283 748E .proc DrawBarrelTech - 2284 ; angle in Angle and A - 2285 - 2286 748E A2 00 86 E6 mvx #0 goleft - 2287 7492 C9 5B cmp #91 - 2288 7494 90 17 bcc angleUnder90 - 2289 - 2290 ;over 90 - 2291 7496 38 sec - 2292 7497 E9 5A sbc #90 - 2293 7499 AA tax - 2294 ; barrel start offset over 90deg - 2295 749A 18 A5 61 69 04 85 + adw xdraw #4 xdraw - 2296 74A7 A9 01 85 E6 mva #1 goleft - 2297 74AB 10 13 bpl @+ ; jmp @+ - 2298 - 2299 74AD angleUnder90 - 2300 74AD 38 sec ; X = 90-Angle - 2301 74AE A9 5A lda #90 - 2302 74B0 E5 A7 sbc Angle - 2303 74B2 AA tax - 2304 ; barrel start offset under 90deg - 2305 74B3 18 A5 61 69 03 85 + adw xdraw #3 xdraw - 2306 - 2307 @ - 2308 74C0 38 A5 63 E9 03 85 + sbw ydraw #3 ydraw - 2309 74CD BD C1 5B lda sintable,x ; cos(X) - 2310 74D0 85 BB sta vx - 2311 - 2312 ;======vy - 2313 ;vy = sin(Angle) for Angle <=90 - 2314 ;vy = sin(180-Angle) for 90 < Angle <= 180 - 2315 - 2316 ;-- - 2317 74D2 A5 A7 lda Angle - 2318 74D4 C9 5B cmp #91 - 2319 74D6 90 05 bcc YangleUnder90 - 2320 - 2321 74D8 A9 B4 lda #180 - 2322 74DA 38 sec - 2323 74DB E5 A7 sbc Angle - 2324 74DD YangleUnder90 - 2325 74DD AA tax - 2326 74DE BD C1 5B lda sintable,x - 2327 74E1 85 B7 sta vy - 2328 - 2329 74E3 A9 00 lda #0 ; all arithmetic to zero - 2330 74E5 85 BC sta vx+1 - 2331 74E7 85 B8 sta vy+1 - 2332 74E9 A9 80 lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) - 2333 74EB 85 83 sta fx - 2334 74ED 85 86 sta fy - 2335 - 2336 ; draw by vx vy - 2337 ; in each step - 2338 ; 1. plot(xdraw, ydraw) - 2339 ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy - 2340 ; 3 check length, if shorter, go to 1. - 2341 - 2342 ; mva #6 yc ; barrel length - 2343 74EF barrelLoop - 2344 - 2345 74EF A5 E6 lda goleft - 2346 74F1 D0 16 bne goright - 2347 74F3 18 clc - 2348 74F4 A5 83 lda fx - 2349 74F6 65 BB adc vx - 2350 74F8 85 83 sta fx - 2351 74FA 90 0A bcc @+ - 2352 74FC A5 61 lda xdraw - 2353 74FE 65 BC adc vx+1 - 2354 7500 85 61 sta xdraw - 2355 7502 90 02 bcc @+ - 2356 7504 E6 62 inc xdraw+1 - 2357 @ - 2358 7506 4C 1C 75 jmp ybarrel - 2359 7509 goright - 2360 7509 38 sec - 2361 750A A5 83 lda fx - 2362 750C E5 BB sbc vx - 2363 750E 85 83 sta fx - 2364 7510 B0 0A bcs @+ - 2365 7512 A5 61 lda xdraw - 2366 7514 E5 BC sbc vx+1 - 2367 7516 85 61 sta xdraw - 2368 7518 B0 02 bcs @+ - 2369 751A C6 62 dec xdraw+1 - 2370 @ - 2371 751C ybarrel - 2372 751C 38 sec - 2373 751D A5 86 lda fy - 2374 751F E5 B7 sbc vy - 2375 7521 85 86 sta fy - 2376 7523 B0 0A bcs @+ - 2377 7525 A5 63 lda ydraw - 2378 7527 E5 B8 sbc vy+1 - 2379 7529 85 63 sta ydraw - 2380 752B B0 02 bcs @+ - 2381 752D C6 64 dec ydraw+1 - 2382 @ - 2383 752F 20 14 76 jsr plot ;.MakePlot - 2384 - 2385 7532 C6 8A dec yc - 2386 7534 D0 B9 bne barrelLoop - 2387 - 2388 7536 A5 61 8D C9 48 A5 + mwa xdraw EndOfTheBarrelX - 2389 7540 A5 63 8D CB 48 mva ydraw EndOfTheBarrelY - 2390 - 2391 7545 60 rts - 2392 .endp - 2393 ;-------------------------------------------------- - 2394 7546 .proc PMoutofScreen - 2395 ;-------------------------------------------------- - 2396 7546 A9 00 lda #$00 ; let all P/M disappear - 2397 7548 A0 07 ldy #7 - 2398 754A 99 02 00 @ sta hposp0,y - 2399 754D 88 dey - 2400 754E 10 FA bpl @- - 2401 ;:8 sta hposp0+# ; optimized... but Y! - 2402 7550 60 rts - 2403 .endp - 2404 ;-------------------------------------------------- - 2405 7551 .proc ColorsOfSprites - 2406 7551 A0 03 ldy #3 - 2407 7553 B9 79 5B @ lda TankColoursTable,y ; colours of sprites under tanks - 2408 7556 99 02 00 sta PCOLR0,y - 2409 7559 88 dey - 2410 755A 10 F7 bpl @- - 2411 755C AD 7D 5B LDA TankColoursTable+4 - 2412 755F 85 02 STA COLOR3 ; joined missiles (5th tank) - 2413 7561 60 rts - 2414 .endp - 2415 ;-------------------------------------------------- - 2416 7562 .proc SetPMWidth - 2417 7562 A9 55 lda #%01010101 - 2418 7564 85 02 sta sizem ; all missiles, double width - 2419 7566 A9 00 lda #$00 - 2420 7568 85 02 sta sizep0 ; P0-P3 widths - 2421 756A 85 03 sta sizep0+1 - 2422 756C 85 04 sta sizep0+2 - 2423 756E 85 05 sta sizep0+3 - 2424 7570 60 rts - 2425 .endp - 2426 - 2427 .endif - 349 7571 icl 'C64/gr_basics.asm' -Source: gr_basics.asm - 1 .IF *>0 ;this is a trick that prevents compiling this file alone - 2 - 3 ; Basic hardware-dependent graphics routines. - 4 - 5 ; ----------------------------------------- - 6 7571 .proc unPlot - 7 ; plots a point and saves the plotted byte, reverts the previous plot. - 8 ; ----------------------------------------- - 9 7571 A2 00 ldx #0 ; only one pixel - 10 7573 unPlotAfterX - 11 7573 8E 96 44 stx WhichUnPlot - 12 - 13 ; first remake the oldie - 14 7576 BD 9C 44 lda oldplotL,x - 15 7579 85 6E sta oldplot - 16 757B BD 97 44 lda oldplotH,x - 17 757E 85 6F sta oldplot+1 - 18 - 19 7580 A0 00 ldy #0 - 20 7582 BD A1 44 lda oldora,x - 21 7585 91 6E sta (oldplot),y - 22 - 23 - 24 ; is it not out of the screen ???? - 25 7587 A5 64 C9 00 D0 04 + cpw ydraw #screenheight - 26 7591 90 06 jcc CheckX - 27 7593 A9 00 85 63 85 64 mwa #0 ydraw - 28 7599 CheckX - 29 7599 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 30 75A3 B0 6E jcs EndOfUnPlot - 31 75A5 MakeUnPlot - 32 ; let's count coordinates taken from xdraw and ydraw - 33 75A5 A5 61 lda xdraw - 34 75A7 29 F8 and #%11111000 - 35 ;sta xbyte - 36 ;--- - 37 75A9 A6 63 ldx ydraw - 38 75AB 18 clc - 39 75AC 7D 68 41 adc linetableL,x - 40 75AF 85 65 sta xbyte - 41 75B1 85 6E sta oldplot - 42 75B3 BD 31 42 lda linetableH,x - 43 75B6 65 62 adc xdraw+1 - 44 75B8 85 66 sta xbyte+1 - 45 75BA 85 6F sta oldplot+1 - 46 - 47 75BC A5 61 lda xdraw - 48 75BE 29 07 and #$7 - 49 75C0 AA tax - 50 75C1 A0 00 ldy #0 - 51 - 52 75C3 A5 A9 lda color - 53 75C5 D0 0C bne ClearUnPlot - 54 - 55 ;plotting here - 56 75C7 B1 65 lda (xbyte),y - 57 75C9 8D AB 44 sta OldOraTemp - 58 75CC 1D 1C 5C ora bittable,x - 59 75CF 91 65 sta (xbyte),y - 60 75D1 D0 0A bne ContinueUnPlot ; allways <>0 - 61 75D3 ClearUnPlot - 62 75D3 B1 65 lda (xbyte),y - 63 75D5 8D AB 44 sta OldOraTemp - 64 75D8 3D 24 5C and bittable2,x - 65 75DB 91 65 sta (xbyte),y - 66 75DD ContinueUnPlot - 67 75DD AE 96 44 ldx WhichUnPlot - 68 75E0 AD AB 44 lda OldOraTemp - 69 75E3 9D A1 44 sta oldora,x - 70 75E6 A5 6E lda oldplot - 71 75E8 9D 9C 44 sta oldplotL,x - 72 75EB A5 6F lda oldplot+1 - 73 75ED 9D 97 44 sta oldplotH,x - 74 ; and now we must solve the problem of several plots - 75 ; in one byte - 76 75F0 A2 04 ldx #4 - 77 75F2 AC 96 44 ldy WhichUnPlot - 78 75F5 LetsCheckOverlapping - 79 75F5 EC 96 44 cpx WhichUnPlot - 80 75F8 F0 16 beq SkipThisPlot - 81 75FA BD 9C 44 lda oldplotL,x - 82 75FD D9 9C 44 cmp oldplotL,y - 83 7600 D0 0E bne NotTheSamePlot - 84 7602 BD 97 44 lda oldplotH,x - 85 7605 D9 97 44 cmp oldplotH,y - 86 7608 D0 06 bne NotTheSamePlot - 87 ; the pixel is in the same byte so let's take correct contents - 88 760A BD A1 44 lda oldora,x - 89 760D 99 A1 44 sta oldora,y - 90 7610 NotTheSamePlot - 91 7610 SkipThisPlot - 92 7610 CA dex - 93 7611 10 E2 bpl LetsCheckOverlapping - 94 7613 EndOfUnPlot - 95 7613 60 rts - 96 .endp - 97 - 98 ; ----------------------------------------- - 99 7614 .proc plot ;plot (xdraw, ydraw, color) - 100 ; color == 1 --> put pixel - 101 ; color == 0 --> erase pixel - 102 ; this is one of the most important routines in the whole - 103 ; game. If you are going to speed up the game, start with - 104 ; plot - it is used by every single effect starting from explosions - 105 ; through line drawing and small text output!!! - 106 ; - 107 ; Optimized by 0xF (Fox) THXXXX!!! - 108 - 109 ; ----------------------------------------- - 110 ; is it not over the screen ??? - 111 7614 A5 64 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - 112 761E B0 F3 bcs unPlot.EndOfUnPlot ;nearest RTS - 113 7620 CheckX02 - 114 7620 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 115 762A B0 25 bcs EndOfPlot - 116 762C MakePlot - 117 ; let's calculate coordinates from xdraw and ydraw - 118 - 119 762C A5 61 lda xdraw - 120 762E 29 F8 and #%11111000 - 121 ;sta xbyte - 122 ;--- - 123 7630 A6 63 ldx ydraw - 124 7632 18 clc - 125 7633 7D 68 41 adc linetableL,x - 126 7636 85 65 sta xbyte - 127 7638 BD 31 42 lda linetableH,x - 128 763B 65 62 adc xdraw+1 - 129 763D 85 66 sta xbyte+1 - 130 - 131 763F A5 61 lda xdraw - 132 7641 29 07 and #$7 - 133 7643 AA tax - 134 7644 A0 00 ldy #0 - 135 7646 A5 A9 lda color - 136 7648 D0 08 bne ClearPlot - 137 - 138 764A B1 65 lda (xbyte),y - 139 764C 1D 1C 5C ora bittable,x - 140 764F 91 65 sta (xbyte),y - 141 7651 EndOfPlot - 142 7651 60 rts - 143 7652 ClearPlot - 144 7652 B1 65 lda (xbyte),y - 145 7654 3D 24 5C and bittable2,x - 146 7657 91 65 sta (xbyte),y - 147 7659 60 rts - 148 .endp - 149 - 150 ; ----------------------------------------- - 151 765A .proc point_plot - 152 ; ----------------------------------------- - 153 ; checks state of the pixel (coordinates in xdraw and ydraw) - 154 ; result is in A (zero or appropriate bit is set) - 155 - 156 ; let's calculate coordinates from xdraw and ydraw - 157 - 158 765A A5 61 lda xdraw - 159 765C 29 F8 and #%11111000 - 160 ;sta xbyte - 161 ;--- - 162 765E A6 63 ldx ydraw - 163 7660 18 clc - 164 7661 7D 68 41 adc linetableL,x - 165 7664 85 65 sta xbyte - 166 7666 BD 31 42 lda linetableH,x - 167 7669 65 62 adc xdraw+1 - 168 766B 85 66 sta xbyte+1 - 169 - 170 766D A5 61 lda xdraw - 171 766F 29 07 and #$7 - 172 7671 AA tax - 173 7672 A0 00 ldy #0 - 174 7674 B1 65 lda (xbyte),y - 175 7676 49 FF eor #$ff - 176 7678 3D 1C 5C and bittable,x - 177 767B 60 rts - 178 .endp - 179 - 180 ;-------------------------------------------------- - 181 767C .proc ClearScreen - 182 ;-------------------------------------------------- - 183 767C A9 00 85 72 A9 20 + mwa #displayC64 temp - 184 7684 A0 00 ldy #0 - 185 7686 A9 FF @ lda #$ff - 186 7688 91 72 sta (temp),y - 187 768A E6 72 D0 02 E6 73 inw temp - 188 7690 A5 73 C9 3F D0 04 + cpw temp #displayC64+screenheight*screenBytes+1 - 189 769A D0 EA bne @- - 190 769C 60 rts - 191 .endp - 192 - 193 ;-------------------------------------------------- - 194 769D .proc GenerateLineTable - 195 - 196 769D A9 00 85 72 A9 20 + mwa #displayC64 temp - 197 76A5 A9 68 85 74 A9 41 + mwa #linetableL temp2 - 198 76AD A9 31 85 76 A9 42 + mwa #linetableH modify - 199 76B5 A0 00 ldy #0 - 200 76B7 A2 00 ldx #0 - 201 76B9 A5 72 @ lda temp - 202 76BB 91 74 sta (temp2),y - 203 76BD A5 73 lda temp+1 - 204 76BF 91 76 sta (modify),y - 205 76C1 E0 07 cpx #7 - 206 76C3 D0 12 bne NotChar - 207 76C5 A2 00 ldx #0 - 208 76C7 18 A5 72 69 39 85 + adw temp #(320-7) - 209 76D4 4C DE 76 jmp next8lines - 210 76D7 NotChar - 211 76D7 E6 72 D0 02 E6 73 inw temp - 212 76DD E8 inx - 213 76DE next8lines - 214 76DE C8 iny - 215 76DF C0 C9 cpy #screenheight+1 - 216 76E1 D0 D6 bne @- - 217 76E3 60 rts - 218 .endp - 219 ;-------------------------------------------------- - 220 76E4 .proc SetMainScreen - 221 76E4 A9 0B lda #$b ; Grey background and border - 222 76E6 8D 20 D0 sta $d020 - 223 76E9 8D 21 D0 sta $d021 - 224 - 225 76EC AD 00 DD lda $dd00 ; Set video bank to start at 0 - 226 76EF 29 FC and #252 - 227 76F1 09 03 ora #3 - 228 76F3 8D 00 DD sta $dd00 - 229 76F6 A9 18 lda #$18 - 230 76F8 8D 18 D0 sta $d018 - 231 - 232 ; SwitchVICBank(0) - 233 ; SetScreenMemory($2000) - 234 76FB SetHiresBitmapMode ; Hires mode on -Macro: SETHIRESBITMAPMODE [Source: MACRO.ASM] - 4 76FB AD 11 D0 lda $d011 - 5 76FE 29 BF and #%10111111 - 6 7700 09 20 ora #%00100000 - 7 7702 8D 11 D0 sta $d011 - 12 7705 AD 16 D0 lda $d016 - 13 7708 29 EF and #%11101111 - 14 770A 8D 16 D0 sta $d016 -Source: gr_basics.asm - 235 770D A9 00 lda #$00 - 236 770F 8D 21 D0 sta 53281 - 237 ; clear color RAM - 238 7712 A2 00 ldx #0 - 239 7714 A9 01 @ lda #1 - 240 7716 9D 00 D8 sta $d800,x - 241 7719 9D 00 D9 sta $d900,x - 242 771C 9D 00 DA sta $da00,x - 243 771F 9D 00 DB sta $db00,x - 244 7722 A9 0F lda #$0f - 245 7724 9D 00 04 sta $0400,x - 246 7727 9D 00 05 sta $0500,x - 247 772A 9D 00 06 sta $0600,x - 248 772D 9D 00 07 sta $0700,x - 249 7730 E8 inx - 250 7731 D0 E1 bne @- - 251 - 252 - 253 7733 60 rts - 254 .endp - 255 - 256 .ENDIF - 350 ;---------------------------------------------- - 351 7734 icl 'weapons.asm' -Source: weapons.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 ;-------------------------------------------------- - 5 7734 .proc Explosion - 6 ; xdraw,ydraw (word) - coordinates of explosion center - 7 ; TankNr - number of shooting tank - 8 ; ActiveWeapon(TankNr) - weapon that tank fires - 9 ;-------------------------------------------------- - 10 ;cleanup of the soil fall down ranges (left and right) - 11 7734 20 89 8F jsr ClearScreenSoilRange - 12 - 13 7737 A6 6C ldx TankNr - 14 7739 BD F7 43 lda ActiveWeapon,x - 15 .endp - 16 773C .proc ExplosionDirect - 17 773C 0A asl - 18 773D AA tax - 19 773E BD 48 77 lda ExplosionRoutines+1,x - 20 7741 48 pha - 21 7742 BD 47 77 lda ExplosionRoutines,x - 22 7745 48 pha - 23 7746 60 rts - 24 7747 ExplosionRoutines - 25 7747 A1 77 .word babymissile-1 ;Baby_Missile___;_00 - 26 7749 AC 77 .word missile-1 ;Missile________;_01 - 27 774B B2 77 .word babynuke-1 ;Baby_Nuke______;_02 - 28 774D BC 77 .word nuke-1 ;Nuke___________;_03 - 29 774F C2 77 .word leapfrog-1 ;LeapFrog_______;_04 - 30 7751 FE 77 .word funkybomb-1 ;Funky_Bomb_____;_05 - 31 7753 FD 77 .word mirv-1 ;MIRV___________;_06 - 32 7755 B6 78 .word deathshead-1 ;Death_s_Head___;_07 - 33 7757 55 79 .word napalm-1 ;Napalm_________;_08 - 34 7759 5B 79 .word hotnapalm-1 ;Hot_Napalm_____;_09 - 35 775B 86 77 .word tracer-1 ;Tracer_________;_10 - 36 775D 86 77 .word tracer-1 ;Smoke_Tracer___;_11 - 37 775F 69 7A .word babyroller-1 ;Baby_Roller____;_12 - 38 7761 70 7A .word roller-1 ;Roller_________;_13 - 39 7763 76 7A .word heavyroller-1 ;Heavy_Roller___;_14 - 40 7765 06 7C .word riotcharge-1 ;Riot_Charge____;_15 - 41 7767 10 7C .word riotblast-1 ;Riot_Blast_____;_16 - 42 7769 7C 7A .word riotbomb-1 ;Riot_Bomb______;_17 - 43 776B 86 7A .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 - 44 776D 8C 7A .word babydigger-1 ;Baby_Digger____;_19 - 45 776F A1 7A .word digger-1 ;Digger_________;_20 - 46 7771 A8 7A .word heavydigger-1 ;Heavy_Digger___;_21 - 47 7773 AF 7A .word babysandhog-1 ;Baby_Sandhog___;_22 - 48 7775 B6 7A .word sandhog-1 ;Sandhog________;_23 - 49 7777 BD 7A .word heavysandhog-1 ;Heavy_Sandhog__;_24 - 50 7779 BE 7B .word dirtclod-1 ;Dirt_Clod______;_25 - 51 777B C4 7B .word dirtball-1 ;Dirt_Ball______;_26 - 52 777D CA 7B .word tonofdirt-1 ;Ton_of_Dirt____;_27 - 53 777F 22 7C .word liquiddirt-1 ;Liquid_Dirt____;_28 - 54 7781 FC 7B .word dirtcharge-1 ;Dirt_Charge____;_29 - 55 7783 87 77 .word BFG-1 ;Buy_me_________;_30 - 56 7785 FC 7C .word laser-1 ;Laser__________;_31 - 57 - 58 7787 VOID - 59 7787 tracer - 60 7787 60 rts - 61 .endp - 62 7788 .proc BFG - 63 7788 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect - 64 778C 20 9C A2 jsr BFGblink - 65 ; Kill all :) - 66 778F A6 AE ldx NumberOfPlayers - 67 7791 CA dex - 68 7792 A9 00 lda #$00 - 69 7794 CheckNextTankBFG - 70 7794 E4 6C cpx TankNr ; not me! - 71 7796 F0 03 beq @+ - 72 7798 9D A2 43 sta Energy,x - 73 779B CA @ dex - 74 779C 10 F6 bpl CheckNextTankBFG - 75 779E 8E D9 44 stx AfterBFGflag ; $ff - 76 77A1 60 rts - 77 .endp - 78 ; ------------------------ - 79 77A2 .proc babymissile - 80 77A2 A9 0B 85 B0 mva #11 ExplosionRadius - 81 77A6 GoBabyMissileSFX - 82 77A6 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 83 77AA GoXmissile - 84 77AA 4C C5 7D jmp xmissile - 85 .endp - 86 ; ------------------------ - 87 77AD .proc missile ; - 88 77AD A9 11 85 B0 mva #17 ExplosionRadius - 89 77B1 D0 F3 bne babymissile.GoBabyMissileSFX - 90 ; jmp xmissile - 91 .endp - 92 ; ------------------------ - 93 77B3 .proc babynuke - 94 77B3 A9 19 85 B0 mva #25 ExplosionRadius - 95 77B7 GoBabyNukeSFX - 96 77B7 A9 04 85 9E mva #sfx_nuke sfx_effect ; allways <>0 - 97 77BB D0 ED bne babymissile.GoXmissile - 98 ; jmp xmissile - 99 .endp - 100 ; ------------------------ - 101 77BD .proc nuke - 102 77BD A9 1E 85 B0 mva #30 ExplosionRadius - 103 77C1 D0 F4 bne babynuke.GoBabyNukeSFX - 104 ; jmp xmissile - 105 .endp - 106 ; ------------------------ - 107 77C3 .proc leapfrog - 108 77C3 A9 11 85 B0 mva #17 ExplosionRadius - 109 ; mva #sfx_baby_missile sfx_effect - 110 ; jsr xmissile - 111 77C7 20 A6 77 jsr babymissile.GoBabyMissileSFX - 112 - 113 77CA 20 CD 77 jsr SecondRepeat - 114 - 115 77CD SecondRepeat - 116 ; soil must fall down now! there is no other way... - 117 ; hide tanks or they fall down with soil - 118 77CD 20 F4 6E jsr SoilDown2 - 119 - 120 ; it looks like force is divided by 4 here BUT" - 121 ; in Flight routine force is multiplied by 2 and left - 122 ; so, we have Force divided by 2 here (not accurately) - 123 ;lsr Force+1 - 124 ;ror Force - 125 77D0 46 A5 lsr Force+1 - 126 77D2 66 A4 ror Force - 127 77D4 AD 15 45 85 A7 mva LeapFrogAngle Angle - 128 77D9 A9 0C 85 9E mva #sfx_funky_hit sfx_effect - 129 77DD 38 A5 CC E9 05 85 + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) - 130 77E8 20 A0 83 jsr Flight - 131 77EB A5 BF lda HitFlag - 132 77ED F0 0E beq EndOfLeapping - 133 77EF A9 0E 85 B0 mva #14 ExplosionRadius - 134 77F3 20 09 8F jsr CalculateExplosionRange0 - 135 77F6 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 136 77FA 4C C8 7D jmp xmissile.NoRangeCalc - 137 77FD EndOfLeapping - 138 77FD 60 rts - 139 .endp - 140 ; ------------------------ - 141 77FE .proc mirv ; the whole mirv is performed by Flight routine - 142 77FE 60 rts - 143 .endp - 144 ; ------------------------ - 145 77FF .proc funkybomb ; - 146 77FF A9 05 85 9E mva #sfx_baby_missile sfx_effect - 147 7803 A5 C9 8D AC 44 A5 + mwa xtraj+1 xtrajfb - 148 780D 38 A5 CC E9 05 8D + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) - 149 ;central Explosion - 150 781C A9 15 85 B0 mva #21 ExplosionRadius - 151 7820 20 09 8F jsr CalculateExplosionRange0 - 152 7823 20 C8 7D jsr xmissile.NoRangeCalc - 153 - 154 7826 20 F4 6E jsr SoilDown2 - 155 ; - 156 7829 20 0B 6A jsr cleartanks ; maybe not? - 157 782C A9 01 85 A9 mva #1 color - 158 7830 A9 00 85 A2 mva #0 FunkyWallFlag - 159 7834 A9 05 85 B1 mva #5 FunkyBombCounter - 160 7838 FunkyBombLoop - 161 7838 A9 01 85 E3 mva #1 tracerflag - 162 ;force randomization (range: 256-511) - 163 783C AD 1B D4 lda random - 164 783F 85 A4 sta Force - 165 7841 A9 01 85 A5 mva #1 Force+1 - 166 ;Angle randomization Range: (70-110 degrees) - 167 7845 randomize 70 110 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 7845 ?rand - 7 7845 AD 1B D4 lda random - 8 7848 C9 46 cmp #70 ;floor - 9 784A 90 F9 bcc ?rand - 10 784C C9 6F cmp #110+1 ;ceiling - 11 784E B0 F5 bcs ?rand -Source: weapons.asm - 168 7850 85 A7 sta Angle - 169 - 170 7852 A9 00 lda #0 - 171 7854 85 C8 sta xtraj - 172 7856 85 CB sta ytraj - 173 7858 AD AC 44 85 C9 AD + mwa xtrajfb xtraj+1 - 174 7862 AD AE 44 85 CC AD + mwa ytrajfb ytraj+1 - 175 786C A9 0C 85 9E mva #sfx_funky_hit sfx_effect - 176 7870 20 A0 83 jsr Flight - 177 7873 A9 00 85 B0 mva #0 ExplosionRadius ; if no explosion (off screen) - 178 ; if xdraw if over range then fix it - 179 7877 A5 62 lda xdraw+1 - 180 7879 10 06 bpl NoOnLeftEdge - 181 787B A9 00 lda #0 - 182 787D 85 61 sta xdraw - 183 787F 85 62 sta xdraw+1 - 184 7881 NoOnLeftEdge - 185 7881 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 186 788B 90 08 bcc NoOnRightEdge - 187 788D A9 40 85 61 A9 01 + mwa #screenwidth xdraw - 188 7895 NoOnRightEdge - 189 7895 20 0C 8F jsr CalculateExplosionRange ; add end of flight coordinates to soildown range - 190 7898 A5 BF lda HitFlag - 191 789A F0 0B beq NoExplosionInFunkyBomb - 192 789C A9 05 85 9E mva #sfx_baby_missile sfx_effect - 193 78A0 A9 0B 85 B0 mva #11 ExplosionRadius - 194 78A4 20 C5 7D jsr xmissile - 195 78A7 NoExplosionInFunkyBomb - 196 78A7 C6 B1 dec FunkyBombCounter - 197 78A9 D0 8D bne FunkyBombLoop - 198 78AB A9 00 85 E3 mva #0 tracerflag - 199 78AF A5 A2 lda FunkyWallFlag - 200 78B1 F0 03 beq NoWallsInFunky - 201 78B3 20 7A 8F jsr SetFullScreenSoilRange - 202 78B6 NoWallsInFunky - 203 78B6 60 rts - 204 .endp - 205 ; ------------------------ - 206 78B7 .proc deathshead - 207 78B7 A9 1E 85 B0 mva #30 ExplosionRadius - 208 78BB A9 04 85 9E mva #sfx_nuke sfx_effect - 209 78BF 20 32 79 jsr GoXmissileWithSaveXYdraw - 210 78C2 38 A5 61 E9 22 85 + sbw xdraw #34 - 211 78CD A9 04 85 9E mva #sfx_nuke sfx_effect - 212 78D1 20 32 79 jsr GoXmissileWithSaveXYdraw - 213 78D4 18 A5 61 69 44 85 + adw xdraw #68 - 214 78DF A9 04 85 9E mva #sfx_nuke sfx_effect - 215 78E3 20 32 79 jsr GoXmissileWithSaveXYdraw - 216 78E6 38 A5 61 E9 22 85 + sbw xdraw #34 - 217 ; - 218 78F1 38 A5 63 E9 22 85 + sbw ydraw #34 - 219 ;jsr CalculateExplosionRange - 220 78FC A5 64 C9 00 D0 04 + cpw ydraw #screenHeight - 221 7906 B0 07 bcs NoUpperCircle - 222 7908 A9 04 85 9E mva #sfx_nuke sfx_effect - 223 790C 20 32 79 jsr GoXmissileWithSaveXYdraw - 224 790F NoUpperCircle - 225 790F 18 A5 63 69 44 85 + adw ydraw #68 - 226 ;jsr CalculateExplosionRange - 227 791A A5 64 C9 00 D0 04 + cpw ydraw #screenHeight - 228 7924 B0 07 bcs NoLowerCircle - 229 7926 A9 04 85 9E mva #sfx_nuke sfx_effect - 230 792A 20 32 79 jsr GoXmissileWithSaveXYdraw - 231 792D NoLowerCircle - 232 792D A9 15 85 9E mva #sfx_silencer sfx_effect - 233 7931 60 rts - 234 - 235 7932 GoXmissileWithSaveXYdraw - 236 7932 A5 61 85 78 A5 62 + mwa xdraw tempXROLLER - 237 793A A5 63 85 76 A5 64 + mwa ydraw modify - 238 7942 20 C5 7D jsr xmissile - 239 7945 A5 78 85 61 A5 79 + mwa tempXROLLER xdraw - 240 794D A5 76 85 63 A5 77 + mwa modify ydraw - 241 7955 60 rts - 242 .endp - 243 ; ------------------------ - 244 7956 .proc napalm - 245 7956 A9 00 85 B1 mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm - 246 795A F0 04 beq xnapalm - 247 .endp - 248 ; ------------------------ - 249 795C .proc hotnapalm - 250 795C A9 01 85 B1 mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm - 251 ; jmp xnapalm - 252 .endp - 253 ; ------------------------ - 254 7960 .proc xnapalm - 255 7960 A9 09 85 9E mva #sfx_napalm sfx_effect - 256 7964 A9 0E 85 B0 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) - 257 7968 20 0C 8F jsr CalculateExplosionRange - 258 ; - 259 796B A5 61 85 B3 A5 62 + mwa xdraw xcircle ; store hitpoint for future repeats - 260 7973 A0 1E ldy #30 ; repeat 30 times - 261 7975 84 C6 sty magic - 262 7977 RepeatNapalm ; external loop (for fire animation) - 263 7977 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 264 797F 38 A5 61 E9 0A 85 + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point - 265 798A A0 00 ldy #0 - 266 798C 84 C7 sty magic+1 - 267 798E RepeatFlame ; internal loop (draw flames) - 268 798E A0 00 ldy #0 - 269 7990 18 A5 61 69 3E 85 + adw xdraw #mountaintable temp - 270 799D 84 64 sty ydraw+1 - 271 799F B1 72 lda (temp),y - 272 79A1 38 sec - 273 79A2 E9 01 sbc #1 ; over ground - 274 79A4 85 63 sta ydraw - 275 79A6 A5 61 lda xdraw - 276 79A8 25 B1 and HotNapalmFlag ; if hotnapalm and x is odd: - 277 79AA 0A 0A :2 asl ; modify y position 4 pixels up - 278 79AC A4 63 ldy ydraw - 279 79AE 85 63 sta ydraw - 280 79B0 98 tya - 281 79B1 38 sec - 282 79B2 E5 63 sbc ydraw - 283 79B4 85 63 sta ydraw - 284 79B6 38 A5 61 E9 04 85 + sbw xdraw #4 ; half character correction - 285 ; draw flame symbol - 286 79C1 A5 C6 lda magic ; if last repeat - clear flames - 287 79C3 F0 0A beq LastNapalmRepeat - 288 79C5 AD 1B D4 lda random - 289 79C8 29 06 and #%00000110 - 290 79CA 18 clc - 291 79CB 69 14 adc #char_flame___________ - 292 79CD D0 02 bne PutFlameChar - 293 79CF LastNapalmRepeat - 294 79CF A9 1C lda #char_clear_flame_____ ; clear flame symbol - 295 79D1 PutFlameChar - 296 79D1 85 69 sta CharCode - 297 ; check coordinates - 298 79D3 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-7) - 299 79DD B0 0D bcs CharOffTheScreen - 300 79DF A5 63 lda ydraw - 301 79E1 C9 07 cmp #7 - 302 79E3 90 07 bcc CharOffTheScreen - 303 79E5 C9 C7 cmp #(screenHeight-1) - 304 79E7 B0 03 bcs CharOffTheScreen - 305 79E9 20 E7 70 jsr TypeChar - 306 79EC CharOffTheScreen - 307 79EC 18 A5 61 69 04 85 + adw xdraw #4 ; reverse half character correction (we need positon of character center) - 308 79F7 18 A5 61 69 01 85 + adw xdraw #1 ; next char 1 pixels to right - 309 7A02 E6 C7 inc magic+1 - 310 7A04 A5 C7 lda magic+1 - 311 7A06 C9 15 cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center - 312 7A08 D0 84 jne RepeatFlame - 313 7A0A C6 C6 dec magic - 314 7A0C 30 03 4C 77 79 jpl RepeatNapalm - 315 ; after napalm - 316 ;now we must check tanks in range - 317 7A11 A6 AE ldx NumberOfPlayers - 318 7A13 CA dex - 319 7A14 BurnedCheckLoop - 320 7A14 BD AF 43 lda eXistenZ,x - 321 7A17 F0 49 beq EndNurnedCheckLoop - 322 ;here the tank exist - 323 ; calculate right edge of the fire - 324 7A19 18 A5 B3 69 12 85 + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction - 325 ; now we compare tank position with right edge of the fire (napalm) - 326 7A26 BD 13 44 lda XtankstableH,x - 327 7A29 C5 62 cmp xdraw+1 - 328 7A2B D0 05 bne @+ - 329 7A2D BD 0D 44 lda XtankstableL,x - 330 7A30 C5 61 cmp xdraw - 331 @ - 332 7A32 B0 2E bcs TankOutOfFire - 333 ; let's calculate left edge of the fire - 334 7A34 38 A5 B3 E9 12 85 + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction - 335 7A41 10 06 bpl @+ - 336 7A43 A9 00 85 61 85 62 mwa #0 xdraw ; left screen edge - 337 @ - 338 ; now we compare tank position with left edge of the fire (napalm) - 339 7A49 BD 13 44 lda XtankstableH,x - 340 7A4C C5 62 cmp xdraw+1 - 341 7A4E D0 05 bne @+ - 342 7A50 BD 0D 44 lda XtankstableL,x - 343 7A53 C5 61 cmp xdraw - 344 @ - 345 7A55 90 0B bcc TankOutOfFire - 346 - 347 7A57 A0 28 ldy #40 ; energy decrease (napalm) - but if hotnapalm: - 348 7A59 A5 B1 lda HotNapalmFlag - 349 7A5B F0 02 beq NotHot - 350 7A5D A0 50 ldy #80 ; energy decrease (hotnapalm) - 351 7A5F NotHot - 352 ; check shields ( joke :) ) - 353 7A5F 20 74 57 jsr DecreaseEnergyX - 354 7A62 TankOutOfFire - 355 7A62 EndNurnedCheckLoop - 356 7A62 CA dex - 357 7A63 10 AF bpl BurnedCheckLoop - 358 7A65 A9 15 85 9E mva #sfx_silencer sfx_effect - 359 7A69 60 rts - 360 .endp - 361 ; ------------------------ - 362 7A6A .proc babyroller - 363 7A6A A9 0B 85 B0 mva #11 ExplosionRadius - 364 7A6E GoRoller - 365 7A6E 4C A6 7E jmp xroller - 366 .endp - 367 ; ------------------------ - 368 7A71 .proc roller ; - 369 7A71 A9 15 85 B0 mva #21 ExplosionRadius - 370 7A75 D0 F7 bne babyroller.GoRoller ; 1 byte saved - 371 ; jmp xroller - 372 .endp - 373 ; ------------------------ - 374 7A77 .proc heavyroller - 375 7A77 A9 1E 85 B0 mva #30 ExplosionRadius - 376 7A7B D0 F1 bne babyroller.GoRoller ; 1 byte saved - 377 ; jmp xroller - 378 .endp - 379 ; ------------------------ - 380 7A7D .proc riotbomb - 381 7A7D A9 11 85 B0 mva #17 ExplosionRadius - 382 7A81 GoRiotBomb - 383 7A81 20 0C 8F jsr CalculateExplosionRange - 384 7A84 4C 8C 7E jmp xriotbomb - 385 .endp - 386 ; ------------------------ - 387 7A87 .proc heavyriotbomb - 388 7A87 A9 1D 85 B0 mva #29 ExplosionRadius - 389 7A8B D0 F4 bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) - 390 ; jsr CalculateExplosionRange - 391 ; jmp xriotbomb - 392 .endp - 393 ; ------------------------ - 394 7A8D .proc babydigger - 395 7A8D A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) - 396 7A92 GoBabydiggerSFX - 397 7A92 A9 14 85 9E mva #sfx_digger sfx_effect - 398 7A96 A9 00 8D 5E 44 mva #0 sandhogflag - 399 7A9B A9 0D 8D 39 44 mva #13 DigLong - 400 7AA0 D0 2F bne xdigger - 401 .endp - 402 ; ------------------------ - 403 7AA2 .proc digger ; - 404 7AA2 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) - 405 7AA7 D0 E9 bne babydigger.GoBabydiggerSFX - 406 .endp - 407 ; ------------------------ - 408 7AA9 .proc heavydigger - 409 7AA9 A9 07 8D 38 44 mva #7 diggery ; how many branches (-1) - 410 7AAE D0 E2 bne babydigger.GoBabydiggerSFX - 411 .endp - 412 ; ------------------------ - 413 7AB0 .proc babysandhog - 414 7AB0 A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) - 415 7AB5 D0 0C bne heavysandhog.GoHeavysandhogSFX - 416 .endp - 417 ; ------------------------ - 418 7AB7 .proc sandhog - 419 7AB7 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) - 420 7ABC D0 05 bne heavysandhog.GoHeavysandhogSFX - 421 .endp - 422 ; ------------------------ - 423 7ABE .proc heavysandhog - 424 7ABE A9 05 8D 38 44 mva #5 diggery ; how many branches (-1) - 425 7AC3 GoHeavysandhogSFX - 426 7AC3 A9 12 85 9E mva #sfx_sandhog sfx_effect - 427 7AC7 A9 08 8D 5E 44 mva #char_sandhog_offset sandhogflag - 428 7ACC A9 0D 8D 39 44 mva #13 DigLong - 429 ; jmp xdigger - 430 .endp - 431 ; ------------------------ - 432 7AD1 .proc xdigger - 433 ;mwa xdraw digstartx - 434 ;mwa ydraw digstarty - 435 7AD1 AE 38 44 ldx diggery - 436 7AD4 WriteToBranches - 437 7AD4 A5 61 lda xdraw - 438 7AD6 9D 3A 44 sta digtabxL,x - 439 7AD9 A5 62 lda xdraw+1 - 440 7ADB 9D 42 44 sta digtabxH,x - 441 7ADE A5 63 lda ydraw - 442 7AE0 9D 4A 44 sta digtabyL,x - 443 7AE3 A5 64 lda ydraw+1 - 444 7AE5 9D 52 44 sta digtabyH,x - 445 7AE8 CA dex - 446 7AE9 10 E9 bpl WriteToBranches - 447 7AEB 20 A3 7B jsr DiggerCharacter ; start character - 448 - 449 7AEE 18 A5 61 69 04 85 + adw xdraw #4 - 450 7AF9 AD 39 44 lda DigLong - 451 ; looks strange, but it is (DigLong+2)*4 - 452 7AFC 18 clc - 453 7AFD 69 02 adc #$2 - 454 7AFF 0A asl - 455 7B00 0A asl - 456 7B01 85 B0 sta ExplosionRadius - 457 7B03 20 0C 8F jsr CalculateExplosionRange - 458 7B06 BranchNotFinished - 459 7B06 AE 38 44 ldx diggery - 460 7B09 CalculateBranches - 461 7B09 8A txa - 462 7B0A 29 01 and #$01 - 463 7B0C D0 14 bne DigRight - 464 7B0E diglewy ; even branches go left - 465 7B0E 38 sec - 466 7B0F BD 3A 44 lda digtabxL,x - 467 7B12 E9 04 sbc #$04 - 468 7B14 9D 3A 44 sta digtabxL,x - 469 7B17 BD 42 44 lda digtabxH,x - 470 7B1A E9 00 sbc #$00 - 471 7B1C 9D 42 44 sta digtabxH,x - 472 7B1F 4C 33 7B jmp DigRandomize - 473 7B22 DigRight ; odd go right (everytime 4 pixels) - 474 7B22 18 clc - 475 7B23 BD 3A 44 lda digtabxL,x - 476 7B26 69 04 adc #$04 - 477 7B28 9D 3A 44 sta digtabxL,x - 478 7B2B BD 42 44 lda digtabxH,x - 479 7B2E 69 00 adc #$00 - 480 7B30 9D 42 44 sta digtabxH,x - 481 7B33 DigRandomize - 482 7B33 AD 1B D4 lda random - 483 7B36 29 87 and #$87 - 484 7B38 30 20 bmi DigUp - 485 7B3A DigDown - 486 7B3A 29 07 and #$07 - 487 7B3C 18 clc - 488 7B3D 7D 4A 44 adc digtabyL,x - 489 7B40 9D 4A 44 sta digtabyL,x - 490 7B43 BD 52 44 lda digtabyH,x - 491 7B46 69 00 adc #$00 - 492 7B48 9D 52 44 sta digtabyH,x - 493 ;crashing bug here - if too much added to digtaby, it gets over screenheight and starts writing over random areas - 494 ;WARNING! fix for 1 byte screenheight. TODO - 495 7B4B BD 4A 44 lda digtabyL,x - 496 7B4E C9 C8 cmp #screenheight - 497 7B50 90 05 bcc @+ ; branch if less - 498 7B52 A9 C7 lda #screenheight-1 - 499 7B54 9D 4A 44 sta digtabyL,x - 500 7B57 4C 6F 7B @ jmp DigCalculateNext - 501 7B5A DigUp - 502 7B5A 29 07 and #$07 - 503 7B5C 85 72 sta temp - 504 7B5E 38 sec - 505 7B5F BD 4A 44 lda digtabyL,x - 506 7B62 E5 72 sbc temp - 507 7B64 9D 4A 44 sta digtabyL,x - 508 7B67 BD 52 44 lda digtabyH,x - 509 7B6A E9 00 sbc #$00 - 510 7B6C 9D 52 44 sta digtabyH,x - 511 7B6F DigCalculateNext - 512 7B6F CA dex - 513 7B70 10 97 bpl CalculateBranches - 514 ; here we draw... - 515 7B72 AE 38 44 ldx diggery - 516 7B75 DigDrawing - 517 7B75 BD 3A 44 lda digtabxL,x - 518 7B78 85 61 sta xdraw - 519 7B7A BD 42 44 lda digtabxH,x - 520 7B7D 85 62 sta xdraw+1 - 521 7B7F BD 4A 44 lda digtabyL,x - 522 7B82 85 63 sta ydraw - 523 7B84 BD 52 44 lda digtabyH,x - 524 7B87 85 64 sta ydraw+1 - 525 7B89 phx -Macro: PHX [Source: MACRO.ASM] - 1 7B89 8A txa - 2 7B8A 48 pha -Source: weapons.asm - 526 7B8B 20 A3 7B jsr DiggerCharacter - 527 7B8E plx -Macro: PLX [Source: MACRO.ASM] - 1 7B8E 68 pla - 2 7B8F AA tax -Source: weapons.asm - 528 7B90 CA dex - 529 7B91 10 E2 bpl DigDrawing - 530 7B93 CE 39 44 AD 39 44 dec:lda DigLong - 531 7B99 30 03 4C 06 7B jpl BranchNotFinished - 532 7B9E DoNotPutDig - 533 7B9E A9 15 85 9E mva #sfx_silencer sfx_effect - 534 7BA2 60 rts - 535 7BA3 DiggerCharacter - 536 7BA3 AD 1B D4 lda random - 537 7BA6 29 06 and #$06 - 538 7BA8 18 clc - 539 7BA9 69 04 adc #char_digger__________ - 540 7BAB 6D 5E 44 adc sandhogflag - 541 7BAE 85 69 sta CharCode - 542 7BB0 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-6) - 543 7BBA B0 E2 bcs DoNotPutDig - 544 7BBC 4C E7 70 jmp TypeChar - 545 .endp - 546 ; ------------------------ - 547 7BBF .proc dirtclod - 548 7BBF A9 0C 85 B0 mva #12 ExplosionRadius - 549 7BC3 D0 0A bne xdirt - 550 .endp - 551 ; ------------------------ - 552 7BC5 .proc dirtball - 553 7BC5 A9 16 85 B0 mva #22 ExplosionRadius - 554 7BC9 D0 04 bne xdirt - 555 .endp - 556 ; ------------------------ - 557 7BCB .proc tonofdirt - 558 7BCB A9 1F 85 B0 mva #31 ExplosionRadius - 559 ; jmp xdirt - 560 .endp - 561 ; ----------------- - 562 7BCF .proc xdirt ; - 563 ; ----------------- - 564 7BCF 20 0C 8F jsr CalculateExplosionRange - 565 7BD2 A9 0A 85 9E mva #sfx_dirt_charge sfx_effect - 566 7BD6 A9 01 lda #1 - 567 7BD8 85 AB sta radius - 568 7BDA 85 A9 sta color - 569 7BDC dirtLoop - 570 7BDC 20 4A 68 jsr circle - 571 7BDF E6 63 D0 02 E6 64 inw ydraw - 572 7BE5 20 4A 68 jsr circle - 573 7BE8 A5 63 D0 02 C6 64 + .nowarn dew ydraw - 574 7BF0 E6 AB inc radius - 575 7BF2 A5 AB lda radius - 576 7BF4 C5 B0 cmp ExplosionRadius - 577 7BF6 D0 E4 bne dirtLoop - 578 7BF8 A9 15 85 9E mva #sfx_silencer sfx_effect - 579 7BFC 60 rts - 580 .endp - 581 ; ------------------------ - 582 7BFD .proc dirtcharge - 583 7BFD A9 3D 85 B0 mva #61 ExplosionRadius - 584 7C01 20 0C 8F jsr CalculateExplosionRange - 585 7C04 4C E1 7F jmp ofdirt - 586 .endp - 587 ; ------------------------ - 588 7C07 .proc riotcharge - 589 7C07 A9 11 85 9E mva #sfx_riot_blast sfx_effect - 590 7C0B A9 1F 85 B0 mva #31 ExplosionRadius - 591 7C0F D0 08 bne cleanDirt - 592 .endp - 593 ; ------------------------ - 594 7C11 .proc riotblast - 595 7C11 A9 11 85 9E mva #sfx_riot_blast sfx_effect - 596 7C15 A9 3D 85 B0 mva #61 ExplosionRadius - 597 ; jmp cleanDirt - 598 .endp - 599 ; ----------------- - 600 7C19 .proc cleanDirt - 601 ; ----------------- - 602 7C19 20 0C 8F jsr CalculateExplosionRange - 603 7C1C A9 00 85 A9 mva #0 color - 604 7C20 4C E9 7F jmp ofdirt.NoColor - 605 .endp - 606 ; ------------------------ - 607 7C23 .proc liquiddirt - 608 7C23 A9 1B 85 9E mva #sfx_liquid_dirt sfx_effect - 609 7C27 A9 FE 8D 5C 44 A9 + mwa #510 FillCounter - 610 ; ----- - 611 7C31 A5 61 8D 5A 44 A5 + mwa xdraw TempXfill - 612 7C3B RepeatFill - 613 7C3B AD 5A 44 85 61 AD + mwa TempXfill xdraw - 614 7C45 20 5A 7F jsr checkRollDirection - 615 ; HowMuchToFall - direction - 616 ; $FF - we are in a hole (flying in missile direction) - 617 ; 1 - right, 2 - left - 618 7C48 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 619 7C55 A0 00 ldy #0 - 620 7C57 B1 78 lda (tempXROLLER),y - 621 7C59 8D 37 44 sta HeightRol ; relative point - 622 - 623 7C5C RollinContinuesLiquid - 624 ; new point is set - 625 7C5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 626 7C69 A0 00 ldy #0 - 627 7C6B B1 78 lda (tempXROLLER),y - 628 7C6D 85 63 sta ydraw - 629 7C6F CD 37 44 cmp HeightRol - 630 7C72 F0 02 beq UpNotYet2 - 631 7C74 90 32 bcc FillNow - 632 7C76 UpNotYet2 - 633 7C76 38 sec ;clc - 634 7C77 8D 37 44 sta HeightRol - 635 7C7A E9 01 sbc #1 - 636 7C7C 85 63 sta ydraw - 637 7C7E A5 C5 lda HowMuchToFall - 638 7C80 C9 01 cmp #1 - 639 7C82 F0 12 beq HowMuchToFallRight3 - 640 7C84 A5 61 D0 02 C6 62 + .NOWARN dew xdraw - 641 7C8C A5 61 lda xdraw - 642 7C8E 25 62 and xdraw+1 - 643 7C90 C9 FF cmp #$ff ; like cpw xdraw #$ffff - 644 ;ora xdraw+1 ; like cpw xdraw #$0000 - 645 7C92 D0 C8 jne RollinContinuesLiquid - 646 7C94 F0 12 beq FillNow - 647 7C96 HowMuchToFallRight3 - 648 7C96 E6 61 D0 02 E6 62 inw xdraw - 649 7C9C A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 650 7CA6 D0 B4 jne RollinContinuesLiquid - 651 7CA8 FillNow - 652 ; finally one pixel more - 653 7CA8 A0 00 ldy #0 - 654 7CAA A5 C5 lda HowMuchToFall - 655 7CAC 30 18 bmi FillHole - 656 7CAE C9 01 cmp #1 - 657 7CB0 F0 0C beq FillLeft - 658 7CB2 E6 61 D0 02 E6 62 inw xdraw - 659 7CB8 E6 61 D0 02 E6 62 inw xdraw ; tricky but we must rollback xdraw in proper direction - 660 7CBE FillLeft - 661 7CBE A5 61 D0 02 C6 62 + .nowarn dew xdraw - 662 7CC6 FillHole - 663 7CC6 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 664 7CD3 B1 78 lda (tempXROLLER),y - 665 7CD5 85 63 sta ydraw - 666 7CD7 F0 0D beq ToHighFill ; if we filled all playfield (very rare but possible) - 667 7CD9 C6 63 dec ydraw ; one pixel up - 668 7CDB A5 63 lda ydraw - 669 7CDD 91 78 sta (tempXROLLER),y ;mountaintable update - 670 7CDF A9 01 85 A9 mva #1 color - 671 7CE3 20 2C 76 jsr plot.MakePlot - 672 7CE6 ToHighFill - 673 7CE6 AD 5C 44 D0 03 CE + .nowarn dew FillCounter - 674 7CF1 AD 5C 44 lda FillCounter - 675 7CF4 0D 5D 44 ora FillCounter+1 - 676 7CF7 F0 03 4C 3B 7C jne RepeatFill - 677 7CFC 60 rts - 678 .endp - 679 ; ------------------------ - 680 7CFD .proc laser - 681 ; in xdraw and ydraw we have hit point coordinates - 682 ; from Shoot/Flight procedures (invisible flight) - 683 ; ------------------------ - 684 7CFD A6 6C ldx TankNr - 685 7CFF BD C3 48 lda AngleTable,x - 686 7D02 A8 tay - 687 - 688 7D03 AD C9 48 85 65 AD + mwa EndOfTheBarrelX xbyte - 689 7D0D AD CB 48 85 67 mva EndOfTheBarrelY ybyte - 690 7D12 A9 00 85 68 mva #0 ybyte+1 - 691 7D16 8D 8B 44 sta LaserFlag ; turn on gravity and wind after shot :) - 692 - 693 7D19 A5 61 8D 16 45 A5 + mwa xdraw LaserCoordinate - 694 7D23 A5 63 8D 18 45 A5 + mwa ydraw LaserCoordinate+2 - 695 7D2D A5 65 8D 1A 45 A5 + mwa xbyte LaserCoordinate+4 - 696 7D37 A5 67 8D 1C 45 A5 + mwa ybyte LaserCoordinate+6 - 697 - 698 7D41 A9 02 85 9E mva #sfx_lightning sfx_effect - 699 - 700 7D45 A9 80 8D 73 43 mva #%10000000 drawFunction - 701 ;the above switches Draw to measuring length - 702 7D4A 20 12 66 jsr draw - 703 7D4D A9 00 8D 73 43 mva #0 drawFunction - 704 7D52 46 E2 lsr LineLength+1 ; LineLength / 8 - 705 7D54 66 E1 ror LineLength - 706 7D56 46 E1 lsr LineLength ; max line lenght is about 380 (9 bits) - 707 7D58 46 E1 lsr LineLength - 708 7D5A 38 sec - 709 7D5B A9 3C lda #60 - 710 7D5D E5 E1 sbc LineLength - 711 7D5F 85 8A sta yc ; laser blink counter 60-(LineLength/8) - 712 @ - 713 7D61 A5 8A lda yc - 714 7D63 29 01 and #$01 - 715 7D65 49 01 eor #$01 - 716 7D67 85 A9 sta color - 717 7D69 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw - 718 7D73 AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw - 719 7D7D AD 1A 45 85 65 AD + mwa LaserCoordinate+4 xbyte - 720 7D87 AD 1C 45 85 67 AD + mwa LaserCoordinate+6 ybyte - 721 7D91 A9 02 85 9E mva #sfx_lightning sfx_effect - 722 7D95 20 12 66 jsr draw - 723 - 724 7D98 C6 8A dec yc - 725 7D9A D0 C5 bne @- - 726 - 727 7D9C A9 01 85 A9 mva #1 color - 728 7DA0 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw - 729 7DAA AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw - 730 7DB4 A9 00 85 BF mva #0 HitFlag - 731 7DB8 20 84 8E jsr CheckCollisionWithTank - 732 7DBB A5 BF lda HitFlag - 733 7DBD F0 05 beq LaserMisses - 734 ; here we hit a tank (X) - 735 7DBF A0 64 ldy #100 - 736 7DC1 20 74 57 jsr DecreaseEnergyX - 737 7DC4 LaserMisses - 738 7DC4 60 rts - 739 .endp - 740 ; ----------------- - 741 7DC5 .proc xmissile ; - 742 ; ----------------- - 743 7DC5 20 0C 8F jsr CalculateExplosionRange - 744 7DC8 NoRangeCalc - 745 7DC8 A9 01 lda #1 - 746 7DCA 85 AB sta radius - 747 7DCC 85 A9 sta color - 748 7DCE ExplosionLoop - 749 7DCE 20 4A 68 jsr circle - 750 7DD1 E6 AB E6 AB :2 inc radius - 751 7DD5 A5 AB lda radius - 752 7DD7 C5 B0 cmp ExplosionRadius - 753 7DD9 90 F3 bcc ExplosionLoop - 754 - 755 7DDB A2 00 ldx #0 - 756 7DDD 86 A9 stx color - 757 7DDF E8 inx - 758 7DE0 86 AB stx radius - 759 7DE2 ExplosionLoop2 - 760 7DE2 20 4A 68 jsr circle - 761 7DE5 E6 AB inc radius - 762 7DE7 A5 AB lda radius - 763 7DE9 C5 B0 cmp ExplosionRadius - 764 7DEB 90 F5 bcc ExplosionLoop2 - 765 - 766 7DED A9 01 85 A9 mva #1 color - 767 - 768 ;check tanks' distance from the centre of the explosion - 769 - 770 7DF1 A9 80 8D 73 43 mva #%10000000 drawFunction - 771 ;the above switches Draw to measuring length - 772 ;trick is easy - how many pixels does it take to draw - 773 ;a line from one point to another - 774 ;it must be somehow easier than regular Pitagoras - 775 ;calculation - 776 - 777 7DF6 A6 AE ldx NumberOfPlayers - 778 7DF8 CA dex - 779 7DF9 DistanceCheckLoop - 780 7DF9 BD AF 43 lda eXistenZ,x - 781 7DFC D0 03 4C 81 7E jeq EndOfDistanceCheckLoop - 782 ;here the tank exist - 783 7E01 BD 0D 44 lda XtankstableL,x - 784 7E04 18 clc - 785 7E05 69 03 adc #3 ;measure from middle of the tank - 786 7E07 85 65 sta xbyte - 787 7E09 BD 13 44 lda XtankstableH,x - 788 7E0C 18 clc - 789 7E0D 69 00 adc #0 ;measure from middle of the tank - 790 7E0F 85 66 sta xbyte+1 - 791 7E11 BD 19 44 lda Ytankstable,x - 792 7E14 38 sec - 793 7E15 E9 02 sbc #2 ;measure from middle of the tank - 794 7E17 85 67 sta ybyte - 795 7E19 A9 00 lda #0 - 796 7E1B 85 68 sta ybyte+1 - 797 7E1D phx -Macro: PHX [Source: MACRO.ASM] - 1 7E1D 8A txa - 2 7E1E 48 pha -Source: weapons.asm - 798 7E1F 20 12 66 jsr draw - 799 7E22 plx -Macro: PLX [Source: MACRO.ASM] - 1 7E22 68 pla - 2 7E23 AA tax -Source: weapons.asm - 800 ;if tank within range of the explosion? - 801 7E24 A5 E2 lda LineLength+1 - 802 7E26 D0 59 bne TankIsNotWithinTheRange - 803 7E28 A5 E1 lda LineLength - 804 7E2A C5 B0 cmp ExplosionRadius - 805 7E2C B0 53 bcs TankIsNotWithinTheRange - 806 7E2E A5 B0 lda ExplosionRadius - 807 7E30 38 sec - 808 7E31 E5 E1 sbc LineLength - 809 ;multiply difference by 8 - 810 7E33 18 clc - 811 7E34 69 01 adc #1 - 812 7E36 0A 0A 0A :3 asl - 813 7E39 A8 tay - 814 ; check shields - 815 7E3A BD FD 43 lda ActiveDefenceWeapon,x - 816 7E3D C9 26 cmp #ind_Shield_________ ; one hit shield - 817 7E3F F0 25 beq UseShield - 818 7E41 C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute - 819 7E43 F0 12 beq UseShieldWithEnergy - 820 7E45 C9 27 cmp #ind_Heavy_Shield___ ; shield with energy - 821 7E47 F0 0E beq UseShieldWithEnergy - 822 7E49 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - 823 7E4B F0 0A beq UseShieldWithEnergy - 824 7E4D C9 25 cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - 825 7E4F F0 06 beq UseShieldWithEnergy - 826 7E51 20 74 57 jsr DecreaseEnergyX - 827 7E54 4C 81 7E jmp EndOfDistanceCheckLoop - 828 7E57 UseShieldWithEnergy - 829 7E57 20 B0 57 jsr DecreaseShieldEnergyX - 830 7E5A C0 00 cpy #0 ; is necessary to reduce tenk energy ? - 831 7E5C F0 03 beq ShieldCoveredTank - 832 7E5E 20 74 57 jsr DecreaseEnergyX - 833 7E61 ShieldCoveredTank - 834 7E61 BD A8 43 lda ShieldEnergy,x - 835 7E64 D0 1B jne EndOfDistanceCheckLoop - 836 7E66 ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) - 837 7E66 UseShield - 838 7E66 A9 01 85 AA mva #1 Erase - 839 7E6A A5 6C lda TankNr - 840 7E6C 48 pha ; store TankNr - 841 7E6D 86 6C stx TankNr ; store X in TankNr :) - 842 7E6F 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 843 7E72 A9 00 lda #0 - 844 7E74 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defense weapons - 845 7E77 85 AA sta Erase - 846 7E79 20 2C 6A jsr DrawTankNr ; draw tank without shield - 847 7E7C A6 6C ldx TankNr ; restore X value :) - 848 7E7E 68 pla - 849 7E7F 85 6C sta TankNr ; restore TankNr value :) - 850 7E81 TankIsNotWithinTheRange - 851 7E81 EndOfDistanceCheckLoop - 852 7E81 CA dex - 853 7E82 30 03 4C F9 7D jpl DistanceCheckLoop - 854 7E87 A9 15 85 9E mva #sfx_silencer sfx_effect - 855 7E8B 60 rts - 856 .endp - 857 ; ----------------- - 858 7E8C .proc xriotbomb ; - 859 ; ----------------- - 860 7E8C A9 11 85 9E mva #sfx_riot_blast sfx_effect - 861 7E90 A9 00 lda #0 - 862 7E92 85 AB sta radius - 863 7E94 85 A9 sta color - 864 7E96 rbombLoop - 865 7E96 20 4A 68 jsr circle - 866 7E99 E6 AB inc radius - 867 7E9B A5 AB lda radius - 868 7E9D C5 B0 cmp ExplosionRadius - 869 7E9F D0 F5 bne rbombLoop - 870 7EA1 A9 01 85 A9 mva #1 color - 871 7EA5 60 rts - 872 .endp - 873 ; ---------------- - 874 7EA6 .proc xroller ; - 875 ; now collisions are detected with modified draw routine - 876 ; therefore YDRAW value must be taken from mountaintable - 877 7EA6 20 5A 7F jsr checkRollDirection - 878 ; HowMuchToFall - direction - 879 ; $FF - we are in a hole (flying in missile direction) - 880 ; 1 - right, 2 - left - 881 7EA9 Rollin - 882 7EA9 A9 0E 85 9E mva #sfx_shield_off sfx_effect - 883 7EAD 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 884 7EBA A0 00 ldy #0 - 885 7EBC B1 78 lda (tempXROLLER),y - 886 7EBE 8D 37 44 sta HeightRol ; relative point - 887 - 888 7EC1 RollinContinues - 889 7EC1 20 89 5A jsr WaitOneFrame - 890 7EC4 20 89 5A jsr WaitOneFrame - 891 ; new point is set - 892 7EC7 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 893 7ED4 A0 00 ldy #0 - 894 7ED6 B1 78 lda (tempXROLLER),y - 895 7ED8 85 63 sta ydraw - 896 7EDA 84 64 sty ydraw+1 - 897 7EDC F0 43 beq ExplodeNow - 898 7EDE CD 37 44 cmp HeightRol - 899 7EE1 F0 02 beq UpNotYet - 900 7EE3 90 3C bcc ExplodeNow - 901 7EE5 UpNotYet - 902 7EE5 38 sec ;clc - 903 7EE6 8D 37 44 sta HeightRol - 904 7EE9 E9 01 sbc #1 - 905 7EEB 85 63 sta ydraw - 906 ;check tank collision prior to PLOT - 907 7EED 84 BF sty HitFlag ; set to 0 - 908 - 909 7EEF 20 84 8E jsr CheckCollisionWithTank - 910 - 911 7EF2 A5 BF lda HitFlag - 912 7EF4 D0 2B bne ExplodeNow - 913 7EF6 20 71 75 jsr unPlot - 914 ; let's go the right direction - 915 7EF9 A5 C5 lda HowMuchToFall - 916 7EFB C9 01 cmp #1 - 917 7EFD F0 10 beq HowMuchToFallRight2 - 918 7EFF A5 61 D0 02 C6 62 + .nowarn dew xdraw - 919 7F07 A5 61 lda xdraw - 920 7F09 05 62 ora xdraw+1 - 921 7F0B D0 B4 jne RollinContinues ; like cpw xdraw #0 - 922 7F0D F0 12 beq ExplodeNow - 923 7F0F HowMuchToFallRight2 - 924 7F0F E6 61 D0 02 E6 62 inw xdraw - 925 7F15 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 926 7F1F D0 A0 jne RollinContinues - 927 7F21 ExplodeNow - 928 7F21 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store somewhere (BAD) - 929 7F29 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw (BAD) - 930 7F31 A9 00 85 61 85 62 mwa #0 xdraw - 931 7F37 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 932 7F3F 20 71 75 jsr unPlot - 933 7F42 A5 B3 85 61 A5 B4 + mwa xcircle xdraw ;(bad) - 934 7F4A A5 B5 85 63 A5 B6 + mwa ycircle ydraw ;(bad) - 935 - 936 ; finally a little explosion - 937 7F52 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 938 7F56 4C C5 7D jmp xmissile - 939 7F59 60 rts - 940 .endp - 941 ; -------------------------------------------------- - 942 7F5A .proc checkRollDirection - 943 ; check rolling direction (for roller and other rolling weapons) - 944 ; xdraw (word) - X coordinate - 945 ; Y coordinate is taken from mountaintable and go to ydraw (word) - 946 ; shoot direction is taken from VX+3 - 947 ; result: - 948 ; HowMuchToFall - direction - 949 ; $FF - we are in a hole (flying in missile direction) - 950 ; 1 - right, 2 - left - 951 ; -------------------------------------------------- - 952 7F5A A0 00 ldy #0 - 953 7F5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 954 7F69 B1 78 lda (tempXROLLER),y - 955 7F6B 85 63 sta ydraw - 956 7F6D 84 64 sty ydraw+1 - 957 - 958 7F6F A5 BE lda vx+3 - 959 ; if horizontal velocity is negative then change the direction - 960 7F71 10 06 bpl PositiveVelocity - 961 7F73 A5 E6 lda goleft - 962 7F75 09 01 ora #$01 - 963 7F77 85 E6 sta goleft - 964 7F79 PositiveVelocity - 965 ; first we look for the left slope - 966 ; then righ slope and set the flag - 967 ; $FF - we are in a hole (flying in missile direction) - 968 ; 1 - right, 2 - left - 969 7F79 A9 FF 85 C5 mva #$ff HowMuchToFall - 970 7F7D A5 63 8D 37 44 mva ydraw HeightRol - 971 7F82 SeekLeft - 972 7F82 A5 79 C9 46 D0 04 + cpw tempXROLLER #mountaintable - 973 7F8C F0 13 beq GoRightNow ; "bounce" if we have on left end - 974 7F8E A5 78 D0 02 C6 79 + .nowarn dew tempXROLLER - 975 7F96 B1 78 lda (tempXROLLER),y ;fukk! beware of Y value - 976 7F98 CD 37 44 cmp HeightRol - 977 7F9B HowMuchToFallLeft - 978 7F9B B0 04 bcs GoRightNow - 979 7F9D A9 01 85 C5 mva #1 HowMuchToFall - 980 7FA1 GoRightNow - 981 7FA1 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 982 7FAE SeekRight - 983 7FAE A5 79 C9 47 D0 04 + cpw tempXROLLER #(mountaintable+screenwidth) - 984 7FB8 F0 1B beq HowMuchToFallKnown ; "stop" if we have on left end - 985 7FBA E6 78 D0 02 E6 79 inw tempXROLLER - 986 7FC0 B1 78 lda (tempXROLLER),y - 987 7FC2 CD 37 44 cmp HeightRol - 988 7FC5 HowMuchToFallRight - 989 7FC5 B0 0E bcs HowMuchToFallKnown - 990 7FC7 A5 C5 lda HowMuchToFall - 991 7FC9 10 06 bpl ItIsLeftAlready - 992 7FCB A9 02 85 C5 mva #2 HowMuchToFall - 993 7FCF D0 04 bne HowMuchToFallKnown - 994 7FD1 ItIsLeftAlready - 995 7FD1 A9 FF 85 C5 mva #$ff HowMuchToFall - 996 7FD5 HowMuchToFallKnown - 997 7FD5 A5 C5 lda HowMuchToFall - 998 7FD7 10 07 bpl DirectionChecked - 999 7FD9 A9 01 lda #1 - 1000 7FDB 18 clc - 1001 7FDC 65 E6 adc goleft - 1002 7FDE 85 C5 sta HowMuchToFall - 1003 7FE0 DirectionChecked - 1004 7FE0 60 rts - 1005 .endp - 1006 - 1007 ; -------------------------------------------------- - 1008 7FE1 .proc ofdirt ; - 1009 ; -------------------------------------------------- - 1010 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height - 1011 7FE1 A9 13 85 9E mva #sfx_dirt_chrg_s sfx_effect - 1012 - 1013 7FE5 A9 01 85 A9 mva #1 color - 1014 7FE9 NoColor ; jump here with color=0 to clean dirt - 1015 7FE9 A5 61 85 B3 A5 62 + mwa xdraw xcircle - 1016 7FF1 A5 63 85 B5 A5 64 + mwa ydraw ycircle - 1017 7FF9 A9 01 lda #1 - 1018 ; current dirt width - 1019 7FFB 85 C6 sta magic - 1020 7FFD NextRow - 1021 7FFD 20 89 5A jsr WaitOneFrame - 1022 8000 A4 C6 ldy magic - 1023 8002 NextLine - 1024 8002 AD 1B D4 lda random - 1025 8005 29 01 and #$01 - 1026 8007 F0 07 beq DoNotPlot - 1027 8009 84 C7 sty magic+1 - 1028 800B 20 14 76 jsr plot - 1029 800E A4 C7 ldy magic+1 - 1030 8010 DoNotPlot - 1031 8010 E6 61 D0 02 E6 62 inw xdraw - 1032 8016 88 dey - 1033 8017 D0 E9 bne NextLine - 1034 8019 C6 63 dec ydraw ; 1 line up - 1035 801B A5 63 lda ydraw - 1036 801D C9 FF cmp #$ff - 1037 801F F0 1B beq EndOfTheDirt ;if horizontal Counter wraps - 1038 8021 E6 C6 inc magic ; width+2 - 1039 8023 E6 C6 inc magic - 1040 8025 A5 C6 lda magic - 1041 8027 85 C7 sta magic+1 ; just for a second - 1042 8029 46 C7 lsr magic+1 - 1043 802B 38 sec - 1044 802C A5 B3 lda xcircle - 1045 802E E5 C7 sbc magic+1 - 1046 8030 85 61 sta xdraw - 1047 8032 A5 B4 lda xcircle+1 - 1048 8034 E9 00 sbc #0 - 1049 8036 85 62 sta xdraw+1 ; new starting coordinate in a given row - 1050 8038 C6 B0 dec ExplosionRadius - 1051 803A D0 C1 bne NextRow - 1052 803C EndOfTheDirt - 1053 803C A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 1054 8044 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 1055 804C 60 rts - 1056 .endp - 1057 ;-------------------------------------------------- - 1058 804D .proc BeforeFire ;TankNr (byte) - 1059 ;-------------------------------------------------- - 1060 ;this nice routine makes the whole shooting - 1061 ;preparation: aiming and displaying - 1062 ;angle and shooting force values - 1063 ; - 1064 - 1065 ;first, get current parameters (angle+force) - 1066 ;for an active tank and display them - 1067 ;(these values are taken from the previous round) - 1068 - 1069 804D A6 6C ldx TankNr - 1070 - 1071 ;Checking the maximal force - 1072 804F BD EB 43 lda MaxForceTableH,x - 1073 8052 DD DF 43 cmp ForceTableH,x - 1074 8055 D0 06 bne ContinueToCheckMaxForce2 - 1075 8057 BD E5 43 lda MaxForceTableL,x - 1076 805A DD D9 43 cmp ForceTableL,x - 1077 805D ContinueToCheckMaxForce2 - 1078 805D B0 0C bcs @+ - 1079 805F BD EB 43 lda MaxForceTableH,x - 1080 8062 9D DF 43 sta ForceTableH,x - 1081 8065 BD E5 43 lda MaxForceTableL,x - 1082 8068 9D D9 43 sta ForceTableL,x - 1083 @ - 1084 806B A9 00 85 AA mva #0 Erase - 1085 806F 20 0F 66 jsr PutTankNameOnScreen - 1086 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 1087 - 1088 8072 20 2C 6A jsr DrawTankNr - 1089 - 1090 8075 20 89 5A jsr WaitOneFrame ; best after drawing a tank - 1091 - 1092 8078 24 97 bit TestFlightFlag - 1093 807A 10 03 bpl @+ - 1094 807C 20 23 83 jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation - 1095 @ - 1096 ;keyboard reading - 1097 ; KBCODE keeps code of last keybi - 1098 ; SKSTAT $ff - nothing pressed - 1099 ; $FB - any key - 1100 ; $f7 - shift - 1101 ; $f3 - shift+key - 1102 - 1103 807F notpressed - 1104 807F A6 6C ldx TankNr ; for optimize - 1105 ; Select and Option - 1106 8081 A5 02 lda CONSOL - 1107 8083 A8 tay - 1108 8084 29 05 and #%00000101 ; Start + Option - 1109 8086 F0 2C beq QuitToGameover - 1110 8088 98 tya - 1111 8089 29 04 and #%00000100 - 1112 808B F0 3C beq callActivation ; Option key - 1113 808D 98 tya - 1114 808E 29 02 and #%00000010 - 1115 8090 D0 03 4C A0 82 jeq pressedTAB ; Select key - 1116 8095 A5 02 lda SKSTAT - 1117 8097 C9 FF cmp #$ff - 1118 8099 D0 03 4C 52 81 jeq checkJoy - 1119 809E C9 F7 cmp #$f7 ; SHIFT - 1120 80A0 D0 03 4C 52 81 jeq checkJoy - 1121 - 1122 80A5 A5 02 lda kbcode - 1123 80A7 29 BF and #%10111111 ; SHIFT elimination - 1124 - 1125 80A9 C9 08 cmp #@kbcode._O ; $08 ; O - 1126 80AB D0 0C bne @+ - 1127 80AD 20 AE 73 jsr AreYouSure - 1128 80B0 24 D7 bit escFlag - 1129 80B2 10 CB bpl notpressed - 1130 ;---O pressed-quit game to game over screen--- - 1131 80B4 QuitToGameover - 1132 80B4 A9 40 85 D7 mva #$40 escFlag - 1133 80B8 60 rts - 1134 @ - 1135 80B9 C9 1C cmp #@kbcode._esc ; 28 ; ESC - 1136 80BB D0 08 bne @+ - 1137 80BD 20 AE 73 jsr AreYouSure - 1138 80C0 24 D7 bit escFlag - 1139 80C2 10 BB bpl notpressed - 1140 ;---esc pressed-quit game--- - 1141 80C4 60 rts - 1142 @ - 1143 80C5 C9 3F cmp #@kbcode._A ; $3f ; A - 1144 80C7 D0 09 bne @+ - 1145 80C9 callActivation - 1146 ; Hide all tanks - after inventory they may have other shapes - 1147 80C9 20 0B 6A jsr ClearTanks - 1148 80CC 20 AC 63 jsr DefensivesActivate - 1149 80CF 4C E0 80 jmp afterInventory - 1150 - 1151 @ - 1152 80D2 C9 0D cmp #@kbcode._I ; $0d ; I - 1153 80D4 D0 2D bne @+ - 1154 80D6 callInventory - 1155 ; Hide all tanks - after inventory they may have other shapes - 1156 80D6 20 0B 6A jsr ClearTanks - 1157 ; - 1158 80D9 A9 FF 85 E4 mva #$ff isInventory - 1159 80DD 20 C0 63 jsr Purchase - 1160 80E0 afterInventory - 1161 80E0 20 89 5A jsr MakeDarkScreen - 1162 80E3 20 0F 66 jsr DisplayStatus - 1163 80E6 20 E4 76 jsr SetMainScreen - 1164 80E9 20 12 6A jsr DrawTanks - 1165 ;jsr WaitOneFrame ; not necessary - 1166 80EC 24 5E bit LazyFlag - 1167 80EE 50 03 bvc NoLazy - 1168 80F0 20 4A 8B jsr LazyBoys - 1169 80F3 NoLazy - 1170 80F3 24 5F bit SpyHardFlag - 1171 80F5 10 03 bpl NoSpyHard - 1172 80F7 20 FC 8A jsr SpyHard - 1173 80FA NoSpyHard - 1174 80FA RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 80FA A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: weapons.asm - 1175 80FC A9 00 85 D7 mva #0 escFlag - 1176 8100 4C F3 82 jmp ReleaseAndLoop - 1177 @ - 1178 8103 C9 8E cmp #$80|@kbcode._up - 1179 8105 D0 03 4C AD 81 jeq CTRLPressedUp - 1180 810A C9 8F cmp #$80|@kbcode._down - 1181 810C D0 03 4C E8 81 jeq CTRLPressedDown - 1182 8111 C9 AC cmp #$80|@kbcode._tab - 1183 8113 D0 03 4C BF 82 jeq CTRLPressedTAB - 1184 - 1185 8118 jumpFromStick - 1186 .IF TARGET = 800 - 1187 cmp #$80|17 ; Ctrl+Help - 1188 bne NoVdebugSwitch - 1189 lda Vdebug - 1190 eor #$ff - 1191 sta Vdebug - 1192 jmp ReleaseAndLoop - 1193 NoVdebugSwitch - 1194 .ENDIF - 1195 8118 29 3F and #$3f ;CTRL and SHIFT ellimination - 1196 811A C9 0E cmp #@kbcode._up ; $e - 1197 811C F0 55 jeq pressedUp - 1198 811E C9 0F cmp #@kbcode._down ; $f - 1199 8120 D0 03 4C BE 81 jeq pressedDown - 1200 8125 C9 06 cmp #@kbcode._left ; $6 - 1201 8127 D0 03 4C 51 82 jeq pressedLeft - 1202 812C C9 07 cmp #@kbcode._right ; $7 - 1203 812E D0 03 4C 02 82 jeq pressedRight - 1204 8133 C9 21 cmp #@kbcode._space ; $21 - 1205 8135 D0 03 4C F9 82 jeq pressedSpace - 1206 813A C9 2C cmp #@kbcode._tab ; $2c - 1207 813C D0 03 4C A0 82 jeq pressedTAB - 1208 8141 C9 25 cmp #@kbcode._M ; $25 ; M - 1209 8143 D0 03 4C DE 82 jeq pressedM - 1210 8148 C9 3E cmp #@kbcode._S ; $3e ; S - 1211 814A D0 03 4C EB 82 jeq pressedS - 1212 .IF TARGET = 800 - 1213 cmp #61 ; G - 1214 bne EndKeys - 1215 jsr SelectNextGradient.NotWind - 1216 jmp ReleaseAndLoop - 1217 .ENDIF - 1218 814F EndKeys - 1219 814F 4C 7F 80 jmp notpressed - 1220 8152 checkJoy - 1221 ;------------JOY------------- - 1222 ;happy happy joy joy - 1223 ;check for joystick now - 1224 8152 A5 02 lda STICK0 - 1225 8154 29 0F and #$0f - 1226 8156 C9 0F cmp #$0f - 1227 8158 F0 0B beq notpressedJoy - 1228 815A A8 tay - 1229 815B A9 00 85 02 mva #0 ATRACT ; reset atract mode - 1230 815F B9 5A 60 lda joyToKeyTable,y - 1231 8162 4C 18 81 jmp jumpFromStick - 1232 8165 notpressedJoy - 1233 ;fire - 1234 8165 A5 02 lda STRIG0 - 1235 8167 D0 03 4C F9 82 jeq pressedSpace - 1236 816C A9 FF 85 9B mva #$ff pressTimer ; stop counting frames - 1237 8170 4C 7F 80 jmp notpressed - 1238 - 1239 ; - 1240 8173 pressedUp - 1241 8173 A5 9B lda pressTimer - 1242 8175 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1243 817B C9 19 cmp #25 ; 1/2s - 1244 817D B0 2E bcs CTRLPressedUp - 1245 - 1246 - 1247 ;force increaseeee! - 1248 ;ldx TankNr ; optimized - 1249 817F FE D9 43 inc ForceTableL,x - 1250 8182 D0 03 bne CheckingMaxForce - 1251 8184 FE DF 43 inc ForceTableH,x - 1252 - 1253 8187 CheckingMaxForce - 1254 - 1255 8187 A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1256 - 1257 818B BD EB 43 lda MaxForceTableH,x - 1258 818E DD DF 43 cmp ForceTableH,x - 1259 8191 D0 06 bne FurtherCheckMaxForce - 1260 8193 BD E5 43 lda MaxForceTableL,x - 1261 8196 DD D9 43 cmp ForceTableL,x - 1262 8199 FurtherCheckMaxForce - 1263 8199 90 03 4C 4D 80 jcs BeforeFire - 1264 - 1265 819E BD EB 43 lda MaxForceTableH,x - 1266 81A1 9D DF 43 sta ForceTableH,x - 1267 81A4 BD E5 43 lda MaxForceTableL,x - 1268 81A7 9D D9 43 sta ForceTableL,x - 1269 - 1270 81AA 4C 4D 80 jmp BeforeFire - 1271 - 1272 81AD CTRLPressedUp - 1273 ;ldx TankNr ; optimized - 1274 81AD BD D9 43 lda ForceTableL,x - 1275 81B0 18 clc - 1276 81B1 69 0A adc #10 - 1277 81B3 9D D9 43 sta ForceTableL,x - 1278 81B6 90 CF bcc CheckingMaxForce - 1279 81B8 FE DF 43 inc ForceTableH,x - 1280 81BB 4C 87 81 jmp CheckingMaxForce - 1281 - 1282 - 1283 81BE pressedDown - 1284 81BE A5 9B lda pressTimer - 1285 81C0 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1286 81C6 C9 19 cmp #25 ; 1/2s - 1287 81C8 B0 1E bcs CTRLPressedDown - 1288 - 1289 81CA A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1290 - 1291 ;ldx TankNr ; optimized - 1292 81CE DE D9 43 dec ForceTableL,x - 1293 81D1 BD D9 43 lda ForceTableL,x - 1294 81D4 C9 FF cmp #$ff - 1295 81D6 D0 0D bne @+ - 1296 81D8 DE DF 43 dec ForceTableH,x - 1297 81DB 10 08 bpl @+ - 1298 81DD ForceGoesZero - 1299 81DD A9 00 lda #0 - 1300 81DF 9D DF 43 sta ForceTableH,x - 1301 81E2 9D D9 43 sta ForceTableL,x - 1302 @ - 1303 81E5 4C 4D 80 jmp BeforeFire - 1304 - 1305 81E8 CTRLPressedDown - 1306 81E8 A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1307 - 1308 ;ldx TankNr ; optimized - 1309 81EC 38 sec - 1310 81ED BD D9 43 lda ForceTableL,x - 1311 81F0 E9 0A sbc #10 - 1312 81F2 9D D9 43 sta ForceTableL,x - 1313 81F5 90 03 4C 4D 80 jcs BeforeFire - 1314 81FA DE DF 43 dec ForceTableH,x - 1315 81FD 30 DE bmi ForceGoesZero - 1316 81FF 4C 4D 80 jmp BeforeFire - 1317 - 1318 8202 pressedRight - 1319 ;ldx TankNr ; optimized - 1320 8202 A5 9B lda pressTimer - 1321 8204 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1322 820A C9 19 cmp #25 ; 1/2s - 1323 820C B0 20 bcs CTRLPressedRight - 1324 - 1325 820E A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1326 8212 A9 01 85 AA mva #1 Erase - 1327 8216 20 48 6B jsr DrawTankNr.BarrelChange - 1328 8219 DE C3 48 BD C3 48 dec:lda AngleTable,x - 1329 821F C9 FF cmp #255 ; -1 - 1330 8221 F0 03 4C 4D 80 jne BeforeFire - 1331 8226 A9 B4 lda #180 - 1332 8228 9D C3 48 sta AngleTable,x - 1333 822B 4C 4D 80 jmp BeforeFire - 1334 - 1335 822E CTRLPressedRight - 1336 ;ldx TankNr ; optimized - 1337 822E A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1338 8232 A9 01 85 AA mva #1 Erase - 1339 8236 20 48 6B jsr DrawTankNr.BarrelChange - 1340 8239 BD C3 48 lda AngleTable,x - 1341 823C 38 sec - 1342 823D E9 04 sbc #4 - 1343 823F 9D C3 48 sta AngleTable,x - 1344 8242 C9 04 cmp #4 ; smallest angle for speed rotating - 1345 8244 90 03 4C 4D 80 jcs BeforeFire - 1346 8249 A9 B4 lda #180 - 1347 824B 9D C3 48 sta AngleTable,x - 1348 824E 4C 4D 80 jmp BeforeFire - 1349 - 1350 - 1351 8251 pressedLeft - 1352 ;ldx TankNr ; optimized - 1353 8251 A5 9B lda pressTimer - 1354 8253 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1355 8259 C9 19 cmp #25 ; 1/2s - 1356 825B B0 20 bcs CTRLPressedLeft - 1357 - 1358 825D A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1359 8261 A9 01 85 AA mva #1 Erase - 1360 8265 20 48 6B jsr DrawTankNr.BarrelChange - 1361 8268 FE C3 48 INC AngleTable,x - 1362 826B BD C3 48 lda AngleTable,x - 1363 826E C9 B4 cmp #180 - 1364 8270 B0 03 4C 4D 80 jcc BeforeFire - 1365 8275 A9 00 lda #0 - 1366 8277 9D C3 48 sta AngleTable,x - 1367 827A 4C 4D 80 jmp BeforeFire - 1368 - 1369 827D CTRLPressedLeft - 1370 ;ldx TankNr ; optimized - 1371 827D A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1372 8281 A9 01 85 AA mva #1 Erase - 1373 8285 20 48 6B jsr DrawTankNr.BarrelChange - 1374 8288 BD C3 48 lda AngleTable,x - 1375 828B 18 clc - 1376 828C 69 04 adc #4 - 1377 828E 9D C3 48 sta AngleTable,x - 1378 8291 C9 B0 cmp #180-4 - 1379 8293 B0 03 4C 4D 80 jcc BeforeFire - 1380 8298 A9 00 lda #0 - 1381 829A 9D C3 48 sta AngleTable,x - 1382 829D 4C 4D 80 jmp BeforeFire - 1383 - 1384 82A0 pressedTAB - 1385 82A0 A9 17 85 9E mva #sfx_purchase sfx_effect - 1386 ;ldx TankNr ; optimized - 1387 82A4 BD F7 43 lda ActiveWeapon,x - 1388 82A7 C9 1F cmp #last_offensive_____ ; the last possible offensive weapon - 1389 82A9 D0 07 bne ?notlasttofirst - 1390 82AB A9 00 lda #first_offensive____ ; #0 - 1391 82AD 9D F7 43 sta ActiveWeapon,x - 1392 82B0 F0 03 beq @+ ; allways = 0 - 1393 82B2 ?notlasttofirst - 1394 82B2 FE F7 43 inc ActiveWeapon,x - 1395 @ - 1396 82B5 BD F7 43 lda ActiveWeapon,x - 1397 82B8 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... - 1398 82BB F0 E3 beq pressedTAB - 1399 82BD D0 34 bne ReleaseAndLoop - 1400 - 1401 82BF CTRLpressedTAB - 1402 82BF A9 17 85 9E mva #sfx_purchase sfx_effect - 1403 ;ldx TankNr ; optimized - 1404 82C3 BD F7 43 lda ActiveWeapon,x - 1405 82C6 C9 00 cmp #first_offensive____ ; #0 - 1406 82C8 D0 07 bne ?notfirsttolast - 1407 82CA A9 1F lda #last_offensive_____ ; the last possible offensive weapon - 1408 82CC 9D F7 43 sta ActiveWeapon,x - 1409 82CF D0 03 bne @+ ; allways <> 0 - 1410 82D1 ?notfirsttolast - 1411 82D1 DE F7 43 dec ActiveWeapon,x - 1412 @ - 1413 82D4 BD F7 43 lda ActiveWeapon,x - 1414 82D7 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... - 1415 82DA F0 E3 beq CTRLpressedTAB - 1416 82DC D0 15 bne ReleaseAndLoop - 1417 - 1418 82DE pressedM - 1419 ; have you tried turning the music off and on again? - 1420 82DE A9 FF lda #$ff - 1421 82E0 4D 00 41 8D 00 41 eor:sta noMusic - 1422 82E6 RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 82E6 A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: weapons.asm - 1423 82E8 4C F3 82 jmp ReleaseAndLoop - 1424 - 1425 82EB pressedS - 1426 ; have you tried turning sfx off and on again? - 1427 82EB A9 FF lda #$ff - 1428 82ED 4D 01 41 8D 01 41 eor:sta noSfx - 1429 82F3 ReleaseAndLoop - 1430 82F3 20 71 5A jsr WaitForKeyRelease - 1431 82F6 4C 4D 80 jmp BeforeFire - 1432 - 1433 82F9 pressedSpace - 1434 ;================================= - 1435 ;we shoot here!!! - 1436 82F9 A9 00 lda #0 - 1437 82FB 85 02 sta ATRACT ; reset atract mode - 1438 82FD 85 9B sta pressTimer ; reset - 1439 82FF 20 71 5A jsr WaitForKeyRelease.StillWait - 1440 8302 A5 9B lda pressTimer - 1441 8304 C9 19 cmp #25 ; 1/2s - 1442 8306 90 03 bcc fire - 1443 8308 4C D6 80 jmp callInventory - 1444 830B fire - 1445 830B 60 RTS - 1446 .endp - 1447 - 1448 ;-------------------------------------------------- - 1449 830C .proc Shoot ;TankNr (byte) - 1450 ;-------------------------------------------------- - 1451 ;it looks like this routine is too big - - 1452 ;- more and more functions were being added... - 1453 ;good idea would be to rewrite it completely - 1454 ;with much more separate blocks, but you know - - 1455 ;- do not touch it if it works... - 1456 - 1457 830C A9 00 85 97 mva #0 TestFlightFlag - 1458 - 1459 ;the latest addition to this routine is - 1460 ;displaying offensive texts! - 1461 - 1462 8310 RandomizeOffensiveText - 1463 8310 AD 1B D4 lda random - 1464 8313 C9 36 cmp #talk.NumberOfOffensiveTexts - 1465 8315 B0 F9 bcs RandomizeOffensiveText - 1466 - 1467 8317 8D C0 48 sta TextNumberOff - 1468 831A A4 6C ldy TankNr - 1469 831C A9 FF 85 DB mva #$ff plot4x4color - 1470 8320 20 88 72 jsr DisplayOffensiveTextNr - 1471 - 1472 8323 AfterOffensiveText - 1473 8323 A9 00 8D 8B 44 mva #0 LaserFlag ; $ff - Laser - 1474 8328 A6 6C ldx TankNr - 1475 832A BD F7 43 lda ActiveWeapon,x - 1476 832D C9 1F cmp #ind_Laser__________ ; laser - 1477 832F D0 15 bne NotStrongShoot - 1478 ; Laser: (not)very strong - invisible - shot for laser beam end coordinates - 1479 8331 24 60 bit Vdebug - 1480 8333 30 04 bmi @+ - 1481 8335 A9 00 85 A9 mva #0 color - 1482 8339 A9 01 @ lda #1 - 1483 833B 85 A4 sta Force - 1484 833D 85 A5 sta Force+1 - 1485 833F A9 FF 8D 8B 44 mva #$ff LaserFlag ; $ff - Laser - 1486 8344 D0 0B bne AfterStrongShoot - 1487 8346 NotStrongShoot - 1488 8346 20 96 59 jsr Table2Force - 1489 8349 24 97 bit TestFlightFlag - 1490 834B 30 04 bmi AfterStrongShoot - 1491 834D A9 19 85 9E mva #sfx_shoot sfx_effect - 1492 8351 AfterStrongShoot - 1493 8351 BD C3 48 lda AngleTable,x - 1494 8354 85 A7 sta Angle - 1495 - 1496 ; Shoots tank nr X !!! :) - 1497 ; set the starting coordinates of bullet with correction - 1498 ; to start where the tank's barrel ends - 1499 ; (without it bullet would go from the left lower corner of the tank) - 1500 ;ldx TankNr - 1501 - 1502 8356 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 - 1503 8360 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 - 1504 8365 A9 00 lda #0 - 1505 8367 85 A6 sta Force+2 - 1506 8369 85 CD sta ytraj+2 - 1507 836B 85 C8 sta xtraj - 1508 836D 85 CB sta ytraj - 1509 - 1510 ; checking if the shot is underground (no Flight but Hit :) ) - 1511 836F A8 tay ; A=0 ! - 1512 8370 18 A5 C9 69 3E 85 + adw xtraj+1 #mountaintable temp - 1513 837D A5 CC lda ytraj+1 - 1514 837F D1 72 cmp (temp),y ; check collision with mountains - 1515 8381 B0 08 bcs ShotUnderGround - 1516 8383 20 A0 83 jsr Flight - 1517 8386 A9 01 85 A9 mva #1 color - 1518 838A 60 rts - 1519 838B ShotUnderGround - 1520 838B A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? - 1521 8393 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 1522 839B A9 FF 85 BF mva #$ff HitFlag - 1523 839F 60 rts - 1524 .endp - 1525 - 1526 ;-------------------------------------------------- - 1527 83A0 .proc Flight ; Force(byte.byte), Wind(0.word) - 1528 ; Angle(byte) 128=0, 255=maxright, 0=maxleft - 1529 ; if 7bit and 6bit of TestFlightFlag is set no real flight - hit test only (for AI) - 1530 ; 7bit - fast, test flight - 1531 ; 6bit - invisible bullet - 1532 ;-------------------------------------------------- - 1533 ;g=-0.1 - 1534 ;vx=Force*cos(Angle) - 1535 ;vy=Force*sin(Angle) - 1536 ; - 1537 ;:begin - 1538 ;ytraj=ytray-vy - 1539 ;vy=vy-g - 1540 ;xtraj=xtraj+vx - without Wind - 1541 ;vx=vx+Wind (Wind is a small fraction) - 1542 ;plot xtraj,ytraj - there is clearing in plot - 1543 ;goto begin- - 1544 - 1545 - 1546 ; smoke tracer :) - 1547 83A0 A0 00 ldy #0 - 1548 83A2 24 97 bit TestFlightFlag ; if test flight for AI or Lazy Darwin - 1549 83A4 30 0A bmi noSmokeTracer ; no Smoke Tracer display - 1550 83A6 A6 6C ldx TankNr - 1551 83A8 BD F7 43 lda ActiveWeapon,x - 1552 83AB C9 0B cmp #ind_Smoke_Tracer___ ; Smoke tracer - 1553 83AD D0 01 bne noSmokeTracer - 1554 83AF C8 iny - 1555 83B0 noSmokeTracer - 1556 83B0 8C 8A 44 sty SmokeTracerFlag - 1557 - 1558 83B3 RepeatIfSmokeTracer - 1559 83B3 RepeatFlight - 1560 83B3 A5 CC 8D 92 44 A5 + mwa ytraj+1 Ytrajold+1 - 1561 83BD A5 C9 8D 8F 44 A5 + mwa xtraj+1 Xtrajold+1 - 1562 83C7 A9 40 8D 73 43 mva #%01000000 drawFunction - 1563 - 1564 83CC A9 00 lda #0 - 1565 83CE 85 BB sta vx - 1566 83D0 85 BC sta vx+1 - 1567 83D2 85 BD sta vx+2 - 1568 83D4 85 BF sta HitFlag - 1569 83D6 85 61 sta xdraw - 1570 83D8 85 62 sta xdraw+1 - 1571 83DA 85 63 sta ydraw - 1572 83DC 85 64 sta ydraw+1 - 1573 - 1574 ;vx calculation - 1575 ;vx = sin(90-Angle) for Angle <=90 - 1576 ;vx = -sin(Angle-90) for 90 < Angle <= 180 - 1577 83DE aslw Force ;Force = Force * 2 -Macro: ASLW [Source: MACRO.ASM] - 1 83DE 06 A4 ASL FORCE - 2 83E0 26 A5 ROL FORCE+1 -Source: weapons.asm - 1578 - 1579 ;cos(Angle) (but we use sin table only so some shenanigans happen) - 1580 83E2 A6 A7 ldx Angle - 1581 83E4 8E 15 45 stx LeapFrogAngle ; we will need it later - 1582 - 1583 ;Angle works like this: - 1584 ;0 'degrees' is horizontally right - 1585 ;90 'degrees' is straight up - 1586 ;180 horizontally left - 1587 - 1588 ; (we have to set goleft used in rolling weapons) - 1589 - 1590 83E7 E0 5B cpx #91 - 1591 83E9 90 0C bcc angleUnder90 - 1592 - 1593 ;over 90 - 1594 83EB A9 01 85 E6 mva #1 goleft - 1595 83EF 38 sec - 1596 83F0 8A txa ; lda # Angle - 1597 83F1 E9 5A sbc #90 - 1598 83F3 AA tax - 1599 83F4 4C 01 84 jmp @+ - 1600 - 1601 83F7 angleUnder90 - 1602 83F7 A9 00 85 E6 mva #0 goleft - 1603 83FB 38 sec ; X = 90-Angle - 1604 83FC A9 5A lda #90 - 1605 83FE E5 A7 sbc Angle - 1606 8400 AA tax - 1607 @ - 1608 8401 BD C1 5B lda sintable,x ; cos(X) - 1609 8404 8D 94 44 sta Multiplee ; *Force - 1610 8407 A5 A4 85 DC A5 A5 + mwa Force Multiplier - 1611 840F A9 00 lda #$0 - 1612 8411 85 DE sta Multiplier+2 - 1613 8413 A2 08 ldx #8 - 1614 8415 MultiplyLoop - 1615 8415 6E 94 44 ror Multiplee - 1616 8418 90 13 bcc DoNotAdd - 1617 841A 18 clc - 1618 841B A5 DC lda Multiplier - 1619 841D 65 BB adc vx - 1620 841F 85 BB sta vx - 1621 8421 A5 DD lda Multiplier+1 - 1622 8423 65 BC adc vx+1 - 1623 8425 85 BC sta vx+1 - 1624 8427 A5 DE lda Multiplier+2 - 1625 8429 65 BD adc vx+2 - 1626 842B 85 BD sta vx+2 - 1627 842D DoNotAdd - 1628 ;clc ;carry always cleared here (anyway we hope so :) - 1629 842D 26 DC rol Multiplier - 1630 842F 26 DD rol Multiplier+1 - 1631 8431 26 DE rol Multiplier+2 - 1632 8433 CA dex - 1633 8434 D0 DF bne MultiplyLoop - 1634 - 1635 8436 A9 00 85 BE mva #0 vx+3 - 1636 ; here in vx there is a number - 1637 ; xxxx.xx00 = sin(Angle)*Force - 1638 ; negate it if going left - 1639 843A A5 E6 lda goleft - 1640 843C F0 18 beq @+ - 1641 .rept 4 - 1642 LDA #$00 - 1643 SBC VX+# - 1644 STA VX+# - 1645 .endr -Source: REPT - 1642 843E A9 00 LDA #$00 - 1642 8440 E5 BB SBC VX+# - 1642 8442 85 BB STA VX+# - 1642 8444 A9 00 LDA #$00 - 1642 8446 E5 BC SBC VX+# - 1642 8448 85 BC STA VX+# - 1642 844A A9 00 LDA #$00 - 1642 844C E5 BD SBC VX+# - 1642 844E 85 BD STA VX+# - 1642 8450 A9 00 LDA #$00 - 1642 8452 E5 BE SBC VX+# - 1642 8454 85 BE STA VX+# -Source: weapons.asm - 1646 @ - 1647 ;======vy - 1648 ;vy = sin(Angle) for Angle <=90 - 1649 ;vy = sin(180-Angle) for 90 < Angle <= 180 - 1650 - 1651 8456 A9 00 lda #0 - 1652 8458 85 B7 sta vy - 1653 845A 85 B8 sta vy+1 - 1654 845C 85 B9 sta vy+2 - 1655 ;-- - 1656 845E A6 A7 ldx Angle - 1657 8460 E0 5B cpx #91 - 1658 8462 90 06 bcc YangleUnder90 - 1659 - 1660 8464 A9 B4 lda #180 - 1661 8466 38 sec - 1662 8467 E5 A7 sbc Angle - 1663 8469 AA tax - 1664 - 1665 846A YangleUnder90 - 1666 846A BD C1 5B lda sintable,x - 1667 - 1668 846D 8D 94 44 sta Multiplee ;sin(Angle)*Force - 1669 8470 A5 A4 85 DC A5 A5 + mwa Force Multiplier - 1670 8478 A9 00 lda #$0 - 1671 847A 85 DE sta Multiplier+2 - 1672 847C A2 08 ldx #8 - 1673 847E MultiplyLoopY - 1674 847E 6E 94 44 ror Multiplee - 1675 8481 90 13 bcc DoNotAddY - 1676 8483 18 clc - 1677 8484 A5 DC lda Multiplier - 1678 8486 65 B7 adc vy - 1679 8488 85 B7 sta vy - 1680 848A A5 DD lda Multiplier+1 - 1681 848C 65 B8 adc vy+1 - 1682 848E 85 B8 sta vy+1 - 1683 8490 A5 DE lda Multiplier+2 - 1684 8492 65 B9 adc vy+2 - 1685 8494 85 B9 sta vy+2 - 1686 8496 DoNotAddY - 1687 ;clc ;carry always cleared here (anyway we hope so :) - 1688 8496 26 DC rol Multiplier - 1689 8498 26 DD rol Multiplier+1 - 1690 849A 26 DE rol Multiplier+2 - 1691 849C CA dex - 1692 849D D0 DF bne MultiplyLoopY - 1693 ; here in vy there is a number - 1694 ; yyyy.yy=cos(Angle)*Force - 1695 - 1696 849F A9 00 85 BA mva #0 vy+3 ;vy=cos(Angle)*Force - 1697 - 1698 84A3 Loopi - 1699 ;ytraj=ytraj-vy (skipping least significant byte of vy) - 1700 84A3 38 sec - 1701 84A4 A5 CB lda ytraj - 1702 84A6 E5 B8 sbc vy+1 - 1703 84A8 85 CB sta ytraj - 1704 84AA A5 CC lda ytraj+1 - 1705 84AC E5 B9 sbc vy+2 - 1706 84AE 85 CC sta ytraj+1 - 1707 84B0 A5 CD lda ytraj+2 - 1708 84B2 E5 BA sbc vy+3 - 1709 84B4 85 CD sta ytraj+2 - 1710 - 1711 84B6 2C 8B 44 bit LaserFlag ; no gravity if Laser - 1712 84B9 30 25 bmi NoGravity - 1713 ;vy=vy-g (again without least significant byte of vy) - 1714 84BB 38 sec - 1715 84BC A5 B8 lda vy+1 - 1716 84BE E5 E0 sbc gravity - 1717 84C0 85 B8 sta vy+1 - 1718 84C2 A5 B9 lda vy+2 - 1719 84C4 E9 00 sbc #0 - 1720 84C6 85 B9 sta vy+2 - 1721 84C8 A5 BA lda vy+3 - 1722 84CA E9 00 sbc #0 - 1723 84CC 85 BA sta vy+3 - 1724 84CE 10 10 bpl StillUp - 1725 ; where we know that the bullet starts to fall down - 1726 ; we check if it is MIRV and if so, jump to MIRV routine - 1727 84D0 24 97 bit TestFlightFlag - 1728 84D2 30 0C bmi NoTestForMIRV - 1729 84D4 A6 6C ldx TankNr - 1730 84D6 BD F7 43 lda ActiveWeapon,x - 1731 84D9 C9 06 cmp #ind_MIRV___________ ; MIRV - 1732 84DB D0 03 4C 7C 87 jeq MIRVdownLoop - 1733 84E0 NoTestForMIRV - 1734 84E0 NoGravity - 1735 84E0 StillUp - 1736 - 1737 84E0 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx) - 1738 84E1 A5 C8 lda xtraj ;here of course Fight to right - 1739 84E3 65 BC adc vx+1 - 1740 84E5 85 C8 sta xtraj - 1741 84E7 A5 C9 lda xtraj+1 - 1742 84E9 65 BD adc vx+2 - 1743 84EB 85 C9 sta xtraj+1 - 1744 84ED A5 CA lda xtraj+2 - 1745 84EF 65 BE adc vx+3 - 1746 84F1 85 CA sta xtraj+2 - 1747 - 1748 84F3 2C 8B 44 bit LaserFlag ; no wind if Laser - 1749 84F6 30 19 bmi NoWind - 1750 84F8 18 clc - 1751 .rept 4 - 1752 LDA VX+# - 1753 ADC WIND+# - 1754 STA VX+# - 1755 .endr -Source: REPT - 1752 84F9 A5 BB LDA VX+# - 1752 84FB 65 CE ADC WIND+# - 1752 84FD 85 BB STA VX+# - 1752 84FF A5 BC LDA VX+# - 1752 8501 65 CF ADC WIND+# - 1752 8503 85 BC STA VX+# - 1752 8505 A5 BD LDA VX+# - 1752 8507 65 D0 ADC WIND+# - 1752 8509 85 BD STA VX+# - 1752 850B A5 BE LDA VX+# - 1752 850D 65 D1 ADC WIND+# - 1752 850F 85 BE STA VX+# -Source: weapons.asm - 1756 8511 NoWind - 1757 8511 AD 8F 44 85 61 AD + mwa xtrajold+1 xdraw - 1758 851B AD 92 44 85 63 AD + mwa ytrajold+1 ydraw - 1759 8525 A5 C9 85 65 A5 CA + mwa xtraj+1 xbyte - 1760 852D A5 CC 85 67 A5 CD + mwa ytraj+1 ybyte - 1761 8535 20 12 66 jsr draw - 1762 ;key - 1763 8538 2C 8B 44 bit LaserFlag - 1764 853B 30 03 bmi LaserNoWalls - 1765 ; Check for walls - 1766 853D 20 E7 89 jsr MakeWalls - 1767 ; - 1768 8540 LaserNoWalls - 1769 8540 A5 C9 8D 8F 44 A5 + mwa xtraj+1 XtrajOld+1 - 1770 854A A5 CC 8D 92 44 A5 + mwa ytraj+1 YtrajOld+1 - 1771 - 1772 8554 24 97 bit TestFlightFlag - 1773 8556 30 14 bmi nowait - 1774 8558 2C 8B 44 bit LaserFlag ; faster laser prepare - 1775 855B 10 04 bpl nolaserwait - 1776 855D 24 60 bit Vdebug - 1777 855F 10 0B bpl nowait - 1778 8561 nolaserwait - 1779 8561 A5 A9 lda color - 1780 8563 F0 04 beq nonowait ; smoke tracer erases slowly - 1781 8565 A5 E3 lda tracerflag - 1782 8567 D0 03 bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) - 1783 8569 nonowait - 1784 8569 20 A7 5A jsr shellDelay - 1785 - 1786 856C nowait - 1787 856C A5 BF lda HitFlag - 1788 856E D0 66 bne Hit - 1789 ; --- only for Laser - 1790 8570 2C 8B 44 bit LaserFlag - 1791 8573 10 29 bpl NoCheckEdgesForLaser - 1792 ; If laser fires, edges of the screen finish "flying" and laser hits. - 1793 8575 A5 CD lda ytraj+2 - 1794 8577 30 0C bmi LaserHitEdge - 1795 8579 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth ;+1 - 1796 8583 90 19 bcc LaserNoHitEdge - 1797 8585 LaserHitEdge - 1798 8585 A5 61 85 C1 A5 62 + mwa xdraw XHit - 1799 858D A5 63 8D 5F 44 A5 + mwa ydraw YHit - 1800 8597 A9 FF 85 BF mva #$ff HitFlag ; screen edgs like ground (only for Laser) - 1801 859B 4C EF 85 jmp EndOfFlight - 1802 859E LaserNoHitEdge - 1803 ; ------------------ - 1804 859E NoCheckEdgesForLaser - 1805 - 1806 859E A5 CD C9 00 D0 04 + cpw ytraj+1 #screenheight+1 - 1807 85A8 90 04 bcc YTrayLowerThanScreenHeight - 1808 85AA A5 CD lda ytraj+2 - 1809 85AC 10 41 bpl EndOfFlight - 1810 - 1811 85AE YTrayLowerThanScreenHeight ; it means it is still on screen and not above - 1812 - 1813 85AE SkipCollisionCheck - 1814 - 1815 85AE A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw - 1816 85B6 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 1817 - 1818 85BE 24 97 bit TestFlightFlag - 1819 85C0 50 0A bvc NoTestFlight - 1820 85C2 24 60 bit Vdebug - 1821 85C4 10 0D bpl NoUnplot - 1822 85C6 20 89 5A jsr WaitOneFrame ; visualize AI targeting - 1823 85C9 4C D0 85 jmp YesUnPlot - 1824 85CC NoTestFlight - 1825 85CC A5 E3 lda tracerflag - 1826 85CE D0 03 bne NoUnPlot - 1827 - 1828 85D0 YesUnPlot - 1829 85D0 20 71 75 jsr UnPlot - 1830 - 1831 85D3 NoUnPlot - 1832 - 1833 85D3 4C A3 84 jmp Loopi - 1834 - 1835 85D6 Hit - 1836 85D6 A5 C1 85 61 A5 C2 + mwa XHit xdraw - 1837 85DE AD 5F 44 85 63 AD + mwa YHit ydraw - 1838 85E8 24 97 bit TestFlightFlag - 1839 85EA 70 03 bvs EndOfFlight - 1840 85EC 20 71 75 jsr unPlot - 1841 85EF EndOfFlight - 1842 85EF A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store for a little while - 1843 85F7 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!! - 1844 85FF A9 00 85 61 85 62 mwa #0 xdraw - 1845 8605 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 1846 860D 20 71 75 jsr unPlot - 1847 8610 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 1848 8618 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 1849 - 1850 8620 AC 8A 44 ldy SmokeTracerFlag - 1851 8623 F0 07 beq EndOfFlight2 - 1852 8625 88 dey - 1853 8626 8C 8A 44 sty SmokeTracerFlag - 1854 8629 4C 4E 87 jmp SecondFlight - 1855 862C EndOfFlight2 - 1856 862C A9 00 85 E3 mva #0 tracerflag ; don't know why - 1857 - 1858 8630 24 97 bit TestFlightFlag - 1859 8632 10 03 4C F1 86 jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check - 1860 ; and now check for defensive-aggressive weapon - 1861 8637 A5 BF lda HitFlag - 1862 8639 D0 03 4C F1 86 jeq NoHitAtEndOfFight ; RTS only !!! - 1863 863E 10 03 4C F1 86 jmi NoTankHitAtEndOfFight - 1864 ; tank hit - increase direct hits points - 1865 8643 A6 6C ldx TankNr - 1866 8645 E8 inx - 1867 8646 E4 BF cpx HitFlag ; we don't count suicides :) - 1868 8648 F0 04 beq @+ - 1869 864A CA dex - 1870 864B FE C7 43 inc DirectHits,x - 1871 ; bne @+ ; one byte enough - 1872 ; inc DirectHitsH,x - 1873 @ - 1874 ; tank hit - check defensive weapon of this tank - 1875 864E AA tax - 1876 864F CA dex ; index of hitted tank in X - 1877 8650 A4 6C ldy TankNr - 1878 8652 B9 F7 43 lda ActiveWeapon,y - 1879 8655 C9 0A cmp #ind_Tracer_________ ; defence not fire by tracers - 1880 8657 F0 16 beq JNoDefence - 1881 8659 C9 0B cmp #ind_Smoke_Tracer___ - 1882 865B F0 12 beq JNoDefence - 1883 865D C9 1F cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser - 1884 865F F0 0E beq JNoDefence - 1885 8661 BD FD 43 lda ActiveDefenceWeapon,x - 1886 8664 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence - 1887 8666 D0 03 4C F6 86 jeq BouncyCastle - 1888 866B C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector - 1889 866D F0 03 beq MagDeflector - 1890 866F JNoDefence - 1891 866F 4C F1 86 jmp NoDefence - 1892 8672 MagDeflector - 1893 ; now run defensive-aggressive weapon - Mag Deflector! - 1894 ; get tank position - 1895 8672 18 clc - 1896 8673 BD 0D 44 lda xtankstableL,x - 1897 8676 69 04 adc #$04 ; almost in tak center :) - 1898 8678 85 C1 sta XHit - 1899 867A BD 13 44 lda xtankstableH,x - 1900 867D 69 00 adc #$00 - 1901 867F 85 C2 sta XHit+1 - 1902 8681 A9 FF lda #$ff ; change to ground hit (we hope) - 1903 8683 85 BF sta HitFlag - 1904 8685 2C 1B D4 bit random ; left or right deflection ? - 1905 8688 10 1D bpl RightDeflection - 1906 868A LeftDeflection - 1907 868A 38 A5 C1 E9 12 85 + sbw XHit #18 ; 18 pixels to left and explode... - 1908 8695 24 C2 bit XHit+1 ; if off-screen ... - 1909 8697 10 32 bpl EndOfMagDeflector ; hit of course but we need RTS - 1910 8699 18 A5 C1 69 24 85 + adw XHit #36 ; change to right :) - 1911 86A4 4C CB 86 jmp EndOfMagDeflector - 1912 86A7 RightDeflection - 1913 86A7 18 A5 C1 69 12 85 + adw XHit #18 ; 18 pixels to right and explode... - 1914 86B2 A5 C2 CD 41 01 D0 + cpw XHit screenwidth ; if off-screen ... - 1915 86BE B0 0B bcs EndOfMagDeflector ; hit of course but we need RTS - 1916 86C0 38 A5 C1 E9 24 85 + sbw XHit #36 ; change to left - 1917 86CB EndOfMagDeflector - 1918 86CB A9 01 85 AA mva #1 Erase - 1919 86CF A5 6C lda TankNr - 1920 86D1 48 pha ; store TankNr - 1921 86D2 86 6C stx TankNr ; store X in TankNr :) - 1922 86D4 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 1923 86D7 A9 00 lda #0 - 1924 86D9 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon - 1925 86DC 9D A8 43 sta ShieldEnergy,x - 1926 86DF 85 AA sta Erase - 1927 86E1 20 2C 6A jsr DrawTankNr ; draw tank without shield - 1928 86E4 A6 6C ldx TankNr ; restore X value :) - 1929 86E6 68 pla - 1930 86E7 85 6C sta TankNr ; restore TankNr value :) - 1931 86E9 A5 C1 85 61 A5 C2 + mwa XHit xdraw ; why? !!! - 1932 86F1 NoTankHitAtEndOfFight - 1933 86F1 NoHitAtEndOfFight - 1934 86F1 NoDefence - 1935 86F1 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 -Macro: LSRW [Source: MACRO.ASM] - 1 86F1 46 A5 LSR FORCE+1 - 2 86F3 66 A4 ROR FORCE -Source: weapons.asm - 1936 86F5 60 rts ; END !!! - 1937 86F6 BouncyCastle - 1938 ; now in Y we have number of of the attacking player (TankNr) ! - 1939 86F6 B9 F7 43 lda ActiveWeapon,y - 1940 ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down - 1941 86F9 C9 05 cmp #ind_Funky_Bomb_____ - 1942 86FB D0 03 bne @+ - 1943 86FD 20 7A 8F jsr SetFullScreenSoilRange - 1944 @ - 1945 8700 A9 0D 85 9E mva #sfx_shield_on sfx_effect - 1946 ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! - 1947 8704 A9 01 85 AA mva #1 Erase - 1948 8708 A5 6C lda TankNr - 1949 870A 48 pha ; store TankNr - 1950 870B 86 6C stx TankNr ; store X in TankNr :) - 1951 870D 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 1952 8710 A9 00 lda #0 - 1953 8712 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon - 1954 8715 9D A8 43 sta ShieldEnergy,x - 1955 8718 85 C8 sta xtraj ; prepare coordinates - 1956 871A 85 CB sta ytraj - 1957 ; sta xtraj+2 - 1958 ; sta ytraj+2 - 1959 871C 85 AA sta Erase - 1960 871E 20 2C 6A jsr DrawTankNr ; draw tank without shield - 1961 ; ldx TankNr ; restore X value :) ... but we don't need X now .. - 1962 8721 68 pla - 1963 8722 85 6C sta TankNr ; restore TankNr value :) - 1964 8724 38 sec - 1965 8725 A9 B4 lda #180 - 1966 8727 ED 15 45 sbc LeapFrogAngle - 1967 872A 85 A7 sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) - 1968 872C lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 -Macro: LSRW [Source: MACRO.ASM] - 1 872C 46 A5 LSR FORCE+1 - 2 872E 66 A4 ROR FORCE -Source: weapons.asm - 1969 8730 A5 C1 85 C9 A5 C2 + mwa XHit xtraj+1 - 1970 8738 38 AD 5F 44 E9 05 + sbw YHit #5 ytraj+1 - 1971 8747 A9 01 85 A9 mva #1 color - 1972 874B 4C B3 83 jmp RepeatFlight ; and repeat Fight - 1973 .endp - 1974 - 1975 874E .proc SecondFlight - 1976 ; ---------------- copied code fragment from before firing. not too elegant. - 1977 ; ---------------- get fire parameters again - 1978 - 1979 874E A6 6C ldx TankNr - 1980 8750 20 96 59 jsr Table2Force - 1981 8753 BD C3 48 lda AngleTable,x - 1982 8756 85 A7 sta Angle - 1983 - 1984 ; Shoots tank nr X !!! :) - 1985 ; set the starting coordinates of bullet with correction - 1986 ; to start where the tank's barrel ends - 1987 ; (without it bullet would go from the left lower corner of the tank) - 1988 ;ldx TankNr - 1989 - 1990 8758 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 - 1991 8762 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 - 1992 8767 A9 00 lda #0 - 1993 8769 85 A6 sta Force+2 - 1994 876B 85 CD sta ytraj+2 - 1995 876D 85 C8 sta xtraj - 1996 876F 85 CB sta ytraj - 1997 8771 85 A9 sta color - 1998 - 1999 - 2000 8773 A0 64 ldy #100 ; ??? - 2001 8775 A9 01 85 E3 mva #1 tracerflag ; I do not know (I mean I think I know ;) ) - 2002 ; 10 years later - I do not know!!! - 2003 ; 20 years later - still do not know :] - 2004 8779 4C B3 83 jmp Flight.RepeatIfSmokeTracer - 2005 .endp - 2006 - 2007 ; ------------------------------------------------- - 2008 877C .proc MIRVdownLoop - 2009 ; MIRV loop - here mirv bullets fall down - 2010 ; ------------------------------------------------- - 2011 ; copy Flight parameters to the table - 2012 877C A2 04 ldx #4 - 2013 877E MIRVcopyParameters - 2014 877E A5 C8 lda xtraj - 2015 8780 9D 66 44 sta xtraj00,x - 2016 8783 A5 C9 lda xtraj+1 - 2017 8785 9D 6B 44 sta xtraj01,x - 2018 8788 A5 CA lda xtraj+2 - 2019 878A 9D 70 44 sta xtraj02,x - 2020 ;lda vx - 2021 ;sta vx00,x - 2022 878D A5 BC lda vx+1 - 2023 878F 9D 75 44 sta vx01,x - 2024 8792 A5 BD lda vx+2 - 2025 8794 9D 7A 44 sta vx02,x - 2026 8797 A5 BE lda vx+3 - 2027 8799 9D 7F 44 sta vx03,x - 2028 879C A9 00 lda #0 - 2029 879E 9D 84 44 sta MirvDown,x - 2030 87A1 CA dex - 2031 87A2 10 DA bpl MIRVcopyParameters - 2032 ; modification (to make bullets "split away" and go different directions) - 2033 ; bullet indexed 0 is in the middle - 2034 - 2035 ; bullet 1 - 2036 87A4 18 clc - 2037 87A5 A5 BC lda vx+1 - 2038 87A7 69 64 adc #100 - 2039 87A9 8D 76 44 sta vx01+1 - 2040 87AC A5 BD lda vx+2 - 2041 87AE 69 00 adc #0 - 2042 87B0 8D 7B 44 sta vx02+1 - 2043 87B3 A5 BE lda vx+3 - 2044 87B5 69 00 adc #0 - 2045 87B7 8D 80 44 sta vx03+1 - 2046 ; bullet 2 - 2047 87BA 38 sec - 2048 87BB A5 BC lda vx+1 - 2049 87BD E9 64 sbc #100 - 2050 87BF 8D 77 44 sta vx01+2 - 2051 87C2 A5 BD lda vx+2 - 2052 87C4 E9 00 sbc #0 - 2053 87C6 8D 7C 44 sta vx02+2 - 2054 87C9 A5 BE lda vx+3 - 2055 87CB E9 00 sbc #0 - 2056 87CD 8D 81 44 sta vx03+2 - 2057 ; bullet 3 - 2058 87D0 18 clc - 2059 87D1 A5 BC lda vx+1 - 2060 87D3 69 C8 adc #200 - 2061 87D5 8D 78 44 sta vx01+3 - 2062 87D8 A5 BD lda vx+2 - 2063 87DA 69 00 adc #0 - 2064 87DC 8D 7D 44 sta vx02+3 - 2065 87DF A5 BE lda vx+3 - 2066 87E1 69 00 adc #0 - 2067 87E3 8D 82 44 sta vx03+3 - 2068 ; bullet 4 - 2069 87E6 38 sec - 2070 87E7 A5 BC lda vx+1 - 2071 87E9 E9 C8 sbc #200 - 2072 87EB 8D 79 44 sta vx01+4 - 2073 87EE A5 BD lda vx+2 - 2074 87F0 E9 00 sbc #0 - 2075 87F2 8D 7E 44 sta vx02+4 - 2076 87F5 A5 BE lda vx+3 - 2077 87F7 E9 00 sbc #0 - 2078 87F9 8D 83 44 sta vx03+4 - 2079 - 2080 ; clearing ranges of soil down registers - 2081 87FC 20 89 8F jsr ClearScreenSoilRange - 2082 - 2083 87FF A2 FF ldx #$FF ; it will turn 0 in a moment anyway - 2084 8801 8E 89 44 stx MirvMissileCounter - 2085 8804 mrLoopi - 2086 8804 AE 89 44 ldx MirvMissileCounter - 2087 8807 E8 inx - 2088 8808 E0 05 cpx #5 - 2089 880A D0 02 bne @+ - 2090 880C A2 00 ldx #0 - 2091 880E 8E 89 44 @ stx MirvMissileCounter - 2092 - 2093 ; Y changes only for bullet number 0 - 2094 ; because rest of the bullets have the same Y (height) - 2095 - 2096 8811 D0 29 bne MIRVdoNotChangeY - 2097 ; Y is the same for all falling bullets - 2098 ;ytraj=ytraj-vy (skipping least significant byte of vy) - 2099 8813 38 sec - 2100 8814 A5 CB lda ytraj - 2101 8816 E5 B8 sbc vy+1 - 2102 8818 85 CB sta ytraj - 2103 881A A5 CC lda ytraj+1 - 2104 881C E5 B9 sbc vy+2 - 2105 881E 85 CC sta ytraj+1 - 2106 8820 A5 CD lda ytraj+2 - 2107 8822 E5 BA sbc vy+3 - 2108 8824 85 CD sta ytraj+2 - 2109 - 2110 ;vy=vy-g (also without least significant byte of vy) - 2111 8826 38 sec - 2112 8827 A5 B8 lda vy+1 - 2113 8829 E5 E0 sbc gravity - 2114 882B 85 B8 sta vy+1 - 2115 882D A5 B9 lda vy+2 - 2116 882F E9 00 sbc #0 - 2117 8831 85 B9 sta vy+2 - 2118 8833 A5 BA lda vy+3 - 2119 8835 E9 00 sbc #0 - 2120 8837 85 BA sta vy+3 - 2121 - 2122 8839 20 A7 5A jsr ShellDelay - 2123 - 2124 883C MIRVdoNotChangeY - 2125 - 2126 883C BD 84 44 lda MirvDown,x ; if bullet is already down we go with the next one - 2127 883F F0 03 4C 93 89 jne MIRVnextBullet - 2128 - 2129 8844 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) - 2130 8845 BD 66 44 lda xtraj00,x ;and here of course Flight to the right - 2131 8848 7D 75 44 adc vx01,x - 2132 884B 9D 66 44 sta xtraj00,x - 2133 884E BD 6B 44 lda xtraj01,x - 2134 8851 7D 7A 44 adc vx02,x - 2135 8854 9D 6B 44 sta xtraj01,x - 2136 8857 BD 70 44 lda xtraj02,x - 2137 885A 7D 7F 44 adc vx03,x - 2138 885D 9D 70 44 sta xtraj02,x - 2139 - 2140 ;vx=vx+Wind - 2141 - 2142 8860 18 clc - 2143 .rept 4 - 2144 LDA VX+# - 2145 ADC WIND+# - 2146 STA VX+# - 2147 .endr -Source: REPT - 2144 8861 A5 BB LDA VX+# - 2144 8863 65 CE ADC WIND+# - 2144 8865 85 BB STA VX+# - 2144 8867 A5 BC LDA VX+# - 2144 8869 65 CF ADC WIND+# - 2144 886B 85 BC STA VX+# - 2144 886D A5 BD LDA VX+# - 2144 886F 65 D0 ADC WIND+# - 2144 8871 85 BD STA VX+# - 2144 8873 A5 BE LDA VX+# - 2144 8875 65 D1 ADC WIND+# - 2144 8877 85 BE STA VX+# -Source: weapons.asm - 2148 - 2149 ; rules for a falling MIRV bulets. - 2150 ; if Y is negative and any X (bullet over the screen) - continue flying - 2151 ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying - 2152 ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision - 2153 ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit - 2154 ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) - 2155 - 2156 ; check bullet position and set flags: - 2157 ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) - 2158 ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) - 2159 8879 A9 00 lda #$00 - 2160 887B 8D 8C 44 sta XposFlag - 2161 887E 8D 8D 44 sta YposFlag - 2162 8881 A5 CD lda ytraj+2 ; Y high byte - 2163 8883 10 07 bpl @+ - 2164 8885 A9 80 8D 8D 44 mva #%10000000 YposFlag ; bullet over the screen (Y) - 2165 888A 30 0B bmi MIRVsetXflag - 2166 @ - 2167 888C A5 CC lda ytraj+1 ; Y low byte - 2168 888E C9 C8 cmp #screenheight - 2169 8890 90 05 bcc MIRVsetXflag ; bullet on screen (Y) - 2170 8892 A9 40 8D 8D 44 mva #%01000000 YposFlag ; bullet under the screen (Y) - 2171 8897 MIRVsetXflag - 2172 8897 BD 70 44 lda xtraj02,x ; X high byte - 2173 889A C9 01 cmp #>screenwidth - 2174 889C D0 05 bne @+ - 2175 889E BD 6B 44 lda xtraj01,x ; X low byte - 2176 88A1 C9 40 cmp #mountaintable - 2236 8918 85 73 sta temp+1 - 2237 - 2238 891A A0 00 ldy #0 - 2239 891C A5 CC lda ytraj+1 - 2240 891E D1 72 cmp (temp),y ; check collision with mountains - 2241 8920 B0 20 bcs mrHit - 2242 - 2243 8922 mrSkipCollisionCheck - 2244 ;mwa xtraj01 xdraw - 2245 8922 BD 6B 44 lda xtraj01,x - 2246 8925 85 61 sta xdraw - 2247 8927 BD 70 44 lda xtraj02,x - 2248 892A 85 62 sta xdraw+1 - 2249 892C A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 2250 - 2251 8934 20 73 75 jsr unPlot.unPlotAfterX - 2252 8937 AE 89 44 ldx MirvMissileCounter - 2253 893A F0 03 4C 04 88 jne mrLoopi - 2254 - 2255 893F 4C 04 88 jmp mrLoopi - 2256 - 2257 8942 mrHit - 2258 ; we have to make unPlot over the screen (to initialise it) - 2259 ; before actual explosion - 2260 8942 A9 00 85 61 85 62 mwa #0 xdraw - 2261 8948 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2262 8950 20 73 75 jsr unPlot.unPlotAfterX - 2263 8953 AE 89 44 ldx MirvMissileCounter - 2264 8956 A0 00 ldy #0 - 2265 ; concurrent moving xtraj+1 -> xdraw and calculating temp - 2266 8958 18 clc - 2267 8959 BD 6B 44 lda xtraj01,x - 2268 895C 85 61 sta xdraw - 2269 895E 69 3E adc #mountaintable - 2274 8969 85 73 sta temp+1 - 2275 896B B1 72 lda (temp),y - 2276 896D 38 sec - 2277 896E E9 01 sbc #1 - 2278 8970 85 63 sta ydraw - 2279 8972 84 64 sty ydraw+1 ;we know that y=0 - 2280 8974 20 AD 77 jsr missile ; explode .... - 2281 - 2282 8977 mrEndOfFlight - 2283 8977 AE 89 44 ldx MirvMissileCounter - 2284 897A A9 00 85 61 85 62 mwa #0 xdraw - 2285 8980 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2286 8988 20 73 75 jsr unPlot.unPlotAfterX - 2287 898B AE 89 44 ldx MirvMissileCounter - 2288 898E A9 01 lda #1 - 2289 8990 9D 84 44 sta MirvDown,x - 2290 8993 MIRVnextBullet - 2291 ; checking if all bullets already fallen down - 2292 8993 A2 04 ldx #4 - 2293 8995 MIRVcheckIfEnd - 2294 8995 BD 84 44 lda MirvDown,x - 2295 8998 F0 05 beq MIRVstillNotAll - 2296 899A CA dex - 2297 899B 10 F8 bpl MIRVcheckIfEnd - 2298 899D 30 03 bmi MIRValreadyAll - 2299 899F MIRVstillNotAll - 2300 899F 4C 04 88 jmp mrLoopi - 2301 89A2 MIRValreadyAll - 2302 89A2 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store them (for a while) - 2303 89AA A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw - 2304 89B2 A9 00 85 61 85 62 mwa #0 xdraw - 2305 89B8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2306 89C0 AE 89 44 ldx MirvMissileCounter - 2307 89C3 20 73 75 jsr unPlot.unPlotAfterX - 2308 89C6 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 2309 89CE A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 2310 - 2311 ; we must do it manually because of the VOID pointer - 2312 - 2313 ;first clean the offensive text... - 2314 89D6 A4 6C ldy TankNr - 2315 89D8 A9 00 85 DB mva #$00 plot4x4color - 2316 89DC 20 88 72 jsr DisplayOffensiveTextNr - 2317 - 2318 ; temporary removing tanks from the screen (otherwise they will fall down with soil) - 2319 89DF 20 F4 6E jsr SoilDown2 - 2320 89E2 A9 FF 85 BF mva #$ff HitFlag ; but why ?? - 2321 89E6 60 rts - 2322 .endp - 2323 ; ------------------------------------------------- - 2324 89E7 .proc MakeWalls - 2325 ; ------------------------------------------------- - 2326 89E7 2C 0C 44 bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy - 2327 89EA 10 54 bpl WrapAndNone - 2328 89EC 50 21 bvc MakeBump - 2329 ; top bounce - 2330 89EE 24 CD bit ytraj+2 - 2331 89F0 10 1D bpl NoOnTop - 2332 89F2 24 BA bit vy+3 - 2333 89F4 30 19 bmi FlyingDown - 2334 89F6 38 sec - 2335 .rept 4 - 2336 LDA #$00 - 2337 SBC VY+# - 2338 STA VY+# - 2339 .endr -Source: REPT - 2336 89F7 A9 00 LDA #$00 - 2336 89F9 E5 B7 SBC VY+# - 2336 89FB 85 B7 STA VY+# - 2336 89FD A9 00 LDA #$00 - 2336 89FF E5 B8 SBC VY+# - 2336 8A01 85 B8 STA VY+# - 2336 8A03 A9 00 LDA #$00 - 2336 8A05 E5 B9 SBC VY+# - 2336 8A07 85 B9 STA VY+# - 2336 8A09 A9 00 LDA #$00 - 2336 8A0B E5 BA SBC VY+# - 2336 8A0D 85 BA STA VY+# -Source: weapons.asm - 2340 8A0F FlyingDown - 2341 8A0F NoOnTop - 2342 8A0F MakeBump - 2343 8A0F A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth - 2344 8A19 90 54 bcc OnScreen - 2345 ; inverse vx (bouncing wall) - 2346 8A1B 38 sec - 2347 .rept 4 - 2348 LDA #$00 - 2349 SBC VX+# - 2350 STA VX+# - 2351 .endr -Source: REPT - 2348 8A1C A9 00 LDA #$00 - 2348 8A1E E5 BB SBC VX+# - 2348 8A20 85 BB STA VX+# - 2348 8A22 A9 00 LDA #$00 - 2348 8A24 E5 BC SBC VX+# - 2348 8A26 85 BC STA VX+# - 2348 8A28 A9 00 LDA #$00 - 2348 8A2A E5 BD SBC VX+# - 2348 8A2C 85 BD STA VX+# - 2348 8A2E A9 00 LDA #$00 - 2348 8A30 E5 BE SBC VX+# - 2348 8A32 85 BE STA VX+# -Source: weapons.asm - 2352 ; and bouce feapfrog :) - 2353 8A34 38 sec - 2354 8A35 A9 B4 lda #180 - 2355 8A37 ED 15 45 sbc LeapFrogAngle - 2356 8A3A 8D 15 45 sta LeapFrogAngle ; swap angle (LeapFrogAngle) - 2357 8A3D E6 A2 inc FunkyWallFlag - 2358 8A3F 60 rts - 2359 8A40 WrapAndNone - 2360 8A40 50 2D bvc NoWall - 2361 8A42 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth - 2362 8A4C 90 21 bcc OnScreen - 2363 ; (wrapping wall) - 2364 8A4E E6 A2 inc FunkyWallFlag - 2365 8A50 24 CA bit xtraj+2 - 2366 8A52 30 0E bmi LeftWrap - 2367 8A54 RightWrap - 2368 8A54 38 A5 C9 E9 40 85 + sbw xtraj+1 #screenwidth - 2369 8A61 60 rts - 2370 8A62 LeftWrap - 2371 8A62 18 A5 C9 69 40 85 + adw xtraj+1 #screenwidth - 2372 8A6F OnScreen - 2373 8A6F NoWall - 2374 8A6F 60 rts - 2375 .endp - 2376 ; ------------------------------------------------- - 2377 8A70 .proc WhiteFlag - 2378 ; ------------------------------------------------- - 2379 ; This routine is run from inside of the main loop - 2380 ; and replaces Shoot and Flight routines - 2381 ; X and TankNr - index of shooting tank - 2382 ; ------------------------------------------------- - 2383 8A70 A9 06 85 9E mva #sfx_death_begin sfx_effect - 2384 8A74 20 57 6B jsr FlashTank ; first we flash tank - 2385 8A77 A9 01 85 AA mva #1 Erase - 2386 8A7B 20 2C 6A jsr DrawTankNr ; and erase tank - 2387 8A7E A9 00 lda #0 - 2388 8A80 85 AA sta Erase - 2389 8A82 A6 6C ldx TankNr - 2390 8A84 9D A2 43 sta Energy,x ; clear tank energy - 2391 8A87 9D AF 43 sta eXistenZ,x ; erase from existence - 2392 8A8A 9D B5 43 sta LASTeXistenZ,x ; to prevent explosion - 2393 8A8D 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate White Flag - 2394 8A90 20 46 75 jsr PMoutofScreen - 2395 8A93 20 12 6A jsr drawtanks ; for restore PM - 2396 8A96 A9 15 85 9E mva #sfx_silencer sfx_effect - 2397 8A9A 60 rts - 2398 .endp - 2399 - 2400 ; ------------------------------------------------- - 2401 8A9B .proc AtomicWinter - 2402 ; ------------------------------------------------- - 2403 ; This routine is run from inside of the main loop - 2404 ; and replaces Shoot and Flight routines - 2405 ; X and TankNr - index of shooting tank - 2406 ; ------------------------------------------------- - 2407 8A9B A9 12 85 9E mva #sfx_sandhog sfx_effect - 2408 .IF FASTER_GRAF_PROCS = 1 - 2409 ldy #0 ; byte counter (from 0 to 39) - 2410 NextColumn - 2411 ; big loop - we repat internal loops for each column of bytes - 2412 sty magic - 2413 ldx #120 ; line counter (from 0 to 60 ) - 2414 ; first loop - inverse column of bytes for a while - 2415 ldy magic - 2416 NextLine1 - 2417 jsr InverseScreenByte - 2418 dex - 2419 dex - 2420 bpl NextLine1 - 2421 ; - 2422 jsr WaitOneFrame ; wait uses A only - 2423 ; second loop - inverse again and put random "snow" to column of bytes - 2424 ldx #120 - 2425 ldy magic - 2426 mva #$55 magic+1 - 2427 NextLine2 - 2428 jsr InverseScreenByte - 2429 lda random - 2430 ora magic+1 - 2431 and (temp),y - 2432 sta (temp),y - 2433 lda magic+1 - 2434 eor #$ff - 2435 sta magic+1 - 2436 dex - 2437 dex - 2438 bpl NextLine2 - 2439 ; and go to next column - 2440 iny - 2441 cpy #40 - 2442 bne NextColumn - 2443 .ELSE - 2444 8A9F A9 01 85 A9 mva #1 color - 2445 8AA3 A9 78 85 63 A9 00 + mwa #120 ydraw - 2446 8AAB NextLineSlow - 2447 8AAB A9 00 lda #0 - 2448 8AAD 85 61 sta xdraw - 2449 8AAF 85 62 sta xdraw+1 - 2450 8AB1 NextPixelSlow - 2451 8AB1 2C 1B D4 bit random - 2452 8AB4 10 05 bpl NoPlot - 2453 8AB6 50 03 bvc NoPlot - 2454 8AB8 20 2C 76 jsr plot.MakePlot - 2455 8ABB NoPlot - 2456 8ABB E6 61 D0 02 E6 62 inw xdraw - 2457 8AC1 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 2458 8ACB D0 E4 bne NextPixelSlow - 2459 8ACD C6 63 dec ydraw - 2460 8ACF C6 63 dec ydraw - 2461 8AD1 10 D8 bpl NextLineSlow - 2462 .ENDIF - 2463 ; and we have "snow" :) - 2464 8AD3 A9 00 lda #0 - 2465 8AD5 A6 6C ldx TankNr - 2466 8AD7 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter - 2467 8ADA 20 7A 8F jsr SetFullScreenSoilRange - 2468 8ADD 20 F7 6E jsr SoilDown2.NoClearTanks - 2469 8AE0 60 rts - 2470 - 2471 ; in order to optimize the fragment repeated in both internal loops - 2472 ; we save 15 bytes :) - 2473 8AE1 InverseScreenByte - 2474 8AE1 BD 68 41 lda LineTableL,x - 2475 8AE4 85 72 sta temp - 2476 8AE6 BD 31 42 lda LineTableH,x - 2477 8AE9 85 73 sta temp+1 - 2478 8AEB B1 72 lda (temp),y - 2479 8AED 49 FF eor #$ff - 2480 8AEF 91 72 sta (temp),y - 2481 8AF1 60 rts - 2482 .endp - 2483 ; ------------------------------------------------- - 2484 8AF2 .proc AutoDefense - 2485 ; ------------------------------------------------- - 2486 ; This routine is run from inside of the main loop - 2487 ; X - index of tank - 2488 ; ------------------------------------------------- - 2489 8AF2 20 EB 8F jsr PrepareAIShoot.WepTableToTemp - 2490 8AF5 20 45 91 jsr UseBattery - 2491 8AF8 20 98 91 jsr TosserDefensives - 2492 8AFB 60 rts - 2493 .endp - 2494 ; ------------------------------------------------- - 2495 8AFC .proc SpyHard - 2496 ; ------------------------------------------------- - 2497 8AFC A6 6C 8E 31 44 mvx TankNr TargetTankNr ; save - 2498 8B01 RepeatSpy - 2499 8B01 A2 00 86 6C mvx #0 TankNr - 2500 8B05 86 5F stx SpyHardFlag ; 0 - optimization - 2501 8B07 CheckNextTankSH - 2502 8B07 EC 31 44 cpx TargetTankNr - 2503 8B0A F0 22 beq ThisTankItsMe - 2504 8B0C BD A2 43 lda Energy,x ; only active players - 2505 8B0F F0 1D beq ThisTankIsDead - 2506 ; run SpyHard for tank in X - 2507 8B11 20 41 8B jsr DisplaySpyInfo - 2508 8B14 20 57 6B jsr FlashTank - 2509 8B17 20 5F 5A @ jsr GetKey - 2510 8B1A 24 D7 bit escFlag - 2511 8B1C 30 1A bmi SpyHardEnd - 2512 8B1E C9 21 cmp #@kbcode._space ; $21 ; Space - 2513 8B20 F0 16 beq SpyHardEnd - 2514 8B22 C9 0C cmp #@kbcode._ret ; Return key (5200 - fire) - 2515 8B24 F0 12 beq SpyHardEnd - 2516 8B26 C9 06 cmp #@kbcode._left ; $6 - 2517 8B28 F0 04 beq SelectNextTank - 2518 8B2A C9 07 cmp #@kbcode._right ; $07 ; cursor right - 2519 8B2C D0 E9 bne @- - 2520 8B2E ThisTankIsDead - 2521 8B2E ThisTankItsMe - 2522 8B2E SelectNextTank - 2523 8B2E E6 6C inc TankNr - 2524 8B30 A6 6C ldx TankNr - 2525 8B32 E4 AE cpx NumberOfPlayers - 2526 8B34 D0 D1 bne CheckNextTankSH - 2527 8B36 F0 C9 beq RepeatSpy - 2528 8B38 SpyHardEnd - 2529 8B38 AE 31 44 86 6C mvx TargetTankNr TankNr ; restore - 2530 8B3D 20 41 8B jsr DisplaySpyInfo - 2531 8B40 60 rts - 2532 .endp - 2533 8B41 .proc DisplaySpyInfo - 2534 8B41 BD 7F 5B lda TankStatusColoursTable,x - 2535 8B44 85 02 sta COLOR2 ; set color of status line - 2536 8B46 20 0F 66 jsr PutTankNameOnScreen - 2537 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 2538 8B49 60 rts - 2539 .endp - 2540 ; ------------------------------------------------- - 2541 8B4A .proc LazyBoys - 2542 ; ------------------------------------------------- - 2543 8B4A A9 2C 85 9E mva #sfx_lazy_boys sfx_effect - 2544 8B4E 20 CF 8F jsr PrepareAIShoot - 2545 8B51 A6 6C ldx TankNr - 2546 8B53 24 5E bit LazyFlag - 2547 8B55 30 0A bmi GoDarwin - 2548 8B57 20 C0 92 jsr FindBestTarget2 ; find nearest tank neighbour - 2549 8B5A 20 70 8B jsr LazyAim - 2550 8B5D A9 00 lda #%00000000 ; set "visual aiming" off - 2551 8B5F F0 08 beq EndLazy - 2552 8B61 GoDarwin - 2553 8B61 20 81 92 jsr FindBestTarget3 ; find target with lowest energy - 2554 8B64 20 70 8B jsr LazyAim - 2555 8B67 A9 80 lda #%10000000 - 2556 8B69 EndLazy - 2557 8B69 85 97 sta TestFlightFlag ; set "visual aiming" on - 2558 8B6B A9 00 85 5E mva #0 LazyFlag - 2559 8B6F 60 rts - 2560 .endp - 2561 8B70 .proc LazyAim - 2562 ; aiming proc for Lazy ... weapons - 2563 ; as proc for memory optimisation - 2564 ; Y - target tan nr - 2565 ; A - target direction - 2566 8B70 8C 31 44 sty TargetTankNr - 2567 ; aiming - 2568 8B73 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 2569 8B76 A5 A4 lda Force - 2570 8B78 9D D9 43 sta ForceTableL,x - 2571 8B7B A5 A5 lda Force+1 - 2572 8B7D 9D DF 43 sta ForceTableH,x - 2573 8B80 20 A1 59 jsr MoveBarrelToNewPosition - 2574 8B83 60 rts - 2575 .endp - 2576 ; ------------------------------------------------- - 2577 8B84 .proc TankFlying - 2578 ; ------------------------------------------------- - 2579 ; This routine is run from inside of the main loop - 2580 ; and replaces Shoot and Flight routines - 2581 ; X and TankNr - index of flying tank - 2582 ; ------------------------------------------------- - 2583 ; Let's designate the flight altitude. - 2584 8B84 20 BF 70 jsr CheckMaxMountain - 2585 8B87 C9 1E cmp #(12+18) ; tank with shield (12) and max alt (18) check - 2586 8B89 90 04 bcc IsToHigh - 2587 8B8B E9 0C sbc #12 ; tank with shield high correction - 2588 8B8D D0 02 bne StoreMaxAlt - 2589 8B8F IsToHigh - 2590 8B8F A9 12 lda #18 - 2591 8B91 StoreMaxAlt - 2592 8B91 85 A2 sta FloatingAlt - 2593 ; mva #18 FloatingAlt ; for testing - 2594 8B93 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect - 2595 - 2596 ; display text 4x4 - fuel full - 2597 - 2598 8B97 A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 - 2599 8B9F A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - 2600 8BA7 A9 1D 85 83 mva #hoverFullEnd-hoverFull-1 fx ; length - 2601 8BAB 38 sec - 2602 8BAC A5 A2 lda FloatingAlt - 2603 8BAE E9 0C sbc #12 - 2604 8BB0 85 D8 sta LineYdraw - 2605 8BB2 20 72 73 jsr TypeLine4x4.variableLength - 2606 - 2607 8BB5 A6 6C ldx TankNr - 2608 - 2609 ; TankNr in X reg. - 2610 ; now animate Up - 2611 8BB7 A9 00 85 76 mva #0 modify ; it's a counter - 2612 8BBB TankGoUp - 2613 8BBB BD 19 44 lda ytankstable,x - 2614 8BBE C5 A2 cmp FloatingAlt ; Floating altitude - 2615 8BC0 90 33 bcc ReachSky - 2616 ; first erase old tank position - 2617 8BC2 A9 01 85 AA mva #1 Erase - 2618 8BC6 20 2C 6A jsr DrawTankNr - 2619 8BC9 A5 76 lda modify - 2620 8BCB C9 05 cmp #5 - 2621 8BCD 90 07 bcc NoEngineClear - 2622 8BCF A9 00 85 A9 mva #0 color - 2623 8BD3 20 7E 6C jsr DrawTankRocketEngine - 2624 8BD6 NoEngineClear - 2625 8BD6 A9 00 85 AA mva #0 Erase - 2626 8BDA DE 19 44 dec ytankstable,x - 2627 8BDD E6 76 inc modify - 2628 ; then draw tank on new position - 2629 8BDF 20 2C 6A jsr DrawTankNr - 2630 8BE2 A5 76 lda modify - 2631 8BE4 C9 05 cmp #5 - 2632 8BE6 90 0A bcc NoEngine - 2633 8BE8 AD 1B D4 lda random - 2634 8BEB 29 01 and #%00000001 - 2635 8BED 85 A9 sta color - 2636 8BEF 20 7E 6C jsr DrawTankRocketEngine - 2637 8BF2 NoEngine - 2638 ; jsr WaitOneFrame - 2639 8BF2 4C BB 8B jmp TankGoUp - 2640 - 2641 8BF5 ReachSky - 2642 ; engine symbol erase - 2643 8BF5 A9 00 85 A9 mva #0 color - 2644 8BF9 20 7E 6C jsr DrawTankRocketEngine - 2645 - 2646 ; display text 4x4 - fuel full (clear text) - 2647 8BFC A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 - 2648 8C04 A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - 2649 8C0C A9 1D 85 83 mva #(hoverFullEnd-hoverFull-1) fx ; length - 2650 8C10 38 sec - 2651 8C11 A5 A2 lda FloatingAlt - 2652 8C13 E9 0C sbc #12 - 2653 8C15 85 D8 sta LineYdraw - 2654 8C17 A9 00 lda #$00 - 2655 8C19 20 74 73 jsr TypeLine4x4.staplot4x4color - 2656 ; and Soildown at the start (for correct mountaintable if tank was buried) - 2657 ; calculate range - 2658 8C1C A6 6C ldx TankNr - 2659 8C1E 38 sec - 2660 8C1F BD 0D 44 lda XtankstableL,x - 2661 8C22 E9 02 sbc #2 - 2662 8C24 85 D2 sta RangeLeft - 2663 8C26 BD 13 44 lda XtankstableH,x - 2664 8C29 E9 00 sbc #0 - 2665 8C2B 85 D3 sta RangeLeft+1 - 2666 8C2D 18 clc - 2667 8C2E BD 0D 44 lda XtankstableL,x - 2668 8C31 69 0A adc #10 - 2669 8C33 85 D4 sta RangeRight - 2670 8C35 BD 13 44 lda XtankstableH,x - 2671 8C38 69 00 adc #0 - 2672 8C3A 85 D5 sta RangeRight+1 - 2673 ; hide tanks and ... - 2674 8C3C 20 F4 6E jsr SoilDown2 - 2675 8C3F 20 89 8F jsr ClearScreenSoilRange - 2676 8C42 A6 6C ldx TankNr - 2677 - 2678 ; check keyboard/joy and move tank left/right - code copied from BeforeFire - 2679 ;keyboard reading - 2680 ; KBCODE keeps code of last keybi - 2681 ; SKSTAT $ff - nothing pressed - 2682 ; $FB - any key - 2683 ; $f7 - shift - 2684 ; $f3 - shift+key - 2685 8C44 KeyboardAndJoyCheck - 2686 8C44 A9 1F 85 9E mva #sfx_tank_move sfx_effect - 2687 8C48 BD A8 43 lda ShieldEnergy,x - 2688 8C4B C9 14 cmp #20 - 2689 8C4D D0 20 bne LotOfFuel - 2690 - 2691 ; display text 4x4 - low fuel - 2692 8C4F A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 - 2693 8C57 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - 2694 8C5F A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - 2695 8C63 38 sec - 2696 8C64 A5 A2 lda FloatingAlt - 2697 8C66 E9 0C sbc #12 - 2698 8C68 85 D8 sta LineYdraw - 2699 8C6A 20 72 73 jsr TypeLine4x4.variableLength - 2700 8C6D A6 6C ldx TankNr - 2701 - 2702 8C6F LotOfFuel - 2703 8C6F notpressed - 2704 ; let's animate "engine" - 2705 8C6F 20 E5 6C jsr DrawTankEngine - 2706 ; enimation ends - 2707 - 2708 8C72 A5 02 lda SKSTAT - 2709 8C74 C9 FF cmp #$ff - 2710 8C76 F0 26 jeq checkJoy - 2711 8C78 C9 F7 cmp #$f7 ; SHIFT - 2712 8C7A F0 22 jeq checkJoy - 2713 - 2714 8C7C A5 02 lda kbcode - 2715 8C7E 29 3F and #%00111111 ; CTRL and SHIFT elimination - 2716 - 2717 8C80 C9 1C cmp #@kbcode._esc ; 28 ; ESC - 2718 8C82 D0 08 bne @+ - 2719 8C84 20 AE 73 jsr AreYouSure - 2720 8C87 24 D7 bit escFlag - 2721 8C89 10 E4 bpl notpressed - 2722 ;---esc pressed-quit game--- - 2723 8C8B 60 rts - 2724 @ - 2725 8C8C jumpFromStick - 2726 8C8C C9 06 cmp #@kbcode._left ; $6 - 2727 8C8E F0 60 jeq pressedLeft - 2728 8C90 C9 07 cmp #@kbcode._right ; $7 - 2729 8C92 F0 23 jeq pressedRight - 2730 8C94 C9 21 cmp #@kbcode._space ; $21 - 2731 8C96 D0 03 4C 3B 8D jeq pressedSpace - 2732 8C9B 4C 6F 8C jmp notpressed - 2733 8C9E checkJoy - 2734 ;------------JOY------------- - 2735 ;happy happy joy joy - 2736 ;check for joystick now - 2737 8C9E A5 02 lda STICK0 - 2738 8CA0 29 0F and #$0f - 2739 8CA2 C9 0F cmp #$0f - 2740 8CA4 F0 07 beq notpressedJoy - 2741 8CA6 A8 tay - 2742 8CA7 B9 5A 60 lda joyToKeyTable,y - 2743 8CAA 4C 8C 8C jmp jumpFromStick - 2744 8CAD notpressedJoy - 2745 ;fire - 2746 8CAD A5 02 lda STRIG0 - 2747 8CAF D0 03 4C 3B 8D jeq pressedSpace - 2748 8CB4 4C 6F 8C jmp notpressed - 2749 - 2750 - 2751 8CB7 pressedRight - 2752 8CB7 BD A8 43 lda ShieldEnergy,x - 2753 8CBA F0 7F jeq pressedSpace - 2754 8CBC A0 01 ldy #1 - 2755 8CBE 20 B0 57 jsr DecreaseShieldEnergyX - 2756 ; first erase old tank position - 2757 8CC1 A9 01 85 AA mva #1 Erase - 2758 8CC5 20 2C 6A jsr DrawTankNr - 2759 8CC8 A9 00 85 AA mva #0 Erase - 2760 8CCC BD 13 44 lda XtankstableH,x - 2761 8CCF C9 01 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 - 2762 8CD1 D0 05 bne @+ - 2763 8CD3 BD 0D 44 lda XtankstableL,x - 2764 8CD6 C9 34 cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels - 2765 8CD8 B0 0B @ bcs RightScreenEdge - 2766 8CDA FE 0D 44 inc XtankstableL,x - 2767 8CDD D0 03 FE 13 44 sne:inc XtankstableH,x - 2768 8CE2 4C E9 8C jmp NoREdge - 2769 8CE5 RightScreenEdge - 2770 8CE5 A9 03 85 9E mva #sfx_dunno sfx_effect - 2771 8CE9 NoREdge - 2772 8CE9 A9 12 9D C3 48 mva #18 AngleTable,x - 2773 8CEE D0 3C bne DrawFloatingTank ; then draw tank on new position - 2774 - 2775 8CF0 pressedLeft - 2776 8CF0 BD A8 43 lda ShieldEnergy,x - 2777 8CF3 F0 46 beq pressedSpace - 2778 8CF5 A0 01 ldy #1 - 2779 8CF7 20 B0 57 jsr DecreaseShieldEnergyX - 2780 ; first erase old tank position - 2781 8CFA A9 01 85 AA mva #1 Erase - 2782 8CFE 20 2C 6A jsr DrawTankNr - 2783 8D01 A9 00 85 AA mva #0 Erase - 2784 8D05 BD 13 44 lda XtankstableH,x - 2785 8D08 C9 00 cmp #0 - 2786 8D0A D0 05 bne @+ - 2787 8D0C BD 0D 44 lda XtankstableL,x - 2788 8D0F C9 05 cmp #5 ; 4 pixles from left edge - 2789 8D11 90 10 @ bcc LeftScreenEdge - 2790 8D13 DE 0D 44 dec XtankstableL,x - 2791 8D16 BD 0D 44 lda XtankstableL,x - 2792 8D19 C9 FF cmp #$ff - 2793 8D1B D0 03 DE 13 44 sne:dec XtankstableH,x - 2794 8D20 4C 27 8D jmp NoLEdge - 2795 8D23 LeftScreenEdge - 2796 8D23 A9 03 85 9E mva #sfx_dunno sfx_effect - 2797 8D27 NoLEdge - 2798 8D27 A9 A2 9D C3 48 mva #162 AngleTable,x - 2799 ; then draw tank on new position - 2800 8D2C DrawFloatingTank - 2801 8D2C 20 2C 6A jsr DrawTankNr - 2802 8D2F 20 0F 66 jsr DisplayStatus - 2803 8D32 20 89 5A jsr WaitOneFrame - 2804 8D35 20 6B 8E jsr CalculateSoildown - 2805 8D38 4C 44 8C jmp KeyboardAndJoyCheck - 2806 - 2807 8D3B pressedSpace - 2808 ; display text 4x4 - low fuel (clear text) - 2809 8D3B A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 - 2810 8D43 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - 2811 8D4B A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - 2812 8D4F 38 sec - 2813 8D50 A5 A2 lda FloatingAlt - 2814 8D52 E9 0C sbc #12 - 2815 8D54 85 D8 sta LineYdraw - 2816 8D56 A9 00 lda #$00 - 2817 8D58 20 74 73 jsr TypeLine4x4.staplot4x4color - 2818 8D5B A6 6C ldx TankNr - 2819 ;================================= - 2820 ; left or right from center of screen ? - 2821 8D5D A0 00 ldy #0 - 2822 8D5F BD 13 44 lda XtankstableH,x - 2823 8D62 C9 00 cmp #>((screenwidth/2)-TankWidth) - 2824 8D64 D0 05 bne @+ - 2825 8D66 BD 0D 44 lda XtankstableL,x - 2826 8D69 C9 98 cmp #<((screenwidth/2)-TankWidth) - 2827 8D6B 90 01 @ bcc TankOnLeftSide - 2828 8D6D TankOnRightSide - 2829 8D6D 88 dey - 2830 8D6E TankOnLeftSide - 2831 8D6E 84 A3 sty OverTankDir ; (0 go right, $ff go left) - 2832 ; now we have direction of bypassing tanks on screen - 2833 - 2834 ; clear "engine pixels" under tank - 2835 8D70 A9 01 85 AA mva #1 erase - 2836 8D74 20 E5 6C jsr DrawTankEngine - 2837 - 2838 8D77 CheckForTanksBelow - 2839 8D77 BD 0D 44 lda XtankstableL,x - 2840 8D7A 85 61 sta xdraw - 2841 8D7C BD 13 44 lda XtankstableH,x - 2842 8D7F 85 62 sta xdraw+1 - 2843 8D81 A6 AE ldx NumberOfPlayers - 2844 8D83 CA dex - 2845 8D84 CheckCollisionWithTankLoop - 2846 8D84 E4 6C cpx TankNr - 2847 8D86 F0 63 beq ItIsMe - 2848 8D88 BD AF 43 lda eXistenZ,x - 2849 8D8B F0 5E beq DeadTank - 2850 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - 2851 ; it is tricky but fast and much shorter - 2852 8D8D BD 0D 44 lda xtankstableL,x - 2853 8D90 38 sec - 2854 8D91 E9 09 sbc #9 ; 2 pixels more on left side + tank width - 2855 8D93 A8 tay - 2856 8D94 BD 13 44 lda xtankstableH,x - 2857 8D97 E9 00 sbc #0 - 2858 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! - 2859 8D99 C5 62 cmp xdraw+1 - 2860 8D9B D0 02 bne @+ - 2861 8D9D C4 61 cpy xdraw - 2862 @ - 2863 8D9F B0 4A bcs LeftFromTheTank - 2864 8DA1 98 tya ;add 20 (tank size*2 +2 and +2) - 2865 8DA2 18 clc - 2866 8DA3 69 14 adc #20 - 2867 8DA5 A8 tay - 2868 8DA6 BD 13 44 lda xtankstableH,x - 2869 8DA9 69 00 adc #0 - 2870 8DAB C5 62 cmp xdraw+1 - 2871 8DAD D0 02 bne @+ - 2872 8DAF C4 61 cpy xdraw - 2873 @ - 2874 8DB1 90 38 bcc RightFromTheTank - 2875 8DB3 TankBelow - 2876 ; tank below - we must move our tank - 2877 8DB3 A6 6C ldx TankNr - 2878 ; first erase old tank position - 2879 8DB5 A9 01 85 AA mva #1 Erase - 2880 8DB9 20 2C 6A jsr DrawTankNr - 2881 8DBC A9 00 85 AA mva #0 Erase - 2882 8DC0 24 A3 bit OverTankDir - 2883 8DC2 30 0F bmi PassLeft - 2884 8DC4 PassRight - 2885 8DC4 FE 0D 44 inc XtankstableL,x - 2886 8DC7 D0 03 FE 13 44 sne:inc XtankstableH,x - 2887 8DCC A9 12 9D C3 48 mva #18 AngleTable,x - 2888 8DD1 D0 12 bne Bypassing - 2889 8DD3 PassLeft - 2890 8DD3 DE 0D 44 dec XtankstableL,x - 2891 8DD6 BD 0D 44 lda XtankstableL,x - 2892 8DD9 C9 FF cmp #$ff - 2893 8DDB D0 03 DE 13 44 sne:dec XtankstableH,x - 2894 8DE0 A9 A2 9D C3 48 mva #162 AngleTable,x - 2895 8DE5 Bypassing - 2896 ; then draw tank on new position - 2897 8DE5 20 2C 6A jsr DrawTankNr - 2898 8DE8 4C 77 8D jmp CheckForTanksBelow - 2899 8DEB RightFromTheTank - 2900 8DEB LeftFromTheTank - 2901 8DEB DeadTank - 2902 8DEB ItIsMe - 2903 8DEB CA dex - 2904 8DEC 10 96 bpl CheckCollisionWithTankLoop - 2905 8DEE A6 6C ldx TankNr - 2906 8DF0 A9 0E 85 9E mva #sfx_shield_off sfx_effect - 2907 8DF4 A9 01 85 AA mva #1 Erase - 2908 8DF8 20 2C 6A jsr DrawTankNr - 2909 8DFB A9 00 85 AA mva #0 Erase - 2910 ; x correction for P/M - 2911 ; -- - 2912 .IF XCORRECTION_FOR_PM = 1 - 2913 lda XtankstableL,x - 2914 and #%11111110 ; correction for PM - 2915 sta XtankstableL,x - 2916 .ENDIF - 2917 ; -- - 2918 8DFF GoDown - 2919 - 2920 8DFF A9 3E 85 72 A9 46 + mwa #mountaintable temp - 2921 8E07 18 clc - 2922 8E08 A5 72 lda temp - 2923 8E0A 7D 0D 44 adc XtankstableL,x - 2924 8E0D 85 72 sta temp - 2925 8E0F A5 73 lda temp+1 - 2926 8E11 7D 13 44 adc XtankstableH,x - 2927 8E14 85 73 sta temp+1 - 2928 8E16 18 A5 72 69 04 85 + adw temp #4 ; center of the tank - 2929 8E21 A0 00 ldy #0 - 2930 8E23 B1 72 lda (temp),y - 2931 8E25 85 A3 sta OverTankDir ; not elegant!!! Reuse as height of tank flight - 2932 8E27 FloatDown - 2933 8E27 BD 19 44 lda ytankstable,x - 2934 8E2A C5 A3 cmp OverTankDir - 2935 8E2C B0 1D bcs OnGround - 2936 ; first erase old tank position - 2937 8E2E A9 01 85 AA mva #1 Erase - 2938 8E32 20 2C 6A jsr DrawTankNr - 2939 8E35 20 66 6C jsr DrawTankParachute - 2940 8E38 A9 00 85 AA mva #0 Erase - 2941 8E3C FE 19 44 inc ytankstable,x - 2942 ; then draw tank on new position - 2943 8E3F 20 2C 6A jsr DrawTankNr - 2944 8E42 20 66 6C jsr DrawTankParachute - 2945 8E45 20 89 5A jsr WaitOneFrame - 2946 8E48 4C 27 8E jmp FloatDown - 2947 8E4B OnGround - 2948 ; clear parachute - 2949 8E4B A9 01 85 AA mva #1 Erase - 2950 8E4F 20 66 6C jsr DrawTankParachute - 2951 8E52 A9 00 85 AA mva #0 Erase - 2952 8E56 20 71 5A jsr WaitForKeyRelease - 2953 ; and Soildown at the end (for correct mountaintable) - 2954 ; If tank did not fly at maximum altitude there is no need to soildown to much - 2955 8E59 A5 A2 lda FloatingAlt - 2956 8E5B C9 12 cmp #18 - 2957 8E5D F0 03 beq NotHighest - 2958 8E5F 20 89 8F jsr ClearScreenSoilRange - 2959 8E62 NotHighest - 2960 ; calculate range - 2961 8E62 20 6B 8E jsr CalculateSoildown - 2962 ; hide tanks and ... - 2963 8E65 20 F4 6E jsr SoilDown2 - 2964 8E68 A6 6C ldx TankNr - 2965 8E6A 60 rts - 2966 - 2967 8E6B CalculateSoildown - 2968 8E6B A6 6C ldx TankNr - 2969 8E6D 18 clc - 2970 8E6E BD 0D 44 lda XtankstableL,x - 2971 8E71 69 04 adc #4 - 2972 8E73 85 61 sta xdraw - 2973 8E75 BD 13 44 lda XtankstableH,x - 2974 8E78 69 00 adc #0 - 2975 8E7A 85 62 sta xdraw+1 - 2976 8E7C A9 04 85 B0 mva #$04 ExplosionRadius - 2977 8E80 20 0C 8F jsr CalculateExplosionRange - 2978 8E83 60 rts - 2979 .endp - 2980 - 2981 ; ------------------------------------------------- - 2982 8E84 .proc CheckCollisionWithTank - 2983 ; ------------------------------------------------- - 2984 ; Check collision with Tank :) - 2985 ; xdraw , ydraw - coordinates of the checked point - 2986 ; results: - 2987 ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1) - 2988 ; XHit , YHit - coordinates of hit - 2989 ; X - index of the hit tank - 2990 - 2991 8E84 A6 AE ldx NumberOfPlayers - 2992 8E86 CA dex - 2993 8E87 CheckCollisionWithTankLoop - 2994 8E87 BD AF 43 lda eXistenZ,x - 2995 8E8A F0 51 beq DeadTank - 2996 ; first we test top and bottom (same with and without shield!) - 2997 8E8C BD 19 44 lda ytankstable,x - 2998 8E8F C5 63 cmp ydraw ; check range - 2999 8E91 90 4A bcc BelowTheTank ;(ytankstable,ytankstable+3) - 3000 8E93 E9 03 sbc #3 ; hitbox height - 3001 8E95 C5 63 cmp ydraw - 3002 8E97 B0 44 bcs OverTheTank - 3003 ; with or without shield ? - 3004 - 3005 8E99 BD FD 43 lda ActiveDefenceWeapon,x - 3006 8E9C C9 25 cmp #ind_Mag_Deflector__ ; first shielded weapon - 3007 8E9E 90 04 bcc CheckCollisionWithNotShieldedTank - 3008 8EA0 C9 2A cmp #ind_Bouncy_Castle__+1 ; last shielded weapon - 3009 8EA2 90 3D bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) - 3010 - 3011 ;lda ShieldEnergy,x ; there is wrong method to check shield :) - 3012 ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) - 3013 - 3014 8EA4 CheckCollisionWithNotShieldedTank - 3015 8EA4 BD 13 44 lda xtankstableH,x - 3016 8EA7 C5 62 cmp xdraw+1 - 3017 8EA9 D0 05 bne @+ - 3018 8EAB BD 0D 44 lda xtankstableL,x - 3019 8EAE C5 61 cmp xdraw - 3020 @ - 3021 8EB0 B0 2B bcs LeftFromTheTank - 3022 ; add 8 double byte - 3023 ; now we use Y as low byte and A as high byte of checked position (right edge of tank) - 3024 ; it is tricky but fast and much shorter - 3025 8EB2 18 clc - 3026 8EB3 BD 0D 44 lda xtankstableL,x - 3027 8EB6 69 08 adc #TankWidth - 3028 8EB8 A8 tay - 3029 8EB9 BD 13 44 lda xtankstableH,x - 3030 8EBC 69 00 adc #0 - 3031 8EBE C5 62 cmp xdraw+1 - 3032 8EC0 D0 02 bne @+ - 3033 8EC2 C4 61 cpy xdraw - 3034 @ - 3035 8EC4 90 17 bcc RightFromTheTank - 3036 8EC6 TankHit - 3037 8EC6 E8 inx - 3038 8EC7 86 BF stx HitFlag ; index of hit tank+1 - 3039 8EC9 CA dex - 3040 8ECA A5 61 85 C1 A5 62 + mwa xdraw XHit - 3041 8ED2 A5 63 8D 5F 44 A5 + mwa ydraw YHit - 3042 8EDC 60 rts ; in X there is an index of the hit tank - 3043 8EDD RightFromTheTank - 3044 8EDD LeftFromTheTank - 3045 8EDD OverTheTank - 3046 8EDD BelowTheTank - 3047 8EDD DeadTank - 3048 8EDD CA dex - 3049 8EDE 10 A7 bpl CheckCollisionWithTankLoop - 3050 8EE0 60 rts - 3051 8EE1 CheckCollisionWithShieldedTank - 3052 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - 3053 ; it is tricky but fast and much shorter - 3054 8EE1 BD 0D 44 lda xtankstableL,x - 3055 8EE4 38 sec - 3056 8EE5 E9 04 sbc #4 ; 5 pixels more on left side - 3057 8EE7 A8 tay - 3058 8EE8 BD 13 44 lda xtankstableH,x - 3059 8EEB E9 00 sbc #0 - 3060 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! - 3061 8EED C5 62 cmp xdraw+1 - 3062 8EEF D0 02 bne @+ - 3063 8EF1 C4 61 cpy xdraw - 3064 @ - 3065 8EF3 B0 E8 bcs LeftFromTheTank - 3066 8EF5 98 tya ;add 16 double byte - 3067 8EF6 18 clc - 3068 8EF7 69 10 adc #TankWidth+4+4 - 3069 8EF9 A8 tay - 3070 8EFA BD 13 44 lda xtankstableH,x - 3071 8EFD 69 00 adc #0 - 3072 8EFF C5 62 cmp xdraw+1 - 3073 8F01 D0 02 bne @+ - 3074 8F03 C4 61 cpy xdraw - 3075 @ - 3076 8F05 90 D6 bcc RightFromTheTank - 3077 8F07 B0 BD bcs TankHit - 3078 .endp - 3079 ;-------------------------------------------------- - 3080 8F09 CalculateExplosionRange0 - 3081 ;-------------------------------------------------- - 3082 - 3083 ;the same as below, but without summing up - 3084 ;(for the first or single explosion) - 3085 - 3086 ;zero soil fall out ranges - 3087 8F09 20 89 8F jsr ClearScreenSoilRange - 3088 ;-------------------------------------------------- - 3089 8F0C .proc CalculateExplosionRange - 3090 ;-------------------------------------------------- - 3091 ;calculates total horizontal range of explosion by - 3092 ;"summing up" ranges of all separate explosions - 3093 - 3094 ; WeaponRangeRight = xdraw + ExplosionRadius - 3095 8F0C 18 clc - 3096 8F0D A5 61 lda xdraw - 3097 8F0F 65 B0 adc ExplosionRadius - 3098 8F11 8D 35 44 sta WeaponRangeRight - 3099 8F14 A5 62 lda xdraw+1 - 3100 8F16 69 00 adc #$00 - 3101 8F18 8D 36 44 sta WeaponRangeRight+1 - 3102 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now - 3103 ; cpw WeaponRangeRight #screenwidth-1 - 3104 8F1B C9 01 cmp #>(screenwidth-1) - 3105 8F1D D0 05 bne @+ - 3106 8F1F AD 35 44 lda WeaponRangeRight - 3107 8F22 C9 3F cmp #<(screenwidth-1) - 3108 8F24 90 0A @ bcc NotOutOfTheScreenRight - 3109 8F26 A9 3F 8D 35 44 A9 + mwa #screenwidth-1 WeaponRangeRight - 3110 - 3111 8F30 NotOutOfTheScreenRight - 3112 ; WeaponRangeLeft = xdraw - ExplosionRadius - 3113 8F30 38 sec - 3114 8F31 A5 61 lda xdraw - 3115 8F33 E5 B0 sbc ExplosionRadius - 3116 8F35 8D 33 44 sta WeaponRangeLeft - 3117 8F38 A5 62 lda xdraw+1 - 3118 8F3A E9 00 sbc #$00 - 3119 8F3C 8D 34 44 sta WeaponRangeLeft+1 - 3120 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now - 3121 ; lda WeaponRangeLeft+1 - 3122 8F3F 10 08 bpl NotOutOfTheScreenLeft - 3123 8F41 A9 00 lda #0 - 3124 8F43 8D 33 44 sta WeaponRangeLeft - 3125 8F46 8D 34 44 sta WeaponRangeLeft+1 - 3126 8F49 NotOutOfTheScreenLeft - 3127 - 3128 8F49 A5 D3 CD 34 44 D0 + cpw RangeLeft WeaponRangeLeft - 3129 8F55 90 0A bcc CheckRangeRight - 3130 8F57 AD 33 44 85 D2 AD + mwa WeaponRangeLeft RangeLeft - 3131 8F61 CheckRangeRight - 3132 8F61 A5 D5 CD 36 44 D0 + cpw RangeRight WeaponRangeRight - 3133 8F6D B0 0A bcs RangesChecked - 3134 8F6F AD 35 44 85 D4 AD + mwa WeaponRangeRight RangeRight - 3135 8F79 RangesChecked - 3136 - 3137 8F79 60 rts - 3138 .endp - 3139 - 3140 ;-------------------------------------------------- - 3141 8F7A .proc SetFullScreenSoilRange - 3142 ; whole screen in range of soil down - 3143 ;-------------------------------------------------- - 3144 8F7A A9 00 lda #0 - 3145 8F7C 85 D2 sta RangeLeft - 3146 8F7E 85 D3 sta RangeLeft+1 - 3147 8F80 A9 40 85 D4 A9 01 + mwa #screenwidth RangeRight - 3148 8F88 60 rts - 3149 .endp - 3150 ;-------------------------------------------------- - 3151 8F89 .proc ClearScreenSoilRange - 3152 ; cleanup of the soil fall down ranges (left and right) - 3153 ;-------------------------------------------------- - 3154 8F89 A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft - 3155 8F91 A9 00 lda #0 - 3156 8F93 85 D4 sta RangeRight - 3157 8F95 85 D5 sta RangeRight+1 - 3158 8F97 60 rts - 3159 .endp - 3160 ;-------------------------------------------------- - 3161 8F98 .proc DecreaseWeaponBeforeShoot - 3162 ;-------------------------------------------------- - 3163 8F98 A6 6C ldx TankNr - 3164 8F9A BD F7 43 lda ActiveWeapon,x - 3165 8F9D 20 A4 8F jsr DecreaseWeapon - 3166 ; and here we have amount of possessed ammo for given weapon - 3167 8FA0 8D 09 44 sta WeaponDepleted - 3168 8FA3 60 rts - 3169 .endp - 3170 - 3171 ;-------------------------------------------------- - 3172 8FA4 .proc DecreaseWeapon - 3173 ; in: A: Weapon number, TankNr - 3174 ; out: A: number of shells left, Y: weapon number - 3175 ; decreases 1 bullet from a weapon(A) of tank(TankNr) - 3176 ;-------------------------------------------------- - 3177 8FA4 20 B3 8F jsr HowManyBullets - 3178 8FA7 F0 09 beq noBullets ; no bullets - no decreasing (additional check) - 3179 8FA9 C0 00 cpy #0 - 3180 8FAB F0 05 beq defaultWeapon ; no decreasing Baby Missile - 3181 8FAD 38 sec - 3182 8FAE E9 01 sbc #1 - 3183 8FB0 91 98 sta (weaponPointer),y ; we have good values after HowManyBullets - 3184 8FB2 defaultWeapon - 3185 8FB2 noBullets - 3186 8FB2 60 rts - 3187 .endp - 3188 - 3189 ;-------------------------------------------------- - 3190 8FB3 .proc HowManyBullets - 3191 ; in: A <-- Weapon number, TankNr - 3192 ; out: A <-- How many bullets in the weapon, Y: weapon number - 3193 ; how many bullets weapon of tank(TankNr) has, Result in A - 3194 ;-------------------------------------------------- - 3195 8FB3 A8 tay - 3196 8FB4 A6 6C ldx TankNr - 3197 8FB6 BD F1 5A lda TanksWeaponsTableL,x - 3198 8FB9 85 98 sta weaponPointer - 3199 8FBB BD F7 5A lda TanksWeaponsTableH,x - 3200 8FBE 85 99 sta weaponPointer+1 - 3201 - 3202 8FC0 B1 98 lda (weaponPointer),y ; and we have number of bullets in A - 3203 8FC2 60 rts - 3204 .endp - 3205 - 3206 - 3207 .ENDIF - 3208 - 352 ;---------------------------------------------- - 353 8FC3 icl 'ai.asm' -Source: ai.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 ; artificial intelligence of tanks goes here! - 4 ; in A there is a level of tank's intelligence - 5 ; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all) - 6 ; at the moment (2003-08-15) I have no idea how - 7 ; to program better opponents, but moron is easy - - 8 ; - shoots random direction and force - 9 ; greeeting to myself 10 years older in 2013-11-09... still no idea - 10 - 11 - 12 ;---------------------------------------------- - 13 8FC3 .proc ArtificialIntelligence ; - 14 ; A - skill of the TankNr (in X) - 15 ; returns shoot energy and angle in - 16 ; ForceTable/L/H and AngleTable - 17 ;---------------------------------------------- - 18 8FC3 0A asl - 19 8FC4 A8 tay - 20 8FC5 88 88 :2 dey ;credit KK - 21 8FC7 B9 F7 8F lda AIRoutines+1,y - 22 8FCA 48 pha - 23 8FCB B9 F6 8F lda AIRoutines,y - 24 8FCE 48 pha - 25 ; it's no necessary - PrepareAIShoot is next proc :) - 26 ; jsr PrepareAIShoot - 27 ; rts - 28 .endp - 29 ;---------------------------------------------- - 30 8FCF .proc PrepareAIShoot - 31 ; create low precision table of positions - 32 ; by dividing positions by 4 - 33 8FCF A0 05 ldy #MaxPlayers-1 - 34 8FD1 loop - 35 8FD1 B9 0D 44 lda xtankstableL,y - 36 8FD4 85 72 sta temp - 37 8FD6 B9 13 44 lda xtankstableH,y - 38 8FD9 85 73 sta temp+1 - 39 ;= /4 - 40 8FDB 46 73 66 72 46 73 + :2 lsrw temp - 41 8FE3 A5 72 lda temp - 42 8FE5 99 1F 44 sta LowResDistances,y - 43 8FE8 88 dey - 44 8FE9 10 E6 bpl loop - 45 - 46 ; common values used in AI routines - 47 ; address of weapons table (for future use) - 48 8FEB WepTableToTemp - 49 8FEB BD F1 5A lda TanksWeaponsTableL,x - 50 8FEE 85 72 sta temp - 51 8FF0 BD F7 5A lda TanksWeaponsTableH,x - 52 8FF3 85 73 sta temp+1 - 53 8FF5 60 rts - 54 .endp - 55 ;---------------- - 56 8FF6 AIRoutines - 57 8FF6 1C 90 .word Moron-1 - 58 8FF8 3D 90 .word Shooter-1 ;Shooter - 59 8FFA CD 90 .word Poolshark-1 ;Poolshark - 60 8FFC 8E 91 .word Tosser-1 ;Tosser - 61 8FFE B7 91 .word Chooser-1 ;Chooser - 62 9000 05 92 .word Spoiler-1 ;Spoiler - 63 9002 53 92 .word Cyborg-1 ;Cyborg - 64 9004 05 90 .word Unknown-1 ;Unknown - 65 - 66 ;---------------------------------------------- - 67 9006 .proc Unknown - 68 ; random robotank (from Poolshark to Cyborg) - 69 9006 randomize 4 13 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9006 ?rand - 7 9006 AD 1B D4 lda random - 8 9009 C9 04 cmp #4 ;floor - 9 900B 90 F9 bcc ?rand - 10 900D C9 0E cmp #13+1 ;ceiling - 11 900F B0 F5 bcs ?rand -Source: ai.asm - 70 9011 29 FE and #%11111110 - 71 9013 A8 tay - 72 9014 B9 F7 8F lda AIRoutines+1,y - 73 9017 48 pha - 74 9018 B9 F6 8F lda AIRoutines,y - 75 901B 48 pha - 76 901C 60 rts - 77 .endp - 78 ;---------------------------------------------- - 79 901D .proc Moron - 80 901D 20 3D 59 jsr RandomizeAngle - 81 9020 85 D6 sta NewAngle - 82 9022 A9 50 8D E4 48 A9 + mwa #80 RandBoundaryLow - 83 902C A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh - 84 9036 20 45 59 jsr RandomizeForce - 85 ; choose the best weapon - 86 9039 A0 1F ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) - 87 903B 4C F4 95 jmp ChooseBestOffensive.NotFromAll - 88 ;rts - 89 .endp - 90 ;---------------------------------------------- - 91 903E .proc Shooter - 92 - 93 903E BD CC 48 lda PreviousAngle,x - 94 9041 1D D2 48 ora PreviousEnergyL,x - 95 9044 1D DE 48 ora PreviousEnergyH,x - 96 9047 F0 2D beq firstShoot - 97 - 98 9049 BD CC 48 lda PreviousAngle,x - 99 904C C9 5A cmp #90 - 100 904E B0 09 bcs shootingLeftAtThisMomentOfTime - 101 ; shooting right at this moment of time - 102 9050 38 sec - 103 9051 E9 05 sbc #5 - 104 9053 C9 0A cmp #10 - 105 9055 B0 09 bcs @+ ;not smaller than 10 - 106 9057 90 1D bcc firstShoot ; GET THE aim againg - 107 - 108 9059 shootingLeftAtThisMomentOfTime - 109 - 110 9059 18 clc - 111 905A 69 05 adc #5 - 112 905C C9 AA cmp #170 ; maximum shooter angle - 113 905E B0 16 bcs firstShoot - 114 @ - 115 9060 85 D6 sta NewAngle - 116 - 117 9062 38 sec - 118 9063 BD D2 48 lda PreviousEnergyL,x - 119 9066 E9 05 sbc #5 - 120 9068 9D D9 43 sta ForceTableL,x - 121 906B BD DE 48 lda PreviousEnergyH,x - 122 906E E9 00 sbc #0 - 123 9070 9D DF 43 sta ForceTableH,x - 124 9073 4C B7 90 jmp endo - 125 - 126 9076 firstShoot - 127 ; compare the x position with the middle of the screen - 128 9076 BD 13 44 lda xTanksTableH,x - 129 9079 C9 00 cmp #>(screenwidth/2) - 130 907B D0 05 bne @+ - 131 907D BD 0D 44 lda xTanksTableL,x - 132 9080 C9 A0 cmp #<(screenwidth/2) - 133 9082 90 0F @ bcc tankIsOnTheRight - 134 - 135 ; enemy tank is on the left - 136 9084 randomize 95 125 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9084 ?rand - 7 9084 AD 1B D4 lda random - 8 9087 C9 5F cmp #95 ;floor - 9 9089 90 F9 bcc ?rand - 10 908B C9 7E cmp #125+1 ;ceiling - 11 908D B0 F5 bcs ?rand -Source: ai.asm - 137 908F 85 D6 sta NewAngle - 138 9091 D0 0D bne forceNow - 139 - 140 9093 tankIsOnTheRight - 141 9093 randomize 55 85 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9093 ?rand - 7 9093 AD 1B D4 lda random - 8 9096 C9 37 cmp #55 ;floor - 9 9098 90 F9 bcc ?rand - 10 909A C9 56 cmp #85+1 ;ceiling - 11 909C B0 F5 bcs ?rand -Source: ai.asm - 142 909E 85 D6 sta NewAngle - 143 - 144 90A0 forceNow - 145 90A0 A9 64 8D E4 48 A9 + mwa #100 RandBoundaryLow - 146 90AA A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh - 147 ;ldx TankNr ;this is possibly not necessary - 148 90B4 20 45 59 jsr RandomizeForce - 149 - 150 90B7 endo - 151 ;ldx TankNr ;this is possibly not necessary - 152 90B7 20 79 59 jsr RandomizeForce.LimitForce - 153 90BA A5 D6 lda NewAngle - 154 90BC 9D CC 48 sta PreviousAngle,x - 155 90BF BD D9 43 lda ForceTableL,x - 156 90C2 9D D2 48 sta PreviousEnergyL,x - 157 90C5 BD DF 43 lda ForceTableH,x - 158 90C8 9D DE 48 sta PreviousEnergyH,x - 159 - 160 ; choose the best weapon - 161 - 162 90CB 4C F2 95 jmp ChooseBestOffensive - 163 ;rts - 164 .endp - 165 ;---------------------------------------------- - 166 90CE .proc Poolshark - 167 90CE 20 35 91 jsr UseBatteryOrFlag - 168 ; defensives - 169 90D1 20 60 91 jsr PoolsharkDefensives - 170 90D4 firstShoot - 171 ;find nearest tank neighbour - 172 90D4 20 C0 92 jsr FindBestTarget2 - 173 90D7 F0 0F beq EnemyOnLeft - 174 ; calculate index to shotangle table - 175 ; in temp2 we have x distance divided by 8 - 176 90D9 A5 74 lda temp2 - 177 90DB 4A 4A 4A :3 lsr @ - 178 90DE 29 07 and #%00000111 - 179 90E0 18 clc - 180 90E1 69 08 adc #8 - 181 90E3 8D E8 48 sta AngleTablePointer - 182 90E6 D0 0C bne AngleIsSet - 183 90E8 EnemyOnLeft - 184 90E8 A5 74 lda temp2 - 185 90EA 4A 4A 4A :3 lsr @ - 186 90ED 29 07 and #%00000111 - 187 90EF 49 07 eor #%00000111 - 188 90F1 8D E8 48 sta AngleTablePointer - 189 90F4 AngleIsSet - 190 - 191 90F4 randomize 0 8 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 90F4 ?rand - 7 90F4 AD 1B D4 lda random - 8 90F7 C9 00 cmp #0 ;floor - 9 90F9 90 F9 bcc ?rand - 10 90FB C9 09 cmp #8+1 ;ceiling - 11 90FD B0 F5 bcs ?rand -Source: ai.asm - 192 90FF AC E8 48 ldy AngleTablePointer - 193 9102 18 clc - 194 9103 79 25 91 adc AngleTable,y - 195 9106 85 D6 sta NewAngle - 196 - 197 9108 forceNow - 198 9108 A9 2C 8D E4 48 A9 + mwa #300 RandBoundaryLow - 199 9112 A9 BC 8D E6 48 A9 + mwa #700 RandBoundaryHigh - 200 911C A6 6C ldx TankNr - 201 911E 20 45 59 jsr RandomizeForce - 202 - 203 9121 endo - 204 ; choose the best weapon - 205 - 206 9121 20 F2 95 jsr ChooseBestOffensive - 207 9124 60 rts - 208 - 209 ;---------------------------------------------- - 210 9125 AngleTable ; 16 bytes ;ba w $348b L$3350 - 211 9125 6A 72 7A 82 8A 92 + .by 106,114,122,130,138,146,154,162 - 212 912D 12 1A 22 2B 32 3A + .by 18,26,34,43,50,58,66,74 - 213 .endp - 214 ;---------------------------------------------- - 215 9135 .proc UseBatteryOrFlag - 216 9135 20 45 91 jsr UseBattery ; as subroutine for reuse in AutoDefense - 217 ; if very low energy and no battery then use White Flag - 218 9138 BD A2 43 lda Energy,x - 219 913B C9 05 cmp #5 - 220 913D B0 05 bcs EnoughEnergy - 221 ; lower than 5 units - white flag - 222 913F A9 20 lda #ind_White_Flag_____ - 223 9141 9D FD 43 sta ActiveDefenceWeapon,x - 224 9144 EnoughEnergy - 225 9144 60 rts - 226 .endp - 227 ; - 228 9145 .proc UseBattery - 229 ; if low energy ten use battery - 230 9145 BD A2 43 lda Energy,x - 231 9148 C9 1E cmp #30 - 232 914A B0 13 bcs EnoughEnergy - 233 ; lower than 30 units - check battery - 234 914C A0 21 ldy #ind_Battery________ - 235 914E B1 72 lda (temp),y ; has address of TanksWeaponsTable - 236 9150 F0 0D beq NoBatteries - 237 ; we have batteries - use one - 238 9152 38 sec - 239 9153 E9 01 sbc #1 - 240 9155 91 72 sta (temp),y - 241 9157 A9 63 lda #99 - 242 9159 9D A2 43 sta Energy,x - 243 915C 20 2A 58 jsr MaxForceCalculate - 244 915F EnoughEnergy - 245 915F NoBatteries - 246 915F 60 rts - 247 .endp - 248 ;---------------------------------------------- - 249 9160 .proc PoolsharkDefensives - 250 ; use best defensive :) - 251 ; but not allways - 252 9160 randomize 1 3 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9160 ?rand - 7 9160 AD 1B D4 lda random - 8 9163 C9 01 cmp #1 ;floor - 9 9165 90 F9 bcc ?rand - 10 9167 C9 04 cmp #3+1 ;ceiling - 11 9169 B0 F5 bcs ?rand -Source: ai.asm - 253 916B C9 01 cmp #1 - 254 916D D0 1F bne NoUseDefensive - 255 ; first check check if any is in use - 256 916F BD FD 43 lda ActiveDefenceWeapon,x - 257 9172 D0 1A bne DefensiveInUse - 258 9174 A0 2A ldy #last_real_defensive+1 ;the last defensive weapon - 259 @ - 260 9176 88 dey - 261 9177 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - 262 9179 F0 13 beq NoUseDefensive - 263 917B B1 72 lda (temp),y ; has address of TanksWeaponsTable - 264 917D F0 F7 beq @- - 265 ; decrease in inventory - 266 917F 38 sec - 267 9180 E9 01 sbc #1 - 268 9182 91 72 sta (temp),y ; has address of TanksWeaponsTable - 269 ; activate defensive weapon - 270 9184 98 tya ; number of selectet defensive weapon - 271 9185 9D FD 43 sta ActiveDefenceWeapon,x - 272 9188 B9 1A 60 lda DefensiveEnergy,y - 273 918B 9D A8 43 sta ShieldEnergy,x - 274 918E NoUseDefensive - 275 918E DefensiveInUse - 276 918E 60 rts - 277 .endp - 278 ;---------------------------------------------- - 279 918F .proc Tosser - 280 918F 20 35 91 jsr UseBatteryOrFlag - 281 ; use best defensive :) - 282 9192 20 98 91 jsr TosserDefensives - 283 ; Toosser is like Poolshark but allways uses defensives - 284 9195 4C D4 90 jmp Poolshark.firstShoot - 285 .endp - 286 ;---------------------------------------------- - 287 9198 .proc TosserDefensives - 288 ; use best defensive :) - 289 ; allways - 290 ; first check check if any is in use - 291 9198 BD FD 43 lda ActiveDefenceWeapon,x - 292 919B D0 1A bne DefensiveInUse - 293 919D A0 2A ldy #last_real_defensive+1 ;the last defensive weapon - 294 @ - 295 919F 88 dey - 296 91A0 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - 297 91A2 F0 13 beq NoUseDefensive - 298 91A4 B1 72 lda (temp),y ; has address of TanksWeaponsTable - 299 91A6 F0 F7 beq @- - 300 ; decrease in inventory - 301 91A8 38 sec - 302 91A9 E9 01 sbc #1 - 303 91AB 91 72 sta (temp),y ; has address of TanksWeaponsTable - 304 ; activate defensive weapon - 305 91AD 98 tya ; number of selectet defensive weapon - 306 91AE 9D FD 43 sta ActiveDefenceWeapon,x - 307 91B1 B9 1A 60 lda DefensiveEnergy,y - 308 91B4 9D A8 43 sta ShieldEnergy,x - 309 91B7 DefensiveInUse - 310 91B7 NoUseDefensive - 311 91B7 60 rts - 312 .endp - 313 ;---------------------------------------------- - 314 91B8 .proc Chooser - 315 ; like cyborg but more randomizing force - 316 91B8 20 35 91 jsr UseBatteryOrFlag - 317 ; use defensives like Tosser - 318 91BB 20 98 91 jsr TosserDefensives - 319 ; now select best target - 320 91BE A9 00 lda #$00 ; no prefer humans - 321 91C0 20 81 92 jsr FindBestTarget3 - 322 91C3 8C 31 44 sty TargetTankNr - 323 ; aiming - 324 91C6 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 325 - 326 ; choose the best weapon - 327 91C9 20 F2 95 jsr ChooseBestOffensive - 328 - 329 ; randomizing force +-100 - 330 91CC 38 A5 A4 E9 64 8D + sbw Force #100 RandBoundaryLow - 331 91DB 10 0A bpl NotNegativeEnergy - 332 91DD A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow - 333 91E7 NotNegativeEnergy - 334 91E7 18 A5 A4 69 64 8D + adw Force #100 RandBoundaryHigh - 335 91F6 20 45 59 jsr RandomizeForce - 336 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - 337 91F9 20 08 96 jsr GetDistance - 338 91FC C9 06 cmp #6 ; 24/4 - 339 91FE B0 05 bcs HighForce - 340 9200 A9 00 lda #ind_Baby_Missile___ - 341 9202 9D F7 43 sta ActiveWeapon,x - 342 9205 HighForce - 343 9205 60 rts - 344 .endp - 345 ;---------------------------------------------- - 346 9206 .proc Spoiler - 347 ; like cyborg but little randomizing force - 348 9206 20 35 91 jsr UseBatteryOrFlag - 349 ; use defensives like Tosser - 350 9209 20 98 91 jsr TosserDefensives - 351 ; now select best target - 352 920C A9 00 lda #$00 ; no prefer humans - 353 920E 20 81 92 jsr FindBestTarget3 - 354 9211 8C 31 44 sty TargetTankNr - 355 ; aiming - 356 9214 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 357 - 358 ; choose the best weapon - 359 9217 20 F2 95 jsr ChooseBestOffensive - 360 - 361 ; randomizing force +-50 - 362 921A 38 A5 A4 E9 32 8D + sbw Force #50 RandBoundaryLow - 363 9229 10 0A bpl NotNegativeEnergy - 364 922B A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow - 365 9235 NotNegativeEnergy - 366 9235 18 A5 A4 69 32 8D + adw Force #50 RandBoundaryHigh - 367 9244 20 45 59 jsr RandomizeForce - 368 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - 369 9247 20 08 96 jsr GetDistance - 370 924A C9 06 cmp #6 ; 24/4 - 371 924C B0 05 bcs HighForce - 372 924E A9 00 lda #ind_Baby_Missile___ - 373 9250 9D F7 43 sta ActiveWeapon,x - 374 9253 HighForce - 375 9253 60 rts - 376 .endp - 377 ;---------------------------------------------- - 378 9254 .proc Cyborg - 379 9254 20 35 91 jsr UseBatteryOrFlag - 380 ; use defensives like Tosser - 381 9257 20 98 91 jsr TosserDefensives - 382 ; now select best target - 383 925A A9 64 lda #100 ; prefer humans - 384 925C 20 81 92 jsr FindBestTarget3 - 385 925F 8C 31 44 sty TargetTankNr - 386 ; aiming - 387 9262 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 388 - 389 ; choose the best weapon - 390 9265 A0 04 ldy #ind_Nuke___________+1 - 391 9267 20 F4 95 jsr ChooseBestOffensive.NotFromAll - 392 - 393 926A A5 A4 lda Force - 394 926C 9D D9 43 sta ForceTableL,x - 395 926F A5 A5 lda Force+1 - 396 9271 9D DF 43 sta ForceTableH,x - 397 ; if target distance lower than 32 - set weapon to Baby Missile (for security :) - 398 9274 20 08 96 jsr GetDistance - 399 9277 C9 08 cmp #8 ;32/4 - 400 9279 B0 05 bcs HighForce - 401 927B A9 00 lda #ind_Baby_Missile___ - 402 927D 9D F7 43 sta ActiveWeapon,x - 403 9280 HighForce - 404 9280 60 rts - 405 .endp - 406 - 407 ;---------------------------------------------- - 408 9281 .proc FindBestTarget3 - 409 ; find target with lowest energy - 410 ; X - shooting tank number - 411 ; A - 100 - prefer humans , 0 - equality :) - 412 ; returns target tank number in Y and - 413 ; direcion of shoot in A (0 - left, >0 - right) - 414 ;---------------------------------------------- - 415 9281 85 A2 sta PreferHumansFlag - 416 ; jsr MakeLowResDistances - 417 9283 A9 CA lda #202 - 418 9285 85 74 sta temp2 ; max possible energy - 419 9287 A9 00 lda #0 - 420 9289 85 7E sta tempor2 ; direction of shoot - 421 ;ldx TankNr - 422 928B A4 AE ldy NumberOfPlayers - 423 928D 88 dey - 424 - 425 928E loop01 - 426 928E C4 6C cpy TankNr - 427 9290 F0 26 beq skipThisPlayer - 428 9292 B9 AF 43 lda eXistenZ,y - 429 9295 F0 21 beq skipThisPlayer - 430 - 431 9297 B9 39 41 lda skilltable,y - 432 929A F0 02 beq ItIsHuman - 433 929C A5 A2 lda PreferHumansFlag - 434 929E ItIsHuman - 435 929E 18 clc - 436 929F 79 A2 43 adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) - 437 92A2 C5 74 cmp temp2 ; lowest - 438 92A4 B0 12 bcs lowestIsLower - 439 92A6 85 74 sta temp2 - 440 92A8 84 75 sty temp2+1 ; number of the closest tank - 441 92AA A9 00 85 7E mva #0 tempor2 - 442 92AE BD 1F 44 lda LowResDistances,x - 443 92B1 D9 1F 44 cmp LowResDistances,y - 444 92B4 B0 02 bcs EnemyOnTheLeft - 445 ; enemy on right - 446 92B6 E6 7E inc tempor2 ; set direction to right - 447 - 448 92B8 EnemyOnTheLeft - 449 92B8 lowestIsLower - 450 92B8 skipThisPlayer - 451 92B8 88 dey - 452 92B9 10 D3 bpl loop01 - 453 ; now we have number of the farthest tank in temp2+1 - 454 ; and direction (0 - left, >0 - right) in tempor2 - 455 ; let's move them to registers - 456 ; in temp2 we have energy of target - 457 92BB A4 75 ldy temp2+1 - 458 92BD A5 7E lda tempor2 - 459 92BF 60 rts - 460 .endp - 461 ;---------------------------------------------- - 462 92C0 .proc FindBestTarget2 - 463 ; find nearest tank neighbour - 464 ; X - shooting tank number - 465 ; returns target tank number in Y and - 466 ; direcion of shoot in A (0 - left, >0 - right) - 467 ;---------------------------------------------- - 468 ; jsr MakeLowResDistances - 469 92C0 A9 FF 85 74 mva #$ff temp2 ; min possible distance - 470 92C4 A9 00 85 7E mva #0 tempor2 ; direction of shoot - 471 - 472 ;ldx TankNr - 473 92C8 A4 AE ldy NumberOfPlayers - 474 92CA 88 dey - 475 - 476 92CB loop01 - 477 92CB C4 6C cpy TankNr - 478 92CD F0 2F beq skipThisPlayer - 479 92CF B9 AF 43 lda eXistenZ,y - 480 92D2 F0 2A beq skipThisPlayer - 481 - 482 92D4 BD 1F 44 lda LowResDistances,x - 483 92D7 D9 1F 44 cmp LowResDistances,y - 484 92DA B0 13 bcs EnemyOnTheLeft - 485 ;enemy on the right - 486 92DC 38 sec - 487 92DD B9 1F 44 lda LowResDistances,y - 488 92E0 FD 1F 44 sbc LowResDistances,x - 489 92E3 C5 74 cmp temp2 ; lowest - 490 92E5 B0 17 bcs lowestIsLower - 491 92E7 85 74 sta temp2 - 492 92E9 84 75 sty temp2+1 ; number of the closest tank - 493 92EB E6 7E inc tempor2 ; set direction to right - 494 92ED D0 0F bne lowestIsLower - 495 - 496 92EF EnemyOnTheLeft - 497 92EF 38 sec - 498 92F0 BD 1F 44 lda LowResDistances,x - 499 92F3 F9 1F 44 sbc LowResDistances,y - 500 92F6 C5 74 cmp temp2 ; lowest - 501 92F8 B0 04 bcs lowestIsLower - 502 92FA 85 74 sta temp2 - 503 92FC 84 75 sty temp2+1 ; number of the closest tank - 504 - 505 92FE lowestIsLower - 506 92FE skipThisPlayer - 507 92FE 88 dey - 508 92FF 10 CA bpl loop01 - 509 ; now we have number of the closest tank in temp2+1 - 510 ; and direction (0 - left, >0 - right) in tempor2 - 511 ; let's move them to registers - 512 ; in temp2 we have x distance divided by 8 - 513 9301 A4 75 ldy temp2+1 - 514 9303 A5 7E lda tempor2 - 515 9305 60 rts - 516 .endp - 517 - 518 ;---------------------------------------------- - 519 9306 .proc TakeAim - 520 ; targeting the tank number TargetTankNr (and Y) - 521 ; A (and tempor2) - direction from shooting tank (0 - left, >0 - right) - 522 ; returns angle and power of shoot tank X (TankNr) - 523 ; in the appropriate variables (Angle and Force) - 524 ;---------------------------------------------- - 525 9306 BD F7 43 lda ActiveWeapon,x - 526 9309 48 pha ; store active weapon - 527 930A A9 FF 8D 32 44 mva #$ff SecondTryFlag - 528 ; set initial Angle and Force values - 529 930F AD 41 41 lda OptionsTable+2 ; selected gravity - 530 9312 0A asl - 531 9313 A8 tay - 532 ; force correction - lower tank Y position - higher possible force - 533 9314 38 sec - 534 9315 A9 C8 lda #screenheight - 535 9317 FD 19 44 sbc Ytankstable,x - 536 931A 85 74 sta temp2 - 537 931C 18 clc - 538 931D B9 EA A2 lda AIForceTable,y - 539 9320 8D E4 48 sta RandBoundaryLow - 540 9323 65 74 adc temp2 - 541 9325 8D E6 48 sta RandBoundaryHigh - 542 9328 B9 EB A2 lda AIForceTable+1,y - 543 932B 8D E5 48 sta RandBoundaryLow+1 - 544 932E 69 00 adc #0 - 545 9330 8D E7 48 sta RandBoundaryHigh+1 - 546 9333 20 45 59 jsr RandomizeForce - 547 9336 RepeatAim - 548 9336 20 96 59 jsr Table2Force - 549 ; wind correction 90+(wind/8) - 550 9339 A5 CE 85 74 A5 CF + mwa Wind temp2 - 551 9341 46 75 66 74 46 75 + :7 lsrw temp2 - 552 935D 18 clc - 553 935E A9 5A lda #90 - 554 9360 65 74 adc temp2 - 555 9362 85 D6 sta NewAngle - 556 ; set virtual weapon :) - 557 9364 A9 00 lda #ind_Baby_Missile___ - 558 9366 9D F7 43 sta ActiveWeapon,x - 559 ; now we have initial valuses - 560 9369 A9 C0 85 97 mva #%11000000 TestFlightFlag - 561 ; check targeting direction - 562 936D A5 7E lda tempor2 - 563 936F F0 03 4C 06 94 jne AimingLeft - 564 9374 AimingRight - 565 ; make test Shoot (Flight) - 566 9374 20 7E 94 jsr SetStartAndFlight - 567 9377 A5 BF lda HitFlag - 568 9379 F0 29 beq NoHitInFirstLoopR ; impossible :) - 569 937B 30 08 bmi GroundHitInFirstLoopR - 570 937D TankHitInFirstLoopR - 571 ; tank hit, but which tank? - 572 ; it's our target or not? - 573 937D A4 BF ldy HitFlag - 574 937F 88 dey - 575 9380 CC 31 44 cpy TargetTankNr - 576 9383 F0 28 beq EndOfFirstLoopR ; it's our target! - 577 ; if it's another tank then check position like ground hit - 578 9385 GroundHitInFirstLoopR - 579 ; checking only x position of hit - 580 9385 AC 31 44 ldy TargetTankNr - 581 9388 B9 13 44 lda xTanksTableH,y - 582 938B C5 C2 cmp XHit+1 - 583 938D D0 05 bne @+ - 584 938F B9 0D 44 lda xTanksTableL,y - 585 9392 C5 C1 cmp XHit - 586 @ - 587 9394 B0 15 bcs HitOnRightSideOfTargetR - 588 ; continue targeting - 589 9396 18 clc - 590 9397 A5 D6 lda NewAngle - 591 9399 69 05 adc #5 ; 5 deg to right - 592 939B C9 A0 cmp #(180-20) - 593 ; bcs EndOfFirstLoopR ; if angle 180-20 or higher - 594 939D B0 4F bcs AimSecondTry - 595 939F 85 D6 sta NewAngle - 596 93A1 4C 74 93 jmp AimingRight - 597 93A4 NoHitInFirstLoopR - 598 ; Angle 5 deg to left and end loop - 599 93A4 38 sec - 600 93A5 A5 D6 lda NewAngle - 601 93A7 E9 05 sbc #5 - 602 93A9 85 D6 sta NewAngle - 603 93AB HitOnRightSideOfTargetR - 604 93AB C6 D6 dec NewAngle - 605 93AD EndOfFirstLoopR - 606 93AD A9 05 85 76 mva #5 modify ; set counter (5 turns) - 607 93B1 SecondLoopR - 608 ; make test Shoot (Flight) - 609 93B1 20 7E 94 jsr SetStartAndFlight - 610 93B4 A5 BF lda HitFlag - 611 93B6 F0 2F beq NoHitInSecondLoopR ; impossible :) - 612 93B8 30 08 bmi GroundHitInSecondLoopR - 613 93BA TankHitInSecondLoopR - 614 ; tank hit, but which tank? - 615 ; it's our target or not? - 616 93BA A4 BF ldy HitFlag - 617 93BC 88 dey - 618 93BD CC 31 44 cpy TargetTankNr - 619 93C0 F0 27 beq EndOfSecondLoopR ; it's our target! - 620 ; if it's another tank then check position like ground hit - 621 93C2 GroundHitInSecondLoopR - 622 ; checking only x position of hit - 623 93C2 AC 31 44 ldy TargetTankNr - 624 93C5 B9 13 44 lda xTanksTableH,y - 625 93C8 C5 C2 cmp XHit+1 - 626 93CA D0 05 bne @+ - 627 93CC B9 0D 44 lda xTanksTableL,y - 628 93CF C5 C1 cmp XHit - 629 @ - 630 93D1 90 09 bcc HitOnLeftSideOfTargetR - 631 ; continue targeting - 632 93D3 C6 D6 dec NewAngle ; 1 deg to left - 633 93D5 C6 76 dec modify ; max 5 turns - 634 93D7 F0 10 beq EndOfSecondLoopR - 635 93D9 4C B1 93 jmp SecondLoopR - 636 93DC HitOnLeftSideOfTargetR - 637 ; decrease energy (a little) - 638 93DC 38 A5 A4 E9 05 85 + sbw Force #5 - 639 93E7 NoHitInSecondLoopR - 640 ; Angle 1 deg to right and end loop - 641 93E7 E6 D6 inc NewAngle - 642 93E9 EndOfSecondLoopR - 643 93E9 EndOfAim - 644 93E9 68 pla ; and restore active weapon - 645 93EA 9D F7 43 sta ActiveWeapon,x - 646 93ED 60 rts - 647 - 648 93EE AimSecondTry - 649 93EE 2C 32 44 bit SecondTryFlag - 650 93F1 10 F6 bpl EndOfAim ; closest RTS - 651 93F3 EE 32 44 inc SecondTryFlag - 652 93F6 A9 E8 lda #<1000 - 653 93F8 9D D9 43 sta ForceTableL,x - 654 93FB A9 03 lda #>1000 - 655 93FD 9D DF 43 sta ForceTableH,x - 656 9400 20 79 59 jsr RandomizeForce.LimitForce - 657 9403 4C 36 93 jmp RepeatAim - 658 - 659 9406 AimingLeft - 660 ; make test Shoot (Flight) - 661 9406 20 7E 94 jsr SetStartAndFlight - 662 9409 A5 BF lda HitFlag - 663 940B F0 29 beq NoHitInFirstLoopL ; impossible :) - 664 940D 30 08 bmi GroundHitInFirstLoopL - 665 940F TankHitInFirstLoopL - 666 ; tank hit, but which tank? - 667 ; it's our target or not? - 668 940F A4 BF ldy HitFlag - 669 9411 88 dey - 670 9412 CC 31 44 cpy TargetTankNr - 671 9415 F0 28 beq EndOfFirstLoopL ; it's our target! - 672 ; if it's another tank then check position like ground hit - 673 9417 GroundHitInFirstLoopL - 674 ; checking only x position of hit - 675 9417 AC 31 44 ldy TargetTankNr - 676 941A B9 13 44 lda xTanksTableH,y - 677 941D C5 C2 cmp XHit+1 - 678 941F D0 05 bne @+ - 679 9421 B9 0D 44 lda xTanksTableL,y - 680 9424 C5 C1 cmp XHit - 681 @ - 682 9426 90 15 bcc HitOnLeftSideOfTargetL - 683 ; continue targeting - 684 9428 38 sec - 685 9429 A5 D6 lda NewAngle - 686 942B E9 05 sbc #5 ; 5 deg to left - 687 942D C9 15 cmp #21 - 688 ; bcc EndOfFirstLoopL ; if angle 20 or lower - 689 942F 90 BD bcc AimSecondTry - 690 9431 85 D6 sta NewAngle - 691 9433 4C 06 94 jmp AimingLeft - 692 9436 NoHitInFirstLoopL - 693 ; Angle 5 deg to right and end loop - 694 9436 18 clc - 695 9437 A5 D6 lda NewAngle - 696 9439 69 05 adc #5 - 697 943B 85 D6 sta NewAngle - 698 943D HitOnLeftSideOfTargetL - 699 943D E6 D6 inc NewAngle - 700 943F EndOfFirstLoopL - 701 943F A9 05 85 76 mva #5 modify ; set counter (5 turns) - 702 9443 SecondLoopL - 703 ; make test Shoot (Flight) - 704 9443 20 7E 94 jsr SetStartAndFlight - 705 9446 A5 BF lda HitFlag - 706 9448 F0 2F beq NoHitInSecondLoopL ; impossible :) - 707 944A 30 08 bmi GroundHitInSecondLoopL - 708 944C TankHitInSecondLoopL - 709 ; tank hit, but which tank? - 710 ; it's our target or not? - 711 944C A4 BF ldy HitFlag - 712 944E 88 dey - 713 944F CC 31 44 cpy TargetTankNr - 714 9452 F0 27 beq EndOfSecondLoopL ; it's our target! - 715 ; if it's another tank then check position like ground hit - 716 9454 GroundHitInSecondLoopL - 717 ; checking only x position of hit - 718 9454 AC 31 44 ldy TargetTankNr - 719 9457 B9 13 44 lda xTanksTableH,y - 720 945A C5 C2 cmp XHit+1 - 721 945C D0 05 bne @+ - 722 945E B9 0D 44 lda xTanksTableL,y - 723 9461 C5 C1 cmp XHit - 724 @ - 725 9463 B0 09 bcs HitOnRightSideOfTargetL - 726 ; continue targeting - 727 9465 E6 D6 inc NewAngle ; 1 deg to right - 728 9467 C6 76 dec modify ; max 5 turns - 729 9469 F0 10 beq EndOfSecondLoopL - 730 946B 4C 43 94 jmp SecondLoopL - 731 946E HitOnRightSideOfTargetL - 732 ; decrease energy (a little) - 733 946E 38 A5 A4 E9 05 85 + sbw Force #5 - 734 9479 NoHitInSecondLoopL - 735 ; Angle 1 deg to left and end loop - 736 9479 C6 D6 dec NewAngle - 737 947B EndOfSecondLoopL - 738 947B 4C E9 93 jmp EndOfAim - 739 - 740 947E SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight - 741 ; xtraj+1 and ytraj+1 set - 742 947E 18 clc - 743 947F BD 0D 44 lda xTanksTableL,x - 744 9482 69 04 adc #4 - 745 9484 85 C9 sta xtraj+1 - 746 9486 BD 13 44 lda xTanksTableH,x - 747 9489 69 00 adc #0 - 748 948B 85 CA sta xtraj+2 - 749 948D 38 sec - 750 948E BD 19 44 lda yTanksTable,x - 751 9491 E9 04 sbc #4 - 752 9493 85 CC sta ytraj+1 - 753 9495 A9 00 85 CD mva #0 ytraj+2 - 754 9499 A5 D6 85 A7 mva NewAngle Angle - 755 949D 20 A0 83 jsr Flight - 756 94A0 A6 6C ldx TankNr - 757 94A2 60 rts - 758 .endp - 759 ;---------------------------------------------- - 760 94A3 .proc PurchaseAI ; - 761 ; A - skill of the TankNr - 762 ; makes purchase for AI opponents - 763 ; results of this routine are not visible on the screen - 764 ;---------------------------------------------- - 765 94A3 0A asl - 766 94A4 AA tax - 767 94A5 CA CA :2 dex ;credit KK - 768 94A7 BD B1 94 lda PurchaseAIRoutines+1,x - 769 94AA 48 pha - 770 94AB BD B0 94 lda PurchaseAIRoutines,x - 771 94AE 48 pha - 772 94AF 60 rts - 773 .endp - 774 - 775 ;---------------- - 776 94B0 PurchaseAIRoutines - 777 94B0 BF 94 .word MoronPurchase-1 - 778 94B2 39 95 .word ShooterPurchase-1 ;ShooterPurchase - 779 94B4 60 95 .word PoolsharkPurchase-1 ;PoolsharkPurchase - 780 94B6 89 95 .word TosserPurchase-1 ;TosserPurchase - 781 94B8 89 95 .word TosserPurchase-1 ;ChooserPurchase - 782 94BA BC 95 .word CyborgPurchase-1 ;SpoilerPurchase - 783 94BC BC 95 .word CyborgPurchase-1 ;CyborgPurchase - 784 94BE 89 95 .word TosserPurchase-1 ;UnknownPurchase - 785 - 786 ;---------------------------------------------- - 787 94C0 .proc MoronPurchase - 788 ;Moron buys nothing - 789 94C0 60 rts - 790 .endp - 791 ;------- - 792 94C1 .proc TryToPurchaseOnePiece2 ; for Cyborg - 793 ; A - weapon number, better it will be in range(1,32) - 794 ; TankNr in X - 795 ; DOES NOT CHANGE X - 796 94C1 A8 tay - 797 94C2 85 73 sta temp+1 - 798 94C4 4A 4A 4A :3 lsr ; A=A/8 - 799 94C7 85 72 sta temp - 800 94C9 98 tya - 801 94CA 29 07 and #%00000111 - 802 94CC A8 tay - 803 94CD B9 1C 5C lda bittable,y - 804 94D0 A4 72 ldy temp - 805 94D2 39 04 5D and PurchaseMeTable2,y - 806 94D5 F0 62 beq TryToPurchaseOnePiece.SorryNoPurchase - 807 94D7 4C F0 94 jmp TryToPurchaseOnePiece.PurchaseIt - 808 .endp - 809 ;------- - 810 94DA .proc TryToPurchaseOnePiece - 811 ; A - weapon number, better it will be in range(1,32) - 812 ; TankNr in X - 813 ; DOES NOT CHANGE X - 814 94DA A8 tay - 815 94DB 85 73 sta temp+1 - 816 94DD 4A 4A 4A :3 lsr ; A=A/8 - 817 94E0 85 72 sta temp - 818 94E2 98 tya - 819 94E3 29 07 and #%00000111 - 820 94E5 A8 tay - 821 94E6 B9 1C 5C lda bittable,y - 822 94E9 A4 72 ldy temp - 823 94EB 39 FE 5C and PurchaseMeTable,y - 824 94EE F0 49 beq SorryNoPurchase - 825 94F0 PurchaseIt - 826 94F0 A4 73 ldy temp+1 - 827 94F2 B9 9E 5C lda WeaponPriceL,y - 828 94F5 85 72 sta temp - 829 94F7 B9 6E 5C lda WeaponPriceH,y - 830 94FA 85 73 sta temp+1 - 831 ;price of the weapon in temp - 832 94FC BD 84 43 lda MoneyL,x - 833 94FF 85 74 sta temp2 - 834 9501 BD 7E 43 lda MoneyH,x - 835 9504 85 75 sta temp2+1 - 836 ;current monies in temp2 - 837 9506 A5 75 C5 73 D0 04 + cpw temp2 temp - 838 9510 90 27 bcc SorryNoPurchase - 839 ; deduct monies from the bank account - 840 9512 38 sec - 841 9513 A5 74 lda temp2 - 842 9515 E5 72 sbc temp - 843 9517 9D 84 43 sta MoneyL,x - 844 951A A5 75 lda temp2+1 - 845 951C E5 73 sbc temp+1 - 846 951E 9D 7E 43 sta MoneyH,x - 847 - 848 9521 BD F1 5A lda TanksWeaponsTableL,x - 849 9524 85 72 sta temp - 850 9526 BD F7 5A lda TanksWeaponsTableH,x - 851 9529 85 73 sta temp+1 - 852 - 853 952B B9 CE 5C lda WeaponUnits,y - 854 952E 18 clc - 855 952F 71 72 adc (temp),y - 856 9531 C9 63 cmp #99 ;max number of weapon units - 857 9533 90 02 bcc NotExceeded - 858 9535 A9 63 lda #99 - 859 9537 NotExceeded - 860 9537 91 72 sta (temp),y - 861 - 862 - 863 9539 SorryNoPurchase - 864 9539 60 rts - 865 .endp - 866 - 867 - 868 ;---------------------------------------------- - 869 953A .proc ShooterPurchase - 870 ; first try to buy defensives - 871 ; mva #2 tempXroller; number of offensive purchases to perform - 872 953A A6 6C ldx TankNr - 873 @ - 874 953C randomize ind_Battery________ ind_StrongParachute -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 953C ?rand - 7 953C AD 1B D4 lda random - 8 953F C9 21 cmp #IND_BATTERY________ ;floor - 9 9541 90 F9 bcc ?rand - 10 9543 C9 25 cmp #IND_STRONGPARACHUTE+1 ;ceiling - 11 9545 B0 F5 bcs ?rand -Source: ai.asm - 875 9547 20 DA 94 jsr TryToPurchaseOnePiece - 876 ; dec tempXroller - 877 ; bne @- - 878 - 879 ; and now offensives - 880 954A A9 04 85 78 mva #4 tempXroller; number of offensive purchases to perform - 881 ;ldx TankNr - 882 @ - 883 954E randomize ind_Missile________ ind_Heavy_Roller___ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 954E ?rand - 7 954E AD 1B D4 lda random - 8 9551 C9 01 cmp #IND_MISSILE________ ;floor - 9 9553 90 F9 bcc ?rand - 10 9555 C9 0F cmp #IND_HEAVY_ROLLER___+1 ;ceiling - 11 9557 B0 F5 bcs ?rand -Source: ai.asm - 884 9559 20 DA 94 jsr TryToPurchaseOnePiece - 885 955C C6 78 dec tempXroller - 886 955E D0 EE bne @- - 887 - 888 9560 60 rts - 889 .endp - 890 ;---------------------------------------------- - 891 9561 .proc PoolsharkPurchase - 892 ; first try to buy defensives - 893 ; mva #2 tempXroller; number of offensive purchases to perform - 894 9561 A6 6C ldx TankNr - 895 @ - 896 9563 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9563 ?rand - 7 9563 AD 1B D4 lda random - 8 9566 C9 21 cmp #IND_BATTERY________ ;floor - 9 9568 90 F9 bcc ?rand - 10 956A C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 956C B0 F5 bcs ?rand -Source: ai.asm - 897 956E 20 DA 94 jsr TryToPurchaseOnePiece - 898 9571 C6 78 dec tempXroller - 899 ; bpl @- - 900 - 901 ; and now offensives - 902 9573 A9 06 85 78 mva #6 tempXroller; number of purchases to perform - 903 ;ldx TankNr - 904 @ - 905 9577 randomize ind_Missile________ ind_Dirt_Charge____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9577 ?rand - 7 9577 AD 1B D4 lda random - 8 957A C9 01 cmp #IND_MISSILE________ ;floor - 9 957C 90 F9 bcc ?rand - 10 957E C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling - 11 9580 B0 F5 bcs ?rand -Source: ai.asm - 906 9582 20 DA 94 jsr TryToPurchaseOnePiece - 907 9585 C6 78 dec tempXroller - 908 9587 D0 EE bne @- - 909 - 910 9589 60 rts - 911 .endp - 912 ;---------------------------------------------- - 913 958A .proc TosserPurchase - 914 - 915 ; what is my money level - 916 958A A6 6C ldx TankNr - 917 958C BD 7E 43 lda MoneyH,x ; money / 256 - 918 958F 4A lsr ; /2 - 919 9590 85 78 sta tempXroller ; perform this many purchase attempts - 920 ; first try to buy defensives - 921 ; mva #1 tempXroller; number of defensive purchases to perform - 922 @ - 923 9592 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9592 ?rand - 7 9592 AD 1B D4 lda random - 8 9595 C9 21 cmp #IND_BATTERY________ ;floor - 9 9597 90 F9 bcc ?rand - 10 9599 C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 959B B0 F5 bcs ?rand -Source: ai.asm - 924 959D 20 DA 94 jsr TryToPurchaseOnePiece - 925 95A0 C6 78 dec tempXroller - 926 95A2 10 EE bpl @- - 927 - 928 ; and now offensives - 929 95A4 BD 7E 43 lda MoneyH,x ; money / 256 - 930 95A7 0A asl ;*2 - 931 95A8 85 78 sta tempXroller ; perform this many purchase attempts - 932 @ - 933 95AA randomize ind_Missile________ ind_Dirt_Charge____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95AA ?rand - 7 95AA AD 1B D4 lda random - 8 95AD C9 01 cmp #IND_MISSILE________ ;floor - 9 95AF 90 F9 bcc ?rand - 10 95B1 C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling - 11 95B3 B0 F5 bcs ?rand -Source: ai.asm - 934 95B5 20 DA 94 jsr TryToPurchaseOnePiece - 935 95B8 C6 78 dec tempXroller - 936 95BA 10 EE bpl @- - 937 - 938 95BC 60 rts - 939 .endp - 940 ;---------------------------------------------- - 941 95BD .proc CyborgPurchase - 942 - 943 ; what is my money level - 944 95BD A6 6C ldx TankNr - 945 95BF BD 7E 43 lda MoneyH,x ; money / 256 - 946 95C2 4A lsr ; /2 - 947 95C3 85 78 sta tempXroller ; perform this many purchase attempts - 948 ; first try to buy defensives - 949 ; mva #1 tempXroller; number of defensive purchases to perform - 950 @ - 951 95C5 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95C5 ?rand - 7 95C5 AD 1B D4 lda random - 8 95C8 C9 21 cmp #IND_BATTERY________ ;floor - 9 95CA 90 F9 bcc ?rand - 10 95CC C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 95CE B0 F5 bcs ?rand -Source: ai.asm - 952 95D0 20 C1 94 jsr TryToPurchaseOnePiece2 - 953 95D3 C6 78 dec tempXroller - 954 95D5 10 EE bpl @- - 955 - 956 ; and now offensives - 957 95D7 BD 7E 43 lda MoneyH,x ; money / 256 - 958 95DA 0A 0A 0A :3 asl ;*8 - 959 95DD 85 78 sta tempXroller ; perform this many purchase attempts - 960 @ - 961 95DF randomize first_offensive____ last_offensive_____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95DF ?rand - 7 95DF AD 1B D4 lda random - 8 95E2 C9 00 cmp #FIRST_OFFENSIVE____ ;floor - 9 95E4 90 F9 bcc ?rand - 10 95E6 C9 20 cmp #LAST_OFFENSIVE_____+1 ;ceiling - 11 95E8 B0 F5 bcs ?rand -Source: ai.asm - 962 95EA 20 C1 94 jsr TryToPurchaseOnePiece2 - 963 95ED C6 78 dec tempXroller - 964 95EF 10 EE bpl @- - 965 - 966 95F1 60 rts - 967 .endp - 968 ;---------------------------------------------- - 969 95F2 .proc ChooseBestOffensive - 970 ; choose the best weapon - 971 ; X - TankNr - 972 ;---------------------------------------------- - 973 95F2 A0 1E ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) - 974 95F4 NotFromAll - 975 ; Y - the last offensive weapon to use + 1 - 976 95F4 BD F1 5A lda TanksWeaponsTableL,x - 977 95F7 85 72 sta temp - 978 95F9 BD F7 5A lda TanksWeaponsTableH,x - 979 95FC 85 73 sta temp+1 - 980 95FE loop - 981 95FE 88 dey - 982 95FF B1 72 lda (temp),y - 983 9601 F0 FB beq loop - 984 9603 98 tya - 985 9604 9D F7 43 sta ActiveWeapon,x - 986 9607 60 rts - 987 .endp - 988 ;---------------------------------------------- - 989 9608 .proc GetDistance - 990 ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) - 991 ; result in A - 992 ;---------------------------------------------- - 993 9608 AC 31 44 ldy TargetTankNr - 994 960B BD 1F 44 lda LowResDistances,x - 995 960E D9 1F 44 cmp LowResDistances,y - 996 9611 B0 08 @ bcs YisLower - 997 9613 38 sec - 998 9614 B9 1F 44 lda LowResDistances,y - 999 9617 FD 1F 44 sbc LowResDistances,x - 1000 961A 60 rts - 1001 961B YisLower - 1002 961B BD 1F 44 lda LowResDistances,x - 1003 961E F9 1F 44 sbc LowResDistances,y - 1004 9621 60 rts - 1005 .endp - 354 ;---------------------------------------------- - 355 9622 icl 'artwork/talk.asm' -Source: talk.asm - 1 9622 .proc talk - 2 ; Maximum text length is 63 characters!!! - 3 9622 23 39 2B 21 00 22 + L0 dta d"CYKA BLAT" - 4 962B 24 29 25 01 L1 dta d"DIE!" - 5 962F 25 21 34 00 2D 39 + L2 dta d"EAT MY SHORTS!" - 6 963D 39 2F 35 07 32 25 + L3 dta d"YOU'RE TOAST!" - 7 964A 22 21 2E 3A 21 29 + L4 dta d"BANZAI!" - 8 9651 26 32 2F 2D 00 28 + L5 dta d"FROM HELL'S HEART I STAB AT THEE..." - 9 9674 29 00 24 29 24 2E + L6 dta d"I DIDN'T DO IT. NOBODY SAW ME DO IT." - 10 9698 34 21 2B 25 00 21 + L7 dta d"TAKE A HIKE!" - 11 96A4 39 2F 35 07 32 25 + L8 dta d"YOU'RE DEAD MEAT." - 12 96B5 2D 21 2B 25 00 2D + L9 dta d"MAKE MY DAY." - 13 96C1 23 28 21 32 27 25 + L10 dta d"CHARGE!" - 14 96C8 21 34 34 21 23 2B + L11 dta d"ATTACK!" - 15 96CF 39 2F 35 07 32 25 + L12 dta d"YOU'RE OUTTA HERE." - 16 96E1 37 21 34 34 33 21 + L13 dta d"WATTSA MATTA YOU?" - 17 96F2 26 32 25 25 3A 25 + L14 dta d"FREEZE, OR I'LL SHOOT!" - 18 9708 28 21 00 28 21 00 + L15 dta d"HA HA HA." - 19 9711 37 25 00 23 2F 2D + L16 dta d"WE COME IN PEACE - SHOOT TO KILL!" - 20 9732 29 2E 00 39 2F 35 + L17 dta d"IN YOUR FACE!" - 21 973F 24 29 25 00 23 2F + L18 dta d"DIE COMMIE PIG!" - 22 974E 29 00 2C 2F 36 25 + L19 dta d"I LOVE THE SMELL OF NAPALM IN THE MORNING." - 23 9778 36 29 23 34 2F 32 + L20 dta d"VICTORY!" - 24 9780 33 28 2F 37 00 33 + L21 dta d"SHOW SOME RESPECT." - 25 9792 2A 35 33 34 00 37 + L22 dta d"JUST WHO DO YOU THINK YOU ARE?" - 26 97B0 2C 2F 2F 2B 00 2F + L23 dta d"LOOK OUT BELOW!" - 27 97BF 2B 2E 2F 23 2B 0C + L24 dta d"KNOCK, KNOCK." - 28 97CC 2C 2F 2F 2B 00 2F + L25 dta d"LOOK OVER THERE." - 29 97DC 27 35 25 33 33 00 + L26 dta d"GUESS WHAT'S COMING FOR DINNER?" - 30 97FB 2D 25 32 32 39 00 + L27 dta d"MERRY CHRISTMAS." - 31 980B 2F 30 25 2E 00 37 + L28 dta d"OPEN WIDE!" - 32 9815 28 25 32 25 00 27 + L29 dta d"HERE GOES NOTHING..." - 33 9829 24 2F 2E 07 34 00 + L30 dta d"DON'T WORRY, IT ISN'T A LIVE ROUND." - 34 984C 22 2C 2F 2F 24 0C + L31 dta d"BLOOD, PAIN, VIOLENCE!" - 35 9862 34 21 2B 25 00 34 + L32 dta d"TAKE THIS, SISSY!" - 36 9873 29 00 33 28 21 2C + L33 dta d"I SHALL FLATTEN YOU!" - 37 9887 29 00 33 28 21 2C + L34 dta d"I SHALL SMASH YOUR UGLY TANK!" - 38 98A4 29 00 37 2F 2E 24 + L35 dta d"I WONDER WHAT THIS BUTTON DOES?" - 39 98C3 24 2F 2E 07 34 00 + L36 dta d"DON'T TAKE THIS PERSONALLY." - 40 98DE 37 2F 35 2C 24 00 + L37 dta d"WOULD THIS MAKE YOU MAD?" - 41 98F6 29 00 34 2F 2C 24 + L38 dta d"I TOLD YOU TO LEAVE MY SISTER ALONE!" - 42 991A 29 00 23 2F 35 2C + L39 dta d"I COULD SPARE YOU, BUT WHY?" - 43 9935 2D 39 00 22 2F 2D + L40 dta d"MY BOMB IS BIGGER THAN YOURS." - 44 9952 24 2F 2E 07 34 00 + L41 dta d"DON'T FORGET ABOUT ME!" - 45 9968 28 21 33 34 21 00 + L42 dta d"HASTA LA VISTA, BABY!" - 46 997D 34 28 29 33 00 29 + L43 dta d"THIS IS YOUR BRAIN ON SCORCH." - 47 999A 34 21 2B 25 00 34 + L44 dta d"TAKE THIS!" - 48 99A4 34 28 29 33 00 33 + L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." - 49 99D4 24 29 25 0C 00 21 + L46 dta d"DIE, ALIEN SWINE!" - 50 99E5 21 37 32 35 2B 01 + L47 dta d"AWRUK!!!" - 51 99ED 29 00 33 28 21 2C + L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD." - 52 9A13 24 29 25 0C 00 34 + L49 dta d"DIE, TANK-SCUM!" - 53 9A22 29 07 2D 00 27 2F + L50 dta d"I'M GONNA BREAK YOUR FACE!" - 54 9A3C 2D 21 2D 21 00 33 + L51 dta d"MAMA SAID KNOCK YOU OUT!" - 55 9A54 29 00 28 2F 30 25 + L52 dta d"I HOPE YOU ENJOY PAIN!" - 56 9A6A 28 2F 37 07 24 00 + L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son) - 57 ;-------------------------------- - 58 9A8E 30 21 32 34 29 2E + L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!" - 59 9AB2 35 27 28 01 L55 dta d"UGH!" - 60 9AB6 21 21 32 27 28 01 L56 dta d"AARGH!" - 61 9ABC 21 21 21 27 27 28 + L57 dta d"AAAGGHHH!" - 62 9AC5 29 07 2D 00 2D 25 + L58 dta d"I'M MELTING!" - 63 9AD1 2F 2F 26 0E 0E L59 dta d"OOF.." - 64 9AD6 2F 28 01 L60 dta d"OH!" - 65 9AD9 25 25 25 2B 01 L61 dta d"EEEK!" - 66 9ADE 21 21 23 23 28 01 L62 dta d"AACCH!" - 67 9AE4 29 00 28 21 34 25 + L63 dta d"I HATE IT WHEN THAT HAPPENS." - 68 9B00 2F 2E 25 00 24 29 + L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." - 69 9B27 2F 28 00 2E 2F 01 L65 dta d"OH NO!" - 70 9B2D 2E 2F 34 00 2D 25 + L66 dta d"NOT ME!" - 71 9B34 2F 35 23 28 0E L67 dta d"OUCH." - 72 9B39 2F 28 00 2E 2F 0C + L68 dta d"OH NO, NOT AGAIN." - 73 9B4A 21 2E 2F 34 28 25 + L69 dta d"ANOTHER ONE BITES THE DUST." - 74 9B65 27 2F 2F 24 22 39 + L70 dta d"GOODBYE." - 75 9B6D 28 25 2C 30 00 2D + L71 dta d"HELP ME!" - 76 9B75 26 21 32 25 37 25 + L72 dta d"FAREWELL, CRUEL WORLD." - 77 9B8B 32 25 2D 25 2D 22 + L73 dta d"REMEMBER THE ALAMO!" - 78 9B9E 2F 28 00 2D 21 2E + L74 dta d"OH MAN!" - 79 9BA5 24 2F 2F 35 27 28 + L75 dta d"DOOUGH!" - 80 9BAC 21 2E 2F 34 28 25 + L76 dta d"ANOTHER DAY, ANOTHER BOMB." - 81 9BC6 34 28 29 33 00 29 + L77 dta d"THIS IS THE END, MY ONLY FRIEND." - 82 9BE6 36 25 32 39 00 26 + L78 dta d"VERY FUNNY." - 83 9BF1 34 28 25 00 26 21 + L79 dta d"THE FAT LADY SANG." - 84 9C03 37 28 39 00 24 2F + L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?" - 85 9C24 29 07 2D 00 27 2F + L81 dta d"I'M GOING DOWN." - 86 9C33 29 07 36 25 00 27 + L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS." - 87 9C55 23 32 21 30 2F 2C + L83 dta d"CRAPOLA." - 88 9C5D 30 2F 37 01 L84 dta d"POW!" - 89 9C61 22 29 26 01 L85 dta d"BIF!" - 90 9C65 22 21 2D 01 L86 dta d"BAM!" - 91 9C69 3A 2F 2E 2B 01 L87 dta d"ZONK!" - 92 9C6E 29 00 33 28 2F 35 + L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." - 93 9C92 29 00 37 21 2C 2B + L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." - 94 9CBC 37 28 21 34 00 37 + L90 dta d"WHAT WAS THAT NOISE?" - 95 9CD0 2D 21 2D 21 00 33 + L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." - 96 9CF4 29 34 33 00 2A 35 + L92 dta d"ITS JUST ONE OF THOSE DAYS..." - 97 9D11 29 00 33 25 25 00 + L93 dta d"I SEE A BRIGHT LIGHT..." - 98 9D28 2D 2F 2D 2D 39 1F + L94 dta d"MOMMY? IS THAT YOU?" - 99 9D3B 29 00 2C 25 34 00 + L95 dta d"I LET YOU HIT ME!" - 100 9D4C 33 35 23 2B 25 32 + L96 dta d"SUCKER SHOT!" - 101 9D58 29 00 24 29 24 2E + L97 dta d"I DIDN'T WANT TO LIVE ANYWAY." - 102 9D75 0D 1C 33 2F 22 1E + L98 dta d"--" - 103 9D7C 37 21 33 00 34 28 + L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?" - 104 9DA0 2A 2F 29 2E 00 34 + L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." - 105 9DC7 29 34 00 37 21 33 + L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" - 106 9DF0 29 00 24 29 24 2E + L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" - 107 9E0E 29 00 34 28 2F 35 + L103 dta d"I THOUGHT YOU LIKED ME?" - 108 9E25 23 34 2F 00 38 39 + L104 dta d"CTO XYEB" - 109 9E2D 29 00 34 28 29 2E + L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY." - 110 9E4F 33 2F 2D 25 28 2F + L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." - 111 9E79 28 25 39 01 00 2B + L107 dta d"HEY! KILLIN' AIN'T COOL." - 112 9E91 27 25 25 0E 0E 0E + L108 dta d"GEE... THANKS." - 113 9E9F 29 07 36 25 00 26 + L109 dta d"I'VE FALLEN AND I CAN'T GET UP!" - 114 9EBE 19 11 11 1F L110 dta d"911?" - 115 9EC2 2F 28 00 2E 2F 01 + L111 dta d"OH NO! HERE I BLOW AGAIN!" - 116 9EDB 29 07 2C 2C 00 22 + L112 dta d"I'LL BE BACK..." - 117 9EEA 28 25 39 00 0D 00 + L113 dta d"HEY - I'VE GOT LAWYERS." - 118 9F01 34 29 2D 25 00 34 + L114 dta d"TIME TO CALL 1-900-SUE-TANK." - 119 9F1D 39 2F 35 00 22 29 + L115 dta d"YOU BIG DUMMY!" ;(sanford and son) - 120 9F2B LEND - 121 9F2B OffensiveTextTableL - 122 9F2B 22 2B 2F 3D 4A 51 + dta L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53 - 127 9FD6 9A 9A 9A 9A 9A 9A + dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115 - 128 A014 9F dta >LEND - 129 = 0036 NumberOfOffensiveTexts=54 - 130 = 003E NumberOfDeffensiveTexts=62 - 131 .endp - 132 A015 2D 39 00 28 2F 36 + hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!" - 133 A033 hoverFullEnd - 134 A033 32 35 2E 2E 29 2E + hoverEmpty dta d"RUNNING OUT OF EELS" - 135 A046 hoverEmptyEnd - 356 ;---------------------------------------------- - 357 A046 TankFont - 358 A046 00 00 00 00 00 00 + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only - 359 ;---------------------------------------------- - 360 A1C6 font4x4 - 361 A1C6 FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62 - 362 ;------------------------------------------------- - 363 A246 .proc CheckTankCheat - 364 A246 A0 07 ldy #$07 - 365 A248 A5 6C lda TankNr - 366 A24A 0A asl - 367 A24B 0A asl - 368 A24C 0A asl ; 8 chars per name - 369 A24D AA tax - 370 @ - 371 A24E B9 73 A2 lda CheatName,y - 372 A251 38 sec - 373 A252 FD 09 41 sbc tanksnames,x - 374 A255 C9 27 cmp #$27 - 375 A257 D0 19 bne NoCheat - 376 A259 E8 inx - 377 A25A 88 dey - 378 A25B 10 F1 bpl @- - 379 A25D YesCheat - 380 A25D A6 6C ldx TankNr - 381 A25F BD F1 5A lda TanksWeaponsTableL,x - 382 A262 85 72 sta temp - 383 A264 BD F7 5A lda TanksWeaponsTableH,x - 384 A267 85 73 sta temp+1 - 385 A269 A9 63 lda #99 - 386 A26B C8 @ iny - 387 A26C 91 72 sta (temp),y - 388 A26E C0 2F cpy #(number_of_weapons - 1) - 389 A270 D0 F9 bne @- - 390 A272 NoCheat - 391 A272 60 rts - 392 .endp - 393 A273 CheatName - 394 A273 27 27 27 37 37 3F + dta d" 008.T"+$27 - 395 ;---------------------------------------------- - 396 A27B .proc DLIinterruptBFG - 397 A27B 48 pha - 398 A27C A5 9A lda dliCounter - 399 A27E D0 18 bne EndofBFGDLI - 400 A280 AD BC A2 lda dliColorsFore - 401 A283 2C 1B D4 bit random - 402 A286 30 02 bmi @+ - 403 A288 A5 58 lda DliColorBack - 404 A28A 85 02 @ sta COLPF2 - 405 A28C AD BC A2 lda dliColorsFore - 406 A28F 2C 1B D4 bit random - 407 A292 30 02 bmi @+ - 408 A294 A5 58 lda DliColorBack - 409 A296 85 02 @ sta COLPF1 - 410 A298 EndofBFGDLI - 411 A298 E6 9A inc dliCounter - 412 A29A 68 pla - 413 A29B 40 rti - 414 .endp - 415 ; ------------------------ - 416 A29C .proc BFGblink - 417 ; SetDLI DLIinterruptBFG ; blinking on - 418 A29C A0 32 ldy #50 - 419 A29E 20 9D 5A jsr PauseYFrames - 420 ; SetDLI DLIinterruptGraph ; blinking off - 421 A2A1 60 rts - 422 .endp - 423 ;---------------------------------------------- - 424 A2A2 icl 'constants_top.asm' -Source: constants_top.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 ;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 - 6 A2A2 04 03 01 05 00 02 TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 - 7 A2A8 dliColorsBack - 8 A2A8 02 00 02 00 02 00 + :10 .by $02,$00 - 9 A2BC dliColorsFore - 10 A2BC 0A .by $0a ; one mountains color - 11 ; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array - 12 ; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05 - 13 A2BD 0E 0C 0C 0C 0C 0A + .by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new - 14 A2C7 08 08 08 06 06 06 + .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 - 15 A2D1 CashOptionL ;(one zero less than on the screen) - 16 A2D1 00 C8 20 B0 D0 .by 0,<200,<800,<1200,<2000 - 17 A2D6 CashOptionH - 18 A2D6 00 00 03 04 07 .by 0,>200,>800,>1200,>2000 - 19 A2DB 0A 14 19 1E 28 GravityTable .by 10,20,25,30,40 - 20 A2E0 05 14 28 46 63 MaxWindTable .by 5,20,40,70,99 - 21 A2E5 0A 14 1E 28 32 RoundsTable .by 10,20,30,40,50 - 22 A2EA 77 01 D6 01 76 02 + AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity - 23 A2F4 FF 96 4B 23 01 flyDelayTable .by 255,150,75,35,1 - 24 A2F9 FF 2D 19 0F 09 seppukuTable .by 255, 45,25,15,9 - 25 .endif - 425 ;---------------------------------------------- - 426 A2FE NMI - 427 A2FE EE 20 D0 INC $D020 ; change border colour, indication for a NMI - 428 A301 40 RTI ; exit interrupt - 429 ; (not acknowledged!) - 430 diff --git a/variables.asm b/variables.asm index 38f4b83..9038e5d 100644 --- a/variables.asm +++ b/variables.asm @@ -55,9 +55,9 @@ StatusBufferCopy variablesStart ; zeroing starts here ;===================================================== ;isInventory .ds 1 ; 0 - purchase, $ff - inventory -;-------------- +;-------------- drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) -;-------------- +;-------------- noDeathCounter .ds 1 ;-------------- OptionsY .ds 1 ;vertical position of cursor on Options screen @@ -125,9 +125,9 @@ BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round st .DS MaxPlayers ActiveWeapon ;number of the selected weapon .DS MaxPlayers -ActiveDefenceWeapon ;number of the activated defence weapon - 0 +ActiveDefenceWeapon ;number of the activated defence weapon - 0 .DS MaxPlayers -AutoDefenseFlag ; 0 - not activated, >$7f - activated +AutoDefenseFlag ; 0 - not activated, >$7f - activated .DS MaxPlayers WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile ;---------------------------------------------------- @@ -301,7 +301,7 @@ HowManyOnTheListDef .DS 1 ;PositionOnTheList ; pointer position on the list being displayed ; .DS 1 -LastWeapon +LastWeapon ; number of the last previously purchased weapon ; it is necessary when after purchase some weapon ; is removed from the list (because too expensive) @@ -361,9 +361,9 @@ TankTempY ;-------------- single round variables -------------- ;---------------------------------------------------- singleRoundVars -;-------------- +;-------------- ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed -;-------------- +;-------------- CurrentResult .DS 1 ;-------------- diff --git a/weapons.asm b/weapons.asm index f4a3984..d1cfcfe 100644 --- a/weapons.asm +++ b/weapons.asm @@ -22,7 +22,7 @@ pha rts ExplosionRoutines - .word babymissile-1 ;Baby_Missile ;_00 + .word babymissile-1 ;Baby_Missile ;_00 .word missile-1 ;Missile ;_01 .word babynuke-1 ;Baby_Nuke ;_02 .word nuke-1 ;Nuke ;_03 @@ -60,7 +60,7 @@ tracer rts .endp .proc BFG - mva #sfx_plasma_2_2 sfx_effect + mva #sfx_plasma_2_2 sfx_effect jsr BFGblink ; Kill all :) ldx NumberOfPlayers @@ -79,7 +79,7 @@ CheckNextTankBFG .proc babymissile mva #11 ExplosionRadius GoBabyMissileSFX - mva #sfx_baby_missile sfx_effect + mva #sfx_baby_missile sfx_effect GoXmissile jmp xmissile .endp @@ -106,12 +106,12 @@ GoBabyNukeSFX ; ------------------------ .proc leapfrog mva #17 ExplosionRadius -; mva #sfx_baby_missile sfx_effect +; mva #sfx_baby_missile sfx_effect ; jsr xmissile jsr babymissile.GoBabyMissileSFX jsr SecondRepeat - + SecondRepeat ; soil must fall down now! there is no other way... ; hide tanks or they fall down with soil @@ -150,7 +150,7 @@ EndOfLeapping mva #21 ExplosionRadius jsr CalculateExplosionRange0 jsr xmissile.NoRangeCalc - + jsr SoilDown2 ; jsr cleartanks ; maybe not? @@ -208,10 +208,10 @@ NoWallsInFunky mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw sbw xdraw #34 - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw adw xdraw #68 - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw sbw xdraw #34 ; @@ -219,14 +219,14 @@ NoWallsInFunky ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoUpperCircle - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw NoUpperCircle adw ydraw #68 ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoLowerCircle - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw NoLowerCircle mva #sfx_silencer sfx_effect @@ -258,7 +258,7 @@ GoXmissileWithSaveXYdraw ; mwa xdraw xcircle ; store hitpoint for future repeats ldy #30 ; repeat 30 times - sty magic + sty magic RepeatNapalm ; external loop (for fire animation) mwa xcircle xdraw sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point @@ -280,7 +280,7 @@ RepeatFlame ; internal loop (draw flames) tya sec sbc ydraw - sta ydraw + sta ydraw sbw xdraw #4 ; half character correction ; draw flame symbol lda magic ; if last repeat - clear flames @@ -288,7 +288,7 @@ RepeatFlame ; internal loop (draw flames) lda random and #%00000110 clc - adc #char_flame + adc #char_flame bne PutFlameChar LastNapalmRepeat lda #char_clear_flame ; clear flame symbol @@ -312,7 +312,7 @@ CharOffTheScreen jne RepeatFlame dec magic jpl RepeatNapalm - ; after napalm + ; after napalm ;now we must check tanks in range ldx NumberOfPlayers dex @@ -536,7 +536,7 @@ DiggerCharacter lda random and #$06 clc - adc #char_digger + adc #char_digger adc sandhogflag sta CharCode cpw xdraw #(screenwidth-6) @@ -619,7 +619,7 @@ RepeatFill ldy #0 lda (tempXROLLER),y sta HeightRol ; relative point - + RollinContinuesLiquid ; new point is set adw xdraw #mountaintable tempXROLLER @@ -684,19 +684,19 @@ ToHighFill ldx TankNr lda AngleTable,x tay - + mwa EndOfTheBarrelX xbyte mva EndOfTheBarrelY ybyte mva #0 ybyte+1 sta LaserFlag ; turn on gravity and wind after shot :) - + mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 mwa xbyte LaserCoordinate+4 mwa ybyte LaserCoordinate+6 mva #sfx_lightning sfx_effect - + mva #%10000000 drawFunction ;the above switches Draw to measuring length jsr draw @@ -723,7 +723,7 @@ ToHighFill dec yc bne @- - + mva #1 color mwa LaserCoordinate xdraw mwa LaserCoordinate+2 ydraw @@ -764,7 +764,7 @@ ExplosionLoop2 bcc ExplosionLoop2 mva #1 color - + ;check tanks' distance from the centre of the explosion mva #%10000000 drawFunction @@ -830,10 +830,10 @@ UseShieldWithEnergy cpy #0 ; is necessary to reduce tenk energy ? beq ShieldCoveredTank jsr DecreaseEnergyX -ShieldCoveredTank +ShieldCoveredTank lda ShieldEnergy,x jne EndOfDistanceCheckLoop -ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) +ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield lda TankNr pha ; store TankNr @@ -1007,7 +1007,7 @@ DirectionChecked ; -------------------------------------------------- ; makes dirt on xdraw,ydraw position and of ExplosionRadius height mva #sfx_dirt_chrg_s sfx_effect - + mva #1 color NoColor ; jump here with color=0 to clean dirt mwa xdraw xcircle @@ -1098,10 +1098,10 @@ ContinueToCheckMaxForce2 ; $f3 - shift+key notpressed - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' - ldx TankNr ; for optimize + ldx TankNr ; for optimize ; Select and Option lda CONSOL tay @@ -1127,7 +1127,7 @@ callActivation jsr DefensivesActivate jmp afterInventory -@ +@ cmp #@kbcode._I ; $0d ; I bne @+ callInventory @@ -1137,9 +1137,9 @@ callInventory mva #$ff isInventory jsr Purchase afterInventory - jsr MakeDarkScreen + jsr MakeDarkScreen jsr DisplayStatus - jsr SetMainScreen + jsr SetMainScreen jsr DrawTanks ;jsr WaitOneFrame ; not necessary bit LazyFlag @@ -1152,7 +1152,7 @@ NoLazy NoSpyHard RmtSong song_ingame mva #0 escFlag - jmp ReleaseAndLoop + jmp ReleaseAndLoop @ cmp #$80|@kbcode._up jeq CTRLPressedUp @@ -1163,13 +1163,13 @@ NoSpyHard jumpFromStick .IF TARGET = 800 - cmp #$80|17 ; Ctrl+Help - bne NoVdebugSwitch - lda Vdebug - eor #$ff - sta Vdebug - jmp ReleaseAndLoop -NoVdebugSwitch + cmp #$80|17 ; Ctrl+Help + bne NoVdebugSwitch + lda Vdebug + eor #$ff + sta Vdebug + jmp ReleaseAndLoop +NoVdebugSwitch .ENDIF and #$3f ;CTRL and SHIFT ellimination cmp #@kbcode._up ; $e @@ -1189,10 +1189,10 @@ NoVdebugSwitch cmp #@kbcode._S ; $3e ; S jeq pressedS .IF TARGET = 800 - cmp #61 ; G - bne EndKeys - jsr SelectNextGradient.NotWind - jmp ReleaseAndLoop + cmp #61 ; G + bne EndKeys + jsr SelectNextGradient.NotWind + jmp ReleaseAndLoop .ENDIF EndKeys jmp notpressed @@ -1205,7 +1205,7 @@ checkJoy cmp #$0f beq notpressedJoy tay - mva #0 ATRACT ; reset atract mode + mva #0 ATRACT ; reset atract mode lda joyToKeyTable,y jmp jumpFromStick notpressedJoy @@ -1221,14 +1221,14 @@ pressedUp spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedUp - - + + ;force increaseeee! ;ldx TankNr ; optimized inc ForceTableL,x bne CheckingMaxForce inc ForceTableH,x - + CheckingMaxForce mva #sfx_set_power_1 sfx_effect @@ -1305,7 +1305,7 @@ pressedRight mva #1 Erase jsr DrawTankNr.BarrelChange dec:lda AngleTable,x - cmp #255 ; -1 + cmp #255 ; -1 jne BeforeFire lda #180 sta AngleTable,x @@ -1325,7 +1325,7 @@ CTRLPressedRight lda #180 sta AngleTable,x jmp BeforeFire - + pressedLeft ;ldx TankNr ; optimized @@ -1369,7 +1369,7 @@ pressedTAB lda #first_offensive ; #0 sta ActiveWeapon,x beq @+ ; allways = 0 -?notlasttofirst +?notlasttofirst inc ActiveWeapon,x @ lda ActiveWeapon,x @@ -1413,7 +1413,7 @@ pressedSpace ;================================= ;we shoot here!!! lda #0 - sta ATRACT ; reset atract mode + sta ATRACT ; reset atract mode sta pressTimer ; reset jsr WaitForKeyRelease.StillWait lda pressTimer @@ -1447,7 +1447,7 @@ RandomizeOffensiveText ldy TankNr mva #$ff plot4x4color jsr DisplayOffensiveTextNr - + AfterOffensiveText mva #0 LaserFlag ; $ff - Laser ldx TankNr @@ -1477,7 +1477,7 @@ AfterStrongShoot ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - + mwa EndOfTheBarrelX xtraj+1 mva EndOfTheBarrely ytraj+1 lda #0 @@ -1535,12 +1535,12 @@ noSmokeTracer sty SmokeTracerFlag RepeatIfSmokeTracer -RepeatFlight +RepeatFlight mwa ytraj+1 Ytrajold+1 mwa xtraj+1 Xtrajold+1 mva #%01000000 drawFunction - lda #0 + lda #0 sta vx sta vx+1 sta vx+2 @@ -1552,7 +1552,7 @@ RepeatFlight ;vx calculation ;vx = sin(90-Angle) for Angle <=90 - ;vx = -sin(Angle-90) for 90 < Angle <= 180 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 aslw Force ;Force = Force * 2 ;cos(Angle) (but we use sin table only so some shenanigans happen) @@ -1565,10 +1565,10 @@ RepeatFlight ;180 horizontally left ; (we have to set goleft used in rolling weapons) - + cpx #91 bcc angleUnder90 - + ;over 90 mva #1 goleft sec @@ -1583,7 +1583,7 @@ angleUnder90 lda #90 sbc Angle tax -@ +@ lda sintable,x ; cos(X) sta Multiplee ; *Force mwa Force Multiplier @@ -1610,9 +1610,9 @@ DoNotAdd rol Multiplier+2 dex bne MultiplyLoop - + mva #0 vx+3 - ; here in vx there is a number + ; here in vx there is a number ; xxxx.xx00 = sin(Angle)*Force ; negate it if going left lda goleft @@ -1627,7 +1627,7 @@ DoNotAdd ;vy = sin(Angle) for Angle <=90 ;vy = sin(180-Angle) for 90 < Angle <= 180 - lda #0 + lda #0 sta vy sta vy+1 sta vy+2 @@ -1635,7 +1635,7 @@ DoNotAdd ldx Angle cpx #91 bcc YangleUnder90 - + lda #180 sec sbc Angle @@ -1669,7 +1669,7 @@ DoNotAddY rol Multiplier+2 dex bne MultiplyLoopY - ; here in vy there is a number + ; here in vy there is a number ; yyyy.yy=cos(Angle)*Force mva #0 vy+3 ;vy=cos(Angle)*Force @@ -1757,12 +1757,12 @@ LaserNoWalls nolaserwait lda color beq nonowait ; smoke tracer erases slowly - lda tracerflag + lda tracerflag bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) -nonowait +nonowait jsr shellDelay ; - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' ldx TankNr ; @@ -1797,7 +1797,7 @@ SkipCollisionCheck mwa xtraj+1 xdraw mwa ytraj+1 ydraw - + bit TestFlightFlag bvc NoTestFlight bit Vdebug @@ -1807,7 +1807,7 @@ SkipCollisionCheck NoTestFlight lda tracerflag bne NoUnPlot - + YesUnPlot jsr UnPlot @@ -1837,7 +1837,7 @@ EndOfFlight jmp SecondFlight EndOfFlight2 mva #0 tracerflag ; don't know why - + bit TestFlightFlag jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check ; and now check for defensive-aggressive weapon @@ -1861,7 +1861,7 @@ EndOfFlight2 lda ActiveWeapon,y cmp #ind_Tracer ; defence not fire by tracers beq JNoDefence - cmp #ind_Smoke_Tracer + cmp #ind_Smoke_Tracer beq JNoDefence cmp #ind_Laser ; Bouncy and Mag not fire by Laser beq JNoDefence @@ -1914,12 +1914,12 @@ NoTankHitAtEndOfFight NoHitAtEndOfFight NoDefence lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 - rts ; END !!! + rts ; END !!! BouncyCastle ; now in Y we have number of of the attacking player (TankNr) ! lda ActiveWeapon,y ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down - cmp #ind_Funky_Bomb + cmp #ind_Funky_Bomb bne @+ jsr SetFullScreenSoilRange @ @@ -1965,7 +1965,7 @@ BouncyCastle ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - + mwa EndOfTheBarrelX xtraj+1 mva EndOfTheBarrely ytraj+1 lda #0 @@ -1975,7 +1975,7 @@ BouncyCastle sta ytraj sta color - + ldy #100 ; ??? mva #1 tracerflag ; I do not know (I mean I think I know ;) ) ; 10 years later - I do not know!!! @@ -2068,7 +2068,7 @@ mrLoopi bne @+ ldx #0 @ stx MirvMissileCounter - + ; Y changes only for bullet number 0 ; because rest of the bullets have the same Y (height) @@ -2101,14 +2101,14 @@ mrLoopi jsr ShellDelay ; phx - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys bpl ExitnotPressed plx rts ; exit if pressed 'Exit keys' ExitnotPressed plx ; - + MIRVdoNotChangeY lda MirvDown,x ; if bullet is already down we go with the next one @@ -2140,14 +2140,14 @@ MIRVdoNotChangeY ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) - - ; check bullet position and set flags: + + ; check bullet position and set flags: ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) lda #$00 sta XposFlag sta YposFlag - lda ytraj+2 ; Y high byte + lda ytraj+2 ; Y high byte bpl @+ mva #%10000000 YposFlag ; bullet over the screen (Y) bmi MIRVsetXflag @@ -2341,13 +2341,13 @@ MakeBump sec lda #180 sbc LeapFrogAngle - sta LeapFrogAngle ; swap angle (LeapFrogAngle) + sta LeapFrogAngle ; swap angle (LeapFrogAngle) inc FunkyWallFlag rts WrapAndNone bvc NoWall cpw xtraj+1 #screenwidth - bcc OnScreen + bcc OnScreen ; (wrapping wall) inc FunkyWallFlag bit xtraj+2 @@ -2431,7 +2431,7 @@ SelectNextTank beq RepeatSpy SpyHardEnd mvx TargetTankNr TankNr ; restore - jsr DisplaySpyInfo + jsr DisplaySpyInfo rts .endp .proc DisplaySpyInfo @@ -2490,7 +2490,7 @@ EndLazy bcc IsToHigh sbc #12 ; tank with shield high correction bne StoreMaxAlt -IsToHigh +IsToHigh lda #18 StoreMaxAlt sta FloatingAlt @@ -2502,10 +2502,10 @@ StoreMaxAlt jsr TypeLine4x4.variableLength ldx TankNr - + ; TankNr in X reg. ; now animate Up - mva #0 modify ; it's a counter + mva #0 modify ; it's a counter TankGoUp lda ytankstable,x cmp FloatingAlt ; Floating altitude @@ -2576,7 +2576,7 @@ KeyboardAndJoyCheck lda ShieldEnergy,x cmp #20 bne LotOfFuel - + ; display text 4x4 - low fuel jsr SetLowFuelText jsr TypeLine4x4.variableLength @@ -2590,7 +2590,7 @@ notpressed ; let's animate "engine" jsr DrawTankEngine ; enimation ends - + lda SKSTAT cmp #$ff jeq checkJoy @@ -2616,7 +2616,7 @@ checkJoy and #$0f cmp #$0f beq notpressedJoy - tay + tay lda joyToKeyTable,y jmp jumpFromStick notpressedJoy @@ -2635,11 +2635,11 @@ pressedRight jsr ClearTankNr mva #0 Erase lda XtankstableH,x - cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 + cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 bne @+ lda XtankstableL,x - cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels -@ bcs RightScreenEdge + cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels +@ bcs RightScreenEdge inc XtankstableL,x sne:inc XtankstableH,x jmp NoREdge @@ -2729,10 +2729,10 @@ CheckCollisionWithTankLoop bne @+ cpy xdraw @ - bcs LeftFromTheTank + bcs LeftFromTheTank tya ;add 20 (tank size*2 +2 and +2) clc - adc #20 + adc #20 tay lda xtankstableH,x adc #0 @@ -2828,7 +2828,7 @@ NotHighest jsr SoilDown2 ldx TankNr rts - + CalculateSoildown ldx TankNr clc @@ -2888,11 +2888,11 @@ CheckCollisionWithTankLoop cmp #ind_Mag_Deflector ; first shielded weapon bcc CheckCollisionWithNotShieldedTank cmp #ind_Bouncy_Castle +1 ; last shielded weapon - bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) - + bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) + ;lda ShieldEnergy,x ; there is wrong method to check shield :) ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) - + CheckCollisionWithNotShieldedTank lda xtankstableH,x cmp xdraw+1 @@ -2944,10 +2944,10 @@ CheckCollisionWithShieldedTank bne @+ cpy xdraw @ - bcs LeftFromTheTank + bcs LeftFromTheTank tya ;add 16 double byte clc - adc #TankWidth+4+4 + adc #TankWidth+4+4 tay lda xtankstableH,x adc #0 @@ -3017,7 +3017,7 @@ CheckRangeRight RangesChecked rts -.endp +.endp ;-------------------------------------------------- .proc SetFullScreenSoilRange @@ -3031,7 +3031,7 @@ RangesChecked .endp ;-------------------------------------------------- .proc ClearScreenSoilRange -; cleanup of the soil fall down ranges (left and right) +; cleanup of the soil fall down ranges (left and right) ;-------------------------------------------------- mwa #screenwidth RangeLeft lda #0 @@ -3072,7 +3072,7 @@ noBullets .proc HowManyBullets ; in: A <-- Weapon number, TankNr ; out: A <-- How many bullets in the weapon, Y: weapon number -; how many bullets weapon of tank(TankNr) has, Result in A +; how many bullets weapon of tank(TankNr) has, Result in A ;-------------------------------------------------- tay ldx TankNr @@ -3080,11 +3080,10 @@ noBullets sta weaponPointer lda TanksWeaponsTableH,x sta weaponPointer+1 - + lda (weaponPointer),y ; and we have number of bullets in A rts .endp - + .ENDIF - \ No newline at end of file From 060649cbed262ed16b5c21447e9b0cc6c3a2c1b5 Mon Sep 17 00:00:00 2001 From: pkali Date: Sat, 20 May 2023 14:36:21 -0400 Subject: [PATCH 60/65] no commits --- scorch.xex | Bin 56553 -> 56552 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scorch.xex b/scorch.xex index cf63ff23b7ae9d702255f7462371083a0b9833fc..ce36aeb61d853e4d140d577d1e76dad310bc1b21 100644 GIT binary patch delta 1087 zcmZva4NO~A6vw&!9&B`FkgkYuN9qV40o;<&khx@AW*EFxjYiVw;zO&l5y2uA-JBrv zCMaN#3+?O2E5*{TPxtZ4qpa;xVw6-X8Q?-AMnlY;W?*8-*aqrk-ZDj#d2jN+_nz}R zC+D2pg|PT~Sj<0Z1OeeGV~-4o@zvumgE^tPp)><52ydRcAOg!mVf&{Fax8W-VlW|` z?w(bs3_dgxo$?{!dQzLC2BCi7B?)K|rfmlSxG8LNAfSm@;1x3+?cIz_QNtG0955Ze z`=N=3aU5`tgTwe$wuC6lw&YP3@Ay(0Cq*omhAzMmit#f&Tnf7C9a<8@2rhSx0!sMF zwH*KouMNIKwB0>Plp1=N=-WeT;EZ0$s~0f;Y~daDdB(z0#fq}!(WQQGA{Aw zl0ItuMG_Ffub*87aiQtl)+Eq=egMdet+0!M^EiipdZ*IrYtSAoPlYl&Ov7Btk^+8V zOWxX%g%oy_?v5!Tg&7{J;uc>6mxtKsBg%N@j12nm-oR(TkM9OnKpd}(zy~M`%^gG| z+!-WrMl?s_zvXgK$4n+yhj$BZLd^Qqpi4H;v{?E38%FJ=ii@sD0LY%DRP_ zW&UJpY&P2=>$%h`aY^rQ@pS%H;hH~u5Bza7A5>ylumY^$eZksP9ShA2^f6F|2ZN>H zMLZRJFiXeM$D2=dyx(X4C?h++cvt0tYS`5`_MC#C^9+^A;C*8|GS(kl3Tbz}MLX1C z`&ijSdNwZOrCbWzO=`TKVRc^5!Y=F{%f^a}%F_R#jT;%=5?IN4J#3@WJIuByp&lQ) zct=7x-~|3Al$*zAZTBXQN#kz*F_fSpcAYn|AVrB-g8UCNVLCzuq|1*(g_5`I>mem7 z%CR1T5?>Ul1Ns)&a#fD=Esti-%V)crnDtg;dMN6G+PM>p{Y!NGBr|}12 z4cLSI;ig*XH@nSi z+)|RUySA@CURQ(`UNYphuVu8g)0k1$5=Vp9NTMNJ$P!spQ;RqjSxe4Z9f!tK*ufhgz>8@te8B;11 zr`9Ni*85<8Ki8Q>?qy<)E z^T;#BjdVoF3Ya8XPl|k$q2Bo~XWOUnO;R&Qo>@ZnzC*+;iaoc(mC1UBM* z*YER{Ryc-#9L+CavvQpA7D2?pHlny9XpuYPa{?3($H@=T66Wk^32BoVE#;rKY=p?t zmDY_A6ucK_lM((3f$l?%U-e8g_f;#Dxpnh8?eR5 z=FvPlhP(YzP=yEl#|{?S7(P0Ym^dI4m#|B)&=x)s`(5Q~OBf4@areJQM)(lS|1TKI zl+-_PZQ}T7AUiLSDJ_xdQ9z6x0Vxo3fk4UDk6ScdpY%|{>G}I&$>UE|H@o{ftx95|KYu@?DJbd%l`6p!0Hnp6$y5p;V^S0&efW>7mwRfJ<^<49Q zIXU~=pMv6w+QXVFHb?*9(8TKYJ^SDN;DW*9|Aqf_!=YCF$nBs1TF)twE1Kxd#i?$- iA_NG#qgTXQ2L0h&k#=F_xKwn3q3yYTJ9l*aRQf-;`T}+U From cc99866a1260752720010be85b1122ef487f3075 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 21 May 2023 09:25:22 -0400 Subject: [PATCH 61/65] jsr/rts to jmp optimiz --- Atari/gr_basics.asm | 8 +- Atari/textproc.asm | 4 +- C64/gr_basics.asm | 4 +- README.md | 238 +++++++++++++++++++++++--------------------- ai.asm | 6 +- game.asm | 4 +- grafproc.asm | 12 +-- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56552 -> 56538 bytes scorchC64.asm | 4 +- scorchC64.prg | Bin 39996 -> 39619 bytes weapons.asm | 24 ++--- 12 files changed, 157 insertions(+), 147 deletions(-) diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 46858ca..467f8fe 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -585,8 +585,8 @@ EndPut4x4 ; ora #$02 ; 2=normal, 3 = wide screen width sta dmactls mva WallsType COLBAKS ; set color of background - jsr WaitOneFrame - rts + jmp WaitOneFrame + ; rts .endp ;-------------------------------------------------- @@ -660,8 +660,8 @@ NoPlot ldx TankNr sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter jsr SetFullScreenSoilRange - jsr SoilDown2.NoClearTanks - rts + jmp SoilDown2.NoClearTanks + ; rts ; in order to optimize the fragment repeated in both internal loops ; we save 15 bytes :) diff --git a/Atari/textproc.asm b/Atari/textproc.asm index dbf0abe..b36270d 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -1709,8 +1709,8 @@ FastTank bne MainTanksFloatingLoop ; neverending loop mva #$00 ScrollFlag ; credits scroll off jsr MakeDarkScreen - jsr GameOverResultsClear - rts + jmp GameOverResultsClear + ; rts RandomizeTankPos randomize 10 (32-7) ; 10 not 8 - barrel !! :) sta Ytankstable,x diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 78fb207..8a175cf 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -680,8 +680,8 @@ NoPlot ldx TankNr sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter jsr SetFullScreenSoilRange - jsr SoilDown2.NoClearTanks - rts + jmp SoilDown2.NoClearTanks + ; rts ; in order to optimize the fragment repeated in both internal loops ; we save 15 bytes :) diff --git a/README.md b/README.md index 0a2f2cd..70eec45 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,10 @@ You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https:/ This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler). -Compilation: `mads scorch.asm -o:scorch.xex` +Compilation: +`mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version +`mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version +`mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet) Game source code is split into several parts: @@ -41,19 +44,26 @@ Game source code is split into several parts: - weapons.asm - general arsenal of tankies - definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't). -We were trying to use macros, pseudo-ops and simple graphics primitives as much as possible. -This way it should be relatively easy to port this code to e.g. C64 +We were trying to use macros, pseudo-ops, and simple graphics primitives as much as possible. This way, it should be relatively easy to port this code to, for example, the C64. -After those N years of working on this piece of code we are sure it would be much wiser to write it in C, Action! or MadPascal but on the other hand it is so much fun to type 150 chars where all you want to have y=a*x+b :) +After working on this piece of code for N years, we are sure it would be much wiser to write it in C, Action!, or MadPascal. On the other hand, it is so much fun to type 150 characters when all you want to have is y = a * x + b. :) -Originally most variables were in Polish, comments were sparse, but we wanted to release this piece of code to public. -Because of being always short of time/energy (to finish the game) we decided it must go in 'English' to let other people work on it. -It never happened, but we got some encouraging comments and we are still trying to do something from time to time. +Originally, most variables were in Polish, and comments were sparse. However, we wanted to release this piece of code to the public. Because we were always short of time and energy (to finish the game), we decided to translate it into English so that other people could work on it. This never happened, but we received some encouraging comments, and we are still trying to do something from time to time. With the advent of [fujinet](https://fujinet.online/) we are thinking about making the game interplanetary, err, with multiplayer over the net. We'll see. ## Changelog: +###### Version 1.30 +2023-05-21 + +Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening. + +The most important changes: +- most machine-dependent code moved to appropriate folders (`Atari/` and `C64`) +- Game Over results table improved by sorting all 3 values - points, hits and money earned +- + ###### Version 1.28 2023-04-22 @@ -145,11 +155,11 @@ Other (dubious) improvements: We couldn't resist! This is the Senior Executive Director's Cut. By virtue of byte misering we squeezed in a few new features: -* new selectable tank shapes - change the controller enough times to get a different tank model -* lonely bad pixel after Liquid Dirt fixed -* mountain colors (or shades) possible, switch with [Tab] in the main menu -* active controller number display in the game, store, and inventory screens -* a very special terminator mode for Moron +- new selectable tank shapes - change the controller enough times to get a different tank model +- lonely bad pixel after Liquid Dirt fixed +- mountain colors (or shades) possible, switch with [Tab] in the main menu +- active controller number display in the game, store, and inventory screens +- a very special terminator mode for Moron ###### Version 1.20 @@ -158,72 +168,72 @@ By virtue of byte misering we squeezed in a few new features: It's the final cut. Director's Cut. We squeezed the code and saved some bytes to add the joystick/controller selection. No more fights for the stick, up to 4 players can have fun with their own manipulators. And the fifth one can still use the keyboard :). Our most prolific testers Arek and Alex called for a number of fixes. Thank you, guys! -* Players can select their controllers. -* Better Auto Defense symbol in the status line. -* Battery performance in AI and Auto Defense fixed. -* More accurate and faster Laser. -* Boost For Gifts includes a secret, quite powerful weapon. -* Points counting fix-up (edge cases eliminated). -* Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed. -* Lazy Boys now remember the last weapon used. -* Especially for XEGS - SELECT key changes the joystick similarly to TAB. -* Rare P/M glitches fixed. -* ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed. -* Bouncy Castle was bouncing the laser from inside. Fixed. -* Shielded tanks were autodestructing when shooting with angle 0. Fixed. -* Physics of bouncing off the walls was incorrect for some weapons. Fixed. +- Players can select their controllers. +- Better Auto Defense symbol in the status line. +- Battery performance in AI and Auto Defense fixed. +- More accurate and faster Laser. +- Boost For Gifts includes a secret, quite powerful weapon. +- Points counting fix-up (edge cases eliminated). +- Long lists in inventory and shop were pointing to a weapon outside the screen. Fixed. +- Lazy Boys now remember the last weapon used. +- Especially for XEGS - SELECT key changes the joystick similarly to TAB. +- Rare P/M glitches fixed. +- ExplosionRange variable glitched (rarely) due to byte/word mix-up. Fixed. +- Bouncy Castle was bouncing the laser from inside. Fixed. +- Shielded tanks were autodestructing when shooting with angle 0. Fixed. +- Physics of bouncing off the walls was incorrect for some weapons. Fixed. ###### Version 1.19 2022-11-04 This is the final round of weapon additions! Also. our beloved testers and players found a number of issues and we were extremely happy to address them. -* New defensive weapon "Lazy Boy" - aims at the closest enemy. -* New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean. -* New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available) -* New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents. -* New SFXes, improvements in SFX, and music by @mikerro -* Shooting with angle 0 caused the sudden death of the operator. Fixed. -* Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy. -* Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed. -* Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed. -* Liquid Dirt volume increased significantly, it is now a formidable attack! -* A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed. -* Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess). -* Soil sedimentation speed after Funky Bomb improved. -* Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only. -* A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen. -* BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;) +- New defensive weapon "Lazy Boy" - aims at the closest enemy. +- New defensive weapon "Lazy Darwin" - aims at the weakest link, an enemy I mean. +- New defensive weapon "Auto Defense" - activate it to be automatically protected by shields and stuff (where available) +- New defensive weapon "Spy Hard" - quickly view energies, weapons and shields of your opponents. +- New SFXes, improvements in SFX, and music by @mikerro +- Shooting with angle 0 caused the sudden death of the operator. Fixed. +- Angles were asymmetrical, now you can go from 0 to 90 and to 0 again (181 degrees of freedom). Fixed with an improved arithmetic rounding of our sub-pixel accuracy. +- Drawing a barrel when a tank was on the edge of X==256 pixels caused a lonely pixel to appear randomly. Fixed. +- Liquid Dirt was overflowing from the right edge of the screen to the left. Fixed. +- Liquid Dirt volume increased significantly, it is now a formidable attack! +- A single pixel was erroneously plotted when measuring distance (was visible in e.g., Death's Head). Fixed. +- Not all traces were correctly erased after Funky Bomb, fixed again (for the 3rt time I guess). +- Soil sedimentation speed after Funky Bomb improved. +- Pressing [ESC] when in inventory/store was quitting the game, now it quits the menu only. +- A bug in MADS optimization was causing parts of SEPPUKU message to stay on screen. +- BIGGEST OF ALL: the lonely pixel after Nuclear Winter was eliminated. https://github.com/pkali/scorch_src/issues/103 We have spent a disproportionately large amount of time trying to slap this bug. It is still there, but is not manifesting itself ;) ###### Version 1.18 2022-11-07 Possibly the final single-player version of the game, unless our dear players find another breaking issue! -* 5200 keypad works as it should. You can now press these finicky foils to your heart's desire. -* "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed! -* One of the variables was declared as a byte but used as a word that might cause some rare instabilities. -* Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations. -* The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!) -* You can now wrap around inventory and shop to faster access these options far down below. -* Visual improvement of the main menu and fixed some color issues with the title headers. -* Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains! -* The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu. +- 5200 keypad works as it should. You can now press these finicky foils to your heart's desire. +- "Unknown" type Robotanks were attacking with Nuclear Winter every time. Fixed! +- One of the variables was declared as a byte but used as a word that might cause some rare instabilities. +- Page zero variables are cleared prior to the game start to eliminate rare issues in some software/hardware configurations. +- The new version of music in NTSC eliminates issues with tempo (not that anyone but the artist noticed that, but still it is an improvement!) +- You can now wrap around inventory and shop to faster access these options far down below. +- Visual improvement of the main menu and fixed some color issues with the title headers. +- Hovercraft was always flying to the top of the screen, it was not intended, it is now hovering just above the mountains! +- The main menu does not blink now when changing options. This was a very minor thing but it bothered me to some extent. Fixing it required a complete rewrite of this portion of the menu. ###### Version 1.17 2022-10-31 Mostly 5200 console port and NTSC improvements. -* Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point. -* Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129 -* 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now. -* Rare hang-ups on NTSC machines fixed -* Screen lowered down by 7 scan lines to help top status line on NTSC CRTs. -* 5200 ATTRACT mode not going away fixed -* Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller. -* DLI interrupts optimized, few cycles saved. -* 5200 keypad sort-of-works. Please refer to manual for key bindings. +- Updated songs from Miker do not require skipping frames on NTSC machines. Crucial for the next point. +- Bouncy Castle bouncing of Funky Bomb fixed https://github.com/pkali/scorch_src/issues/129 +- 5200 version had various graphical and sound glitches. Although mostly harmless, it hurt our sense of aesthetics. First of all the flickering credits roll is all good now. +- Rare hang-ups on NTSC machines fixed +- Screen lowered down by 7 scan lines to help top status line on NTSC CRTs. +- 5200 ATTRACT mode not going away fixed +- Autorepeat added to menus what should help 5200 users with their non-centering abomination of a controller. +- DLI interrupts optimized, few cycles saved. +- 5200 keypad sort-of-works. Please refer to manual for key bindings. ###### Version 1.16 @@ -236,7 +246,7 @@ Cramming the game into a 32KiB cart and 16KiB RAM was a big task - it required a The release is not perfect - we have a number of glitches and improvements to the 5200 controller procedures to work on, but the game is playable. Changes: -* numerous, but not very visible +- numerous, but not very visible ###### Version 1.14 @@ -246,12 +256,12 @@ Minor bugfixes and optimizations. Just a small update to allow for more testing and having fun before the bigger release. Changes: -* Numerous optimizations that require a solid test. Please have fun and report issues! -* Small DrawTanks fix. -* Bouncy Castle bounces like it should. -* Tracer and Smoke Tracer are not causing defense weapons to trigger anymore. -* In rare cases direct hit was not accounted for correctly. -* Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16 +- Numerous optimizations that require a solid test. Please have fun and report issues! +- Small DrawTanks fix. +- Bouncy Castle bounces like it should. +- Tracer and Smoke Tracer are not causing defense weapons to trigger anymore. +- In rare cases direct hit was not accounted for correctly. +- Manuals updated. https://github.com/pkali/scorch_src/releases/tag/v1.16 ###### Version 1.13 @@ -262,13 +272,13 @@ Getting ready for porting the game! Several heavy optimizations and code cleanups in preparation for an unexpected port. Changes: -* Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better. -* Cyborgs prefer to kill humans. -* Fine tuning of AI purchases makes the difficulty level aligned with the robot level. -* Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed. -* Updated music by @Miker -* It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard! -* Manuals updated with AI strategy information and more. +- Overhaul of AI - Cyborgs, Spoilers, and Choosers aim much better. +- Cyborgs prefer to kill humans. +- Fine tuning of AI purchases makes the difficulty level aligned with the robot level. +- Fixed a very difficult and elusive bug that was causing tanks to freeze when falling close to the right edge of the screen fixed. +- Updated music by @Miker +- It is now possible to enter tank names with a joystick - all essential game functions are available without touching the keyboard! +- Manuals updated with AI strategy information and more. ###### Version 1.12 @@ -277,12 +287,12 @@ Changes: What is going on? Are we getting crazy or what? Changes: -* Background color indicates the type of walls. This is very useful when the rand option is selected. -* XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks) -* A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :) -* Boxy infinite bounce bug fixed. -* Funky bombs bounce off the walls! -* The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic. +- Background color indicates the type of walls. This is very useful when the rand option is selected. +- XEGS users requested that console keys are used when no keyboard is attached! We delivered! [SELECT] to select an offensive weapon, [OPTION] to jump into inventory, defensive section, [START] + [OPTION] - immediate Game Over (no confirmation for you keyboardless folks) +- A very silly bug detected by our young testers fixed - the game crashed when you built a very high mountain using Dirt Balls :) +- Boxy infinite bounce bug fixed. +- Funky bombs bounce off the walls! +- The first letter entered for a tank name was inserted in the wrong spot. How did it work at all? Magic. [ESC] now correctly exits the purchase screen. @@ -294,8 +304,8 @@ A release lollapalooza. The silliness indicator crashed. What are we doing? Changes: -* A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values. -* Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change. +- A very silly buffer overflow bug fixed - it allowed for infinite (well... to the point) lengths of tank names, or rather for overwriting code with arbitrary values. +- Gamefield walls added https://github.com/pkali/scorch_src/issues/50. Choosing a different wall effect from the main options menu allows for a sophisticated tactics change. ###### Version 1.10 2022-08-21 @@ -307,22 +317,22 @@ This release brings a swath of gameplay updates and a generous dose of a new sil Version number bump reflects number of unreleased versions and amount of changes. Changes: -* Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks. -* Fixed bug with Long Schlong activation taking one Schlong too many. -* Smoke Tracer not disappearing smoke fixed. -* Bug allowing for infinite shooting outside the screen fixed. -* Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119 -* New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97 -* Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120 -* Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52 -* Main atari library switched to a more standard version based on Mapping the Atari -* Huge memory optimizations to allow for the new features. -* Narrow screen in shop / inventory (many bytes saved). -* Explosion range corrections for a rare event of non-lethal Nuke explosions. -* Pressing [A] jumps into defensive weapons activation directly. -* Elusive randomize force error causing rare hangups for Tosser fixed. -* Activation of defensive weapons moved to front. -* Additional SFX for new weapons. +- Defensive weapons can be activated before the round to make for the unbeatable aiming precision of the robotanks. +- Fixed bug with Long Schlong activation taking one Schlong too many. +- Smoke Tracer not disappearing smoke fixed. +- Bug allowing for infinite shooting outside the screen fixed. +- Tank colors and P/M sequence as devised by Adam, the gfx artist. Tanks differ more and look better. https://github.com/pkali/scorch_src/issues/119 +- New item in the shop - loot box "Buy me!" with a surprise inside. https://github.com/pkali/scorch_src/issues/97 +- Tank names can have s p a c e s now! https://github.com/pkali/scorch_src/issues/120 +- Tanks are mobile now thanks to the new defensive option - Hovercraft https://github.com/pkali/scorch_src/issues/52 +- Main atari library switched to a more standard version based on Mapping the Atari +- Huge memory optimizations to allow for the new features. +- Narrow screen in shop / inventory (many bytes saved). +- Explosion range corrections for a rare event of non-lethal Nuke explosions. +- Pressing [A] jumps into defensive weapons activation directly. +- Elusive randomize force error causing rare hangups for Tosser fixed. +- Activation of defensive weapons moved to front. +- Additional SFX for new weapons. ###### Version 1.00 2022-08-13 @@ -336,18 +346,18 @@ All 48KB+ 8-bit Atari computers are supported. Thank you @Pecusx and @Miker for your hard work over the last few weeks - I was almost entirely absent because of the real-world attack. Most important changes: -* New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9 -* Tank barrels are drawn procedurally to make aiming easier.. -* Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112 -* AI can use White Flag. -* 3 different tank shapes https://github.com/pkali/scorch_src/issues/64. -* All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40 -* New weapon - Long Schlong! -* New splash screen. -* Game mechanics improved. -* [O] key skips to the Game Over screen. -* The game works on Atari 800. -* Huge amount of optimizations to squeeze the game into 48K. +- New Game Over screen with a summary of wins, direct hits and earned cash. https://github.com/pkali/scorch_src/issues/9 +- Tank barrels are drawn procedurally to make aiming easier.. +- Various SFX and music updates with new tunes for all parts of the game. https://github.com/pkali/scorch_src/issues/112 +- AI can use White Flag. +- 3 different tank shapes https://github.com/pkali/scorch_src/issues/64. +- All AI levels are programmed. Cyborg is tough! https://github.com/pkali/scorch_src/issues/40 +- New weapon - Long Schlong! +- New splash screen. +- Game mechanics improved. +- [O] key skips to the Game Over screen. +- The game works on Atari 800. +- Huge amount of optimizations to squeeze the game into 48K. And now the new adventure begins! @@ -423,10 +433,10 @@ The new inventory system has been added. Call it by pressing the "I" key or shor Another significant playability change is #54 - it is not finished yet, but keeping the joystick up or down makes force increase/decrease faster. Also - short press of fire calls Inventory, long press fires the shell. The timings are experimental, please let me know if this needs a modification/improvement. Tickets closed: -* https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts -* https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank -* https://github.com/pkali/scorch_src/issues/71 - ditto -* https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system +- https://github.com/pkali/scorch_src/issues/92 - less unnecessary cleaning of the offensive texts +- https://github.com/pkali/scorch_src/issues/89 - improved collisions with tank +- https://github.com/pkali/scorch_src/issues/71 - ditto +- https://github.com/pkali/scorch_src/issues/11, https://github.com/pkali/scorch_src/issues/26, https://github.com/pkali/scorch_src/issues/8, https://github.com/pkali/scorch_src/issues/20 - new inventory system ###### Build 143 2022-06-05 diff --git a/ai.asm b/ai.asm index 564a9f2..44b70df 100644 --- a/ai.asm +++ b/ai.asm @@ -22,7 +22,7 @@ pha lda AIRoutines,y pha -; it's no necessary - PrepareAIShoot is next proc :) +; it's no necessary - PrepareAIShoot is next proc :) ; jsr PrepareAIShoot ; rts .endp @@ -203,8 +203,8 @@ forceNow endo ; choose the best weapon - jsr ChooseBestOffensive - rts + jmp ChooseBestOffensive + ; rts ;---------------------------------------------- AngleTable ; 16 bytes ;ba w $348b L$3350 diff --git a/game.asm b/game.asm index c08763d..cb061ee 100644 --- a/game.asm +++ b/game.asm @@ -1043,8 +1043,8 @@ rotateLeft ; older is bigger dec angleTable,x jmp MoveBarrel BarrelPositionIsFine - jsr DrawTankNr - rts + jmp DrawTankNr + ; rts .endp diff --git a/grafproc.asm b/grafproc.asm index cbe8eb4..ae1b631 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1430,8 +1430,8 @@ ColumnIsReady sta color ; Pozor! :) we know - now A=1 NothingToFall mva #sfx_silencer sfx_effect - jsr DrawTanks - rts + jmp DrawTanks + ; rts .endp ;-------------------------------------------------- @@ -1750,8 +1750,8 @@ end_found iny sty fx ldy tankNr - jsr Display4x4AboveTank - rts + jmp Display4x4AboveTank + ; rts .endp ;------------------------------- @@ -1926,8 +1926,8 @@ X lda XtanksTableL,x sta yc ; current tank barrel length lda angleTable,x sta Angle - jsr DrawBarrelTech - rts + jmp DrawBarrelTech + ; rts .endp .proc DrawBarrelTech diff --git a/scorch.bin b/scorch.bin index 32731b5d2e1a3fb99bbbce3eb94e37c0b4e9f1da..2a9069b9614f76419f76aae43aa19540fa9d3a51 100644 GIT binary patch delta 7298 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 delta 7360 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 NOj6a;{zJYy^ItXsYO??U diff --git a/scorch.xex b/scorch.xex index ce36aeb61d853e4d140d577d1e76dad310bc1b21..2f1a51a5ecdd1205bf378072857c85cc6e14210d 100644 GIT binary patch delta 7250 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

RT&4Oew*p5xgFB;; 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 diff --git a/weapons.asm b/weapons.asm index d1cfcfe..38d2c7b 100644 --- a/weapons.asm +++ b/weapons.asm @@ -934,7 +934,7 @@ ExplodeNow ; finally a little explosion mva #sfx_baby_missile sfx_effect jmp xmissile - rts + ; rts .endp ; -------------------------------------------------- .proc checkRollDirection @@ -2392,8 +2392,8 @@ NoWall ; ------------------------------------------------- jsr PrepareAIShoot.WepTableToTemp jsr UseBattery - jsr TosserDefensives - rts + jmp TosserDefensives + ; rts .endp ; ------------------------------------------------- .proc SpyHard @@ -2431,15 +2431,15 @@ SelectNextTank beq RepeatSpy SpyHardEnd mvx TargetTankNr TankNr ; restore - jsr DisplaySpyInfo - rts + jmp DisplaySpyInfo + ; rts .endp .proc DisplaySpyInfo lda TankStatusColoursTable,x sta COLOR2 ; set color of status line - jsr PutTankNameOnScreen -; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - rts + jmp PutTankNameOnScreen + ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + ; rts .endp ; ------------------------------------------------- .proc LazyBoys @@ -2474,8 +2474,8 @@ EndLazy sta ForceTableL,x lda Force+1 sta ForceTableH,x - jsr MoveBarrelToNewPosition - rts + jmp MoveBarrelToNewPosition + ; rts .endp ; ------------------------------------------------- .proc TankFlying @@ -2839,8 +2839,8 @@ CalculateSoildown adc #0 sta xdraw+1 mva #$04 ExplosionRadius - jsr CalculateExplosionRange - rts + jmp CalculateExplosionRange + ; rts SetFuelFullText mwa #hoverFull LineAddress4x4 From e9cde15ee1ddb2711b8860fbc171ca7b394de509 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 21 May 2023 09:50:31 -0400 Subject: [PATCH 62/65] README updt --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 70eec45..f143696 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,16 @@ With the advent of [fujinet](https://fujinet.online/) we are thinking about maki Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening. The most important changes: -- most machine-dependent code moved to appropriate folders (`Atari/` and `C64`) -- Game Over results table improved by sorting all 3 values - points, hits and money earned -- +- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64`). +- Game Over results table improved by sorting all 3 values - points, hits and money earned. It was possible in the past to get a lower podium place with e.g., more money. +- Game Over screen now displays level of robo tanks and controller number for organic players. +- Gains calculations bug fixed. +- Manuals now include pictures! +- More than 6 tanks possible (not for Atari / 5200 where sprites and memory is the limitation) +- Shield stays up after White Flag bug fixed #138. Finally!!! +- Quit from game and quit to Game Over is now checked much more often, especially when robo tanks are fighting. +- Numerous binary size and source code clarity improvements, mainly to facilitate the above changes. + ###### Version 1.28 2023-04-22 From 0c730c9ea4d53640f70d0837fcd81813fe3af8d5 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 21 May 2023 09:55:26 -0400 Subject: [PATCH 63/65] README updt --- README.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index f143696..9d5399b 100644 --- a/README.md +++ b/README.md @@ -28,21 +28,22 @@ You can contact us via [AtariAge](https://atariage.com) or [AtariOnLine](https:/ This source code was originally compiled with [OMC65 crossassembler](https://github.com/pkali/omc65) and on 2012-06-21 translated to [mads](https://github.com/tebe6502/Mad-Assembler). Compilation: -`mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version -`mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version -`mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet) +- `mads scorch.asm -o:scorch.xex -d:TARGET=800` for Atari800 version +- `mads scorch.asm -o:scorch.bin -d:TARGET=5200` for Atari 5200 version +- `mads scorchC64.asm -o:scorchC64.prg` for C64 version (WIP, not playable yet) Game source code is split into several parts: -- scorch.asm is the main game code (with many assorted routines) -- grafproc.asm - graphics routines like line or circle -- textproc.asm - text routines like list of weapons and shop -- variables.asm - all non-zero page variables -- constants.asm - various tables of constants -- display_*.asm - display lists and text screen definitions -- ai.asm - artificial stupidity of computer opponents -- weapons.asm - general arsenal of tankies -- definitions.asm - label definitions, moved to make it work better with Altirra debug (it doesn't). +- `scorch.asm` is the main game startup code +- `game.asm` - it all happens here +- `grafproc.asm` - graphics routines like line or circle +- `textproc.asm` - text routines like list of weapons and shop +- `variables.asm` - all non-zero page variables +- `constants.asm` - various tables of constants +- `display_*.asm` - display lists and text screen definitions +- `ai.asm` - artificial stupidity of computer opponents +- `weapons.asm` - general arsenal of tankies +- `definitions.asm` - label definitions, moved to make it work better with Altirra debug (it doesn't). We were trying to use macros, pseudo-ops, and simple graphics primitives as much as possible. This way, it should be relatively easy to port this code to, for example, the C64. @@ -60,13 +61,13 @@ With the advent of [fujinet](https://fujinet.online/) we are thinking about maki Okay, okay, we promised that the single-machine game was done, and it was. However, some bug reports came in, and development of the C64 version unearthed some mostly peaceful and dormant pests. As a result, it appears that a new release is happening. The most important changes: -- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64`). +- Most machine-dependent code moved to appropriate folders (`Atari/` and `C64/`). - Game Over results table improved by sorting all 3 values - points, hits and money earned. It was possible in the past to get a lower podium place with e.g., more money. - Game Over screen now displays level of robo tanks and controller number for organic players. - Gains calculations bug fixed. - Manuals now include pictures! -- More than 6 tanks possible (not for Atari / 5200 where sprites and memory is the limitation) -- Shield stays up after White Flag bug fixed #138. Finally!!! +- More than 6 tanks possible (not for Atari / 5200 where sprites and memory are the limiting factor) +- Shield stays up after White Flag bug fixed https://github.com/pkali/scorch_src/issues/138. Finally!!! - Quit from game and quit to Game Over is now checked much more often, especially when robo tanks are fighting. - Numerous binary size and source code clarity improvements, mainly to facilitate the above changes. From 82c39faddf8a3c10c1a3c76c0613316a8ebd4285 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 21 May 2023 09:55:51 -0400 Subject: [PATCH 64/65] README updt --- scorch.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scorch.asm b/scorch.asm index 9a14dbd..2be1c60 100644 --- a/scorch.asm +++ b/scorch.asm @@ -509,8 +509,8 @@ checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE ; no people, just wait a bit ;pause 150 ldy #75 - jsr PauseYFrames - rts + jmp PauseYFrames + ; rts peopleAreHere jmp getkey ; jsr:rts .endp From fc1ab3bc7a7634e1bdf9d4efec751ece2bf167a0 Mon Sep 17 00:00:00 2001 From: pkali Date: Sun, 21 May 2023 09:58:27 -0400 Subject: [PATCH 65/65] bin updt --- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56538 -> 56537 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/scorch.bin b/scorch.bin index 2a9069b9614f76419f76aae43aa19540fa9d3a51..a4a315e64480cb7db49eef07751dfcaeeb06e1a3 100644 GIT binary patch delta 7022 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 Wr+Vy9HjRTe-6ZxZ?ce2kF#iYCv&d5b delta 6986 zcmZ`d30M?I*3-;z4FlcCs32DjpmGUBjo=l}C}OLqTnVVdp>jlVM)5$+AX@B*j2xvL znlU5Ngho*ay7}>UqDel{!K~^1qi&M@R}&9b;+lUFlXXq9y03c>v)TOOH(mAWy;rYZ zy|c>7oXX0aI=@n`q*Hlq?M6gvEIvKeE1M2XGcu3wItf1`oWjd2uQY|LjLeUg^d_0? zvhbtDzvpmT(^>#M=4Choy}b%;f0H+03vb8I_-EM6%h2~JJdOQ$g(>&~znjeP7`fn# zN#Vq&nw*{ZnI^AmSZ4Bikik2dsB5qXicRL7fCe2~i6$)rK-i7A`-ocO7~MplCL`Zv z=%Zv5q(zv#?GZXMK*xKC1l7xsE(Op!hS7Ex^fCF|inYlHvQEho~{K(%pC5!#{WHsT_fJ9v{@UXv8jSty+N(R*D^Y~v{yw$cA| zZ!P6DCjSellAL5NXx8Zgod+$L(R>|hdjoZ*z!_VM0K%iH6ts?1d;3%K$#L(`yxvPQ z=~X@F(o7pwS~Ngvheayt^Z8Ar*2gEfd#ha|T_PWf-{sSBH(!Q71J<8&UHDI^n|wPg zVEFLgTnX`EsZ>(z^D@;}k0@C~iwZo9uwhf`E+w|vBEidxrQFmj5k z;q^B`bR9nz>v;xmaRYUw~csSFkGrZ90MJ94zJguqO~PmPO5} zs5*`7NbHdG)gkGNcflP9EO^j-H-pK-MI+~><_vWo^BC+iA9wIFlal5#P5aj&bY>Nj zf#bkk*xZC+-ze!0C2eyTZu4${!v?RiISHOul{E85iAV$}1n-kd`sP}db*+jy`*f{J z1iA=50E7tuZO+0mSQf!Q3BcD`kfYjFY%r+~_IFvEj$i93B%Q&2qg2`p?!x!JoUTBL zbu~`?dW($P^p~|Nq#}2M6MfGeW|Oqmvoy|v`U-pqox7HIi$(=sn!ZCdUHayK*lGt*JVa!Aq`sE3~on)L$BYOpKsA9jav z;sYTri2g~=BSe|Vmncx3n$MTxJYJ1gH_P_F&Fr@@2oY}$n(4ZF&v|q?8_inn(48v? zc!Nz!5l_l~o(&q3KGNZx>}s2veTq#6u!p&zC-@MZ#>el&?B4T?`-!(1

EhuPfu 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 XzIeK4b(&>7H1!s#kLi9??8*EK*C4v~ diff --git a/scorch.xex b/scorch.xex index 2f1a51a5ecdd1205bf378072857c85cc6e14210d..32d514ef6b3df38ad2a647a5b755468475b87819 100644 GIT binary patch delta 7113 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 P1TT7E!1@di6^s^x;sdL}$Ut~R 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

iO@o4a!u7df89uH*?z*&6ews_;90WV8!4Vx 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 pTX)9cKjMu3{}cW{e=S|% Date: Mon, 15 May 2023 10:54:38 +0200 Subject: [PATCH 32/65] Ops... links. --- Manuals/MANUAL_PL.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index b2f1598..3bf331d 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -3,7 +3,7 @@ Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka (wszystkie funkcjonalności niezbędne w rozgrywce). ## 1. Wybór opcji gry. -![Ekran wyboru opcji gry.](/images/MainMenu.png) +![Ekran wyboru opcji gry.](images/MainMenu.png) Na pierwszym ekranie możemy skonfigurować opcje rozgrywki: * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość) @@ -29,7 +29,7 @@ Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera zmien Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. ## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer -![Ekran wyboru graczy i poziomu trudności.](/images/DiffMenu.png) +![Ekran wyboru graczy i poziomu trudności.](images/DiffMenu.png) Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje). Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz. Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5]. @@ -40,19 +40,19 @@ Nazwę gracza można wprowadzać także przy pomocy joysticka. Po wciśnięciu i Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. ## 3. Ekran zakupów (przed każdą rundą) -![Ekran zakupów broni ofensywnych.](/images/PurOffensive.png) -![Ekran zakupów broni defensywnych.](/images/PurDefensive.png) +![Ekran zakupów broni ofensywnych.](images/PurOffensive.png) +![Ekran zakupów broni defensywnych.](images/PurDefensive.png) Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. -![Ekran aktywacji broni defensywnych.](/images/ActDefensive.png) +![Ekran aktywacji broni defensywnych.](images/ActDefensive.png) Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. (oczywiście dla graczy komputerowych ten ekran się nie pojawia) ## 4. Główny ekran gry -![Główny ekran gry.](/images/StatusLine.png) +![Główny ekran gry.](images/StatusLine.png) W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: * nazwa czołgu gracza * numer aktywnego joysticka From f2f03533c5e3a57f1cc9c5984b25609ae278f1d7 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 11:00:36 +0200 Subject: [PATCH 33/65] Better formating --- Manuals/MANUAL_PL.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index 3bf331d..ae89d37 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -4,6 +4,7 @@ Grać można przy użyciu klawiatury (wszystkie funkcjonalności) lub joysticka ## 1. Wybór opcji gry. ![Ekran wyboru opcji gry.](images/MainMenu.png) + Na pierwszym ekranie możemy skonfigurować opcje rozgrywki: * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość) @@ -30,6 +31,7 @@ Klawisz [RETURN] lub przycisk Joysticka przechodzi do następnego ekranu. ## 2. Wprowadzanie nazwy graczy i wybór poziomu graczy sterowanych przez komputer ![Ekran wyboru graczy i poziomu trudności.](images/DiffMenu.png) + Drugi ekran powtarza się dla każdego z graczy można na nim klawiszami kursora lub joystickiem wybrać czy danym czołgiem będzie kierował człowiek (opcja HUMAN) czy też komputer (pozostałe opcje). Klawisz [TAB] lub [SELECT], a na konsoli Atari 5200 klawisz [5] kontrolera pozwalają wybrać z którego portu joysticka będzie korzystał gracz. Klawisz [INVERSE] lub [OPTION] umożliwiają wybór jednego z 3 dostępnych kształtów czołgów. Na konsoli Atari 5200 uzyskuje się to poprzez cykliczne wybieranie kolejnych portów joysticka klawiszem [5]. @@ -42,6 +44,7 @@ Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. ## 3. Ekran zakupów (przed każdą rundą) ![Ekran zakupów broni ofensywnych.](images/PurOffensive.png) ![Ekran zakupów broni defensywnych.](images/PurDefensive.png) + Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. From 610a86d9c9a7fc512d063c7c5510e8746c9d273c Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 11:06:55 +0200 Subject: [PATCH 34/65] English manual update --- Manuals/MANUAL_EN.md | 11 ++++++++++- Manuals/MANUAL_PL.md | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Manuals/MANUAL_EN.md b/Manuals/MANUAL_EN.md index f9e0dda..04d904a 100644 --- a/Manuals/MANUAL_EN.md +++ b/Manuals/MANUAL_EN.md @@ -3,6 +3,7 @@ You can play using the keyboard (all functionality) or the joystick in the first port (all functionality necessary for gameplay). ## 1. Game Option Selection. +![Game options screen.](images/MainMenu.png) On the first screen, you can configure gameplay options: * number of players (2 - 6) includes both human and computer-controlled players @@ -29,6 +30,7 @@ The [TAB] or [SELECT] key, and on the Atari 5200 console, the [5] controller key The [RETURN] key or a joystick button moves to the next screen. ## 2. Entering the name of players and selecting the level of computer-controlled players +![Name of players and game level screen.](images/DiffMenu.png) The second screen is shown for each player. Here you can use the cursor keys or joystick to select whether the tank will be driven by a human (HUMAN option) or a computer (other options). The [TAB] or [SELECT] key, and on the Atari 5200 console the [5] controller key allow you to choose which joystick port the player will use. @@ -40,15 +42,22 @@ The player's name can also be entered with the joystick. After pressing and hold If the name is not entered, it will be supplemented with the default name. ## 3. Shopping screen (before each round) +![Shopping offensives screen.](images/PurOffensive.png) +![Shopping defensives screen.](images/PurDefensive.png) On this screen, you can make purchases of offensive and defensive weapons. Only those weapons that the player can afford are visible, along with information about the price and the number of units of a given weapon that will be obtained for that price. The information on the screen probably needs no more description. You move through the lists with the cursor keys (up and down) or with the joystick, the [TAB] key or the left arrow or the left joystick tilt change the screen to defensive or offensive weapons, the [SPACE] key or the right arrow and also the joystick to the right does the purchase of the indicated weapon. -The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. This makes it possible to activate shields and others before the round starts. +The [RETURN] key or the joystick button press switches to the defensive weapon activation screen. Here you can activate previously bought defensive (or offensive after switching with [TAB], etc) weapons. + +![Defensives activation screen.](images/ActDefensive.png) + +This makes it possible to activate shields and others before the round starts. Another [RETURN] key or joystick button press switches to the next player's shopping screen. (For computer players this screen is not shown.) ## 4. The main screen of the game +![Main game screen.](images/StatusLine.png) The status line shows which player is currently allowed to take a shot and a set of other information: * player's tank name, diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index ae89d37..cb748ae 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -48,7 +48,9 @@ Jeśli nazwa nie zostanie wpisana, to zostanie uzupełniona nazwą domyślną. Na tym ekranie można dokonywać zakupów broni ofensywnych i defensywnych. Widoczne są tylko te bronie na które gracza stać wraz z informacją o cenie i ilości jednostek danej broni, którą za ten cenę otrzymamy. Informacje na ekranie nie wymagają chyba więcej opisu. Po listach poruszamy się klawiszami kursora (góra i dół) lub joystickiem, klawisz [TAB] lub strzałka w lewo czy też ruch joystickiem w lewo zmieniają ekran na bronie defensywne lub ofensywne, klawisz [SPACJA] lub strzałka w prawo a także joystick w prawo realizują zakup wskazanej broni. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu aktywacji broni defensywnych. + ![Ekran aktywacji broni defensywnych.](images/ActDefensive.png) + Na ekranie tym można aktywować zakupione wcześniej bronie defensywne czy też ofensywne. Obsługiwany jest identycznie jak ekran zakupów, jednak [SPACJA] lub strzałka w prawo a także joystick w prawo realizują aktywacje wskazanej broni. Umożliwia to aktywowanie osłon jeszcze przed rozpoczęciem rundy. Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następnego gracza. @@ -56,6 +58,7 @@ Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następneg ## 4. Główny ekran gry ![Główny ekran gry.](images/StatusLine.png) + W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: * nazwa czołgu gracza * numer aktywnego joysticka From 3847729391c71220a4fa7bc88826d438f3df1b17 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 11:17:19 +0200 Subject: [PATCH 35/65] Manuals update --- Manuals/MANUAL_EN.md | 4 ++-- Manuals/MANUAL_PL.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Manuals/MANUAL_EN.md b/Manuals/MANUAL_EN.md index 04d904a..625111b 100644 --- a/Manuals/MANUAL_EN.md +++ b/Manuals/MANUAL_EN.md @@ -61,8 +61,8 @@ Another [RETURN] key or joystick button press switches to the next player's shop The status line shows which player is currently allowed to take a shot and a set of other information: * player's tank name, -* active joystick number -* currently selected offensive weapon, +* active joystick number or difficulty levels of computer-controlled player (1-**Moron** - 8-**Unknown**), +* currently selected offensive weapon (symbol quantity and name), * the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level, * the angle and the direction of the barrel set by the player, * the shot strength set by the player (the maximum shot strength is limited by the player's energy - it can not exceed the energy * 10 . This means that you can fire weaker shots only when having a small amount of energy, diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index cb748ae..8fe6ab8 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -61,8 +61,8 @@ Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następneg W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: * nazwa czołgu gracza -* numer aktywnego joysticka -* wybrana aktualnie broń ofensywna +* numer aktywnego joysticka lub posiom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**), +* wybrana aktualnie broń ofensywna (symbol ilość nazwa), * pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób * ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia * ustawiona przez gracza siła strzału (maksymalna siła strzału jest ograniczana przez energię gracza - nie może przekroczyć energii * 10 . Oznacza to, że mając małą ilość energii możemy oddać słabsze strzały From 0c0489f5ed148051c7798c618190b1c939f0acd5 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 11:19:27 +0200 Subject: [PATCH 36/65] typo --- Manuals/MANUAL_EN.md | 2 +- Manuals/MANUAL_PL.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Manuals/MANUAL_EN.md b/Manuals/MANUAL_EN.md index 625111b..402d22a 100644 --- a/Manuals/MANUAL_EN.md +++ b/Manuals/MANUAL_EN.md @@ -61,7 +61,7 @@ Another [RETURN] key or joystick button press switches to the next player's shop The status line shows which player is currently allowed to take a shot and a set of other information: * player's tank name, -* active joystick number or difficulty levels of computer-controlled player (1-**Moron** - 8-**Unknown**), +* active joystick number or difficulty level of computer-controlled player (1-**Moron** - 8-**Unknown**), * currently selected offensive weapon (symbol quantity and name), * the player's remaining energy points and if he has an active defensive weapon that has its energy - in parentheses the energy level, * the angle and the direction of the barrel set by the player, diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index 8fe6ab8..4f541c7 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -61,7 +61,7 @@ Klawisz [RETURN] lub przycisk joysticka przechodzi do ekranu zakupów następneg W linii statusowej widoczna jest informacja o tym który z graczy aktualnie może oddać strzał oraz zestaw innych informacji: * nazwa czołgu gracza -* numer aktywnego joysticka lub posiom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**), +* numer aktywnego joysticka lub poziom gracza sterowanego przez komputer (1-**Moron** - 8-**Unknown**), * wybrana aktualnie broń ofensywna (symbol ilość nazwa), * pozostała ilość punktów energii gracza i jeśli ma on aktywną broń defensywną posiadającą swój zasób energii - w nawiasie ten zasób * ustawiony przez gracza kąt nachylenia lufy i kierunek jej nachylenia From 31646c65d3d8e2377ac4f7515989468ffa26fd47 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 15:13:36 +0200 Subject: [PATCH 37/65] Manuals and code cleanup --- Atari/textproc.asm | 227 ------------------------------------------- Manuals/MANUAL_EN.md | 7 +- Manuals/MANUAL_PL.md | 7 +- game.asm | 224 ++++++++++++++++++++++++++++++++++++++++++ scorch.asm | 2 +- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56625 -> 56625 bytes 7 files changed, 237 insertions(+), 230 deletions(-) diff --git a/Atari/textproc.asm b/Atari/textproc.asm index c4b4d0c..db2261d 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -204,66 +204,6 @@ invertme rts .endp -; -------------------------------------- -; Sets the appropriate variables based on the options table -; -.proc SetVariablesFromOptions - ;first option - ldy OptionsTable - iny - iny - sty NumberOfPlayers ;1=1 player (but minimum is 2) - - ;second option (cash) - - - ldy OptionsTable+1 - ldx #0 -@ - lda CashOptionL,y - sta moneyL,x - lda CashOptionH,y - sta moneyH,x - inx - cpx NumberOfPlayers - bne @- - - ;third option (gravity) - ldy OptionsTable+2 - lda GravityTable,y - sta gravity - - ;fourth option (wind) - ldy OptionsTable+3 - lda MaxWindTable,y - sta MaxWind - - ;fifth option (no of rounds) - ldy OptionsTable+4 - lda RoundsTable,y - sta RoundsInTheGame - - ;6th option (shell speed) - ldy OptionsTable+5 - lda flyDelayTable,y - sta flyDelay - - ;7th option (Airstrike after how many missess) - ldy OptionsTable+6 - lda seppukuTable,y - sta seppukuVal - - ;8th option (how aggressive are mountains) - ldy OptionsTable+7 - lda mountainsDeltaTableH,y - sta mountainDeltaH - lda mountainsDeltaTableL,y - sta mountainDeltaL - - - rts -.endp - ;------------------------------------------- ; call of the purchase (and activate) screens for each tank .proc CallPurchaseForEveryTank @@ -1603,173 +1543,6 @@ displayloop1 rts .endp -;-------------------------------- -.proc DisplayResults ; -;displays results of the round -;using 4x4 font - jsr RoundOverSprites - - - mva #$ff plot4x4color - - ;centering the result screen - mva #((ScreenHeight/2)-(8*4)) ResultY - - - ;upper frame - mva ResultY LineYdraw - jsr TL4x4_top - - adb ResultY #4 ;next line - - ;Header1 - ;Displays round number - lda CurrentRoundNr - cmp RoundsInTheGame - beq GameOver4x4 - - sta decimal - mwa #RoundNrDisplay displayposition - jsr displaybyte ;decimal (byte), displayposition (word) - - mwa #LineHeader1 LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - beq @+ ;unconditional jump, because TypeLine4x4 ends with beq - -GameOver4x4 - RmtSong song_round_over - mwa #LineGameOver LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - mva #1 GameIsOver - -@ - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - adb ResultY #2 ;next line - - - ;Header2 - mwa #LineHeader2 LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - sbb ResultY #2 ;next line (was empty) - - ldx NumberOfPlayers ;we start from the highest (best) tank - dex ;and it is the last one - stx ResultOfTankNr ;in TankSequence table - - mwa #TanksNames tempXROLLER - -ResultOfTheNextPlayer - ldx ResultOfTankNr ;we are after a round, so we can use TankNr - lda TankSequence,x ;and we keep here real number if the tank - sta TankNr ;for which we are displaying results - - - - - adb ResultY #4 ;next line - - ;there are at least 2 players, so we can safely - ;start displaying the result - - lda #3 ;it means | - sta ResultLineBuffer - - ldy TankNr - lda ResultsTable,y - sta decimal - mva #0 decimal+1 - mwa #(ResultLineBuffer+8) displayposition - jsr displaydec5 ;decimal (byte), displayposition (word) - - ; overwrite the second digit of the points (max 255) - ;it means ":" - mva #26 ResultLineBuffer+9 - - ldx #0 - lda TankNr - asl - asl ; times 8, because it is lengtgh - asl ; of the names of the tanks - tay - -TankNameCopyLoop - lda (tempXROLLER),y ;XROLLER is not working now - and #$3f ;always CAPITAL letters - inx - sta ResultLineBuffer,x - iny - cpx #8 ; end of name - bne TankNameCopyLoop - ; last letter of tank name overwrites first digit of the points (max 255) - - - ;just after the digits - ;it means | - mva #$3 ResultLineBuffer+13 - - ;result line display - mwa #ResultLineBuffer LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - dec ResultOfTankNr - bmi FinishResultDisplay - - sbb ResultY #2 ;distance between lines is smaller - - jmp ResultOfTheNextPlayer - -FinishResultDisplay - mva ResultY LineYdraw - ;jmp TL4x4_bottom ; just go -.endp - -.proc TL4x4_bottom - ;bottom of the frame - mwa #LineBottom LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts -.endp - -.proc TL4x4_top - ;bottom of the frame - mwa #LineTop LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts -.endp - -.proc TL4x4_empty - ;empty frame - mwa #LineEmpty LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts -.endp - ;-------------------------------------------------- .proc GameOverScreen ;-------------------------------------------------- diff --git a/Manuals/MANUAL_EN.md b/Manuals/MANUAL_EN.md index 402d22a..2a5d50a 100644 --- a/Manuals/MANUAL_EN.md +++ b/Manuals/MANUAL_EN.md @@ -9,7 +9,12 @@ On the first screen, you can configure gameplay options: * number of players (2 - 6) includes both human and computer-controlled players * the initial amount of cash of each player (2K is the optimal value we chose, but for short games, it is worth choosing a higher value) * gravity -* maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be) +* maximum wind strength (wind is drawn at the beginning of each round or during the round between turns, here we can choose how strong it can be): + * 1B - maximum wind strength: 5 + * 3B - maximum wind strength: 20 + * 5B - maximum wind strength: 40 + * 7B - maximum wind strength: 70 + * 9B - maximum wind strength: 99 * number of rounds in a game * missile speed (does not affect the flight path - only changes the apparent missile speed - does not change anything in the gameplay itself) * frequency of suicides :) - if for a number of turns the game has not recorded hits (tanks are constantly shooting inaccurately), after one of such misses a tank commits suicide - here you determine how long they can "shooting for the stars" :) - if only people play the optimal setting is "norm", in the case of computer-controlled players ... you choose. diff --git a/Manuals/MANUAL_PL.md b/Manuals/MANUAL_PL.md index 4f541c7..4b5bce4 100644 --- a/Manuals/MANUAL_PL.md +++ b/Manuals/MANUAL_PL.md @@ -9,7 +9,12 @@ Na pierwszym ekranie możemy skonfigurować opcje rozgrywki: * ilość graczy (2 - 6) obejmuje tak ludzi jak graczy sterowanych przez komputer * początkową ilość gotówki każdego z graczy (8k to wybrana przez nas wartość optymalna, lecz przy krótkich rozgrywkach warto wybrać większą wartość) * grawitacja -* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być) +* maksymalna siła wiatru (wiatr jest losowany na początku każdej z rund lub w czasie rundy pomiędzy turami, tu możemy wybrać jak silny może być): + * 1B - maksymalna siła wiatru: 5 + * 3B - maksymalna siła wiatru: 20 + * 5B - maksymalna siła wiatru: 40 + * 7B - maksymalna siła wiatru: 70 + * 9B - maksymalna siła wiatru: 99 * liczba rozgrywanych rund * szybkość lotu pocisków (nie ma wpływu na tor lotu - zmienia jedynie widoczną prędkość rysowania - nie zmienia nic w samej rozgrywce) * częstotliwość samobójstw :) - jeśli przez ileś tur gra nie odnotowała trafień (czołgi ciągle strzelają niecelnie) jeden z takich pudłujących czołgów popełnia samobójstwo - tu określamy jak długo mogą “strzelać w próżnię” :) - jeśli grają tylko ludzie optymalne ustawienie to “norm”, w przypadku graczy sterowanych przez komputer… wedle uznania. diff --git a/game.asm b/game.asm index 5c887bc..a48d2a2 100644 --- a/game.asm +++ b/game.asm @@ -1158,5 +1158,229 @@ SetRandomWalls sta WallsType rts .endp +; -------------------------------------- +; Sets the appropriate variables based on the options table +; +.proc SetVariablesFromOptions + ;first option + ldy OptionsTable + iny + iny + sty NumberOfPlayers ;1=1 player (but minimum is 2) + + ;second option (cash) + + ldy OptionsTable+1 + ldx #0 +@ + lda CashOptionL,y + sta moneyL,x + lda CashOptionH,y + sta moneyH,x + inx + cpx NumberOfPlayers + bne @- + + ;third option (gravity) + ldy OptionsTable+2 + lda GravityTable,y + sta gravity + + ;fourth option (wind) + ldy OptionsTable+3 + lda MaxWindTable,y + sta MaxWind + + ;fifth option (no of rounds) + ldy OptionsTable+4 + lda RoundsTable,y + sta RoundsInTheGame + + ;6th option (shell speed) + ldy OptionsTable+5 + lda flyDelayTable,y + sta flyDelay + + ;7th option (Airstrike after how many missess) + ldy OptionsTable+6 + lda seppukuTable,y + sta seppukuVal + + ;8th option (how aggressive are mountains) + ldy OptionsTable+7 + lda mountainsDeltaTableH,y + sta mountainDeltaH + lda mountainsDeltaTableL,y + sta mountainDeltaL + + rts +.endp + +;-------------------------------- +.proc DisplayResults ; +;displays results of the round +;using 4x4 font + jsr RoundOverSprites + + + mva #$ff plot4x4color + + ;centering the result screen + mva #((ScreenHeight/2)-(8*4)) ResultY + + + ;upper frame + mva ResultY LineYdraw + jsr TL4x4_top + + adb ResultY #4 ;next line + + ;Header1 + ;Displays round number + lda CurrentRoundNr + cmp RoundsInTheGame + beq GameOver4x4 + + sta decimal + mwa #RoundNrDisplay displayposition + jsr displaybyte ;decimal (byte), displayposition (word) + + mwa #LineHeader1 LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + beq @+ ;unconditional jump, because TypeLine4x4 ends with beq + +GameOver4x4 + RmtSong song_round_over + mwa #LineGameOver LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + mva #1 GameIsOver + +@ + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + adb ResultY #2 ;next line + + + ;Header2 + mwa #LineHeader2 LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + sbb ResultY #2 ;next line (was empty) + + ldx NumberOfPlayers ;we start from the highest (best) tank + dex ;and it is the last one + stx ResultOfTankNr ;in TankSequence table + + mwa #TanksNames tempXROLLER + +ResultOfTheNextPlayer + ldx ResultOfTankNr ;we are after a round, so we can use TankNr + lda TankSequence,x ;and we keep here real number if the tank + sta TankNr ;for which we are displaying results + + + + + adb ResultY #4 ;next line + + ;there are at least 2 players, so we can safely + ;start displaying the result + + lda #3 ;it means | + sta ResultLineBuffer + + ldy TankNr + lda ResultsTable,y + sta decimal + mva #0 decimal+1 + mwa #(ResultLineBuffer+8) displayposition + jsr displaydec5 ;decimal (byte), displayposition (word) + + ; overwrite the second digit of the points (max 255) + ;it means ":" + mva #26 ResultLineBuffer+9 + + ldx #0 + lda TankNr + asl + asl ; times 8, because it is lengtgh + asl ; of the names of the tanks + tay + +TankNameCopyLoop + lda (tempXROLLER),y ;XROLLER is not working now + and #$3f ;always CAPITAL letters + inx + sta ResultLineBuffer,x + iny + cpx #8 ; end of name + bne TankNameCopyLoop + ; last letter of tank name overwrites first digit of the points (max 255) + + + ;just after the digits + ;it means | + mva #$3 ResultLineBuffer+13 + + ;result line display + mwa #ResultLineBuffer LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + mva ResultY LineYdraw + jsr TypeLine4x4 + + adb ResultY #4 ;next line + + ;Empty line + mva ResultY LineYdraw + jsr TL4x4_empty + + dec ResultOfTankNr + bmi FinishResultDisplay + + sbb ResultY #2 ;distance between lines is smaller + + jmp ResultOfTheNextPlayer + +FinishResultDisplay + mva ResultY LineYdraw + ;jmp TL4x4_bottom ; just go +.endp + +.proc TL4x4_bottom + ;bottom of the frame + mwa #LineBottom LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp + +.proc TL4x4_top + ;bottom of the frame + mwa #LineTop LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp + +.proc TL4x4_empty + ;empty frame + mwa #LineEmpty LineAddress4x4 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + jmp TypeLine4x4 ; jsr:rts +.endp .ENDIF \ No newline at end of file diff --git a/scorch.asm b/scorch.asm index 84c2c09..fc56e0e 100644 --- a/scorch.asm +++ b/scorch.asm @@ -21,7 +21,7 @@ ;--------------------------------------------------- .macro build - dta d"1.28" ; number of this build (4 bytes) + dta d"1.30" ; number of this build (4 bytes) .endm .macro RMTSong diff --git a/scorch.bin b/scorch.bin index a07c19d2f634b3e1bd6b08027274eb667b4b4964..6c33f79787b5610723549ed89d1376d7c4137729 100644 GIT binary patch delta 4070 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 NN3f&2Z|_j>{{p0n>{I{% diff --git a/scorch.xex b/scorch.xex index f0647ec34b8156da2d1b10ca87d43e6fb141dbeb..74c25563b12c9e873246230a1f3e0b2005c4c90d 100644 GIT binary patch delta 2809 zcmZWrdr*_v6;HkZ(Gc=|3RI%bdO>{f5UK92xT{-h>(obFMMDxd8iE7^qC$At6(K&j zz`6v`+bssAhCni0HP#q)CeaMEqn6m!##U*otKC_s%Cu9n?damRm7XtQ-I?xR_dM?X zopaAUkL&h{+& z)}TfCL{prd_czP$Ra9lUr=lS|PRDT<6(Fj#?Y8GpG1@vp8H?~PQYq0F8z=(`l&wR< zxgba#%6^JY7DcE>sA(g*o{RQwM4o&Qk%z_eV`1~MO=zW(=ed%r3{{fbC3~4`O7fGP zEzC_7xwkWmktsdVrR#*uCtA;@UAq}ZrzF4HbDEfH*XxkVQX%!uQCTXbdURzM_;#QE z7`q*A{72NZ+2KwqiNbCd}aZQO{<E>*k!jU2G@1G&2O0WZ|R=z)F@e8eGv5Zc`T_BRP_>4cE#b@cV2pmc(riZYBCg38w zp!F2jYU9wA0&;!-tlf4)Lq94kK%W^Pvf!N<934`~lzeOyRRs{!@DdJ}ER+ynL+=EV zLDpOdk>!`*HJ6>^;%@YFZ=AJp%?{`Mi`-b8^ zMXMo@6_nBpXm8zJ$621w42tOryp1Op067pL7Xmqsbs`Xxngi+bB5l`l*8kcYcSp{s z@Ms5^^LP(PgwrCa20oQq2AR{4X_gxdx?4oFfSsgnaX{eO}1F!^!@E z2-TE~a*dIE66)=9A70XiqHl6z*@^xK+H*ZzS6lMa&nE?iH(Pr+g=7cRqDb*#2ibk- z?JUU-XXz^+3y^7|E*}fp$0LrBz~o>QxG@6k4Pdz_Iw{PMJBQ-mlk9Me{upO;GY3$6OhA90nY`lR11;%3ye090*4mcb0v_)&+9&zbRoLWTtRief&h+P6YcJQ# zePI*W1>Ronb3rg}ASyKZ)^jZ>XqfZXgnGo)%YlgZ$I{E$gs}5ybu%}nhY23Pu63vDW~({DCOBtK@Jrd#jp3TFX-wtc;ACSK-^D*|oRJ7M zF2L3B90k(8VANF~JLm-m{?nK)hRmPs0(wDH7C)!9HEoK0OBuWX+fVW1%h$AE(rQ(g zo%O%3BF~!U%n(CU+6ql61WhR$SJ?!PihwQ{t;{TxWdM|P1dhuaB=?<=u?oI;f@ETOLQNl zGq4=_XhYhTVwioPeezlh7u&=4wJN@^J$T*M2yjycIWj0>_NqyI ztB<*)CckUV6ARSX;Ez$0jJ5&pAbcJ$b(W$PCYul)RC@m1R>?5+YEpj8#Lws9W7SNV z+VcU~7yZN6bC~u;rX1?14Uf;N&5+!Ij9?55$Dwd)4#5jj5pJh2wZpUgGJk?3T9>AM zi_-c3D6daMcJH-T$4k}N=WqtJ?a}mN&R?CU{ZcgU1Rw^ zL*KJ3WL(`Wlr}$(Q%<&tCnoddo+Uy)6wi8V_{HeZEP9%+Slb+k3udE#mc#Y%9)G zr_9+boJp0SrsM0=q?R-(1W<9YiPz&!G*#IX-zQ|??)7v!SxDDM$p11QD@omHEx6^m zf7-+V>sjxD_X9V7{mWto{sx)n=fm&IqdH$KU6g55_nMY&(1f-t%qRPB z#oD!NvFUi4xX&9_tkHzl^j3Ib;F!G7=coAQODDi^g;%a2t9-wCjUIpH(Ufl(GWO{* U*;t-!5oDt+@=BhSx1O>81F>_%R{#J2 delta 2843 zcmZWreNao zbI(2ZoO92)9>2=tSDoBwWJV-;HyJ-wO={+;!tsu6vc|$acl_3-P+XRtJI46l(%VV_ z`j#s2YE+g-R+nW7sn%$L3f4G*4&os?gzZ#;?(&Y#j#X5R*7j4zs{9f)^XUF^%76fs ztVIv=0GMziYXGGi!_*zrv;tjRiMFjk^YZ~Bx63BSf%0pm=v`jsx$^VOU7lPk-^M)W z$*(swGYWxR-;l{H;JuNirAp?r9527|cMP+SCl@vyRiOnu$rjU?TREgiOb0E}CN7FP z%NOYSR+2knM&v#o?c=>{J654gz0?!NDe5Qz=lEg-a(QS-OM9Q?QCM&yliI3Ki?X?b&I9|l4HVsE>oaT zGZ=+t9MWyd5BOQU7VtjQogZ=>ZObR?YsbCq&!+=eqziE+9f!A2E#6Aoa22f8y5~Hy z=F=TkUQ0(>S83rc9UL999^o98P*_M$?HKi49?pSG{JnPE%#2*?Of4Oa?EodS_*fv3 z#mDKKusQTm3EhE>bR;hBP_!K8S{xi&Qb1Lv*)UVlad^Yh92@|-H6C1>p(^x)n&f%n%2`~l zz}11V00$lm_&7wxkxV1@7k@sHdfe`NSC991iJtcG zX^+fkylgbE+u(q`;Ay2p6(vrpv~bVlGWi&{J1ff#B(r`pV=N@A>)&P|)F0OWGU8&P z+d&T3r;sQ0V=`V87EI{N5;Houtmv*D-)2rXbv>-DoXgam4H!vNudl19AxG14_Pre@gPf9Q#~0@bXYkd-g-+o_4V6ow6fV zIXYa0aJ0#KnK=qYXuZUsA|qM4^A#o|mz3|Evb44YO3}}D`=B&;rUrV$R8uOtSNy{Z z?wEA@QO;oG74B))s6ayQiB8VmnmTYVT2fwV>Ev`aBfL(P4i}R4Sb}KRo>iaHAjCOTcmwG&;mM`;*F57{qOAXMgs?m|-ycA%Gk}N#$V(Z1%F? zTu>!NQiZ)&whQ(SxEmNr<2(>dZu<}Vt{6Z<8s1{g3FOZWQ{7WHe@_@S%3+a$jjNk8~(bm`4UQ z?9s+h+pBJzAlKTV#!T6%&l|^#f;OkXRZwRBt4z|57*Jae1Qzv zw!}Tx+j<%J|F~c1N$r7JtzFn-lwv(b>pX6*Qy|d?-;0-_0*?_`SV`f*WVOe*cxbL& zASVtQUP}(u5{vqPtsL)Wmqq!?T^_`AXjz)Znx=sO>P|Pwa(ndy zj;4@lbXl1Ep1Hu2+M{d0E$>%HMFv>!GB@N8-2CK^Wej|!ezBqn-Xa$Poan9a<}201jh Date: Mon, 15 May 2023 15:26:22 +0200 Subject: [PATCH 38/65] Little manual edit --- Manuals/MANUAL_EN.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Manuals/MANUAL_EN.md b/Manuals/MANUAL_EN.md index 2a5d50a..1fab3d9 100644 --- a/Manuals/MANUAL_EN.md +++ b/Manuals/MANUAL_EN.md @@ -222,13 +222,13 @@ The game has 8 difficulty levels of computer-controlled opponents. Or actually 7 * **Poolshark** - When attacking, he sets the nearest tank as his target, then selects the angle of the shot, and tries to select its strength by drawing it from the selected range. He always shoots with the best weapon he has. He uses defensive weapons. With a probability of 1:3, he activates the best defensive weapon he owns (the highest on the list of weapons he owns - that is, not necessarily the best) before firing. If his energy level drops below 30 units - he uses **Battery** (of course, if he bought it before), if the energy drops below 5 and he has no **Battery** he surrenders - **White Flag**. At the beginning of the round he makes 1 attemp to buy defensive weapons and 6 offensive weapons. -** **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. +* **Tosser** - When attacking, he acts exactly like **Poolshark** however, he may have a "better" weapon inventory due to a different purchase tactic. He always activates the best defensive weapon he has before shooting. And just like **Poolshark** he uses **Battery** and **White Flag**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/1250) attempts to buy offensive weapons. -** **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**. +* **Chooser** - Takes as a target the weakest opponent (with the least amount of energy) and aims very precisely, but before the shot the energy of the shot is modified by the parameter of luck :) , that is, despite the precise aiming it does not always hit. He shoots with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He always activates the best defensive weapon he has before shooting and, like **Poolshark**, uses **Battery** and **White Flag**. He purchases just like **Tosser**. * **Spoiler** - He shoots exactly like **Chooser** except that he has more luck :) , which means that even if he doesn't hit the target of his choice, it can be a more precise shot than **Chooser**. He uses defensive weapons exactly like **Chooser**. At the beginning of the round, he assesses how much money he has and depending on that, he makes (money/5100) attempts to buy defensive weapons and then checks again how much money he has left and makes (money/320) attempts to buy offensive weapons. When buying defensive weapons, he buys only strong and precise weapons - that is, weapons that won't accidentally hurt him. -** **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**. +* **Cyborg** - Takes aim at the weakest opponent (with the least amount of energy) but prefers human-controlled opponents. Aims very accurately and in the vast majority of cases hits on the first shot. He fires the shot with the best weapon he has unless the target is close. Then he changes his weapon to **Baby Missile** to avoid hitting himself. He uses defensive weapons exactly like **Chooser**. He shops exactly like **Spoiler**. * **Unknown** - Before firing each shot, he randomly chooses a course of action from **Poolshark** to **Cyborg** and applies his tactics. However, the tactics of weapon purchases are always identical to **Tosser**. From ce6f7b3406b6d249b9b307dcc58858cfc9c39e95 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 18:15:56 +0200 Subject: [PATCH 39/65] Better C64 code --- C64/textproc.asm | 230 +---------------------------------------------- scorchC64.prg | Bin 39675 -> 39679 bytes 2 files changed, 4 insertions(+), 226 deletions(-) diff --git a/C64/textproc.asm b/C64/textproc.asm index 991f3aa..877c1f8 100644 --- a/C64/textproc.asm +++ b/C64/textproc.asm @@ -55,66 +55,6 @@ NoGradientLoop rts .endp -; -------------------------------------- -; Sets the appropriate variables based on the options table -; -.proc SetVariablesFromOptions - ;first option - ldy OptionsTable - iny - iny - sty NumberOfPlayers ;1=1 player (but minimum is 2) - - ;second option (cash) - - - ldy OptionsTable+1 - ldx #0 -@ - lda CashOptionL,y - sta moneyL,x - lda CashOptionH,y - sta moneyH,x - inx - cpx NumberOfPlayers - bne @- - - ;third option (gravity) - ldy OptionsTable+2 - lda GravityTable,y - sta gravity - - ;fourth option (wind) - ldy OptionsTable+3 - lda MaxWindTable,y - sta MaxWind - - ;fifth option (no of rounds) - ldy OptionsTable+4 - lda RoundsTable,y - sta RoundsInTheGame - - ;6th option (shell speed) - ldy OptionsTable+5 - lda flyDelayTable,y - sta flyDelay - - ;7th option (Airstrike after how many missess) - ldy OptionsTable+6 - lda seppukuTable,y - sta seppukuVal - - ;8th option (how aggressive are mountains) - ldy OptionsTable+7 - lda mountainsDeltaTableH,y - sta mountainDeltaH - lda mountainsDeltaTableL,y - sta mountainDeltaL - - - rts -.endp - ;------------------------------------------- ; call of the purchase (and activate) screens for each tank .proc CallPurchaseForEveryTank @@ -364,177 +304,15 @@ displayloop1 rts .endp - -;-------------------------------- -.proc DisplayResults ; -;displays results of the round -;using 4x4 font - - - mva #$ff plot4x4color - - ;centering the result screen - mva #((ScreenHeight/2)-(8*4)) ResultY - - - ;upper frame - mva ResultY LineYdraw - jsr TL4x4_top - - adb ResultY #4 ;next line - - ;Header1 - ;Displays round number - lda CurrentRoundNr - cmp RoundsInTheGame - beq GameOver4x4 - - sta decimal - mwa #RoundNrDisplay displayposition - jsr displaybyte ;decimal (byte), displayposition (word) - - mwa #LineHeader1 LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - beq @+ ;unconditional jump, because TypeLine4x4 ends with beq - -GameOver4x4 - RmtSong song_round_over - mwa #LineGameOver LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - mva #1 GameIsOver - -@ - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - adb ResultY #2 ;next line - - - ;Header2 - mwa #LineHeader2 LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - sbb ResultY #2 ;next line (was empty) - - ldx NumberOfPlayers ;we start from the highest (best) tank - dex ;and it is the last one - stx ResultOfTankNr ;in TankSequence table - - mwa #TanksNames tempXROLLER - -ResultOfTheNextPlayer - ldx ResultOfTankNr ;we are after a round, so we can use TankNr - lda TankSequence,x ;and we keep here real number if the tank - sta TankNr ;for which we are displaying results - - - - - adb ResultY #4 ;next line - - ;there are at least 2 players, so we can safely - ;start displaying the result - - lda #3 ;it means | - sta ResultLineBuffer - - ldy TankNr - lda ResultsTable,y - sta decimal - mva #0 decimal+1 - mwa #(ResultLineBuffer+8) displayposition - jsr displaydec5 ;decimal (byte), displayposition (word) - - ; overwrite the second digit of the points (max 255) - ;it means ":" - mva #26 ResultLineBuffer+9 - - ldx #0 - lda TankNr - asl - asl ; times 8, because it is lengtgh - asl ; of the names of the tanks - tay - -TankNameCopyLoop - lda (tempXROLLER),y ;XROLLER is not working now - and #$3f ;always CAPITAL letters - inx - sta ResultLineBuffer,x - iny - cpx #8 ; end of name - bne TankNameCopyLoop - ; last letter of tank name overwrites first digit of the points (max 255) - - - ;just after the digits - ;it means | - mva #$3 ResultLineBuffer+13 - - ;result line display - mwa #ResultLineBuffer LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - mva ResultY LineYdraw - jsr TypeLine4x4 - - adb ResultY #4 ;next line - - ;Empty line - mva ResultY LineYdraw - jsr TL4x4_empty - - dec ResultOfTankNr - bmi FinishResultDisplay - - sbb ResultY #2 ;distance between lines is smaller - - jmp ResultOfTheNextPlayer - -FinishResultDisplay - mva ResultY LineYdraw - ;jmp TL4x4_bottom ; just go -.endp - -.proc TL4x4_bottom - ;bottom of the frame - mwa #LineBottom LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts -.endp - -.proc TL4x4_top - ;bottom of the frame - mwa #LineTop LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts -.endp - -.proc TL4x4_empty - ;empty frame - mwa #LineEmpty LineAddress4x4 - mwa #((ScreenWidth/2)-(8*4)) LineXdraw - jmp TypeLine4x4 ; jsr:rts +;------------------------------------------------- +.proc RoundOverSprites + ; fill sprites with bytes + rts .endp ;-------------------------------------------------- .proc GameOverScreen ;-------------------------------------------------- - rts .endp ;------------------------------------------------- diff --git a/scorchC64.prg b/scorchC64.prg index 303910fd0630673435c79cad281e2a1bd5100fba..1dbe01dc76ad678ec2cd6551e5ff88c1e0800b31 100644 GIT binary patch delta 5782 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 delta 5811 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 aMN8TBSo-V!@V=}?9Wn6N1k%1Q^?w1_5FLvE From d17d49c5f0be05b76544bf85d519aea709aac7e9 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 19:54:22 +0200 Subject: [PATCH 40/65] Code cleanup and native graphics routines for C64 (almost). --- Atari/gr_basics.asm | 355 +++++++++++++++++++++++++ C64/gr_basics.asm | 358 +++++++++++++++++++++++++ C64/gr_basics.lab | 6 + C64/gr_basics.lst | 622 ++++++++++++++++++++++++++++++++++++++++++++ grafproc.asm | 357 ------------------------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56625 -> 56625 bytes scorchC64.asm | 2 +- scorchC64.prg | Bin 39679 -> 39807 bytes 9 files changed, 1342 insertions(+), 358 deletions(-) create mode 100644 C64/gr_basics.lab create mode 100644 C64/gr_basics.lst diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 71cf658..26ec81c 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -189,6 +189,361 @@ ClearPlot and bittable,x rts .endp +;-------------------------------------------------- +.proc drawmountains +;-------------------------------------------------- + mwa #0 xdraw + mwa #mountaintable modify + mva #1 color + +drawmountainsloop + ldy #0 + lda (modify),y + cmp #screenheight + beq NoMountain + sta ydraw + sty ydraw+1 +.IF FASTER_GRAF_PROCS = 1 +; there was Drawline proc + lda #screenheight + sec + sbc ydraw + sta tempbyte01 + jsr plot.MakePlot + ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) +; jmp IntoDraw ; jumps inside Draw routine + ; because one pixel is already plotted (and who cares? :) ) +@ + lda (xbyte),y + and bittable2,x + sta (xbyte),y +;IntoDraw + adw xbyte #screenBytes + dec tempbyte01 + bne @- +; end of Drawline proc +.ELSE +; there was Drawline proc +drawline + jsr plot.MakePlot + inc ydraw + lda ydraw + cmp #screenheight + bne drawline +; end of Drawline proc +.ENDIF +NoMountain + inw modify + inw xdraw + cpw xdraw #screenwidth + bne drawmountainsloop + rts +.endp +;-------------------------------------------------- +.proc TypeChar +; puts char on the graphics screen +; in: CharCode +; in: left LOWER corner of the char coordinates (xdraw, ydraw) +;-------------------------------------------------- + ; char to the table + lda CharCode + sta fontind + lda #$00 + sta fontind+1 + ; char intex times 8 + aslw fontind + rolw fontind + rolw fontind + + adw fontind #TankFont + + ; and 8 bytes to the table + ldy #7 +CopyChar + lda (fontind),y + eor #$ff + sta char1,y + lda #$ff + sta char2,y + dey + bpl CopyChar + ; and 8 subsequent bytes as a mask + adw fontind #8 + ldy #7 +CopyMask + lda (fontind),y + eor #$ff + sta mask1,y + lda #$00 + sta mask2,y + dey + bpl CopyMask + +.IF FASTER_GRAF_PROCS = 1 + ; calculating coordinates from xdraw and ydraw + mwa xdraw xbyte + + lda xbyte + and #$7 + sta ybit + + lsrw xbyte ; div 8 + rorw xbyte + rorw xbyte +;--- + ldy xbyte + + lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? + sec + sbc #7 + tax + + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + ; mask preparation and character shifting + ldx ybit + beq MaskOK00 +MakeMask00 + .rept 8 + lsr mask1+# + ror mask2+# + .endr + sec + .rept 8 + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char2+# + .endr + dex + bne MakeMask00 +MaskOK00 + ; here x=0 + lda Erase + beq CharLoopi ; it works, because x=0 + lda #$ff + ldx #7 +EmptyChar + sta char1,x + sta char2,x + dex + bpl EmptyChar + ldx #0 +CharLoopi + lda (xbyte),y + ora mask1,x + and char1,x + sta (xbyte),y + iny + lda (xbyte),y + ora mask2,x + and char2,x + sta (xbyte),y + dey + adw xbyte #screenBytes + inx + cpx #8 + bne CharLoopi +.ELSE + mvx #7 temp ; line counter (Y) +CharLoop1 + mva #7 temp+1 ; pixel counter (X) +CharLoop2 + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot +MakeCharPlot + lda Erase + bne ErasingChar + inc color +ErasingChar +NoPlot + jsr plot.MakePlot +AfterCharPlot + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #8 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + clc + lda ydraw + adc #8 + sta ydraw + bne EndPutChar +NoMaskNoPlot + rol char1,x + jmp AfterCharPlot +.ENDIF +EndPutChar + rts +.endp + +;-------------------------------------------------- +.proc PutChar4x4 +; puts 4x4 pixels char on the graphics screen +; in: dx, dy (LOWER left corner of the char) +; in: CharCode4x4 (.sbyte) +; in: plot4x4color (0/255) +; all pixels are being drawn +; (empty and not empty) +;-------------------------------------------------- + cpw dy #(screenheight-1) + jcs TypeChar.EndPutChar ;nearest RTS + cpw dy #(4) + jcc TypeChar.EndPutChar ;nearest RTS + cpw dx #(screenwidth-4) + jcs TypeChar.EndPutChar ;nearest RTS + ; checks ommited. + ; char to the table + lda CharCode4x4 + and #%00000001 + beq Upper4bits + lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) +Upper4bits + sta nibbler4x4 + lda CharCode4x4 + lsr + sta fontind + lda #$00 + sta fontind+1 + + adw fontind #font4x4 + + ; and 4 bytes to the table + ldy #0 + ldx #3 +CopyChar + lda (fontind),y ; Y must be 0 !!!! + bit nibbler4x4 + bpl GetUpper4bits + :4 rol +GetUpper4bits + ora #$0f + sta char1,x + lda #$ff + sta char2,x + ; and 4 bytes as a mask + lda #$f0 + sta mask1,x + lda #$00 + sta mask2,x + adw fontind #32 ; next byte of 4x4 font + dex + bpl CopyChar + +.IF FASTER_GRAF_PROCS = 1 + ; calculating coordinates from xdraw and ydraw + mwa dx xbyte + + lda xbyte + and #$7 + sta ybit + + :3 lsrw xbyte ; div 8 +; rorw xbyte +; rorw xbyte +;--- + ldy xbyte ; horizontal byte offet stored in Y + lda dy ; y = y - 3 because left lower. + sec + sbc #3 + tax + + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + ; mask preparation and character shifting + ldx ybit + beq MaskOK01 +MakeMask01 + .rept 4 + lsr mask1+# + ror mask2+# + .endr + sec + .rept 4 + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char2+# + .endr + dex + bne MakeMask01 +MaskOK01 + ldx #0 +CharLoopi4x4 + lda (xbyte),y + ora mask1,x + bit plot4x4color + bpl PutInColor0_1 ; only mask - no char + and char1,x +PutInColor0_1 + sta (xbyte),y + iny + lda (xbyte),y + ora mask2,x + bit plot4x4color + bpl PutInColor0_2 ; only mask - no char + and char2,x +PutInColor0_2 + sta (xbyte),y + dey + adw xbyte #screenBytes + inx + cpx #4 + bne CharLoopi4x4 +.ELSE + mwa xdraw char2 + mwa ydraw mask2 + mva color mask2+2 + mwa dx xdraw + mwa dy ydraw + mvx #3 temp ; line counter (Y) +CharLoop1 + mva #3 temp+1 ; pixel counter (X) +CharLoop2 + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot +MakeCharPlot + lda plot4x4color + beq ErasingChar + inc color +ErasingChar +NoPlot + jsr plot.MakePlot +AfterCharPlot + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #4 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + mwa char2 xdraw + mwa mask2 ydraw + mva mask2+2 color + bpl EndPut4x4 +NoMaskNoPlot + rol char1,x + jmp AfterCharPlot +.ENDIF +EndPut4x4 + rts +.endp ;-------------------------------------------------- .proc ClearScreen diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index 5c29ac6..a6fcdcc 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -176,6 +176,364 @@ ClearPlot and bittable,x rts .endp +;-------------------------------------------------- +.proc drawmountains +;-------------------------------------------------- + mwa #0 xdraw + mwa #mountaintable modify + mva #1 color + +drawmountainsloop + ldy #0 + lda (modify),y + cmp #screenheight + beq NoMountain + sta ydraw + sty ydraw+1 +.IF FASTER_GRAF_PROCS = 1 +; there was Drawline proc + lda #screenheight + sec + sbc ydraw + sta tempbyte01 + jsr plot.MakePlot + ; X - index in bittable (number of bit) and nothing more (for use) in C64 :) +; jmp IntoDraw ; jumps inside Draw routine + ; because one pixel is already plotted (and who cares? :) ) +@ + lda (xbyte),y + and bittable2,x + sta (xbyte),y +;IntoDraw + inc ydraw + lda xdraw + and #%11111000 + ;sta xbyte + ;--- + ldy ydraw + clc + adc linetableL,y + sta xbyte + lda linetableH,y + adc xdraw+1 + sta xbyte+1 + ldy #0 + dec tempbyte01 + bne @- +; end of Drawline proc +.ELSE +; there was Drawline proc +drawline + jsr plot.MakePlot + inc ydraw + lda ydraw + cmp #screenheight + bne drawline +; end of Drawline proc +.ENDIF +NoMountain + inw modify + inw xdraw + cpw xdraw #screenwidth + bne drawmountainsloop + rts +.endp +;-------------------------------------------------- +.proc TypeChar +; puts char on the graphics screen +; in: CharCode +; in: left LOWER corner of the char coordinates (xdraw, ydraw) +;-------------------------------------------------- + ; char to the table + lda CharCode + sta fontind + lda #$00 + sta fontind+1 + ; char intex times 8 + aslw fontind + rolw fontind + rolw fontind + + adw fontind #TankFont + + ; and 8 bytes to the table + ldy #7 +CopyChar + lda (fontind),y + eor #$ff + sta char1,y + lda #$ff + sta char2,y + dey + bpl CopyChar + ; and 8 subsequent bytes as a mask + adw fontind #8 + ldy #7 +CopyMask + lda (fontind),y + eor #$ff + sta mask1,y + lda #$00 + sta mask2,y + dey + bpl CopyMask + +.IF FASTER_GRAF_PROCS = 1 + ; mask preparation and character shifting + lda xdraw + and #$7 + tax + beq MaskOK00 +MakeMask00 + .rept 8 + lsr mask1+# + ror mask2+# + .endr + sec + .rept 8 + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char2+# + .endr + dex + bne MakeMask00 +MaskOK00 + lda ydraw + sec + sbc #7 + sta ydraw + ; X = 0 ! + lda Erase + beq CharLoopi ; it works, because x=0 + lda #$ff + ldx #7 +EmptyChar + sta char1,x + sta char2,x + dex + bpl EmptyChar + ldx #0 +CharLoopi + ; calculating coordinates from xdraw and ydraw + ldy ydraw + lda xdraw + and #%11111000 + clc + adc linetableL,y + sta xbyte + lda linetableH,y + adc xdraw+1 + sta xbyte+1 +;-- + ldy #0 + lda (xbyte),y + ora mask1,x + and char1,x + sta (xbyte),y + ldy #8 + lda (xbyte),y + ora mask2,x + and char2,x + sta (xbyte),y + inc ydraw + inx + cpx #8 + bne CharLoopi +.ELSE + mvx #7 temp ; line counter (Y) +CharLoop1 + mva #7 temp+1 ; pixel counter (X) +CharLoop2 + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot +MakeCharPlot + lda Erase + bne ErasingChar + inc color +ErasingChar +NoPlot + jsr plot.MakePlot +AfterCharPlot + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #8 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + clc + lda ydraw + adc #8 + sta ydraw + bne EndPutChar +NoMaskNoPlot + rol char1,x + jmp AfterCharPlot +.ENDIF +EndPutChar + rts +.endp + +;-------------------------------------------------- +.proc PutChar4x4 +; puts 4x4 pixels char on the graphics screen +; in: dx, dy (LOWER left corner of the char) +; in: CharCode4x4 (.sbyte) +; in: plot4x4color (0/255) +; all pixels are being drawn +; (empty and not empty) +;-------------------------------------------------- + cpw dy #(screenheight-1) + jcs TypeChar.EndPutChar ;nearest RTS + cpw dy #(4) + jcc TypeChar.EndPutChar ;nearest RTS + cpw dx #(screenwidth-4) + jcs TypeChar.EndPutChar ;nearest RTS + ; checks ommited. + ; char to the table + lda CharCode4x4 + and #%00000001 + beq Upper4bits + lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) +Upper4bits + sta nibbler4x4 + lda CharCode4x4 + lsr + sta fontind + lda #$00 + sta fontind+1 + + adw fontind #font4x4 + + ; and 4 bytes to the table + ldy #0 + ldx #3 +CopyChar + lda (fontind),y ; Y must be 0 !!!! + bit nibbler4x4 + bpl GetUpper4bits + :4 rol +GetUpper4bits + ora #$0f + sta char1,x + lda #$ff + sta char2,x + ; and 4 bytes as a mask + lda #$f0 + sta mask1,x + lda #$00 + sta mask2,x + adw fontind #32 ; next byte of 4x4 font + dex + bpl CopyChar + +.IF FASTER_GRAF_PROCS = 1 + ; mask preparation and character shifting + lda dx + and #$7 + tax + beq MaskOK01 +MakeMask01 + .rept 4 + lsr mask1+# + ror mask2+# + .endr + sec + .rept 4 + ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + ror char2+# + .endr + dex + bne MakeMask01 +MaskOK01 + lda dy + sec + sbc #3 + sta dy + ldx #0 +CharLoopi4x4 + ; calculating coordinates from xdraw and ydraw + ldy dy + lda dx + and #%11111000 + clc + adc linetableL,y + sta xbyte + lda linetableH,y + adc dx+1 + sta xbyte+1 +;-- + ldy #0 + lda (xbyte),y + ora mask1,x + bit plot4x4color + bpl PutInColor0_1 ; only mask - no char + and char1,x +PutInColor0_1 + sta (xbyte),y + ldy #8 + lda (xbyte),y + ora mask2,x + bit plot4x4color + bpl PutInColor0_2 ; only mask - no char + and char2,x +PutInColor0_2 + sta (xbyte),y + inc dy + inx + cpx #4 + bne CharLoopi4x4 +.ELSE + mwa xdraw char2 + mwa ydraw mask2 + mva color mask2+2 + mwa dx xdraw + mwa dy ydraw + mvx #3 temp ; line counter (Y) +CharLoop1 + mva #3 temp+1 ; pixel counter (X) +CharLoop2 + mva #0 color + rol mask1,x + bcc NoMaskNoPlot + rol char1,x + bcs NoPlot +MakeCharPlot + lda plot4x4color + beq ErasingChar + inc color +ErasingChar +NoPlot + jsr plot.MakePlot +AfterCharPlot + inw xdraw + ldx temp + dec temp+1 + bpl CharLoop2 + sec + sbw xdraw #4 + dec ydraw + ldx temp + dex + stx temp + bpl CharLoop1 + mwa char2 xdraw + mwa mask2 ydraw + mva mask2+2 color + bpl EndPut4x4 +NoMaskNoPlot + rol char1,x + jmp AfterCharPlot +.ENDIF +EndPut4x4 + rts +.endp ;-------------------------------------------------- .proc ClearScreen diff --git a/C64/gr_basics.lab b/C64/gr_basics.lab new file mode 100644 index 0000000..11e4cb2 --- /dev/null +++ b/C64/gr_basics.lab @@ -0,0 +1,6 @@ +mads 2.1.5 build 3 (21 Feb 22) +Label table: +00 FFFF0001 0@ +00 FFFF0001 1@ +00 FFFF0001 2@ +00 FFFF0001 3@ diff --git a/C64/gr_basics.lst b/C64/gr_basics.lst new file mode 100644 index 0000000..4cf64c6 --- /dev/null +++ b/C64/gr_basics.lst @@ -0,0 +1,622 @@ +mads 2.1.5 build 3 (21 Feb 22) +Source: gr_basics.asm + 1 .IF *>0 ;this is a trick that prevents compiling this file alone + 2 + 3 ; Basic hardware-dependent graphics routines. + 4 + 5 ; ----------------------------------------- + 6 .proc unPlot + 7 ; plots a point and saves the plotted byte, reverts the previous plot. + 8 ; ----------------------------------------- + 9 ldx #0 ; only one pixel + 10 unPlotAfterX + 11 stx WhichUnPlot + 12 + 13 ; first remake the oldie + 14 lda oldplotL,x + 15 sta oldplot + 16 lda oldplotH,x + 17 sta oldplot+1 + 18 + 19 ldy #0 + 20 lda oldora,x + 21 sta (oldplot),y + 22 + 23 + 24 ; is it not out of the screen ???? + 25 cpw ydraw #screenheight + 26 jcc CheckX + 27 mwa #0 ydraw + 28 CheckX + 29 cpw xdraw #screenwidth + 30 jcs EndOfUnPlot + 31 MakeUnPlot + 32 ; let's count coordinates taken from xdraw and ydraw + 33 lda xdraw + 34 and #%11111000 + 35 ;sta xbyte + 36 ;--- + 37 ldx ydraw + 38 clc + 39 adc linetableL,x + 40 sta xbyte + 41 sta oldplot + 42 lda linetableH,x + 43 adc xdraw+1 + 44 sta xbyte+1 + 45 sta oldplot+1 + 46 + 47 lda xdraw + 48 and #$7 + 49 tax + 50 ldy #0 + 51 + 52 lda color + 53 bne ClearUnPlot + 54 + 55 ;plotting here + 56 lda (xbyte),y + 57 sta OldOraTemp + 58 ora bittable,x + 59 sta (xbyte),y + 60 bne ContinueUnPlot ; allways <>0 + 61 ClearUnPlot + 62 lda (xbyte),y + 63 sta OldOraTemp + 64 and bittable2,x + 65 sta (xbyte),y + 66 ContinueUnPlot + 67 ldx WhichUnPlot + 68 lda OldOraTemp + 69 sta oldora,x + 70 lda oldplot + 71 sta oldplotL,x + 72 lda oldplot+1 + 73 sta oldplotH,x + 74 ; and now we must solve the problem of several plots + 75 ; in one byte + 76 ldx #4 + 77 ldy WhichUnPlot + 78 LetsCheckOverlapping + 79 cpx WhichUnPlot + 80 beq SkipThisPlot + 81 lda oldplotL,x + 82 cmp oldplotL,y + 83 bne NotTheSamePlot + 84 lda oldplotH,x + 85 cmp oldplotH,y + 86 bne NotTheSamePlot + 87 ; the pixel is in the same byte so let's take correct contents + 88 lda oldora,x + 89 sta oldora,y + 90 NotTheSamePlot + 91 SkipThisPlot + 92 dex + 93 bpl LetsCheckOverlapping + 94 EndOfUnPlot + 95 rts + 96 .endp + 97 + 98 ; ----------------------------------------- + 99 .proc plot ;plot (xdraw, ydraw, color) + 100 ; color == 1 --> put pixel + 101 ; color == 0 --> erase pixel + 102 ; this is one of the most important routines in the whole + 103 ; game. If you are going to speed up the game, start with + 104 ; plot - it is used by every single effect starting from explosions + 105 ; through line drawing and small text output!!! + 106 ; + 107 ; Optimized by 0xF (Fox) THXXXX!!! + 108 + 109 ; ----------------------------------------- + 110 ; is it not over the screen ??? + 111 cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + 112 bcs unPlot.EndOfUnPlot ;nearest RTS + 113 CheckX02 + 114 cpw xdraw #screenwidth + 115 bcs EndOfPlot + 116 MakePlot + 117 ; let's calculate coordinates from xdraw and ydraw + 118 + 119 lda xdraw + 120 and #%11111000 + 121 ;sta xbyte + 122 ;--- + 123 ldx ydraw + 124 clc + 125 adc linetableL,x + 126 sta xbyte + 127 lda linetableH,x + 128 adc xdraw+1 + 129 sta xbyte+1 + 130 + 131 lda xdraw + 132 and #$7 + 133 tax + 134 ldy #0 + 135 lda color + 136 bne ClearPlot + 137 + 138 lda (xbyte),y + 139 ora bittable,x + 140 sta (xbyte),y + 141 EndOfPlot + 142 rts + 143 ClearPlot + 144 lda (xbyte),y + 145 and bittable2,x + 146 sta (xbyte),y + 147 rts + 148 .endp + 149 + 150 ; ----------------------------------------- + 151 .proc point_plot + 152 ; ----------------------------------------- + 153 ; checks state of the pixel (coordinates in xdraw and ydraw) + 154 ; result is in A (zero or appropriate bit is set) + 155 + 156 ; let's calculate coordinates from xdraw and ydraw + 157 + 158 lda xdraw + 159 and #%11111000 + 160 ;sta xbyte + 161 ;--- + 162 ldx ydraw + 163 clc + 164 adc linetableL,x + 165 sta xbyte + 166 lda linetableH,x + 167 adc xdraw+1 + 168 sta xbyte+1 + 169 + 170 lda xdraw + 171 and #$7 + 172 tax + 173 ldy #0 + 174 lda (xbyte),y + 175 eor #$ff + 176 and bittable,x + 177 rts + 178 .endp + 179 ;-------------------------------------------------- + 180 .proc drawmountains + 181 ;-------------------------------------------------- + 182 mwa #0 xdraw + 183 mwa #mountaintable modify + 184 mva #1 color + 185 + 186 drawmountainsloop + 187 ldy #0 + 188 lda (modify),y + 189 cmp #screenheight + 190 beq NoMountain + 191 sta ydraw + 192 sty ydraw+1 + 193 .IF FASTER_GRAF_PROCS = 1 + 194 ; there was Drawline proc + 195 lda #screenheight + 196 sec + 197 sbc ydraw + 198 sta tempbyte01 + 199 jsr plot.MakePlot + 200 ; X - index in bittable (number of bit) and nothing more (for use) in C64 :) + 201 ; jmp IntoDraw ; jumps inside Draw routine + 202 ; because one pixel is already plotted (and who cares? :) ) + 203 @ + 204 lda (xbyte),y + 205 and bittable2,x + 206 sta (xbyte),y + 207 ;IntoDraw + 208 inc ydraw + 209 lda xdraw + 210 and #%11111000 + 211 ;sta xbyte + 212 ;--- + 213 ldy ydraw + 214 clc + 215 adc linetableL,y + 216 sta xbyte + 217 lda linetableH,y + 218 adc xdraw+1 + 219 sta xbyte+1 + 220 ldy #0 + 221 dec tempbyte01 + 222 bne @- + 223 ; end of Drawline proc + 224 .ELSE + 225 ; there was Drawline proc + 226 drawline + 227 jsr plot.MakePlot + 228 inc ydraw + 229 lda ydraw + 230 cmp #screenheight + 231 bne drawline + 232 ; end of Drawline proc + 233 .ENDIF + 234 NoMountain + 235 inw modify + 236 inw xdraw + 237 cpw xdraw #screenwidth + 238 bne drawmountainsloop + 239 rts + 240 .endp + 241 ;-------------------------------------------------- + 242 .proc TypeChar + 243 ; puts char on the graphics screen + 244 ; in: CharCode + 245 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) + 246 ;-------------------------------------------------- + 247 ; char to the table + 248 lda CharCode + 249 sta fontind + 250 lda #$00 + 251 sta fontind+1 + 252 ; char intex times 8 + 253 aslw fontind + 254 rolw fontind + 255 rolw fontind + 256 + 257 adw fontind #TankFont + 258 + 259 ; and 8 bytes to the table + 260 ldy #7 + 261 CopyChar + 262 lda (fontind),y + 263 eor #$ff + 264 sta char1,y + 265 lda #$ff + 266 sta char2,y + 267 dey + 268 bpl CopyChar + 269 ; and 8 subsequent bytes as a mask + 270 adw fontind #8 + 271 ldy #7 + 272 CopyMask + 273 lda (fontind),y + 274 eor #$ff + 275 sta mask1,y + 276 lda #$00 + 277 sta mask2,y + 278 dey + 279 bpl CopyMask + 280 + 281 .IF FASTER_GRAF_PROCS = 1 + 282 ; mask preparation and character shifting + 283 lda xdraw + 284 and #$7 + 285 tax + 286 beq MaskOK00 + 287 MakeMask00 + 288 .rept 8 + 289 lsr mask1+# + 290 ror mask2+# + 291 .endr + 292 sec + 293 .rept 8 + 294 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 295 ror char2+# + 296 .endr + 297 dex + 298 bne MakeMask00 + 299 MaskOK00 + 300 lda ydraw + 301 sec + 302 sbc #8 + 303 sta ydraw + 304 ; X = 0 ! + 305 lda Erase + 306 beq CharLoopi ; it works, because x=0 + 307 lda #$ff + 308 ldx #7 + 309 EmptyChar + 310 sta char1,x + 311 sta char2,x + 312 dex + 313 bpl EmptyChar + 314 ldx #0 + 315 CharLoopi + 316 ; calculating coordinates from xdraw and ydraw + 317 ldy ydraw + 318 lda xdraw + 319 and #%11111000 + 320 clc + 321 adc linetableL,y + 322 sta xbyte + 323 lda linetableH,y + 324 adc xdraw+1 + 325 sta xbyte+1 + 326 ;-- + 327 ldy #0 + 328 lda (xbyte),y + 329 ora mask1,x + 330 and char1,x + 331 sta (xbyte),y + 332 ldy #8 + 333 lda (xbyte),y + 334 ora mask2,x + 335 and char2,x + 336 sta (xbyte),y + 337 inc ydraw + 338 inx + 339 cpx #8 + 340 bne CharLoopi + 341 .ELSE + 342 mvx #7 temp ; line counter (Y) + 343 CharLoop1 + 344 mva #7 temp+1 ; pixel counter (X) + 345 CharLoop2 + 346 mva #0 color + 347 rol mask1,x + 348 bcc NoMaskNoPlot + 349 rol char1,x + 350 bcs NoPlot + 351 MakeCharPlot + 352 lda Erase + 353 bne ErasingChar + 354 inc color + 355 ErasingChar + 356 NoPlot + 357 jsr plot.MakePlot + 358 AfterCharPlot + 359 inw xdraw + 360 ldx temp + 361 dec temp+1 + 362 bpl CharLoop2 + 363 sec + 364 sbw xdraw #8 + 365 dec ydraw + 366 ldx temp + 367 dex + 368 stx temp + 369 bpl CharLoop1 + 370 clc + 371 lda ydraw + 372 adc #8 + 373 sta ydraw + 374 bne EndPutChar + 375 NoMaskNoPlot + 376 rol char1,x + 377 jmp AfterCharPlot + 378 .ENDIF + 379 EndPutChar + 380 rts + 381 .endp + 382 + 383 ;-------------------------------------------------- + 384 .proc PutChar4x4 + 385 ; puts 4x4 pixels char on the graphics screen + 386 ; in: dx, dy (LOWER left corner of the char) + 387 ; in: CharCode4x4 (.sbyte) + 388 ; in: plot4x4color (0/255) + 389 ; all pixels are being drawn + 390 ; (empty and not empty) + 391 ;-------------------------------------------------- + 392 cpw dy #(screenheight-1) + 393 jcs TypeChar.EndPutChar ;nearest RTS + 394 cpw dy #(4) + 395 jcc TypeChar.EndPutChar ;nearest RTS + 396 cpw dx #(screenwidth-4) + 397 jcs TypeChar.EndPutChar ;nearest RTS + 398 ; checks ommited. + 399 ; char to the table + 400 lda CharCode4x4 + 401 and #%00000001 + 402 beq Upper4bits + 403 lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) + 404 Upper4bits + 405 sta nibbler4x4 + 406 lda CharCode4x4 + 407 lsr + 408 sta fontind + 409 lda #$00 + 410 sta fontind+1 + 411 + 412 adw fontind #font4x4 + 413 + 414 ; and 4 bytes to the table + 415 ldy #0 + 416 ldx #3 + 417 CopyChar + 418 lda (fontind),y ; Y must be 0 !!!! + 419 bit nibbler4x4 + 420 bpl GetUpper4bits + 421 :4 rol + 422 GetUpper4bits + 423 ora #$0f + 424 sta char1,x + 425 lda #$ff + 426 sta char2,x + 427 ; and 4 bytes as a mask + 428 lda #$f0 + 429 sta mask1,x + 430 lda #$00 + 431 sta mask2,x + 432 adw fontind #32 ; next byte of 4x4 font + 433 dex + 434 bpl CopyChar + 435 + 436 .IF FASTER_GRAF_PROCS = 1 + 437 ; calculating coordinates from xdraw and ydraw + 438 mwa dx xbyte + 439 + 440 lda xbyte + 441 and #$7 + 442 sta ybit + 443 + 444 :3 lsrw xbyte ; div 8 + 445 ; rorw xbyte + 446 ; rorw xbyte + 447 ;--- + 448 ldy xbyte ; horizontal byte offet stored in Y + 449 lda dy ; y = y - 3 because left lower. + 450 sec + 451 sbc #3 + 452 tax + 453 + 454 lda linetableL,x + 455 sta xbyte + 456 lda linetableH,x + 457 sta xbyte+1 + 458 ; mask preparation and character shifting + 459 ldx ybit + 460 beq MaskOK01 + 461 MakeMask01 + 462 .rept 4 + 463 lsr mask1+# + 464 ror mask2+# + 465 .endr + 466 sec + 467 .rept 4 + 468 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 469 ror char2+# + 470 .endr + 471 dex + 472 bne MakeMask01 + 473 MaskOK01 + 474 ldx #0 + 475 CharLoopi4x4 + 476 lda (xbyte),y + 477 ora mask1,x + 478 bit plot4x4color + 479 bpl PutInColor0_1 ; only mask - no char + 480 and char1,x + 481 PutInColor0_1 + 482 sta (xbyte),y + 483 iny + 484 lda (xbyte),y + 485 ora mask2,x + 486 bit plot4x4color + 487 bpl PutInColor0_2 ; only mask - no char + 488 and char2,x + 489 PutInColor0_2 + 490 sta (xbyte),y + 491 dey + 492 adw xbyte #screenBytes + 493 inx + 494 cpx #4 + 495 bne CharLoopi4x4 + 496 .ELSE + 497 mwa xdraw char2 + 498 mwa ydraw mask2 + 499 mva color mask2+2 + 500 mwa dx xdraw + 501 mwa dy ydraw + 502 mvx #3 temp ; line counter (Y) + 503 CharLoop1 + 504 mva #3 temp+1 ; pixel counter (X) + 505 CharLoop2 + 506 mva #0 color + 507 rol mask1,x + 508 bcc NoMaskNoPlot + 509 rol char1,x + 510 bcs NoPlot + 511 MakeCharPlot + 512 lda plot4x4color + 513 beq ErasingChar + 514 inc color + 515 ErasingChar + 516 NoPlot + 517 jsr plot.MakePlot + 518 AfterCharPlot + 519 inw xdraw + 520 ldx temp + 521 dec temp+1 + 522 bpl CharLoop2 + 523 sec + 524 sbw xdraw #4 + 525 dec ydraw + 526 ldx temp + 527 dex + 528 stx temp + 529 bpl CharLoop1 + 530 mwa char2 xdraw + 531 mwa mask2 ydraw + 532 mva mask2+2 color + 533 bpl EndPut4x4 + 534 NoMaskNoPlot + 535 rol char1,x + 536 jmp AfterCharPlot + 537 .ENDIF + 538 EndPut4x4 + 539 rts + 540 .endp + 541 + 542 ;-------------------------------------------------- + 543 .proc ClearScreen + 544 ;-------------------------------------------------- + 545 mwa #displayC64 temp + 546 ldy #0 + 547 @ lda #$ff + 548 sta (temp),y + 549 inw temp + 550 cpw temp #displayC64+screenheight*screenBytes+1 + 551 bne @- + 552 rts + 553 .endp + 554 + 555 ;-------------------------------------------------- + 556 .proc GenerateLineTable + 557 + 558 mwa #displayC64 temp + 559 mwa #linetableL temp2 + 560 mwa #linetableH modify + 561 ldy #0 + 562 ldx #0 + 563 @ lda temp + 564 sta (temp2),y + 565 lda temp+1 + 566 sta (modify),y + 567 cpx #7 + 568 bne NotChar + 569 ldx #0 + 570 adw temp #(320-7) + 571 jmp next8lines + 572 NotChar + 573 inw temp + 574 inx + 575 next8lines + 576 iny + 577 cpy #screenheight+1 + 578 bne @- + 579 rts + 580 .endp + 581 ;-------------------------------------------------- + 582 .proc SetMainScreen + 583 lda #$b ; Grey background and border + 584 lda WallsType + 585 :4 rol + 586 sta $d020 + 587 sta $d021 + 588 + 589 lda $dd00 ; Set video bank to start at 0 + 590 and #252 + 591 ora #3 + 592 sta $dd00 + 593 lda #$18 + 594 sta $d018 + 595 + 596 ; SwitchVICBank(0) + 597 ; SetScreenMemory($2000) + 598 SetHiresBitmapMode ; Hires mode on + 599 lda #$00 + 600 sta 53281 + 601 ; clear color RAM + 602 ldx #0 + 603 @ lda #1 + 604 sta $d800,x + 605 sta $d900,x + 606 sta $da00,x + 607 sta $db00,x + 608 lda #$0f + 609 sta $0400,x + 610 sta $0500,x + 611 sta $0600,x + 612 sta $0700,x + 613 inx + 614 bne @- + 615 + 616 + 617 rts + 618 .endp + 619 + 620 .ENDIF diff --git a/grafproc.asm b/grafproc.asm index 59e0da5..062817a 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -1266,55 +1266,6 @@ ThereWasNoParachute rts .endp -;-------------------------------------------------- -.proc drawmountains -;-------------------------------------------------- - mwa #0 xdraw - mwa #mountaintable modify - mva #1 color - -drawmountainsloop - ldy #0 - lda (modify),y - cmp #screenheight - beq NoMountain - sta ydraw - sty ydraw+1 -.IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc - lda #screenheight - sec - sbc ydraw - sta tempbyte01 - jsr plot.MakePlot - ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) -; jmp IntoDraw ; jumps inside Draw routine - ; because one pixel is already plotted (and who cares? :) ) -@ - lda (xbyte),y - and bittable2,x - sta (xbyte),y -;IntoDraw - adw xbyte #screenBytes - dec tempbyte01 - bne @- -; end of Drawline proc -.ELSE -; there was Drawline proc -drawline - jsr plot.MakePlot - inc ydraw - lda ydraw - cmp #screenheight - bne drawline -; end of Drawline proc -.ENDIF -NoMountain - inw modify - inw xdraw - cpw xdraw #screenwidth - bne drawmountainsloop - rts /* ;-------------------------------------------------- drawmountainspixel ; never used ? @@ -1333,7 +1284,6 @@ drawmountainspixelloop bne drawmountainspixelloop rts */ -.endp ;-------------------------------------------------- .proc SoilDown2 ;-------------------------------------------------- @@ -1630,313 +1580,6 @@ NotHigher rts .endp - -;-------------------------------------------------- -.proc TypeChar -; puts char on the graphics screen -; in: CharCode -; in: left LOWER corner of the char coordinates (xdraw, ydraw) -;-------------------------------------------------- - ; char to the table - lda CharCode - sta fontind - lda #$00 - sta fontind+1 - ; char intex times 8 - aslw fontind - rolw fontind - rolw fontind - - adw fontind #TankFont - - ; and 8 bytes to the table - ldy #7 -CopyChar - lda (fontind),y - eor #$ff - sta char1,y - lda #$ff - sta char2,y - dey - bpl CopyChar - ; and 8 subsequent bytes as a mask - adw fontind #8 - ldy #7 -CopyMask - lda (fontind),y - eor #$ff - sta mask1,y - lda #$00 - sta mask2,y - dey - bpl CopyMask - -.IF FASTER_GRAF_PROCS = 1 - ; calculating coordinates from xdraw and ydraw - mwa xdraw xbyte - - lda xbyte - and #$7 - sta ybit - - lsrw xbyte ; div 8 - rorw xbyte - rorw xbyte -;--- - ldy xbyte - - lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? - sec - sbc #7 - tax - - lda linetableL,x - sta xbyte - lda linetableH,x - sta xbyte+1 - ; mask preparation and character shifting - ldx ybit - beq MaskOK00 -MakeMask00 - .rept 8 - lsr mask1+# - ror mask2+# - .endr - sec - .rept 8 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - ror char2+# - .endr - dex - bne MakeMask00 -MaskOK00 - ; here x=0 - lda Erase - beq CharLoopi ; it works, because x=0 - lda #$ff - ldx #7 -EmptyChar - sta char1,x - sta char2,x - dex - bpl EmptyChar - ldx #0 -CharLoopi - lda (xbyte),y - ora mask1,x - and char1,x - sta (xbyte),y - iny - lda (xbyte),y - ora mask2,x - and char2,x - sta (xbyte),y - dey - adw xbyte #screenBytes - inx - cpx #8 - bne CharLoopi -.ELSE - mvx #7 temp ; line counter (Y) -CharLoop1 - mva #7 temp+1 ; pixel counter (X) -CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot -MakeCharPlot - lda Erase - bne ErasingChar - inc color -ErasingChar -NoPlot - jsr plot.MakePlot -AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #8 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - clc - lda ydraw - adc #8 - sta ydraw - bne EndPutChar -NoMaskNoPlot - rol char1,x - jmp AfterCharPlot -.ENDIF -EndPutChar - rts -.endp - -;-------------------------------------------------- -.proc PutChar4x4 -; puts 4x4 pixels char on the graphics screen -; in: dx, dy (LOWER left corner of the char) -; in: CharCode4x4 (.sbyte) -; in: plot4x4color (0/255) -; all pixels are being drawn -; (empty and not empty) -;-------------------------------------------------- - cpw dy #(screenheight-1) - jcs TypeChar.EndPutChar ;nearest RTS - cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS - cpw dx #(screenwidth-4) - jcs TypeChar.EndPutChar ;nearest RTS - ; checks ommited. - ; char to the table - lda CharCode4x4 - and #%00000001 - beq Upper4bits - lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) -Upper4bits - sta nibbler4x4 - lda CharCode4x4 - lsr - sta fontind - lda #$00 - sta fontind+1 - - adw fontind #font4x4 - - ; and 4 bytes to the table - ldy #0 - ldx #3 -CopyChar - lda (fontind),y ; Y must be 0 !!!! - bit nibbler4x4 - bpl GetUpper4bits - :4 rol -GetUpper4bits - ora #$0f - sta char1,x - lda #$ff - sta char2,x - ; and 4 bytes as a mask - lda #$f0 - sta mask1,x - lda #$00 - sta mask2,x - adw fontind #32 ; next byte of 4x4 font - dex - bpl CopyChar - -.IF FASTER_GRAF_PROCS = 1 - ; calculating coordinates from xdraw and ydraw - mwa dx xbyte - - lda xbyte - and #$7 - sta ybit - - :3 lsrw xbyte ; div 8 -; rorw xbyte -; rorw xbyte -;--- - ldy xbyte ; horizontal byte offet stored in Y - lda dy ; y = y - 3 because left lower. - sec - sbc #3 - tax - - lda linetableL,x - sta xbyte - lda linetableH,x - sta xbyte+1 - ; mask preparation and character shifting - ldx ybit - beq MaskOK01 -MakeMask01 - .rept 4 - lsr mask1+# - ror mask2+# - .endr - sec - .rept 4 - ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - ror char2+# - .endr - dex - bne MakeMask01 -MaskOK01 - ldx #0 -CharLoopi4x4 - lda (xbyte),y - ora mask1,x - bit plot4x4color - bpl PutInColor0_1 ; only mask - no char - and char1,x -PutInColor0_1 - sta (xbyte),y - iny - lda (xbyte),y - ora mask2,x - bit plot4x4color - bpl PutInColor0_2 ; only mask - no char - and char2,x -PutInColor0_2 - sta (xbyte),y - dey - adw xbyte #screenBytes - inx - cpx #4 - bne CharLoopi4x4 -.ELSE - mwa xdraw char2 - mwa ydraw mask2 - mva color mask2+2 - mwa dx xdraw - mwa dy ydraw - mvx #3 temp ; line counter (Y) -CharLoop1 - mva #3 temp+1 ; pixel counter (X) -CharLoop2 - mva #0 color - rol mask1,x - bcc NoMaskNoPlot - rol char1,x - bcs NoPlot -MakeCharPlot - lda plot4x4color - beq ErasingChar - inc color -ErasingChar -NoPlot - jsr plot.MakePlot -AfterCharPlot - inw xdraw - ldx temp - dec temp+1 - bpl CharLoop2 - sec - sbw xdraw #4 - dec ydraw - ldx temp - dex - stx temp - bpl CharLoop1 - mwa char2 xdraw - mwa mask2 ydraw - mva mask2+2 color - bpl EndPut4x4 -NoMaskNoPlot - rol char1,x - jmp AfterCharPlot -.ENDIF -EndPut4x4 - rts -.endp - ;-------------------------------------------------------- .proc DisplayOffensiveTextNr ; ldx TextNumberOff diff --git a/scorch.bin b/scorch.bin index 6c33f79787b5610723549ed89d1376d7c4137729..698c2d39dab4abc1e5b81f0df254c6a78af7520d 100644 GIT binary patch delta 1302 zcmZ`(ZA@EL816mD#Fl;xI)&)UL07(%(ZMLN5*cbXr>*ie9h+pgw^@Yj2Q(4dd&_D~ zc0e*aU?;Lo!ZdVliBdJg4b75eStFSyU35-EVth|KmWVNF^7K6K z^M0Q5-cSgILTG9@6NwU~nJ*jKBwQNABi(p!7e3cRf62^CZ!f3NyGmo49Y9|?U|!K`Fz5HPX_U)-8A1& zf<}GRW$0vZ-jKuKs^JS16x9!m9H$i}B|rT59Bz};Q>G^nCjLaeqQlV^p`#zm(dwG}VVdwZ>4vM+vFPxvVmWnHDb!|2;1lg3M?A?${_lpoVr-OsI8Bj}KK<(dZ<+AWf7pQpR zCIa!K)JN@4(i*$|vDqH501MiLZcHN!!-s~w&JDE9-m$SS5ZkD*bgh9g&9s*Y(_V-@ z?1ejM4bYqRX>Kolzp5Ht@1YA-#nig(EDHPSjctYKD<9Q5ijn0It#oWbxgu?M*dEOl zqeHP@`L(ZnGNriT$YH`22Q~)9NS~1mME01;IF?0PQY)bfiH_G6!d%pa+Wj1zs4PHG z!<9;#`e#)sQcIuJatM~NrtWnB^;q2n4rzMT-SyulvFLd#2YU6@7uF*bmZ-2}CxcIR zTxOH@?ffun-oI(lbXnO>7WqrsSO%W=t0gbKiC~9S`qCt_ge7P8d-5E-+6%-z@jH9u zcj1w58tF>I5NW?F4+5$o*CIlL65Z3_vJ6U-7E>b4`PLx(QsY-HrY;p6>Ea6cf`>-@Mo?#1-*5pKIx@lvR%=zfOrcyNErv=Ri&=Efk jH|MkFr<$K(HGc;-_3IWLn~b`&yP)JB;EWw6Dt z!req&1aE?g*#e7u+g=m~yt(LN3DcxxOVp|nH#9Cv*4Rv!E;@%^*(8oA8PTZ$G@p|FjZe{FXJXqy`th!|7hd8T?<)Gp_d_5&E}F(CZ|;6r%fT zzPBue#yCYyajy-W!i5suS^H@7oU90O6br(UP{d^$^yATmz-T^vLXJ@IrTZb8ZQs-dsL!D#O zN@V6)QCql5!?kjboVuG4g!lzKFadRLZqGAI;I^=f1HUY5bwAsnglTD@QicI58 zu6%sE2M9dz6M+OW#F>Yx?=^=&3KF2CjAL1fFf0!Ty)RK+eb)w4e|&?=qF#~5vZjJW zm3t!e)vwl=eum49rnA4D|BU5S-toLrBVc_;QVyjMy9<-9d=pH*c zfj3F?cw-oSEK$6r6uPFhY}w0cRS&P_5S(OV^KJm`?dJ0wS_)~q9{DPbWsf;I=!f>y z<9P_#WGZam!QlPv7g^s!JC5ah#EtX07u9WKp1)v-=U|VhRXp(mf{WJZlM~2clfAY# zm08%~^Ta>?2V41@u<{#6da^Ni+S^(L4z)<@JVFIB-P6|UD3B){xv6aL%WuIiGXZrj zGky#vpS9I9%iC>@V5v;A;~;+J3_BVUIKCeU3)mTEpP7#K)9gI5JG>~TkG6LxT%6wO us6?eeGf9>kG}hmN2GuGz6PE4d8d(eMqAibQt=O<*f8J# diff --git a/scorch.xex b/scorch.xex index 74c25563b12c9e873246230a1f3e0b2005c4c90d..6d8d41fa30ca78e57fb592e0be279721f7691ea0 100644 GIT binary patch delta 1265 zcmZ`(Z%kWN6z5(33?ckmHrGrjmpSanU~G#T3?^IR2jjxBF_iGZ#Mf6fw#CqjqwRYu zcA0mx3as@Efx#9Q`jEGc($~jKBe)pdH^toJpE;sg-opj4^%YLx5U8a^^I&hS>y69{V)H|y4tuno!z+uM$vcm^s zj$Ne93tu=aB;kd7jv8*6ocoK1JnGf7nU40-2-uuE$&d#^&Mpo@r-{R3o%6)wGk)qM zLQ%J@)%14}+AbS+->f9W?}bNPl^iUtMh+dW;~W-Udw2M~+KVi%wKGEtu-jS=`@RKT zuK&2;DfdN!1%Gzu7x4z9KS`)nhO|=4Rjo@xEym-=&Iz14?;p+Q_{xbTlHV;O+cTmiY9d0 z36t;=ZIBn<#7Eg0rW~FPn>oB3Ht$^T%qy$f3qnKD*L4D$dN2{TSjGz60cyClBH+Wa zCcA)j3vrf!Vr=-ZR@g{aUC0udl}XH&WtX1W2A@L7mdiaDK`(OC#p5}u6!wSREhX?H z*sB6cs!HSS+LZAe-OVK3jkUvWyn{9cY-e=g2y7l~A`3lmXs`~{p*h05U>&xQYaV!i zxQ>|oaAkN8sqn$_@a{(|e92JiS8;uHRh@lDaj|!e?5(WuWvsW`@Nz<09@Di?vP(@d z_t*$6^Y{`c%UCecv58I6^FFvVB9nR1i`Uhg58F9uz?seqosln zfvaO3Ld4i|ZeAd3im`b9RtBTvwF0t@Z!c63a!Q8fiRU@&iG0qF{-4Oi#)NnKLir7C zKU)xQR;CJR!fV9U0Kw;LJUJC5=2LP@eV=*_*Z4DLo&JMw{XN|J?H{>vDOM_vRAWJ- z=F$QoK^gv@K4=cgQFD1Zx269ye%brbu4gxZBIVWS)0{aLeWofXt8xB5m{pzS?}phT zPE7cL4temGvKo!?2NIcSAs-)w)tO153r1oMBd;|u6p`TuE5 S{{}iz{mdMs}M delta 1242 zcmZ`(VQ5=b6z;oe(k>xQJEjY>NpGH3W_5`J4E_pu$LDdCaE+LW-#x) zSao+;Xu8DPC6sp3(Y(^YF65zC|>3nA}zy$eJ5W z!T*@(^Pw*hB>XL;H?jgKRzUc!L@Q!9Q?(-rv}jLD7daNXEKlkgp8B+e^xG0dYsbzR z3}{KFCq|DjprhAaOLDJr_09+pl&{JS#EaQEe`kpBiUwy7oaeVJM411_QghOg7=FkZ zdW`PzP0#G^6T4PhSJb0qmA}zmY{q?}mRE)myi@JDxeT(K zW%q$mixm3h%-k(E4q2*jgYWe|>?NeHxKYCgbo0tA vw?ZefJ*Y{fE7^C@E|I!&ouIrwSF;W0_OTz)RPIM`Y47JvFcmGTY0iHE1R*TN diff --git a/scorchC64.asm b/scorchC64.asm index 71c6606..2b6e315 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -10,7 +10,7 @@ ;--------------------------------------------------- .def XCORRECTION_FOR_PM = 0 ; if 1 - active x position of tanks correction fo PMG -.def FASTER_GRAF_PROCS = 0 +.def FASTER_GRAF_PROCS = 1 ; if 1 - activates faster graphics routines ; (direct writes to screen memory - atari only :) ) ;--------------------------------------------------- diff --git a/scorchC64.prg b/scorchC64.prg index 1dbe01dc76ad678ec2cd6551e5ff88c1e0800b31..8d73a66b459137072c1d17cabf2e5159af2f5a9a 100644 GIT binary patch delta 4454 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 Date: Mon, 15 May 2023 20:46:52 +0200 Subject: [PATCH 41/65] Nothing :) --- scorchC64.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scorchC64.asm b/scorchC64.asm index 2b6e315..48fb4db 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -12,7 +12,7 @@ ; if 1 - active x position of tanks correction fo PMG .def FASTER_GRAF_PROCS = 1 ; if 1 - activates faster graphics routines -; (direct writes to screen memory - atari only :) ) +; (direct writes to screen memory - C64 only :) ) ;--------------------------------------------------- From 2577b71e01ad3914cc95c2a20c669616df4acedd Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 21:58:04 +0200 Subject: [PATCH 42/65] Code optimization for more than 6 tanks. --- constants.asm | 19 ++++++++++++------- game.asm | 10 ++++------ scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56625 -> 56627 bytes scorchC64.prg | Bin 39807 -> 40021 bytes variables.asm | 17 ++++------------- 6 files changed, 20 insertions(+), 26 deletions(-) diff --git a/constants.asm b/constants.asm index 854b04b..8c14262 100644 --- a/constants.asm +++ b/constants.asm @@ -32,9 +32,13 @@ LevelNameBeginH .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) ;-------------- TanksWeaponsTableL - .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 + .REPT MaxPlayers, #+1 + .by >TanksWeapon:1 + .ENDR ;-------------- XtankOffsetGO_L .by 6,56,106,156,206,0 @@ -202,7 +206,9 @@ disktance ;tanks distance .by screenwidth/5 .by screenwidth/6 .by screenwidth/7 - ;max number of players=6 + .by screenwidth/8 + .by screenwidth/9 + ;max number of players=8 :) ; this table is for deciding where a tank should slide ; accordingly to what is below the tank @@ -221,10 +227,9 @@ SlideLeftTableLen = *-SlideLeftTable TanksNamesDefault dta d"1st.Tank" dta d"2nd.Tank" - dta d"3rd.Tank" - dta d"4th.Tank" - dta d"5th.Tank" - dta d"6th.Tank" +.REPT MaxPlayers-2, #+3 + dta d":1rd.Tank" +.ENDR ;------------------------------------------------- TankShapesTable .BYTE char_tank1___________ .BYTE char_tank2___________ diff --git a/game.asm b/game.asm index a48d2a2..7b3a508 100644 --- a/game.asm +++ b/game.asm @@ -783,12 +783,10 @@ B0 dey cpx #ind_White_Flag_____ ; White Flag bne no99 set99 lda #99 -no99 sta TanksWeapon1,x - sta TanksWeapon2,x - sta TanksWeapon3,x - sta TanksWeapon4,x - sta TanksWeapon5,x - sta TanksWeapon6,x +no99 + .REPT MaxPlayers, #+1 + sta TanksWeapon:1,x + .ENDR dex beq set99 ; Baby Missile (index=0) bpl @- diff --git a/scorch.bin b/scorch.bin index 698c2d39dab4abc1e5b81f0df254c6a78af7520d..dce86c5371cd958a384349ccb42648965b96ce20 100644 GIT binary patch delta 6196 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 delta 5973 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 Cq~m@7 diff --git a/scorch.xex b/scorch.xex index 6d8d41fa30ca78e57fb592e0be279721f7691ea0..2dc8458b3a91d734cd9d7e3a3e1dd32fe6226015 100644 GIT binary patch delta 6247 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 Z>v_57i5~gpzjL}h^6s0RM?TMX`yXCXxTF98 delta 6299 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 diff --git a/scorchC64.prg b/scorchC64.prg index 8d73a66b459137072c1d17cabf2e5159af2f5a9a..a02c5ec44477de9bc1f3f68bd7fc879bea0d3d66 100644 GIT binary patch delta 12282 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 bp(bmkxkP*OclXPSAFG{$r!L~iS2F$|$$kV> delta 12354 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 diff --git a/variables.asm b/variables.asm index 933ad6d..209793e 100644 --- a/variables.asm +++ b/variables.asm @@ -23,7 +23,7 @@ GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 ;---------------------------------------------------- TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 ;:6 dta d" " - .ds 6*8 + .ds MaxPlayers*8 ;---------------------------------------------------- skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) .DS MaxPlayers @@ -341,19 +341,10 @@ LaserCoordinate .DS 8 ; 2,2,2,2 ; Let 0 be "baby missile" ; from $30 the defensive weapons begin TanksWeapons -TanksWeapon1 +.REPT MaxPlayers, #+1 +TanksWeapon:1 .DS number_of_weapons -TanksWeapon2 - .DS number_of_weapons -TanksWeapon3 - .DS number_of_weapons -TanksWeapon4 - .DS number_of_weapons -TanksWeapon5 - .DS number_of_weapons -TanksWeapon6 - .DS number_of_weapons - +.ENDR mountaintable ;table of mountains (size=screenwidth) .DS [screenwidth] .DS 1 ; additional byte for fallout (sometimes 1 pixel) From d54d630b4da572de146b5225813e14f6f23401ab Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 15 May 2023 22:54:24 +0200 Subject: [PATCH 43/65] No SoilDown after WhiteFlag bug fixed --- constants.asm | 4 +--- game.asm | 1 + scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56627 -> 56628 bytes weapons.asm | 1 + 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/constants.asm b/constants.asm index 8c14262..0f248fc 100644 --- a/constants.asm +++ b/constants.asm @@ -206,9 +206,7 @@ disktance ;tanks distance .by screenwidth/5 .by screenwidth/6 .by screenwidth/7 - .by screenwidth/8 - .by screenwidth/9 - ;max number of players=8 :) + ;max number of players=6 :) ; this table is for deciding where a tank should slide ; accordingly to what is below the tank diff --git a/game.asm b/game.asm index 7b3a508..16e62db 100644 --- a/game.asm +++ b/game.asm @@ -404,6 +404,7 @@ ShootAtomicWinter ShootWhiteFlag ; --- white flag --- jsr WhiteFlag + jsr TankFlying.SoilDownAfterLanding ; Soildown like after Hovercraf landing :) jmp NextPlayerShoots ; and we skip shoot GoFloat jsr TankFlying diff --git a/scorch.bin b/scorch.bin index dce86c5371cd958a384349ccb42648965b96ce20..74508eb5c77a2118a8362f35ebcde1c44b2542a2 100644 GIT binary patch delta 7446 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 RjfdWZO};R7eN__3{U7uGaE<@~ delta 7478 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 diff --git a/scorch.xex b/scorch.xex index 2dc8458b3a91d734cd9d7e3a3e1dd32fe6226015..6e8d2ee4cc4911272f0340034cac6e7ca8229473 100644 GIT binary patch delta 7658 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 delta 7556 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 Date: Mon, 15 May 2023 23:54:40 +0200 Subject: [PATCH 44/65] Last (?) code optimization for more than 6 tanks. --- constants.asm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/constants.asm b/constants.asm index 0f248fc..4ec1a8f 100644 --- a/constants.asm +++ b/constants.asm @@ -201,12 +201,9 @@ bittable2 ;---------------------------- disktance ;tanks distance .by 0,0 - .by screenwidth/3 - .by screenwidth/4 - .by screenwidth/5 - .by screenwidth/6 - .by screenwidth/7 - ;max number of players=6 :) +.REPT MaxPlayers-1, #+3 + .by screenwidth/:1 +.ENDR ; this table is for deciding where a tank should slide ; accordingly to what is below the tank From 145af2c4e7c163ded967d8239e23d2cde9da3b95 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Tue, 16 May 2023 09:44:08 +0200 Subject: [PATCH 45/65] C64 Nulear Winter works natively --- Atari/gr_basics.asm | 87 +++++++ C64/gr_basics.asm | 96 ++++++- C64/gr_basics.lab | 6 - C64/gr_basics.lst | 622 -------------------------------------------- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56628 -> 56628 bytes weapons.asm | 83 ------ 7 files changed, 181 insertions(+), 713 deletions(-) delete mode 100644 C64/gr_basics.lab delete mode 100644 C64/gr_basics.lst diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 26ec81c..3dec1df 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -588,5 +588,92 @@ EndPut4x4 jsr WaitOneFrame rts .endp +;-------------------------------------------------- + + +; ******* This is weapon .... but ... ******* +; ------------------------------------------------- +.proc AtomicWinter +; ------------------------------------------------- +; This routine is run from inside of the main loop +; and replaces Shoot and Flight routines +; X and TankNr - index of shooting tank +; ------------------------------------------------- + mva #sfx_sandhog sfx_effect +.IF FASTER_GRAF_PROCS = 1 + ldy #0 ; byte counter (from 0 to 39) +NextColumn + ; big loop - we repat internal loops for each column of bytes + sty magic + ldx #120 ; line counter (from 0 to 60 ) + ; first loop - inverse column of bytes for a while + ldy magic +NextLine1 + jsr InverseScreenByte + dex + dex + bpl NextLine1 + ; + jsr WaitOneFrame ; wait uses A only + ; second loop - inverse again and put random "snow" to column of bytes + ldx #120 + ldy magic + mva #$55 magic+1 +NextLine2 + jsr InverseScreenByte + lda random + ora magic+1 + and (temp),y + sta (temp),y + lda magic+1 + eor #$ff + sta magic+1 + dex + dex + bpl NextLine2 + ; and go to next column + iny + cpy #40 + bne NextColumn +.ELSE + mva #1 color + mwa #120 ydraw +NextLineSlow + lda #0 + sta xdraw + sta xdraw+1 +NextPixelSlow + bit random + bpl NoPlot + bvc NoPlot + jsr plot.MakePlot +NoPlot + inw xdraw + cpw xdraw #screenwidth + bne NextPixelSlow + dec ydraw + dec ydraw + bpl NextLineSlow +.ENDIF + ; and we have "snow" :) + lda #0 + ldx TankNr + sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + jsr SetFullScreenSoilRange + jsr SoilDown2.NoClearTanks + rts + + ; in order to optimize the fragment repeated in both internal loops + ; we save 15 bytes :) +InverseScreenByte + lda LineTableL,x + sta temp + lda LineTableH,x + sta temp+1 + lda (temp),y + eor #$ff + sta (temp),y + rts +.endp .ENDIF \ No newline at end of file diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index a6fcdcc..774a02c 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -608,9 +608,101 @@ next8lines sta $0700,x inx bne @- - - rts .endp +;-------------------------------------------------- + + +; ******* This is weapon .... but ... ******* +; ------------------------------------------------- +.proc AtomicWinter +; ------------------------------------------------- +; This routine is run from inside of the main loop +; and replaces Shoot and Flight routines +; X and TankNr - index of shooting tank +; ------------------------------------------------- + mva #sfx_sandhog sfx_effect +.IF FASTER_GRAF_PROCS = 1 + mvy #0 magic ; byte counter (from 0 to 39) +NextColumn + ; big loop - we repat internal loops for each column of bytes + ldx #120 ; line counter (from 0 to 60 ) + ; first loop - inverse column of bytes for a while +NextLine1 + jsr InverseScreenByte + dex + dex + bpl NextLine1 + ; + jsr WaitOneFrame ; wait uses A only + ; second loop - inverse again and put random "snow" to column of bytes + ldx #120 + mva #$55 magic+1 +NextLine2 + jsr InverseScreenByte + lda random + ora magic+1 + and (temp),y + sta (temp),y + lda magic+1 + eor #$ff + sta magic+1 + dex + dex + bpl NextLine2 + ; and go to next column + inc magic + ldy magic + cpy #40 + bne NextColumn +.ELSE + mva #1 color + mwa #120 ydraw +NextLineSlow + lda #0 + sta xdraw + sta xdraw+1 +NextPixelSlow + bit random + bpl NoPlot + bvc NoPlot + jsr plot.MakePlot +NoPlot + inw xdraw + cpw xdraw #screenwidth + bne NextPixelSlow + dec ydraw + dec ydraw + bpl NextLineSlow +.ENDIF + ; and we have "snow" :) + lda #0 + ldx TankNr + sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + jsr SetFullScreenSoilRange + jsr SoilDown2.NoClearTanks + rts + + ; in order to optimize the fragment repeated in both internal loops + ; we save 15 bytes :) +InverseScreenByte + ldy magic + sty temp + ldy #0 + sty temp+1 + aslw temp + rolw temp + rolw temp + lda temp + adc LineTableL,x + sta temp + lda LineTableH,x + adc temp+1 + sta temp+1 + lda (temp),y + eor #$ff + sta (temp),y + rts +.endp .ENDIF \ No newline at end of file diff --git a/C64/gr_basics.lab b/C64/gr_basics.lab deleted file mode 100644 index 11e4cb2..0000000 --- a/C64/gr_basics.lab +++ /dev/null @@ -1,6 +0,0 @@ -mads 2.1.5 build 3 (21 Feb 22) -Label table: -00 FFFF0001 0@ -00 FFFF0001 1@ -00 FFFF0001 2@ -00 FFFF0001 3@ diff --git a/C64/gr_basics.lst b/C64/gr_basics.lst deleted file mode 100644 index 4cf64c6..0000000 --- a/C64/gr_basics.lst +++ /dev/null @@ -1,622 +0,0 @@ -mads 2.1.5 build 3 (21 Feb 22) -Source: gr_basics.asm - 1 .IF *>0 ;this is a trick that prevents compiling this file alone - 2 - 3 ; Basic hardware-dependent graphics routines. - 4 - 5 ; ----------------------------------------- - 6 .proc unPlot - 7 ; plots a point and saves the plotted byte, reverts the previous plot. - 8 ; ----------------------------------------- - 9 ldx #0 ; only one pixel - 10 unPlotAfterX - 11 stx WhichUnPlot - 12 - 13 ; first remake the oldie - 14 lda oldplotL,x - 15 sta oldplot - 16 lda oldplotH,x - 17 sta oldplot+1 - 18 - 19 ldy #0 - 20 lda oldora,x - 21 sta (oldplot),y - 22 - 23 - 24 ; is it not out of the screen ???? - 25 cpw ydraw #screenheight - 26 jcc CheckX - 27 mwa #0 ydraw - 28 CheckX - 29 cpw xdraw #screenwidth - 30 jcs EndOfUnPlot - 31 MakeUnPlot - 32 ; let's count coordinates taken from xdraw and ydraw - 33 lda xdraw - 34 and #%11111000 - 35 ;sta xbyte - 36 ;--- - 37 ldx ydraw - 38 clc - 39 adc linetableL,x - 40 sta xbyte - 41 sta oldplot - 42 lda linetableH,x - 43 adc xdraw+1 - 44 sta xbyte+1 - 45 sta oldplot+1 - 46 - 47 lda xdraw - 48 and #$7 - 49 tax - 50 ldy #0 - 51 - 52 lda color - 53 bne ClearUnPlot - 54 - 55 ;plotting here - 56 lda (xbyte),y - 57 sta OldOraTemp - 58 ora bittable,x - 59 sta (xbyte),y - 60 bne ContinueUnPlot ; allways <>0 - 61 ClearUnPlot - 62 lda (xbyte),y - 63 sta OldOraTemp - 64 and bittable2,x - 65 sta (xbyte),y - 66 ContinueUnPlot - 67 ldx WhichUnPlot - 68 lda OldOraTemp - 69 sta oldora,x - 70 lda oldplot - 71 sta oldplotL,x - 72 lda oldplot+1 - 73 sta oldplotH,x - 74 ; and now we must solve the problem of several plots - 75 ; in one byte - 76 ldx #4 - 77 ldy WhichUnPlot - 78 LetsCheckOverlapping - 79 cpx WhichUnPlot - 80 beq SkipThisPlot - 81 lda oldplotL,x - 82 cmp oldplotL,y - 83 bne NotTheSamePlot - 84 lda oldplotH,x - 85 cmp oldplotH,y - 86 bne NotTheSamePlot - 87 ; the pixel is in the same byte so let's take correct contents - 88 lda oldora,x - 89 sta oldora,y - 90 NotTheSamePlot - 91 SkipThisPlot - 92 dex - 93 bpl LetsCheckOverlapping - 94 EndOfUnPlot - 95 rts - 96 .endp - 97 - 98 ; ----------------------------------------- - 99 .proc plot ;plot (xdraw, ydraw, color) - 100 ; color == 1 --> put pixel - 101 ; color == 0 --> erase pixel - 102 ; this is one of the most important routines in the whole - 103 ; game. If you are going to speed up the game, start with - 104 ; plot - it is used by every single effect starting from explosions - 105 ; through line drawing and small text output!!! - 106 ; - 107 ; Optimized by 0xF (Fox) THXXXX!!! - 108 - 109 ; ----------------------------------------- - 110 ; is it not over the screen ??? - 111 cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - 112 bcs unPlot.EndOfUnPlot ;nearest RTS - 113 CheckX02 - 114 cpw xdraw #screenwidth - 115 bcs EndOfPlot - 116 MakePlot - 117 ; let's calculate coordinates from xdraw and ydraw - 118 - 119 lda xdraw - 120 and #%11111000 - 121 ;sta xbyte - 122 ;--- - 123 ldx ydraw - 124 clc - 125 adc linetableL,x - 126 sta xbyte - 127 lda linetableH,x - 128 adc xdraw+1 - 129 sta xbyte+1 - 130 - 131 lda xdraw - 132 and #$7 - 133 tax - 134 ldy #0 - 135 lda color - 136 bne ClearPlot - 137 - 138 lda (xbyte),y - 139 ora bittable,x - 140 sta (xbyte),y - 141 EndOfPlot - 142 rts - 143 ClearPlot - 144 lda (xbyte),y - 145 and bittable2,x - 146 sta (xbyte),y - 147 rts - 148 .endp - 149 - 150 ; ----------------------------------------- - 151 .proc point_plot - 152 ; ----------------------------------------- - 153 ; checks state of the pixel (coordinates in xdraw and ydraw) - 154 ; result is in A (zero or appropriate bit is set) - 155 - 156 ; let's calculate coordinates from xdraw and ydraw - 157 - 158 lda xdraw - 159 and #%11111000 - 160 ;sta xbyte - 161 ;--- - 162 ldx ydraw - 163 clc - 164 adc linetableL,x - 165 sta xbyte - 166 lda linetableH,x - 167 adc xdraw+1 - 168 sta xbyte+1 - 169 - 170 lda xdraw - 171 and #$7 - 172 tax - 173 ldy #0 - 174 lda (xbyte),y - 175 eor #$ff - 176 and bittable,x - 177 rts - 178 .endp - 179 ;-------------------------------------------------- - 180 .proc drawmountains - 181 ;-------------------------------------------------- - 182 mwa #0 xdraw - 183 mwa #mountaintable modify - 184 mva #1 color - 185 - 186 drawmountainsloop - 187 ldy #0 - 188 lda (modify),y - 189 cmp #screenheight - 190 beq NoMountain - 191 sta ydraw - 192 sty ydraw+1 - 193 .IF FASTER_GRAF_PROCS = 1 - 194 ; there was Drawline proc - 195 lda #screenheight - 196 sec - 197 sbc ydraw - 198 sta tempbyte01 - 199 jsr plot.MakePlot - 200 ; X - index in bittable (number of bit) and nothing more (for use) in C64 :) - 201 ; jmp IntoDraw ; jumps inside Draw routine - 202 ; because one pixel is already plotted (and who cares? :) ) - 203 @ - 204 lda (xbyte),y - 205 and bittable2,x - 206 sta (xbyte),y - 207 ;IntoDraw - 208 inc ydraw - 209 lda xdraw - 210 and #%11111000 - 211 ;sta xbyte - 212 ;--- - 213 ldy ydraw - 214 clc - 215 adc linetableL,y - 216 sta xbyte - 217 lda linetableH,y - 218 adc xdraw+1 - 219 sta xbyte+1 - 220 ldy #0 - 221 dec tempbyte01 - 222 bne @- - 223 ; end of Drawline proc - 224 .ELSE - 225 ; there was Drawline proc - 226 drawline - 227 jsr plot.MakePlot - 228 inc ydraw - 229 lda ydraw - 230 cmp #screenheight - 231 bne drawline - 232 ; end of Drawline proc - 233 .ENDIF - 234 NoMountain - 235 inw modify - 236 inw xdraw - 237 cpw xdraw #screenwidth - 238 bne drawmountainsloop - 239 rts - 240 .endp - 241 ;-------------------------------------------------- - 242 .proc TypeChar - 243 ; puts char on the graphics screen - 244 ; in: CharCode - 245 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) - 246 ;-------------------------------------------------- - 247 ; char to the table - 248 lda CharCode - 249 sta fontind - 250 lda #$00 - 251 sta fontind+1 - 252 ; char intex times 8 - 253 aslw fontind - 254 rolw fontind - 255 rolw fontind - 256 - 257 adw fontind #TankFont - 258 - 259 ; and 8 bytes to the table - 260 ldy #7 - 261 CopyChar - 262 lda (fontind),y - 263 eor #$ff - 264 sta char1,y - 265 lda #$ff - 266 sta char2,y - 267 dey - 268 bpl CopyChar - 269 ; and 8 subsequent bytes as a mask - 270 adw fontind #8 - 271 ldy #7 - 272 CopyMask - 273 lda (fontind),y - 274 eor #$ff - 275 sta mask1,y - 276 lda #$00 - 277 sta mask2,y - 278 dey - 279 bpl CopyMask - 280 - 281 .IF FASTER_GRAF_PROCS = 1 - 282 ; mask preparation and character shifting - 283 lda xdraw - 284 and #$7 - 285 tax - 286 beq MaskOK00 - 287 MakeMask00 - 288 .rept 8 - 289 lsr mask1+# - 290 ror mask2+# - 291 .endr - 292 sec - 293 .rept 8 - 294 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 295 ror char2+# - 296 .endr - 297 dex - 298 bne MakeMask00 - 299 MaskOK00 - 300 lda ydraw - 301 sec - 302 sbc #8 - 303 sta ydraw - 304 ; X = 0 ! - 305 lda Erase - 306 beq CharLoopi ; it works, because x=0 - 307 lda #$ff - 308 ldx #7 - 309 EmptyChar - 310 sta char1,x - 311 sta char2,x - 312 dex - 313 bpl EmptyChar - 314 ldx #0 - 315 CharLoopi - 316 ; calculating coordinates from xdraw and ydraw - 317 ldy ydraw - 318 lda xdraw - 319 and #%11111000 - 320 clc - 321 adc linetableL,y - 322 sta xbyte - 323 lda linetableH,y - 324 adc xdraw+1 - 325 sta xbyte+1 - 326 ;-- - 327 ldy #0 - 328 lda (xbyte),y - 329 ora mask1,x - 330 and char1,x - 331 sta (xbyte),y - 332 ldy #8 - 333 lda (xbyte),y - 334 ora mask2,x - 335 and char2,x - 336 sta (xbyte),y - 337 inc ydraw - 338 inx - 339 cpx #8 - 340 bne CharLoopi - 341 .ELSE - 342 mvx #7 temp ; line counter (Y) - 343 CharLoop1 - 344 mva #7 temp+1 ; pixel counter (X) - 345 CharLoop2 - 346 mva #0 color - 347 rol mask1,x - 348 bcc NoMaskNoPlot - 349 rol char1,x - 350 bcs NoPlot - 351 MakeCharPlot - 352 lda Erase - 353 bne ErasingChar - 354 inc color - 355 ErasingChar - 356 NoPlot - 357 jsr plot.MakePlot - 358 AfterCharPlot - 359 inw xdraw - 360 ldx temp - 361 dec temp+1 - 362 bpl CharLoop2 - 363 sec - 364 sbw xdraw #8 - 365 dec ydraw - 366 ldx temp - 367 dex - 368 stx temp - 369 bpl CharLoop1 - 370 clc - 371 lda ydraw - 372 adc #8 - 373 sta ydraw - 374 bne EndPutChar - 375 NoMaskNoPlot - 376 rol char1,x - 377 jmp AfterCharPlot - 378 .ENDIF - 379 EndPutChar - 380 rts - 381 .endp - 382 - 383 ;-------------------------------------------------- - 384 .proc PutChar4x4 - 385 ; puts 4x4 pixels char on the graphics screen - 386 ; in: dx, dy (LOWER left corner of the char) - 387 ; in: CharCode4x4 (.sbyte) - 388 ; in: plot4x4color (0/255) - 389 ; all pixels are being drawn - 390 ; (empty and not empty) - 391 ;-------------------------------------------------- - 392 cpw dy #(screenheight-1) - 393 jcs TypeChar.EndPutChar ;nearest RTS - 394 cpw dy #(4) - 395 jcc TypeChar.EndPutChar ;nearest RTS - 396 cpw dx #(screenwidth-4) - 397 jcs TypeChar.EndPutChar ;nearest RTS - 398 ; checks ommited. - 399 ; char to the table - 400 lda CharCode4x4 - 401 and #%00000001 - 402 beq Upper4bits - 403 lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) - 404 Upper4bits - 405 sta nibbler4x4 - 406 lda CharCode4x4 - 407 lsr - 408 sta fontind - 409 lda #$00 - 410 sta fontind+1 - 411 - 412 adw fontind #font4x4 - 413 - 414 ; and 4 bytes to the table - 415 ldy #0 - 416 ldx #3 - 417 CopyChar - 418 lda (fontind),y ; Y must be 0 !!!! - 419 bit nibbler4x4 - 420 bpl GetUpper4bits - 421 :4 rol - 422 GetUpper4bits - 423 ora #$0f - 424 sta char1,x - 425 lda #$ff - 426 sta char2,x - 427 ; and 4 bytes as a mask - 428 lda #$f0 - 429 sta mask1,x - 430 lda #$00 - 431 sta mask2,x - 432 adw fontind #32 ; next byte of 4x4 font - 433 dex - 434 bpl CopyChar - 435 - 436 .IF FASTER_GRAF_PROCS = 1 - 437 ; calculating coordinates from xdraw and ydraw - 438 mwa dx xbyte - 439 - 440 lda xbyte - 441 and #$7 - 442 sta ybit - 443 - 444 :3 lsrw xbyte ; div 8 - 445 ; rorw xbyte - 446 ; rorw xbyte - 447 ;--- - 448 ldy xbyte ; horizontal byte offet stored in Y - 449 lda dy ; y = y - 3 because left lower. - 450 sec - 451 sbc #3 - 452 tax - 453 - 454 lda linetableL,x - 455 sta xbyte - 456 lda linetableH,x - 457 sta xbyte+1 - 458 ; mask preparation and character shifting - 459 ldx ybit - 460 beq MaskOK01 - 461 MakeMask01 - 462 .rept 4 - 463 lsr mask1+# - 464 ror mask2+# - 465 .endr - 466 sec - 467 .rept 4 - 468 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 469 ror char2+# - 470 .endr - 471 dex - 472 bne MakeMask01 - 473 MaskOK01 - 474 ldx #0 - 475 CharLoopi4x4 - 476 lda (xbyte),y - 477 ora mask1,x - 478 bit plot4x4color - 479 bpl PutInColor0_1 ; only mask - no char - 480 and char1,x - 481 PutInColor0_1 - 482 sta (xbyte),y - 483 iny - 484 lda (xbyte),y - 485 ora mask2,x - 486 bit plot4x4color - 487 bpl PutInColor0_2 ; only mask - no char - 488 and char2,x - 489 PutInColor0_2 - 490 sta (xbyte),y - 491 dey - 492 adw xbyte #screenBytes - 493 inx - 494 cpx #4 - 495 bne CharLoopi4x4 - 496 .ELSE - 497 mwa xdraw char2 - 498 mwa ydraw mask2 - 499 mva color mask2+2 - 500 mwa dx xdraw - 501 mwa dy ydraw - 502 mvx #3 temp ; line counter (Y) - 503 CharLoop1 - 504 mva #3 temp+1 ; pixel counter (X) - 505 CharLoop2 - 506 mva #0 color - 507 rol mask1,x - 508 bcc NoMaskNoPlot - 509 rol char1,x - 510 bcs NoPlot - 511 MakeCharPlot - 512 lda plot4x4color - 513 beq ErasingChar - 514 inc color - 515 ErasingChar - 516 NoPlot - 517 jsr plot.MakePlot - 518 AfterCharPlot - 519 inw xdraw - 520 ldx temp - 521 dec temp+1 - 522 bpl CharLoop2 - 523 sec - 524 sbw xdraw #4 - 525 dec ydraw - 526 ldx temp - 527 dex - 528 stx temp - 529 bpl CharLoop1 - 530 mwa char2 xdraw - 531 mwa mask2 ydraw - 532 mva mask2+2 color - 533 bpl EndPut4x4 - 534 NoMaskNoPlot - 535 rol char1,x - 536 jmp AfterCharPlot - 537 .ENDIF - 538 EndPut4x4 - 539 rts - 540 .endp - 541 - 542 ;-------------------------------------------------- - 543 .proc ClearScreen - 544 ;-------------------------------------------------- - 545 mwa #displayC64 temp - 546 ldy #0 - 547 @ lda #$ff - 548 sta (temp),y - 549 inw temp - 550 cpw temp #displayC64+screenheight*screenBytes+1 - 551 bne @- - 552 rts - 553 .endp - 554 - 555 ;-------------------------------------------------- - 556 .proc GenerateLineTable - 557 - 558 mwa #displayC64 temp - 559 mwa #linetableL temp2 - 560 mwa #linetableH modify - 561 ldy #0 - 562 ldx #0 - 563 @ lda temp - 564 sta (temp2),y - 565 lda temp+1 - 566 sta (modify),y - 567 cpx #7 - 568 bne NotChar - 569 ldx #0 - 570 adw temp #(320-7) - 571 jmp next8lines - 572 NotChar - 573 inw temp - 574 inx - 575 next8lines - 576 iny - 577 cpy #screenheight+1 - 578 bne @- - 579 rts - 580 .endp - 581 ;-------------------------------------------------- - 582 .proc SetMainScreen - 583 lda #$b ; Grey background and border - 584 lda WallsType - 585 :4 rol - 586 sta $d020 - 587 sta $d021 - 588 - 589 lda $dd00 ; Set video bank to start at 0 - 590 and #252 - 591 ora #3 - 592 sta $dd00 - 593 lda #$18 - 594 sta $d018 - 595 - 596 ; SwitchVICBank(0) - 597 ; SetScreenMemory($2000) - 598 SetHiresBitmapMode ; Hires mode on - 599 lda #$00 - 600 sta 53281 - 601 ; clear color RAM - 602 ldx #0 - 603 @ lda #1 - 604 sta $d800,x - 605 sta $d900,x - 606 sta $da00,x - 607 sta $db00,x - 608 lda #$0f - 609 sta $0400,x - 610 sta $0500,x - 611 sta $0600,x - 612 sta $0700,x - 613 inx - 614 bne @- - 615 - 616 - 617 rts - 618 .endp - 619 - 620 .ENDIF diff --git a/scorch.bin b/scorch.bin index 74508eb5c77a2118a8362f35ebcde1c44b2542a2..5a8d471b73695487a7919fc5ef138cffa2ceaf71 100644 GIT binary patch delta 1055 zcmYk4eM}p57{~j&7Q=YEc8*9FU^j$}YQRM>5*KJ!2A1y1$_9xh8|gGiSrunwFKGgI zz4|M?lk&1BX%?26xp0JQf;50jG%EoeELRQm4-*qjh#>|g>Q-HZnHccbii!W+=lMR* z^L_4lF30l}&r`7n`II3DYJO?KB)_Owzu@CwPm3uo)vcEgjN_z;~F zjpuQ;crIsib#a%us~pb-xG%UR&dVEpM|^h9&Q%Gu!Ye|;|Bc@w*afH1CA=-XFL(u? zAozp+VgIIo(SMp-gg+W8kO)QQV%;T<8G|}=$$(jX90iIz7!b%p7utVTBSE3;p zGqcD8>*gAZh*x6C5V>kY{y3#&9)(>>DV|YuIKpi6b+T)#47*~~%EkRmk?iU@g*yp|H!k>A8u84+TZuc#9~=s($6bSXfZW|BMU zwmM zgQIwgsegAfDo2-Rl7A`)Pq`T4E^Ph;iF5axE0F1-H0hCxr%YL?s+%TVs{W>lN@`iR zG)@1a?vd!QsP1F{2W`(I85(Rg+=8SEBzHwrg9I^A#RP+r$*fYT4mF#IfT-#SjFS2k zK|)kD1otI1i@+_Z`2>@aT0n4DVjF|9(L}3sDtC$;sr$@up8X*xAI>W?IV2uk+wG&-Ga^*CR2Cb8#1^R|#jQ+D zOFGy4=;P~zu+;Jlh%LD}q-j3#+M#snqZZ@;$Cp=SA4?V delta 1026 zcmZvaQA}G^7{@ucmx+w_7U;B$4li{$IzwebCMHUOvRcY*S0+t}nWSTGwlJ5CkYI@R z-nL$7uhP|hNwbg?$-+hMbgriJfrn0O0(fhJec?sT9#~w4)2y-wrZM2Tb-wv<&+q&G z-}nE{IX8#n2#zCCt7>9t3S@O%ndUO%cF}h}h6if8k`?Ahq!Ru|`s%oNt58SJ0j+sR zECyg7HI0#;r~Wpdpm!1rBbkq=@@tu!0edDLuzS_4o~>gWSu;D#`dK5FvWlf&hPdTG zb@hk%1R6=h-=G5tsgzGLt?-Sd5w*gmg+bMDw4()EhCB8*%yMm_chkswQ^d+CiR6>? zET3R}1=yvigt{a@JbpfxFg&#L6UGwCRBEo<*OgzwRax@jDO8$NCl2+RW$-IBfMw z*E_Z^(2=y^wFYEL2n!>kVbN4tXu4t|3$I==5qTA(6|PhFyU$`Oo#sLW%$AebyNQSiuRI59_M5+fUx_h5`h@!wD}=LESFLo3K?43{8l zFa`zY{*+i_qGYPDcM-o2a;fqp6N!lXiwPwD;TIFA3YGe$An5t!_0G%QVFTe1xoH;XkD?z}xlHQ&aBT#vB{H{47P z=x{0_K8ZhxJ~o;e(6w!nSeD7S;`pxxY8*vJ$^SX@{-Pt5DmoswfX~6ypB1ECr>SDv zR6)1*E93Aj`5C&aU&I%}8(3l8F@c|*yY~VbgKY0T;z0~PV+PS1Q0{ya4S~R$hS;gW7ed%pa2*3QF>ds};4wMb`p)4)n*H z@M=50iuQoU{XX$)9H!le&^UbMew`e@#Ee5lUn{DC&c4G~JlFSEy;Q{~=Sn_UzWVO` lGVQsX%W40lxqc;+Jp2k)Alu%Se*47dPonCy?&NRJ{sTvesaXI3 diff --git a/scorch.xex b/scorch.xex index 6e8d2ee4cc4911272f0340034cac6e7ca8229473..0408870656ee9eb0fe312b27b8c428d014bbe7e9 100644 GIT binary patch delta 1019 zcmYk4Z%i9?7{~ctag5UNgE0b&P_Gj*I=8vObj)ObjJ_!5Mq*anl0_*ZNoN;y3CSu( zj$V7Ty^R)mB4ogoGC1fJO2Og_FztLZ+_8i;Gf1*TH0Tz1;nD?k(M0ff9VWiH&+~o0 z&+nV(Np5CNGc%`|(%LBO0i8{MGSJ54)Y9f|`sr6{u?OS~u^X5Dm^W*Al8xzuz4Q^= z$_Y%Tgb|yZ!9S$?u1SfMp8gXWZ5wC{E?n`Ut=Qu$XJ0kQdw4OJ;kt9nK5~bC)V8pY z_ZQt@R+U`G&yx-$qt)-e*gI;A-@w{%T+5o`*{sRZ$TqVrY#ZxhzhiH+_Vyx2sl&vY z*jKnpu9~~+eBeCInYdc6k^7jt%Go)VYj<`yZ#aK*CY&{F0_+3j$PIykl1wX0`ynw< zTHv})mdurN`6%7rBfr3li~vstDv$t0B7v}D+o{!3z zyhv}hS4)=l{k&z0ns3hVqomcvQRyWkI6ONZU$r6|8dGIpn{Q|TPCbBGy-y+dVGi5uP+`WpQc`+X=AQEzp?#x1jo zn&BhpTd)rs)QSG#N#u^bGg6MItm|-9DlBja5&S^ePHLEAUgcRDa8o*jB$$_~*kwWS zk)F@1_z4uRGC>d&lrNLnQhm)fU(YNH#xqK8szJfT8T2Z<2r307i{MwUVj%cQP!16| z1f`tdwxFCQxGyNDlDp{F)Bxs9PsC0cv4T@MA#%~V+0Z5C7f-}R>C(^TZN87pfNRuf zz@B(J7F%$<6^qT7A+i}4U)GYk>;6^?W~{I{YAnGX5+haH$IAbp<&`M`T8fmN7vv&?ENlZPm}sj}TMUCyOD#!NmJ%ss38K;U_)kPwJlzevr1!BG>F5+%w9DlwWRm^K?g4 z!2`m$RgNL6c(6^n6UoFwP-opnUO3(4Lf)B;rsvIX;C(l}*6=kZVKRKXvpoDsXSpSj ze~jPHALdPb1AmUkw$E&fwn%5B^IQ9>{YQI?v%|SzkJumB6CG)e3^0<`86X%bQ*N^!pjl?S_5wT2K z-i#&7A>G|CvFR#ZH$_gN+K>C?SR!&oa9qqoMev@;ArpKm79%r6#3yn*wlc}Gd5~DB zuU5MVdu-{FrSTwm+J00V0^eJHQCuPxnx{l zSz-Ju%n?1;0{4d-PzAg;vJahvrjcyj=U1R_(DVNE7w7;4{g;p)3Ich^4Q~cc8r;`8H~0f3=y6yN Date: Wed, 17 May 2023 10:55:53 +0200 Subject: [PATCH 46/65] Shield after Flag bug fixed #138 . Optimizations --- ai.asm | 2 ++ grafproc.asm | 10 +++++++--- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56628 -> 56576 bytes weapons.asm | 48 ++++++++++++++++-------------------------------- 5 files changed, 25 insertions(+), 35 deletions(-) diff --git a/ai.asm b/ai.asm index f13da31..ce4b87c 100644 --- a/ai.asm +++ b/ai.asm @@ -219,8 +219,10 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 cmp #5 bcs EnoughEnergy ; lower than 5 units - white flag + jsr ClearTankNr ; we must hide tank to erase shields (issue #138) lda #ind_White_Flag_____ sta ActiveDefenceWeapon,x + jsr PutTankNr ; and draw tank witch Flag EnoughEnergy rts .endp diff --git a/grafproc.asm b/grafproc.asm index 062817a..d232239 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -613,6 +613,11 @@ DrawNextTank rts .endp ;--------- +ClearTankNr + mva #1 Erase + bne DrawTankNr +PutTankNr + mva #0 Erase .proc DrawTankNr ldx tankNr ; let's check the energy @@ -1041,7 +1046,7 @@ TankFallsX NoFallingSound ; clear previous position mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr ; and the parachute (if present) lda Parachute and #01 @@ -1242,9 +1247,8 @@ NoParachuteWeapon beq ThereWasNoParachute jsr DrawTankParachute ThereWasNoParachute - mva #0 Erase ; ldx TankNr - jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) + jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) mva #sfx_silencer sfx_effect rts diff --git a/scorch.bin b/scorch.bin index 5a8d471b73695487a7919fc5ef138cffa2ceaf71..46e66e0170d88d17819f40ed2b20a45db68e0754 100644 GIT binary patch delta 4486 zcmaJ_3sh5Qw$90eH=OWLf3Ayn>^HqE(DXfvJj)MGw)1(iAmNieNQq@E}lu z$d4g{u|7DI<1G@6o$8F~Wo8O`(Av}9t9R;hTr;+{vaGYB9cw$|;OrBy*52M5T>oRg z{@32$-bb@pYBo!q@qt8jiu$~K@) zg={PzAjr@ad@6XNDWrkD<{@ZK!dyq2c7ReF$tQRsdE^P;Q-m1Qvzsbdfs)&hkaNj;`TCL z8&-bPv#Z|l?qO2!=`q+H`~1nLYB)b+dvtI0yQ?EWt8$M4t*>A!83WA6%;M`I*@O>{ zARB%5)^G&!!Ncgjka;Bh3ExYUx^_m4`V*PBR;}@aok`*Pjrc#*iQ-F+KjZ7j>AInwLP)>r!U|L+ z>Y&+D>3y54KcQF#)8H2zQn~o-_+&DYTWXQf^=Yz(AT;=~CdFT4ga?AhD|e+%RS}|^ zE~QBpq}$1UAY`!{Q`68N@Ly(R5IQ_@=EWJhom%$HmyL{`eQ!jr%U?mez{*%o_5JN$L%7@wW{*3UYCX<7TBK6<4?i$P?$|*MPIFiQv~cr57*m*#geFw+8vY!EzoMC8@yMW;tgy zS5WyCsJQ}-J{>Hq1PZ5SwzyA{+7UlS4;n`Z&>2klL7JDL_5_S7h7-+{CCg4rqQi`390^wt`% zsVXBFJ?96fYsHP}lZhR;FFl7S!S~V)6EsHl9bP8*pz=xx6j4n^72)y>wHydZ7-vj_ zMF%ocBi*lqT|Kx->rPML5eci`ziYpdQe)rDvY6JLLM%LTFVgQkA~|Jb^rwul=6)kQ zi5~CEJWXuGIaylbE4(9XMrctFbJ~5mhjHBz+X{CPem{#PY`9pPOnidtwNr^H_>^`w zk$}I@&YF-=Gh`L+(NANKJ;nSFYQa;pMSgL16tvaZ@gaL_-1Q{W2=2u6pp&>KdnYj$ zC(KDEbgpG{>Ip)RKmEm0qQVt3cOl{XfGJ~NDeHBW&Rar+-`hPrto$C1er!kgAh(Jc zLig~%FXK&TZRl(j?Y0InM)%rars9-w>686N8eOn~*X|<&PPoHNdG1hC9&IqaZhFI1 zZ`xd=E`cXsMw{LOzzyL-n0~ax#wi#F)rJRhl6;rgP#c5Z!(ZntB{t#A`HA^D8%PF< zB3vLyw=zRcp&6d_7JC%X`K*nG$m-|hu${+dF;)`BV`Yq@V(GF)3~hy|7?Z)={N%XD zW)-Ukx*q5o*^RtJkh6OJqSJR=#xp+>4&t{U3H)fr0yE){`xhh<3-Et0*buq7o}0k* z3y;KQA^t*PPdXd59P4sRiE?}@HxhLC+-Txo_{-cZA{)mpObacq+j3%9dF#p*vhNC+ zDx(BkvJgf1zX7+>F9dKCp_OxSq9uG_;VjYKvAtl~A<_gt?`WQP9WiF86ZrPRL}~P1 zY+M|H(V_;GerMl(h=D5)$Se0r7zRIp#6>Cg;DJT%kUt!N`%@g*gwpeAu>aPJ8B$Lz z9(?fy-lVio(fHNHd48g8AqCm+`NerETP=H9L|mqXJtHD9v(fvmtvF`M8Mu>AmaI2HUI$a) zxQRBU41LwqV_;)?H44vkyGHJrXV*v}kV~5S$h-U#7=<_TkGvfltNBle_aJm-2juW! zZa#C3hHAiXZ2nuC_Z9rn=yo)frVcmo{z58DxF^i#XdR7eR*LlllpqRYqN%t*hTdsQ zTn~${ZR30pF9Pm0>is6(0t;s*{g$BET|-n6#j7fFeOmQcpahEO*8MH3Rg|_`uYT$brnutv?p|Iddkk2c?H- z?~KzcEcrQmsxq%V=kp?wj013oj}v^sjrM_4j_xCYfbQEop9@*sI9mejIA9C1n?GW! zxF^e#gPIp42YDX~9tjAVpk_@F`sGUTJaDy4C(2#P!tvo4?G0i*XzL5O%V#>jZ(bDv zHQE!X4}0-FogT2HVA*zJ5dVJJ9U>i{pf(V1byihF#$G*NiTIJIUhHr^3OZB&a!;76b#=$G5_?>CtlRV;N?uvB44C9KVu;)U@ zF^`0lbaF*>%vl>3%s76^WG*nnAaHlZG@=@-@~1<)INw5Cz-LT_rzlxL}ZbR#F)31`(9d4tamhv<=4bV9lO8La% z)Bq&!L?1yx?(su|2gQ+@vB4IL>3u^a(si=O!T;HA2n#6sX=JYE)mHgPkRav4n4@CW z;TGWFmnJQ2gR&pgs-RRDJZepWU9wfY!U~QCDV?djd6K+c1z6)H27psl5zQYt(y z;k6S5;e*<7>q`ly_o}>k5+K(B0LVuOh}!@K^E*&O*N)ZDumg*hJvtHu>0DeMeO>8= zD$fi2BToW=RL(O{`kdzFo|kza&txxDG`3S8;&D{)?G+K>78VhK@-kpOk54refZOx& zoR#XxU$jH9=HS90&;+f>%pK!ZuAH1*HO4yzJn?e@unj&HxC7Kd{Qqp%d&rMhM$iAc z(tV5s59%eE63E?iA~OQ z(63a~TAJEAkA+Q2NSQq+R|l>OpQ60N87TTW5?wpVh|jH|d_nz&oeIN2YZJn}W4Oe@ zgJVvLGV%PiGvg=+@8eW>p^X-oyJ3G`re*ES89yVl=?6PUkT zpGe?o#gn2HAUDPh80SmCHUbL@S4r^{e^cqU$~RjMoV{`9dqq%qQYN+P^}4q6A71;r zOo?*x*Ops*-oJFmH(}2D8r!?Szj;TcnN?J3wx9g;+kZ&>CrpY>NM2+x?%37BojUjN ztr3qjVR{a|ZT~^XQTD{;Zv$p5(^u8E_5bENF*R?)=0?}0&%S#+Au(fVk>iJ7(&6WR zZ~y3bgNPdB| delta 4523 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 E9|B67)&Kwi diff --git a/scorch.xex b/scorch.xex index 0408870656ee9eb0fe312b27b8c428d014bbe7e9..13311d1f4d351e766b0862bf625c1481036b1df8 100644 GIT binary patch delta 4496 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 diff --git a/weapons.asm b/weapons.asm index 24a9c8b..f1a8cdb 100644 --- a/weapons.asm +++ b/weapons.asm @@ -835,15 +835,13 @@ ShieldCoveredTank jne EndOfDistanceCheckLoop ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield - mva #1 Erase lda TankNr pha ; store TankNr stx TankNr ; store X in TankNr :) - jsr DrawTankNr ; now erase tank with shield (to erase shield) + jsr ClearTankNr ; now erase tank with shield (to erase shield) lda #0 sta ActiveDefenceWeapon,x ; deactivate defense weapons - sta Erase - jsr DrawTankNr ; draw tank without shield + jsr PutTankNr ; draw tank without shield ldx TankNr ; restore X value :) pla sta TankNr ; restore TankNr value :) @@ -1081,11 +1079,10 @@ ContinueToCheckMaxForce2 lda MaxForceTableL,x sta ForceTableL,x @ - mva #0 Erase jsr PutTankNameOnScreen ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - jsr DrawTankNr + jsr PutTankNr jsr WaitOneFrame ; best after drawing a tank @@ -1915,16 +1912,14 @@ RightDeflection bcs EndOfMagDeflector ; hit of course but we need RTS sbw XHit #36 ; change to left EndOfMagDeflector - mva #1 Erase lda TankNr pha ; store TankNr stx TankNr ; store X in TankNr :) - jsr DrawTankNr ; now erase tank with shield (to erase shield) + jsr ClearTankNr ; now erase tank with shield (to erase shield) lda #0 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon sta ShieldEnergy,x - sta Erase - jsr DrawTankNr ; draw tank without shield + jsr PutTankNr ; draw tank without shield ldx TankNr ; restore X value :) pla sta TankNr ; restore TankNr value :) @@ -1944,11 +1939,10 @@ BouncyCastle @ mva #sfx_shield_on sfx_effect ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! - mva #1 Erase lda TankNr pha ; store TankNr stx TankNr ; store X in TankNr :) - jsr DrawTankNr ; now erase tank with shield (to erase shield) + jsr ClearTankNr ; now erase tank with shield (to erase shield) lda #0 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon sta ShieldEnergy,x @@ -1956,8 +1950,7 @@ BouncyCastle sta ytraj ; sta xtraj+2 ; sta ytraj+2 - sta Erase - jsr DrawTankNr ; draw tank without shield + jsr PutTankNr ; draw tank without shield ; ldx TankNr ; restore X value :) ... but we don't need X now .. pla sta TankNr ; restore TankNr value :) @@ -2382,8 +2375,7 @@ NoWall ; ------------------------------------------------- mva #sfx_death_begin sfx_effect jsr FlashTank ; first we flash tank - mva #1 Erase - jsr DrawTankNr ; and erase tank + jsr ClearTankNr ; and erase tank lda #0 sta Erase ldx TankNr @@ -2531,19 +2523,17 @@ TankGoUp cmp FloatingAlt ; Floating altitude bcc ReachSky ; first erase old tank position - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr lda modify cmp #5 bcc NoEngineClear mva #0 color jsr DrawTankRocketEngine NoEngineClear - mva #0 Erase dec ytankstable,x inc modify ; then draw tank on new position - jsr DrawTankNr + jsr PutTankNr lda modify cmp #5 bcc NoEngine @@ -2671,8 +2661,7 @@ pressedRight ldy #1 jsr DecreaseShieldEnergyX ; first erase old tank position - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr mva #0 Erase lda XtankstableH,x cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 @@ -2695,8 +2684,7 @@ pressedLeft ldy #1 jsr DecreaseShieldEnergyX ; first erase old tank position - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr mva #0 Erase lda XtankstableH,x cmp #0 @@ -2793,8 +2781,7 @@ TankBelow ; tank below - we must move our tank ldx TankNr ; first erase old tank position - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr mva #0 Erase bit OverTankDir bmi PassLeft @@ -2821,8 +2808,7 @@ ItIsMe bpl CheckCollisionWithTankLoop ldx TankNr mva #sfx_shield_off sfx_effect - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr mva #0 Erase ; x correction for P/M ; -- @@ -2851,13 +2837,11 @@ FloatDown cmp OverTankDir bcs OnGround ; first erase old tank position - mva #1 Erase - jsr DrawTankNr + jsr ClearTankNr jsr DrawTankParachute - mva #0 Erase inc ytankstable,x ; then draw tank on new position - jsr DrawTankNr + jsr PutTankNr jsr DrawTankParachute jsr WaitOneFrame jmp FloatDown From 13a5bd05dfd16f0b7d36ba24515965f64636baf5 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Wed, 17 May 2023 11:30:09 +0200 Subject: [PATCH 47/65] Minor optimizations --- Atari/textproc.asm | 6 ++---- scorch.bin | Bin 32768 -> 32768 bytes scorch.xex | Bin 56576 -> 56560 bytes weapons.asm | 6 ++---- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Atari/textproc.asm b/Atari/textproc.asm index db2261d..5f358b1 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -1693,9 +1693,7 @@ AllTanksFloatingDown lda Ytankstable,x cmp #(72-7) ; tank under screen - no erase bcs NoEraseTank - mva #1 Erase - jsr DrawTankNr - mva #0 Erase + jsr ClearTankNr sta ATRACT ; reset atract mode NoEraseTank ldx TankNr @@ -1714,7 +1712,7 @@ NotFastTank TankUnderScreen jsr RandomizeTankPos TankOnScreen - jsr DrawTankNr + jsr PutTankNr DrawOnlyParachute lda ActiveDefenceWeapon,x bne FastTank diff --git a/scorch.bin b/scorch.bin index 46e66e0170d88d17819f40ed2b20a45db68e0754..bba74c163eecc86eee773d5858284308594a75a6 100644 GIT binary patch delta 4853 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 delta 4780 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 diff --git a/scorch.xex b/scorch.xex index 13311d1f4d351e766b0862bf625c1481036b1df8..29cc84d18f02e02e262f1876cc5a35720614d2b6 100644 GIT binary patch delta 4957 zcmaJk3sh5Aw%ibY0l5KV`6zHeR3d1pp9gLIwOR-5MQdfm)>@O`>JnlL0g;~&2wn(C zEO0PHB#6k3xkwO1tuV$~pQc{gV(KgSI;-RKY0Jo)su6YUXdk|P6SN&y-y^Jh&e>=0 zefHV^Q`+zD=yUI0zm@3gP1))pBv#>fx0#4rm`EQac3^w@nn|gJD5eB`oQtR|bP~sA zgo$>QAVnc+D?<12+Zjn}X#w@-T9akKnm{_dtp?KJj%4)%Vh6gPW!i4_BWYy^Y}wr@ z-!<$L`p+mOpCxFsNooCRgU%*Ek29=tKSvnyZ8Ry-OeI3=EIwDbX?AyXHlG=G5HhMN z+1gLi@1cMc){WL9q1Fk8InT?aR$A*xF3J(aA%}>IwNFFMC2$maxgH(a$4~Cnvu?(E zGJ06tC%f%KqVM%^%(Vm({a1Cn(#ge;$DDP9qx&U@$z_yuF~_#a7i{`v!ECw3Ra=q?J#4JJO#Pn%+OypN*w;R zp5q%ORP4HI&Myka*FPE|PGK(dHKGLjW`)65niUVwDt(;YK=-nx z^nbz`-%aiT!*Sl>IYR=C4bUVcs>ayd{%1}em{6=A|1g-Fp$ zRRj@}U&p?V&%4+rg;P7L5z_sk`x;*33OiA3DLX9gk1 z-@|t|_N<8_j$mm`c(7;YTS?6INfBbO^r9l>tUZBAi=U6a#9M0Sg?MHHY^2mK7%5}Q zE>_xwOzFi6hdUL3J8Gyh_|^mm7nsMBF+gII+u#_*sEAg;F}$ju9^s;N>RvWF z$t4A>TwoU$SUP1C;!CwJ5R33%Yr{Rtctv4B-E>&btc!$iQe6amx79_=eoD=H(kg~s zMa&UhkwRK~#ucQx32FcU?x}lqmcNQQA|=4hHs|olu{%)Zrkl+v;7H}&IILc@_t)SDK z0^qYa3a8^qL6)7c15i{}u~zCvLbsJ7|o1Qidx-zRJ5W;1#;A> zz`iLsupyqfkC!*BA}(QFLjtiLUu;MuuHx~AxdCz$ecU>1qI+-h-)yTKFW$!x75K)! z7~(VRr=LxP-~|0VA`oZjUz!qFV5_y?l08j6Ob>k(mEdmu{HcKj&PCpOuyHLbq0DAn7V_UD|{W;yH~)#2m~v#t@5ouQXN?L<)X)|0-fvZ~Ok`gx4>0 zI+KxZ?!DdgCNcR&$-sd4pP;U`{Pv6NA88x9fvM(5;dwnWV^yP9$L2!7V|XD}dmb{ULuMgk}JUlcJ}Vs4~p&3Kih?qOAH0`VedTjvL)m2c}95MLi0BrStvygOyX zw_1__0ef!Y+16WT*t$ zj6A*F+c|T=L1|{HwUV6*d*iyhBunVVNJgf+Lo#xmgS6n9Ln0yoHy$zurxaQ4LP!mc zk%M7!jY z zDa;o2W4@3=C`9YU?&#-glM-^aS?b}KYmf>ZOAJy0-*QKN_0jLc@fr23C+g&j!!UKJn%fH}sjIk;Vd$^oI$@}*=IZP|%$8M8=q-RD zUCQ}8=v$caYXX()bZc!SW+W#3Gp2ULM~;Qt#l1BT}_c z3(^`BVQT`d491_R7qi)>Zv6;Al1xM%1V06rNyF1brQu#H^Iq=KRXu0J+-`hNZ-X>a~ z#qZ(AUEvF1eBN<8p$GHQ)%6~G=k|iL^8-J}M~=?&zPOj0;ouj;M;8#S z*tauw`9v@o7n4up>FMDs+dnug>#HF-4-o6To}EM+|0Vu_g#Mf!fHGRp8AoWbsdEl| zzvKuLTiZF;V~foIUbncM_tp2 zY8-wnSZK(Da`MWthLy?L&dkBLR>lOPQW34-TW^yYXG@^3~DEyjy6aV1KwWfBF7Z26O!gZKj&ZE`~fM%4NbFGUU$ptGqfg;O9N0pmH z&BhZL{||T84eiE(Jy8;{{fH|I{<> z?c@gNWQ=SeM5uiMzq@2&S7kMmoSWUl+6JyzE56o7@-xV{*UThU?xJb~Dn3&~;)GXU z?>_1%c1k@B-Yct*PhI|94$y$}nMqm> pj!panbpt>XM}5oyA9cGZw+k-Fx?eX0 zr%QN9`UIpl9y(2USalwsDVC_H|7aKxw}5{9!Rr3_`tgNt`m3P59Pi=-$kk_3dHbB% z%+;(yf?y7Dfev@jD~JY-3-tdcWiXtbE_BM24lfyKJD^R#ie4>*&)<8o&rfRW;>C#2C^8|lU=hVKj>``7P3v_H8K>