Files
scorch_src/scorchC64.lst
T
2023-05-09 15:50:19 +02:00

11713 lines
452 KiB
Plaintext

mads 2.1.5 build 3 (21 Feb 22)
Source: scorchC64.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2 ;C64 8-bit Scorched Earth source code
3 ;---------------------------------------------------
4 ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski
5 ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013
6 ;Miami & Warsaw 2022, 2023
7
8 ;---------------------------------------------------
9 = 0040 .def TARGET = 64 ; :)
10 ;---------------------------------------------------
11 = 0000 .def XCORRECTION_FOR_PM = 0
12 ; if 1 - active x position of tanks correction fo PMG
13 = 0000 .def FASTER_GRAF_PROCS = 0
14 ; if 1 - activates faster graphics routines
15 ; (direct writes to screen memory - atari only :) )
16 ;---------------------------------------------------
17
18
19 opt h-f+
20 org $801
21 0801 01 08 org [a($801)],$801
22 0801 basic_start(FirstSTART)
Macro: BASIC_START [Source: MACRO.ASM]
2 0801 0C 08 .word upstartEnd // link address
3 0803 0A 00 .word 10 // line num
4 0805 9E .byte $9e // sys
6 = 0000 ?a=0
7 = 0000 ?b=0
8 = 0000 ?c=0
9 = 0000 ?d=0
10 = 0000 ?e=0
12 = 536A ?v = (FIRSTSTART)
15 = 0002 ?a=?v/10000
16 = 054A ?v=?v-(?a*10000)
20 = 0001 ?b=?v/1000
21 = 0162 ?v=?v-(?b*1000)
25 = 0003 ?c=?v/100
26 = 0036 ?v=?v-(?c*100)
30 = 0005 ?d=?v/10
31 = 0004 ?v=?v-(?d*10)
34 = 0004 ?e=?v%10
36 0806 32 31 33 35 34 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
38 080B 00 .byte 0
39 080C upstartEnd
40 080C 00 00 .word 0 // empty link signals the end of the program
Source: scorchC64.asm
23
24
25 ;---------------------------------------------------
26 .macro build
27 dta d"1.28" ; number of this build (4 bytes)
28 .endm
29
30 .macro RMTSong
31 lda #:1 ; do nothing in C64
32 .endm
33
34 ;---------------------------------------------------
35 080E icl 'definitions.asm'
Source: definitions.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 = 00C8 screenheight = 200
4 = 0028 screenBytes = 40
5 = 0140 screenwidth = screenBytes*8 ; Max screenwidth = 512!!!
6
7 = 0008 TankWidth = 8
8 ;----------------------------------------------
9 ; Player/missile memory
10 = 1800 PMGraph = $1800 ; real PM start = PMGraph + $0300
11 ; Generated tables
12 = 2010 display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?)
13 ;----------------------------------------------
14
15 = 0028 margin = 40 ;mountain drawing Y variable margin
16 = 0006 MaxPlayers = 6
17 = 0009 maxOptions = 9 ;number of all options
18 = 002C PMOffsetX = $2C ; P/M to graphics offset
19 = 002A PMOffsetY = $2A ; P/M to graphics offset
20 = 000A napalmRadius = 10
21 = 0006 StandardBarrel = 6 ; standard tank barrel length
22 = 0014 LongBarrel = 20 ; long barrel length
23
24 = 0002 TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor
25 = 000A TextForegroundColor = $0A
26 = 0000 space = 0 ; space in screencodes
27
28 = 000A KeyRepeatSpeed = 10 ; (max 127 !!!)
29
30 ;character codes for symbols (tank, parachute, etc. )
31 = 0002 char_parachute_______ = $02
32 = 001E char_flag____________ = $1e
33 = 0014 char_flame___________ = $14
34 = 001C char_clear_flame_____ = $1c
35 = 0004 char_digger__________ = $04
36 = 000C char_sandhog_________ = $0c
37 = 0008 char_sandhog_offset = char_sandhog_________ - char_digger__________
38 = 0020 char_tank1___________ = $20
39 = 0024 char_tank2___________ = $24
40 = 002C char_tank3___________ = $2c
41 = 0028 char_tank4___________ = $28 ; robotank shape
42
43 ;Weapon prices (*10 on screen)
44 = 0000 price_Baby_Missile___ = 0 ;_00
45 = 0060 price_Missile________ = 96 ;_01
46 = 006F price_Baby_Nuke______ = 111 ;_02
47 = 0090 price_Nuke___________ = 144 ;_03
48 = 00C0 price_LeapFrog_______ = 192 ;_04
49 = 0125 price_Funky_Bomb_____ = 293 ;_05
50 = 01C8 price_MIRV___________ = 456 ;_06
51 = 0151 price_Death_s_Head___ = 337 ;_07
52 = 007D price_Napalm_________ = 125 ;_08
53 = 00A2 price_Hot_Napalm_____ = 162 ;_09
54 = 0066 price_Tracer_________ = 102 ;_10
55 = 0123 price_Smoke_Tracer___ = 291 ;_11
56 = 00D3 price_Baby_Roller____ = 211 ;_12
57 = 00F4 price_Roller_________ = 244 ;_13
58 = 0146 price_Heavy_Roller___ = 326 ;_14
59 = 00E6 price_Riot_Charge____ = 230 ;_15
60 = 00F1 price_Riot_Blast_____ = 241 ;_16
61 = 0103 price_Riot_Bomb______ = 259 ;_17
62 = 0110 price_Heavy_Riot_Bomb = 272 ;_18
63 = 0088 price_Baby_Digger____ = 136 ;_19
64 = 00B0 price_Digger_________ = 176 ;_20
65 = 00CF price_Heavy_Digger___ = 207 ;_21
66 = 009E price_Baby_Sandhog___ = 158 ;_22
67 = 00BF price_Sandhog________ = 191 ;_23
68 = 00DF price_Heavy_Sandhog__ = 223 ;_24
69 = 0068 price_Dirt_Clod______ = 104 ;_25
70 = 0082 price_Dirt_Ball______ = 130 ;_26
71 = 00AB price_Ton_of_Dirt____ = 171 ;_27
72 = 014A price_Liquid_Dirt____ = 330 ;_28
73 = 0157 price_Dirt_Charge____ = 343 ;_29
74 = 00AA price_Buy_me_________ = 170 ;_30
75 = 0115 price_Laser__________ = 277 ;_31
76 = 0000 price_White_Flag_____ = $0 ;_32
77 = 012C price_Battery________ = 300 ;_33
78 = 0160 price_Hovercraft_____ = 352 ;_34
79 = 00EA price_Parachute______ = 234 ;_35
80 = 03E8 price_StrongParachute = 1000 ;_36
81 = 02E9 price_Mag_Deflector__ = 745 ;_37
82 = 00E0 price_Shield_________ = 224 ;_38
83 = 0274 price_Heavy_Shield___ = 628 ;_39
84 = 044C price_Force_Shield___ = 1100 ;_40
85 = 0200 price_Bouncy_Castle__ = 512 ;_41
86 = 0834 price_Long_Barrel____ = 2100 ;_42
87 = 03E8 price_Nuclear_Winter_ = 1000 ;_43
88 = 01F4 price_Lazy_Boy_______ = 500 ;_44
89 = 02DA price_Lazy_Darwin____ = 730 ;_45
90 = 00FA price_Auto_Defense___ = 250 ;_46
91 = 0053 price_Spy_Hard_______ = 83 ;_47
92 ;Weapon indexes (numbers)
93 = 0000 ind_Baby_Missile___ = 0
94 = 0000 first_offensive____ = ind_Baby_Missile___
95 = 0001 ind_Missile________ = 1
96 = 0002 ind_Baby_Nuke______ = 2
97 = 0003 ind_Nuke___________ = 3
98 = 0004 ind_LeapFrog_______ = 4
99 = 0005 ind_Funky_Bomb_____ = 5
100 = 0006 ind_MIRV___________ = 6
101 = 0007 ind_Death_s_Head___ = 7
102 = 0008 ind_Napalm_________ = 8
103 = 0009 ind_Hot_Napalm_____ = 9
104 = 000A ind_Tracer_________ = 10
105 = 000B ind_Smoke_Tracer___ = 11
106 = 000C ind_Baby_Roller____ = 12
107 = 000D ind_Roller_________ = 13
108 = 000E ind_Heavy_Roller___ = 14
109 = 000F ind_Riot_Charge____ = 15
110 = 0010 ind_Riot_Blast_____ = 16
111 = 0011 ind_Riot_Bomb______ = 17
112 = 0012 ind_Heavy_Riot_Bomb = 18
113 = 0013 ind_Baby_Digger____ = 19
114 = 0014 ind_Digger_________ = 20
115 = 0015 ind_Heavy_Digger___ = 21
116 = 0016 ind_Baby_Sandhog___ = 22
117 = 0017 ind_Sandhog________ = 23
118 = 0018 ind_Heavy_Sandhog__ = 24
119 = 0019 ind_Dirt_Clod______ = 25
120 = 001A ind_Dirt_Ball______ = 26
121 = 001B ind_Ton_of_Dirt____ = 27
122 = 001C ind_Liquid_Dirt____ = 28
123 = 001D ind_Dirt_Charge____ = 29
124 = 001E ind_Buy_me_________ = 30
125 = 001F ind_Laser__________ = 31
126 = 001F last_offensive_____ = ind_Laser__________
127 = 0020 ind_White_Flag_____ = 32
128 = 0020 first_defensive____ = ind_White_Flag_____
129 = 0021 ind_Battery________ = 33
130 = 0022 ind_Hovercraft_____ = 34
131 = 0023 ind_Parachute______ = 35
132 = 0024 ind_StrongParachute = 36
133 = 0025 ind_Mag_Deflector__ = 37
134 = 0026 ind_Shield_________ = 38
135 = 0027 ind_Heavy_Shield___ = 39
136 = 0028 ind_Force_Shield___ = 40
137 = 0029 ind_Bouncy_Castle__ = 41
138 = 002A ind_Long_Barrel____ = 42
139 = 002B ind_Nuclear_Winter_ = 43
140 = 002C ind_Lazy_Boy_______ = 44
141 = 002D ind_Lazy_Darwin____ = 45
142 = 002E ind_Auto_Defense___ = 46
143 = 002F ind_Spy_Hard_______ = 47
144 = 002F last_defensive_____ = ind_Spy_Hard_______
145 = 0029 last_real_defensive = ind_Bouncy_Castle__
146 = 0020 number_of_offensives = last_offensive_____ - first_offensive____+1
147 = 0010 number_of_defensives = (last_defensive_____ - first_defensive____+1)
148 = 0030 number_of_weapons = number_of_offensives + number_of_defensives
149 ;--------------------------------
150 ; names of RMT instruments (sfx)
151 ;--------------------------------
152 = 0000 sfx_set_power_1 = $00 ;A
153 = 0001 sfx_set_power_2 = $01 ;b
154 = 0002 sfx_lightning = $02 ;c
155 = 0003 sfx_dunno = $03 ;d
156 = 0004 sfx_nuke = $04 ;e
157 = 0005 sfx_baby_missile= $05 ;f
158 = 0006 sfx_death_begin = $06 ;g
159 = 0007 sfx_plasma_1_2 = $07 ;h
160 = 0008 sfx_plasma_2_2 = $08 ;i
161 = 0009 sfx_napalm = $09 ;j
162 = 000A sfx_dirt_charge = $0a ;k
163 = 000B sfx_missile_hit = $0b ;l
164 = 000C sfx_funky_hit = $0c ;m
165 = 000D sfx_shield_on = $0d ;n
166 = 000E sfx_shield_off = $0e ;o
167 = 000F sfx_parachute = $0f ;p
168 = 0010 sfx_smoke_cloud = $10 ;q
169 = 0011 sfx_riot_blast = $11 ;r
170 = 0012 sfx_sandhog = $12 ;s
171 = 0013 sfx_dirt_chrg_s = $13 ;t
172 = 0014 sfx_digger = $14 ;u
173 = 0015 sfx_silencer = $15 ;v
174 = 0016 sfx_next_player = $16 ;w
175 = 0017 sfx_purchase = $17 ;x
176 = 0018 sfx_keyclick = $18 ;y
177 = 0019 sfx_shoot = $19 ;z
178 = 001A sfx_seppuku = $1a ;1
179 = 001B sfx_liquid_dirt = $1b ;2
180 = 001C sfx_battery = $1c ;3
181 = 001D sfx_white_flag = $1d ;4
182 = 001E sfx_long_barrel = $1e
183 = 001F sfx_tank_move = $1f
184 = 002B sfx_auto_defense= $2b
185 = 002C sfx_lazy_boys = $2c
186 ;--------------------------------
187 ; RMT songs (lines)
188 ;--------------------------------
189 = 0000 song_silencio = $00
190 = 0002 song_main_menu = $02
191 = 0006 song_ingame = $06
192 = 000B song_round_over = $0b
193 = 000E song_ending_looped = $0e
194 = 001B song_supermarket = $1b
195 = 001D song_inventory = $1d
36 ;---------------------------------------------------
37
38 = 0058 FirstZpageVariable = $58 ; $57
39 080E .zpvar DliColorBack .byte = FirstZpageVariable
40 080E .zpvar GradientNr .byte
41 080E .zpvar GradientColors .word
42 080E .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn)
43 080E .zpvar JoystickNumber .byte
44 080E .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing
45 080E .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory
46 080E .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on)
47 080E .zpvar xdraw .word ;= $64 ;variable X for plot
48 080E .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen)
49 080E .zpvar xbyte .word
50 080E .zpvar ybyte .word
51 080E .zpvar CharCode .byte
52 080E .zpvar fontind .word
53 080E .zpvar tanknr .byte
54 080E .zpvar TankSequencePointer .byte
55 080E .zpvar oldplot .word
56 080E .zpvar xc .word
57 080E .zpvar temp .word ;temporary word for the most embeded loops only
58 080E .zpvar temp2 .word ;same as above
59 080E .zpvar modify .word ;origially used to replace self-modyfying code
60 080E .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine)
61 080E .zpvar xtempDRAW .word ;same as above for XDRAW routine
62 080E .zpvar ytempDRAW .word ;same as above for XDRAW routine
63 080E .zpvar tempor2 .word
64 080E .zpvar CreditsVScrol .byte
65 ;--------------temps used in circle routine
66 080E .zpvar xi .word ;X (word) in draw routine
67 080E .zpvar fx .byte
68 080E .zpvar yi .word ;Y (word) in draw routine
69 080E .zpvar fy .byte
70 080E .zpvar xk .word
71 080E .zpvar fs .byte
72 080E .zpvar yc .byte ;ycircle - temporary for circle
73 080E .zpvar dx .word
74 080E .zpvar dy .word
75 080E .zpvar dd .word
76 080E .zpvar di .word
77 080E .zpvar dp .word
78 ;----------------------------
79 080E .zpvar UnderTank1 .byte
80 080E .zpvar UnderTank2 .byte
81 ;----------------------------
82 080E .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight)
83 080E .zpvar weaponPointer .word
84 080E .zpvar dliCounter .byte
85 080E .zpvar pressTimer .byte
86 080E .zpvar NTSCcounter .byte
87 080E .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling
88 080E .zpvar sfx_effect .byte
89 080E .zpvar RMT_blocked .byte
90 080E .zpvar ScrollFlag .byte
91 080E .zpvar SkStatSimulator .byte
92 080E .zpvar FloatingAlt .byte ; floating tank altitude
93 080E .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen
94
95 ; --------------OPTIMIZATION VARIABLES--------------
96 080E .zpvar Force .word
97 080E .zpvar Force_ .byte ; Force is 3 bytes long
98 080E .zpvar Angle .byte
99 080E .zpvar Parachute .byte ; are you insured with parachute?
100 080E .zpvar color .byte
101 080E .zpvar Erase .byte ; if 1 only mask of the character is printed
102 ; on the graphics screen. if 0 character is printed normally
103 080E .zpvar radius .byte
104 080E .zpvar decimal .word
105 080E .zpvar NumberOfPlayers .byte ;current number of players (counted from 1)
106 080E .zpvar Counter .byte ;temporary Counter for outside loops
107 080E .zpvar ExplosionRadius .byte
108 080E .zpvar FunkyBombCounter .byte
109 080E .zpvar ResultY .byte
110 080E .zpvar xcircle .word
111 080E .zpvar ycircle .word
112 080E .zpvar vy .word
113 080E .zpvar vy_ .word ; 4 bytes
114 080E .zpvar vx .word
115 080E .zpvar vx_ .word ; 4 bytes
116 080E .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
117 080E .zpvar PositionOnTheList .byte ; pointer position on the list being displayed
118 080E .zpvar XHit .word
119 080E .zpvar delta .word
120 080E .zpvar HowMuchToFall .byte
121 080E .zpvar magic .word
122 080E .zpvar xtraj .word
123 080E .zpvar xtraj_ .byte ; 3 bytes
124 080E .zpvar ytraj .word
125 080E .zpvar ytraj_ .byte ; 3 bytes
126 080E .zpvar Wind .word
127 080E .zpvar Wind_ .word ; 4 bytes
128 080E .zpvar RangeLeft .word
129 080E .zpvar RangeRight .word
130 080E .zpvar NewAngle .byte
131 080E .zpvar escFlag .byte
132 080E .zpvar LineYdraw .byte
133 080E .zpvar LineXdraw .word
134 080E .zpvar plot4x4color .byte ; $00 / $ff
135 080E .zpvar Multiplier .word
136 080E .zpvar Multiplier_ .byte ; 3 bytes
137 080E .zpvar HowToDraw .byte
138 080E .zpvar gravity .byte
139 080E .zpvar LineLength .word
140 080E .zpvar tracerflag .byte
141 080E .zpvar isInventory .byte
142 080E .zpvar DifficultyLevel .byte
143 080E .zpvar goleft .byte
144 080E .zpvar OffsetDL1 .byte
145 080E .zpvar L1 .byte
146 = 00B1 HotNapalmFlag = FunkyBombCounter ; reuse variable!
147 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65
148
149 = 0076 displayposition = modify
150 = 00B3 LineAddress4x4 = xcircle
151
152 ;-----------------------------------------------
153 ; libraries
154 ;-----------------------------------------------
155 080E icl 'C64/lib/C64_ATARISYS.ASM'
Source: C64_ATARISYS.ASM
1 ;****************************************************************************
2 ;* ATARI PERSONAL COMPUTER *
3 ;* SYSTEM EQUATES *
4 ;****************************************************************************
5
6 = 0002 FAKEADDR EQU $0002
7
8 = 0002 ATRACT EQU FAKEADDR
9 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK
10 ;
11 ; PAGE TWO RAM ASSIGNMENTS
12 ;
13 = 0002 VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR
14 = 0002 VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR
15 = 0002 VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR
16 = 0002 VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR
17 = 0002 VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR
18 = 0002 VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ
19 = 0002 VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY
20 = 0002 VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE
21 = 0002 VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ
22 = 0002 VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ
23 = 0002 VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ
24 = 0002 VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR
25 = 0002 CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1
26 = 0002 CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2
27 = 0002 CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3
28 = 0002 CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4
29 = 0002 CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5
30 = 0002 VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR
31 = 0002 VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR
32 = 0002 CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS
33 = 0002 CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS
34 = 0002 CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG
35 = 0002 SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR
36 = 0002 CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG
37 = 0002 INTEMP EQU FAKEADDR ;IAN'S TEMP
38 = 0002 CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG
39 = 0002 DMACTLS EQU FAKEADDR ;SAVE DMACTL REG
40 = 0002 DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO
41 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI
42 = 0002 SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM
43 = 0002 LCOUNT EQU FAKEADDR ;LOADER TEMP
44 = 0002 LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL
45 = 0002 LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL
46 = 0002 BRKKY EQU FAKEADDR ;BREAK KEY VECTOR
47 = 0002 RELADR EQU FAKEADDR ;LOADER REL ADDR
48 = 0002 CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV
49 = 0002 CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND
50 = 0002 CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1
51 = 0002 CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2
52 ;TEMP EQU $023E ;TEMPORARY RAM CELL
53 = 0002 ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG
54 = 0002 DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1)
55 = 0002 DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS
56 = 0002 BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS
57 = 0002 COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS
58 = 0002 RECLEN EQU FAKEADDR ;LOADER LENGTH
59 = 0002 DSKTIM EQU FAKEADDR ;DISK TIME OUT REG
60 = 0002 VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP
61 = 0002 KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG
62 = 0002 FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200)
63 = 0002 GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY
64 = 0002 PADDL0 EQU FAKEADDR ;POT 0 RAM CELL
65 = 0002 PADDL1 EQU FAKEADDR
66 = 0002 PADDL2 EQU FAKEADDR
67 = 0002 PADDL3 EQU FAKEADDR
68 = 0002 STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL
69 = 0002 STICK1 EQU FAKEADDR
70 = 0002 PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0
71 = 0002 PTRIG1 EQU FAKEADDR
72 = 0002 PTRIG2 EQU FAKEADDR
73 = 0002 PTRIG3 EQU FAKEADDR
74 = 0002 STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0
75 = 0002 STRIG1 EQU FAKEADDR
76 = 0002 HIBYTE EQU FAKEADDR ;LOADER
77 = 0002 WMODE EQU FAKEADDR ;CASSETTE R/W MODE
78 = 0002 BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE
79 = 0002 IMASK EQU FAKEADDR
80 = 0002 JVECK EQU FAKEADDR ;JUMP VECTOR
81 = 0002 NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS
82 = 0002 TXTROW EQU FAKEADDR ;TEXT ROWCRS
83 = 0002 TXTCOL EQU FAKEADDR ;TEXT COLCRS
84 = 0002 TINDEX EQU FAKEADDR ;TEXT INDEX
85 = 0002 TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD
86 = 0002 TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL
87 = 0002 CRETRY EQU FAKEADDR ;# COMMAND RETRIES
88 = 0002 HOLD3 EQU FAKEADDR
89 = 0002 SUBTMP EQU FAKEADDR
90 = 0002 HOLD2 EQU FAKEADDR
91 = 0002 DMASK EQU FAKEADDR ;PIXEL LOCATION MASK
92 = 0002 TMPLBT EQU FAKEADDR
93 = 0002 ESCFLG EQU FAKEADDR ;ESCAPE FLAG
94 = 0002 TABMAP EQU FAKEADDR ;TAB STOP MAP
95 = 0002 LOGMAP EQU FAKEADDR ;LINE START BIT MAP
96 = 0002 INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG
97 = 0002 FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW
98 = 0002 TMPROW EQU FAKEADDR
99 = 0002 TMPCOL EQU FAKEADDR
100 = 0002 SCRFLG EQU FAKEADDR ;SET IF SCROLLING
101 = 0002 HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW
102 = 0002 DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES
103 = 0002 SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG
104 = 0002 BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN
105 = 0002 PCOLR0 EQU FAKEADDR ;P0 COLOR
106 = 0002 PCOLR1 EQU FAKEADDR ;P1 COLOR
107 = 0002 PCOLR2 EQU FAKEADDR ;P2 COLOR
108 = 0002 PCOLR3 EQU FAKEADDR ;P3 COLOR
109 = 0002 COLOR0 EQU FAKEADDR ;COLOR 0
110 = 0002 COLOR1 EQU FAKEADDR
111 = 0002 COLOR2 EQU FAKEADDR
112 = 0002 COLOR3 EQU FAKEADDR
113 = 0002 COLOR4 EQU FAKEADDR
114 = 0002 COLBAKS EQU COLOR4
115 = 0002 CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM
116 ;
117 ; COLLEEN MNEMONICS
118 ;
119 ; ---------------------------------------------------------------------------
120 = 0002 POKEY EQU FAKEADDR
121 ; ---------------------------------------------------------------------------
122 ;
123 ; READ
124 ;
125 = 0002 POT0 EQU POKEY+$00
126 = 0002 POT1 EQU POKEY+$00
127 = 0002 POT2 EQU POKEY+$00
128 = 0002 POT3 EQU POKEY+$00
129 = 0002 POT4 EQU POKEY+$00
130 = 0002 POT5 EQU POKEY+$00
131 = 0002 POT6 EQU POKEY+$00
132 = 0002 POT7 EQU POKEY+$00
133 = 0002 ALLPOT EQU POKEY+$00
134 = 0002 KBCODE EQU POKEY+$00
135 ; !!!!!
136 ;RANDOM EQU POKEY+$00
137 ;
138 = 0002 POTGO EQU POKEY+$00
139 = 0002 SERIN EQU POKEY+$00
140 = 0002 IRQST EQU POKEY+$00
141 = 0002 SKSTAT EQU POKEY+$00
142 ;
143 ; WRITE
144 ;
145 = 0002 AUDF1 EQU POKEY+$00
146 = 0002 AUDC1 EQU POKEY+$00
147 = 0002 AUDF2 EQU POKEY+$00
148 = 0002 AUDC2 EQU POKEY+$00
149 = 0002 AUDF3 EQU POKEY+$00
150 = 0002 AUDC3 EQU POKEY+$00
151 = 0002 AUDF4 EQU POKEY+$00
152 = 0002 AUDC4 EQU POKEY+$00
153 = 0002 AUDCTL EQU POKEY+$00
154 = 0002 STIMER EQU POKEY+$00
155 = 0002 SKRES EQU POKEY+$00
156 = 0002 SEROUT EQU POKEY+$00
157 = 0002 IRQEN EQU POKEY+$00
158 = 0002 SKCTL EQU POKEY+$00
159 ;
160 ;
161 ;
162 ; ---------------------------------------------------------------------------
163 = 0002 GTIA EQU FAKEADDR
164 ; ---------------------------------------------------------------------------
165 ;
166 ; WRITE
167 ;
168 = 0002 HPOSP0 EQU GTIA+$00
169 = 0002 HPOSP1 EQU GTIA+$00
170 = 0002 HPOSP2 EQU GTIA+$00
171 = 0002 HPOSP3 EQU GTIA+$00
172 = 0002 HPOSM0 EQU GTIA+$00
173 = 0002 HPOSM1 EQU GTIA+$00
174 = 0002 HPOSM2 EQU GTIA+$00
175 = 0002 HPOSM3 EQU GTIA+$00
176 = 0002 SIZEP0 EQU GTIA+$00
177 = 0002 SIZEP1 EQU GTIA+$00
178 = 0002 SIZEP2 EQU GTIA+$00
179 = 0002 SIZEP3 EQU GTIA+$00
180 = 0002 SIZEM EQU GTIA+$00
181 = 0002 GRAFP0 EQU GTIA+$00
182 = 0002 GRAFP1 EQU GTIA+$00
183 = 0002 GRAFP2 EQU GTIA+$00
184 = 0002 GRAFP3 EQU GTIA+$00
185 = 0002 GRAFM EQU GTIA+$00
186 = 0002 COLPM0 EQU GTIA+$00
187 = 0002 COLPM1 EQU GTIA+$00
188 = 0002 COLPM2 EQU GTIA+$00
189 = 0002 COLPM3 EQU GTIA+$00
190 = 0002 COLPF0 EQU GTIA+$00
191 = 0002 COLPF1 EQU GTIA+$00
192 = 0002 COLPF2 EQU GTIA+$00
193 = 0002 COLPF3 EQU GTIA+$00
194 = 0002 COLBAK EQU GTIA+$00
195 = 0002 PRIOR EQU GTIA+$00
196 = 0002 VDELAY EQU GTIA+$00
197 = 0002 GRACTL EQU GTIA+$00
198 = 0002 HITCLR EQU GTIA+$00
199 = 0002 CONSOL EQU GTIA+$00
200 ;
201 ; READ
202 ;
203 = 0002 M0PF EQU GTIA+$00
204 = 0002 M1PF EQU GTIA+$00
205 = 0002 M2PF EQU GTIA+$00
206 = 0002 M3PF EQU GTIA+$00
207 = 0002 P0PF EQU GTIA+$00
208 = 0002 P1PF EQU GTIA+$00
209 = 0002 P2PF EQU GTIA+$00
210 = 0002 P3PF EQU GTIA+$00
211 = 0002 M0PL EQU GTIA+$00
212 = 0002 M1PL EQU GTIA+$00
213 = 0002 M2PL EQU GTIA+$00
214 = 0002 M3PL EQU GTIA+$00
215 = 0002 P0PL EQU GTIA+$00
216 = 0002 P1PL EQU GTIA+$00
217 = 0002 P2PL EQU GTIA+$00
218 = 0002 P3PL EQU GTIA+$00
219 = 0002 TRIG0 EQU GTIA+$00
220 = 0002 TRIG1 EQU GTIA+$00
221 = 0002 TRIG2 EQU GTIA+$00
222 = 0002 TRIG3 EQU GTIA+$00
223 = 0002 PAL EQU GTIA+$00
224 ;
225 ;
226 ; ---------------------------------------------------------------------------
227 = 0002 ANTIC EQU FAKEADDR
228 ; ---------------------------------------------------------------------------
229 ;
230 = 0002 DMACTL EQU ANTIC+$00
231 = 0002 CHACTL EQU ANTIC+$00
232 = 0002 DLPTR EQU ANTIC+$00
233 ;DLISTH EQU ANTIC+$00
234 = 0002 HSCROL EQU ANTIC+$00
235 = 0002 VSCROL EQU ANTIC+$00
236 = 0002 PMBASE EQU ANTIC+$00
237 = 0002 CHBASE EQU ANTIC+$00
238 = 0002 WSYNC EQU ANTIC+$00
239 ; !!!!
240 = 0002 VCOUNT EQU ANTIC+$00
241 ; ----
242 = 0002 PENH EQU ANTIC+$00
243 = 0002 PENV EQU ANTIC+$00
244 = 0002 NMIEN EQU ANTIC+$00
245 = 0002 NMIRES EQU ANTIC+$00
246 = 0002 NMIST EQU ANTIC+$00
247 ;
248 ;
249 ; ---------------------------------------------------------------------------
250 = 0002 PIA EQU FAKEADDR
251 ; ---------------------------------------------------------------------------
252 ;
253 = 0002 PORTA EQU PIA+0
254 = 0002 PORTB EQU PIA+0
255 = 0002 PACTL EQU PIA+0
256 = 0002 PBCTL EQU PIA+0
257 ;
258 ; ---------------------------------------------------------------------------
259 ; Atari ANTIC chip display list equates
260 ; ---------------------------------------------------------------------------
261 ;
262 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte)
263 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3)
264 ;
265 = 0010 SCH EQU $10 ; display list horizontal scrolling
266 = 0020 SCV EQU $20 ; display list vertical scrolling
267 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte)
268 = 0080 DLII EQU $80 ; display list interrupt instruction
269 ;
270 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction
271 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction
272 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction
273 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction
274 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction
275 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction
276 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction
277 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction
278 ;
279 = 0002 MODE2 EQU $02 ; display list mode 2
280 = 0004 MODE4 EQU $04 ; display list mode 4
281 = 0008 MODE8 EQU $08 ; display list mode 8
282 = 000E MODEE EQU $0E ; display list mode E
283 = 000F MODEF EQU $0F ; display list mode F
284
285 ; ---------------------------------------------------------------------------
286 ; KBCODEs
287 ; ---------------------------------------------------------------------------
288 080E .enum @kbcode
289 = 00FF _none = 255
290 = 001C _esc = 28
291 = 001F _1 = 31
292 = 001E _2 = 30
293 = 001A _3 = 26
294 = 0018 _4 = 24
295 = 001D _5 = 29
296 = 001B _6 = 27
297 = 0033 _7 = 51
298 = 0035 _8 = 53
299 = 0030 _9 = 48
300 = 0032 _0 = 50
301 = 0036 _lt = 54
302 = 0037 _gt = 55
303 = 0034 _del = 52
304 = 002C _tab = 44
305 = 002F _Q = 47
306 = 002E _W = 46
307 = 002A _E = 42
308 = 0028 _R = 40
309 = 002D _T = 45
310 = 002B _Y = 43
311 = 000B _U = 11
312 = 000D _I = 13
313 = 0008 _O = 8
314 = 000A _P = 10
315 = 000E _min = 14
316 = 000E _up = 14 ; cursor function
317 = 000F _eq = 15
318 = 000F _down = 15 ; cursor function
319 = 000C _ret = 12
320 = 003F _A = 63
321 = 003E _S = 62
322 = 003A _D = 58
323 = 0038 _F = 56
324 = 003D _G = 61
325 = 0039 _H = 57
326 = 0001 _J = 1
327 = 0005 _K = 5
328 = 0000 _L = 0
329 = 0002 _semicolon = 2
330 = 0006 _plus = 6
331 = 0006 _left = 6 ; cursor function
332 = 0007 _asterisk = 7
333 = 0007 _right = 7 ; cursor function
334 = 003C _caps = 60
335 = 0017 _Z = 23
336 = 0016 _X = 22
337 = 0012 _C = 18
338 = 0010 _V = 16
339 = 0015 _B = 21
340 = 0024 _N = 36
341 = 0025 _M = 37
342 = 0020 _comma = 32
343 = 0022 _dot = 34
344 = 0026 _slash = 38
345 = 0027 _atari = 39
346 = 0011 _help = 17
347 = 0003 _F1 = 3
348 = 0004 _F2 = 4
349 = 0013 _F3 = 19
350 = 0014 _F4 = 20
351 = 0021 _space = 33
352 .ende
352 = 0058 DLICOLORBACK
352 = 0059 GRADIENTNR
352 = 005A GRADIENTCOLORS
352 = 005C WINDCHANGEINROUND
352 = 005D JOYSTICKNUMBER
352 = 005E LAZYFLAG
352 = 005F SPYHARDFLAG
352 = 0060 VDEBUG
352 = 0061 XDRAW
352 = 0063 YDRAW
352 = 0065 XBYTE
352 = 0067 YBYTE
352 = 0069 CHARCODE
352 = 006A FONTIND
352 = 006C TANKNR
352 = 006D TANKSEQUENCEPOINTER
352 = 006E OLDPLOT
352 = 0070 XC
352 = 0072 TEMP
352 = 0074 TEMP2
352 = 0076 MODIFY
352 = 0078 TEMPXROLLER
352 = 007A XTEMPDRAW
352 = 007C YTEMPDRAW
352 = 007E TEMPOR2
352 = 0080 CREDITSVSCROL
352 = 0081 XI
352 = 0083 FX
352 = 0084 YI
352 = 0086 FY
352 = 0087 XK
352 = 0089 FS
352 = 008A YC
352 = 008B DX
352 = 008D DY
352 = 008F DD
352 = 0091 DI
352 = 0093 DP
352 = 0095 UNDERTANK1
352 = 0096 UNDERTANK2
352 = 0097 TESTFLIGHTFLAG
352 = 0098 WEAPONPOINTER
352 = 009A DLICOUNTER
352 = 009B PRESSTIMER
352 = 009C NTSCCOUNTER
352 = 009D ISENDOFTHEFALLFLAG
352 = 009E SFX_EFFECT
352 = 009F RMT_BLOCKED
352 = 00A0 SCROLLFLAG
352 = 00A1 SKSTATSIMULATOR
352 = 00A2 FLOATINGALT
352 = 00A3 OVERTANKDIR
352 = 00A4 FORCE
352 = 00A6 FORCE_
352 = 00A7 ANGLE
352 = 00A8 PARACHUTE
352 = 00A9 COLOR
352 = 00AA ERASE
352 = 00AB RADIUS
352 = 00AC DECIMAL
352 = 00AE NUMBEROFPLAYERS
352 = 00AF COUNTER
352 = 00B0 EXPLOSIONRADIUS
352 = 00B1 FUNKYBOMBCOUNTER
352 = 00B2 RESULTY
352 = 00B3 XCIRCLE
352 = 00B5 YCIRCLE
352 = 00B7 VY
352 = 00B9 VY_
352 = 00BB VX
352 = 00BD VX_
352 = 00BF HITFLAG
352 = 00C0 POSITIONONTHELIST
352 = 00C1 XHIT
352 = 00C3 DELTA
352 = 00C5 HOWMUCHTOFALL
352 = 00C6 MAGIC
352 = 00C8 XTRAJ
352 = 00CA XTRAJ_
352 = 00CB YTRAJ
352 = 00CD YTRAJ_
352 = 00CE WIND
352 = 00D0 WIND_
352 = 00D2 RANGELEFT
352 = 00D4 RANGERIGHT
352 = 00D6 NEWANGLE
352 = 00D7 ESCFLAG
352 = 00D8 LINEYDRAW
352 = 00D9 LINEXDRAW
352 = 00DB PLOT4X4COLOR
352 = 00DC MULTIPLIER
352 = 00DE MULTIPLIER_
352 = 00DF HOWTODRAW
352 = 00E0 GRAVITY
352 = 00E1 LINELENGTH
352 = 00E3 TRACERFLAG
352 = 00E4 ISINVENTORY
352 = 00E5 DIFFICULTYLEVEL
352 = 00E6 GOLEFT
352 = 00E7 OFFSETDL1
352 = 00E8 L1
156 080E icl 'C64/lib/C64SYS.ASM'
Source: C64SYS.ASM
1 = D000 vic_spr0_x = $D000
2 = D001 vic_spr0_y = $D001
3 = D002 vic_spr1_x = $D002
4 = D003 vic_spr1_y = $D003
5 = D004 vic_spr2_x = $D004
6 = D005 vic_spr2_y = $D005
7 = D006 vic_spr3_x = $D006
8 = D007 vic_spr3_y = $D007
9 = D008 vic_spr4_x = $D008
10 = D009 vic_spr4_y = $D009
11 = D00A vic_spr5_x = $D00A
12 = D00B vic_spr5_y = $D00B
13 = D00C vic_spr6_x = $D00C
14 = D00D vic_spr6_y = $D00D
15 = D00E vic_spr7_x = $D00E
16 = D00F vic_spr7_y = $D00F
17 = D010 vic_spr_hi_x = $D010
18 = D011 vic_cr1 = $D011
19 = D012 vic_raster = $D012
20 = D013 vic_lp_x = $D013
21 = D014 vic_lp_y = $D014
22 = D015 vic_spr_ena = $D015
23 = D016 vic_cr2 = $D016
24 = D017 vic_spr_exp_y = $D017
25 = D018 vic_mem = $D018
26 = D019 vic_irq = $D019
27 = D01A vic_irq_ena = $D01A
28 = D01B vic_spr_dp = $D01B
29 = D01C vic_spr_mcolor = $D01C
30 = D01D vic_spr_exp_x = $D01D
31 = D01E vic_spr_ss_col = $D01E
32 = D01F vic_spr_sd_col = $D01F
33 = D020 vic_border = $D020
34 = D021 vic_bg_color0 = $D021
35 = D022 vic_bg_color1 = $D022
36 = D023 vic_bg_color2 = $D023
37 = D024 vic_bg_color3 = $D024
38 = D025 vic_spr_color1 = $D025
39 = D026 vic_spr_color2 = $D026
40 = D027 vic_spr0_color = $D027
41 = D028 vic_spr1_color = $D028
42 = D029 vic_spr2_color = $D029
43 = D02A vic_spr3_color = $D02A
44 = D02B vic_spr4_color = $D02B
45 = D02C vic_spr5_color = $D02C
46 = D02D vic_spr6_color = $D02D
47 = D02E vic_spr7_color = $D02E
48
49 = D41B RANDOM = $D41B
157 080E icl 'C64/lib/MACRO.ASM'
Source: MACRO.ASM
1
2
3
4 .macro basic_start(addr)
5
6 .word upstartEnd // link address
7 .word 10 // line num
8 .byte $9e // sys
9
10 ?a=0
11 ?b=0
12 ?c=0
13 ?d=0
14 ?e=0
15
16 ?v = %%addr
17
18 ift ?v>=10000
19 ?a=?v/10000
20 ?v=?v-(?a*10000)
21 eif
22
23 ift ?v>=1000
24 ?b=?v/1000
25 ?v=?v-(?b*1000)
26 eif
27
28 ift ?v>=100
29 ?c=?v/100
30 ?v=?v-(?c*100)
31 eif
32
33 ift ?v>=10
34 ?d=?v/10
35 ?v=?v-(?d*10)
36 eif
37
38 ?e=?v%10
39
40 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30
41
42 .byte 0
43 upstartEnd
44 .word 0 // empty link signals the end of the program
45
46 .endm
47
48
49 //
50 // Switch bank in VIC-II
51 //
52 // Args:
53 // bank: bank number to switch to. Valid values: 0-3.
54 //
55 .macro SwitchVICBank(bank)
56 //
57 // The VIC-II chip can only access 16K bytes at a time. In order to
58 // have it access all of the 64K available, we have to tell it to look
59 // at one of four banks.
60 //
61 // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2).
62 //
63 // +------+-------+----------+-------------------------------------+
64 // | BITS | BANK | STARTING | VIC-II CHIP RANGE |
65 // | | | LOCATION | |
66 // +------+-------+----------+-------------------------------------+
67 // | 00 | 3 | 49152 | ($C000-$FFFF)* |
68 // | 01 | 2 | 32768 | ($8000-$BFFF) |
69 // | 10 | 1 | 16384 | ($4000-$7FFF)* |
70 // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) |
71 // +------+-------+----------+-------------------------------------+
72 ?bits=%11
73
74 ift (%%bank==0)
75 ?bits=%11
76 eli (%%bank==1)
77 ?bits=%10
78 eli (%%bank==2)
79 ?bits=%01
80 eli (%%bank==3)
81 ?bits=%00
82 eif
83
84 //
85 // Set Data Direction for CIA #2, Port A to output
86 //
87 lda $dd02
88 and #%11111100 // Mask the bits were interested in.
89 ora #$03 // Set bits 0 and 1.
90 sta $dd02
91
92 //
93 // Tell VIC-II to switch to bank
94 //
95 lda $dd00
96 and #%11111100
97 ora #?bits
98 sta $dd00
99 .endm
100
101
102 //
103 // Enter hires bitmap mode (a.k.a. standard bitmap mode)
104 //
105 .macro SetHiresBitmapMode
106 //
107 // Clear extended color mode (bit 6) and set bitmap mode (bit 5)
108 //
109 lda $d011
110 and #%10111111
111 ora #%00100000
112 sta $d011
113
114 //
115 // Clear multi color mode (bit 4)
116 //
117 lda $d016
118 and #%11101111
119 sta $d016
120 .endm
121
122
123 //
124 // Enter hires bitmap mode (a.k.a. standard bitmap mode)
125 //
126 .macro SetMulticolorBitmapMode
127 //
128 // Clear extended color mode (bit 6) and set bitmap mode (bit 5)
129 //
130 lda $d011
131 and #%10111111
132 ora #%00100000
133 sta $d011
134
135 //
136 // Clear multi color mode (bit 4)
137 //
138 lda $d016
139 ora #%00010000
140 sta $d016
141 .endm
142
143
144 //
145 // Switch location of screen memory.
146 //
147 // Args:
148 // address: Address relative to current VIC-II bank base address.
149 // Valid values: $0000-$3c00. Must be a multiple of $0400.
150 //
151 .macro SetScreenMemory(address)
152 //
153 // The most significant nibble of $D018 selects where the screen is
154 // located in the current VIC-II bank.
155 //
156 // +------------+-----------------------------+
157 // | | LOCATION* |
158 // | BITS +---------+-------------------+
159 // | | DECIMAL | HEX |
160 // +------------+---------+-------------------+
161 // | 0000XXXX | 0 | $0000 |
162 // | 0001XXXX | 1024 | $0400 (DEFAULT) |
163 // | 0010XXXX | 2048 | $0800 |
164 // | 0011XXXX | 3072 | $0C00 |
165 // | 0100XXXX | 4096 | $1000 |
166 // | 0101XXXX | 5120 | $1400 |
167 // | 0110XXXX | 6144 | $1800 |
168 // | 0111XXXX | 7168 | $1C00 |
169 // | 1000XXXX | 8192 | $2000 |
170 // | 1001XXXX | 9216 | $2400 |
171 // | 1010XXXX | 10240 | $2800 |
172 // | 1011XXXX | 11264 | $2C00 |
173 // | 1100XXXX | 12288 | $3000 |
174 // | 1101XXXX | 13312 | $3400 |
175 // | 1110XXXX | 14336 | $3800 |
176 // | 1111XXXX | 15360 | $3C00 |
177 // +------------+---------+-------------------+
178 //
179 ?bits = (%%address / $0400) << 4
180
181 lda $d018
182 and #%00001111
183 ora #?bits
184 sta $d018
185 .endm
186
187
188 //
189 // Set location of bitmap.
190 //
191 // Args:
192 // address: Address relative to VIC-II bank address.
193 // Valid values: $0000 (bitmap at $0000-$1FFF)
194 // $2000 (bitmap at $2000-$3FFF)
195 //
196 .macro SetBitmapAddress(address)
197 //
198 // In standard bitmap mode the location of the bitmap area can
199 // be set to either BANK address + $0000 or BANK address + $2000
200 //
201 // By setting bit 3, we can configure which of the locations to use.
202 //
203
204 lda $d018
205
206 ift %%address == $0000
207 and #%11110111
208 eli %%address == $2000
209 ora #%00001000
210 eif
211
212 sta $d018
213 .endm
214
215 //
216 // Once this is done, random values appear in location $D41B (RANDOM)
217 //
218 .macro InitializeSIDrnd
219 LDA #$FF ; maximum frequency value
220 STA $D40E ; voice 3 frequency low byte
221 STA $D40F ; voice 3 frequency high byte
222 LDA #$80 ; noise waveform, gate bit off
223 STA $D412 ; voice 3 control register
224 .endm
225
226 ;-------------------------------------
227 .MACRO rolw
228 ROL :1
229 ROL :1+1
230 .ENDM
231 ;-------------------------------------
232 .MACRO aslw
233 ASL :1
234 ROL :1+1
235 .ENDM
236 ;-------------------------------------
237 .MACRO rorw
238 ROR :1+1
239 ROR :1
240 .ENDM
241 ;-------------------------------------
242 .MACRO lsrw
243 LSR :1+1
244 ROR :1
245 .ENDM
246 ;-------------------------------------
247 .macro randomize
248 ;usage: randomize floor ceiling
249 ;returns (in A) a random .byte between "floor" and "ceiling"
250 .if :2 < :1
251 .error "floor higher than ceiling"
252 .endif
253 ?rand
254 lda random
255 cmp #:1 ;floor
256 bcc ?rand
257 cmp #:2+1 ;ceiling
258 bcs ?rand
259 .endm
260 ;-------------------------------------
261 .macro phx
262 txa
263 pha
264 .endm
265 ;-------------------------------------
266 .macro phy
267 tya
268 pha
269 .endm
270 ;-------------------------------------
271 .macro plx
272 pla
273 tax
274 .endm
275 ;-------------------------------------
276 .macro ply
277 pla
278 tay
279 .endm
280 ;-------------------------------------
281 .MACRO WAIT
282 ; WAIT
283 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC))
284 ?ze LDA $D012
285 cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
286 bcc ?ze
287 sbc #10 ; last lines correction
288 ?wa cmp $D012
289 bcc ?wa
290 ?wf cmp $D012
291 bcs ?wf
292 .ENDM
293 ;-------------------------------------
294 .macro halt
295 ?s jmp ?s
296 .endm
158
159 ;-----------------------------------------------
160 ; variable declarations in RAM (no code)
161 ;-----------------------------------------------
162
163 ; Game loading address
164 ORG $4100
165 4100 icl 'variables.asm'
Source: variables.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4 ;=====================================================
5 ; most important non-zero page variables
6 ; used by the given subroutines
7 ; moved to one place for easier
8 ; compilation to e.g. cartridge
9 ; zero page variables are declared in program.s65 module
10 ;=====================================================
11 4100 OneTimeZeroVariables
12 = 003F OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes !
13 .if OneTimeZeroVariablesCount > 127
14 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount
15 .endif
16
17 = 4100 noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music
18 = 4101 noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX
19 ;----------------------------------------------------
20 ; Color table for Game Over Screen (created in a gameover routine)
21 = 4102 .ds 1 ;.by $00 ; labels line color
22 = 4103 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4
23 ;----------------------------------------------------
24 4109 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24
25 ;:6 dta d" "
26 = 4109 .ds 6*8
27 ;----------------------------------------------------
28 4139 skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30)
29 = 4139 .DS MaxPlayers
30 ;----------------------------------------------------
31 413F variablesToInitialize
32 ;Options DO NOT ZERO ON RESTART GAME - ticket #27
33 = 413F OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0
34 = 4148 RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game
35 = 4149 seppukuVal .ds 1 ;.by 75
36 = 414A mountainDeltaH .ds 1 ;.by 3
37 = 414B mountainDeltaL .ds 1 ;.by $ff
38 ;----------------------------------------------------
39 414C LineHeader1
40 = 414C .ds 9 ;dta d"# ROUND: "
41 4155 RoundNrDisplay
42 = 4155 .ds 5 ;dta d" #", $ff
43 ; 4x4 text buffer
44 415A ResultLineBuffer
45 = 415A .ds 14 ;dta d" ", $ff
46 4168 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2
47 = 4168 .ds (screenHeight+1)
48 4231 linetableH ; = PMGraph + $0300 - (screenHeight+1)
49 = 4231 .ds (screenHeight+1)
50 42FA DisplayCopyPurchase
51 = 42FA .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1)
52 42FB StatusBufferCopy
53 = 42FB .ds screenBytes*3
54 ;=====================================================
55 4373 variablesStart ; zeroing starts here
56 ;=====================================================
57 ;isInventory .ds 1 ; 0 - purchase, $ff - inventory
58 ;--------------
59 = 4373 drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
60 ;--------------
61 = 4374 noDeathCounter .ds 1
62 ;--------------
63 = 4375 OptionsY .ds 1 ;vertical position of cursor on Options screen
64 = 4376 flyDelay .ds 1
65 ;--------------
66 ;NumberOfPlayers .DS 1 ;current number of players (counted from 1)
67 = 4377 TankSequence .DS MaxPlayers ;sequence of shooting during the Round
68 = 437D GameIsOver .DS 1 ; 1 means it was the last round in the game
69 ;----------------------------------------------------
70 437E moneyH ;we place zero at the end of prices and money
71 ;and have range from 0 to 99990 (not too much)
72 ;money players have (maybe one more byte is needed?)
73 = 437E .DS MaxPlayers
74 4384 moneyL
75 = 4384 .DS MaxPlayers
76 ;----------------------------------------------------
77 438A gainH ;how much money player gets after the round
78 ;it is gathered during the round basing on energy
79 ;opponents lose after player's shoots
80 = 438A .DS MaxPlayers
81 4390 gainL
82 = 4390 .DS MaxPlayers
83 ;----------------------------------------------------
84 4396 loseH ;how much player looses after the round
85 ;calculated from REAL energy loss
86 ;(not only to zero energy)
87 = 4396 .DS MaxPlayers
88 439C loseL
89 = 439C .DS MaxPlayers
90 ;----------------------------------------------------
91 43A2 Energy
92 = 43A2 .DS MaxPlayers
93 43A8 ShieldEnergy
94 = 43A8 .DS MaxPlayers
95 = 43AE EnergyDecrease .DS 1
96 43AF eXistenZ
97 = 43AF .DS MaxPlayers
98 43B5 LASTeXistenZ ; eXistenZ before shoot
99 = 43B5 .DS MaxPlayers
100
101 43BB ResultsTable ;the results in the gameeeeee
102 = 43BB .DS MaxPlayers
103 43C1 TempResults
104 = 43C1 .DS MaxPlayers
105 ;DirectHitsH ; one byte enough
106 ; .DS MaxPlayers
107 43C7 DirectHits
108 = 43C7 .DS MaxPlayers
109 43CD EarnedMoneyH
110 = 43CD .DS MaxPlayers
111 43D3 EarnedMoneyL
112 = 43D3 .DS MaxPlayers
113 ;----------------------------------------------------
114 43D9 ForceTableL ;shooting Force of the tank during the round
115 = 43D9 .DS MaxPlayers
116 43DF ForceTableH
117 = 43DF .DS MaxPlayers ;maxplayers=6
118 43E5 MaxForceTableL ;Energy of the tank during the round
119 ;(limes superior force of the Shoot)
120 = 43E5 .DS MaxPlayers ;1000 is the default
121 43EB MaxForceTableH
122 = 43EB .DS MaxPlayers
123 ;----------------------------------------------------
124 43F1 BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start!
125 = 43F1 .DS MaxPlayers
126 43F7 ActiveWeapon ;number of the selected weapon
127 = 43F7 .DS MaxPlayers
128 43FD ActiveDefenceWeapon ;number of the activated defence weapon - 0
129 = 43FD .DS MaxPlayers
130 4403 AutoDefenseFlag ; 0 - not activated, >$7f - activated
131 = 4403 .DS MaxPlayers
132 = 4409 WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile
133 ;----------------------------------------------------
134
135 ;format of the 3-byte static point number used in the game
136 ; 20203.5 => 128 : <20203 : >20203
137 ;----------------------------------------------------
138
139 ;L1 .DS 1 ; variable used in multiplications (by 10:)
140 ;gravity .DS 1 ;only the decimal part (1/10 = 25)
141 ;----------------------------------------------------
142
143 ;Wind .ds 4 ;format: 0000.hhll
144 ;walue displayed on the screen is
145 ;decimal portion divided by 16 (>>4)
146 ;----------------------------------------------------
147 = 440A MaxWind .ds 1 ;
148 = 440B WindOrientation .DS 1 ;(0-right,1-left)
149 ;----------------------------------------------------
150 ;Counter .DS 1 ;temporary Counter for outside loops
151 ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank
152 = 440C WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
153 ;----------------------------------------------------
154 440D xtankstableL ;X positions of tanks (lower left point)
155 = 440D .DS MaxPlayers
156 4413 xtankstableH
157 = 4413 .DS MaxPlayers
158 4419 ytankstable ;Y positions of tanks (lower left point)
159 = 4419 .DS MaxPlayers
160 441F LowResDistances ; coarse tank positions divided by 4 (to be in just one byte)
161 = 441F .DS MaxPlayers
162 4425 JoyNumber ; Joystick port number (from 0 to 3)
163 = 4425 .DS MaxPlayers
164 442B TankShape ; Tank shape number (from 0 to 2)
165 = 442B .DS MaxPlayers
166 ;----------------------------------------------------
167 4431 TargetTankNr ; Target tank index (for AI routines)
168 = 4431 .DS 1
169 4432 SecondTryFlag ; For precise AI aiming
170 = 4432 .DS 1
171 ;----------------------------------------------------
172 ;Erase .DS 1 ; if 1 only mask of the character is printed
173 ; on the graphics screen. if 0 character is printed normally
174
175 ;----------------------------------------------------
176 ;RangeLeft .DS 2 ;range of the soil to be fallen down
177 ;RangeRight .DS 2 ;it is being set by all Explosions
178 ;----------------------------------------------------
179 = 4433 WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon
180 = 4435 WeaponRangeRight .DS 2
181 ;----------------------------------------------------
182 ;xroller
183 ;HowMuchToFall .ds 1
184 = 4437 HeightRol .DS 1
185 ;digger
186 ;digstartx .DS 2
187 ;digstarty .DS 2
188 = 4438 diggery .DS 1
189 = 4439 DigLong .DS 1
190 = 443A digtabxL .DS [8]
191 = 4442 digtabxH .DS [8]
192 = 444A digtabyL .DS [8]
193 = 4452 digtabyH .DS [8]
194 ; liquiddirt
195 = 445A TempXfill .ds 2
196 = 445C FillCounter .ds 2
197 ;sandhog
198 = 445E sandhogflag .DS 1 ; (0 digger, 8 sandhog)
199 ;ofdirt
200 ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65)
201 ;draw
202 ;HowToDraw .DS 1
203 ; bits here mean
204 ; 0 - negative X (go up)
205 ; 1 - negative Y (left)
206 ; 2 - directional value > 1 (more than 45 degrees)
207 ; if all 0 then standart routine
208 ;XHit .DS 2
209 = 445F YHit .DS 2
210 ;LineLength .DS 2
211 ;circle
212 ;radius .DS 1
213 ;xcircle .DS 2
214 ;ycircle .DS 2
215 = 4461 tempcir .DS 2
216 ;TankFalls
217 = 4463 FallingSoundBit .DS 1
218 = 4464 PreviousFall .DS 1
219 = 4465 EndOfTheFallFlag .DS 1 ; in case of the infinite fall
220 ;Parachute .DS 1 ; are you insured with parachute?
221 ;FloatingAlt .DS 1 ; floating tank altitude
222 = 00A2 FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)!
223 = 00A2 PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc
224 ;----------------------------------------------------
225 ;Flight
226 ;variables for 5 missiles (used for mirv)
227 = 4466 xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte
228 = 446B xtraj01 .DS [5] ; middle byte
229 = 4470 xtraj02 .DS [5] ; high byte
230 ;vx00 .DS [5] ; looks like it is not really used anywhere
231 = 4475 vx01 .DS [5]
232 = 447A vx02 .DS [5]
233 = 447F vx03 .DS [5]
234 = 4484 MirvDown .DS [5] ; is given missile down?
235 = 4489 MirvMissileCounter .DS 1 ; missile Counter (mainly for X)
236 = 448A SmokeTracerFlag .DS 1 ; if Smoketracer
237 = 448B LaserFlag .DS 1 ; $ff if Laser
238 = 448C XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen)
239 = 448D YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
240 ;----------------------------------------------------
241 ;CheckCollisionWithTank
242 ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA)
243 ;vy .ds 4 ;0,0,0,0
244 ;xtraj .ds 3 ; 0,0,0
245 ;ytraj .ds 3 ; 0,0,0
246 = 448E xtrajold .ds 3 ; 0,0,0
247 = 4491 ytrajold .ds 3 ; 0,0,0
248 ;Angle .DS 1
249 ;Force .ds 3 ; 0,0,0
250 ;Multiplier .ds 3 ; 0,0,0
251 = 4494 Multiplee .ds 2 ; 0,0
252 ;goleft .DS 1 ;if 1 then flights left
253 ;----------------------------------------------------
254 ;unPlot
255 = 4496 WhichUnPlot .DS 1
256 ; max 5 concurrent unPlots
257 = 4497 oldplotH .DS [5]
258 = 449C oldplotL .DS [5]
259 = 44A1 oldora .DS [5]
260 = 44A6 oldply .DS [5]
261 = 44AB OldOraTemp .DS 1
262 = 44AC xtrajfb .DS 2
263 = 44AE ytrajfb .DS 2
264 ;
265 ;tracerflag .DS 1
266 ;----------------------------------------------------
267 ;TypeChar
268 = 44B0 mask1 .DS [8]
269 = 44B8 mask2 .DS [8]
270
271 = 44C0 char1 .DS [8]
272 = 44C8 char2 .DS [8]
273 ;color .DS 1
274 = 44D0 ybit .DS 1
275 = 44D1 tempbyte01 .DS 1
276 ;delta .DS 2
277 = 44D2 yfloat .DS 2
278 = 44D4 deltaX .DS 1
279 = 44D5 UpNdown .DS 1
280
281 = 44D6 temptankX .DS 2
282 = 44D8 temptankNr .DS 1
283 = 44D9 AfterBFGflag .DS 1
284
285 ;----------------------------------------------------
286 ;Variables from textproc.s65
287 ; tables with indexes of weapons on the right lists
288 ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive
289 44DA IndexesOfWeaponsL1
290 = 44DA .ds (last_offensive_____ - first_offensive____+1)
291 44FA IndexesOfWeaponsL2
292 = 44FA .ds (last_defensive_____ - first_defensive____+1)
293 ;----------------------------------------------------
294
295 ; variables storing amount of weapons on the first and second
296 ; list and pointer position
297
298 450A HowManyOnTheListOff
299 = 450A .DS 1
300 450B HowManyOnTheListDef
301 = 450B .DS 1
302 ;PositionOnTheList ; pointer position on the list being displayed
303 ; .DS 1
304 450C LastWeapon
305 ; number of the last previously purchased weapon
306 ; it is necessary when after purchase some weapon
307 ; is removed from the list (because too expensive)
308 ; and the cursor must be placed elsewhere
309 = 450C .DS 1
310 450D WhichList ; list currently on the screen
311 ; (0-offensive, %10000000 - defensive (check with bit:bmi for defensives)
312 = 450D .DS 1
313 ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines)....
314
315
316 ;----------------------------------------------------
317
318 ;mark the level
319 450E PositionInName ; cursor position in name of the player when name input
320 = 450E .DS 1
321 ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu)
322
323 ;----------------------------------------------------
324 ;displaydecimal
325 ;decimal .DS 2
326 = 450F decimalresult .DS 5
327
328 ;xmissile
329 ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte
330 ;round
331 = 4514 CurrentRoundNr .DS 1
332 ;FallDown2 .DS 1
333 ;leapfrog
334 = 4515 LeapFrogAngle .DS 1
335 ;laser
336 = 4516 LaserCoordinate .DS 8 ; 2,2,2,2
337 ;----------------------------------------------------
338 ; Here go tables with weapons possesed by a given tank
339 ; Index in the table means weapon type
340 ; number entered means ammo for given weapon possessed (max 99)
341 ; Let 0 be "baby missile"
342 ; from $30 the defensive weapons begin
343 451E TanksWeapons
344 451E TanksWeapon1
345 = 451E .DS number_of_weapons
346 454E TanksWeapon2
347 = 454E .DS number_of_weapons
348 457E TanksWeapon3
349 = 457E .DS number_of_weapons
350 45AE TanksWeapon4
351 = 45AE .DS number_of_weapons
352 45DE TanksWeapon5
353 = 45DE .DS number_of_weapons
354 460E TanksWeapon6
355 = 460E .DS number_of_weapons
356
357 463E mountaintable ;table of mountains (size=screenwidth)
358 = 463E .DS [screenwidth]
359 = 477E .DS 1 ; additional byte for fallout (sometimes 1 pixel)
360 477F mountaintable2 ;table of mountains (size=screenwidth)
361 = 477F .DS [screenwidth]
362 = 48BF .DS 1 ; additional byte for fallout (sometimes 1 pixel)
363 48C0 MountaintableEnd ;good for table clearing
364 ;----------------------------------------------------
365 = 48C0 TextNumberOff .DS 1
366 ;--------------
367 48C1 TankTempY
368 = 48C1 .DS 1
369 ;----------------------------------------------------
370 ;-------------- single round variables --------------
371 ;----------------------------------------------------
372 48C2 singleRoundVars
373 ;--------------
374 ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed
375 ;--------------
376 48C2 CurrentResult
377 = 48C2 .DS 1
378 ;--------------
379 48C3 AngleTable ;Angle of the barrel of each tank during the round
380 = 48C3 .DS MaxPlayers
381 48C9 EndOfTheBarrelX
382 = 48C9 .ds 2
383 48CB EndOfTheBarrelY
384 = 48CB .ds 1
385 ;----------------------------------------------------
386 48CC previousAngle
387 = 48CC .DS MaxPlayers
388 48D2 previousEnergyL
389 = 48D2 .DS MaxPlayers
390 48D8 previousLeftRange
391 = 48D8 .DS MaxPlayers
392 48DE previousEnergyH
393 = 48DE .DS MaxPlayers
394 48E4 RandBoundaryLow
395 = 48E4 .ds 2
396 48E6 RandBoundaryHigh
397 = 48E6 .ds 2
398 48E8 AngleTablePointer
399 = 48E8 .DS 1
400 48E9 singleRoundVarsEnd
401 ;----------------------------------------------------
402 ; 4x4 texts
403 ;----------------------------------------------------
404 ;LineAddress4x4 .DS 2
405 = 48E9 LineCharNr .DS 1
406 ;LineXdraw .DS 2
407 ;LineYdraw .DS 1
408
409 ;-----------
410 48EA ResultOfTankNr
411 = 48EA .DS 1
412
413 ;----------------------------------------------------
414 ;PutChar4x4
415 ;----------------------------------------------------
416 = 48EB nibbler4x4 .DS 1
417 = 48EC CharCode4x4 .DS 1
418 ;plot4x4color .DS 1 ;1-white, 0-background
419 ; This is moved from display.asm to be easier to relocate
420 48ED ListOfWeapons
421 ; 0123456789012345678901234567890123456789
422 ; :number_of_offensives dta d" "
423 ;:32 dta d" "
424 = 48ED .ds 32*32
425 4CED ListOfWeapons1End
426 4CED ListOfDefensiveWeapons
427 ; :number_of_defensives dta d" "
428 ;:16 dta d" "
429 = 4CED .ds 16*32
430 4EED ListOfDefensiveWeaponsEnd ;constant useful when clearing
431 4EED track_variables
432 = 4EED trackn_db .ds TRACKS
433 = 4EF1 trackn_hb .ds TRACKS
434 = 4EF5 trackn_idx .ds TRACKS
435 = 4EF9 trackn_pause .ds TRACKS
436 = 4EFD trackn_note .ds TRACKS
437 = 4F01 trackn_volume .ds TRACKS
438 = 4F05 trackn_distor .ds TRACKS
439 = 4F09 trackn_shiftfrq .ds TRACKS
440 = 4F0D trackn_instrx2 .ds TRACKS
441 = 4F11 trackn_instrdb .ds TRACKS
442 = 4F15 trackn_instrhb .ds TRACKS
443 = 4F19 trackn_instridx .ds TRACKS
444 = 4F1D trackn_instrlen .ds TRACKS
445 = 4F21 trackn_instrlop .ds TRACKS
446 = 4F25 trackn_instrreachend .ds TRACKS
447 = 4F29 trackn_volumeslidedepth .ds TRACKS
448 = 4F2D trackn_volumeslidevalue .ds TRACKS
449 = 4F31 trackn_effdelay .ds TRACKS
450 = 4F35 trackn_effvibratoa .ds TRACKS
451 = 4F39 trackn_effshift .ds TRACKS
452 = 4F3D trackn_tabletypespeed .ds TRACKS
453 = 4F41 trackn_tablenote .ds TRACKS
454 = 4F45 trackn_tablea .ds TRACKS
455 = 4F49 trackn_tableend .ds TRACKS
456 = 4F4D trackn_tablelop .ds TRACKS
457 = 4F51 trackn_tablespeeda .ds TRACKS
458 = 4F55 trackn_command .ds TRACKS
459 = 4F59 trackn_filter .ds TRACKS
460 = 4F5D trackn_audf .ds TRACKS
461 = 4F61 trackn_audc .ds TRACKS
462 = 4F65 trackn_audctl .ds TRACKS
463 = 4F69 v_aspeed .ds 1
464 4F6A track_endvariables
465
466 4F6A variablesEnd
467 ;----------------------------------------------------
468
469 .endif
166
167 4F6A WeaponFont
168 4F6A 00 00 00 00 00 00 + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt'
169
170
171 ;--------------------------------------------------
172 ; Game Code
173 ;--------------------------------------------------
174 536A FirstSTART
175 = 0000 DL = 0
176 = 0000 StatusBufferROM = 0
177 ;StatusBufferCopy = 0
178 = 0000 StatusBufferCopyEnd = 0
179 = 0004 TRACKS = 4
180 = 0000 DisplayCopyPurchaseEnd = 0
181 = 0000 DisplayCopyPurchaseStart = 0
182 = 2000 displayC64 = $2000 ; graphics screen memory start
183
184 536A 78 SEI ; disable IRQ
185 536B A9 36 LDA #$36
186 536D 85 01 STA $0001 ; Turn Off BASIC ROM
187 536F A9 FE LDA #<NMI ;
188 5371 8D 18 03 STA $0318 ; change NMI vector
189 5374 A9 A2 LDA #>NMI ; to our routine
190 5376 8D 19 03 STA $0319 ;
191 5379 A9 00 LDA #$00 ; stop Timer A
192 537B 8D 0E DD STA $DD0E ;
193 537E 8D 04 DD STA $DD04 ; set Timer A to 0, after starting
194 5381 8D 05 DD STA $DD05 ; NMI will occur immediately
195 5384 A9 81 LDA #$81 ;
196 5386 8D 0D DD STA $DD0D ; set Timer A as source for NMI
197 5389 A9 01 LDA #$01 ;
198 538B 8D 0E DD STA $DD0E ; start Timer A -> NMI
199
200 ; from here on NMI is disabled
201
202
203 538E 20 89 5A jsr MakeDarkScreen
204
205 ; one time zero variables in RAM (non zero page)
206 5391 A9 00 lda #0
207 5393 A0 3E ldy #OneTimeZeroVariablesCount-1
208 5395 99 00 41 @ sta OneTimeZeroVariables,y
209 5398 88 dey
210 5399 10 FA bpl @-
211
212 ; one time zero variables in RAM (zero page)
213 539B A0 58 ldy #FirstZpageVariable
214 539D 99 00 00 @ sta $0000,y
215 53A0 C8 iny
216 53A1 D0 FA bne @-
217
218 ; initialize variables in RAM (non zero page)
219 53A3 A0 1B ldy #initialvaluesCount-1
220 53A5 B9 B9 5A @ lda initialvaluesStart,y
221 53A8 99 3F 41 sta variablesToInitialize,y
222 53AB 88 dey
223 53AC 10 F7 bpl @-
224
225
226 ; generate linetables
227 53AE 20 9D 76 jsr GenerateLineTable
228
229
230 ; Random INIT
231 53B1 InitializeSIDrnd
Macro: INITIALIZESIDRND [Source: MACRO.ASM]
1 53B1 A9 FF LDA #$FF ; maximum frequency value
2 53B3 8D 0E D4 STA $D40E ; voice 3 frequency low byte
3 53B6 8D 0F D4 STA $D40F ; voice 3 frequency high byte
4 53B9 A9 80 LDA #$80 ; noise waveform, gate bit off
5 53BB 8D 12 D4 STA $D412 ; voice 3 control register
Source: scorchC64.asm
232
233 ;--------------------------------------------------
234 ; Main program of the game
235 53BE icl 'game.asm'
Source: game.asm
1 .IF *>0 ;this is a trick that prevents compiling this file alone
2
3 ; All main procedures of the game not dependent on hardware (I hope) :)
4
5 53BE START
6 53BE 20 89 5A jsr MakeDarkScreen
7 ; Startup sequence
8 53C1 20 6A 58 jsr Initialize
9
10 ;jsr GameOverScreen ; only for test !!!
11
12 53C4 RMTSong song_main_menu
Macro: RMTSONG [Source: scorchC64.asm]
1 53C4 A9 02 lda #SONG_MAIN_MENU ; do nothing in C64
Source: game.asm
13
14 53C6 20 E5 62 jsr Options ;startup screen
15 53C9 20 1E 63 jsr SetVariablesFromOptions
16 53CC 20 89 5A jsr MakeDarkScreen
17 53CF 24 D7 bit escFlag
18 53D1 30 EB bmi START
19
20 53D3 20 C6 63 jsr EnterPlayerNames
21 53D6 20 89 5A jsr MakeDarkScreen
22 53D9 24 D7 bit escFlag
23 53DB 30 E1 bmi START
24
25 53DD 20 0B 59 jsr RandomizeSequence
26 ; for the round #1 shooting sequence is random
27
28 53E0 MainGameLoop
29 53E0 20 41 5A jsr SetWallsType
30 ; first set default barrel lengths (fix for Long Schlong activation :) )
31 ; we must do it before purchase/activate
32 ; and set Auto Defense to off
33 53E3 20 FB 58 jsr SetStandardBarrels
34
35 53E6 20 77 63 jsr CallPurchaseForEveryTank
36 53E9 20 89 5A jsr MakeDarkScreen
37 53EC 24 D7 bit escFlag
38 53EE 30 CE bmi START
39
40 53F0 20 E7 57 jsr GetRandomWind
41
42 53F3 20 D3 54 jsr RoundInit
43
44 53F6 20 5F 55 jsr MainRoundLoop
45 53F9 24 D7 bit escFlag
46 53FB 30 C1 bmi START
47 53FD 50 03 4C C3 54 jvs GoGameOver
48
49 5402 20 DD 59 jsr SortSequence
50
51 5405 A9 00 85 6C mva #0 TankNr ;
52 5409 85 02 sta COLBAKS ; set background color to black
53 540B 85 5D sta JoystickNumber ; set joystick port for player
54
55 ; Hide all (easier than hide last ;) ) tanks
56 540D 20 0B 6A jsr cleartanks ; A=0
57
58 ; here gains and losses should be displayed (dollars)
59 ; finally we have changed our minds and money of players
60 ; is displayed only in weapons shop
61
62 ; Results are number of other deaths
63 ; before the player dies itself
64
65 5410 RmtSong song_round_over
Macro: RMTSONG [Source: scorchC64.asm]
1 5410 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64
Source: game.asm
66 5412 20 A3 64 jsr DisplayResults
67
68 5415 20 75 5A jsr DemoModeOrKey
69 5418 20 89 5A jsr MakeDarkScreen
70
71 541B A6 AE ldx NumberOfPlayers
72 541D CA dex
73 541E CalculateGains
74 ; add gains and substract losses
75 ; gain is what player gets for lost energy of opponents
76 ; energy lost by opponents is added during Round and
77 ; little below in source, multiplied by 2 to get "dollars".
78 ; By analogy, loss is energy that given player losses during
79 ; each Round.
80 ; Important! If player has 10 energy and gets a central hit
81 ; from nuke that would take 90 energy points, his loss
82 ; is 90, not 10
83
84 ; adding the remaining energy of the tank to gain
85 ; winner gets more ! :)
86 541E BD A2 43 lda Energy,x
87 5421 7D 90 43 adc gainL,x
88 5424 9D 90 43 sta gainL,x
89 5427 90 03 bcc @+
90 5429 FE 8A 43 inc gainH,x
91 @
92 ; add gain * 2
93 542C 1E 90 43 asl gainL,x
94 542F 3E 8A 43 rol gainH,x
95 5432 18 clc
96 5433 BD 84 43 lda moneyL,x
97 5436 7D 90 43 adc gainL,x
98 5439 9D 84 43 sta moneyL,x
99 543C BD 7E 43 lda moneyH,x
100 543F 7D 8A 43 adc gainH,x
101 5442 9D 7E 43 sta moneyH,x
102 ; substract lose
103 ; if lose is greater than money then zero money
104 5445 BD 7E 43 lda moneyH,x
105 5448 DD 96 43 cmp loseH,x
106 544B 90 20 bcc zeromoney
107 544D D0 08 bne substractlose
108 544F BD 84 43 lda moneyL,x
109 5452 DD 9C 43 cmp loseL,x
110 5455 90 16 bcc zeromoney
111 5457 substractlose
112 5457 38 sec
113 5458 BD 84 43 lda moneyL,x
114 545B FD 9C 43 sbc loseL,x
115 545E 9D 84 43 sta moneyL,x
116 5461 BD 7E 43 lda moneyH,x
117 5464 FD 96 43 sbc loseH,x
118 5467 9D 7E 43 sta moneyH,x
119 546A 4C 75 54 jmp skipzeroing
120 546D zeromoney
121 546D A9 00 lda #0
122 546F 9D 84 43 sta moneyL,x
123 5472 9D 7E 43 sta moneyH,x
124 5475 skipzeroing
125 ; and earned money for summary
126 5475 18 clc
127 5476 BD D3 43 lda EarnedMoneyL,x
128 5479 7D 90 43 adc gainL,x
129 547C 9D D3 43 sta EarnedMoneyL,x
130 547F BD CD 43 lda EarnedMoneyH,x
131 5482 7D 8A 43 adc gainH,x
132 5485 9D CD 43 sta EarnedMoneyH,x
133 ; substract lose
134 ; if lose is greater than money then zero money
135 5488 BD CD 43 lda EarnedMoneyH,x
136 548B DD 96 43 cmp loseH,x
137 548E 90 20 bcc ezeromoney
138 5490 D0 08 bne esubstractlose
139 5492 BD D3 43 lda EarnedMoneyL,x
140 5495 DD 9C 43 cmp loseL,x
141 5498 90 16 bcc ezeromoney
142 549A esubstractlose
143 549A 38 sec
144 549B BD D3 43 lda EarnedMoneyL,x
145 549E FD 9C 43 sbc loseL,x
146 54A1 9D D3 43 sta EarnedMoneyL,x
147 54A4 BD CD 43 lda EarnedMoneyH,x
148 54A7 FD 96 43 sbc loseH,x
149 54AA 9D CD 43 sta EarnedMoneyH,x
150 54AD 4C B8 54 jmp eskipzeroing
151 54B0 ezeromoney
152 54B0 A9 00 lda #0
153 54B2 9D D3 43 sta EarnedMoneyL,x
154 54B5 9D CD 43 sta EarnedMoneyH,x
155 54B8 eskipzeroing
156
157 54B8 CA dex
158 54B9 30 03 4C 1E 54 jpl CalculateGains
159
160 54BE AD 7D 43 lda GameIsOver
161 54C1 F0 06 beq NoGameOverYet
162 54C3 GoGameOver
163 54C3 20 0E 66 jsr GameOverScreen
164 54C6 4C BE 53 jmp START
165 54C9 NoGameOverYet
166 54C9 EE 14 45 inc CurrentRoundNr
167 54CC A9 15 85 9E mva #sfx_silencer sfx_effect
168
169 54D0 4C E0 53 jmp MainGameLoop
170
171
172 ;--------------------------------------------------
173 54D3 .proc RoundInit
174 ;--------------------------------------------------
175 ; at the beginning of each Round we set energy
176 ; of all players to 99
177 ; the maximum shooting energy to 990 (it is 10*energy)
178 ; the default shooting energy to 350
179 ; the shooting angle is randomized
180 ; of course gains an loses are zeroed
181
182 54D3 RmtSong song_ingame
Macro: RMTSONG [Source: scorchC64.asm]
1 54D3 A9 06 lda #SONG_INGAME ; do nothing in C64
Source: game.asm
183
184 54D5 20 62 75 jsr SetPMWidth ; A=0
185 54D8 A9 00 lda #0
186 54DA 8D D9 44 sta AfterBFGflag ; reset BFG flag
187 54DD 85 02 sta COLOR2 ; status line "off"
188 54DF 85 02 sta COLOR1
189
190 54E1 AA tax
191 54E2 9D C2 48 @ sta singleRoundVars,x
192 54E5 E8 inx
193 54E6 E0 27 cpx #(singleRoundVarsEnd-singleRoundVars)
194 54E8 D0 F8 bne @-
195
196 54EA A2 05 ldx #(MaxPlayers-1)
197 54EC SettingEnergies
198 54EC A9 00 lda #$00
199 54EE 9D 90 43 sta gainL,x
200 54F1 9D 8A 43 sta gainH,x
201 54F4 9D 9C 43 sta loseL,x
202 54F7 9D 96 43 sta loseH,x
203 54FA A9 63 lda #99
204 54FC 9D A2 43 sta Energy,x
205 54FF 9D AF 43 sta eXistenZ,x
206 5502 9D B5 43 sta LASTeXistenZ,x
207 ; anything in eXistenZ table means that this tank exist
208 ; in the given round
209 5505 A9 E8 lda #<1000
210 5507 9D E5 43 sta MaxForceTableL,x
211 550A A9 03 lda #>1000
212 550C 9D EB 43 sta MaxForceTableH,x
213 550F A9 5E lda #<350
214 5511 9D D9 43 sta ForceTableL,x
215 5514 A9 01 lda #>350
216 5516 9D DF 43 sta ForceTableH,x
217
218 ;lda #(255-45)
219 ;it does not look good when all tanks have
220 ;barrels pointing the same direction
221 ;so it would be nice to have more or less random
222 ;angles
223 5519 20 3D 59 jsr RandomizeAngle
224 551C 9D C3 48 sta AngleTable,x
225
226 551F CA dex
227 5520 10 CA bpl SettingEnergies
228
229 ;generating the new landscape
230 5522 20 46 75 jsr PMoutofScreen ;let P/M disappear
231 5525 20 7C 76 jsr clearscreen ;let the screen be clean
232 5528 20 9C 6E jsr ClearPMmemory
233 552B 20 6A 69 jsr placetanks ;let the tanks be evenly placed
234 552E 20 04 70 jsr calculatemountains ;let mountains be easy for the eye
235 ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height
236
237
238 5531 A9 00 85 72 85 73 mwa #StatusBufferROM temp
239 5537 A9 FB 85 74 A9 42 + mwa #StatusBufferCopy temp2
240 553F A9 01 85 76 A9 00 + mwa #StatusBufferCopyEnd+1 modify
241 5547 20 B7 5A jsr CopyFromROM
242
243 554A 20 E4 76 jsr SetMainScreen
244 554D 20 51 75 jsr ColorsOfSprites
245
246 5550 20 B2 6E jsr drawmountains ;draw them
247 5553 20 12 6A jsr drawtanks ;finally draw tanks
248
249 5556 A9 00 85 6D mva #$00 TankSequencePointer
250
251 ;---------round screen is ready---------
252 555A A9 0A 85 02 mva #TextForegroundColor COLOR1 ; status line "on"
253 555E 60 rts
254 .endp
255
256 ;--------------------------------------------------
257 555F .proc MainRoundLoop
258 ; here we must check if by a chance there is only one
259 ; tank with energy greater than 0 left
260 ;--------------------------------------------------
261
262 555F A0 00 ldy #0 ; in Y - number of tanks with energy greater than zero
263 5561 84 02 sty ATRACT ; reset atract mode
264 5563 A6 AE ldx NumberOfPlayers
265 5565 CA dex
266 5566 CheckingIfRoundIsFinished
267 5566 BD AF 43 lda eXistenZ,x
268 5569 F0 01 beq NoEnergy
269 556B C8 iny
270 556C NoEnergy
271 556C CA dex
272 556D 10 F7 bpl CheckingIfRoundIsFinished
273
274 556F C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ?
275 5571 B0 17 bcs DoNotFinishTheRound
276
277 ;points for the last living tank
278 5573 A6 AE ldx NumberOfPlayers
279 5575 CA dex
280 5576 WhichTankWonLoop
281 5576 BD AF 43 lda eXistenZ,x
282 5579 D0 04 bne ThisOneWon
283 557B CA dex
284 557C 10 F8 bpl WhichTankWonLoop
285 ;error was here!!!
286 ; somehow I believed program will be never here
287 ; but it was a bad assumption
288 ; god knows when there is such a situation
289 ; (we've got a SITUATION here, if you know what I mean)
290 ; there are two tanks left.
291 ; one of them is killed by the second tank
292 ; second tank explodes and kills the first one.
293 ; and code lands here...
294 ; looks like no one won!
295 557E 60 rts
296
297 557F ThisOneWon
298 557F AD C2 48 lda CurrentResult
299 5582 18 clc
300 5583 7D BB 43 adc ResultsTable,x
301 5586 9D BB 43 sta ResultsTable,x
302
303 5589 60 rts ; this Round is finished
304
305 558A DoNotFinishTheRound
306 ; Seppuku here
307 558A AD 74 43 lda noDeathCounter
308 558D CD 49 41 cmp seppukuVal
309 5590 90 0F bcc @+
310
311 5592 A9 00 8D 74 43 mva #0 noDeathCounter
312 5597 A9 1A 85 9E mva #sfx_seppuku sfx_effect
313
314 559B 20 19 74 jsr DisplaySeppuku
315 559E 4C D0 57 jmp Seppuku
316
317 @
318 ; Auto Defense - activates defensives
319 55A1 A6 AE ldx NumberOfPlayers
320 55A3 CA dex
321 55A4 CheckNextTankAD
322 55A4 BD A2 43 lda Energy,x ; only active players
323 55A7 F0 08 beq @+
324 55A9 BD 03 44 lda AutoDefenseFlag,x ; with Auto Defence activated
325 55AC F0 03 beq @+
326 ; run auto defense for tank in X
327 55AE 20 F2 8A jsr AutoDefense
328 55B1 CA @ dex
329 55B2 10 F0 bpl CheckNextTankAD
330 55B4 20 12 6A jsr DrawTanks ; redraw tanks with new defences
331 ;
332 55B7 A6 6D ldx TankSequencePointer
333 55B9 BD 77 43 lda TankSequence,x
334 55BC 85 6C sta TankNr
335 55BE AA tax
336 55BF BD A2 43 lda Energy,x ;skip if no energy
337 55C2 D0 03 4C 90 56 jeq NextPlayerShoots
338
339
340
341 55C7 A9 FF 85 DB mva #$ff plot4x4color
342 55CB 20 44 73 jsr DisplayTankNameAbove
343
344 55CE A9 01 85 A9 mva #1 color ;to display flying point
345
346 55D2 A6 6C ldx tankNr
347 55D4 BD 7F 5B lda TankStatusColoursTable,x
348 55D7 85 02 sta COLOR2 ; set color of status line
349 55D9 20 0F 66 jsr PutTankNameOnScreen
350 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
351
352 55DC BD 39 41 lda SkillTable,x
353 55DF F0 1C beq ManualShooting
354
355 55E1 RoboTanks
356 ; robotanks shoot here
357 ; TankNr still in X
358 55E1 20 C3 8F jsr ArtificialIntelligence
359 ;pause 30
360 55E4 A6 6C ldx TankNr
361 55E6 20 0F 66 jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) )
362 55E9 20 A1 59 jsr MoveBarrelToNewPosition
363 55EC A5 02 lda kbcode
364 55EE C9 1C cmp #@kbcode._esc ; 28 ; ESC
365 55F0 D0 03 bne @+
366 55F2 20 AE 73 jsr AreYouSure
367 55F5 A5 D7 @ lda escFlag
368 55F7 F0 01 60 seq:rts ; keys Esc or O
369
370
371 55FA 4C 11 56 jmp AfterManualShooting
372
373 55FD ManualShooting
374 55FD BD 25 44 lda JoyNumber,x
375 5600 85 5D sta JoystickNumber ; set joystick port for player
376 5602 20 71 5A jsr WaitForKeyRelease
377 5605 A9 00 lda #%00000000
378 5607 85 97 sta TestFlightFlag ; set "Test Fight" off
379 5609 20 4D 80 jsr BeforeFire
380 560C A5 D7 lda escFlag
381 560E F0 01 60 seq:rts ; keys Esc or O
382
383 5611 AfterManualShooting
384 5611 A9 00 85 DB mva #$00 plot4x4color
385 5615 20 44 73 jsr DisplayTankNameAbove
386 ; defensive weapons without flight handling
387 5618 A6 6C ldx TankNr
388 561A BD FD 43 lda ActiveDefenceWeapon,x
389 561D C9 22 cmp #ind_Hovercraft_____
390 561F F0 14 beq GoFloat
391 5621 C9 20 cmp #ind_White_Flag_____ ; White Flag
392 5623 F0 0A beq ShootWhiteFlag
393 5625 C9 2B cmp #ind_Nuclear_Winter_
394 5627 D0 19 bne StandardShoot
395 5629 ShootAtomicWinter
396 ; --- atomic winter ---
397 5629 20 9B 8A jsr AtomicWinter
398 562C 4C 90 56 jmp NextPlayerShoots ; and we skip shoot
399 562F ShootWhiteFlag
400 ; --- white flag ---
401 562F 20 70 8A jsr WhiteFlag
402 5632 4C 90 56 jmp NextPlayerShoots ; and we skip shoot
403 5635 GoFloat
404 5635 20 84 8B jsr TankFlying
405 5638 A9 00 lda #0
406 563A 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate after use
407 563D 24 D7 bit escFlag
408 563F 10 BC bpl ManualShooting ; after floating tank can shoot
409 5641 60 rts
410 5642 StandardShoot
411 5642 EE 74 43 inc noDeathCounter
412
413 5645 20 98 8F jsr DecreaseWeaponBeforeShoot
414 5648 20 0F 66 jsr DisplayStatus
415
416 ; ldx TankNr
417 564B DE A2 43 dec Energy,x ; lower energy to eventually let tanks commit suicide
418
419 564E ShootNow
420 564E 20 0C 83 jsr Shoot
421 ;here we clear offensive text (after a shoot)
422 5651 A4 6C ldy TankNr
423 5653 A9 00 85 DB mva #$00 plot4x4color
424 5657 20 88 72 jsr DisplayOffensiveTextNr
425
426 565A A5 BF lda HitFlag ;0 if missed
427 565C F0 1E beq missed
428
429 565E 20 34 77 jsr Explosion
430
431 5661 continueMainRoundLoopAfterSeppuku
432
433 5661 AfterExplode
434 5661 20 F4 6E jsr SoilDown2 ; allways
435 5664 NoFallDown2
436 ;here tanks are falling down
437 5664 A5 6C 85 7E mva tankNr tempor2
438 5668 A6 AE ldx NumberOfPlayers
439 566A CA dex
440 566B TanksFallDown
441 566B 86 6C stx TankNr
442 566D BD AF 43 lda eXistenZ,x
443 5670 F0 03 beq NoExistNoFall
444 5672 20 2E 6D jsr TankFalls
445 5675 NoExistNoFall
446 5675 CA dex
447 5676 10 F3 bpl TanksFallDown
448 5678 A6 7E 86 6C mvx tempor2 TankNr
449
450 567C missed
451 567C AC 09 44 ldy WeaponDepleted
452 567F D0 06 bne @+
453 5681 A6 6C ldx TankNr
454 5683 98 tya
455 5684 9D F7 43 sta ActiveWeapon,x
456 @
457
458 ;here we clear offensive text (after a shoot)
459 5687 A4 6C ldy TankNr
460 5689 A9 00 85 DB mva #$00 plot4x4color
461 568D 20 88 72 jsr DisplayOffensiveTextNr
462
463 5690 NextPlayerShoots
464 ;before it shoots, the eXistenZ table must be updated
465 ;accordingly to actual energy (was forgotten, sorry to ourselves)
466
467 5690 A2 05 ldx #(MaxPlayers-1)
468 5692 SeteXistenZ
469 5692 BD A2 43 lda Energy,x
470 5695 9D AF 43 sta eXistenZ,x
471
472 5698 20 2A 58 jsr MaxForceCalculate
473
474 569B CA dex
475 569C 10 F4 bpl SeteXistenZ
476
477 ;was setup of maximum energy for players
478
479
480 569E PlayersAgain
481
482 ; In LASTeXistenZ there are values of eXistenZ before shoot
483 ; from the next tank.
484 ; Now it must be checked if by a chance something that had
485 ; LASTeXistenZ>0 is not equal to 0 right now,
486 ; because it means this tank died during this round.
487 ; Most important thing is:
488 ; after each explosion of the tank these operations must be
489 ; performed from the beginning!
490 ; (it is made by another jump into the after explosion routines)
491 ; It is because exploding tank can destroy their neighbours,
492 ; additionally this tank just have had LASTeXistenZ set to 0,
493 ; otherwise it would explode again and again.
494 ; OK, text how to do it is ready, now comes coding .
495 ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ
496
497 569E A9 16 85 9E mva #sfx_next_player sfx_effect
498
499 56A2 A6 AE ldx NumberOfPlayers
500 56A4 CA dex
501 56A5 CheckingPlayersDeath
502 56A5 BD B5 43 lda LASTeXistenZ,x
503 56A8 F0 05 beq NoPlayerNoDeath
504 56AA BD AF 43 lda eXistenZ,x
505 56AD F0 19 beq PlayerXdeath
506 56AF NoPlayerNoDeath
507 56AF CA dex
508 56B0 10 F3 bpl CheckingPlayersDeath
509 ; if processor is here it means there are no more explosions
510
511 56B2 E6 6D A5 6D inc:lda TankSequencePointer
512 56B6 C5 AE cmp NumberOfPlayers
513 56B8 D0 0B bne NotLastPlayerInRound
514 56BA A9 00 85 6D mva #0 TankSequencePointer
515
516 56BE A5 5C lda WindChangeInRound
517 56C0 F0 03 beq NoWindChangeNow
518 56C2 20 E7 57 jsr GetRandomWind ; wind change after each turn (not round only)
519 56C5 NoWindChangeNow
520 56C5 NotLastPlayerInRound
521 56C5 4C 5F 55 jmp MainRoundLoop
522 .endp
523
524 ;---------------------------------
525 56C8 .proc PlayerXdeath
526 ; this tank should not explode anymore:
527 ; there is 0 in A, and Tank Number in X, so...
528 ;---------------------------------
529
530 56C8 9D B5 43 sta LASTeXistenZ,x
531 ; save x somewhere
532 56CB 8E C1 48 stx TankTempY
533
534 ;clear NoDeathCounter here
535 56CE 8D 74 43 sta noDeathCounter
536
537 56D1 A9 06 85 9E mva #sfx_death_begin sfx_effect
538
539 ; display defensive text here (well, defensive
540 ; is not the real meaning, it should be pre-death,
541 ; but I am too lazy to change names of variables)
542
543 ; in X there is a number of tank that died
544
545 56D5 A9 4E lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.")
546 56D7 2C D9 44 bit AfterBFGflag ; check BFG flag
547 56DA 30 15 bmi TextAfterBFG
548 ; if BFG then no points for dead tanks ...
549 56DC AD C2 48 lda CurrentResult
550 56DF 18 clc
551 56E0 7D BB 43 adc ResultsTable,x
552 56E3 9D BB 43 sta ResultsTable,x
553 ;inc CurrentResult
554
555 ; RandomizeDeffensiveText
556 56E6 randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1)
Macro: RANDOMIZE [Source: MACRO.ASM]
6 56E6 ?rand
7 56E6 AD 1B D4 lda random
8 56E9 C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor
9 56EB 90 F9 bcc ?rand
10 56ED C9 74 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling
11 56EF B0 F5 bcs ?rand
Source: game.asm
557 56F1 TextAfterBFG
558 56F1 8D C0 48 sta TextNumberOff
559 56F4 EE C2 48 inc CurrentResult ; ... but increase result of winner (BFG)
560 56F7 AC C1 48 ldy TankTempY
561 56FA A9 FF 85 DB mva #$ff plot4x4color
562 56FE 20 88 72 jsr DisplayOffensiveTextNr
563 ; tank flash
564 5701 AC C1 48 ldy TankTempY
565 5704 A5 6C 85 74 mva TankNr temp2 ; not elegant, and probably unnecessary
566 5708 84 6C sty TankNr
567 570A 20 57 6B jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) )
568 570D A5 74 85 6C mva temp2 TankNr
569
570 ;Deffensive text cleanup
571 ;here we clear Deffensive text (after a shoot)
572 5711 AC C1 48 ldy TankTempY
573 5714 A9 00 85 DB mva #$00 plot4x4color
574 5718 20 88 72 jsr DisplayOffensiveTextNr
575
576 ; calculate position of the explosion (the post-death one)
577 571B AE C1 48 ldx TankTempY
578 571E 18 clc
579 571F BD 0D 44 lda xtankstableL,x
580 5722 69 04 adc #4 ; more or less in the middle of the tank
581 5724 85 61 sta xdraw
582 5726 BD 13 44 lda xtankstableH,x
583 5729 69 00 adc #0
584 572B 85 62 sta xdraw+1
585 572D 38 sec
586 572E BD 19 44 lda ytankstable,x
587 5731 E9 04 sbc #4
588 5733 85 63 sta ydraw
589 5735 A9 00 lda #0
590 5737 85 64 sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit
591
592 ;cleanup of the soil fall down ranges (left and right)
593 5739 85 D4 sta RangeRight
594 573B 85 D5 sta RangeRight+1
595 573D A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft
596
597 ; We are randomizing the weapon now.
598 ; jumping into the middle of the explosion
599 ; routine
600 5745 MetodOfDeath
601 5745 AD 1B D4 lda random
602 5748 29 1F and #%00011111 ; range 0-31
603 574A C9 10 cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19)
604 574C B0 F7 bcs MetodOfDeath
605 574E A8 tay
606 574F B9 4A 60 lda weaponsOfDeath,y
607 5752 20 3C 77 jsr ExplosionDirect
608 5755 A9 15 85 9E mva #sfx_silencer sfx_effect
609
610 ; Clear current Shooter settings. After that, Shooter will "search" for the target again
611 5759 A6 AE ldx NumberOfPlayers
612 575B CA dex
613 575C BD 39 41 @ lda skillTable,x
614 575F C9 02 cmp #2 ; clear variables only if Shooter
615 5761 D0 0B bne NotShooter
616 5763 A9 00 lda #0
617 5765 9D CC 48 sta PreviousAngle,x
618 5768 9D D2 48 sta PreviousEnergyL,x
619 576B 9D DE 48 sta PreviousEnergyH,x
620 576E NotShooter
621 576E CA dex
622 576F 10 EB bpl @-
623
624 ; jump to after explosion routines (soil fallout, etc.)
625 ; After going through these routines we are back
626 ; to checking if a tank exploded and maybe we have
627 ; a deadly shot here again.
628 5771 4C 61 56 jmp MainRoundLoop.AfterExplode
629 .endp
630
631 ;--------------------------------------------------
632 5774 .proc DecreaseEnergyX
633 ;Decreases energy of player nr X by the value Y
634 ;increases his financial loss
635 ;increases gain of tank TankNr
636 ;--------------------------------------------------
637 5774 8C AE 43 sty EnergyDecrease
638 ; Lose increase
639 5777 BD 9C 43 lda loseL,x
640 577A 18 clc
641 577B 6D AE 43 adc EnergyDecrease
642 577E 9D 9C 43 sta loseL,x
643 5781 BD 96 43 lda loseH,x
644 5784 69 00 adc #$00
645 5786 9D 96 43 sta loseH,x
646 ; Energy now, not less than 0
647 5789 BD A2 43 lda Energy,x
648 578C CD AE 43 cmp EnergyDecrease
649 578F 90 05 bcc ldahashzero
650 ;sec
651 5791 ED AE 43 sbc EnergyDecrease
652 5794 10 02 bpl NotNegativeEnergy
653 5796 ldahashzero
654 5796 A9 00 lda #0
655 5798 NotNegativeEnergy
656 5798 9D A2 43 sta Energy,x
657 ;now increase the gain of the shooting tank
658 579B A4 6C ldy TankNr
659 579D 18 clc
660 579E B9 90 43 lda gainL,y
661 57A1 6D AE 43 adc EnergyDecrease
662 57A4 99 90 43 sta gainL,y
663 57A7 B9 8A 43 lda gainH,y
664 57AA 69 00 adc #$00
665 57AC 99 8A 43 sta gainH,y
666 57AF 60 rts
667 .endp
668
669 ;--------------------------------------------------
670 57B0 .proc DecreaseShieldEnergyX
671 ; Decreases energy of shield player nr X by the value Y
672 ; if shield energy is 0 after decrease then in Y we have
673 ; rest of the energy - to decrease tank energy
674 ;--------------------------------------------------
675 57B0 8C AE 43 sty EnergyDecrease
676 57B3 A0 00 ldy #0 ; if Shield survive then no decrease tank anergy
677 ; Energy cannot be less than 0
678 57B5 BD A8 43 lda ShieldEnergy,x
679 57B8 CD AE 43 cmp EnergyDecrease
680 57BB 90 05 bcc UseAllShieldEnergy
681 ;sec
682 57BD ED AE 43 sbc EnergyDecrease
683 57C0 10 0A bpl NotNegativeShieldEnergy ; jump allways
684 57C2 UseAllShieldEnergy
685 ; now calculate rest of energy for future tank energy decrease
686 57C2 38 sec
687 57C3 AD AE 43 lda EnergyDecrease
688 57C6 FD A8 43 sbc ShieldEnergy,x
689 57C9 A8 tay
690 57CA A9 00 lda #0
691 57CC NotNegativeShieldEnergy
692 57CC 9D A8 43 sta ShieldEnergy,x
693 57CF 60 rts
694 .endp
695
696 ;---------------------------------
697 57D0 .proc Seppuku
698 ;---------------------------------
699 57D0 A9 00 lda #0
700 57D2 85 64 sta ydraw+1
701 ; get position of the tank
702 57D4 A6 6C ldx TankNr
703 ; lda #0 ; turn off defense weapons when hara-kiring
704 57D6 9D FD 43 sta ActiveDefenceWeapon,x
705 57D9 9D A8 43 sta ShieldEnergy,x
706 57DC 20 67 74 jsr SetupXYdraw
707 57DF A9 01 lda #1 ; Missile
708 57E1 20 3C 77 jsr ExplosionDirect
709 57E4 4C 61 56 jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku
710 .endp
711
712 ;--------------------------------------------------
713 57E7 .proc GetRandomWind
714 ;in: MaxWind (byte)
715 ;out: Wind (word)
716 ;uses: _
717 ;--------------------------------------------------
718 57E7 AD 1B D4 lda random
719 57EA CD 0A 44 cmp MaxWind
720 57ED B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again
721 57EF 85 CE sta Wind
722 57F1 A9 00 85 CF mva #$00 Wind+1
723 57F5 85 D0 sta Wind+2
724 57F7 85 D1 sta Wind+3
725 ; multiply Wind by 16
726 ; two bytes of Wind are treated as a decimal part of vx variable
727 57F9 06 CE 26 CF 06 CE + :4 aslw Wind
728 ; decide the direction
729 5809 AD 1B D4 lda random
730 580C 29 01 and #$01
731 580E F0 19 beq @+
732 5810 38 sec ; Wind = -Wind
733 .rept 4
734 LDA #$00
735 SBC WIND+#
736 STA WIND+#
737 .endr
Source: REPT
734 5811 A9 00 LDA #$00
734 5813 E5 CE SBC WIND+#
734 5815 85 CE STA WIND+#
734 5817 A9 00 LDA #$00
734 5819 E5 CF SBC WIND+#
734 581B 85 CF STA WIND+#
734 581D A9 00 LDA #$00
734 581F E5 D0 SBC WIND+#
734 5821 85 D0 STA WIND+#
734 5823 A9 00 LDA #$00
734 5825 E5 D1 SBC WIND+#
734 5827 85 D1 STA WIND+#
Source: game.asm
738 5829 60 @ rts
739 .endp
740 ;--------------------------------------------------
741 582A .proc MaxForceCalculate
742 ; calculates max force for tank (tanknr in X)
743 ; Energy of tank X in A
744 ;--------------------------------------------------
745 582A 85 E8 sta L1
746
747 ;DATA L1,L2
748 ;Multiplication 8bit*8bit,
749 ;result 16bit
750 ;this algiorithm is a little longer than one in Ruszczyc 6502 book
751 ;but it is faster
752
753 582C A0 08 ldy #8
754 582E A9 00 lda #0
755 5830 18 clc
756 5831 6A LP0 ror
757 5832 66 E8 ror L1
758 5834 90 03 bcc B0
759 5836 18 clc
760 5837 69 0A adc #10 ; (L2) multiplication by 10
761 5839 88 B0 dey
762 583A D0 F5 bne LP0
763 583C 6A ror
764 583D 66 E8 ror L1
765 583F 9D EB 43 sta MaxForceTableH,x
766 5842 A5 E8 lda L1
767 5844 9D E5 43 sta MaxForceTableL,x
768 5847 60 rts
769 .endp
770
771 ;--------------------------------------------------
772 5848 .proc WeaponCleanup
773 ; cleaning of the weapon possesion tables
774 ; 99 of Baby Missles and White Flags, all other weapons=0)
775 ;--------------------------------------------------
776 5848 A2 2F ldx #(number_of_weapons - 1)
777 584A A9 00 @ lda #$0
778 584C E0 20 cpx #ind_White_Flag_____ ; White Flag
779 584E D0 02 bne no99
780 5850 A9 63 set99 lda #99
781 5852 9D 1E 45 no99 sta TanksWeapon1,x
782 5855 9D 4E 45 sta TanksWeapon2,x
783 5858 9D 7E 45 sta TanksWeapon3,x
784 585B 9D AE 45 sta TanksWeapon4,x
785 585E 9D DE 45 sta TanksWeapon5,x
786 5861 9D 0E 46 sta TanksWeapon6,x
787 5864 CA dex
788 5865 F0 E9 beq set99 ; Baby Missile (index=0)
789 5867 10 E1 bpl @-
790 5869 60 rts
791 .endp
792
793 ;--------------------------------------------------
794 586A .proc Initialize
795 ;Initialization sequence
796 ;uses: temp, ...
797 ;--------------------------------------------------
798 = 0072 deletePtr = temp
799
800 ; clean variables
801 586A A9 00 lda #0
802 586C 85 D7 sta escFlag
803 586E 85 5D sta JoystickNumber
804 5870 A8 tay
805 5871 A9 73 85 72 A9 43 + mwa #variablesStart deletePtr
806 5879 98 @ tya
807 587A 91 72 sta (deletePtr),y
808 587C E6 72 D0 02 E6 73 inw deletePtr
809 5882 A5 73 C9 4F D0 04 + cpw deletePtr #variablesEnd
810 588C D0 EB bne @-
811
812 ; ser initial shapes for each tank (tanks 0-5 has shape 0 now)
813 588E A0 01 ldy #1
814 5890 8C 2C 44 sty TankShape+1
815 5893 8C 2F 44 sty TankShape+4
816 5896 C8 iny
817 5897 8C 2D 44 sty TankShape+2
818 589A 8C 30 44 sty TankShape+5
819
820
821 589D A9 00 8D E6 48 A9 + mwa #1024 RandBoundaryHigh
822 58A7 A9 FF 8D 0C 45 mva #$ff LastWeapon
823 58AC 85 C5 sta HowMuchToFall
824 58AE A9 01 85 A9 mva #1 color
825
826 58B2 20 FB 58 jsr SetStandardBarrels
827 58B5 20 48 58 jsr WeaponCleanup
828
829 58B8 A9 4F 85 02 mva #>WeaponFont chbas
830
831 ;parameter for old plot (unPlot) max 5 points
832 58BC A2 04 ldx #4
833 58BE SetunPlots
834 58BE A9 10 lda #<display
835 58C0 9D 9C 44 sta oldplotL,x
836 58C3 A9 20 lda #>display
837 58C5 9D 97 44 sta oldplotH,x
838 58C8 A9 00 lda #0
839 58CA 9D A6 44 sta oldply,x
840 58CD A9 FF lda #$ff
841 58CF 9D A1 44 sta oldora,x
842 58D2 CA dex
843 58D3 10 E9 bpl SetunPlots
844
845 ;setting up P/M graphics
846 58D5 A9 18 lda #>pmgraph
847 58D7 85 02 sta pmbase
848 58D9 A9 03 lda #$03 ; P/M on
849 58DB 85 02 sta GRACTL
850 58DD 20 62 75 jsr SetPMWidth
851 58E0 A9 21 lda #%00100001 ; P/M priorities (multicolor players on) - prior=1
852 58E2 85 02 sta GPRIOR
853 58E4 20 46 75 jsr PMoutofScreen
854
855 ;let the tanks be visible!
856 58E7 A2 05 ldx #(maxPlayers-1)
857 58E9 A9 63 lda #99 ; tank is visible
858 58EB MakeTanksVisible
859 58EB 9D AF 43 sta eXistenZ,x
860 58EE CA dex
861 58EF 10 FA bpl MakeTanksVisible
862
863 58F1 A9 01 8D 14 45 mva #1 CurrentRoundNr ;we start from round 1
864 58F6 A9 06 85 9C mva #6 NTSCcounter
865
866 58FA 60 rts
867 .endp
868 ;--------------------------------------------------
869 58FB .proc SetStandardBarrels
870 ; set standart barrel length and deactivate Auto Defense
871 ; for all tanks
872 ;--------------------------------------------------
873 58FB A2 05 ldx #maxPlayers-1
874 58FD A9 06 @ lda #StandardBarrel ; standard barrel length
875 58FF 9D F1 43 sta BarrelLength,x
876 5902 A9 00 lda #$00 ; deactivate Auto Defense
877 5904 9D 03 44 sta AutoDefenseFlag,x
878 5907 CA dex
879 5908 10 F3 bpl @-
880 590A 60 rts
881 .endp
882 ;----------------------------------------------
883 /* .proc RandomizeSequence0
884 ldx #0
885 @ txa
886 sta TankSequence,x
887 inx
888 cpx #MaxPlayers
889 bne @-
890 rts
891 .endp */
891
892 ;--------------------------------------------------
893 590B .proc RandomizeSequence
894 ; in: NumberOfPlayers
895 ; out: TankSequence
896 ; how: get random number lower than NumberOfPlayers
897 ; put it in the first slot.
898 ; get another random number lower than NumberOfPlayers
899 ; check if was previously saved in first slot
900 ; if not then save it in second slot
901 ; repeat untill NumberOfPlayers
902
903 590B A2 00 ldx #0
904 590D GetRandomAgain0
905 590D AD 1B D4 lda RANDOM
906 5910 29 07 and #$07 ;NumberOfPlayers < 7
907 5912 C5 AE cmp NumberOfPlayers
908 5914 B0 F7 bcs GetRandomAgain0
909 5916 9D 77 43 sta TankSequence,x
910 ;now first slot is ready, nexts slots are handled
911 ;in a more complicated way
912
913 5919 GetRandomAgainX
914 5919 AD 1B D4 lda RANDOM
915 591C 29 07 and #$07 ;NumberOfPlayers < 7
916 591E C5 AE cmp NumberOfPlayers
917 5920 B0 F7 bcs GetRandomAgainX
918
919 ;now we have to check if the value was not used
920 ;in previous slots
921
922 5922 86 72 stx temp
923 5924 A4 72 ldy temp
924 5926 UsageLoop
925 5926 D9 77 43 cmp TankSequence,y
926 5929 F0 EE beq GetRandomAgainX ;apparently we have already used this value
927 592B 88 dey
928 592C 10 F8 bpl UsageLoop
929
930 ;well, looks like this value is new!
931 592E E8 inx
932 592F 9D 77 43 sta TankSequence,x
933
934 5932 86 72 stx temp
935 5934 E6 72 A5 72 inc:lda temp ;x+1
936
937 5938 C5 AE cmp NumberOfPlayers
938 593A D0 DD bne GetRandomAgainX
939 593C 60 rts
940 .endp
941 ;----------------------------------------------
942 593D .proc RandomizeAngle
943 ; routine returns in A
944 ; a valid angle for the tank's barrel.
945 ; X is not changed
946 ;----------------------------------------------
947
948 ; lets randomize someting between 0 and 180
949 593D AD 1B D4 lda RANDOM
950 5940 C9 B4 cmp #180
951 5942 B0 F9 bcs RandomizeAngle
952 5944 60 rts
953 .endp
954 ;----------------------------------------------
955 5945 .proc RandomizeForce
956 ; routine returns in ForceTable/L/H
957 ; valid force of shooting for TankNr
958 ; in X must be TankNr
959 ; low and high randomize boundary passed as word value
960 ; RandBoundaryLow
961 ; RandBoundaryHigh
962 ;----------------------------------------------
963
964 5945 AD 1B D4 lda RANDOM
965 5948 85 74 sta temp2
966 594A AD 1B D4 lda RANDOM
967 594D 29 03 and #%00000011 ;(0..1023)
968 594F 85 75 sta temp2+1
969
970 5951 AD E5 48 C5 75 D0 + cpw RandBoundaryLow temp2
971 595D F0 02 B0 E4 seq:bcs RandomizeForce
972
973 5961 AD E7 48 C5 75 D0 + cpw RandBoundaryHigh temp2
974 596D 90 D6 bcc RandomizeForce
975
976 596F A5 74 lda temp2
977 5971 9D D9 43 sta ForceTableL,x
978 5974 A5 75 lda temp2+1
979 5976 9D DF 43 sta ForceTableH,x
980
981 ;---------
982 5979 LimitForce
983 ; in X must be TankNr
984 ; cuts force to MaxForceTable
985 5979 BD EB 43 lda MaxForceTableH,x
986 597C DD DF 43 cmp ForceTableH,x
987 597F D0 06 bne @+
988 5981 BD E5 43 lda MaxForceTableL,x
989 5984 DD D9 43 cmp ForceTableL,x
990 5987 B0 0C @ bcs @+
991
992 5989 BD E5 43 lda MaxForceTableL,x
993 598C 9D D9 43 sta ForceTableL,x
994 598F BD EB 43 lda MaxForceTableH,x
995 5992 9D DF 43 sta ForceTableH,x
996 @
997 5995 60 rts
998
999 .endp
1000 ;----------------------------------------------
1001 5996 .proc Table2Force
1002 ;----------------------------------------------
1003 5996 BD D9 43 lda ForceTableL,x
1004 5999 85 A4 sta Force
1005 599B BD DF 43 lda ForceTableH,x
1006 599E 85 A5 sta Force+1
1007 59A0 60 rts
1008 .endp
1009 ;----------------------------------------------
1010 59A1 .proc MoveBarrelToNewPosition
1011 ;----------------------------------------------
1012 59A1 A9 01 85 AA mva #1 Erase
1013 59A5 20 48 6B jsr DrawTankNr.BarrelChange
1014 59A8 A9 00 85 AA mva #0 Erase
1015 59AC MoveBarrel
1016 59AC A9 01 85 9E mva #sfx_set_power_2 sfx_effect
1017 59B0 20 2C 6A jsr DrawTankNr
1018 59B3 20 0F 66 jsr DisplayStatus.displayAngle
1019 ; ldx TankNr
1020 59B6 A9 01 85 AA mva #1 Erase
1021 59BA 20 89 5A jsr WaitOneFrame
1022 59BD 20 48 6B jsr DrawTankNr.BarrelChange
1023 59C0 A9 00 85 AA mva #0 Erase
1024 59C4 A5 D6 lda NewAngle
1025 59C6 DD C3 48 cmp AngleTable,x
1026 59C9 F0 0E beq BarrelPositionIsFine
1027 59CB 90 06 bcc rotateLeft
1028 59CD rotateRight ; older is lower
1029 59CD FE C3 48 inc angleTable,x
1030 59D0 4C AC 59 jmp MoveBarrel
1031 59D3 rotateLeft ; older is bigger
1032 59D3 DE C3 48 dec angleTable,x
1033 59D6 4C AC 59 jmp MoveBarrel
1034 59D9 BarrelPositionIsFine
1035 59D9 20 2C 6A jsr DrawTankNr
1036 59DC 60 rts
1037
1038 .endp
1039
1040 ;----------------------------------------------
1041 59DD .proc SortSequence ;
1042 ;----------------------------------------------
1043 ; here we try to get a sequence of tanks for two
1044 ; purposes:
1045 ; 1. to make up shooting sequence for the next round (from down to top)
1046 ; 2. to display game results more nicely (from top to down)
1047 ;
1048 ; I think I will go for a stupid bubble sort...
1049 ; it is easy to test :)
1050 ;
1051 ; Results are in ResultsTable, in TankSequence (Sorted Table) we want to
1052 ; have numbers of tanks from the worst to the best.
1053 ; in other words, if ResultsTable=(5,4,65,23,3,6)
1054 ; the TankSequence=(4,1,0,5,3,2)
1055 ; let's assume initially the TankSequence=(0,1,2,3,4,5)
1056
1057 59DD A2 00 ldx #0
1058 59DF SequenceStart
1059 59DF 8A txa
1060 59E0 9D 77 43 sta TankSequence,x
1061 59E3 E8 inx
1062 59E4 E0 06 cpx #MaxPlayers
1063 59E6 D0 F7 bne SequenceStart
1064
1065 ; we will need a TempResults (TR) table to fiddle with
1066 59E8 A2 00 ldx #0
1067 59EA movetotemp
1068 59EA BD BB 43 lda ResultsTable,x
1069 59ED 9D C1 43 sta TempResults,x
1070 59F0 E8 inx
1071 59F1 E4 AE cpx NumberOfPlayers
1072 59F3 D0 F5 bne movetotemp
1073
1074 ; i=0:sortflag=0
1075 ;loop:
1076 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers
1077 ; or goto loop:
1078 ; else
1079 ; temp=TR(i): tempo=TankSequence(i)
1080 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1)
1081 ; TR(i+1)=temp: TankSequence(i+1)=tempo
1082 ; i=i+1
1083 ; sortflag=sortflag+1
1084 ; go loop:
1085 ; if sortflag=0 then finished, else repeat...
1086 ;
1087 ; or something like this :)
1088 59F5 A6 AE ldx NumberOfPlayers
1089 59F7 CA dex
1090 59F8 86 73 stx temp+1 ; for checking end of the loop only
1091
1092 59FA Bubble
1093 59FA A2 00 ldx #0 ;i=x
1094 59FC 86 74 stx temp2 ; sortflag=temp2
1095
1096 59FE BubbleBobble
1097 59FE BD C1 43 lda TempResults,x
1098 5A01 DD C2 43 cmp TempResults+1,x
1099 5A04 90 31 bcc nextishigher
1100 5A06 D0 10 bne swapvalues
1101 5A08 nextisequal
1102 ; if results are equal, check Direct Hits
1103 5A08 BC 77 43 ldy TankSequence,x
1104 5A0B B9 C7 43 lda DirectHits,y
1105 5A0E BC 78 43 ldy TankSequence+1,x
1106 5A11 D9 C7 43 cmp DirectHits,y
1107 ;
1108 5A14 F0 21 beq nextishigher ; this is to block hangs when 2 equal values meet
1109 5A16 90 1F bcc nextishigher
1110 ;here we must swap values
1111 ;because next is smaller than previous
1112 5A18 swapvalues
1113 5A18 85 72 sta temp
1114 5A1A BD C2 43 lda TempResults+1,x
1115 5A1D 9D C1 43 sta TempResults,x
1116 5A20 A5 72 lda temp
1117 5A22 9D C2 43 sta TempResults+1,x
1118 ;
1119 5A25 BD 77 43 lda TankSequence,x
1120 5A28 85 72 sta temp
1121 5A2A BD 78 43 lda TankSequence+1,x
1122 5A2D 9D 77 43 sta TankSequence,x
1123 5A30 A5 72 lda temp
1124 5A32 9D 78 43 sta TankSequence+1,x
1125 5A35 E6 74 inc temp2
1126 5A37 nextishigher
1127 5A37 E8 inx
1128 5A38 E4 73 cpx temp+1 ;cpx ^NumberOfPlayers-1
1129 5A3A D0 C2 bne BubbleBobble
1130
1131 5A3C A5 74 lda temp2
1132
1133 5A3E D0 BA bne Bubble
1134
1135 5A40 60 rts
1136 .endp
1137 ;--------------------------------------------------
1138 5A41 .proc SetWallsType
1139 ;--------------------------------------------------
1140 5A41 A9 00 8D 0C 44 mva #0 WallsType
1141 5A46 AD 47 41 lda OptionsTable+8
1142 5A49 C9 04 cmp #4
1143 5A4B F0 09 beq SetRandomWalls
1144 5A4D 4A lsr
1145 5A4E 6E 0C 44 ror WallsType
1146 5A51 4A lsr
1147 5A52 6E 0C 44 ror WallsType
1148 5A55 60 rts
1149 5A56 SetRandomWalls
1150 5A56 AD 1B D4 lda random
1151 5A59 29 C0 and #%11000000
1152 5A5B 8D 0C 44 sta WallsType
1153 5A5E 60 rts
1154 .endp
1155
1156 .ENDIF
236 ;--------------------------------------------------
237
238
239 ;--------------------------------------------------
240 5A5F .proc GetKey
241 ; waits for pressing a key and returns pressed value in A
242 ; when [ESC] is pressed, escFlag is set
243 ; result: A=keycode
244 ;--------------------------------------------------
245 5A5F 20 71 5A jsr WaitForKeyRelease
246 5A62 A9 00 lda #0
247 5A64 85 D7 sta escFlag
248 5A66 A9 FF lda #$ff
249 5A68 60 rts
250 .endp
251
252 ;--------------------------------------------------
253 5A69 .proc getkeynowait
254 ;--------------------------------------------------
255 5A69 20 71 5A jsr WaitForKeyRelease
256 5A6C A5 02 lda kbcode
257 5A6E 29 3F and #$3f ;CTRL and SHIFT ellimination
258 5A70 60 rts
259 .endp
260
261 ;--------------------------------------------------
262 5A71 .proc WaitForKeyRelease
263 ;--------------------------------------------------
264 5A71 StillWait
265 5A71 60 rts
266 .endp
267 ;--------------------------------------------------
268 5A72 .proc IsKeyPressed
269 ; result: A=0 - yes , A>0 - no
270 ;--------------------------------------------------
271 5A72 A9 01 lda #1
272 5A74 60 rts
273 .endp
274 ;--------------------------------------------------
275 5A75 .proc DemoModeOrKey
276 ; Waits for the key pressed if at least one human is playing.
277 ; Otherwise, waits 3 seconds (demo mode).
278 ;--------------------------------------------------
279 ;check demo mode
280 5A75 A6 AE ldx numberOfPlayers
281 5A77 CA dex
282 5A78 checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE
283 5A78 BD 39 41 lda skillTable,x
284 5A7B F0 09 beq peopleAreHere
285 5A7D CA dex
286 5A7E 10 F8 bpl checkForHuman
287 ; no people, just wait a bit
288 ;pause 150
289 5A80 A0 4B ldy #75
290 5A82 20 9D 5A jsr PauseYFrames
291 5A85 60 rts
292 5A86 peopleAreHere
293 5A86 4C 5F 5A jmp getkey ; jsr:rts
294 .endp
295
296 ;--------------------------------------------------
297 5A89 MakeDarkScreen
298 ;--------------------------------------------------
299 ; mva #0 dmactls ; dark screen
300 ; and wait one frame :)
301 ;--------------------------------------------------
302 5A89 .proc WaitOneFrame
303 ;--------------------------------------------------
304 5A89 wait ; or waitRTC ?
Macro: WAIT [Source: MACRO.ASM]
3 5A89 AD 12 D0 ?ze LDA $D012
4 5A8C C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection)
5 5A8E 90 F9 bcc ?ze
6 5A90 E9 0A sbc #10 ; last lines correction
7 5A92 CD 12 D0 ?wa cmp $D012
8 5A95 90 FB bcc ?wa
9 5A97 CD 12 D0 ?wf cmp $D012
10 5A9A B0 FB bcs ?wf
Source: scorchC64.asm
305 5A9C 60 rts
306 .endp
307
308 ;--------------------------------------------------
309 5A9D .proc PauseYFrames
310 ; Y - number of frames to wait (divided by 2)
311 ; pauses for maximally 510 frames (255 * 2)
312 ;--------------------------------------------------
313 5A9D 20 89 5A @ jsr WaitOneFrame
314 5AA0 20 89 5A jsr WaitOneFrame
315 5AA3 88 dey
316 5AA4 D0 F7 bne @-
317 5AA6 60 rts
318 .endp
319
320 ;--------------------------------------------------
321 5AA7 .proc ShellDelay
322 5AA7 AE 76 43 ldx flyDelay
323 5AAA DelayLoop
324 5AAA AD 12 D0 lda $d012
325 5AAD CD 12 D0 @ cmp $d012
326 5AB0 F0 FB beq @-
327 5AB2 CA dex
328 5AB3 D0 F5 bne DelayLoop
329 5AB5 noShellDelay
330 5AB5 60 rts
331 .endp
332 ;--------------------------------------------------
333 5AB6 .proc RmtSongSelect
334 ; starting song line 0-255 to A reg
335 ;--------------------------------------------------
336 5AB6 60 rts
337 .endp
338 5AB7 .proc CopyFromRom
339 5AB7 60 rts
340 .endp
341 ;--------------------------------------------------
342 5AB8 icl 'C64/interrupts.asm'
Source: interrupts.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 = 0000 DLIinterruptGraph = 0
6 ;--------------------------------------------------
7 .macro SetDLI
8 ; SetDLI #WORD
9 ; Initialises Display List Interrupts
10 LDY # <:1
11 LDX # >:1
12 jsr _SetDLIproc
13 .endm
14 5AB8 .proc _SetDLIproc
15 ; LDA #$C0
16 ; STY VDSLST
17 ; STX VDSLST+1
18 ; STA NMIEN
19 5AB8 60 rts
20 .endp
21
22 .ENDIF
343 ;----------------------------------------------
344 5AB9 icl 'constants.asm'
Source: constants.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 ; initial values for some variables
6 5AB9 initialvaluesStart
7 5AB9 00 01 02 02 00 01 + I_OptionsTable .by 0,1,2,2,0,1,3,2,0
8 5AC2 0A I_RoundsInTheGame .by 10 ;how many rounds in the current game
9 5AC3 4B I_seppukuVal .by 75
10 5AC4 03 I_mountainDeltaH .by 3
11 5AC5 FF I_mountainDeltaL .by $ff
12 ;----------------------------------------------------
13 5AC6 I_LineHeader1
14 5AC6 03 00 32 2F 35 2E + dta d"# ROUND: "
15 5ACF I_RoundNrDisplay
16 5ACF 00 00 00 00 03 FF dta d" #", $ff
17 = 001C initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes !
18 ;===================================================================================
19 ;==========================CONSTANT TABLES, do not erase!===========================
20 ;===================================================================================
21
22 5AD5 00 01 03 05 07 mountainsDeltaTableH .by 0,1,3,5,7
23 5ADA 1F 7F FF 7F FF mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff
24 ;------------------------------------------------
25 5ADF LevelNameBeginL ; begins of level names
26 5ADF 00 0A 14 .by <NamesOfLevels,<(NamesOfLevels+10),<(NamesOfLevels+20)
27 5AE2 20 2A 34 .by <(NamesOfLevels+32),<(NamesOfLevels+42),<(NamesOfLevels+52)
28 5AE5 40 4A 54 .by <(NamesOfLevels+64),<(NamesOfLevels+74),<(NamesOfLevels+84)
29 5AE8 LevelNameBeginH
30 5AE8 00 00 00 .by >NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20)
31 5AEB 00 00 00 .by >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52)
32 5AEE 00 00 00 .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84)
33 ;--------------
34 5AF1 TanksWeaponsTableL
35 5AF1 1E 4E 7E AE DE 0E .by <TanksWeapon1,<TanksWeapon2,<TanksWeapon3,<TanksWeapon4,<TanksWeapon5,<TanksWeapon6
36 5AF7 TanksWeaponsTableH
37 5AF7 45 45 45 45 45 46 .by >TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6
38 ;--------------
39 5AFD XtankOffsetGO_L
40 5AFD 06 38 6A 9C CE 00 .by 6,56,106,156,206,0
41 5B03 XtankOffsetGO_H
42 5B03 00 00 00 00 00 01 .by 0,0,0,0,0,1
43 ;-----4x4 texts-----
44 5B09 LineTop
45 5B09 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%%)"
46 ;# - vertical, () * +, % - horizontal
47 5B17 LineBottom
48 5B17 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%%+"
49 5B25 LineEmpty
50 5B25 03 00 00 00 00 00 + dta d"# #"
51 5B33 LineHeader2
52 5B33 03 00 00 32 25 33 + dta d"# RESULTS #"
53 5B41 LineGameOver
54 5B41 03 00 27 21 2D 25 + dta d"# GAME OVER #"
55 5B4F seppukuText
56 5B4F 03 00 00 33 25 30 + dta d"# SEPPUKU! #"
57 5B5D areYouSureText
58 5B5D 03 00 33 35 32 25 + dta d"# SURE? Y/N #"
59 5B6B lineClear
60 5B6B 00 00 00 00 00 00 + dta d" "
61
62 5B79 58 2A 96 CA 7A ED TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed
63 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order
64 5B7F 74 C4 24 E4 54 94 TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order
65 ;-----------
66 5B85 GradientAddrL
67 5B85 BC BC 8B .by <dliColorsFore, <dliColorsFore, <dliColorsFore2
68 5B88 GradientAddrH
69 5B88 A2 A2 5B .by >dliColorsFore, >dliColorsFore, >dliColorsFore2
70 5B8B dliColorsFore2 ; colors for NTSC
71 5B8B 0A .by $0a ; one mountains color
72 5B8C 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
73 5B96 3A 1A 1A EA EA D8 + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8
74 5BA0 dliColorsFore2PAL ; colors for PAL
75 5BA0 0A .by $0a ; one mountains color
76 5BA1 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a
77 5BAB 3A 1A 1A EA EA C8 + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8
78
79 ;-----------
80 5BB5 pmtableL ; addressess of the P/M memory for 6 tanks
81 5BB5 00 .by <(pmgraph+$400)
82 5BB6 00 .by <(pmgraph+$500)
83 5BB7 00 .by <(pmgraph+$600)
84 5BB8 00 .by <(pmgraph+$700)
85 5BB9 00 .by <(pmgraph+$300) ; this is a missile background
86 5BBA 00 .by <(pmgraph+$300) ; this is a missile background
87 5BBB pmtableH
88 5BBB 1C .by >(pmgraph+$400)
89 5BBC 1D .by >(pmgraph+$500)
90 5BBD 1E .by >(pmgraph+$600)
91 5BBE 1F .by >(pmgraph+$700)
92 5BBF 1B .by >(pmgraph+$300)
93 5BC0 1B .by >(pmgraph+$300)
94 ;-----------
95 5BC1 sintable
96 5BC1 01 .by 1
97 5BC2 04 .by 4
98 5BC3 08 .by 8
99 5BC4 0D .by 13
100 5BC5 11 .by 17
101 5BC6 16 .by 22
102 5BC7 1A .by 26
103 5BC8 1F .by 31
104 5BC9 23 .by 35
105 5BCA 28 .by 40
106 5BCB 2C .by 44
107 5BCC 30 .by 48
108 5BCD 35 .by 53
109 5BCE 39 .by 57
110 5BCF 3D .by 61
111 5BD0 42 .by 66
112 5BD1 46 .by 70
113 5BD2 4A .by 74
114 5BD3 4F .by 79
115 5BD4 53 .by 83
116 5BD5 57 .by 87
117 5BD6 5B .by 91
118 5BD7 5F .by 95
119 5BD8 64 .by 100
120 5BD9 68 .by 104
121 5BDA 6C .by 108
122 5BDB 70 .by 112
123 5BDC 74 .by 116
124 5BDD 78 .by 120
125 5BDE 7C .by 124
126 5BDF 80 .by 128
127 5BE0 83 .by 131
128 5BE1 87 .by 135
129 5BE2 8B .by 139
130 5BE3 8F .by 143
131 5BE4 92 .by 146
132 5BE5 96 .by 150
133 5BE6 9A .by 154
134 5BE7 9D .by 157
135 5BE8 A1 .by 161
136 5BE9 A4 .by 164
137 5BEA A7 .by 167
138 5BEB AB .by 171
139 5BEC AE .by 174
140 5BED B1 .by 177
141 5BEE B5 .by 181
142 5BEF B8 .by 184
143 5BF0 BB .by 187
144 5BF1 BE .by 190
145 5BF2 C1 .by 193
146 5BF3 C4 .by 196
147 5BF4 C6 .by 198
148 5BF5 C9 .by 201
149 5BF6 CC .by 204
150 5BF7 CF .by 207
151 5BF8 D1 .by 209
152 5BF9 D4 .by 212
153 5BFA D6 .by 214
154 5BFB D9 .by 217
155 5BFC DB .by 219
156 5BFD DD .by 221
157 5BFE DF .by 223
158 5BFF E2 .by 226
159 5C00 E4 .by 228
160 5C01 E6 .by 230
161 5C02 E8 .by 232
162 5C03 E9 .by 233
163 5C04 EB .by 235
164 5C05 ED .by 237
165 5C06 EE .by 238
166 5C07 F0 .by 240
167 5C08 F2 .by 242
168 5C09 F3 .by 243
169 5C0A F4 .by 244
170 5C0B F6 .by 246
171 5C0C F7 .by 247
172 5C0D F8 .by 248
173 5C0E F9 .by 249
174 5C0F FA .by 250
175 5C10 FB .by 251
176 5C11 FC .by 252
177 5C12 FC .by 252
178 5C13 FD .by 253
179 5C14 FE .by 254
180 5C15 FE .by 254
181 5C16 FF .by 255
182 5C17 FF .by 255
183 5C18 FF .by 255
184 5C19 FF .by 255
185 5C1A FF .by 255
186 5C1B FF .by 255 ;anti self destruction byte
187
188 ;linetableL
189 ; :screenheight+1 .by <(display+screenBytes*#)
190 ;linetableH
191 ; :screenheight+1 .by >(display+screenBytes*#)
192 ;----------------------------
193 5C1C bittable
194 5C1C 80 40 20 10 08 04 + .by $80,$40,$20,$10,$08,$04,$02,$01
195 5C24 bittable2
196 5C24 7F BF DF EF F7 FB + .by $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe
197 ;----------------------------
198 5C2C disktance ;tanks distance
199 5C2C 00 00 .by 0,0
200 5C2E 6A .by screenwidth/3
201 5C2F 50 .by screenwidth/4
202 5C30 40 .by screenwidth/5
203 5C31 35 .by screenwidth/6
204 5C32 2D .by screenwidth/7
205 ;max number of players=6
206
207 ; this table is for deciding where a tank should slide
208 ; accordingly to what is below the tank
209 ; values in table mean that tank is moving to the left
210 5C33 SlideLeftTable
211 5C33 01 .BY %00000001
212 5C34 02 .BY %00000010
213 5C35 03 .BY %00000011
214 5C36 04 .BY %00000100
215 5C37 05 .BY %00000101
216 5C38 06 .BY %00000110
217 5C39 07 .BY %00000111
218 ; .BY %00001100
219 = 0007 SlideLeftTableLen = *-SlideLeftTable
220 ;-------------------------------------------------
221 5C3A TanksNamesDefault
222 5C3A 11 73 74 0E 34 61 + dta d"1st.Tank"
223 5C42 12 6E 64 0E 34 61 + dta d"2nd.Tank"
224 5C4A 13 72 64 0E 34 61 + dta d"3rd.Tank"
225 5C52 14 74 68 0E 34 61 + dta d"4th.Tank"
226 5C5A 15 74 68 0E 34 61 + dta d"5th.Tank"
227 5C62 16 74 68 0E 34 61 + dta d"6th.Tank"
228 ;-------------------------------------------------
229 5C6A 20 TankShapesTable .BYTE char_tank1___________
230 5C6B 24 .BYTE char_tank2___________
231 5C6C 2C .BYTE char_tank3___________
232 5C6D 28 .BYTE char_tank4___________
233 ;-------------------------------------------------
234 5C6E WeaponPriceH ; weapons prices (tables with prices of weapons)
235 5C6E 00 .by >price_Baby_Missile___
236 5C6F 00 .by >price_Missile________
237 5C70 00 .by >price_Baby_Nuke______
238 5C71 00 .by >price_Nuke___________
239 5C72 00 .by >price_LeapFrog_______
240 5C73 01 .by >price_Funky_Bomb_____
241 5C74 01 .by >price_MIRV___________
242 5C75 01 .by >price_Death_s_Head___
243 5C76 00 .by >price_Napalm_________
244 5C77 00 .by >price_Hot_Napalm_____
245 5C78 00 .by >price_Tracer_________
246 5C79 01 .by >price_Smoke_Tracer___
247 5C7A 00 .by >price_Baby_Roller____
248 5C7B 00 .by >price_Roller_________
249 5C7C 01 .by >price_Heavy_Roller___
250 5C7D 00 .by >price_Riot_Charge____
251 5C7E 00 .by >price_Riot_Blast_____
252 5C7F 01 .by >price_Riot_Bomb______
253 5C80 01 .by >price_Heavy_Riot_Bomb
254 5C81 00 .by >price_Baby_Digger____
255 5C82 00 .by >price_Digger_________
256 5C83 00 .by >price_Heavy_Digger___
257 5C84 00 .by >price_Baby_Sandhog___
258 5C85 00 .by >price_Sandhog________
259 5C86 00 .by >price_Heavy_Sandhog__
260 5C87 00 .by >price_Dirt_Clod______
261 5C88 00 .by >price_Dirt_Ball______
262 5C89 00 .by >price_Ton_of_Dirt____
263 5C8A 01 .by >price_Liquid_Dirt____
264 5C8B 01 .by >price_Dirt_Charge____
265 5C8C 00 .by >price_Buy_me_________
266 5C8D 01 .by >price_Laser__________
267 5C8E 00 .by >price_White_Flag_____
268 5C8F 01 .by >price_Battery________
269 5C90 01 .by >price_Hovercraft_____
270 5C91 00 .by >price_Parachute______
271 5C92 03 .by >price_StrongParachute
272 5C93 02 .by >price_Mag_Deflector__
273 5C94 00 .by >price_Shield_________
274 5C95 02 .by >price_Heavy_Shield___
275 5C96 04 .by >price_Force_Shield___
276 5C97 02 .by >price_Bouncy_Castle__
277 5C98 08 .by >price_Long_Barrel____
278 5C99 03 .by >price_Nuclear_Winter_
279 5C9A 01 .by >price_Lazy_Boy_______
280 5C9B 02 .by >price_Lazy_Darwin____
281 5C9C 00 .by >price_Auto_Defense___
282 5C9D 00 .by >price_Spy_Hard_______
283 5C9E WeaponPriceL
284 5C9E 00 .by <price_Baby_Missile___
285 5C9F 60 .by <price_Missile________
286 5CA0 6F .by <price_Baby_Nuke______
287 5CA1 90 .by <price_Nuke___________
288 5CA2 C0 .by <price_LeapFrog_______
289 5CA3 25 .by <price_Funky_Bomb_____
290 5CA4 C8 .by <price_MIRV___________
291 5CA5 51 .by <price_Death_s_Head___
292 5CA6 7D .by <price_Napalm_________
293 5CA7 A2 .by <price_Hot_Napalm_____
294 5CA8 66 .by <price_Tracer_________
295 5CA9 23 .by <price_Smoke_Tracer___
296 5CAA D3 .by <price_Baby_Roller____
297 5CAB F4 .by <price_Roller_________
298 5CAC 46 .by <price_Heavy_Roller___
299 5CAD E6 .by <price_Riot_Charge____
300 5CAE F1 .by <price_Riot_Blast_____
301 5CAF 03 .by <price_Riot_Bomb______
302 5CB0 10 .by <price_Heavy_Riot_Bomb
303 5CB1 88 .by <price_Baby_Digger____
304 5CB2 B0 .by <price_Digger_________
305 5CB3 CF .by <price_Heavy_Digger___
306 5CB4 9E .by <price_Baby_Sandhog___
307 5CB5 BF .by <price_Sandhog________
308 5CB6 DF .by <price_Heavy_Sandhog__
309 5CB7 68 .by <price_Dirt_Clod______
310 5CB8 82 .by <price_Dirt_Ball______
311 5CB9 AB .by <price_Ton_of_Dirt____
312 5CBA 4A .by <price_Liquid_Dirt____
313 5CBB 57 .by <price_Dirt_Charge____
314 5CBC AA .by <price_Buy_me_________
315 5CBD 15 .by <price_Laser__________
316 5CBE 00 .by <price_White_Flag_____
317 5CBF 2C .by <price_Battery________
318 5CC0 60 .by <price_Hovercraft_____
319 5CC1 EA .by <price_Parachute______
320 5CC2 E8 .by <price_StrongParachute
321 5CC3 E9 .by <price_Mag_Deflector__
322 5CC4 E0 .by <price_Shield_________
323 5CC5 74 .by <price_Heavy_Shield___
324 5CC6 4C .by <price_Force_Shield___
325 5CC7 00 .by <price_Bouncy_Castle__
326 5CC8 34 .by <price_Long_Barrel____
327 5CC9 E8 .by <price_Nuclear_Winter_
328 5CCA F4 .by <price_Lazy_Boy_______
329 5CCB DA .by <price_Lazy_Darwin____
330 5CCC FA .by <price_Auto_Defense___
331 5CCD 53 .by <price_Spy_Hard_______
332
333 ;-------------------------------------------------
334 ; how many units (bulletd) of a given weapon we get for a given price
335 ; This is a table of constans.
336 ; If on a given position is 0 it means that this weapon
337 ; is not present in the game.
338 ; This is the slot for adding new weapons.
339 5CCE WeaponUnits
340 5CCE 0A .by 10 ;Baby_Missile___;_00
341 5CCF 05 .by 5 ;Missile________;_01
342 5CD0 02 .by 2 ;Baby_Nuke______;_02
343 5CD1 01 .by 1 ;Nuke___________;_03
344 5CD2 02 .by 2 ;LeapFrog_______;_04
345 5CD3 03 .by 3 ;Funky_Bomb_____;_05
346 5CD4 02 .by 2 ;MIRV___________;_06
347 5CD5 01 .by 1 ;Death_s_Head___;_07
348 5CD6 04 .by 4 ;Napalm_________;_08
349 5CD7 02 .by 2 ;Hot_Napalm_____;_09
350 5CD8 14 .by 20 ;Tracer_________;_10
351 5CD9 0A .by 10 ;Smoke_Tracer___;_11
352 5CDA 05 .by 5 ;Baby_Roller____;_12
353 5CDB 03 .by 3 ;Roller_________;_13
354 5CDC 02 .by 2 ;Heavy_Roller___;_14
355 5CDD 05 .by 5 ;Riot_Charge____;_15
356 5CDE 02 .by 2 ;Riot_Blast_____;_16
357 5CDF 05 .by 5 ;Riot_Bomb______;_17
358 5CE0 02 .by 2 ;Heavy_Riot_Bomb;_18
359 5CE1 0A .by 10 ;Baby_Digger____;_19
360 5CE2 05 .by 5 ;Digger_________;_20
361 5CE3 02 .by 2 ;Heavy_Digger___;_21
362 5CE4 0A .by 10 ;Baby_Sandhog___;_22
363 5CE5 05 .by 5 ;Sandhog________;_23
364 5CE6 02 .by 2 ;Heavy_Sandhog__;_24
365 5CE7 05 .by 5 ;Dirt_Clod______;_25
366 5CE8 03 .by 3 ;Dirt_Ball______;_26
367 5CE9 01 .by 1 ;Ton_of_Dirt____;_27
368 5CEA 04 .by 4 ;Liquid_Dirt____;_28
369 5CEB 02 .by 2 ;Dirt_Charge____;_29
370 5CEC 01 .by 1 ;Buy_me_________;_30
371 5CED 05 .by 5 ;Laser__________;_31
372 5CEE 01 .by 1 ;White_Flag_____;_32
373 5CEF 03 .by 3 ;Battery________;_33
374 5CF0 02 .by 2 ;Floating_Tank__;_34
375 5CF1 03 .by 3 ;Parachute______;_35
376 5CF2 02 .by 2 ;StrongParachute;_36
377 5CF3 02 .by 2 ;Mag_Deflector__;_37
378 5CF4 03 .by 3 ;Shield_________;_38
379 5CF5 02 .by 2 ;Heavy_Shield___;_39
380 5CF6 03 .by 3 ;Force_Shield___;_40
381 5CF7 01 .by 1 ;Auto_Defense___;_41
382 5CF8 02 .by 2 ;Long_Barrel____;_42
383 5CF9 01 .by 1 ;Nuclear_Winter_;_43
384 5CFA 02 .by 2 ;Lazy_Boy_______;_44
385 5CFB 02 .by 2 ;Lazy_Darwin____;_45
386 5CFC 02 .by 2 ;Auto_Defense___;_46
387 5CFD 04 .by 4 ;Spy_Hard_______;_47
388
389 5CFE PurchaseMeTable ;weapons good to be purchased by the robot
390 ;the comment is an index in the tables
391 ; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
392 ; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
393 5CFE 7F .by %01111111
394 ; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
395 ; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
396 5CFF CE .by %11001110
397 ; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
398 ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
399 5D00 00 .by %00000000
400 ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
401 ; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser "
402 5D01 00 .by %00000000
403 ; "White Flag ","Battery ","Hovercraft ","Parachute "
404 ; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
405 5D02 5F .by %01011111
406 ; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
407 ; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
408 5D03 C0 .by %11000000
409
410 5D04 PurchaseMeTable2 ;weapons good to be purchased by the robot (Cyborg)
411 ;the comment is an index in the tables
412 ; "Baby Missile ","Missile ","Baby Nuke ","Nuke "
413 ; "LeapFrog ","Funky Bomb ","MIRV ","Death's Head "
414 5D04 70 .by %01110000
415 ; "Napalm ","Hot Napalm ","Tracer ","Smoke Tracer "
416 ; "Baby Roller ","Roller ","Heavy Roller ","Riot Charge "
417 5D05 40 .by %01000000
418 ; "Riot Blast ","Riot Bomb ","Heavy Riot Bomb ","Baby Digger "
419 ; "Digger ","Heavy Digger ","Baby Sandhog ","Sandhog "
420 5D06 00 .by %00000000
421 ; "Heavy Sandhog ","Dirt Clod ","Dirt Ball ","Ton of Dirt "
422 ; "Liquid Dirt ","Dirt Charge ","Buy me! ","Laser "
423 5D07 00 .by %00000000
424 ; "White Flag ","Battery ","Hovercraft ","Parachute "
425 ; "Strong Parachute","Mag Deflector ","Shield ","Heavy Shield "
426 5D08 4D .by %01001101
427 ; "Force Shield ","Bouncy Castle ","Long Barrel ","Nuclear Winter "
428 ; "Lazy Boy ","Lazy Darwin ","Auto Defense ","Spy Hard "
429 5D09 C0 .by %11000000
430
431 ;-------------------------------------------------
432 ; Screen codes of icons (chars) representing a given weapon
433 5D0A WeaponSymbols
434 5D0A 40 .by $40 ;ind_Baby_Missile___ ;_00
435 5D0B 41 .by $41 ;ind_Missile________ ;_01
436 5D0C 42 .by $42 ;ind_Baby_Nuke______ ;_02
437 5D0D 43 .by $43 ;ind_Nuke___________ ;_03
438 5D0E 44 .by $44 ;ind_LeapFrog_______ ;_04
439 5D0F 45 .by $45 ;ind_Funky_Bomb_____ ;_05
440 5D10 46 .by $46 ;ind_MIRV___________ ;_06
441 5D11 47 .by $47 ;ind_Death_s_Head___ ;_07
442 5D12 48 .by $48 ;ind_Napalm_________ ;_08
443 5D13 49 .by $49 ;ind_Hot_Napalm_____ ;_09
444 5D14 4A .by $4a ;ind_Tracer_________ ;_10
445 5D15 4B .by $4b ;ind_Smoke_Tracer___ ;_11
446 5D16 4C .by $4c ;ind_Baby_Roller____ ;_12
447 5D17 4D .by $4d ;ind_Roller_________ ;_13
448 5D18 4E .by $4e ;ind_Heavy_Roller___ ;_14
449 5D19 4F .by $4f ;ind_Riot_Charge____ ;_15
450 5D1A 50 .by $50 ;ind_Riot_Blast_____ ;_16
451 5D1B 51 .by $51 ;ind_Riot_Bomb______ ;_17
452 5D1C 52 .by $52 ;ind_Heavy_Riot_Bomb ;_18
453 5D1D 53 .by $53 ;ind_Baby_Digger____ ;_19
454 5D1E 54 .by $54 ;ind_Digger_________ ;_20
455 5D1F 55 .by $55 ;ind_Heavy_Digger___ ;_21
456 5D20 56 .by $56 ;ind_Baby_Sandhog___ ;_22
457 5D21 57 .by $57 ;ind_Sandhog________ ;_23
458 5D22 58 .by $58 ;ind_Heavy_Sandhog__ ;_24
459 5D23 59 .by $59 ;ind_Dirt_Clod______ ;_25
460 5D24 5A .by $5a ;ind_Dirt_Ball______ ;_26
461 5D25 5B .by $5b ;ind_Ton_of_Dirt____ ;_27
462 5D26 60 .by $60 ;ind_Liquid_Dirt____ ;_28
463 5D27 7B .by $7b ;ind_Dirt_Charge____ ;_29
464 5D28 1F .by $1f ;ind_Buy_me_________ ;_30
465 5D29 20 .by $20 ;ind_Laser__________ ;_31
466 5D2A 5F .by $5f ;ind_White_Flag_____ ;_32
467 5D2B 1C .by $1c ;ind_Battery________ ;_33
468 5D2C 06 .by $06 ;ind_Floating_Tank__ ;_34
469 5D2D 1B .by $1b ;ind_Parachute______ ;_35
470 5D2E 1B .by $1b ;ind_StrongParachute ;_36
471 5D2F 1E .by $1e ;ind_Mag_Deflector__ ;_37
472 5D30 3B .by $3b ;ind_Shield_________ ;_38
473 5D31 3D .by $3d ;ind_Heavy_Shield___ ;_39
474 5D32 3C .by $3c ;ind_Force_Shield___ ;_40
475 5D33 3F .by $3f ;ind_Bouncy_Castle__ ;_41
476 5D34 1D .by $1d ;ind_Long_Barrel____ ;_42
477 5D35 7D .by $7d ;ind_Nuclear_Winter_ ;_43
478 5D36 02 .by $02 ;ind_Lazy_Boy_______ ;_44
479 5D37 03 .by $03 ;ind_Lazy_Darwin____ ;_45
480 5D38 5E .by $5e ;ind_Auto_Defense___ ;_46
481 5D39 7C .by $7c ;ind_Spy_Hard_______ ;_47
482
483 ; Names of weapons (16 chars long)
484 5D3A NamesOfWeapons ;the comment is an index in the tables
485 5D3A 22 61 62 79 00 2D + dta d"Baby Missile " ; 0
486 5D4A 2D 69 73 73 69 6C + dta d"Missile " ; 1
487 5D5A 22 61 62 79 00 2E + dta d"Baby Nuke " ; 2
488 5D6A 2E 75 6B 65 00 00 + dta d"Nuke " ; 3
489 5D7A 2C 65 61 70 26 72 + dta d"LeapFrog " ; 4
490 5D8A 26 75 6E 6B 79 00 + dta d"Funky Bomb " ; 5
491 5D9A 2D 29 32 36 00 00 + dta d"MIRV " ; 6
492 5DAA 24 65 61 74 68 07 + dta d"Death's Head " ; 7
493 5DBA 2E 61 70 61 6C 6D + dta d"Napalm " ; 8
494 5DCA 28 6F 74 00 2E 61 + dta d"Hot Napalm " ; 9
495 5DDA 34 72 61 63 65 72 + dta d"Tracer " ; 10
496 5DEA 33 6D 6F 6B 65 00 + dta d"Smoke Tracer " ; 11
497 5DFA 22 61 62 79 00 32 + dta d"Baby Roller " ; 12
498 5E0A 32 6F 6C 6C 65 72 + dta d"Roller " ; 13
499 5E1A 28 65 61 76 79 00 + dta d"Heavy Roller " ; 14
500 5E2A 32 69 6F 74 00 23 + dta d"Riot Charge " ; 15
501 5E3A 32 69 6F 74 00 22 + dta d"Riot Blast " ; 16
502 5E4A 32 69 6F 74 00 22 + dta d"Riot Bomb " ; 17
503 5E5A 28 65 61 76 79 00 + dta d"Heavy Riot Bomb " ; 18
504 5E6A 22 61 62 79 00 24 + dta d"Baby Digger " ; 19
505 5E7A 24 69 67 67 65 72 + dta d"Digger " ; 20
506 5E8A 28 65 61 76 79 00 + dta d"Heavy Digger " ; 21
507 5E9A 22 61 62 79 00 33 + dta d"Baby Sandhog " ; 22
508 5EAA 33 61 6E 64 68 6F + dta d"Sandhog " ; 23
509 5EBA 28 65 61 76 79 00 + dta d"Heavy Sandhog " ; 24
510 5ECA 24 69 72 74 00 23 + dta d"Dirt Clod " ; 25
511 5EDA 24 69 72 74 00 22 + dta d"Dirt Ball " ; 26
512 5EEA 34 6F 6E 00 6F 66 + dta d"Ton of Dirt " ; 27
513 5EFA 2C 69 71 75 69 64 + dta d"Liquid Dirt " ; 28
514 5F0A 24 69 72 74 00 23 + dta d"Dirt Charge " ; 29
515 5F1A 22 65 73 74 00 26 + dta d"Best F...g Gifts" ; 30
516 5F2A 2C 61 73 65 72 00 + dta d"Laser " ; 31
517 ;------defensives
518 5F3A 37 68 69 74 65 00 + dta d"White Flag " ; 32
519 5F4A 22 61 74 74 65 72 + dta d"Battery " ; 33
520 5F5A 28 6F 76 65 72 63 + dta d"Hovercraft " ; 34
521 5F6A 30 61 72 61 63 68 + dta d"Parachute " ; 35 - no energy
522 5F7A 33 74 72 6F 6E 67 + dta d"Strong Parachute" ; 36 - with energy (earlier Battery)
523 5F8A 2D 61 67 00 24 65 + dta d"Mag Deflector " ; 37 - with shield and energy
524 5F9A 33 68 69 65 6C 64 + dta d"Shield " ; 38 - shield for one shot - no energy
525 5FAA 28 65 61 76 79 00 + dta d"Heavy Shield " ; 39 - shield with energy
526 5FBA 26 6F 72 63 65 00 + dta d"Force Shield " ; 40 - shield with energy and parachute
527 5FCA 22 6F 75 6E 63 79 + dta d"Bouncy Castle " ; 41 - with shield and energy
528 5FDA 2C 6F 6E 67 00 33 + dta d"Long Schlong " ; 42
529 5FEA 2E 75 63 6C 65 61 + dta d"Nuclear Winter " ; 43
530 5FFA 2C 61 7A 79 00 22 + dta d"Lazy Boy " ; 44
531 600A 2C 61 7A 79 00 24 + dta d"Lazy Darwin " ; 45
532 601A 21 75 74 6F 00 24 + dta d"Auto Defense " ; 46
533 602A 33 70 79 00 28 61 + dta d"Spy Hard " ; 47
534
535 = 601A DefensiveEnergy = *-(last_offensive_____ - first_offensive____ +1) ; to fake the table for ALL weapons
536 603A 00 .by 00 ; White Flag
537 603B 00 .by 00 ; Heat Guidance
538 603C 62 .by 98 ; Let's go!
539 603D 00 .by 00 ; Parachute
540 603E 63 .by 99 ; Strong Parachute
541 603F 63 .by 99 ; Mag Deflector
542 6040 00 .by 00 ; Shield
543 6041 63 .by 99 ; Heavy Shield
544 6042 63 .by 99 ; Force Shield
545 6043 63 .by 99 ; Bouncy Castle
546 6044 00 .by 00 ; Long Barrel
547 6045 00 .by 00 ; Nuclear Winter
548 6046 00 .by 00 ; Lazy Boy
549 6047 00 .by 00 ; Lazy Darwin
550 6048 00 .by 00 ; Auto Defense
551 6049 00 .by 00 ; Spy Hard
552 604A weaponsOfDeath ; weapons used in tank death animations
553 604A 01 dta ind_Missile________
554 604B 02 dta ind_Baby_Nuke______
555 604C 03 dta ind_Nuke___________
556 604D 07 dta ind_Death_s_Head___
557 604E 09 dta ind_Hot_Napalm_____ ; why not?
558 604F 11 dta ind_Riot_Bomb______
559 6050 12 dta ind_Heavy_Riot_Bomb
560 6051 13 dta ind_Baby_Digger____
561 6052 14 dta ind_Digger_________
562 6053 15 dta ind_Heavy_Digger___
563 6054 16 dta ind_Baby_Sandhog___
564 6055 17 dta ind_Sandhog________
565 6056 18 dta ind_Heavy_Sandhog__
566 6057 19 dta ind_Dirt_Clod______
567 6058 1A dta ind_Dirt_Ball______
568 6059 1B dta ind_Ton_of_Dirt____
569 605A weaponsOfDeathEnd
570 605A joyToKeyTable
571 605A FF .by $ff ;00
572 605B FF .by $ff ;01
573 605C FF .by $ff ;02
574 605D FF .by $ff ;03
575 605E FF .by $ff ;04
576 605F FF .by $ff ;05
577 6060 FF .by $ff ;06
578 6061 07 .by @kbcode._right ;07
579 6062 FF .by $ff ;08
580 6063 FF .by $ff ;09
581 6064 FF .by $ff ;0a
582 6065 06 .by @kbcode._left ;0b
583 6066 FF .by $ff ;0c
584 6067 0F .by @kbcode._down ;0d
585 6068 0E .by @kbcode._up ;0e
586 6069 FF .by $ff ;0f
587
588 ;-----------------------------------
589 606A keycodes ;tables for converting KeyCode to Screen Code (38 -1 characters)
590 606A 3F 15 12 3A 2A 38 + .by $3f,$15,$12,$3a,$2a,$38,$3d,$39
591 6072 0D 01 05 00 25 23 + .by $0d,$01,$05,$00,$25,$23,$08,$0a
592 607A 2F 28 3E 2D 0B 10 + .by $2f,$28,$3e,$2d,$0b,$10,$2e,$16
593 6082 2B 17 .by $2b,$17
594 6084 32 1F 1E 1A 18 1D + .by $32,$1f,$1e,$1a,$18,$1d,$1b
595 608B 33 35 30 22 21 .by $33,$35,$30,$22,$21 ;,$0e <-- hyphen removed from the table, sorry hyphen lovers
596 6090 keycodesEnd
597 6090 scrcodes
598 6090 61 62 63 64 65 66 + dta d"abcdefgh"
599 6098 69 6A 6B 6C 6D 6E + dta d"ijklmnop"
600 60A0 71 72 73 74 75 76 + dta d"qrstuvwx"
601 60A8 79 7A dta d"yz"
602 60AA zero
603 60AA digits ; decimal constans
604 60AA 10 11 12 13 14 15 + dta d"0123456"
605 60B1 17 18 19 0E 00 dta d"789. " ; "-"
606 ;-------decimal constans
607 ;zero
608 ;digits dta d"0123456789"
609
610 ;-----------------------------------
611 60B6 gameOverSpritesTop
612 ; end of the Gover sprites by number of players
613 ; 1 2 3 4 5 6
614 60B6 89 89 8F 95 9B A1 .by 130+7,130+7,136+7,142+7,148+7,154+7
615 ;------credits
616 60BC CreditsStart
617 60BC 80 80 80 80 80 80 + dta d" "*
618 60C5 39 6F 75 00 77 65 + dta d"You were playin",d"g"*
619 60D5 33 63 6F 72 63 E8 dta d"Scorc",d"h"*
620 60DB 37 61 72 73 61 77 + dta d"Warsaw, Miam",d"i"*
621 60E8 12 10 10 10 0D 12 + dta d"2000-202",d"3"*
622 60F1 80 dta d" "*
623 60F2 30 72 6F 67 72 61 + dta d"Programmin",d"g"*
624 60FD 34 6F 6D 61 73 7A + dta d"Tomasz 'Pecus' Peck",d"o"*
625 6111 30 61 77 65 6C 00 + dta d"Pawel 'pirx' Kalinowsk",d"i"*
626 6128 80 dta d" "*
627 6129 33 26 38 0C 00 2D + dta d"SFX, Music and Suppor",d"t"*
628 613F 2D 69 63 68 61 6C + dta d"Michal 'Miker' Szpilowsk",d"i"*
629 6158 80 dta d" "*
630 .IF target != 5200
631 6159 21 64 64 69 74 69 + dta d"Additional Musi",d"c"*
632 6169 2D 61 72 69 6F 00 + dta d"Mario 'Emkay' Kri",d"x"*
633 617B 80 dta d" "*
634 .ENDIF
635 617C 23 6F 64 65 00 2F + dta d"Code Optimizatio",d"n"*
636 618D 30 69 6F 74 72 00 + dta d"Piotr '0xF' Fusi",d"k"*
637 619E 80 dta d" "*
638 619F 21 72 F4 dta d"Ar",d"t"*
639 61A2 21 64 61 6D 00 37 + dta d"Adam Wachowsk",d"i"*
640 .IF target != 5200
641 61B0 32 6F 6D 61 6E 00 + dta d"Roman 'xorcerer' Fierfa",d"s"*
642 .ENDIF
643 61C8 80 dta d" "*
644 61C9 29 64 65 61 73 0C + dta d"Ideas, help and Q",d"A"*
645 61DB 22 6F 63 69 61 6E + dta d"Bocianu, Probabilitydragon",d","*
646 61F6 25 6E 64 65 72 24 + dta d"EnderDude, Dracon",d","*
647 6208 22 65 65 62 6C 65 + dta d"Beeblebrox, KrzysRog, lopezpb",d","*
648 6226 62 72 61 64 0D 63 + dta d"brad-colbert, archon800, nowy80",d","*
649 6246 33 68 61 67 67 79 + dta d"Shaggy the Atarian, RetroBorsuk, ZPH"
650 .IF target = 5200
651 dta d","*
652 dta d"x-usr(1536), Aking, JAC!, phaeron",d","*
653 dta d"RB520",d"0"*
654 .ELSE
655 626A 80 dta d" "*
656 .ENDIF
657 626B 80 dta d" "*
658 626C 21 64 64 69 74 69 + dta d"Additional testin",d"g"*
659 627E 21 72 65 6B 00 61 + dta d"Arek and Alex Peck",d"o"*
660 6291 80 dta d" "*
661 6292 33 70 65 63 69 61 + dta d"Special thank",d"s"*
662 62A0 2B 72 7A 79 73 7A + dta d"Krzysztof 'Kaz' Ziembi",d"k"*
663 .IF target != 5200
664 62B7 80 80 dta d" "*
665 62B9 33 74 61 79 00 74 + dta d"Stay tuned for the FujiNet version",d"!"*
666 .ENDIF
667 62DC 80 80 80 80 80 80 + dta d" "*
668 62E5 CreditsEnd
669 .IF target = 5200
670 CreditsLines=34 + 7; add 7 for scrollout
671 .ELSE
672 = 002F CreditsLines=40 + 7 ; add 7 for scrollout
673 .ENDIF
674 .IF target = 5200
675 ; Atari 5200 splash
676 NewSplashText=*
677 dta d"copyright 2023 atari"
678 .ENDIF
679 .endif
345 ;----------------------------------------------
346 62E5 icl 'C64/textproc.asm'
Source: textproc.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3
4 .IF *>0
5
6 = 0000 WeaponsListDL = 0
7 = 0000 NamesOfLevels = 0
8 ;----------------------------------------
9 ; this module contains routines used in text mode
10 ; like shop and start-up options
11 ;----------------------------------------
12
13 ;--------------------------------------------------
14 62E5 .proc Options
15 ;--------------------------------------------------
16 ; start-up screen - options, etc.
17 ; this function returns:
18 ; - number of players (NumberOfPlayers)
19 ; - money each player has on the beginning of the game (moneyL i moneyH)
20 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight
21
22
23 62E5 A2 08 ldx #$08
24 62E7 BD F1 62 @ lda Autoplay_OptionsTable,x
25 62EA 9D 3F 41 sta OptionsTable,x
26 62ED CA dex
27 62EE 10 F7 bpl @-
28
29 62F0 60 rts
30
31 62F1 04 04 02 02 04 01 + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4
32
33 .endp
34
35 62FA .proc SelectNextGradient
36 62FA AD 75 43 lda OptionsY ; if "Wind" option selected
37 62FD C9 03 cmp #$03
38 62FF D0 07 bne NotWind
39 6301 A5 5C lda WindChangeInRound ; wind change after each turn (not round only) flag
40 6303 49 1F eor #$1f ; '?' character
41 6305 85 5C sta WindChangeInRound
42 6307 60 rts
43 6308 NotWind
44 6308 A4 59 ldy GradientNr
45 630A C8 iny
46 630B C0 03 cpy #$03
47 630D D0 02 bne NoGradientLoop
48 630F A0 00 ldy #$00
49 6311 NoGradientLoop
50 6311 84 59 sty GradientNr
51 6313 B9 85 5B lda GradientAddrL,y
52 6316 85 5A sta GradientColors
53 6318 B9 88 5B lda GradientAddrH,y
54 631B 85 5B sta GradientColors+1
55 631D 60 rts
56 .endp
57
58 ; --------------------------------------
59 ; Sets the appropriate variables based on the options table
60 ;
61 631E .proc SetVariablesFromOptions
62 ;first option
63 631E AC 3F 41 ldy OptionsTable
64 6321 C8 iny
65 6322 C8 iny
66 6323 84 AE sty NumberOfPlayers ;1=1 player (but minimum is 2)
67
68 ;second option (cash)
69
70
71 6325 AC 40 41 ldy OptionsTable+1
72 6328 A2 00 ldx #0
73 @
74 632A B9 D1 A2 lda CashOptionL,y
75 632D 9D 84 43 sta moneyL,x
76 6330 B9 D6 A2 lda CashOptionH,y
77 6333 9D 7E 43 sta moneyH,x
78 6336 E8 inx
79 6337 E4 AE cpx NumberOfPlayers
80 6339 D0 EF bne @-
81
82 ;third option (gravity)
83 633B AC 41 41 ldy OptionsTable+2
84 633E B9 DB A2 lda GravityTable,y
85 6341 85 E0 sta gravity
86
87 ;fourth option (wind)
88 6343 AC 42 41 ldy OptionsTable+3
89 6346 B9 E0 A2 lda MaxWindTable,y
90 6349 8D 0A 44 sta MaxWind
91
92 ;fifth option (no of rounds)
93 634C AC 43 41 ldy OptionsTable+4
94 634F B9 E5 A2 lda RoundsTable,y
95 6352 8D 48 41 sta RoundsInTheGame
96
97 ;6th option (shell speed)
98 6355 AC 44 41 ldy OptionsTable+5
99 6358 B9 F4 A2 lda flyDelayTable,y
100 635B 8D 76 43 sta flyDelay
101
102 ;7th option (Airstrike after how many missess)
103 635E AC 45 41 ldy OptionsTable+6
104 6361 B9 F9 A2 lda seppukuTable,y
105 6364 8D 49 41 sta seppukuVal
106
107 ;8th option (how aggressive are mountains)
108 6367 AC 46 41 ldy OptionsTable+7
109 636A B9 D5 5A lda mountainsDeltaTableH,y
110 636D 8D 4A 41 sta mountainDeltaH
111 6370 B9 DA 5A lda mountainsDeltaTableL,y
112 6373 8D 4B 41 sta mountainDeltaL
113
114
115 6376 60 rts
116 .endp
117
118 ;-------------------------------------------
119 ; call of the purchase (and activate) screens for each tank
120 6377 .proc CallPurchaseForEveryTank
121
122 6377 A9 00 85 6C mva #0 TankNr
123 637B 85 E4 sta isInventory
124 @
125 637D A6 6C ldx TankNr
126 637F BD 39 41 lda SkillTable,x
127 6382 F0 06 beq ManualPurchase
128 6384 20 A3 94 jsr PurchaseAI ; remember to make ActivateAI :) !!!
129 6387 4C A3 63 jmp AfterManualPurchase
130 638A ManualPurchase
131 638A BD 25 44 lda JoyNumber,x
132 638D 85 5D sta JoystickNumber ; set joystick port for player
133 638F A9 00 85 E4 mva #0 isInventory
134 6393 20 C0 63 jsr Purchase ; purchase weapons
135 6396 24 D7 bit escFlag
136 6398 10 01 60 spl:rts
137 639B 20 AC 63 jsr DefensivesActivate ; activate weapons
138 639E 24 D7 bit escFlag
139 63A0 10 01 60 spl:rts
140 63A3 AfterManualPurchase
141 63A3 E6 6C A5 6C inc:lda TankNr
142 63A7 C5 AE cmp NumberOfPlayers
143 63A9 D0 D2 bne @-
144 63AB 60 rts
145 .endp
146 ;--------------------------------------------------
147 63AC .proc DefensivesActivate
148 ;--------------------------------------------------
149 ; This proc call Inventory and set Defensives activation first
150
151 63AC A9 ED 85 00 A9 4C + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons
152 63B4 A9 FF 85 E4 mva #$ff IsInventory
153 63B8 A9 80 8D 0D 45 mva #%10000000 WhichList
154 ; offensive weapon - 0, defensive - %10000000
155 63BD 4C C5 63 jmp Purchase.GoToActivation
156 .endp
157
158
159 ;--------------------------------------------------
160 63C0 .proc Purchase ;
161 ;--------------------------------------------------
162 ; In tanknr there is a number of the tank (player)
163 ; that is buying weapons now (from 0).
164 ; Rest of the data is taken from appropriate tables
165 ; and during the purchase these tables are modified.
166
167
168 ; we are clearing list of the weapons
169 63C0 A9 00 8D 0D 45 mva #$00 WhichList
170 ; offensive weapon - 0, deffensive - %10000000
171 63C5 GoToActivation
172 63C5 60 rts
173
174 .endp
175
176 ; -----------------------------------------------------
177 63C6 .proc EnterPlayerNames
178 ;entering names of players
179
180 63C6 A9 00 85 6C mva #0 TankNr
181 63CA 85 02 sta COLBAKS ; set color of background
182 63CC AA @ tax
183 63CD BD 7F 5B lda TankStatusColoursTable,x
184 63D0 85 02 sta COLOR2 ; set color of player name line
185 63D2 20 E6 63 jsr EnterPlayerName
186 63D5 24 D7 bit escFlag
187 63D7 10 01 60 spl:rts
188 63DA 20 46 A2 jsr CheckTankCheat
189 63DD E6 6C inc TankNr
190 63DF A5 6C lda TankNr
191 63E1 C5 AE cmp NumberOfPlayers
192 63E3 D0 E7 bne @-
193 63E5 60 rts
194 .endp
195 ; -----------------------------------------------------
196 63E6 .proc EnterPlayerName
197 ; in: TankNr
198 ; Out: TanksNames, SkillTable
199
200 ; this little thing is for choosing Player's skill (if computer)
201 ; and entering his name
202 ; If no name entered, there should be name "1st Tank", etc.
203 ; Default tanks names are in table TanksNamesDefault
204 ; -----------------------------------------------------
205
206 ;
207
208 63E6 EndOfNick
209 ; storing name of the player and its level
210
211 ; level of the computer opponent goes to
212 ; the table of levels (difficulties)
213 63E6 A6 6C ldx tanknr
214 63E8 A9 06 lda #6 ; Spoiler
215 63EA 85 E5 sta DifficultyLevel
216 63EC 9D 39 41 sta skilltable,x
217 63EF F0 05 beq NotRobot
218 63F1 A9 03 lda #$03 ; shape for robotanks
219 63F3 9D 2B 44 sta TankShape,x
220 63F6 NotRobot
221 ; storing name of the tank in the right space
222 ; (without cursor!)
223 63F6 A0 00 ldy #$00
224 63F8 8A txa ; ldx TankNr
225 63F9 0A asl
226 63FA 0A asl
227 63FB 0A asl ; 8 chars per name
228 63FC AA tax ; in X where to put new name
229
230 63FD A9 16 85 9E mva #sfx_next_player sfx_effect
231
232
233 ; check if all chars are empty (" ")
234 6401 A0 07 ldy #7
235 6403 A9 00 lda #0
236 6405 09 00 @ ora #0 ; NameAdr,y
237 6407 29 7F and #$7F ; remove inverse (Cursor)
238 6409 88 dey
239 640A 10 F9 bpl @-
240 640C A8 tay
241 640D F0 10 beq MakeDefaultName
242
243 640F A0 00 ldy #0
244 6411 nextchar04
245 6411 A9 00 lda #0 ; NameAdr,y
246 6413 29 7F and #$7f ; remove inverse (Cursor)
247 6415 9D 09 41 sta tanksnames,x
248 6418 E8 inx
249 6419 C8 iny
250 641A C0 08 cpy #$08
251 641C D0 F3 bne nextchar04
252 641E 60 rts
253 641F MakeDefaultName
254 641F nextchar05
255 641F BD 3A 5C lda tanksnamesDefault,x
256 6422 9D 09 41 sta tanksnames,x
257 6425 E8 inx
258 6426 C8 iny
259 6427 C0 08 cpy #$08
260 6429 D0 F4 bne nextchar05
261 642B 60 rts
262 .endp
263 ;--------------------------------------------------
264 642C .proc displaydec5 ;decimal (word), displayposition (word)
265 ;--------------------------------------------------
266 ; displays decimal number as in parameters (in text mode)
267 ; leading zeroes are removed
268 ; the range is (00000..65565 - two bytes)
269
270 642C A0 04 ldy #4 ; there will be 5 digits
271 642E NextDigit
272 642E A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times
273 6430 A9 00 lda #$00
274 6432 Rotate000
275 6432 aslw decimal
Macro: ASLW [Source: MACRO.ASM]
1 6432 06 AC ASL DECIMAL
2 6434 26 AD ROL DECIMAL+1
Source: textproc.asm
276 6436 2A rol ; scroll dividee
277 ; (as highest byte - additional - byte is A)
278 6437 C9 0A cmp #10 ; divider
279 6439 90 04 bcc TooLittle000 ; if A is smaller than divider
280 ; there is nothing to substract
281 643B E9 0A sbc #10 ; divider
282 643D E6 AC inc decimal ; lowest bit set to 1
283 ; because it is 0 and this is the fastest way
284 643F CA TooLittle000 dex
285 6440 D0 F0 bne Rotate000 ; and Rotate 16 times, Result will be in decimal
286 6442 AA tax ; and the rest in A
287 ; (and it goes to X because
288 ; it is our decimal digit)
289 6443 BD AA 60 lda digits,x
290 6446 99 0F 45 sta decimalresult,y
291 6449 88 dey
292 644A 10 E2 bpl NextDigit ; Result again /10 and we have next digit
293
294 ;rightnumber
295 ; displaying without leading zeroes (if zeroes exist then display space at this position)
296 644C A0 00 ldy #0
297 644E A2 00 ldx #0 ; digit flag (cut leading zeroes)
298 6450 displayloop
299 6450 B9 0F 45 lda decimalresult,y
300 6453 E0 00 cpx #0
301 6455 D0 0D bne noleading0
302 6457 C0 04 cpy #4
303 6459 F0 09 beq noleading0 ; if 00000 - last 0 must stay
304 645B CD AA 60 cmp zero
305 645E D0 04 bne noleading0
306 6460 A9 00 lda #space
307 6462 F0 01 beq displaychar ; space = 0 !
308 6464 noleading0
309 6464 E8 inx ; set flag (no leading zeroes to cut)
310 6465 displaychar
311 6465 91 76 sta (displayposition),y
312 6467 nexdigit
313 6467 C8 iny
314 6468 C0 05 cpy #5
315 646A D0 E4 bne displayloop
316
317 646C 60 rts
318 .endp
319 ;--------------------------------------------------
320 646D .proc displaybyte ;decimal (byte), displayposition (word)
321 ;--------------------------------------------------
322 ; displays decimal number as in parameters (in text mode)
323 ; leading zeores are removed
324 ; the range is (00..99 - one byte)
325
326 646D A0 01 ldy #1 ; there will be 2 digits
327 646F NextDigit2
328 646F A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times
329 6471 A9 00 lda #$00
330 6473 Rotate001
331 6473 06 AC asl decimal
332 6475 2A rol ; scroll dividee
333 ; (as highest byte - additional - byte is A)
334 6476 C9 0A cmp #10 ; divider
335 6478 90 04 bcc TooLittle001 ; if A is smaller than divider
336 ; there is nothing to substract
337 647A E9 0A sbc #10 ; divider
338 647C E6 AC inc decimal ; because it is 0 and this is the fastest way
339 647E CA TooLittle001 dex
340 647F D0 F2 bne Rotate001 ; and Rotate 8 times, Result will be in decimal
341 6481 AA tax ; and the rest in A
342 ; (and it goes to X because
343 ; it is our decimal digit)
344 6482 BD AA 60 lda digits,x
345 6485 99 0F 45 sta decimalresult,y
346 6488 88 dey
347 6489 10 E4 bpl NextDigit2 ; Result again /10 and we have next digit
348
349 ; now cut leading zeroes (02 goes 2)
350 648B AD 0F 45 lda decimalresult
351 648E CD AA 60 cmp zero
352 6491 D0 05 bne decimalend1
353 6493 A9 00 lda #space
354 6495 8D 0F 45 sta decimalresult
355
356 6498 decimalend1
357 ; displaying
358 6498 A0 01 ldy #1
359 649A displayloop1
360 649A B9 0F 45 lda decimalresult,y
361 649D 91 76 sta (displayposition),y
362 649F 88 dey
363 64A0 10 F8 bpl displayloop1
364
365 64A2 60 rts
366 .endp
367
368 ;--------------------------------
369 64A3 .proc DisplayResults ;
370 ;displays results of the round
371 ;using 4x4 font
372
373
374 64A3 A9 FF 85 DB mva #$ff plot4x4color
375
376 ;centering the result screen
377 64A7 A9 44 85 B2 mva #((ScreenHeight/2)-(8*4)) ResultY
378
379
380 ;upper frame
381 64AB A5 B2 85 D8 mva ResultY LineYdraw
382 64AF 20 E8 65 jsr TL4x4_top
383
384 64B2 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
385
386 ;Header1
387 ;Displays round number
388 64B9 AD 14 45 lda CurrentRoundNr
389 64BC CD 48 41 cmp RoundsInTheGame
390 64BF F0 26 beq GameOver4x4
391
392 64C1 85 AC sta decimal
393 64C3 A9 55 85 76 A9 41 + mwa #RoundNrDisplay displayposition
394 64CB 20 6D 64 jsr displaybyte ;decimal (byte), displayposition (word)
395
396 64CE A9 4C 85 B3 A9 41 + mwa #LineHeader1 LineAddress4x4
397 64D6 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
398 64DE A5 B2 85 D8 mva ResultY LineYdraw
399 64E2 20 6E 73 jsr TypeLine4x4
400 64E5 F0 1E beq @+ ;unconditional jump, because TypeLine4x4 ends with beq
401
402 64E7 GameOver4x4
403 64E7 RmtSong song_round_over
Macro: RMTSONG [Source: scorchC64.asm]
1 64E7 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64
Source: textproc.asm
404 64E9 A9 41 85 B3 A9 5B + mwa #LineGameOver LineAddress4x4
405 64F1 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
406 64F9 A5 B2 85 D8 mva ResultY LineYdraw
407 64FD 20 6E 73 jsr TypeLine4x4
408 6500 A9 01 8D 7D 43 mva #1 GameIsOver
409
410 @
411 6505 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
412
413 ;Empty line
414 650C A5 B2 85 D8 mva ResultY LineYdraw
415 6510 20 FB 65 jsr TL4x4_empty
416
417 6513 A5 B2 18 69 02 85 + adb ResultY #2 ;next line
418
419
420 ;Header2
421 651A A9 33 85 B3 A9 5B + mwa #LineHeader2 LineAddress4x4
422 6522 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
423 652A A5 B2 85 D8 mva ResultY LineYdraw
424 652E 20 6E 73 jsr TypeLine4x4
425
426 6531 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
427
428 ;Empty line
429 6538 A5 B2 85 D8 mva ResultY LineYdraw
430 653C 20 FB 65 jsr TL4x4_empty
431
432 653F A5 B2 38 E9 02 85 + sbb ResultY #2 ;next line (was empty)
433
434 6546 A6 AE ldx NumberOfPlayers ;we start from the highest (best) tank
435 6548 CA dex ;and it is the last one
436 6549 8E EA 48 stx ResultOfTankNr ;in TankSequence table
437
438 654C A9 09 85 78 A9 41 + mwa #TanksNames tempXROLLER
439
440 6554 ResultOfTheNextPlayer
441 6554 AE EA 48 ldx ResultOfTankNr ;we are after a round, so we can use TankNr
442 6557 BD 77 43 lda TankSequence,x ;and we keep here real number if the tank
443 655A 85 6C sta TankNr ;for which we are displaying results
444
445
446
447
448 655C A5 B2 18 69 04 85 + adb ResultY #4 ;next line
449
450 ;there are at least 2 players, so we can safely
451 ;start displaying the result
452
453 6563 A9 03 lda #3 ;it means |
454 6565 8D 5A 41 sta ResultLineBuffer
455
456 6568 A4 6C ldy TankNr
457 656A B9 BB 43 lda ResultsTable,y
458 656D 85 AC sta decimal
459 656F A9 00 85 AD mva #0 decimal+1
460 6573 A9 62 85 76 A9 41 + mwa #(ResultLineBuffer+8) displayposition
461 657B 20 2C 64 jsr displaydec5 ;decimal (byte), displayposition (word)
462
463 ; overwrite the second digit of the points (max 255)
464 ;it means ":"
465 657E A9 1A 8D 63 41 mva #26 ResultLineBuffer+9
466
467 6583 A2 00 ldx #0
468 6585 A5 6C lda TankNr
469 6587 0A asl
470 6588 0A asl ; times 8, because it is lengtgh
471 6589 0A asl ; of the names of the tanks
472 658A A8 tay
473
474 658B TankNameCopyLoop
475 658B B1 78 lda (tempXROLLER),y ;XROLLER is not working now
476 658D 29 3F and #$3f ;always CAPITAL letters
477 658F E8 inx
478 6590 9D 5A 41 sta ResultLineBuffer,x
479 6593 C8 iny
480 6594 E0 08 cpx #8 ; end of name
481 6596 D0 F3 bne TankNameCopyLoop
482 ; last letter of tank name overwrites first digit of the points (max 255)
483
484
485 ;just after the digits
486 ;it means |
487 6598 A9 03 8D 67 41 mva #$3 ResultLineBuffer+13
488
489 ;result line display
490 659D A9 5A 85 B3 A9 41 + mwa #ResultLineBuffer LineAddress4x4
491 65A5 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
492 65AD A5 B2 85 D8 mva ResultY LineYdraw
493 65B1 20 6E 73 jsr TypeLine4x4
494
495 65B4 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
496
497 ;Empty line
498 65BB A5 B2 85 D8 mva ResultY LineYdraw
499 65BF 20 FB 65 jsr TL4x4_empty
500
501 65C2 CE EA 48 dec ResultOfTankNr
502 65C5 30 0A bmi FinishResultDisplay
503
504 65C7 A5 B2 38 E9 02 85 + sbb ResultY #2 ;distance between lines is smaller
505
506 65CE 4C 54 65 jmp ResultOfTheNextPlayer
507
508 65D1 FinishResultDisplay
509 65D1 A5 B2 85 D8 mva ResultY LineYdraw
510 ;jmp TL4x4_bottom ; just go
511 .endp
512
513 65D5 .proc TL4x4_bottom
514 ;bottom of the frame
515 65D5 A9 17 85 B3 A9 5B + mwa #LineBottom LineAddress4x4
516 65DD A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
517 65E5 4C 6E 73 jmp TypeLine4x4 ; jsr:rts
518 .endp
519
520 65E8 .proc TL4x4_top
521 ;bottom of the frame
522 65E8 A9 09 85 B3 A9 5B + mwa #LineTop LineAddress4x4
523 65F0 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
524 65F8 4C 6E 73 jmp TypeLine4x4 ; jsr:rts
525 .endp
526
527 65FB .proc TL4x4_empty
528 ;empty frame
529 65FB A9 25 85 B3 A9 5B + mwa #LineEmpty LineAddress4x4
530 6603 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw
531 660B 4C 6E 73 jmp TypeLine4x4 ; jsr:rts
532 .endp
533
534 ;--------------------------------------------------
535 660E .proc GameOverScreen
536 ;--------------------------------------------------
537
538 660E 60 rts
539 .endp
540 ;-------------------------------------------------
541 660F .proc PutTankNameOnScreen
542 ;-------------------------------------------------
543
544 .endp
545 ;-------------------------------------------------
546 660F .proc DisplayStatus
547 ;-------------------------------------------------
548 660F DisplayAngle
549 660F A6 6C ldx TankNr
550 6611 60 rts
551 .endp
552 ;-------------------------------------------------
553
554
555 .endif
347 ;----------------------------------------------
348 6612 icl 'grafproc.asm'
Source: grafproc.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5
6 ;--------------------------------------------------
7 6612 .proc draw ;;fuxxing good draw :)
8 ; xdraw,ydraw (word) - coordinates of first point
9 ; xbyte,ybyte (word) - coordinates of last point
10 ;--------------------------------------------------
11 ;creditz to Dr Jankowski / MIM U.W.
12 ; (xi,yi)-----(xk,yk)
13 ;20 DX=XK-XI
14 ;30 DY=YK-YI
15 ;40 DP=2*DY
16 ;50 DD=2*(DY-DX)
17 ;60 DI=2*DY-DX
18 ;70 REPEAT
19 ;80 IF DI>=0
20 ;90 DI=DI+DD
21 ;100 YI=YI+1
22 ;110 ELSE
23 ;120 DI=DI+DP
24 ;130 ENDIF
25 ;140 plot XI,YI
26 ;150 XI=XI+1
27 ;160 UNTIL XI=XK
28
29
30 ; begin: xdraw,ydraw - end: xbyte,ybyte
31 ; let's store starting coordinates
32 ; will be needed, because everything is calculated relatively
33 6612 A9 FF 85 E1 85 E2 mwa #$ffff LineLength
34 6618 A5 61 85 7A A5 62 + mwa xdraw xtempDRAW
35 6620 A5 63 85 7C A5 64 + mwa ydraw ytempDRAW
36
37 ; if line goes our of the screen we are not drawing it, but...
38
39 6628 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
40 6632 B0 14 bcs DrawOutOfTheScreen
41 6634 A5 66 C9 01 D0 04 + cpw xbyte #screenwidth
42 663E B0 08 bcs DrawOutOfTheScreen
43 ;cpw ydraw #screenheight
44 ;bcs DrawOutOfTheScreen
45 ;cpw ybyte #screenheight
46 ;bcc DrawOnTheScreen
47 6640 A5 64 lda ydraw+1
48 6642 30 04 bmi DrawOutOfTheScreen
49 6644 A5 68 lda ybyte+1
50 6646 10 01 bpl DrawOnTheScreen
51 6648 DrawOutOfTheScreen
52 ;jsr DrawJumpPad
53 6648 60 rts
54 6649 DrawOnTheScreen
55 ; constant parameters
56 ; XI=0 ,YI=0
57 6649 A9 00 lda #0
58 664B 85 81 sta XI
59 664D 85 82 sta XI+1
60 664F 85 84 sta YI
61 6651 85 85 sta YI+1
62
63 ; setting the direction controll bits
64 6653 A5 64 C5 68 D0 04 + cpw ydraw ybyte
65 665D 90 14 bcc LineDown
66 ; here one line up
67 ; we are setting bit 0
68 665F A9 01 85 DF mva #1 HowToDraw ;here we can because it's first operation
69 ; we are subctracting Yend from Ybegin (reverse order)
70 ; DY=YI-YK
71 6663 38 A5 63 E5 67 85 + sbw ydraw ybyte DY
72 6670 4C 84 66 jmp CheckDirectionX
73 6673 LineDown
74 ; one line down here
75 ; we are setting bit 0
76 6673 A9 00 85 DF mva #0 HowToDraw ;here we can because it's first operation
77 ; substract Ybegin from Yend (normal order)
78 ; DY=YK-YI
79 6677 38 A5 67 E5 63 85 + sbw ybyte ydraw DY
80 6684 CheckDirectionX
81 6684 A5 62 C5 66 D0 04 + cpw xdraw xbyte
82 668E 90 16 bcc LineRight
83 ; here goes line to the left
84 ; we set bit 1
85
86 6690 A5 DF lda HowToDraw
87 6692 09 02 ora #$02
88 6694 85 DF sta HowToDraw
89 ; substract Xend from Xbegin (reverse)
90 ; DX=XI-XK
91 6696 38 A5 61 E5 65 85 + sbw xdraw xbyte DX
92 66A3 4C B3 66 jmp CheckDirectionFactor
93 66A6 LineRight
94 ; here goes one line to the right
95 ; we clear bit 0
96 ; we can do nothing because the bit is cleared!
97
98 ;lda HowToDraw
99 ;and #$FD
100 ;sta HowToDraw
101
102 ; substracting Xbegin from Xend (normal way)
103 ; DX=XK-XI
104 66A6 38 A5 65 E5 61 85 + sbw xbyte xdraw DX
105 66B3 CheckDirectionFactor
106 ; here we check Direction Factor
107 ; I do not know if we are using proper English word
108 ; but the meaning is 'a' in y=ax+b
109
110 ; lda DX
111 ; we already have DX in A
112 66B3 A5 8C C5 8E D0 04 + cpw DX DY
113
114 66BD 90 0B bcc SwapXY
115 ; 'a' factor is fire, so we copy parameters
116 ; XK=DX
117 66BF A5 8B 85 87 A5 8C + mwa DX XK
118 ; and clearing bit 2
119 ; and bit 2 clear
120 ; (is not needed because already cleared)
121 ;lda HowToDraw
122 ;and #$FB
123 ;sta HowToDraw
124 66C7 4C E8 66 jmp LineParametersReady
125 66CA SwapXY
126 ; not this half of a quarter! - parameters must be swapped
127 ; XK=DY
128 ; DY=DX
129 ; DX=XK - because DY is there so DY and DX are swapped
130 ; YK ... not used
131 66CA A5 8D 85 87 A5 8E + mwa DY XK
132 66D2 A5 8B 85 8D A5 8C + mwa DX DY
133 66DA A5 87 85 8B A5 88 + mwa XK DX
134
135 ; and let's set bit 2
136 66E2 A5 DF lda HowToDraw
137 66E4 09 04 ora #$04
138 66E6 85 DF sta HowToDraw
139 66E8 LineParametersReady
140 ; let's check if length is not zero
141 66E8 A5 8B lda DX
142 66EA 05 8C ora DX+1
143 66EC 05 8D ora DY
144 66EE 05 8E ora DY+1
145 66F0 D0 07 bne NotOnePoint
146 ; length=0
147 66F2 85 E1 sta LineLength
148 66F4 85 E2 sta LineLength+1
149 66F6 4C 39 68 jmp EndOfDraw
150
151 66F9 NotOnePoint
152 ; here we have DX,DY,XK and we know which operations
153 ; are to be performed with these factors when doing PLOT
154 ; (accordingly to given bits of 'HowToDraw')
155 ; Now we must calculate DP, DD and DI
156 ; DP=2*DY
157 ; DD=2*(DY-DX)
158 ; DI=2*DY-DX
159
160 66F9 A5 8D 85 93 A5 8E + mwa DY DP
161 6701 aslw DP
Macro: ASLW [Source: MACRO.ASM]
1 6701 06 93 ASL DP
2 6703 26 94 ROL DP+1
Source: grafproc.asm
162
163 6705 38 A5 8D E5 8B 85 + sbw DY DX DD
164 6712 aslw DD
Macro: ASLW [Source: MACRO.ASM]
1 6712 06 8F ASL DD
2 6714 26 90 ROL DD+1
Source: grafproc.asm
165
166 6716 A5 8D 85 91 A5 8E + mwa DY DI
167 671E aslw DI
Macro: ASLW [Source: MACRO.ASM]
1 671E 06 91 ASL DI
2 6720 26 92 ROL DI+1
Source: grafproc.asm
168 6722 38 A5 91 E5 8B 85 + sbw DI DX
169
170 672F DrawLoop
171 ; REPEAT
172 ; IF DI>=0
173 672F A5 92 lda DI+1
174 6731 30 16 bmi DINegative
175 ; DI=DI+DD
176 ; YI=YI+1
177 6733 18 A5 91 65 8F 85 + adw DI DD
178 6740 E6 84 D0 02 E6 85 inw YI
179 6746 4C 56 67 jmp drplot
180 6749 DINegative
181 ; ELSE
182 ; DI=DI+DP
183 6749 18 A5 91 65 93 85 + adw DI DP
184
185 6756 drplot ; Our plot that checks how to calculate pixels.
186 ; In xtempDRAW and ycircle there are begin coordinates
187 ; of our line
188 ; First we check the 'a' factor (like in y=ax+b)
189 ; If necessary we swap XI and YI
190 ; (as we can not change XI and YI we move XI to temp2
191 ; and YI to temp)
192
193
194 6756 A5 DF lda HowToDraw
195 6758 29 04 and #$04
196 675A D0 13 bne SwappedXY
197 675C A5 81 85 72 A5 82 + mwa XI temp
198 6764 A5 84 85 74 A5 85 + mwa YI temp2
199 676C 4C 7F 67 jmp CheckPlotY
200 676F SwappedXY
201 676F A5 81 85 74 A5 82 + mwa XI temp2
202 6777 A5 84 85 72 A5 85 + mwa YI temp
203 677F CheckPlotY
204 677F A5 DF lda HowToDraw
205 6781 29 01 and #01
206 6783 D0 10 bne LineGoesUp
207 ; here we know that line goes down and we are not changing Y
208 6785 18 A5 74 65 7C 85 + adw temp2 ytempDRAW ydraw ; YI
209 6792 4C A2 67 jmp CheckPlotX
210 6795 LineGoesUp
211 ; line goes up here - we are reversing Y
212 6795 38 A5 7C E5 74 85 + sbw ytempDRAW temp2 ydraw ; YI
213 67A2 CheckPlotX
214 67A2 A5 DF lda HowToDraw
215 67A4 29 02 and #02
216 67A6 D0 10 bne LineGoesLeft
217 ; here we know that line goes right and we are not changing X
218 67A8 18 A5 72 65 7A 85 + adw temp xtempDRAW xdraw ; XI
219 67B5 4C C5 67 jmp PutPixelinDraw
220 67B8 LineGoesLeft
221 ; line goes left - we are reversing X
222 67B8 38 A5 7A E5 72 85 + sbw xtempDRAW temp xdraw ; XI
223 67C5 PutPixelinDraw
224
225 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V)
226 67C5 2C 73 43 bit drawFunction
227 67C8 10 0D bpl @+
228 67CA E6 E1 D0 02 E6 E2 inw LineLength
229 67D0 24 60 bit Vdebug
230 67D2 30 4D bmi MeasureVisualisation
231 67D4 4C 24 68 jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff
232 @
233 67D7 50 48 bvc @+
234 67D9 DrawCheck
235 67D9 A5 E3 lda tracerflag
236 67DB 0D 8A 44 ora SmokeTracerFlag
237 67DE yestrace
238 67DE F0 03 beq notrace
239 67E0 20 14 76 jsr plot
240 67E3 notrace
241 ;aftertrace
242 ;key
243 67E3 A5 BF lda HitFlag
244 67E5 D0 37 bne StopHitChecking
245
246 67E7 CheckCollisionDraw
247 ; checking collision!
248 67E7 A5 64 lda ydraw+1
249 67E9 30 33 bmi StopHitChecking
250
251 67EB 20 84 8E jsr CheckCollisionWithTank
252 67EE A5 BF lda HitFlag
253 67F0 D0 2C bne StopHitChecking
254
255 67F2 18 clc
256 67F3 A5 61 lda xdraw
257 67F5 69 3E adc #<mountaintable
258 67F7 85 72 sta temp
259 67F9 A5 62 lda xdraw+1
260 67FB 69 46 adc #>mountaintable
261 67FD 85 73 sta temp+1
262
263 67FF A0 00 ldy #0
264 6801 A5 63 lda ydraw
265 6803 D1 72 cmp (temp),y
266 6805 90 17 bcc StopHitChecking
267
268 6807 A5 61 85 C1 A5 62 + mwa xdraw XHit
269 680F B1 72 lda (temp),y
270 6811 38 sec
271 6812 E9 01 sbc #1
272 6814 8D 5F 44 sta YHit
273 6817 8C 60 44 sty YHit+1
274 681A A9 FF 85 BF mva #$ff HitFlag
275 681E StopHitChecking
276 681E 4C 24 68 jmp ContinueDraw
277 @
278 6821 MeasureVisualisation
279 6821 20 14 76 jsr plot
280
281 6824 ContinueDraw
282 ; XI=XI+1
283 ; UNTIL XI=XK
284 6824 E6 81 D0 02 E6 82 inw XI
285 682A A5 82 C5 88 D0 04 + cpw XI XK
286 6834 F0 03 4C 2F 67 jne DrawLoop
287
288 6839 EndOfDraw
289 6839 A5 7A 85 61 A5 7B + mwa xtempDRAW xdraw
290 6841 A5 7C 85 63 A5 7D + mwa ytempDRAW ydraw
291 6849 60 rts
292 .endp
293
294 ;--------------------------------------------------
295 684A .proc circle ;fxxxing good circle drawing :)
296 ; xdraw,ydraw (word) - coordinates of circle center
297 ; radius (byte) - radius of circle
298 ;--------------------------------------------------
299 ;Turbo Basic source
300 ; R=30
301 ; XC=0:YC=R
302 ; FX=0:FY=8*R:FS=4*R+3
303 ; WHILE FX<FY
304 ; splot8 //splot8 are eight plotz around the circle
305 ; XC=XC+1
306 ; FX=FX+8
307 ; IF FS>0
308 ; FS=FS-FX-4
309 ; ELSE
310 ; YC=YC-1
311 ; FY=FY-8
312 ; FS=FS-FX-4+FY
313 ; ENDIF
314 ; WEND
315 ; splot8
316
317 684A A5 61 85 B3 A5 62 + mwa xdraw xcircle
318 6852 A5 63 85 B5 A5 64 + mwa ydraw ycircle
319
320 685A A9 00 85 70 85 71 mwa #0 xc
321 6860 A5 AB 85 8A mva radius yc
322 6864 A9 00 85 83 mva #0 fx
323 6868 A5 AB 85 86 mva radius fy
324 686C 06 86 asl FY
325 686E 06 86 asl FY
326 6870 A5 86 85 89 mva FY FS
327 6874 06 86 asl FY
328 6876 18 clc
329 6877 A5 89 lda FS
330 6879 69 03 adc #3
331 687B 85 89 sta FS
332
333 687D circleloop
334 687D A5 83 lda FX
335 687F C5 86 cmp FY
336 6881 B0 34 bcs endcircleloop
337 6883 20 CB 68 jsr splot8
338 6886 E6 70 inc XC
339
340 6888 18 clc
341 6889 A5 83 lda FX
342 688B 69 08 adc #8
343 688D 85 83 sta FX
344
345 688F A5 89 lda FS
346 6891 F0 0C beq else01
347 6893 30 0A bmi else01
348 6895 38 sec
349 6896 E5 83 sbc FX
350 6898 E9 04 sbc #4
351 689A 85 89 sta FS
352 689C 4C B4 68 jmp endif01
353 689F else01
354 689F C6 8A dec YC
355 68A1 38 sec
356 68A2 A5 86 lda FY
357 68A4 E9 08 sbc #8
358 68A6 85 86 sta FY
359
360 68A8 A5 89 lda FS
361 68AA 38 sec
362 68AB E5 83 sbc FX
363 68AD E9 04 sbc #4
364 68AF 18 clc
365 68B0 65 86 adc FY
366 68B2 85 89 sta FS
367 68B4 endif01
368 68B4 4C 7D 68 jmp circleloop
369 68B7 endcircleloop
370
371 68B7 20 CB 68 jsr splot8
372
373 68BA A5 B3 85 61 A5 B4 + mwa xcircle xdraw
374 68C2 A5 B5 85 63 A5 B6 + mwa ycircle ydraw
375 68CA 60 rts
376 .endp
377 ;----
378 68CB .proc splot8
379 ; plot xcircle+XC,ycircle+YC
380 ; plot xcircle+XC,ycircle-YC
381 ; plot xcircle-XC,ycircle-YC
382 ; plot xcircle-XC,ycircle+YC
383
384 ; plot xcircle+YC,ycircle+XC
385 ; plot xcircle+YC,ycircle-XC
386 ; plot xcircle-YC,ycircle-XC
387 ; plot xcircle-YC,ycircle+XC
388
389 68CB 18 clc
390 68CC A5 B3 lda xcircle
391 68CE 65 70 adc XC
392 68D0 85 61 sta xdraw
393 68D2 A5 B4 lda xcircle+1
394 68D4 69 00 adc #0
395 68D6 85 62 sta xdraw+1
396 ;clc
397 68D8 A5 B5 lda ycircle
398 68DA 65 8A adc YC
399 68DC 85 63 sta ydraw
400 68DE 8D 61 44 sta tempcir
401 68E1 A5 B6 lda ycircle+1
402 68E3 69 00 adc #$00
403 68E5 85 64 sta ydraw+1
404 68E7 8D 62 44 sta tempcir+1
405 68EA 20 14 76 jsr plot
406
407 68ED 38 sec
408 68EE A5 B5 lda ycircle
409 68F0 E5 8A sbc YC
410 68F2 85 63 sta ydraw
411 68F4 A5 B6 lda ycircle+1
412 68F6 E9 00 sbc #$00
413 68F8 85 64 sta ydraw+1
414 68FA 20 14 76 jsr plot
415
416 68FD 38 sec
417 68FE A5 B3 lda xcircle
418 6900 E5 70 sbc XC
419 6902 85 61 sta xdraw
420 6904 A5 B4 lda xcircle+1
421 6906 E9 00 sbc #0
422 6908 85 62 sta xdraw+1
423 690A 20 14 76 jsr plot
424
425 690D AD 61 44 lda tempcir
426 6910 85 63 sta ydraw
427 6912 AD 62 44 lda tempcir+1
428 6915 85 64 sta ydraw+1
429 6917 20 14 76 jsr plot
430 ;---
431 691A 18 clc
432 691B A5 B3 lda xcircle
433 691D 65 8A adc yC
434 691F 85 61 sta xdraw
435 6921 A5 B4 lda xcircle+1
436 6923 69 00 adc #0
437 6925 85 62 sta xdraw+1
438 ;clc
439 6927 A5 B5 lda ycircle
440 6929 65 70 adc xC
441 692B 85 63 sta ydraw
442 692D 8D 61 44 sta tempcir
443 6930 A5 B6 lda ycircle+1
444 6932 69 00 adc #$00
445 6934 85 64 sta ydraw+1
446 6936 8D 62 44 sta tempcir+1
447 6939 20 14 76 jsr plot
448
449 693C 38 sec
450 693D A5 B5 lda ycircle
451 693F E5 70 sbc xC
452 6941 85 63 sta ydraw
453 6943 A5 B6 lda ycircle+1
454 6945 E9 00 sbc #$00
455 6947 85 64 sta ydraw+1
456 6949 20 14 76 jsr plot
457
458 694C 38 sec
459 694D A5 B3 lda xcircle
460 694F E5 8A sbc yC
461 6951 85 61 sta xdraw
462 6953 A5 B4 lda xcircle+1
463 6955 E9 00 sbc #0
464 6957 85 62 sta xdraw+1
465 6959 20 14 76 jsr plot
466
467 695C AD 61 44 lda tempcir
468 695F 85 63 sta ydraw
469 6961 AD 62 44 lda tempcir+1
470 6964 85 64 sta ydraw+1
471 6966 20 14 76 jsr plot
472
473 6969 60 RTS
474 .endp
475
476 ;-------------------------------*------------------
477 696A .proc placetanks
478 ;--------------------------------------------------
479 696A A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1
480 696C A9 00 lda #0
481 @
482 ; clearing the tables with coordinates of the tank
483 ; it is necessary, because randomizing checks
484 ; if the given tank is already placed
485 ; after check if its position is not (0,0)
486
487 ; I will be honest with you - I have no idea
488 ; what the above comment was intending to mean :)
489
490 696E 9D 0D 44 sta XtankstableL,x
491 6971 9D 13 44 sta XtankstableH,x
492 6974 9D 19 44 sta Ytankstable,x
493 6977 CA dex
494 6978 10 F4 bpl @-
495
496
497 697A A9 00 8D D6 44 8D + mwa #0 temptankX
498 6982 A9 00 8D D8 44 mva #0 temptankNr ;player number
499 6987 StillRandomize
500 6987 A6 AE ldx NumberOfPlayers
501 6989 AD 1B D4 lda random
502 698C 29 07 and #$07
503 698E A8 tay
504 698F C4 AE cpy NumberOfPlayers
505 6991 B0 F4 bcs StillRandomize
506 6993 B9 0D 44 lda xtankstableL,y
507 6996 D0 EF bne StillRandomize
508 6998 B9 13 44 lda xtankstableH,y
509 699B D0 EA bne StillRandomize
510 ; here we know that we got a random number
511 ; of the tank that is not in use
512 ; this number is in Y
513
514 699D 18 clc
515 699E AD D6 44 lda temptankX
516 69A1 7D 2C 5C adc disktance,x
517 69A4 8D D6 44 sta temptankX
518 69A7 99 0D 44 sta xtankstableL,y
519 69AA 90 03 bcc NotHigherByte03
520 69AC EE D7 44 inc temptankX+1
521 69AF NotHigherByte03
522 69AF AD D7 44 lda temptankX+1
523 69B2 99 13 44 sta xtankstableH,y
524 69B5 EE D8 44 INC temptankNr
525 69B8 AE D8 44 ldx temptankNr
526 69BB E4 AE Cpx NumberOfPlayers
527 69BD D0 C8 bne StillRandomize
528
529 ; getting random displacements relative to even positions
530 69BF A2 00 ldx #$00
531 69C1 StillRandomize02
532 69C1 AD 1B D4 lda random
533 69C4 29 1F and #$1f ; maximal displacement is 31 pixels
534
535 69C6 18 clc
536 69C7 7D 0D 44 adc xtankstableL,x
537 69CA 9D 0D 44 sta xtankstableL,x
538 69CD 90 03 bcc NotHigherByte02
539 69CF FE 13 44 inc xtankstableH,x
540 69D2 NotHigherByte02
541 ; and we deduct 15 to make the displacement work two ways
542 69D2 38 sec
543 69D3 BD 0D 44 lda xtankstableL,x
544 69D6 E9 0F sbc #$0f
545 ; and clear lowest bit to be sure that the X coordinate is even
546 ; (this is to have P/M background look nice)
547 ; "AND" does not change "Carry" bit.
548 ; x correction for P/M
549 ; --
550 .IF XCORRECTION_FOR_PM = 1
551 and #$fe
552 .ENDIF
553 ; --
554 69D8 9D 0D 44 sta xtankstableL,x
555 69DB B0 03 bcs NotHigherByte01
556 69DD DE 13 44 dec xtankstableH,x
557 69E0 NotHigherByte01
558
559 69E0 E8 inx
560 69E1 E4 AE Cpx NumberOfPlayers
561 69E3 D0 DC bne StillRandomize02
562 69E5 60 rts
563
564 ; during calculating heights of thw mountains
565 ; check if the tank is not somewhere around
566 ; if so, make horizontal line 8 pixels long
567 69E6 CheckTank
568 69E6 A6 AE ldx NumberOfPlayers
569 69E8 CA dex
570 69E9 CheckNextTank
571 69E9 BD 0D 44 lda xtankstableL,x
572 69EC C5 61 cmp xdraw
573 69EE D0 17 bne UnequalTanks
574 69F0 BD 13 44 lda xtankstableH,x
575 69F3 C5 62 cmp xdraw+1
576 69F5 D0 10 bne UnequalTanks
577 69F7 A5 63 lda ydraw
578 ;sec
579 ;sbc #$01 ; minus 1, because it was 1 pixel too high
580 69F9 9D 19 44 sta ytankstable,x ; what's the heck is that????!!!!
581 69FC A9 07 8D D4 44 mva #7 deltaX
582 6A01 A9 00 85 C3 85 C4 mwa #0 delta
583 6A07 UnequalTanks
584 6A07 CA dex
585 6A08 10 DF bpl CheckNextTank
586 6A0A 60 rts
587 .endp
588
589 ;-------------------------------------------------
590 6A0B .proc ClearTanks
591 6A0B 20 46 75 jsr PMoutofScreen
592 6A0E A9 01 85 AA mva #1 Erase ; erase tanks flag
593 .endp
594 ;--
595 6A12 .proc drawtanks
596 ;-------------------------------------------------
597 6A12 A5 6C lda TankNr
598 6A14 48 pha
599 6A15 A2 00 ldx #$00
600 6A17 86 6C stx TankNr
601
602 6A19 DrawNextTank
603 6A19 20 2C 6A jsr drawtanknr
604 6A1C E6 6C inc TankNr
605 6A1E A6 6C ldx TankNr
606 6A20 E4 AE Cpx NumberOfPlayers
607 6A22 D0 F5 bne DrawNextTank
608
609 6A24 68 pla
610 6A25 85 6C sta TankNr
611
612 6A27 A9 00 85 AA mva #0 Erase ; no erase tanks flag
613 6A2B 60 rts
614 .endp
615 ;---------
616 6A2C .proc DrawTankNr
617 6A2C A6 6C ldx tankNr
618 ; let's check the energy
619 6A2E BD AF 43 lda eXistenZ,x
620 6A31 D0 21 bne SkipHidingPM ; if energy=0 then no tank
621
622 ; hide P/M
623 6A33 BD A2 A2 lda TanksPMOrder,x
624 6A36 AA tax
625 6A37 A9 00 lda #0
626 6A39 E0 04 cpx #$4 ; 5th tank is defferent
627 6A3B D0 06 bne No5thTankHide
628 6A3D 85 06 sta hposp0+4
629 6A3F 85 07 sta hposp0+5
630 6A41 F0 0C beq @+
631 6A43 No5thTankHide
632 6A43 E0 05 cpx #$5 ; 6th tank is defferent
633 6A45 D0 06 bne No6thTankHide
634 6A47 85 08 sta hposp0+6
635 6A49 85 09 sta hposp0+7
636 6A4B F0 02 beq @+
637 6A4D No6thTankHide
638 6A4D 95 02 sta hposp0,x
639 @
640 6A4F A6 6C ldx TankNr
641 6A51 4C 56 6B jmp DoNotDrawTankNr
642 6A54 SkipHidingPM
643
644 6A54 BD 2B 44 lda TankShape,x
645 6A57 AA tax
646 6A58 BC 6A 5C ldy TankShapesTable,x
647 6A5B A6 6C ldx TankNr
648 6A5D BD C3 48 lda AngleTable,x
649 6A60 C9 5B cmp #91 ; left or right tank shape
650 6A62 B0 02 bcs LeftTank
651 6A64 C8 C8 :2 iny ; right tank
652 6A66 LeftTank
653 6A66 84 69 sty CharCode
654 6A68 DrawTankNrX
655 6A68 A6 6C ldx tanknr
656 6A6A 20 67 74 jsr SetupXYdraw
657
658 6A6D 20 E7 70 jsr TypeChar
659 6A70 A5 AA lda Erase
660 6A72 F0 03 4C F9 6A jne noTankNoPM
661 ; now P/M graphics on the screen (only for 5 tanks)
662 ; horizontal position
663 6A77 A6 6C ldx TankNr
664 6A79 BD A2 A2 lda TanksPMOrder,x
665 6A7C AA tax
666 6A7D A5 61 85 65 A5 62 + mwa xdraw xbyte
667 6A85 rorw xbyte ; divide by 2 (carry does not matter)
Macro: RORW [Source: MACRO.ASM]
1 6A85 66 66 ROR XBYTE+1
2 6A87 66 65 ROR XBYTE
Source: grafproc.asm
668 6A89 A5 65 lda xbyte
669 6A8B 18 clc
670 6A8C 69 2C adc #PMOffsetX ; P/M to graphics offset
671 6A8E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent
672 6A90 D0 09 bne No5thTank
673 6A92 18 clc
674 6A93 69 04 adc #$04 ; missile offset offset
675 6A95 85 06 sta hposp0+4
676 6A97 85 07 sta hposp0+5
677 6A99 D0 0F bne NoMissile
678 6A9B No5thTank
679 6A9B E0 05 cpx #$5 ; 6th tank are joined missiles and offset is defferent
680 6A9D D0 09 bne Tanks1to4
681 6A9F 18 clc
682 6AA0 69 04 adc #$04 ; missile offset offset
683 6AA2 85 08 sta hposp0+6
684 6AA4 85 09 sta hposp0+7
685 6AA6 D0 02 bne NoMissile
686 6AA8 Tanks1to4
687 6AA8 95 02 sta hposp0,x
688
689 6AAA NoMissile
690 ; vertical position
691 6AAA BD B5 5B lda pmtableL,x
692 6AAD 85 65 sta xbyte
693 6AAF BD BB 5B lda pmtableH,x
694 6AB2 85 66 sta xbyte+1
695
696 ; calculate start position of the tank
697 6AB4 A5 63 lda ydraw
698 6AB6 18 clc
699 6AB7 69 2A adc #PMOffsetY
700 6AB9 85 72 sta temp
701 6ABB A0 00 ldy #$00
702 6ABD E0 05 cpx #$5
703 6ABF B0 1D bcs PMForTank6
704 ; clear sprite and put 3 lines on the tank at the same time
705 6AC1 A2 03 ldx #3 ; three lines of PM
706 6AC3 ClearPM
707 6AC3 C4 72 cpy temp
708 6AC5 D0 0C bne ZeroesToGo
709 6AC7 B1 65 @ lda (xbyte),y
710 6AC9 29 F0 and #%11110000
711 6ACB 09 0F ora #%00001111 ; (2 bits set) we set on two pixels in three lines
712 6ACD 91 65 sta (xbyte),y
713 6ACF 88 dey
714 6AD0 CA dex
715 6AD1 D0 F4 bne @-
716 6AD3 ZeroesToGo
717 6AD3 B1 65 lda (xbyte),y
718 6AD5 29 F0 and #%11110000
719 6AD7 91 65 sta (xbyte),y
720 6AD9 88 dey
721 6ADA D0 E7 bne ClearPM
722 6ADC F0 1B beq NoPlayerMissile
723 6ADE PMForTank6
724 ; clear sprite and put 3 lines on the tank at the same time
725 6ADE A2 03 ldx #3 ; three lines of PM
726 6AE0 ClearPM6
727 6AE0 C4 72 cpy temp
728 6AE2 D0 0C bne ZeroesToGo6
729 6AE4 B1 65 @ lda (xbyte),y
730 6AE6 29 0F and #%00001111
731 6AE8 09 F0 ora #%11110000 ; (2 bits set) we set on two pixels in three lines
732 6AEA 91 65 sta (xbyte),y
733 6AEC 88 dey
734 6AED CA dex
735 6AEE D0 F4 bne @-
736 6AF0 ZeroesToGo6
737 6AF0 B1 65 lda (xbyte),y
738 6AF2 29 0F and #%00001111
739 6AF4 91 65 sta (xbyte),y
740 6AF6 88 dey
741 6AF7 D0 E7 bne ClearPM6
742
743 6AF9 NoPlayerMissile
744 6AF9 noTankNoPM
745 6AF9 A0 01 ldy #$01
746 6AFB A5 AA lda Erase
747 6AFD F0 01 beq @+
748 6AFF 88 dey
749 6B00 84 A9 @ sty color
750 ; draw defensive weapons like shield ( tank number in X )
751 ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char
752 6B02 A6 6C ldx TankNr
753 6B04 BD FD 43 lda ActiveDefenceWeapon,x
754 6B07 C9 26 cmp #ind_Shield_________ ; one shot shield
755 6B09 F0 16 beq DrawTankSh
756 6B0B C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute
757 6B0D F0 21 beq DrawTankShieldBold
758 6B0F C9 27 cmp #ind_Heavy_Shield___ ; shield with energy
759 6B11 F0 1D beq DrawTankShieldBold
760 6B13 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence
761 6B15 F0 10 beq DrawTankShieldWihHorns
762 6B17 C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector
763 6B19 F0 0C beq DrawTankShieldWihHorns
764 6B1B C9 20 cmp #ind_White_Flag_____ ; White Flag
765 6B1D F0 1A beq DrawTankFlag
766 6B1F D0 27 bne NoShieldDraw
767 6B21 DrawTankSh
768 6B21 20 86 6B jsr DrawTankShield
769 6B24 4C 48 6B jmp NoShieldDraw
770 6B27 DrawTankShieldWihHorns
771 6B27 20 86 6B jsr DrawTankShield
772 6B2A 20 F7 6B jsr DrawTankShieldHorns
773 6B2D 4C 48 6B jmp NoShieldDraw
774 6B30 DrawTankShieldBold
775 6B30 20 86 6B jsr DrawTankShield
776 6B33 20 3C 6C jsr DrawTankShieldBoldLine
777 6B36 4C 48 6B jmp NoShieldDraw
778 6B39 DrawTankFlag
779 6B39 A9 1E lda #char_flag____________ ; flag symbol
780 6B3B 85 69 sta CharCode
781 6B3D BD 19 44 lda Ytankstable,x
782 6B40 38 sec
783 6B41 E9 08 sbc #8
784 6B43 85 63 sta ydraw
785 6B45 20 E7 70 jsr TypeChar
786 6B48 NoShieldDraw
787 6B48 BarrelChange
788 6B48 A0 01 ldy #$01
789 6B4A A5 AA lda Erase
790 6B4C F0 01 beq @+
791 6B4E 88 dey
792 6B4F 84 A9 @ sty color
793 6B51 20 7B 74 jsr DrawBarrel
794 6B54 A6 6C ldx TankNr
795 6B56 DoNotDrawTankNr
796 6B56 60 rts
797 .endp
798
799 ; -------------------------------------
800 6B57 .proc FlashTank
801 ; -------------------------------------
802 ; number of blinking tank in TankNr
803 6B57 A9 12 85 89 mva #18 fs ; temp, how many times flash the tank
804 6B5B tankflash_loop
805 6B5B A5 02 lda CONSOL ; turbo mode
806 6B5D 29 01 and #%00000001 ; START KEY
807 6B5F D0 04 A9 01 85 89 sne:mva #1 fs ; finish it
808 6B65 A9 01 85 AA mva #1 Erase
809 6B69 A6 6C ldx TankNr
810 6B6B 20 54 6A jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy !
811 ;PAUSE 2
812 6B6E A0 01 ldy #1
813 6B70 20 9D 5A jsr PauseYFrames
814 6B73 A9 00 85 AA mva #0 Erase
815 6B77 A6 6C ldx TankNr
816 6B79 20 54 6A jsr DrawTankNr.SkipHidingPM
817 ;PAUSE 2
818 6B7C A0 01 ldy #1
819 6B7E 20 9D 5A jsr PauseYFrames
820 6B81 C6 89 dec fs
821 6B83 D0 D6 jne tankflash_loop
822 6B85 60 rts
823 .endp
824
825 ;--------------------------------------------------
826 6B86 .proc DrawTankShield
827 ; X - tank number
828 ; if use DrawInPosition entry point then:
829 ; xdraw, ydraw - coordinates left LOWER corner of Tank char
830 ; values remain there after a DrawTankNr proc.
831 ;
832 ; this proc change xdraw, ydraw and temp!
833 ;--------------------------------------------------
834 6B86 38 A5 61 E9 03 85 + sbw xdraw #$03 ; 3 pixels to left
835 ; draw left vertical line of shield ( | )
836 6B91 A9 07 85 72 mva #7 temp ; strange !!!
837 @
838 6B95 20 14 76 jsr plot
839 6B98 A5 63 D0 02 C6 64 + .nowarn dew ydraw
840 6BA0 C6 72 dec temp
841 6BA2 D0 F1 bne @-
842 ; draw left oblique line of shield ( / )
843 6BA4 A9 03 85 72 mva #3 temp
844 @
845 6BA8 20 14 76 jsr plot
846 6BAB A5 63 D0 02 C6 64 + .nowarn dew ydraw
847 6BB3 E6 61 D0 02 E6 62 inw xdraw
848 6BB9 C6 72 dec temp
849 6BBB D0 EB bne @-
850 ; draw top horizontal line of shield ( _ )
851 6BBD A9 07 85 72 mva #7 temp
852 @
853 6BC1 20 14 76 jsr plot
854 6BC4 E6 61 D0 02 E6 62 inw xdraw
855 6BCA C6 72 dec temp
856 6BCC D0 F3 bne @-
857 ; draw right oblique line of shield ( \ )
858 6BCE A9 03 85 72 mva #3 temp
859 @
860 6BD2 20 14 76 jsr plot
861 6BD5 E6 63 D0 02 E6 64 inw ydraw
862 6BDB E6 61 D0 02 E6 62 inw xdraw
863 6BE1 C6 72 dec temp
864 6BE3 D0 ED bne @-
865 ; draw right vertical line of shield ( | )
866 6BE5 A9 07 85 72 mva #7 temp
867 @
868 6BE9 20 14 76 jsr plot
869 6BEC E6 63 D0 02 E6 64 inw ydraw
870 6BF2 C6 72 dec temp
871 6BF4 D0 F3 bne @-
872 6BF6 60 rts
873 .endp
874 ;--------------------------------------------------
875 6BF7 .proc DrawTankShieldHorns
876 ; use only directly after DrawTankShield
877 ; this proc draws a little "horns" on shield.
878 ; Symbol of defensive but aggressive :) weapon
879 ;--------------------------------------------------
880 6BF7 A5 61 D0 02 C6 62 + .nowarn dew xdraw ; 1 pixel left
881 6BFF 38 A5 63 E9 0A 85 + sbw ydraw #$0a ; 10 pixels up
882 6C0A 20 14 76 jsr plot
883 6C0D A5 63 D0 02 C6 64 + .nowarn dew ydraw
884 6C15 E6 61 D0 02 E6 62 inw xdraw
885 6C1B 20 14 76 jsr plot
886 6C1E 38 A5 61 E9 0D 85 + sbw xdraw #$0d ; 13 pixels left
887 6C29 20 14 76 jsr plot
888 6C2C E6 61 D0 02 E6 62 inw xdraw
889 6C32 E6 63 D0 02 E6 64 inw ydraw
890 6C38 20 14 76 jsr plot
891 6C3B 60 rts
892 .endp
893 ;--------------------------------------------------
894 6C3C .proc DrawTankShieldBoldLine
895 ; use only directly after DrawTankShield
896 ; this proc draws bold top on shield.
897 ; Symbol of ablative shield ? :)
898 ;--------------------------------------------------
899 6C3C 38 A5 61 E9 04 85 + sbw xdraw #$04 ; 5 pixels left
900 6C47 38 A5 63 E9 0B 85 + sbw ydraw #$0b ; 11 pixels up
901 ; draw additional top horizontal line of shield ( _ )
902 6C52 A9 06 85 72 mva #6 temp
903 @
904 6C56 20 14 76 jsr plot
905 6C59 A5 61 D0 02 C6 62 + .nowarn dew xdraw
906 6C61 C6 72 dec temp
907 6C63 D0 F1 bne @-
908 6C65 60 rts
909 .endp
910 ;--------------------------------------------------
911 6C66 .proc DrawTankParachute
912 ;Tank number in X
913 ;--------------------------------------------------
914 6C66 A9 02 lda #char_parachute_______ ; parachute symbol
915 6C68 85 69 sta CharCode
916 6C6A BD 19 44 lda Ytankstable,x
917 6C6D C9 10 cmp #16
918 6C6F 90 0A bcc ToHighToParachute
919 ;sec
920 6C71 E9 08 sbc #8
921 6C73 85 63 sta ydraw
922 6C75 20 70 74 jsr SetupXYdraw.X
923 6C78 20 E7 70 jsr TypeChar
924 6C7B ToHighToParachute
925 6C7B A6 6C ldx TankNr
926 6C7D 60 rts
927 .endp
928
929 ;--------------------------------------------------
930 6C7E .proc DrawTankRocketEngine
931 ; X - tank number
932 ;
933 ; this proc change xdraw, ydraw and temp!
934 ;--------------------------------------------------
935 6C7E 18 clc
936 6C7F BD 19 44 lda Ytankstable,x
937 6C82 69 02 adc #2 ; 1 pixel down
938 6C84 85 63 sta ydraw
939 6C86 A9 00 85 64 mva #0 ydraw+1
940
941 6C8A 18 clc
942 6C8B BD 0D 44 lda XtanksTableL,x
943 6C8E 69 02 adc #2 ; 2 pixels to right
944 6C90 85 61 sta xdraw
945 6C92 BD 13 44 lda XtanksTableH,x
946 6C95 69 00 adc #0
947 6C97 85 62 sta xdraw+1
948
949 ; draw first horizontal line
950 6C99 A9 05 85 72 mva #5 temp
951 @
952 6C9D 20 14 76 jsr plot
953 6CA0 E6 61 D0 02 E6 62 inw xdraw
954 6CA6 C6 72 dec temp
955 6CA8 D0 F3 bne @-
956
957 6CAA 38 A5 61 E9 02 85 + sbw xdraw #2 ; 2 pixels left
958 6CB5 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down
959
960 ; draw second horizontal line
961 6CBB A9 03 85 72 mva #3 temp
962 @
963 6CBF 20 14 76 jsr plot
964 6CC2 A5 61 D0 02 C6 62 + .nowarn dew xdraw
965 6CCA C6 72 dec temp
966 6CCC D0 F1 bne @-
967
968 6CCE 18 A5 61 69 02 85 + adw xdraw #2 ; 2 pixels right
969 6CD9 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down
970
971 ; and last pixel
972 6CDF 20 14 76 jsr plot
973
974 6CE2 A6 6C ldx TankNr
975 6CE4 60 rts
976 .endp
977 ;--------------------------------------------------
978 6CE5 .proc DrawTankEngine
979 ; X - tank number
980 ;
981 ; this proc change xdraw, ydraw and temp!
982 ;--------------------------------------------------
983 ; one pixel under tank
984 6CE5 18 clc
985 6CE6 BD 19 44 lda Ytankstable,x
986 6CE9 69 01 adc #1
987 6CEB 85 63 sta ydraw
988 6CED A9 00 85 64 mva #0 ydraw+1
989 6CF1 BD 0D 44 lda XtankstableL,x
990 6CF4 85 61 sta xdraw
991 6CF6 BD 13 44 lda XtankstableH,x
992 6CF9 85 62 sta xdraw+1
993 ; clear first pixel under tank
994 6CFB A9 00 85 A9 mva #0 color
995 6CFF 20 14 76 jsr plot
996 6D02 E6 61 D0 02 E6 62 inw xdraw
997 ; plot 6 random color pixels
998 6D08 A9 06 85 72 mva #6 temp
999 6D0C A5 AA @ lda Erase
1000 6D0E 49 01 eor #%00000001
1001 6D10 2D 1B D4 and random
1002 6D13 29 01 and #%00000001
1003 6D15 85 A9 sta color
1004 6D17 20 14 76 jsr plot
1005 6D1A E6 61 D0 02 E6 62 inw xdraw
1006 6D20 C6 72 dec temp
1007 6D22 D0 E8 bne @-
1008 ; clear last pixel under tank
1009 6D24 A9 00 85 A9 mva #0 color
1010 6D28 20 14 76 jsr plot
1011 6D2B A6 6C ldx TankNr
1012 6D2D 60 rts
1013 .endp
1014 ;--------------------------------------------------
1015 6D2E .proc TankFalls;
1016 ;--------------------------------------------------
1017 6D2E A9 00 lda #0
1018 6D30 8D 64 44 sta PreviousFall ; bit 7 - left, bit 6 - right
1019 6D33 8D 65 44 sta EndOfTheFallFlag
1020 6D36 85 A8 sta Parachute
1021 6D38 A9 02 8D 63 44 mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop
1022
1023 ; let's check if the given tank has got the parachute
1024 6D3D A6 6C ldx TankNr
1025 6D3F BD FD 43 lda ActiveDefenceWeapon,x
1026 6D42 C9 23 cmp #ind_Parachute______ ; parachute
1027 6D44 F0 08 beq ParachuteActive
1028 6D46 C9 24 cmp #ind_StrongParachute ; strong parachute
1029 6D48 F0 04 beq ParachuteActive
1030 6D4A C9 28 cmp #ind_Force_Shield___ ; shield witch energy and parachute
1031 6D4C D0 02 bne TankFallsX
1032 6D4E ParachuteActive
1033 6D4E E6 A8 inc Parachute
1034 6D50 TankFallsX
1035 ; sound only if really falls
1036 6D50 A5 A8 lda Parachute
1037 6D52 2D 63 44 and FallingSoundBit ; bit 1
1038 6D55 F0 09 beq NoFallingSound
1039 6D57 A9 00 8D 63 44 mva #0 FallingSoundBit
1040 6D5C A9 0E 85 9E mva #sfx_shield_off sfx_effect
1041 6D60 NoFallingSound
1042 ; clear previous position
1043 6D60 A9 01 85 AA mva #1 Erase
1044 6D64 20 2C 6A jsr DrawTankNr
1045 ; and the parachute (if present)
1046 6D67 A5 A8 lda Parachute
1047 6D69 29 01 and #01
1048 6D6B F0 03 beq DoNotClearParachute
1049 ; here we clear the parachute
1050 ; ldx TankNr
1051 6D6D 20 66 6C jsr DrawTankParachute
1052 6D70 DoNotClearParachute
1053 6D70 A9 00 85 AA mva #0 Erase
1054 ; ldx TankNr
1055 6D74 AD 65 44 lda EndOfTheFallFlag ; We only get byte below the tank if still falling
1056 6D77 D0 2C bne NoGroundCheck
1057 ; coordinates of the first pixel under the tank
1058 6D79 A6 6C ldx TankNr
1059 6D7B 20 70 74 jsr SetupXYdraw.X
1060 6D7E BD 19 44 lda Ytankstable,x
1061 6D81 18 clc
1062 6D82 69 01 adc #1 ; in this point the comment helped us! For the very first
1063 ; time in our lives! Tada! It opens a new chapter!!!
1064 6D84 85 63 sta ydraw
1065 ;
1066 ; UnderTank1 ; byte under tank
1067 ; UnderTank2 ; byte under tank reversed (for simple check right direction)
1068 6D86 A9 08 lda #08
1069 6D88 85 72 sta temp ; Loop Counter
1070 6D8A ByteBelowTank
1071 6D8A 20 5A 76 jsr point_plot
1072 6D8D F0 06 beq EmptyPoint2
1073 6D8F 38 sec
1074 6D90 66 96 ror UnderTank2
1075 6D92 38 sec
1076 6D93 B0 04 bcs ROLPoint2
1077 6D95 EmptyPoint2
1078 6D95 18 clc
1079 6D96 66 96 ror UnderTank2
1080 6D98 18 clc
1081 6D99 ROLPoint2
1082 6D99 26 95 rol UnderTank1
1083 6D9B E6 61 D0 02 E6 62 inw xdraw
1084 6DA1 C6 72 dec temp
1085 6DA3 D0 E5 bne ByteBelowTank
1086 6DA5 NoGroundCheck
1087 6DA5 A6 6C ldx TankNr
1088 6DA7 BD 19 44 lda Ytankstable,x
1089 6DAA C9 C7 cmp #screenheight-1 ; tank on lowest position (no falling down)
1090 6DAC 90 03 4C 71 6E jcs EndOfFall
1091 6DB1 A5 95 lda UnderTank1
1092 6DB3 D0 3C bne NoFallingDown
1093 ; Tank falling down ----
1094 6DB5 A5 A8 lda Parachute
1095 6DB7 29 01 and #1
1096 6DB9 D0 05 bne ParachutePresent
1097 ; decreasing energy
1098 6DBB A0 02 ldy #2 ; how much energy to substract if no parachute
1099 6DBD 20 74 57 jsr DecreaseEnergyX
1100 6DC0 ParachutePresent
1101 ; check parachute type
1102 6DC0 BD FD 43 lda ActiveDefenceWeapon,x
1103 6DC3 C9 24 cmp #ind_StrongParachute ; strong parachute
1104 6DC5 D0 18 bne OneTimeParachute
1105 ; decreasing energy of parachute
1106 6DC7 A0 01 ldy #1 ; how much parachute energy to substract
1107 6DC9 20 B0 57 jsr DecreaseShieldEnergyX
1108 6DCC C0 00 cpy #0 ; is necessary to reduce tenk energy ?
1109 6DCE F0 03 beq @+
1110 6DD0 20 74 57 jsr DecreaseEnergyX
1111 @
1112 ; check energy of parachute
1113 6DD3 BD A8 43 lda ShieldEnergy,x
1114 6DD6 D0 07 bne OneTimeParachute
1115 6DD8 A9 00 lda #$00
1116 6DDA 85 A8 sta Parachute
1117 6DDC 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defence
1118 6DDF OneTimeParachute
1119 6DDF A5 A8 lda Parachute
1120 6DE1 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present)
1121 6DE3 85 A8 sta Parachute
1122 ; tank is falling down - modify coorinates
1123 6DE5 BD 19 44 lda Ytankstable,x
1124 6DE8 18 clc
1125 6DE9 69 01 adc #1
1126 6DEB 9D 19 44 sta Ytankstable,x
1127 6DEE 4C 5A 6E jmp EndOfFCycle
1128 6DF1 NoFallingDown
1129 ; check direction (left or right)
1130 6DF1 A0 06 ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7)
1131 6DF3 B9 33 5C @ lda SlideLeftTable,y
1132 6DF6 C5 95 cmp UnderTank1
1133 6DF8 F0 34 beq FallingLeft
1134 6DFA C5 96 cmp UnderTank2
1135 6DFC F0 05 beq FallingRight
1136 6DFE 88 dey
1137 6DFF 10 F2 bpl @-
1138 6E01 30 54 bmi NoLeftOrRight
1139 6E03 FallingRight
1140 ; tank is falling right
1141 6E03 2C 64 44 bit PreviousFall ; bit 6 - left
1142 6E06 70 4F bvs EndRightFall
1143 ; we finish falling right if the tank reached the edge of the screen
1144 6E08 BD 13 44 lda XtanksTableH,x
1145 6E0B C9 01 cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank
1146 6E0D D0 05 bne @+
1147 6E0F BD 0D 44 lda XtanksTableL,x
1148 6E12 C9 36 cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank
1149 6E14 B0 41 @ bcs EndRightFall
1150 6E16 NotRightEdge
1151 ; tank is falling right - modify coorinates
1152 6E16 18 clc
1153 6E17 BD 0D 44 lda XtankstableL,x
1154 6E1A 69 01 adc #1
1155 6E1C 9D 0D 44 sta XtankstableL,x
1156 6E1F BD 13 44 lda XtankstableH,x
1157 6E22 69 00 adc #0
1158 6E24 9D 13 44 sta XtankstableH,x
1159 6E27 A9 80 8D 64 44 mva #%10000000 PreviousFall ; set bit 7 - right
1160 6E2C D0 2C bne EndOfFCycle
1161 6E2E FallingLeft
1162 ; tank is falling left
1163 6E2E 2C 64 44 bit PreviousFall ; bit 7 - right
1164 6E31 30 24 bmi EndLeftFall
1165 ; we finish falling left if the tank reached the edge of the screen
1166 6E33 BD 13 44 lda XtanksTableH,x
1167 6E36 D0 07 bne NotLeftEdge
1168 6E38 BD 0D 44 lda XtanksTableL,x
1169 6E3B C9 03 cmp #3 ; 2 pixels correction due to a barrel wider than tank
1170 6E3D 90 18 bcc EndLeftFall
1171 6E3F NotLeftEdge
1172 ; tank is falling left - modify coorinates
1173 6E3F 38 sec
1174 6E40 BD 0D 44 lda XtankstableL,x
1175 6E43 E9 01 sbc #1
1176 6E45 9D 0D 44 sta XtankstableL,x
1177 6E48 BD 13 44 lda XtankstableH,x
1178 6E4B E9 00 sbc #0
1179 6E4D 9D 13 44 sta XtankstableH,x
1180 6E50 A9 40 8D 64 44 mva #%01000000 PreviousFall ; set bit 6 - left
1181 6E55 D0 03 bne EndOfFCycle
1182 6E57 EndLeftFall
1183 6E57 EndRightFall
1184 6E57 NoLeftOrRight
1185 6E57 EE 65 44 inc EndOfTheFallFlag ; after this is shouldn't fall
1186 6E5A EndOfFCycle
1187 ; draw tank on new position
1188 6E5A 20 2C 6A jsr DrawTankNr ; ew have TankNr in X (I hope :) )
1189 ; checking is parachute present and if so, draw it
1190 6E5D A5 A8 lda Parachute
1191 6E5F C9 03 cmp #3 ; parachute and falling
1192 6E61 D0 06 bne DoNotDrawParachute
1193 ; here we draw parachute
1194 ; ldx TankNr
1195 6E63 20 66 6C jsr DrawTankParachute
1196 6E66 20 89 5A jsr WaitOneFrame ; only if tank with parachute
1197 6E69 RapidFalling
1198 6E69 DoNotDrawParachute
1199 6E69 AD 65 44 lda EndOfTheFallFlag
1200 6E6C D0 03 4C 50 6D jeq TankFallsX
1201 ; Tank falling down already finished, but it is not sure that
1202 ; the horizontal coordinate is even.
1203 ; If it is odd then it must be corrected because otherwise
1204 ; P/M graphics background would not look OK
1205 ; ldx TankNr
1206 ; x correction for P/M
1207 ; --
1208 .IF XCORRECTION_FOR_PM = 1
1209 lda XtanksTableL,x
1210 and #$01
1211 beq EndOfFall ; if it is even then it is the end
1212 ; and if not, we push it one pixel the way it was falling before
1213 lda #%10000000 ; set "virtual ground" for right falling
1214 ldy #%00000001
1215 bit PreviousFall
1216 bmi ForceFallLeft
1217 tay ; tricky - replaces ldy #%10000000
1218 lda #%00000001 ; set "virtual ground" for left falling
1219 ForceFallLeft
1220 sta UnderTank1
1221 sty UnderTank2
1222 jmp TankFallsX
1223 .ENDIF
1224 ; --
1225 6E71 EndOfFall
1226 6E71 A9 01 85 AA mva #1 Erase
1227 ; ldx TankNr
1228 ; if tank was falling down having parachute,
1229 ; we must deduct one parachute
1230 6E75 A5 A8 lda Parachute
1231 6E77 C9 03 cmp #$03 ; was falling down and the parachute
1232 6E79 D0 0C bne NoParachuteWeapon
1233 ; first we check type of parachute
1234 6E7B BD FD 43 lda ActiveDefenceWeapon,x
1235 6E7E C9 23 cmp #ind_Parachute______ ; deactivate weapon only if parachute (54)
1236 6E80 D0 05 bne NoParachuteWeapon
1237 6E82 A9 00 9D FD 43 mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute)
1238 6E87 NoParachuteWeapon
1239 ; now we clear parachute on the screen if present
1240 6E87 A5 A8 lda Parachute
1241 6E89 29 01 and #01
1242 6E8B F0 03 beq ThereWasNoParachute
1243 6E8D 20 66 6C jsr DrawTankParachute
1244 6E90 ThereWasNoParachute
1245 6E90 A9 00 85 AA mva #0 Erase
1246 ; ldx TankNr
1247 6E94 20 2C 6A jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) )
1248 6E97 A9 15 85 9E mva #sfx_silencer sfx_effect
1249 6E9B 60 rts
1250
1251 .endp
1252
1253 ;--------------------------------------------------
1254 6E9C .proc ClearPMmemory
1255 ;--------------------------------------------------
1256
1257 6E9C A9 00 lda #$00
1258 6E9E A8 tay
1259 6E9F 99 00 1B @ sta pmgraph+$300,y
1260 6EA2 99 00 1C sta pmgraph+$400,y
1261 6EA5 99 00 1D sta pmgraph+$500,y
1262 6EA8 99 00 1E sta pmgraph+$600,y
1263 6EAB 99 00 1F sta pmgraph+$700,y
1264 6EAE C8 iny
1265 6EAF D0 EE bne @-
1266 6EB1 60 rts
1267 .endp
1268
1269 ;--------------------------------------------------
1270 6EB2 .proc drawmountains
1271 ;--------------------------------------------------
1272 6EB2 A9 00 85 61 85 62 mwa #0 xdraw
1273 6EB8 A9 3E 85 76 A9 46 + mwa #mountaintable modify
1274 6EC0 A9 01 85 A9 mva #1 color
1275
1276 6EC4 drawmountainsloop
1277 6EC4 A0 00 ldy #0
1278 6EC6 B1 76 lda (modify),y
1279 6EC8 C9 C8 cmp #screenheight
1280 6ECA F0 0F beq NoMountain
1281 6ECC 85 63 sta ydraw
1282 6ECE 84 64 sty ydraw+1
1283 .IF FASTER_GRAF_PROCS = 1
1284 ; there was Drawline proc
1285 lda #screenheight
1286 sec
1287 sbc ydraw
1288 sta tempbyte01
1289 jsr plot.MakePlot
1290 ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit)
1291 ; jmp IntoDraw ; jumps inside Draw routine
1292 ; because one pixel is already plotted (and who cares? :) )
1293 @
1294 lda (xbyte),y
1295 and bittable2,x
1296 sta (xbyte),y
1297 ;IntoDraw
1298 adw xbyte #screenBytes
1299 dec tempbyte01
1300 bne @-
1301 ; end of Drawline proc
1302 .ELSE
1303 ; there was Drawline proc
1304 6ED0 drawline
1305 6ED0 20 2C 76 jsr plot.MakePlot
1306 6ED3 E6 63 inc ydraw
1307 6ED5 A5 63 lda ydraw
1308 6ED7 C9 C8 cmp #screenheight
1309 6ED9 D0 F5 bne drawline
1310 ; end of Drawline proc
1311 .ENDIF
1312 6EDB NoMountain
1313 6EDB E6 76 D0 02 E6 77 inw modify
1314 6EE1 E6 61 D0 02 E6 62 inw xdraw
1315 6EE7 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
1316 6EF1 D0 D1 bne drawmountainsloop
1317 6EF3 60 rts
1318 /*
1319 ;--------------------------------------------------
1320 drawmountainspixel ; never used ?
1321 ;--------------------------------------------------
1322 mwa #0 xdraw
1323 mwa #mountaintable modify
1324 drawmountainspixelloop
1325 ldy #0
1326 lda (modify),y
1327 sta ydraw
1328 sty ydraw+1
1329 jsr plot
1330 inw modify
1331 inw xdraw
1332 cpw xdraw #screenwidth
1333 bne drawmountainspixelloop
1334 rts
1335 */
1335
1336 .endp
1337 ;--------------------------------------------------
1338 6EF4 .proc SoilDown2
1339 ;--------------------------------------------------
1340
1341 ; how it is supposed to work:
1342 ; first loop is looking for the highest pixels
1343 ; and fills with their Y coordinates both temporary tables
1344 ;
1345 ; second (main) loop works this way:
1346 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 )
1347 ; goes through the horizontal line checking if
1348 ; Y coordinate from the first table equals to height of the peak
1349 ; if so, it goes further
1350 ; if not:
1351 ; sets end-of-soil-fall-down-flag to 0
1352 ; increases Y from the first table
1353 ; if there is no pixel there it plots here and
1354 ; zeroes pixel from the second table and after that
1355 ; increases Y of the second table
1356 ; repeats with next pixels au to the end of the line
1357 ; if the flag is 0 then repeat the main loop
1358 ; and that's it :)
1359 ;
1360 ; I am sorry but after these 4 years I have no idea
1361 ; how it works. I have just translated Polish comment
1362 ; but I do not understand a word of it :)
1363 ; If you know how it works, please write here :))))
1364 6EF4 20 0B 6A jsr ClearTanks
1365 6EF7 NoClearTanks
1366
1367 ; Fix for lonely pixel after nuclear winter :) #103
1368 6EF7 A9 00 lda #0
1369 6EF9 85 61 sta xdraw
1370 6EFB 85 62 sta xdraw+1
1371 6EFD 85 63 sta ydraw
1372 6EFF 85 64 sta ydraw+1
1373 6F01 85 A9 sta color
1374 6F03 20 14 76 jsr plot
1375
1376 ; First we look for highest pixels and fill with their coordinates
1377 ; both tables
1378
1379 6F06 A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw
1380 6F0E 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp
1381 6F1B 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2
1382
1383 6F28 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight
1384 6F32 90 03 4C FC 6F jcs NothingToFall
1385
1386 6F37 NextColumn1
1387 6F37 A9 00 85 63 85 64 mwa #0 ydraw
1388 6F3D NextPoint1
1389 6F3D 20 5A 76 jsr point_plot
1390 6F40 F0 0B beq StillNothing
1391 6F42 A0 00 ldy #0
1392 6F44 A5 63 lda ydraw
1393 6F46 91 7E sta (tempor2),y
1394 6F48 91 72 sta (temp),y
1395 6F4A 4C 5D 6F jmp FoundPeek1
1396 6F4D StillNothing
1397 6F4D E6 63 inc ydraw
1398 6F4F A5 63 lda ydraw
1399 6F51 C9 C8 cmp #screenheight
1400 6F53 D0 E8 bne NextPoint1
1401 ; no pixels on whole column !!!
1402 6F55 A0 00 ldy #0
1403 6F57 A5 63 lda ydraw
1404 6F59 91 7E sta (tempor2),y
1405 6F5B 91 72 sta (temp),y
1406 6F5D FoundPeek1
1407 6F5D E6 7E D0 02 E6 7F inw tempor2
1408 6F63 E6 72 D0 02 E6 73 inw temp
1409 6F69 E6 61 D0 02 E6 62 inw xdraw
1410 ;vcmp xdraw,screenwidth,NextColumn1
1411 6F6F A5 62 C5 D5 D0 04 + cpw xdraw RangeRight
1412 6F79 90 BC bcc NextColumn1
1413 6F7B F0 BA beq NextColumn1
1414 ; we have both tables filled with starting values
1415
1416 ; main loop starts here
1417 6F7D MainFallout2
1418 6F7D A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw
1419 6F85 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp
1420 6F92 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2
1421
1422 6F9F A9 01 85 9D mva #1 IsEndOfTheFallFlag
1423 6FA3 FalloutOfLine
1424 6FA3 A0 00 ldy #0
1425
1426 ; is Y coordinate from the first table
1427 ; equal to peak height, if so, go ahead
1428 6FA5 B1 7E lda (tempor2),y
1429 6FA7 C9 C7 cmp #screenheight-1 ;cmp (temp),y
1430 6FA9 B0 2B bcs ColumnIsReady
1431 ; in the other case there are things to be done
1432 6FAB 84 9D sty IsEndOfTheFallFlag ; flag to 0
1433 ; we are increasing Y in the first table
1434 ;lda (tempor2),y
1435 6FAD 18 clc
1436 6FAE 69 01 adc #1
1437 6FB0 91 7E sta (tempor2),y
1438 ; and checking if there is a pixel there
1439 6FB2 85 63 sta ydraw
1440 6FB4 20 5A 76 jsr point_plot
1441 6FB7 D0 1D bne ThereIsPixelHere
1442 ; if no pixel we plot it
1443 6FB9 A9 01 85 A9 mva #1 color
1444 6FBD 20 2C 76 jsr plot.MakePlot
1445 ; zeroing pixel from the second table
1446 ; and increase Y in second table
1447 6FC0 A0 00 ldy #0
1448 6FC2 B1 72 lda (temp),y
1449 6FC4 85 63 sta ydraw
1450 6FC6 B1 72 lda (temp),y
1451 6FC8 18 clc
1452 6FC9 69 01 adc #1
1453 6FCB 91 72 sta (temp),y
1454 6FCD 84 A9 sty color
1455 6FCF 20 2C 76 jsr plot.MakePlot
1456 6FD2 A9 15 85 9E mva #sfx_silencer sfx_effect
1457
1458 6FD6 ThereIsPixelHere
1459 6FD6 ColumnIsReady
1460 6FD6 E6 72 D0 02 E6 73 inw temp
1461 6FDC E6 7E D0 02 E6 7F inw tempor2
1462 6FE2 E6 61 D0 02 E6 62 inw xdraw
1463 ;vcmp xdraw,screenwidth,FalloutOfLine
1464 6FE8 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight
1465 6FF2 90 AF bcc FalloutOfLine
1466 6FF4 F0 AD beq FalloutOfLine
1467
1468 6FF6 A5 9D lda IsEndOfTheFallFlag
1469 ; we repeat untill at some point first table reaches
1470 ; level of the mountains
1471 6FF8 F0 83 jeq MainFallout2
1472 ; now correct heights are in the mountaintable
1473 6FFA 85 A9 sta color ; Pozor! :) we know - now A=1
1474 6FFC NothingToFall
1475 6FFC A9 15 85 9E mva #sfx_silencer sfx_effect
1476 7000 20 12 6A jsr DrawTanks
1477 7003 60 rts
1478 .endp
1479
1480 ;--------------------------------------------------
1481 7004 .proc calculatemountains
1482 ;--------------------------------------------------
1483 7004 A9 00 85 61 85 62 mwa #0 xdraw
1484
1485 ; starting point
1486 700A getrandomY ;getting random Y coordinate
1487 700A 38 sec
1488 700B AD 1B D4 lda random
1489 700E C9 28 cmp #screenheight-(margin*4) ;it means that max line=199
1490 7010 B0 F8 bcs getrandomY
1491 7012 18 clc
1492 7013 69 50 adc #(margin*2)
1493 7015 85 63 sta ydraw
1494 7017 8D D3 44 sta yfloat+1
1495 701A A9 00 8D D2 44 mva #0 yfloat ;yfloat equals to e.g. 140.0
1496 701F A9 9B 8D D3 44 mva #screenheight-margin-5 yfloat+1
1497 7024 85 63 sta ydraw
1498
1499 ; how to make nice looking mountains?
1500 ; randomize points and join them with lines
1501 ; Here we do it simpler way - we randomize X (or deltaX)
1502 ; and "delta" (change of Y coordinate)
1503
1504 7026 NextPart
1505 7026 AD 1B D4 lda random
1506 7029 2D 4B 41 and mountainDeltaL
1507 702C 85 C3 sta delta ; it is after the dot (xxx.delta)
1508 702E AD 1B D4 lda random
1509 7031 2D 4A 41 and mountainDeltaH ;(max delta)
1510 7034 85 C4 sta delta+1 ; before the dot (delta+1.delta)
1511
1512 7036 AD 1B D4 lda random
1513 7039 29 01 and #$01 ;random sign (+/- or up/down)
1514 703B 8D D5 44 sta UpNdown
1515
1516 ; theoretically we have here ready
1517 ; fixed-point delta value
1518 ; (-1*(UpNdown))*(delta+1.delta)
1519
1520 ;loop drawing one line
1521
1522 703E ChangingDirection
1523 703E AD 1B D4 lda random ;length of the line
1524 7041 29 0F and #$0f ;max line length
1525 7043 AA tax
1526 7044 E8 inx
1527 7045 E8 inx
1528 7046 E8 inx
1529 7047 8E D4 44 stx deltaX
1530
1531 704A OnePart
1532 704A 20 E6 69 jsr placeTanks.CheckTank
1533 ; checks if at a given X coordinate
1534 ; is any tank and if so
1535 ; changes parameters of drawing
1536 ; to generate flat 8 pixels
1537 ; (it will be the place for the tank)
1538 ; it also stores Y position of the tank
1539 704D 18 A5 61 69 3E 85 + adw xdraw #mountaintable modify
1540
1541 705A A5 63 lda ydraw
1542 705C A0 00 ldy #0
1543 705E 91 76 sta (modify),y
1544
1545 ; Up or Down
1546 7060 AD D5 44 lda UpNdown
1547 7063 F0 20 beq ToBottom
1548
1549 7065 ToTop ;it means substracting
1550
1551 7065 38 AD D2 44 E5 C3 + sbw yfloat delta
1552 7076 AD D3 44 lda yfloat+1
1553 7079 C9 28 cmp #margin
1554 707B B0 25 bcs @+
1555 ; if smaller than 10
1556 707D A2 00 ldx #$00
1557 707F 8E D5 44 stx UpNdown
1558 7082 4C A2 70 jmp @+
1559
1560 7085 ToBottom
1561 7085 18 AD D2 44 65 C3 + adw yfloat delta
1562 7096 AD D3 44 lda yfloat+1
1563 7099 C9 A0 cmp #screenheight-margin
1564 709B 90 05 bcc @+
1565 ; if higher than screen
1566 709D A2 01 ldx #$01
1567 709F 8E D5 44 stx UpNdown
1568 @
1569 70A2 85 63 sta ydraw
1570
1571 70A4 E6 61 D0 02 E6 62 inw xdraw
1572
1573 70AA A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
1574 70B4 F0 08 beq EndDrawing
1575
1576 70B6 CE D4 44 dec deltaX
1577 70B9 D0 8F bne OnePart
1578
1579 70BB 4C 26 70 jmp NextPart
1580 70BE EndDrawing
1581
1582 70BE 60 rts
1583 .endp
1584
1585 /*
1586 ;--------------------------------------------------
1587 .proc calculatemountains0
1588 ; Only for testing - makes ground flat (0 pixels)
1589 ; and places tanks on it
1590 ; remember to remove in final compilation :)
1591 ;--------------------------------------------------
1592 mwa #0 xdraw
1593 nextPointDrawing
1594 adw xdraw #mountaintable modify
1595 lda #screenheight
1596 ldy #0
1597 sta (modify),y
1598 inw xdraw
1599 cpw xdraw #screenwidth
1600 bne nextPointDrawing
1601 ldx NumberOfPlayers
1602 dex
1603 SetYofNextTank
1604 lda #screenheight-1
1605 sta ytankstable,x
1606 dex
1607 bpl SetYofNextTank
1608 rts
1609 .endp
1610 */
1610
1611
1612 ;--------------------------------------------------
1613 70BF .proc CheckMaxMountain
1614 ; in A return y coordinate of highest mountain
1615 ;--------------------------------------------------
1616 70BF A9 3E 85 76 A9 46 + mwa #mountaintable modify
1617 70C7 A0 00 ldy #0
1618 70C9 A2 C7 ldx #screenheight-1
1619 70CB nextPointChecking
1620 70CB 8A txa
1621 70CC D1 76 cmp (modify),y
1622 70CE 90 03 bcc NotHigher
1623 70D0 B1 76 lda (modify),y
1624 70D2 AA tax
1625 70D3 NotHigher
1626 70D3 E6 76 D0 02 E6 77 inw modify
1627 70D9 A5 77 C9 47 D0 04 + cpw modify #(mountaintable+screenwidth)
1628 70E3 D0 E6 bne nextPointChecking
1629 70E5 8A txa
1630 70E6 60 rts
1631 .endp
1632
1633
1634 ;--------------------------------------------------
1635 70E7 .proc TypeChar
1636 ; puts char on the graphics screen
1637 ; in: CharCode
1638 ; in: left LOWER corner of the char coordinates (xdraw, ydraw)
1639 ;--------------------------------------------------
1640 ; char to the table
1641 70E7 A5 69 lda CharCode
1642 70E9 85 6A sta fontind
1643 70EB A9 00 lda #$00
1644 70ED 85 6B sta fontind+1
1645 ; char intex times 8
1646 70EF aslw fontind
Macro: ASLW [Source: MACRO.ASM]
1 70EF 06 6A ASL FONTIND
2 70F1 26 6B ROL FONTIND+1
Source: grafproc.asm
1647 70F3 rolw fontind
Macro: ROLW [Source: MACRO.ASM]
1 70F3 26 6A ROL FONTIND
2 70F5 26 6B ROL FONTIND+1
Source: grafproc.asm
1648 70F7 rolw fontind
Macro: ROLW [Source: MACRO.ASM]
1 70F7 26 6A ROL FONTIND
2 70F9 26 6B ROL FONTIND+1
Source: grafproc.asm
1649
1650 70FB 18 A5 6A 69 46 85 + adw fontind #TankFont
1651
1652 ; and 8 bytes to the table
1653 7108 A0 07 ldy #7
1654 710A CopyChar
1655 710A B1 6A lda (fontind),y
1656 710C 49 FF eor #$ff
1657 710E 99 C0 44 sta char1,y
1658 7111 A9 FF lda #$ff
1659 7113 99 C8 44 sta char2,y
1660 7116 88 dey
1661 7117 10 F1 bpl CopyChar
1662 ; and 8 subsequent bytes as a mask
1663 7119 18 A5 6A 69 08 85 + adw fontind #8
1664 7124 A0 07 ldy #7
1665 7126 CopyMask
1666 7126 B1 6A lda (fontind),y
1667 7128 49 FF eor #$ff
1668 712A 99 B0 44 sta mask1,y
1669 712D A9 00 lda #$00
1670 712F 99 B8 44 sta mask2,y
1671 7132 88 dey
1672 7133 10 F1 bpl CopyMask
1673
1674 .IF FASTER_GRAF_PROCS = 1
1675 ; calculating coordinates from xdraw and ydraw
1676 mwa xdraw xbyte
1677
1678 lda xbyte
1679 and #$7
1680 sta ybit
1681
1682 lsrw xbyte ; div 8
1683 rorw xbyte
1684 rorw xbyte
1685 ;---
1686 ldy xbyte
1687
1688 lda ydraw ; y = y - 7 because left lower. shouldn't it be 8?
1689 sec
1690 sbc #7
1691 tax
1692
1693 lda linetableL,x
1694 sta xbyte
1695 lda linetableH,x
1696 sta xbyte+1
1697 ; mask preparation and character shifting
1698 ldx ybit
1699 beq MaskOK00
1700 MakeMask00
1701 .rept 8
1702 lsr mask1+#
1703 ror mask2+#
1704 .endr
1705 sec
1706 .rept 8
1707 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
1708 ror char2+#
1709 .endr
1710 dex
1711 bne MakeMask00
1712 MaskOK00
1713 ; here x=0
1714 lda Erase
1715 beq CharLoopi ; it works, because x=0
1716 lda #$ff
1717 ldx #7
1718 EmptyChar
1719 sta char1,x
1720 sta char2,x
1721 dex
1722 bpl EmptyChar
1723 ldx #0
1724 CharLoopi
1725 lda (xbyte),y
1726 ora mask1,x
1727 and char1,x
1728 sta (xbyte),y
1729 iny
1730 lda (xbyte),y
1731 ora mask2,x
1732 and char2,x
1733 sta (xbyte),y
1734 dey
1735 adw xbyte #screenBytes
1736 inx
1737 cpx #8
1738 bne CharLoopi
1739 .ELSE
1740 7135 A2 07 86 72 mvx #7 temp ; line counter (Y)
1741 7139 CharLoop1
1742 7139 A9 07 85 73 mva #7 temp+1 ; pixel counter (X)
1743 713D CharLoop2
1744 713D A9 00 85 A9 mva #0 color
1745 7141 3E B0 44 rol mask1,x
1746 7144 90 38 bcc NoMaskNoPlot
1747 7146 3E C0 44 rol char1,x
1748 7149 B0 06 bcs NoPlot
1749 714B MakeCharPlot
1750 714B A5 AA lda Erase
1751 714D D0 02 bne ErasingChar
1752 714F E6 A9 inc color
1753 7151 ErasingChar
1754 7151 NoPlot
1755 7151 20 2C 76 jsr plot.MakePlot
1756 7154 AfterCharPlot
1757 7154 E6 61 D0 02 E6 62 inw xdraw
1758 715A A6 72 ldx temp
1759 715C C6 73 dec temp+1
1760 715E 10 DD bpl CharLoop2
1761 7160 38 sec
1762 7161 38 A5 61 E9 08 85 + sbw xdraw #8
1763 716C C6 63 dec ydraw
1764 716E A6 72 ldx temp
1765 7170 CA dex
1766 7171 86 72 stx temp
1767 7173 10 C4 bpl CharLoop1
1768 7175 18 clc
1769 7176 A5 63 lda ydraw
1770 7178 69 08 adc #8
1771 717A 85 63 sta ydraw
1772 717C D0 06 bne EndPutChar
1773 717E NoMaskNoPlot
1774 717E 3E C0 44 rol char1,x
1775 7181 4C 54 71 jmp AfterCharPlot
1776 .ENDIF
1777 7184 EndPutChar
1778 7184 60 rts
1779 .endp
1780
1781 ;--------------------------------------------------
1782 7185 .proc PutChar4x4
1783 ; puts 4x4 pixels char on the graphics screen
1784 ; in: dx, dy (LOWER left corner of the char)
1785 ; in: CharCode4x4 (.sbyte)
1786 ; in: plot4x4color (0/255)
1787 ; all pixels are being drawn
1788 ; (empty and not empty)
1789 ;--------------------------------------------------
1790 7185 A5 8E C9 00 D0 04 + cpw dy #(screenheight-1)
1791 718F B0 F3 jcs TypeChar.EndPutChar ;nearest RTS
1792 7191 A5 8E C9 00 D0 04 + cpw dy #(4)
1793 719B 90 E7 jcc TypeChar.EndPutChar ;nearest RTS
1794 719D A5 8C C9 01 D0 04 + cpw dx #(screenwidth-4)
1795 71A7 B0 DB jcs TypeChar.EndPutChar ;nearest RTS
1796 ; checks ommited.
1797 ; char to the table
1798 71A9 AD EC 48 lda CharCode4x4
1799 71AC 29 01 and #%00000001
1800 71AE F0 02 beq Upper4bits
1801 71B0 A9 FF lda #$ff ; better option to check (nibbler4x4 = $00 or $ff)
1802 71B2 Upper4bits
1803 71B2 8D EB 48 sta nibbler4x4
1804 71B5 AD EC 48 lda CharCode4x4
1805 71B8 4A lsr
1806 71B9 85 6A sta fontind
1807 71BB A9 00 lda #$00
1808 71BD 85 6B sta fontind+1
1809
1810 71BF 18 A5 6A 69 C6 85 + adw fontind #font4x4
1811
1812 ; and 4 bytes to the table
1813 71CC A0 00 ldy #0
1814 71CE A2 03 ldx #3
1815 71D0 CopyChar
1816 71D0 B1 6A lda (fontind),y ; Y must be 0 !!!!
1817 71D2 2C EB 48 bit nibbler4x4
1818 71D5 10 04 bpl GetUpper4bits
1819 71D7 2A 2A 2A 2A :4 rol
1820 71DB GetUpper4bits
1821 71DB 09 0F ora #$0f
1822 71DD 9D C0 44 sta char1,x
1823 71E0 A9 FF lda #$ff
1824 71E2 9D C8 44 sta char2,x
1825 ; and 4 bytes as a mask
1826 71E5 A9 F0 lda #$f0
1827 71E7 9D B0 44 sta mask1,x
1828 71EA A9 00 lda #$00
1829 71EC 9D B8 44 sta mask2,x
1830 71EF 18 A5 6A 69 20 85 + adw fontind #32 ; next byte of 4x4 font
1831 71FA CA dex
1832 71FB 10 D3 bpl CopyChar
1833
1834 .IF FASTER_GRAF_PROCS = 1
1835 ; calculating coordinates from xdraw and ydraw
1836 mwa dx xbyte
1837
1838 lda xbyte
1839 and #$7
1840 sta ybit
1841
1842 :3 lsrw xbyte ; div 8
1843 ; rorw xbyte
1844 ; rorw xbyte
1845 ;---
1846 ldy xbyte ; horizontal byte offet stored in Y
1847 lda dy ; y = y - 3 because left lower.
1848 sec
1849 sbc #3
1850 tax
1851
1852 lda linetableL,x
1853 sta xbyte
1854 lda linetableH,x
1855 sta xbyte+1
1856 ; mask preparation and character shifting
1857 ldx ybit
1858 beq MaskOK01
1859 MakeMask01
1860 .rept 4
1861 lsr mask1+#
1862 ror mask2+#
1863 .endr
1864 sec
1865 .rept 4
1866 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough
1867 ror char2+#
1868 .endr
1869 dex
1870 bne MakeMask01
1871 MaskOK01
1872 ldx #0
1873 CharLoopi4x4
1874 lda (xbyte),y
1875 ora mask1,x
1876 bit plot4x4color
1877 bpl PutInColor0_1 ; only mask - no char
1878 and char1,x
1879 PutInColor0_1
1880 sta (xbyte),y
1881 iny
1882 lda (xbyte),y
1883 ora mask2,x
1884 bit plot4x4color
1885 bpl PutInColor0_2 ; only mask - no char
1886 and char2,x
1887 PutInColor0_2
1888 sta (xbyte),y
1889 dey
1890 adw xbyte #screenBytes
1891 inx
1892 cpx #4
1893 bne CharLoopi4x4
1894 .ELSE
1895 71FD A5 61 8D C8 44 A5 + mwa xdraw char2
1896 7207 A5 63 8D B8 44 A5 + mwa ydraw mask2
1897 7211 A5 A9 8D BA 44 mva color mask2+2
1898 7216 A5 8B 85 61 A5 8C + mwa dx xdraw
1899 721E A5 8D 85 63 A5 8E + mwa dy ydraw
1900 7226 A2 03 86 72 mvx #3 temp ; line counter (Y)
1901 722A CharLoop1
1902 722A A9 03 85 73 mva #3 temp+1 ; pixel counter (X)
1903 722E CharLoop2
1904 722E A9 00 85 A9 mva #0 color
1905 7232 3E B0 44 rol mask1,x
1906 7235 90 4A bcc NoMaskNoPlot
1907 7237 3E C0 44 rol char1,x
1908 723A B0 06 bcs NoPlot
1909 723C MakeCharPlot
1910 723C A5 DB lda plot4x4color
1911 723E F0 02 beq ErasingChar
1912 7240 E6 A9 inc color
1913 7242 ErasingChar
1914 7242 NoPlot
1915 7242 20 2C 76 jsr plot.MakePlot
1916 7245 AfterCharPlot
1917 7245 E6 61 D0 02 E6 62 inw xdraw
1918 724B A6 72 ldx temp
1919 724D C6 73 dec temp+1
1920 724F 10 DD bpl CharLoop2
1921 7251 38 sec
1922 7252 38 A5 61 E9 04 85 + sbw xdraw #4
1923 725D C6 63 dec ydraw
1924 725F A6 72 ldx temp
1925 7261 CA dex
1926 7262 86 72 stx temp
1927 7264 10 C4 bpl CharLoop1
1928 7266 AD C8 44 85 61 AD + mwa char2 xdraw
1929 7270 AD B8 44 85 63 AD + mwa mask2 ydraw
1930 727A AD BA 44 85 A9 mva mask2+2 color
1931 727F 10 06 bpl EndPut4x4
1932 7281 NoMaskNoPlot
1933 7281 3E C0 44 rol char1,x
1934 7284 4C 45 72 jmp AfterCharPlot
1935 .ENDIF
1936 7287 EndPut4x4
1937 7287 60 rts
1938 .endp
1939
1940 ;--------------------------------------------------------
1941 7288 .proc DisplayOffensiveTextNr ;
1942 7288 AE C0 48 ldx TextNumberOff
1943 728B BD 2B 9F lda talk.OffensiveTextTableL,x
1944 728E 85 B3 sta LineAddress4x4
1945 7290 BD A0 9F lda talk.OffensiveTextTableH,x
1946 7293 85 B4 sta LineAddress4x4+1
1947 7295 E8 inx ; the next text
1948 7296 BD A0 9F lda talk.OffensiveTextTableH,x
1949 7299 85 73 sta temp+1
1950 729B BD 2B 9F lda talk.OffensiveTextTableL,x
1951 729E 85 72 sta temp ; opty possible
1952 ; substract address of the next text from previous to get text length
1953 72A0 38 A5 72 E5 B3 85 + sbw temp LineAddress4x4 temp2
1954 72AD A5 74 85 83 mva temp2 fx
1955
1956 ;jsr Display4x4AboveTank
1957 ;rts
1958 ; POZOR !!!
1959 .endp
1960
1961 ;--------------------------------------------------------
1962 72B1 .proc Display4x4AboveTank ;
1963 ; Displays texts using PutChar4x4 above tank and mountains.
1964 ; Pretty cool, eh!
1965 ;parameters are:
1966 ;Y - number of tank above which text is displayed
1967 ;fx - length of text
1968 ;LineAddress4x4 - address of the text
1969
1970 ;lets calculate position of the text first!
1971 ;that's easy because we have number of tank
1972 ;and xtankstableL and H keep X position of a given tank
1973
1974 72B1 B9 0D 44 lda xtankstableL,y
1975 72B4 85 72 sta temp
1976 72B6 B9 13 44 lda xtankstableH,y
1977 72B9 85 73 sta temp+1
1978 ;now we should substract length of the text-1
1979 ;temp2 = (fx-1)*2
1980 72BB A4 83 ldy fx
1981 72BD 88 dey
1982 72BE 98 tya
1983 72BF 0A asl
1984 72C0 85 74 sta temp2
1985 72C2 A9 00 85 75 mva #0 temp2+1
1986 ;now we have HALF length in pixels
1987 ;stored in temp2
1988
1989 ;here we assume max length of text
1990 ;to display is 127 chars, but later it turns out it must be max 63!
1991
1992 72C6 38 A5 72 E5 74 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!!
1993 ;now we should check overflows
1994 ;lda temp+1 ; opty
1995 72D3 10 08 bpl DOTNnotLessThanZero
1996 ;less than zero, so should be zero
1997 72D5 A9 00 85 72 85 73 mwa #0 temp
1998 72DB F0 32 beq DOTNnoOverflow
1999
2000 72DD DOTNnotLessThanZero
2001 ;so check if end larger than screenwidth
2002
2003
2004 72DD A5 83 lda fx
2005 72DF 0A asl
2006 72E0 0A asl
2007 ;length in pixels -
2008 ;text length max 63 chars !!!!!!!!
2009
2010
2011 72E1 18 clc
2012 72E2 65 72 adc temp
2013 72E4 85 74 sta temp2
2014 72E6 A9 00 lda #0
2015 72E8 65 73 adc temp+1
2016 72EA 85 75 sta temp2+1
2017 ;now in temp2 is end of the text in pixels
2018 ;so check if not greater than screenwitdth
2019 72EC A5 75 C9 01 D0 04 + cpw temp2 #screenwidth
2020 72F6 90 17 bcc DOTNnoOverflow
2021
2022 ;if end is greater than screenwidth
2023 ;then screenwidth - length is fine
2024 72F8 A5 83 lda fx
2025 72FA 0A asl
2026 72FB 0A asl
2027 72FC 85 72 sta temp
2028 72FE A9 00 85 73 mva #0 temp+1
2029
2030 7302 38 sec
2031 7303 A9 3F lda #<(screenwidth-1)
2032 7305 E5 72 sbc temp
2033 7307 85 72 sta temp
2034 7309 A9 01 lda #>(screenwidth-1)
2035 730B E5 73 sbc temp+1
2036 730D 85 73 sta temp+1
2037 730F DOTNnoOverflow
2038 ;here in temp we have really good x position of text
2039
2040 730F A5 72 85 D9 A5 73 + mwa temp LineXdraw
2041
2042 ;now let's get y position
2043 ;we will try to put text as low as possible
2044 ;just above mountains (so mountaintable will be checked)
2045 7317 A5 83 lda fx
2046 7319 0A asl
2047 731A 0A asl
2048 731B A8 tay
2049 ;in temp there still is X position of text
2050 ;if we add temp and Y we will get end of the text
2051 ;so, lets go through mountaintable and look for
2052 ;the lowest value within
2053 ;Mountaitable+temp and Mountaitable+temp+Y
2054
2055 731C 18 A5 72 69 3E 85 + adw temp #MountainTable
2056
2057 7329 A9 C8 85 74 mva #screenheight temp2 ;initialisation of the lowest value
2058
2059 732D DOTLowestMountainValueLoop
2060 732D B1 72 lda (temp),y
2061 732F C5 74 cmp temp2
2062 7331 B0 02 bcs DOTOldLowestValue ;old lowest value
2063 ;new lowest value
2064 7333 85 74 sta temp2
2065 7335 DOTOldLowestValue
2066 7335 88 dey
2067 7336 C0 FF cpy #$ff
2068 7338 D0 F3 bne DOTLowestMountainValueLoop
2069
2070 733A 38 sec
2071 733B A5 74 lda temp2
2072 733D E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...)
2073 733F 85 D8 sta LineYdraw
2074
2075 7341 4C 76 73 jmp TypeLine4x4.noLengthNoColor ; rts
2076
2077 .endp
2078
2079 ;--------------------------------------------------------
2080 7344 .proc DisplayTankNameAbove ;
2081 7344 A5 6C lda tankNr
2082 7346 0A 0A 0A :3 asl ; *8
2083 7349 18 clc
2084 734A 69 09 adc #<TanksNames
2085 734C 85 72 sta temp ; TextAddress
2086 734E A9 00 lda #0
2087 7350 69 41 adc #>Tanksnames
2088 7352 85 73 sta temp+1 ; TextAddress+1
2089 7354 A5 72 85 B3 A5 73 + mwa temp LineAddress4x4
2090
2091 ;find length of the tank's name
2092 735C A0 07 ldy #7
2093 @
2094 735E B1 72 lda (temp),y
2095 7360 D0 03 bne end_found
2096 7362 88 dey
2097 7363 D0 F9 bne @-
2098
2099 7365 end_found
2100 7365 C8 iny
2101 7366 84 83 sty fx
2102 7368 A4 6C ldy tankNr
2103 736A 20 B1 72 jsr Display4x4AboveTank
2104 736D 60 rts
2105 .endp
2106
2107 ;-------------------------------
2108 736E .proc TypeLine4x4 ;
2109 ;-------------------------------
2110 ;this routine prints line of length `fx`
2111 ;address in LineAddress4x4
2112 ;starting from LineXdraw, LineYdraw
2113
2114 736E A9 0E lda #14 ; default length of 4x4 texts
2115 7370 85 83 sta fx
2116
2117 7372 variableLength
2118 7372 A9 FF lda #$ff ; $ff - visible characters, $00 - clearing
2119
2120 7374 staplot4x4color
2121 7374 85 DB sta plot4x4color
2122 7376 noLengthNoColor
2123
2124 7376 A0 00 ldy #0
2125 7378 8C E9 48 sty LineCharNr
2126
2127 737B TypeLine4x4Loop
2128 737B AC E9 48 ldy LineCharNr
2129
2130 737E B1 B3 lda (LineAddress4x4),y
2131 7380 29 3F and #$3f ;always CAPITAL letters
2132 7382 8D EC 48 sta CharCode4x4
2133 7385 A5 D9 85 8B A5 DA + mwa LineXdraw dx
2134 738D A5 D8 85 8D mva LineYdraw dy
2135 7391 A9 00 85 8E mva #0 dy+1 ; dy is 2 bytes value
2136 7395 20 85 71 jsr PutChar4x4 ;type empty pixels as well!
2137 7398 18 A5 D9 69 04 85 + adw LineXdraw #4
2138 73A3 EE E9 48 AD E9 48 inc:lda LineCharNr
2139 73A9 C5 83 cmp fx
2140 73AB D0 CE bne TypeLine4x4Loop
2141
2142 73AD EndOfTypeLine4x4
2143 73AD 60 rts
2144 .endp
2145
2146
2147 ;--------------------------------
2148 73AE .proc AreYouSure
2149 ;using 4x4 font
2150
2151 73AE A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen
2152
2153 ;top frame
2154 73B2 A5 B2 85 D8 mva ResultY LineYdraw
2155 73B6 20 E8 65 jsr TL4x4_top
2156 73B9 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
2157
2158 ;sure?
2159 73C0 A9 5D 85 B3 A9 5B + mwa #areYouSureText LineAddress4x4
2160 73C8 20 02 74 jsr _sep_opty
2161 ;bottom frame
2162 73CB A5 B2 85 D8 mva ResultY LineYdraw
2163 73CF 20 D5 65 jsr TL4x4_bottom
2164
2165
2166 73D2 20 5F 5A jsr GetKey
2167 73D5 C9 2B cmp #@kbcode._Y ; $2b ; "Y"
2168 73D7 D0 06 bne @+
2169 73D9 A9 80 85 D7 mva #$80 escFlag
2170 73DD D0 04 bne skip01
2171 73DF A9 00 85 D7 @ mva #0 escFlag
2172 73E3 skip01
2173 73E3 20 71 5A jsr WaitForKeyRelease
2174
2175 ;clean
2176 73E6 A9 03 85 91 mva #3 di
2177 73EA A9 04 85 B2 mva #4 ResultY
2178 @
2179 73EE A9 FF 85 DB mva #$ff plot4x4color
2180 73F2 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4
2181 73FA 20 02 74 jsr _sep_opty
2182 73FD C6 91 dec di
2183 73FF D0 ED bne @-
2184
2185 7401 quit_areyousure
2186 7401 60 rts
2187 .endp
2188
2189 7402 .proc _sep_opty
2190 7402 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering
2191 740A A5 B2 85 D8 mva ResultY LineYdraw
2192 740E 20 6E 73 jsr TypeLine4x4
2193 7411 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
2194 7418 60 rts
2195 .endp
2196
2197 ;--------------------------------
2198 7419 .proc DisplaySeppuku
2199 ;using 4x4 font
2200
2201
2202 7419 A9 14 85 89 mva #20 fs ; temp, how many times blink the billboard
2203 741D seppuku_loop
2204 741D A5 02 lda CONSOL ; turbo mode
2205 741F 29 01 and #%00000001 ; START KEY
2206 7421 D0 04 A9 01 85 89 sne:mva #1 fs ; finish it
2207
2208 7427 A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen
2209
2210 ;top frame
2211 742B A5 B2 85 D8 mva ResultY LineYdraw
2212 742F 20 E8 65 jsr TL4x4_top
2213 7432 A5 B2 18 69 04 85 + adb ResultY #4 ;next line
2214
2215 ;seppuku
2216 7439 A9 4F 85 B3 A9 5B + mwa #seppukuText LineAddress4x4
2217 7441 20 02 74 jsr _sep_opty
2218
2219 ;bottom frame
2220 7444 A5 B2 85 D8 mva ResultY LineYdraw
2221 7448 20 D5 65 jsr TL4x4_bottom ; just go
2222
2223 ;clean seppuku
2224
2225 744B A9 03 85 91 mva #3 di
2226 ;mva #4 ResultY
2227 744F A9 04 lda #4
2228 7451 85 B2 sta ResultY
2229 7453 loplop ;@
2230 7453 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4
2231 745B 20 02 74 jsr _sep_opty
2232
2233 745E C6 91 dec di
2234 7460 D0 F1 bne loplop ;@-
2235
2236 7462 C6 89 dec fs
2237 7464 D0 B7 jne seppuku_loop
2238
2239 7466 quit_seppuku
2240 7466 60 rts
2241
2242 .endp
2243
2244 ; -------------------------------------
2245 7467 .proc SetupXYdraw
2246 7467 BD 19 44 lda ytankstable,x
2247 746A 85 63 sta ydraw
2248 746C A9 00 85 64 mva #0 ydraw+1
2249 7470 BD 0D 44 X lda XtanksTableL,x
2250 7473 85 61 sta xdraw
2251 7475 BD 13 44 lda XtanksTableH,x
2252 7478 85 62 sta xdraw+1
2253 747A 60 rts
2254 .endp
2255 ;--------------------------------------------------
2256 747B .proc DrawBarrel
2257 ; X - tankNr
2258 ; changes xdraw, ydraw, fx, fy
2259 ;--------------------------------------------------
2260 ;vx calculation
2261 ;vx = sin(90-Angle) for Angle <=90
2262 ;vx = -sin(Angle-90) for 90 < Angle <= 180
2263
2264 ; erase previous barrel
2265
2266 ;cos(Angle) (but we use sin table only so some shenanigans happen)
2267 ; mva #0 color
2268 ; lda previousBarrelAngle,x
2269 ; sta Angle
2270 ; jsr DrawBarrelTech
2271 ;
2272 ; mva #1 color
2273 747B A6 6C ldx TankNr
2274 747D 20 67 74 jsr SetupXYdraw
2275 7480 BD F1 43 lda BarrelLength,x
2276 7483 85 8A sta yc ; current tank barrel length
2277 7485 BD C3 48 lda angleTable,x
2278 7488 85 A7 sta Angle
2279 748A 20 8E 74 jsr DrawBarrelTech
2280 748D 60 rts
2281 .endp
2282
2283 748E .proc DrawBarrelTech
2284 ; angle in Angle and A
2285
2286 748E A2 00 86 E6 mvx #0 goleft
2287 7492 C9 5B cmp #91
2288 7494 90 17 bcc angleUnder90
2289
2290 ;over 90
2291 7496 38 sec
2292 7497 E9 5A sbc #90
2293 7499 AA tax
2294 ; barrel start offset over 90deg
2295 749A 18 A5 61 69 04 85 + adw xdraw #4 xdraw
2296 74A7 A9 01 85 E6 mva #1 goleft
2297 74AB 10 13 bpl @+ ; jmp @+
2298
2299 74AD angleUnder90
2300 74AD 38 sec ; X = 90-Angle
2301 74AE A9 5A lda #90
2302 74B0 E5 A7 sbc Angle
2303 74B2 AA tax
2304 ; barrel start offset under 90deg
2305 74B3 18 A5 61 69 03 85 + adw xdraw #3 xdraw
2306
2307 @
2308 74C0 38 A5 63 E9 03 85 + sbw ydraw #3 ydraw
2309 74CD BD C1 5B lda sintable,x ; cos(X)
2310 74D0 85 BB sta vx
2311
2312 ;======vy
2313 ;vy = sin(Angle) for Angle <=90
2314 ;vy = sin(180-Angle) for 90 < Angle <= 180
2315
2316 ;--
2317 74D2 A5 A7 lda Angle
2318 74D4 C9 5B cmp #91
2319 74D6 90 05 bcc YangleUnder90
2320
2321 74D8 A9 B4 lda #180
2322 74DA 38 sec
2323 74DB E5 A7 sbc Angle
2324 74DD YangleUnder90
2325 74DD AA tax
2326 74DE BD C1 5B lda sintable,x
2327 74E1 85 B7 sta vy
2328
2329 74E3 A9 00 lda #0 ; all arithmetic to zero
2330 74E5 85 BC sta vx+1
2331 74E7 85 B8 sta vy+1
2332 74E9 A9 80 lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus)
2333 74EB 85 83 sta fx
2334 74ED 85 86 sta fy
2335
2336 ; draw by vx vy
2337 ; in each step
2338 ; 1. plot(xdraw, ydraw)
2339 ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy
2340 ; 3 check length, if shorter, go to 1.
2341
2342 ; mva #6 yc ; barrel length
2343 74EF barrelLoop
2344
2345 74EF A5 E6 lda goleft
2346 74F1 D0 16 bne goright
2347 74F3 18 clc
2348 74F4 A5 83 lda fx
2349 74F6 65 BB adc vx
2350 74F8 85 83 sta fx
2351 74FA 90 0A bcc @+
2352 74FC A5 61 lda xdraw
2353 74FE 65 BC adc vx+1
2354 7500 85 61 sta xdraw
2355 7502 90 02 bcc @+
2356 7504 E6 62 inc xdraw+1
2357 @
2358 7506 4C 1C 75 jmp ybarrel
2359 7509 goright
2360 7509 38 sec
2361 750A A5 83 lda fx
2362 750C E5 BB sbc vx
2363 750E 85 83 sta fx
2364 7510 B0 0A bcs @+
2365 7512 A5 61 lda xdraw
2366 7514 E5 BC sbc vx+1
2367 7516 85 61 sta xdraw
2368 7518 B0 02 bcs @+
2369 751A C6 62 dec xdraw+1
2370 @
2371 751C ybarrel
2372 751C 38 sec
2373 751D A5 86 lda fy
2374 751F E5 B7 sbc vy
2375 7521 85 86 sta fy
2376 7523 B0 0A bcs @+
2377 7525 A5 63 lda ydraw
2378 7527 E5 B8 sbc vy+1
2379 7529 85 63 sta ydraw
2380 752B B0 02 bcs @+
2381 752D C6 64 dec ydraw+1
2382 @
2383 752F 20 14 76 jsr plot ;.MakePlot
2384
2385 7532 C6 8A dec yc
2386 7534 D0 B9 bne barrelLoop
2387
2388 7536 A5 61 8D C9 48 A5 + mwa xdraw EndOfTheBarrelX
2389 7540 A5 63 8D CB 48 mva ydraw EndOfTheBarrelY
2390
2391 7545 60 rts
2392 .endp
2393 ;--------------------------------------------------
2394 7546 .proc PMoutofScreen
2395 ;--------------------------------------------------
2396 7546 A9 00 lda #$00 ; let all P/M disappear
2397 7548 A0 07 ldy #7
2398 754A 99 02 00 @ sta hposp0,y
2399 754D 88 dey
2400 754E 10 FA bpl @-
2401 ;:8 sta hposp0+# ; optimized... but Y!
2402 7550 60 rts
2403 .endp
2404 ;--------------------------------------------------
2405 7551 .proc ColorsOfSprites
2406 7551 A0 03 ldy #3
2407 7553 B9 79 5B @ lda TankColoursTable,y ; colours of sprites under tanks
2408 7556 99 02 00 sta PCOLR0,y
2409 7559 88 dey
2410 755A 10 F7 bpl @-
2411 755C AD 7D 5B LDA TankColoursTable+4
2412 755F 85 02 STA COLOR3 ; joined missiles (5th tank)
2413 7561 60 rts
2414 .endp
2415 ;--------------------------------------------------
2416 7562 .proc SetPMWidth
2417 7562 A9 55 lda #%01010101
2418 7564 85 02 sta sizem ; all missiles, double width
2419 7566 A9 00 lda #$00
2420 7568 85 02 sta sizep0 ; P0-P3 widths
2421 756A 85 03 sta sizep0+1
2422 756C 85 04 sta sizep0+2
2423 756E 85 05 sta sizep0+3
2424 7570 60 rts
2425 .endp
2426
2427 .endif
349 7571 icl 'C64/gr_basics.asm'
Source: gr_basics.asm
1 .IF *>0 ;this is a trick that prevents compiling this file alone
2
3 ; Basic hardware-dependent graphics routines.
4
5 ; -----------------------------------------
6 7571 .proc unPlot
7 ; plots a point and saves the plotted byte, reverts the previous plot.
8 ; -----------------------------------------
9 7571 A2 00 ldx #0 ; only one pixel
10 7573 unPlotAfterX
11 7573 8E 96 44 stx WhichUnPlot
12
13 ; first remake the oldie
14 7576 BD 9C 44 lda oldplotL,x
15 7579 85 6E sta oldplot
16 757B BD 97 44 lda oldplotH,x
17 757E 85 6F sta oldplot+1
18
19 7580 A0 00 ldy #0
20 7582 BD A1 44 lda oldora,x
21 7585 91 6E sta (oldplot),y
22
23
24 ; is it not out of the screen ????
25 7587 A5 64 C9 00 D0 04 + cpw ydraw #screenheight
26 7591 90 06 jcc CheckX
27 7593 A9 00 85 63 85 64 mwa #0 ydraw
28 7599 CheckX
29 7599 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
30 75A3 B0 6E jcs EndOfUnPlot
31 75A5 MakeUnPlot
32 ; let's count coordinates taken from xdraw and ydraw
33 75A5 A5 61 lda xdraw
34 75A7 29 F8 and #%11111000
35 ;sta xbyte
36 ;---
37 75A9 A6 63 ldx ydraw
38 75AB 18 clc
39 75AC 7D 68 41 adc linetableL,x
40 75AF 85 65 sta xbyte
41 75B1 85 6E sta oldplot
42 75B3 BD 31 42 lda linetableH,x
43 75B6 65 62 adc xdraw+1
44 75B8 85 66 sta xbyte+1
45 75BA 85 6F sta oldplot+1
46
47 75BC A5 61 lda xdraw
48 75BE 29 07 and #$7
49 75C0 AA tax
50 75C1 A0 00 ldy #0
51
52 75C3 A5 A9 lda color
53 75C5 D0 0C bne ClearUnPlot
54
55 ;plotting here
56 75C7 B1 65 lda (xbyte),y
57 75C9 8D AB 44 sta OldOraTemp
58 75CC 1D 1C 5C ora bittable,x
59 75CF 91 65 sta (xbyte),y
60 75D1 D0 0A bne ContinueUnPlot ; allways <>0
61 75D3 ClearUnPlot
62 75D3 B1 65 lda (xbyte),y
63 75D5 8D AB 44 sta OldOraTemp
64 75D8 3D 24 5C and bittable2,x
65 75DB 91 65 sta (xbyte),y
66 75DD ContinueUnPlot
67 75DD AE 96 44 ldx WhichUnPlot
68 75E0 AD AB 44 lda OldOraTemp
69 75E3 9D A1 44 sta oldora,x
70 75E6 A5 6E lda oldplot
71 75E8 9D 9C 44 sta oldplotL,x
72 75EB A5 6F lda oldplot+1
73 75ED 9D 97 44 sta oldplotH,x
74 ; and now we must solve the problem of several plots
75 ; in one byte
76 75F0 A2 04 ldx #4
77 75F2 AC 96 44 ldy WhichUnPlot
78 75F5 LetsCheckOverlapping
79 75F5 EC 96 44 cpx WhichUnPlot
80 75F8 F0 16 beq SkipThisPlot
81 75FA BD 9C 44 lda oldplotL,x
82 75FD D9 9C 44 cmp oldplotL,y
83 7600 D0 0E bne NotTheSamePlot
84 7602 BD 97 44 lda oldplotH,x
85 7605 D9 97 44 cmp oldplotH,y
86 7608 D0 06 bne NotTheSamePlot
87 ; the pixel is in the same byte so let's take correct contents
88 760A BD A1 44 lda oldora,x
89 760D 99 A1 44 sta oldora,y
90 7610 NotTheSamePlot
91 7610 SkipThisPlot
92 7610 CA dex
93 7611 10 E2 bpl LetsCheckOverlapping
94 7613 EndOfUnPlot
95 7613 60 rts
96 .endp
97
98 ; -----------------------------------------
99 7614 .proc plot ;plot (xdraw, ydraw, color)
100 ; color == 1 --> put pixel
101 ; color == 0 --> erase pixel
102 ; this is one of the most important routines in the whole
103 ; game. If you are going to speed up the game, start with
104 ; plot - it is used by every single effect starting from explosions
105 ; through line drawing and small text output!!!
106 ;
107 ; Optimized by 0xF (Fox) THXXXX!!!
108
109 ; -----------------------------------------
110 ; is it not over the screen ???
111 7614 A5 64 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1)
112 761E B0 F3 bcs unPlot.EndOfUnPlot ;nearest RTS
113 7620 CheckX02
114 7620 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
115 762A B0 25 bcs EndOfPlot
116 762C MakePlot
117 ; let's calculate coordinates from xdraw and ydraw
118
119 762C A5 61 lda xdraw
120 762E 29 F8 and #%11111000
121 ;sta xbyte
122 ;---
123 7630 A6 63 ldx ydraw
124 7632 18 clc
125 7633 7D 68 41 adc linetableL,x
126 7636 85 65 sta xbyte
127 7638 BD 31 42 lda linetableH,x
128 763B 65 62 adc xdraw+1
129 763D 85 66 sta xbyte+1
130
131 763F A5 61 lda xdraw
132 7641 29 07 and #$7
133 7643 AA tax
134 7644 A0 00 ldy #0
135 7646 A5 A9 lda color
136 7648 D0 08 bne ClearPlot
137
138 764A B1 65 lda (xbyte),y
139 764C 1D 1C 5C ora bittable,x
140 764F 91 65 sta (xbyte),y
141 7651 EndOfPlot
142 7651 60 rts
143 7652 ClearPlot
144 7652 B1 65 lda (xbyte),y
145 7654 3D 24 5C and bittable2,x
146 7657 91 65 sta (xbyte),y
147 7659 60 rts
148 .endp
149
150 ; -----------------------------------------
151 765A .proc point_plot
152 ; -----------------------------------------
153 ; checks state of the pixel (coordinates in xdraw and ydraw)
154 ; result is in A (zero or appropriate bit is set)
155
156 ; let's calculate coordinates from xdraw and ydraw
157
158 765A A5 61 lda xdraw
159 765C 29 F8 and #%11111000
160 ;sta xbyte
161 ;---
162 765E A6 63 ldx ydraw
163 7660 18 clc
164 7661 7D 68 41 adc linetableL,x
165 7664 85 65 sta xbyte
166 7666 BD 31 42 lda linetableH,x
167 7669 65 62 adc xdraw+1
168 766B 85 66 sta xbyte+1
169
170 766D A5 61 lda xdraw
171 766F 29 07 and #$7
172 7671 AA tax
173 7672 A0 00 ldy #0
174 7674 B1 65 lda (xbyte),y
175 7676 49 FF eor #$ff
176 7678 3D 1C 5C and bittable,x
177 767B 60 rts
178 .endp
179
180 ;--------------------------------------------------
181 767C .proc ClearScreen
182 ;--------------------------------------------------
183 767C A9 00 85 72 A9 20 + mwa #displayC64 temp
184 7684 A0 00 ldy #0
185 7686 A9 FF @ lda #$ff
186 7688 91 72 sta (temp),y
187 768A E6 72 D0 02 E6 73 inw temp
188 7690 A5 73 C9 3F D0 04 + cpw temp #displayC64+screenheight*screenBytes+1
189 769A D0 EA bne @-
190 769C 60 rts
191 .endp
192
193 ;--------------------------------------------------
194 769D .proc GenerateLineTable
195
196 769D A9 00 85 72 A9 20 + mwa #displayC64 temp
197 76A5 A9 68 85 74 A9 41 + mwa #linetableL temp2
198 76AD A9 31 85 76 A9 42 + mwa #linetableH modify
199 76B5 A0 00 ldy #0
200 76B7 A2 00 ldx #0
201 76B9 A5 72 @ lda temp
202 76BB 91 74 sta (temp2),y
203 76BD A5 73 lda temp+1
204 76BF 91 76 sta (modify),y
205 76C1 E0 07 cpx #7
206 76C3 D0 12 bne NotChar
207 76C5 A2 00 ldx #0
208 76C7 18 A5 72 69 39 85 + adw temp #(320-7)
209 76D4 4C DE 76 jmp next8lines
210 76D7 NotChar
211 76D7 E6 72 D0 02 E6 73 inw temp
212 76DD E8 inx
213 76DE next8lines
214 76DE C8 iny
215 76DF C0 C9 cpy #screenheight+1
216 76E1 D0 D6 bne @-
217 76E3 60 rts
218 .endp
219 ;--------------------------------------------------
220 76E4 .proc SetMainScreen
221 76E4 A9 0B lda #$b ; Grey background and border
222 76E6 8D 20 D0 sta $d020
223 76E9 8D 21 D0 sta $d021
224
225 76EC AD 00 DD lda $dd00 ; Set video bank to start at 0
226 76EF 29 FC and #252
227 76F1 09 03 ora #3
228 76F3 8D 00 DD sta $dd00
229 76F6 A9 18 lda #$18
230 76F8 8D 18 D0 sta $d018
231
232 ; SwitchVICBank(0)
233 ; SetScreenMemory($2000)
234 76FB SetHiresBitmapMode ; Hires mode on
Macro: SETHIRESBITMAPMODE [Source: MACRO.ASM]
4 76FB AD 11 D0 lda $d011
5 76FE 29 BF and #%10111111
6 7700 09 20 ora #%00100000
7 7702 8D 11 D0 sta $d011
12 7705 AD 16 D0 lda $d016
13 7708 29 EF and #%11101111
14 770A 8D 16 D0 sta $d016
Source: gr_basics.asm
235 770D A9 00 lda #$00
236 770F 8D 21 D0 sta 53281
237 ; clear color RAM
238 7712 A2 00 ldx #0
239 7714 A9 01 @ lda #1
240 7716 9D 00 D8 sta $d800,x
241 7719 9D 00 D9 sta $d900,x
242 771C 9D 00 DA sta $da00,x
243 771F 9D 00 DB sta $db00,x
244 7722 A9 0F lda #$0f
245 7724 9D 00 04 sta $0400,x
246 7727 9D 00 05 sta $0500,x
247 772A 9D 00 06 sta $0600,x
248 772D 9D 00 07 sta $0700,x
249 7730 E8 inx
250 7731 D0 E1 bne @-
251
252
253 7733 60 rts
254 .endp
255
256 .ENDIF
350 ;----------------------------------------------
351 7734 icl 'weapons.asm'
Source: weapons.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4 ;--------------------------------------------------
5 7734 .proc Explosion
6 ; xdraw,ydraw (word) - coordinates of explosion center
7 ; TankNr - number of shooting tank
8 ; ActiveWeapon(TankNr) - weapon that tank fires
9 ;--------------------------------------------------
10 ;cleanup of the soil fall down ranges (left and right)
11 7734 20 89 8F jsr ClearScreenSoilRange
12
13 7737 A6 6C ldx TankNr
14 7739 BD F7 43 lda ActiveWeapon,x
15 .endp
16 773C .proc ExplosionDirect
17 773C 0A asl
18 773D AA tax
19 773E BD 48 77 lda ExplosionRoutines+1,x
20 7741 48 pha
21 7742 BD 47 77 lda ExplosionRoutines,x
22 7745 48 pha
23 7746 60 rts
24 7747 ExplosionRoutines
25 7747 A1 77 .word babymissile-1 ;Baby_Missile___;_00
26 7749 AC 77 .word missile-1 ;Missile________;_01
27 774B B2 77 .word babynuke-1 ;Baby_Nuke______;_02
28 774D BC 77 .word nuke-1 ;Nuke___________;_03
29 774F C2 77 .word leapfrog-1 ;LeapFrog_______;_04
30 7751 FE 77 .word funkybomb-1 ;Funky_Bomb_____;_05
31 7753 FD 77 .word mirv-1 ;MIRV___________;_06
32 7755 B6 78 .word deathshead-1 ;Death_s_Head___;_07
33 7757 55 79 .word napalm-1 ;Napalm_________;_08
34 7759 5B 79 .word hotnapalm-1 ;Hot_Napalm_____;_09
35 775B 86 77 .word tracer-1 ;Tracer_________;_10
36 775D 86 77 .word tracer-1 ;Smoke_Tracer___;_11
37 775F 69 7A .word babyroller-1 ;Baby_Roller____;_12
38 7761 70 7A .word roller-1 ;Roller_________;_13
39 7763 76 7A .word heavyroller-1 ;Heavy_Roller___;_14
40 7765 06 7C .word riotcharge-1 ;Riot_Charge____;_15
41 7767 10 7C .word riotblast-1 ;Riot_Blast_____;_16
42 7769 7C 7A .word riotbomb-1 ;Riot_Bomb______;_17
43 776B 86 7A .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18
44 776D 8C 7A .word babydigger-1 ;Baby_Digger____;_19
45 776F A1 7A .word digger-1 ;Digger_________;_20
46 7771 A8 7A .word heavydigger-1 ;Heavy_Digger___;_21
47 7773 AF 7A .word babysandhog-1 ;Baby_Sandhog___;_22
48 7775 B6 7A .word sandhog-1 ;Sandhog________;_23
49 7777 BD 7A .word heavysandhog-1 ;Heavy_Sandhog__;_24
50 7779 BE 7B .word dirtclod-1 ;Dirt_Clod______;_25
51 777B C4 7B .word dirtball-1 ;Dirt_Ball______;_26
52 777D CA 7B .word tonofdirt-1 ;Ton_of_Dirt____;_27
53 777F 22 7C .word liquiddirt-1 ;Liquid_Dirt____;_28
54 7781 FC 7B .word dirtcharge-1 ;Dirt_Charge____;_29
55 7783 87 77 .word BFG-1 ;Buy_me_________;_30
56 7785 FC 7C .word laser-1 ;Laser__________;_31
57
58 7787 VOID
59 7787 tracer
60 7787 60 rts
61 .endp
62 7788 .proc BFG
63 7788 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect
64 778C 20 9C A2 jsr BFGblink
65 ; Kill all :)
66 778F A6 AE ldx NumberOfPlayers
67 7791 CA dex
68 7792 A9 00 lda #$00
69 7794 CheckNextTankBFG
70 7794 E4 6C cpx TankNr ; not me!
71 7796 F0 03 beq @+
72 7798 9D A2 43 sta Energy,x
73 779B CA @ dex
74 779C 10 F6 bpl CheckNextTankBFG
75 779E 8E D9 44 stx AfterBFGflag ; $ff
76 77A1 60 rts
77 .endp
78 ; ------------------------
79 77A2 .proc babymissile
80 77A2 A9 0B 85 B0 mva #11 ExplosionRadius
81 77A6 GoBabyMissileSFX
82 77A6 A9 05 85 9E mva #sfx_baby_missile sfx_effect
83 77AA GoXmissile
84 77AA 4C C5 7D jmp xmissile
85 .endp
86 ; ------------------------
87 77AD .proc missile ;
88 77AD A9 11 85 B0 mva #17 ExplosionRadius
89 77B1 D0 F3 bne babymissile.GoBabyMissileSFX
90 ; jmp xmissile
91 .endp
92 ; ------------------------
93 77B3 .proc babynuke
94 77B3 A9 19 85 B0 mva #25 ExplosionRadius
95 77B7 GoBabyNukeSFX
96 77B7 A9 04 85 9E mva #sfx_nuke sfx_effect ; allways <>0
97 77BB D0 ED bne babymissile.GoXmissile
98 ; jmp xmissile
99 .endp
100 ; ------------------------
101 77BD .proc nuke
102 77BD A9 1E 85 B0 mva #30 ExplosionRadius
103 77C1 D0 F4 bne babynuke.GoBabyNukeSFX
104 ; jmp xmissile
105 .endp
106 ; ------------------------
107 77C3 .proc leapfrog
108 77C3 A9 11 85 B0 mva #17 ExplosionRadius
109 ; mva #sfx_baby_missile sfx_effect
110 ; jsr xmissile
111 77C7 20 A6 77 jsr babymissile.GoBabyMissileSFX
112
113 77CA 20 CD 77 jsr SecondRepeat
114
115 77CD SecondRepeat
116 ; soil must fall down now! there is no other way...
117 ; hide tanks or they fall down with soil
118 77CD 20 F4 6E jsr SoilDown2
119
120 ; it looks like force is divided by 4 here BUT"
121 ; in Flight routine force is multiplied by 2 and left
122 ; so, we have Force divided by 2 here (not accurately)
123 ;lsr Force+1
124 ;ror Force
125 77D0 46 A5 lsr Force+1
126 77D2 66 A4 ror Force
127 77D4 AD 15 45 85 A7 mva LeapFrogAngle Angle
128 77D9 A9 0C 85 9E mva #sfx_funky_hit sfx_effect
129 77DD 38 A5 CC E9 05 85 + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1)
130 77E8 20 A0 83 jsr Flight
131 77EB A5 BF lda HitFlag
132 77ED F0 0E beq EndOfLeapping
133 77EF A9 0E 85 B0 mva #14 ExplosionRadius
134 77F3 20 09 8F jsr CalculateExplosionRange0
135 77F6 A9 05 85 9E mva #sfx_baby_missile sfx_effect
136 77FA 4C C8 7D jmp xmissile.NoRangeCalc
137 77FD EndOfLeapping
138 77FD 60 rts
139 .endp
140 ; ------------------------
141 77FE .proc mirv ; the whole mirv is performed by Flight routine
142 77FE 60 rts
143 .endp
144 ; ------------------------
145 77FF .proc funkybomb ;
146 77FF A9 05 85 9E mva #sfx_baby_missile sfx_effect
147 7803 A5 C9 8D AC 44 A5 + mwa xtraj+1 xtrajfb
148 780D 38 A5 CC E9 05 8D + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1)
149 ;central Explosion
150 781C A9 15 85 B0 mva #21 ExplosionRadius
151 7820 20 09 8F jsr CalculateExplosionRange0
152 7823 20 C8 7D jsr xmissile.NoRangeCalc
153
154 7826 20 F4 6E jsr SoilDown2
155 ;
156 7829 20 0B 6A jsr cleartanks ; maybe not?
157 782C A9 01 85 A9 mva #1 color
158 7830 A9 00 85 A2 mva #0 FunkyWallFlag
159 7834 A9 05 85 B1 mva #5 FunkyBombCounter
160 7838 FunkyBombLoop
161 7838 A9 01 85 E3 mva #1 tracerflag
162 ;force randomization (range: 256-511)
163 783C AD 1B D4 lda random
164 783F 85 A4 sta Force
165 7841 A9 01 85 A5 mva #1 Force+1
166 ;Angle randomization Range: (70-110 degrees)
167 7845 randomize 70 110
Macro: RANDOMIZE [Source: MACRO.ASM]
6 7845 ?rand
7 7845 AD 1B D4 lda random
8 7848 C9 46 cmp #70 ;floor
9 784A 90 F9 bcc ?rand
10 784C C9 6F cmp #110+1 ;ceiling
11 784E B0 F5 bcs ?rand
Source: weapons.asm
168 7850 85 A7 sta Angle
169
170 7852 A9 00 lda #0
171 7854 85 C8 sta xtraj
172 7856 85 CB sta ytraj
173 7858 AD AC 44 85 C9 AD + mwa xtrajfb xtraj+1
174 7862 AD AE 44 85 CC AD + mwa ytrajfb ytraj+1
175 786C A9 0C 85 9E mva #sfx_funky_hit sfx_effect
176 7870 20 A0 83 jsr Flight
177 7873 A9 00 85 B0 mva #0 ExplosionRadius ; if no explosion (off screen)
178 ; if xdraw if over range then fix it
179 7877 A5 62 lda xdraw+1
180 7879 10 06 bpl NoOnLeftEdge
181 787B A9 00 lda #0
182 787D 85 61 sta xdraw
183 787F 85 62 sta xdraw+1
184 7881 NoOnLeftEdge
185 7881 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
186 788B 90 08 bcc NoOnRightEdge
187 788D A9 40 85 61 A9 01 + mwa #screenwidth xdraw
188 7895 NoOnRightEdge
189 7895 20 0C 8F jsr CalculateExplosionRange ; add end of flight coordinates to soildown range
190 7898 A5 BF lda HitFlag
191 789A F0 0B beq NoExplosionInFunkyBomb
192 789C A9 05 85 9E mva #sfx_baby_missile sfx_effect
193 78A0 A9 0B 85 B0 mva #11 ExplosionRadius
194 78A4 20 C5 7D jsr xmissile
195 78A7 NoExplosionInFunkyBomb
196 78A7 C6 B1 dec FunkyBombCounter
197 78A9 D0 8D bne FunkyBombLoop
198 78AB A9 00 85 E3 mva #0 tracerflag
199 78AF A5 A2 lda FunkyWallFlag
200 78B1 F0 03 beq NoWallsInFunky
201 78B3 20 7A 8F jsr SetFullScreenSoilRange
202 78B6 NoWallsInFunky
203 78B6 60 rts
204 .endp
205 ; ------------------------
206 78B7 .proc deathshead
207 78B7 A9 1E 85 B0 mva #30 ExplosionRadius
208 78BB A9 04 85 9E mva #sfx_nuke sfx_effect
209 78BF 20 32 79 jsr GoXmissileWithSaveXYdraw
210 78C2 38 A5 61 E9 22 85 + sbw xdraw #34
211 78CD A9 04 85 9E mva #sfx_nuke sfx_effect
212 78D1 20 32 79 jsr GoXmissileWithSaveXYdraw
213 78D4 18 A5 61 69 44 85 + adw xdraw #68
214 78DF A9 04 85 9E mva #sfx_nuke sfx_effect
215 78E3 20 32 79 jsr GoXmissileWithSaveXYdraw
216 78E6 38 A5 61 E9 22 85 + sbw xdraw #34
217 ;
218 78F1 38 A5 63 E9 22 85 + sbw ydraw #34
219 ;jsr CalculateExplosionRange
220 78FC A5 64 C9 00 D0 04 + cpw ydraw #screenHeight
221 7906 B0 07 bcs NoUpperCircle
222 7908 A9 04 85 9E mva #sfx_nuke sfx_effect
223 790C 20 32 79 jsr GoXmissileWithSaveXYdraw
224 790F NoUpperCircle
225 790F 18 A5 63 69 44 85 + adw ydraw #68
226 ;jsr CalculateExplosionRange
227 791A A5 64 C9 00 D0 04 + cpw ydraw #screenHeight
228 7924 B0 07 bcs NoLowerCircle
229 7926 A9 04 85 9E mva #sfx_nuke sfx_effect
230 792A 20 32 79 jsr GoXmissileWithSaveXYdraw
231 792D NoLowerCircle
232 792D A9 15 85 9E mva #sfx_silencer sfx_effect
233 7931 60 rts
234
235 7932 GoXmissileWithSaveXYdraw
236 7932 A5 61 85 78 A5 62 + mwa xdraw tempXROLLER
237 793A A5 63 85 76 A5 64 + mwa ydraw modify
238 7942 20 C5 7D jsr xmissile
239 7945 A5 78 85 61 A5 79 + mwa tempXROLLER xdraw
240 794D A5 76 85 63 A5 77 + mwa modify ydraw
241 7955 60 rts
242 .endp
243 ; ------------------------
244 7956 .proc napalm
245 7956 A9 00 85 B1 mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm
246 795A F0 04 beq xnapalm
247 .endp
248 ; ------------------------
249 795C .proc hotnapalm
250 795C A9 01 85 B1 mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm
251 ; jmp xnapalm
252 .endp
253 ; ------------------------
254 7960 .proc xnapalm
255 7960 A9 09 85 9E mva #sfx_napalm sfx_effect
256 7964 A9 0E 85 B0 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width)
257 7968 20 0C 8F jsr CalculateExplosionRange
258 ;
259 796B A5 61 85 B3 A5 62 + mwa xdraw xcircle ; store hitpoint for future repeats
260 7973 A0 1E ldy #30 ; repeat 30 times
261 7975 84 C6 sty magic
262 7977 RepeatNapalm ; external loop (for fire animation)
263 7977 A5 B3 85 61 A5 B4 + mwa xcircle xdraw
264 797F 38 A5 61 E9 0A 85 + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point
265 798A A0 00 ldy #0
266 798C 84 C7 sty magic+1
267 798E RepeatFlame ; internal loop (draw flames)
268 798E A0 00 ldy #0
269 7990 18 A5 61 69 3E 85 + adw xdraw #mountaintable temp
270 799D 84 64 sty ydraw+1
271 799F B1 72 lda (temp),y
272 79A1 38 sec
273 79A2 E9 01 sbc #1 ; over ground
274 79A4 85 63 sta ydraw
275 79A6 A5 61 lda xdraw
276 79A8 25 B1 and HotNapalmFlag ; if hotnapalm and x is odd:
277 79AA 0A 0A :2 asl ; modify y position 4 pixels up
278 79AC A4 63 ldy ydraw
279 79AE 85 63 sta ydraw
280 79B0 98 tya
281 79B1 38 sec
282 79B2 E5 63 sbc ydraw
283 79B4 85 63 sta ydraw
284 79B6 38 A5 61 E9 04 85 + sbw xdraw #4 ; half character correction
285 ; draw flame symbol
286 79C1 A5 C6 lda magic ; if last repeat - clear flames
287 79C3 F0 0A beq LastNapalmRepeat
288 79C5 AD 1B D4 lda random
289 79C8 29 06 and #%00000110
290 79CA 18 clc
291 79CB 69 14 adc #char_flame___________
292 79CD D0 02 bne PutFlameChar
293 79CF LastNapalmRepeat
294 79CF A9 1C lda #char_clear_flame_____ ; clear flame symbol
295 79D1 PutFlameChar
296 79D1 85 69 sta CharCode
297 ; check coordinates
298 79D3 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-7)
299 79DD B0 0D bcs CharOffTheScreen
300 79DF A5 63 lda ydraw
301 79E1 C9 07 cmp #7
302 79E3 90 07 bcc CharOffTheScreen
303 79E5 C9 C7 cmp #(screenHeight-1)
304 79E7 B0 03 bcs CharOffTheScreen
305 79E9 20 E7 70 jsr TypeChar
306 79EC CharOffTheScreen
307 79EC 18 A5 61 69 04 85 + adw xdraw #4 ; reverse half character correction (we need positon of character center)
308 79F7 18 A5 61 69 01 85 + adw xdraw #1 ; next char 1 pixels to right
309 7A02 E6 C7 inc magic+1
310 7A04 A5 C7 lda magic+1
311 7A06 C9 15 cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center
312 7A08 D0 84 jne RepeatFlame
313 7A0A C6 C6 dec magic
314 7A0C 30 03 4C 77 79 jpl RepeatNapalm
315 ; after napalm
316 ;now we must check tanks in range
317 7A11 A6 AE ldx NumberOfPlayers
318 7A13 CA dex
319 7A14 BurnedCheckLoop
320 7A14 BD AF 43 lda eXistenZ,x
321 7A17 F0 49 beq EndNurnedCheckLoop
322 ;here the tank exist
323 ; calculate right edge of the fire
324 7A19 18 A5 B3 69 12 85 + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction
325 ; now we compare tank position with right edge of the fire (napalm)
326 7A26 BD 13 44 lda XtankstableH,x
327 7A29 C5 62 cmp xdraw+1
328 7A2B D0 05 bne @+
329 7A2D BD 0D 44 lda XtankstableL,x
330 7A30 C5 61 cmp xdraw
331 @
332 7A32 B0 2E bcs TankOutOfFire
333 ; let's calculate left edge of the fire
334 7A34 38 A5 B3 E9 12 85 + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction
335 7A41 10 06 bpl @+
336 7A43 A9 00 85 61 85 62 mwa #0 xdraw ; left screen edge
337 @
338 ; now we compare tank position with left edge of the fire (napalm)
339 7A49 BD 13 44 lda XtankstableH,x
340 7A4C C5 62 cmp xdraw+1
341 7A4E D0 05 bne @+
342 7A50 BD 0D 44 lda XtankstableL,x
343 7A53 C5 61 cmp xdraw
344 @
345 7A55 90 0B bcc TankOutOfFire
346
347 7A57 A0 28 ldy #40 ; energy decrease (napalm) - but if hotnapalm:
348 7A59 A5 B1 lda HotNapalmFlag
349 7A5B F0 02 beq NotHot
350 7A5D A0 50 ldy #80 ; energy decrease (hotnapalm)
351 7A5F NotHot
352 ; check shields ( joke :) )
353 7A5F 20 74 57 jsr DecreaseEnergyX
354 7A62 TankOutOfFire
355 7A62 EndNurnedCheckLoop
356 7A62 CA dex
357 7A63 10 AF bpl BurnedCheckLoop
358 7A65 A9 15 85 9E mva #sfx_silencer sfx_effect
359 7A69 60 rts
360 .endp
361 ; ------------------------
362 7A6A .proc babyroller
363 7A6A A9 0B 85 B0 mva #11 ExplosionRadius
364 7A6E GoRoller
365 7A6E 4C A6 7E jmp xroller
366 .endp
367 ; ------------------------
368 7A71 .proc roller ;
369 7A71 A9 15 85 B0 mva #21 ExplosionRadius
370 7A75 D0 F7 bne babyroller.GoRoller ; 1 byte saved
371 ; jmp xroller
372 .endp
373 ; ------------------------
374 7A77 .proc heavyroller
375 7A77 A9 1E 85 B0 mva #30 ExplosionRadius
376 7A7B D0 F1 bne babyroller.GoRoller ; 1 byte saved
377 ; jmp xroller
378 .endp
379 ; ------------------------
380 7A7D .proc riotbomb
381 7A7D A9 11 85 B0 mva #17 ExplosionRadius
382 7A81 GoRiotBomb
383 7A81 20 0C 8F jsr CalculateExplosionRange
384 7A84 4C 8C 7E jmp xriotbomb
385 .endp
386 ; ------------------------
387 7A87 .proc heavyriotbomb
388 7A87 A9 1D 85 B0 mva #29 ExplosionRadius
389 7A8B D0 F4 bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :)
390 ; jsr CalculateExplosionRange
391 ; jmp xriotbomb
392 .endp
393 ; ------------------------
394 7A8D .proc babydigger
395 7A8D A9 01 8D 38 44 mva #1 diggery ; how many branches (-1)
396 7A92 GoBabydiggerSFX
397 7A92 A9 14 85 9E mva #sfx_digger sfx_effect
398 7A96 A9 00 8D 5E 44 mva #0 sandhogflag
399 7A9B A9 0D 8D 39 44 mva #13 DigLong
400 7AA0 D0 2F bne xdigger
401 .endp
402 ; ------------------------
403 7AA2 .proc digger ;
404 7AA2 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1)
405 7AA7 D0 E9 bne babydigger.GoBabydiggerSFX
406 .endp
407 ; ------------------------
408 7AA9 .proc heavydigger
409 7AA9 A9 07 8D 38 44 mva #7 diggery ; how many branches (-1)
410 7AAE D0 E2 bne babydigger.GoBabydiggerSFX
411 .endp
412 ; ------------------------
413 7AB0 .proc babysandhog
414 7AB0 A9 01 8D 38 44 mva #1 diggery ; how many branches (-1)
415 7AB5 D0 0C bne heavysandhog.GoHeavysandhogSFX
416 .endp
417 ; ------------------------
418 7AB7 .proc sandhog
419 7AB7 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1)
420 7ABC D0 05 bne heavysandhog.GoHeavysandhogSFX
421 .endp
422 ; ------------------------
423 7ABE .proc heavysandhog
424 7ABE A9 05 8D 38 44 mva #5 diggery ; how many branches (-1)
425 7AC3 GoHeavysandhogSFX
426 7AC3 A9 12 85 9E mva #sfx_sandhog sfx_effect
427 7AC7 A9 08 8D 5E 44 mva #char_sandhog_offset sandhogflag
428 7ACC A9 0D 8D 39 44 mva #13 DigLong
429 ; jmp xdigger
430 .endp
431 ; ------------------------
432 7AD1 .proc xdigger
433 ;mwa xdraw digstartx
434 ;mwa ydraw digstarty
435 7AD1 AE 38 44 ldx diggery
436 7AD4 WriteToBranches
437 7AD4 A5 61 lda xdraw
438 7AD6 9D 3A 44 sta digtabxL,x
439 7AD9 A5 62 lda xdraw+1
440 7ADB 9D 42 44 sta digtabxH,x
441 7ADE A5 63 lda ydraw
442 7AE0 9D 4A 44 sta digtabyL,x
443 7AE3 A5 64 lda ydraw+1
444 7AE5 9D 52 44 sta digtabyH,x
445 7AE8 CA dex
446 7AE9 10 E9 bpl WriteToBranches
447 7AEB 20 A3 7B jsr DiggerCharacter ; start character
448
449 7AEE 18 A5 61 69 04 85 + adw xdraw #4
450 7AF9 AD 39 44 lda DigLong
451 ; looks strange, but it is (DigLong+2)*4
452 7AFC 18 clc
453 7AFD 69 02 adc #$2
454 7AFF 0A asl
455 7B00 0A asl
456 7B01 85 B0 sta ExplosionRadius
457 7B03 20 0C 8F jsr CalculateExplosionRange
458 7B06 BranchNotFinished
459 7B06 AE 38 44 ldx diggery
460 7B09 CalculateBranches
461 7B09 8A txa
462 7B0A 29 01 and #$01
463 7B0C D0 14 bne DigRight
464 7B0E diglewy ; even branches go left
465 7B0E 38 sec
466 7B0F BD 3A 44 lda digtabxL,x
467 7B12 E9 04 sbc #$04
468 7B14 9D 3A 44 sta digtabxL,x
469 7B17 BD 42 44 lda digtabxH,x
470 7B1A E9 00 sbc #$00
471 7B1C 9D 42 44 sta digtabxH,x
472 7B1F 4C 33 7B jmp DigRandomize
473 7B22 DigRight ; odd go right (everytime 4 pixels)
474 7B22 18 clc
475 7B23 BD 3A 44 lda digtabxL,x
476 7B26 69 04 adc #$04
477 7B28 9D 3A 44 sta digtabxL,x
478 7B2B BD 42 44 lda digtabxH,x
479 7B2E 69 00 adc #$00
480 7B30 9D 42 44 sta digtabxH,x
481 7B33 DigRandomize
482 7B33 AD 1B D4 lda random
483 7B36 29 87 and #$87
484 7B38 30 20 bmi DigUp
485 7B3A DigDown
486 7B3A 29 07 and #$07
487 7B3C 18 clc
488 7B3D 7D 4A 44 adc digtabyL,x
489 7B40 9D 4A 44 sta digtabyL,x
490 7B43 BD 52 44 lda digtabyH,x
491 7B46 69 00 adc #$00
492 7B48 9D 52 44 sta digtabyH,x
493 ;crashing bug here - if too much added to digtaby, it gets over screenheight and starts writing over random areas
494 ;WARNING! fix for 1 byte screenheight. TODO
495 7B4B BD 4A 44 lda digtabyL,x
496 7B4E C9 C8 cmp #screenheight
497 7B50 90 05 bcc @+ ; branch if less
498 7B52 A9 C7 lda #screenheight-1
499 7B54 9D 4A 44 sta digtabyL,x
500 7B57 4C 6F 7B @ jmp DigCalculateNext
501 7B5A DigUp
502 7B5A 29 07 and #$07
503 7B5C 85 72 sta temp
504 7B5E 38 sec
505 7B5F BD 4A 44 lda digtabyL,x
506 7B62 E5 72 sbc temp
507 7B64 9D 4A 44 sta digtabyL,x
508 7B67 BD 52 44 lda digtabyH,x
509 7B6A E9 00 sbc #$00
510 7B6C 9D 52 44 sta digtabyH,x
511 7B6F DigCalculateNext
512 7B6F CA dex
513 7B70 10 97 bpl CalculateBranches
514 ; here we draw...
515 7B72 AE 38 44 ldx diggery
516 7B75 DigDrawing
517 7B75 BD 3A 44 lda digtabxL,x
518 7B78 85 61 sta xdraw
519 7B7A BD 42 44 lda digtabxH,x
520 7B7D 85 62 sta xdraw+1
521 7B7F BD 4A 44 lda digtabyL,x
522 7B82 85 63 sta ydraw
523 7B84 BD 52 44 lda digtabyH,x
524 7B87 85 64 sta ydraw+1
525 7B89 phx
Macro: PHX [Source: MACRO.ASM]
1 7B89 8A txa
2 7B8A 48 pha
Source: weapons.asm
526 7B8B 20 A3 7B jsr DiggerCharacter
527 7B8E plx
Macro: PLX [Source: MACRO.ASM]
1 7B8E 68 pla
2 7B8F AA tax
Source: weapons.asm
528 7B90 CA dex
529 7B91 10 E2 bpl DigDrawing
530 7B93 CE 39 44 AD 39 44 dec:lda DigLong
531 7B99 30 03 4C 06 7B jpl BranchNotFinished
532 7B9E DoNotPutDig
533 7B9E A9 15 85 9E mva #sfx_silencer sfx_effect
534 7BA2 60 rts
535 7BA3 DiggerCharacter
536 7BA3 AD 1B D4 lda random
537 7BA6 29 06 and #$06
538 7BA8 18 clc
539 7BA9 69 04 adc #char_digger__________
540 7BAB 6D 5E 44 adc sandhogflag
541 7BAE 85 69 sta CharCode
542 7BB0 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-6)
543 7BBA B0 E2 bcs DoNotPutDig
544 7BBC 4C E7 70 jmp TypeChar
545 .endp
546 ; ------------------------
547 7BBF .proc dirtclod
548 7BBF A9 0C 85 B0 mva #12 ExplosionRadius
549 7BC3 D0 0A bne xdirt
550 .endp
551 ; ------------------------
552 7BC5 .proc dirtball
553 7BC5 A9 16 85 B0 mva #22 ExplosionRadius
554 7BC9 D0 04 bne xdirt
555 .endp
556 ; ------------------------
557 7BCB .proc tonofdirt
558 7BCB A9 1F 85 B0 mva #31 ExplosionRadius
559 ; jmp xdirt
560 .endp
561 ; -----------------
562 7BCF .proc xdirt ;
563 ; -----------------
564 7BCF 20 0C 8F jsr CalculateExplosionRange
565 7BD2 A9 0A 85 9E mva #sfx_dirt_charge sfx_effect
566 7BD6 A9 01 lda #1
567 7BD8 85 AB sta radius
568 7BDA 85 A9 sta color
569 7BDC dirtLoop
570 7BDC 20 4A 68 jsr circle
571 7BDF E6 63 D0 02 E6 64 inw ydraw
572 7BE5 20 4A 68 jsr circle
573 7BE8 A5 63 D0 02 C6 64 + .nowarn dew ydraw
574 7BF0 E6 AB inc radius
575 7BF2 A5 AB lda radius
576 7BF4 C5 B0 cmp ExplosionRadius
577 7BF6 D0 E4 bne dirtLoop
578 7BF8 A9 15 85 9E mva #sfx_silencer sfx_effect
579 7BFC 60 rts
580 .endp
581 ; ------------------------
582 7BFD .proc dirtcharge
583 7BFD A9 3D 85 B0 mva #61 ExplosionRadius
584 7C01 20 0C 8F jsr CalculateExplosionRange
585 7C04 4C E1 7F jmp ofdirt
586 .endp
587 ; ------------------------
588 7C07 .proc riotcharge
589 7C07 A9 11 85 9E mva #sfx_riot_blast sfx_effect
590 7C0B A9 1F 85 B0 mva #31 ExplosionRadius
591 7C0F D0 08 bne cleanDirt
592 .endp
593 ; ------------------------
594 7C11 .proc riotblast
595 7C11 A9 11 85 9E mva #sfx_riot_blast sfx_effect
596 7C15 A9 3D 85 B0 mva #61 ExplosionRadius
597 ; jmp cleanDirt
598 .endp
599 ; -----------------
600 7C19 .proc cleanDirt
601 ; -----------------
602 7C19 20 0C 8F jsr CalculateExplosionRange
603 7C1C A9 00 85 A9 mva #0 color
604 7C20 4C E9 7F jmp ofdirt.NoColor
605 .endp
606 ; ------------------------
607 7C23 .proc liquiddirt
608 7C23 A9 1B 85 9E mva #sfx_liquid_dirt sfx_effect
609 7C27 A9 FE 8D 5C 44 A9 + mwa #510 FillCounter
610 ; -----
611 7C31 A5 61 8D 5A 44 A5 + mwa xdraw TempXfill
612 7C3B RepeatFill
613 7C3B AD 5A 44 85 61 AD + mwa TempXfill xdraw
614 7C45 20 5A 7F jsr checkRollDirection
615 ; HowMuchToFall - direction
616 ; $FF - we are in a hole (flying in missile direction)
617 ; 1 - right, 2 - left
618 7C48 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
619 7C55 A0 00 ldy #0
620 7C57 B1 78 lda (tempXROLLER),y
621 7C59 8D 37 44 sta HeightRol ; relative point
622
623 7C5C RollinContinuesLiquid
624 ; new point is set
625 7C5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
626 7C69 A0 00 ldy #0
627 7C6B B1 78 lda (tempXROLLER),y
628 7C6D 85 63 sta ydraw
629 7C6F CD 37 44 cmp HeightRol
630 7C72 F0 02 beq UpNotYet2
631 7C74 90 32 bcc FillNow
632 7C76 UpNotYet2
633 7C76 38 sec ;clc
634 7C77 8D 37 44 sta HeightRol
635 7C7A E9 01 sbc #1
636 7C7C 85 63 sta ydraw
637 7C7E A5 C5 lda HowMuchToFall
638 7C80 C9 01 cmp #1
639 7C82 F0 12 beq HowMuchToFallRight3
640 7C84 A5 61 D0 02 C6 62 + .NOWARN dew xdraw
641 7C8C A5 61 lda xdraw
642 7C8E 25 62 and xdraw+1
643 7C90 C9 FF cmp #$ff ; like cpw xdraw #$ffff
644 ;ora xdraw+1 ; like cpw xdraw #$0000
645 7C92 D0 C8 jne RollinContinuesLiquid
646 7C94 F0 12 beq FillNow
647 7C96 HowMuchToFallRight3
648 7C96 E6 61 D0 02 E6 62 inw xdraw
649 7C9C A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
650 7CA6 D0 B4 jne RollinContinuesLiquid
651 7CA8 FillNow
652 ; finally one pixel more
653 7CA8 A0 00 ldy #0
654 7CAA A5 C5 lda HowMuchToFall
655 7CAC 30 18 bmi FillHole
656 7CAE C9 01 cmp #1
657 7CB0 F0 0C beq FillLeft
658 7CB2 E6 61 D0 02 E6 62 inw xdraw
659 7CB8 E6 61 D0 02 E6 62 inw xdraw ; tricky but we must rollback xdraw in proper direction
660 7CBE FillLeft
661 7CBE A5 61 D0 02 C6 62 + .nowarn dew xdraw
662 7CC6 FillHole
663 7CC6 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
664 7CD3 B1 78 lda (tempXROLLER),y
665 7CD5 85 63 sta ydraw
666 7CD7 F0 0D beq ToHighFill ; if we filled all playfield (very rare but possible)
667 7CD9 C6 63 dec ydraw ; one pixel up
668 7CDB A5 63 lda ydraw
669 7CDD 91 78 sta (tempXROLLER),y ;mountaintable update
670 7CDF A9 01 85 A9 mva #1 color
671 7CE3 20 2C 76 jsr plot.MakePlot
672 7CE6 ToHighFill
673 7CE6 AD 5C 44 D0 03 CE + .nowarn dew FillCounter
674 7CF1 AD 5C 44 lda FillCounter
675 7CF4 0D 5D 44 ora FillCounter+1
676 7CF7 F0 03 4C 3B 7C jne RepeatFill
677 7CFC 60 rts
678 .endp
679 ; ------------------------
680 7CFD .proc laser
681 ; in xdraw and ydraw we have hit point coordinates
682 ; from Shoot/Flight procedures (invisible flight)
683 ; ------------------------
684 7CFD A6 6C ldx TankNr
685 7CFF BD C3 48 lda AngleTable,x
686 7D02 A8 tay
687
688 7D03 AD C9 48 85 65 AD + mwa EndOfTheBarrelX xbyte
689 7D0D AD CB 48 85 67 mva EndOfTheBarrelY ybyte
690 7D12 A9 00 85 68 mva #0 ybyte+1
691 7D16 8D 8B 44 sta LaserFlag ; turn on gravity and wind after shot :)
692
693 7D19 A5 61 8D 16 45 A5 + mwa xdraw LaserCoordinate
694 7D23 A5 63 8D 18 45 A5 + mwa ydraw LaserCoordinate+2
695 7D2D A5 65 8D 1A 45 A5 + mwa xbyte LaserCoordinate+4
696 7D37 A5 67 8D 1C 45 A5 + mwa ybyte LaserCoordinate+6
697
698 7D41 A9 02 85 9E mva #sfx_lightning sfx_effect
699
700 7D45 A9 80 8D 73 43 mva #%10000000 drawFunction
701 ;the above switches Draw to measuring length
702 7D4A 20 12 66 jsr draw
703 7D4D A9 00 8D 73 43 mva #0 drawFunction
704 7D52 46 E2 lsr LineLength+1 ; LineLength / 8
705 7D54 66 E1 ror LineLength
706 7D56 46 E1 lsr LineLength ; max line lenght is about 380 (9 bits)
707 7D58 46 E1 lsr LineLength
708 7D5A 38 sec
709 7D5B A9 3C lda #60
710 7D5D E5 E1 sbc LineLength
711 7D5F 85 8A sta yc ; laser blink counter 60-(LineLength/8)
712 @
713 7D61 A5 8A lda yc
714 7D63 29 01 and #$01
715 7D65 49 01 eor #$01
716 7D67 85 A9 sta color
717 7D69 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw
718 7D73 AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw
719 7D7D AD 1A 45 85 65 AD + mwa LaserCoordinate+4 xbyte
720 7D87 AD 1C 45 85 67 AD + mwa LaserCoordinate+6 ybyte
721 7D91 A9 02 85 9E mva #sfx_lightning sfx_effect
722 7D95 20 12 66 jsr draw
723
724 7D98 C6 8A dec yc
725 7D9A D0 C5 bne @-
726
727 7D9C A9 01 85 A9 mva #1 color
728 7DA0 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw
729 7DAA AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw
730 7DB4 A9 00 85 BF mva #0 HitFlag
731 7DB8 20 84 8E jsr CheckCollisionWithTank
732 7DBB A5 BF lda HitFlag
733 7DBD F0 05 beq LaserMisses
734 ; here we hit a tank (X)
735 7DBF A0 64 ldy #100
736 7DC1 20 74 57 jsr DecreaseEnergyX
737 7DC4 LaserMisses
738 7DC4 60 rts
739 .endp
740 ; -----------------
741 7DC5 .proc xmissile ;
742 ; -----------------
743 7DC5 20 0C 8F jsr CalculateExplosionRange
744 7DC8 NoRangeCalc
745 7DC8 A9 01 lda #1
746 7DCA 85 AB sta radius
747 7DCC 85 A9 sta color
748 7DCE ExplosionLoop
749 7DCE 20 4A 68 jsr circle
750 7DD1 E6 AB E6 AB :2 inc radius
751 7DD5 A5 AB lda radius
752 7DD7 C5 B0 cmp ExplosionRadius
753 7DD9 90 F3 bcc ExplosionLoop
754
755 7DDB A2 00 ldx #0
756 7DDD 86 A9 stx color
757 7DDF E8 inx
758 7DE0 86 AB stx radius
759 7DE2 ExplosionLoop2
760 7DE2 20 4A 68 jsr circle
761 7DE5 E6 AB inc radius
762 7DE7 A5 AB lda radius
763 7DE9 C5 B0 cmp ExplosionRadius
764 7DEB 90 F5 bcc ExplosionLoop2
765
766 7DED A9 01 85 A9 mva #1 color
767
768 ;check tanks' distance from the centre of the explosion
769
770 7DF1 A9 80 8D 73 43 mva #%10000000 drawFunction
771 ;the above switches Draw to measuring length
772 ;trick is easy - how many pixels does it take to draw
773 ;a line from one point to another
774 ;it must be somehow easier than regular Pitagoras
775 ;calculation
776
777 7DF6 A6 AE ldx NumberOfPlayers
778 7DF8 CA dex
779 7DF9 DistanceCheckLoop
780 7DF9 BD AF 43 lda eXistenZ,x
781 7DFC D0 03 4C 81 7E jeq EndOfDistanceCheckLoop
782 ;here the tank exist
783 7E01 BD 0D 44 lda XtankstableL,x
784 7E04 18 clc
785 7E05 69 03 adc #3 ;measure from middle of the tank
786 7E07 85 65 sta xbyte
787 7E09 BD 13 44 lda XtankstableH,x
788 7E0C 18 clc
789 7E0D 69 00 adc #0 ;measure from middle of the tank
790 7E0F 85 66 sta xbyte+1
791 7E11 BD 19 44 lda Ytankstable,x
792 7E14 38 sec
793 7E15 E9 02 sbc #2 ;measure from middle of the tank
794 7E17 85 67 sta ybyte
795 7E19 A9 00 lda #0
796 7E1B 85 68 sta ybyte+1
797 7E1D phx
Macro: PHX [Source: MACRO.ASM]
1 7E1D 8A txa
2 7E1E 48 pha
Source: weapons.asm
798 7E1F 20 12 66 jsr draw
799 7E22 plx
Macro: PLX [Source: MACRO.ASM]
1 7E22 68 pla
2 7E23 AA tax
Source: weapons.asm
800 ;if tank within range of the explosion?
801 7E24 A5 E2 lda LineLength+1
802 7E26 D0 59 bne TankIsNotWithinTheRange
803 7E28 A5 E1 lda LineLength
804 7E2A C5 B0 cmp ExplosionRadius
805 7E2C B0 53 bcs TankIsNotWithinTheRange
806 7E2E A5 B0 lda ExplosionRadius
807 7E30 38 sec
808 7E31 E5 E1 sbc LineLength
809 ;multiply difference by 8
810 7E33 18 clc
811 7E34 69 01 adc #1
812 7E36 0A 0A 0A :3 asl
813 7E39 A8 tay
814 ; check shields
815 7E3A BD FD 43 lda ActiveDefenceWeapon,x
816 7E3D C9 26 cmp #ind_Shield_________ ; one hit shield
817 7E3F F0 25 beq UseShield
818 7E41 C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute
819 7E43 F0 12 beq UseShieldWithEnergy
820 7E45 C9 27 cmp #ind_Heavy_Shield___ ; shield with energy
821 7E47 F0 0E beq UseShieldWithEnergy
822 7E49 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
823 7E4B F0 0A beq UseShieldWithEnergy
824 7E4D C9 25 cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc)
825 7E4F F0 06 beq UseShieldWithEnergy
826 7E51 20 74 57 jsr DecreaseEnergyX
827 7E54 4C 81 7E jmp EndOfDistanceCheckLoop
828 7E57 UseShieldWithEnergy
829 7E57 20 B0 57 jsr DecreaseShieldEnergyX
830 7E5A C0 00 cpy #0 ; is necessary to reduce tenk energy ?
831 7E5C F0 03 beq ShieldCoveredTank
832 7E5E 20 74 57 jsr DecreaseEnergyX
833 7E61 ShieldCoveredTank
834 7E61 BD A8 43 lda ShieldEnergy,x
835 7E64 D0 1B jne EndOfDistanceCheckLoop
836 7E66 ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :)
837 7E66 UseShield
838 7E66 A9 01 85 AA mva #1 Erase
839 7E6A A5 6C lda TankNr
840 7E6C 48 pha ; store TankNr
841 7E6D 86 6C stx TankNr ; store X in TankNr :)
842 7E6F 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield)
843 7E72 A9 00 lda #0
844 7E74 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defense weapons
845 7E77 85 AA sta Erase
846 7E79 20 2C 6A jsr DrawTankNr ; draw tank without shield
847 7E7C A6 6C ldx TankNr ; restore X value :)
848 7E7E 68 pla
849 7E7F 85 6C sta TankNr ; restore TankNr value :)
850 7E81 TankIsNotWithinTheRange
851 7E81 EndOfDistanceCheckLoop
852 7E81 CA dex
853 7E82 30 03 4C F9 7D jpl DistanceCheckLoop
854 7E87 A9 15 85 9E mva #sfx_silencer sfx_effect
855 7E8B 60 rts
856 .endp
857 ; -----------------
858 7E8C .proc xriotbomb ;
859 ; -----------------
860 7E8C A9 11 85 9E mva #sfx_riot_blast sfx_effect
861 7E90 A9 00 lda #0
862 7E92 85 AB sta radius
863 7E94 85 A9 sta color
864 7E96 rbombLoop
865 7E96 20 4A 68 jsr circle
866 7E99 E6 AB inc radius
867 7E9B A5 AB lda radius
868 7E9D C5 B0 cmp ExplosionRadius
869 7E9F D0 F5 bne rbombLoop
870 7EA1 A9 01 85 A9 mva #1 color
871 7EA5 60 rts
872 .endp
873 ; ----------------
874 7EA6 .proc xroller ;
875 ; now collisions are detected with modified draw routine
876 ; therefore YDRAW value must be taken from mountaintable
877 7EA6 20 5A 7F jsr checkRollDirection
878 ; HowMuchToFall - direction
879 ; $FF - we are in a hole (flying in missile direction)
880 ; 1 - right, 2 - left
881 7EA9 Rollin
882 7EA9 A9 0E 85 9E mva #sfx_shield_off sfx_effect
883 7EAD 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
884 7EBA A0 00 ldy #0
885 7EBC B1 78 lda (tempXROLLER),y
886 7EBE 8D 37 44 sta HeightRol ; relative point
887
888 7EC1 RollinContinues
889 7EC1 20 89 5A jsr WaitOneFrame
890 7EC4 20 89 5A jsr WaitOneFrame
891 ; new point is set
892 7EC7 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
893 7ED4 A0 00 ldy #0
894 7ED6 B1 78 lda (tempXROLLER),y
895 7ED8 85 63 sta ydraw
896 7EDA 84 64 sty ydraw+1
897 7EDC F0 43 beq ExplodeNow
898 7EDE CD 37 44 cmp HeightRol
899 7EE1 F0 02 beq UpNotYet
900 7EE3 90 3C bcc ExplodeNow
901 7EE5 UpNotYet
902 7EE5 38 sec ;clc
903 7EE6 8D 37 44 sta HeightRol
904 7EE9 E9 01 sbc #1
905 7EEB 85 63 sta ydraw
906 ;check tank collision prior to PLOT
907 7EED 84 BF sty HitFlag ; set to 0
908
909 7EEF 20 84 8E jsr CheckCollisionWithTank
910
911 7EF2 A5 BF lda HitFlag
912 7EF4 D0 2B bne ExplodeNow
913 7EF6 20 71 75 jsr unPlot
914 ; let's go the right direction
915 7EF9 A5 C5 lda HowMuchToFall
916 7EFB C9 01 cmp #1
917 7EFD F0 10 beq HowMuchToFallRight2
918 7EFF A5 61 D0 02 C6 62 + .nowarn dew xdraw
919 7F07 A5 61 lda xdraw
920 7F09 05 62 ora xdraw+1
921 7F0B D0 B4 jne RollinContinues ; like cpw xdraw #0
922 7F0D F0 12 beq ExplodeNow
923 7F0F HowMuchToFallRight2
924 7F0F E6 61 D0 02 E6 62 inw xdraw
925 7F15 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
926 7F1F D0 A0 jne RollinContinues
927 7F21 ExplodeNow
928 7F21 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store somewhere (BAD)
929 7F29 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw (BAD)
930 7F31 A9 00 85 61 85 62 mwa #0 xdraw
931 7F37 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
932 7F3F 20 71 75 jsr unPlot
933 7F42 A5 B3 85 61 A5 B4 + mwa xcircle xdraw ;(bad)
934 7F4A A5 B5 85 63 A5 B6 + mwa ycircle ydraw ;(bad)
935
936 ; finally a little explosion
937 7F52 A9 05 85 9E mva #sfx_baby_missile sfx_effect
938 7F56 4C C5 7D jmp xmissile
939 7F59 60 rts
940 .endp
941 ; --------------------------------------------------
942 7F5A .proc checkRollDirection
943 ; check rolling direction (for roller and other rolling weapons)
944 ; xdraw (word) - X coordinate
945 ; Y coordinate is taken from mountaintable and go to ydraw (word)
946 ; shoot direction is taken from VX+3
947 ; result:
948 ; HowMuchToFall - direction
949 ; $FF - we are in a hole (flying in missile direction)
950 ; 1 - right, 2 - left
951 ; --------------------------------------------------
952 7F5A A0 00 ldy #0
953 7F5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
954 7F69 B1 78 lda (tempXROLLER),y
955 7F6B 85 63 sta ydraw
956 7F6D 84 64 sty ydraw+1
957
958 7F6F A5 BE lda vx+3
959 ; if horizontal velocity is negative then change the direction
960 7F71 10 06 bpl PositiveVelocity
961 7F73 A5 E6 lda goleft
962 7F75 09 01 ora #$01
963 7F77 85 E6 sta goleft
964 7F79 PositiveVelocity
965 ; first we look for the left slope
966 ; then righ slope and set the flag
967 ; $FF - we are in a hole (flying in missile direction)
968 ; 1 - right, 2 - left
969 7F79 A9 FF 85 C5 mva #$ff HowMuchToFall
970 7F7D A5 63 8D 37 44 mva ydraw HeightRol
971 7F82 SeekLeft
972 7F82 A5 79 C9 46 D0 04 + cpw tempXROLLER #mountaintable
973 7F8C F0 13 beq GoRightNow ; "bounce" if we have on left end
974 7F8E A5 78 D0 02 C6 79 + .nowarn dew tempXROLLER
975 7F96 B1 78 lda (tempXROLLER),y ;fukk! beware of Y value
976 7F98 CD 37 44 cmp HeightRol
977 7F9B HowMuchToFallLeft
978 7F9B B0 04 bcs GoRightNow
979 7F9D A9 01 85 C5 mva #1 HowMuchToFall
980 7FA1 GoRightNow
981 7FA1 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER
982 7FAE SeekRight
983 7FAE A5 79 C9 47 D0 04 + cpw tempXROLLER #(mountaintable+screenwidth)
984 7FB8 F0 1B beq HowMuchToFallKnown ; "stop" if we have on left end
985 7FBA E6 78 D0 02 E6 79 inw tempXROLLER
986 7FC0 B1 78 lda (tempXROLLER),y
987 7FC2 CD 37 44 cmp HeightRol
988 7FC5 HowMuchToFallRight
989 7FC5 B0 0E bcs HowMuchToFallKnown
990 7FC7 A5 C5 lda HowMuchToFall
991 7FC9 10 06 bpl ItIsLeftAlready
992 7FCB A9 02 85 C5 mva #2 HowMuchToFall
993 7FCF D0 04 bne HowMuchToFallKnown
994 7FD1 ItIsLeftAlready
995 7FD1 A9 FF 85 C5 mva #$ff HowMuchToFall
996 7FD5 HowMuchToFallKnown
997 7FD5 A5 C5 lda HowMuchToFall
998 7FD7 10 07 bpl DirectionChecked
999 7FD9 A9 01 lda #1
1000 7FDB 18 clc
1001 7FDC 65 E6 adc goleft
1002 7FDE 85 C5 sta HowMuchToFall
1003 7FE0 DirectionChecked
1004 7FE0 60 rts
1005 .endp
1006
1007 ; --------------------------------------------------
1008 7FE1 .proc ofdirt ;
1009 ; --------------------------------------------------
1010 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height
1011 7FE1 A9 13 85 9E mva #sfx_dirt_chrg_s sfx_effect
1012
1013 7FE5 A9 01 85 A9 mva #1 color
1014 7FE9 NoColor ; jump here with color=0 to clean dirt
1015 7FE9 A5 61 85 B3 A5 62 + mwa xdraw xcircle
1016 7FF1 A5 63 85 B5 A5 64 + mwa ydraw ycircle
1017 7FF9 A9 01 lda #1
1018 ; current dirt width
1019 7FFB 85 C6 sta magic
1020 7FFD NextRow
1021 7FFD 20 89 5A jsr WaitOneFrame
1022 8000 A4 C6 ldy magic
1023 8002 NextLine
1024 8002 AD 1B D4 lda random
1025 8005 29 01 and #$01
1026 8007 F0 07 beq DoNotPlot
1027 8009 84 C7 sty magic+1
1028 800B 20 14 76 jsr plot
1029 800E A4 C7 ldy magic+1
1030 8010 DoNotPlot
1031 8010 E6 61 D0 02 E6 62 inw xdraw
1032 8016 88 dey
1033 8017 D0 E9 bne NextLine
1034 8019 C6 63 dec ydraw ; 1 line up
1035 801B A5 63 lda ydraw
1036 801D C9 FF cmp #$ff
1037 801F F0 1B beq EndOfTheDirt ;if horizontal Counter wraps
1038 8021 E6 C6 inc magic ; width+2
1039 8023 E6 C6 inc magic
1040 8025 A5 C6 lda magic
1041 8027 85 C7 sta magic+1 ; just for a second
1042 8029 46 C7 lsr magic+1
1043 802B 38 sec
1044 802C A5 B3 lda xcircle
1045 802E E5 C7 sbc magic+1
1046 8030 85 61 sta xdraw
1047 8032 A5 B4 lda xcircle+1
1048 8034 E9 00 sbc #0
1049 8036 85 62 sta xdraw+1 ; new starting coordinate in a given row
1050 8038 C6 B0 dec ExplosionRadius
1051 803A D0 C1 bne NextRow
1052 803C EndOfTheDirt
1053 803C A5 B3 85 61 A5 B4 + mwa xcircle xdraw
1054 8044 A5 B5 85 63 A5 B6 + mwa ycircle ydraw
1055 804C 60 rts
1056 .endp
1057 ;--------------------------------------------------
1058 804D .proc BeforeFire ;TankNr (byte)
1059 ;--------------------------------------------------
1060 ;this nice routine makes the whole shooting
1061 ;preparation: aiming and displaying
1062 ;angle and shooting force values
1063 ;
1064
1065 ;first, get current parameters (angle+force)
1066 ;for an active tank and display them
1067 ;(these values are taken from the previous round)
1068
1069 804D A6 6C ldx TankNr
1070
1071 ;Checking the maximal force
1072 804F BD EB 43 lda MaxForceTableH,x
1073 8052 DD DF 43 cmp ForceTableH,x
1074 8055 D0 06 bne ContinueToCheckMaxForce2
1075 8057 BD E5 43 lda MaxForceTableL,x
1076 805A DD D9 43 cmp ForceTableL,x
1077 805D ContinueToCheckMaxForce2
1078 805D B0 0C bcs @+
1079 805F BD EB 43 lda MaxForceTableH,x
1080 8062 9D DF 43 sta ForceTableH,x
1081 8065 BD E5 43 lda MaxForceTableL,x
1082 8068 9D D9 43 sta ForceTableL,x
1083 @
1084 806B A9 00 85 AA mva #0 Erase
1085 806F 20 0F 66 jsr PutTankNameOnScreen
1086 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
1087
1088 8072 20 2C 6A jsr DrawTankNr
1089
1090 8075 20 89 5A jsr WaitOneFrame ; best after drawing a tank
1091
1092 8078 24 97 bit TestFlightFlag
1093 807A 10 03 bpl @+
1094 807C 20 23 83 jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation
1095 @
1096 ;keyboard reading
1097 ; KBCODE keeps code of last keybi
1098 ; SKSTAT $ff - nothing pressed
1099 ; $FB - any key
1100 ; $f7 - shift
1101 ; $f3 - shift+key
1102
1103 807F notpressed
1104 807F A6 6C ldx TankNr ; for optimize
1105 ; Select and Option
1106 8081 A5 02 lda CONSOL
1107 8083 A8 tay
1108 8084 29 05 and #%00000101 ; Start + Option
1109 8086 F0 2C beq QuitToGameover
1110 8088 98 tya
1111 8089 29 04 and #%00000100
1112 808B F0 3C beq callActivation ; Option key
1113 808D 98 tya
1114 808E 29 02 and #%00000010
1115 8090 D0 03 4C A0 82 jeq pressedTAB ; Select key
1116 8095 A5 02 lda SKSTAT
1117 8097 C9 FF cmp #$ff
1118 8099 D0 03 4C 52 81 jeq checkJoy
1119 809E C9 F7 cmp #$f7 ; SHIFT
1120 80A0 D0 03 4C 52 81 jeq checkJoy
1121
1122 80A5 A5 02 lda kbcode
1123 80A7 29 BF and #%10111111 ; SHIFT elimination
1124
1125 80A9 C9 08 cmp #@kbcode._O ; $08 ; O
1126 80AB D0 0C bne @+
1127 80AD 20 AE 73 jsr AreYouSure
1128 80B0 24 D7 bit escFlag
1129 80B2 10 CB bpl notpressed
1130 ;---O pressed-quit game to game over screen---
1131 80B4 QuitToGameover
1132 80B4 A9 40 85 D7 mva #$40 escFlag
1133 80B8 60 rts
1134 @
1135 80B9 C9 1C cmp #@kbcode._esc ; 28 ; ESC
1136 80BB D0 08 bne @+
1137 80BD 20 AE 73 jsr AreYouSure
1138 80C0 24 D7 bit escFlag
1139 80C2 10 BB bpl notpressed
1140 ;---esc pressed-quit game---
1141 80C4 60 rts
1142 @
1143 80C5 C9 3F cmp #@kbcode._A ; $3f ; A
1144 80C7 D0 09 bne @+
1145 80C9 callActivation
1146 ; Hide all tanks - after inventory they may have other shapes
1147 80C9 20 0B 6A jsr ClearTanks
1148 80CC 20 AC 63 jsr DefensivesActivate
1149 80CF 4C E0 80 jmp afterInventory
1150
1151 @
1152 80D2 C9 0D cmp #@kbcode._I ; $0d ; I
1153 80D4 D0 2D bne @+
1154 80D6 callInventory
1155 ; Hide all tanks - after inventory they may have other shapes
1156 80D6 20 0B 6A jsr ClearTanks
1157 ;
1158 80D9 A9 FF 85 E4 mva #$ff isInventory
1159 80DD 20 C0 63 jsr Purchase
1160 80E0 afterInventory
1161 80E0 20 89 5A jsr MakeDarkScreen
1162 80E3 20 0F 66 jsr DisplayStatus
1163 80E6 20 E4 76 jsr SetMainScreen
1164 80E9 20 12 6A jsr DrawTanks
1165 ;jsr WaitOneFrame ; not necessary
1166 80EC 24 5E bit LazyFlag
1167 80EE 50 03 bvc NoLazy
1168 80F0 20 4A 8B jsr LazyBoys
1169 80F3 NoLazy
1170 80F3 24 5F bit SpyHardFlag
1171 80F5 10 03 bpl NoSpyHard
1172 80F7 20 FC 8A jsr SpyHard
1173 80FA NoSpyHard
1174 80FA RmtSong song_ingame
Macro: RMTSONG [Source: scorchC64.asm]
1 80FA A9 06 lda #SONG_INGAME ; do nothing in C64
Source: weapons.asm
1175 80FC A9 00 85 D7 mva #0 escFlag
1176 8100 4C F3 82 jmp ReleaseAndLoop
1177 @
1178 8103 C9 8E cmp #$80|@kbcode._up
1179 8105 D0 03 4C AD 81 jeq CTRLPressedUp
1180 810A C9 8F cmp #$80|@kbcode._down
1181 810C D0 03 4C E8 81 jeq CTRLPressedDown
1182 8111 C9 AC cmp #$80|@kbcode._tab
1183 8113 D0 03 4C BF 82 jeq CTRLPressedTAB
1184
1185 8118 jumpFromStick
1186 .IF TARGET = 800
1187 cmp #$80|17 ; Ctrl+Help
1188 bne NoVdebugSwitch
1189 lda Vdebug
1190 eor #$ff
1191 sta Vdebug
1192 jmp ReleaseAndLoop
1193 NoVdebugSwitch
1194 .ENDIF
1195 8118 29 3F and #$3f ;CTRL and SHIFT ellimination
1196 811A C9 0E cmp #@kbcode._up ; $e
1197 811C F0 55 jeq pressedUp
1198 811E C9 0F cmp #@kbcode._down ; $f
1199 8120 D0 03 4C BE 81 jeq pressedDown
1200 8125 C9 06 cmp #@kbcode._left ; $6
1201 8127 D0 03 4C 51 82 jeq pressedLeft
1202 812C C9 07 cmp #@kbcode._right ; $7
1203 812E D0 03 4C 02 82 jeq pressedRight
1204 8133 C9 21 cmp #@kbcode._space ; $21
1205 8135 D0 03 4C F9 82 jeq pressedSpace
1206 813A C9 2C cmp #@kbcode._tab ; $2c
1207 813C D0 03 4C A0 82 jeq pressedTAB
1208 8141 C9 25 cmp #@kbcode._M ; $25 ; M
1209 8143 D0 03 4C DE 82 jeq pressedM
1210 8148 C9 3E cmp #@kbcode._S ; $3e ; S
1211 814A D0 03 4C EB 82 jeq pressedS
1212 .IF TARGET = 800
1213 cmp #61 ; G
1214 bne EndKeys
1215 jsr SelectNextGradient.NotWind
1216 jmp ReleaseAndLoop
1217 .ENDIF
1218 814F EndKeys
1219 814F 4C 7F 80 jmp notpressed
1220 8152 checkJoy
1221 ;------------JOY-------------
1222 ;happy happy joy joy
1223 ;check for joystick now
1224 8152 A5 02 lda STICK0
1225 8154 29 0F and #$0f
1226 8156 C9 0F cmp #$0f
1227 8158 F0 0B beq notpressedJoy
1228 815A A8 tay
1229 815B A9 00 85 02 mva #0 ATRACT ; reset atract mode
1230 815F B9 5A 60 lda joyToKeyTable,y
1231 8162 4C 18 81 jmp jumpFromStick
1232 8165 notpressedJoy
1233 ;fire
1234 8165 A5 02 lda STRIG0
1235 8167 D0 03 4C F9 82 jeq pressedSpace
1236 816C A9 FF 85 9B mva #$ff pressTimer ; stop counting frames
1237 8170 4C 7F 80 jmp notpressed
1238
1239 ;
1240 8173 pressedUp
1241 8173 A5 9B lda pressTimer
1242 8175 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0
1243 817B C9 19 cmp #25 ; 1/2s
1244 817D B0 2E bcs CTRLPressedUp
1245
1246
1247 ;force increaseeee!
1248 ;ldx TankNr ; optimized
1249 817F FE D9 43 inc ForceTableL,x
1250 8182 D0 03 bne CheckingMaxForce
1251 8184 FE DF 43 inc ForceTableH,x
1252
1253 8187 CheckingMaxForce
1254
1255 8187 A9 00 85 9E mva #sfx_set_power_1 sfx_effect
1256
1257 818B BD EB 43 lda MaxForceTableH,x
1258 818E DD DF 43 cmp ForceTableH,x
1259 8191 D0 06 bne FurtherCheckMaxForce
1260 8193 BD E5 43 lda MaxForceTableL,x
1261 8196 DD D9 43 cmp ForceTableL,x
1262 8199 FurtherCheckMaxForce
1263 8199 90 03 4C 4D 80 jcs BeforeFire
1264
1265 819E BD EB 43 lda MaxForceTableH,x
1266 81A1 9D DF 43 sta ForceTableH,x
1267 81A4 BD E5 43 lda MaxForceTableL,x
1268 81A7 9D D9 43 sta ForceTableL,x
1269
1270 81AA 4C 4D 80 jmp BeforeFire
1271
1272 81AD CTRLPressedUp
1273 ;ldx TankNr ; optimized
1274 81AD BD D9 43 lda ForceTableL,x
1275 81B0 18 clc
1276 81B1 69 0A adc #10
1277 81B3 9D D9 43 sta ForceTableL,x
1278 81B6 90 CF bcc CheckingMaxForce
1279 81B8 FE DF 43 inc ForceTableH,x
1280 81BB 4C 87 81 jmp CheckingMaxForce
1281
1282
1283 81BE pressedDown
1284 81BE A5 9B lda pressTimer
1285 81C0 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0
1286 81C6 C9 19 cmp #25 ; 1/2s
1287 81C8 B0 1E bcs CTRLPressedDown
1288
1289 81CA A9 00 85 9E mva #sfx_set_power_1 sfx_effect
1290
1291 ;ldx TankNr ; optimized
1292 81CE DE D9 43 dec ForceTableL,x
1293 81D1 BD D9 43 lda ForceTableL,x
1294 81D4 C9 FF cmp #$ff
1295 81D6 D0 0D bne @+
1296 81D8 DE DF 43 dec ForceTableH,x
1297 81DB 10 08 bpl @+
1298 81DD ForceGoesZero
1299 81DD A9 00 lda #0
1300 81DF 9D DF 43 sta ForceTableH,x
1301 81E2 9D D9 43 sta ForceTableL,x
1302 @
1303 81E5 4C 4D 80 jmp BeforeFire
1304
1305 81E8 CTRLPressedDown
1306 81E8 A9 00 85 9E mva #sfx_set_power_1 sfx_effect
1307
1308 ;ldx TankNr ; optimized
1309 81EC 38 sec
1310 81ED BD D9 43 lda ForceTableL,x
1311 81F0 E9 0A sbc #10
1312 81F2 9D D9 43 sta ForceTableL,x
1313 81F5 90 03 4C 4D 80 jcs BeforeFire
1314 81FA DE DF 43 dec ForceTableH,x
1315 81FD 30 DE bmi ForceGoesZero
1316 81FF 4C 4D 80 jmp BeforeFire
1317
1318 8202 pressedRight
1319 ;ldx TankNr ; optimized
1320 8202 A5 9B lda pressTimer
1321 8204 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0
1322 820A C9 19 cmp #25 ; 1/2s
1323 820C B0 20 bcs CTRLPressedRight
1324
1325 820E A9 01 85 9E mva #sfx_set_power_2 sfx_effect
1326 8212 A9 01 85 AA mva #1 Erase
1327 8216 20 48 6B jsr DrawTankNr.BarrelChange
1328 8219 DE C3 48 BD C3 48 dec:lda AngleTable,x
1329 821F C9 FF cmp #255 ; -1
1330 8221 F0 03 4C 4D 80 jne BeforeFire
1331 8226 A9 B4 lda #180
1332 8228 9D C3 48 sta AngleTable,x
1333 822B 4C 4D 80 jmp BeforeFire
1334
1335 822E CTRLPressedRight
1336 ;ldx TankNr ; optimized
1337 822E A9 01 85 9E mva #sfx_set_power_2 sfx_effect
1338 8232 A9 01 85 AA mva #1 Erase
1339 8236 20 48 6B jsr DrawTankNr.BarrelChange
1340 8239 BD C3 48 lda AngleTable,x
1341 823C 38 sec
1342 823D E9 04 sbc #4
1343 823F 9D C3 48 sta AngleTable,x
1344 8242 C9 04 cmp #4 ; smallest angle for speed rotating
1345 8244 90 03 4C 4D 80 jcs BeforeFire
1346 8249 A9 B4 lda #180
1347 824B 9D C3 48 sta AngleTable,x
1348 824E 4C 4D 80 jmp BeforeFire
1349
1350
1351 8251 pressedLeft
1352 ;ldx TankNr ; optimized
1353 8251 A5 9B lda pressTimer
1354 8253 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0
1355 8259 C9 19 cmp #25 ; 1/2s
1356 825B B0 20 bcs CTRLPressedLeft
1357
1358 825D A9 01 85 9E mva #sfx_set_power_2 sfx_effect
1359 8261 A9 01 85 AA mva #1 Erase
1360 8265 20 48 6B jsr DrawTankNr.BarrelChange
1361 8268 FE C3 48 INC AngleTable,x
1362 826B BD C3 48 lda AngleTable,x
1363 826E C9 B4 cmp #180
1364 8270 B0 03 4C 4D 80 jcc BeforeFire
1365 8275 A9 00 lda #0
1366 8277 9D C3 48 sta AngleTable,x
1367 827A 4C 4D 80 jmp BeforeFire
1368
1369 827D CTRLPressedLeft
1370 ;ldx TankNr ; optimized
1371 827D A9 01 85 9E mva #sfx_set_power_2 sfx_effect
1372 8281 A9 01 85 AA mva #1 Erase
1373 8285 20 48 6B jsr DrawTankNr.BarrelChange
1374 8288 BD C3 48 lda AngleTable,x
1375 828B 18 clc
1376 828C 69 04 adc #4
1377 828E 9D C3 48 sta AngleTable,x
1378 8291 C9 B0 cmp #180-4
1379 8293 B0 03 4C 4D 80 jcc BeforeFire
1380 8298 A9 00 lda #0
1381 829A 9D C3 48 sta AngleTable,x
1382 829D 4C 4D 80 jmp BeforeFire
1383
1384 82A0 pressedTAB
1385 82A0 A9 17 85 9E mva #sfx_purchase sfx_effect
1386 ;ldx TankNr ; optimized
1387 82A4 BD F7 43 lda ActiveWeapon,x
1388 82A7 C9 1F cmp #last_offensive_____ ; the last possible offensive weapon
1389 82A9 D0 07 bne ?notlasttofirst
1390 82AB A9 00 lda #first_offensive____ ; #0
1391 82AD 9D F7 43 sta ActiveWeapon,x
1392 82B0 F0 03 beq @+ ; allways = 0
1393 82B2 ?notlasttofirst
1394 82B2 FE F7 43 inc ActiveWeapon,x
1395 @
1396 82B5 BD F7 43 lda ActiveWeapon,x
1397 82B8 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff....
1398 82BB F0 E3 beq pressedTAB
1399 82BD D0 34 bne ReleaseAndLoop
1400
1401 82BF CTRLpressedTAB
1402 82BF A9 17 85 9E mva #sfx_purchase sfx_effect
1403 ;ldx TankNr ; optimized
1404 82C3 BD F7 43 lda ActiveWeapon,x
1405 82C6 C9 00 cmp #first_offensive____ ; #0
1406 82C8 D0 07 bne ?notfirsttolast
1407 82CA A9 1F lda #last_offensive_____ ; the last possible offensive weapon
1408 82CC 9D F7 43 sta ActiveWeapon,x
1409 82CF D0 03 bne @+ ; allways <> 0
1410 82D1 ?notfirsttolast
1411 82D1 DE F7 43 dec ActiveWeapon,x
1412 @
1413 82D4 BD F7 43 lda ActiveWeapon,x
1414 82D7 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff....
1415 82DA F0 E3 beq CTRLpressedTAB
1416 82DC D0 15 bne ReleaseAndLoop
1417
1418 82DE pressedM
1419 ; have you tried turning the music off and on again?
1420 82DE A9 FF lda #$ff
1421 82E0 4D 00 41 8D 00 41 eor:sta noMusic
1422 82E6 RmtSong song_ingame
Macro: RMTSONG [Source: scorchC64.asm]
1 82E6 A9 06 lda #SONG_INGAME ; do nothing in C64
Source: weapons.asm
1423 82E8 4C F3 82 jmp ReleaseAndLoop
1424
1425 82EB pressedS
1426 ; have you tried turning sfx off and on again?
1427 82EB A9 FF lda #$ff
1428 82ED 4D 01 41 8D 01 41 eor:sta noSfx
1429 82F3 ReleaseAndLoop
1430 82F3 20 71 5A jsr WaitForKeyRelease
1431 82F6 4C 4D 80 jmp BeforeFire
1432
1433 82F9 pressedSpace
1434 ;=================================
1435 ;we shoot here!!!
1436 82F9 A9 00 lda #0
1437 82FB 85 02 sta ATRACT ; reset atract mode
1438 82FD 85 9B sta pressTimer ; reset
1439 82FF 20 71 5A jsr WaitForKeyRelease.StillWait
1440 8302 A5 9B lda pressTimer
1441 8304 C9 19 cmp #25 ; 1/2s
1442 8306 90 03 bcc fire
1443 8308 4C D6 80 jmp callInventory
1444 830B fire
1445 830B 60 RTS
1446 .endp
1447
1448 ;--------------------------------------------------
1449 830C .proc Shoot ;TankNr (byte)
1450 ;--------------------------------------------------
1451 ;it looks like this routine is too big -
1452 ;- more and more functions were being added...
1453 ;good idea would be to rewrite it completely
1454 ;with much more separate blocks, but you know -
1455 ;- do not touch it if it works...
1456
1457 830C A9 00 85 97 mva #0 TestFlightFlag
1458
1459 ;the latest addition to this routine is
1460 ;displaying offensive texts!
1461
1462 8310 RandomizeOffensiveText
1463 8310 AD 1B D4 lda random
1464 8313 C9 36 cmp #talk.NumberOfOffensiveTexts
1465 8315 B0 F9 bcs RandomizeOffensiveText
1466
1467 8317 8D C0 48 sta TextNumberOff
1468 831A A4 6C ldy TankNr
1469 831C A9 FF 85 DB mva #$ff plot4x4color
1470 8320 20 88 72 jsr DisplayOffensiveTextNr
1471
1472 8323 AfterOffensiveText
1473 8323 A9 00 8D 8B 44 mva #0 LaserFlag ; $ff - Laser
1474 8328 A6 6C ldx TankNr
1475 832A BD F7 43 lda ActiveWeapon,x
1476 832D C9 1F cmp #ind_Laser__________ ; laser
1477 832F D0 15 bne NotStrongShoot
1478 ; Laser: (not)very strong - invisible - shot for laser beam end coordinates
1479 8331 24 60 bit Vdebug
1480 8333 30 04 bmi @+
1481 8335 A9 00 85 A9 mva #0 color
1482 8339 A9 01 @ lda #1
1483 833B 85 A4 sta Force
1484 833D 85 A5 sta Force+1
1485 833F A9 FF 8D 8B 44 mva #$ff LaserFlag ; $ff - Laser
1486 8344 D0 0B bne AfterStrongShoot
1487 8346 NotStrongShoot
1488 8346 20 96 59 jsr Table2Force
1489 8349 24 97 bit TestFlightFlag
1490 834B 30 04 bmi AfterStrongShoot
1491 834D A9 19 85 9E mva #sfx_shoot sfx_effect
1492 8351 AfterStrongShoot
1493 8351 BD C3 48 lda AngleTable,x
1494 8354 85 A7 sta Angle
1495
1496 ; Shoots tank nr X !!! :)
1497 ; set the starting coordinates of bullet with correction
1498 ; to start where the tank's barrel ends
1499 ; (without it bullet would go from the left lower corner of the tank)
1500 ;ldx TankNr
1501
1502 8356 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1
1503 8360 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1
1504 8365 A9 00 lda #0
1505 8367 85 A6 sta Force+2
1506 8369 85 CD sta ytraj+2
1507 836B 85 C8 sta xtraj
1508 836D 85 CB sta ytraj
1509
1510 ; checking if the shot is underground (no Flight but Hit :) )
1511 836F A8 tay ; A=0 !
1512 8370 18 A5 C9 69 3E 85 + adw xtraj+1 #mountaintable temp
1513 837D A5 CC lda ytraj+1
1514 837F D1 72 cmp (temp),y ; check collision with mountains
1515 8381 B0 08 bcs ShotUnderGround
1516 8383 20 A0 83 jsr Flight
1517 8386 A9 01 85 A9 mva #1 color
1518 838A 60 rts
1519 838B ShotUnderGround
1520 838B A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!???
1521 8393 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw
1522 839B A9 FF 85 BF mva #$ff HitFlag
1523 839F 60 rts
1524 .endp
1525
1526 ;--------------------------------------------------
1527 83A0 .proc Flight ; Force(byte.byte), Wind(0.word)
1528 ; Angle(byte) 128=0, 255=maxright, 0=maxleft
1529 ; if 7bit and 6bit of TestFlightFlag is set no real flight - hit test only (for AI)
1530 ; 7bit - fast, test flight
1531 ; 6bit - invisible bullet
1532 ;--------------------------------------------------
1533 ;g=-0.1
1534 ;vx=Force*cos(Angle)
1535 ;vy=Force*sin(Angle)
1536 ;
1537 ;:begin
1538 ;ytraj=ytray-vy
1539 ;vy=vy-g
1540 ;xtraj=xtraj+vx - without Wind
1541 ;vx=vx+Wind (Wind is a small fraction)
1542 ;plot xtraj,ytraj - there is clearing in plot
1543 ;goto begin-
1544
1545
1546 ; smoke tracer :)
1547 83A0 A0 00 ldy #0
1548 83A2 24 97 bit TestFlightFlag ; if test flight for AI or Lazy Darwin
1549 83A4 30 0A bmi noSmokeTracer ; no Smoke Tracer display
1550 83A6 A6 6C ldx TankNr
1551 83A8 BD F7 43 lda ActiveWeapon,x
1552 83AB C9 0B cmp #ind_Smoke_Tracer___ ; Smoke tracer
1553 83AD D0 01 bne noSmokeTracer
1554 83AF C8 iny
1555 83B0 noSmokeTracer
1556 83B0 8C 8A 44 sty SmokeTracerFlag
1557
1558 83B3 RepeatIfSmokeTracer
1559 83B3 RepeatFlight
1560 83B3 A5 CC 8D 92 44 A5 + mwa ytraj+1 Ytrajold+1
1561 83BD A5 C9 8D 8F 44 A5 + mwa xtraj+1 Xtrajold+1
1562 83C7 A9 40 8D 73 43 mva #%01000000 drawFunction
1563
1564 83CC A9 00 lda #0
1565 83CE 85 BB sta vx
1566 83D0 85 BC sta vx+1
1567 83D2 85 BD sta vx+2
1568 83D4 85 BF sta HitFlag
1569 83D6 85 61 sta xdraw
1570 83D8 85 62 sta xdraw+1
1571 83DA 85 63 sta ydraw
1572 83DC 85 64 sta ydraw+1
1573
1574 ;vx calculation
1575 ;vx = sin(90-Angle) for Angle <=90
1576 ;vx = -sin(Angle-90) for 90 < Angle <= 180
1577 83DE aslw Force ;Force = Force * 2
Macro: ASLW [Source: MACRO.ASM]
1 83DE 06 A4 ASL FORCE
2 83E0 26 A5 ROL FORCE+1
Source: weapons.asm
1578
1579 ;cos(Angle) (but we use sin table only so some shenanigans happen)
1580 83E2 A6 A7 ldx Angle
1581 83E4 8E 15 45 stx LeapFrogAngle ; we will need it later
1582
1583 ;Angle works like this:
1584 ;0 'degrees' is horizontally right
1585 ;90 'degrees' is straight up
1586 ;180 horizontally left
1587
1588 ; (we have to set goleft used in rolling weapons)
1589
1590 83E7 E0 5B cpx #91
1591 83E9 90 0C bcc angleUnder90
1592
1593 ;over 90
1594 83EB A9 01 85 E6 mva #1 goleft
1595 83EF 38 sec
1596 83F0 8A txa ; lda # Angle
1597 83F1 E9 5A sbc #90
1598 83F3 AA tax
1599 83F4 4C 01 84 jmp @+
1600
1601 83F7 angleUnder90
1602 83F7 A9 00 85 E6 mva #0 goleft
1603 83FB 38 sec ; X = 90-Angle
1604 83FC A9 5A lda #90
1605 83FE E5 A7 sbc Angle
1606 8400 AA tax
1607 @
1608 8401 BD C1 5B lda sintable,x ; cos(X)
1609 8404 8D 94 44 sta Multiplee ; *Force
1610 8407 A5 A4 85 DC A5 A5 + mwa Force Multiplier
1611 840F A9 00 lda #$0
1612 8411 85 DE sta Multiplier+2
1613 8413 A2 08 ldx #8
1614 8415 MultiplyLoop
1615 8415 6E 94 44 ror Multiplee
1616 8418 90 13 bcc DoNotAdd
1617 841A 18 clc
1618 841B A5 DC lda Multiplier
1619 841D 65 BB adc vx
1620 841F 85 BB sta vx
1621 8421 A5 DD lda Multiplier+1
1622 8423 65 BC adc vx+1
1623 8425 85 BC sta vx+1
1624 8427 A5 DE lda Multiplier+2
1625 8429 65 BD adc vx+2
1626 842B 85 BD sta vx+2
1627 842D DoNotAdd
1628 ;clc ;carry always cleared here (anyway we hope so :)
1629 842D 26 DC rol Multiplier
1630 842F 26 DD rol Multiplier+1
1631 8431 26 DE rol Multiplier+2
1632 8433 CA dex
1633 8434 D0 DF bne MultiplyLoop
1634
1635 8436 A9 00 85 BE mva #0 vx+3
1636 ; here in vx there is a number
1637 ; xxxx.xx00 = sin(Angle)*Force
1638 ; negate it if going left
1639 843A A5 E6 lda goleft
1640 843C F0 18 beq @+
1641 .rept 4
1642 LDA #$00
1643 SBC VX+#
1644 STA VX+#
1645 .endr
Source: REPT
1642 843E A9 00 LDA #$00
1642 8440 E5 BB SBC VX+#
1642 8442 85 BB STA VX+#
1642 8444 A9 00 LDA #$00
1642 8446 E5 BC SBC VX+#
1642 8448 85 BC STA VX+#
1642 844A A9 00 LDA #$00
1642 844C E5 BD SBC VX+#
1642 844E 85 BD STA VX+#
1642 8450 A9 00 LDA #$00
1642 8452 E5 BE SBC VX+#
1642 8454 85 BE STA VX+#
Source: weapons.asm
1646 @
1647 ;======vy
1648 ;vy = sin(Angle) for Angle <=90
1649 ;vy = sin(180-Angle) for 90 < Angle <= 180
1650
1651 8456 A9 00 lda #0
1652 8458 85 B7 sta vy
1653 845A 85 B8 sta vy+1
1654 845C 85 B9 sta vy+2
1655 ;--
1656 845E A6 A7 ldx Angle
1657 8460 E0 5B cpx #91
1658 8462 90 06 bcc YangleUnder90
1659
1660 8464 A9 B4 lda #180
1661 8466 38 sec
1662 8467 E5 A7 sbc Angle
1663 8469 AA tax
1664
1665 846A YangleUnder90
1666 846A BD C1 5B lda sintable,x
1667
1668 846D 8D 94 44 sta Multiplee ;sin(Angle)*Force
1669 8470 A5 A4 85 DC A5 A5 + mwa Force Multiplier
1670 8478 A9 00 lda #$0
1671 847A 85 DE sta Multiplier+2
1672 847C A2 08 ldx #8
1673 847E MultiplyLoopY
1674 847E 6E 94 44 ror Multiplee
1675 8481 90 13 bcc DoNotAddY
1676 8483 18 clc
1677 8484 A5 DC lda Multiplier
1678 8486 65 B7 adc vy
1679 8488 85 B7 sta vy
1680 848A A5 DD lda Multiplier+1
1681 848C 65 B8 adc vy+1
1682 848E 85 B8 sta vy+1
1683 8490 A5 DE lda Multiplier+2
1684 8492 65 B9 adc vy+2
1685 8494 85 B9 sta vy+2
1686 8496 DoNotAddY
1687 ;clc ;carry always cleared here (anyway we hope so :)
1688 8496 26 DC rol Multiplier
1689 8498 26 DD rol Multiplier+1
1690 849A 26 DE rol Multiplier+2
1691 849C CA dex
1692 849D D0 DF bne MultiplyLoopY
1693 ; here in vy there is a number
1694 ; yyyy.yy=cos(Angle)*Force
1695
1696 849F A9 00 85 BA mva #0 vy+3 ;vy=cos(Angle)*Force
1697
1698 84A3 Loopi
1699 ;ytraj=ytraj-vy (skipping least significant byte of vy)
1700 84A3 38 sec
1701 84A4 A5 CB lda ytraj
1702 84A6 E5 B8 sbc vy+1
1703 84A8 85 CB sta ytraj
1704 84AA A5 CC lda ytraj+1
1705 84AC E5 B9 sbc vy+2
1706 84AE 85 CC sta ytraj+1
1707 84B0 A5 CD lda ytraj+2
1708 84B2 E5 BA sbc vy+3
1709 84B4 85 CD sta ytraj+2
1710
1711 84B6 2C 8B 44 bit LaserFlag ; no gravity if Laser
1712 84B9 30 25 bmi NoGravity
1713 ;vy=vy-g (again without least significant byte of vy)
1714 84BB 38 sec
1715 84BC A5 B8 lda vy+1
1716 84BE E5 E0 sbc gravity
1717 84C0 85 B8 sta vy+1
1718 84C2 A5 B9 lda vy+2
1719 84C4 E9 00 sbc #0
1720 84C6 85 B9 sta vy+2
1721 84C8 A5 BA lda vy+3
1722 84CA E9 00 sbc #0
1723 84CC 85 BA sta vy+3
1724 84CE 10 10 bpl StillUp
1725 ; where we know that the bullet starts to fall down
1726 ; we check if it is MIRV and if so, jump to MIRV routine
1727 84D0 24 97 bit TestFlightFlag
1728 84D2 30 0C bmi NoTestForMIRV
1729 84D4 A6 6C ldx TankNr
1730 84D6 BD F7 43 lda ActiveWeapon,x
1731 84D9 C9 06 cmp #ind_MIRV___________ ; MIRV
1732 84DB D0 03 4C 7C 87 jeq MIRVdownLoop
1733 84E0 NoTestForMIRV
1734 84E0 NoGravity
1735 84E0 StillUp
1736
1737 84E0 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx)
1738 84E1 A5 C8 lda xtraj ;here of course Fight to right
1739 84E3 65 BC adc vx+1
1740 84E5 85 C8 sta xtraj
1741 84E7 A5 C9 lda xtraj+1
1742 84E9 65 BD adc vx+2
1743 84EB 85 C9 sta xtraj+1
1744 84ED A5 CA lda xtraj+2
1745 84EF 65 BE adc vx+3
1746 84F1 85 CA sta xtraj+2
1747
1748 84F3 2C 8B 44 bit LaserFlag ; no wind if Laser
1749 84F6 30 19 bmi NoWind
1750 84F8 18 clc
1751 .rept 4
1752 LDA VX+#
1753 ADC WIND+#
1754 STA VX+#
1755 .endr
Source: REPT
1752 84F9 A5 BB LDA VX+#
1752 84FB 65 CE ADC WIND+#
1752 84FD 85 BB STA VX+#
1752 84FF A5 BC LDA VX+#
1752 8501 65 CF ADC WIND+#
1752 8503 85 BC STA VX+#
1752 8505 A5 BD LDA VX+#
1752 8507 65 D0 ADC WIND+#
1752 8509 85 BD STA VX+#
1752 850B A5 BE LDA VX+#
1752 850D 65 D1 ADC WIND+#
1752 850F 85 BE STA VX+#
Source: weapons.asm
1756 8511 NoWind
1757 8511 AD 8F 44 85 61 AD + mwa xtrajold+1 xdraw
1758 851B AD 92 44 85 63 AD + mwa ytrajold+1 ydraw
1759 8525 A5 C9 85 65 A5 CA + mwa xtraj+1 xbyte
1760 852D A5 CC 85 67 A5 CD + mwa ytraj+1 ybyte
1761 8535 20 12 66 jsr draw
1762 ;key
1763 8538 2C 8B 44 bit LaserFlag
1764 853B 30 03 bmi LaserNoWalls
1765 ; Check for walls
1766 853D 20 E7 89 jsr MakeWalls
1767 ;
1768 8540 LaserNoWalls
1769 8540 A5 C9 8D 8F 44 A5 + mwa xtraj+1 XtrajOld+1
1770 854A A5 CC 8D 92 44 A5 + mwa ytraj+1 YtrajOld+1
1771
1772 8554 24 97 bit TestFlightFlag
1773 8556 30 14 bmi nowait
1774 8558 2C 8B 44 bit LaserFlag ; faster laser prepare
1775 855B 10 04 bpl nolaserwait
1776 855D 24 60 bit Vdebug
1777 855F 10 0B bpl nowait
1778 8561 nolaserwait
1779 8561 A5 A9 lda color
1780 8563 F0 04 beq nonowait ; smoke tracer erases slowly
1781 8565 A5 E3 lda tracerflag
1782 8567 D0 03 bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) )
1783 8569 nonowait
1784 8569 20 A7 5A jsr shellDelay
1785
1786 856C nowait
1787 856C A5 BF lda HitFlag
1788 856E D0 66 bne Hit
1789 ; --- only for Laser
1790 8570 2C 8B 44 bit LaserFlag
1791 8573 10 29 bpl NoCheckEdgesForLaser
1792 ; If laser fires, edges of the screen finish "flying" and laser hits.
1793 8575 A5 CD lda ytraj+2
1794 8577 30 0C bmi LaserHitEdge
1795 8579 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth ;+1
1796 8583 90 19 bcc LaserNoHitEdge
1797 8585 LaserHitEdge
1798 8585 A5 61 85 C1 A5 62 + mwa xdraw XHit
1799 858D A5 63 8D 5F 44 A5 + mwa ydraw YHit
1800 8597 A9 FF 85 BF mva #$ff HitFlag ; screen edgs like ground (only for Laser)
1801 859B 4C EF 85 jmp EndOfFlight
1802 859E LaserNoHitEdge
1803 ; ------------------
1804 859E NoCheckEdgesForLaser
1805
1806 859E A5 CD C9 00 D0 04 + cpw ytraj+1 #screenheight+1
1807 85A8 90 04 bcc YTrayLowerThanScreenHeight
1808 85AA A5 CD lda ytraj+2
1809 85AC 10 41 bpl EndOfFlight
1810
1811 85AE YTrayLowerThanScreenHeight ; it means it is still on screen and not above
1812
1813 85AE SkipCollisionCheck
1814
1815 85AE A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw
1816 85B6 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw
1817
1818 85BE 24 97 bit TestFlightFlag
1819 85C0 50 0A bvc NoTestFlight
1820 85C2 24 60 bit Vdebug
1821 85C4 10 0D bpl NoUnplot
1822 85C6 20 89 5A jsr WaitOneFrame ; visualize AI targeting
1823 85C9 4C D0 85 jmp YesUnPlot
1824 85CC NoTestFlight
1825 85CC A5 E3 lda tracerflag
1826 85CE D0 03 bne NoUnPlot
1827
1828 85D0 YesUnPlot
1829 85D0 20 71 75 jsr UnPlot
1830
1831 85D3 NoUnPlot
1832
1833 85D3 4C A3 84 jmp Loopi
1834
1835 85D6 Hit
1836 85D6 A5 C1 85 61 A5 C2 + mwa XHit xdraw
1837 85DE AD 5F 44 85 63 AD + mwa YHit ydraw
1838 85E8 24 97 bit TestFlightFlag
1839 85EA 70 03 bvs EndOfFlight
1840 85EC 20 71 75 jsr unPlot
1841 85EF EndOfFlight
1842 85EF A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store for a little while
1843 85F7 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!!
1844 85FF A9 00 85 61 85 62 mwa #0 xdraw
1845 8605 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
1846 860D 20 71 75 jsr unPlot
1847 8610 A5 B3 85 61 A5 B4 + mwa xcircle xdraw
1848 8618 A5 B5 85 63 A5 B6 + mwa ycircle ydraw
1849
1850 8620 AC 8A 44 ldy SmokeTracerFlag
1851 8623 F0 07 beq EndOfFlight2
1852 8625 88 dey
1853 8626 8C 8A 44 sty SmokeTracerFlag
1854 8629 4C 4E 87 jmp SecondFlight
1855 862C EndOfFlight2
1856 862C A9 00 85 E3 mva #0 tracerflag ; don't know why
1857
1858 8630 24 97 bit TestFlightFlag
1859 8632 10 03 4C F1 86 jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check
1860 ; and now check for defensive-aggressive weapon
1861 8637 A5 BF lda HitFlag
1862 8639 D0 03 4C F1 86 jeq NoHitAtEndOfFight ; RTS only !!!
1863 863E 10 03 4C F1 86 jmi NoTankHitAtEndOfFight
1864 ; tank hit - increase direct hits points
1865 8643 A6 6C ldx TankNr
1866 8645 E8 inx
1867 8646 E4 BF cpx HitFlag ; we don't count suicides :)
1868 8648 F0 04 beq @+
1869 864A CA dex
1870 864B FE C7 43 inc DirectHits,x
1871 ; bne @+ ; one byte enough
1872 ; inc DirectHitsH,x
1873 @
1874 ; tank hit - check defensive weapon of this tank
1875 864E AA tax
1876 864F CA dex ; index of hitted tank in X
1877 8650 A4 6C ldy TankNr
1878 8652 B9 F7 43 lda ActiveWeapon,y
1879 8655 C9 0A cmp #ind_Tracer_________ ; defence not fire by tracers
1880 8657 F0 16 beq JNoDefence
1881 8659 C9 0B cmp #ind_Smoke_Tracer___
1882 865B F0 12 beq JNoDefence
1883 865D C9 1F cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser
1884 865F F0 0E beq JNoDefence
1885 8661 BD FD 43 lda ActiveDefenceWeapon,x
1886 8664 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence
1887 8666 D0 03 4C F6 86 jeq BouncyCastle
1888 866B C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector
1889 866D F0 03 beq MagDeflector
1890 866F JNoDefence
1891 866F 4C F1 86 jmp NoDefence
1892 8672 MagDeflector
1893 ; now run defensive-aggressive weapon - Mag Deflector!
1894 ; get tank position
1895 8672 18 clc
1896 8673 BD 0D 44 lda xtankstableL,x
1897 8676 69 04 adc #$04 ; almost in tak center :)
1898 8678 85 C1 sta XHit
1899 867A BD 13 44 lda xtankstableH,x
1900 867D 69 00 adc #$00
1901 867F 85 C2 sta XHit+1
1902 8681 A9 FF lda #$ff ; change to ground hit (we hope)
1903 8683 85 BF sta HitFlag
1904 8685 2C 1B D4 bit random ; left or right deflection ?
1905 8688 10 1D bpl RightDeflection
1906 868A LeftDeflection
1907 868A 38 A5 C1 E9 12 85 + sbw XHit #18 ; 18 pixels to left and explode...
1908 8695 24 C2 bit XHit+1 ; if off-screen ...
1909 8697 10 32 bpl EndOfMagDeflector ; hit of course but we need RTS
1910 8699 18 A5 C1 69 24 85 + adw XHit #36 ; change to right :)
1911 86A4 4C CB 86 jmp EndOfMagDeflector
1912 86A7 RightDeflection
1913 86A7 18 A5 C1 69 12 85 + adw XHit #18 ; 18 pixels to right and explode...
1914 86B2 A5 C2 CD 41 01 D0 + cpw XHit screenwidth ; if off-screen ...
1915 86BE B0 0B bcs EndOfMagDeflector ; hit of course but we need RTS
1916 86C0 38 A5 C1 E9 24 85 + sbw XHit #36 ; change to left
1917 86CB EndOfMagDeflector
1918 86CB A9 01 85 AA mva #1 Erase
1919 86CF A5 6C lda TankNr
1920 86D1 48 pha ; store TankNr
1921 86D2 86 6C stx TankNr ; store X in TankNr :)
1922 86D4 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield)
1923 86D7 A9 00 lda #0
1924 86D9 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon
1925 86DC 9D A8 43 sta ShieldEnergy,x
1926 86DF 85 AA sta Erase
1927 86E1 20 2C 6A jsr DrawTankNr ; draw tank without shield
1928 86E4 A6 6C ldx TankNr ; restore X value :)
1929 86E6 68 pla
1930 86E7 85 6C sta TankNr ; restore TankNr value :)
1931 86E9 A5 C1 85 61 A5 C2 + mwa XHit xdraw ; why? !!!
1932 86F1 NoTankHitAtEndOfFight
1933 86F1 NoHitAtEndOfFight
1934 86F1 NoDefence
1935 86F1 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
Macro: LSRW [Source: MACRO.ASM]
1 86F1 46 A5 LSR FORCE+1
2 86F3 66 A4 ROR FORCE
Source: weapons.asm
1936 86F5 60 rts ; END !!!
1937 86F6 BouncyCastle
1938 ; now in Y we have number of of the attacking player (TankNr) !
1939 86F6 B9 F7 43 lda ActiveWeapon,y
1940 ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down
1941 86F9 C9 05 cmp #ind_Funky_Bomb_____
1942 86FB D0 03 bne @+
1943 86FD 20 7A 8F jsr SetFullScreenSoilRange
1944 @
1945 8700 A9 0D 85 9E mva #sfx_shield_on sfx_effect
1946 ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)!
1947 8704 A9 01 85 AA mva #1 Erase
1948 8708 A5 6C lda TankNr
1949 870A 48 pha ; store TankNr
1950 870B 86 6C stx TankNr ; store X in TankNr :)
1951 870D 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield)
1952 8710 A9 00 lda #0
1953 8712 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon
1954 8715 9D A8 43 sta ShieldEnergy,x
1955 8718 85 C8 sta xtraj ; prepare coordinates
1956 871A 85 CB sta ytraj
1957 ; sta xtraj+2
1958 ; sta ytraj+2
1959 871C 85 AA sta Erase
1960 871E 20 2C 6A jsr DrawTankNr ; draw tank without shield
1961 ; ldx TankNr ; restore X value :) ... but we don't need X now ..
1962 8721 68 pla
1963 8722 85 6C sta TankNr ; restore TankNr value :)
1964 8724 38 sec
1965 8725 A9 B4 lda #180
1966 8727 ED 15 45 sbc LeapFrogAngle
1967 872A 85 A7 sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable)
1968 872C lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2
Macro: LSRW [Source: MACRO.ASM]
1 872C 46 A5 LSR FORCE+1
2 872E 66 A4 ROR FORCE
Source: weapons.asm
1969 8730 A5 C1 85 C9 A5 C2 + mwa XHit xtraj+1
1970 8738 38 AD 5F 44 E9 05 + sbw YHit #5 ytraj+1
1971 8747 A9 01 85 A9 mva #1 color
1972 874B 4C B3 83 jmp RepeatFlight ; and repeat Fight
1973 .endp
1974
1975 874E .proc SecondFlight
1976 ; ---------------- copied code fragment from before firing. not too elegant.
1977 ; ---------------- get fire parameters again
1978
1979 874E A6 6C ldx TankNr
1980 8750 20 96 59 jsr Table2Force
1981 8753 BD C3 48 lda AngleTable,x
1982 8756 85 A7 sta Angle
1983
1984 ; Shoots tank nr X !!! :)
1985 ; set the starting coordinates of bullet with correction
1986 ; to start where the tank's barrel ends
1987 ; (without it bullet would go from the left lower corner of the tank)
1988 ;ldx TankNr
1989
1990 8758 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1
1991 8762 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1
1992 8767 A9 00 lda #0
1993 8769 85 A6 sta Force+2
1994 876B 85 CD sta ytraj+2
1995 876D 85 C8 sta xtraj
1996 876F 85 CB sta ytraj
1997 8771 85 A9 sta color
1998
1999
2000 8773 A0 64 ldy #100 ; ???
2001 8775 A9 01 85 E3 mva #1 tracerflag ; I do not know (I mean I think I know ;) )
2002 ; 10 years later - I do not know!!!
2003 ; 20 years later - still do not know :]
2004 8779 4C B3 83 jmp Flight.RepeatIfSmokeTracer
2005 .endp
2006
2007 ; -------------------------------------------------
2008 877C .proc MIRVdownLoop
2009 ; MIRV loop - here mirv bullets fall down
2010 ; -------------------------------------------------
2011 ; copy Flight parameters to the table
2012 877C A2 04 ldx #4
2013 877E MIRVcopyParameters
2014 877E A5 C8 lda xtraj
2015 8780 9D 66 44 sta xtraj00,x
2016 8783 A5 C9 lda xtraj+1
2017 8785 9D 6B 44 sta xtraj01,x
2018 8788 A5 CA lda xtraj+2
2019 878A 9D 70 44 sta xtraj02,x
2020 ;lda vx
2021 ;sta vx00,x
2022 878D A5 BC lda vx+1
2023 878F 9D 75 44 sta vx01,x
2024 8792 A5 BD lda vx+2
2025 8794 9D 7A 44 sta vx02,x
2026 8797 A5 BE lda vx+3
2027 8799 9D 7F 44 sta vx03,x
2028 879C A9 00 lda #0
2029 879E 9D 84 44 sta MirvDown,x
2030 87A1 CA dex
2031 87A2 10 DA bpl MIRVcopyParameters
2032 ; modification (to make bullets "split away" and go different directions)
2033 ; bullet indexed 0 is in the middle
2034
2035 ; bullet 1
2036 87A4 18 clc
2037 87A5 A5 BC lda vx+1
2038 87A7 69 64 adc #100
2039 87A9 8D 76 44 sta vx01+1
2040 87AC A5 BD lda vx+2
2041 87AE 69 00 adc #0
2042 87B0 8D 7B 44 sta vx02+1
2043 87B3 A5 BE lda vx+3
2044 87B5 69 00 adc #0
2045 87B7 8D 80 44 sta vx03+1
2046 ; bullet 2
2047 87BA 38 sec
2048 87BB A5 BC lda vx+1
2049 87BD E9 64 sbc #100
2050 87BF 8D 77 44 sta vx01+2
2051 87C2 A5 BD lda vx+2
2052 87C4 E9 00 sbc #0
2053 87C6 8D 7C 44 sta vx02+2
2054 87C9 A5 BE lda vx+3
2055 87CB E9 00 sbc #0
2056 87CD 8D 81 44 sta vx03+2
2057 ; bullet 3
2058 87D0 18 clc
2059 87D1 A5 BC lda vx+1
2060 87D3 69 C8 adc #200
2061 87D5 8D 78 44 sta vx01+3
2062 87D8 A5 BD lda vx+2
2063 87DA 69 00 adc #0
2064 87DC 8D 7D 44 sta vx02+3
2065 87DF A5 BE lda vx+3
2066 87E1 69 00 adc #0
2067 87E3 8D 82 44 sta vx03+3
2068 ; bullet 4
2069 87E6 38 sec
2070 87E7 A5 BC lda vx+1
2071 87E9 E9 C8 sbc #200
2072 87EB 8D 79 44 sta vx01+4
2073 87EE A5 BD lda vx+2
2074 87F0 E9 00 sbc #0
2075 87F2 8D 7E 44 sta vx02+4
2076 87F5 A5 BE lda vx+3
2077 87F7 E9 00 sbc #0
2078 87F9 8D 83 44 sta vx03+4
2079
2080 ; clearing ranges of soil down registers
2081 87FC 20 89 8F jsr ClearScreenSoilRange
2082
2083 87FF A2 FF ldx #$FF ; it will turn 0 in a moment anyway
2084 8801 8E 89 44 stx MirvMissileCounter
2085 8804 mrLoopi
2086 8804 AE 89 44 ldx MirvMissileCounter
2087 8807 E8 inx
2088 8808 E0 05 cpx #5
2089 880A D0 02 bne @+
2090 880C A2 00 ldx #0
2091 880E 8E 89 44 @ stx MirvMissileCounter
2092
2093 ; Y changes only for bullet number 0
2094 ; because rest of the bullets have the same Y (height)
2095
2096 8811 D0 29 bne MIRVdoNotChangeY
2097 ; Y is the same for all falling bullets
2098 ;ytraj=ytraj-vy (skipping least significant byte of vy)
2099 8813 38 sec
2100 8814 A5 CB lda ytraj
2101 8816 E5 B8 sbc vy+1
2102 8818 85 CB sta ytraj
2103 881A A5 CC lda ytraj+1
2104 881C E5 B9 sbc vy+2
2105 881E 85 CC sta ytraj+1
2106 8820 A5 CD lda ytraj+2
2107 8822 E5 BA sbc vy+3
2108 8824 85 CD sta ytraj+2
2109
2110 ;vy=vy-g (also without least significant byte of vy)
2111 8826 38 sec
2112 8827 A5 B8 lda vy+1
2113 8829 E5 E0 sbc gravity
2114 882B 85 B8 sta vy+1
2115 882D A5 B9 lda vy+2
2116 882F E9 00 sbc #0
2117 8831 85 B9 sta vy+2
2118 8833 A5 BA lda vy+3
2119 8835 E9 00 sbc #0
2120 8837 85 BA sta vy+3
2121
2122 8839 20 A7 5A jsr ShellDelay
2123
2124 883C MIRVdoNotChangeY
2125
2126 883C BD 84 44 lda MirvDown,x ; if bullet is already down we go with the next one
2127 883F F0 03 4C 93 89 jne MIRVnextBullet
2128
2129 8844 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx)
2130 8845 BD 66 44 lda xtraj00,x ;and here of course Flight to the right
2131 8848 7D 75 44 adc vx01,x
2132 884B 9D 66 44 sta xtraj00,x
2133 884E BD 6B 44 lda xtraj01,x
2134 8851 7D 7A 44 adc vx02,x
2135 8854 9D 6B 44 sta xtraj01,x
2136 8857 BD 70 44 lda xtraj02,x
2137 885A 7D 7F 44 adc vx03,x
2138 885D 9D 70 44 sta xtraj02,x
2139
2140 ;vx=vx+Wind
2141
2142 8860 18 clc
2143 .rept 4
2144 LDA VX+#
2145 ADC WIND+#
2146 STA VX+#
2147 .endr
Source: REPT
2144 8861 A5 BB LDA VX+#
2144 8863 65 CE ADC WIND+#
2144 8865 85 BB STA VX+#
2144 8867 A5 BC LDA VX+#
2144 8869 65 CF ADC WIND+#
2144 886B 85 BC STA VX+#
2144 886D A5 BD LDA VX+#
2144 886F 65 D0 ADC WIND+#
2144 8871 85 BD STA VX+#
2144 8873 A5 BE LDA VX+#
2144 8875 65 D1 ADC WIND+#
2144 8877 85 BE STA VX+#
Source: weapons.asm
2148
2149 ; rules for a falling MIRV bulets.
2150 ; if Y is negative and any X (bullet over the screen) - continue flying
2151 ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying
2152 ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision
2153 ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit
2154 ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit)
2155
2156 ; check bullet position and set flags:
2157 ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen)
2158 ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen)
2159 8879 A9 00 lda #$00
2160 887B 8D 8C 44 sta XposFlag
2161 887E 8D 8D 44 sta YposFlag
2162 8881 A5 CD lda ytraj+2 ; Y high byte
2163 8883 10 07 bpl @+
2164 8885 A9 80 8D 8D 44 mva #%10000000 YposFlag ; bullet over the screen (Y)
2165 888A 30 0B bmi MIRVsetXflag
2166 @
2167 888C A5 CC lda ytraj+1 ; Y low byte
2168 888E C9 C8 cmp #screenheight
2169 8890 90 05 bcc MIRVsetXflag ; bullet on screen (Y)
2170 8892 A9 40 8D 8D 44 mva #%01000000 YposFlag ; bullet under the screen (Y)
2171 8897 MIRVsetXflag
2172 8897 BD 70 44 lda xtraj02,x ; X high byte
2173 889A C9 01 cmp #>screenwidth
2174 889C D0 05 bne @+
2175 889E BD 6B 44 lda xtraj01,x ; X low byte
2176 88A1 C9 40 cmp #<screenwidth
2177 @
2178 88A3 90 05 bcc MIRVXonscreen
2179 88A5 A9 80 8D 8C 44 mva #%10000000 XposFlag ; bullet off-screen (X)
2180 88AA MIRVXonscreen
2181
2182 ; X and Y position flags sets
2183 ; then realize rules
2184
2185 88AA AD 8D 44 lda YposFlag
2186 88AD 30 13 jmi MIRVcontinueFly ; Y over the screen
2187 88AF D0 07 bne MIRVYunderscreen ; Y under the screen
2188 ; Y on screen
2189 88B1 2C 8C 44 bit XposFlag
2190 88B4 30 0C jmi MIRVcontinueFly ; Y on screen and X off-screen
2191 88B6 10 33 jpl MIRVcheckCollision ; X and Y on screen
2192 88B8 MIRVYunderscreen
2193 88B8 2C 8C 44 bit XposFlag
2194 88BB 10 2E jpl MIRVcheckCollision ; X on screen and Y under screen
2195 ; Y under screen and X off-screen
2196 ; stop flying
2197 88BD 10 03 4C 77 89 jmi mrEndOfFlight
2198
2199 88C2 MIRVcontinueFly
2200 88C2 A9 00 85 61 85 62 mwa #0 xdraw
2201 88C8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
2202 88D0 2C 8C 44 bit XposFlag
2203 88D3 30 10 bmi @+ ; no pixels to plot
2204 ; plot bullets over the screen
2205 88D5 A9 00 85 63 85 64 mwa #0 ydraw
2206 ;mwa xtraj01 xdraw
2207 88DB BD 6B 44 lda xtraj01,x
2208 88DE 85 61 sta xdraw
2209 88E0 BD 70 44 lda xtraj02,x
2210 88E3 85 62 sta xdraw+1
2211 @
2212 88E5 20 73 75 jsr unPlot.unPlotAfterX
2213 88E8 4C 04 88 jmp mrLoopi
2214
2215 88EB MIRVcheckCollision
2216
2217 ; checking works only with xdraw and ydraw so copy there all we need
2218 88EB BD 6B 44 lda xtraj01,x
2219 88EE 85 61 sta xdraw
2220 88F0 BD 70 44 lda xtraj02,x
2221 88F3 85 62 sta xdraw+1
2222 88F5 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw
2223 88FD A9 00 85 BF mva #0 HitFlag
2224 8901 20 84 8E jsr CheckCollisionWithTank
2225 8904 AE 89 44 ldx MirvMissileCounter
2226 8907 A5 BF lda HitFlag
2227 8909 D0 37 bne mrHit
2228
2229 ;mwa xtraj01 temp
2230 890B 18 clc
2231 890C BD 6B 44 lda xtraj01,x
2232 890F 69 3E adc #<mountaintable
2233 8911 85 72 sta temp
2234 8913 BD 70 44 lda xtraj02,x
2235 8916 69 46 adc #>mountaintable
2236 8918 85 73 sta temp+1
2237
2238 891A A0 00 ldy #0
2239 891C A5 CC lda ytraj+1
2240 891E D1 72 cmp (temp),y ; check collision with mountains
2241 8920 B0 20 bcs mrHit
2242
2243 8922 mrSkipCollisionCheck
2244 ;mwa xtraj01 xdraw
2245 8922 BD 6B 44 lda xtraj01,x
2246 8925 85 61 sta xdraw
2247 8927 BD 70 44 lda xtraj02,x
2248 892A 85 62 sta xdraw+1
2249 892C A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw
2250
2251 8934 20 73 75 jsr unPlot.unPlotAfterX
2252 8937 AE 89 44 ldx MirvMissileCounter
2253 893A F0 03 4C 04 88 jne mrLoopi
2254
2255 893F 4C 04 88 jmp mrLoopi
2256
2257 8942 mrHit
2258 ; we have to make unPlot over the screen (to initialise it)
2259 ; before actual explosion
2260 8942 A9 00 85 61 85 62 mwa #0 xdraw
2261 8948 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
2262 8950 20 73 75 jsr unPlot.unPlotAfterX
2263 8953 AE 89 44 ldx MirvMissileCounter
2264 8956 A0 00 ldy #0
2265 ; concurrent moving xtraj+1 -> xdraw and calculating temp
2266 8958 18 clc
2267 8959 BD 6B 44 lda xtraj01,x
2268 895C 85 61 sta xdraw
2269 895E 69 3E adc #<mountaintable
2270 8960 85 72 sta temp
2271 8962 BD 70 44 lda xtraj02,x
2272 8965 85 62 sta xdraw+1
2273 8967 69 46 adc #>mountaintable
2274 8969 85 73 sta temp+1
2275 896B B1 72 lda (temp),y
2276 896D 38 sec
2277 896E E9 01 sbc #1
2278 8970 85 63 sta ydraw
2279 8972 84 64 sty ydraw+1 ;we know that y=0
2280 8974 20 AD 77 jsr missile ; explode ....
2281
2282 8977 mrEndOfFlight
2283 8977 AE 89 44 ldx MirvMissileCounter
2284 897A A9 00 85 61 85 62 mwa #0 xdraw
2285 8980 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
2286 8988 20 73 75 jsr unPlot.unPlotAfterX
2287 898B AE 89 44 ldx MirvMissileCounter
2288 898E A9 01 lda #1
2289 8990 9D 84 44 sta MirvDown,x
2290 8993 MIRVnextBullet
2291 ; checking if all bullets already fallen down
2292 8993 A2 04 ldx #4
2293 8995 MIRVcheckIfEnd
2294 8995 BD 84 44 lda MirvDown,x
2295 8998 F0 05 beq MIRVstillNotAll
2296 899A CA dex
2297 899B 10 F8 bpl MIRVcheckIfEnd
2298 899D 30 03 bmi MIRValreadyAll
2299 899F MIRVstillNotAll
2300 899F 4C 04 88 jmp mrLoopi
2301 89A2 MIRValreadyAll
2302 89A2 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store them (for a while)
2303 89AA A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw
2304 89B2 A9 00 85 61 85 62 mwa #0 xdraw
2305 89B8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw
2306 89C0 AE 89 44 ldx MirvMissileCounter
2307 89C3 20 73 75 jsr unPlot.unPlotAfterX
2308 89C6 A5 B3 85 61 A5 B4 + mwa xcircle xdraw
2309 89CE A5 B5 85 63 A5 B6 + mwa ycircle ydraw
2310
2311 ; we must do it manually because of the VOID pointer
2312
2313 ;first clean the offensive text...
2314 89D6 A4 6C ldy TankNr
2315 89D8 A9 00 85 DB mva #$00 plot4x4color
2316 89DC 20 88 72 jsr DisplayOffensiveTextNr
2317
2318 ; temporary removing tanks from the screen (otherwise they will fall down with soil)
2319 89DF 20 F4 6E jsr SoilDown2
2320 89E2 A9 FF 85 BF mva #$ff HitFlag ; but why ??
2321 89E6 60 rts
2322 .endp
2323 ; -------------------------------------------------
2324 89E7 .proc MakeWalls
2325 ; -------------------------------------------------
2326 89E7 2C 0C 44 bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy
2327 89EA 10 54 bpl WrapAndNone
2328 89EC 50 21 bvc MakeBump
2329 ; top bounce
2330 89EE 24 CD bit ytraj+2
2331 89F0 10 1D bpl NoOnTop
2332 89F2 24 BA bit vy+3
2333 89F4 30 19 bmi FlyingDown
2334 89F6 38 sec
2335 .rept 4
2336 LDA #$00
2337 SBC VY+#
2338 STA VY+#
2339 .endr
Source: REPT
2336 89F7 A9 00 LDA #$00
2336 89F9 E5 B7 SBC VY+#
2336 89FB 85 B7 STA VY+#
2336 89FD A9 00 LDA #$00
2336 89FF E5 B8 SBC VY+#
2336 8A01 85 B8 STA VY+#
2336 8A03 A9 00 LDA #$00
2336 8A05 E5 B9 SBC VY+#
2336 8A07 85 B9 STA VY+#
2336 8A09 A9 00 LDA #$00
2336 8A0B E5 BA SBC VY+#
2336 8A0D 85 BA STA VY+#
Source: weapons.asm
2340 8A0F FlyingDown
2341 8A0F NoOnTop
2342 8A0F MakeBump
2343 8A0F A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth
2344 8A19 90 54 bcc OnScreen
2345 ; inverse vx (bouncing wall)
2346 8A1B 38 sec
2347 .rept 4
2348 LDA #$00
2349 SBC VX+#
2350 STA VX+#
2351 .endr
Source: REPT
2348 8A1C A9 00 LDA #$00
2348 8A1E E5 BB SBC VX+#
2348 8A20 85 BB STA VX+#
2348 8A22 A9 00 LDA #$00
2348 8A24 E5 BC SBC VX+#
2348 8A26 85 BC STA VX+#
2348 8A28 A9 00 LDA #$00
2348 8A2A E5 BD SBC VX+#
2348 8A2C 85 BD STA VX+#
2348 8A2E A9 00 LDA #$00
2348 8A30 E5 BE SBC VX+#
2348 8A32 85 BE STA VX+#
Source: weapons.asm
2352 ; and bouce feapfrog :)
2353 8A34 38 sec
2354 8A35 A9 B4 lda #180
2355 8A37 ED 15 45 sbc LeapFrogAngle
2356 8A3A 8D 15 45 sta LeapFrogAngle ; swap angle (LeapFrogAngle)
2357 8A3D E6 A2 inc FunkyWallFlag
2358 8A3F 60 rts
2359 8A40 WrapAndNone
2360 8A40 50 2D bvc NoWall
2361 8A42 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth
2362 8A4C 90 21 bcc OnScreen
2363 ; (wrapping wall)
2364 8A4E E6 A2 inc FunkyWallFlag
2365 8A50 24 CA bit xtraj+2
2366 8A52 30 0E bmi LeftWrap
2367 8A54 RightWrap
2368 8A54 38 A5 C9 E9 40 85 + sbw xtraj+1 #screenwidth
2369 8A61 60 rts
2370 8A62 LeftWrap
2371 8A62 18 A5 C9 69 40 85 + adw xtraj+1 #screenwidth
2372 8A6F OnScreen
2373 8A6F NoWall
2374 8A6F 60 rts
2375 .endp
2376 ; -------------------------------------------------
2377 8A70 .proc WhiteFlag
2378 ; -------------------------------------------------
2379 ; This routine is run from inside of the main loop
2380 ; and replaces Shoot and Flight routines
2381 ; X and TankNr - index of shooting tank
2382 ; -------------------------------------------------
2383 8A70 A9 06 85 9E mva #sfx_death_begin sfx_effect
2384 8A74 20 57 6B jsr FlashTank ; first we flash tank
2385 8A77 A9 01 85 AA mva #1 Erase
2386 8A7B 20 2C 6A jsr DrawTankNr ; and erase tank
2387 8A7E A9 00 lda #0
2388 8A80 85 AA sta Erase
2389 8A82 A6 6C ldx TankNr
2390 8A84 9D A2 43 sta Energy,x ; clear tank energy
2391 8A87 9D AF 43 sta eXistenZ,x ; erase from existence
2392 8A8A 9D B5 43 sta LASTeXistenZ,x ; to prevent explosion
2393 8A8D 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate White Flag
2394 8A90 20 46 75 jsr PMoutofScreen
2395 8A93 20 12 6A jsr drawtanks ; for restore PM
2396 8A96 A9 15 85 9E mva #sfx_silencer sfx_effect
2397 8A9A 60 rts
2398 .endp
2399
2400 ; -------------------------------------------------
2401 8A9B .proc AtomicWinter
2402 ; -------------------------------------------------
2403 ; This routine is run from inside of the main loop
2404 ; and replaces Shoot and Flight routines
2405 ; X and TankNr - index of shooting tank
2406 ; -------------------------------------------------
2407 8A9B A9 12 85 9E mva #sfx_sandhog sfx_effect
2408 .IF FASTER_GRAF_PROCS = 1
2409 ldy #0 ; byte counter (from 0 to 39)
2410 NextColumn
2411 ; big loop - we repat internal loops for each column of bytes
2412 sty magic
2413 ldx #120 ; line counter (from 0 to 60 )
2414 ; first loop - inverse column of bytes for a while
2415 ldy magic
2416 NextLine1
2417 jsr InverseScreenByte
2418 dex
2419 dex
2420 bpl NextLine1
2421 ;
2422 jsr WaitOneFrame ; wait uses A only
2423 ; second loop - inverse again and put random "snow" to column of bytes
2424 ldx #120
2425 ldy magic
2426 mva #$55 magic+1
2427 NextLine2
2428 jsr InverseScreenByte
2429 lda random
2430 ora magic+1
2431 and (temp),y
2432 sta (temp),y
2433 lda magic+1
2434 eor #$ff
2435 sta magic+1
2436 dex
2437 dex
2438 bpl NextLine2
2439 ; and go to next column
2440 iny
2441 cpy #40
2442 bne NextColumn
2443 .ELSE
2444 8A9F A9 01 85 A9 mva #1 color
2445 8AA3 A9 78 85 63 A9 00 + mwa #120 ydraw
2446 8AAB NextLineSlow
2447 8AAB A9 00 lda #0
2448 8AAD 85 61 sta xdraw
2449 8AAF 85 62 sta xdraw+1
2450 8AB1 NextPixelSlow
2451 8AB1 2C 1B D4 bit random
2452 8AB4 10 05 bpl NoPlot
2453 8AB6 50 03 bvc NoPlot
2454 8AB8 20 2C 76 jsr plot.MakePlot
2455 8ABB NoPlot
2456 8ABB E6 61 D0 02 E6 62 inw xdraw
2457 8AC1 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth
2458 8ACB D0 E4 bne NextPixelSlow
2459 8ACD C6 63 dec ydraw
2460 8ACF C6 63 dec ydraw
2461 8AD1 10 D8 bpl NextLineSlow
2462 .ENDIF
2463 ; and we have "snow" :)
2464 8AD3 A9 00 lda #0
2465 8AD5 A6 6C ldx TankNr
2466 8AD7 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter
2467 8ADA 20 7A 8F jsr SetFullScreenSoilRange
2468 8ADD 20 F7 6E jsr SoilDown2.NoClearTanks
2469 8AE0 60 rts
2470
2471 ; in order to optimize the fragment repeated in both internal loops
2472 ; we save 15 bytes :)
2473 8AE1 InverseScreenByte
2474 8AE1 BD 68 41 lda LineTableL,x
2475 8AE4 85 72 sta temp
2476 8AE6 BD 31 42 lda LineTableH,x
2477 8AE9 85 73 sta temp+1
2478 8AEB B1 72 lda (temp),y
2479 8AED 49 FF eor #$ff
2480 8AEF 91 72 sta (temp),y
2481 8AF1 60 rts
2482 .endp
2483 ; -------------------------------------------------
2484 8AF2 .proc AutoDefense
2485 ; -------------------------------------------------
2486 ; This routine is run from inside of the main loop
2487 ; X - index of tank
2488 ; -------------------------------------------------
2489 8AF2 20 EB 8F jsr PrepareAIShoot.WepTableToTemp
2490 8AF5 20 45 91 jsr UseBattery
2491 8AF8 20 98 91 jsr TosserDefensives
2492 8AFB 60 rts
2493 .endp
2494 ; -------------------------------------------------
2495 8AFC .proc SpyHard
2496 ; -------------------------------------------------
2497 8AFC A6 6C 8E 31 44 mvx TankNr TargetTankNr ; save
2498 8B01 RepeatSpy
2499 8B01 A2 00 86 6C mvx #0 TankNr
2500 8B05 86 5F stx SpyHardFlag ; 0 - optimization
2501 8B07 CheckNextTankSH
2502 8B07 EC 31 44 cpx TargetTankNr
2503 8B0A F0 22 beq ThisTankItsMe
2504 8B0C BD A2 43 lda Energy,x ; only active players
2505 8B0F F0 1D beq ThisTankIsDead
2506 ; run SpyHard for tank in X
2507 8B11 20 41 8B jsr DisplaySpyInfo
2508 8B14 20 57 6B jsr FlashTank
2509 8B17 20 5F 5A @ jsr GetKey
2510 8B1A 24 D7 bit escFlag
2511 8B1C 30 1A bmi SpyHardEnd
2512 8B1E C9 21 cmp #@kbcode._space ; $21 ; Space
2513 8B20 F0 16 beq SpyHardEnd
2514 8B22 C9 0C cmp #@kbcode._ret ; Return key (5200 - fire)
2515 8B24 F0 12 beq SpyHardEnd
2516 8B26 C9 06 cmp #@kbcode._left ; $6
2517 8B28 F0 04 beq SelectNextTank
2518 8B2A C9 07 cmp #@kbcode._right ; $07 ; cursor right
2519 8B2C D0 E9 bne @-
2520 8B2E ThisTankIsDead
2521 8B2E ThisTankItsMe
2522 8B2E SelectNextTank
2523 8B2E E6 6C inc TankNr
2524 8B30 A6 6C ldx TankNr
2525 8B32 E4 AE cpx NumberOfPlayers
2526 8B34 D0 D1 bne CheckNextTankSH
2527 8B36 F0 C9 beq RepeatSpy
2528 8B38 SpyHardEnd
2529 8B38 AE 31 44 86 6C mvx TargetTankNr TankNr ; restore
2530 8B3D 20 41 8B jsr DisplaySpyInfo
2531 8B40 60 rts
2532 .endp
2533 8B41 .proc DisplaySpyInfo
2534 8B41 BD 7F 5B lda TankStatusColoursTable,x
2535 8B44 85 02 sta COLOR2 ; set color of status line
2536 8B46 20 0F 66 jsr PutTankNameOnScreen
2537 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen
2538 8B49 60 rts
2539 .endp
2540 ; -------------------------------------------------
2541 8B4A .proc LazyBoys
2542 ; -------------------------------------------------
2543 8B4A A9 2C 85 9E mva #sfx_lazy_boys sfx_effect
2544 8B4E 20 CF 8F jsr PrepareAIShoot
2545 8B51 A6 6C ldx TankNr
2546 8B53 24 5E bit LazyFlag
2547 8B55 30 0A bmi GoDarwin
2548 8B57 20 C0 92 jsr FindBestTarget2 ; find nearest tank neighbour
2549 8B5A 20 70 8B jsr LazyAim
2550 8B5D A9 00 lda #%00000000 ; set "visual aiming" off
2551 8B5F F0 08 beq EndLazy
2552 8B61 GoDarwin
2553 8B61 20 81 92 jsr FindBestTarget3 ; find target with lowest energy
2554 8B64 20 70 8B jsr LazyAim
2555 8B67 A9 80 lda #%10000000
2556 8B69 EndLazy
2557 8B69 85 97 sta TestFlightFlag ; set "visual aiming" on
2558 8B6B A9 00 85 5E mva #0 LazyFlag
2559 8B6F 60 rts
2560 .endp
2561 8B70 .proc LazyAim
2562 ; aiming proc for Lazy ... weapons
2563 ; as proc for memory optimisation
2564 ; Y - target tan nr
2565 ; A - target direction
2566 8B70 8C 31 44 sty TargetTankNr
2567 ; aiming
2568 8B73 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right)
2569 8B76 A5 A4 lda Force
2570 8B78 9D D9 43 sta ForceTableL,x
2571 8B7B A5 A5 lda Force+1
2572 8B7D 9D DF 43 sta ForceTableH,x
2573 8B80 20 A1 59 jsr MoveBarrelToNewPosition
2574 8B83 60 rts
2575 .endp
2576 ; -------------------------------------------------
2577 8B84 .proc TankFlying
2578 ; -------------------------------------------------
2579 ; This routine is run from inside of the main loop
2580 ; and replaces Shoot and Flight routines
2581 ; X and TankNr - index of flying tank
2582 ; -------------------------------------------------
2583 ; Let's designate the flight altitude.
2584 8B84 20 BF 70 jsr CheckMaxMountain
2585 8B87 C9 1E cmp #(12+18) ; tank with shield (12) and max alt (18) check
2586 8B89 90 04 bcc IsToHigh
2587 8B8B E9 0C sbc #12 ; tank with shield high correction
2588 8B8D D0 02 bne StoreMaxAlt
2589 8B8F IsToHigh
2590 8B8F A9 12 lda #18
2591 8B91 StoreMaxAlt
2592 8B91 85 A2 sta FloatingAlt
2593 ; mva #18 FloatingAlt ; for testing
2594 8B93 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect
2595
2596 ; display text 4x4 - fuel full
2597
2598 8B97 A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4
2599 8B9F A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
2600 8BA7 A9 1D 85 83 mva #hoverFullEnd-hoverFull-1 fx ; length
2601 8BAB 38 sec
2602 8BAC A5 A2 lda FloatingAlt
2603 8BAE E9 0C sbc #12
2604 8BB0 85 D8 sta LineYdraw
2605 8BB2 20 72 73 jsr TypeLine4x4.variableLength
2606
2607 8BB5 A6 6C ldx TankNr
2608
2609 ; TankNr in X reg.
2610 ; now animate Up
2611 8BB7 A9 00 85 76 mva #0 modify ; it's a counter
2612 8BBB TankGoUp
2613 8BBB BD 19 44 lda ytankstable,x
2614 8BBE C5 A2 cmp FloatingAlt ; Floating altitude
2615 8BC0 90 33 bcc ReachSky
2616 ; first erase old tank position
2617 8BC2 A9 01 85 AA mva #1 Erase
2618 8BC6 20 2C 6A jsr DrawTankNr
2619 8BC9 A5 76 lda modify
2620 8BCB C9 05 cmp #5
2621 8BCD 90 07 bcc NoEngineClear
2622 8BCF A9 00 85 A9 mva #0 color
2623 8BD3 20 7E 6C jsr DrawTankRocketEngine
2624 8BD6 NoEngineClear
2625 8BD6 A9 00 85 AA mva #0 Erase
2626 8BDA DE 19 44 dec ytankstable,x
2627 8BDD E6 76 inc modify
2628 ; then draw tank on new position
2629 8BDF 20 2C 6A jsr DrawTankNr
2630 8BE2 A5 76 lda modify
2631 8BE4 C9 05 cmp #5
2632 8BE6 90 0A bcc NoEngine
2633 8BE8 AD 1B D4 lda random
2634 8BEB 29 01 and #%00000001
2635 8BED 85 A9 sta color
2636 8BEF 20 7E 6C jsr DrawTankRocketEngine
2637 8BF2 NoEngine
2638 ; jsr WaitOneFrame
2639 8BF2 4C BB 8B jmp TankGoUp
2640
2641 8BF5 ReachSky
2642 ; engine symbol erase
2643 8BF5 A9 00 85 A9 mva #0 color
2644 8BF9 20 7E 6C jsr DrawTankRocketEngine
2645
2646 ; display text 4x4 - fuel full (clear text)
2647 8BFC A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4
2648 8C04 A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering
2649 8C0C A9 1D 85 83 mva #(hoverFullEnd-hoverFull-1) fx ; length
2650 8C10 38 sec
2651 8C11 A5 A2 lda FloatingAlt
2652 8C13 E9 0C sbc #12
2653 8C15 85 D8 sta LineYdraw
2654 8C17 A9 00 lda #$00
2655 8C19 20 74 73 jsr TypeLine4x4.staplot4x4color
2656 ; and Soildown at the start (for correct mountaintable if tank was buried)
2657 ; calculate range
2658 8C1C A6 6C ldx TankNr
2659 8C1E 38 sec
2660 8C1F BD 0D 44 lda XtankstableL,x
2661 8C22 E9 02 sbc #2
2662 8C24 85 D2 sta RangeLeft
2663 8C26 BD 13 44 lda XtankstableH,x
2664 8C29 E9 00 sbc #0
2665 8C2B 85 D3 sta RangeLeft+1
2666 8C2D 18 clc
2667 8C2E BD 0D 44 lda XtankstableL,x
2668 8C31 69 0A adc #10
2669 8C33 85 D4 sta RangeRight
2670 8C35 BD 13 44 lda XtankstableH,x
2671 8C38 69 00 adc #0
2672 8C3A 85 D5 sta RangeRight+1
2673 ; hide tanks and ...
2674 8C3C 20 F4 6E jsr SoilDown2
2675 8C3F 20 89 8F jsr ClearScreenSoilRange
2676 8C42 A6 6C ldx TankNr
2677
2678 ; check keyboard/joy and move tank left/right - code copied from BeforeFire
2679 ;keyboard reading
2680 ; KBCODE keeps code of last keybi
2681 ; SKSTAT $ff - nothing pressed
2682 ; $FB - any key
2683 ; $f7 - shift
2684 ; $f3 - shift+key
2685 8C44 KeyboardAndJoyCheck
2686 8C44 A9 1F 85 9E mva #sfx_tank_move sfx_effect
2687 8C48 BD A8 43 lda ShieldEnergy,x
2688 8C4B C9 14 cmp #20
2689 8C4D D0 20 bne LotOfFuel
2690
2691 ; display text 4x4 - low fuel
2692 8C4F A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4
2693 8C57 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
2694 8C5F A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
2695 8C63 38 sec
2696 8C64 A5 A2 lda FloatingAlt
2697 8C66 E9 0C sbc #12
2698 8C68 85 D8 sta LineYdraw
2699 8C6A 20 72 73 jsr TypeLine4x4.variableLength
2700 8C6D A6 6C ldx TankNr
2701
2702 8C6F LotOfFuel
2703 8C6F notpressed
2704 ; let's animate "engine"
2705 8C6F 20 E5 6C jsr DrawTankEngine
2706 ; enimation ends
2707
2708 8C72 A5 02 lda SKSTAT
2709 8C74 C9 FF cmp #$ff
2710 8C76 F0 26 jeq checkJoy
2711 8C78 C9 F7 cmp #$f7 ; SHIFT
2712 8C7A F0 22 jeq checkJoy
2713
2714 8C7C A5 02 lda kbcode
2715 8C7E 29 3F and #%00111111 ; CTRL and SHIFT elimination
2716
2717 8C80 C9 1C cmp #@kbcode._esc ; 28 ; ESC
2718 8C82 D0 08 bne @+
2719 8C84 20 AE 73 jsr AreYouSure
2720 8C87 24 D7 bit escFlag
2721 8C89 10 E4 bpl notpressed
2722 ;---esc pressed-quit game---
2723 8C8B 60 rts
2724 @
2725 8C8C jumpFromStick
2726 8C8C C9 06 cmp #@kbcode._left ; $6
2727 8C8E F0 60 jeq pressedLeft
2728 8C90 C9 07 cmp #@kbcode._right ; $7
2729 8C92 F0 23 jeq pressedRight
2730 8C94 C9 21 cmp #@kbcode._space ; $21
2731 8C96 D0 03 4C 3B 8D jeq pressedSpace
2732 8C9B 4C 6F 8C jmp notpressed
2733 8C9E checkJoy
2734 ;------------JOY-------------
2735 ;happy happy joy joy
2736 ;check for joystick now
2737 8C9E A5 02 lda STICK0
2738 8CA0 29 0F and #$0f
2739 8CA2 C9 0F cmp #$0f
2740 8CA4 F0 07 beq notpressedJoy
2741 8CA6 A8 tay
2742 8CA7 B9 5A 60 lda joyToKeyTable,y
2743 8CAA 4C 8C 8C jmp jumpFromStick
2744 8CAD notpressedJoy
2745 ;fire
2746 8CAD A5 02 lda STRIG0
2747 8CAF D0 03 4C 3B 8D jeq pressedSpace
2748 8CB4 4C 6F 8C jmp notpressed
2749
2750
2751 8CB7 pressedRight
2752 8CB7 BD A8 43 lda ShieldEnergy,x
2753 8CBA F0 7F jeq pressedSpace
2754 8CBC A0 01 ldy #1
2755 8CBE 20 B0 57 jsr DecreaseShieldEnergyX
2756 ; first erase old tank position
2757 8CC1 A9 01 85 AA mva #1 Erase
2758 8CC5 20 2C 6A jsr DrawTankNr
2759 8CC8 A9 00 85 AA mva #0 Erase
2760 8CCC BD 13 44 lda XtankstableH,x
2761 8CCF C9 01 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4
2762 8CD1 D0 05 bne @+
2763 8CD3 BD 0D 44 lda XtankstableL,x
2764 8CD6 C9 34 cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels
2765 8CD8 B0 0B @ bcs RightScreenEdge
2766 8CDA FE 0D 44 inc XtankstableL,x
2767 8CDD D0 03 FE 13 44 sne:inc XtankstableH,x
2768 8CE2 4C E9 8C jmp NoREdge
2769 8CE5 RightScreenEdge
2770 8CE5 A9 03 85 9E mva #sfx_dunno sfx_effect
2771 8CE9 NoREdge
2772 8CE9 A9 12 9D C3 48 mva #18 AngleTable,x
2773 8CEE D0 3C bne DrawFloatingTank ; then draw tank on new position
2774
2775 8CF0 pressedLeft
2776 8CF0 BD A8 43 lda ShieldEnergy,x
2777 8CF3 F0 46 beq pressedSpace
2778 8CF5 A0 01 ldy #1
2779 8CF7 20 B0 57 jsr DecreaseShieldEnergyX
2780 ; first erase old tank position
2781 8CFA A9 01 85 AA mva #1 Erase
2782 8CFE 20 2C 6A jsr DrawTankNr
2783 8D01 A9 00 85 AA mva #0 Erase
2784 8D05 BD 13 44 lda XtankstableH,x
2785 8D08 C9 00 cmp #0
2786 8D0A D0 05 bne @+
2787 8D0C BD 0D 44 lda XtankstableL,x
2788 8D0F C9 05 cmp #5 ; 4 pixles from left edge
2789 8D11 90 10 @ bcc LeftScreenEdge
2790 8D13 DE 0D 44 dec XtankstableL,x
2791 8D16 BD 0D 44 lda XtankstableL,x
2792 8D19 C9 FF cmp #$ff
2793 8D1B D0 03 DE 13 44 sne:dec XtankstableH,x
2794 8D20 4C 27 8D jmp NoLEdge
2795 8D23 LeftScreenEdge
2796 8D23 A9 03 85 9E mva #sfx_dunno sfx_effect
2797 8D27 NoLEdge
2798 8D27 A9 A2 9D C3 48 mva #162 AngleTable,x
2799 ; then draw tank on new position
2800 8D2C DrawFloatingTank
2801 8D2C 20 2C 6A jsr DrawTankNr
2802 8D2F 20 0F 66 jsr DisplayStatus
2803 8D32 20 89 5A jsr WaitOneFrame
2804 8D35 20 6B 8E jsr CalculateSoildown
2805 8D38 4C 44 8C jmp KeyboardAndJoyCheck
2806
2807 8D3B pressedSpace
2808 ; display text 4x4 - low fuel (clear text)
2809 8D3B A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4
2810 8D43 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering
2811 8D4B A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length
2812 8D4F 38 sec
2813 8D50 A5 A2 lda FloatingAlt
2814 8D52 E9 0C sbc #12
2815 8D54 85 D8 sta LineYdraw
2816 8D56 A9 00 lda #$00
2817 8D58 20 74 73 jsr TypeLine4x4.staplot4x4color
2818 8D5B A6 6C ldx TankNr
2819 ;=================================
2820 ; left or right from center of screen ?
2821 8D5D A0 00 ldy #0
2822 8D5F BD 13 44 lda XtankstableH,x
2823 8D62 C9 00 cmp #>((screenwidth/2)-TankWidth)
2824 8D64 D0 05 bne @+
2825 8D66 BD 0D 44 lda XtankstableL,x
2826 8D69 C9 98 cmp #<((screenwidth/2)-TankWidth)
2827 8D6B 90 01 @ bcc TankOnLeftSide
2828 8D6D TankOnRightSide
2829 8D6D 88 dey
2830 8D6E TankOnLeftSide
2831 8D6E 84 A3 sty OverTankDir ; (0 go right, $ff go left)
2832 ; now we have direction of bypassing tanks on screen
2833
2834 ; clear "engine pixels" under tank
2835 8D70 A9 01 85 AA mva #1 erase
2836 8D74 20 E5 6C jsr DrawTankEngine
2837
2838 8D77 CheckForTanksBelow
2839 8D77 BD 0D 44 lda XtankstableL,x
2840 8D7A 85 61 sta xdraw
2841 8D7C BD 13 44 lda XtankstableH,x
2842 8D7F 85 62 sta xdraw+1
2843 8D81 A6 AE ldx NumberOfPlayers
2844 8D83 CA dex
2845 8D84 CheckCollisionWithTankLoop
2846 8D84 E4 6C cpx TankNr
2847 8D86 F0 63 beq ItIsMe
2848 8D88 BD AF 43 lda eXistenZ,x
2849 8D8B F0 5E beq DeadTank
2850 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)
2851 ; it is tricky but fast and much shorter
2852 8D8D BD 0D 44 lda xtankstableL,x
2853 8D90 38 sec
2854 8D91 E9 09 sbc #9 ; 2 pixels more on left side + tank width
2855 8D93 A8 tay
2856 8D94 BD 13 44 lda xtankstableH,x
2857 8D97 E9 00 sbc #0
2858 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!!
2859 8D99 C5 62 cmp xdraw+1
2860 8D9B D0 02 bne @+
2861 8D9D C4 61 cpy xdraw
2862 @
2863 8D9F B0 4A bcs LeftFromTheTank
2864 8DA1 98 tya ;add 20 (tank size*2 +2 and +2)
2865 8DA2 18 clc
2866 8DA3 69 14 adc #20
2867 8DA5 A8 tay
2868 8DA6 BD 13 44 lda xtankstableH,x
2869 8DA9 69 00 adc #0
2870 8DAB C5 62 cmp xdraw+1
2871 8DAD D0 02 bne @+
2872 8DAF C4 61 cpy xdraw
2873 @
2874 8DB1 90 38 bcc RightFromTheTank
2875 8DB3 TankBelow
2876 ; tank below - we must move our tank
2877 8DB3 A6 6C ldx TankNr
2878 ; first erase old tank position
2879 8DB5 A9 01 85 AA mva #1 Erase
2880 8DB9 20 2C 6A jsr DrawTankNr
2881 8DBC A9 00 85 AA mva #0 Erase
2882 8DC0 24 A3 bit OverTankDir
2883 8DC2 30 0F bmi PassLeft
2884 8DC4 PassRight
2885 8DC4 FE 0D 44 inc XtankstableL,x
2886 8DC7 D0 03 FE 13 44 sne:inc XtankstableH,x
2887 8DCC A9 12 9D C3 48 mva #18 AngleTable,x
2888 8DD1 D0 12 bne Bypassing
2889 8DD3 PassLeft
2890 8DD3 DE 0D 44 dec XtankstableL,x
2891 8DD6 BD 0D 44 lda XtankstableL,x
2892 8DD9 C9 FF cmp #$ff
2893 8DDB D0 03 DE 13 44 sne:dec XtankstableH,x
2894 8DE0 A9 A2 9D C3 48 mva #162 AngleTable,x
2895 8DE5 Bypassing
2896 ; then draw tank on new position
2897 8DE5 20 2C 6A jsr DrawTankNr
2898 8DE8 4C 77 8D jmp CheckForTanksBelow
2899 8DEB RightFromTheTank
2900 8DEB LeftFromTheTank
2901 8DEB DeadTank
2902 8DEB ItIsMe
2903 8DEB CA dex
2904 8DEC 10 96 bpl CheckCollisionWithTankLoop
2905 8DEE A6 6C ldx TankNr
2906 8DF0 A9 0E 85 9E mva #sfx_shield_off sfx_effect
2907 8DF4 A9 01 85 AA mva #1 Erase
2908 8DF8 20 2C 6A jsr DrawTankNr
2909 8DFB A9 00 85 AA mva #0 Erase
2910 ; x correction for P/M
2911 ; --
2912 .IF XCORRECTION_FOR_PM = 1
2913 lda XtankstableL,x
2914 and #%11111110 ; correction for PM
2915 sta XtankstableL,x
2916 .ENDIF
2917 ; --
2918 8DFF GoDown
2919
2920 8DFF A9 3E 85 72 A9 46 + mwa #mountaintable temp
2921 8E07 18 clc
2922 8E08 A5 72 lda temp
2923 8E0A 7D 0D 44 adc XtankstableL,x
2924 8E0D 85 72 sta temp
2925 8E0F A5 73 lda temp+1
2926 8E11 7D 13 44 adc XtankstableH,x
2927 8E14 85 73 sta temp+1
2928 8E16 18 A5 72 69 04 85 + adw temp #4 ; center of the tank
2929 8E21 A0 00 ldy #0
2930 8E23 B1 72 lda (temp),y
2931 8E25 85 A3 sta OverTankDir ; not elegant!!! Reuse as height of tank flight
2932 8E27 FloatDown
2933 8E27 BD 19 44 lda ytankstable,x
2934 8E2A C5 A3 cmp OverTankDir
2935 8E2C B0 1D bcs OnGround
2936 ; first erase old tank position
2937 8E2E A9 01 85 AA mva #1 Erase
2938 8E32 20 2C 6A jsr DrawTankNr
2939 8E35 20 66 6C jsr DrawTankParachute
2940 8E38 A9 00 85 AA mva #0 Erase
2941 8E3C FE 19 44 inc ytankstable,x
2942 ; then draw tank on new position
2943 8E3F 20 2C 6A jsr DrawTankNr
2944 8E42 20 66 6C jsr DrawTankParachute
2945 8E45 20 89 5A jsr WaitOneFrame
2946 8E48 4C 27 8E jmp FloatDown
2947 8E4B OnGround
2948 ; clear parachute
2949 8E4B A9 01 85 AA mva #1 Erase
2950 8E4F 20 66 6C jsr DrawTankParachute
2951 8E52 A9 00 85 AA mva #0 Erase
2952 8E56 20 71 5A jsr WaitForKeyRelease
2953 ; and Soildown at the end (for correct mountaintable)
2954 ; If tank did not fly at maximum altitude there is no need to soildown to much
2955 8E59 A5 A2 lda FloatingAlt
2956 8E5B C9 12 cmp #18
2957 8E5D F0 03 beq NotHighest
2958 8E5F 20 89 8F jsr ClearScreenSoilRange
2959 8E62 NotHighest
2960 ; calculate range
2961 8E62 20 6B 8E jsr CalculateSoildown
2962 ; hide tanks and ...
2963 8E65 20 F4 6E jsr SoilDown2
2964 8E68 A6 6C ldx TankNr
2965 8E6A 60 rts
2966
2967 8E6B CalculateSoildown
2968 8E6B A6 6C ldx TankNr
2969 8E6D 18 clc
2970 8E6E BD 0D 44 lda XtankstableL,x
2971 8E71 69 04 adc #4
2972 8E73 85 61 sta xdraw
2973 8E75 BD 13 44 lda XtankstableH,x
2974 8E78 69 00 adc #0
2975 8E7A 85 62 sta xdraw+1
2976 8E7C A9 04 85 B0 mva #$04 ExplosionRadius
2977 8E80 20 0C 8F jsr CalculateExplosionRange
2978 8E83 60 rts
2979 .endp
2980
2981 ; -------------------------------------------------
2982 8E84 .proc CheckCollisionWithTank
2983 ; -------------------------------------------------
2984 ; Check collision with Tank :)
2985 ; xdraw , ydraw - coordinates of the checked point
2986 ; results:
2987 ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1)
2988 ; XHit , YHit - coordinates of hit
2989 ; X - index of the hit tank
2990
2991 8E84 A6 AE ldx NumberOfPlayers
2992 8E86 CA dex
2993 8E87 CheckCollisionWithTankLoop
2994 8E87 BD AF 43 lda eXistenZ,x
2995 8E8A F0 51 beq DeadTank
2996 ; first we test top and bottom (same with and without shield!)
2997 8E8C BD 19 44 lda ytankstable,x
2998 8E8F C5 63 cmp ydraw ; check range
2999 8E91 90 4A bcc BelowTheTank ;(ytankstable,ytankstable+3)
3000 8E93 E9 03 sbc #3 ; hitbox height
3001 8E95 C5 63 cmp ydraw
3002 8E97 B0 44 bcs OverTheTank
3003 ; with or without shield ?
3004
3005 8E99 BD FD 43 lda ActiveDefenceWeapon,x
3006 8E9C C9 25 cmp #ind_Mag_Deflector__ ; first shielded weapon
3007 8E9E 90 04 bcc CheckCollisionWithNotShieldedTank
3008 8EA0 C9 2A cmp #ind_Bouncy_Castle__+1 ; last shielded weapon
3009 8EA2 90 3D bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :)
3010
3011 ;lda ShieldEnergy,x ; there is wrong method to check shield :)
3012 ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :)
3013
3014 8EA4 CheckCollisionWithNotShieldedTank
3015 8EA4 BD 13 44 lda xtankstableH,x
3016 8EA7 C5 62 cmp xdraw+1
3017 8EA9 D0 05 bne @+
3018 8EAB BD 0D 44 lda xtankstableL,x
3019 8EAE C5 61 cmp xdraw
3020 @
3021 8EB0 B0 2B bcs LeftFromTheTank
3022 ; add 8 double byte
3023 ; now we use Y as low byte and A as high byte of checked position (right edge of tank)
3024 ; it is tricky but fast and much shorter
3025 8EB2 18 clc
3026 8EB3 BD 0D 44 lda xtankstableL,x
3027 8EB6 69 08 adc #TankWidth
3028 8EB8 A8 tay
3029 8EB9 BD 13 44 lda xtankstableH,x
3030 8EBC 69 00 adc #0
3031 8EBE C5 62 cmp xdraw+1
3032 8EC0 D0 02 bne @+
3033 8EC2 C4 61 cpy xdraw
3034 @
3035 8EC4 90 17 bcc RightFromTheTank
3036 8EC6 TankHit
3037 8EC6 E8 inx
3038 8EC7 86 BF stx HitFlag ; index of hit tank+1
3039 8EC9 CA dex
3040 8ECA A5 61 85 C1 A5 62 + mwa xdraw XHit
3041 8ED2 A5 63 8D 5F 44 A5 + mwa ydraw YHit
3042 8EDC 60 rts ; in X there is an index of the hit tank
3043 8EDD RightFromTheTank
3044 8EDD LeftFromTheTank
3045 8EDD OverTheTank
3046 8EDD BelowTheTank
3047 8EDD DeadTank
3048 8EDD CA dex
3049 8EDE 10 A7 bpl CheckCollisionWithTankLoop
3050 8EE0 60 rts
3051 8EE1 CheckCollisionWithShieldedTank
3052 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield)
3053 ; it is tricky but fast and much shorter
3054 8EE1 BD 0D 44 lda xtankstableL,x
3055 8EE4 38 sec
3056 8EE5 E9 04 sbc #4 ; 5 pixels more on left side
3057 8EE7 A8 tay
3058 8EE8 BD 13 44 lda xtankstableH,x
3059 8EEB E9 00 sbc #0
3060 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!!
3061 8EED C5 62 cmp xdraw+1
3062 8EEF D0 02 bne @+
3063 8EF1 C4 61 cpy xdraw
3064 @
3065 8EF3 B0 E8 bcs LeftFromTheTank
3066 8EF5 98 tya ;add 16 double byte
3067 8EF6 18 clc
3068 8EF7 69 10 adc #TankWidth+4+4
3069 8EF9 A8 tay
3070 8EFA BD 13 44 lda xtankstableH,x
3071 8EFD 69 00 adc #0
3072 8EFF C5 62 cmp xdraw+1
3073 8F01 D0 02 bne @+
3074 8F03 C4 61 cpy xdraw
3075 @
3076 8F05 90 D6 bcc RightFromTheTank
3077 8F07 B0 BD bcs TankHit
3078 .endp
3079 ;--------------------------------------------------
3080 8F09 CalculateExplosionRange0
3081 ;--------------------------------------------------
3082
3083 ;the same as below, but without summing up
3084 ;(for the first or single explosion)
3085
3086 ;zero soil fall out ranges
3087 8F09 20 89 8F jsr ClearScreenSoilRange
3088 ;--------------------------------------------------
3089 8F0C .proc CalculateExplosionRange
3090 ;--------------------------------------------------
3091 ;calculates total horizontal range of explosion by
3092 ;"summing up" ranges of all separate explosions
3093
3094 ; WeaponRangeRight = xdraw + ExplosionRadius
3095 8F0C 18 clc
3096 8F0D A5 61 lda xdraw
3097 8F0F 65 B0 adc ExplosionRadius
3098 8F11 8D 35 44 sta WeaponRangeRight
3099 8F14 A5 62 lda xdraw+1
3100 8F16 69 00 adc #$00
3101 8F18 8D 36 44 sta WeaponRangeRight+1
3102 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now
3103 ; cpw WeaponRangeRight #screenwidth-1
3104 8F1B C9 01 cmp #>(screenwidth-1)
3105 8F1D D0 05 bne @+
3106 8F1F AD 35 44 lda WeaponRangeRight
3107 8F22 C9 3F cmp #<(screenwidth-1)
3108 8F24 90 0A @ bcc NotOutOfTheScreenRight
3109 8F26 A9 3F 8D 35 44 A9 + mwa #screenwidth-1 WeaponRangeRight
3110
3111 8F30 NotOutOfTheScreenRight
3112 ; WeaponRangeLeft = xdraw - ExplosionRadius
3113 8F30 38 sec
3114 8F31 A5 61 lda xdraw
3115 8F33 E5 B0 sbc ExplosionRadius
3116 8F35 8D 33 44 sta WeaponRangeLeft
3117 8F38 A5 62 lda xdraw+1
3118 8F3A E9 00 sbc #$00
3119 8F3C 8D 34 44 sta WeaponRangeLeft+1
3120 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now
3121 ; lda WeaponRangeLeft+1
3122 8F3F 10 08 bpl NotOutOfTheScreenLeft
3123 8F41 A9 00 lda #0
3124 8F43 8D 33 44 sta WeaponRangeLeft
3125 8F46 8D 34 44 sta WeaponRangeLeft+1
3126 8F49 NotOutOfTheScreenLeft
3127
3128 8F49 A5 D3 CD 34 44 D0 + cpw RangeLeft WeaponRangeLeft
3129 8F55 90 0A bcc CheckRangeRight
3130 8F57 AD 33 44 85 D2 AD + mwa WeaponRangeLeft RangeLeft
3131 8F61 CheckRangeRight
3132 8F61 A5 D5 CD 36 44 D0 + cpw RangeRight WeaponRangeRight
3133 8F6D B0 0A bcs RangesChecked
3134 8F6F AD 35 44 85 D4 AD + mwa WeaponRangeRight RangeRight
3135 8F79 RangesChecked
3136
3137 8F79 60 rts
3138 .endp
3139
3140 ;--------------------------------------------------
3141 8F7A .proc SetFullScreenSoilRange
3142 ; whole screen in range of soil down
3143 ;--------------------------------------------------
3144 8F7A A9 00 lda #0
3145 8F7C 85 D2 sta RangeLeft
3146 8F7E 85 D3 sta RangeLeft+1
3147 8F80 A9 40 85 D4 A9 01 + mwa #screenwidth RangeRight
3148 8F88 60 rts
3149 .endp
3150 ;--------------------------------------------------
3151 8F89 .proc ClearScreenSoilRange
3152 ; cleanup of the soil fall down ranges (left and right)
3153 ;--------------------------------------------------
3154 8F89 A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft
3155 8F91 A9 00 lda #0
3156 8F93 85 D4 sta RangeRight
3157 8F95 85 D5 sta RangeRight+1
3158 8F97 60 rts
3159 .endp
3160 ;--------------------------------------------------
3161 8F98 .proc DecreaseWeaponBeforeShoot
3162 ;--------------------------------------------------
3163 8F98 A6 6C ldx TankNr
3164 8F9A BD F7 43 lda ActiveWeapon,x
3165 8F9D 20 A4 8F jsr DecreaseWeapon
3166 ; and here we have amount of possessed ammo for given weapon
3167 8FA0 8D 09 44 sta WeaponDepleted
3168 8FA3 60 rts
3169 .endp
3170
3171 ;--------------------------------------------------
3172 8FA4 .proc DecreaseWeapon
3173 ; in: A: Weapon number, TankNr
3174 ; out: A: number of shells left, Y: weapon number
3175 ; decreases 1 bullet from a weapon(A) of tank(TankNr)
3176 ;--------------------------------------------------
3177 8FA4 20 B3 8F jsr HowManyBullets
3178 8FA7 F0 09 beq noBullets ; no bullets - no decreasing (additional check)
3179 8FA9 C0 00 cpy #0
3180 8FAB F0 05 beq defaultWeapon ; no decreasing Baby Missile
3181 8FAD 38 sec
3182 8FAE E9 01 sbc #1
3183 8FB0 91 98 sta (weaponPointer),y ; we have good values after HowManyBullets
3184 8FB2 defaultWeapon
3185 8FB2 noBullets
3186 8FB2 60 rts
3187 .endp
3188
3189 ;--------------------------------------------------
3190 8FB3 .proc HowManyBullets
3191 ; in: A <-- Weapon number, TankNr
3192 ; out: A <-- How many bullets in the weapon, Y: weapon number
3193 ; how many bullets weapon of tank(TankNr) has, Result in A
3194 ;--------------------------------------------------
3195 8FB3 A8 tay
3196 8FB4 A6 6C ldx TankNr
3197 8FB6 BD F1 5A lda TanksWeaponsTableL,x
3198 8FB9 85 98 sta weaponPointer
3199 8FBB BD F7 5A lda TanksWeaponsTableH,x
3200 8FBE 85 99 sta weaponPointer+1
3201
3202 8FC0 B1 98 lda (weaponPointer),y ; and we have number of bullets in A
3203 8FC2 60 rts
3204 .endp
3205
3206
3207 .ENDIF
3208
352 ;----------------------------------------------
353 8FC3 icl 'ai.asm'
Source: ai.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 ; artificial intelligence of tanks goes here!
4 ; in A there is a level of tank's intelligence
5 ; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all)
6 ; at the moment (2003-08-15) I have no idea how
7 ; to program better opponents, but moron is easy -
8 ; - shoots random direction and force
9 ; greeeting to myself 10 years older in 2013-11-09... still no idea
10
11
12 ;----------------------------------------------
13 8FC3 .proc ArtificialIntelligence ;
14 ; A - skill of the TankNr (in X)
15 ; returns shoot energy and angle in
16 ; ForceTable/L/H and AngleTable
17 ;----------------------------------------------
18 8FC3 0A asl
19 8FC4 A8 tay
20 8FC5 88 88 :2 dey ;credit KK
21 8FC7 B9 F7 8F lda AIRoutines+1,y
22 8FCA 48 pha
23 8FCB B9 F6 8F lda AIRoutines,y
24 8FCE 48 pha
25 ; it's no necessary - PrepareAIShoot is next proc :)
26 ; jsr PrepareAIShoot
27 ; rts
28 .endp
29 ;----------------------------------------------
30 8FCF .proc PrepareAIShoot
31 ; create low precision table of positions
32 ; by dividing positions by 4
33 8FCF A0 05 ldy #MaxPlayers-1
34 8FD1 loop
35 8FD1 B9 0D 44 lda xtankstableL,y
36 8FD4 85 72 sta temp
37 8FD6 B9 13 44 lda xtankstableH,y
38 8FD9 85 73 sta temp+1
39 ;= /4
40 8FDB 46 73 66 72 46 73 + :2 lsrw temp
41 8FE3 A5 72 lda temp
42 8FE5 99 1F 44 sta LowResDistances,y
43 8FE8 88 dey
44 8FE9 10 E6 bpl loop
45
46 ; common values used in AI routines
47 ; address of weapons table (for future use)
48 8FEB WepTableToTemp
49 8FEB BD F1 5A lda TanksWeaponsTableL,x
50 8FEE 85 72 sta temp
51 8FF0 BD F7 5A lda TanksWeaponsTableH,x
52 8FF3 85 73 sta temp+1
53 8FF5 60 rts
54 .endp
55 ;----------------
56 8FF6 AIRoutines
57 8FF6 1C 90 .word Moron-1
58 8FF8 3D 90 .word Shooter-1 ;Shooter
59 8FFA CD 90 .word Poolshark-1 ;Poolshark
60 8FFC 8E 91 .word Tosser-1 ;Tosser
61 8FFE B7 91 .word Chooser-1 ;Chooser
62 9000 05 92 .word Spoiler-1 ;Spoiler
63 9002 53 92 .word Cyborg-1 ;Cyborg
64 9004 05 90 .word Unknown-1 ;Unknown
65
66 ;----------------------------------------------
67 9006 .proc Unknown
68 ; random robotank (from Poolshark to Cyborg)
69 9006 randomize 4 13
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9006 ?rand
7 9006 AD 1B D4 lda random
8 9009 C9 04 cmp #4 ;floor
9 900B 90 F9 bcc ?rand
10 900D C9 0E cmp #13+1 ;ceiling
11 900F B0 F5 bcs ?rand
Source: ai.asm
70 9011 29 FE and #%11111110
71 9013 A8 tay
72 9014 B9 F7 8F lda AIRoutines+1,y
73 9017 48 pha
74 9018 B9 F6 8F lda AIRoutines,y
75 901B 48 pha
76 901C 60 rts
77 .endp
78 ;----------------------------------------------
79 901D .proc Moron
80 901D 20 3D 59 jsr RandomizeAngle
81 9020 85 D6 sta NewAngle
82 9022 A9 50 8D E4 48 A9 + mwa #80 RandBoundaryLow
83 902C A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh
84 9036 20 45 59 jsr RandomizeForce
85 ; choose the best weapon
86 9039 A0 1F ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :)
87 903B 4C F4 95 jmp ChooseBestOffensive.NotFromAll
88 ;rts
89 .endp
90 ;----------------------------------------------
91 903E .proc Shooter
92
93 903E BD CC 48 lda PreviousAngle,x
94 9041 1D D2 48 ora PreviousEnergyL,x
95 9044 1D DE 48 ora PreviousEnergyH,x
96 9047 F0 2D beq firstShoot
97
98 9049 BD CC 48 lda PreviousAngle,x
99 904C C9 5A cmp #90
100 904E B0 09 bcs shootingLeftAtThisMomentOfTime
101 ; shooting right at this moment of time
102 9050 38 sec
103 9051 E9 05 sbc #5
104 9053 C9 0A cmp #10
105 9055 B0 09 bcs @+ ;not smaller than 10
106 9057 90 1D bcc firstShoot ; GET THE aim againg
107
108 9059 shootingLeftAtThisMomentOfTime
109
110 9059 18 clc
111 905A 69 05 adc #5
112 905C C9 AA cmp #170 ; maximum shooter angle
113 905E B0 16 bcs firstShoot
114 @
115 9060 85 D6 sta NewAngle
116
117 9062 38 sec
118 9063 BD D2 48 lda PreviousEnergyL,x
119 9066 E9 05 sbc #5
120 9068 9D D9 43 sta ForceTableL,x
121 906B BD DE 48 lda PreviousEnergyH,x
122 906E E9 00 sbc #0
123 9070 9D DF 43 sta ForceTableH,x
124 9073 4C B7 90 jmp endo
125
126 9076 firstShoot
127 ; compare the x position with the middle of the screen
128 9076 BD 13 44 lda xTanksTableH,x
129 9079 C9 00 cmp #>(screenwidth/2)
130 907B D0 05 bne @+
131 907D BD 0D 44 lda xTanksTableL,x
132 9080 C9 A0 cmp #<(screenwidth/2)
133 9082 90 0F @ bcc tankIsOnTheRight
134
135 ; enemy tank is on the left
136 9084 randomize 95 125
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9084 ?rand
7 9084 AD 1B D4 lda random
8 9087 C9 5F cmp #95 ;floor
9 9089 90 F9 bcc ?rand
10 908B C9 7E cmp #125+1 ;ceiling
11 908D B0 F5 bcs ?rand
Source: ai.asm
137 908F 85 D6 sta NewAngle
138 9091 D0 0D bne forceNow
139
140 9093 tankIsOnTheRight
141 9093 randomize 55 85
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9093 ?rand
7 9093 AD 1B D4 lda random
8 9096 C9 37 cmp #55 ;floor
9 9098 90 F9 bcc ?rand
10 909A C9 56 cmp #85+1 ;ceiling
11 909C B0 F5 bcs ?rand
Source: ai.asm
142 909E 85 D6 sta NewAngle
143
144 90A0 forceNow
145 90A0 A9 64 8D E4 48 A9 + mwa #100 RandBoundaryLow
146 90AA A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh
147 ;ldx TankNr ;this is possibly not necessary
148 90B4 20 45 59 jsr RandomizeForce
149
150 90B7 endo
151 ;ldx TankNr ;this is possibly not necessary
152 90B7 20 79 59 jsr RandomizeForce.LimitForce
153 90BA A5 D6 lda NewAngle
154 90BC 9D CC 48 sta PreviousAngle,x
155 90BF BD D9 43 lda ForceTableL,x
156 90C2 9D D2 48 sta PreviousEnergyL,x
157 90C5 BD DF 43 lda ForceTableH,x
158 90C8 9D DE 48 sta PreviousEnergyH,x
159
160 ; choose the best weapon
161
162 90CB 4C F2 95 jmp ChooseBestOffensive
163 ;rts
164 .endp
165 ;----------------------------------------------
166 90CE .proc Poolshark
167 90CE 20 35 91 jsr UseBatteryOrFlag
168 ; defensives
169 90D1 20 60 91 jsr PoolsharkDefensives
170 90D4 firstShoot
171 ;find nearest tank neighbour
172 90D4 20 C0 92 jsr FindBestTarget2
173 90D7 F0 0F beq EnemyOnLeft
174 ; calculate index to shotangle table
175 ; in temp2 we have x distance divided by 8
176 90D9 A5 74 lda temp2
177 90DB 4A 4A 4A :3 lsr @
178 90DE 29 07 and #%00000111
179 90E0 18 clc
180 90E1 69 08 adc #8
181 90E3 8D E8 48 sta AngleTablePointer
182 90E6 D0 0C bne AngleIsSet
183 90E8 EnemyOnLeft
184 90E8 A5 74 lda temp2
185 90EA 4A 4A 4A :3 lsr @
186 90ED 29 07 and #%00000111
187 90EF 49 07 eor #%00000111
188 90F1 8D E8 48 sta AngleTablePointer
189 90F4 AngleIsSet
190
191 90F4 randomize 0 8
Macro: RANDOMIZE [Source: MACRO.ASM]
6 90F4 ?rand
7 90F4 AD 1B D4 lda random
8 90F7 C9 00 cmp #0 ;floor
9 90F9 90 F9 bcc ?rand
10 90FB C9 09 cmp #8+1 ;ceiling
11 90FD B0 F5 bcs ?rand
Source: ai.asm
192 90FF AC E8 48 ldy AngleTablePointer
193 9102 18 clc
194 9103 79 25 91 adc AngleTable,y
195 9106 85 D6 sta NewAngle
196
197 9108 forceNow
198 9108 A9 2C 8D E4 48 A9 + mwa #300 RandBoundaryLow
199 9112 A9 BC 8D E6 48 A9 + mwa #700 RandBoundaryHigh
200 911C A6 6C ldx TankNr
201 911E 20 45 59 jsr RandomizeForce
202
203 9121 endo
204 ; choose the best weapon
205
206 9121 20 F2 95 jsr ChooseBestOffensive
207 9124 60 rts
208
209 ;----------------------------------------------
210 9125 AngleTable ; 16 bytes ;ba w $348b L$3350
211 9125 6A 72 7A 82 8A 92 + .by 106,114,122,130,138,146,154,162
212 912D 12 1A 22 2B 32 3A + .by 18,26,34,43,50,58,66,74
213 .endp
214 ;----------------------------------------------
215 9135 .proc UseBatteryOrFlag
216 9135 20 45 91 jsr UseBattery ; as subroutine for reuse in AutoDefense
217 ; if very low energy and no battery then use White Flag
218 9138 BD A2 43 lda Energy,x
219 913B C9 05 cmp #5
220 913D B0 05 bcs EnoughEnergy
221 ; lower than 5 units - white flag
222 913F A9 20 lda #ind_White_Flag_____
223 9141 9D FD 43 sta ActiveDefenceWeapon,x
224 9144 EnoughEnergy
225 9144 60 rts
226 .endp
227 ;
228 9145 .proc UseBattery
229 ; if low energy ten use battery
230 9145 BD A2 43 lda Energy,x
231 9148 C9 1E cmp #30
232 914A B0 13 bcs EnoughEnergy
233 ; lower than 30 units - check battery
234 914C A0 21 ldy #ind_Battery________
235 914E B1 72 lda (temp),y ; has address of TanksWeaponsTable
236 9150 F0 0D beq NoBatteries
237 ; we have batteries - use one
238 9152 38 sec
239 9153 E9 01 sbc #1
240 9155 91 72 sta (temp),y
241 9157 A9 63 lda #99
242 9159 9D A2 43 sta Energy,x
243 915C 20 2A 58 jsr MaxForceCalculate
244 915F EnoughEnergy
245 915F NoBatteries
246 915F 60 rts
247 .endp
248 ;----------------------------------------------
249 9160 .proc PoolsharkDefensives
250 ; use best defensive :)
251 ; but not allways
252 9160 randomize 1 3
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9160 ?rand
7 9160 AD 1B D4 lda random
8 9163 C9 01 cmp #1 ;floor
9 9165 90 F9 bcc ?rand
10 9167 C9 04 cmp #3+1 ;ceiling
11 9169 B0 F5 bcs ?rand
Source: ai.asm
253 916B C9 01 cmp #1
254 916D D0 1F bne NoUseDefensive
255 ; first check check if any is in use
256 916F BD FD 43 lda ActiveDefenceWeapon,x
257 9172 D0 1A bne DefensiveInUse
258 9174 A0 2A ldy #last_real_defensive+1 ;the last defensive weapon
259 @
260 9176 88 dey
261 9177 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
262 9179 F0 13 beq NoUseDefensive
263 917B B1 72 lda (temp),y ; has address of TanksWeaponsTable
264 917D F0 F7 beq @-
265 ; decrease in inventory
266 917F 38 sec
267 9180 E9 01 sbc #1
268 9182 91 72 sta (temp),y ; has address of TanksWeaponsTable
269 ; activate defensive weapon
270 9184 98 tya ; number of selectet defensive weapon
271 9185 9D FD 43 sta ActiveDefenceWeapon,x
272 9188 B9 1A 60 lda DefensiveEnergy,y
273 918B 9D A8 43 sta ShieldEnergy,x
274 918E NoUseDefensive
275 918E DefensiveInUse
276 918E 60 rts
277 .endp
278 ;----------------------------------------------
279 918F .proc Tosser
280 918F 20 35 91 jsr UseBatteryOrFlag
281 ; use best defensive :)
282 9192 20 98 91 jsr TosserDefensives
283 ; Toosser is like Poolshark but allways uses defensives
284 9195 4C D4 90 jmp Poolshark.firstShoot
285 .endp
286 ;----------------------------------------------
287 9198 .proc TosserDefensives
288 ; use best defensive :)
289 ; allways
290 ; first check check if any is in use
291 9198 BD FD 43 lda ActiveDefenceWeapon,x
292 919B D0 1A bne DefensiveInUse
293 919D A0 2A ldy #last_real_defensive+1 ;the last defensive weapon
294 @
295 919F 88 dey
296 91A0 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use)
297 91A2 F0 13 beq NoUseDefensive
298 91A4 B1 72 lda (temp),y ; has address of TanksWeaponsTable
299 91A6 F0 F7 beq @-
300 ; decrease in inventory
301 91A8 38 sec
302 91A9 E9 01 sbc #1
303 91AB 91 72 sta (temp),y ; has address of TanksWeaponsTable
304 ; activate defensive weapon
305 91AD 98 tya ; number of selectet defensive weapon
306 91AE 9D FD 43 sta ActiveDefenceWeapon,x
307 91B1 B9 1A 60 lda DefensiveEnergy,y
308 91B4 9D A8 43 sta ShieldEnergy,x
309 91B7 DefensiveInUse
310 91B7 NoUseDefensive
311 91B7 60 rts
312 .endp
313 ;----------------------------------------------
314 91B8 .proc Chooser
315 ; like cyborg but more randomizing force
316 91B8 20 35 91 jsr UseBatteryOrFlag
317 ; use defensives like Tosser
318 91BB 20 98 91 jsr TosserDefensives
319 ; now select best target
320 91BE A9 00 lda #$00 ; no prefer humans
321 91C0 20 81 92 jsr FindBestTarget3
322 91C3 8C 31 44 sty TargetTankNr
323 ; aiming
324 91C6 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right)
325
326 ; choose the best weapon
327 91C9 20 F2 95 jsr ChooseBestOffensive
328
329 ; randomizing force +-100
330 91CC 38 A5 A4 E9 64 8D + sbw Force #100 RandBoundaryLow
331 91DB 10 0A bpl NotNegativeEnergy
332 91DD A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow
333 91E7 NotNegativeEnergy
334 91E7 18 A5 A4 69 64 8D + adw Force #100 RandBoundaryHigh
335 91F6 20 45 59 jsr RandomizeForce
336 ; if target distance lower than 24 - set weapon to Baby Missile (for security :)
337 91F9 20 08 96 jsr GetDistance
338 91FC C9 06 cmp #6 ; 24/4
339 91FE B0 05 bcs HighForce
340 9200 A9 00 lda #ind_Baby_Missile___
341 9202 9D F7 43 sta ActiveWeapon,x
342 9205 HighForce
343 9205 60 rts
344 .endp
345 ;----------------------------------------------
346 9206 .proc Spoiler
347 ; like cyborg but little randomizing force
348 9206 20 35 91 jsr UseBatteryOrFlag
349 ; use defensives like Tosser
350 9209 20 98 91 jsr TosserDefensives
351 ; now select best target
352 920C A9 00 lda #$00 ; no prefer humans
353 920E 20 81 92 jsr FindBestTarget3
354 9211 8C 31 44 sty TargetTankNr
355 ; aiming
356 9214 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right)
357
358 ; choose the best weapon
359 9217 20 F2 95 jsr ChooseBestOffensive
360
361 ; randomizing force +-50
362 921A 38 A5 A4 E9 32 8D + sbw Force #50 RandBoundaryLow
363 9229 10 0A bpl NotNegativeEnergy
364 922B A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow
365 9235 NotNegativeEnergy
366 9235 18 A5 A4 69 32 8D + adw Force #50 RandBoundaryHigh
367 9244 20 45 59 jsr RandomizeForce
368 ; if target distance lower than 24 - set weapon to Baby Missile (for security :)
369 9247 20 08 96 jsr GetDistance
370 924A C9 06 cmp #6 ; 24/4
371 924C B0 05 bcs HighForce
372 924E A9 00 lda #ind_Baby_Missile___
373 9250 9D F7 43 sta ActiveWeapon,x
374 9253 HighForce
375 9253 60 rts
376 .endp
377 ;----------------------------------------------
378 9254 .proc Cyborg
379 9254 20 35 91 jsr UseBatteryOrFlag
380 ; use defensives like Tosser
381 9257 20 98 91 jsr TosserDefensives
382 ; now select best target
383 925A A9 64 lda #100 ; prefer humans
384 925C 20 81 92 jsr FindBestTarget3
385 925F 8C 31 44 sty TargetTankNr
386 ; aiming
387 9262 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right)
388
389 ; choose the best weapon
390 9265 A0 04 ldy #ind_Nuke___________+1
391 9267 20 F4 95 jsr ChooseBestOffensive.NotFromAll
392
393 926A A5 A4 lda Force
394 926C 9D D9 43 sta ForceTableL,x
395 926F A5 A5 lda Force+1
396 9271 9D DF 43 sta ForceTableH,x
397 ; if target distance lower than 32 - set weapon to Baby Missile (for security :)
398 9274 20 08 96 jsr GetDistance
399 9277 C9 08 cmp #8 ;32/4
400 9279 B0 05 bcs HighForce
401 927B A9 00 lda #ind_Baby_Missile___
402 927D 9D F7 43 sta ActiveWeapon,x
403 9280 HighForce
404 9280 60 rts
405 .endp
406
407 ;----------------------------------------------
408 9281 .proc FindBestTarget3
409 ; find target with lowest energy
410 ; X - shooting tank number
411 ; A - 100 - prefer humans , 0 - equality :)
412 ; returns target tank number in Y and
413 ; direcion of shoot in A (0 - left, >0 - right)
414 ;----------------------------------------------
415 9281 85 A2 sta PreferHumansFlag
416 ; jsr MakeLowResDistances
417 9283 A9 CA lda #202
418 9285 85 74 sta temp2 ; max possible energy
419 9287 A9 00 lda #0
420 9289 85 7E sta tempor2 ; direction of shoot
421 ;ldx TankNr
422 928B A4 AE ldy NumberOfPlayers
423 928D 88 dey
424
425 928E loop01
426 928E C4 6C cpy TankNr
427 9290 F0 26 beq skipThisPlayer
428 9292 B9 AF 43 lda eXistenZ,y
429 9295 F0 21 beq skipThisPlayer
430
431 9297 B9 39 41 lda skilltable,y
432 929A F0 02 beq ItIsHuman
433 929C A5 A2 lda PreferHumansFlag
434 929E ItIsHuman
435 929E 18 clc
436 929F 79 A2 43 adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag)
437 92A2 C5 74 cmp temp2 ; lowest
438 92A4 B0 12 bcs lowestIsLower
439 92A6 85 74 sta temp2
440 92A8 84 75 sty temp2+1 ; number of the closest tank
441 92AA A9 00 85 7E mva #0 tempor2
442 92AE BD 1F 44 lda LowResDistances,x
443 92B1 D9 1F 44 cmp LowResDistances,y
444 92B4 B0 02 bcs EnemyOnTheLeft
445 ; enemy on right
446 92B6 E6 7E inc tempor2 ; set direction to right
447
448 92B8 EnemyOnTheLeft
449 92B8 lowestIsLower
450 92B8 skipThisPlayer
451 92B8 88 dey
452 92B9 10 D3 bpl loop01
453 ; now we have number of the farthest tank in temp2+1
454 ; and direction (0 - left, >0 - right) in tempor2
455 ; let's move them to registers
456 ; in temp2 we have energy of target
457 92BB A4 75 ldy temp2+1
458 92BD A5 7E lda tempor2
459 92BF 60 rts
460 .endp
461 ;----------------------------------------------
462 92C0 .proc FindBestTarget2
463 ; find nearest tank neighbour
464 ; X - shooting tank number
465 ; returns target tank number in Y and
466 ; direcion of shoot in A (0 - left, >0 - right)
467 ;----------------------------------------------
468 ; jsr MakeLowResDistances
469 92C0 A9 FF 85 74 mva #$ff temp2 ; min possible distance
470 92C4 A9 00 85 7E mva #0 tempor2 ; direction of shoot
471
472 ;ldx TankNr
473 92C8 A4 AE ldy NumberOfPlayers
474 92CA 88 dey
475
476 92CB loop01
477 92CB C4 6C cpy TankNr
478 92CD F0 2F beq skipThisPlayer
479 92CF B9 AF 43 lda eXistenZ,y
480 92D2 F0 2A beq skipThisPlayer
481
482 92D4 BD 1F 44 lda LowResDistances,x
483 92D7 D9 1F 44 cmp LowResDistances,y
484 92DA B0 13 bcs EnemyOnTheLeft
485 ;enemy on the right
486 92DC 38 sec
487 92DD B9 1F 44 lda LowResDistances,y
488 92E0 FD 1F 44 sbc LowResDistances,x
489 92E3 C5 74 cmp temp2 ; lowest
490 92E5 B0 17 bcs lowestIsLower
491 92E7 85 74 sta temp2
492 92E9 84 75 sty temp2+1 ; number of the closest tank
493 92EB E6 7E inc tempor2 ; set direction to right
494 92ED D0 0F bne lowestIsLower
495
496 92EF EnemyOnTheLeft
497 92EF 38 sec
498 92F0 BD 1F 44 lda LowResDistances,x
499 92F3 F9 1F 44 sbc LowResDistances,y
500 92F6 C5 74 cmp temp2 ; lowest
501 92F8 B0 04 bcs lowestIsLower
502 92FA 85 74 sta temp2
503 92FC 84 75 sty temp2+1 ; number of the closest tank
504
505 92FE lowestIsLower
506 92FE skipThisPlayer
507 92FE 88 dey
508 92FF 10 CA bpl loop01
509 ; now we have number of the closest tank in temp2+1
510 ; and direction (0 - left, >0 - right) in tempor2
511 ; let's move them to registers
512 ; in temp2 we have x distance divided by 8
513 9301 A4 75 ldy temp2+1
514 9303 A5 7E lda tempor2
515 9305 60 rts
516 .endp
517
518 ;----------------------------------------------
519 9306 .proc TakeAim
520 ; targeting the tank number TargetTankNr (and Y)
521 ; A (and tempor2) - direction from shooting tank (0 - left, >0 - right)
522 ; returns angle and power of shoot tank X (TankNr)
523 ; in the appropriate variables (Angle and Force)
524 ;----------------------------------------------
525 9306 BD F7 43 lda ActiveWeapon,x
526 9309 48 pha ; store active weapon
527 930A A9 FF 8D 32 44 mva #$ff SecondTryFlag
528 ; set initial Angle and Force values
529 930F AD 41 41 lda OptionsTable+2 ; selected gravity
530 9312 0A asl
531 9313 A8 tay
532 ; force correction - lower tank Y position - higher possible force
533 9314 38 sec
534 9315 A9 C8 lda #screenheight
535 9317 FD 19 44 sbc Ytankstable,x
536 931A 85 74 sta temp2
537 931C 18 clc
538 931D B9 EA A2 lda AIForceTable,y
539 9320 8D E4 48 sta RandBoundaryLow
540 9323 65 74 adc temp2
541 9325 8D E6 48 sta RandBoundaryHigh
542 9328 B9 EB A2 lda AIForceTable+1,y
543 932B 8D E5 48 sta RandBoundaryLow+1
544 932E 69 00 adc #0
545 9330 8D E7 48 sta RandBoundaryHigh+1
546 9333 20 45 59 jsr RandomizeForce
547 9336 RepeatAim
548 9336 20 96 59 jsr Table2Force
549 ; wind correction 90+(wind/8)
550 9339 A5 CE 85 74 A5 CF + mwa Wind temp2
551 9341 46 75 66 74 46 75 + :7 lsrw temp2
552 935D 18 clc
553 935E A9 5A lda #90
554 9360 65 74 adc temp2
555 9362 85 D6 sta NewAngle
556 ; set virtual weapon :)
557 9364 A9 00 lda #ind_Baby_Missile___
558 9366 9D F7 43 sta ActiveWeapon,x
559 ; now we have initial valuses
560 9369 A9 C0 85 97 mva #%11000000 TestFlightFlag
561 ; check targeting direction
562 936D A5 7E lda tempor2
563 936F F0 03 4C 06 94 jne AimingLeft
564 9374 AimingRight
565 ; make test Shoot (Flight)
566 9374 20 7E 94 jsr SetStartAndFlight
567 9377 A5 BF lda HitFlag
568 9379 F0 29 beq NoHitInFirstLoopR ; impossible :)
569 937B 30 08 bmi GroundHitInFirstLoopR
570 937D TankHitInFirstLoopR
571 ; tank hit, but which tank?
572 ; it's our target or not?
573 937D A4 BF ldy HitFlag
574 937F 88 dey
575 9380 CC 31 44 cpy TargetTankNr
576 9383 F0 28 beq EndOfFirstLoopR ; it's our target!
577 ; if it's another tank then check position like ground hit
578 9385 GroundHitInFirstLoopR
579 ; checking only x position of hit
580 9385 AC 31 44 ldy TargetTankNr
581 9388 B9 13 44 lda xTanksTableH,y
582 938B C5 C2 cmp XHit+1
583 938D D0 05 bne @+
584 938F B9 0D 44 lda xTanksTableL,y
585 9392 C5 C1 cmp XHit
586 @
587 9394 B0 15 bcs HitOnRightSideOfTargetR
588 ; continue targeting
589 9396 18 clc
590 9397 A5 D6 lda NewAngle
591 9399 69 05 adc #5 ; 5 deg to right
592 939B C9 A0 cmp #(180-20)
593 ; bcs EndOfFirstLoopR ; if angle 180-20 or higher
594 939D B0 4F bcs AimSecondTry
595 939F 85 D6 sta NewAngle
596 93A1 4C 74 93 jmp AimingRight
597 93A4 NoHitInFirstLoopR
598 ; Angle 5 deg to left and end loop
599 93A4 38 sec
600 93A5 A5 D6 lda NewAngle
601 93A7 E9 05 sbc #5
602 93A9 85 D6 sta NewAngle
603 93AB HitOnRightSideOfTargetR
604 93AB C6 D6 dec NewAngle
605 93AD EndOfFirstLoopR
606 93AD A9 05 85 76 mva #5 modify ; set counter (5 turns)
607 93B1 SecondLoopR
608 ; make test Shoot (Flight)
609 93B1 20 7E 94 jsr SetStartAndFlight
610 93B4 A5 BF lda HitFlag
611 93B6 F0 2F beq NoHitInSecondLoopR ; impossible :)
612 93B8 30 08 bmi GroundHitInSecondLoopR
613 93BA TankHitInSecondLoopR
614 ; tank hit, but which tank?
615 ; it's our target or not?
616 93BA A4 BF ldy HitFlag
617 93BC 88 dey
618 93BD CC 31 44 cpy TargetTankNr
619 93C0 F0 27 beq EndOfSecondLoopR ; it's our target!
620 ; if it's another tank then check position like ground hit
621 93C2 GroundHitInSecondLoopR
622 ; checking only x position of hit
623 93C2 AC 31 44 ldy TargetTankNr
624 93C5 B9 13 44 lda xTanksTableH,y
625 93C8 C5 C2 cmp XHit+1
626 93CA D0 05 bne @+
627 93CC B9 0D 44 lda xTanksTableL,y
628 93CF C5 C1 cmp XHit
629 @
630 93D1 90 09 bcc HitOnLeftSideOfTargetR
631 ; continue targeting
632 93D3 C6 D6 dec NewAngle ; 1 deg to left
633 93D5 C6 76 dec modify ; max 5 turns
634 93D7 F0 10 beq EndOfSecondLoopR
635 93D9 4C B1 93 jmp SecondLoopR
636 93DC HitOnLeftSideOfTargetR
637 ; decrease energy (a little)
638 93DC 38 A5 A4 E9 05 85 + sbw Force #5
639 93E7 NoHitInSecondLoopR
640 ; Angle 1 deg to right and end loop
641 93E7 E6 D6 inc NewAngle
642 93E9 EndOfSecondLoopR
643 93E9 EndOfAim
644 93E9 68 pla ; and restore active weapon
645 93EA 9D F7 43 sta ActiveWeapon,x
646 93ED 60 rts
647
648 93EE AimSecondTry
649 93EE 2C 32 44 bit SecondTryFlag
650 93F1 10 F6 bpl EndOfAim ; closest RTS
651 93F3 EE 32 44 inc SecondTryFlag
652 93F6 A9 E8 lda #<1000
653 93F8 9D D9 43 sta ForceTableL,x
654 93FB A9 03 lda #>1000
655 93FD 9D DF 43 sta ForceTableH,x
656 9400 20 79 59 jsr RandomizeForce.LimitForce
657 9403 4C 36 93 jmp RepeatAim
658
659 9406 AimingLeft
660 ; make test Shoot (Flight)
661 9406 20 7E 94 jsr SetStartAndFlight
662 9409 A5 BF lda HitFlag
663 940B F0 29 beq NoHitInFirstLoopL ; impossible :)
664 940D 30 08 bmi GroundHitInFirstLoopL
665 940F TankHitInFirstLoopL
666 ; tank hit, but which tank?
667 ; it's our target or not?
668 940F A4 BF ldy HitFlag
669 9411 88 dey
670 9412 CC 31 44 cpy TargetTankNr
671 9415 F0 28 beq EndOfFirstLoopL ; it's our target!
672 ; if it's another tank then check position like ground hit
673 9417 GroundHitInFirstLoopL
674 ; checking only x position of hit
675 9417 AC 31 44 ldy TargetTankNr
676 941A B9 13 44 lda xTanksTableH,y
677 941D C5 C2 cmp XHit+1
678 941F D0 05 bne @+
679 9421 B9 0D 44 lda xTanksTableL,y
680 9424 C5 C1 cmp XHit
681 @
682 9426 90 15 bcc HitOnLeftSideOfTargetL
683 ; continue targeting
684 9428 38 sec
685 9429 A5 D6 lda NewAngle
686 942B E9 05 sbc #5 ; 5 deg to left
687 942D C9 15 cmp #21
688 ; bcc EndOfFirstLoopL ; if angle 20 or lower
689 942F 90 BD bcc AimSecondTry
690 9431 85 D6 sta NewAngle
691 9433 4C 06 94 jmp AimingLeft
692 9436 NoHitInFirstLoopL
693 ; Angle 5 deg to right and end loop
694 9436 18 clc
695 9437 A5 D6 lda NewAngle
696 9439 69 05 adc #5
697 943B 85 D6 sta NewAngle
698 943D HitOnLeftSideOfTargetL
699 943D E6 D6 inc NewAngle
700 943F EndOfFirstLoopL
701 943F A9 05 85 76 mva #5 modify ; set counter (5 turns)
702 9443 SecondLoopL
703 ; make test Shoot (Flight)
704 9443 20 7E 94 jsr SetStartAndFlight
705 9446 A5 BF lda HitFlag
706 9448 F0 2F beq NoHitInSecondLoopL ; impossible :)
707 944A 30 08 bmi GroundHitInSecondLoopL
708 944C TankHitInSecondLoopL
709 ; tank hit, but which tank?
710 ; it's our target or not?
711 944C A4 BF ldy HitFlag
712 944E 88 dey
713 944F CC 31 44 cpy TargetTankNr
714 9452 F0 27 beq EndOfSecondLoopL ; it's our target!
715 ; if it's another tank then check position like ground hit
716 9454 GroundHitInSecondLoopL
717 ; checking only x position of hit
718 9454 AC 31 44 ldy TargetTankNr
719 9457 B9 13 44 lda xTanksTableH,y
720 945A C5 C2 cmp XHit+1
721 945C D0 05 bne @+
722 945E B9 0D 44 lda xTanksTableL,y
723 9461 C5 C1 cmp XHit
724 @
725 9463 B0 09 bcs HitOnRightSideOfTargetL
726 ; continue targeting
727 9465 E6 D6 inc NewAngle ; 1 deg to right
728 9467 C6 76 dec modify ; max 5 turns
729 9469 F0 10 beq EndOfSecondLoopL
730 946B 4C 43 94 jmp SecondLoopL
731 946E HitOnRightSideOfTargetL
732 ; decrease energy (a little)
733 946E 38 A5 A4 E9 05 85 + sbw Force #5
734 9479 NoHitInSecondLoopL
735 ; Angle 1 deg to left and end loop
736 9479 C6 D6 dec NewAngle
737 947B EndOfSecondLoopL
738 947B 4C E9 93 jmp EndOfAim
739
740 947E SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight
741 ; xtraj+1 and ytraj+1 set
742 947E 18 clc
743 947F BD 0D 44 lda xTanksTableL,x
744 9482 69 04 adc #4
745 9484 85 C9 sta xtraj+1
746 9486 BD 13 44 lda xTanksTableH,x
747 9489 69 00 adc #0
748 948B 85 CA sta xtraj+2
749 948D 38 sec
750 948E BD 19 44 lda yTanksTable,x
751 9491 E9 04 sbc #4
752 9493 85 CC sta ytraj+1
753 9495 A9 00 85 CD mva #0 ytraj+2
754 9499 A5 D6 85 A7 mva NewAngle Angle
755 949D 20 A0 83 jsr Flight
756 94A0 A6 6C ldx TankNr
757 94A2 60 rts
758 .endp
759 ;----------------------------------------------
760 94A3 .proc PurchaseAI ;
761 ; A - skill of the TankNr
762 ; makes purchase for AI opponents
763 ; results of this routine are not visible on the screen
764 ;----------------------------------------------
765 94A3 0A asl
766 94A4 AA tax
767 94A5 CA CA :2 dex ;credit KK
768 94A7 BD B1 94 lda PurchaseAIRoutines+1,x
769 94AA 48 pha
770 94AB BD B0 94 lda PurchaseAIRoutines,x
771 94AE 48 pha
772 94AF 60 rts
773 .endp
774
775 ;----------------
776 94B0 PurchaseAIRoutines
777 94B0 BF 94 .word MoronPurchase-1
778 94B2 39 95 .word ShooterPurchase-1 ;ShooterPurchase
779 94B4 60 95 .word PoolsharkPurchase-1 ;PoolsharkPurchase
780 94B6 89 95 .word TosserPurchase-1 ;TosserPurchase
781 94B8 89 95 .word TosserPurchase-1 ;ChooserPurchase
782 94BA BC 95 .word CyborgPurchase-1 ;SpoilerPurchase
783 94BC BC 95 .word CyborgPurchase-1 ;CyborgPurchase
784 94BE 89 95 .word TosserPurchase-1 ;UnknownPurchase
785
786 ;----------------------------------------------
787 94C0 .proc MoronPurchase
788 ;Moron buys nothing
789 94C0 60 rts
790 .endp
791 ;-------
792 94C1 .proc TryToPurchaseOnePiece2 ; for Cyborg
793 ; A - weapon number, better it will be in range(1,32)
794 ; TankNr in X
795 ; DOES NOT CHANGE X
796 94C1 A8 tay
797 94C2 85 73 sta temp+1
798 94C4 4A 4A 4A :3 lsr ; A=A/8
799 94C7 85 72 sta temp
800 94C9 98 tya
801 94CA 29 07 and #%00000111
802 94CC A8 tay
803 94CD B9 1C 5C lda bittable,y
804 94D0 A4 72 ldy temp
805 94D2 39 04 5D and PurchaseMeTable2,y
806 94D5 F0 62 beq TryToPurchaseOnePiece.SorryNoPurchase
807 94D7 4C F0 94 jmp TryToPurchaseOnePiece.PurchaseIt
808 .endp
809 ;-------
810 94DA .proc TryToPurchaseOnePiece
811 ; A - weapon number, better it will be in range(1,32)
812 ; TankNr in X
813 ; DOES NOT CHANGE X
814 94DA A8 tay
815 94DB 85 73 sta temp+1
816 94DD 4A 4A 4A :3 lsr ; A=A/8
817 94E0 85 72 sta temp
818 94E2 98 tya
819 94E3 29 07 and #%00000111
820 94E5 A8 tay
821 94E6 B9 1C 5C lda bittable,y
822 94E9 A4 72 ldy temp
823 94EB 39 FE 5C and PurchaseMeTable,y
824 94EE F0 49 beq SorryNoPurchase
825 94F0 PurchaseIt
826 94F0 A4 73 ldy temp+1
827 94F2 B9 9E 5C lda WeaponPriceL,y
828 94F5 85 72 sta temp
829 94F7 B9 6E 5C lda WeaponPriceH,y
830 94FA 85 73 sta temp+1
831 ;price of the weapon in temp
832 94FC BD 84 43 lda MoneyL,x
833 94FF 85 74 sta temp2
834 9501 BD 7E 43 lda MoneyH,x
835 9504 85 75 sta temp2+1
836 ;current monies in temp2
837 9506 A5 75 C5 73 D0 04 + cpw temp2 temp
838 9510 90 27 bcc SorryNoPurchase
839 ; deduct monies from the bank account
840 9512 38 sec
841 9513 A5 74 lda temp2
842 9515 E5 72 sbc temp
843 9517 9D 84 43 sta MoneyL,x
844 951A A5 75 lda temp2+1
845 951C E5 73 sbc temp+1
846 951E 9D 7E 43 sta MoneyH,x
847
848 9521 BD F1 5A lda TanksWeaponsTableL,x
849 9524 85 72 sta temp
850 9526 BD F7 5A lda TanksWeaponsTableH,x
851 9529 85 73 sta temp+1
852
853 952B B9 CE 5C lda WeaponUnits,y
854 952E 18 clc
855 952F 71 72 adc (temp),y
856 9531 C9 63 cmp #99 ;max number of weapon units
857 9533 90 02 bcc NotExceeded
858 9535 A9 63 lda #99
859 9537 NotExceeded
860 9537 91 72 sta (temp),y
861
862
863 9539 SorryNoPurchase
864 9539 60 rts
865 .endp
866
867
868 ;----------------------------------------------
869 953A .proc ShooterPurchase
870 ; first try to buy defensives
871 ; mva #2 tempXroller; number of offensive purchases to perform
872 953A A6 6C ldx TankNr
873 @
874 953C randomize ind_Battery________ ind_StrongParachute
Macro: RANDOMIZE [Source: MACRO.ASM]
6 953C ?rand
7 953C AD 1B D4 lda random
8 953F C9 21 cmp #IND_BATTERY________ ;floor
9 9541 90 F9 bcc ?rand
10 9543 C9 25 cmp #IND_STRONGPARACHUTE+1 ;ceiling
11 9545 B0 F5 bcs ?rand
Source: ai.asm
875 9547 20 DA 94 jsr TryToPurchaseOnePiece
876 ; dec tempXroller
877 ; bne @-
878
879 ; and now offensives
880 954A A9 04 85 78 mva #4 tempXroller; number of offensive purchases to perform
881 ;ldx TankNr
882 @
883 954E randomize ind_Missile________ ind_Heavy_Roller___
Macro: RANDOMIZE [Source: MACRO.ASM]
6 954E ?rand
7 954E AD 1B D4 lda random
8 9551 C9 01 cmp #IND_MISSILE________ ;floor
9 9553 90 F9 bcc ?rand
10 9555 C9 0F cmp #IND_HEAVY_ROLLER___+1 ;ceiling
11 9557 B0 F5 bcs ?rand
Source: ai.asm
884 9559 20 DA 94 jsr TryToPurchaseOnePiece
885 955C C6 78 dec tempXroller
886 955E D0 EE bne @-
887
888 9560 60 rts
889 .endp
890 ;----------------------------------------------
891 9561 .proc PoolsharkPurchase
892 ; first try to buy defensives
893 ; mva #2 tempXroller; number of offensive purchases to perform
894 9561 A6 6C ldx TankNr
895 @
896 9563 randomize ind_Battery________ ind_Bouncy_Castle__
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9563 ?rand
7 9563 AD 1B D4 lda random
8 9566 C9 21 cmp #IND_BATTERY________ ;floor
9 9568 90 F9 bcc ?rand
10 956A C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling
11 956C B0 F5 bcs ?rand
Source: ai.asm
897 956E 20 DA 94 jsr TryToPurchaseOnePiece
898 9571 C6 78 dec tempXroller
899 ; bpl @-
900
901 ; and now offensives
902 9573 A9 06 85 78 mva #6 tempXroller; number of purchases to perform
903 ;ldx TankNr
904 @
905 9577 randomize ind_Missile________ ind_Dirt_Charge____
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9577 ?rand
7 9577 AD 1B D4 lda random
8 957A C9 01 cmp #IND_MISSILE________ ;floor
9 957C 90 F9 bcc ?rand
10 957E C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling
11 9580 B0 F5 bcs ?rand
Source: ai.asm
906 9582 20 DA 94 jsr TryToPurchaseOnePiece
907 9585 C6 78 dec tempXroller
908 9587 D0 EE bne @-
909
910 9589 60 rts
911 .endp
912 ;----------------------------------------------
913 958A .proc TosserPurchase
914
915 ; what is my money level
916 958A A6 6C ldx TankNr
917 958C BD 7E 43 lda MoneyH,x ; money / 256
918 958F 4A lsr ; /2
919 9590 85 78 sta tempXroller ; perform this many purchase attempts
920 ; first try to buy defensives
921 ; mva #1 tempXroller; number of defensive purchases to perform
922 @
923 9592 randomize ind_Battery________ ind_Bouncy_Castle__
Macro: RANDOMIZE [Source: MACRO.ASM]
6 9592 ?rand
7 9592 AD 1B D4 lda random
8 9595 C9 21 cmp #IND_BATTERY________ ;floor
9 9597 90 F9 bcc ?rand
10 9599 C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling
11 959B B0 F5 bcs ?rand
Source: ai.asm
924 959D 20 DA 94 jsr TryToPurchaseOnePiece
925 95A0 C6 78 dec tempXroller
926 95A2 10 EE bpl @-
927
928 ; and now offensives
929 95A4 BD 7E 43 lda MoneyH,x ; money / 256
930 95A7 0A asl ;*2
931 95A8 85 78 sta tempXroller ; perform this many purchase attempts
932 @
933 95AA randomize ind_Missile________ ind_Dirt_Charge____
Macro: RANDOMIZE [Source: MACRO.ASM]
6 95AA ?rand
7 95AA AD 1B D4 lda random
8 95AD C9 01 cmp #IND_MISSILE________ ;floor
9 95AF 90 F9 bcc ?rand
10 95B1 C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling
11 95B3 B0 F5 bcs ?rand
Source: ai.asm
934 95B5 20 DA 94 jsr TryToPurchaseOnePiece
935 95B8 C6 78 dec tempXroller
936 95BA 10 EE bpl @-
937
938 95BC 60 rts
939 .endp
940 ;----------------------------------------------
941 95BD .proc CyborgPurchase
942
943 ; what is my money level
944 95BD A6 6C ldx TankNr
945 95BF BD 7E 43 lda MoneyH,x ; money / 256
946 95C2 4A lsr ; /2
947 95C3 85 78 sta tempXroller ; perform this many purchase attempts
948 ; first try to buy defensives
949 ; mva #1 tempXroller; number of defensive purchases to perform
950 @
951 95C5 randomize ind_Battery________ ind_Bouncy_Castle__
Macro: RANDOMIZE [Source: MACRO.ASM]
6 95C5 ?rand
7 95C5 AD 1B D4 lda random
8 95C8 C9 21 cmp #IND_BATTERY________ ;floor
9 95CA 90 F9 bcc ?rand
10 95CC C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling
11 95CE B0 F5 bcs ?rand
Source: ai.asm
952 95D0 20 C1 94 jsr TryToPurchaseOnePiece2
953 95D3 C6 78 dec tempXroller
954 95D5 10 EE bpl @-
955
956 ; and now offensives
957 95D7 BD 7E 43 lda MoneyH,x ; money / 256
958 95DA 0A 0A 0A :3 asl ;*8
959 95DD 85 78 sta tempXroller ; perform this many purchase attempts
960 @
961 95DF randomize first_offensive____ last_offensive_____
Macro: RANDOMIZE [Source: MACRO.ASM]
6 95DF ?rand
7 95DF AD 1B D4 lda random
8 95E2 C9 00 cmp #FIRST_OFFENSIVE____ ;floor
9 95E4 90 F9 bcc ?rand
10 95E6 C9 20 cmp #LAST_OFFENSIVE_____+1 ;ceiling
11 95E8 B0 F5 bcs ?rand
Source: ai.asm
962 95EA 20 C1 94 jsr TryToPurchaseOnePiece2
963 95ED C6 78 dec tempXroller
964 95EF 10 EE bpl @-
965
966 95F1 60 rts
967 .endp
968 ;----------------------------------------------
969 95F2 .proc ChooseBestOffensive
970 ; choose the best weapon
971 ; X - TankNr
972 ;----------------------------------------------
973 95F2 A0 1E ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) )
974 95F4 NotFromAll
975 ; Y - the last offensive weapon to use + 1
976 95F4 BD F1 5A lda TanksWeaponsTableL,x
977 95F7 85 72 sta temp
978 95F9 BD F7 5A lda TanksWeaponsTableH,x
979 95FC 85 73 sta temp+1
980 95FE loop
981 95FE 88 dey
982 95FF B1 72 lda (temp),y
983 9601 F0 FB beq loop
984 9603 98 tya
985 9604 9D F7 43 sta ActiveWeapon,x
986 9607 60 rts
987 .endp
988 ;----------------------------------------------
989 9608 .proc GetDistance
990 ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y)
991 ; result in A
992 ;----------------------------------------------
993 9608 AC 31 44 ldy TargetTankNr
994 960B BD 1F 44 lda LowResDistances,x
995 960E D9 1F 44 cmp LowResDistances,y
996 9611 B0 08 @ bcs YisLower
997 9613 38 sec
998 9614 B9 1F 44 lda LowResDistances,y
999 9617 FD 1F 44 sbc LowResDistances,x
1000 961A 60 rts
1001 961B YisLower
1002 961B BD 1F 44 lda LowResDistances,x
1003 961E F9 1F 44 sbc LowResDistances,y
1004 9621 60 rts
1005 .endp
354 ;----------------------------------------------
355 9622 icl 'artwork/talk.asm'
Source: talk.asm
1 9622 .proc talk
2 ; Maximum text length is 63 characters!!!
3 9622 23 39 2B 21 00 22 + L0 dta d"CYKA BLAT"
4 962B 24 29 25 01 L1 dta d"DIE!"
5 962F 25 21 34 00 2D 39 + L2 dta d"EAT MY SHORTS!"
6 963D 39 2F 35 07 32 25 + L3 dta d"YOU'RE TOAST!"
7 964A 22 21 2E 3A 21 29 + L4 dta d"BANZAI!"
8 9651 26 32 2F 2D 00 28 + L5 dta d"FROM HELL'S HEART I STAB AT THEE..."
9 9674 29 00 24 29 24 2E + L6 dta d"I DIDN'T DO IT. NOBODY SAW ME DO IT."
10 9698 34 21 2B 25 00 21 + L7 dta d"TAKE A HIKE!"
11 96A4 39 2F 35 07 32 25 + L8 dta d"YOU'RE DEAD MEAT."
12 96B5 2D 21 2B 25 00 2D + L9 dta d"MAKE MY DAY."
13 96C1 23 28 21 32 27 25 + L10 dta d"CHARGE!"
14 96C8 21 34 34 21 23 2B + L11 dta d"ATTACK!"
15 96CF 39 2F 35 07 32 25 + L12 dta d"YOU'RE OUTTA HERE."
16 96E1 37 21 34 34 33 21 + L13 dta d"WATTSA MATTA YOU?"
17 96F2 26 32 25 25 3A 25 + L14 dta d"FREEZE, OR I'LL SHOOT!"
18 9708 28 21 00 28 21 00 + L15 dta d"HA HA HA."
19 9711 37 25 00 23 2F 2D + L16 dta d"WE COME IN PEACE - SHOOT TO KILL!"
20 9732 29 2E 00 39 2F 35 + L17 dta d"IN YOUR FACE!"
21 973F 24 29 25 00 23 2F + L18 dta d"DIE COMMIE PIG!"
22 974E 29 00 2C 2F 36 25 + L19 dta d"I LOVE THE SMELL OF NAPALM IN THE MORNING."
23 9778 36 29 23 34 2F 32 + L20 dta d"VICTORY!"
24 9780 33 28 2F 37 00 33 + L21 dta d"SHOW SOME RESPECT."
25 9792 2A 35 33 34 00 37 + L22 dta d"JUST WHO DO YOU THINK YOU ARE?"
26 97B0 2C 2F 2F 2B 00 2F + L23 dta d"LOOK OUT BELOW!"
27 97BF 2B 2E 2F 23 2B 0C + L24 dta d"KNOCK, KNOCK."
28 97CC 2C 2F 2F 2B 00 2F + L25 dta d"LOOK OVER THERE."
29 97DC 27 35 25 33 33 00 + L26 dta d"GUESS WHAT'S COMING FOR DINNER?"
30 97FB 2D 25 32 32 39 00 + L27 dta d"MERRY CHRISTMAS."
31 980B 2F 30 25 2E 00 37 + L28 dta d"OPEN WIDE!"
32 9815 28 25 32 25 00 27 + L29 dta d"HERE GOES NOTHING..."
33 9829 24 2F 2E 07 34 00 + L30 dta d"DON'T WORRY, IT ISN'T A LIVE ROUND."
34 984C 22 2C 2F 2F 24 0C + L31 dta d"BLOOD, PAIN, VIOLENCE!"
35 9862 34 21 2B 25 00 34 + L32 dta d"TAKE THIS, SISSY!"
36 9873 29 00 33 28 21 2C + L33 dta d"I SHALL FLATTEN YOU!"
37 9887 29 00 33 28 21 2C + L34 dta d"I SHALL SMASH YOUR UGLY TANK!"
38 98A4 29 00 37 2F 2E 24 + L35 dta d"I WONDER WHAT THIS BUTTON DOES?"
39 98C3 24 2F 2E 07 34 00 + L36 dta d"DON'T TAKE THIS PERSONALLY."
40 98DE 37 2F 35 2C 24 00 + L37 dta d"WOULD THIS MAKE YOU MAD?"
41 98F6 29 00 34 2F 2C 24 + L38 dta d"I TOLD YOU TO LEAVE MY SISTER ALONE!"
42 991A 29 00 23 2F 35 2C + L39 dta d"I COULD SPARE YOU, BUT WHY?"
43 9935 2D 39 00 22 2F 2D + L40 dta d"MY BOMB IS BIGGER THAN YOURS."
44 9952 24 2F 2E 07 34 00 + L41 dta d"DON'T FORGET ABOUT ME!"
45 9968 28 21 33 34 21 00 + L42 dta d"HASTA LA VISTA, BABY!"
46 997D 34 28 29 33 00 29 + L43 dta d"THIS IS YOUR BRAIN ON SCORCH."
47 999A 34 21 2B 25 00 34 + L44 dta d"TAKE THIS!"
48 99A4 34 28 29 33 00 33 + L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US."
49 99D4 24 29 25 0C 00 21 + L46 dta d"DIE, ALIEN SWINE!"
50 99E5 21 37 32 35 2B 01 + L47 dta d"AWRUK!!!"
51 99ED 29 00 33 28 21 2C + L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD."
52 9A13 24 29 25 0C 00 34 + L49 dta d"DIE, TANK-SCUM!"
53 9A22 29 07 2D 00 27 2F + L50 dta d"I'M GONNA BREAK YOUR FACE!"
54 9A3C 2D 21 2D 21 00 33 + L51 dta d"MAMA SAID KNOCK YOU OUT!"
55 9A54 29 00 28 2F 30 25 + L52 dta d"I HOPE YOU ENJOY PAIN!"
56 9A6A 28 2F 37 07 24 00 + L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son)
57 ;--------------------------------
58 9A8E 30 21 32 34 29 2E + L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!"
59 9AB2 35 27 28 01 L55 dta d"UGH!"
60 9AB6 21 21 32 27 28 01 L56 dta d"AARGH!"
61 9ABC 21 21 21 27 27 28 + L57 dta d"AAAGGHHH!"
62 9AC5 29 07 2D 00 2D 25 + L58 dta d"I'M MELTING!"
63 9AD1 2F 2F 26 0E 0E L59 dta d"OOF.."
64 9AD6 2F 28 01 L60 dta d"OH!"
65 9AD9 25 25 25 2B 01 L61 dta d"EEEK!"
66 9ADE 21 21 23 23 28 01 L62 dta d"AACCH!"
67 9AE4 29 00 28 21 34 25 + L63 dta d"I HATE IT WHEN THAT HAPPENS."
68 9B00 2F 2E 25 00 24 29 + L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY."
69 9B27 2F 28 00 2E 2F 01 L65 dta d"OH NO!"
70 9B2D 2E 2F 34 00 2D 25 + L66 dta d"NOT ME!"
71 9B34 2F 35 23 28 0E L67 dta d"OUCH."
72 9B39 2F 28 00 2E 2F 0C + L68 dta d"OH NO, NOT AGAIN."
73 9B4A 21 2E 2F 34 28 25 + L69 dta d"ANOTHER ONE BITES THE DUST."
74 9B65 27 2F 2F 24 22 39 + L70 dta d"GOODBYE."
75 9B6D 28 25 2C 30 00 2D + L71 dta d"HELP ME!"
76 9B75 26 21 32 25 37 25 + L72 dta d"FAREWELL, CRUEL WORLD."
77 9B8B 32 25 2D 25 2D 22 + L73 dta d"REMEMBER THE ALAMO!"
78 9B9E 2F 28 00 2D 21 2E + L74 dta d"OH MAN!"
79 9BA5 24 2F 2F 35 27 28 + L75 dta d"DOOUGH!"
80 9BAC 21 2E 2F 34 28 25 + L76 dta d"ANOTHER DAY, ANOTHER BOMB."
81 9BC6 34 28 29 33 00 29 + L77 dta d"THIS IS THE END, MY ONLY FRIEND."
82 9BE6 36 25 32 39 00 26 + L78 dta d"VERY FUNNY."
83 9BF1 34 28 25 00 26 21 + L79 dta d"THE FAT LADY SANG."
84 9C03 37 28 39 00 24 2F + L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?"
85 9C24 29 07 2D 00 27 2F + L81 dta d"I'M GOING DOWN."
86 9C33 29 07 36 25 00 27 + L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS."
87 9C55 23 32 21 30 2F 2C + L83 dta d"CRAPOLA."
88 9C5D 30 2F 37 01 L84 dta d"POW!"
89 9C61 22 29 26 01 L85 dta d"BIF!"
90 9C65 22 21 2D 01 L86 dta d"BAM!"
91 9C69 3A 2F 2E 2B 01 L87 dta d"ZONK!"
92 9C6E 29 00 33 28 2F 35 + L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..."
93 9C92 29 00 37 21 2C 2B + L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..."
94 9CBC 37 28 21 34 00 37 + L90 dta d"WHAT WAS THAT NOISE?"
95 9CD0 2D 21 2D 21 00 33 + L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS."
96 9CF4 29 34 33 00 2A 35 + L92 dta d"ITS JUST ONE OF THOSE DAYS..."
97 9D11 29 00 33 25 25 00 + L93 dta d"I SEE A BRIGHT LIGHT..."
98 9D28 2D 2F 2D 2D 39 1F + L94 dta d"MOMMY? IS THAT YOU?"
99 9D3B 29 00 2C 25 34 00 + L95 dta d"I LET YOU HIT ME!"
100 9D4C 33 35 23 2B 25 32 + L96 dta d"SUCKER SHOT!"
101 9D58 29 00 24 29 24 2E + L97 dta d"I DIDN'T WANT TO LIVE ANYWAY."
102 9D75 0D 1C 33 2F 22 1E + L98 dta d"-<SOB>-"
103 9D7C 37 21 33 00 34 28 + L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?"
104 9DA0 2A 2F 29 2E 00 34 + L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID."
105 9DC7 29 34 00 37 21 33 + L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!"
106 9DF0 29 00 24 29 24 2E + L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!"
107 9E0E 29 00 34 28 2F 35 + L103 dta d"I THOUGHT YOU LIKED ME?"
108 9E25 23 34 2F 00 38 39 + L104 dta d"CTO XYEB"
109 9E2D 29 00 34 28 29 2E + L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY."
110 9E4F 33 2F 2D 25 28 2F + L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE."
111 9E79 28 25 39 01 00 2B + L107 dta d"HEY! KILLIN' AIN'T COOL."
112 9E91 27 25 25 0E 0E 0E + L108 dta d"GEE... THANKS."
113 9E9F 29 07 36 25 00 26 + L109 dta d"I'VE FALLEN AND I CAN'T GET UP!"
114 9EBE 19 11 11 1F L110 dta d"911?"
115 9EC2 2F 28 00 2E 2F 01 + L111 dta d"OH NO! HERE I BLOW AGAIN!"
116 9EDB 29 07 2C 2C 00 22 + L112 dta d"I'LL BE BACK..."
117 9EEA 28 25 39 00 0D 00 + L113 dta d"HEY - I'VE GOT LAWYERS."
118 9F01 34 29 2D 25 00 34 + L114 dta d"TIME TO CALL 1-900-SUE-TANK."
119 9F1D 39 2F 35 00 22 29 + L115 dta d"YOU BIG DUMMY!" ;(sanford and son)
120 9F2B LEND
121 9F2B OffensiveTextTableL
122 9F2B 22 2B 2F 3D 4A 51 + dta <L0,<L1,<L2,<L3,<L4,<L5,<L6,<L7,<L8,<L9,<L10,<L11,<L12,<L13,<L14,<L15,<L16,<L17,<L18,<L19,<L20,<L21,<L22,<L23,<L24,<L25,<L26,<L27,<L28,<L29,<L30,<L31,<L32,<L33,<L34,<L35,<L36,<L37,<L38,<L39,<L40,<L41,<L42,<L43,<L44,<L45,<L46,<L47,<L48,<L49,<L50,<L51,<L52,<L53
123 9F61 8E B2 B6 BC C5 D1 + dta <L54,<L55,<L56,<L57,<L58,<L59,<L60,<L61,<L62,<L63,<L64,<L65,<L66,<L67,<L68,<L69,<L70,<L71,<L72,<L73,<L74,<L75,<L76,<L77,<L78,<L79,<L80,<L81,<L82,<L83,<L84,<L85,<L86,<L87,<L88,<L89,<L90,<L91,<L92,<L93,<L94,<L95,<L96,<L97,<L98,<L99,<L100,<L101,<L102,<L103,<L104,<L105,<L106,<L107,<L108,<L109,<L110,<L111,<L112,<L113,<L114,<L115
124 9F9F 2B dta <LEND
125 9FA0 OffensiveTextTableH
126 9FA0 96 96 96 96 96 96 + dta >L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53
127 9FD6 9A 9A 9A 9A 9A 9A + dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115
128 A014 9F dta >LEND
129 = 0036 NumberOfOffensiveTexts=54
130 = 003E NumberOfDeffensiveTexts=62
131 .endp
132 A015 2D 39 00 28 2F 36 + hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!"
133 A033 hoverFullEnd
134 A033 32 35 2E 2E 29 2E + hoverEmpty dta d"RUNNING OUT OF EELS"
135 A046 hoverEmptyEnd
356 ;----------------------------------------------
357 A046 TankFont
358 A046 00 00 00 00 00 00 + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only
359 ;----------------------------------------------
360 A1C6 font4x4
361 A1C6 FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62
362 ;-------------------------------------------------
363 A246 .proc CheckTankCheat
364 A246 A0 07 ldy #$07
365 A248 A5 6C lda TankNr
366 A24A 0A asl
367 A24B 0A asl
368 A24C 0A asl ; 8 chars per name
369 A24D AA tax
370 @
371 A24E B9 73 A2 lda CheatName,y
372 A251 38 sec
373 A252 FD 09 41 sbc tanksnames,x
374 A255 C9 27 cmp #$27
375 A257 D0 19 bne NoCheat
376 A259 E8 inx
377 A25A 88 dey
378 A25B 10 F1 bpl @-
379 A25D YesCheat
380 A25D A6 6C ldx TankNr
381 A25F BD F1 5A lda TanksWeaponsTableL,x
382 A262 85 72 sta temp
383 A264 BD F7 5A lda TanksWeaponsTableH,x
384 A267 85 73 sta temp+1
385 A269 A9 63 lda #99
386 A26B C8 @ iny
387 A26C 91 72 sta (temp),y
388 A26E C0 2F cpy #(number_of_weapons - 1)
389 A270 D0 F9 bne @-
390 A272 NoCheat
391 A272 60 rts
392 .endp
393 A273 CheatName
394 A273 27 27 27 37 37 3F + dta d" 008.T"+$27
395 ;----------------------------------------------
396 A27B .proc DLIinterruptBFG
397 A27B 48 pha
398 A27C A5 9A lda dliCounter
399 A27E D0 18 bne EndofBFGDLI
400 A280 AD BC A2 lda dliColorsFore
401 A283 2C 1B D4 bit random
402 A286 30 02 bmi @+
403 A288 A5 58 lda DliColorBack
404 A28A 85 02 @ sta COLPF2
405 A28C AD BC A2 lda dliColorsFore
406 A28F 2C 1B D4 bit random
407 A292 30 02 bmi @+
408 A294 A5 58 lda DliColorBack
409 A296 85 02 @ sta COLPF1
410 A298 EndofBFGDLI
411 A298 E6 9A inc dliCounter
412 A29A 68 pla
413 A29B 40 rti
414 .endp
415 ; ------------------------
416 A29C .proc BFGblink
417 ; SetDLI DLIinterruptBFG ; blinking on
418 A29C A0 32 ldy #50
419 A29E 20 9D 5A jsr PauseYFrames
420 ; SetDLI DLIinterruptGraph ; blinking off
421 A2A1 60 rts
422 .endp
423 ;----------------------------------------------
424 A2A2 icl 'constants_top.asm'
Source: constants_top.asm
1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm
2
3 .IF *>0 ;this is a trick that prevents compiling this file alone
4
5 ;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
6 A2A2 04 03 01 05 00 02 TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3
7 A2A8 dliColorsBack
8 A2A8 02 00 02 00 02 00 + :10 .by $02,$00
9 A2BC dliColorsFore
10 A2BC 0A .by $0a ; one mountains color
11 ; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array
12 ; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05
13 A2BD 0E 0C 0C 0C 0C 0A + .by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new
14 A2C7 08 08 08 06 06 06 + .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04
15 A2D1 CashOptionL ;(one zero less than on the screen)
16 A2D1 00 C8 20 B0 D0 .by 0,<200,<800,<1200,<2000
17 A2D6 CashOptionH
18 A2D6 00 00 03 04 07 .by 0,>200,>800,>1200,>2000
19 A2DB 0A 14 19 1E 28 GravityTable .by 10,20,25,30,40
20 A2E0 05 14 28 46 63 MaxWindTable .by 5,20,40,70,99
21 A2E5 0A 14 1E 28 32 RoundsTable .by 10,20,30,40,50
22 A2EA 77 01 D6 01 76 02 + AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity
23 A2F4 FF 96 4B 23 01 flyDelayTable .by 255,150,75,35,1
24 A2F9 FF 2D 19 0F 09 seppukuTable .by 255, 45,25,15,9
25 .endif
425 ;----------------------------------------------
426 A2FE NMI
427 A2FE EE 20 D0 INC $D020 ; change border colour, indication for a NMI
428 A301 40 RTI ; exit interrupt
429 ; (not acknowledged!)
430