Files
scorch_src/program.lst
T
2018-04-22 01:34:59 +02:00

9006 lines
360 KiB
Plaintext

mads 1.9.7 build 53 (29 Sep 13)
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2 ;Atari 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 ;you can contact us at pecus@poczta.fm or pirx@91.pl
7 ;home page of this project is http://pecus.pigwa.net/pliki/Atari/scorch/
8
9 ;this source code was compiled under OMC65 crossassembler
10 ;and on 2012-06-21 translated to mads
11 ;
12 ;game source code is split into 5 parts:
13 ;program.s65 is the main game code (with many assorted routines)
14 ;grafproc.s65 - graphics routines like line or circle
15 ;textproc.s65 - text routines like list of weapons and shop
16 ;variables.s65 - all non-zero page variables and constans
17 ;display.s65 - display lists and text screen definitions
18
19 ;we were trying to use as much macros and pseudoops as possible
20 ;they are defined in atari.hea and macro.hea files together with many
21 ;atari constans. This way it shoud be relatively easy to
22 ;port this code to e.g. C64
23 ;
24 ;After those N years of working on this piece of code
25 ;we are sure it would be much wiser to write it in C or
26 ;Action!, but on the other hand it is so much fun to type 150 chars
27 ;where you want to have y=ax+b :)
28 ;
29 ;originally most variables were in Polish, comments were rare
30 ;but we wanted to release this piece of code to public
31 ;and due to being always short of time (to finish the game)
32 ;we decided it must go in 'English' to let other people work on it
33
34 .zpvar xdraw .word = $80 ;variable X for plot
35 .zpvar ydraw .word;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
36 .zpvar xbyte .word
37
38 .zpvar ybyte .word
39 .zpvar CharCode .byte
40 .zpvar fontind .word
41 .zpvar tanknr .byte
42 .zpvar TankSequencePointer .byte
43 .zpvar oldplot .word
44 .zpvar xc .word
45 .zpvar temp .word ;temporary word for the most embeded loops only
46 .zpvar temp2 .word;same as above
47 .zpvar tempXROLLER .word;same as above for XROLLER routine
48 ;(used also in result display routine)
49 .zpvar xtempDRAW .word ;same as above for XDRAW routine
50 .zpvar ytempDRAW .word ;same as above for XDRAW routine
51 ;--------------temps used in circle routine
52 .zpvar xi .word ;X (word) in draw routine
53 .zpvar fx .byte ;circle drawing variables
54 .zpvar yi .word ;Y (word) in draw routine
55 .zpvar fy .byte
56 .zpvar xk .word
57 .zpvar fs .byte
58 .zpvar yc .byte ;ycircle - temporary for circle
59 .zpvar dx .word
60 .zpvar tempor2 .byte
61 .zpvar dy .word
62 .zpvar tempor3 .word
63 .zpvar dd .word
64 .zpvar di .word
65 .zpvar dp .word
66 .zpvar modify .word
67 .zpvar weaponPointer .word
68
69 ;-------------------------------
70 ;constants
71 = 0096 FlyDelay=150
72 = 00C8 screenheight=200
73 = 0028 screenBytes = 40
74 = 0140 screenwidth=screenBytes*8
75 = 0030 margin=48 ;mountain drawing Y variable margin
76 = 1010 display=$1010 ;kill dos with the casette recorder!
77 = 0006 MaxPlayers = 6
78
79 icl '../lib/atari.hea'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\atari.hea
1 /*
2 scr48 = %00111111 ;screen 48b
3 scr40 = %00111110 ;screen 40b
4 scr32 = %00111101 ;screen 32b
5 */
5
6
7 * ---------------------------------------------------------------------------------------------
8 * --- GTIA
9 * ---------------------------------------------------------------------------------------------
10 = D000 hposp0 = $D000 ; pozioma pozycja gracza 0 (Z)
11 = D001 hposp1 = $D001 ; pozioma pozycja gracza 1 (Z)
12 = D002 hposp2 = $D002 ; pozioma pozycja gracza 2 (Z)
13 = D003 hposp3 = $D003 ; pozioma pozycja gracza 3 (Z)
14 = D004 hposm0 = $D004 ; pozioma pozycja pocisku 0 (Z)
15 = D005 hposm1 = $D005 ; pozioma pozycja pocisku 1 (Z)
16 = D006 hposm2 = $D006 ; pozioma pozycja pocisku 2 (Z)
17 = D007 hposm3 = $D007 ; pozioma pozycja pocisku 3 (Z)
18 = D008 sizep0 = $D008 ; poziomy rozmiar gracza 0 (Z)
19 = D009 sizep1 = $D009 ; poziomy rozmiar gracza 1 (Z)
20 = D00A sizep2 = $D00A ; poziomy rozmiar gracza 2 (Z)
21 = D00B sizep3 = $D00B ; poziomy rozmiar gracza 3 (Z)
22 = D00C sizem = $D00C ; poziomy rozmiar pocisków (Z)
23 = D00D grafp0 = $D00D ; rejestr grafiki gracza 0 (Z)
24 = D00E grafp1 = $D00E ; rejestr grafiki gracza 1 (Z)
25 = D00F grafp2 = $D00F ; rejestr grafiki gracza 2 (Z)
26 = D010 grafp3 = $D010 ; rejestr grafiki gracza 3 (Z)
27 = D011 grafm = $D011 ; rejestr grafiki pocisków (Z)
28 = D012 colpm0 = $D012 ; rejestr koloru gracza i pocisku 0 (Z)
29 = D013 colpm1 = $D013 ; rejestr koloru gracza i pocisku 1 (Z)
30 = D014 colpm2 = $D014 ; rejestr koloru gracza i pocisku 2 (Z)
31 = D015 colpm3 = $D015 ; rejestr koloru gracza i pocisku 3 (Z)
32 = D016 colpf0 = $D016 ; rejestr koloru pola gry 0 (Z)
33 = D017 colpf1 = $D017 ; rejestr koloru pola gry 1 (Z)
34 = D018 colpf2 = $D018 ; rejestr koloru pola gry 2 (Z)
35 = D019 colpf3 = $D019 ; rejestr koloru pola gry 3 (Z)
36 = D01A colbak = $D01A ; rejestr koloru t³a (Z)
37
38 = D016 color0 = colpf0
39 = D017 color1 = colpf1
40 = D018 color2 = colpf2
41 = D019 color3 = colpf3
42
43 = D000 kolm0pf = $D000 ; kolizja pocisku 0 z polem gry (O)
44 = D001 kolm1pf = $D001 ; kolizja pocisku 1 z polem gry (O)
45 = D002 kolm2pf = $D002 ; kolizja pocisku 2 z polem gry (O)
46 = D003 kolm3pf = $D003 ; kolizja pocisku 3 z polem gry (O)
47 = D004 kolp0pf = $D004 ; kolizja gracza 0 z polem gry (O)
48 = D005 kolp1pf = $D005 ; kolizja gracza 1 z polem gry (O)
49 = D006 kolp2pf = $D006 ; kolizja gracza 2 z polem gry (O)
50 = D007 kolp3pf = $D007 ; kolizja gracza 3 z polem gry (O)
51 = D008 kolm0p = $D008 ; kolizja pocisku 0 z graczem (O)
52 = D009 kolm1p = $D009 ; kolizja pocisku 1 z graczem (O)
53 = D00A kolm2p = $D00A ; kolizja pocisku 2 z graczem (O)
54 = D00B kolm3p = $D00B ; kolizja pocisku 3 z graczem (O)
55 = D00C kolp0p = $D00C ; kolizja gracza 0 z innym graczem (O)
56 = D00D kolp1p = $D00D ; kolizja gracza 1 z innym graczem (O)
57 = D00E kolp2p = $D00E ; kolizja gracza 2 z innym graczem (O)
58 = D00F kolp3p = $D00F ; kolizja gracza 3 z innym graczem (O)
59 = D010 trig0 = $D010 ; stan przycisku joysticka 0 (O)
60 = D011 trig1 = $D011 ; stan przycisku joysticka 1 (O)
61 = D013 trig3 = $D013 ; znacznik do³¹czenia cartridge-a (O)
62 = D014 pal = $D014 ; znacznik systemu TV (O)
63
64 = D01B gtictl = $D01B ; rejestr kontroli uk³adu GTIA
65 = D01B gtiactl = gtictl
66
67 = D01C vdelay = $D01C ; licznik opóŸnienia pionowego P/MG
68 = D01D pmcntl = $D01D ; rejestr kontroli graczy i pocisków
69 = D01E hitclr = $D01E ; rejestr kasowania rejestrów kolizji
70 = D01F consol = $D01F ; rejestr stanu klawiszy konsoli Start (bit 0), Select (bit 1), Option (bit 2)
71
72 * ---------------------------------------------------------------------------------------------
73 * --- POKEY
74 * ---------------------------------------------------------------------------------------------
75
76 = 0010 irqens = $0010 ; rejestr-cieñ IRQEN
77 = 0011 irqstat = $0011 ; rejestr-cieñ IRQST
78
79 = D204 audf3 = $D204 ; czêstotliwoœæ pracy generatora 3 (Z)
80 = D208 audctl = $D208 ; rejestr kontroli generatorów dŸwiêku (Z)
81 = D209 stimer = $D209 ; rejestr zerowania liczników (Z)
82 = D209 kbcode = $D209 ; kod ostatnio naciœniêtego klawisza (O)
83 = D20A skstres = $D20A ; rejestr statusu z³¹cza szeregowego (Z)
84 = D20A random = $D20A ; rejestr liczby losowej (O)
85 = D20D serout = $D20D ; szeregowy rejestr wyjœciowy (Z)
86 = D20D serin = $D20D ; szeregowy rejestr wejœciowy (O)
87 = D20E irqen = $D20E ; zezwolenie przerwañ IRQ (Z)
88 = D20E irqst = $D20E ; status przerwañ IRQ (O)
89 = D20F skctl = $D20F ; rejestr kontroli z³¹cza szeregowego (Z)
90 = D20F skstat = $D20F ; rejestr statusu z³¹cza szeregowego (O)
91
92 * ---------------------------------------------------------------------------------------------
93 * --- PIA
94 * ---------------------------------------------------------------------------------------------
95 = D300 porta = $D300 ; port A uk³adu PIA
96 = D301 portb = $D301 ; port B uk³adu PIA
97 = D302 pactl = $D302 ; rejestr kontroli portu A
98 = D303 pbctl = $D303 ; rejestr kontroli portu B
99
100 * ---------------------------------------------------------------------------------------------
101 * --- ANTIC
102 * ---------------------------------------------------------------------------------------------
103 = D400 dmactl = $D400 ; rejestr kontroli dostêpu do pamiêci
104 = D401 chrctl = $D401 ; rejestr kontroli wyœwietlania znaków
105 = D402 dlptr = $D402 ; adres programu ANTIC-a
106 = D404 hscrol = $D404 ; znacznik poziomego przesuwu obrazu
107 = D405 vscrol = $D405 ; znacznik pionowego przesuwu obrazu
108 = D407 pmbase = $D407 ; adres pamiêci graczy i pocisków
109 = D409 chbase = $D409 ; adres zestawu znaków
110 = D40A wsync = $D40A ; znacznik oczekiwania na synchronizacjê poziom¹
111 = D40B vcount = $D40B ; licznik linii obrazu
112 = D40C lpenh = $D40C ; poziome po³o¿enie pióra œwietlengo
113 = D40D lpenv = $D40D ; pionowe po³o¿enie pióra œwietlnego
114 = D40E nmien = $D40E ; rejestr zezwoleñ na przerwania NMI
115 = D40F nmist = $D40F ; rejestr statusu przerwañ NMI
116
117 ;-------------------------------------
118 ;additional system variables
119 ;-------------------------------------
120 = 02C0 COLPM0S = $02C0 ;- - rejestr-cieñ COLPM0
121 = 02C1 COLPM1S = $02C1 ;- - rejestr-cieñ COLPM1
122 = 02C2 COLPM2S = $02C2 ;- - rejestr-cieñ COLPM2
123 = 02C3 COLPM3S = $02C3 ;- - rejestr-cieñ COLPM3
124 = 02C4 COLPF0S = $02C4 ;- - rejestr-cieñ COLPF0
125 = 02C5 COLPF1S = $02C5 ;- - rejestr-cieñ COLPF1
126 = 02C6 COLPF2S = $02C6 ;- - rejestr-cieñ COLPF2
127 = 02C7 COLPF3S = $02C7 ;- - rejestr-cieñ COLPF3
128
129 = 02C8 COLBAKS = $02C8
130 = 026F GTICTLS = $026F ;- - rejestr-cieñ GTIACTL
131
132 = 022F DMACTLS = $022F ;- - rejestr kontroli dostêpu do pamiêci - cieñ
133 = 0230 DLPTRS = $0230 ;- - adres programu ANTIC-a - cieñ
134 = 02F4 CHBAS = $02F4 ;- - rejestr-cieñ CHBASE
135 = 02FC KBCODES = $02FC ;- - rejestr-cieñ KBCODE
136
137 = E45C SETVBV = $E45C
138 = E462 XITVBV = $E462
139 = E45F SYSVBV = $E45F
140 = 0012 RTCLOK = $0012
141
142 = 02E5 MEMTOP = $02E5 ;- - adres górnej granicy wolnej pamiêci RAM
143 = 02E7 MEMLO = $02E7 ;- - adres dolnej granicy wolnej pamiêci RAM
144
145 = 0278 JSTICK0 = $0278 ;- - po³o¿enie joysticka 0
146 = 0279 JSTICK1 = $0279 ;- JSTICK1 - po³o¿enie joysticka 1
147 = 027A JSTICK2 = $027A ;- JSTICK2 - po³o¿enie joysticka 0
148 = 027B JSTICK3 = $027B ;- JSTICK3 - po³o¿enie joysticka 1
149 = 027C PTRIG0 = $027C ;- PTRIG0 - przycisk potencjometru 0
150 = 027D PTRIG1 = $027D ;- PTRIG1 - przycisk potencjometru 1
151 = 0284 TRIG0S = $0284 ;- TRIG0S - przycisk joysticka 0, rejestr-cieñ TRIG0
152 = 0285 TRIG1S = $0285 ;- TRIG1S - przycisk joysticka 1, rejestr-cieñ TRIG1
153 = 0286 TRIG2S = $0286 ;- TRIG2S - rejestr-cieñ TRIG0
154 = 0287 TRIG3S = $0287 ;- TRIG3S - rejestr-cieñ TRIG1
155
156
157 /*
158 Rejestry OS w pamiêci RAM
159
160 $08 - WARMST - znacznik gor¹cego startu
161 $0E - APPMHI - najwy¿szy adres RAM zajêty przez program
162 $10 - IRQENS - rejestr-cieñ IRQEN
163 $11 - IRQSTAT - rejestr-cieñ IRQST
164 $12 - RTCLOK - zegar czasu rzeczywistego
165 $15 - BUFADR - adres bufora dla operacji dyskowych
166 $17 - ICCOMT - rejestr przejœciowy kodu operacji I/O
167 $20 - ZIOCB - zerostronicowy blok kontroli I/O
168 $20 - ICHIDZ - indeks wpisu urz¹dzenia w HATABS
169 $21 - ICDNOZ - numer urz¹dzenia
170 $22 - ICCOMZ - kod operacji wejœcia/wyjœcia
171 $23 - ICSTZ - status operacji wejœcia/wyjœcia
172 $24 - ICBAZ - adres bufora danych dla operacji I/O
173 $26 - ICPTZ - adres procedury obs³ugi dla operacji
174 $28 - ICBLZ - d³ugoœæ bufora danych dla operacji I/O
175 $2A - ICAX1Z - rejestr pomocniczy ZIOCB
176 $2B - ICAX2Z - rejestr pomocniczy ZIOCB
177 $2C - ICAX3Z - rejestr pomocniczy ZIOCB
178 $2D - ICAX4Z - rejestr pomocniczy ZIOCB
179 $2E - ICAX5Z - rejestr pomocniczy ZIOCB
180 $2F - ICAX6Z - rejestr pomocniczy ZIOCB
181 $30 - STATUS - status aktualnej operacji SIO
182 $31 - CHKSUM - suma kontrolna dla operacji SIO
183 $32 - BUFR - adres bufora danych dla SIO
184 $34 - BUFEN - adres koñca bufora danych dla SIO
185 $36 - LTEMP - pomocniczy wektor odczytu listy liniowej
186 $38 - BUFRFL - znacznik zape³nienia bufora SIO
187 $39 - RECVND - znacznik koñca odczytu
188 $3A - XMTDON - znacznik koñca transmisji
189 $3B - CHKSNT - znacznik nadania sumy kontrolnej
190 $3C - NOCKSM - znacznik braku sumy kontrolnej
191 $3D - BPTR - licznik bufora magnetofonu
192 $3E - GAPTYP - znacznik d³ugoœci przerwy miêdzy blokami
193 $3F - FEOF - znacznik koñca zbioru
194 $40 - FREQ - licznik dŸwiêku przy otwarciu magnetofonu
195 $41 - IOSNDEN - znacznik dŸwiêku przy transmisji
196 $42 - CRITIC - znacznik krytycznych czasowo operacji I/O
197 $4A - ZCHAIN - rejestr nastêpstwa listy liniowej
198 $4C - DSTAT - status klawiatury i ekranu
199 $50 - TEMP - pomocniczy rejestr przejœciowy
200 $51 - HOLD1 - pomocniczy rejestr przejœciowy
201 $52 - LMARGIN - lewy margines obrazu
202 $53 - RMARGIN - prawy margines obrazu
203 $54 - ROWCRS - pionowa pozycja kursora
204 $55 - COLCRS - pozioma pozycja kursora
205 $57 - DINDEX - numer trybu graficznego OS
206 $58 - SAVMSC - adres pamiêci obrazu
207 $5A - OLDROW - poprzednia pionowa pozycja kursora
208 $5B - OLDCOL - poprzednia pozioma pozycja kursora
209 $5D - OLDCHR - poprzedni znak na ekranie
210 $5E - OLDADR - poprzedni adres znaku na ekranie
211 $60 - FKDEFP - wektor tabeli definicji klawiszy F1-F4
212 $62 - PALNTS - wskaŸnik systemu TV
213 $63 - LOGCOL - adres kursora w wierszu logicznym
214 $64 - ADRESS - rejestr adresowy dla procedur edytora
215 $66 - MLTTMP - pomocniczy rejestr przejœciowy
216 $68 - SAVADR - pomocniczy rejestr adresowy
217 $6A - RAMTOP - liczba stron pamiêci RAM
218 $6B - BUFCNT - licznik bufora edytora
219 $6C - BUFSTR - adres bufora dla edytora
220 $6E - BITMSK - maska bitowa do wyœwietlenia znaku
221 $6F - SHFAMT - liczba przesuniêæ punktu
222 $70 - ROWAC - aktualny wiersz przy rysowaniu
223 $72 - COLAC - aktualna kolumna przy rysowaniu
224 $74 - ENDPT - znacznik koñca rysowanej linii
225 $76 - DELTAR - przyrost pionowej pozycji kursora
226 $77 - DELTAC - przyrost poziomej pozycji kursora
227 $79 - KEYDEFP - wektor tabeli definicji klawiszy
228 $7B - SWPFLG - znacznik kursora w trybach z oknem
229 $7C - HOLDCH - przechowywanie wartoœci znaku
230 $7D - INSDAT - rejestr pomocniczy edytora
231 $7E - COUNTR - licznik pamiêci obrazu dla DOSCR i DRAW
232 $0100 - STACK - stos mikroprocesora 6502
233 $0200 - DLIV - wektor przerwania programu ANTIC-a
234 $0210 - VTIMR1 - wektor przerwania licznika 1 POKEY-a
235 $0212 - VTIMR2 - wektor przerwania licznika 2 POKEY-a
236 $0214 - VTIMR4 - wektor przerwania licznika 4 POKEY-a
237 $0218 - TIMCNT1 - pierwszy licznik systemu
238 $0226 - TIMVEC1 - wektor przerwania licznika TIMCNT1
239 $022A - TIMFLG3 - znacznik wyzerowania licznika TIMCNT3
240 $022F - DMACTLS - rejestr-cieñ DMACTL
241 $0230 - DLPTRS - rejestr-cieñ DLPTR
242 $0232 - SKCTLS - rejestr-cieñ SKCTL
243 $0233 - LCOUNT - licznik odczytu dla nowego urz¹dzenia
244 $0234 - LPENHS - rejestr-cieñ LPENH
245 $0235 - LPENVS - rejestr-cieñ LPENV
246 $023A - CDEVIC - kod urz¹dzenia dla SIO
247 $023B - CCMND - kod operacji dla SIO
248 $023C - CAUX1 - pierwszy bajt pomocniczy dla SIO
249 $023D - CAUX2 - drugi bajt pomocniczy dla SIO
250 $023E - TEMP - tymczasowy rejestr odpowiedzi urz¹dzenia
251 $023F - ERRFLG - znacznik b³êdu operacji SIO
252 $0244 - COLDST - znacznik zimnego startu systemu
253 $0245 - RECLEN - d³ugoœæ rekordu z nowego urz¹dzenia
254 $0246 - DSKTIM - wartoœæ Timeout dla stacji dysków
255 $0247 - PDVMSK - maska obecnoœci nowych urz¹dzeñ
256 $0248 - PDVRS - rejestr-cieñ PDVREG
257 $024A - RELADR - adres procedury przemieszczalnej
258 $024C - PPTMPA - rejestr przechowania zawartoœci akumulatora
259 $024D - PPTMPX - rejestr przechowania zawartoœci rejestru X
260 $026B - CHSPTR - wektor nieu¿ywanego zestawu znaków
261 $026C - VSFLAG - znacznik przesuwu pionowego obrazu
262 $026E - FINE - znacznik delikatnego przesuwu obrazu
263 $026F - GTICTLS - rejestr-cieñ GTIACTL
264 $0270 - PADDL0 - rejestr-cieñ POT0
265 $0278 - JSTICK0 - po³o¿enie joysticka 0
266 $0279 - JSTICK1 - po³o¿enie joysticka 1
267 $027A - JSTICK2 - po³o¿enie joysticka 0
268 $027B - JSTICK3 - po³o¿enie joysticka 1
269 $027C - PTRIG0 - przycisk potencjometru 0
270 $027D - PTRIG1 - przycisk potencjometru 1
271 $0284 - TRIG0S - przycisk joysticka 0, rejestr-cieñ TRIG0
272 $0285 - TRIG1S - przycisk joysticka 1, rejestr-cieñ TRIG1
273 $0286 - TRIG2S - rejestr-cieñ TRIG0
274 $0287 - TRIG3S - rejestr-cieñ TRIG1
275 $0288 - HIBYTE - indeks operacji nowego urz¹dzenia
276 $0289 - WMODE - znacznik sposobu dostêpu do magnetofonu
277 $028A - BLIM - d³ugoœæ bufora magnetofonu
278 $028E - NEWADR - adres procedury nowego urz¹dzenia
279 $0290 - TXTROW - wiersz kursora w oknie tekstowym
280 $0291 - TXTCOL - kolumna kursora w oknie tekstowym
281 $0293 - TINDEX - tryb graficzny OS w oknie tekstowym
282 $0294 - TXTMSC - adres pamiêci okna tekstowego
283 $029C - CRETRY - liczba powtórzeñ rozkazu operacji
284 $029D - HOLD3 - pomocniczy rejestr przejœciowy
285 $029E - SUBTMP - pomocniczy rejestr przejœciowy
286 $02A0 - DMASK - maska punktów obrazu
287 $02A2 - ESCFLG - znacznik klawisza ESC
288 $02A3 - TABMAP - mapa pozycji tabulacji
289 $02B2 - LOGMAP - mapa linii logicznych
290 $02B6 - INVFLG - znacznik klawisza inverse video
291 $02B7 - FILFLG - znacznik wype³niania obrazu
292 $02B8 - TMPROW - tymczasowy rejestr pozycji kursora
293 $02B9 - TMPCOL - tymczasowy rejestr pozycji kursora
294 $02BB - SCRFLG - znacznik przesuwu obrazu
295 $02BC - HOLD4 - pomocniczy rejestr przejœciowy
296 $02BD - DRETRY - liczba powtórzeñ wywo³añ urz¹dzenia
297 $02BE - SHFLOK - znacznik klawiszy SHIFT i CONTROL
298 $02BF - BOTSCR - liczba wierszy tekstu
299 $02C0 - COLPM0S - rejestr-cieñ COLPM0
300 $02C1 - COLPM1S - rejestr-cieñ COLPM1
301 $02C2 - COLPM2S - rejestr-cieñ COLPM2
302 $02C3 - COLPM3S - rejestr-cieñ COLPM3
303 $02C4 - COLPF0S - rejestr-cieñ COLPF0
304 $02C5 - COLPF1S - rejestr-cieñ COLPF1 ;gr.8 letters
305 $02C6 - COLPF2S - rejestr-cieñ COLPF2 ;gr.8 background
306 $02C7 - COLPF3S - rejestr-cieñ COLPF3
307 $02C8 - COLBAKS - rejestr-cieñ COLBAK
308 $02C9 - RUNADR - adres procedury nowego urz¹dzenia
309 $02CB - HIUSED - adres koñcowy procedury nowego urz¹dzenia
310 $02CF - GBYTEA - adres procedury nowego urz¹dzenia
311 $02D1 - LOADAD - adres wczytywania z nowego urz¹dzenia
312 $02D3 - ZLOADA - pomocniczy rejestr adresu wczytywania
313 $02D5 - DSCTLN - d³ugoœæ sektora dyskowego
314 $02DB - NOCLIK - znacznik dŸwiêku klawiatury
315 $02DE - PBPNT - licznik bufora drukarki
316 $02DF - PBUFSZ - d³ugoœæ bufora drukarki
317 $02E5 - MEMTOP - adres górnej granicy wolnej pamiêci RAM
318 $02E7 - MEMLO - adres dolnej granicy wolnej pamiêci RAM
319 $02E9 - HNDLOD - znacznik relokowalnej procedury obs³ugi I/O
320 $02EA - DVSTAT - dodatkowy rejestr statusu urz¹dzenia
321 $02EC - DVTMOT - dodatkowy rejestr Timeout urz¹dzenia
322 $02ED - REVNUM - numer wersji nowego urz¹dzenia
323 $02EE - CBAUD - prêdkoœæ transmisji z magnetofonu
324 $02F0 - CRSINH - znacznik widocznoœci kursora
325 $02F3 - CHACT - rejestr-cieñ CHRCTL
326 $02F4 - CHBAS - rejestr-cieñ CHBASE
327 $02F5 - NEWROW - nowa pozycja pionowa kursora
328 $02F6 - NEWCOL - nowa pozycja pozioma kursora
329 $02F8 - ROWINC - zmiana pionowej pozycji kursora
330 $02F9 - COLINC - zmiana poziomej pozycji kursora
331 $02FA - CHAR - kod wewnêtrzny znaku
332 $02FB - ATACHR - kod ATASCII znaku
333 $02FC - KBCODES - rejestr-cieñ KBCODE
334 $02FD - FILDAT - numer koloru dla wype³niania
335 $02FE - DSPFLG - znacznik wyœwietlania znaków kontrolnych
336 $02FF - SSFLAG - znacznik start/stop dla przesuwu obrazu
337 $0300 - DDEVIC - kod identyfikacyjny urz¹dzenia
338 $0301 - DUNIT - numer identyfikacyjny urz¹dzenia
339 $0302 - DCMND - bajt rozkazu dla urz¹dzenia
340 $0303 - DSTATS - status urz¹dzenia
341 $0304 - DBUFA - adres bufora danych
342 $0306 - DTIMLO - wartoœæ Timeout dla urz¹dzenia
343 $0308 - DBYT - d³ugoœæ bufora danych
344 $030A - DAUX1 - rejestr pomocniczy dla operacji I/O
345 $030B - DAUX2 - rejestr pomocniczy dla operacji I/O
346 $030C - INTIM1 - rejestr czasu przy odczycie z magnetofonu
347 $030F - CASFLG - znacznik operacji z magnetofonem
348 $0310 - INTIM2 - rejestr czasu przy odczycie z magnetofonu
349 $0312 - TEMP1 - pomocniczy rejestr przejœciowy
350 $0313 - TEMP2 - pomocniczy rejestr przejœciowy
351 $0314 - PTIMOT - wartoϾ Timeout dla drukarki
352 $0315 - TEMP3 - pomocniczy rejestr przejœciowy
353 $0316 - SAVIO - rejestr przejœciowy dla operacji SIO
354 $0317 - TIMFLG - znacznik up³yniêcia czasu Timeout
355 $0318 - STACKP - rejestr wskaŸnika stosu dla SIO
356 $0319 - TSTAT - przejœciowy rejestr statusu SIO
357 $031A - HATABS - tabela wektorów procedur obs³ugi
358 $0340 - IOCB0 - blok kontroli I/O numer 0
359 $0350 - IOCB1 - blok kontroli I/O numer 1
360 $0360 - IOCB2 - blok kontroli I/O numer 2
361 $0370 - IOCB3 - blok kontroli I/O numer 3
362 $0380 - IOCB4 - blok kontroli I/O numer 4
363 $0390 - IOCB5 - blok kontroli I/O numer 5
364 $03A0 - IOCB6 - blok kontroli I/O numer 6
365 $03B0 - IOCB7 - blok kontroli I/O numer 7
366 $0340 - ICCHID - indeks wpisu urz¹dzenia w HATABS
367 $0341 - ICDNO - numer urz¹dzenia
368 $0342 - ICCMD - kod rozkazu operacji I/O
369 $0343 - ICSTAT - status operacji I/O
370 $0344 - ICBUFA - adres bufora danych dla operacji I/O
371 $0346 - ICPUTB - adres procedury przesy³ania danych
372 $0348 - ICBUFL - d³ugoœæ bufora danych dla operacji I/O
373 $034A - ICAX1 - rejestr pomocniczy dla operacji I/O
374 $034B - ICAX2 - rejestr pomocniczy dla operacji I/O
375 $034C - ICAX3 - rejestr pomocniczy dla operacji I/O
376 $034D - ICAX4 - rejestr pomocniczy dla operacji I/O
377 $034E - ICAX5 - rejestr pomocniczy dla operacji I/O
378 $034F - ICAX6 - rejestr pomocniczy dla operacji I/O
379 $03C0 - PRNBUF - bufor drukarki
380 $03E8 - SUPERF - znacznik stosowany przy odczycie klawiatury
381 $03E9 - CKEY - znacznik klawisza START przy zimnym starcie
382 $03EC - DERRF - znacznik b³êdu przy otwieraniu edytora
383 $03FB - CHLINK - rejestr elementów listy liniowej
384 $03FD - CSCB - bajty kontroli szybkoœci magnetofonu
385 $03FF - CRCB - bajt d³ugoœci rekordu magnetofonowego
386 $0400 - CASBUF - bufor magnetofonu
387 $047F - CASBEN - koniec bufora magnetofonu
388 $D000 - HPOSP0 - pozioma pozycja gracza 0 (Z)
389 $D000 - KOLM0PF - kolizja pocisku 0 z polem gry (O)
390 $D001 - HPOSP1 - pozioma pozycja gracza 1 (Z)
391 $D001 - KOLM1PF - kolizja pocisku 1 z polem gry (O)
392 $D002 - HPOSP2 - pozioma pozycja gracza 2 (Z)
393 $D002 - KOLM2PF - kolizja pocisku 2 z polem gry (O)
394 $D003 - HPOSP3 - pozioma pozycja gracza 3 (Z)
395 $D003 - KOLM3PF - kolizja pocisku 3 z polem gry (O)
396 $D004 - HPOSM0 - pozioma pozycja pocisku 0 (Z)
397 $D004 - KOLP0PF - kolizja gracza 0 z polem gry (O)
398 $D005 - HPOSM1 - pozioma pozycja pocisku 1 (Z)
399 $D005 - KOLP1PF - kolizja gracza 1 z polem gry (O)
400 $D006 - HPOSM2 - pozioma pozycja pocisku 2 (Z)
401 $D006 - KOLP2PF - kolizja gracza 2 z polem gry (O)
402 $D007 - HPOSM3 - pozioma pozycja pocisku 3 (Z)
403 $D007 - KOLP3PF - kolizja gracza 3 z polem gry (O)
404 $D008 - SIZEP0 - poziomy rozmiar gracza 0 (Z)
405 $D008 - KOLM0P - kolizja pocisku 0 z graczem (O)
406 $D009 - SIZEP1 - poziomy rozmiar gracza 1 (Z)
407 $D009 - KOLM1P - kolizja pocisku 1 z graczem (O)
408 $D00A - SIZEP2 - poziomy rozmiar gracza 2 (Z)
409 $D00A - KOLM2P - kolizja pocisku 2 z graczem (O)
410 $D00B - SIZEP3 - poziomy rozmiar gracza 3 (Z)
411 $D00B - KOLM3P - kolizja pocisku 3 z graczem (O)
412 $D00C - SIZEM - poziomy rozmiar pocisków (Z)
413 $D00C - KOLP0P - kolizja gracza 0 z innym graczem (O)
414 $D00D - GRAFP0 - rejestr grafiki gracza 0 (Z)
415 $D00D - KOLP1P - kolizja gracza 1 z innym graczem (O)
416 $D00E - GRAFP1 - rejestr grafiki gracza 1 (Z)
417 $D00E - KOLP2P - kolizja gracza 2 z innym graczem (O)
418 $D00F - GRAFP2 - rejestr grafiki gracza 2 (Z)
419 $D00F - KOLP3P - kolizja gracza 3 z innym graczem (O)
420 $D010 - GRAFP3 - rejestr grafiki gracza 3 (Z)
421 $D010 - TRIG0 - stan przycisku joysticka 0 (O)
422 $D011 - GRAFM - rejestr grafiki pocisków (Z)
423 $D011 - TRIG1 - stan przycisku joysticka 1 (O)
424 $D012 - COLPM0 - rejestr koloru gracza i pocisku 0 (Z)
425 $D013 - COLPM1 - rejestr koloru gracza i pocisku 1 (Z)
426 $D013 - TRIG3 - znacznik do³¹czenia cartridge'a (O)
427 $D014 - COLPM2 - rejestr koloru gracza i pocisku 2 (Z)
428 $D014 - PAL - znacznik systemu TV (O)
429 $D015 - COLPM3 - rejestr koloru gracza i pocisku 3 (Z)
430 $D016 - COLPF0 - rejestr koloru pola gry 0 (Z)
431 $D017 - COLPF1 - rejestr koloru pola gry 1 (Z)
432 $D018 - COLPF2 - rejestr koloru pola gry 2 (Z)
433 $D019 - COLPF3 - rejestr koloru pola gry 3 (Z)
434 $D01A - COLBAK - rejestr koloru t³a (Z)
435 $D01B - GTIACTL - rejestr kontroli uk³adu GTIA
436 $D01C - VDELAY - licznik opóŸnienia pionowego P/MG
437 $D01D - PMCNTL - rejestr kontroli graczy i pocisków
438 $D01E - HITCLR - rejestr kasowania rejestrów kolizji
439 $D01F - CONSOL - rejestr stanu klawiszy konsoli
440 $D1FF - PDVREG - rejestr wyboru nowego urz¹dzenia
441 $D200 - AUDF1 - czêstotliwoœæ pracy generatora 1 (Z)
442 $D200 - POT0 - rejestr po³o¿enia potencjometru 0 (O)
443 $D201 - AUDC1 - rejestr kontroli dŸwiêku generatora 1 (Z)
444 $D201 - POT1 - rejestr po³o¿enia potencjometru 1 (O)
445 $D202 - AUDF2 - czêstotliwoœæ pracy generatora 2 (Z)
446 $D202 - POT2 - rejestr po³o¿enia potencjometru 2 (O)
447 $D203 - AUDC2 - rejestr kontroli dŸwiêku generatora 2 (Z)
448 $D203 - POT3 - rejestr po³o¿enia potencjometru 3 (O)
449 $D204 - AUDF3 - czêstotliwoœæ pracy generatora 3 (Z)
450 $D205 - AUDC3 - rejestr kontroli dŸwiêku generatora 3 (Z)
451 $D206 - AUDF4 - czêstotliwoœæ pracy generatora 4 (Z)
452 $D207 - AUDC4 - rejestr kontroli dŸwiêku generatora 4 (Z)
453 $D208 - AUDCTL - rejestr kontroli generatorów dŸwiêku (Z)
454 $D208 - POTST - status odczytu potencjometrów (O)
455 $D209 - STIMER - rejestr zerowania liczników (Z)
456 $D209 - KBCODE - kod ostatnio naciœniêtego klawisza (O)
457 $D20A - SKSTRES - reset statusu z³¹cza szeregowego (Z)
458 $D20A - RANDOM - rejestr liczby losowej (O)
459 $D20B - POTG0 - znacznik przetwornika analogowo-cyfrowego (Z)
460 $D20D - SEROUT - szeregowy rejestr wyjœciowy (Z)
461 $D20D - SERIN - szeregowy rejestr wejœciowy (O)
462 $D20E - IRQEN - zezwolenia przerwañ IRQ (Z)
463 $D20E - IRQST - status przerwañ IRQ (O)
464 $D20F - SKCTL - rejestr kontroli z³¹cza szeregowego (Z)
465 $D20F - SKSTAT - rejestr statusu z³¹cza szeregowego (O)
466 $D300 - PORTA - port A uk³adu PIA
467 $D301 - PORTB - port B uk³adu PIA
468 $D302 - PACTL - rejestr kontroli portu A
469 $D303 - PBCTL - rejestr kontroli portu B
470 $D400 - DMACTL - rejestr kontroli dostêpu do pamiêci
471 $D401 - CHRCTL - rejestr kontroli wyœwietlania znaków
472 $D402 - DLPTR - adres programu ANTIC-a
473 $D404 - HSCROL - znacznik poziomego przesuwu obrazu
474 $D405 - VSCROL - znacznik pionowego przesuwu obrazu
475 $D407 - PMBASE - adres pamiêci graczy i pocisków
476 $D409 - CHBASE - adres zestawu znaków
477 $D40A - WSYNC - znacznik oczekiwania na synchronizacjê poziom¹
478 $D40B - VCOUNT - licznik linii obrazu
479 $D40C - LPENH - poziome po³o¿enie pióra œwietlengo
480 $D40D - LPENV - pionowe po³o¿enie pióra œwietlnego
481 $D40E - NMIEN - rejestr zezwoleñ na przerwania NMI
482 $D40F - NMIST - rejestr statusu przerwañ NMI
483 */
483
483 = 0080 XDRAW
483 = 0082 YDRAW
483 = 0084 XBYTE
483 = 0086 YBYTE
483 = 0088 CHARCODE
483 = 0089 FONTIND
483 = 008B TANKNR
483 = 008C TANKSEQUENCEPOINTER
483 = 008D OLDPLOT
483 = 008F XC
483 = 0091 TEMP
483 = 0093 TEMP2
483 = 0095 TEMPXROLLER
483 = 0097 XTEMPDRAW
483 = 0099 YTEMPDRAW
483 = 009B XI
483 = 009D FX
483 = 009E YI
483 = 00A0 FY
483 = 00A1 XK
483 = 00A3 FS
483 = 00A4 YC
483 = 00A5 DX
483 = 00A7 TEMPOR2
483 = 00A8 DY
483 = 00AA TEMPOR3
483 = 00AC DD
483 = 00AE DI
483 = 00B0 DP
483 = 00B2 MODIFY
483 = 00B4 WEAPONPOINTER
80 icl '../lib/macro.hea'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea
1 ;-------------------------------------
2 .MACRO ROLW
3 ROL :1
4 ROL :1+1
5 .ENDM
6 ;-------------------------------------
7 .MACRO ASLW
8 ASL :1
9 ROL :1+1
10 .ENDM
11 ;-------------------------------------
12 .MACRO RORW
13 ROR :1+1
14 ROR :1
15 .ENDM
16 ;-------------------------------------
17 .MACRO LSRW
18 LSR :1+1
19 ROR :1
20 .ENDM
21
22 ;-------------------------------------
23 .MACRO VMAIN
24 ; VMAIN #WORD,interrupt.vector
25 ; interrupt.vector:
26 ; 0 - VIMIRQ
27 ; 1 - TIMCNT1
28 ; 2 - TIMCNT2
29 ; 3 - TIMCNT3
30 ; 4 - TIMCNT4
31 ; 5 - TIMCNT5
32 ; 6 - VVBLKI
33 ; 7 - VVBLKD
34 ; 8 - TIMVEC1
35 ; 9 - TIMVEC2
36 ; Initialises Vertical Blank Interrupts
37 ; (works only with system interrupts ON)
38 LDY # <:1
39 LDX # >:1
40 LDA #:2
41 JSR SETVBV
42 .ENDM
43 ;-------------------------------------
44 .MACRO VDLI
45 ; VDLI #WORD
46 ; Initialises Display List Interrupts
47 LDY # <:1
48 LDX # >:1
49 LDA #$C0
50 STY $0200
51 STX $0201
52 STA NMIEN
53 .ENDM
54 ;-------------------------------------
55 .MACRO halt
56 ?stop
57 /*
58 lda RANDOM
59 and #$05
60 sta COLBAK
61 */
62 jmp ?stop
63 .ENDM
64 ;-------------------------------------
65 .MACRO KEY
66 ; KEY
67 ; waits for releasing and pressing "any key"
68 PHA
69 ?CK1 LDA SKSTAT
70 AND #$04
71 BEQ ?CK1
72 ?CK LDA SKSTAT
73 AND #$04
74 BNE ?CK
75 PLA
76 .ENDM
77 ;-------------------------------------
78 .MACRO WAIT
79 ; WAIT
80 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
81 LDA VCOUNT
82 STA WSYNC
83 STA WSYNC
84 STA WSYNC
85 ?WA CMP VCOUNT
86 BNE ?WA
87 .ENDM
88 ;-------------------------------------
89 .macro negw
90 ; negate the given word (0-a)
91 ;-------------------------------------
92 sec
93 lda #$00
94 sbc :1
95 sta :1
96 lda #$00
97 sbc :1+1
98 sta :1+1
99 .endm
100 ;-------------------------------------
101 .macro randomize
102 ;usage: randomize floor ceiling
103 ;returns (in A) a random .byte between "floor" and "ceiling"
104 ?rand
105 lda random
106 cmp #:1 ;floor
107 bcc ?rand
108 cmp #:2+1 ;ceiling
109 bcs ?rand
110 .endm
111 ;-------------------------------------
112 .macro phx
113 txa
114 pha
115 .endm
116 ;-------------------------------------
117 .macro phy
118 tya
119 pha
120 .endm
121 ;-------------------------------------
122 .macro plx
123 pla
124 tax
125 .endm
126 ;-------------------------------------
127 .macro ply
128 pla
129 tay
130 .endm
131 ;-------------------------------------
132 .macro pause
133 ;waits :1 number (byte) of frames
134 ldx #:1
135 ?PAUSELOOP
136 wait
137 dex
138 bne ?PAUSELOOP
139 .ENDM
140
81
82 ;Game loading address
83 ORG $3010 ;two hex thousands for screen
84 ;-----------------------------------------------
85 ;Screen displays go first to avoid crossing 4kb barrier
86 ;-----------------------------------------------
87 icl 'display.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\display.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 ;-----------------------------------------------------
6 ;-------------display-lists---------------------------
7 ;-----------------------------------------------------
8 PurchaseDL
9 FFFF> 3010-9329> 70 70 + .byte $70,$70,$20
10 3013 42 .byte $42
11 3014 C9 3C .word textbuffer2
12 3016 02 10 42 .byte $02,$10,$42
13 3019 MoreUpdl
14 3019 51 3C .word EmptyLine
15 301B 00 42 .byte 0,$42
16 301D WeaponsListDL
17 301D E3 33 .word ListOfWeapons
18 301F 00 02 00 02 00 02 + .byte 0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0
19 303E 42 .byte $42
20 303F MoreDownDL
21 303F 51 3C .word EmptyLine
22 3041 10 42 .byte $10,$42
23 3043 03 3C .word WeaponsDescription
24 3045 02 .byte 2
25 3046 41 .byte $41
26 3047 10 30 .word PurchaseDL
27 ;------------------------
28 3049 OptionsDL
29 3049 70 70 70 70 70 .byte $70,$70,$70,$70,$70
30 304E 42 .byte $42
31 304F 7B 31 .word OptionsScreen
32 3051 02 02 70 02 00 02 + .byte $02,$02,$70,$02,0,$02,0,$2,0,$2
33 305B 41 .byte $41
34 305C 49 30 .word OptionsDL
35 ;------------------------
36 ;Enter names of tanks DL
37 305E NameDL
38 305E 70 70 70 70 70 .byte $70,$70,$70,$70,$70
39 3063 42 .byte $42
40 3064 93 32 .word NameScreen
41 3066 30 .byte $30
42 3067 02 30 02 .byte $02,$30,$2
43 306A 10 02 02 02 30 02 + .byte $10,2,2,2,$30,2,2
44 3071 41 .byte $41
45 3072 5E 30 .word NameDL
46 ; -------------------------------------------------
47
48 3074 dl ; MAIN game display list
49 3074 70 00 .byte $70,$00
50 3076 42 .byte $42
51 3077 79 3C .word textbuffer
52 3079 82 .byte $02 +$80 ;DLI
53 307A 00 .byte $00
54
55 307B 4F .byte $4f
56 307C 53 31 .word WhiteLine
57 307E 4F .byte $4f
58 307F 50 2F .word PlotLine
59 3081 4F .byte $4f
60 3082 53 31 .word WhiteLine
61
62 3084 4F .byte $4f
63 3085 10 10 .word display
64
65 3087 0F 0F 0F 0F 0F 0F + :100 .by $0f
66 30EB 0F .by $0f
67 30EC 4F .by $4f
68 30ED 00 20 .wo display+$0ff0
69 30EF 0F 0F 0F 0F 0F 0F + :97 .byte $0f
70 3150 41 .byte $41
71 3151 74 30 .word dl
72 ; horizontal line
73 3153 WhiteLine
74 3153 FF FF FF FF FF FF + :screenBytes .by $ff
75 = 2F50 PlotLine = display + screenHeight*screenBytes ; the last line is plot pointer
76 ;-----------------------------------------------
77 ;Screen displays go first to avoid crossing 4kb barrier
78 ;-----------------------------------------------
79 317B OptionsScreen
80 317B 37 65 6C 63 6F 6D + dta d"Welcome to Scorch ver. 124 (cc)2000-2013"
81 31A3 00 30 6C 65 61 73 + dta d" Please select option with cursor keys "
82 31CB 00 00 00 00 00 61 + dta d" and press (Return) to proceed "
83 31F3 OptionsHere
84 ; 0123456789012345678901234567890123456789
85 31F3 30 6C 61 79 65 72 + dta d"Players : 2 3 4 5 6 "
86 321B 23 61 73 68 00 00 + dta d"Cash : none 2K 5K 8K 10K "
87 3243 27 72 61 76 69 74 + dta d"Gravity : 0.2G 0.5G 1G 2G 4G "
88 326B 37 69 6E 64 00 00 + dta d"Wind : 1B 3B 5B 7B 9B "
89 3293 OptionsScreenEnd
90 ; -------------------------------------------------
91 3293 NameScreen
92 3293 00 00 00 00 25 6E + dta d" Enter names of players "
93 32B3 00 00 00 34 61 6E + dta d" Tank 01 Name:"
94 32C7 NameAdr
95 32C7 00 00 00 00 00 00 + dta d" "
96 32D3 00 28 75 6D 61 6E + dta d" Human/Atari (difficulty level) "
97 32F3 00 dta d" "
98 32F4 NamesOfLevels
99 32F4 00 28 35 2D 21 2E + dta d" HUMAN Moron Shooter "
100 3313 00 00 30 6F 6F 6C + dta d" Poolshark Toosser Chooser "
101 3333 00 00 33 70 6F 69 + dta d" Spoiler Cyborg Unknown "
102 3353 00 00 dta d" "
103 3355 B4 E1 E2 dta d"Tab"*
104 3358 00 0D 00 30 6C 61 + dta d" - Player/Difficulty level "
105 3373 00 00 00 00 00 00 + dta d" "
106 337A B2 E5 F4 F5 F2 EE dta d"Return"*
107 3380 00 0D 00 30 72 6F + dta d" - Proceed "
108 ;---------------------------------------------------
109 3393 MoreUp
110 3393 00 00 00 00 00 00 + dta d" "
111 33A0 5C 5C 5C dta 92,92,92
112 33A3 00 00 6D 6F 72 65 + dta d" more "
113 33AB 5C 5C 5C dta 92,92,92
114 33AE 00 00 00 00 00 00 + dta d" "
115 33BB MoreDown
116 33BB 00 00 00 00 00 00 + dta d" "
117 33C8 5D 5D 5D dta 93,93,93
118 33CB 00 00 6D 6F 72 65 + dta d" more "
119 33D3 5D 5D 5D dta 93,93,93
120 33D6 00 00 00 00 00 00 + dta d" "
121 33E3 ListOfWeapons
122 33E3 00 00 00 00 00 00 + dta d" "
123 340B 00 00 00 00 00 00 + dta d" "
124 3433 00 00 00 00 00 00 + dta d" "
125 345B 00 00 00 00 00 00 + dta d" "
126 3483 00 00 00 00 00 00 + dta d" "
127 34AB 00 00 00 00 00 00 + dta d" "
128 34D3 00 00 00 00 00 00 + dta d" "
129 34FB 00 00 00 00 00 00 + dta d" "
130 3523 00 00 00 00 00 00 + dta d" "
131 354B 00 00 00 00 00 00 + dta d" "
132 3573 00 00 00 00 00 00 + dta d" "
133 359B 00 00 00 00 00 00 + dta d" "
134 35C3 00 00 00 00 00 00 + dta d" "
135 35EB 00 00 00 00 00 00 + dta d" "
136 3613 00 00 00 00 00 00 + dta d" "
137 363B 00 00 00 00 00 00 + dta d" "
138 3663 00 00 00 00 00 00 + dta d" "
139 368B 00 00 00 00 00 00 + dta d" "
140 36B3 00 00 00 00 00 00 + dta d" "
141 36DB 00 00 00 00 00 00 + dta d" "
142 3703 00 00 00 00 00 00 + dta d" "
143 372B 00 00 00 00 00 00 + dta d" "
144 3753 00 00 00 00 00 00 + dta d" "
145 377B 00 00 00 00 00 00 + dta d" "
146 37A3 00 00 00 00 00 00 + dta d" "
147 37CB 00 00 00 00 00 00 + dta d" "
148 37F3 00 00 00 00 00 00 + dta d" "
149 381B 00 00 00 00 00 00 + dta d" "
150 3843 00 00 00 00 00 00 + dta d" "
151 386B 00 00 00 00 00 00 + dta d" "
152 3893 00 00 00 00 00 00 + dta d" "
153 38BB 00 00 00 00 00 00 + dta d" "
154 38E3 00 00 00 00 00 00 + dta d" "
155 390B 00 00 00 00 00 00 + dta d" "
156 3933 00 00 00 00 00 00 + dta d" "
157 395B 00 00 00 00 00 00 + dta d" "
158 3983 ListOfWeapons1End
159 3983 ListOfDefensiveWeapons
160 3983 00 00 00 00 00 00 + dta d" "
161 39AB 00 00 00 00 00 00 + dta d" "
162 39D3 00 00 00 00 00 00 + dta d" "
163 39FB 00 00 00 00 00 00 + dta d" "
164 3A23 00 00 00 00 00 00 + dta d" "
165 3A4B 00 00 00 00 00 00 + dta d" "
166 3A73 00 00 00 00 00 00 + dta d" "
167 3A9B 00 00 00 00 00 00 + dta d" "
168 3AC3 00 00 00 00 00 00 + dta d" "
169 3AEB 00 00 00 00 00 00 + dta d" "
170 3B13 00 00 00 00 00 00 + dta d" "
171 3B3B 00 00 00 00 00 00 + dta d" "
172 3B63 00 00 00 00 00 00 + dta d" "
173 3B8B 00 00 00 00 00 00 + dta d" "
174 3BB3 00 00 00 00 00 00 + dta d" "
175 3BDB 00 00 00 00 00 00 + dta d" "
176 3C03 ListOfDefensiveWeaponsEnd ;constant useful when clearing
177 3C03 WeaponsDescription
178 3C03 00 00 dta d" "
179 3C05 B4 E1 E2 dta d"Tab"*
180 3C08 00 0D 00 24 65 66 + dta d" - Defensive/Offensive weapon "
181 3C29 00 00 00 dta d" "
182 3C2C B3 F0 E1 E3 E5 dta d"Space"*
183 3C31 00 0D 00 30 75 72 + dta d" - Purchase "
184 3C3E B2 E5 F4 F5 F2 EE dta d"Return"*
185 3C44 00 0D 00 26 69 6E + dta d" - Finish "
186 3C51 EmptyLine
187 3C51 00 00 00 00 00 00 + dta d" "
188 ;-----------------------------------------------
189 3C79 textbuffer
190 3C79 30 6C 61 79 65 72 + dta d"Player: "
191 3CA1 00 00 00 00 00 00 + dta d" "
192 3CC9 textbuffer2
193 3CC9 30 6C 61 79 65 72 + dta d"Player: ******** Cash: 00000 "
194 3CF1 0D 0D 0D 0D 0D 0D + dta d"----------------------------------------"
195
196
197 .endif
88 ;----------------------------------------------
89 3D19 icl 'variables.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\variables.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 ;=====================================================
6 ; most important non-zero page variables
7 ; zero page variables are declared in program.s65 module
8 ;=====================================================
9 3D19 00 NumberOfPlayers .byte 0 ;current number of players (counted from 1)
10 3D1A 00 00 00 00 00 00 TankSequence :MaxPlayers .by 0 ;sequence of shooting during the Round
11 ;-----------------------------------
12 3D20 skilltable ; computer controlled players' skills (1-8), 0 - human
13 3D20 00 00 00 00 00 00 :MaxPlayers .by 0
14 ;-----------------------------------
15 3D26 moneyH ;we place zero at the end of prices and money
16 ;and have range from 0 to 99990 (not too much)
17 ;money players have (maybe one more byte is needed?)
18 3D26 00 00 00 00 00 00 :MaxPlayers .by 0
19 3D2C moneyL
20 3D2C 00 00 00 00 00 00 :MaxPlayers .by 0
21 ;-----------------------------------
22 3D32 gainH ;how much money player gets after the round
23 ;it is gathered during the round basing on energy
24 ;opponents loose after player's shoots
25 3D32 00 00 00 00 00 00 :MaxPlayers .by 0
26 3D38 gainL
27 3D38 00 00 00 00 00 00 :MaxPlayers .by 0
28 ;-----------------------------------
29 3D3E looseH ;how much player looses after the round
30 ;calculated from REAL energy loss
31 ;(not only to zero energy)
32 3D3E 00 00 00 00 00 00 :MaxPlayers .by 0
33 3D44 looseL
34 3D44 00 00 00 00 00 00 :MaxPlayers .by 0
35 ;-----------------------------------
36 3D4A Energy
37 3D4A 00 00 00 00 00 00 :MaxPlayers .by 0
38 3D50 00 EnergyDecrease .by 0
39 3D51 eXistenZ
40 3D51 00 00 00 00 00 00 :MaxPlayers .by 0
41 3D57 LASTeXistenZ ; eXistenZ before shoot
42 3D57 00 00 00 00 00 00 :MaxPlayers .by 0
43
44 3D5D ResultsTable ;the results in the gameeeeee
45 3D5D 00 00 00 00 00 00 :MaxPlayers .by 0
46 3D63 TempResults
47 3D63 00 00 00 00 00 00 :MaxPlayers .by 0
48 3D69 CurrentResult
49 3D69 00 .byte 0
50 ;-----------------------------------
51 3D6A EnergyTableL ;shooting Force of the tank during the round
52 3D6A 00 00 00 00 00 00 :MaxPlayers .by 0
53 3D70 EnergyTableH
54 3D70 00 00 00 00 00 00 :MaxPlayers .by 0 ;maxplayers=6
55 3D76 MaxEnergyTableL ;Energy of the tank during the round
56 ;(limes superior force of the Shoot)
57 3D76 00 00 00 00 00 00 :MaxPlayers .by 0 ;1000 is the default
58 3D7C MaxEnergyTableH
59 3D7C 00 00 00 00 00 00 :MaxPlayers .by 0
60 ;-----------------------------------
61
62 3D82 AngleTable ;Angle of the barrel of each tank during the round
63 3D82 A5 A5 A5 A5 A5 A5 .by (255-90),(255-90),(255-90),(255-90),(255-90),(255-90)
64 3D88 NewAngle
65 3D88 00 .by 0
66 ;-----------------------------------
67
68 3D89 ActiveWeapon ;number of the selected weapon
69 3D89 00 00 00 00 00 00 :MaxPlayers .by 0
70 ;-----------------------------------
71
72 ;format of the static point number used in the game
73 ; 20203.5 = 128 : <20203 : >20203
74 ;-----------------------------------
75
76 3D8F 00 L1 .by 0 ; variable used in multiplications (by 10:)
77 3D90 19 gravity .by 25 ;only the decimal part (1/10 = 25)
78 ;-----------------------------------
79
80 3D91 80 00 Wind .wo $0080 ;walue displayed on the screen
81 ;multiplied by 16 (decimal part only)
82 ;-----------------------------------
83 3D93 40 MaxWind .byte $40 ;
84 3D94 00 WindOrientation .byte 0 ;(0-right,1-left)
85 ;-----------------------------------
86 3D95 00 Counter .byte 0 ;temporary Counter for outside loops
87 3D96 00 HitFlag .byte 0 ;1 when missile hit anything
88 ;-----------------------------------
89 3D97 xtankstableL ;X positions of tanks (lower left point)
90 3D97 00 00 00 00 00 00 :MaxPlayers .by 0
91 3D9D xtankstableH
92 3D9D 00 00 00 00 00 00 :MaxPlayers .by 0
93 3DA3 ytankstable ;Y positions of tanks (lower left point)
94 3DA3 00 00 00 00 00 00 :MaxPlayers .by 0
95 3DA9 LowResDistances ; coarse stank positions divided by 4 (to be in just one byte)
96 3DA9 00 00 00 00 00 00 :MaxPlayers .by 0
97 ;-----------------------------------
98 3DAF keycodes ;tables for calculating KeyCode to Screen Code (38 characters)
99 3DAF 3F 15 12 3A 2A 38 + .byte $3f,$15,$12,$3a,$2a,$38,$3d,$39
100 3DB7 0D 01 05 00 25 23 + .byte $0d,$01,$05,$00,$25,$23,$08,$0a
101 3DBF 2F 28 3E 2D 0B 10 + .byte $2f,$28,$3e,$2d,$0b,$10,$2e,$16
102 3DC7 2B 17 1F 1E 1A 18 + .byte $2b,$17,$1f,$1e,$1a,$18,$1d,$1b
103 3DCF 33 35 30 32 22 0E .byte $33,$35,$30,$32,$22,$0e
104 3DD5 scrcodes
105 3DD5 61 62 63 64 65 66 + dta d"abcdefgh"
106 3DDD 69 6A 6B 6C 6D 6E + dta d"ijklmnop"
107 3DE5 71 72 73 74 75 76 + dta d"qrstuvwx"
108 3DED 79 7A 11 12 13 14 + dta d"yz123456"
109 3DF5 17 18 19 10 0E 0D dta d"7890.-"
110 ;-----------------------------------
111 3DFB 00 Erase .byte 0 ; if 1 only mask of the character is printed
112 ; on the graphics screen. if 0 character is printed normally
113
114 ;-----------------------------------
115 3DFC 00 00 RangeLeft .wo 0 ;range of the soil to be fallen down
116 ;it is being set by all Explosions
117 3DFE 00 00 RangeRight .wo 0
118 ;-----------------------------------
119 3E00 00 00 WeaponRangeLeft .wo 0 ;Range of the Explosion of the given weapon
120 3E02 00 00 WeaponRangeRight .wo 0
121 ;--------------------------------------------------
122 ;--------------------------------------------------
123 ;Variables used by the given subroutines
124 ;moved to one place for easier
125 ;compilation to e.g. cartridge
126 ;--------------------------------------------------
127 ;xroller
128 3E04 FF HowMuchToFall .byte $FF
129 3E05 00 HeightRol .byte 0
130 ;digger
131 3E06 00 00 digstartx .word 0
132 3E08 00 00 digstarty .word 0
133 3E0A 00 diggery .byte 0
134 3E0B 00 DigLong .byte 0
135 3E0C 00 00 00 00 00 00 + digtabxL :8 .by 0
136 3E14 00 00 00 00 00 00 + digtabxH :8 .by 0
137 3E1C 00 00 00 00 00 00 + digtabyL :8 .by 0
138 3E24 00 00 00 00 00 00 + digtabyH :8 .by 0
139 ;sandhog
140 3E2C 00 sandhogflag .byte 0 ; (0 digger, 8 sandhog)
141 ;ofdirt
142 3E2D 00 00 magic .word 0 ; was tempor2, but it was not compiling!!! (bug in OMC65)
143 ;draw
144 3E2F 00 00 DrawJumpAddr .word 0
145 3E31 00 HowToDraw .byte 0
146 ; bits here mean
147 ; 0 - negative X (go up)
148 ; 1 - negative Y (left)
149 ; 2 - directional value > 1 (more than 45 degrees)
150 ; if all 0 then standart routine
151 3E32 00 00 XHit .word 0
152 3E34 00 00 YHit .word 0
153 3E36 00 00 LineLength .word 0
154 ;circle
155 3E38 00 radius .byte 0
156 3E39 00 00 xcircle .word 0
157 3E3B 00 ycircle .byte 0
158 3E3C 00 00 tempcir .word 0
159 ;TankFalls
160 3E3E 00 IfFallDown .byte 0
161 3E3F 00 PreviousFall .byte 0
162 3E40 00 EndOfTheFallFlag .byte 0 ; in case of the infinite fall
163 3E41 00 Parachute .byte 0 ; are you insured with parachute?
164 ; -------------------------------------------------
165 ;Flight
166 ;variables for 5 missiles (used for mirv)
167 3E42 00 00 00 00 00 xtraj00 :5 .by 0
168 3E47 00 00 00 00 00 xtraj01 :5 .by 0
169 3E4C 00 00 00 00 00 xtraj02 :5 .by 0
170 3E51 00 00 00 00 00 vx00 :5 .by 0
171 3E56 00 00 00 00 00 vx01 :5 .by 0
172 3E5B 00 00 00 00 00 vx02 :5 .by 0
173 3E60 00 00 00 00 00 vx03 :5 .by 0
174 3E65 00 00 00 00 00 MirvDown :5 .by 0 ; is given missile down?
175 3E6A 00 MirvMissileCounter .byte 0 ; missile Counter (mainly for X)
176 3E6B 00 SmokeTracerFlag .byte 0 ; if Smoketracer
177 ; -------------------------------------------------
178 ;CheckCollisionWithTank
179 3E6C 00 00 00 00 vx .byte 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA)
180 3E70 00 00 00 00 vy .byte 0,0,0,0
181 3E74 00 00 00 xtraj .byte 0,0,0
182 3E77 00 00 00 ytraj .byte 0,0,0
183 3E7A 00 00 00 xtrajold .byte 0,0,0
184 3E7D 00 00 00 ytrajold .byte 0,0,0
185 3E80 00 Angle .byte 0
186 3E81 00 00 00 Force .byte 0,0,0
187 3E84 00 00 00 Multiplier .byte 0,0,0
188 3E87 00 00 Multiplee .byte 0,0
189 3E89 00 00 00 Result .byte 0,0,0
190 3E8C 00 goleft .byte 0 ;if 1 then flights left
191 ;--------------------------------------------------
192 ;SoilDown2
193 3E8D 00 IsEndOfTheFallFlag .byte 0
194 ; -------------------------------------------------
195 ;unPlot
196 3E8E 00 WhichUnPlot .byte 0
197 ; max 5 concurrent unPlots
198 3E8F 00 00 00 00 00 oldplotH :5 .by 0
199 3E94 00 00 00 00 00 oldplotL :5 .by 0
200 3E99 00 00 00 00 00 oldora :5 .by 0
201 3E9E 00 00 00 00 00 oldply :5 .by 0
202 3EA3 00 OldOraTemp .byte 0
203 3EA4 00 FunkyBombCounter .byte 0
204 3EA5 00 00 xtrajfb .word 0
205 3EA7 00 00 ytrajfb .word 0
206 ;
207 3EA9 00 tracerflag .byte 0
208 ; -------------------------------------------------
209 ;TypeChar
210 3EAA 00 00 00 00 00 00 + mask1 :8 .by 0
211 3EB2 00 00 00 00 00 00 + mask2 :8 .by 0
212
213 3EBA 00 00 00 00 00 00 + char1 :8 .by 0
214 3EC2 00 00 00 00 00 00 + char2 :8 .by 0
215 3ECA 01 color .byte 1
216 3ECB 00 ybit .byte 0
217 3ECC 00 tempbyte01 .byte 0
218 3ECD 00 00 delta .word 0
219 3ECF 00 00 yfloat .word 0
220 3ED1 00 deltaX .byte 0
221 3ED2 00 UpNdown .byte 0
222
223
224 3ED3 00 00 temptankX .word 0
225 3ED5 00 temptankNr .byte 0
226
227 ; -------------------------------------------------
228 ;Variables from textproc.s65
229 ; tables with numbers of weapons on the right lists
230 ; to be honest - I do not know at the moment what the above
231 ; comment was supposed to mean...
232 3ED6 NubersOfWeaponsL1
233 3ED6 FF FF FF FF FF FF + :(8*5) .by $ff
234 3EFE NubersOfWeaponsL2
235 3EFE FF FF FF FF FF FF + :(8*2) .by $ff
236 ; -------------------------------------------------
237
238 ; variables storing amount of weapons on the first and second
239 ; list and pointer position
240
241 3F0E HowManyOnTheList1
242 3F0E 00 .byte 0
243 3F0F HowManyOnTheList2
244 3F0F 00 .byte 0
245 3F10 PositionOnTheList ; pointer position on the list being displayed
246 3F10 00 .byte 0
247 3F11 LastWeapon ; number of the last previously purchased weapon
248 ; it is necessary when after purchase some weapon
249 ; is removed from the list (because too expensive)
250 ; and the cursor must be placed elsewhere
251
252 3F11 FF .byte $ff
253 3F12 WhichList ; list currently on the screen
254 ; (0-offensive, 1-defensive)
255 3F12 00 .byte 0
256 3F13 OffsetDL1 ; offset of the list screen (how many lines)....
257 3F13 00 .byte 0
258
259 ; -------------------------------------------------
260 ;Options
261 3F14 00 00 02 02 OptionsTable .byte 0,0,2,2
262 3F18 00 OptionsY .byte 0 ;vertical position of cursor on Options screen
263 = 0004 maxoptions = 4 ;number of all options (4 in 0.01)
264 3F19 CashOptionH ;(one zero less than on the screen)
265 3F19 00 00 01 03 03 .byte 0,>200,>500,>800,>1000
266 3F1E CashOptionL
267 3F1E 00 C8 F4 20 E8 .byte 0,<200,<500,<800,<1000
268 3F23 0A 14 19 1E 28 GravityTable .byte 10,20,25,30,40
269 3F28 05 14 28 3C 50 MaxWindTable .byte 5,20,40,60,80
270 ;------------------------------------------------
271
272 ;mark the level
273 3F2D PositionInName ; cursor position in name of the player when name input
274 3F2D 00 .byte 0
275 3F2E DifficultyLevel ; Difficulty Level (human/cpu)
276 3F2E 00 .byte 0
277 3F2F LevelNameBeginL ; begins of level names
278 3F2F F4 FE 08 .byte <NamesOfLevels,<(NamesOfLevels+10),<(NamesOfLevels+20)
279 3F32 14 1E 28 .byte <(NamesOfLevels+32),<(NamesOfLevels+42),<(NamesOfLevels+52)
280 3F35 34 3E 48 .byte <(NamesOfLevels+64),<(NamesOfLevels+74),<(NamesOfLevels+84)
281 3F38 LevelNameBeginH
282 3F38 32 32 33 .byte >NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20)
283 3F3B 33 33 33 .byte >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52)
284 3F3E 33 33 33 .byte >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84)
285 ;-------------------------------------------------
286 ;displaydecimal
287 3F41 00 00 decimal .word 0
288 3F43 00 00 displayposition .word 0
289 3F45 10 10 10 10 decimalresult dta d"0000"
290
291 ;xmissile
292 3F49 00 00 ExplosionRadius .word 0 ;because when adding in xdraw it is double byte
293 ;round
294 3F4B 00 CurrentRoundNr .byte 0
295 3F4C 00 FallDown1 .byte 0
296 3F4D 00 FallDown2 .byte 0
297 ;leapfrog
298 3F4E 00 LeapFrogAngle .byte 0
299 ;laser
300 3F4F 00 00 00 00 00 00 + LaserCoordinate .word 0,0,0,0
301 3F57 TanksNames
302 3F57 11 73 74 00 34 61 + dta d"1st Tank"
303 3F5F 12 6E 64 00 34 61 + dta d"2nd Tank"
304 3F67 13 72 64 00 34 61 + dta d"3rd Tank"
305 3F6F 14 74 68 00 34 61 + dta d"4th Tank"
306 3F77 15 74 68 00 34 61 + dta d"5th Tank"
307 3F7F 16 74 68 00 34 61 + dta d"6th Tank"
308 ; -------------------------------------------------
309 ; Here go tables with weapons possesed by a given tank
310 ; Index in the table means weapon type
311 ; number entered means ammo for given weapon possessed (max 99)
312 ; Let 0 be "baby missile"
313 ; from $30 the defensive weapons begin
314 3F87 TanksWeapons
315 3F87 TanksWeapon1
316 3F87 63 .by 99
317 3F88 00 00 00 00 00 00 + :63 .by 0
318 3FC7 TanksWeapon2
319 3FC7 63 .by 99
320 3FC8 00 00 00 00 00 00 + :63 .by 0
321 4007 TanksWeapon3
322 4007 63 .by 99
323 4008 00 00 00 00 00 00 + :63 .by 0
324 4047 TanksWeapon4
325 4047 63 .by 99
326 4048 00 00 00 00 00 00 + :63 .by 0
327 4087 TanksWeapon5
328 4087 63 .by 99
329 4088 00 00 00 00 00 00 + :63 .by 0
330 40C7 TanksWeapon6
331 40C7 63 .by 99
332 40C8 00 00 00 00 00 00 + :63 .by 0
333 4107 TanksWeaponsTableL
334 4107 87 C7 07 47 87 C7 .by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6
335 410D TanksWeaponsTableH
336 410D 3F 3F 40 40 40 40 .by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6
337
338 4113 mountaintable ;table of mountains (size=screenwidth)
339 4113 00 00 00 00 00 00 + :screenwidth .by 0
340 4253 00 .by 0 ; additional byte for fallout (sometimes 1 pixel)
341 4254 mountaintable2 ;table of mountains (size=screenwidth)
342 4254 00 00 00 00 00 00 + :screenwidth .by 0
343 4394 00 .by 0 ; additional byte for fallout (sometimes 1 pixel)
344 4395 mountaintable3
345 4395 00 00 00 00 00 00 + :screenwidth .by 0
346 44D5 00 .by 0 ; additional byte for fallout (sometimes 1 pixel)
347 44D6 MountaintableEnd ;good for table clearing
348 ;----------------------------------------------
349 44D6 00 00 TextPositionX .word 0
350 44D8 00 TextPositionY .byte 0
351 44D9 00 00 TextAddress .word 0
352 44DB 00 TextCounter .byte 0
353 44DC 00 TextNumberOff .byte 0
354 ;--------------
355 44DD TankTempY
356 44DD 00 .byte 0
357 ;----------------------------------------------
358 44DE LineAddress4x4
359 44DE 00 00 .word 0
360 44E0 LineCharNr
361 44E0 00 .byte 0
362 44E1 LineXdraw
363 44E1 00 00 .word 0
364 44E3 LineYdraw
365 44E3 00 .byte 0
366 44E4 LineTop
367 44E4 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%)"
368 44F1 FF .byte $ff
369 ;# - pion, () * +, % - poziom
370 44F2 LineBottom
371 44F2 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%+"
372 44FF FF .byte $ff
373 4500 LineEmpty
374 4500 03 00 00 00 00 00 + dta d"# #"
375 450D FF .byte $ff
376 450E LineHeader1
377 450E 03 00 32 2F 35 2E + dta d"# ROUND: "
378 4517 RoundNrDisplay
379 4517 00 00 00 03 dta d" #"
380 451B FF .byte $ff
381 451C LineHeader2
382 451C 03 00 00 32 25 33 + dta d"# RESULTS #"
383 4529 FF .byte $ff
384
385
386
387 ;-----------
388 452A ResultLineBuffer
389 452A 00 00 00 00 00 00 + dta d" "
390 453C FF .byte $ff
391 453D ResultX
392 453D 00 00 .word 0
393 453F ResultY
394 453F 00 .byte 0
395 4540 ResultOfTankNr
396 4540 00 .byte 0
397
398 ;-----------
399 4541 pmtableL ; addressess of the P/M memory for 5 tanks (6th is without P/M background)
400 4541 00 .byte <(pmgraph+$400)
401 4542 00 .byte <(pmgraph+$500)
402 4543 00 .byte <(pmgraph+$600)
403 4544 00 .byte <(pmgraph+$700)
404 4545 00 .byte <(pmgraph+$300) ; this is a missile background
405 4546 pmtableH
406 4546 9C .byte >(pmgraph+$400)
407 4547 9D .byte >(pmgraph+$500)
408 4548 9E .byte >(pmgraph+$600)
409 4549 9F .byte >(pmgraph+$700)
410 454A 9B .byte >(pmgraph+$300)
411 ;-----------
412 ; this table changes Angle to the appropriate tank character
413 454B BarrelTableL
414 454B 02 02 02 02 02 02 + .byte $02,$02,$02,$02,$02,$02,$02,$02
415 4553 04 04 04 04 04 04 + .byte $04,$04,$04,$04,$04,$04,$04,$04
416 455B 06 06 06 06 06 06 + .byte $06,$06,$06,$06,$06,$06,$06,$06,$06
417 4564 08 08 08 08 08 08 + .byte $08,$08,$08,$08,$08,$08,$08,$08
418 456C 0A 0A 0A 0A 0A 0A + .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a
419 4574 0C 0C 0C 0C 0C 0C + .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c
420 457D 0E 0E 0E 0E 0E 0E + .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e
421 4585 10 10 10 10 10 10 + .byte $10,$10,$10,$10,$10,$10,$10,$10
422 458D 12 12 12 12 12 12 + .byte $12,$12,$12,$12,$12,$12,$12,$12,$12
423 4596 14 14 14 14 14 14 + .byte $14,$14,$14,$14,$14,$14,$14,$14
424 459E 16 16 16 16 16 16 + .byte $16,$16,$16,$16,$16,$16,$16,$16
425 45A6 BarrelTableR
426 45A6 2C 2C 2C 2C 2C 2C + .byte $2c,$2c,$2c,$2c,$2c,$2c,$2c,$2c
427 45AE 2A 2A 2A 2A 2A 2A + .byte $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a
428 45B6 28 28 28 28 28 28 + .byte $28,$28,$28,$28,$28,$28,$28,$28,$28
429 45BF 26 26 26 26 26 26 + .byte $26,$26,$26,$26,$26,$26,$26,$26
430 45C7 24 24 24 24 24 24 + .byte $24,$24,$24,$24,$24,$24,$24,$24
431 45CF 22 22 22 22 22 22 + .byte $22,$22,$22,$22,$22,$22,$22,$22,$22
432 45D8 20 20 20 20 20 20 + .byte $20,$20,$20,$20,$20,$20,$20,$20
433 45E0 1E 1E 1E 1E 1E 1E + .byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e
434 45E8 1C 1C 1C 1C 1C 1C + .byte $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c
435 45F1 1A 1A 1A 1A 1A 1A + .byte $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a
436 45F9 18 18 18 18 18 18 + .byte $18,$18,$18,$18,$18,$18,$18,$18
437
438 4601 sintable
439 4601 00 .byte 0
440 4602 04 .byte 4
441 4603 08 .byte 8
442 4604 0D .byte 13
443 4605 11 .byte 17
444 4606 16 .byte 22
445 4607 1A .byte 26
446 4608 1F .byte 31
447 4609 23 .byte 35
448 460A 28 .byte 40
449 460B 2C .byte 44
450 460C 30 .byte 48
451 460D 35 .byte 53
452 460E 39 .byte 57
453 460F 3D .byte 61
454 4610 42 .byte 66
455 4611 46 .byte 70
456 4612 4A .byte 74
457 4613 4F .byte 79
458 4614 53 .byte 83
459 4615 57 .byte 87
460 4616 5B .byte 91
461 4617 5F .byte 95
462 4618 64 .byte 100
463 4619 68 .byte 104
464 461A 6C .byte 108
465 461B 70 .byte 112
466 461C 74 .byte 116
467 461D 78 .byte 120
468 461E 7C .byte 124
469 461F 80 .byte 128
470 4620 83 .byte 131
471 4621 87 .byte 135
472 4622 8B .byte 139
473 4623 8F .byte 143
474 4624 92 .byte 146
475 4625 96 .byte 150
476 4626 9A .byte 154
477 4627 9D .byte 157
478 4628 A1 .byte 161
479 4629 A4 .byte 164
480 462A A7 .byte 167
481 462B AB .byte 171
482 462C AE .byte 174
483 462D B1 .byte 177
484 462E B5 .byte 181
485 462F B8 .byte 184
486 4630 BB .byte 187
487 4631 BE .byte 190
488 4632 C1 .byte 193
489 4633 C4 .byte 196
490 4634 C6 .byte 198
491 4635 C9 .byte 201
492 4636 CC .byte 204
493 4637 CF .byte 207
494 4638 D1 .byte 209
495 4639 D4 .byte 212
496 463A D6 .byte 214
497 463B D9 .byte 217
498 463C DB .byte 219
499 463D DD .byte 221
500 463E DF .byte 223
501 463F E2 .byte 226
502 4640 E4 .byte 228
503 4641 E6 .byte 230
504 4642 E8 .byte 232
505 4643 E9 .byte 233
506 4644 EB .byte 235
507 4645 ED .byte 237
508 4646 EE .byte 238
509 4647 F0 .byte 240
510 4648 F2 .byte 242
511 4649 F3 .byte 243
512 464A F4 .byte 244
513 464B F6 .byte 246
514 464C F7 .byte 247
515 464D F8 .byte 248
516 464E F9 .byte 249
517 464F FA .byte 250
518 4650 FB .byte 251
519 4651 FC .byte 252
520 4652 FC .byte 252
521 4653 FD .byte 253
522 4654 FE .byte 254
523 4655 FE .byte 254
524 4656 FF .byte 255
525 4657 FF .byte 255
526 4658 FF .byte 255
527 4659 FF .byte 255
528 465A FF .byte 255
529 465B FF .byte 255 ;anti self destruction byte
530
531 465C costable
532 465C FF .byte 255 ;anti self destruction byte
533 465D FF .byte 255
534 465E FF .byte 255
535 465F FF .byte 255
536 4660 FF .byte 255
537 4661 FF .byte 255
538 4662 FE .byte 254
539 4663 FE .byte 254
540 4664 FD .byte 253
541 4665 FC .byte 252
542 4666 FC .byte 252
543 4667 FB .byte 251
544 4668 FA .byte 250
545 4669 F9 .byte 249
546 466A F8 .byte 248
547 466B F7 .byte 247
548 466C F6 .byte 246
549 466D F4 .byte 244
550 466E F3 .byte 243
551 466F F2 .byte 242
552 4670 F0 .byte 240
553 4671 EE .byte 238
554 4672 ED .byte 237
555 4673 EB .byte 235
556 4674 E9 .byte 233
557 4675 E8 .byte 232
558 4676 E6 .byte 230
559 4677 E4 .byte 228
560 4678 E2 .byte 226
561 4679 DF .byte 223
562 467A DD .byte 221
563 467B DB .byte 219
564 467C D9 .byte 217
565 467D D6 .byte 214
566 467E D4 .byte 212
567 467F D1 .byte 209
568 4680 CF .byte 207
569 4681 CC .byte 204
570 4682 C9 .byte 201
571 4683 C6 .byte 198
572 4684 C4 .byte 196
573 4685 C1 .byte 193
574 4686 BE .byte 190
575 4687 BB .byte 187
576 4688 B8 .byte 184
577 4689 B5 .byte 181
578 468A B1 .byte 177
579 468B AE .byte 174
580 468C AB .byte 171
581 468D A7 .byte 167
582 468E A4 .byte 164
583 468F A1 .byte 161
584 4690 9D .byte 157
585 4691 9A .byte 154
586 4692 96 .byte 150
587 4693 92 .byte 146
588 4694 8F .byte 143
589 4695 8B .byte 139
590 4696 87 .byte 135
591 4697 83 .byte 131
592 4698 80 .byte 128
593 4699 7C .byte 124
594 469A 78 .byte 120
595 469B 74 .byte 116
596 469C 70 .byte 112
597 469D 6C .byte 108
598 469E 68 .byte 104
599 469F 64 .byte 100
600 46A0 5F .byte 95
601 46A1 5B .byte 91
602 46A2 57 .byte 87
603 46A3 53 .byte 83
604 46A4 4F .byte 79
605 46A5 4A .byte 74
606 46A6 46 .byte 70
607 46A7 42 .byte 66
608 46A8 3D .byte 61
609 46A9 39 .byte 57
610 46AA 35 .byte 53
611 46AB 30 .byte 48
612 46AC 2C .byte 44
613 46AD 28 .byte 40
614 46AE 23 .byte 35
615 46AF 1F .byte 31
616 46B0 1A .byte 26
617 46B1 16 .byte 22
618 46B2 11 .byte 17
619 46B3 0D .byte 13
620 46B4 08 .byte 8
621 46B5 04 .byte 4
622 46B6 00 .byte 0
623
624 46B7 linetableL
625 46B7 10 38 60 88 B0 D8 + :screenheight .by <(display+screenBytes*#)
626 ;:20 .by <(display+screenBytes*#)
627 477F 50 .by <PlotLine
628 4780 linetableH
629 4780 10 10 10 10 10 10 + :screenheight .by >(display+screenBytes*#)
630 ;:20 .by >(display+screenBytes*#)
631 4848 2F .by >PlotLine
632 ;----------------------------
633 4849 oldPlotPointerX
634 4849 00 00 .wo 0
635 ;----------------------------
636 ;PutChar4x4
637 484B 00 LoopCounter4x4 .byte 0
638 484C 00 y4x4 .byte 0
639 484D 00 StoreA4x4 .byte 0
640 484E 00 Xcounter4x4 .byte 0
641 484F 00 nibbler4x4 .byte 0
642 4850 00 CharCode4x4 .byte 0
643 4851 00 plot4x4color .byte 0 ;1-white, 0-background
644
645 4852 bittable
646 4852 80 40 20 10 08 04 + .byte $80,$40,$20,$10,$08,$04,$02,$01
647 485A bittable2
648 485A 7F BF DF EF F7 FB + .byte $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe
649 ;----------------------------
650 4862 disktance ;tanks distance
651 4862 00 00 .byte 0,0
652 4864 6A .byte screenwidth/3
653 4865 50 .byte screenwidth/4
654 4866 40 .byte screenwidth/5
655 4867 35 .byte screenwidth/6
656 4868 2D .byte screenwidth/7
657 ;max number of players=6
658
659 ; this table is for deciding where a tank should slide
660 ; accordingly to what is below the tank
661 ; there are 3 bits used here
662 ; bit 0 - go down
663 ; bit 1 - go left
664 ; bit 2 - go right
665 ; position in the table equals to bit pattern of soil below tank
666
667 4869 WhereToSlideTable
668 ; we have 3 bits: 0 - go down, 1 - go right, 2 - go left
669 ;original table
670 ;.BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0
671 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
672 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
673 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
674 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
675 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
676 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
677 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
678 ;.BYTE 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
679 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
680 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
681 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
682 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
683 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
684 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
685 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
686
687 4869 01 05 04 04 04 04 + .BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0 ;16
688 4879 04 00 00 00 00 00 + .BYTE 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;32
689 4889 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;48
690 4899 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;64
691 48A9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;80
692 48B9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;96
693 48C9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;112
694 48D9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;128
695 48E9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
696 48F9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
697 4909 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
698 4919 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
699 4929 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
700 4939 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
701 4949 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
702 4959 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
703
704 4969 EndOfTheBarrelX
705 4969 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4
706 4974 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5
707 497E 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6
708 4987 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
709 4996 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7
710 499F 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7
711 49A9 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7
712 49B6 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7
713
714 49C4 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
715 49CE 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
716 49D8 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
717 49E2 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
718 49EC 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
719 49F6 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
720 4A00 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
721 4A0A 00 00 00 00 .byte 0,0,0,0
722
723 4A0E 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0
724 4A1C 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0
725 4A29 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
726 4A33 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0
727 4A3C 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
728 4A4B 01 01 01 01 01 01 + .byte 1,1,1,1,1,1,1,1,1
729 4A54 02 02 02 02 02 02 + .byte 2,2,2,2,2,2,2,2,2,2
730 4A5E 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3
731
732 4A69 EndOfTheBarrelY
733 4A69 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7
734 4A74 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7
735 4A7E 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7
736 4A87 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
737 4A96 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6
738 4A9F 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5
739 4AA9 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4
740 4AB6 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3
741
742 4AC4 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
743 4ACE 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
744 4AD8 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
745 4AE2 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
746 4AEC 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
747 4AF6 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
748 4B00 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0
749 4B0A 00 00 00 00 .byte 0,0,0,0
750
751 4B0E 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3
752 4B1C 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4
753 4B29 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5
754 4B33 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6
755 4B3C 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
756 4B4B 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7
757 4B54 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7
758 4B5E 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7
759 ;-------------------------------------------------
760
761 4B69 TanksNamesDefault
762 4B69 11 73 74 00 34 61 + dta d"1st Tank"
763 4B71 12 6E 64 00 34 61 + dta d"2nd Tank"
764 4B79 13 72 64 00 34 61 + dta d"3rd Tank"
765 4B81 14 74 68 00 34 61 + dta d"4th Tank"
766 4B89 15 74 68 00 34 61 + dta d"5th Tank"
767 4B91 16 74 68 00 34 61 + dta d"6th Tank"
768
769 4B99 WeaponPriceH ; weapons prices (tables with prices of weapons)
770 4B99 00 00 00 00 00 01 + .byte $00,$00,$00,$00,$00,$01,$01,$01
771 4BA1 01 01 00 01 02 02 + .byte $01,$01,$00,$01,$02,$02,$02,$01
772 4BA9 01 01 01 01 01 00 + .byte $01,$01,$01,$01,$01,$00,$00,$00
773 4BB1 01 00 00 00 02 02 + .byte $01,$00,$00,$00,$02,$02,$01,$01
774 4BB9 02 00 00 00 00 00 + .byte $02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
775 4BC9 00 00 00 00 00 04 + .byte 0,0,0,0,0,$04,0,0,0,0,0,0,0,0,0,0
776 4BD9 WeaponPriceL
777 4BD9 00 60 6F 90 C0 25 + .byte $00,$60,$6F,$90,$c0,$25,$c8,$51
778 4BE1 F0 FF 66 23 B1 58 + .byte $f0,$ff,$66,$23,$b1,$58,$50,$4A
779 4BE9 55 71 42 50 14 FD + .byte $55,$71,$42,$50,$14,$fd,$da,$bf
780 4BF1 31 68 82 AB 12 45 + .byte $31,$68,$82,$ab,$12,$45,$ae,$12
781 4BF9 41 00 00 00 00 00 + .byte $41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
782 4C09 00 00 00 00 00 4C + .byte 0,0,0,0,0,$4c,0,0,0,0,0,0,0,0,0,0
783 ;-------------------------------------------------
784 ; how many units (bulletd) of a given weapon we get for a given price
785 ; This is a table of constans.
786 ; If on a given position is 0 it means that this weapon
787 ; is not present in the game.
788 ; This is the slot for adding new weapons.
789 4C19 WeaponUnits
790 4C19 0A 05 03 01 02 02 + .byte 10,5,3,1,2,2,3,1,10,2,20,10,10,5,2,10
791 4C29 05 05 02 0A 05 02 + .byte 5,5,2,10,5,2,10,5,2,10,5,2,2,10,10,5
792 4C39 05 00 00 00 00 00 + .byte 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
793 4C49 06 02 05 05 02 08 + .byte 6,2,5,5,2,8,10,2,3,3,2,2,1,10,25,0
794
795 ;-------------------------------------------------
796 ; Screen codes of icons (chars) representing a given weapon
797 4C59 WeaponSymbols
798 4C59 40 41 42 43 44 45 + .byte $40,$41,$42,$43,$44,$45,$46,$47
799 4C61 48 49 4A 4B 4C 4D + .byte $48,$49,$4a,$4b,$4c,$4d,$4e,$4f
800 4C69 50 51 52 53 54 55 + .byte $50,$51,$52,$53,$54,$55,$56,$57
801 4C71 58 59 5A 5B 60 7B + .byte $58,$59,$5a,$5b,$60,$7b,$7c,$7d
802 4C79 20 00 00 00 00 00 + .byte $20,$00,$00,$00,$00,$00,$00,$00
803 4C81 00 00 00 00 00 00 + .byte $00,$00,$00,$00,$00,$00,$00,$00
804 4C89 02 03 06 1D 0A 1B + .byte $02,$03,$06,$1d,$0a,$1b,$1c,$1e
805 4C91 3B 3C 3D 3E 3F 5E + .byte $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00
806
807 ; Names of weapons (16 chars lon)
808 4C99 NamesOfWeapons ;the comment is an index in the tables
809 4C99 22 61 62 79 00 2D + dta d"Baby Missile " ; 0
810 4CA9 2D 69 73 73 69 6C + dta d"Missile " ; 1
811 4CB9 22 61 62 79 00 2E + dta d"Baby Nuke " ; 2
812 4CC9 2E 75 6B 65 00 00 + dta d"Nuke " ; 3
813 4CD9 2C 65 61 70 26 72 + dta d"LeapFrog " ; 4
814 4CE9 26 75 6E 6B 79 00 + dta d"Funky Bomb " ; 5
815 4CF9 2D 29 32 36 00 00 + dta d"MIRV " ; 6
816 4D09 24 65 61 74 68 07 + dta d"Death's Head " ; 7
817 4D19 2E 61 70 61 6C 6D + dta d"Napalm " ; 8
818 4D29 28 6F 74 00 2E 61 + dta d"Hot Napalm " ; 9
819 4D39 34 72 61 63 65 72 + dta d"Tracer " ; 10
820 4D49 33 6D 6F 6B 65 00 + dta d"Smoke Tracer " ; 11
821 4D59 22 61 62 79 00 32 + dta d"Baby Roller " ; 12
822 4D69 32 6F 6C 6C 65 72 + dta d"Roller " ; 13
823 4D79 28 65 61 76 79 00 + dta d"Heavy Roller " ; 14
824 4D89 32 69 6F 74 00 23 + dta d"Riot Charge " ; 15
825 4D99 32 69 6F 74 00 22 + dta d"Riot Blast " ; 16
826 4DA9 32 69 6F 74 00 22 + dta d"Riot Bomb " ; 17
827 4DB9 28 65 61 76 79 00 + dta d"Heavy Riot Bomb " ; 18
828 4DC9 22 61 62 79 00 24 + dta d"Baby Digger " ; 19
829 4DD9 24 69 67 67 65 72 + dta d"Digger " ; 20
830 4DE9 28 65 61 76 79 00 + dta d"Heavy Digger " ; 21
831 4DF9 22 61 62 79 00 33 + dta d"Baby Sandhog " ; 22
832 4E09 33 61 6E 64 68 6F + dta d"Sandhog " ; 23
833 4E19 28 65 61 76 79 00 + dta d"Heavy Sandhog " ; 24
834 4E29 24 69 72 74 00 23 + dta d"Dirt Clod " ; 25
835 4E39 24 69 72 74 00 22 + dta d"Dirt Ball " ; 26
836 4E49 34 6F 6E 00 6F 66 + dta d"Ton of Dirt " ; 27
837 4E59 2C 69 71 75 69 64 + dta d"Liquid Dirt " ; 28
838 4E69 24 69 72 74 00 23 + dta d"Dirt Charge " ; 29
839 4E79 25 61 72 74 68 00 + dta d"Earth Disrupter " ; 30
840 4E89 30 6C 61 73 6D 61 + dta d"Plasma Blast " ; 31
841 4E99 2C 61 73 65 72 00 + dta d"Laser " ; 32
842 4EA9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 33
843 4EB9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 34
844 4EC9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 35
845 4ED9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 36
846 4EE9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 37
847 4EF9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 38
848 4F09 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 39
849 4F19 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 40
850 4F29 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 41
851 4F39 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 42
852 4F49 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 43
853 4F59 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 44
854 4F69 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 45
855 4F79 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 46
856 4F89 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 47
857
858 4F99 28 65 61 74 00 27 + dta d"Heat Guidance " ; 48 ($30)
859 4FA9 22 61 6C 00 27 75 + dta d"Bal Guidance " ; 49
860 4FB9 28 6F 72 7A 00 27 + dta d"Horz Guidance " ; 50
861 4FC9 36 65 72 74 00 27 + dta d"Vert Guidance " ; 51
862 4FD9 2C 61 7A 79 00 22 + dta d"Lazy Boy " ; 52
863 4FE9 30 61 72 61 63 68 + dta d"Parachute " ; 53
864 4FF9 22 61 74 74 65 72 + dta d"Battery " ; 54
865 5009 2D 61 67 00 24 65 + dta d"Mag Deflector " ; 55
866 5019 33 68 69 65 6C 64 + dta d"Shield " ; 56
867 5029 26 6F 72 63 65 00 + dta d"Force Shield " ; 57
868 5039 28 65 61 76 79 00 + dta d"Heavy Shield " ; 58
869 5049 33 75 70 65 72 00 + dta d"Super Mag " ; 59
870 5059 21 75 74 6F 00 24 + dta d"Auto Defense " ; 60
871 5069 26 75 65 6C 00 34 + dta d"Fuel Tank " ; 61
872 5079 23 6F 6E 74 61 63 + dta d"Contact Trigger " ; 62
873 5089 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 63
874 5099 joyToKeyTable
875 ; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15
876 5099 FF FF FF FF FF FF + .by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff
877 50A9 previousAngle
878 50A9 00 00 00 00 00 00 :MaxPlayers .by 0
879 50AF previousEnergyL
880 50AF 00 00 00 00 00 00 :MaxPlayers .by 0
881 50B5 previousLeftRange
882 50B5 00 00 00 00 00 00 :MaxPlayers .by 0
883 50BB previousEnergyH
884 50BB 00 00 00 00 00 00 :MaxPlayers .by 0
885 50C1 previousRightAngle
886 50C1 00 00 00 00 00 00 :MaxPlayers .by 0
887 50C7 RandBoundaryLow
888 50C7 00 00 .wo 0
889 50C9 RandBoundaryHigh
890 50C9 00 04 .wo 1024
891 50CB AngleTablePointer
892 50CB 00 .by 0
893
894
895 50CC clearEnd
896
897 .endif
898
90 ;--------------------------------------------------
91 50CC OffensiveTexts
92 50CC icl 'artwork/talk.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\artwork\talk.asm
1 50CC .proc talk
2 50CC 49 4E 20 54 49 4D + L0 dta c"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW."
3 50F7 44 49 45 21 L1 dta c"DIE!"
4 50FB 45 41 54 20 4D 59 + L2 dta c"EAT MY SHORTS!"
5 5109 59 4F 55 27 52 45 + L3 dta c"YOU'RE TOAST!"
6 5116 42 41 4E 5A 41 49 + L4 dta c"BANZAI!"
7 511D 46 52 4F 4D 20 48 + L5 dta c"FROM HELL'S HEART I STAB AT THEE..."
8 5140 49 20 44 49 44 4E + L6 dta c"I DIDN'T DO IT. NOBODY SAW ME DO IT."
9 5165 54 41 4B 45 20 41 + L7 dta c"TAKE A HIKE!"
10 5171 59 4F 55 27 52 45 + L8 dta c"YOU'RE DEAD MEAT."
11 5182 4D 41 4B 45 20 4D + L9 dta c"MAKE MY DAY."
12 518E 43 48 41 52 47 45 + L10 dta c"CHARGE!"
13 5195 41 54 54 41 43 4B + L11 dta c"ATTACK!"
14 519C 59 4F 55 27 52 45 + L12 dta c"YOU'RE OUTTA HERE."
15 51AE 57 41 54 54 53 41 + L13 dta c"WATTSA MATTA YOU?"
16 51BF 46 52 45 45 5A 45 + L14 dta c"FREEZE, OR I'LL SHOOT!"
17 51D5 48 41 20 48 41 20 + L15 dta c"HA HA HA."
18 51DE 57 45 20 43 4F 4D + L16 dta c"WE COME IN PEACE - SHOOT TO KILL!"
19 51FF 49 4E 20 59 4F 55 + L17 dta c"IN YOUR FACE!"
20 520C 44 49 45 20 43 4F + L18 dta c"DIE COMMIE PIG!"
21 521B 49 20 4C 4F 56 45 + L19 dta c"I LOVE THE SMELL OF NAPALM IN THE MORNING."
22 5245 56 49 43 54 4F 52 + L20 dta c"VICTORY!"
23 524D 53 48 4F 57 20 53 + L21 dta c"SHOW SOME RESPECT."
24 525F 4A 55 53 54 20 57 + L22 dta c"JUST WHO DO YOU THINK YOU ARE?"
25 527D 4C 4F 4F 4B 20 4F + L23 dta c"LOOK OUT BELOW!"
26 528C 4B 4E 4F 43 4B 2C + L24 dta c"KNOCK, KNOCK."
27 5299 4C 4F 4F 4B 20 4F + L25 dta c"LOOK OVER THERE."
28 52A9 47 55 45 53 53 20 + L26 dta c"GUESS WHAT'S COMING FOR DINNER?"
29 52C8 4D 45 52 52 59 20 + L27 dta c"MERRY CHRISTMAS."
30 52D8 4F 50 45 4E 20 57 + L28 dta c"OPEN WIDE!"
31 52E2 48 45 52 45 20 47 + L29 dta c"HERE GOES NOTHING..."
32 52F6 44 4F 4E 27 54 20 + L30 dta c"DON'T WORRY, IT ISN'T A LIVE ROUND."
33 5319 42 4C 4F 4F 44 2C + L31 dta c"BLOOD, PAIN, VIOLENCE!"
34 532F 54 41 4B 45 20 54 + L32 dta c"TAKE THIS, SISSY!"
35 5340 49 20 53 48 41 4C + L33 dta c"I SHALL FLATTEN YOU!"
36 5354 49 20 53 48 41 4C + L34 dta c"I SHALL SMASH YOUR UGLY TANK!"
37 5371 49 20 57 4F 4E 44 + L35 dta c"I WONDER WHAT THIS BUTTON DOES?"
38 5390 44 4F 4E 27 54 20 + L36 dta c"DON'T TAKE THIS PERSONALLY."
39 53AB 57 4F 55 4C 44 20 + L37 dta c"WOULD THIS MAKE YOU MAD?"
40 53C3 49 20 54 4F 4C 44 + L38 dta c"I TOLD YOU TO LEAVE MY SISTER ALONE!"
41 53E7 49 20 43 4F 55 4C + L39 dta c"I COULD SPARE YOU, BUT WHY?"
42 5402 4D 59 20 42 4F 4D + L40 dta c"MY BOMB IS BIGGER THAN YOURS."
43 541F 44 4F 4E 27 54 20 + L41 dta c"DON'T FORGET ABOUT ME!"
44 5435 48 41 53 54 41 20 + L42 dta c"HASTA LA VISTA, BABY!"
45 544A 54 48 49 53 20 49 + L43 dta c"THIS IS YOUR BRAIN ON SCORCH."
46 5467 54 41 4B 45 20 54 + L44 dta c"TAKE THIS!"
47 5471 54 48 49 53 20 53 + L45 dta c"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US."
48 54A1 44 49 45 2C 20 41 + L46 dta c"DIE, ALIEN SWINE!"
49 54B2 53 41 59 20 41 52 + L47 dta c"SAY ARRGGHHHHH...."
50 54C4 49 20 53 48 41 4C + L48 dta c"I SHALL OIL MY TURRET WITH YOUR BLOOD."
51 54EA 44 49 45 2C 20 54 + L49 dta c"DIE, TANK-SCUM!"
52 54F9 49 27 4D 20 47 4F + L50 dta c"I'M GONNA BREAK YOUR FACE!"
53 5513 4D 41 4D 41 20 53 + L51 dta c"MAMA SAID KNOCK YOU OUT!"
54 552B 49 20 48 4F 50 45 + L52 dta c"I HOPE YOU ENJOY PAIN!"
55 ;--------------------------------
56 5541 50 41 52 54 49 4E + L53 dta c"PARTING IS SUCH SWEET SORROW... NOT!"
57 5565 55 47 48 21 L54 dta c"UGH!"
58 5569 41 41 52 47 48 21 L55 dta c"AARGH!"
59 556F 41 41 41 47 47 48 + L56 dta c"AAAGGHHH!"
60 5578 49 27 4D 20 4D 45 + L57 dta c"I'M MELTING!"
61 5584 4F 4F 46 2E 2E L58 dta c"OOF.."
62 5589 4F 48 21 L59 dta c"OH!"
63 558C 45 45 45 4B 21 L60 dta c"EEEK!"
64 5591 41 41 43 43 48 21 L61 dta c"AACCH!"
65 5597 49 20 48 41 54 45 + L62 dta c"I HATE IT WHEN THAT HAPPENS."
66 55B3 4F 4E 45 20 44 49 + L63 dta c"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY."
67 55DA 4F 48 20 4E 4F 21 L64 dta c"OH NO!"
68 55E0 4E 4F 54 20 4D 45 + L65 dta c"NOT ME!"
69 55E7 4F 55 43 48 2E L66 dta c"OUCH."
70 55EC 4F 48 20 4E 4F 2C + L67 dta c"OH NO, NOT AGAIN."
71 55FD 41 4E 4F 54 48 45 + L68 dta c"ANOTHER ONE BITES THE DUST."
72 5618 47 4F 4F 44 42 59 + L69 dta c"GOODBYE."
73 5620 48 45 4C 50 20 4D + L70 dta c"HELP ME!"
74 5628 46 41 52 45 57 45 + L71 dta c"FAREWELL, CRUEL WORLD."
75 563E 52 45 4D 45 4D 42 + L72 dta c"REMEMBER THE ALAMO!"
76 5651 4F 48 20 4D 41 4E + L73 dta c"OH MAN!"
77 5658 44 4F 4F 55 47 48 + L74 dta c"DOOUGH!"
78 565F 41 4E 4F 54 48 45 + L75 dta c"ANOTHER DAY, ANOTHER BOMB."
79 5679 54 48 49 53 20 49 + L76 dta c"THIS IS THE END, MY ONLY FRIEND."
80 5699 49 54 27 53 20 41 + L77 dta c"IT'S ALL OVER."
81 56A7 54 48 45 20 46 41 + L78 dta c"THE FAT LADY SANG."
82 56B9 57 48 59 20 44 4F + L79 dta c"WHY DOES EVERYTHING HAPPEN TO ME?"
83 56DA 49 27 4D 20 47 4F + L80 dta c"I'M GOING DOWN."
84 56E9 49 27 56 45 20 47 + L81 dta c"I'VE GOT A BAD FEELING ABOUT THIS."
85 570B 43 52 41 50 4F 4C + L82 dta c"CRAPOLA."
86 5713 50 4F 57 21 L83 dta c"POW!"
87 5717 42 49 46 21 L84 dta c"BIF!"
88 571B 42 41 4D 21 L85 dta c"BAM!"
89 571F 5A 4F 4E 4B 21 L86 dta c"ZONK!"
90 5724 49 20 53 48 4F 55 + L87 dta c"I SHOULD'VE LISTENED TO MY MOTHER..."
91 5748 4E 4F 2E 2E 2E 20 + L88 dta c"NO... A BUD LIGHT!"
92 575A 57 48 41 54 20 57 + L89 dta c"WHAT WAS THAT NOISE?"
93 576E 4D 41 4D 41 20 53 + L90 dta c"MAMA SAID THERE'D BE DAYS LIKE THIS."
94 5792 49 54 53 20 4A 55 + L91 dta c"ITS JUST ONE OF THOSE DAYS..."
95 57AF 49 20 53 45 45 20 + L92 dta c"I SEE A BRIGHT LIGHT..."
96 57C6 4D 4F 4D 4D 59 3F + L93 dta c"MOMMY? IS THAT YOU?"
97 57D9 49 20 4C 45 54 20 + L94 dta c"I LET YOU HIT ME!"
98 57EA 53 55 43 4B 45 52 + L95 dta c"SUCKER SHOT!"
99 57F6 49 20 44 49 44 4E + L96 dta c"I DIDN'T WANT TO LIVE ANYWAY."
100 5813 2D 3C 53 4F 42 3E + L97 dta c"-<SOB>-"
101 581A 57 41 53 20 54 48 + L98 dta c"WAS THAT AS CLOSE AS I THINK IT WAS?"
102 583E 4A 4F 49 4E 20 54 + L99 dta c"JOIN THE ARMY, SEE THE WORLD THEY SAID."
103 5865 49 54 20 57 41 53 + L100 dta c"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!"
104 588E 49 20 44 49 44 4E + L101 dta c"I DIDN'T LIKE VIOLENCE ANYWAY!"
105 58AC 49 20 54 48 4F 55 + L102 dta c"I THOUGHT YOU LIKED ME?"
106 58C3 53 55 43 48 20 53 + L103 dta c"SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT."
107 58F3 49 20 54 48 49 4E + L104 dta c"I THINK THIS GUY'S A LITTLE CRAZY."
108 5915 53 4F 4D 45 48 4F + L105 dta c"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE."
109 593F 48 45 59 21 20 20 + L106 dta c"HEY! KILLIN' AIN'T COOL."
110 5958 47 45 45 2E 2E 2E + L107 dta c"GEE... THANKS."
111 5966 49 27 56 45 20 46 + L108 dta c"I'VE FALLEN AND I CAN'T GET UP!"
112 5985 39 31 31 3F L109 dta c"911?"
113 5989 4F 48 20 4E 4F 21 + L110 dta c"OH NO! HERE I BLOW AGAIN!"
114 59A3 49 27 4C 4C 20 42 + L111 dta c"I'LL BE BACK..."
115 59B2 48 45 59 20 2D 20 + L112 dta c"HEY - I'VE GOT LAWYERS."
116 59C9 54 49 4D 45 20 54 + L113 dta c"TIME TO CALL 1-900-SUE-TANK."
117 59E5 OffensiveTextTableL
118 59E5 CC F7 FB 09 16 1D + 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,<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
119 5A57 OffensiveTextTableH
120 5A57 50 50 50 51 51 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,>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
121 5AC9 OffensiveTextLengths
122 5AC9 2B 04 0E 0D 07 23 + dta 43,4,14,13,7,35,37,12,17,12,7,7,18,17,22,9,33,13,15,42,8,18,30,15,13,16,31,16,10,20,35,22,17,20,29,31,27,24,36,27,29,22,21,29,10,48,17,20,38,15,26,24,22,36,4,6,9,12,5,3,5,6,28,39,6,7,5,17,27,8,8,22,19,7,7,26,32,14,18,33,15,34,8,4,4,4,5,36,18,20,36,29,23,19,17,12,29,7,36,39,41,30,23,48,34,42,25,14,31,4,26,15,23,28
123 = 0036 NumberOfOffensiveTexts=54
124 = 003C NumberOfDeffensiveTexts=60
125 .endp
93 ;--------------------------------------------------
94 ; Game Code
95 ;--------------------------------------------------
96 5B3B START
97
98 ; Startup sequence
99 5B3B 20 A1 72 jsr Initialize
100
101 5B3E A9 49 8D 30 02 A9 + mwa #OptionsDL dlptrs
102 5B48 AD 2F 02 lda dmactls
103 5B4B 29 FC and #$fc
104 5B4D 09 02 ora #$02 ; normal screen width
105 5B4F 8D 2F 02 sta dmactls
106
107 5B52 20 DD 74 jsr Options ;startup screen
108
109 ;entering names of players
110 5B55 A9 5E 8D 30 02 A9 + mwa #NameDL dlptrs
111 5B5F AD 2F 02 lda dmactls
112 5B62 29 FC and #$fc
113 5B64 09 01 ora #$01 ; narrow screen (32 chars)
114 5B66 8D 2F 02 sta dmactls
115
116 5B69 A9 00 85 8B mva #0 TankNr
117
118 5B6D loop01
119 5B6D 20 30 7A jsr EnterPlayerName
120 5B70 E6 8B inc TankNr
121 5B72 A5 8B lda TankNr
122 5B74 CD 19 3D cmp NumberOfPlayers
123 5B77 D0 F4 bne loop01
124
125 5B79 A9 74 8D 30 02 A9 + mwa #dl dlptrs
126 5B83 AD 2F 02 lda dmactls
127 5B86 29 FC and #$fc
128 5B88 09 02 ora #$02 ; normal screen width
129 5B8A 8D 2F 02 sta dmactls
130
131 5B8D 20 54 73 jsr RandomizeSequence
132 ; for the round #1 shooting sequence is random
133
134 5B90 MainGameLoop
135
136 5B90 20 2C 76 jsr CallPurchaseForEveryTank
137
138 5B93 20 39 73 jsr SetDLI
139 5B96 A9 74 8D 30 02 A9 + mwa #dl dlptrs
140 5BA0 AD 2F 02 lda dmactls
141 5BA3 29 FC and #$fc
142 5BA5 09 02 ora #$02 ; 2=normal, 3 = wide screen width
143 5BA7 8D 2F 02 sta dmactls
144
145 5BAA 20 35 72 jsr GetRandomWind
146
147 5BAD 20 55 5C jsr Round
148
149 5BB0 20 20 74 jsr SortSequence
150
151 ; Hide all (easier than hide last ;) ) tanks
152 5BB3 A9 01 8D FB 3D mva #1 Erase
153 5BB8 20 E2 84 jsr drawtanks
154 5BBB A9 00 8D FB 3D mva #0 Erase
155 5BC0 20 66 72 jsr PMoutofScreen ;let P/M disappear
156
157 ; here gains and looses should be displayed (dollars)
158 ; finally we have changed our minds and money of players
159 ; is displayed only in weapons shop
160
161 ; Results are number of other deaths
162 ; before the player dies itself
163
164 ; add gains and substract looses
165 ; gain is what player gets for lost energy of opponents
166 ; energy lost by opponents is added during Round and
167 ; little below in source multiplied by 2 to get "dollars".
168 ; By analogy, loose is energy that given player looses during
169 ; each Round.
170 ; Important! If player has 10 energy and gets central hit
171 ; from nuke that would take 90 energy point his loose
172 ; is 90, not 10
173 5BC3 20 37 7D jsr DisplayResults
174
175 ;check demo mode
176 5BC6 AE 19 3D ldx numberOfPlayers
177 5BC9 CA dex
178 5BCA checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
179 5BCA BD 20 3D lda skillTable,x
180 5BCD F0 1D beq peopleAreHere
181 5BCF CA dex
182 5BD0 10 F8 bpl checkForHuman
183 5BD2 A8 tay
184 ; no people, just wait a bit
185 5BD3 pause 150
Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
2 5BD3 A2 96 ldx #150
3 5BD5 ?PAUSELOOP
3 5BD5 AD 0B D4 LDA VCOUNT
4 5BD8 8D 0A D4 STA WSYNC
5 5BDB 8D 0A D4 STA WSYNC
6 5BDE 8D 0A D4 STA WSYNC
7 5BE1 CD 0B D4 ?WA CMP VCOUNT
8 5BE4 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
5 5BE6 CA dex
6 5BE7 D0 EC bne ?PAUSELOOP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
186 5BE9 4C FF 5B jmp noKey
187
188 5BEC peopleAreHere
189 ;key ; only if there is a human player
190 5BEC AD 0F D2 lda SKSTAT
191 5BEF C9 FF cmp #$ff
192 5BF1 F0 07 beq checkFire
193 5BF3 C9 F7 cmp #$f7
194 5BF5 F0 03 beq checkFire
195 5BF7 4C FF 5B jmp noKey ;key pressed, so go
196 5BFA checkFire
197 ;------------JOY-------------
198 ;happy happy joy joy
199 ;check for joystick now
200 ;fire
201 5BFA AD 10 D0 lda TRIG0
202 5BFD D0 ED bne peopleAreHere ;fire not pressed, so loop
203
204 5BFF noKey
205 5BFF AE 19 3D ldx NumberOfPlayers
206 5C02 CA dex
207 5C03 CalculateGains
208 ; add gain * 2
209 5C03 1E 38 3D asl gainL,x
210 5C06 3E 32 3D rol gainH,x
211 5C09 18 clc
212 5C0A BD 2C 3D lda moneyL,x
213 5C0D 7D 38 3D adc gainL,x
214 5C10 9D 2C 3D sta moneyL,x
215 5C13 BD 26 3D lda moneyH,x
216 5C16 7D 32 3D adc gainH,x
217 5C19 9D 26 3D sta moneyH,x
218 ; substract loose
219 ; if loose is greater than money then zero money
220 5C1C BD 26 3D lda moneyH,x
221 5C1F DD 3E 3D cmp looseH,x
222 5C22 90 20 bcc zeromoney
223 5C24 D0 08 bne substractloose
224 5C26 BD 2C 3D lda moneyL,x
225 5C29 DD 44 3D cmp looseL,x
226 5C2C 90 16 bcc zeromoney
227 5C2E substractloose
228 5C2E 38 sec
229 5C2F BD 2C 3D lda moneyL,x
230 5C32 FD 44 3D sbc looseL,x
231 5C35 9D 2C 3D sta moneyL,x
232 5C38 BD 26 3D lda moneyH,x
233 5C3B FD 3E 3D sbc looseH,x
234 5C3E 9D 26 3D sta moneyH,x
235 5C41 4C 4C 5C jmp skipzeroing
236 5C44 zeromoney
237 5C44 A9 00 lda #0
238 5C46 9D 2C 3D sta moneyL,x
239 5C49 9D 26 3D sta moneyH,x
240
241 5C4C skipzeroing
242 5C4C CA dex
243 5C4D 10 B4 bpl CalculateGains
244
245
246
247 5C4F EE 4B 3F inc CurrentRoundNr
248 5C52 4C 90 5B jmp MainGameLoop
249
250
251 ;--------------------------------------------------
252 5C55 Round .proc ;
253 ;--------------------------------------------------
254 ; at the beginning of each Round we set energy
255 ; of all players to 100
256 ; the maximum shooting energy to 1000 (it is 10*energy)
257 ; the default shooting energy to 350
258 ; the default shooting angle to 45 degrees
259 ; of course gains an looses are zeroed
260
261 5C55 A9 00 lda #0
262 5C57 AA tax
263 5C58 loop
264 5C58 9D A9 50 sta previousAngle,x
265 5C5B E8 inx
266 5C5C E0 23 cpx #(clearEnd-PreviousAngle)
267 5C5E D0 F8 bne loop
268 .endp
269
270 5C60 A2 05 ldx #5
271 5C62 SettingEnergies
272 5C62 A9 00 lda #$00
273 5C64 9D 38 3D sta gainL,x
274 5C67 9D 32 3D sta gainH,x
275 5C6A 9D 44 3D sta looseL,x
276 5C6D 9D 3E 3D sta looseH,x
277 5C70 A9 63 lda #99
278 5C72 9D 4A 3D sta Energy,x
279 5C75 9D 51 3D sta eXistenZ,x
280 5C78 9D 57 3D sta LASTeXistenZ,x
281 ; anything in eXistenZ table means that this tank exist
282 ; in the given round
283 5C7B A9 E8 lda #232
284 5C7D 9D 76 3D sta MaxEnergyTableL,x
285 5C80 A9 03 lda #3
286 5C82 9D 7C 3D sta MaxEnergyTableH,x
287 5C85 A9 5E lda #94
288 5C87 9D 6A 3D sta EnergyTableL,x
289 5C8A A9 01 lda #1
290 5C8C 9D 70 3D sta EnergyTableH,x
291 ;lda #(255-45)
292 ;it does not look good when all tanks have
293 ;barrels pointing the same direction
294 ;so it would be nice to have more or less random
295 ;angles
296
297 5C8F 20 89 73 jsr RandomizeAngle
298 5C92 9D 82 3D sta AngleTable,x
299
300
301 5C95 CA dex
302 5C96 10 CA bpl SettingEnergies
303
304 5C98 A9 00 8D 69 3D mva #0 CurrentResult
305
306 ;generating the new landscape
307 5C9D 20 66 72 jsr PMoutofScreen ;let P/M disappear
308 5CA0 20 CB 83 jsr clearscreen ;let the screen be clean
309 5CA3 20 32 84 jsr placetanks ;let the tanks be evenly placed
310 5CA6 20 8B 87 jsr calculatemountains ;let mountains be nice for the eye
311 5CA9 20 83 85 jsr drawmountains ;draw them
312 5CAC 20 E2 84 jsr drawtanks ;finally draw tanks
313
314 ;--------------------round screen is ready---------
315
316 ;mva #0 TankNr
317 5CAF A9 00 85 8C mva #0 TankSequencePointer
318
319 5CB3 MainRoundLoop
320 ; here we must check if by a chance there is only one
321 ; tank with energy greater than 0 left
322
323 5CB3 A0 00 ldy #0 ; number of tanks with energy greater than zero
324 5CB5 AE 19 3D ldx NumberOfPlayers
325 5CB8 CA dex
326 5CB9 CheckingIfRoundIsFinished
327 5CB9 BD 51 3D lda eXistenZ,x
328 5CBC F0 01 beq NoEnergy
329 5CBE C8 iny
330 5CBF NoEnergy
331 5CBF CA dex
332 5CC0 10 F7 bpl CheckingIfRoundIsFinished
333
334 5CC2 C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ?
335 5CC4 B0 18 bcs DoNotFinishTheRound
336
337 ;points for the last living tank
338 5CC6 AE 19 3D ldx NumberOfPlayers
339 5CC9 CA dex
340 5CCA WhichTankWonLoop
341 5CCA BD 51 3D lda eXistenZ,x
342 5CCD D0 04 bne ThisOneWon
343 5CCF CA dex
344 5CD0 10 F8 bpl WhichTankWonLoop
345 ;error here!!!
346 ;stop
347 ; somehow I believed program will be never here
348 ; but it was a bad assumption
349 ; gode goes here when there is such a situation
350 ; (we've got a SITUATION here, it you know what I mean)
351 ; there are two tanks left.
352 ; one of them is killed by the second tank
353 ; second tank explodes and kills the first one.
354 ; and code lands here...
355 ; looks like no one won!
356
357 5CD2 60 rts
358
359 5CD3 ThisOneWon
360 5CD3 AD 69 3D lda CurrentResult
361 5CD6 18 clc
362 5CD7 7D 5D 3D adc ResultsTable,x
363 5CDA 9D 5D 3D sta ResultsTable,x
364
365 5CDD 60 rts ; this Round is finished
366
367 5CDE DoNotFinishTheRound
368 ;ldx TankNr
369
370 5CDE A6 8C ldx TankSequencePointer
371 5CE0 BD 1A 3D lda TankSequence,x
372 5CE3 85 8B sta TankNr
373 5CE5 AA tax
374 5CE6 BD 4A 3D lda Energy,x ;skip if no energy
375 5CE9 D0 03 4C 7A 5D jeq NextPlayerShoots
376
377
378 5CEE A9 01 8D CA 3E mva #1 color ;to display flying point
379
380 5CF3 BD A4 8E lda TankColoursTable,x
381 5CF6 8D C6 02 sta colpf2s ; set color of status line
382
383 5CF9 BD 20 3D lda SkillTable,x
384 5CFC F0 0F beq ManualShooting
385
386 ; robotanks shoot here
387 5CFE 20 4F 8C jsr ArtificialIntelligence
388 5D01 20 E8 73 jsr MoveBarrelToNewPosition
389 5D04 20 4B 7F jsr DisplayingSymbols ;all digital values like force, angle, wind, etc.
390 5D07 20 55 80 jsr PutTankNameOnScreen
391 ; let's move the tank's barrel so it points the right
392 ; direction
393 5D0A 4C 13 5D jmp AfterManualShooting
394
395 5D0D ManualShooting
396
397 5D0D 20 BF 83 jsr WaitForKeyRelease
398 5D10 20 92 66 jsr BeforeFire
399
400 5D13 AfterManualShooting
401 ; lower energy to eventually let tanks commit suicide
402 5D13 A6 8B ldx TankNr
403 5D15 DE 4A 3D dec Energy,x
404 5D18 BD 89 3D lda ActiveWeapon,x
405
406 5D1B 20 24 68 jsr Shoot
407 5D1E AD 96 3D lda HitFlag ;0 if missed
408 5D21 F0 4A beq missed
409 5D23 A9 00 lda #0
410 5D25 8D 4C 3F sta FallDown1
411 5D28 8D 4D 3F sta FallDown2
412 5D2B 20 63 5E jsr Explosion
413
414 ;here we clear offensive text (after a shoot)
415 5D2E A4 8B ldy TankNr
416 5D30 A9 00 8D 51 48 mva #0 plot4x4color
417 5D35 20 10 7C jsr DisplayOffensiveTextNr
418
419
420 5D38 AfterExplode
421 ;temporary tanks removal (would fall down with soil)
422 5D38 A5 8B 85 A7 mva TankNr tempor2
423 5D3C A9 01 8D FB 3D mva #1 Erase
424 5D41 20 E2 84 jsr drawtanks
425 5D44 A5 A7 85 8B mva tempor2 TankNr
426 5D48 A9 00 8D FB 3D mva #0 Erase
427 5D4D AD 4D 3F lda FallDown2
428 5D50 F0 03 beq NoFallDown2
429 5D52 20 F7 85 jsr SoilDown2;
430
431 5D55 NoFallDown2
432 ;here tanks are falling down
433 5D55 A5 8B 85 A7 mva tankNr tempor2
434 5D59 A9 00 85 8B mva #0 TankNr
435
436 5D5D TanksFallDown
437 5D5D 20 B8 68 jsr TankFalls
438 5D60 E6 8B A5 8B inc:lda TankNr
439 5D64 CD 19 3D cmp NumberOfPlayers
440 5D67 D0 F4 bne TanksFallDown
441 5D69 A5 A7 85 8B mva tempor2 TankNr
442 5D6D missed
443
444 ;here we clear offensive text (after a shoot)
445 ;shit -- it's second time, but it must be like this
446 5D6D A4 8B ldy TankNr
447 5D6F A9 00 8D 51 48 mva #0 plot4x4color
448 5D74 20 10 7C jsr DisplayOffensiveTextNr
449
450 5D77 20 C4 71 jsr DecreaseWeaponAfterShoot ; or before???
451 5D7A NextPlayerShoots
452 5D7A A9 01 8D FB 3D mva #1 Erase
453 5D7F 20 E2 84 jsr drawtanks
454
455 ;before it shoots, the eXistenZ table must be
456 ;updated accordingly to actual energy (was forgotten, sorry to ourselves)
457
458 5D82 A2 05 ldx #5
459 5D84 SeteXistenZ
460 5D84 BD 4A 3D lda Energy,x
461 5D87 9D 51 3D sta eXistenZ,x
462 5D8A 8D 8F 3D sta L1
463
464 ;DATA L1,L2
465 ;RESULT WH*256+L1
466 ;Multiplication 8bit*8bit,
467 ;result 16bit
468 ;this algiorithm is a little longer than in Ruszczyc 6502 book
469 ;but it is faster
470
471 5D8D A0 08 LDy #8
472 5D8F A9 00 LDA #0
473 5D91 18 CLC
474 5D92 LP0
475 5D92 6A ror
476 5D93 6E 8F 3D ROR L1
477 5D96 90 03 BCC B0
478 5D98 18 CLC
479 5D99 69 0A ADC #10 ; multiplication by 10
480 5D9B 88 B0 DEy
481 5D9C D0 F4 BNE LP0
482 5D9E 6A ror
483 5D9F 6E 8F 3D ROR L1
484 5DA2 9D 7C 3D STA MaxEnergyTableH,x
485 5DA5 AD 8F 3D lda L1
486 5DA8 9D 76 3D sta MaxEnergyTableL,x
487
488 5DAB CA dex
489 5DAC 10 D6 bpl SeteXistenZ
490
491 ;was setup of maximum energy for players
492
493 5DAE A9 00 8D FB 3D mva #0 Erase
494 5DB3 20 E2 84 jsr drawtanks
495
496 ;inc TankNr
497 ;lda TankNr
498 5DB6 E6 8C A5 8C inc:lda TankSequencePointer
499 5DBA CD 19 3D cmp NumberOfPlayers
500 5DBD D0 04 bne PlayersAgain
501 ;mva 0 TankNr
502 5DBF A9 00 85 8C mva #0 TankSequencePointer
503
504 5DC3 PlayersAgain .proc
505
506 ; In LASTeXistenZ there are values of eXistenZ before shoot
507 ; from the next tank.
508 ; Now it must be checked if by a chance something that had
509 ; LASTeXistenZ>0 is not equal to 0 right now,
510 ; because it means this tank died during this round.
511 ; Most important thing is:
512 ; after each explosion of the tank these operations must be
513 ; performed from the beginning!
514 ; (it is made by another jump into the after explosion routines)
515 ; It is because exploding tank can destroy their neighbours,
516 ; additionally this tank just have had LASTeXistenZ set to 0,
517 ; otherwise it would explode again and again.
518 ; OK, text how to do it is ready, now comes coding .
519 ; Aaaah! - in main loop we have to set eXistenZ and LASTeXistenZ
520
521 5DC3 AE 19 3D ldx NumberOfPlayers
522 5DC6 CA dex
523 5DC7 CheckingPlayersDeath
524 5DC7 BD 57 3D lda LASTeXistenZ,x
525 5DCA F0 05 beq NoPlayerNoDeath
526 5DCC BD 51 3D lda eXistenZ,x
527 5DCF F0 06 beq PlayerXdeath
528 5DD1 NoPlayerNoDeath
529 5DD1 CA dex
530 5DD2 10 F3 bpl CheckingPlayersDeath
531 ; if processor is here it means there are no more explosions
532 5DD4 4C B3 5C jmp MainRoundLoop
533 .endp
534 ;---------------------------------
535 5DD7 PlayerXdeath .proc
536 ; first we inform that this tank should not explode anymore:
537 ; there is 0 in A, and Tank Number in X, so...
538
539 5DD7 9D 57 3D sta LASTeXistenZ,x
540 ; save x somewhere
541 5DDA 8E DD 44 stx TankTempY
542
543 ; display defensive text here (well, defensive
544 ; is not the real meaning, it should be pre-death,
545 ; but I am too lazy to change names of variables)
546
547 ; in X there is a number of tank that died
548
549 5DDD AD 69 3D lda CurrentResult
550 5DE0 18 clc
551 5DE1 7D 5D 3D adc ResultsTable,x
552 5DE4 9D 5D 3D sta ResultsTable,x
553 5DE7 EE 69 3D inc CurrentResult
554 .endp
555
556 ;RandomizeDeffensiveText
557 5DEA randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1)
Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 5DEA ?rand
4 5DEA AD 0A D2 lda random
5 5DED C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor
6 5DEF 90 F9 bcc ?rand
7 5DF1 C9 72 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling
8 5DF3 B0 F5 bcs ?rand
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
558 5DF5 8D DC 44 sta TextNumberOff
559 5DF8 AC DD 44 ldy TankTempY
560 5DFB A9 01 8D 51 48 mva #1 plot4x4color
561 5E00 20 10 7C jsr DisplayOffensiveTextNr
562
563 5E03 PAUSE 75
Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
2 5E03 A2 4B ldx #75
3 5E05 ?PAUSELOOP
3 5E05 AD 0B D4 LDA VCOUNT
4 5E08 8D 0A D4 STA WSYNC
5 5E0B 8D 0A D4 STA WSYNC
6 5E0E 8D 0A D4 STA WSYNC
7 5E11 CD 0B D4 ?WA CMP VCOUNT
8 5E14 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
5 5E16 CA dex
6 5E17 D0 EC bne ?PAUSELOOP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
564 ;Deffensive text cleanup
565 ;here we clear Deffensive text (after a shoot)
566 5E19 AC DD 44 ldy TankTempY
567 5E1C A9 00 8D 51 48 mva #0 plot4x4color
568 5E21 20 10 7C jsr DisplayOffensiveTextNr
569
570
571 ; calculate position of the explosion (the post-death one?)
572 5E24 AE DD 44 ldx TankTempY
573 5E27 18 clc
574 5E28 BD 97 3D lda xtankstableL,x
575 5E2B 69 04 adc #4 ; more or less in the middle of the tank
576 5E2D 85 80 sta xdraw
577 5E2F BD 9D 3D lda xtankstableH,x
578 5E32 69 00 adc #0
579 5E34 85 81 sta xdraw+1
580 5E36 38 sec
581 5E37 BD A3 3D lda ytankstable,x
582 5E3A E9 04 sbc #4
583 5E3C 85 82 sta ydraw
584 5E3E A9 00 lda #0
585 5E40 85 83 sta ydraw+1 ; there is 0 left in A, so...
586
587 ;cleanup of the soil fall down ranges (left and right)
588 5E42 8D FE 3D sta RangeRight
589 5E45 8D FF 3D sta RangeRight+1
590 5E48 8D 4C 3F sta FallDown1
591 5E4B 8D 4D 3F sta FallDown2
592 5E4E A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft
593
594
595
596 ; We are randomizing the weapon now.
597 ; As we are jumping into the middle of the weapon
598 ; routine we are preparing the number *2 -
599 ; - to make it easier and because we are using only
600 ; first 32 weapons we are doing this with just one AND
601
602 5E58 AD 0A D2 lda random
603 5E5B 29 3E and #$3e ; range (0-31 number multiplied by 2)
604 5E5D 20 7B 5E jsr Explosion2
605
606 ; jump to after explosion routines (soil fallout, etc.)
607 ; After going through these routines we are back
608 ; to checking if a tank exploded and maybe we have
609 ; a deadly shot here again.
610
611
612 5E60 4C 38 5D jmp AfterExplode
613
614
615 ;--------------------------------------------------
616 5E63 Explosion .proc
617 ;--------------------------------------------------
618 ;cleanup of the soil fall down ranges (left and right)
619 5E63 A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft
620 5E6D A9 00 lda #0
621 5E6F 8D FE 3D sta RangeRight
622 5E72 8D FF 3D sta RangeRight+1
623
624 5E75 A6 8B ldx TankNr
625 5E77 BD 89 3D lda ActiveWeapon,x
626 5E7A 0A asl
627 .endp
628 5E7B Explosion2 .proc
629 5E7B AA tax
630 5E7C BD 86 5E lda ExplosionRoutines+1,x
631 5E7F 48 pha
632 5E80 BD 85 5E lda ExplosionRoutines,x
633 5E83 48 pha
634 5E84 60 rts
635 5E85 ExplosionRoutines
636 5E85 C7 5E .word babymissile-1
637 5E87 D5 5E .word missile-1
638 5E89 E3 5E .word babynuke-1
639 5E8B F1 5E .word nuke-1
640 5E8D FF 5E .word leapfrog-1
641 5E8F 82 5F .word funkybomb-1
642 5E91 7E 5F .word mirv-1
643 5E93 26 60 .word deathshead-1
644 5E95 C6 5E .word VOID-1 ;napalm
645 5E97 C6 5E .word VOID-1 ;hotnapalm
646 5E99 96 60 .word tracer-1
647 5E9B C6 5E .word VOID-1 ;smoketracer
648 5E9D 97 60 .word babyroller-1
649 5E9F A2 60 .word roller-1
650 5EA1 AD 60 .word heavyroller-1
651 5EA3 C6 5E .word VOID-1 ;riotcharge
652 5EA5 C6 5E .word VOID-1 ;riotblast
653 5EA7 B8 60 .word riotbomb-1
654 5EA9 C6 60 .word heavyriotbomb-1
655 5EAB D4 60 .word babydigger-1
656 5EAD E9 60 .word digger-1
657 5EAF FE 60 .word heavydigger-1
658 5EB1 07 62 .word babysandhog-1
659 5EB3 1C 62 .word sandhog-1
660 5EB5 31 62 .word heavysandhog-1
661 5EB7 46 62 .word dirtclod-1
662 5EB9 54 62 .word dirtball-1
663 5EBB 62 62 .word tonofdirt-1
664 5EBD C6 5E .word VOID-1 ;liquiddirt
665 5EBF 70 62 .word dirtcharge-1
666 5EC1 C6 5E .word VOID-1 ;earthdisrupter
667 5EC3 C6 5E .word VOID-1 ;plasmablast
668 5EC5 7E 62 .word laser-1
669
670 5EC7 VOID
671 5EC7 60 rts
672 .endp
673 ; ------------------------
674
675 5EC8 icl 'weapons.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 ; ------------------------
6 5EC8 babymissile
7 5EC8 EE 4D 3F inc FallDown2
8 5ECB A9 0B 8D 49 3F mva #11 ExplosionRadius
9 5ED0 20 44 71 jsr CalculateExplosionRange
10 5ED3 4C 96 63 jmp xmissile
11 ; ------------------------
12 5ED6 missile ;
13 5ED6 EE 4D 3F inc FallDown2
14 5ED9 A9 11 8D 49 3F mva #17 ExplosionRadius
15 5EDE 20 44 71 jsr CalculateExplosionRange
16 5EE1 4C 96 63 jmp xmissile
17 ; ------------------------
18 5EE4 babynuke
19 5EE4 EE 4D 3F inc FallDown2
20 5EE7 A9 19 8D 49 3F mva #25 ExplosionRadius
21 5EEC 20 44 71 jsr CalculateExplosionRange
22 5EEF 4C 96 63 jmp xmissile
23 ; ------------------------
24 5EF2 nuke
25 5EF2 EE 4D 3F inc FallDown2
26 5EF5 A9 1F 8D 49 3F mva #31 ExplosionRadius
27 5EFA 20 44 71 jsr CalculateExplosionRange
28 5EFD 4C 96 63 jmp xmissile
29 ; ------------------------
30 5F00 leapfrog
31 5F00 EE 4D 3F inc FallDown2
32 5F03 A9 11 8D 49 3F mva #17 ExplosionRadius
33 5F08 20 44 71 jsr CalculateExplosionRange
34 5F0B 20 96 63 jsr xmissile
35
36 ; soil must fall down now! there is no other way...
37 ; hide tanks or they fall down with soil
38
39 5F0E A5 8B lda TankNr
40 5F10 48 pha
41 5F11 A9 01 8D FB 3D mva #1 Erase
42 5F16 20 E2 84 jsr drawtanks
43 5F19 A9 00 8D FB 3D mva #0 Erase
44 5F1E 20 F7 85 jsr SoilDown2
45 5F21 20 E2 84 jsr drawtanks
46 5F24 68 pla
47 5F25 85 8B sta TankNr
48
49 ; it looks like force is divided by 4 here BUT"
50 ; in Flight routine force is multiplied by 2 and left
51 ; so, we have Force divided by 2 here (not accurately)
52
53 5F27 4E 82 3E lsr Force+1
54 5F2A 6E 81 3E ror Force
55 ;lsr Force+1
56 ;ror Force
57 5F2D AD 4E 3F lda LeapFrogAngle
58 5F30 8D 80 3E sta Angle
59 5F33 20 75 6A jsr Flight
60 5F36 AD 96 3D lda HitFlag
61 5F39 F0 43 beq EndOfLeapping
62 5F3B A9 0F 8D 49 3F mva #15 ExplosionRadius
63 5F40 20 2D 71 jsr CalculateExplosionRange0
64 5F43 20 96 63 jsr xmissile
65
66 ; soil must fall down now! there is no other way...
67 ; hide tanks or they fall down with soil
68 5F46 A5 8B lda TankNr
69 5F48 48 pha
70 5F49 A9 01 8D FB 3D mva #1 Erase
71 5F4E 20 E2 84 jsr drawtanks
72 5F51 A9 00 8D FB 3D mva #0 Erase
73 5F56 20 F7 85 jsr SoilDown2
74 5F59 20 E2 84 jsr drawtanks
75 5F5C 68 pla
76 5F5D 85 8B sta TankNr
77
78 ; it looks like force is divided by 4 here BUT"
79 ; in Flight routine force is multiplied by 2 and left
80 ; so, we have Force divided by 2 here (not accurately)
81 ;lsr Force+1
82 ;ror Force
83 5F5F 4E 82 3E lsr Force+1
84 5F62 6E 81 3E ror Force
85 5F65 AD 4E 3F lda LeapFrogAngle
86 5F68 8D 80 3E sta Angle
87 5F6B 20 75 6A jsr Flight
88 5F6E AD 96 3D lda HitFlag
89 5F71 F0 0B beq EndOfLeapping
90 5F73 A9 0D 8D 49 3F mva #13 ExplosionRadius
91 5F78 20 2D 71 jsr CalculateExplosionRange0
92 5F7B 4C 96 63 jmp xmissile
93 5F7E EndOfLeapping
94 5F7E 60 rts
95 ; ------------------------
96 5F7F mirv ; the whole mirv is performed by Flight routine
97 5F7F EE 4D 3F inc FallDown2
98 5F82 60 rts
99 ; ------------------------
100 5F83 funkybomb ;
101 5F83 A9 01 8D A9 3E mva #1 tracerflag
102 5F88 AD 75 3E 8D A5 3E + mwa xtraj+1 xtrajfb
103 5F94 AD 78 3E 8D A7 3E + mwa ytraj+1 ytrajfb
104 5FA0 EE 4D 3F inc FallDown2
105 ;central Explosion
106 5FA3 A9 15 8D 49 3F mva #21 ExplosionRadius
107 5FA8 20 2D 71 jsr CalculateExplosionRange0
108 5FAB 20 96 63 jsr xmissile
109
110 5FAE A5 8B lda TankNr
111 5FB0 48 pha
112 5FB1 A9 01 8D FB 3D mva #1 Erase
113 5FB6 20 E2 84 jsr drawtanks
114 5FB9 A9 00 8D FB 3D mva #0 Erase
115
116 5FBE 20 F7 85 jsr SoilDown2
117 ;
118 5FC1 A9 01 8D FB 3D mva #1 Erase
119 5FC6 20 E2 84 jsr drawtanks
120 5FC9 A9 00 8D FB 3D mva #0 Erase
121 5FCE 68 pla
122 5FCF 85 8B sta TankNr
123
124 5FD1 A9 05 8D A4 3E mva #5 FunkyBombCounter
125 5FD6 FunkyBombLoop
126 ;force randomization (range: 256-511)
127 5FD6 AD 0A D2 lda random
128 5FD9 8D 81 3E sta Force
129 5FDC A9 01 lda #1
130 5FDE 8D 82 3E sta Force+1
131 ;Angle randomization Range: (-16..+16)
132 5FE1 AD 0A D2 lda random
133 5FE4 4A lsr
134 5FE5 29 1F and #%00011111
135 5FE7 90 02 bcc DoNotEor
136 5FE9 49 FF eor #$ff
137 5FEB DoNotEor
138 5FEB 8D 80 3E sta Angle
139
140 5FEE A9 00 lda #0
141 5FF0 8D 74 3E sta xtraj
142 5FF3 8D 77 3E sta ytraj
143 5FF6 AD A5 3E 8D 75 3E + mwa xtrajfb xtraj+1
144 6002 AD A7 3E 8D 78 3E + mwa ytrajfb ytraj+1
145 600E 20 75 6A jsr Flight
146
147 6011 AD 96 3D lda HitFlag
148 6014 F0 06 beq NoExplosionInFunkyBomb
149 6016 20 44 71 jsr CalculateExplosionRange
150 6019 20 96 63 jsr xmissile
151 601C NoExplosionInFunkyBomb
152 601C CE A4 3E dec FunkyBombCounter
153 601F D0 B5 bne FunkyBombLoop
154 6021 A9 00 8D A9 3E mva #0 tracerflag
155 6026 60 rts
156 ; ------------------------
157 6027 deathshead
158 6027 EE 4D 3F inc FallDown2
159 602A A9 1F 8D 49 3F mva #31 ExplosionRadius
160 602F 20 44 71 jsr CalculateExplosionRange
161 6032 20 96 63 jsr xmissile
162 6035 38 A5 80 E9 23 85 + sbw xdraw #35
163 6040 20 44 71 jsr CalculateExplosionRange
164 6043 20 96 63 jsr xmissile
165 6046 18 A5 80 69 46 85 + adw xdraw #70
166 6051 20 44 71 jsr CalculateExplosionRange
167 6054 20 96 63 jsr xmissile
168 6057 38 A5 80 E9 23 85 + sbw xdraw #35
169 ;
170 6062 38 A5 82 E9 23 85 + sbw ydraw #35
171 ;jsr CalculateExplosionRange
172 606D A5 83 C9 00 D0 04 + cpw ydraw #screenHeight
173 6077 B0 03 bcs NoUpperCircle
174 6079 20 96 63 jsr xmissile
175 607C NoUpperCircle
176 607C 18 A5 82 69 46 85 + adw ydraw #70
177 ;jsr CalculateExplosionRange
178 6087 A5 83 C9 00 D0 04 + cpw ydraw #screenHeight
179 6091 B0 03 bcs NoLowerCircle
180 6093 20 96 63 jsr xmissile
181 6096 NoLowerCircle
182 6096 60 rts
183 ; ------------------------
184 6097 tracer
185 6097 60 rts
186 ; ------------------------
187 6098 babyroller
188 6098 EE 4D 3F inc FallDown2
189 609B A9 0B 8D 49 3F mva #11 ExplosionRadius
190 60A0 4C 64 64 jmp xroller
191 ; ------------------------
192 60A3 roller ;
193 60A3 EE 4D 3F inc FallDown2
194 60A6 A9 15 8D 49 3F mva #21 ExplosionRadius
195 60AB 4C 64 64 jmp xroller
196 ; ------------------------
197 60AE heavyroller
198 60AE EE 4D 3F inc FallDown2
199 60B1 A9 1F 8D 49 3F mva #31 ExplosionRadius
200 60B6 4C 64 64 jmp xroller
201 ; ------------------------
202 60B9 riotbomb
203 60B9 EE 4D 3F inc FallDown2
204 60BC A9 11 8D 49 3F mva #17 ExplosionRadius
205 60C1 20 44 71 jsr CalculateExplosionRange
206 60C4 4C 48 64 jmp xriotbomb
207 ; ------------------------
208 60C7 heavyriotbomb
209 60C7 EE 4D 3F inc FallDown2
210 60CA A9 1D 8D 49 3F mva #29 ExplosionRadius
211 60CF 20 44 71 jsr CalculateExplosionRange
212 60D2 4C 48 64 jmp xriotbomb
213 ; ------------------------
214 60D5 babydigger
215 60D5 A9 00 8D 2C 3E mva #0 sandhogflag
216 60DA EE 4D 3F inc FallDown2
217 60DD A9 0D 8D 0B 3E mva #13 DigLong
218 60E2 A9 01 8D 0A 3E mva #1 diggery ; how many branches (-1)
219 60E7 4C 14 61 jmp xdigger
220 ; ------------------------
221 60EA digger ;
222 60EA A9 00 8D 2C 3E mva #0 sandhogflag
223 60EF EE 4D 3F inc FallDown2
224 60F2 A9 0D 8D 0B 3E mva #13 DigLong
225 60F7 A9 03 8D 0A 3E mva #3 diggery ; how many branches (-1)
226 60FC 4C 14 61 jmp xdigger
227 ; ------------------------
228 60FF heavydigger
229 60FF A9 00 8D 2C 3E mva #0 sandhogflag
230 6104 EE 4D 3F inc FallDown2
231 6107 A9 0D 8D 0B 3E mva #13 DigLong
232 610C A9 07 8D 0A 3E mva #7 diggery ; how many branches (-1)
233 6111 4C 14 61 jmp xdigger
234 ; ------------------------
235 6114 xdigger
236 6114 A5 80 8D 06 3E A5 + mwa xdraw digstartx
237 611E A5 82 8D 08 3E A5 + mwa ydraw digstarty
238 6128 AE 0A 3E ldx diggery
239 612B WriteToBranches
240 612B A5 80 lda xdraw
241 612D 9D 0C 3E sta digtabxL,x
242 6130 A5 81 lda xdraw+1
243 6132 9D 14 3E sta digtabxH,x
244 6135 A5 82 lda ydraw
245 6137 9D 1C 3E sta digtabyL,x
246 613A A5 83 lda ydraw+1
247 613C 9D 24 3E sta digtabyH,x
248 613F CA dex
249 6140 10 E9 bpl WriteToBranches
250 6142 20 EB 61 jsr DiggerCharacter ; start character
251
252 6145 18 A5 80 69 04 85 + adw xdraw #4
253 6150 AD 0B 3E lda DigLong
254 ; looks strange, but it is (DigLong+2)*4
255 6153 18 clc
256 6154 69 02 adc #$2
257 6156 0A asl
258 6157 0A asl
259 6158 8D 49 3F sta ExplosionRadius
260 615B 20 44 71 jsr CalculateExplosionRange
261 615E BranchNotFinished
262 615E AE 0A 3E ldx diggery
263 6161 CalculateBranches
264 6161 8A txa
265 6162 29 01 and #$01
266 6164 D0 14 bne DigRight
267 6166 diglewy ; even branches go left
268 6166 38 sec
269 6167 BD 0C 3E lda digtabxL,x
270 616A E9 04 sbc #$04
271 616C 9D 0C 3E sta digtabxL,x
272 616F BD 14 3E lda digtabxH,x
273 6172 E9 00 sbc #$00
274 6174 9D 14 3E sta digtabxH,x
275 6177 4C 8B 61 jmp DigRandomize
276 617A DigRight ; odd go right (everytime 4 pixels)
277 617A 18 clc
278 617B BD 0C 3E lda digtabxL,x
279 617E 69 04 adc #$04
280 6180 9D 0C 3E sta digtabxL,x
281 6183 BD 14 3E lda digtabxH,x
282 6186 69 00 adc #$00
283 6188 9D 14 3E sta digtabxH,x
284 618B DigRandomize
285 618B AD 0A D2 lda random
286 618E 29 87 and #$87
287 6190 30 14 bmi DigUp
288 6192 digwdol
289 6192 29 07 and #$07
290 6194 18 clc
291 6195 7D 1C 3E adc digtabyL,x
292 6198 9D 1C 3E sta digtabyL,x
293 619B BD 24 3E lda digtabyH,x
294 619E 69 00 adc #$00
295 61A0 9D 24 3E sta digtabyH,x
296 61A3 4C BB 61 jmp DigCalculateNext
297 61A6 DigUp
298 61A6 29 07 and #$07
299 61A8 85 91 sta temp
300 61AA 38 sec
301 61AB BD 1C 3E lda digtabyL,x
302 61AE E5 91 sbc temp
303 61B0 9D 1C 3E sta digtabyL,x
304 61B3 BD 24 3E lda digtabyH,x
305 61B6 E9 00 sbc #$00
306 61B8 9D 24 3E sta digtabyH,x
307 61BB DigCalculateNext
308 61BB CA dex
309 61BC 10 A3 bpl CalculateBranches
310 ; here we draw...
311 61BE AE 0A 3E ldx diggery
312 61C1 DigDrawing
313 61C1 BD 0C 3E lda digtabxL,x
314 61C4 85 80 sta xdraw
315 61C6 BD 14 3E lda digtabxH,x
316 61C9 85 81 sta xdraw+1
317 61CB BD 1C 3E lda digtabyL,x
318 61CE 85 82 sta ydraw
319 61D0 BD 24 3E lda digtabyH,x
320 61D3 85 83 sta ydraw+1
321 61D5 phx
Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 61D5 8A txa
2 61D6 48 pha
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
322 61D7 20 EB 61 jsr DiggerCharacter
323 61DA plx
Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 61DA 68 pla
2 61DB AA tax
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
324 61DC CA dex
325 61DD 10 E2 bpl DigDrawing
326 61DF CE 0B 3E AD 0B 3E dec:lda DigLong
327 61E5 30 03 4C 5E 61 jpl BranchNotFinished
328 61EA 60 rts
329 61EB DiggerCharacter
330 61EB AD 0A D2 lda random
331 61EE 29 06 and #$06
332 61F0 18 clc
333 61F1 69 36 adc #$36
334 61F3 6D 2C 3E adc sandhogflag
335 61F6 85 88 sta CharCode
336 61F8 A5 81 C9 01 D0 04 + cpw xdraw #(screenwidth-6)
337 6202 B0 03 bcs DoNotPutDig
338 6204 4C FE 89 jmp TypeChar
339 6207 DoNotPutDig
340 6207 60 rts
341 ; ------------------------
342 6208 babysandhog
343 6208 A9 08 8D 2C 3E mva #8 sandhogflag
344 620D EE 4D 3F inc FallDown2
345 6210 A9 0D 8D 0B 3E mva #13 DigLong
346 6215 A9 01 8D 0A 3E mva #1 diggery ; how many branches (-1)
347 621A 4C 14 61 jmp xdigger
348 ; ------------------------
349 621D sandhog
350 621D A9 08 8D 2C 3E mva #8 sandhogflag
351 6222 EE 4D 3F inc FallDown2
352 6225 A9 0D 8D 0B 3E mva #13 DigLong
353 622A A9 03 8D 0A 3E mva #3 diggery ; how many branches (-1)
354 622F 4C 14 61 jmp xdigger
355 ; ------------------------
356 6232 heavysandhog
357 6232 A9 08 8D 2C 3E mva #8 sandhogflag
358 6237 EE 4D 3F inc FallDown2
359 623A A9 0D 8D 0B 3E mva #13 DigLong
360 623F A9 05 8D 0A 3E mva #5 diggery ; how many branches (-1)
361 6244 4C 14 61 jmp xdigger
362 ; ------------------------
363 6247 dirtclod
364 6247 EE 4D 3F inc FallDown2
365 624A A9 0C 8D 49 3F mva #12 ExplosionRadius
366 624F 20 44 71 jsr CalculateExplosionRange
367 6252 4C 2A 64 jmp xdirt
368 ; ------------------------
369 6255 dirtball
370 6255 EE 4D 3F inc FallDown2
371 6258 A9 16 8D 49 3F mva #22 ExplosionRadius
372 625D 20 44 71 jsr CalculateExplosionRange
373 6260 4C 2A 64 jmp xdirt
374 ; ------------------------
375 6263 tonofdirt
376 6263 EE 4D 3F inc FallDown2
377 6266 A9 1F 8D 49 3F mva #31 ExplosionRadius
378 626B 20 44 71 jsr CalculateExplosionRange
379 626E 4C 2A 64 jmp xdirt
380 ; ------------------------
381 6271 dirtcharge
382 6271 EE 4D 3F inc FallDown2
383 6274 A9 3D 8D 49 3F mva #61 ExplosionRadius
384 6279 20 44 71 jsr CalculateExplosionRange
385 627C 4C 0D 66 jmp ofdirt
386 ; ------------------------
387 627F laser
388 627F A6 8B ldx TankNr
389 6281 BD 82 3D lda AngleTable,x
390 6284 A8 tay
391 6285 18 clc
392 6286 BD 97 3D lda xtankstableL,x
393 6289 79 69 49 adc EndOfTheBarrelX,y ; correction of the end of the barrel point
394 628C 85 84 sta xbyte
395 628E BD 9D 3D lda xtankstableH,x
396 6291 69 00 adc #0
397 6293 85 85 sta xbyte+1
398 6295 38 sec
399 6296 BD A3 3D lda ytankstable,x
400 6299 F9 69 4A sbc EndOfTheBarrelY,y
401 629C 85 86 sta ybyte
402 629E A9 00 85 87 mva #0 ybyte+1
403 62A2 A9 56 8D 2F 3E A9 + mwa #Drawplot DrawJumpAddr
404 62AC A5 80 8D 4F 3F A5 + mwa xdraw LaserCoordinate
405 62B6 A5 82 8D 51 3F A5 + mwa ydraw LaserCoordinate+2
406 62C0 A5 84 8D 53 3F A5 + mwa xbyte LaserCoordinate+4
407 62CA A5 86 8D 55 3F A5 + mwa ybyte LaserCoordinate+6
408
409 62D4 20 6A 80 jsr draw
410 62D7 A9 00 8D CA 3E mva #0 color
411 62DC AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw
412 62E6 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw
413 62F0 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte
414 62FA AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte
415 6304 20 6A 80 jsr draw
416 6307 A9 01 8D CA 3E mva #1 color
417 630C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw
418 6316 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw
419 6320 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte
420 632A AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte
421 6334 20 6A 80 jsr draw
422 6337 A9 00 8D CA 3E mva #0 color
423 633C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw
424 6346 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw
425 6350 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte
426 635A AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte
427 6364 20 6A 80 jsr draw
428 6367 A9 01 8D CA 3E mva #1 color
429 636C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw
430 6376 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw
431 6380 20 0C 89 jsr plot
432 6383 A9 00 8D 96 3D mva #0 HitFlag
433 6388 20 D4 70 jsr CheckCollisionWithTank
434 638B AD 96 3D lda HitFlag
435 638E F0 05 beq LaserMisses
436 ; here we hit a tank (X)
437 6390 A0 64 ldy #100
438 6392 20 F5 71 jsr DecreaseEnergyX
439 6395 LaserMisses
440 6395 60 rts
441
442 ; -----------------
443 6396 xmissile ;
444 ; -----------------
445 6396 A9 01 lda #1
446 6398 8D 38 3E sta radius
447 639B 8D CA 3E sta color
448 ;ora ExplosionRadius ;making sure the ExplosionRadius is odd
449 ;sta ExplosionRadius
450 639E ExplosionLoop
451 639E 20 BB 82 jsr circle
452 63A1 E6 82 inc ydraw
453 63A3 20 BB 82 jsr circle
454 63A6 C6 82 dec ydraw
455 63A8 EE 38 3E EE 38 3E inc:inc radius
456 63AE AD 38 3E lda radius
457 63B1 CD 49 3F cmp ExplosionRadius
458 63B4 D0 E8 bne ExplosionLoop
459 63B6 A9 00 lda #0
460 63B8 8D CA 3E sta color
461 63BB ExplosionLoop2
462 63BB 20 BB 82 jsr circle
463 63BE E6 82 inc ydraw
464 63C0 20 BB 82 jsr circle
465 63C3 C6 82 dec ydraw
466 63C5 CE 38 3E dec radius
467 63C8 AD 38 3E lda radius
468 63CB D0 EE bne ExplosionLoop2
469 63CD A9 01 lda #1
470 63CF 8D CA 3E sta color
471
472 ;check tanks' distance from the centre of the explosion
473
474 63D2 A9 59 8D 2F 3E A9 + mwa #DrawLen DrawJumpAddr
475 ;the above switches Draw to measuring length
476 ;trick is easy - how many pixels does it take to draw
477 ;a line from one point to another
478 ;it must be somehow easier than regular Pitagoras
479 ;calculation
480
481 63DC AE 19 3D ldx NumberOfPlayers
482 63DF DistanceCheckLoop
483 63DF CA dex
484 63E0 BD 51 3D lda eXistenZ,x
485 63E3 F0 41 beq EndOfDistanceCheckLoop
486 ;here the tank exist
487 63E5 BD 97 3D lda XtankstableL,x
488 63E8 18 clc
489 63E9 69 03 adc #3 ;measure from middle of the tank
490 63EB 85 84 sta xbyte
491 63ED BD 9D 3D lda XtankstableH,x
492 63F0 18 clc
493 63F1 69 00 adc #0 ;measure from middle of the tank
494 63F3 85 85 sta xbyte+1
495 63F5 BD A3 3D lda Ytankstable,x
496 63F8 38 sec
497 63F9 E9 02 sbc #2 ;measure from middle of the tank
498 63FB 85 86 sta ybyte
499 63FD A9 00 lda #0
500 63FF 85 87 sta ybyte+1
501 6401 phx
Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 6401 8A txa
2 6402 48 pha
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
502 6403 20 6A 80 jsr draw
503 6406 plx
Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 6406 68 pla
2 6407 AA tax
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
504 ;if tank within range of the explosion?
505 6408 AD 37 3E lda LineLength+1
506 640B D0 19 bne TankIsNotWithinTheRange
507 640D AD 36 3E lda LineLength
508 6410 CD 49 3F cmp ExplosionRadius
509 6413 B0 11 bcs TankIsNotWithinTheRange
510 6415 AD 49 3F lda ExplosionRadius
511 6418 38 sec
512 6419 ED 36 3E sbc LineLength
513 ;multiply difference by 8
514 641C 18 clc
515 641D 69 01 adc #1
516 641F 0A asl
517 6420 0A asl
518 6421 0A asl
519 6422 A8 tay
520 6423 20 F5 71 jsr DecreaseEnergyX
521
522 6426 TankIsNotWithinTheRange
523 6426 EndOfDistanceCheckLoop
524 6426 8A txa
525 6427 D0 B6 bne DistanceCheckLoop
526 6429 60 rts
527 ; -----------------
528 642A xdirt ;
529 ; -----------------
530 642A A9 01 lda #1
531 642C 8D 38 3E sta radius
532 642F 8D CA 3E sta color
533 6432 dirtLoop
534 6432 20 BB 82 jsr circle
535 6435 E6 82 inc ydraw
536 6437 20 BB 82 jsr circle
537 643A C6 82 dec ydraw
538 643C EE 38 3E inc radius
539 643F AD 38 3E lda radius
540 6442 CD 49 3F cmp ExplosionRadius
541 6445 D0 EB bne dirtLoop
542 6447 60 rts
543 ; -----------------
544 6448 xriotbomb ;
545 ; -----------------
546 6448 A9 00 lda #0
547 644A 8D 38 3E sta radius
548 644D 8D CA 3E sta color
549 6450 rbombLoop
550 6450 20 BB 82 jsr circle
551 6453 EE 38 3E inc radius
552 6456 AD 38 3E lda radius
553 6459 CD 49 3F cmp ExplosionRadius
554 645C D0 F2 bne rbombLoop
555 645E A9 01 8D CA 3E mva #1 color
556 6463 60 rts
557
558 ; ----------------
559
560 6464 xroller ;
561 ; now collisions are detected with modified draw routine
562 ; therefore YDRAW value must be taken from mountaintable
563 6464 A0 00 ldy #0
564 6466 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER
565
566 646E 18 A5 95 65 80 85 + adw tempXROLLER xdraw
567 647B B1 95 lda (tempXROLLER),y
568 647D 85 82 sta ydraw
569
570 647F AD 6F 3E lda vx+3
571 ; if horizontal velocity is negative then change the direction
572 6482 10 08 bpl PositiveVelocity
573 6484 AD 8C 3E lda goleft
574 6487 09 01 ora #$01
575 6489 8D 8C 3E sta goleft
576 648C PositiveVelocity
577 ; first we look for the left slope
578 ; then righ slope and set the flag
579 ; $FF - we are in a hole (flighting in missile direction)
580 ; 1 - right, 2 - left
581 648C A9 FF 8D 04 3E mva #$ff HowMuchToFall
582 6491 A5 82 8D 05 3E mva ydraw HeightRol
583 6496 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER
584
585 649E 18 A5 95 65 80 85 + adw tempXROLLER xdraw
586 64AB SeekLeft
587 64AB 38 A5 95 E9 01 85 + sbw tempXROLLER #1
588 64B6 B1 95 lda (tempXROLLER),y ;fukk! beware of Y value
589 64B8 CD 05 3E cmp HeightRol
590 64BB D0 0C bne HowMuchToFallLeft
591 64BD A5 95 lda tempXROLLER
592 64BF C9 13 cmp #<mountaintable
593 64C1 D0 E8 bne SeekLeft
594 64C3 A5 96 lda tempXROLLER+1
595 64C5 C9 41 cmp #>mountaintable
596 64C7 F0 07 beq GoRightNow
597 64C9 HowMuchToFallLeft
598 64C9 B0 05 bcs GoRightNow
599 64CB A9 01 8D 04 3E mva #1 HowMuchToFall
600 64D0 GoRightNow
601 64D0 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER
602 64D8 18 A5 95 65 80 85 + adw tempXROLLER xdraw
603 64E5 SeekRight
604 64E5 18 A5 95 69 01 85 + adw tempXROLLER #1
605 64F0 B1 95 lda (tempXROLLER),y
606 64F2 CD 05 3E cmp HeightRol
607 64F5 D0 0C bne HowMuchToFallRight
608 64F7 A5 95 lda tempXROLLER
609 64F9 C9 53 cmp #<(mountaintable+screenwidth)
610 64FB D0 E8 bne SeekRight
611 64FD A5 96 lda tempXROLLER+1
612 64FF C9 42 cmp #>(mountaintable+screenwidth)
613 6501 F0 13 beq HowMuchToFallKnown
614 6503 HowMuchToFallRight
615 ; check if up or down
616 6503 B0 11 bcs HowMuchToFallKnown
617 6505 AD 04 3E lda HowMuchToFall
618 6508 10 07 bpl ItIsLeftAlready
619 650A A9 02 8D 04 3E mva #2 HowMuchToFall
620 650F D0 05 bne HowMuchToFallKnown
621 6511 ItIsLeftAlready
622 6511 A9 FF 8D 04 3E mva #$ff HowMuchToFall
623 6516 HowMuchToFallKnown
624 6516 AD 04 3E lda HowMuchToFall
625 6519 10 09 bpl Rollin
626 651B A9 01 lda #1
627 651D 18 clc
628 651E 6D 8C 3E adc goleft
629 6521 8D 04 3E sta HowMuchToFall
630 6524 Rollin
631 6524 18 A5 80 69 13 85 + adw xdraw #mountaintable tempXROLLER
632 6531 A0 00 ldy #0
633 6533 B1 95 lda (tempXROLLER),y
634 6535 8D 05 3E sta HeightRol ; relative point
635
636 6538 RollinContinues
637 6538 wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 6538 AD 0B D4 LDA VCOUNT
4 653B 8D 0A D4 STA WSYNC
5 653E 8D 0A D4 STA WSYNC
6 6541 8D 0A D4 STA WSYNC
7 6544 CD 0B D4 ?WA CMP VCOUNT
8 6547 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
638 6549 wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 6549 AD 0B D4 LDA VCOUNT
4 654C 8D 0A D4 STA WSYNC
5 654F 8D 0A D4 STA WSYNC
6 6552 8D 0A D4 STA WSYNC
7 6555 CD 0B D4 ?WA CMP VCOUNT
8 6558 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
639 ; new point is set
640 655A 18 A5 80 69 13 85 + adw xdraw #mountaintable tempXROLLER
641 6567 A0 00 ldy #0
642 6569 B1 95 lda (tempXROLLER),y
643 656B 85 82 sta ydraw
644 656D F0 6C beq ExplodeNow
645 656F CD 05 3E cmp HeightRol
646 6572 F0 02 beq UpNotYet
647 6574 90 65 bcc ExplodeNow
648 6576 UpNotYet
649 6576 38 sec ;clc
650 6577 8D 05 3E sta HeightRol
651 657A E9 01 sbc #1
652 657C 85 82 sta ydraw
653 ;check tank collision prior to PLOT
654 657E 8C 96 3D sty HitFlag
655
656 6581 A5 80 8D 75 3E A5 + mwa xdraw xtraj+1
657 658B A5 82 8D 78 3E A5 + mwa ydraw ytraj+1
658 6595 20 D4 70 jsr CheckCollisionWithTank
659
660 6598 AD 96 3D lda HitFlag
661 659B D0 3E bne ExplodeNow
662 659D 20 46 88 jsr unPlot
663 ; let's go the right direction
664 65A0 AD 04 3E lda HowMuchToFall
665 65A3 C9 01 cmp #1
666 65A5 F0 18 beq HowMuchToFallRight2
667 65A7 38 A5 80 E9 01 85 + sbw xdraw #1
668 65B2 A5 80 lda xdraw
669 65B4 D0 82 bne RollinContinues
670 65B6 A5 81 lda xdraw+1
671 65B8 F0 03 4C 38 65 jne RollinContinues
672 65BD F0 1C beq ExplodeNow
673 65BF HowMuchToFallRight2
674 65BF 18 A5 80 69 01 85 + adw xdraw #1
675 65CA A5 81 CD 41 01 D0 + cpw xdraw screenwidth
676 65D6 F0 03 4C 38 65 jne RollinContinues
677 65DB ExplodeNow
678 65DB A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store somewhere (BAD)
679 65E5 A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw (BAD)
680 65EA A9 00 85 80 85 81 mwa #0 xdraw
681 65F0 A9 C7 85 82 mva #screenheight-1 ydraw
682 65F4 20 46 88 jsr unPlot
683 65F7 AD 39 3E 85 80 AD + mwa xcircle xdraw ;(bad)
684 6601 AD 3B 3E 85 82 mva ycircle ydraw ;(bad)
685
686 ; finally a little explosion
687 6606 20 44 71 jsr CalculateExplosionRange
688 6609 4C 96 63 jmp xmissile
689 660C 60 rts
690 ; --------------------------------------------------
691 660D ofdirt ;
692 ; --------------------------------------------------
693 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height
694 660D A5 80 8D 39 3E A5 + mwa xdraw xcircle
695 6617 A5 82 8D 3B 3E mva ydraw ycircle
696 661C A9 01 lda #1
697 ; current dirt width
698 661E 8D 2D 3E sta magic
699 6621 8D CA 3E sta color
700 6624 NextRow
701 6624 wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 6624 AD 0B D4 LDA VCOUNT
4 6627 8D 0A D4 STA WSYNC
5 662A 8D 0A D4 STA WSYNC
6 662D 8D 0A D4 STA WSYNC
7 6630 CD 0B D4 ?WA CMP VCOUNT
8 6633 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
702 6635 AC 2D 3E ldy magic
703 6638 NextLine
704 6638 AD 0A D2 lda random
705 663B 29 01 and #$01
706 663D F0 09 beq DoNotPlot
707 663F 8C 2E 3E sty magic+1
708 6642 20 0C 89 jsr plot
709 6645 AC 2E 3E ldy magic+1
710 6648 DoNotPlot
711 6648 18 A5 80 69 01 85 + adw xdraw #1
712 6653 88 dey
713 6654 D0 E2 bne NextLine
714 6656 C6 82 dec ydraw ; 1 line up
715 6658 A5 82 lda ydraw
716 665A C9 FF cmp #$ff
717 665C F0 24 beq EndOfTheDirt ;if horizontal Counter wraps
718 665E EE 2D 3E inc magic ; width+2
719 6661 EE 2D 3E inc magic
720 6664 AD 2D 3E lda magic
721 6667 8D 2E 3E sta magic+1 ; just for a second
722 666A 4E 2E 3E lsr magic+1
723 666D 38 sec
724 666E AD 39 3E lda xcircle
725 6671 ED 2E 3E sbc magic+1
726 6674 85 80 sta xdraw
727 6676 AD 3A 3E lda xcircle+1
728 6679 E9 00 sbc #0
729 667B 85 81 sta xdraw+1 ; new starting coordinate in a given row
730 667D CE 49 3F dec ExplosionRadius
731 6680 D0 A2 bne NextRow
732 6682 EndOfTheDirt
733 6682 AD 39 3E 85 80 AD + mwa xcircle xdraw
734 668C AD 3B 3E 85 82 mva ycircle ydraw
735 6691 60 rts
736 ;--------------------------------------------------
737 6692 BeforeFire .proc ;TankNr (byte)
738 ;--------------------------------------------------
739 ;this nice routine makes the whole shooting
740 ;preparation: aiming and displaying
741 ;angle and shooting force values
742 ;
743
744 ;first, get current parameters (angle+force)
745 ;for an active tank and display them
746 ;(these values are taken from the previous round)
747
748 6692 A6 8B ldx TankNr
749
750 ;Checking the maximal force
751 6694 BD 7C 3D lda MaxEnergyTableH,x
752 6697 DD 70 3D cmp EnergyTableH,x
753 669A D0 06 bne ContinueToCheckMaxForce2
754 669C BD 76 3D lda MaxEnergyTableL,x
755 669F DD 6A 3D cmp EnergyTableL,x
756 66A2 ContinueToCheckMaxForce2
757 66A2 B0 0C bcs skip15
758
759 66A4 BD 7C 3D lda MaxEnergyTableH,x
760 66A7 9D 70 3D sta EnergyTableH,x
761 66AA BD 76 3D lda MaxEnergyTableL,x
762 66AD 9D 6A 3D sta EnergyTableL,x
763
764 66B0 skip15
765 66B0 20 4B 7F jsr DisplayingSymbols ;all digital values like force, angle, wind, etc.
766 66B3 20 55 80 jsr PutTankNameOnScreen
767
768 66B6 20 F9 84 jsr DrawTankNr
769
770 66B9 wait ; best after drawing a tank
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 66B9 AD 0B D4 LDA VCOUNT
4 66BC 8D 0A D4 STA WSYNC
5 66BF 8D 0A D4 STA WSYNC
6 66C2 8D 0A D4 STA WSYNC
7 66C5 CD 0B D4 ?WA CMP VCOUNT
8 66C8 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
771 ;wait
772
773
774 ;keyboard reading
775 ; KBCODE keeps code of last keybi
776 ; SKSTAT $ff - nothing pressed
777 ; $FB - any key
778 ; $f7 - shift
779 ; $f3 - shift+key
780
781 66CA notpressed
782 66CA AD 0F D2 lda SKSTAT
783 66CD C9 FF cmp #$ff
784 66CF F0 47 beq checkJoy
785 66D1 C9 F7 cmp #$f7
786 66D3 F0 43 beq checkJoy
787
788 66D5 AD 09 D2 lda kbcode
789 66D8 29 BF and #$Bf
790 66DA C9 8E cmp #$8e
791 66DC D0 03 4C 61 67 jeq CTRLPressedUp
792 66E1 C9 8F cmp #$8f
793 66E3 D0 03 4C 90 67 jeq CTRLPressedDown
794 66E8 C9 AC cmp #$ac
795 66EA D0 03 4C 09 68 jeq CTRLPressedTAB
796
797 66EF 29 3F and #$3f ;CTRL and SHIFT ellimination
798 66F1 jumpFromStick
799 66F1 C9 0E cmp #$e
800 66F3 F0 40 jeq pressedUp
801 66F5 C9 0F cmp #$f
802 66F7 F0 7B jeq pressedDown
803 66F9 C9 06 cmp #$6
804 66FB D0 03 4C A8 67 jeq pressedLeft
805 6700 C9 07 cmp #$7
806 6702 D0 03 4C CA 67 jeq pressedRight
807 6707 C9 21 cmp #$21
808 6709 D0 03 4C 23 68 jeq pressedSpace
809 670E C9 2C cmp #$2c
810 6710 D0 03 4C EA 67 jeq pressedTAB
811 6715 4C CA 66 jmp notpressed
812 6718 checkJoy
813 ;------------JOY-------------
814 ;happy happy joy joy
815 ;check for joystick now
816 6718 AD 78 02 lda JSTICK0
817 671B 29 0F and #$0f
818 671D C9 0F cmp #$0f
819 671F F0 07 beq notpressedJoy
820 6721 A8 tay
821 6722 B9 99 50 lda joyToKeyTable,y
822 6725 4C F1 66 jmp jumpFromStick
823 6728 notpressedJoy
824 ;fire
825 6728 AD 10 D0 lda TRIG0
826 672B D0 05 bne JNotFire
827 672D A9 21 lda #$21
828 672F 4C F1 66 jmp jumpFromStick
829 6732 JNotFire
830 6732 4C CA 66 jmp notpressed
831 ;
832 6735 pressedUp
833 ;force increaseeee!
834 6735 A6 8B ldx TankNr
835 6737 FE 6A 3D inc EnergyTableL,x
836 673A D0 03 bne CheckingMaxForce
837 673C FE 70 3D inc EnergyTableH,x
838 673F CheckingMaxForce
839 673F BD 7C 3D lda MaxEnergyTableH,x
840 6742 DD 70 3D cmp EnergyTableH,x
841 6745 D0 06 bne FurtherCheckMaxForce
842 6747 BD 76 3D lda MaxEnergyTableL,x
843 674A DD 6A 3D cmp EnergyTableL,x
844 674D FurtherCheckMaxForce
845 674D 90 03 4C 92 66 jcs BeforeFire
846
847 6752 BD 7C 3D lda MaxEnergyTableH,x
848 6755 9D 70 3D sta EnergyTableH,x
849 6758 BD 76 3D lda MaxEnergyTableL,x
850 675B 9D 6A 3D sta EnergyTableL,x
851
852 675E 4C 92 66 jmp BeforeFire
853
854 6761 CTRLPressedUp
855 6761 A6 8B ldx TankNr
856 6763 BD 6A 3D lda EnergyTableL,x
857 6766 18 clc
858 6767 69 0A adc #10
859 6769 9D 6A 3D sta EnergyTableL,x
860 676C 90 D1 bcc CheckingMaxForce
861 676E FE 70 3D inc EnergyTableH,x
862 6771 4C 3F 67 jmp CheckingMaxForce
863
864
865 6774 pressedDown
866 6774 A6 8B ldx TankNr
867 6776 DE 6A 3D dec EnergyTableL,x
868 6779 BD 6A 3D lda EnergyTableL,x
869 677C C9 FF cmp #$ff
870 677E D0 0D bne skip04
871 6780 DE 70 3D dec EnergyTableH,x
872 6783 10 08 bpl skip04
873 6785 ForceGoesZero
874 6785 A9 00 lda #0
875 6787 9D 70 3D sta EnergyTableH,x
876 678A 9D 6A 3D sta EnergyTableL,x
877 678D skip04
878 678D 4C 92 66 jmp BeforeFire
879
880 6790 CTRLPressedDown
881 6790 A6 8B ldx TankNr
882 6792 38 sec
883 6793 BD 6A 3D lda EnergyTableL,x
884 6796 E9 0A sbc #10
885 6798 9D 6A 3D sta EnergyTableL,x
886 679B 90 03 4C 92 66 jcs BeforeFire
887 67A0 DE 70 3D dec EnergyTableH,x
888 67A3 30 E0 bmi ForceGoesZero
889 67A5 4C 92 66 jmp BeforeFire
890
891 67A8 pressedLeft
892 67A8 A6 8B ldx TankNr
893 67AA DE 82 3D dec AngleTable,x
894 67AD BD 82 3D lda AngleTable,x
895 67B0 C9 FF cmp #$ff ; if angle goes through 0 we clear the barrel
896 67B2 D0 07 bne NotThrough90DegreesLeft
897 67B4 A9 2E 85 88 mva #$2e CharCode
898 67B8 20 23 85 jsr drawtankNrX
899 67BB NotThrough90DegreesLeft
900 67BB C9 A4 cmp #(255-91)
901 67BD F0 03 4C 92 66 jne BeforeFire
902 67C2 A9 5A lda #90
903 67C4 9D 82 3D sta AngleTable,x
904 67C7 4C 92 66 jmp BeforeFire
905
906 67CA pressedRight
907 67CA A6 8B ldx TankNr
908 67CC FE 82 3D INC AngleTable,x
909 67CF BD 82 3D lda AngleTable,x
910 67D2 D0 07 bne NotThrough90DegreesRight
911 67D4 A9 30 85 88 mva #$30 CharCode ; if angle goes through 0 we clear the barrel
912 67D8 20 23 85 jsr drawtankNrX
913 67DB NotThrough90DegreesRight
914 67DB C9 5B cmp #91
915 67DD F0 03 4C 92 66 jne BeforeFire
916 67E2 A9 A5 lda #(255-90)
917 67E4 9D 82 3D sta AngleTable,x
918 67E7 4C 92 66 jmp BeforeFire
919
920 67EA pressedTAB
921 67EA A6 8B ldx TankNr
922 67EC FE 89 3D inc ActiveWeapon,x
923 67EF BD 89 3D lda ActiveWeapon,x
924 67F2 C9 30 cmp #$30 ; number of offensive weapons
925 67F4 D0 05 bne skip14
926 67F6 A9 00 lda #0
927 67F8 9D 89 3D sta ActiveWeapon,x
928 67FB skip14
929 67FB BD 89 3D lda ActiveWeapon,x
930 67FE 20 E5 71 jsr HowManyBullets ; and we have qty of owned shells. Ufff....
931 6801 F0 E7 beq pressedTAB
932 6803 20 BF 83 jsr WaitForKeyRelease
933 6806 4C 92 66 jmp BeforeFire
934
935 6809 CTRLpressedTAB
936 6809 A6 8B ldx TankNr
937 680B DE 89 3D dec ActiveWeapon,x
938 680E 10 05 bpl skip14CT
939 6810 A9 2F lda #$2f ; the last possible offensive weapon
940 6812 9D 89 3D sta ActiveWeapon,x
941 6815 skip14CT
942 6815 BD 89 3D lda ActiveWeapon,x
943 6818 20 E5 71 jsr HowManyBullets ; and we have qty of owned shells. Ufff....
944 681B F0 EC beq CTRLpressedTAB
945 681D 20 BF 83 jsr WaitForKeyRelease
946 6820 4C 92 66 jmp BeforeFire
947
948
949 6823 pressedSpace
950 ;=================================
951 ;we shoot here!!!
952 6823 60 RTS
953 .endp
954
955 ;--------------------------------------------------
956 6824 Shoot .proc ;TankNr (byte)
957 ;--------------------------------------------------
958 ;it looks like this routine is too big -
959 ;- more and more functions were being added...
960 ;good idea would be to rewrite it completely
961 ;with much more separate blocks, but you know -
962 ;- do not touch it if it works...
963
964 ;the latest addition to this routine is
965 ;displaying offensive texts!
966
967 6824 RandomizeOffensiveText
968 6824 AD 0A D2 lda random
969 6827 C9 36 cmp #talk.NumberOfOffensiveTexts
970 6829 B0 F9 bcs RandomizeOffensiveText
971
972 682B 8D DC 44 sta TextNumberOff
973 682E A4 8B ldy TankNr
974 6830 A9 01 8D 51 48 mva #1 plot4x4color
975 6835 20 10 7C jsr DisplayOffensiveTextNr
976
977
978 6838 A6 8B ldx TankNr
979 683A BD 89 3D lda ActiveWeapon,x
980 683D C9 20 cmp #$20 ; laser
981 683F D0 0F bne NotStrongShoot
982 6841 A9 00 8D CA 3E mva #0 color
983 6846 A9 07 lda #7
984 6848 8D 81 3E sta Force
985 684B 8D 82 3E sta Force+1
986 684E D0 0C bne AfterStrongShoot
987 6850 NotStrongShoot
988 6850 BD 6A 3D lda EnergyTableL,x
989 6853 8D 81 3E sta Force
990 6856 BD 70 3D lda EnergyTableH,x
991 6859 8D 82 3E sta Force+1
992 685C AfterStrongShoot
993 685C A9 00 lda #$0
994 685E 8D 83 3E sta Force+2
995 6861 BD 82 3D lda AngleTable,x
996 6864 8D 80 3E sta Angle
997
998 6867 A9 00 lda #0
999 6869 8D 74 3E sta xtraj
1000 686C 8D 77 3E sta ytraj
1001
1002 ; Shoots tank nr X !!! :)
1003 ;ldx TankNr
1004 686F BD 97 3D lda xtankstableL,x
1005 6872 8D 75 3E sta xtraj+1
1006 6875 BD 9D 3D lda xtankstableH,x
1007 6878 8D 76 3E sta xtraj+2
1008 687B BD A3 3D lda ytankstable,x
1009 687E 8D 78 3E sta ytraj+1
1010 6881 A9 00 lda #$00
1011 6883 8D 79 3E sta ytraj+2
1012
1013 ; correction of the starting coordinates of bullet
1014 ; to start where the tank's barrel ends
1015 ; (without it bullet would go from the left lower corner of the tank)
1016 6886 AC 80 3E ldy Angle
1017 6889 18 clc
1018 688A AD 75 3E lda xtraj+1
1019 688D 79 69 49 adc EndOfTheBarrelX,y ; correction of X
1020 ;adc #4
1021 6890 8D 75 3E sta xtraj+1
1022 6893 AD 76 3E lda xtraj+2
1023 6896 69 00 adc #0
1024 6898 8D 76 3E sta xtraj+2
1025 689B 38 sec
1026 689C AD 78 3E lda ytraj+1
1027 689F F9 69 4A sbc EndOfTheBarrelY,y ; correction of Y
1028 ;sbc #7
1029 68A2 8D 78 3E sta ytraj+1
1030 68A5 AD 79 3E lda ytraj+2
1031 68A8 E9 00 sbc #0
1032 68AA 8D 79 3E sta ytraj+2
1033
1034 68AD A0 64 ldy #100
1035
1036 68AF 20 75 6A jsr Flight
1037 68B2 A9 01 8D CA 3E mva #1 color
1038 ;jsr WaitForKeyRelease
1039 68B7 60 rts
1040 .endp
1041
1042
1043 ;--------------------------------------------------
1044 68B8 TankFalls .proc;
1045 ;--------------------------------------------------
1046 68B8 A9 00 lda #0
1047 68BA 8D 3F 3E sta PreviousFall
1048 68BD 8D 40 3E sta EndOfTheFallFlag
1049 68C0 8D 41 3E sta Parachute
1050
1051 ; let's check if the given tank has got the parachute
1052 68C3 A9 35 lda #$35 ; parachute
1053 68C5 20 E5 71 jsr HowManyBullets
1054 68C8 F0 03 beq TankFallsX
1055 68CA EE 41 3E inc Parachute
1056 68CD TankFallsX
1057 ; coordinates of the first pixel under the tank
1058 68CD A6 8B ldx TankNr
1059 68CF BD 97 3D lda XtankstableL,x
1060 68D2 85 80 sta xdraw
1061 68D4 BD 9D 3D lda XtankstableH,x
1062 68D7 85 81 sta xdraw+1
1063 68D9 BD A3 3D lda Ytankstable,x
1064 68DC 18 clc
1065 68DD 69 01 adc #1 ; in this point the comment helped us! For the very first
1066 ; time in our lives! Tada! It opens a new chapter!!!
1067 68DF 85 82 sta ydraw
1068 ;
1069 68E1 A9 08 lda #08
1070 68E3 8D B2 3E sta mask2 ; Loop Counter
1071 68E6 ByteBelowTank
1072 68E6 20 5F 89 jsr point
1073 68E9 F0 03 beq EmptyPoint2
1074 68EB 38 sec
1075 68EC B0 01 bcs ROLPoint2
1076 68EE EmptyPoint2
1077 68EE 18 clc
1078 68EF ROLPoint2
1079 68EF 2E AA 3E rol mask1
1080 68F2 18 A5 80 69 01 85 + adw xdraw #1
1081 68FD CE B2 3E dec mask2
1082 6900 D0 E4 bne ByteBelowTank
1083 6902 AE AA 3E ldx mask1
1084 6905 BD 69 48 lda WhereToSlideTable,x
1085 6908 8D 3E 3E sta IfFallDown ; taking directions of falling down from the table
1086 690B D0 15 bne ItStillFalls
1087 ; Tank falling down already finished, but it is not sure that
1088 ; the horizontal coordinate is even.
1089 ; If it is odd then it must be corrected because otherwise
1090 ; P/M graphics background would not look OK
1091 690D A6 8B ldx TankNr
1092 690F BD 97 3D lda XtanksTableL,x
1093 6912 29 01 and #$01
1094 6914 D0 03 4C 40 6A jeq EndOfFall ; if it is even then it is the end
1095 ; and if not, we push it one pixel the way it was falling before
1096 6919 AD 3F 3E lda PreviousFall
1097 691C 8D 3E 3E sta IfFallDown
1098 691F EE 40 3E inc EndOfTheFallFlag ; because after this correction is shouldn't fall anymore
1099
1100 ; we have 3 bits: 0 - go down, 1 - go right, 2 - go left
1101 ;---
1102 6922 ItStillFalls
1103 6922 AD 41 3E lda Parachute
1104 6925 29 01 and #1
1105 6927 D0 1A bne ParachutePresent
1106 ; decreasing energy - if the vertical fall, substract 2
1107 ; and if at an angle then substract 1
1108 6929 A0 01 ldy #1 ; how much energy to substract
1109 692B AD 3E 3E lda IfFallDown
1110 692E 29 01 and #1
1111 6930 F0 11 beq NoFallingDown
1112 6932 A6 8B ldx TankNr
1113 6934 20 F5 71 jsr DecreaseEnergyX
1114 6937 AD 3E 3E lda IfFallDown
1115 693A 29 06 and #6
1116 693C D0 05 bne FallDiagonally
1117 693E A6 8B ldx TankNr
1118 6940 20 F5 71 jsr DecreaseEnergyX
1119 6943 FallDiagonally
1120 6943 NoFallingDown
1121 6943 ParachutePresent
1122 ; we must set flag meaning that the tank was falling down
1123 ; because later maybe the number of parachutes will decrease
1124 ; (if there were parachutes and they were ON)
1125
1126 6943 AD 41 3E lda Parachute
1127 6946 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present)
1128 6948 8D 41 3E sta Parachute
1129
1130 ; storing last direction of falling
1131 ; (it is not necessarily the direction from the previous
1132 ; iteraction, so we must check directional bits before storing)
1133 694B AD 3E 3E lda IfFallDown
1134 694E 29 06 and #$06
1135 6950 F0 03 beq FallStraightDown
1136 6952 8D 3F 3E sta PreviousFall
1137 6955 FallStraightDown
1138 6955 AD 41 3E lda Parachute
1139 6958 29 01 and #01
1140 695A F0 11 beq RapidFalling
1141 695C wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 695C AD 0B D4 LDA VCOUNT
4 695F 8D 0A D4 STA WSYNC
5 6962 8D 0A D4 STA WSYNC
6 6965 8D 0A D4 STA WSYNC
7 6968 CD 0B D4 ?WA CMP VCOUNT
8 696B D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
1142 696D RapidFalling
1143 ; we finish falling down if the tank reached the edge of the screen
1144 ; but if it falls straight down or the other way than the edge,
1145 ; then continue falling!
1146 696D A6 8B ldx TankNr
1147 696F BD 97 3D lda XtanksTableL,x
1148 6972 D0 0F bne NotLeftEdge
1149 6974 BD 9D 3D lda XtanksTableH,x
1150 6977 D0 0A bne NotLeftEdge
1151 6979 AD 3E 3E lda IfFallDown
1152 697C 29 04 and #$04 ; check if it does not fall left
1153 697E F0 03 4C 40 6A jne EndOfFall ; if so then maybe we finish
1154 6983 NotLeftEdge
1155 6983 18 clc
1156 6984 BD 97 3D lda XtanksTableL,x
1157 6987 69 08 adc #$08 ; we'll check right side of the char
1158 6989 85 91 sta temp
1159 698B BD 9D 3D lda XtanksTableH,x
1160 698E 69 00 adc #0
1161 6990 85 92 sta temp+1
1162 6992 A5 92 C9 01 D0 04 + cpw temp #screenwidth
1163 699C D0 0A bne NotRightEdge
1164 699E AD 3E 3E lda IfFallDown
1165 69A1 29 02 and #$02 ; check if it does not fall right
1166 69A3 F0 03 4C 40 6A jne EndOfFall ; if so then maybe we finish
1167 69A8 NotRightEdge
1168 ; clear previous position
1169 69A8 A9 01 8D FB 3D mva #1 Erase
1170 69AD 20 F9 84 jsr DrawTankNr
1171 ; and the parachute (if present)
1172 69B0 AD 41 3E lda Parachute
1173 69B3 29 01 and #01
1174 69B5 F0 1B beq DoNotClearParachute
1175 ; here we clear the parachute
1176 69B7 A6 8B ldx TankNr
1177 69B9 A9 34 lda #$34
1178 69BB 85 88 sta CharCode
1179 69BD BD A3 3D lda Ytankstable,x
1180 69C0 38 sec
1181 69C1 E9 08 sbc #8
1182 69C3 85 82 sta ydraw
1183 69C5 BD 97 3D lda XtanksTableL,x
1184 69C8 85 80 sta xdraw
1185 69CA BD 9D 3D lda XtanksTableH,x
1186 69CD 85 81 sta xdraw+1
1187 69CF 20 FE 89 jsr TypeChar
1188 69D2 DoNotClearParachute
1189 69D2 A9 00 8D FB 3D mva #0 Erase
1190 69D7 A6 8B ldx TankNr
1191 69D9 4E 3E 3E lsr IfFallDown ; bit nr 0 (down)
1192 69DC 90 09 bcc DoesNotFallDown
1193 ; tank is falling down
1194 69DE BD A3 3D lda Ytankstable,x
1195 69E1 18 clc
1196 69E2 69 01 adc #1
1197 69E4 9D A3 3D sta Ytankstable,x
1198 69E7 DoesNotFallDown
1199 69E7 4E 3E 3E lsr IfFallDown ; bit nr 1 (right)
1200 69EA 90 11 bcc DoesNotFallLeft
1201 ; tank is falling left
1202 69EC 18 clc
1203 69ED BD 97 3D lda XtankstableL,x
1204 69F0 69 01 adc #1
1205 69F2 9D 97 3D sta XtankstableL,x
1206 69F5 BD 9D 3D lda XtankstableH,x
1207 69F8 69 00 adc #0
1208 69FA 9D 9D 3D sta XtankstableH,x
1209 69FD DoesNotFallLeft
1210 69FD 4E 3E 3E lsr IfFallDown ; bit nr 2 (left)
1211 6A00 90 11 bcc DoesNotFallRight
1212 ; tank is falling right
1213 6A02 38 sec
1214 6A03 BD 97 3D lda XtankstableL,x
1215 6A06 E9 01 sbc #1
1216 6A08 9D 97 3D sta XtankstableL,x
1217 6A0B BD 9D 3D lda XtankstableH,x
1218 6A0E E9 00 sbc #0
1219 6A10 9D 9D 3D sta XtankstableH,x
1220 6A13 DoesNotFallRight
1221 6A13 20 F9 84 jsr DrawTankNr
1222
1223 ; checking is parachute present and if so, draw it
1224 6A16 AD 41 3E lda Parachute
1225 6A19 29 01 and #01
1226 6A1B F0 1B beq DoNotDrawParachute
1227
1228 ; here we draw parachute
1229 6A1D A6 8B ldx TankNr
1230 6A1F A9 34 lda #$34
1231 6A21 85 88 sta CharCode
1232 6A23 BD A3 3D lda Ytankstable,x
1233 6A26 38 sec
1234 6A27 E9 08 sbc #8
1235 6A29 85 82 sta ydraw
1236 6A2B BD 97 3D lda XtanksTableL,x
1237 6A2E 85 80 sta xdraw
1238 6A30 BD 9D 3D lda XtanksTableH,x
1239 6A33 85 81 sta xdraw+1
1240 6A35 20 FE 89 jsr TypeChar
1241 6A38 DoNotDrawParachute
1242 6A38 AD 40 3E lda EndOfTheFallFlag
1243 6A3B D0 03 4C CD 68 jeq TankFallsX
1244
1245 6A40 EndOfFall
1246 6A40 20 F9 84 jsr DrawTankNr
1247
1248 ; if tank was falling down having parachute,
1249 ; we must deduct one parachute
1250 6A43 AD 41 3E lda Parachute
1251 6A46 C9 03 cmp #$03 ; was falling down and the parachute
1252 6A48 D0 2A bne ThereWasNoParachute
1253 ; first we clear parachute on the screen
1254 6A4A A9 01 8D FB 3D mva #1 Erase
1255 6A4F A6 8B ldx TankNr
1256 6A51 A9 34 lda #$34
1257 6A53 85 88 sta CharCode
1258 6A55 BD A3 3D lda Ytankstable,x
1259 6A58 38 sec
1260 6A59 E9 08 sbc #8
1261 6A5B 85 82 sta ydraw
1262 6A5D BD 97 3D lda XtanksTableL,x
1263 6A60 85 80 sta xdraw
1264 6A62 BD 9D 3D lda XtanksTableH,x
1265 6A65 85 81 sta xdraw+1
1266 6A67 20 FE 89 jsr TypeChar
1267 6A6A A9 00 8D FB 3D mva #0 Erase
1268 ; now we can deduct one parachute from the list of weapons
1269
1270 6A6F A9 35 lda #$35 ; parachute
1271 6A71 20 DC 71 jsr DecreaseWeapon
1272 6A74 ThereWasNoParachute
1273 6A74 60 rts
1274 .endp
1275 ;--------------------------------------------------
1276 6A75 Flight .proc ;Force(byte.byte), Angle(byte), Wind(.byte) 128=0, 255=maxright, 0=maxleft
1277 ;--------------------------------------------------
1278
1279 ;g=-0.1
1280 ;vx=Force*sin(Angle)
1281 ;vy=Force*cos(Angle)
1282 ;
1283 ;:begin
1284 ;ytraj=ytray-vy
1285 ;vy=vy-g
1286 ;xtraj=xtraj+vx - without Wind
1287 ;vx=vx+Wind (Wind is a small fraction)
1288 ;plot xtraj,ytraj - there is clearing in plot
1289 ;goto begin
1290
1291 ; smoke tracer :)
1292 6A75 A0 00 ldy #0
1293 6A77 A6 8B ldx TankNr
1294 6A79 BD 89 3D lda ActiveWeapon,x
1295 6A7C C9 0B cmp #11 ; Smoke tracer
1296 6A7E D0 01 bne noSmokeTracer
1297 6A80 C8 iny
1298 6A81 noSmokeTracer
1299 6A81 8C 6B 3E sty SmokeTracerFlag
1300
1301 6A84 RepeatIfSmokeTracer
1302 6A84 AD 78 3E 8D 7E 3E + mwa ytraj+1 Ytrajold+1
1303 6A90 AD 75 3E 8D 7B 3E + mwa xtraj+1 Xtrajold+1
1304 6A9C A9 68 8D 2F 3E A9 + mwa #DrawCheck DrawJumpAddr
1305
1306 6AA6 A9 00 lda #0
1307 6AA8 8D 89 3E sta Result
1308 6AAB 8D 8A 3E sta Result+1
1309 6AAE 8D 8B 3E sta Result+2
1310 6AB1 8D 96 3D sta HitFlag
1311 6AB4 85 80 sta xdraw
1312 6AB6 85 81 sta xdraw+1
1313 6AB8 85 82 sta ydraw
1314 6ABA 85 83 sta ydraw+1
1315
1316 ;vx calculation
1317 6ABC aslw Force ;Force=Force*4 ... *2
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 6ABC 0E 81 3E ASL FORCE
2 6ABF 2E 82 3E ROL FORCE+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
1318 ;aslw Force
1319
1320 ;sin(Angle)
1321 6AC2 AE 80 3E ldx Angle
1322 6AC5 8E 4E 3F stx LeapFrogAngle ; we will need it later
1323
1324 ;Angle works like this:
1325 ;0 'degrees' is sraight up
1326 ;90 'degrees' is horizontally right
1327 ;255 is straight up (same as 0)
1328 ;255-90 (165) horizontally left
1329
1330 6AC8 10 15 bpl FlightRight
1331
1332 ;and if the highest bit is set then
1333 ;Flight to LEFT
1334 ;calculate Angle with this formula:
1335 ;Angle=90-(Angle-165)
1336
1337 6ACA 38 sec
1338 6ACB 8A txa
1339 6ACC E9 A5 sbc #165 ;(Angle-165)
1340 6ACE 85 91 sta temp ;dirty trick with selfmodifying code (REMOVED)
1341 6AD0 A9 5A lda #90 ;
1342 6AD2 E5 91 sbc temp ;90-(Angle-165)
1343 ;and we have rady angle here ... and we go LEFT!
1344 6AD4 AA tax
1345 6AD5 8D 80 3E sta Angle
1346 6AD8 A9 01 8D 8C 3E mva #1 goleft
1347 ; and now we contine as if nothing happened
1348 ; (but we have goleft set to 1!!!)
1349 6ADD D0 05 bne dontzerogoleft
1350
1351 6ADF FlightRight
1352 6ADF A9 00 8D 8C 3E mva #0 goleft
1353
1354 6AE4 dontzerogoleft
1355
1356 6AE4 BD 01 46 lda sintable,x ;sin(Angle)
1357 6AE7 8D 87 3E sta Multiplee ;sin(Angle)*Force
1358 6AEA AD 81 3E 8D 84 3E + mwa Force Multiplier
1359 6AF6 A9 00 lda #$0
1360 6AF8 8D 86 3E sta Multiplier+2
1361 6AFB A2 08 ldx #8
1362 6AFD MultiplyLoop
1363 6AFD 6E 87 3E ror Multiplee
1364 6B00 90 1C bcc DoNotAdd
1365 6B02 18 clc
1366 6B03 AD 84 3E lda Multiplier
1367 6B06 6D 89 3E adc Result
1368 6B09 8D 89 3E sta Result
1369 6B0C AD 85 3E lda Multiplier+1
1370 6B0F 6D 8A 3E adc Result+1
1371 6B12 8D 8A 3E sta Result+1
1372 6B15 AD 86 3E lda Multiplier+2
1373 6B18 6D 8B 3E adc Result+2
1374 6B1B 8D 8B 3E sta Result+2
1375 6B1E DoNotAdd
1376 ;clc ;carry always cleared here (anyway we hope so :)
1377 6B1E 2E 84 3E rol Multiplier
1378 6B21 2E 85 3E rol Multiplier+1
1379 6B24 2E 86 3E rol Multiplier+2
1380 6B27 CA dex
1381 6B28 D0 D3 bne MultiplyLoop
1382 ; here in Result there is a number xxxx.yyy = sin(Angle)*Force
1383
1384 6B2A AD 89 3E lda Result ;vx=sin(Angle)*Force
1385 6B2D 8D 6C 3E sta vx
1386 6B30 AD 8A 3E lda Result+1
1387 6B33 8D 6D 3E sta vx+1
1388 6B36 AD 8B 3E lda Result+2
1389 6B39 8D 6E 3E sta vx+2
1390 6B3C A9 00 8D 6F 3E mva #0 vx+3
1391
1392 ;======vy
1393 6B41 A9 00 lda #0 ;cos(Angle)
1394 6B43 8D 89 3E sta Result
1395 6B46 8D 8A 3E sta Result+1
1396 6B49 8D 8B 3E sta Result+2
1397 ;--
1398 6B4C AE 80 3E ldx Angle
1399 6B4F BD 5C 46 lda costable,x
1400
1401 6B52 8D 87 3E sta Multiplee ;cos(Angle)*Force
1402 6B55 AD 81 3E 8D 84 3E + mwa Force Multiplier
1403 6B61 A9 00 lda #$0
1404 6B63 8D 86 3E sta Multiplier+2
1405 6B66 A2 08 ldx #8
1406 6B68 MultiplyLoopY
1407 6B68 6E 87 3E ror Multiplee
1408 6B6B 90 1C bcc DoNotAddY
1409 6B6D 18 clc
1410 6B6E AD 84 3E lda Multiplier
1411 6B71 6D 89 3E adc Result
1412 6B74 8D 89 3E sta Result
1413 6B77 AD 85 3E lda Multiplier+1
1414 6B7A 6D 8A 3E adc Result+1
1415 6B7D 8D 8A 3E sta Result+1
1416 6B80 AD 86 3E lda Multiplier+2
1417 6B83 6D 8B 3E adc Result+2
1418 6B86 8D 8B 3E sta Result+2
1419 6B89 DoNotAddY
1420 ;clc ;carry always cleared here (anyway we hope so :)
1421 6B89 2E 84 3E rol Multiplier
1422 6B8C 2E 85 3E rol Multiplier+1
1423 6B8F 2E 86 3E rol Multiplier+2
1424 6B92 CA dex
1425 6B93 D0 D3 bne MultiplyLoopY
1426 ; here in Result there is a number xxxx.yyy=cos(Angle)*Force
1427
1428 6B95 AD 89 3E lda Result ;vy=cos(Angle)*Force
1429 6B98 8D 70 3E sta vy
1430 6B9B AD 8A 3E lda Result+1
1431 6B9E 8D 71 3E sta vy+1
1432 6BA1 AD 8B 3E lda Result+2
1433 6BA4 8D 72 3E sta vy+2
1434 6BA7 A9 00 8D 73 3E mva #0 vy+3
1435
1436 6BAC Loopi
1437 ;ytraj=ytraj-vy (skipping least significant byte of vy)
1438 6BAC 38 sec
1439 6BAD AD 77 3E lda ytraj
1440 6BB0 ED 71 3E sbc vy+1
1441 6BB3 8D 77 3E sta ytraj
1442 6BB6 AD 78 3E lda ytraj+1
1443 6BB9 ED 72 3E sbc vy+2
1444 6BBC 8D 78 3E sta ytraj+1
1445 6BBF AD 79 3E lda ytraj+2
1446 6BC2 ED 73 3E sbc vy+3
1447 6BC5 8D 79 3E sta ytraj+2
1448
1449 ;vy=vy-g (again without least significant byte of vy)
1450 6BC8 38 sec
1451 6BC9 AD 71 3E lda vy+1
1452 6BCC ED 90 3D sbc gravity
1453 6BCF 8D 71 3E sta vy+1
1454 6BD2 AD 72 3E lda vy+2
1455 6BD5 E9 00 sbc #0
1456 6BD7 8D 72 3E sta vy+2
1457 6BDA AD 73 3E lda vy+3
1458 6BDD E9 00 sbc #0
1459 6BDF 8D 73 3E sta vy+3
1460 6BE2 10 0C bpl StillUp
1461 ; where we know that the bullet starts to fall down
1462 ; we check if it is MIRV and if so, jump to MIRV routine
1463 6BE4 A6 8B ldx TankNr
1464 6BE6 BD 89 3D lda ActiveWeapon,x
1465 6BE9 C9 06 cmp #6 ; MIRV
1466 6BEB D0 03 4C D9 6D jeq MIRVdownLoop
1467 6BF0 StillUp
1468 6BF0 AD 8C 3E lda goleft
1469 6BF3 D0 1F bne FlightLeft
1470
1471 6BF5 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx)
1472 6BF6 AD 74 3E lda xtraj ;here of course Fight to right
1473 6BF9 6D 6D 3E adc vx+1
1474 6BFC 8D 74 3E sta xtraj
1475 6BFF AD 75 3E lda xtraj+1
1476 6C02 6D 6E 3E adc vx+2
1477 6C05 8D 75 3E sta xtraj+1
1478 6C08 AD 76 3E lda xtraj+2
1479 6C0B 6D 6F 3E adc vx+3
1480 6C0E 8D 76 3E sta xtraj+2
1481 6C11 4C 30 6C jmp skip07 ;skipping substracting for Flight to left
1482
1483 6C14 FlightLeft
1484 6C14 38 sec ;xtraj=xtraj-vx (skipping least significant byte of vx)
1485 6C15 AD 74 3E lda xtraj ;here of course Fight to left
1486 6C18 ED 6D 3E sbc vx+1
1487 6C1B 8D 74 3E sta xtraj
1488 6C1E AD 75 3E lda xtraj+1
1489 6C21 ED 6E 3E sbc vx+2
1490 6C24 8D 75 3E sta xtraj+1
1491 6C27 AD 76 3E lda xtraj+2
1492 6C2A ED 6F 3E sbc vx+3
1493 6C2D 8D 76 3E sta xtraj+2
1494
1495 6C30 skip07
1496 ;vx=vx-Wind (also without least significan byte of vx)
1497 6C30 AD 8C 3E lda goleft
1498 6C33 D0 07 bne FlightsLeft ;blow on bullet flighting left
1499 6C35 AD 94 3D lda WindOrientation
1500 6C38 D0 2D bne WindToLeft
1501 6C3A F0 05 beq LWindToLeft
1502 6C3C FlightsLeft
1503 6C3C AD 94 3D lda WindOrientation
1504 6C3F F0 26 beq LWindToRight
1505 6C41 LWindToLeft
1506
1507 ; here Wind to right, bullet goes right as well, so vx=vx+Wind
1508 ; here Wind to left, bullet goes left as well, so vx=vx+Wind
1509 6C41 18 clc
1510 6C42 AD 6C 3E lda vx
1511 6C45 6D 91 3D adc Wind
1512 6C48 8D 6C 3E sta vx
1513 6C4B AD 6D 3E lda vx+1
1514 6C4E 6D 92 3D adc Wind+1
1515 6C51 8D 6D 3E sta vx+1
1516 6C54 AD 6E 3E lda vx+2
1517 6C57 69 00 adc #0
1518 6C59 8D 6E 3E sta vx+2
1519 6C5C AD 6F 3E lda vx+3
1520 6C5F 69 00 adc #0
1521 6C61 8D 6F 3E sta vx+3
1522 6C64 4C 8A 6C Jmp skip08
1523 6C67 WindToLeft
1524 6C67 LWindToRight
1525
1526 ;Wind to left, bullet right, so vx=vx-Wind
1527 ;Wind to right, bullet left, so vx=vx-Wind
1528 6C67 38 sec
1529 6C68 AD 6C 3E lda vx
1530 6C6B ED 91 3D sbc Wind
1531 6C6E 8D 6C 3E sta vx
1532 6C71 AD 6D 3E lda vx+1
1533 6C74 ED 92 3D sbc Wind+1
1534 6C77 8D 6D 3E sta vx+1
1535 6C7A AD 6E 3E lda vx+2
1536 6C7D E9 00 sbc #0
1537 6C7F 8D 6E 3E sta vx+2
1538 6C82 AD 6F 3E lda vx+3
1539 6C85 E9 00 sbc #0
1540 6C87 8D 6F 3E sta vx+3
1541 6C8A skip08
1542 6C8A AD 7B 3E 85 80 AD + mwa xtrajold+1 xdraw
1543 6C94 AD 7E 3E 85 82 AD + mwa ytrajold+1 ydraw
1544 6C9E AD 75 3E 85 84 AD + mwa xtraj+1 xbyte
1545 6CA8 AD 78 3E 85 86 AD + mwa ytraj+1 ybyte
1546 6CB2 20 6A 80 jsr draw
1547 ;key
1548 6CB5 AD 75 3E 8D 7B 3E + mwa xtraj+1 XtrajOld+1
1549 6CC1 AD 78 3E 8D 7E 3E + mwa ytraj+1 YtrajOld+1
1550
1551 6CCD AD A9 3E lda tracerflag
1552 6CD0 D0 0D bne nowait
1553 6CD2 AD CA 3E lda color
1554 6CD5 F0 08 beq nowait
1555 ;wait
1556 ;this is where program slows down the flight of a missile
1557 ;possibly it is too slow to wait till next frame...
1558 ;we will see.
1559 ;---2003-08-01 yes, it is too slow!!! shorter delay
1560 ; must be here like few sta wsync's
1561 ; half a frame would be the best...
1562 6CD7 A2 96 ldx #FlyDelay
1563 6CD9 DelayLoop
1564 6CD9 8D 0A D4 sta wsync
1565 6CDC CA dex
1566 6CDD D0 FA bne DelayLoop
1567
1568 6CDF nowait
1569 6CDF AD 96 3D lda HitFlag
1570 6CE2 D0 35 bne Hit
1571
1572 6CE4 AD 79 3E C9 00 D0 + cpw ytraj+1 #screenheight
1573 6CF0 90 05 bcc YTrayLowerThanScreenHeight
1574 6CF2 AD 79 3E lda ytraj+2
1575 6CF5 10 39 bpl EndOfFlight
1576
1577 6CF7 YTrayLowerThanScreenHeight ; it means it is still on screen and not above
1578
1579 6CF7 SkipCollisionCheck
1580
1581 6CF7 AD 75 3E 85 80 AD + mwa xtraj+1 xdraw
1582 6D01 AD 78 3E 85 82 AD + mwa ytraj+1 ydraw
1583
1584 6D0B AD A9 3E lda tracerflag
1585 6D0E D0 03 bne NoUnPlot
1586
1587 6D10 20 46 88 jsr UnPlot
1588
1589 6D13 NoUnPlot
1590 6D13 20 8B 89 jsr PlotPointer
1591
1592 6D16 4C AC 6B jmp Loopi
1593
1594 6D19 Hit
1595 6D19 AD 32 3E 85 80 AD + mwa XHit xdraw
1596 6D23 AD 34 3E 85 82 AD + mwa YHit ydraw
1597
1598 6D2D 20 46 88 jsr unPlot
1599 6D30 EndOfFlight
1600 6D30 A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store for a little while
1601 6D3A A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw
1602 6D3F A9 00 85 80 85 81 mwa #0 xdraw
1603 6D45 A9 C7 85 82 mva #screenheight-1 ydraw
1604 6D49 20 46 88 jsr unPlot
1605 6D4C AD 39 3E 85 80 AD + mwa xcircle xdraw
1606 6D56 AD 3B 3E 85 82 mva ycircle ydraw
1607
1608 6D5B AC 6B 3E ldy SmokeTracerFlag
1609 6D5E F0 07 beq EndOfFlight2
1610 6D60 88 dey
1611 6D61 8C 6B 3E sty SmokeTracerFlag
1612 6D64 4C 6D 6D jmp SecondFlight
1613 6D67 EndOfFlight2
1614 6D67 A9 00 lda #0 ; nie wiem czemu
1615 6D69 8D A9 3E sta tracerflag ;
1616 6D6C 60 rts
1617 .endp
1618
1619 6D6D SecondFlight .proc
1620 ; ---------------- przekopiowany fragment sprzed odpalenie strza³u malo kulturalne.....
1621 ; ---------------- ponownie wyznacza parametry strza³u
1622 6D6D A6 8B ldx TankNr
1623 6D6F BD 6A 3D lda EnergyTableL,x
1624 6D72 8D 81 3E sta Force
1625 6D75 BD 70 3D lda EnergyTableH,x
1626 6D78 8D 82 3E sta Force+1
1627 6D7B A9 00 lda #$0
1628 6D7D 8D 83 3E sta Force+2
1629 6D80 BD 82 3D lda AngleTable,x
1630 6D83 8D 80 3E sta Angle
1631
1632 6D86 A9 00 lda #0
1633 6D88 8D CA 3E sta color
1634 6D8B 8D 74 3E sta xtraj
1635 6D8E 8D 77 3E sta ytraj
1636
1637 6D91 BD 97 3D lda xtankstableL,x
1638 6D94 8D 75 3E sta xtraj+1
1639 6D97 BD 9D 3D lda xtankstableH,x
1640 6D9A 8D 76 3E sta xtraj+2
1641 6D9D BD A3 3D lda ytankstable,x
1642 6DA0 8D 78 3E sta ytraj+1
1643 6DA3 A9 00 lda #$00
1644 6DA5 8D 79 3E sta ytraj+2
1645
1646 6DA8 AC 80 3E ldy Angle
1647 6DAB 18 clc
1648 6DAC AD 75 3E lda xtraj+1
1649 6DAF 79 69 49 adc EndOfTheBarrelX,y ; correction of X
1650 6DB2 8D 75 3E sta xtraj+1
1651 6DB5 AD 76 3E lda xtraj+2
1652 6DB8 69 00 adc #0
1653 6DBA 8D 76 3E sta xtraj+2
1654 6DBD 38 sec
1655 6DBE AD 78 3E lda ytraj+1
1656 6DC1 F9 69 4A sbc EndOfTheBarrelY,y ; correction of Y
1657 6DC4 8D 78 3E sta ytraj+1
1658 6DC7 AD 79 3E lda ytraj+2
1659 6DCA E9 00 sbc #0
1660 6DCC 8D 79 3E sta ytraj+2
1661
1662 6DCF A0 64 ldy #100
1663 6DD1 A9 01 lda #1 ; nie wiem (to znaczy wydaje mi sie ze wiem ;) )
1664 6DD3 8D A9 3E sta tracerflag ; .....
1665 6DD6 4C 84 6A jmp Flight.RepeatIfSmokeTracer
1666 .endp
1667
1668 ; -------------------------------------------------
1669 6DD9 MIRVdownLoop .proc
1670 ; MIRV loop - here mirv bullets fall down
1671 ; -------------------------------------------------
1672 ; copy Flight parameters to the table
1673 6DD9 A2 04 ldx #4
1674 6DDB MIRVcopyParameters
1675 6DDB AD 74 3E lda xtraj
1676 6DDE 9D 42 3E sta xtraj00,x
1677 6DE1 AD 75 3E lda xtraj+1
1678 6DE4 9D 47 3E sta xtraj01,x
1679 6DE7 AD 76 3E lda xtraj+2
1680 6DEA 9D 4C 3E sta xtraj02,x
1681 6DED AD 6C 3E lda vx
1682 6DF0 9D 51 3E sta vx00,x
1683 6DF3 AD 6D 3E lda vx+1
1684 6DF6 9D 56 3E sta vx01,x
1685 6DF9 AD 6E 3E lda vx+2
1686 6DFC 9D 5B 3E sta vx02,x
1687 6DFF AD 6F 3E lda vx+3
1688 6E02 9D 60 3E sta vx03,x
1689 6E05 A9 00 lda #0
1690 6E07 9D 65 3E sta MirvDown,x
1691 6E0A CA dex
1692 6E0B 10 CE bpl MIRVcopyParameters
1693 ; modification (to make bullets "split away" and go different directions)
1694 ; bullet indexed 0 is in the middle
1695
1696 ; bullet 1
1697 6E0D 18 clc
1698 6E0E AD 6D 3E lda vx+1
1699 6E11 69 64 adc #100
1700 6E13 8D 57 3E sta vx01+1
1701 6E16 AD 6E 3E lda vx+2
1702 6E19 69 00 adc #0
1703 6E1B 8D 5C 3E sta vx02+1
1704 6E1E AD 6F 3E lda vx+3
1705 6E21 69 00 adc #0
1706 6E23 8D 61 3E sta vx03+1
1707 ; bullet 2
1708 6E26 38 sec
1709 6E27 AD 6D 3E lda vx+1
1710 6E2A E9 64 sbc #100
1711 6E2C 8D 58 3E sta vx01+2
1712 6E2F AD 6E 3E lda vx+2
1713 6E32 E9 00 sbc #0
1714 6E34 8D 5D 3E sta vx02+2
1715 6E37 AD 6F 3E lda vx+3
1716 6E3A E9 00 sbc #0
1717 6E3C 8D 62 3E sta vx03+2
1718 ; bullet 3
1719 6E3F 18 clc
1720 6E40 AD 6D 3E lda vx+1
1721 6E43 69 C8 adc #200
1722 6E45 8D 59 3E sta vx01+3
1723 6E48 AD 6E 3E lda vx+2
1724 6E4B 69 00 adc #0
1725 6E4D 8D 5E 3E sta vx02+3
1726 6E50 AD 6F 3E lda vx+3
1727 6E53 69 00 adc #0
1728 6E55 8D 63 3E sta vx03+3
1729 ; bullet 4
1730 6E58 38 sec
1731 6E59 AD 6D 3E lda vx+1
1732 6E5C E9 C8 sbc #200
1733 6E5E 8D 5A 3E sta vx01+4
1734 6E61 AD 6E 3E lda vx+2
1735 6E64 E9 00 sbc #0
1736 6E66 8D 5F 3E sta vx02+4
1737 6E69 AD 6F 3E lda vx+3
1738 6E6C E9 00 sbc #0
1739 6E6E 8D 64 3E sta vx03+4
1740
1741 ; clearing ranges of soil down registers
1742 6E71 A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft
1743 6E7B A9 00 lda #0
1744 6E7D 8D FE 3D sta RangeRight
1745 6E80 8D FF 3D sta RangeRight+1
1746
1747 6E83 A2 FF ldx #$FF ; it will turn 0 in a moment anyway
1748 6E85 8E 6A 3E stx MirvMissileCounter
1749 6E88 mrLoopi
1750 6E88 EE 6A 3E inc MirvMissileCounter
1751 6E8B AD 6A 3E lda MirvMissileCounter
1752 6E8E C9 05 cmp #5
1753 6E90 D0 05 bne mrLoopix
1754 6E92 A9 00 8D 6A 3E mva #0 MirvMissileCounter
1755 6E97 mrLoopix
1756 6E97 AE 6A 3E ldx MirvMissileCounter
1757 ; Y changes only for bullet number 0
1758 ; because rest of the bullets have the same Y (height)
1759
1760 6E9A D0 58 bne MIRVdoNotChangeY
1761 ; Y is the same for all falling bullets
1762 ;ytraj=ytraj-vy (skipping least significant byte of vy)
1763 6E9C 38 sec
1764 6E9D AD 77 3E lda ytraj
1765 6EA0 ED 71 3E sbc vy+1
1766 6EA3 8D 77 3E sta ytraj
1767 6EA6 AD 78 3E lda ytraj+1
1768 6EA9 ED 72 3E sbc vy+2
1769 6EAC 8D 78 3E sta ytraj+1
1770 6EAF AD 79 3E lda ytraj+2
1771 6EB2 ED 73 3E sbc vy+3
1772 6EB5 8D 79 3E sta ytraj+2
1773
1774 ;vy=vy-g (also without least significan byte of vy)
1775 6EB8 38 sec
1776 6EB9 AD 71 3E lda vy+1
1777 6EBC ED 90 3D sbc gravity
1778 6EBF 8D 71 3E sta vy+1
1779 6EC2 AD 72 3E lda vy+2
1780 6EC5 E9 00 sbc #0
1781 6EC7 8D 72 3E sta vy+2
1782 6ECA AD 73 3E lda vy+3
1783 6ECD E9 00 sbc #0
1784 6ECF 8D 73 3E sta vy+3
1785
1786 ; 3 waits for 5 bullets (will be faster)
1787 6ED2 wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 6ED2 AD 0B D4 LDA VCOUNT
4 6ED5 8D 0A D4 STA WSYNC
5 6ED8 8D 0A D4 STA WSYNC
6 6EDB 8D 0A D4 STA WSYNC
7 6EDE CD 0B D4 ?WA CMP VCOUNT
8 6EE1 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
1788 ;wait
1789 6EE3 wait
Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 6EE3 AD 0B D4 LDA VCOUNT
4 6EE6 8D 0A D4 STA WSYNC
5 6EE9 8D 0A D4 STA WSYNC
6 6EEC 8D 0A D4 STA WSYNC
7 6EEF CD 0B D4 ?WA CMP VCOUNT
8 6EF2 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm
1790
1791 6EF4 MIRVdoNotChangeY
1792
1793 6EF4 BD 65 3E lda MirvDown,x ; if bullet is already down we go with the next one
1794 6EF7 F0 03 4C 79 70 jne MIRVnextBullet
1795 6EFC AD 8C 3E lda goleft
1796 6EFF D0 1F bne mrFlightLeft
1797
1798 6F01 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx)
1799 6F02 BD 42 3E lda xtraj00,x ;and here of course Flight to the right
1800 6F05 7D 56 3E adc vx01,x
1801 6F08 9D 42 3E sta xtraj00,x
1802 6F0B BD 47 3E lda xtraj01,x
1803 6F0E 7D 5B 3E adc vx02,x
1804 6F11 9D 47 3E sta xtraj01,x
1805 6F14 BD 4C 3E lda xtraj02,x
1806 6F17 7D 60 3E adc vx03,x
1807 6F1A 9D 4C 3E sta xtraj02,x
1808 6F1D 4C 3C 6F jmp mrskip07 ;skip substracting for Flight to the left
1809
1810 6F20 mrFlightLeft
1811 6F20 38 sec ;xtraj=xtraj-vx (skipping the least significant byte of vx)
1812 6F21 BD 42 3E lda xtraj00,x ;here of course Flight to the left
1813 6F24 FD 56 3E sbc vx01,x
1814 6F27 9D 42 3E sta xtraj00,x
1815 6F2A BD 47 3E lda xtraj01,x
1816 6F2D FD 5B 3E sbc vx02,x
1817 6F30 9D 47 3E sta xtraj01,x
1818 6F33 BD 4C 3E lda xtraj02,x
1819 6F36 FD 60 3E sbc vx03,x
1820 6F39 9D 4C 3E sta xtraj02,x
1821
1822
1823 6F3C mrskip07
1824 ;vx=vx-Wind (also without least significan byte of vx)
1825
1826 6F3C AD 8C 3E lda goleft
1827 6F3F D0 07 bne mrFlightsLeft ;blow on bullet flighting left
1828 6F41 AD 94 3D lda WindOrientation
1829 6F44 D0 2D bne mrWindToLeft
1830 6F46 F0 05 beq mrLWindToLeft
1831 6F48 mrFlightsLeft
1832 6F48 AD 94 3D lda WindOrientation
1833 6F4B F0 26 beq mrLWindToRight
1834 6F4D mrLWindToLeft
1835 ; here Wind to right, bullet goes right as well, so vx=vx+Wind
1836 ; here Wind to left, bullet goes left as well, so vx=vx+Wind
1837 6F4D 18 clc
1838 6F4E BD 51 3E lda vx00,x
1839 6F51 6D 91 3D adc Wind
1840 6F54 9D 51 3E sta vx00,x
1841 6F57 BD 56 3E lda vx01,x
1842 6F5A 6D 92 3D adc Wind+1
1843 6F5D 9D 56 3E sta vx01,x
1844 6F60 BD 5B 3E lda vx02,x
1845 6F63 69 00 adc #0
1846 6F65 9D 5B 3E sta vx02,x
1847 6F68 BD 60 3E lda vx03,x
1848 6F6B 69 00 adc #0
1849 6F6D 9D 60 3E sta vx03,x
1850 6F70 4C 96 6F Jmp mrskip08
1851 6F73 mrWindToLeft
1852 6F73 mrLWindToRight
1853 ;Wind to left, bullet right, so vx=vx-Wind
1854 ;Wind to right, bullet left, so vx=vx-Wind
1855 6F73 38 sec
1856 6F74 BD 51 3E lda vx00,x
1857 6F77 ED 91 3D sbc Wind
1858 6F7A 9D 51 3E sta vx00,x
1859 6F7D BD 56 3E lda vx01,x
1860 6F80 ED 92 3D sbc Wind+1
1861 6F83 9D 56 3E sta vx01,x
1862 6F86 BD 5B 3E lda vx02,x
1863 6F89 E9 00 sbc #0
1864 6F8B 9D 5B 3E sta vx02,x
1865 6F8E BD 60 3E lda vx03,x
1866 6F91 E9 00 sbc #0
1867 6F93 9D 60 3E sta vx03,x
1868 6F96 mrskip08
1869
1870 ; isn't it over the screen????
1871 6F96 AD 79 3E lda ytraj+2 ;attention! this checks getting out of the screen through bottom
1872 6F99 30 0A bmi MIRVcheckX ;but not that accurately....
1873 6F9B AD 78 3E lda ytraj+1
1874 6F9E C9 C8 cmp #screenheight
1875 6FA0 90 03 4C 61 70 jcs mrEndOfFlight ; if smaller than screenheight then continue (and it will always fall down...)
1876 6FA5 MIRVcheckX
1877 6FA5 BD 4C 3E lda xtraj02,x
1878 6FA8 C9 01 cmp #>screenwidth
1879 6FAA F0 12 beq MIRVcheckLowerX
1880 6FAC 90 27 bcc MIRVcheckCollision
1881 ; it's over the screen horizontally (to the left or right)
1882 6FAE A9 00 85 80 85 81 mwa #0 xdraw
1883 6FB4 A9 C7 85 82 mva #screenheight-1 ydraw
1884 6FB8 20 48 88 jsr unPlot.unPlotAfterX
1885 6FBB 4C 88 6E jmp mrLoopi
1886 6FBE MIRVcheckLowerX
1887 6FBE BD 47 3E lda xtraj01,x
1888 6FC1 C9 40 cmp #<screenwidth
1889 6FC3 90 10 bcc MIRVcheckCollision
1890 ; it's over the screen horizontally (to the left or right)
1891 6FC5 A9 00 85 80 85 81 mwa #0 xdraw
1892 6FCB A9 C7 85 82 mva #screenheight-1 ydraw
1893 6FCF 20 48 88 jsr unPlot.unPlotAfterX
1894 6FD2 4C 88 6E jmp mrLoopi
1895
1896 6FD5 MIRVcheckCollision
1897 ; checking the collision!
1898 6FD5 AD 79 3E lda ytraj+2
1899 6FD8 D0 34 bne mrSkipCollisionCheck
1900
1901 ; checking works only with xtraj so copy there all we need
1902 6FDA BD 47 3E lda xtraj01,x
1903 6FDD 8D 75 3E sta xtraj+1
1904 6FE0 BD 4C 3E lda xtraj02,x
1905 6FE3 8D 76 3E sta xtraj+2
1906 6FE6 A9 00 8D 96 3D mva #0 HitFlag
1907 6FEB 20 D4 70 jsr CheckCollisionWithTank
1908 6FEE AE 6A 3E ldx MirvMissileCounter
1909 6FF1 AD 96 3D lda HitFlag
1910 6FF4 D0 3D bne mrHit
1911
1912 ;mwa xtraj01 temp
1913 6FF6 18 clc
1914 6FF7 BD 47 3E lda xtraj01,x
1915 6FFA 69 13 adc #<mountaintable
1916 6FFC 85 91 sta temp
1917 6FFE BD 4C 3E lda xtraj02,x
1918 7001 69 41 adc #>mountaintable
1919 7003 85 92 sta temp+1
1920 ; adw mountaintable --- it does not work!!!!!!!! and should! (OMC bug?) #temp
1921 7005 A0 00 ldy #0
1922 7007 AD 78 3E lda ytraj+1
1923 700A D1 91 cmp (temp),y
1924 700C B0 25 bcs mrHit
1925
1926
1927
1928 700E mrSkipCollisionCheck
1929
1930 ;mwa xtraj01 xdraw
1931 700E BD 47 3E lda xtraj01,x
1932 7011 85 80 sta xdraw
1933 7013 BD 4C 3E lda xtraj02,x
1934 7016 85 81 sta xdraw+1
1935 7018 AD 78 3E 85 82 AD + mwa ytraj+1 ydraw
1936
1937 7022 20 48 88 jsr unPlot.unPlotAfterX
1938 7025 AE 6A 3E ldx MirvMissileCounter
1939 7028 F0 03 4C 88 6E jne mrLoopi
1940 702D 20 8B 89 jsr PlotPointer ; pointer only for bullet nr 0
1941
1942 7030 4C 88 6E jmp mrLoopi
1943
1944 7033 mrHit
1945 ; we have to make unPlot over the screen (to initialise it)
1946 ; before actual explosion
1947 7033 A9 00 85 80 85 81 mwa #0 xdraw
1948 7039 A9 C7 85 82 mva #screenheight-1 ydraw
1949 703D 20 48 88 jsr unPlot.unPlotAfterX
1950 7040 AE 6A 3E ldx MirvMissileCounter
1951 7043 A0 00 ldy #0
1952 ; concurrent moving xtraj+1 -> xdraw and calculating temp
1953 7045 18 clc
1954 7046 BD 47 3E lda xtraj01,x
1955 7049 85 80 sta xdraw
1956 704B 69 13 adc #<mountaintable
1957 704D 85 91 sta temp
1958 704F BD 4C 3E lda xtraj02,x
1959 7052 85 81 sta xdraw+1
1960 7054 69 41 adc #>mountaintable
1961 7056 85 92 sta temp+1
1962 7058 B1 91 lda (temp),y
1963 705A 85 82 sta ydraw
1964 705C 84 83 sty ydraw+1 ;we know that y=0
1965 705E 20 D6 5E jsr missile ; explode ....
1966 7061 mrEndOfFlight
1967 7061 AE 6A 3E ldx MirvMissileCounter
1968 7064 A9 00 85 80 85 81 mwa #0 xdraw
1969 706A A9 C7 85 82 mva #screenheight-1 ydraw
1970 706E 20 48 88 jsr unPlot.unPlotAfterX
1971 7071 AE 6A 3E ldx MirvMissileCounter
1972 7074 A9 01 lda #1
1973 7076 9D 65 3E sta MirvDown,x
1974 7079 MIRVnextBullet
1975 ; checking if all bullets already fallen down
1976 7079 A2 04 ldx #4
1977 707B MIRVcheckIfEnd
1978 707B BD 65 3E lda MirvDown,x
1979 707E F0 05 beq MIRVstillNotAll
1980 7080 CA dex
1981 7081 10 F8 bpl MIRVcheckIfEnd
1982 7083 30 03 bmi MIRValreadyAll
1983 7085 MIRVstillNotAll
1984 7085 4C 88 6E jmp mrLoopi
1985 7088 MIRValreadyAll
1986 7088 A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store them (for a while)
1987 7092 A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw
1988 7097 A9 00 85 80 85 81 mwa #0 xdraw
1989 709D A9 C7 85 82 mva #screenheight-1 ydraw
1990 70A1 AE 6A 3E ldx MirvMissileCounter
1991 70A4 20 48 88 jsr unPlot.unPlotAfterX
1992 70A7 AD 39 3E 85 80 AD + mwa xcircle xdraw
1993 70B1 AD 3B 3E 85 82 mva ycircle ydraw
1994
1995 ; we must do it manually because of the VOID pointer
1996
1997 ; temporary removing tanks from the screen (otherwise they will fall down with soil)
1998 70B6 A5 8B 85 A7 mva TankNr tempor2
1999 70BA A9 01 8D FB 3D mva #1 Erase
2000 70BF 20 E2 84 jsr drawtanks
2001 70C2 A5 A7 85 8B mva tempor2 TankNr
2002 70C6 A9 00 8D FB 3D mva #0 Erase
2003 70CB 20 F7 85 jsr SoilDown2
2004 70CE A9 01 8D 96 3D mva #1 HitFlag
2005 ;jsr drawtanks
2006 70D3 60 rts
2007 .endp
2008
2009 ; -------------------------------------------------
2010 70D4 CheckCollisionWithTank .proc
2011 ; -------------------------------------------------
2012 70D4 A2 00 ldx #0
2013 70D6 CheckCollisionWithTankLoop
2014
2015 70D6 BD 9D 3D lda xtankstableH,x
2016 70D9 CD 76 3E cmp xtraj+2
2017 70DC D0 06 bne Condition01
2018 70DE BD 97 3D lda xtankstableL,x
2019 70E1 CD 75 3E cmp xtraj+1
2020 70E4 Condition01
2021 70E4 B0 40 bcs LeftFromTheTank ;add 8 double byte
2022 70E6 18 clc
2023 70E7 69 08 adc #8
2024 70E9 A8 tay
2025 70EA BD 9D 3D lda xtankstableH,x
2026 70ED 69 00 adc #0
2027 70EF CD 76 3E cmp xtraj+2
2028 70F2 D0 03 bne Condition02
2029 70F4 CC 75 3E cpy xtraj+1
2030 70F7 Condition02
2031 70F7 90 2D bcc RightFromTheTank
2032
2033 70F9 BD A3 3D lda ytankstable,x
2034 70FC CD 78 3E cmp ytraj+1 ; check range
2035 70FF 90 25 bcc BelowTheTank ;(ytankstable,ytankstable+3)
2036 7101 E9 04 sbc #4
2037 7103 CD 78 3E cmp ytraj+1
2038 7106 B0 1E bcs OverTheTank
2039 7108 A9 01 8D 96 3D mva #1 HitFlag
2040 710D AD 75 3E 8D 32 3E + mwa xtraj+1 XHit
2041 7119 AD 78 3E 8D 34 3E + mwa ytraj+1 YHit
2042 7125 60 rts ; in X there is an index of the hit tank
2043 7126 RightFromTheTank
2044 7126 LeftFromTheTank
2045 7126 OverTheTank
2046 7126 BelowTheTank
2047 7126 E8 inx
2048 7127 EC 19 3D cpx NumberOfPlayers
2049 712A D0 AA bne CheckCollisionWithTankLoop
2050 712C 60 rts
2051 .endp
2052 ;--------------------------------------------------
2053 712D CalculateExplosionRange0
2054 ;--------------------------------------------------
2055
2056 ;the same as below, but without summing up
2057 ;(for the first or single explosion)
2058
2059 ;zero soil fall out ranges
2060 712D A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft
2061 7137 A9 00 lda #0
2062 7139 8D FE 3D sta RangeRight
2063 713C 8D FF 3D sta RangeRight+1
2064 713F A9 0B 8D 49 3F mva #11 ExplosionRadius
2065 ;--------------------------------------------------
2066 7144 CalculateExplosionRange .proc
2067 ;--------------------------------------------------
2068 ;calculates total horizontal range of explosion by
2069 ;"summing up" ranges of all separate explosions
2070
2071 7144 18 A5 80 6D 49 3F + adw xdraw ExplosionRadius WeaponRangeRight
2072 7155 AD 03 3E C9 01 D0 + cpw WeaponRangeRight #screenwidth-1
2073 7161 90 0A bcc NotOutOfTheScreenRight
2074 7163 A9 3F 8D 02 3E A9 + mwa #screenwidth-1 WeaponRangeRight
2075
2076 716D NotOutOfTheScreenRight
2077 716D 38 A5 80 ED 49 3F + sbw xdraw ExplosionRadius WeaponRangeLeft
2078 717E AD 01 3E lda WeaponRangeLeft+1
2079 7181 10 08 bpl NotOutOfTheScreenLeft
2080 7183 A9 00 lda #0
2081 7185 8D 00 3E sta WeaponRangeLeft
2082 7188 8D 01 3E sta WeaponRangeLeft+1
2083 718B NotOutOfTheScreenLeft
2084
2085 718B AD FD 3D CD 01 3E + cpw RangeLeft WeaponRangeLeft
2086 7199 90 0C bcc CheckRangeRight
2087 719B AD 00 3E 8D FC 3D + mwa WeaponRangeLeft RangeLeft
2088 71A7 CheckRangeRight
2089 71A7 AD FF 3D CD 03 3E + cpw RangeRight WeaponRangeRight
2090 71B5 B0 0C bcs RangesChecked
2091 71B7 AD 02 3E 8D FE 3D + mwa WeaponRangeRight RangeRight
2092 71C3 RangesChecked
2093
2094 71C3 60 rts
2095 .endp
2096
2097 ;--------------------------------------------------
2098 71C4 DecreaseWeaponAfterShoot .proc
2099 ;--------------------------------------------------
2100 71C4 A6 8B ldx TankNr
2101 71C6 BD 89 3D lda ActiveWeapon,x
2102 71C9 20 DC 71 jsr DecreaseWeapon
2103 ; and here we have amount of possessed ammo for given weapon
2104
2105 71CC C9 00 cmp #0
2106 71CE D0 05 bne AmmunitionDecreased
2107 71D0 A9 00 lda #0 ;if ammo for given weapon ends
2108 71D2 9D 89 3D sta ActiveWeapon,x ;then set to default weapon (baby missile)
2109 71D5 AmmunitionDecreased
2110 71D5 A9 63 lda #99
2111 71D7 A0 00 ldy #0
2112 71D9 91 B4 sta (weaponPointer),y ;baby missile - always 99 pieces
2113
2114 ;there is a good value in temp after jsr DecreaseWeapon
2115
2116 71DB 60 rts
2117 .endp
2118
2119 ;--------------------------------------------------
2120 71DC DecreaseWeapon .proc
2121 ; in: A <-- Weapon number, TankNr
2122 ; decreases 1 bullet from a weapon(A) of tank(TankNr)
2123 ;--------------------------------------------------
2124 71DC 20 E5 71 jsr HowManyBullets
2125 71DF 38 sec
2126 71E0 E9 01 sbc #1
2127 71E2 91 B4 sta (weaponPointer),y ; we have good values after HowManyBullets
2128 71E4 60 rts
2129 .endp
2130
2131 ;--------------------------------------------------
2132 71E5 HowManyBullets .proc
2133 ; in: A <-- Weapon number, TankNr
2134 ; out: A <-- How many bullets in the weapon
2135 ; how many bullets weapon of tank(TankNr) has, Result w A
2136 ;--------------------------------------------------
2137 71E5 A8 tay
2138 71E6 A6 8B ldx TankNr
2139 71E8 BD 07 41 lda TanksWeaponsTableL,x
2140 71EB 85 B4 sta weaponPointer
2141 71ED BD 0D 41 lda TanksWeaponsTableH,x
2142 71F0 85 B5 sta weaponPointer+1
2143
2144 ;ldy #$35 ; parachute
2145 71F2 B1 B4 lda (weaponPointer),y ; and we have number of bullets in A
2146 71F4 60 rts
2147 .endp
2148
2149
2150
2151 .ENDIF
2152
676
677
678 ;--------------------------------------------------
679 71F5 DecreaseEnergyX .proc
680 ;Decreases energy of player nr X
681 ;increases his financial loss
682 ;increases gain of tank TankNr
683 ;--------------------------------------------------
684 71F5 8C 50 3D sty EnergyDecrease
685 ; Loose increase
686 71F8 BD 44 3D lda looseL,x
687 71FB 18 clc
688 71FC 6D 50 3D adc EnergyDecrease
689 71FF 9D 44 3D sta looseL,x
690 7202 BD 3E 3D lda looseH,x
691 7205 69 00 adc #$00
692 7207 9D 3E 3D sta looseH,x
693 ; Energy now, not less than 0
694 720A BD 4A 3D lda Energy,x
695 720D CD 50 3D cmp EnergyDecrease
696 7210 90 05 bcc ldahashzero
697 ;sec
698 7212 ED 50 3D sbc EnergyDecrease
699 7215 10 02 bpl NotNegativeEnergy
700 7217 ldahashzero
701 7217 A9 00 lda #0
702 7219 NotNegativeEnergy
703 7219 9D 4A 3D sta Energy,x
704 ;now increase the gain of the shooting tank
705 721C phx
Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 721C 8A txa
2 721D 48 pha
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
706 721E A6 8B ldx TankNr
707 7220 18 clc
708 7221 BD 38 3D lda gainL,x
709 7224 6D 50 3D adc EnergyDecrease
710 7227 9D 38 3D sta gainL,x
711 722A BD 32 3D lda gainH,x
712 722D 69 00 adc #$00
713 722F 9D 32 3D sta gainH,x
714 7232 plx
Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7232 68 pla
2 7233 AA tax
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
715 7234 60 rts
716 .endp
717
718 ;--------------------------------------------------
719 7235 GetRandomWind .proc
720 ;--------------------------------------------------
721 7235 AD 0A D2 lda random
722 7238 CD 93 3D cmp MaxWind
723 723B B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again
724 723D 8D 91 3D sta Wind
725 7240 A9 00 8D 92 3D mva #$00 Wind+1
726 ; multiply Wind by 16 and take it as a decimal part (0.Wind)
727 7245 aslw Wind
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7245 0E 91 3D ASL WIND
2 7248 2E 92 3D ROL WIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
728 724B aslw Wind
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 724B 0E 91 3D ASL WIND
2 724E 2E 92 3D ROL WIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
729 7251 aslw Wind
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7251 0E 91 3D ASL WIND
2 7254 2E 92 3D ROL WIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
730 7257 aslw Wind
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7257 0E 91 3D ASL WIND
2 725A 2E 92 3D ROL WIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
731 725D AD 0A D2 lda random
732 7260 29 01 and #$01
733 7262 8D 94 3D sta WindOrientation
734 7265 60 rts
735 .endp
736
737 ;--------------------------------------------------
738 7266 PMoutofScreen .proc
739 ;--------------------------------------------------
740 7266 A9 00 lda #$00 ; let all P/M disappear
741 7268 8D 00 D0 sta hposp0
742 726B 8D 01 D0 sta hposp0+1
743 726E 8D 02 D0 sta hposp0+2
744 7271 8D 03 D0 sta hposp0+3
745 7274 8D 04 D0 sta hposp0+4
746 7277 8D 05 D0 sta hposp0+5
747 727A 8D 06 D0 sta hposp0+6
748 727D 8D 07 D0 sta hposp0+7
749 7280 60 rts
750 .endp
751
752 ;--------------------------------------------------
753 7281 .nowarn .proc WeaponCleanup;
754 ; cleaning of the weapon possesion tables
755 ; (99 of Baby Missles, all other weapons=0)
756 ;--------------------------------------------------
757 7281 A2 3F ldx #$3f
758 7283 A9 00 lda #$0
759 7285 loop05
760 7285 9D 87 3F sta TanksWeapon1,x
761 7288 9D C7 3F sta TanksWeapon2,x
762 728B 9D 07 40 sta TanksWeapon3,x
763 728E 9D 47 40 sta TanksWeapon4,x
764 7291 9D 87 40 sta TanksWeapon5,x
765 7294 9D C7 40 sta TanksWeapon6,x
766 7297 CA dex
767 7298 D0 04 bne skip13
768 729A A9 63 lda #99
769 729C D0 E7 bne loop05
770 729E 10 E5 skip13 bpl loop05
771 72A0 60 rts
772 .endp
773
774 ;--------------------------------------------------
775 72A1 Initialize .proc
776 ;Initialization sequence
777 ;--------------------------------------------------
778 ;jsr GenerateOffensiveTextTables
779 ;jsr GenerateDeffensiveTextTables
780
781 72A1 A9 00 lda #0
782 72A3 8D FB 3D sta Erase
783 72A6 8D A9 3E sta tracerflag
784 72A9 8D 49 48 sta oldPlotPointerX
785 72AC 8D 4A 48 sta oldPlotPointerX+1
786
787 72AF A9 02 8D C6 02 mva #$2 colpf2s
788 72B4 A9 0C 8D C7 02 mva #12 colpf3s
789 72B9 A9 A4 8D F4 02 mva #>WeaponFont chbas
790
791 ;parameter for old plot (unPlot) max 5 points
792 72BE A2 04 ldx #4
793 72C0 SetunPlots
794 72C0 A9 10 lda #<display
795 72C2 9D 94 3E sta oldplotL,x
796 72C5 A9 10 lda #>display
797 72C7 9D 8F 3E sta oldplotH,x
798 72CA A9 00 lda #0
799 72CC 9D 9E 3E sta oldply,x
800 72CF 9D 99 3E sta oldora,x
801 72D2 CA dex
802 72D3 10 EB bpl SetunPlots
803
804 ;setting up P/M graphics
805 72D5 A9 98 lda #>pmgraph
806 72D7 8D 07 D4 sta pmbase
807 72DA AD 2F 02 lda dmactls
808 72DD 09 38 ora #$38 ; Players and Missiles single lined
809 72DF 8D 2F 02 sta dmactls
810 72E2 A9 03 lda #$03 ; P/M on
811 72E4 8D 1D D0 sta pmcntl
812 72E7 A9 01 lda #$01
813 72E9 8D 0C D0 sta sizem ; there will be only M0, double width
814 72EC 8D 08 D0 sta sizep0 ; P0-P3 widths
815 72EF 8D 09 D0 sta sizep0+1
816 72F2 8D 0A D0 sta sizep0+2
817 72F5 8D 0B D0 sta sizep0+3
818 72F8 A9 10 lda #$10 ; P/M priorities (bit 4 joins missiles)
819 72FA 8D 6F 02 sta gtictls
820 72FD 20 66 72 jsr PMoutofScreen
821 7300 A9 50 lda #$50 ; temporary colours of sprites under tanks
822 7302 8D C0 02 sta $2c0
823 7305 A9 30 lda #$30
824 7307 8D C1 02 sta $2c1
825 730A A9 70 lda #$70
826 730C 8D C2 02 sta $2c2
827 730F A9 90 lda #$90
828 7311 8D C3 02 sta $2c3
829 7314 A9 B0 LDA #$B0
830 7316 8D C7 02 STA COLPF3S
831 7319 A9 00 8D 04 D4 mva #0 hscrol
832
833
834 ;let the tanks be visible!
835 731E A2 05 ldx #5
836 7320 A9 01 lda #1 ; tank is visible
837 7322 MakeTanksVisible
838 7322 9D 51 3D sta eXistenZ,x
839 7325 CA dex
840 7326 10 FA bpl MakeTanksVisible
841
842
843 7328 A2 00 ldx #0
844 732A 8A txa
845 732B ClearResults
846 732B 9D 5D 3D sta ResultsTable,x
847 732E E8 inx
848 732F E0 06 cpx #MaxPlayers
849 7331 D0 F8 bne ClearResults
850
851 7333 A9 01 8D 4B 3F mva #1 CurrentRoundNr ;we start from round 1
852
853 7338 60 rts
854 .endp
855
856 7339 SetDLI .proc
857 7339 VDLI DLIinterrupt
Macro: VDLI [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 7339 A0 49 LDY # <DLIINTERRUPT
4 733B A2 73 LDX # >DLIINTERRUPT
5 733D A9 C0 LDA #$C0
6 733F 8C 00 02 STY $0200
7 7342 8E 01 02 STX $0201
8 7345 8D 0E D4 STA NMIEN
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm
858 7348 60 rts
859 .endp
860 7349 DLIinterrupt .proc
861 7349 48 pha
862 734A A9 02 lda #$02 ; color of playground
863 734C 8D 0A D4 sta WSYNC
864 734F 8D 18 D0 sta COLPF2
865 7352 68 pla
866 7353 40 rti
867 .endp
868 ;----------------------------------------------
869 7354 RandomizeSequence .proc
870 ; in: NumberOfPlayers
871 ; out: TankSequence
872 ; how: get random number lower than NumberOfPlayers
873 ; put it in the first slot.
874 ; get another random number lower than NumberOfPlayers
875 ; check if was previously saved in first slot
876 ; if not then save it in second slot
877 ; repeat untill NumberOfPlayers
878
879 7354 A2 00 ldx #0
880 7356 GetRandomAgain0
881 7356 AD 0A D2 lda RANDOM
882 7359 29 07 and #$07 ;NumberOfPlayers < 7
883 735B CD 19 3D cmp NumberOfPlayers
884 735E B0 F6 bcs GetRandomAgain0
885 7360 9D 1A 3D sta TankSequence,x
886 ;now first slot is ready, nexts slots are handled
887 ;in a more complicated way
888
889 7363 GetRandomAgainX
890 7363 AD 0A D2 lda RANDOM
891 7366 29 07 and #$07 ;NumberOfPlayers < 7
892 7368 CD 19 3D cmp NumberOfPlayers
893 736B B0 F6 bcs GetRandomAgainX
894
895 ;now we have to check if the value was not used
896 ;in previous slots
897
898 736D 86 91 stx temp
899 736F A4 91 ldy temp
900 7371 UsageLoop
901 7371 D9 1A 3D cmp TankSequence,y
902 7374 F0 ED beq GetRandomAgainX ;apparently we have already used this value
903 7376 88 dey
904 7377 10 F8 bpl UsageLoop
905
906 ;well, looks like this value is new!
907 7379 E8 inx
908 737A 9D 1A 3D sta TankSequence,x
909
910 737D 86 91 stx temp
911 737F E6 91 A5 91 inc:lda temp ;x+1
912
913 7383 CD 19 3D cmp NumberOfPlayers
914 7386 D0 DB bne GetRandomAgainX
915 7388 60 rts
916 .endp
917 ;----------------------------------------------
918 7389 RandomizeAngle .proc ;
919 ; routine returns in A
920 ; a valid angle for the tank's barrel.
921 ; X is not changed
922 ;----------------------------------------------
923
924 ;valid angle values are ((256-90)..255) and (0..90)
925 ;it means that values 91..165 must be elliminated...
926 ;so, lets randomize someting between 0 and 180
927 ;and substract this value from 90
928 7389 AD 0A D2 lda RANDOM
929
930 738C C9 B4 cmp #180
931 738E B0 F9 bcs RandomizeAngle
932
933
934 7390 85 91 sta temp
935 7392 A9 5A lda #90 ; CARRY=0 here
936 7394 E5 91 sbc temp
937
938 7396 60 rts
939 .endp
940 ;----------------------------------------------
941 7397 RandomizeForce .proc
942 ; routine returns in EnergyTable/L/H
943 ; valid force of shooting for TankNr
944 ; in X must be TankNr
945 ; low and high randomize boundary passed as word value
946 ; RandBoundaryLow
947 ; RandBoundaryHigh
948 ;----------------------------------------------
949
950
951 7397 BD 76 3D lda MaxEnergyTableL,x
952 739A 85 91 sta temp
953 739C BD 7C 3D lda MaxEnergyTableH,x
954 739F 85 92 sta temp+1
955 73A1 GetRandomAgain
956 73A1 AD 0A D2 lda RANDOM
957 ; gets values in range(256,765)
958 73A4 85 93 sta temp2
959 73A6 AD 0A D2 lda RANDOM ; :)
960 73A9 29 03 and #%00000011 ;(0..1023)
961 73AB 85 94 sta temp2+1
962
963 73AD AD C8 50 C5 94 D0 + cpw RandBoundaryLow temp2
964 73B9 B0 E6 bcs GetRandomAgain
965
966 73BB AD CA 50 C5 94 D0 + cpw RandBoundaryHigh temp2
967 73C7 90 D8 bcc GetRandomAgain
968
969 73C9 A5 92 C5 94 D0 04 + cpw temp temp2
970 73D3 B0 08 bcs EnergyInRange
971
972 73D5 A5 91 85 93 A5 92 + mwa temp temp2
973
974 73DD EnergyInRange
975
976 73DD A5 93 lda temp2
977 73DF 9D 6A 3D sta EnergyTableL,x
978 73E2 A5 94 lda temp2+1
979 73E4 9D 70 3D sta EnergyTableH,x
980
981 73E7 60 rts
982 .endp
983
984 ;----------------------------------------------
985 73E8 MoveBarrelToNewPosition .proc
986 73E8 20 F9 84 jsr DrawTankNr
987 73EB A6 8B ldx TankNr
988 73ED BD 82 3D lda AngleTable,x
989 73F0 18 clc
990 73F1 69 5A adc #90 ;shift angle to the positive values
991 73F3 85 91 sta temp
992 73F5 AD 88 3D lda NewAngle
993 73F8 18 clc
994 73F9 69 5A adc #90
995 73FB C5 91 cmp temp
996 73FD F0 20 beq BarrelPositionIsFine
997 73FF 90 0F bcc rotateLeft ; older is bigger
998 7401 rotateRight;older is lower
999 7401 FE 82 3D inc angleTable,x
1000 7404 D0 E2 bne MoveBarrelToNewPosition
1001
1002 7406 A9 30 85 88 mva #$30 CharCode ; if angle goes through 0 we clear the barrel
1003 740A 20 23 85 jsr drawtankNrX
1004
1005 740D 4C E8 73 jmp MoveBarrelToNewPosition
1006 7410 rotateLeft
1007 7410 DE 82 3D dec angleTable,x
1008 7413 10 D3 bpl MoveBarrelToNewPosition
1009 7415 A9 2E 85 88 mva #$2e CharCode
1010 7419 20 23 85 jsr drawtankNrX
1011
1012 741C 4C E8 73 jmp MoveBarrelToNewPosition
1013
1014 741F BarrelPositionIsFine
1015 741F 60 rts
1016
1017 .endp
1018
1019 ;----------------------------------------------
1020 7420 SortSequence .proc ;
1021 ;----------------------------------------------
1022 ; here we try to get a sequence of tanks for two
1023 ; purposes:
1024 ; 1. to make up shooting sequence for the next round (from down to top)
1025 ; 2. to display game results more nicely (from top to down)
1026 ;
1027 ; I think I will go for a stupid bubble sort...
1028 ; it is easy to test :)
1029 ;
1030 ; Results are in ResultsTable, in SortedTable we want to
1031 ; have numbers of tanks from the worst to the best.
1032 ; in other words, if ResultsTable=(5,4,65,23,3,6)
1033 ; the SortedTable=(4,1,0,5,3,2)
1034 ; let's assume initially the TankSequence=(0,1,2,3,4,5)
1035
1036 7420 A2 00 ldx #0
1037 7422 SequenceStart
1038 7422 8A txa
1039 7423 9D 1A 3D sta TankSequence,x
1040 7426 E8 inx
1041 7427 E0 06 cpx #MaxPlayers
1042 7429 D0 F7 bne SequenceStart
1043
1044 ; we will need a TempResults (TR) table to fiddle with
1045 742B A2 00 ldx #0
1046 742D movetotemp
1047 742D BD 5D 3D lda ResultsTable,x
1048 7430 9D 63 3D sta TempResults,x
1049 7433 E8 inx
1050 7434 EC 19 3D cpx NumberOfPlayers
1051 7437 D0 F4 bne movetotemp
1052
1053 ; i=0:sortflag=0
1054 ;loop:
1055 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers
1056 ; or goto loop:
1057 ; else
1058 ; temp=TR(i): tempo=TankSequence(i)
1059 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1)
1060 ; TR(i+1)=temp: TankSequence(i+1)=tempo
1061 ; i=i+1
1062 ; sortflag=sortflag+1
1063 ; go loop:
1064 ; if sortflag=0 then finished, else repeat...
1065 ;
1066 ; or something like this :)
1067 7439 AE 19 3D ldx NumberOfPlayers
1068 743C CA dex
1069 743D 86 92 stx temp+1 ; for checking end of the loop only
1070
1071 743F Bubble
1072 743F A2 00 ldx #0 ;i=x
1073 7441 86 93 stx temp2 ; sortflag=temp2
1074
1075 7443 BubbleBobble
1076 7443 BD 63 3D lda TempResults,x
1077 7446 DD 64 3D cmp TempResults+1,x
1078 7449 F0 21 beq nextishigher ; this is to block hangs when 2 same values meet
1079 744B 90 1F bcc nextishigher
1080 ;here we must swap values
1081 ;because next is smaller than previous
1082 744D 85 91 sta temp
1083 744F BD 64 3D lda TempResults+1,x
1084 7452 9D 63 3D sta TempResults,x
1085 7455 A5 91 lda temp
1086 7457 9D 64 3D sta TempResults+1,x
1087 ;
1088 745A BD 1A 3D lda TankSequence,x
1089 745D 85 91 sta temp
1090 745F BD 1B 3D lda TankSequence+1,x
1091 7462 9D 1A 3D sta TankSequence,x
1092 7465 A5 91 lda temp
1093 7467 9D 1B 3D sta TankSequence+1,x
1094 746A E6 93 inc temp2
1095 746C nextishigher
1096 746C E8 inx
1097 746D E4 92 cpx temp+1 ;cpx ^NumberOfPlayers-1
1098 746F D0 D2 bne BubbleBobble
1099
1100 7471 A5 93 lda temp2
1101
1102 7473 D0 CA bne Bubble
1103
1104 7475 60 rts
1105 .endp
1106 ;----------------------------------------------
1107 7476 icl 'textproc.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2
3
4 .IF *>0
5 ;----------------------------------------
6 ; this module contains routines used in text mode
7 ; like shop and start-up options
8 ;----------------------------------------
9 ;--------------------------------------------------
10 7476 getkey .proc; waits for pressing a key and returns pressed value in A
11 ;--------------------------------------------------
12 7476 pause 5
Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
2 7476 A2 05 ldx #5
3 7478 ?PAUSELOOP
3 7478 AD 0B D4 LDA VCOUNT
4 747B 8D 0A D4 STA WSYNC
5 747E 8D 0A D4 STA WSYNC
6 7481 8D 0A D4 STA WSYNC
7 7484 CD 0B D4 ?WA CMP VCOUNT
8 7487 D0 FB BNE ?WA
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
5 7489 CA dex
6 748A D0 EC bne ?PAUSELOOP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
13 748C AD 0F D2 lda SKSTAT
14 748F C9 FF cmp #$ff
15 7491 F0 12 beq lopx01
16 7493 C9 F7 cmp #$f7
17 7495 D0 DF bne getkey ; I guess it waits for RELEASING a key
18 7497 AD 78 02 lda JSTICK0
19 749A 29 0F and #$0f
20 749C C9 0F cmp #$0f
21 749E D0 D6 bne getkey ; waits for not moving the joy
22 74A0 AD 10 D0 lda TRIG0
23 74A3 F0 D1 beq getkey ; waits for releasing FIRE
24
25
26 74A5 AD 0F D2 lopx01 lda SKSTAT
27 74A8 C9 FF cmp #$ff
28 74AA F0 0A beq checkJoyGetKey ; key not pressed, check Joy
29 74AC C9 F7 cmp #$f7
30 74AE F0 06 beq checkJoyGetKey ; key not pressed, check Joy
31
32 74B0 AD 09 D2 lda kbcode
33 74B3 29 3F and #$3f ;CTRL and SHIFT ellimination
34 74B5 60 rts
35 74B6 checkJoyGetKey
36 ;------------JOY-------------
37 ;happy happy joy joy
38 ;check for joystick now
39 74B6 AD 78 02 lda JSTICK0
40 74B9 29 0F and #$0f
41 74BB C9 0F cmp #$0f
42 74BD F0 05 beq notpressedJoyGetKey
43 74BF A8 tay
44 74C0 B9 99 50 lda joyToKeyTable,y
45 74C3 60 rts
46 74C4 notpressedJoyGetKey
47 ;fire
48 74C4 AD 10 D0 lda TRIG0
49 74C7 D0 DC bne lopx01
50 74C9 A9 0C lda #$0c ;Return key
51 74CB 60 rts
52 .endp
53 ;--------------------------------------------------
54 74CC getkeynowait .proc;
55 ;--------------------------------------------------
56 74CC AD 0F D2 lda SKSTAT
57 74CF C9 FF cmp #$ff
58 74D1 F0 F9 beq getkeynowait
59 74D3 C9 F7 cmp #$f7
60 74D5 F0 F5 beq getkeynowait ; I guess it waits for RELEASING a key
61 74D7 AD 09 D2 lda kbcode
62 74DA 29 3F and #$3f ;CTRL and SHIFT ellimination
63 74DC 60 rts
64 .endp
65 ;--------------------------------------------------
66 74DD Options .proc
67 ;--------------------------------------------------
68 ; start-up screen - options, etc.
69 ; this function returns:
70 ; - number of players (NumberOfPlayers)
71 ; - money each player has on the beginning of the game (moneyL i moneyH)
72 ; - and I am sure maxwind, gravity, ????
73
74 74DD A9 00 8D 18 3F mva #0 OptionsY
75
76 74E2 OptionsMainLoop
77
78 74E2 20 77 75 jsr OptionsInversion
79 74E5 20 76 74 jsr getkey
80 74E8 C9 0F cmp #$f ;cursor down
81 74EA D0 12 bne OptionsNoDown
82 74EC EE 18 3F AD 18 3F inc:lda OptionsY
83 74F2 C9 04 cmp #maxoptions
84 74F4 D0 EC bne OptionsMainLoop
85 74F6 A9 03 8D 18 3F mva #3 OptionsY
86 74FB 4C E2 74 jmp OptionsMainLoop
87
88 74FE OptionsNoDown
89 74FE C9 0E cmp #$e ;cursor up
90 7500 D0 0D bne OptionsNoUp
91 7502 CE 18 3F dec OptionsY
92 7505 10 DB bpl OptionsMainLoop
93 7507 A9 00 8D 18 3F mva #0 OptionsY
94 750C 4C E2 74 jmp OptionsMainLoop
95
96 750F OptionsNoUp
97 750F C9 06 cmp #$6 ;cursor left
98 7511 D0 11 bne OptionsNoLeft
99 7513 AE 18 3F ldx OptionsY
100 7516 DE 14 3F dec OptionsTable,X
101 7519 BD 14 3F lda OptionsTable,X
102 751C 10 C4 bpl OptionsMainLoop
103 751E FE 14 3F inc OptionsTable,X
104 7521 4C E2 74 jmp OptionsMainLoop
105
106 7524 OptionsNoLeft
107 7524 C9 07 cmp #$7 ;cursor right
108 7526 D0 13 bne OptionsNoRight
109
110 7528 AE 18 3F ldx OptionsY
111 752B FE 14 3F inc OptionsTable,X
112 752E BD 14 3F lda OptionsTable,X
113 7531 C9 05 cmp #5
114 7533 D0 AD bne OptionsMainLoop
115 7535 DE 14 3F dec OptionsTable,X
116 7538 4C E2 74 jmp OptionsMainLoop
117
118 753B OptionsNoRight
119 753B C9 0C cmp #$c ;Return key
120 753D D0 03 bne OptionsNoReturn
121 753F 4C 45 75 jmp OptionsFinished
122 7542 OptionsNoReturn
123 7542 4C E2 74 jmp OptionsMainLoop
124
125 7545 OptionsFinished
126 ;first option
127 7545 AC 14 3F ldy OptionsTable
128 7548 C8 iny
129 7549 C8 iny
130 754A 8C 19 3D sty NumberOfPlayers ;1=1 player (but minimum is 2)
131
132 ;second option (cash)
133
134
135 754D AC 15 3F ldy OptionsTable+1
136 7550 A2 00 ldx #0
137 7552 skip10
138 7552 B9 1E 3F lda CashOptionL,y
139 7555 9D 2C 3D sta moneyL,x
140 7558 B9 19 3F lda CashOptionH,y
141 755B 9D 26 3D sta moneyH,x
142 755E E8 inx
143 755F EC 19 3D cpx NumberOfPlayers
144 7562 D0 EE bne skip10
145
146 ;third option (gravity)
147 7564 AC 16 3F ldy OptionsTable+2
148 7567 B9 23 3F lda GravityTable,y
149 756A 8D 90 3D sta gravity
150
151 ;fourth option (wind)
152
153 756D AC 17 3F ldy OptionsTable+3
154 7570 B9 28 3F lda MaxWindTable,y
155 7573 8D 93 3D sta MaxWind
156 7576 60 rts
157 ;--------
158 ; inversing choosed option (cursor)
159 ;--------
160 7577 OptionsInversion
161 7577 A9 F3 85 91 A9 31 + mwa #OptionsHere temp
162 757F A0 00 ldy #0
163 7581 OptionsInversionLoop1
164 7581 B1 91 lda (temp),y
165 7583 29 7F and #$7F
166 7585 91 91 sta (temp),y
167 7587 18 A5 91 69 01 85 + adw temp #1
168 7592 A5 92 C9 32 D0 04 + cpw temp #OptionsScreenEnd
169 759C D0 E3 bne OptionsInversionLoop1
170 ;here all past inversions are gone...
171
172 759E A9 F3 85 91 A9 31 + mwa #OptionsHere temp
173 75A6 A9 00 85 93 mva #0 temp2 ;option number pointer
174 75AA 18 A5 91 69 0B 85 + adw temp #11 ;offset of the first option=11
175 75B5 OptionsSetMainLoop
176 75B5 A6 93 ldx temp2
177 75B7 BD 14 3F lda OptionsTable,x
178 75BA 0A asl
179 75BB 0A asl
180 75BC 7D 14 3F adc OptionsTable,x ;OptionsTable value * 5
181 75BF A8 tay
182 75C0 A2 04 ldx #4
183 75C2 OptionSetLoop
184 75C2 B1 91 lda (temp),y
185 75C4 09 80 ora #$80
186 75C6 91 91 sta (temp),y
187 75C8 C8 iny
188 75C9 CA dex
189 75CA 10 F6 bpl OptionSetLoop ;here option is highlighted
190 ;
191 ; next option
192 75CC 18 A5 91 69 28 85 + adw temp #40 ;jump to next line
193 75D7 E6 93 A5 93 inc:lda temp2
194 75DB C9 04 cmp #4 ;number of options
195 75DD D0 D6 bne OptionsSetMainLoop
196
197 ;inversing the first few chars of the selected line (OptionsY)
198 75DF AD 18 3F 85 91 mva OptionsY temp
199 75E4 A9 00 85 92 85 93 mwa #0 temp+1
200 75EA 06 91 asl temp
201 75EC 26 92 rol temp+1
202 75EE 06 91 asl temp
203 75F0 26 92 rol temp+1
204 75F2 06 91 asl temp
205 75F4 26 92 rol temp+1
206 75F6 A5 91 85 93 A5 92 + mwa temp temp2 ;here is OptionsY*8
207 75FE 06 91 asl temp
208 7600 26 92 rol temp+1
209 7602 06 91 asl temp
210 7604 26 92 rol temp+1
211 ;here is 32*OptionsY
212 7606 18 A5 91 65 93 85 + adw temp temp2
213 ;in temp is 40*OptionsY
214 7613 18 A5 91 69 F3 85 + adw temp #OptionsHere
215 ;now in temp is adres of the line to be inversed
216 7620 A0 07 ldy #7 ;8 letters to invers
217 7622 OptionsYLoop
218 7622 B1 91 lda (temp),y
219 7624 09 80 ora #$80
220 7626 91 91 sta (temp),y
221 7628 88 dey
222 7629 10 F7 bpl OptionsYLoop
223
224
225 762B 60 rts
226 .endp
227
228 ;-------------------------------------------
229 ; call of the purchase screens for each tank
230 762C CallPurchaseForEveryTank
231 762C A9 02 8D C6 02 mva #$2 colpf2s ; set normal color
232 7631 A9 10 8D 30 02 A9 + mwa #PurchaseDL dlptrs
233 763B AD 2F 02 lda dmactls
234 763E 29 FC and #$fc
235 7640 09 02 ora #$02 ; normal screen width
236 7642 8D 2F 02 sta dmactls
237
238 7645 A9 00 85 8B mva #0 TankNr
239 7649 loop03
240 7649 A6 8B ldx TankNr
241 764B BD 20 3D lda SkillTable,x
242 764E F0 06 beq ManualPurchase
243 7650 20 D6 8D jsr PurchaseAI
244 7653 4C 59 76 jmp AfterManualPurchase
245
246 7656 ManualPurchase
247 7656 20 63 76 jsr Purchase
248 7659 AfterManualPurchase
249
250 7659 E6 8B inc TankNr
251 765B A5 8B lda TankNr
252 765D CD 19 3D cmp NumberOfPlayers
253 7660 D0 E7 bne loop03
254 7662 60 rts
255
256 ;--------------------------------------------------
257 7663 Purchase ;
258 ;--------------------------------------------------
259 ; In tanknr there is a number of the tank (player)
260 ; that is buying weapons now (from 0).
261 ; Rest of the data is taken from appropriate tables
262 ; and during the purchase these tables are modified.
263
264
265 7663 A9 E3 8D 1D 30 A9 + mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons
266 766D 20 66 72 jsr PMoutofScreen
267
268 ; we are clearing list of the weapons
269 7670 A9 FF 8D 11 3F mva #$ff LastWeapon
270 7675 A9 00 8D 12 3F mva #$00 WhichList
271 ; offensive weapon - 0, deffensive - 1
272
273 ; there is a tank (player) number in tanknr
274 ; we are displaying name of the player
275
276 767A A8 tay ; from 0 to y
277 767B A5 8B lda tanknr
278 767D 0A asl
279 767E 0A asl
280 767F 0A asl ; 8 chars per name
281 7680 AA tax
282 7681 NextChar03
283 7681 BD 57 3F lda tanksnames,x
284 7684 99 D1 3C sta textbuffer2+8,y
285 7687 E8 inx
286 7688 C8 iny
287 7689 C0 08 cpy #$08
288 768B D0 F4 bne NextChar03
289 ; and we display cash of the given player
290
291 ; here we must jump in after each purchase
292 ; to generate again list of available weapons
293 768D AfterPurchase
294 768D A6 8B ldx tanknr
295 768F BD 2C 3D lda moneyL,x
296 7692 8D 41 3F sta decimal
297 7695 BD 26 3D lda moneyH,x
298 7698 8D 42 3F sta decimal+1
299 769B A9 E6 8D 43 3F A9 + mwa #textbuffer2+29 displayposition
300 76A5 20 5E 7B jsr displaydec
301
302 ; in xbyte there is the address of the line that
303 ; is being processed now
304 76A8 A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte
305 76B0 A2 00 ldx #$00 ; number of the checked weapon
306 76B2 8E 0E 3F stx HowManyOnTheList1 ; amounts of weapons (shells, bullets) in both lists
307 76B5 8E 0F 3F stx HowManyOnTheList2
308 76B8 8E 10 3F stx PositionOnTheList
309
310 ; Creating full list of the available weapons for displaying
311 ; in X there is a number of the weapon to be checked,
312 ; in 'Xbyte' address of the first char in filled screen line
313
314 76BB CreateList
315 ; checking if the weapon of the given number is present
316 76BB BD 19 4C lda WeaponUnits,x
317 76BE D0 03 4C C3 77 jeq NoWeapon
318 ; checking if we can afford buying this weapon
319 76C3 A4 8B ldy tanknr
320 76C5 B9 26 3D lda moneyH,y
321 76C8 DD 99 4B cmp WeaponPriceH,x
322 76CB D0 06 bne CheckWeapon01
323 76CD B9 2C 3D lda moneyL,y
324 76D0 DD D9 4B cmp WeaponPriceL,x
325 76D3 CheckWeapon01
326 76D3 B0 03 4C C3 77 jcc TooLittleCash
327
328 ; we have enough cash and the weapon can be
329 ; added to the list
330 76D8 86 91 stx temp ; number of weapon will be necessary later
331
332 ; first parentheses and other special chars
333 ; (it's easier this way)
334 76DA A0 16 ldy #22
335 76DC A9 08 lda #08 ; "("
336 76DE 91 84 STA (XBYTE),y
337 76E0 A0 20 ldy #32
338 76E2 A9 09 lda #09 ; ")"
339 76E4 91 84 sta (xbyte),y
340 76E6 A0 19 ldy #25
341 76E8 A9 0F lda #15 ; "/"
342 76EA 91 84 sta (xbyte),y
343 76EC C8 iny
344 76ED A9 04 lda #04 ; "$"
345 76EF 91 84 sta (xbyte),y
346 76F1 A0 1F ldy #31
347 76F3 A9 10 lda #16 ; "0"
348 76F5 91 84 sta (xbyte),y
349
350 ; now symbol of the weapon
351 76F7 BD 59 4C lda WeaponSymbols,x
352 76FA A0 04 ldy #$4 ; 4 chars from the beginning of the line
353 76FC 91 84 sta (xbyte),y
354
355 ;now number of purchased units (bullets)
356 76FE 18 clc
357 76FF A5 84 lda xbyte
358 7701 69 17 adc #23 ; 23 chars from the beginning of the line
359 7703 8D 43 3F sta displayposition
360 7706 A5 85 lda xbyte+1
361 7708 69 00 adc #$00
362 770A 8D 44 3F sta displayposition+1
363 770D BD 19 4C lda WeaponUnits,x
364 7710 8D 41 3F sta decimal
365 7713 20 C0 7B jsr displaybyte
366 7716 A6 91 ldx temp ;getting back number of the weapon
367
368 ; and now price of the weapon
369 7718 18 clc
370 7719 A5 84 lda xbyte
371 771B 69 1B adc #27 ; 27 chars from the beginning of the line
372 771D 8D 43 3F sta displayposition
373 7720 A5 85 lda xbyte+1
374 7722 69 00 adc #$00
375 7724 8D 44 3F sta displayposition+1
376 7727 BD D9 4B lda WeaponPriceL,x
377 772A 8D 41 3F sta decimal
378 772D BD 99 4B lda WeaponPriceH,x
379 7730 8D 42 3F sta decimal+1
380 7733 20 5E 7B jsr displaydec
381
382 7736 A5 91 lda temp ;getting back number of the weapon
383 7738 48 pha ;and saving it on the stack
384
385 7739 20 E5 71 jsr HowManyBullets
386 773C 8D 41 3F sta decimal
387
388 773F 68 pla
389 7740 85 91 sta temp ; let's store weapon number again
390
391 7742 18 clc
392 7743 A5 84 lda xbyte
393 7745 69 01 adc #1 ; 1 char from the beginning of the screen
394 7747 8D 43 3F sta displayposition
395 774A A5 85 lda xbyte+1
396 774C 69 00 adc #$00
397 774E 8D 44 3F sta displayposition+1
398 7751 20 C0 7B jsr displaybyte
399
400 ; and now name of the weapon and finisheeeedd !!!!
401 7754 A6 91 ldx temp ;weapon number
402 7756 A9 00 85 92 mva #0 temp+1 ; this number is only in X
403 ; times 16 (it's length of the names of weapons)
404 775A A0 03 ldy #3 ; Rotate 4 times
405 775C Rotate02
406 775C 06 91 asl temp
407 775E 26 92 rol temp+1
408 7760 88 dey
409 7761 10 F9 bpl Rotate02
410 ; Hmmm..... Interesting why there is no CLC here?
411
412 7763 18 A5 91 69 99 85 + adw temp #NamesOfWeapons modify
413 7770 38 A5 B2 E9 06 85 + sbw modify #6 ; from 6th char
414
415 777B A0 06 ldy #6 ; from 6th char
416
417 777D modyf1
418 777D B1 B2 lda (modify),y
419 777F 91 84 sta (xbyte),y
420 7781 C8 iny
421 7782 C0 16 cpy #(16+6)
422 7784 D0 F7 bne modyf1
423
424
425 ; in X there is what we need
426
427 ; If on screen after the purchase there is still
428 ; present the weapon purchased recently,
429 ; the pointer must point to it.
430
431 7786 EC 11 3F cpx LastWeapon
432 7789 D0 14 bne NotTheSameAsLastTime
433 778B AD 12 3F lda WhichList
434 778E D0 09 bne ominx06
435 7790 AD 0E 3F lda HowManyOnTheList1
436 7793 8D 10 3F sta PositionOnTheList
437 7796 4C 9F 77 jmp NotTheSameAsLastTime
438 7799 ominx06
439 7799 AD 0F 3F lda HowManyOnTheList2
440 779C 8D 10 3F sta PositionOnTheList
441 779F NotTheSameAsLastTime
442 ; increase appropriate counter
443 779F 8A txa
444 77A0 E0 30 cpx #$30
445 77A2 B0 0B bcs SecondList
446 77A4 AC 0E 3F ldy HowManyOnTheList1
447 77A7 99 D6 3E sta NubersOfWeaponsL1,y
448 77AA EE 0E 3F inc HowManyOnTheList1
449 77AD D0 09 bne NextLineOfTheList
450 77AF SecondList
451 77AF AC 0F 3F ldy HowManyOnTheList2
452 77B2 99 FE 3E sta NubersOfWeaponsL2,y
453 77B5 EE 0F 3F inc HowManyOnTheList2
454 ; If everything is copied then next line
455 77B8 NextLineOfTheList
456 77B8 18 clc
457 77B9 A5 84 lda xbyte
458 77BB 69 28 adc #40
459 77BD 85 84 sta xbyte
460 77BF 90 02 bcc TooLittleCash
461 77C1 E6 85 inc xbyte+1
462 77C3 TooLittleCash
463 77C3 NoWeapon
464
465 ; next weapon. If no more weapons then finish!
466 77C3 E8 inx
467 77C4 E0 30 cpx #$30
468 77C6 D0 08 bne NoDefense
469
470 ; if we got to the defense weapons,
471 ; we switch address to the second table.
472 77C8 A9 83 85 84 A9 39 + mwa #ListOfDefensiveWeapons xbyte
473 77D0 NoDefense
474 77D0 E0 40 cpx #$40
475 77D2 F0 03 4C BB 76 jne CreateList
476
477 ; offset may be only too big
478 ; (because after purchase list will never be longer)
479 ; check it and modify if necessary.
480 ; If offset is larger than position of the pointer,
481 ; it must be equal.
482 77D7 AD 10 3F lda PositionOnTheList
483 77DA CD 13 3F cmp OffsetDL1
484 77DD B0 03 bcs WeHaveOffset ; do not modify offset
485 77DF 8D 13 3F sta OffsetDL1
486 77E2 WeHaveOffset
487
488 ; now we have to erase empty position of both lists.
489
490 ; Multiply number on list 1 by 40 and set address
491 ; of the first erased char.
492 ; (multiplying taken from book of Ruszczyc 'Assembler 6502'
493
494 77E2 AD 0E 3F lda HowManyOnTheList1
495 77E5 85 85 sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway)
496 77E7 A9 00 lda #$00 ; higher byte of the Result
497 77E9 85 84 sta xbyte ; lower byte of the Result
498 77EB A2 08 ldx #$08
499 77ED Rotate04
500 77ED 46 85 lsr xbyte+1
501 77EF 90 03 bcc DoNotAddX01
502 77F1 18 clc
503 77F2 69 28 adc #40
504 77F4 DoNotAddX01
505 77F4 6A ror
506 77F5 66 84 ror xbyte
507 77F7 CA dex
508 77F8 D0 F3 bne Rotate04
509 77FA 85 85 sta xbyte+1
510
511 ; add to the address of the list
512 77FC 18 clc
513 77FD A5 84 lda xbyte
514 77FF 69 E3 adc #<ListOfWeapons
515 7801 A8 tay
516 7802 A5 85 lda xbyte+1
517 7804 69 33 adc #>ListOfWeapons
518 7806 85 85 sta xbyte+1
519 7808 86 84 stx xbyte
520 780A 8A txa ; now there is zero here
521 780B ClearList1
522 780B 91 84 sta (xbyte),y
523 780D C8 iny
524 780E D0 02 bne DoNotIncHigher1
525 7810 E6 85 inc xbyte+1
526 7812 DoNotIncHigher1
527 7812 C0 83 cpy #<ListOfWeapons1End
528 7814 D0 F5 bne ClearList1
529 7816 A6 85 ldx xbyte+1
530 7818 E0 39 cpx #>ListOfWeapons1End
531 781A D0 EF bne ClearList1
532
533 ; And the same we do with the second list
534
535 ; Multiply number on list 1 by 40 and set address
536 ; of the first erased char.
537 781C AD 0F 3F lda HowManyOnTheList2
538 781F 85 85 sta xbyte+1 ; multiplier
539 7821 A9 00 lda #$00 ; higher byte of the Result
540 7823 85 84 sta xbyte ; lower byte of the Result
541 7825 A2 08 ldx #$08
542 7827 Rotate05
543 7827 46 85 lsr xbyte+1
544 7829 90 03 bcc DoNotAddX02
545 782B 18 clc
546 782C 69 28 adc #40
547 782E DoNotAddX02
548 782E 6A ror
549 782F 66 84 ror xbyte
550 7831 CA dex
551 7832 D0 F3 bne Rotate05
552 7834 85 85 sta xbyte+1
553
554 ; add to the address of the list
555 7836 18 clc
556 7837 A5 84 lda xbyte
557 7839 69 83 adc #<ListOfDefensiveWeapons
558 783B A8 tay
559 783C A5 85 lda xbyte+1
560 783E 69 39 adc #>ListOfDefensiveWeapons
561 7840 85 85 sta xbyte+1
562 7842 86 84 stx xbyte
563 7844 8A txa ; now there is zero here
564 7845 ClearList2
565 7845 91 84 sta (xbyte),y
566 7847 C8 iny
567 7848 D0 02 bne DoNotIncHigher2
568 784A E6 85 inc xbyte+1
569 784C DoNotIncHigher2
570 784C C0 03 cpy #<ListOfDefensiveWeaponsEnd
571 784E D0 F5 bne ClearList2
572 7850 A6 85 ldx xbyte+1
573 7852 E0 3C cpx #>ListOfDefensiveWeaponsEnd
574 7854 D0 EF bne ClearList2
575
576 ; here we have pretty cool lists and there is no brute force
577 ; screen clearing at each list refresh
578 ; (it was very ugly - I checked it :)
579
580
581 ; Here we have all we need
582 ; So choose the weapon for purchase ......
583 ;--------------------------------------------------
584 7856 ChoosingItemForPurchase
585 ;--------------------------------------------------
586 7856 20 6A 79 jsr PutLitteChar ; Places pointer at the right position
587 7859 20 76 74 jsr getkey
588 785C C9 2C cmp #$2c ; Tab
589 785E D0 03 4C E4 78 jeq ListChange
590 7863 C9 0C cmp #$0c ; Return
591 7865 F0 0F beq EndOfPurchase
592 7867 C9 0E cmp #$e
593 7869 F0 0C beq PurchaseKeyUp
594 786B C9 0F cmp #$f
595 786D F0 32 beq PurchaseKeyDown
596 786F C9 21 cmp #$21 ; Space
597 7871 D0 E3 bne ChoosingItemForPurchase
598 7873 4C 10 79 jmp PurchaseWeaponNow
599 7876 EndOfPurchase
600 7876 60 rts
601 7877 PurchaseKeyUp
602 7877 AD 12 3F lda WhichList
603 787A F0 0D beq GoUp1
604 787C CE 10 3F dec PositionOnTheList
605 787F 10 1D bpl EndUpX
606 7881 A9 00 lda #$00
607 7883 8D 10 3F sta PositionOnTheList
608 7886 4C 56 78 jmp ChoosingItemForPurchase
609 7889 GoUp1
610 7889 CE 10 3F dec PositionOnTheList
611 788C 10 05 bpl MakeOffsetUp
612 788E A9 00 lda #$00
613 7890 8D 10 3F sta PositionOnTheList
614
615 7893 MakeOffsetUp
616 ; If offset is larger than pointer position,
617 ; it must be equal then.
618 7893 AD 10 3F lda PositionOnTheList
619 7896 CD 13 3F cmp OffsetDL1
620 7899 B0 03 bcs EndUpX ; do not modify the offset
621 789B 8D 13 3F sta OffsetDL1
622 789E EndUpX
623 789E 4C 56 78 jmp ChoosingItemForPurchase
624 78A1 PurchaseKeyDown
625 78A1 AD 12 3F lda WhichList
626 78A4 F0 15 beq GoDown1
627 78A6 EE 10 3F inc PositionOnTheList
628 78A9 AD 10 3F lda PositionOnTheList
629 78AC CD 0F 3F cmp HowManyOnTheList2
630 78AF D0 30 bne EndGoDownX
631 78B1 AC 0F 3F ldy HowManyOnTheList2
632 78B4 88 dey
633 78B5 8C 10 3F sty PositionOnTheList
634 78B8 4C 56 78 jmp ChoosingItemForPurchase
635 78BB GoDown1
636 78BB EE 10 3F inc PositionOnTheList
637 78BE AD 10 3F lda PositionOnTheList
638 78C1 CD 0E 3F cmp HowManyOnTheList1
639 78C4 D0 07 bne MakeOffsetDown
640 78C6 AC 0E 3F ldy HowManyOnTheList1
641 78C9 88 dey
642 78CA 8C 10 3F sty PositionOnTheList
643 78CD MakeOffsetDown
644 78CD AD 13 3F lda OffsetDL1
645 78D0 18 clc
646 78D1 69 0F adc #15
647 ;if offset+16 is lower than the position then it must =16
648 78D3 CD 10 3F cmp PositionOnTheList
649 78D6 B0 09 bcs EndGoDownX
650 78D8 38 sec
651 78D9 AD 10 3F lda PositionOnTheList
652 78DC E9 0F sbc #15
653 78DE 8D 13 3F sta OffsetDL1
654 78E1 EndGoDownX
655 78E1 4C 56 78 jmp ChoosingItemForPurchase
656
657 ; swapping the displayed list and setting pointer to position 0
658 78E4 ListChange
659 78E4 AD 12 3F lda WhichList
660 78E7 49 01 eor #$01
661 78E9 8D 12 3F sta WhichList
662 78EC D0 0D bne SecondSelected
663 78EE A9 E3 8D 1D 30 A9 + mwa #ListOfWeapons WeaponsListDL
664 78F8 4C 05 79 jmp dalejx01
665 78FB SecondSelected
666 78FB A9 83 8D 1D 30 A9 + mwa #ListOfDefensiveWeapons WeaponsListDL
667 7905 dalejx01
668 7905 A9 00 lda #$00
669 7907 8D 10 3F sta PositionOnTheList
670 790A 8D 13 3F sta OffsetDL1
671 790D 4C 56 78 jmp ChoosingItemForPurchase
672
673 ; weapon purchase routne increases number of possessed bullets
674 ; decreases cash and jumps to screen refresh
675 ;--------------------------------------------------
676 7910 PurchaseWeaponNow
677 ;--------------------------------------------------
678 7910 AD 12 3F lda WhichList
679 7913 D0 09 bne PurchaseDeffensive
680
681 ; here we purchase the offensive weapon
682 7915 AC 10 3F ldy PositionOnTheList
683 7918 B9 D6 3E lda NubersOfWeaponsL1,y
684 791B 4C 24 79 jmp PurchaseAll
685 791E PurchaseDeffensive
686 791E AC 10 3F ldy PositionOnTheList
687 7921 B9 FE 3E lda NubersOfWeaponsL2,y
688 7924 PurchaseAll
689 ; after getting weapon number the routine is common for all
690 7924 A6 8B ldx tanknr
691 7926 A8 tay ; weapon number is in Y
692 7927 38 sec
693 7928 BD 2C 3D lda moneyL,x ; substracting from posessed money
694 792B F9 D9 4B sbc WeaponPriceL,y ; of price of the given weapon
695 792E 9D 2C 3D sta moneyL,x
696 7931 BD 26 3D lda moneyH,x
697 7934 F9 99 4B sbc WeaponPriceH,y
698 7937 9D 26 3D sta moneyH,x
699 ; now we have get address of
700 ; the table of the weapon of the tank
701 ; and add appropriate number of bullets
702 793A 86 91 stx temp ;we will multiply by 64
703 793C A9 00 85 92 mva #0 temp+1
704 ; times 64
705 ; (because it is the lenght of one record in weapon table)
706 7940 A2 05 ldx #5 ; Rotate 6 times
707 ; (in Y there is a weapon number, we do not touch it!!!)
708 7942 Rotate03
709 7942 06 91 asl temp
710 7944 26 92 rol temp+1
711 7946 CA dex
712 7947 10 F9 bpl Rotate03
713 7949 A9 87 lda #<TanksWeapon1
714 794B 65 91 adc temp
715 794D 85 91 sta temp
716 794F A9 3F lda #>TanksWeapon1
717 7951 65 92 adc temp+1
718 7953 85 92 sta temp+1
719
720 7955 B1 91 lda (temp),y ; and we have number of posessed bullets of the weapon
721 7957 79 19 4C adc WeaponUnits,y
722 795A 91 91 sta (temp),y ; and we added appropriate number of bullets
723 795C C9 64 cmp #100 ; but there should be no more than 99 bullets
724 795E 90 04 bcc LessThan100
725 7960 A9 63 lda #99
726 7962 91 91 sta (temp),y
727 7964 LessThan100
728 7964 8C 11 3F sty LastWeapon ; store last purchased weapon
729 ; because we must put screen pointer next to it
730 7967 4C 8D 76 jmp AfterPurchase
731
732
733 796A PutLitteChar
734 ; first let's cleat both lists from little chars
735 796A A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte
736 7972 A2 34 ldx #52 ; there are 52 lines total
737 7974 A0 00 ldy #$00
738 7976 EraseLoop
739 7976 A9 00 lda #$00
740 7978 91 84 sta (xbyte),y
741 797A 18 clc
742 797B A5 84 lda xbyte
743 797D 69 28 adc #40
744 797F 85 84 sta xbyte
745 7981 90 02 bcc ominx02
746 7983 E6 85 inc xbyte+1
747 7985 ominx02
748 7985 CA dex
749 7986 10 EE bpl EraseLoop
750 ; now let's check which list is active now
751 7988 AD 12 3F lda WhichList
752 798B F0 30 beq CharToList1
753 ; we are on the second list (deffensive)
754 ; so there is no problem with scrolling
755 798D A9 83 85 84 A9 39 + mwa #ListOfDefensiveWeapons xbyte
756 7995 AE 10 3F ldx PositionOnTheList
757 7998 F0 0E beq SelectList2 ; if there is 0 we add nothing
758 799A AddLoop2
759 799A 18 clc
760 799B A5 84 lda xbyte
761 799D 69 28 adc #40
762 799F 85 84 sta xbyte
763 79A1 90 02 bcc ominx03
764 79A3 E6 85 inc xbyte+1
765 79A5 ominx03
766 79A5 CA dex
767 79A6 D0 F2 bne AddLoop2
768 79A8 SelectList2
769 79A8 A9 7F lda #$7f ; little char (tab) - this is the pointer
770 79AA 91 84 sta (xbyte),y
771 ; now we clear flags of presence of list "out of screen"
772 ; unfortunately I am now sure what it means... :(
773 79AC A2 51 ldx #<EmptyLine
774 79AE A0 3C ldy #>EmptyLine
775 79B0 8E 19 30 stx MoreUpdl
776 79B3 8C 1A 30 sty MoreUpdl+1
777 79B6 8E 3F 30 stx MoreDowndl
778 79B9 8C 40 30 sty MoreDowndl+1
779 79BC 60 rts
780 79BD CharToList1
781 ; we putchar on list 1
782 ; and later set-up list itself
783 79BD A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte
784 79C5 AE 10 3F ldx PositionOnTheList
785 79C8 F0 0E beq SelectList1 ; if there is 0 we add nothing
786 79CA AddLoop1
787 79CA 18 clc
788 79CB A5 84 lda xbyte
789 79CD 69 28 adc #40
790 79CF 85 84 sta xbyte
791 79D1 90 02 bcc ominx04
792 79D3 E6 85 inc xbyte+1
793 79D5 ominx04
794 79D5 CA dex
795 79D6 D0 F2 bne AddLoop1
796 79D8 SelectList1
797 79D8 A9 7F lda #$7f ; pointer = little char = (tab)
798 79DA 91 84 sta (xbyte),y
799 ; now moving the window basing on given offset
800 79DC A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte
801 79E4 AE 13 3F ldx OffsetDL1
802 79E7 F0 0E beq SetWindowList1 ; if zero then add nothing
803 79E9 LoopWindow1
804 79E9 18 clc
805 79EA A5 84 lda xbyte
806 79EC 69 28 adc #40
807 79EE 85 84 sta xbyte
808 79F0 90 02 bcc ominx05
809 79F2 E6 85 inc xbyte+1
810 79F4 ominx05
811 79F4 CA dex
812 79F5 D0 F2 bne LoopWindow1
813 79F7 SetWindowList1
814 79F7 A5 84 8D 1D 30 A5 + mwa xbyte WeaponsListDL ; and we change Display List
815
816 ; we show screen line with arrows meaning that
817 ; you can scroll the list up
818 7A01 A2 51 ldx #<EmptyLine
819 7A03 A0 3C ldy #>EmptyLine
820 7A05 AD 13 3F lda OffsetDL1
821 7A08 F0 04 beq NoArrowUp
822 7A0A A2 93 ldx #<MoreUp
823 7A0C A0 33 ldy #>MoreUp
824 7A0E NoArrowUp
825 7A0E 8E 19 30 stx MoreUpdl
826 7A11 8C 1A 30 sty MoreUpdl+1
827 ; the same, bu scrolling down
828 7A14 AD 0E 3F lda HowManyOnTheList1
829 7A17 A2 51 ldx #<EmptyLine
830 7A19 A0 3C ldy #>EmptyLine
831 7A1B 38 sec
832 7A1C E9 11 sbc #17
833 7A1E 30 09 bmi NoArrowDown
834 7A20 CD 13 3F cmp OffsetDL1
835 7A23 90 04 bcc NoArrowDown
836 7A25 A2 BB ldx #<MoreDown
837 7A27 A0 33 ldy #>MoreDown
838 7A29 NoArrowDown
839 7A29 8E 3F 30 stx MoreDowndl
840 7A2C 8C 40 30 sty MoreDowndl+1
841 7A2F 60 rts
842
843 ; -----------------------------------------------------
844 7A30 EnterPlayerName
845 ; in: TankNr
846 ; Out: TanksNames, SkillTable
847
848 ; this little thing is for choosing Player's skill (if computer)
849 ; and entering his name
850 ; If no name entered, there should be name "1st Tank", etc.
851 ; Default tanks names are in table TanksNamesDefault
852 ; -----------------------------------------------------
853
854 7A30 20 66 72 jsr PMoutofScreen
855 ; display tank number
856 7A33 A6 8B ldx tanknr
857 7A35 E8 inx
858 7A36 8E 41 3F stx decimal
859 7A39 A9 BC 8D 43 3F A9 + mwa #(NameScreen+41) displayposition
860 7A43 20 C0 7B jsr displaybyte
861 7A46 20 33 7B jsr SelectLevel ; setting choosen level of the opponent (Moron, etc)
862 ; clear the name and place cursor at position 0
863 7A49 A9 00 lda #0
864 7A4B 8D 2D 3F sta PositionInName
865 7A4E A2 08 ldx #$08 ; one more because cursor could be there
866 7A50 LoopName01
867 7A50 9D C7 32 sta NameAdr,x
868 7A53 CA dex
869 7A54 D0 FA bne LoopName01
870 7A56 A9 80 lda #$80 ; place cursor on the beginning
871 7A58 8D C7 32 sta NameAdr
872 7A5B CheckKeys
873 7A5B 20 76 74 jsr getkey
874 ; is if the char to be recorded?
875 7A5E A2 25 ldx #37 ; table is 38 chars long
876 7A60 IsLetter
877 7A60 DD AF 3D cmp keycodes,x
878 7A63 F0 05 beq YesLetter
879 7A65 CA dex
880 7A66 10 F8 bpl IsLetter
881 7A68 30 1D bmi CheckFurtherX01 ; if not in the table
882 ; we check cursors and (Return)
883 7A6A YesLetter
884 7A6A BD D5 3D lda scrcodes,x ; we have screen code of the char
885 7A6D AE 2D 3F ldx PositionInName
886 7A70 D0 02 bne NotFirstLetter
887 7A72 29 3F and #$3f ; First letter should be Capital letter
888 ; (nice trick does not affect digits)
889 7A74 NotFirstLetter
890 7A74 9D C7 32 sta NameAdr,x
891 7A77 E8 inx
892 7A78 A9 80 lda #$80 ; cursor behind the char
893 7A7A 9D C7 32 sta NameAdr,x
894 7A7D E0 08 cpx #$08 ; is there 8 characters?
895 7A7F F0 DA beq CheckKeys ; if so, nothing increased
896 7A81 8E 2D 3F stx PositionInName ; if not, we store
897 ; position incremented by 1
898
899 7A84 4C 5B 7A jmp CheckKeys
900 7A87 CheckFurtherX01 ; here we check Tab, Return and Del
901 7A87 C9 0C cmp #$0c ; Return
902 7A89 F0 76 beq EndOfNick
903 7A8B C9 2C cmp #$2c ; Tab
904 7A8D F0 29 beq ChangeOfLevelUp
905 7A8F C9 07 cmp #$7 ;cursor right
906 7A91 F0 25 beq ChangeOfLevelUp
907 7A93 C9 06 cmp #$6 ;cursor left
908 7A95 F0 36 beq ChangeOfLevelDown
909 7A97 C9 0F cmp #$f ;cursor down
910 7A99 F0 45 beq ChangeOfLevel3Up
911
912 7A9B C9 34 cmp #$34 ; Backspace (del)
913 7A9D D0 BC bne CheckKeys
914 ; handling backing one char
915 7A9F AE 2D 3F ldx PositionInName
916 7AA2 F0 01 beq FirstChar
917 7AA4 CA dex
918 7AA5 FirstChar
919 7AA5 A9 80 lda #$80
920 7AA7 9D C7 32 sta NameAdr,x
921 7AAA A9 00 lda #$00
922 7AAC 9D C8 32 sta NameAdr+1,x
923 7AAF 9D C9 32 sta NameAdr+2,x
924 7AB2 8E 2D 3F stx PositionInName
925 7AB5 4C 5B 7A jmp CheckKeys
926 7AB8 ChangeOfLevelUp ; change difficulty level of computer opponent
927 7AB8 EE 2E 3F AD 2E 3F inc:lda DifficultyLevel
928 7ABE C9 09 cmp #9 ; 9 levels are possible
929 7AC0 D0 05 bne DoNotLoopLevelUp
930 7AC2 A9 00 8D 2E 3F mva #$0 DifficultyLevel
931 7AC7 DoNotLoopLevelUp
932 7AC7 20 33 7B jsr SelectLevel
933 7ACA 4C 5B 7A jmp CheckKeys
934 ;----
935 7ACD ChangeOfLevelDown
936 7ACD CE 2E 3F AD 2E 3F dec:lda DifficultyLevel
937 7AD3 10 05 bpl DoNotLoopLevelDown
938 7AD5 A9 08 8D 2E 3F mva #$8 DifficultyLevel
939 7ADA DoNotLoopLevelDown
940 7ADA 20 33 7B jsr SelectLevel
941 7ADD 4C 5B 7A jmp CheckKeys
942 ;----
943 7AE0 ChangeOfLevel3Up
944 ;adw DifficultyLevel #3
945 7AE0 18 clc
946 7AE1 AD 2E 3F lda DifficultyLevel
947 7AE4 69 03 adc #3
948 7AE6 8D 2E 3F sta DifficultyLevel
949
950 7AE9 C9 09 cmp #9
951 7AEB 90 0E bcc DoNotLoopLevel3Up
952
953 7AED 38 AD 2E 3F E9 09 + sbw DifficultyLevel #9
954
955 7AFB DoNotLoopLevel3Up
956 7AFB 20 33 7B jsr SelectLevel
957 7AFE 4C 5B 7A jmp CheckKeys
958 ;----
959 7B01 EndOfNick
960 ; storing name of the player and its level
961
962 ; level of the computer opponent goes to
963 ; the table of levels (difficulties)
964 7B01 A6 8B ldx tanknr
965 7B03 AD 2E 3F lda DifficultyLevel
966 7B06 9D 20 3D sta skilltable,x
967 ; storing name of the tank in the right space
968 ; (without cursor!)
969 7B09 A0 00 ldy #$00
970 7B0B 8A txa ; ldx TankNr
971 7B0C 0A asl
972 7B0D 0A asl
973 7B0E 0A asl ; 8 chars per name
974 7B0F AA tax ; in X where to put new name
975
976 7B10 AD C7 32 lda NameAdr ; check if first char is " "
977 7B13 29 7F and #$7F ; remove inverse (Cursor)
978 7B15 F0 0F beq MakeDefaultName
979
980 7B17 nextchar04
981 7B17 B9 C7 32 lda NameAdr,y
982 7B1A 29 7F and #$7f ; remove inverse (Cursor)
983 7B1C 9D 57 3F sta tanksnames,x
984 7B1F E8 inx
985 7B20 C8 iny
986 7B21 C0 08 cpy #$08
987 7B23 D0 F2 bne nextchar04
988 7B25 60 rts
989 7B26 MakeDefaultName
990 7B26 nextchar05
991 7B26 BD 69 4B lda tanksnamesDefault,x
992 7B29 9D 57 3F sta tanksnames,x
993 7B2C E8 inx
994 7B2D C8 iny
995 7B2E C0 08 cpy #$08
996 7B30 D0 F4 bne nextchar05
997 7B32 60 rts
998
999
1000
1001
1002 7B33 SelectLevel
1003 ; this routine highlights the choosen
1004 ; level of the computer opponent
1005 7B33 A2 09 ldx #$9 ; 9 possible levels
1006 7B35 CheckNextLevel01
1007 7B35 BD 2F 3F lda LevelNameBeginL,x ; address on the screen
1008 7B38 85 91 sta temp
1009 7B3A BD 38 3F lda LevelNameBeginH,x
1010 7B3D 85 92 sta temp+1
1011 7B3F A0 09 ldy #9 ; flip 10 chars to inverse video
1012 7B41 EC 2E 3F cpx DifficultyLevel ; is it the choosen level?
1013 7B44 D0 0B bne NotThisLevel
1014 ; change to inverse, because it is it!
1015 7B46 InverseFurther
1016 7B46 B1 91 lda (temp),y
1017 7B48 09 80 ora #$80
1018 7B4A 91 91 sta (temp),y
1019 7B4C 88 dey
1020 7B4D 10 F7 bpl InverseFurther
1021 7B4F 30 09 bmi CheckNextLevel ; Check Next Level
1022 7B51 NotThisLevel
1023 7B51 B1 91 lda (temp),y
1024 7B53 29 7F and #$7f
1025 7B55 91 91 sta (temp),y
1026 7B57 88 dey
1027 7B58 10 F7 bpl NotThisLevel
1028 7B5A CheckNextLevel
1029 7B5A CA dex
1030 7B5B 10 D8 bpl CheckNextLevel01
1031 7B5D 60 rts
1032 ;--------------------------------------------------
1033 7B5E displaydec ;decimal (word), displayposition (word)
1034 ;--------------------------------------------------
1035 ; displays decimal number as in parameters (in text mode)
1036 ; leading zeores are removed
1037 ; the range is (0000..9999 - two bytes)
1038
1039 7B5E A0 03 ldy #3 ; there will be 4 digits
1040 7B60 NextDigit
1041 7B60 A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times
1042 7B62 A9 00 lda #$00
1043 7B64 Rotate000
1044 7B64 aslw decimal
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7B64 0E 41 3F ASL DECIMAL
2 7B67 2E 42 3F ROL DECIMAL+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1045 7B6A 2A rol ; scroll dividee
1046 ; (as highest byte - additional - byte is A)
1047 7B6B C9 0A cmp #10 ; divider
1048 7B6D 90 05 bcc TooLittle000 ; if A is smaller than divider
1049 ; there is nothing to substract
1050 7B6F E9 0A sbc #10 ; divider
1051 7B71 EE 41 3F inc decimal ; lowest bit set to 1
1052 ; because it is 0 and this is the fastest way
1053 7B74 CA TooLittle000 dex
1054 7B75 D0 ED bne Rotate000 ; and Rotate 16 times, Result will be in decimal
1055 7B77 AA tax ; and the rest in A
1056 ; (and it goes to X because
1057 ; it is our decimal digit)
1058 7B78 BD 03 7C lda digits,x
1059 7B7B 99 45 3F sta decimalresult,y
1060 7B7E 88 dey
1061 7B7F 10 DF bpl NextDigit ; Result again /10 and we have next digit
1062
1063
1064 7B81 rightnumber
1065 ; now cut leading zeroes (002 goes 2)
1066 7B81 AD 45 3F lda decimalresult
1067 7B84 CD 0D 7C cmp zero
1068 7B87 D0 22 bne decimalend
1069 7B89 AD 0F 7C lda space
1070 7B8C 8D 45 3F sta decimalresult
1071
1072 7B8F AD 46 3F lda decimalresult+1
1073 7B92 CD 0D 7C cmp zero
1074 7B95 D0 14 bne decimalend
1075 7B97 AD 0F 7C lda space
1076 7B9A 8D 46 3F sta decimalresult+1
1077
1078 7B9D AD 47 3F lda decimalresult+2
1079 7BA0 CD 0D 7C cmp zero
1080 7BA3 D0 06 bne DecimalEnd
1081 7BA5 AD 0F 7C lda space
1082 7BA8 8D 47 3F sta decimalresult+2
1083
1084 7BAB DecimalEnd
1085 ; displaying
1086 7BAB AD 43 3F 85 B2 AD + mwa displayposition modify
1087 7BB5 A0 03 ldy #3
1088 7BB7 displayloop
1089 7BB7 B9 45 3F lda decimalresult,y
1090 7BBA 91 B2 sta (modify),y
1091 7BBC 88 dey
1092 7BBD 10 F8 bpl displayloop
1093
1094 7BBF 60 rts
1095
1096
1097 ;--------------------------------------------------
1098 7BC0 displaybyte ;decimal (byte), displayposition (word)
1099 ;--------------------------------------------------
1100 ; displays decimal number as in parameters (in text mode)
1101 ; leading zeores are removed
1102 ; the range is (00..99 - one byte)
1103
1104 7BC0 A0 01 ldy #1 ; there will be 2 digits
1105 7BC2 NextDigit2
1106 7BC2 A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times
1107 7BC4 A9 00 lda #$00
1108 7BC6 Rotate001
1109 7BC6 0E 41 3F asl decimal
1110 7BC9 2A rol ; scroll dividee
1111 ; (as highest byte - additional - byte is A)
1112 7BCA C9 0A cmp #10 ; divider
1113 7BCC 90 05 bcc TooLittle001 ; if A is smaller than divider
1114 ; there is nothing to substract
1115 7BCE E9 0A sbc #10 ; divider
1116 7BD0 EE 41 3F inc decimal ; because it is 0 and this is the fastest way
1117 7BD3 CA TooLittle001 dex
1118 7BD4 D0 F0 bne Rotate001 ; and Rotate 8 times, Result will be in decimal
1119 7BD6 AA tax ; and the rest in A
1120 ; (and it goes to X because
1121 ; it is our decimal digit)
1122 7BD7 BD 03 7C lda digits,x
1123 7BDA 99 45 3F sta decimalresult,y
1124 7BDD 88 dey
1125 7BDE 10 E2 bpl NextDigit2 ; Result again /10 and we have next digit
1126
1127 ; now cut leading zeroes (02 goes 2)
1128 7BE0 AD 45 3F lda decimalresult
1129 7BE3 CD 0D 7C cmp zero
1130 7BE6 D0 06 bne decimalend1
1131 7BE8 AD 0F 7C lda space
1132 7BEB 8D 45 3F sta decimalresult
1133
1134 7BEE decimalend1
1135 ; displaying
1136 7BEE AD 43 3F 85 B2 AD + mwa displayposition modify
1137 7BF8 A0 01 ldy #1
1138 7BFA displayloop1
1139 7BFA B9 45 3F lda decimalresult,y
1140 7BFD 91 B2 sta (modify),y
1141 7BFF 88 dey
1142 7C00 10 F8 bpl displayloop1
1143
1144 7C02 60 rts
1145 ;-------decimal constans
1146 7C03 10 11 12 13 14 15 + digits dta d"0123456789"
1147 7C0D 10 zero dta d"0"
1148 7C0E nineplus ;.sbyte ('9+1)
1149 7C0E 1A dta d"9"+1
1150 7C0F 00 space dta d" "
1151
1152 ;--------------------------------------------------------
1153 7C10 DisplayOffensiveTextNr ;
1154 ;This routine displays texts using PutChar4x4
1155 ;pretty cool, eh
1156 ;parameters are:
1157 ;Y - number of tank above which text is displayed
1158 ;TextNumber - number of offensive text to display
1159
1160 ;lets calculate position of the text first!
1161 ;that's easy because we have number of tank
1162 ;and xtankstableL and H keep X position of a given tank
1163
1164 7C10 B9 97 3D lda xtankstableL,y
1165 7C13 85 91 sta temp
1166 7C15 B9 9D 3D lda xtankstableH,y
1167 7C18 85 92 sta temp+1
1168 ;now we should substract length of the text
1169 7C1A AE DC 44 ldx TextNumberOff
1170 7C1D BD C9 5A lda talk.OffensiveTextLengths,x
1171 7C20 0A asl
1172 7C21 85 93 sta temp2
1173 7C23 A9 00 85 94 mva #0 temp2+1
1174 ;here we assume max length of text
1175 ;to display is 127 chars!
1176
1177 ;now we have HALF length in pixels
1178 ;stored in temp2
1179 7C27 38 A5 91 E5 93 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!!
1180 ;now we should check overflows
1181 7C34 A5 92 lda temp+1
1182 7C36 10 08 bpl DOTNnotLessThanZero
1183 ;less than zero, so should be zero
1184 7C38 A9 00 85 91 85 92 mwa #0 temp
1185 7C3E F0 30 beq DOTNnoOverflow
1186
1187 7C40 DOTNnotLessThanZero
1188 ;so check if end larger than screenwidth
1189
1190
1191 7C40 BD C9 5A lda talk.OffensiveTextLengths,x
1192 7C43 0A asl
1193 7C44 0A asl
1194 ;length in pixels -
1195 ;text length max 63 chars !!!!!!!!
1196
1197
1198 7C45 18 clc
1199 7C46 65 91 adc temp
1200 7C48 85 93 sta temp2
1201 7C4A A9 00 lda #0
1202 7C4C 65 92 adc temp+1
1203 7C4E 85 94 sta temp2+1
1204 ;now in temp2 is end of the text in pixels
1205 ;so check if not greater than screenwitdth
1206 7C50 A5 94 C9 01 D0 04 + cpw temp2 #screenwidth
1207 7C5A 90 14 bcc DOTNnoOverflow
1208 ;if end is greater than screenwidth
1209 ;then screenwidth - length is fine
1210
1211
1212 7C5C BD C9 5A lda talk.OffensiveTextLengths,x
1213 7C5F 0A asl
1214 7C60 0A asl
1215 7C61 85 91 sta temp
1216
1217 7C63 38 sec
1218 7C64 A9 3F lda #<(screenwidth-1)
1219 7C66 E5 91 sbc temp
1220 7C68 85 91 sta temp
1221 7C6A A9 01 lda #>(screenwidth-1)
1222 7C6C E5 92 sbc temp+1
1223 7C6E 85 92 sta temp+1
1224 7C70 DOTNnoOverflow
1225 ;here in temp we have really good x position of text
1226
1227 7C70 A5 91 8D D6 44 A5 + mwa temp TextPositionX
1228
1229 ;now let's get y position
1230 ;we will try to put text as low as possible
1231 ;just above mountains (so mountaintable will be checked)
1232 7C7A BD C9 5A lda talk.OffensiveTextLengths,x
1233 7C7D 0A asl
1234 7C7E 0A asl
1235 7C7F A8 tay
1236 ;in temp there still is X position of text
1237 ;if we add temp and Y we will get end of the text
1238 ;so, lets go through mountaintable and look for
1239 ;the lowest value within
1240 ;Mountaitable+temp and Mountaitable+temp+Y
1241
1242 7C80 18 A5 91 69 13 85 + adw temp #MountainTable
1243
1244 7C8D A9 C8 85 93 mva #screenheight temp2 ;initialisation of the lowest value
1245
1246 7C91 DOTLowestMountainValueLoop
1247 7C91 B1 91 lda (temp),y
1248 7C93 C5 93 cmp temp2
1249 7C95 B0 02 bcs DOTOldLowestValue ;old lowest value
1250 ;new lowest value
1251 7C97 85 93 sta temp2
1252 7C99 DOTOldLowestValue
1253 7C99 88 dey
1254 7C9A C0 FF cpy #$ff
1255 7C9C D0 F3 bne DOTLowestMountainValueLoop
1256
1257
1258
1259 7C9E 38 sec
1260 7C9F A5 93 lda temp2
1261 7CA1 E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...)
1262 7CA3 8D D8 44 sta TextPositionY
1263
1264
1265 7CA6 BD E5 59 lda talk.OffensiveTextTableL,x
1266 7CA9 8D D9 44 sta TextAddress
1267 7CAC BD 57 5A lda talk.OffensiveTextTableH,x
1268 7CAF 8D DA 44 sta TextAddress+1
1269 7CB2 A9 00 8D DB 44 mva #0 TextCounter
1270 7CB7 DOTNcharloop
1271 7CB7 AD D9 44 85 91 AD + mwa TextAddress temp
1272 7CC1 AC DB 44 ldy TextCounter
1273
1274 7CC4 B1 91 lda (temp),y
1275 7CC6 38 SEC
1276 7CC7 E9 20 sbc #32 ;conversion from ASCII to .sbyte
1277
1278 7CC9 8D 50 48 sta CharCode4x4
1279 7CCC AD DB 44 lda TextCounter
1280 7CCF 0A asl
1281 7CD0 0A asl
1282 7CD1 18 clc
1283 7CD2 6D D6 44 adc TextPositionX
1284 7CD5 85 80 sta Xdraw
1285 7CD7 A9 00 lda #0
1286 7CD9 6D D7 44 adc TextPositionX+1
1287 7CDC 85 81 sta Xdraw+1
1288 7CDE AD D8 44 lda TextPositionY
1289 7CE1 85 82 sta ydraw
1290 7CE3 20 23 8B jsr PutChar4x4
1291
1292 7CE6 EE DB 44 inc TextCounter
1293 7CE9 AE DC 44 ldx TextNumberOff
1294 7CEC BD C9 5A lda talk.OffensiveTextLengths,x
1295 7CEF CD DB 44 cmp TextCounter
1296 7CF2 D0 C3 bne DOTNcharloop
1297
1298 7CF4 60 rts
1299
1300 ;-------------------------------
1301 7CF5 TypeLine4x4 ;
1302 ;-------------------------------
1303 ;this routine prints line ending with $ff
1304 ;address in LineAddress4x4
1305 ;starting from LineXdraw, LineYdraw
1306
1307 7CF5 A0 00 ldy #0
1308 7CF7 8C E0 44 sty LineCharNr
1309
1310
1311 7CFA TypeLine4x4Loop
1312 7CFA AC E0 44 ldy LineCharNr
1313
1314
1315 7CFD AD DE 44 85 91 AD + mwa LineAddress4x4 temp
1316 7D07 B1 91 lda (temp),y
1317 7D09 C9 FF cmp #$ff
1318 7D0B F0 29 beq EndOfTypeLine4x4
1319
1320 7D0D 8D 50 48 sta CharCode4x4
1321 7D10 AD E1 44 85 80 AD + mwa LineXdraw Xdraw
1322 7D1A AD E3 44 85 82 mva LineYdraw Ydraw
1323 7D1F 20 A0 8B jsr PutChar4x4FULL ;type empty pixels as well!
1324 7D22 18 AD E1 44 69 04 + adw LineXdraw #4
1325 7D30 EE E0 44 inc LineCharNr
1326 7D33 4C FA 7C jmp TypeLine4x4Loop
1327
1328 7D36 EndOfTypeLine4x4
1329 7D36 60 rts
1330
1331 ;--------------------------------
1332 7D37 DisplayResults ;
1333 ;displays results of the round
1334 ;using 4x4 font
1335
1336 ;centering the result screen
1337 7D37 A9 84 8D 3D 45 A9 + mwa #((ScreenWidth/2)-(7*4)) ResultX
1338 7D41 A9 44 8D 3F 45 mva #((ScreenHeight/2)-(8*4)) ResultY
1339
1340
1341 ;upper frame
1342 7D46 A9 E4 8D DE 44 A9 + mwa #LineTop LineAddress4x4
1343 7D50 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1344 7D5C AD 3F 45 8D E3 44 mva ResultY LineYdraw
1345 7D62 A9 01 8D 51 48 mva #1 plot4x4color
1346 7D67 20 F5 7C jsr TypeLine4x4
1347
1348 7D6A 18 AD 3F 45 69 04 + adw ResultY #4 ;next line
1349
1350 ;Header1
1351 ;Displays round number
1352 7D78 AD 4B 3F lda CurrentRoundNr
1353 7D7B 8D 41 3F sta decimal
1354 7D7E A9 17 8D 43 3F A9 + mwa #RoundNrDisplay displayposition
1355 7D88 20 C0 7B jsr displaybyte ;decimal (byte), displayposition (word)
1356
1357 7D8B A9 0E 8D DE 44 A9 + mwa #LineHeader1 LineAddress4x4
1358 7D95 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1359 7DA1 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1360 7DA7 A9 01 8D 51 48 mva #1 plot4x4color
1361 7DAC 20 F5 7C jsr TypeLine4x4
1362
1363 7DAF 18 AD 3F 45 69 04 + adw ResultY #4 ;next line
1364
1365 ;Empty line
1366 7DBD A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4
1367 7DC7 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1368 7DD3 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1369 7DD9 A9 01 8D 51 48 mva #1 plot4x4color
1370 7DDE 20 F5 7C jsr TypeLine4x4
1371
1372 7DE1 18 AD 3F 45 69 02 + adw ResultY #2 ;next line
1373
1374
1375 ;Header2
1376 7DEF A9 1C 8D DE 44 A9 + mwa #LineHeader2 LineAddress4x4
1377 7DF9 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1378 7E05 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1379 7E0B A9 01 8D 51 48 mva #1 plot4x4color
1380 7E10 20 F5 7C jsr TypeLine4x4
1381
1382 7E13 18 AD 3F 45 69 04 + adw ResultY #4 ;next line
1383
1384 ;Empty line
1385 7E21 A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4
1386 7E2B AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1387 7E37 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1388 7E3D A9 01 8D 51 48 mva #1 plot4x4color
1389 7E42 20 F5 7C jsr TypeLine4x4
1390
1391 7E45 38 AD 3F 45 E9 02 + sbw ResultY #2 ;next line (was empty)
1392
1393 7E53 AE 19 3D ldx NumberOfPlayers ;we start from the highest (best) tank
1394 7E56 CA dex ;and it is the last one
1395 7E57 8E 40 45 stx ResultOfTankNr ;in TankSequence table
1396
1397 7E5A A9 57 85 95 A9 3F + mwa #TanksNames tempXROLLER
1398
1399 7E62 ResultOfTheNextPlayer
1400 7E62 AE 40 45 ldx ResultOfTankNr ;we are after a round, so we can use TankNr
1401 7E65 BD 1A 3D lda TankSequence,x ;and we keep here real number if the tank
1402 7E68 85 8B sta TankNr ;for which we are displaying results
1403
1404
1405
1406
1407 7E6A 18 AD 3F 45 69 04 + adw ResultY #4 ;next line
1408
1409 ;there are at least 2 players, so we can safely
1410 ;start displaying the result
1411
1412 7E78 A2 00 ldx #0
1413 7E7A A9 03 lda #3 ;it means |
1414 7E7C 9D 2A 45 sta ResultLineBuffer,x
1415
1416
1417 7E7F A5 8B lda TankNr
1418 7E81 0A asl
1419 7E82 0A asl ; times 8, because it is lengtgh
1420 7E83 0A asl ; of the names of the tanks
1421 7E84 A8 tay
1422
1423 7E85 TankNameCopyLoop
1424 7E85 B1 95 lda (tempXROLLER),y ;XROLLER is not working now
1425 7E87 29 3F and #$3f ;always CAPITAL letters
1426 7E89 E8 inx
1427 7E8A 9D 2A 45 sta ResultLineBuffer,x
1428 7E8D C8 iny
1429 7E8E E0 08 cpx #8 ; end of name
1430 7E90 D0 F3 bne TankNameCopyLoop
1431
1432 7E92 E8 inx
1433 7E93 A9 1A lda #26 ;it means ":"
1434 7E95 9D 2A 45 sta ResultLineBuffer,x
1435
1436 7E98 A4 8B ldy TankNr
1437 7E9A B9 5D 3D lda ResultsTable,y
1438 7E9D 8D 41 3F sta decimal
1439 7EA0 A9 34 8D 43 3F A9 + mwa #(ResultLineBuffer+10) displayposition
1440 7EAA 20 C0 7B jsr displaybyte ;decimal (byte), displayposition (word)
1441
1442 7EAD A2 0C ldx #12 ;justafter the digits
1443 7EAF A9 03 lda #3 ;it means |
1444 7EB1 9D 2A 45 sta ResultLineBuffer,x
1445
1446 7EB4 E8 inx
1447 7EB5 A9 FF lda #$ff ;it means end of line
1448 7EB7 9D 2A 45 sta ResultLineBuffer,x
1449
1450
1451
1452 ;result line display
1453 7EBA A9 2A 8D DE 44 A9 + mwa #ResultLineBuffer LineAddress4x4
1454 7EC4 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1455 7ED0 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1456 7ED6 A9 01 8D 51 48 mva #1 plot4x4color
1457 7EDB 20 F5 7C jsr TypeLine4x4
1458
1459 7EDE 18 AD 3F 45 69 04 + adw ResultY #4 ;next line
1460
1461 ;Empty line
1462 7EEC A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4
1463 7EF6 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1464 7F02 AD 3F 45 8D E3 44 mva ResultY LineYdraw
1465 7F08 A9 01 8D 51 48 mva #1 plot4x4color
1466 7F0D 20 F5 7C jsr TypeLine4x4
1467
1468
1469
1470 7F10 CE 40 45 dec ResultOfTankNr
1471
1472 7F13 30 11 bmi FinishResultDisplay
1473
1474 7F15 38 AD 3F 45 E9 02 + sbw ResultY #2 ;distance between lines is smaller
1475
1476 7F23 4C 62 7E jmp ResultOfTheNextPlayer
1477
1478 7F26 FinishResultDisplay
1479
1480 ;bottom of the frame
1481 7F26 A9 F2 8D DE 44 A9 + mwa #LineBottom LineAddress4x4
1482 7F30 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw
1483 7F3C AD 3F 45 8D E3 44 mva ResultY LineYdraw
1484 7F42 A9 01 8D 51 48 mva #1 plot4x4color
1485 7F47 20 F5 7C jsr TypeLine4x4
1486 7F4A 60 rts
1487
1488
1489 ;-------------------------------------------------
1490 7F4B DisplayingSymbols
1491 ;-------------------------------------------------
1492
1493 ;---------------------
1494 ;displaying symbol of the weapon
1495 ;---------------------
1496 ;display name and symbol of the weapon
1497 ;textbuffer+18 - symbol (1 char)
1498 ;textbuffer+20 - quantity left
1499 ;textbuffer+23 - name
1500
1501
1502
1503 ;ldx TankNr
1504 7F4B BC 89 3D ldy ActiveWeapon,x
1505 7F4E B9 59 4C lda WeaponSymbols,y
1506 7F51 8D 8B 3C sta TextBuffer+18
1507
1508 ;---------------------
1509 ;displaying the energy of a tank
1510 ;---------------------
1511
1512 7F54 BD 4A 3D lda Energy,x
1513
1514 7F57 8D 41 3F sta decimal
1515 7F5A A9 A1 8D 43 3F A9 + mwa #textbuffer+40 displayposition
1516 7F64 20 C0 7B jsr displaybyte
1517 ;---------------------
1518 ;displaying quantity of the given weapon
1519 ;---------------------
1520 7F67 A6 8B ldx TankNr
1521 7F69 BD 89 3D lda ActiveWeapon,x
1522 7F6C 20 E5 71 jsr HowManyBullets
1523 7F6F 8D 41 3F sta decimal
1524 7F72 A9 8D 8D 43 3F A9 + mwa #textbuffer+20 displayposition
1525 7F7C 20 C0 7B jsr displaybyte
1526
1527 ;---------------------
1528 ;displaying name of the weapon
1529 ;---------------------
1530 7F7F A6 8B ldx TankNr
1531 7F81 BD 89 3D lda ActiveWeapon,x
1532 7F84 85 91 sta temp ;get back number of the weapon
1533 7F86 A9 00 85 92 mva #0 temp+1
1534 ; times 16 (because this is length of weapon name)
1535 7F8A A0 03 ldy #3 ; rotate 4 times
1536 7F8C RotateDISP02
1537 7F8C aslw temp
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 7F8C 06 91 ASL TEMP
2 7F8E 26 92 ROL TEMP+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1538 7F90 88 dey
1539 7F91 10 F9 bpl RotateDISP02
1540 7F93 18 A5 91 69 99 85 + adw temp #NamesOfWeapons
1541 7FA0 A0 06 ldy #6 ; from 6th character
1542
1543 7FA2 A0 0F ldy #15
1544 7FA4 loop06
1545 7FA4 B1 91 lda (temp),y
1546 7FA6 99 90 3C sta textbuffer+23,y
1547 7FA9 88 dey
1548 7FAA 10 F8 bpl loop06
1549
1550 ;=========================
1551 ;display Force
1552 ;=========================
1553 7FAC A6 8B ldx TankNr
1554 7FAE BD 6A 3D lda EnergyTableL,x
1555 7FB1 8D 41 3F sta decimal
1556 7FB4 BD 70 3D lda EnergyTableH,x
1557 7FB7 8D 42 3F sta decimal+1
1558 7FBA A9 B8 8D 43 3F A9 + mwa #textbuffer+63 displayposition
1559 7FC4 20 5E 7B jsr displaydec
1560
1561 ;=========================
1562 ;display Angle
1563 ;=========================
1564 ; additionally we are getting charcode of the tank
1565 ; (for future display)
1566 7FC7 A6 8B ldx TankNr
1567 7FC9 BD 82 3D lda AngleTable,x
1568 7FCC 30 1C bmi AngleToLeft
1569 7FCE A9 7F lda #$7f ; (tab) character
1570 7FD0 8D AD 3C sta textbuffer+52
1571 7FD3 A9 00 lda #0 ;space
1572 7FD5 8D AA 3C sta textbuffer+49
1573 7FD8 A9 5A lda #90
1574 7FDA 38 sec
1575 7FDB FD 82 3D sbc AngleTable,x
1576 7FDE 8D 41 3F sta decimal
1577 7FE1 A8 tay
1578 7FE2 B9 A6 45 lda BarrelTableR,y
1579 7FE5 85 88 sta CharCode
1580 7FE7 4C 00 80 jmp AngleDisplay ;like jp, because code always <>0
1581 7FEA AngleToLeft
1582 7FEA 38 sec
1583 7FEB E9 A5 sbc #(255-90)
1584 7FED 8D 41 3F sta decimal
1585 7FF0 A8 tay
1586 7FF1 B9 4B 45 lda BarrelTableL,y
1587 7FF4 85 88 sta CharCode
1588 7FF6 A9 7E lda #$7e ;(del) char
1589 7FF8 8D AA 3C sta textbuffer+49
1590 7FFB A9 00 lda #0 ;space
1591 7FFD 8D AD 3C sta textbuffer+52
1592
1593 8000 AngleDisplay
1594 8000 A9 AB 8D 43 3F A9 + mwa #textbuffer+50 displayposition
1595 800A 20 C0 7B jsr displaybyte
1596
1597
1598 ;=========================
1599 ;display Wind
1600 ;=========================
1601 800D AD 94 3D lda WindOrientation
1602 8010 D0 0C bne DisplayLeftWind
1603 8012 A9 7F lda #$7f ; (tab) char
1604 8014 8D C8 3C sta textbuffer+79
1605 8017 A9 00 lda #0 ;space
1606 8019 8D C5 3C sta textbuffer+76
1607 801C F0 0A beq DisplayWindValue
1608 801E DisplayLeftWind
1609 801E A9 7E lda #$7e ;(del) char
1610 8020 8D C5 3C sta textbuffer+76
1611 8023 A9 00 lda #0 ;space
1612 8025 8D C8 3C sta textbuffer+79
1613 8028 DisplayWindValue
1614 8028 AD 91 3D 85 91 AD + mwa Wind temp
1615 8032 lsrw temp ;divide by 16 to have
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8032 46 92 LSR TEMP+1
2 8034 66 91 ROR TEMP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1616 8036 lsrw temp ;a nice view on a screen
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8036 46 92 LSR TEMP+1
2 8038 66 91 ROR TEMP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1617 803A lsrw temp
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 803A 46 92 LSR TEMP+1
2 803C 66 91 ROR TEMP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1618 803E lsrw temp
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 803E 46 92 LSR TEMP+1
2 8040 66 91 ROR TEMP
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm
1619 8042 A5 91 lda temp
1620 8044 8D 41 3F sta decimal
1621 8047 A9 C6 8D 43 3F A9 + mwa #textbuffer+77 displayposition
1622 8051 20 C0 7B jsr displaybyte
1623 8054 60 rts
1624 ;-------------------------------------------------
1625 8055 PutTankNameOnScreen
1626 ; puts name of the tan on the screen
1627 8055 A0 00 ldy #$00
1628 8057 A5 8B lda tanknr
1629 8059 0A asl
1630 805A 0A asl
1631 805B 0A asl ; 8 chars per name
1632 805C AA tax
1633 805D NextChar02
1634 805D BD 57 3F lda tanksnames,x
1635 8060 99 80 3C sta textbuffer+7,y
1636 8063 E8 inx
1637 8064 C8 iny
1638 8065 C0 08 cpy #$08
1639 8067 D0 F4 bne NextChar02
1640 8069 60 rts
1641 ;-------------------------------------------------
1642
1643 .endif
1108 ;----------------------------------------------
1109 806A icl 'grafproc.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5
6 ;--------------------------------------------------
7 806A draw .proc ;;fuxxing good draw :)
8 ;--------------------------------------------------
9 ;creditz to Dr Jankowski / MIM U.W.
10 ; (xi,yi)-----(xk,yk)
11 ;20 DX=XK-XI
12 ;30 DY=YK-YI
13 ;40 DP=2*DY
14 ;50 DD=2*(DY-DX)
15 ;60 DI=2*DY-DX
16 ;70 REPEAT
17 ;80 IF DI>=0
18 ;90 DI=DI+DD
19 ;100 YI=YI+1
20 ;110 ELSE
21 ;120 DI=DI+DP
22 ;130 ENDIF
23 ;140 plot XI,YI
24 ;150 XI=XI+1
25 ;160 UNTIL XI=XK
26
27
28 ; begin: xdraw,ydraw - end: xbyte,ybyte
29 ; let's store starting coordinates
30 ; will be needed, because everything is calculated relatively
31 806A A9 00 8D 36 3E 8D + mwa #0 LineLength
32 8072 A5 80 85 97 A5 81 + mwa xdraw xtempDRAW
33 807A A5 82 85 99 A5 83 + mwa ydraw ytempDRAW
34
35 ; if line goes our of the screen we are not drawing it, but...
36
37 8082 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
38 808C B0 14 bcs DrawOutOfTheScreen
39 808E A5 85 C9 01 D0 04 + cpw xbyte #screenwidth
40 8098 B0 08 bcs DrawOutOfTheScreen
41 ;cpw ydraw #screenheight
42 ;bcs DrawOutOfTheScreen
43 ;cpw ybyte #screenheight
44 ;bcc DrawOnTheScreen
45 809A A5 83 lda ydraw+1
46 809C D0 04 bne DrawOutOfTheScreen
47 809E A5 87 lda ybyte+1
48 80A0 F0 01 beq DrawOnTheScreen
49 80A2 DrawOutOfTheScreen
50 ;jsr DrawJumpPad
51 80A2 60 rts
52 80A3 DrawOnTheScreen
53 ; constant parameters
54 ; XI=0 ,YI=0
55 80A3 A9 00 lda #0
56 80A5 85 9B sta XI
57 80A7 85 9C sta XI+1
58 80A9 85 9E sta YI
59 80AB 85 9F sta YI+1
60
61 ; setting the direction controll bits
62 80AD A5 83 C5 87 D0 04 + cpw ydraw ybyte
63 80B7 90 15 bcc LineDown
64 ; here one line up
65 ; we are setting bit 0
66 80B9 A9 01 8D 31 3E mva #1 HowToDraw ;here we can because it's first operation
67 ; we are subctracting Yend from Ybegin (reverse order)
68 ; DY=YI-YK
69 80BE 38 A5 82 E5 86 85 + sbw ydraw ybyte DY
70 80CB 4C E0 80 jmp CheckDirectionX
71 80CE LineDown
72 ; one line down here
73 ; we are setting bit 0
74 80CE A9 00 8D 31 3E mva #0 HowToDraw ;here we can because it's first operation
75 ; substract Ybegin from Yend (normal order)
76 ; DY=YK-YI
77 80D3 38 A5 86 E5 82 85 + sbw ybyte ydraw DY
78 80E0 CheckDirectionX
79 80E0 A5 81 C5 85 D0 04 + cpw xdraw xbyte
80 80EA 90 18 bcc LineRight
81 ; here goes line to the left
82 ; we set bit 1
83
84 80EC AD 31 3E lda HowToDraw
85 80EF 09 02 ora #$02
86 80F1 8D 31 3E sta HowToDraw
87 ; substract Xend from Xbegin (reverse)
88 ; DX=XI-XK
89 80F4 38 A5 80 E5 84 85 + sbw xdraw xbyte DX
90 8101 4C 11 81 jmp CheckDirectionFactor
91 8104 LineRight
92 ; here goes one line to the right
93 ; we clear bit 0
94 ; we can do nothing because the bit is cleared!
95
96 ;lda HowToDraw
97 ;and #$FD
98 ;sta HowToDraw
99
100 ; substracting Xbegin from Xend (normal way)
101 ; DX=XK-XI
102 8104 38 A5 84 E5 80 85 + sbw xbyte xdraw DX
103 8111 CheckDirectionFactor
104 ; here we check Direction Factor
105 ; I do not know if we are using proper English word
106 ; but the meaning is 'a' in y=ax+b
107
108 ; lda DX
109 ; we already have DX in A
110 8111 A5 A6 C5 A9 D0 04 + cpw DX DY
111
112 811B 90 0B bcc SwapXY
113 ; 'a' factor is fire, so we copy parameters
114 ; XK=DX
115 811D A5 A5 85 A1 A5 A6 + mwa DX XK
116 ; i kasowanie bitu 2
117 ; and bit 2 clear
118 ; (is not needed because already cleared)
119 ;lda HowToDraw
120 ;and #$FB
121 ;sta HowToDraw
122 8125 4C 48 81 jmp LineParametersReady
123 8128 SwapXY
124 ; not this half of a quarter! - parameters must be swapped
125 ; XK=DY
126 ; DY=DX
127 ; DX=XK - because DY is there so DY and DX are swapped
128 ; YK ... not used
129 8128 A5 A8 85 A1 A5 A9 + mwa DY XK
130 8130 A5 A5 85 A8 A5 A6 + mwa DX DY
131 8138 A5 A1 85 A5 A5 A2 + mwa XK DX
132
133 ; and let's set bit 2
134 8140 AD 31 3E lda HowToDraw
135 8143 09 04 ora #$04
136 8145 8D 31 3E sta HowToDraw
137 8148 LineParametersReady
138 ; let's check if length is not zero
139 8148 A5 A5 lda DX
140 814A 05 A6 ora DX+1
141 814C 05 A8 ora DY
142 814E 05 A9 ora DY+1
143 8150 D0 03 4C 46 82 jeq EndOfDraw
144
145 ; here we have DX,DY,XK and we know which operations
146 ; are to be performed with these factors when doing PLOT
147 ; (accordingly to given bits of 'HowToDraw')
148 ; Now we must calculate DP, DD and DI
149 ; DP=2*DY
150 ; DD=2*(DY-DX)
151 ; DI=2*DY-DX
152
153 8155 A5 A8 85 B0 A5 A9 + mwa DY DP
154 815D aslw DP
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 815D 06 B0 ASL DP
2 815F 26 B1 ROL DP+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
155
156 8161 38 A5 A8 E5 A5 85 + sbw DY DX DD
157 816E aslw DD
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 816E 06 AC ASL DD
2 8170 26 AD ROL DD+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
158
159 8172 A5 A8 85 AE A5 A9 + mwa DY DI
160 817A aslw DI
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 817A 06 AE ASL DI
2 817C 26 AF ROL DI+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
161 817E 38 A5 AE E5 A5 85 + sbw DI DX
162
163 818B DrawLoop
164 ; REPEAT
165 ; IF DI>=0
166 818B A5 AF lda DI+1
167 818D 30 1B bmi DINegative
168 ; DI=DI+DD
169 ; YI=YI+1
170 818F 18 A5 AE 65 AC 85 + adw DI DD
171 819C 18 A5 9E 69 01 85 + adw YI #1
172 81A7 4C B7 81 jmp drplot
173 81AA DINegative
174 ; ELSE
175 ; DI=DI+DP
176 81AA 18 A5 AE 65 B0 85 + adw DI DP
177
178 81B7 drplot ; Our plot that checks how to calculate pixels.
179 ; In xtempDRAW and ycircle there are begin coordinates
180 ; of our line
181 ; First we check the 'a' factor (like in y=ax+b)
182 ; If necessary we swap XI and YI
183 ; (as we can not change XI and YI we move XI to temp2
184 ; and YI to temp)
185
186
187 81B7 AD 31 3E lda HowToDraw
188 81BA 29 04 and #$04
189 81BC D0 13 bne SwappedXY
190 81BE A5 9B 85 91 A5 9C + mwa XI temp
191 81C6 A5 9E 85 93 A5 9F + mwa YI temp2
192 81CE 4C E1 81 jmp CheckPlotY
193 81D1 SwappedXY
194 81D1 A5 9B 85 93 A5 9C + mwa XI temp2
195 81D9 A5 9E 85 91 A5 9F + mwa YI temp
196 81E1 CheckPlotY
197 81E1 AD 31 3E lda HowToDraw
198 81E4 29 01 and #01
199 81E6 D0 10 bne LineGoesUp
200 ; here we know that line goes down and we are not changing Y
201 81E8 18 A5 93 65 99 85 + adw temp2 ytempDRAW ydraw ; YI
202 81F5 4C 05 82 jmp CheckPlotX
203 81F8 LineGoesUp
204 ; line goes up here - we are reversing Y
205 81F8 38 A5 99 E5 93 85 + sbw ytempDRAW temp2 ydraw ; YI
206 8205 CheckPlotX
207 8205 AD 31 3E lda HowToDraw
208 8208 29 02 and #02
209 820A D0 10 bne LineGoesLeft
210 ; here we know that line goes right and we are not changing X
211 820C 18 A5 91 65 97 85 + adw temp xtempDRAW xdraw ; XI
212 8219 4C 29 82 jmp PutPixelinDraw
213 821C LineGoesLeft
214 ; line goes left - we are reversing X
215 821C 38 A5 97 E5 91 85 + sbw xtempDRAW temp xdraw ; XI
216 8229 PutPixelinDraw
217 8229 20 53 82 jsr DrawJumpPad
218 ; end of the special PLOT for DRAW
219
220 ; XI=XI+1
221 ; UNTIL XI=XK
222 822C 18 A5 9B 69 01 85 + adw XI #1
223 8237 A5 9C C5 A2 D0 04 + cpw XI XK
224 8241 F0 03 4C 8B 81 jne DrawLoop
225
226 8246 EndOfDraw
227 8246 A5 97 85 80 A5 98 + mwa xtempDRAW xdraw
228 824E A5 99 85 82 mva ytempDRAW ydraw
229 8252 60 rts
230 .endp
231
232 8253 DrawJumpPad
233 8253 6C 2F 3E jmp (DrawJumpAddr)
234 8256 Drawplot
235 8256 4C 0C 89 jmp plot
236 8259 DrawLen
237 8259 18 AD 36 3E 69 01 + adw LineLength #1
238 8267 60 rts
239
240 8268 DrawCheck .proc
241 ; lda SmokeTracerFlag
242 ; bne yestrace ; jakie to g³upie....
243 8268 AD A9 3E lda tracerflag
244 826B 0D 6B 3E ora SmokeTracerFlag
245 826E yestrace
246 826E F0 03 beq notrace
247 8270 20 0C 89 jsr plot
248 8273 notrace
249 ;aftertrace
250 8273 AD 96 3D lda HitFlag
251 8276 D0 42 bne StopHitChecking
252
253 8278 CheckCollisionDraw
254 ; checking collision!
255 8278 A5 83 lda ydraw+1
256 827A D0 3E bne StopHitChecking
257
258 827C 20 D4 70 jsr CheckCollisionWithTank
259 827F AD 96 3D lda HitFlag
260 8282 D0 36 bne StopHitChecking
261
262 8284 A5 80 85 91 A5 81 + mwa xdraw temp
263 ;adw temp --- it does not work!!!!!!!! and should? OMC ??? #mountaintable
264 828C 18 clc
265 828D A5 91 lda temp
266 828F 69 13 adc #<mountaintable
267 8291 85 91 sta temp
268 8293 A5 92 lda temp+1
269 8295 69 41 adc #>mountaintable
270 8297 85 92 sta temp+1
271
272 8299 A0 00 ldy #0
273 829B A5 82 lda ydraw
274 829D D1 91 cmp (temp),y
275 829F 90 19 bcc StopHitChecking
276
277 82A1 A9 01 8D 96 3D mva #1 HitFlag
278 82A6 A5 80 8D 32 3E A5 + mwa xdraw XHit
279 82B0 A5 82 8D 34 3E A5 + mwa ydraw YHit
280
281
282 82BA StopHitChecking
283 82BA 60 rts
284 .endp
285
286 ;--------------------------------------------------
287 82BB circle .proc ;fxxxing good circle drawing :)
288 ;--------------------------------------------------
289 ;Turbo Basic source
290 ; R=30
291 ; XC=0:YC=R
292 ; FX=0:FY=8*R:FS=4*R+3
293 ; WHILE FX<FY
294 ; splot8 //splot8 are eight plotz around the circle
295 ; XC=XC+1
296 ; FX=FX+8
297 ; IF FS>0
298 ; FS=FS-FX-4
299 ; ELSE
300 ; YC=YC-1
301 ; FY=FY-8
302 ; FS=FS-FX-4+FY
303 ; ENDIF
304 ; WEND
305 ; splot8
306
307 82BB A5 80 8D 39 3E A5 + mwa xdraw xcircle
308 82C5 A5 82 8D 3B 3E mva ydraw ycircle
309
310 82CA A9 00 85 8F 85 90 mwa #0 xc
311 82D0 AD 38 3E 85 A4 mva radius yc
312 82D5 A9 00 85 9D mva #0 fx
313 82D9 AD 38 3E 85 A0 mva radius fy
314 82DE 06 A0 asl FY
315 82E0 06 A0 asl FY
316 82E2 A5 A0 85 A3 mva FY FS
317 82E6 06 A0 asl FY
318 82E8 18 clc
319 82E9 A5 A3 lda FS
320 82EB 69 03 adc #3
321 82ED 85 A3 sta FS
322
323 82EF circleloop
324 82EF A5 9D lda FX
325 82F1 C5 A0 cmp FY
326 82F3 B0 34 bcs endcircleloop
327 82F5 20 3C 83 jsr splot8
328 82F8 E6 8F inc XC
329
330 82FA 18 clc
331 82FB A5 9D lda FX
332 82FD 69 08 adc #8
333 82FF 85 9D sta FX
334
335 8301 A5 A3 lda FS
336 8303 F0 0C beq else01
337 8305 30 0A bmi else01
338 8307 38 sec
339 8308 E5 9D sbc FX
340 830A E9 04 sbc #4
341 830C 85 A3 sta FS
342 830E 4C 26 83 jmp endif01
343 8311 else01
344 8311 C6 A4 dec YC
345 8313 38 sec
346 8314 A5 A0 lda FY
347 8316 E9 08 sbc #8
348 8318 85 A0 sta FY
349
350 831A A5 A3 lda FS
351 831C 38 sec
352 831D E5 9D sbc FX
353 831F E9 04 sbc #4
354 8321 18 clc
355 8322 65 A0 adc FY
356 8324 85 A3 sta FS
357 8326 endif01
358 8326 4C EF 82 jmp circleloop
359 8329 endcircleloop
360
361 8329 20 3C 83 jsr splot8
362
363 832C AD 39 3E 85 80 AD + mwa xcircle xdraw
364 8336 AD 3B 3E 85 82 mva ycircle ydraw
365 833B 60 rts
366 .endp
367 ;----
368 833C splot8 .proc
369 ; plot xcircle+XC,ycircle+YC
370 ; plot xcircle+XC,ycircle-YC
371 ; plot xcircle-XC,ycircle-YC
372 ; plot xcircle-XC,ycircle+YC
373
374 ; plot xcircle+YC,ycircle+XC
375 ; plot xcircle+YC,ycircle-XC
376 ; plot xcircle-YC,ycircle-XC
377 ; plot xcircle-YC,ycircle+XC
378
379 833C 18 clc
380 833D AD 39 3E lda xcircle
381 8340 65 8F adc XC
382 8342 85 80 sta xdraw
383 8344 AD 3A 3E lda xcircle+1
384 8347 69 00 adc #0
385 8349 85 81 sta xdraw+1
386 ;clc
387 834B AD 3B 3E lda ycircle
388 834E 65 A4 adc YC
389 8350 85 82 sta ydraw
390 8352 8D 3C 3E sta tempcir
391 8355 20 0C 89 jsr plot
392
393 8358 38 sec
394 8359 AD 3B 3E lda ycircle
395 835C E5 A4 sbc YC
396 835E 85 82 sta ydraw
397 8360 20 0C 89 jsr plot
398
399 8363 38 sec
400 8364 AD 39 3E lda xcircle
401 8367 E5 8F sbc XC
402 8369 85 80 sta xdraw
403 836B AD 3A 3E lda xcircle+1
404 836E E9 00 sbc #0
405 8370 85 81 sta xdraw+1
406 8372 20 0C 89 jsr plot
407
408 8375 AD 3C 3E lda tempcir
409 8378 85 82 sta ydraw
410 837A 20 0C 89 jsr plot
411 ;---
412 837D 18 clc
413 837E AD 39 3E lda xcircle
414 8381 65 A4 adc yC
415 8383 85 80 sta xdraw
416 8385 AD 3A 3E lda xcircle+1
417 8388 69 00 adc #0
418 838A 85 81 sta xdraw+1
419 ;clc
420 838C AD 3B 3E lda ycircle
421 838F 65 8F adc xC
422 8391 85 82 sta ydraw
423 8393 8D 3C 3E sta tempcir
424 8396 20 0C 89 jsr plot
425
426 8399 38 sec
427 839A AD 3B 3E lda ycircle
428 839D E5 8F sbc xC
429 839F 85 82 sta ydraw
430 83A1 20 0C 89 jsr plot
431
432 83A4 38 sec
433 83A5 AD 39 3E lda xcircle
434 83A8 E5 A4 sbc yC
435 83AA 85 80 sta xdraw
436 83AC AD 3A 3E lda xcircle+1
437 83AF E9 00 sbc #0
438 83B1 85 81 sta xdraw+1
439 83B3 20 0C 89 jsr plot
440
441 83B6 AD 3C 3E lda tempcir
442 83B9 85 82 sta ydraw
443 83BB 20 0C 89 jsr plot
444
445 83BE 60 RTS
446 .endp
447
448 ;--------------------------------------------------
449 83BF WaitForKeyRelease .proc
450 ;--------------------------------------------------
451 83BF AD 0F D2 lda SKSTAT
452 83C2 C9 FF cmp #$ff
453 83C4 F0 04 beq KeyIsReleased
454 83C6 C9 F7 cmp #$f7
455 83C8 D0 F5 bne WaitForKeyRelease
456 83CA KeyIsReleased
457 83CA 60 rts
458 .endp
459
460 ;--------------------------------------------------
461 83CB clearscreen .proc
462 ;--------------------------------------------------
463 83CB A9 00 lda #0
464 83CD AA tax
465 83CE Loopi1
466 83CE 9D 10 10 sta display,x
467 83D1 9D 10 11 sta display+$100,x
468 83D4 9D 10 12 sta display+$200,x
469 83D7 9D 10 13 sta display+$300,x
470 83DA 9D 10 14 sta display+$400,x
471 83DD 9D 10 15 sta display+$500,x
472 83E0 9D 10 16 sta display+$600,x
473 83E3 9D 10 17 sta display+$700,x
474 83E6 9D 10 18 sta display+$800,x
475 83E9 9D 10 19 sta display+$900,x
476 83EC 9D 10 1A sta display+$a00,x
477 83EF 9D 10 1B sta display+$b00,x
478 83F2 9D 10 1C sta display+$c00,x
479 83F5 9D 10 1D sta display+$d00,x
480 83F8 9D 10 1E sta display+$e00,x
481 83FB 9D 10 1F sta display+$f00,x
482 83FE 9D 10 20 sta display+$1000,x
483 8401 9D 10 21 sta display+$1100,x
484 8404 9D 10 22 sta display+$1200,x
485 8407 9D 10 23 sta display+$1300,x
486 840A 9D 10 24 sta display+$1400,x
487 840D 9D 10 25 sta display+$1500,x
488 8410 9D 10 26 sta display+$1600,x
489 8413 9D 10 27 sta display+$1700,x
490 8416 9D 10 28 sta display+$1800,x
491 8419 9D 10 29 sta display+$1900,x
492 841C 9D 10 2A sta display+$1a00,x
493 841F 9D 10 2B sta display+$1b00,x
494 8422 9D 10 2C sta display+$1c00,x
495 8425 9D 10 2D sta display+$1d00,x
496 8428 9D 10 2E sta display+$1e00,x
497 842B 9D 10 2F sta display+$1f00,x
498 842E E8 inx
499 842F D0 9D bne Loopi1
500 8431 60 rts
501 .endp
502 ;-------------------------------*------------------
503 8432 placetanks .proc
504 ;--------------------------------------------------
505 8432 A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1
506 8434 A9 00 lda #0
507 8436 skip09
508 ; clearing the tables with coordinates of the tank
509 ; it is necessary, because randomizing checks
510 ; if the given tank is already placed
511 ; after check if its position is not (0,0)
512
513 ; I will be honest with you - I have no idea
514 ; what the above comment was intending to mean :)
515
516 8436 9D 97 3D sta XtankstableL,x
517 8439 9D 9D 3D sta XtankstableH,x
518 843C 9D A3 3D sta Ytankstable,x
519 843F CA dex
520 8440 10 F4 bpl skip09
521
522
523 8442 A9 00 8D D3 3E 8D + mwa #0 temptankX
524 844A A9 00 8D D5 3E mva #0 temptankNr ;player number
525 844F StillRandomize
526 844F AE 19 3D ldx NumberOfPlayers
527 8452 AD 0A D2 lda random
528 8455 29 07 and #$07
529 8457 A8 tay
530 8458 CC 19 3D cpy NumberOfPlayers
531 845B B0 F2 bcs StillRandomize
532 845D B9 97 3D lda xtankstableL,y
533 8460 D0 ED bne StillRandomize
534 8462 B9 9D 3D lda xtankstableH,y
535 8465 D0 E8 bne StillRandomize
536 ; here we know that we got a random number
537 ; of the tank that is not in use
538 ; this number is in Y
539
540 8467 18 clc
541 8468 AD D3 3E lda temptankX
542 846B 7D 62 48 adc disktance,x
543 846E 8D D3 3E sta temptankX
544 8471 99 97 3D sta xtankstableL,y
545 8474 90 03 bcc NotHigherByte03
546 8476 EE D4 3E inc temptankX+1
547 8479 NotHigherByte03
548 8479 AD D4 3E lda temptankX+1
549 847C 99 9D 3D sta xtankstableH,y
550 847F EE D5 3E INC temptankNr
551 8482 AE D5 3E ldx temptankNr
552 8485 EC 19 3D Cpx NumberOfPlayers
553 8488 D0 C5 bne StillRandomize
554
555 ; getting random displacements relative to even positions
556 848A A2 00 ldx #$00
557 848C StillRandomize02
558 848C AD 0A D2 lda random
559 848F 29 1F and #$1f ; maximal displacement is 31 pixels
560
561 8491 18 clc
562 8492 7D 97 3D adc xtankstableL,x
563 8495 9D 97 3D sta xtankstableL,x
564 8498 90 03 bcc NotHigherByte02
565 849A FE 9D 3D inc xtankstableH,x
566 849D NotHigherByte02
567 ; and we deduct 15 to make the displacement work two ways
568 849D 38 sec
569 849E BD 97 3D lda xtankstableL,x
570 84A1 E9 0F sbc #$0f
571 84A3 9D 97 3D sta xtankstableL,x
572 84A6 B0 03 bcs NotHigherByte01
573 84A8 DE 9D 3D dec xtankstableH,x
574 84AB NotHigherByte01
575
576 ; and clear lowest bit to be sure that the X coordinate is even
577 ; (this is to have P/M background look nice)
578 84AB BD 97 3D lda xtankstableL,x
579 84AE 29 FE and #$fe
580 84B0 9D 97 3D sta xtankstableL,x
581 84B3 E8 inx
582 84B4 EC 19 3D Cpx NumberOfPlayers
583 84B7 D0 D3 bne StillRandomize02
584 84B9 60 rts
585
586 ; during calculating heights of thw mountains
587 ; check if the tank is not somewhere around
588 ; if so, make horizontal line 8 pixels long
589 84BA CheckTank
590 84BA AE 19 3D ldx NumberOfPlayers
591 84BD CA dex
592 84BE CheckNextTank
593 84BE BD 97 3D lda xtankstableL,x
594 84C1 C5 80 cmp xdraw
595 84C3 D0 19 bne UnequalTanks
596 84C5 BD 9D 3D lda xtankstableH,x
597 84C8 C5 81 cmp xdraw+1
598 84CA D0 12 bne UnequalTanks
599 84CC A5 82 lda ydraw
600 ;sec
601 ;sbc #$01 ; minus 1, because it was 1 pixel too high
602 84CE 9D A3 3D sta ytankstable,x ; what's the heck is that????!!!!
603 84D1 A9 07 8D D1 3E mva #7 deltaX
604 84D6 A9 00 8D CD 3E 8D + mwa #0 delta
605 84DE UnequalTanks
606 84DE CA dex
607 84DF 10 DD bpl CheckNextTank
608 84E1 60 rts
609 .endp
610 ;-------------------------------------------------
611 84E2 drawtanks
612 ;-------------------------------------------------
613
614
615 84E2 A5 8B lda tanknr
616 84E4 48 pha
617 84E5 A2 00 ldx #$00
618 84E7 86 8B stx tanknr
619
620 84E9 DrawNextTank
621 84E9 20 F9 84 jsr drawtanknr
622 84EC E6 8B inc tanknr
623 84EE A6 8B ldx tanknr
624 84F0 EC 19 3D Cpx NumberOfPlayers
625 84F3 D0 F4 bne DrawNextTank
626
627 84F5 68 pla
628 84F6 85 8B sta tankNr
629
630 84F8 60 rts
631 ;---------
632 84F9 drawtanknr
633 84F9 A6 8B ldx tanknr
634 ; let's check the energy
635 84FB BD 51 3D lda eXistenZ,x
636 84FE D0 08 bne SkipRemovigPM ; if energy=0 then no tank
637
638 ; hide P/M
639 8500 A9 00 lda #0
640 8502 9D 00 D0 sta hposp0,x
641 8505 4C 82 85 jmp DoNotDrawTankNr
642 8508 SkipRemovigPM
643
644
645 8508 BD 82 3D lda AngleTable,x
646 850B 30 0D bmi AngleToLeft01
647 850D A9 5A lda #90
648 850F 38 sec
649 8510 FD 82 3D sbc AngleTable,x
650 8513 A8 tay
651 8514 B9 A6 45 lda BarrelTableR,y
652 8517 4C 21 85 jmp CharacterAlreadyKnown
653 851A AngleToLeft01
654 851A 38 sec
655 851B E9 A5 sbc #(255-90)
656 851D A8 tay
657 851E B9 4B 45 lda BarrelTableL,y
658 8521 CharacterAlreadyKnown
659 8521 85 88 sta CharCode
660 8523 DrawTankNrX
661 8523 A6 8B ldx tanknr
662 8525 BD 97 3D lda xtankstableL,x
663 8528 85 80 sta xdraw
664 852A BD 9D 3D lda xtankstableH,x
665 852D 85 81 sta xdraw+1
666 852F BD A3 3D lda ytankstable,x
667 8532 85 82 sta ydraw
668
669 8534 20 FE 89 jsr TypeChar
670
671 ; now P/M graphics on the screen (only for 5 tanks)
672 ; horizontal position
673 8537 A5 80 85 84 A5 81 + mwa xdraw xbyte
674 853F A6 8B ldx tanknr
675 8541 E0 05 cpx #$5
676 8543 B0 3D bcs NoPlayerMissile
677 8545 rorw xbyte ; divide by 2 (carry does not matter)
Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8545 66 85 ROR XBYTE+1
2 8547 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
678 8549 A5 84 lda xbyte
679 854B 18 clc
680 854C 69 24 adc #$24 ; P/M to graphics offser
681 854E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent
682 8550 D0 03 bne NoMissile
683 8552 18 clc
684 8553 69 0C adc #$0C
685 8555 NoMissile
686 8555 9D 00 D0 sta hposp0,x
687 ; vertical position
688 8558 BD 41 45 lda pmtableL,x
689 855B 85 84 sta xbyte
690 855D BD 46 45 lda pmtableH,x
691 8560 85 85 sta xbyte+1
692
693 ; calculate start position of the tank
694 8562 A5 82 lda ydraw
695 8564 18 clc
696 8565 69 25 adc #$25 ; P/M to graphics offset
697 8567 85 91 sta temp
698 ; clear sprite and put 3 lines on the tank at the same time
699 8569 A0 00 ldy #$00
700 856B 98 tya
701 856C C4 91 ClearPM cpy temp
702 856E D0 0D bne ZeroesToGo
703 8570 A9 03 lda #$03 ; (2 bits set) we set on two pixels in three lines
704 8572 91 84 sta (xbyte),y
705 8574 88 dey
706 8575 91 84 sta (xbyte),y
707 8577 88 dey
708 8578 91 84 sta (xbyte),y
709 857A 88 dey
710 857B A9 00 lda #$00
711 857D ZeroesToGo
712 857D 91 84 sta (xbyte),y
713 857F 88 dey
714 8580 D0 EA bne ClearPM
715
716 8582 NoPlayerMissile
717 8582 DoNotDrawTankNr
718 8582 60 rts
719
720 ;--------------------------------------------------
721 8583 drawmountains .proc
722 ;--------------------------------------------------
723 8583 A9 00 85 80 85 81 mwa #0 xdraw
724 8589 A9 13 85 B2 A9 41 + mwa #mountaintable modify
725
726
727 8591 drawmountainsloop
728 8591 A0 00 ldy #0
729 8593 B1 B2 lda (modify),y
730 8595 85 82 sta ydraw
731 8597 20 D4 89 jsr DrawLine
732 859A 18 A5 B2 69 01 85 + adw modify #1
733 85A5 18 A5 80 69 01 85 + adw xdraw #1
734 85B0 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
735 85BA D0 D5 bne drawmountainsloop
736
737 85BC 60 rts
738 ;--------------------------------------------------
739 85BD drawmountainspixel
740 ;--------------------------------------------------
741 85BD A9 00 85 80 85 81 mwa #0 xdraw
742 85C3 A9 13 85 B2 A9 41 + mwa #mountaintable modify
743
744
745 85CB drawmountainspixelloop
746 85CB A0 00 ldy #0
747 85CD B1 B2 lda (modify),y
748 85CF 85 82 sta ydraw
749 85D1 20 0C 89 jsr plot
750 85D4 18 A5 B2 69 01 85 + adw modify #1
751 85DF 18 A5 80 69 01 85 + adw xdraw #1
752 85EA A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
753 85F4 D0 D5 bne drawmountainspixelloop
754
755 85F6 60 rts
756 .endp
757 ;--------------------------------------------------
758 85F7 SoilDown2 .proc
759 ;--------------------------------------------------
760
761 ; how it is supposed to work:
762 ; first loop is looking for the highest pixels
763 ; and fills with their Y coordinates both temporary tables
764 ;
765 ; second (main) loop works this way:
766 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 )
767 ; goes through the horizontal line checking if
768 ; Y coordinate from the first table equals to height of the peak
769 ; if so, it goes further
770 ; if not:
771 ; sets end-of-soil-fall-down-flag to 0
772 ; increases Y from the first table
773 ; if there is no pixel there it plots here and
774 ; zeroes pixel from the second table and after that
775 ; increases Y of the second table
776 ; repeats with next pixels au to the end of the line
777 ; if the flag is 0 then repeat the main loop
778 ; and that's it :)
779 ;
780 ; I am sorry but after these 4 years I have no idea
781 ; how it works. I have just translated Polish comment
782 ; but I do not understand a word of it :)
783 ; If you know how it works, please write here :))))
784
785 85F7 20 66 72 jsr PMoutofscreen
786
787 ; First we look for highest pixels and fill with their coordinates
788 ; both tables
789
790 85FA AD FC 3D 85 80 AD + mwa RangeLeft xdraw
791 8604 18 AD FC 3D 69 54 + adw RangeLeft #mountaintable2 tempor2
792 8613 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3
793
794 8622 NextColumn1
795 8622 A9 00 85 82 mva #0 ydraw
796 8626 NextPoint1
797 8626 20 5F 89 jsr point
798 8629 F0 0B beq StillNothing
799 862B A0 00 ldy #0
800 862D A5 82 lda ydraw
801 862F 91 A7 sta (tempor2),y
802 8631 91 AA sta (tempor3),y
803 8633 4C 3E 86 jmp FoundPeek1
804 8636 StillNothing
805 8636 E6 82 inc ydraw
806 8638 A5 82 lda ydraw
807 863A C9 C8 cmp #screenheight
808 863C D0 E8 bne NextPoint1
809 863E FoundPeek1
810 863E 18 A5 A7 69 01 85 + adw tempor2 #1
811 8649 18 A5 AA 69 01 85 + adw tempor3 #1
812 8654 18 A5 80 69 01 85 + adw xdraw #1
813 ;vcmp xdraw,screenwidth,NextColumn1
814 865F A5 81 CD FF 3D D0 + cpw xdraw RangeRight
815 866B 90 B5 bcc NextColumn1
816 866D F0 B3 beq NextColumn1
817 ; we have both tables filled with starting values
818
819 ; main loop starts here
820 866F MainFallout2
821 866F AD FC 3D 85 80 AD + mwa RangeLeft xdraw
822 8679 18 AD FC 3D 69 13 + adw RangeLeft #mountaintable temp
823 8688 18 AD FC 3D 69 54 + adw RangeLeft #mountaintable2 tempor2
824 8697 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3
825
826 86A6 A9 01 8D 8D 3E A9 + mwa #1 IsEndOfTheFallFlag
827 86B0 FalloutOfLine
828 86B0 A0 00 ldy #0
829
830 ; is Y coordinate from the first table
831 ; equal to peak height, if so, go ahead
832 86B2 B1 A7 lda (tempor2),y
833 86B4 C9 C7 cmp #screenheight-1 ;cmp (temp),y
834 86B6 B0 2A bcs ColumnIsReady
835 ; in the other case there are things to be done
836 86B8 8C 8D 3E sty IsEndOfTheFallFlag ; flag to 0
837 ; we are increasing Y in the first table
838 ;lda (tempor2),y
839 86BB 18 clc
840 86BC 69 01 adc #1
841 86BE 91 A7 sta (tempor2),y
842 ; and checking if there is a pixel there
843 86C0 85 82 sta ydraw
844 86C2 20 5F 89 jsr point
845 86C5 D0 1B bne ThereIsPixelHere
846 ; if no pixel we plot it
847 86C7 A9 01 8D CA 3E mva #1 color
848 86CC 20 24 89 jsr plot.MakePlot
849 ; zeroing pixel from the second table
850 ; and increase Y in second table
851 86CF A0 00 ldy #0
852 86D1 B1 AA lda (tempor3),y
853 86D3 85 82 sta ydraw
854 86D5 B1 AA lda (tempor3),y
855 86D7 18 clc
856 86D8 69 01 adc #1
857 86DA 91 AA sta (tempor3),y
858 86DC 8C CA 3E sty color
859 86DF 20 24 89 jsr plot.MakePlot
860
861 86E2 ThereIsPixelHere
862 86E2 ColumnIsReady
863 86E2 18 A5 91 69 01 85 + adw temp #1
864 86ED 18 A5 A7 69 01 85 + adw tempor2 #1
865 86F8 18 A5 AA 69 01 85 + adw tempor3 #1
866 8703 18 A5 80 69 01 85 + adw xdraw #1
867 ;vcmp xdraw,screenwidth,FalloutOfLine
868 870E A5 81 CD FF 3D D0 + cpw xdraw RangeRight
869 871A 90 94 bcc FalloutOfLine
870 871C F0 92 beq FalloutOfLine
871
872 871E AD 8D 3E lda IsEndOfTheFallFlag
873 ; we repeat untill at some point first table reaches
874 ; level of the mountains
875 8721 D0 03 4C 6F 86 jeq MainFallout2
876 ; now correct heights are in the second temporary table
877 ; so we copy
878 8726 AD FC 3D 85 80 AD + mwa RangeLeft xdraw
879 8730 18 AD FC 3D 69 13 + adw RangeLeft #mountaintable temp
880 873F 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3
881
882 874E A0 00 ldy #0
883 8750 CopyHeights
884 8750 B1 AA lda (tempor3),y
885 8752 91 91 sta (temp),y
886 8754 18 A5 91 69 01 85 + adw temp #1
887 875F 18 A5 AA 69 01 85 + adw tempor3 #1
888 876A 18 A5 80 69 01 85 + adw xdraw #1
889 ;vcmp xdraw,screenwidth,CopyHeights
890 8775 A5 81 CD FF 3D D0 + cpw xdraw RangeRight
891 8781 90 CD bcc CopyHeights
892 8783 F0 CB beq CopyHeights
893 8785 A9 01 8D CA 3E mva #1 color
894 878A 60 rts
895 .endp
896 ;--------------------------------------------------
897 878B calculatemountains .proc
898 ;--------------------------------------------------
899 878B A9 00 85 80 85 81 mwa #0 xdraw
900
901 ; starting point
902 8791 getrandomY ;getting random Y coordinate
903 8791 38 sec
904 8792 AD 0A D2 lda random
905 8795 C9 08 cmp #screenheight-(margin*4) ;it means that max line=199
906 8797 B0 F8 bcs getrandomY
907 8799 18 clc
908 879A 69 60 adc #(margin*2)
909 879C 85 82 sta ydraw
910 879E 8D D0 3E sta yfloat+1
911 87A1 A9 00 8D CF 3E mva #0 yfloat ;yfloat equals to e.g. 140.0
912
913 ; how to make nice looking mountains?
914 ; randomize points and join them with lines
915 ; Here we do it simpler way - we randomize X (or deltaX)
916 ; and "delta" (change of Y coordinate)
917
918 87A6 NextPart
919 87A6 AD 0A D2 lda random
920 87A9 8D CD 3E sta delta ; it is after the dot (xxx.delta)
921 87AC AD 0A D2 lda random
922 87AF 29 03 and #$03 ;(max delta)
923 87B1 8D CE 3E sta delta+1 ; before the dot (delta+1.delta)
924
925 87B4 AD 0A D2 lda random
926 87B7 29 01 and #$01 ;random sign (+/- or up/down)
927 87B9 8D D2 3E sta UpNdown
928
929 ; theoretically we have here ready
930 ; fixed-point delta value
931 ; (-1*(UpNdown))*(delta+1.delta)
932
933 ;loop drawing one line
934
935 87BC ChangingDirection
936 87BC AD 0A D2 lda random ;length of the line
937 87BF 29 0F and #$0f ;max line length
938 87C1 AA tax
939 87C2 E8 inx
940 87C3 E8 inx
941 87C4 E8 inx
942 87C5 8E D1 3E stx deltaX
943
944 87C8 OnePart
945 87C8 20 BA 84 jsr placeTanks.CheckTank
946 ; checks if at a given X coordinate
947 ; is any tank and if so
948 ; changes parameters of drawing
949 ; to generate flat 8 pixels
950 ; (it will be the place for the tank)
951 ; it also stores Y position of the tank
952 87CB 18 A5 80 69 13 85 + adw xdraw #mountaintable modify
953
954 87D8 A5 82 lda ydraw
955 87DA A0 00 ldy #0
956 87DC 91 B2 sta (modify),y
957
958 ; Up or Down
959 87DE AD D2 3E lda UpNdown
960 87E1 F0 22 beq ToBottom
961
962 87E3 ToTop ;it means substracting
963
964 87E3 38 AD CF 3E ED CD + sbw yfloat delta
965 87F6 AD D0 3E lda yfloat+1
966 87F9 C9 30 cmp #margin
967 87FB B0 27 bcs Skip01
968 ; if smaller than 10
969 87FD A2 00 ldx #$00
970 87FF 8E D2 3E stx UpNdown
971 8802 4C 24 88 jmp Skip01
972
973 8805 ToBottom
974 8805 18 AD CF 3E 6D CD + adw yfloat delta
975 8818 AD D0 3E lda yfloat+1
976 881B C9 98 cmp #screenheight-margin
977 881D 90 05 bcc Skip01
978 ; if higher than screen
979 881F A2 01 ldx #$01
980 8821 8E D2 3E stx UpNdown
981 8824 Skip01
982 8824 85 82 sta ydraw
983
984 8826 18 A5 80 69 01 85 + adw xdraw #1
985
986 8831 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
987 883B F0 08 beq EndDrawing
988
989 883D CE D1 3E dec deltaX
990 8840 D0 86 bne OnePart
991
992 8842 4C A6 87 jmp NextPart
993 8845 EndDrawing
994
995 8845 60 rts
996 .endp
997 ; -----------------------------------------
998 8846 unPlot .proc
999 ; -----------------------------------------
1000 8846 A2 00 ldx #0 ; only one pixel
1001 8848 unPlotAfterX
1002 8848 8E 8E 3E stx WhichUnPlot
1003
1004 ; first remake the oldie
1005 884B BD 94 3E lda oldplotL,x
1006 884E 85 8D sta oldplot
1007 8850 BD 8F 3E lda oldplotH,x
1008 8853 85 8E sta oldplot+1
1009
1010 8855 BD 9E 3E lda oldply,x
1011 8858 A8 tay
1012 8859 BD 99 3E lda oldora,x
1013 885C 91 8D sta (oldplot),y
1014
1015
1016 ; is it not out of the screen ????
1017 885E A5 83 C9 00 D0 04 + cpw ydraw #screenheight
1018 8868 90 03 4C 0B 89 jcs EndOfUnPlot
1019 886D CheckX
1020 886D A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
1021 8877 90 03 4C 0B 89 jcs EndOfUnPlot
1022 887C MakeUnPlot
1023 ; let's count coordinates taken from xdraw and ydraw
1024 887C A5 80 85 84 A5 81 + mwa xdraw xbyte
1025
1026 8884 A5 84 lda xbyte
1027 8886 29 07 and #$7
1028 8888 8D CB 3E sta ybit
1029
1030 888B lsrw xbyte
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 888B 46 85 LSR XBYTE+1
2 888D 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1031 888F rorw xbyte
Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 888F 66 85 ROR XBYTE+1
2 8891 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1032 8893 rorw xbyte
Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8893 66 85 ROR XBYTE+1
2 8895 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1033 ;---
1034 8897 A4 84 ldy xbyte
1035
1036 8899 AE 8E 3E ldx WhichUnPlot
1037 889C 98 tya
1038 889D 9D 9E 3E sta oldply,x
1039
1040
1041 88A0 A6 82 ldx ydraw
1042 88A2 BD B7 46 lda linetableL,x
1043 88A5 85 84 sta xbyte
1044 88A7 85 8D sta oldplot
1045 88A9 BD 80 47 lda linetableH,x
1046 88AC 85 85 sta xbyte+1
1047 88AE 85 8E sta oldplot+1
1048 88B0 AE CB 3E ldx ybit
1049
1050
1051 88B3 AD CA 3E lda color
1052 88B6 F0 0D beq ClearUnPlot
1053
1054 88B8 B1 84 lda (xbyte),y
1055 88BA 8D A3 3E sta OldOraTemp
1056 88BD 1D 52 48 ora bittable,x
1057 88C0 91 84 sta (xbyte),y
1058 88C2 4C CD 88 jmp ContinueUnPlot
1059 88C5 ClearUnPlot
1060 88C5 B1 84 lda (xbyte),y
1061 88C7 8D A3 3E sta OldOraTemp
1062 88CA 3D 5A 48 and bittable2,x
1063 ; sta (xbyte),y
1064 88CD ContinueUnPlot
1065 88CD AE 8E 3E ldx WhichUnPlot
1066 88D0 AD A3 3E lda OldOraTemp
1067 88D3 9D 99 3E sta oldora,x
1068 88D6 A5 8D lda oldplot
1069 88D8 9D 94 3E sta oldplotL,x
1070 88DB A5 8E lda oldplot+1
1071 88DD 9D 8F 3E sta oldplotH,x
1072 ; and now we must solve the problem of several plots
1073 ; in one byte
1074 88E0 A2 04 ldx #4
1075 88E2 AC 8E 3E ldy WhichUnPlot
1076 88E5 LetsCheckOverlapping
1077 88E5 EC 8E 3E cpx WhichUnPlot
1078 88E8 F0 1E beq SkipThisPlot
1079 88EA BD 94 3E lda oldplotL,x
1080 88ED D9 94 3E cmp oldplotL,y
1081 88F0 D0 16 bne NotTheSamePlot
1082 88F2 BD 8F 3E lda oldplotH,x
1083 88F5 D9 8F 3E cmp oldplotH,y
1084 88F8 D0 0E bne NotTheSamePlot
1085 88FA BD 9E 3E lda oldply,x
1086 88FD D9 9E 3E cmp oldply,y
1087 8900 D0 06 bne NotTheSamePlot
1088 ; the pixel is in the same byte so let's take correct contents
1089 8902 BD 99 3E lda oldora,x
1090 8905 99 99 3E sta oldora,y
1091 8908 NotTheSamePlot
1092 8908 SkipThisPlot
1093 8908 CA dex
1094 8909 10 DA bpl LetsCheckOverlapping
1095 890B EndOfUnPlot
1096 890B 60 rts
1097 .endp
1098 ; -----------------------------------------
1099 890C plot .proc ;plot (xdraw, ydraw)
1100 ; this is one of the most important routines in the whole
1101 ; game. If you are going to speed up the game, start with
1102 ; plot - it is used by every single effect starting from explosions
1103 ; through line drawing and small text output!!!
1104 ; We tried to keep it clear and therefore it is far from
1105 ; optimal speed.
1106
1107 ; -----------------------------------------
1108 ; is it not over the screen ???
1109 890C A5 83 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
1110 8916 B0 F3 bcs unPlot.EndOfUnPlot
1111 8918 CheckX02
1112 8918 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth
1113 8922 B0 32 bcs EndOfPlot ;nearest RTS
1114 8924 MakePlot
1115 ; let's calculate coordinates from xdraw and ydraw
1116 8924 A5 80 85 84 A5 81 + mwa xdraw xbyte
1117
1118
1119 892C A5 84 lda xbyte
1120 892E 29 07 and #$7
1121 8930 8D CB 3E sta ybit
1122
1123 ;xbyte = xbyte/8
1124 8933 A5 84 lda xbyte
1125 8935 46 85 lsr xbyte+1
1126 8937 6A ror ;just one bit over 256. Max screenwidht = 512!!!
1127 8938 4A lsr
1128 8939 4A lsr
1129 893A A8 tay ;save
1130 ;---
1131
1132
1133
1134
1135 893B A6 82 ldx ydraw
1136 893D BD B7 46 lda linetableL,x
1137 8940 85 84 sta xbyte
1138 8942 BD 80 47 lda linetableH,x
1139 8945 85 85 sta xbyte+1
1140
1141 8947 AE CB 3E ldx ybit
1142 894A AD CA 3E lda color
1143 894D F0 08 beq ClearPlot
1144
1145 894F B1 84 lda (xbyte),y
1146 8951 1D 52 48 ora bittable,x
1147 8954 91 84 sta (xbyte),y
1148 8956 EndOfPlot
1149 8956 60 rts
1150 8957 ClearPlot
1151 8957 B1 84 lda (xbyte),y
1152 8959 3D 5A 48 and bittable2,x
1153 895C 91 84 sta (xbyte),y
1154 895E 60 rts
1155 .endp
1156 ; -----------------------------------------
1157 895F point .proc
1158 ; -----------------------------------------
1159 ; checks state of the pixel (coordinates in xdraw and ydraw)
1160 ; result is in A (zero or appropriate bit is set)
1161
1162
1163 ; let's calculate coordinates from xdraw and ydraw
1164 895F A5 80 85 84 A5 81 + mwa xdraw xbyte
1165
1166
1167 8967 A5 84 lda xbyte
1168 8969 29 07 and #$7
1169 896B 8D CB 3E sta ybit
1170
1171 ;xbyte = xbyte/8
1172 896E A5 84 lda xbyte
1173 8970 46 85 lsr xbyte+1
1174 8972 6A ror ;just one bit over 256. Max screenwidht = 512!!!
1175 8973 4A lsr
1176 8974 4A lsr
1177 8975 A8 tay ;save
1178
1179 ;---
1180
1181 8976 A6 82 ldx ydraw
1182 8978 BD B7 46 lda linetableL,x
1183 897B 85 84 sta xbyte
1184 897D BD 80 47 lda linetableH,x
1185 8980 85 85 sta xbyte+1
1186
1187 8982 AE CB 3E ldx ybit
1188
1189 8985 B1 84 lda (xbyte),y
1190 8987 3D 52 48 and bittable,x
1191 898A 60 rts
1192 .endp
1193
1194 ; -----------------------------------------
1195 898B PlotPointer .proc
1196 ; -----------------------------------------
1197 ; draws pointer that shows where is the bullet
1198 ; when it is over the screen
1199 ; (it is on the top of the screen)
1200
1201
1202 898B A5 80 8D 3C 3E A5 + mwa xdraw tempCir
1203
1204 8995 A9 00 8D CA 3E mva #0 color
1205 899A A9 C8 85 82 A9 00 + mwa #screenHeight ydraw
1206 89A2 AD 49 48 85 80 AD + mwa oldPlotPointerX xdraw
1207 89AC 20 0C 89 jsr plot
1208
1209
1210 89AF AD 3C 3E 85 80 AD + mwa tempCir xdraw
1211
1212 89B9 A9 01 8D CA 3E mva #1 color
1213 89BE A9 C8 85 82 A9 00 + mwa #screenHeight ydraw
1214 89C6 20 0C 89 jsr plot
1215
1216 89C9 A5 80 8D 49 48 A5 + mwa xdraw oldPlotPointerX
1217
1218 89D3 60 rts
1219
1220 .endp
1221 ;--------------------------------------------------
1222 89D4 DrawLine .proc
1223 ;--------------------------------------------------
1224 89D4 A9 00 85 83 mva #0 ydraw+1
1225 89D8 A9 C8 lda #screenheight
1226 89DA 38 sec
1227 89DB E5 82 sbc ydraw
1228 89DD 8D CC 3E sta tempbyte01
1229 89E0 20 0C 89 jsr plot
1230 ;rts
1231 89E3 4C ED 89 jmp IntoDraw ; jumps inside Draw routine
1232 ; because one pixel is already plotted
1233
1234
1235 89E6 loopdraw
1236
1237 89E6 B1 84 lda (xbyte),y
1238 89E8 1D 52 48 ora bittable,x
1239 89EB 91 84 sta (xbyte),y
1240 89ED 18 A5 84 69 28 85 + IntoDraw adw xbyte #screenBytes
1241
1242 89F8 CE CC 3E dec tempbyte01
1243 89FB D0 E9 bne loopdraw
1244 89FD 60 rts
1245 .endp
1246 ;
1247 ; ------------------------------------------
1248 89FE TypeChar .proc
1249 ; puts char on the graphics screen
1250 ; in: CharCode
1251 ; in: left LOWER corner of the char coordinates (xdraw, ydraw)
1252 ;--------------------------------------------------
1253 ; char to the table
1254 89FE A5 88 lda CharCode
1255 8A00 85 89 sta fontind
1256 8A02 A9 00 lda #$00
1257 8A04 85 8A sta fontind+1
1258 ; char intex times 8
1259 8A06 aslw fontind
Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A06 06 89 ASL FONTIND
2 8A08 26 8A ROL FONTIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1260 8A0A rolw fontind
Macro: ROLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A0A 26 89 ROL FONTIND
2 8A0C 26 8A ROL FONTIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1261 8A0E rolw fontind
Macro: ROLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A0E 26 89 ROL FONTIND
2 8A10 26 8A ROL FONTIND+1
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1262
1263 8A12 18 A5 89 69 2A 85 + adw fontind #TankFont
1264
1265 ; and 8 bytes to the table
1266 8A1F A0 07 ldy #7
1267 8A21 CopyChar
1268 8A21 B1 89 lda (fontind),y
1269 8A23 99 BA 3E sta char1,y
1270 8A26 A9 00 lda #$00
1271 8A28 99 C2 3E sta char2,y
1272 8A2B 88 dey
1273 8A2C 10 F3 bpl CopyChar
1274 ; and 8 subsequent bytes as a mask
1275 8A2E 18 A5 89 69 08 85 + adw fontind #8
1276 8A39 A0 07 ldy #7
1277 8A3B CopyMask
1278 8A3B B1 89 lda (fontind),y
1279 8A3D 99 AA 3E sta mask1,y
1280 8A40 A9 FF lda #$ff
1281 8A42 99 B2 3E sta mask2,y
1282 8A45 88 dey
1283 8A46 10 F3 bpl CopyMask
1284
1285 ; calculating coordinates from xdraw and ydraw
1286 8A48 A5 80 85 84 A5 81 + mwa xdraw xbyte
1287
1288 8A50 A5 84 lda xbyte
1289 8A52 29 07 and #$7
1290 8A54 8D CB 3E sta ybit
1291
1292 8A57 lsrw xbyte
Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A57 46 85 LSR XBYTE+1
2 8A59 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1293 8A5B rorw xbyte
Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A5B 66 85 ROR XBYTE+1
2 8A5D 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1294 8A5F rorw xbyte
Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
1 8A5F 66 85 ROR XBYTE+1
2 8A61 66 84 ROR XBYTE
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1295
1296 ;---
1297 8A63 A4 84 ldy xbyte
1298
1299 8A65 A6 82 ldx ydraw
1300 .rept 7
1301 DEX
1302 .ENDR
1302 .endr
Source: REPT
1301 8A67 CA DEX
1301 8A68 CA DEX
1301 8A69 CA DEX
1301 8A6A CA DEX
1301 8A6B CA DEX
1301 8A6C CA DEX
1301 8A6D CA DEX
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm
1303
1304 8A6E BD B7 46 lda linetableL,x
1305 8A71 85 84 sta xbyte
1306 8A73 BD 80 47 lda linetableH,x
1307 8A76 85 85 sta xbyte+1
1308 ; mask preparation and character shifting
1309 8A78 AE CB 3E ldx ybit
1310 8A7B F0 6B beq MaskOK00
1311 8A7D MakeMask00
1312 8A7D 38 sec
1313 8A7E 6E AA 3E ror mask1
1314 8A81 6E B2 3E ror mask2
1315 8A84 38 sec
1316 8A85 6E AB 3E ror mask1+1
1317 8A88 6E B3 3E ror mask2+1
1318 8A8B 38 sec
1319 8A8C 6E AC 3E ror mask1+2
1320 8A8F 6E B4 3E ror mask2+2
1321 8A92 38 sec
1322 8A93 6E AD 3E ror mask1+3
1323 8A96 6E B5 3E ror mask2+3
1324 8A99 38 sec
1325 8A9A 6E AE 3E ror mask1+4
1326 8A9D 6E B6 3E ror mask2+4
1327 8AA0 38 sec
1328 8AA1 6E AF 3E ror mask1+5
1329 8AA4 6E B7 3E ror mask2+5
1330 8AA7 38 sec
1331 8AA8 6E B0 3E ror mask1+6
1332 8AAB 6E B8 3E ror mask2+6
1333 8AAE 38 sec
1334 8AAF 6E B1 3E ror mask1+7
1335 8AB2 6E B9 3E ror mask2+7
1336 8AB5 4E BA 3E lsr char1
1337 8AB8 6E C2 3E ror char2
1338 8ABB 6E BB 3E ror char1+1
1339 8ABE 6E C3 3E ror char2+1
1340 8AC1 6E BC 3E ror char1+2
1341 8AC4 6E C4 3E ror char2+2
1342 8AC7 6E BD 3E ror char1+3
1343 8ACA 6E C5 3E ror char2+3
1344 8ACD 6E BE 3E ror char1+4
1345 8AD0 6E C6 3E ror char2+4
1346 8AD3 6E BF 3E ror char1+5
1347 8AD6 6E C7 3E ror char2+5
1348 8AD9 6E C0 3E ror char1+6
1349 8ADC 6E C8 3E ror char2+6
1350 8ADF 6E C1 3E ror char1+7
1351 8AE2 6E C9 3E ror char2+7
1352 8AE5 CA dex
1353 8AE6 D0 95 bne MakeMask00
1354 8AE8 MaskOK00
1355 ; here x=0
1356 8AE8 AD FB 3D lda Erase
1357 8AEB F0 0F beq CharLoopi ; it works, because x=0
1358 8AED A9 00 lda #0
1359 8AEF A2 07 ldx #7
1360 8AF1 EmptyChar
1361 8AF1 9D BA 3E sta char1,x
1362 8AF4 9D C2 3E sta char2,x
1363 8AF7 CA dex
1364 8AF8 10 F7 bpl EmptyChar
1365 8AFA A2 00 ldx #0
1366 8AFC CharLoopi
1367 8AFC B1 84 lda (xbyte),y
1368 8AFE 3D AA 3E and mask1,x
1369 8B01 1D BA 3E ora char1,x
1370 8B04 91 84 sta (xbyte),y
1371 8B06 C8 iny
1372 8B07 B1 84 lda (xbyte),y
1373 8B09 3D B2 3E and mask2,x
1374 8B0C 1D C2 3E ora char2,x
1375 8B0F 91 84 sta (xbyte),y
1376 8B11 88 dey
1377 8B12 18 A5 84 69 28 85 + adw xbyte #screenBytes
1378 8B1D E8 inx
1379 8B1E E0 08 cpx #8
1380 8B20 D0 DA bne CharLoopi
1381 8B22 60 rts
1382 .endp
1383 ; ------------------------------------------
1384 8B23 PutChar4x4 .proc ;puts 4x4 pixels char on the graphics screen
1385 ; in: xdraw, ydraw (upper left corner of the char)
1386 ; in: CharCode4x4 (.sbyte)
1387 ;--------------------------------------------------
1388 8B23 AD 51 48 lda plot4x4color
1389 8B26 8D CA 3E sta color
1390
1391
1392 ; calculating address of the first byte
1393 8B29 A9 04 8D 4B 48 mva #4 LoopCounter4x4
1394 8B2E AD 50 48 lda CharCode4x4
1395 8B31 29 01 and #1
1396 8B33 8D 4F 48 sta nibbler4x4
1397 8B36 AD 50 48 lda CharCode4x4
1398 8B39 6A ror
1399 ; in carry there is which nibble of the byte is to be taken
1400 8B3A 18 clc
1401 8B3B 69 60 adc #(3*32)
1402 8B3D 8D 4C 48 sta y4x4
1403 8B40 nextline4x4
1404 8B40 A9 04 8D 4E 48 mva #4 Xcounter4x4
1405 8B45 AC 4C 48 ldy y4x4
1406 8B48 B9 AA 8E lda font4x4,y ;there was a problem with OMC here, but it works now
1407
1408 8B4B AE 4F 48 ldx nibbler4x4
1409 8B4E F0 04 beq uppernibble
1410
1411 8B50 0A asl
1412 8B51 0A asl
1413 8B52 0A asl
1414 8B53 0A asl
1415 8B54 uppernibble
1416 8B54 2A rol
1417 8B55 8D 4D 48 sta StoreA4x4
1418 8B58 B0 03 bcs EmptyPixel ; the font I drawn is in inverse ...
1419 ;lda plot4x4color ;these lines are not necessary
1420 ;sta color ;if a plots are one color only
1421 8B5A 20 0C 89 jsr plot
1422 ;jmp Loop4x4Continued
1423 8B5D EmptyPixel
1424 ;lda #1 ;reverse color (color==1-color)
1425 ;sec
1426 ;sbc plot4x4color
1427 ;sta color
1428 ;jsr plot
1429 ;this is turned off for speed
1430 ;anyway we assume the text is being drawn
1431 ;over an empty space
1432 8B5D Loop4x4Continued
1433 8B5D 18 A5 80 69 01 85 + adw xdraw #1
1434 8B68 AD 4D 48 lda StoreA4x4
1435 8B6B CE 4E 48 dec Xcounter4x4
1436 8B6E AE 4E 48 ldx Xcounter4x4
1437 8B71 D0 E1 bne uppernibble
1438 ; here we have on screen one line of the char
1439 8B73 18 A5 82 69 01 85 + adw ydraw #1
1440 8B7E 38 A5 80 E9 04 85 + sbw xdraw #4
1441 8B89 38 AD 4C 48 E9 20 + sbw y4x4 #32
1442 8B97 CE 4B 48 AD 4B 48 dec:lda LoopCounter4x4
1443 8B9D D0 A1 bne nextline4x4
1444
1445 8B9F 60 rts
1446 .endp
1447 ; ------------------------------------------
1448 8BA0 PutChar4x4FULL .proc;
1449 ;this routine works just like PutChar4x4,
1450 ;but this time all pixels are being drawn
1451 ;(empty and not empty)
1452 ;--------------------------------------------------
1453 8BA0 AD 51 48 lda plot4x4color
1454 8BA3 8D CA 3E sta color
1455
1456 ; calculating address of the first byte
1457 8BA6 A9 04 8D 4B 48 mva #4 LoopCounter4x4
1458 8BAB AD 50 48 lda CharCode4x4
1459 8BAE 29 01 and #1
1460 8BB0 8D 4F 48 sta nibbler4x4
1461 8BB3 AD 50 48 lda CharCode4x4
1462 8BB6 6A ror
1463 ; in carry there is which nibble of the byte is to be taken clc
1464 8BB7 18 clc
1465 8BB8 69 60 adc #(3*32)
1466 8BBA 8D 4C 48 sta y4x4
1467 8BBD nextline4x4FULL
1468 8BBD A9 04 8D 4E 48 mva #4 Xcounter4x4
1469 8BC2 AC 4C 48 ldy y4x4
1470 8BC5 B9 AA 8E lda font4x4,y
1471
1472 8BC8 AE 4F 48 ldx nibbler4x4
1473 8BCB F0 04 beq uppernibbleFULL
1474
1475 8BCD 0A asl
1476 8BCE 0A asl
1477 8BCF 0A asl
1478 8BD0 0A asl
1479 8BD1 uppernibbleFULL
1480 8BD1 2A rol
1481 8BD2 8D 4D 48 sta StoreA4x4
1482 8BD5 B0 0C bcs EmptyPixelFULL
1483 8BD7 AD 51 48 lda plot4x4color ;these lines are not necessary
1484 8BDA 8D CA 3E sta color ;if a plots are one color only
1485 8BDD 20 0C 89 jsr plot
1486 8BE0 4C EF 8B jmp Loop4x4ContinuedFULL
1487 8BE3 EmptyPixelFULL
1488 8BE3 A9 01 lda #1 ;reverse color (color==1-color)
1489 8BE5 38 sec
1490 8BE6 ED 51 48 sbc plot4x4color
1491 8BE9 8D CA 3E sta color
1492 8BEC 20 0C 89 jsr plot
1493 ;this is turned on now
1494 ;of course it is slower
1495
1496 8BEF Loop4x4ContinuedFULL
1497 8BEF 18 A5 80 69 01 85 + adw xdraw #1
1498 8BFA AD 4D 48 lda StoreA4x4
1499 8BFD CE 4E 48 dec Xcounter4x4
1500 8C00 AE 4E 48 ldx Xcounter4x4
1501 8C03 D0 CC bne uppernibbleFULL
1502 ; here we have on screen one line of the char
1503 8C05 18 A5 82 69 01 85 + adw ydraw #1
1504 8C10 38 A5 80 E9 04 85 + sbw xdraw #4
1505 8C1B 38 AD 4C 48 E9 20 + sbw y4x4 #32
1506 8C29 CE 4B 48 AD 4B 48 dec:lda LoopCounter4x4
1507 8C2F D0 8C bne nextline4x4FULL
1508
1509 8C31 60 rts
1510 .endp
1511
1512 .endif
1110 ;----------------------------------------------
1111 8C32 icl 'ai.asm'
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=program.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 8C32 MakeLowResDistances .proc
13 ; create low precision table of positions
14 ; by dividing positions by 4
15
16 8C32 A0 05 ldy #MaxPlayers-1
17 8C34 loop
18 8C34 B9 97 3D lda xtankstableL,y
19 8C37 85 91 sta temp
20 8C39 B9 9D 3D lda xtankstableH,y
21 8C3C 85 92 sta temp+1
22
23 ;= /4
24 8C3E 46 92 66 91 46 92 + :2 lsrw temp
25 8C46 A5 91 lda temp
26 8C48 99 A9 3D sta LowResDistances,y
27 8C4B 88 dey
28 8C4C 10 E6 bpl loop
29 8C4E 60 rts
30 .endp
31
32 ;----------------------------------------------
33 8C4F ArtificialIntelligence .proc ;
34 ; A - skill of the TankNr
35 ; returns shoot energy and angle in
36 ; EnergyTable/L/H and AngleTable
37 ;----------------------------------------------
38 8C4F 0A asl
39 8C50 AA tax
40 8C51 CA CA :2 dex ;credit KK
41 8C53 BD 5D 8C lda AIRoutines+1,x
42 8C56 48 pha
43 8C57 BD 5C 8C lda AIRoutines,x
44 8C5A 48 pha
45 8C5B 60 rts
46 .endp
47 ;----------------
48 8C5C AIRoutines
49 8C5C 6B 8C .word Moron-1
50 8C5E 8B 8C .word Shooter-1 ;Shooter
51 8C60 2A 8D .word Poolshark-1 ;Poolshark
52 8C62 2A 8D .word Poolshark-1 ;Toosser
53 8C64 2A 8D .word Poolshark-1 ;Chooser
54 8C66 2A 8D .word Poolshark-1 ;Spoiler
55 8C68 2A 8D .word Poolshark-1 ;Cyborg
56 8C6A 2A 8D .word Poolshark-1 ;Unknown
57
58 ;----------------------------------------------
59 8C6C Moron .proc
60 8C6C A6 8B ldx TankNr
61 8C6E 20 89 73 jsr RandomizeAngle
62 8C71 8D 88 3D sta NewAngle
63 8C74 A9 50 8D C7 50 A9 + mwa #80 RandBoundaryLow
64 8C7E A9 20 8D C9 50 A9 + mwa #800 RandBoundaryHigh
65 8C88 20 97 73 jsr RandomizeForce
66 8C8B 60 rts
67 .endp
68 ;----------------------------------------------
69 8C8C Shooter .proc
70
71 8C8C A6 8B ldx TankNr
72 8C8E BD A9 50 lda PreviousAngle,x
73 8C91 1D AF 50 ora PreviousEnergyL,x
74 8C94 1D BB 50 ora PreviousEnergyH,x
75 8C97 F0 22 beq firstShoot
76
77 8C99 BD A9 50 lda PreviousAngle,x
78 8C9C 18 clc
79 8C9D 69 05 adc #5
80 8C9F 30 08 bmi leftQuadrant
81 8CA1 C9 5A cmp #90
82 8CA3 90 04 bcc continue
83 8CA5 A9 A6 lda #(-90)
84 8CA7 D0 00 bne continue
85 8CA9 leftQuadrant
86
87
88
89 8CA9 continue
90 8CA9 8D 88 3D sta NewAngle
91
92 8CAC BD AF 50 lda PreviousEnergyL,x
93 8CAF 9D 6A 3D sta EnergyTableL,x
94 8CB2 BD BB 50 lda PreviousEnergyH,x
95 8CB5 9D 70 3D sta EnergyTableH,x
96
97 8CB8 4C 01 8D jmp endo
98 8CBB firstShoot
99 ; compare the x position with the middle of the screen
100 8CBB BD 97 3D lda xTanksTableL,x
101 8CBE 85 91 sta temp
102 8CC0 BD 9D 3D lda xTanksTableH,x
103 8CC3 85 92 sta temp+1
104 8CC5 A5 92 C9 00 D0 04 + cpw temp #(screenwidth/2)
105 8CCF B0 0E bcs tankIsOnTheRight
106
107 8CD1 AD 0A D2 lda RANDOM
108 8CD4 29 1F and #$1F
109 8CD6 18 clc
110 8CD7 69 05 adc #5
111 ;lda #45
112
113 8CD9 8D 88 3D sta NewAngle
114 8CDC 4C EA 8C jmp forceNow
115 8CDF tankIsOnTheRight
116 8CDF AD 0A D2 lda RANDOM
117 8CE2 29 1F and #$1F
118 8CE4 18 clc
119 8CE5 69 AB adc #(-85)
120 ;lda #-45
121 8CE7 8D 88 3D sta NewAngle
122
123 8CEA forceNow
124 8CEA A9 64 8D C7 50 A9 + mwa #100 RandBoundaryLow
125 8CF4 A9 20 8D C9 50 A9 + mwa #800 RandBoundaryHigh
126 8CFE 20 97 73 jsr RandomizeForce
127
128 8D01 endo
129 8D01 A6 8B ldx TankNr ;this is possibly not necessary
130 8D03 AD 88 3D lda NewAngle
131 8D06 9D A9 50 sta PreviousAngle,x
132 8D09 BD 6A 3D lda EnergyTableL,x
133 8D0C 9D AF 50 sta PreviousEnergyL,x
134 8D0F BD 70 3D lda EnergyTableH,x
135 8D12 9D BB 50 sta PreviousEnergyH,x
136
137 ; choose the best weapon
138
139 8D15 BD 07 41 lda TanksWeaponsTableL,x
140 8D18 85 91 sta temp
141 8D1A BD 0D 41 lda TanksWeaponsTableH,x
142 8D1D 85 92 sta temp+1
143 8D1F A0 20 ldy #32 ;the last weapon
144 8D21 loop
145 8D21 88 dey
146 8D22 B1 91 lda (temp),y
147 8D24 F0 FB beq loop
148 8D26 98 tya
149 8D27 9D 89 3D sta ActiveWeapon,x
150 8D2A 60 rts
151 .endp
152 ;----------------------------------------------
153 8D2B Poolshark .proc
154
155 8D2B firstShoot
156 ;find nearest tank neighbour
157 8D2B 20 32 8C jsr MakeLowResDistances
158 8D2E A9 FF 85 93 mva #$ff temp2 ; min possible distance
159
160 8D32 A6 8B ldx TankNr
161 8D34 AC 19 3D ldy NumberOfPlayers
162 8D37 88 dey
163
164 8D38 loop01
165 8D38 C4 8B cpy TankNr
166 8D3A F0 43 beq skipThisPlayer
167 8D3C B9 51 3D lda eXistenZ,y
168 8D3F F0 3E beq skipThisPlayer
169
170 8D41 BD A9 3D lda LowResDistances,x
171 8D44 D9 A9 3D cmp LowResDistances,y
172 8D47 B0 1D bcs EnemyOnTheLeft
173 ;enemy on the right
174 8D49 38 sec
175 8D4A B9 A9 3D lda LowResDistances,y
176 8D4D FD A9 3D sbc LowResDistances,x
177 8D50 C5 93 cmp temp2 ; lowest
178 8D52 B0 2B bcs lowestIsLower
179 8D54 85 93 sta temp2
180 8D56 84 94 sty temp2+1 ; number of the closest tank
181 ; calculate index to shotangle table
182 8D58 4A 4A 4A :3 lsr @
183 8D5B 29 07 and #%00000111
184 8D5D 18 clc
185 8D5E 69 08 adc #8
186 8D60 8D CB 50 sta AngleTablePointer
187 8D63 4C 7F 8D jmp lowestIsLower
188
189 8D66 EnemyOnTheLeft
190 8D66 38 sec
191 8D67 BD A9 3D lda LowResDistances,x
192 8D6A F9 A9 3D sbc LowResDistances,y
193 8D6D C5 93 cmp temp2 ; lowest
194 8D6F B0 0E bcs lowestIsLower
195 8D71 85 93 sta temp2
196 8D73 84 94 sty temp2+1 ; number of the closest tank
197 ; calculate index to shotangle table
198 8D75 4A 4A 4A :3 lsr @
199 8D78 29 07 and #%00000111
200 8D7A 49 07 eor #%00000111
201 8D7C 8D CB 50 sta AngleTablePointer
202
203 8D7F lowestIsLower
204 8D7F skipThisPlayer
205 8D7F 88 dey
206 8D80 10 B6 bpl loop01
207
208 8D82 randomize 0 8
Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 8D82 ?rand
4 8D82 AD 0A D2 lda random
5 8D85 C9 00 cmp #0 ;floor
6 8D87 90 F9 bcc ?rand
7 8D89 C9 09 cmp #8+1 ;ceiling
8 8D8B B0 F5 bcs ?rand
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm
209 8D8D AC CB 50 ldy AngleTablePointer
210 8D90 18 clc
211 8D91 79 C6 8D adc AngleTable,y
212 8D94 8D 88 3D sta NewAngle
213
214 8D97 forceNow
215 8D97 A9 2C 8D C7 50 A9 + mwa #300 RandBoundaryLow
216 8DA1 A9 BC 8D C9 50 A9 + mwa #700 RandBoundaryHigh
217 8DAB 20 97 73 jsr RandomizeForce
218
219 8DAE endo
220 8DAE A6 8B ldx TankNr ;this is possibly not necessary
221
222 ; choose the best weapon
223
224 8DB0 BD 07 41 lda TanksWeaponsTableL,x
225 8DB3 85 91 sta temp
226 8DB5 BD 0D 41 lda TanksWeaponsTableH,x
227 8DB8 85 92 sta temp+1
228 8DBA A0 20 ldy #32 ;the last weapon
229 8DBC loop
230 8DBC 88 dey
231 8DBD B1 91 lda (temp),y
232 8DBF F0 FB beq loop
233 8DC1 98 tya
234 8DC2 9D 89 3D sta ActiveWeapon,x
235 8DC5 60 rts
236
237 ;----------------------------------------------
238 8DC6 AngleTable ; 16 bytes ;ba w $348b L$3350
239 8DC6 B2 BA C2 CA D2 DA + .by 178,186,194,202,210,218,226,234
240 8DCE 10 18 20 28 30 38 + .by 16,24,32,40,48,56,64,72
241 .endp
242 ;----------------------------------------------
243 8DD6 PurchaseAI .proc ;
244 ; A - skill of the TankNr
245 ; makes purchase for AI opponents
246 ; results of this routine are not visible on the screen
247 ;----------------------------------------------
248 8DD6 0A asl
249 8DD7 AA tax
250 8DD8 CA CA :2 dex ;credit KK
251 8DDA BD E4 8D lda PurchaseAIRoutines+1,x
252 8DDD 48 pha
253 8DDE BD E3 8D lda PurchaseAIRoutines,x
254 8DE1 48 pha
255 8DE2 60 rts
256 .endp
257
258 ;----------------
259 8DE3 PurchaseAIRoutines
260 8DE3 F2 8D .word MoronPurchase-1
261 8DE5 41 8E .word ShooterPurchase-1 ;ShooterPurchase
262 8DE7 5A 8E .word PoolsharkPurchase-1 ;PoolsharkPurchase
263 8DE9 5A 8E .word PoolsharkPurchase-1 ;ToosserPurchase
264 8DEB 5A 8E .word PoolsharkPurchase-1 ;ChooserPurchase
265 8DED 5A 8E .word PoolsharkPurchase-1 ;SpoilerPurchase
266 8DEF 5A 8E .word PoolsharkPurchase-1 ;CyborgPurchase
267 8DF1 5A 8E .word PoolsharkPurchase-1 ;UnknownPurchase
268
269 ;----------------------------------------------
270 8DF3 MoronPurchase
271 ;Moron buys nothing
272 8DF3 60 rts
273
274 ;-------
275 8DF4 TryToPurchaseOnePiece .proc
276 ; A - weapon number, better it will be in range(1,32)
277 ; TankNr in X
278 8DF4 A8 tay
279 8DF5 B9 74 8E lda PurchaseMeTable,y
280 8DF8 F0 47 beq SorryNoPurchase
281 8DFA B9 D9 4B lda WeaponPriceL,y
282 8DFD 85 91 sta temp
283 8DFF B9 99 4B lda WeaponPriceH,y
284 8E02 85 92 sta temp+1
285 ;price of the weapon in temp
286 8E04 BD 2C 3D lda MoneyL,x
287 8E07 85 93 sta temp2
288 8E09 BD 26 3D lda MoneyH,x
289 8E0C 85 94 sta temp2+1
290 ;current monies in temp2
291 8E0E A5 94 C5 92 D0 04 + cpw temp2 temp
292 8E18 90 27 bcc SorryNoPurchase
293 ; deduct monies from the bank account
294 8E1A 38 sec
295 8E1B A5 93 lda temp2
296 8E1D E5 91 sbc temp
297 8E1F 9D 2C 3D sta MoneyL,x
298 8E22 A5 94 lda temp2+1
299 8E24 E5 92 sbc temp+1
300 8E26 9D 26 3D sta MoneyH,x
301
302 8E29 BD 07 41 lda TanksWeaponsTableL,x
303 8E2C 85 91 sta temp
304 8E2E BD 0D 41 lda TanksWeaponsTableH,x
305 8E31 85 92 sta temp+1
306
307 8E33 B9 19 4C lda WeaponUnits,y
308 8E36 18 clc
309 8E37 71 91 adc (temp),y
310 8E39 C9 63 cmp #99 ;max number of weapon units
311 8E3B 90 02 bcc NotExceeded
312 8E3D A9 63 lda #99
313 8E3F NotExceeded
314 8E3F 91 91 sta (temp),y
315
316
317 8E41 SorryNoPurchase
318 8E41 60 rts
319 .endp
320
321
322 ;----------------------------------------------
323 8E42 ShooterPurchase .proc
324 8E42 A9 04 85 95 mva #4 tempXroller; number of purchases to perform
325
326 8E46 A6 8B ldx TankNr
327 8E48 loop
328 8E48 randomize 1 14
Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 8E48 ?rand
4 8E48 AD 0A D2 lda random
5 8E4B C9 01 cmp #1 ;floor
6 8E4D 90 F9 bcc ?rand
7 8E4F C9 0F cmp #14+1 ;ceiling
8 8E51 B0 F5 bcs ?rand
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm
329 8E53 20 F4 8D jsr TryToPurchaseOnePiece
330 8E56 C6 95 dec tempXroller
331 8E58 D0 EE bne loop
332
333 8E5A 60 rts
334 .endp
335 ;----------------------------------------------
336 8E5B PoolsharkPurchase .proc
337 8E5B A9 08 85 95 mva #8 tempXroller; number of purchases to perform
338
339 8E5F A6 8B ldx TankNr
340 8E61 loop
341 8E61 randomize 1 30
Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea]
3 8E61 ?rand
4 8E61 AD 0A D2 lda random
5 8E64 C9 01 cmp #1 ;floor
6 8E66 90 F9 bcc ?rand
7 8E68 C9 1F cmp #30+1 ;ceiling
8 8E6A B0 F5 bcs ?rand
Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm
342 8E6C 20 F4 8D jsr TryToPurchaseOnePiece
343 8E6F C6 95 dec tempXroller
344 8E71 D0 EE bne loop
345
346 8E73 60 rts
347 .endp
348
349
350 8E74 PurchaseMeTable .proc ;weapons good to be purchased by the robot
351 ;the comment is an index in the tables
352 8E74 01 dta 1 ;"Baby Missile " ; 0
353 8E75 01 dta 1 ;"Missile " ; 1
354 8E76 01 dta 1 ;"Baby Nuke " ; 2
355 8E77 01 dta 1 ;"Nuke " ; 3
356 8E78 01 dta 1 ;"LeapFrog " ; 4
357 8E79 01 dta 1 ;"Funky Bomb " ; 5
358 8E7A 01 dta 1 ;"MIRV " ; 6
359 8E7B 01 dta 1 ;"Death's Head " ; 7
360 8E7C 00 dta 0 ;"Napalm " ; 8
361 8E7D 00 dta 0 ;"Hot Napalm " ; 9
362 8E7E 00 dta 0 ;"Tracer " ; 10
363 8E7F 00 dta 0 ;"Smoke Tracer " ; 11
364 8E80 01 dta 1 ;"Baby Roller " ; 12
365 8E81 01 dta 1 ;"Roller " ; 13
366 8E82 01 dta 1 ;"Heavy Roller " ; 14
367 8E83 00 dta 0 ;"Riot Charge " ; 15
368 8E84 00 dta 0 ;"Riot Blast " ; 16
369 8E85 00 dta 0 ;"Riot Bomb " ; 17
370 8E86 00 dta 0 ;"Heavy Riot Bomb " ; 18
371 8E87 00 dta 0 ;"Baby Digger " ; 19
372 8E88 00 dta 0 ;"Digger " ; 20
373 8E89 00 dta 0 ;"Heavy Digger " ; 21
374 8E8A 00 dta 0 ;"Baby Sandhog " ; 22
375 8E8B 00 dta 0 ;"Sandhog " ; 23
376 8E8C 00 dta 0 ;"Heavy Sandhog " ; 24
377 8E8D 00 dta 0 ;"Dirt Clod " ; 25
378 8E8E 00 dta 0 ;"Dirt Ball " ; 26
379 8E8F 00 dta 0 ;"Ton of Dirt " ; 27
380 8E90 01 dta 1 ;"Liquid Dirt " ; 28
381 8E91 00 dta 0 ;"Dirt Charge " ; 29
382 8E92 00 dta 0 ;"Earth Disrupter " ; 30
383 8E93 01 dta 1 ;"Plasma Blast " ; 31
384 8E94 01 dta 1 ;"Laser " ; 32
385 8E95 00 dta 0 ;"----------------" ; 33
386 8E96 00 dta 0 ;"----------------" ; 34
387 8E97 00 dta 0 ;"----------------" ; 35
388 8E98 00 dta 0 ;"----------------" ; 36
389 8E99 00 dta 0 ;"----------------" ; 37
390 8E9A 00 dta 0 ;"----------------" ; 38
391 8E9B 00 dta 0 ;"----------------" ; 39
392 8E9C 00 dta 0 ;"----------------" ; 40
393 8E9D 00 dta 0 ;"----------------" ; 41
394 8E9E 00 dta 0 ;"----------------" ; 42
395 8E9F 00 dta 0 ;"----------------" ; 43
396 8EA0 00 dta 0 ;"----------------" ; 44
397 8EA1 00 dta 0 ;"----------------" ; 45
398 8EA2 00 dta 0 ;"----------------" ; 46
399 8EA3 00 dta 0 ;"----------------" ; 47
400
401 .endp
402
1112 ;----------------------------------------------
1113
1114 8EA4 52 32 72 92 B2 02 TankColoursTable .BYTE $52,$32,$72,$92,$B2,$02
1115
1116 8EAA font4x4
1117 8EAA FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62
1118 ;----------------------------------------------
1119 8F2A TankFont
1120 8F2A 00 00 00 00 00 00 + ins 'artwork/tanks.fnt'
1121 932A TankFontend
1122 .if TankFontEnd>$9800
1123 .error memory conflict
1124 ;this is to warn if code and P/M graphics
1125 ;overlap!
1126 .endif
1127 ;----------------------------------------------
1128 ; Player/missile memory
1129 ORG $9800
1130 9800 pmgraph
1131
1132 ;----------------------------------------------
1133 ORG $a400
1134 A400 WeaponFont
1135 A400-A7FF> 00 00 00 00 + ins 'artwork/weapons.fnt'
1136 ;----------------------------------------------
1137 A800 TheEnd
1138 .if TheEnd>$c000
1139 .error memory conflict
1140
1141 .endif
1142
1143
1144 02E0-02E1> 3B 5B run START