mirror of
https://github.com/pkali/scorch_src.git
synced 2026-05-20 22:34:21 +02:00
11713 lines
452 KiB
Plaintext
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
|