diff --git a/scorch.asm b/scorch.asm index 9db07ab..84c2c09 100644 --- a/scorch.asm +++ b/scorch.asm @@ -556,6 +556,25 @@ MakeDarkScreen rts .endp +;-------------------------------------------------- +.proc ShellDelay + lda CONSOL + and #%00000101 ; Start + Option + bne @+ + mva #$40 escFlag +@ and #%00000001 + beq noShellDelay + ldx flyDelay +DelayLoop + lda VCOUNT +@ cmp VCOUNT + beq @- + dex + bne DelayLoop +noShellDelay + rts +.endp + ;-------------------------------------------------- .proc RmtSongSelect ; starting song line 0-255 to A reg diff --git a/scorch.bin b/scorch.bin index e528f21..32b25cb 100644 Binary files a/scorch.bin and b/scorch.bin differ diff --git a/scorch.xex b/scorch.xex index dfb3126..6f34af4 100644 Binary files a/scorch.xex and b/scorch.xex differ diff --git a/scorchC64.asm b/scorchC64.asm index 9eed48d..71c6606 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -317,6 +317,18 @@ MakeDarkScreen rts .endp +;-------------------------------------------------- +.proc ShellDelay + ldx flyDelay +DelayLoop + lda $d012 +@ cmp $d012 + beq @- + dex + bne DelayLoop +noShellDelay + rts +.endp ;-------------------------------------------------- .proc RmtSongSelect ; starting song line 0-255 to A reg diff --git a/scorchC64.lst b/scorchC64.lst new file mode 100644 index 0000000..f581145 --- /dev/null +++ b/scorchC64.lst @@ -0,0 +1,11712 @@ +mads 2.1.5 build 3 (21 Feb 22) +Source: scorchC64.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 ;C64 8-bit Scorched Earth source code + 3 ;--------------------------------------------------- + 4 ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski + 5 ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 + 6 ;Miami & Warsaw 2022, 2023 + 7 + 8 ;--------------------------------------------------- + 9 = 0040 .def TARGET = 64 ; :) + 10 ;--------------------------------------------------- + 11 = 0000 .def XCORRECTION_FOR_PM = 0 + 12 ; if 1 - active x position of tanks correction fo PMG + 13 = 0000 .def FASTER_GRAF_PROCS = 0 + 14 ; if 1 - activates faster graphics routines + 15 ; (direct writes to screen memory - atari only :) ) + 16 ;--------------------------------------------------- + 17 + 18 + 19 opt h-f+ + 20 org $801 + 21 0801 01 08 org [a($801)],$801 + 22 0801 basic_start(FirstSTART) +Macro: BASIC_START [Source: MACRO.ASM] + 2 0801 0C 08 .word upstartEnd // link address + 3 0803 0A 00 .word 10 // line num + 4 0805 9E .byte $9e // sys + 6 = 0000 ?a=0 + 7 = 0000 ?b=0 + 8 = 0000 ?c=0 + 9 = 0000 ?d=0 + 10 = 0000 ?e=0 + 12 = 536A ?v = (FIRSTSTART) + 15 = 0002 ?a=?v/10000 + 16 = 054A ?v=?v-(?a*10000) + 20 = 0001 ?b=?v/1000 + 21 = 0162 ?v=?v-(?b*1000) + 25 = 0003 ?c=?v/100 + 26 = 0036 ?v=?v-(?c*100) + 30 = 0005 ?d=?v/10 + 31 = 0004 ?v=?v-(?d*10) + 34 = 0004 ?e=?v%10 + 36 0806 32 31 33 35 34 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 + 38 080B 00 .byte 0 + 39 080C upstartEnd + 40 080C 00 00 .word 0 // empty link signals the end of the program +Source: scorchC64.asm + 23 + 24 + 25 ;--------------------------------------------------- + 26 .macro build + 27 dta d"1.28" ; number of this build (4 bytes) + 28 .endm + 29 + 30 .macro RMTSong + 31 lda #:1 ; do nothing in C64 + 32 .endm + 33 + 34 ;--------------------------------------------------- + 35 080E icl 'definitions.asm' +Source: definitions.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 = 00C8 screenheight = 200 + 4 = 0028 screenBytes = 40 + 5 = 0140 screenwidth = screenBytes*8 ; Max screenwidth = 512!!! + 6 + 7 = 0008 TankWidth = 8 + 8 ;---------------------------------------------- + 9 ; Player/missile memory + 10 = 1800 PMGraph = $1800 ; real PM start = PMGraph + $0300 + 11 ; Generated tables + 12 = 2010 display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) + 13 ;---------------------------------------------- + 14 + 15 = 0028 margin = 40 ;mountain drawing Y variable margin + 16 = 0006 MaxPlayers = 6 + 17 = 0009 maxOptions = 9 ;number of all options + 18 = 002C PMOffsetX = $2C ; P/M to graphics offset + 19 = 002A PMOffsetY = $2A ; P/M to graphics offset + 20 = 000A napalmRadius = 10 + 21 = 0006 StandardBarrel = 6 ; standard tank barrel length + 22 = 0014 LongBarrel = 20 ; long barrel length + 23 + 24 = 0002 TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor + 25 = 000A TextForegroundColor = $0A + 26 = 0000 space = 0 ; space in screencodes + 27 + 28 = 000A KeyRepeatSpeed = 10 ; (max 127 !!!) + 29 + 30 ;character codes for symbols (tank, parachute, etc. ) + 31 = 0002 char_parachute_______ = $02 + 32 = 001E char_flag____________ = $1e + 33 = 0014 char_flame___________ = $14 + 34 = 001C char_clear_flame_____ = $1c + 35 = 0004 char_digger__________ = $04 + 36 = 000C char_sandhog_________ = $0c + 37 = 0008 char_sandhog_offset = char_sandhog_________ - char_digger__________ + 38 = 0020 char_tank1___________ = $20 + 39 = 0024 char_tank2___________ = $24 + 40 = 002C char_tank3___________ = $2c + 41 = 0028 char_tank4___________ = $28 ; robotank shape + 42 + 43 ;Weapon prices (*10 on screen) + 44 = 0000 price_Baby_Missile___ = 0 ;_00 + 45 = 0060 price_Missile________ = 96 ;_01 + 46 = 006F price_Baby_Nuke______ = 111 ;_02 + 47 = 0090 price_Nuke___________ = 144 ;_03 + 48 = 00C0 price_LeapFrog_______ = 192 ;_04 + 49 = 0125 price_Funky_Bomb_____ = 293 ;_05 + 50 = 01C8 price_MIRV___________ = 456 ;_06 + 51 = 0151 price_Death_s_Head___ = 337 ;_07 + 52 = 007D price_Napalm_________ = 125 ;_08 + 53 = 00A2 price_Hot_Napalm_____ = 162 ;_09 + 54 = 0066 price_Tracer_________ = 102 ;_10 + 55 = 0123 price_Smoke_Tracer___ = 291 ;_11 + 56 = 00D3 price_Baby_Roller____ = 211 ;_12 + 57 = 00F4 price_Roller_________ = 244 ;_13 + 58 = 0146 price_Heavy_Roller___ = 326 ;_14 + 59 = 00E6 price_Riot_Charge____ = 230 ;_15 + 60 = 00F1 price_Riot_Blast_____ = 241 ;_16 + 61 = 0103 price_Riot_Bomb______ = 259 ;_17 + 62 = 0110 price_Heavy_Riot_Bomb = 272 ;_18 + 63 = 0088 price_Baby_Digger____ = 136 ;_19 + 64 = 00B0 price_Digger_________ = 176 ;_20 + 65 = 00CF price_Heavy_Digger___ = 207 ;_21 + 66 = 009E price_Baby_Sandhog___ = 158 ;_22 + 67 = 00BF price_Sandhog________ = 191 ;_23 + 68 = 00DF price_Heavy_Sandhog__ = 223 ;_24 + 69 = 0068 price_Dirt_Clod______ = 104 ;_25 + 70 = 0082 price_Dirt_Ball______ = 130 ;_26 + 71 = 00AB price_Ton_of_Dirt____ = 171 ;_27 + 72 = 014A price_Liquid_Dirt____ = 330 ;_28 + 73 = 0157 price_Dirt_Charge____ = 343 ;_29 + 74 = 00AA price_Buy_me_________ = 170 ;_30 + 75 = 0115 price_Laser__________ = 277 ;_31 + 76 = 0000 price_White_Flag_____ = $0 ;_32 + 77 = 012C price_Battery________ = 300 ;_33 + 78 = 0160 price_Hovercraft_____ = 352 ;_34 + 79 = 00EA price_Parachute______ = 234 ;_35 + 80 = 03E8 price_StrongParachute = 1000 ;_36 + 81 = 02E9 price_Mag_Deflector__ = 745 ;_37 + 82 = 00E0 price_Shield_________ = 224 ;_38 + 83 = 0274 price_Heavy_Shield___ = 628 ;_39 + 84 = 044C price_Force_Shield___ = 1100 ;_40 + 85 = 0200 price_Bouncy_Castle__ = 512 ;_41 + 86 = 0834 price_Long_Barrel____ = 2100 ;_42 + 87 = 03E8 price_Nuclear_Winter_ = 1000 ;_43 + 88 = 01F4 price_Lazy_Boy_______ = 500 ;_44 + 89 = 02DA price_Lazy_Darwin____ = 730 ;_45 + 90 = 00FA price_Auto_Defense___ = 250 ;_46 + 91 = 0053 price_Spy_Hard_______ = 83 ;_47 + 92 ;Weapon indexes (numbers) + 93 = 0000 ind_Baby_Missile___ = 0 + 94 = 0000 first_offensive____ = ind_Baby_Missile___ + 95 = 0001 ind_Missile________ = 1 + 96 = 0002 ind_Baby_Nuke______ = 2 + 97 = 0003 ind_Nuke___________ = 3 + 98 = 0004 ind_LeapFrog_______ = 4 + 99 = 0005 ind_Funky_Bomb_____ = 5 + 100 = 0006 ind_MIRV___________ = 6 + 101 = 0007 ind_Death_s_Head___ = 7 + 102 = 0008 ind_Napalm_________ = 8 + 103 = 0009 ind_Hot_Napalm_____ = 9 + 104 = 000A ind_Tracer_________ = 10 + 105 = 000B ind_Smoke_Tracer___ = 11 + 106 = 000C ind_Baby_Roller____ = 12 + 107 = 000D ind_Roller_________ = 13 + 108 = 000E ind_Heavy_Roller___ = 14 + 109 = 000F ind_Riot_Charge____ = 15 + 110 = 0010 ind_Riot_Blast_____ = 16 + 111 = 0011 ind_Riot_Bomb______ = 17 + 112 = 0012 ind_Heavy_Riot_Bomb = 18 + 113 = 0013 ind_Baby_Digger____ = 19 + 114 = 0014 ind_Digger_________ = 20 + 115 = 0015 ind_Heavy_Digger___ = 21 + 116 = 0016 ind_Baby_Sandhog___ = 22 + 117 = 0017 ind_Sandhog________ = 23 + 118 = 0018 ind_Heavy_Sandhog__ = 24 + 119 = 0019 ind_Dirt_Clod______ = 25 + 120 = 001A ind_Dirt_Ball______ = 26 + 121 = 001B ind_Ton_of_Dirt____ = 27 + 122 = 001C ind_Liquid_Dirt____ = 28 + 123 = 001D ind_Dirt_Charge____ = 29 + 124 = 001E ind_Buy_me_________ = 30 + 125 = 001F ind_Laser__________ = 31 + 126 = 001F last_offensive_____ = ind_Laser__________ + 127 = 0020 ind_White_Flag_____ = 32 + 128 = 0020 first_defensive____ = ind_White_Flag_____ + 129 = 0021 ind_Battery________ = 33 + 130 = 0022 ind_Hovercraft_____ = 34 + 131 = 0023 ind_Parachute______ = 35 + 132 = 0024 ind_StrongParachute = 36 + 133 = 0025 ind_Mag_Deflector__ = 37 + 134 = 0026 ind_Shield_________ = 38 + 135 = 0027 ind_Heavy_Shield___ = 39 + 136 = 0028 ind_Force_Shield___ = 40 + 137 = 0029 ind_Bouncy_Castle__ = 41 + 138 = 002A ind_Long_Barrel____ = 42 + 139 = 002B ind_Nuclear_Winter_ = 43 + 140 = 002C ind_Lazy_Boy_______ = 44 + 141 = 002D ind_Lazy_Darwin____ = 45 + 142 = 002E ind_Auto_Defense___ = 46 + 143 = 002F ind_Spy_Hard_______ = 47 + 144 = 002F last_defensive_____ = ind_Spy_Hard_______ + 145 = 0029 last_real_defensive = ind_Bouncy_Castle__ + 146 = 0020 number_of_offensives = last_offensive_____ - first_offensive____+1 + 147 = 0010 number_of_defensives = (last_defensive_____ - first_defensive____+1) + 148 = 0030 number_of_weapons = number_of_offensives + number_of_defensives + 149 ;-------------------------------- + 150 ; names of RMT instruments (sfx) + 151 ;-------------------------------- + 152 = 0000 sfx_set_power_1 = $00 ;A + 153 = 0001 sfx_set_power_2 = $01 ;b + 154 = 0002 sfx_lightning = $02 ;c + 155 = 0003 sfx_dunno = $03 ;d + 156 = 0004 sfx_nuke = $04 ;e + 157 = 0005 sfx_baby_missile= $05 ;f + 158 = 0006 sfx_death_begin = $06 ;g + 159 = 0007 sfx_plasma_1_2 = $07 ;h + 160 = 0008 sfx_plasma_2_2 = $08 ;i + 161 = 0009 sfx_napalm = $09 ;j + 162 = 000A sfx_dirt_charge = $0a ;k + 163 = 000B sfx_missile_hit = $0b ;l + 164 = 000C sfx_funky_hit = $0c ;m + 165 = 000D sfx_shield_on = $0d ;n + 166 = 000E sfx_shield_off = $0e ;o + 167 = 000F sfx_parachute = $0f ;p + 168 = 0010 sfx_smoke_cloud = $10 ;q + 169 = 0011 sfx_riot_blast = $11 ;r + 170 = 0012 sfx_sandhog = $12 ;s + 171 = 0013 sfx_dirt_chrg_s = $13 ;t + 172 = 0014 sfx_digger = $14 ;u + 173 = 0015 sfx_silencer = $15 ;v + 174 = 0016 sfx_next_player = $16 ;w + 175 = 0017 sfx_purchase = $17 ;x + 176 = 0018 sfx_keyclick = $18 ;y + 177 = 0019 sfx_shoot = $19 ;z + 178 = 001A sfx_seppuku = $1a ;1 + 179 = 001B sfx_liquid_dirt = $1b ;2 + 180 = 001C sfx_battery = $1c ;3 + 181 = 001D sfx_white_flag = $1d ;4 + 182 = 001E sfx_long_barrel = $1e + 183 = 001F sfx_tank_move = $1f + 184 = 002B sfx_auto_defense= $2b + 185 = 002C sfx_lazy_boys = $2c + 186 ;-------------------------------- + 187 ; RMT songs (lines) + 188 ;-------------------------------- + 189 = 0000 song_silencio = $00 + 190 = 0002 song_main_menu = $02 + 191 = 0006 song_ingame = $06 + 192 = 000B song_round_over = $0b + 193 = 000E song_ending_looped = $0e + 194 = 001B song_supermarket = $1b + 195 = 001D song_inventory = $1d + 36 ;--------------------------------------------------- + 37 + 38 = 0058 FirstZpageVariable = $58 ; $57 + 39 080E .zpvar DliColorBack .byte = FirstZpageVariable + 40 080E .zpvar GradientNr .byte + 41 080E .zpvar GradientColors .word + 42 080E .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) + 43 080E .zpvar JoystickNumber .byte + 44 080E .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing + 45 080E .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory + 46 080E .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) + 47 080E .zpvar xdraw .word ;= $64 ;variable X for plot + 48 080E .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + 49 080E .zpvar xbyte .word + 50 080E .zpvar ybyte .word + 51 080E .zpvar CharCode .byte + 52 080E .zpvar fontind .word + 53 080E .zpvar tanknr .byte + 54 080E .zpvar TankSequencePointer .byte + 55 080E .zpvar oldplot .word + 56 080E .zpvar xc .word + 57 080E .zpvar temp .word ;temporary word for the most embeded loops only + 58 080E .zpvar temp2 .word ;same as above + 59 080E .zpvar modify .word ;origially used to replace self-modyfying code + 60 080E .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) + 61 080E .zpvar xtempDRAW .word ;same as above for XDRAW routine + 62 080E .zpvar ytempDRAW .word ;same as above for XDRAW routine + 63 080E .zpvar tempor2 .word + 64 080E .zpvar CreditsVScrol .byte + 65 ;--------------temps used in circle routine + 66 080E .zpvar xi .word ;X (word) in draw routine + 67 080E .zpvar fx .byte + 68 080E .zpvar yi .word ;Y (word) in draw routine + 69 080E .zpvar fy .byte + 70 080E .zpvar xk .word + 71 080E .zpvar fs .byte + 72 080E .zpvar yc .byte ;ycircle - temporary for circle + 73 080E .zpvar dx .word + 74 080E .zpvar dy .word + 75 080E .zpvar dd .word + 76 080E .zpvar di .word + 77 080E .zpvar dp .word + 78 ;---------------------------- + 79 080E .zpvar UnderTank1 .byte + 80 080E .zpvar UnderTank2 .byte + 81 ;---------------------------- + 82 080E .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) + 83 080E .zpvar weaponPointer .word + 84 080E .zpvar dliCounter .byte + 85 080E .zpvar pressTimer .byte + 86 080E .zpvar NTSCcounter .byte + 87 080E .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling + 88 080E .zpvar sfx_effect .byte + 89 080E .zpvar RMT_blocked .byte + 90 080E .zpvar ScrollFlag .byte + 91 080E .zpvar SkStatSimulator .byte + 92 080E .zpvar FloatingAlt .byte ; floating tank altitude + 93 080E .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen + 94 + 95 ; --------------OPTIMIZATION VARIABLES-------------- + 96 080E .zpvar Force .word + 97 080E .zpvar Force_ .byte ; Force is 3 bytes long + 98 080E .zpvar Angle .byte + 99 080E .zpvar Parachute .byte ; are you insured with parachute? + 100 080E .zpvar color .byte + 101 080E .zpvar Erase .byte ; if 1 only mask of the character is printed + 102 ; on the graphics screen. if 0 character is printed normally + 103 080E .zpvar radius .byte + 104 080E .zpvar decimal .word + 105 080E .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) + 106 080E .zpvar Counter .byte ;temporary Counter for outside loops + 107 080E .zpvar ExplosionRadius .byte + 108 080E .zpvar FunkyBombCounter .byte + 109 080E .zpvar ResultY .byte + 110 080E .zpvar xcircle .word + 111 080E .zpvar ycircle .word + 112 080E .zpvar vy .word + 113 080E .zpvar vy_ .word ; 4 bytes + 114 080E .zpvar vx .word + 115 080E .zpvar vx_ .word ; 4 bytes + 116 080E .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank + 117 080E .zpvar PositionOnTheList .byte ; pointer position on the list being displayed + 118 080E .zpvar XHit .word + 119 080E .zpvar delta .word + 120 080E .zpvar HowMuchToFall .byte + 121 080E .zpvar magic .word + 122 080E .zpvar xtraj .word + 123 080E .zpvar xtraj_ .byte ; 3 bytes + 124 080E .zpvar ytraj .word + 125 080E .zpvar ytraj_ .byte ; 3 bytes + 126 080E .zpvar Wind .word + 127 080E .zpvar Wind_ .word ; 4 bytes + 128 080E .zpvar RangeLeft .word + 129 080E .zpvar RangeRight .word + 130 080E .zpvar NewAngle .byte + 131 080E .zpvar escFlag .byte + 132 080E .zpvar LineYdraw .byte + 133 080E .zpvar LineXdraw .word + 134 080E .zpvar plot4x4color .byte ; $00 / $ff + 135 080E .zpvar Multiplier .word + 136 080E .zpvar Multiplier_ .byte ; 3 bytes + 137 080E .zpvar HowToDraw .byte + 138 080E .zpvar gravity .byte + 139 080E .zpvar LineLength .word + 140 080E .zpvar tracerflag .byte + 141 080E .zpvar isInventory .byte + 142 080E .zpvar DifficultyLevel .byte + 143 080E .zpvar goleft .byte + 144 080E .zpvar OffsetDL1 .byte + 145 080E .zpvar L1 .byte + 146 = 00B1 HotNapalmFlag = FunkyBombCounter ; reuse variable! + 147 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 + 148 + 149 = 0076 displayposition = modify + 150 = 00B3 LineAddress4x4 = xcircle + 151 + 152 ;----------------------------------------------- + 153 ; libraries + 154 ;----------------------------------------------- + 155 080E icl 'C64/lib/C64_ATARISYS.ASM' +Source: C64_ATARISYS.ASM + 1 ;**************************************************************************** + 2 ;* ATARI PERSONAL COMPUTER * + 3 ;* SYSTEM EQUATES * + 4 ;**************************************************************************** + 5 + 6 = 0002 FAKEADDR EQU $0002 + 7 + 8 = 0002 ATRACT EQU FAKEADDR + 9 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK + 10 ; + 11 ; PAGE TWO RAM ASSIGNMENTS + 12 ; + 13 = 0002 VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR + 14 = 0002 VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR + 15 = 0002 VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR + 16 = 0002 VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR + 17 = 0002 VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR + 18 = 0002 VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ + 19 = 0002 VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY + 20 = 0002 VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE + 21 = 0002 VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ + 22 = 0002 VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ + 23 = 0002 VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ + 24 = 0002 VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR + 25 = 0002 CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1 + 26 = 0002 CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2 + 27 = 0002 CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3 + 28 = 0002 CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4 + 29 = 0002 CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5 + 30 = 0002 VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR + 31 = 0002 VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR + 32 = 0002 CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS + 33 = 0002 CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS + 34 = 0002 CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG + 35 = 0002 SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR + 36 = 0002 CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG + 37 = 0002 INTEMP EQU FAKEADDR ;IAN'S TEMP + 38 = 0002 CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG + 39 = 0002 DMACTLS EQU FAKEADDR ;SAVE DMACTL REG + 40 = 0002 DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO + 41 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI + 42 = 0002 SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM + 43 = 0002 LCOUNT EQU FAKEADDR ;LOADER TEMP + 44 = 0002 LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL + 45 = 0002 LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL + 46 = 0002 BRKKY EQU FAKEADDR ;BREAK KEY VECTOR + 47 = 0002 RELADR EQU FAKEADDR ;LOADER REL ADDR + 48 = 0002 CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV + 49 = 0002 CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND + 50 = 0002 CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1 + 51 = 0002 CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2 + 52 ;TEMP EQU $023E ;TEMPORARY RAM CELL + 53 = 0002 ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG + 54 = 0002 DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1) + 55 = 0002 DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS + 56 = 0002 BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS + 57 = 0002 COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS + 58 = 0002 RECLEN EQU FAKEADDR ;LOADER LENGTH + 59 = 0002 DSKTIM EQU FAKEADDR ;DISK TIME OUT REG + 60 = 0002 VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP + 61 = 0002 KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG + 62 = 0002 FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200) + 63 = 0002 GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY + 64 = 0002 PADDL0 EQU FAKEADDR ;POT 0 RAM CELL + 65 = 0002 PADDL1 EQU FAKEADDR + 66 = 0002 PADDL2 EQU FAKEADDR + 67 = 0002 PADDL3 EQU FAKEADDR + 68 = 0002 STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL + 69 = 0002 STICK1 EQU FAKEADDR + 70 = 0002 PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0 + 71 = 0002 PTRIG1 EQU FAKEADDR + 72 = 0002 PTRIG2 EQU FAKEADDR + 73 = 0002 PTRIG3 EQU FAKEADDR + 74 = 0002 STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0 + 75 = 0002 STRIG1 EQU FAKEADDR + 76 = 0002 HIBYTE EQU FAKEADDR ;LOADER + 77 = 0002 WMODE EQU FAKEADDR ;CASSETTE R/W MODE + 78 = 0002 BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE + 79 = 0002 IMASK EQU FAKEADDR + 80 = 0002 JVECK EQU FAKEADDR ;JUMP VECTOR + 81 = 0002 NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS + 82 = 0002 TXTROW EQU FAKEADDR ;TEXT ROWCRS + 83 = 0002 TXTCOL EQU FAKEADDR ;TEXT COLCRS + 84 = 0002 TINDEX EQU FAKEADDR ;TEXT INDEX + 85 = 0002 TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD + 86 = 0002 TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL + 87 = 0002 CRETRY EQU FAKEADDR ;# COMMAND RETRIES + 88 = 0002 HOLD3 EQU FAKEADDR + 89 = 0002 SUBTMP EQU FAKEADDR + 90 = 0002 HOLD2 EQU FAKEADDR + 91 = 0002 DMASK EQU FAKEADDR ;PIXEL LOCATION MASK + 92 = 0002 TMPLBT EQU FAKEADDR + 93 = 0002 ESCFLG EQU FAKEADDR ;ESCAPE FLAG + 94 = 0002 TABMAP EQU FAKEADDR ;TAB STOP MAP + 95 = 0002 LOGMAP EQU FAKEADDR ;LINE START BIT MAP + 96 = 0002 INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG + 97 = 0002 FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW + 98 = 0002 TMPROW EQU FAKEADDR + 99 = 0002 TMPCOL EQU FAKEADDR + 100 = 0002 SCRFLG EQU FAKEADDR ;SET IF SCROLLING + 101 = 0002 HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW + 102 = 0002 DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES + 103 = 0002 SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG + 104 = 0002 BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN + 105 = 0002 PCOLR0 EQU FAKEADDR ;P0 COLOR + 106 = 0002 PCOLR1 EQU FAKEADDR ;P1 COLOR + 107 = 0002 PCOLR2 EQU FAKEADDR ;P2 COLOR + 108 = 0002 PCOLR3 EQU FAKEADDR ;P3 COLOR + 109 = 0002 COLOR0 EQU FAKEADDR ;COLOR 0 + 110 = 0002 COLOR1 EQU FAKEADDR + 111 = 0002 COLOR2 EQU FAKEADDR + 112 = 0002 COLOR3 EQU FAKEADDR + 113 = 0002 COLOR4 EQU FAKEADDR + 114 = 0002 COLBAKS EQU COLOR4 + 115 = 0002 CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM + 116 ; + 117 ; COLLEEN MNEMONICS + 118 ; + 119 ; --------------------------------------------------------------------------- + 120 = 0002 POKEY EQU FAKEADDR + 121 ; --------------------------------------------------------------------------- + 122 ; + 123 ; READ + 124 ; + 125 = 0002 POT0 EQU POKEY+$00 + 126 = 0002 POT1 EQU POKEY+$00 + 127 = 0002 POT2 EQU POKEY+$00 + 128 = 0002 POT3 EQU POKEY+$00 + 129 = 0002 POT4 EQU POKEY+$00 + 130 = 0002 POT5 EQU POKEY+$00 + 131 = 0002 POT6 EQU POKEY+$00 + 132 = 0002 POT7 EQU POKEY+$00 + 133 = 0002 ALLPOT EQU POKEY+$00 + 134 = 0002 KBCODE EQU POKEY+$00 + 135 ; !!!!! + 136 ;RANDOM EQU POKEY+$00 + 137 ; + 138 = 0002 POTGO EQU POKEY+$00 + 139 = 0002 SERIN EQU POKEY+$00 + 140 = 0002 IRQST EQU POKEY+$00 + 141 = 0002 SKSTAT EQU POKEY+$00 + 142 ; + 143 ; WRITE + 144 ; + 145 = 0002 AUDF1 EQU POKEY+$00 + 146 = 0002 AUDC1 EQU POKEY+$00 + 147 = 0002 AUDF2 EQU POKEY+$00 + 148 = 0002 AUDC2 EQU POKEY+$00 + 149 = 0002 AUDF3 EQU POKEY+$00 + 150 = 0002 AUDC3 EQU POKEY+$00 + 151 = 0002 AUDF4 EQU POKEY+$00 + 152 = 0002 AUDC4 EQU POKEY+$00 + 153 = 0002 AUDCTL EQU POKEY+$00 + 154 = 0002 STIMER EQU POKEY+$00 + 155 = 0002 SKRES EQU POKEY+$00 + 156 = 0002 SEROUT EQU POKEY+$00 + 157 = 0002 IRQEN EQU POKEY+$00 + 158 = 0002 SKCTL EQU POKEY+$00 + 159 ; + 160 ; + 161 ; + 162 ; --------------------------------------------------------------------------- + 163 = 0002 GTIA EQU FAKEADDR + 164 ; --------------------------------------------------------------------------- + 165 ; + 166 ; WRITE + 167 ; + 168 = 0002 HPOSP0 EQU GTIA+$00 + 169 = 0002 HPOSP1 EQU GTIA+$00 + 170 = 0002 HPOSP2 EQU GTIA+$00 + 171 = 0002 HPOSP3 EQU GTIA+$00 + 172 = 0002 HPOSM0 EQU GTIA+$00 + 173 = 0002 HPOSM1 EQU GTIA+$00 + 174 = 0002 HPOSM2 EQU GTIA+$00 + 175 = 0002 HPOSM3 EQU GTIA+$00 + 176 = 0002 SIZEP0 EQU GTIA+$00 + 177 = 0002 SIZEP1 EQU GTIA+$00 + 178 = 0002 SIZEP2 EQU GTIA+$00 + 179 = 0002 SIZEP3 EQU GTIA+$00 + 180 = 0002 SIZEM EQU GTIA+$00 + 181 = 0002 GRAFP0 EQU GTIA+$00 + 182 = 0002 GRAFP1 EQU GTIA+$00 + 183 = 0002 GRAFP2 EQU GTIA+$00 + 184 = 0002 GRAFP3 EQU GTIA+$00 + 185 = 0002 GRAFM EQU GTIA+$00 + 186 = 0002 COLPM0 EQU GTIA+$00 + 187 = 0002 COLPM1 EQU GTIA+$00 + 188 = 0002 COLPM2 EQU GTIA+$00 + 189 = 0002 COLPM3 EQU GTIA+$00 + 190 = 0002 COLPF0 EQU GTIA+$00 + 191 = 0002 COLPF1 EQU GTIA+$00 + 192 = 0002 COLPF2 EQU GTIA+$00 + 193 = 0002 COLPF3 EQU GTIA+$00 + 194 = 0002 COLBAK EQU GTIA+$00 + 195 = 0002 PRIOR EQU GTIA+$00 + 196 = 0002 VDELAY EQU GTIA+$00 + 197 = 0002 GRACTL EQU GTIA+$00 + 198 = 0002 HITCLR EQU GTIA+$00 + 199 = 0002 CONSOL EQU GTIA+$00 + 200 ; + 201 ; READ + 202 ; + 203 = 0002 M0PF EQU GTIA+$00 + 204 = 0002 M1PF EQU GTIA+$00 + 205 = 0002 M2PF EQU GTIA+$00 + 206 = 0002 M3PF EQU GTIA+$00 + 207 = 0002 P0PF EQU GTIA+$00 + 208 = 0002 P1PF EQU GTIA+$00 + 209 = 0002 P2PF EQU GTIA+$00 + 210 = 0002 P3PF EQU GTIA+$00 + 211 = 0002 M0PL EQU GTIA+$00 + 212 = 0002 M1PL EQU GTIA+$00 + 213 = 0002 M2PL EQU GTIA+$00 + 214 = 0002 M3PL EQU GTIA+$00 + 215 = 0002 P0PL EQU GTIA+$00 + 216 = 0002 P1PL EQU GTIA+$00 + 217 = 0002 P2PL EQU GTIA+$00 + 218 = 0002 P3PL EQU GTIA+$00 + 219 = 0002 TRIG0 EQU GTIA+$00 + 220 = 0002 TRIG1 EQU GTIA+$00 + 221 = 0002 TRIG2 EQU GTIA+$00 + 222 = 0002 TRIG3 EQU GTIA+$00 + 223 = 0002 PAL EQU GTIA+$00 + 224 ; + 225 ; + 226 ; --------------------------------------------------------------------------- + 227 = 0002 ANTIC EQU FAKEADDR + 228 ; --------------------------------------------------------------------------- + 229 ; + 230 = 0002 DMACTL EQU ANTIC+$00 + 231 = 0002 CHACTL EQU ANTIC+$00 + 232 = 0002 DLPTR EQU ANTIC+$00 + 233 ;DLISTH EQU ANTIC+$00 + 234 = 0002 HSCROL EQU ANTIC+$00 + 235 = 0002 VSCROL EQU ANTIC+$00 + 236 = 0002 PMBASE EQU ANTIC+$00 + 237 = 0002 CHBASE EQU ANTIC+$00 + 238 = 0002 WSYNC EQU ANTIC+$00 + 239 ; !!!! + 240 = 0002 VCOUNT EQU ANTIC+$00 + 241 ; ---- + 242 = 0002 PENH EQU ANTIC+$00 + 243 = 0002 PENV EQU ANTIC+$00 + 244 = 0002 NMIEN EQU ANTIC+$00 + 245 = 0002 NMIRES EQU ANTIC+$00 + 246 = 0002 NMIST EQU ANTIC+$00 + 247 ; + 248 ; + 249 ; --------------------------------------------------------------------------- + 250 = 0002 PIA EQU FAKEADDR + 251 ; --------------------------------------------------------------------------- + 252 ; + 253 = 0002 PORTA EQU PIA+0 + 254 = 0002 PORTB EQU PIA+0 + 255 = 0002 PACTL EQU PIA+0 + 256 = 0002 PBCTL EQU PIA+0 + 257 ; + 258 ; --------------------------------------------------------------------------- + 259 ; Atari ANTIC chip display list equates + 260 ; --------------------------------------------------------------------------- + 261 ; + 262 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte) + 263 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3) + 264 ; + 265 = 0010 SCH EQU $10 ; display list horizontal scrolling + 266 = 0020 SCV EQU $20 ; display list vertical scrolling + 267 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte) + 268 = 0080 DLII EQU $80 ; display list interrupt instruction + 269 ; + 270 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction + 271 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction + 272 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction + 273 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction + 274 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction + 275 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction + 276 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction + 277 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction + 278 ; + 279 = 0002 MODE2 EQU $02 ; display list mode 2 + 280 = 0004 MODE4 EQU $04 ; display list mode 4 + 281 = 0008 MODE8 EQU $08 ; display list mode 8 + 282 = 000E MODEE EQU $0E ; display list mode E + 283 = 000F MODEF EQU $0F ; display list mode F + 284 + 285 ; --------------------------------------------------------------------------- + 286 ; KBCODEs + 287 ; --------------------------------------------------------------------------- + 288 080E .enum @kbcode + 289 = 00FF _none = 255 + 290 = 001C _esc = 28 + 291 = 001F _1 = 31 + 292 = 001E _2 = 30 + 293 = 001A _3 = 26 + 294 = 0018 _4 = 24 + 295 = 001D _5 = 29 + 296 = 001B _6 = 27 + 297 = 0033 _7 = 51 + 298 = 0035 _8 = 53 + 299 = 0030 _9 = 48 + 300 = 0032 _0 = 50 + 301 = 0036 _lt = 54 + 302 = 0037 _gt = 55 + 303 = 0034 _del = 52 + 304 = 002C _tab = 44 + 305 = 002F _Q = 47 + 306 = 002E _W = 46 + 307 = 002A _E = 42 + 308 = 0028 _R = 40 + 309 = 002D _T = 45 + 310 = 002B _Y = 43 + 311 = 000B _U = 11 + 312 = 000D _I = 13 + 313 = 0008 _O = 8 + 314 = 000A _P = 10 + 315 = 000E _min = 14 + 316 = 000E _up = 14 ; cursor function + 317 = 000F _eq = 15 + 318 = 000F _down = 15 ; cursor function + 319 = 000C _ret = 12 + 320 = 003F _A = 63 + 321 = 003E _S = 62 + 322 = 003A _D = 58 + 323 = 0038 _F = 56 + 324 = 003D _G = 61 + 325 = 0039 _H = 57 + 326 = 0001 _J = 1 + 327 = 0005 _K = 5 + 328 = 0000 _L = 0 + 329 = 0002 _semicolon = 2 + 330 = 0006 _plus = 6 + 331 = 0006 _left = 6 ; cursor function + 332 = 0007 _asterisk = 7 + 333 = 0007 _right = 7 ; cursor function + 334 = 003C _caps = 60 + 335 = 0017 _Z = 23 + 336 = 0016 _X = 22 + 337 = 0012 _C = 18 + 338 = 0010 _V = 16 + 339 = 0015 _B = 21 + 340 = 0024 _N = 36 + 341 = 0025 _M = 37 + 342 = 0020 _comma = 32 + 343 = 0022 _dot = 34 + 344 = 0026 _slash = 38 + 345 = 0027 _atari = 39 + 346 = 0011 _help = 17 + 347 = 0003 _F1 = 3 + 348 = 0004 _F2 = 4 + 349 = 0013 _F3 = 19 + 350 = 0014 _F4 = 20 + 351 = 0021 _space = 33 + 352 .ende + 352 = 0058 DLICOLORBACK + 352 = 0059 GRADIENTNR + 352 = 005A GRADIENTCOLORS + 352 = 005C WINDCHANGEINROUND + 352 = 005D JOYSTICKNUMBER + 352 = 005E LAZYFLAG + 352 = 005F SPYHARDFLAG + 352 = 0060 VDEBUG + 352 = 0061 XDRAW + 352 = 0063 YDRAW + 352 = 0065 XBYTE + 352 = 0067 YBYTE + 352 = 0069 CHARCODE + 352 = 006A FONTIND + 352 = 006C TANKNR + 352 = 006D TANKSEQUENCEPOINTER + 352 = 006E OLDPLOT + 352 = 0070 XC + 352 = 0072 TEMP + 352 = 0074 TEMP2 + 352 = 0076 MODIFY + 352 = 0078 TEMPXROLLER + 352 = 007A XTEMPDRAW + 352 = 007C YTEMPDRAW + 352 = 007E TEMPOR2 + 352 = 0080 CREDITSVSCROL + 352 = 0081 XI + 352 = 0083 FX + 352 = 0084 YI + 352 = 0086 FY + 352 = 0087 XK + 352 = 0089 FS + 352 = 008A YC + 352 = 008B DX + 352 = 008D DY + 352 = 008F DD + 352 = 0091 DI + 352 = 0093 DP + 352 = 0095 UNDERTANK1 + 352 = 0096 UNDERTANK2 + 352 = 0097 TESTFLIGHTFLAG + 352 = 0098 WEAPONPOINTER + 352 = 009A DLICOUNTER + 352 = 009B PRESSTIMER + 352 = 009C NTSCCOUNTER + 352 = 009D ISENDOFTHEFALLFLAG + 352 = 009E SFX_EFFECT + 352 = 009F RMT_BLOCKED + 352 = 00A0 SCROLLFLAG + 352 = 00A1 SKSTATSIMULATOR + 352 = 00A2 FLOATINGALT + 352 = 00A3 OVERTANKDIR + 352 = 00A4 FORCE + 352 = 00A6 FORCE_ + 352 = 00A7 ANGLE + 352 = 00A8 PARACHUTE + 352 = 00A9 COLOR + 352 = 00AA ERASE + 352 = 00AB RADIUS + 352 = 00AC DECIMAL + 352 = 00AE NUMBEROFPLAYERS + 352 = 00AF COUNTER + 352 = 00B0 EXPLOSIONRADIUS + 352 = 00B1 FUNKYBOMBCOUNTER + 352 = 00B2 RESULTY + 352 = 00B3 XCIRCLE + 352 = 00B5 YCIRCLE + 352 = 00B7 VY + 352 = 00B9 VY_ + 352 = 00BB VX + 352 = 00BD VX_ + 352 = 00BF HITFLAG + 352 = 00C0 POSITIONONTHELIST + 352 = 00C1 XHIT + 352 = 00C3 DELTA + 352 = 00C5 HOWMUCHTOFALL + 352 = 00C6 MAGIC + 352 = 00C8 XTRAJ + 352 = 00CA XTRAJ_ + 352 = 00CB YTRAJ + 352 = 00CD YTRAJ_ + 352 = 00CE WIND + 352 = 00D0 WIND_ + 352 = 00D2 RANGELEFT + 352 = 00D4 RANGERIGHT + 352 = 00D6 NEWANGLE + 352 = 00D7 ESCFLAG + 352 = 00D8 LINEYDRAW + 352 = 00D9 LINEXDRAW + 352 = 00DB PLOT4X4COLOR + 352 = 00DC MULTIPLIER + 352 = 00DE MULTIPLIER_ + 352 = 00DF HOWTODRAW + 352 = 00E0 GRAVITY + 352 = 00E1 LINELENGTH + 352 = 00E3 TRACERFLAG + 352 = 00E4 ISINVENTORY + 352 = 00E5 DIFFICULTYLEVEL + 352 = 00E6 GOLEFT + 352 = 00E7 OFFSETDL1 + 352 = 00E8 L1 + 156 080E icl 'C64/lib/C64SYS.ASM' +Source: C64SYS.ASM + 1 = D000 vic_spr0_x = $D000 + 2 = D001 vic_spr0_y = $D001 + 3 = D002 vic_spr1_x = $D002 + 4 = D003 vic_spr1_y = $D003 + 5 = D004 vic_spr2_x = $D004 + 6 = D005 vic_spr2_y = $D005 + 7 = D006 vic_spr3_x = $D006 + 8 = D007 vic_spr3_y = $D007 + 9 = D008 vic_spr4_x = $D008 + 10 = D009 vic_spr4_y = $D009 + 11 = D00A vic_spr5_x = $D00A + 12 = D00B vic_spr5_y = $D00B + 13 = D00C vic_spr6_x = $D00C + 14 = D00D vic_spr6_y = $D00D + 15 = D00E vic_spr7_x = $D00E + 16 = D00F vic_spr7_y = $D00F + 17 = D010 vic_spr_hi_x = $D010 + 18 = D011 vic_cr1 = $D011 + 19 = D012 vic_raster = $D012 + 20 = D013 vic_lp_x = $D013 + 21 = D014 vic_lp_y = $D014 + 22 = D015 vic_spr_ena = $D015 + 23 = D016 vic_cr2 = $D016 + 24 = D017 vic_spr_exp_y = $D017 + 25 = D018 vic_mem = $D018 + 26 = D019 vic_irq = $D019 + 27 = D01A vic_irq_ena = $D01A + 28 = D01B vic_spr_dp = $D01B + 29 = D01C vic_spr_mcolor = $D01C + 30 = D01D vic_spr_exp_x = $D01D + 31 = D01E vic_spr_ss_col = $D01E + 32 = D01F vic_spr_sd_col = $D01F + 33 = D020 vic_border = $D020 + 34 = D021 vic_bg_color0 = $D021 + 35 = D022 vic_bg_color1 = $D022 + 36 = D023 vic_bg_color2 = $D023 + 37 = D024 vic_bg_color3 = $D024 + 38 = D025 vic_spr_color1 = $D025 + 39 = D026 vic_spr_color2 = $D026 + 40 = D027 vic_spr0_color = $D027 + 41 = D028 vic_spr1_color = $D028 + 42 = D029 vic_spr2_color = $D029 + 43 = D02A vic_spr3_color = $D02A + 44 = D02B vic_spr4_color = $D02B + 45 = D02C vic_spr5_color = $D02C + 46 = D02D vic_spr6_color = $D02D + 47 = D02E vic_spr7_color = $D02E + 48 + 49 = D41B RANDOM = $D41B + 157 080E icl 'C64/lib/MACRO.ASM' +Source: MACRO.ASM + 1 + 2 + 3 + 4 .macro basic_start(addr) + 5 + 6 .word upstartEnd // link address + 7 .word 10 // line num + 8 .byte $9e // sys + 9 + 10 ?a=0 + 11 ?b=0 + 12 ?c=0 + 13 ?d=0 + 14 ?e=0 + 15 + 16 ?v = %%addr + 17 + 18 ift ?v>=10000 + 19 ?a=?v/10000 + 20 ?v=?v-(?a*10000) + 21 eif + 22 + 23 ift ?v>=1000 + 24 ?b=?v/1000 + 25 ?v=?v-(?b*1000) + 26 eif + 27 + 28 ift ?v>=100 + 29 ?c=?v/100 + 30 ?v=?v-(?c*100) + 31 eif + 32 + 33 ift ?v>=10 + 34 ?d=?v/10 + 35 ?v=?v-(?d*10) + 36 eif + 37 + 38 ?e=?v%10 + 39 + 40 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 + 41 + 42 .byte 0 + 43 upstartEnd + 44 .word 0 // empty link signals the end of the program + 45 + 46 .endm + 47 + 48 + 49 // + 50 // Switch bank in VIC-II + 51 // + 52 // Args: + 53 // bank: bank number to switch to. Valid values: 0-3. + 54 // + 55 .macro SwitchVICBank(bank) + 56 // + 57 // The VIC-II chip can only access 16K bytes at a time. In order to + 58 // have it access all of the 64K available, we have to tell it to look + 59 // at one of four banks. + 60 // + 61 // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2). + 62 // + 63 // +------+-------+----------+-------------------------------------+ + 64 // | BITS | BANK | STARTING | VIC-II CHIP RANGE | + 65 // | | | LOCATION | | + 66 // +------+-------+----------+-------------------------------------+ + 67 // | 00 | 3 | 49152 | ($C000-$FFFF)* | + 68 // | 01 | 2 | 32768 | ($8000-$BFFF) | + 69 // | 10 | 1 | 16384 | ($4000-$7FFF)* | + 70 // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) | + 71 // +------+-------+----------+-------------------------------------+ + 72 ?bits=%11 + 73 + 74 ift (%%bank==0) + 75 ?bits=%11 + 76 eli (%%bank==1) + 77 ?bits=%10 + 78 eli (%%bank==2) + 79 ?bits=%01 + 80 eli (%%bank==3) + 81 ?bits=%00 + 82 eif + 83 + 84 // + 85 // Set Data Direction for CIA #2, Port A to output + 86 // + 87 lda $dd02 + 88 and #%11111100 // Mask the bits were interested in. + 89 ora #$03 // Set bits 0 and 1. + 90 sta $dd02 + 91 + 92 // + 93 // Tell VIC-II to switch to bank + 94 // + 95 lda $dd00 + 96 and #%11111100 + 97 ora #?bits + 98 sta $dd00 + 99 .endm + 100 + 101 + 102 // + 103 // Enter hires bitmap mode (a.k.a. standard bitmap mode) + 104 // + 105 .macro SetHiresBitmapMode + 106 // + 107 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + 108 // + 109 lda $d011 + 110 and #%10111111 + 111 ora #%00100000 + 112 sta $d011 + 113 + 114 // + 115 // Clear multi color mode (bit 4) + 116 // + 117 lda $d016 + 118 and #%11101111 + 119 sta $d016 + 120 .endm + 121 + 122 + 123 // + 124 // Enter hires bitmap mode (a.k.a. standard bitmap mode) + 125 // + 126 .macro SetMulticolorBitmapMode + 127 // + 128 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) + 129 // + 130 lda $d011 + 131 and #%10111111 + 132 ora #%00100000 + 133 sta $d011 + 134 + 135 // + 136 // Clear multi color mode (bit 4) + 137 // + 138 lda $d016 + 139 ora #%00010000 + 140 sta $d016 + 141 .endm + 142 + 143 + 144 // + 145 // Switch location of screen memory. + 146 // + 147 // Args: + 148 // address: Address relative to current VIC-II bank base address. + 149 // Valid values: $0000-$3c00. Must be a multiple of $0400. + 150 // + 151 .macro SetScreenMemory(address) + 152 // + 153 // The most significant nibble of $D018 selects where the screen is + 154 // located in the current VIC-II bank. + 155 // + 156 // +------------+-----------------------------+ + 157 // | | LOCATION* | + 158 // | BITS +---------+-------------------+ + 159 // | | DECIMAL | HEX | + 160 // +------------+---------+-------------------+ + 161 // | 0000XXXX | 0 | $0000 | + 162 // | 0001XXXX | 1024 | $0400 (DEFAULT) | + 163 // | 0010XXXX | 2048 | $0800 | + 164 // | 0011XXXX | 3072 | $0C00 | + 165 // | 0100XXXX | 4096 | $1000 | + 166 // | 0101XXXX | 5120 | $1400 | + 167 // | 0110XXXX | 6144 | $1800 | + 168 // | 0111XXXX | 7168 | $1C00 | + 169 // | 1000XXXX | 8192 | $2000 | + 170 // | 1001XXXX | 9216 | $2400 | + 171 // | 1010XXXX | 10240 | $2800 | + 172 // | 1011XXXX | 11264 | $2C00 | + 173 // | 1100XXXX | 12288 | $3000 | + 174 // | 1101XXXX | 13312 | $3400 | + 175 // | 1110XXXX | 14336 | $3800 | + 176 // | 1111XXXX | 15360 | $3C00 | + 177 // +------------+---------+-------------------+ + 178 // + 179 ?bits = (%%address / $0400) << 4 + 180 + 181 lda $d018 + 182 and #%00001111 + 183 ora #?bits + 184 sta $d018 + 185 .endm + 186 + 187 + 188 // + 189 // Set location of bitmap. + 190 // + 191 // Args: + 192 // address: Address relative to VIC-II bank address. + 193 // Valid values: $0000 (bitmap at $0000-$1FFF) + 194 // $2000 (bitmap at $2000-$3FFF) + 195 // + 196 .macro SetBitmapAddress(address) + 197 // + 198 // In standard bitmap mode the location of the bitmap area can + 199 // be set to either BANK address + $0000 or BANK address + $2000 + 200 // + 201 // By setting bit 3, we can configure which of the locations to use. + 202 // + 203 + 204 lda $d018 + 205 + 206 ift %%address == $0000 + 207 and #%11110111 + 208 eli %%address == $2000 + 209 ora #%00001000 + 210 eif + 211 + 212 sta $d018 + 213 .endm + 214 + 215 // + 216 // Once this is done, random values appear in location $D41B (RANDOM) + 217 // + 218 .macro InitializeSIDrnd + 219 LDA #$FF ; maximum frequency value + 220 STA $D40E ; voice 3 frequency low byte + 221 STA $D40F ; voice 3 frequency high byte + 222 LDA #$80 ; noise waveform, gate bit off + 223 STA $D412 ; voice 3 control register + 224 .endm + 225 + 226 ;------------------------------------- + 227 .MACRO rolw + 228 ROL :1 + 229 ROL :1+1 + 230 .ENDM + 231 ;------------------------------------- + 232 .MACRO aslw + 233 ASL :1 + 234 ROL :1+1 + 235 .ENDM + 236 ;------------------------------------- + 237 .MACRO rorw + 238 ROR :1+1 + 239 ROR :1 + 240 .ENDM + 241 ;------------------------------------- + 242 .MACRO lsrw + 243 LSR :1+1 + 244 ROR :1 + 245 .ENDM + 246 ;------------------------------------- + 247 .macro randomize + 248 ;usage: randomize floor ceiling + 249 ;returns (in A) a random .byte between "floor" and "ceiling" + 250 .if :2 < :1 + 251 .error "floor higher than ceiling" + 252 .endif + 253 ?rand + 254 lda random + 255 cmp #:1 ;floor + 256 bcc ?rand + 257 cmp #:2+1 ;ceiling + 258 bcs ?rand + 259 .endm + 260 ;------------------------------------- + 261 .macro phx + 262 txa + 263 pha + 264 .endm + 265 ;------------------------------------- + 266 .macro phy + 267 tya + 268 pha + 269 .endm + 270 ;------------------------------------- + 271 .macro plx + 272 pla + 273 tax + 274 .endm + 275 ;------------------------------------- + 276 .macro ply + 277 pla + 278 tay + 279 .endm + 280 ;------------------------------------- + 281 .MACRO WAIT + 282 ; WAIT + 283 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) + 284 ?ze LDA $D012 + 285 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + 286 bcc ?ze + 287 sbc #10 ; last lines correction + 288 ?wa cmp $D012 + 289 bcc ?wa + 290 ?wf cmp $D012 + 291 bcs ?wf + 292 .ENDM + 293 ;------------------------------------- + 294 .macro halt + 295 ?s jmp ?s + 296 .endm + 158 + 159 ;----------------------------------------------- + 160 ; variable declarations in RAM (no code) + 161 ;----------------------------------------------- + 162 + 163 ; Game loading address + 164 ORG $4100 + 165 4100 icl 'variables.asm' +Source: variables.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 ;===================================================== + 5 ; most important non-zero page variables + 6 ; used by the given subroutines + 7 ; moved to one place for easier + 8 ; compilation to e.g. cartridge + 9 ; zero page variables are declared in program.s65 module + 10 ;===================================================== + 11 4100 OneTimeZeroVariables + 12 = 003F OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! + 13 .if OneTimeZeroVariablesCount > 127 + 14 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount + 15 .endif + 16 + 17 = 4100 noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music + 18 = 4101 noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX + 19 ;---------------------------------------------------- + 20 ; Color table for Game Over Screen (created in a gameover routine) + 21 = 4102 .ds 1 ;.by $00 ; labels line color + 22 = 4103 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 + 23 ;---------------------------------------------------- + 24 4109 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 + 25 ;:6 dta d" " + 26 = 4109 .ds 6*8 + 27 ;---------------------------------------------------- + 28 4139 skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) + 29 = 4139 .DS MaxPlayers + 30 ;---------------------------------------------------- + 31 413F variablesToInitialize + 32 ;Options DO NOT ZERO ON RESTART GAME - ticket #27 + 33 = 413F OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0 + 34 = 4148 RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game + 35 = 4149 seppukuVal .ds 1 ;.by 75 + 36 = 414A mountainDeltaH .ds 1 ;.by 3 + 37 = 414B mountainDeltaL .ds 1 ;.by $ff + 38 ;---------------------------------------------------- + 39 414C LineHeader1 + 40 = 414C .ds 9 ;dta d"# ROUND: " + 41 4155 RoundNrDisplay + 42 = 4155 .ds 5 ;dta d" #", $ff + 43 ; 4x4 text buffer + 44 415A ResultLineBuffer + 45 = 415A .ds 14 ;dta d" ", $ff + 46 4168 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 + 47 = 4168 .ds (screenHeight+1) + 48 4231 linetableH ; = PMGraph + $0300 - (screenHeight+1) + 49 = 4231 .ds (screenHeight+1) + 50 42FA DisplayCopyPurchase + 51 = 42FA .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1) + 52 42FB StatusBufferCopy + 53 = 42FB .ds screenBytes*3 + 54 ;===================================================== + 55 4373 variablesStart ; zeroing starts here + 56 ;===================================================== + 57 ;isInventory .ds 1 ; 0 - purchase, $ff - inventory + 58 ;-------------- + 59 = 4373 drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) + 60 ;-------------- + 61 = 4374 noDeathCounter .ds 1 + 62 ;-------------- + 63 = 4375 OptionsY .ds 1 ;vertical position of cursor on Options screen + 64 = 4376 flyDelay .ds 1 + 65 ;-------------- + 66 ;NumberOfPlayers .DS 1 ;current number of players (counted from 1) + 67 = 4377 TankSequence .DS MaxPlayers ;sequence of shooting during the Round + 68 = 437D GameIsOver .DS 1 ; 1 means it was the last round in the game + 69 ;---------------------------------------------------- + 70 437E moneyH ;we place zero at the end of prices and money + 71 ;and have range from 0 to 99990 (not too much) + 72 ;money players have (maybe one more byte is needed?) + 73 = 437E .DS MaxPlayers + 74 4384 moneyL + 75 = 4384 .DS MaxPlayers + 76 ;---------------------------------------------------- + 77 438A gainH ;how much money player gets after the round + 78 ;it is gathered during the round basing on energy + 79 ;opponents lose after player's shoots + 80 = 438A .DS MaxPlayers + 81 4390 gainL + 82 = 4390 .DS MaxPlayers + 83 ;---------------------------------------------------- + 84 4396 loseH ;how much player looses after the round + 85 ;calculated from REAL energy loss + 86 ;(not only to zero energy) + 87 = 4396 .DS MaxPlayers + 88 439C loseL + 89 = 439C .DS MaxPlayers + 90 ;---------------------------------------------------- + 91 43A2 Energy + 92 = 43A2 .DS MaxPlayers + 93 43A8 ShieldEnergy + 94 = 43A8 .DS MaxPlayers + 95 = 43AE EnergyDecrease .DS 1 + 96 43AF eXistenZ + 97 = 43AF .DS MaxPlayers + 98 43B5 LASTeXistenZ ; eXistenZ before shoot + 99 = 43B5 .DS MaxPlayers + 100 + 101 43BB ResultsTable ;the results in the gameeeeee + 102 = 43BB .DS MaxPlayers + 103 43C1 TempResults + 104 = 43C1 .DS MaxPlayers + 105 ;DirectHitsH ; one byte enough + 106 ; .DS MaxPlayers + 107 43C7 DirectHits + 108 = 43C7 .DS MaxPlayers + 109 43CD EarnedMoneyH + 110 = 43CD .DS MaxPlayers + 111 43D3 EarnedMoneyL + 112 = 43D3 .DS MaxPlayers + 113 ;---------------------------------------------------- + 114 43D9 ForceTableL ;shooting Force of the tank during the round + 115 = 43D9 .DS MaxPlayers + 116 43DF ForceTableH + 117 = 43DF .DS MaxPlayers ;maxplayers=6 + 118 43E5 MaxForceTableL ;Energy of the tank during the round + 119 ;(limes superior force of the Shoot) + 120 = 43E5 .DS MaxPlayers ;1000 is the default + 121 43EB MaxForceTableH + 122 = 43EB .DS MaxPlayers + 123 ;---------------------------------------------------- + 124 43F1 BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! + 125 = 43F1 .DS MaxPlayers + 126 43F7 ActiveWeapon ;number of the selected weapon + 127 = 43F7 .DS MaxPlayers + 128 43FD ActiveDefenceWeapon ;number of the activated defence weapon - 0 + 129 = 43FD .DS MaxPlayers + 130 4403 AutoDefenseFlag ; 0 - not activated, >$7f - activated + 131 = 4403 .DS MaxPlayers + 132 = 4409 WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile + 133 ;---------------------------------------------------- + 134 + 135 ;format of the 3-byte static point number used in the game + 136 ; 20203.5 => 128 : <20203 : >20203 + 137 ;---------------------------------------------------- + 138 + 139 ;L1 .DS 1 ; variable used in multiplications (by 10:) + 140 ;gravity .DS 1 ;only the decimal part (1/10 = 25) + 141 ;---------------------------------------------------- + 142 + 143 ;Wind .ds 4 ;format: 0000.hhll + 144 ;walue displayed on the screen is + 145 ;decimal portion divided by 16 (>>4) + 146 ;---------------------------------------------------- + 147 = 440A MaxWind .ds 1 ; + 148 = 440B WindOrientation .DS 1 ;(0-right,1-left) + 149 ;---------------------------------------------------- + 150 ;Counter .DS 1 ;temporary Counter for outside loops + 151 ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank + 152 = 440C WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + 153 ;---------------------------------------------------- + 154 440D xtankstableL ;X positions of tanks (lower left point) + 155 = 440D .DS MaxPlayers + 156 4413 xtankstableH + 157 = 4413 .DS MaxPlayers + 158 4419 ytankstable ;Y positions of tanks (lower left point) + 159 = 4419 .DS MaxPlayers + 160 441F LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) + 161 = 441F .DS MaxPlayers + 162 4425 JoyNumber ; Joystick port number (from 0 to 3) + 163 = 4425 .DS MaxPlayers + 164 442B TankShape ; Tank shape number (from 0 to 2) + 165 = 442B .DS MaxPlayers + 166 ;---------------------------------------------------- + 167 4431 TargetTankNr ; Target tank index (for AI routines) + 168 = 4431 .DS 1 + 169 4432 SecondTryFlag ; For precise AI aiming + 170 = 4432 .DS 1 + 171 ;---------------------------------------------------- + 172 ;Erase .DS 1 ; if 1 only mask of the character is printed + 173 ; on the graphics screen. if 0 character is printed normally + 174 + 175 ;---------------------------------------------------- + 176 ;RangeLeft .DS 2 ;range of the soil to be fallen down + 177 ;RangeRight .DS 2 ;it is being set by all Explosions + 178 ;---------------------------------------------------- + 179 = 4433 WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon + 180 = 4435 WeaponRangeRight .DS 2 + 181 ;---------------------------------------------------- + 182 ;xroller + 183 ;HowMuchToFall .ds 1 + 184 = 4437 HeightRol .DS 1 + 185 ;digger + 186 ;digstartx .DS 2 + 187 ;digstarty .DS 2 + 188 = 4438 diggery .DS 1 + 189 = 4439 DigLong .DS 1 + 190 = 443A digtabxL .DS [8] + 191 = 4442 digtabxH .DS [8] + 192 = 444A digtabyL .DS [8] + 193 = 4452 digtabyH .DS [8] + 194 ; liquiddirt + 195 = 445A TempXfill .ds 2 + 196 = 445C FillCounter .ds 2 + 197 ;sandhog + 198 = 445E sandhogflag .DS 1 ; (0 digger, 8 sandhog) + 199 ;ofdirt + 200 ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65) + 201 ;draw + 202 ;HowToDraw .DS 1 + 203 ; bits here mean + 204 ; 0 - negative X (go up) + 205 ; 1 - negative Y (left) + 206 ; 2 - directional value > 1 (more than 45 degrees) + 207 ; if all 0 then standart routine + 208 ;XHit .DS 2 + 209 = 445F YHit .DS 2 + 210 ;LineLength .DS 2 + 211 ;circle + 212 ;radius .DS 1 + 213 ;xcircle .DS 2 + 214 ;ycircle .DS 2 + 215 = 4461 tempcir .DS 2 + 216 ;TankFalls + 217 = 4463 FallingSoundBit .DS 1 + 218 = 4464 PreviousFall .DS 1 + 219 = 4465 EndOfTheFallFlag .DS 1 ; in case of the infinite fall + 220 ;Parachute .DS 1 ; are you insured with parachute? + 221 ;FloatingAlt .DS 1 ; floating tank altitude + 222 = 00A2 FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! + 223 = 00A2 PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc + 224 ;---------------------------------------------------- + 225 ;Flight + 226 ;variables for 5 missiles (used for mirv) + 227 = 4466 xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte + 228 = 446B xtraj01 .DS [5] ; middle byte + 229 = 4470 xtraj02 .DS [5] ; high byte + 230 ;vx00 .DS [5] ; looks like it is not really used anywhere + 231 = 4475 vx01 .DS [5] + 232 = 447A vx02 .DS [5] + 233 = 447F vx03 .DS [5] + 234 = 4484 MirvDown .DS [5] ; is given missile down? + 235 = 4489 MirvMissileCounter .DS 1 ; missile Counter (mainly for X) + 236 = 448A SmokeTracerFlag .DS 1 ; if Smoketracer + 237 = 448B LaserFlag .DS 1 ; $ff if Laser + 238 = 448C XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) + 239 = 448D YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) + 240 ;---------------------------------------------------- + 241 ;CheckCollisionWithTank + 242 ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) + 243 ;vy .ds 4 ;0,0,0,0 + 244 ;xtraj .ds 3 ; 0,0,0 + 245 ;ytraj .ds 3 ; 0,0,0 + 246 = 448E xtrajold .ds 3 ; 0,0,0 + 247 = 4491 ytrajold .ds 3 ; 0,0,0 + 248 ;Angle .DS 1 + 249 ;Force .ds 3 ; 0,0,0 + 250 ;Multiplier .ds 3 ; 0,0,0 + 251 = 4494 Multiplee .ds 2 ; 0,0 + 252 ;goleft .DS 1 ;if 1 then flights left + 253 ;---------------------------------------------------- + 254 ;unPlot + 255 = 4496 WhichUnPlot .DS 1 + 256 ; max 5 concurrent unPlots + 257 = 4497 oldplotH .DS [5] + 258 = 449C oldplotL .DS [5] + 259 = 44A1 oldora .DS [5] + 260 = 44A6 oldply .DS [5] + 261 = 44AB OldOraTemp .DS 1 + 262 = 44AC xtrajfb .DS 2 + 263 = 44AE ytrajfb .DS 2 + 264 ; + 265 ;tracerflag .DS 1 + 266 ;---------------------------------------------------- + 267 ;TypeChar + 268 = 44B0 mask1 .DS [8] + 269 = 44B8 mask2 .DS [8] + 270 + 271 = 44C0 char1 .DS [8] + 272 = 44C8 char2 .DS [8] + 273 ;color .DS 1 + 274 = 44D0 ybit .DS 1 + 275 = 44D1 tempbyte01 .DS 1 + 276 ;delta .DS 2 + 277 = 44D2 yfloat .DS 2 + 278 = 44D4 deltaX .DS 1 + 279 = 44D5 UpNdown .DS 1 + 280 + 281 = 44D6 temptankX .DS 2 + 282 = 44D8 temptankNr .DS 1 + 283 = 44D9 AfterBFGflag .DS 1 + 284 + 285 ;---------------------------------------------------- + 286 ;Variables from textproc.s65 + 287 ; tables with indexes of weapons on the right lists + 288 ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive + 289 44DA IndexesOfWeaponsL1 + 290 = 44DA .ds (last_offensive_____ - first_offensive____+1) + 291 44FA IndexesOfWeaponsL2 + 292 = 44FA .ds (last_defensive_____ - first_defensive____+1) + 293 ;---------------------------------------------------- + 294 + 295 ; variables storing amount of weapons on the first and second + 296 ; list and pointer position + 297 + 298 450A HowManyOnTheListOff + 299 = 450A .DS 1 + 300 450B HowManyOnTheListDef + 301 = 450B .DS 1 + 302 ;PositionOnTheList ; pointer position on the list being displayed + 303 ; .DS 1 + 304 450C LastWeapon + 305 ; number of the last previously purchased weapon + 306 ; it is necessary when after purchase some weapon + 307 ; is removed from the list (because too expensive) + 308 ; and the cursor must be placed elsewhere + 309 = 450C .DS 1 + 310 450D WhichList ; list currently on the screen + 311 ; (0-offensive, %10000000 - defensive (check with bit:bmi for defensives) + 312 = 450D .DS 1 + 313 ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines).... + 314 + 315 + 316 ;---------------------------------------------------- + 317 + 318 ;mark the level + 319 450E PositionInName ; cursor position in name of the player when name input + 320 = 450E .DS 1 + 321 ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu) + 322 + 323 ;---------------------------------------------------- + 324 ;displaydecimal + 325 ;decimal .DS 2 + 326 = 450F decimalresult .DS 5 + 327 + 328 ;xmissile + 329 ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte + 330 ;round + 331 = 4514 CurrentRoundNr .DS 1 + 332 ;FallDown2 .DS 1 + 333 ;leapfrog + 334 = 4515 LeapFrogAngle .DS 1 + 335 ;laser + 336 = 4516 LaserCoordinate .DS 8 ; 2,2,2,2 + 337 ;---------------------------------------------------- + 338 ; Here go tables with weapons possesed by a given tank + 339 ; Index in the table means weapon type + 340 ; number entered means ammo for given weapon possessed (max 99) + 341 ; Let 0 be "baby missile" + 342 ; from $30 the defensive weapons begin + 343 451E TanksWeapons + 344 451E TanksWeapon1 + 345 = 451E .DS number_of_weapons + 346 454E TanksWeapon2 + 347 = 454E .DS number_of_weapons + 348 457E TanksWeapon3 + 349 = 457E .DS number_of_weapons + 350 45AE TanksWeapon4 + 351 = 45AE .DS number_of_weapons + 352 45DE TanksWeapon5 + 353 = 45DE .DS number_of_weapons + 354 460E TanksWeapon6 + 355 = 460E .DS number_of_weapons + 356 + 357 463E mountaintable ;table of mountains (size=screenwidth) + 358 = 463E .DS [screenwidth] + 359 = 477E .DS 1 ; additional byte for fallout (sometimes 1 pixel) + 360 477F mountaintable2 ;table of mountains (size=screenwidth) + 361 = 477F .DS [screenwidth] + 362 = 48BF .DS 1 ; additional byte for fallout (sometimes 1 pixel) + 363 48C0 MountaintableEnd ;good for table clearing + 364 ;---------------------------------------------------- + 365 = 48C0 TextNumberOff .DS 1 + 366 ;-------------- + 367 48C1 TankTempY + 368 = 48C1 .DS 1 + 369 ;---------------------------------------------------- + 370 ;-------------- single round variables -------------- + 371 ;---------------------------------------------------- + 372 48C2 singleRoundVars + 373 ;-------------- + 374 ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed + 375 ;-------------- + 376 48C2 CurrentResult + 377 = 48C2 .DS 1 + 378 ;-------------- + 379 48C3 AngleTable ;Angle of the barrel of each tank during the round + 380 = 48C3 .DS MaxPlayers + 381 48C9 EndOfTheBarrelX + 382 = 48C9 .ds 2 + 383 48CB EndOfTheBarrelY + 384 = 48CB .ds 1 + 385 ;---------------------------------------------------- + 386 48CC previousAngle + 387 = 48CC .DS MaxPlayers + 388 48D2 previousEnergyL + 389 = 48D2 .DS MaxPlayers + 390 48D8 previousLeftRange + 391 = 48D8 .DS MaxPlayers + 392 48DE previousEnergyH + 393 = 48DE .DS MaxPlayers + 394 48E4 RandBoundaryLow + 395 = 48E4 .ds 2 + 396 48E6 RandBoundaryHigh + 397 = 48E6 .ds 2 + 398 48E8 AngleTablePointer + 399 = 48E8 .DS 1 + 400 48E9 singleRoundVarsEnd + 401 ;---------------------------------------------------- + 402 ; 4x4 texts + 403 ;---------------------------------------------------- + 404 ;LineAddress4x4 .DS 2 + 405 = 48E9 LineCharNr .DS 1 + 406 ;LineXdraw .DS 2 + 407 ;LineYdraw .DS 1 + 408 + 409 ;----------- + 410 48EA ResultOfTankNr + 411 = 48EA .DS 1 + 412 + 413 ;---------------------------------------------------- + 414 ;PutChar4x4 + 415 ;---------------------------------------------------- + 416 = 48EB nibbler4x4 .DS 1 + 417 = 48EC CharCode4x4 .DS 1 + 418 ;plot4x4color .DS 1 ;1-white, 0-background + 419 ; This is moved from display.asm to be easier to relocate + 420 48ED ListOfWeapons + 421 ; 0123456789012345678901234567890123456789 + 422 ; :number_of_offensives dta d" " + 423 ;:32 dta d" " + 424 = 48ED .ds 32*32 + 425 4CED ListOfWeapons1End + 426 4CED ListOfDefensiveWeapons + 427 ; :number_of_defensives dta d" " + 428 ;:16 dta d" " + 429 = 4CED .ds 16*32 + 430 4EED ListOfDefensiveWeaponsEnd ;constant useful when clearing + 431 4EED track_variables + 432 = 4EED trackn_db .ds TRACKS + 433 = 4EF1 trackn_hb .ds TRACKS + 434 = 4EF5 trackn_idx .ds TRACKS + 435 = 4EF9 trackn_pause .ds TRACKS + 436 = 4EFD trackn_note .ds TRACKS + 437 = 4F01 trackn_volume .ds TRACKS + 438 = 4F05 trackn_distor .ds TRACKS + 439 = 4F09 trackn_shiftfrq .ds TRACKS + 440 = 4F0D trackn_instrx2 .ds TRACKS + 441 = 4F11 trackn_instrdb .ds TRACKS + 442 = 4F15 trackn_instrhb .ds TRACKS + 443 = 4F19 trackn_instridx .ds TRACKS + 444 = 4F1D trackn_instrlen .ds TRACKS + 445 = 4F21 trackn_instrlop .ds TRACKS + 446 = 4F25 trackn_instrreachend .ds TRACKS + 447 = 4F29 trackn_volumeslidedepth .ds TRACKS + 448 = 4F2D trackn_volumeslidevalue .ds TRACKS + 449 = 4F31 trackn_effdelay .ds TRACKS + 450 = 4F35 trackn_effvibratoa .ds TRACKS + 451 = 4F39 trackn_effshift .ds TRACKS + 452 = 4F3D trackn_tabletypespeed .ds TRACKS + 453 = 4F41 trackn_tablenote .ds TRACKS + 454 = 4F45 trackn_tablea .ds TRACKS + 455 = 4F49 trackn_tableend .ds TRACKS + 456 = 4F4D trackn_tablelop .ds TRACKS + 457 = 4F51 trackn_tablespeeda .ds TRACKS + 458 = 4F55 trackn_command .ds TRACKS + 459 = 4F59 trackn_filter .ds TRACKS + 460 = 4F5D trackn_audf .ds TRACKS + 461 = 4F61 trackn_audc .ds TRACKS + 462 = 4F65 trackn_audctl .ds TRACKS + 463 = 4F69 v_aspeed .ds 1 + 464 4F6A track_endvariables + 465 + 466 4F6A variablesEnd + 467 ;---------------------------------------------------- + 468 + 469 .endif + 166 + 167 4F6A WeaponFont + 168 4F6A 00 00 00 00 00 00 + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' + 169 + 170 + 171 ;-------------------------------------------------- + 172 ; Game Code + 173 ;-------------------------------------------------- + 174 536A FirstSTART + 175 = 0000 DL = 0 + 176 = 0000 StatusBufferROM = 0 + 177 ;StatusBufferCopy = 0 + 178 = 0000 StatusBufferCopyEnd = 0 + 179 = 0004 TRACKS = 4 + 180 = 0000 DisplayCopyPurchaseEnd = 0 + 181 = 0000 DisplayCopyPurchaseStart = 0 + 182 = 2000 displayC64 = $2000 ; graphics screen memory start + 183 + 184 536A 78 SEI ; disable IRQ + 185 536B A9 36 LDA #$36 + 186 536D 85 01 STA $0001 ; Turn Off BASIC ROM + 187 536F A9 FE LDA #NMI ; to our routine + 190 5376 8D 19 03 STA $0319 ; + 191 5379 A9 00 LDA #$00 ; stop Timer A + 192 537B 8D 0E DD STA $DD0E ; + 193 537E 8D 04 DD STA $DD04 ; set Timer A to 0, after starting + 194 5381 8D 05 DD STA $DD05 ; NMI will occur immediately + 195 5384 A9 81 LDA #$81 ; + 196 5386 8D 0D DD STA $DD0D ; set Timer A as source for NMI + 197 5389 A9 01 LDA #$01 ; + 198 538B 8D 0E DD STA $DD0E ; start Timer A -> NMI + 199 + 200 ; from here on NMI is disabled + 201 + 202 + 203 538E 20 89 5A jsr MakeDarkScreen + 204 + 205 ; one time zero variables in RAM (non zero page) + 206 5391 A9 00 lda #0 + 207 5393 A0 3E ldy #OneTimeZeroVariablesCount-1 + 208 5395 99 00 41 @ sta OneTimeZeroVariables,y + 209 5398 88 dey + 210 5399 10 FA bpl @- + 211 + 212 ; one time zero variables in RAM (zero page) + 213 539B A0 58 ldy #FirstZpageVariable + 214 539D 99 00 00 @ sta $0000,y + 215 53A0 C8 iny + 216 53A1 D0 FA bne @- + 217 + 218 ; initialize variables in RAM (non zero page) + 219 53A3 A0 1B ldy #initialvaluesCount-1 + 220 53A5 B9 B9 5A @ lda initialvaluesStart,y + 221 53A8 99 3F 41 sta variablesToInitialize,y + 222 53AB 88 dey + 223 53AC 10 F7 bpl @- + 224 + 225 + 226 ; generate linetables + 227 53AE 20 9D 76 jsr GenerateLineTable + 228 + 229 + 230 ; Random INIT + 231 53B1 InitializeSIDrnd +Macro: INITIALIZESIDRND [Source: MACRO.ASM] + 1 53B1 A9 FF LDA #$FF ; maximum frequency value + 2 53B3 8D 0E D4 STA $D40E ; voice 3 frequency low byte + 3 53B6 8D 0F D4 STA $D40F ; voice 3 frequency high byte + 4 53B9 A9 80 LDA #$80 ; noise waveform, gate bit off + 5 53BB 8D 12 D4 STA $D412 ; voice 3 control register +Source: scorchC64.asm + 232 + 233 ;-------------------------------------------------- + 234 ; Main program of the game + 235 53BE icl 'game.asm' +Source: game.asm + 1 .IF *>0 ;this is a trick that prevents compiling this file alone + 2 + 3 ; All main procedures of the game not dependent on hardware (I hope) :) + 4 + 5 53BE START + 6 53BE 20 89 5A jsr MakeDarkScreen + 7 ; Startup sequence + 8 53C1 20 6A 58 jsr Initialize + 9 + 10 ;jsr GameOverScreen ; only for test !!! + 11 + 12 53C4 RMTSong song_main_menu +Macro: RMTSONG [Source: scorchC64.asm] + 1 53C4 A9 02 lda #SONG_MAIN_MENU ; do nothing in C64 +Source: game.asm + 13 + 14 53C6 20 E5 62 jsr Options ;startup screen + 15 53C9 20 1E 63 jsr SetVariablesFromOptions + 16 53CC 20 89 5A jsr MakeDarkScreen + 17 53CF 24 D7 bit escFlag + 18 53D1 30 EB bmi START + 19 + 20 53D3 20 C6 63 jsr EnterPlayerNames + 21 53D6 20 89 5A jsr MakeDarkScreen + 22 53D9 24 D7 bit escFlag + 23 53DB 30 E1 bmi START + 24 + 25 53DD 20 0B 59 jsr RandomizeSequence + 26 ; for the round #1 shooting sequence is random + 27 + 28 53E0 MainGameLoop + 29 53E0 20 41 5A jsr SetWallsType + 30 ; first set default barrel lengths (fix for Long Schlong activation :) ) + 31 ; we must do it before purchase/activate + 32 ; and set Auto Defense to off + 33 53E3 20 FB 58 jsr SetStandardBarrels + 34 + 35 53E6 20 77 63 jsr CallPurchaseForEveryTank + 36 53E9 20 89 5A jsr MakeDarkScreen + 37 53EC 24 D7 bit escFlag + 38 53EE 30 CE bmi START + 39 + 40 53F0 20 E7 57 jsr GetRandomWind + 41 + 42 53F3 20 D3 54 jsr RoundInit + 43 + 44 53F6 20 5F 55 jsr MainRoundLoop + 45 53F9 24 D7 bit escFlag + 46 53FB 30 C1 bmi START + 47 53FD 50 03 4C C3 54 jvs GoGameOver + 48 + 49 5402 20 DD 59 jsr SortSequence + 50 + 51 5405 A9 00 85 6C mva #0 TankNr ; + 52 5409 85 02 sta COLBAKS ; set background color to black + 53 540B 85 5D sta JoystickNumber ; set joystick port for player + 54 + 55 ; Hide all (easier than hide last ;) ) tanks + 56 540D 20 0B 6A jsr cleartanks ; A=0 + 57 + 58 ; here gains and losses should be displayed (dollars) + 59 ; finally we have changed our minds and money of players + 60 ; is displayed only in weapons shop + 61 + 62 ; Results are number of other deaths + 63 ; before the player dies itself + 64 + 65 5410 RmtSong song_round_over +Macro: RMTSONG [Source: scorchC64.asm] + 1 5410 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 +Source: game.asm + 66 5412 20 A3 64 jsr DisplayResults + 67 + 68 5415 20 75 5A jsr DemoModeOrKey + 69 5418 20 89 5A jsr MakeDarkScreen + 70 + 71 541B A6 AE ldx NumberOfPlayers + 72 541D CA dex + 73 541E CalculateGains + 74 ; add gains and substract losses + 75 ; gain is what player gets for lost energy of opponents + 76 ; energy lost by opponents is added during Round and + 77 ; little below in source, multiplied by 2 to get "dollars". + 78 ; By analogy, loss is energy that given player losses during + 79 ; each Round. + 80 ; Important! If player has 10 energy and gets a central hit + 81 ; from nuke that would take 90 energy points, his loss + 82 ; is 90, not 10 + 83 + 84 ; adding the remaining energy of the tank to gain + 85 ; winner gets more ! :) + 86 541E BD A2 43 lda Energy,x + 87 5421 7D 90 43 adc gainL,x + 88 5424 9D 90 43 sta gainL,x + 89 5427 90 03 bcc @+ + 90 5429 FE 8A 43 inc gainH,x + 91 @ + 92 ; add gain * 2 + 93 542C 1E 90 43 asl gainL,x + 94 542F 3E 8A 43 rol gainH,x + 95 5432 18 clc + 96 5433 BD 84 43 lda moneyL,x + 97 5436 7D 90 43 adc gainL,x + 98 5439 9D 84 43 sta moneyL,x + 99 543C BD 7E 43 lda moneyH,x + 100 543F 7D 8A 43 adc gainH,x + 101 5442 9D 7E 43 sta moneyH,x + 102 ; substract lose + 103 ; if lose is greater than money then zero money + 104 5445 BD 7E 43 lda moneyH,x + 105 5448 DD 96 43 cmp loseH,x + 106 544B 90 20 bcc zeromoney + 107 544D D0 08 bne substractlose + 108 544F BD 84 43 lda moneyL,x + 109 5452 DD 9C 43 cmp loseL,x + 110 5455 90 16 bcc zeromoney + 111 5457 substractlose + 112 5457 38 sec + 113 5458 BD 84 43 lda moneyL,x + 114 545B FD 9C 43 sbc loseL,x + 115 545E 9D 84 43 sta moneyL,x + 116 5461 BD 7E 43 lda moneyH,x + 117 5464 FD 96 43 sbc loseH,x + 118 5467 9D 7E 43 sta moneyH,x + 119 546A 4C 75 54 jmp skipzeroing + 120 546D zeromoney + 121 546D A9 00 lda #0 + 122 546F 9D 84 43 sta moneyL,x + 123 5472 9D 7E 43 sta moneyH,x + 124 5475 skipzeroing + 125 ; and earned money for summary + 126 5475 18 clc + 127 5476 BD D3 43 lda EarnedMoneyL,x + 128 5479 7D 90 43 adc gainL,x + 129 547C 9D D3 43 sta EarnedMoneyL,x + 130 547F BD CD 43 lda EarnedMoneyH,x + 131 5482 7D 8A 43 adc gainH,x + 132 5485 9D CD 43 sta EarnedMoneyH,x + 133 ; substract lose + 134 ; if lose is greater than money then zero money + 135 5488 BD CD 43 lda EarnedMoneyH,x + 136 548B DD 96 43 cmp loseH,x + 137 548E 90 20 bcc ezeromoney + 138 5490 D0 08 bne esubstractlose + 139 5492 BD D3 43 lda EarnedMoneyL,x + 140 5495 DD 9C 43 cmp loseL,x + 141 5498 90 16 bcc ezeromoney + 142 549A esubstractlose + 143 549A 38 sec + 144 549B BD D3 43 lda EarnedMoneyL,x + 145 549E FD 9C 43 sbc loseL,x + 146 54A1 9D D3 43 sta EarnedMoneyL,x + 147 54A4 BD CD 43 lda EarnedMoneyH,x + 148 54A7 FD 96 43 sbc loseH,x + 149 54AA 9D CD 43 sta EarnedMoneyH,x + 150 54AD 4C B8 54 jmp eskipzeroing + 151 54B0 ezeromoney + 152 54B0 A9 00 lda #0 + 153 54B2 9D D3 43 sta EarnedMoneyL,x + 154 54B5 9D CD 43 sta EarnedMoneyH,x + 155 54B8 eskipzeroing + 156 + 157 54B8 CA dex + 158 54B9 30 03 4C 1E 54 jpl CalculateGains + 159 + 160 54BE AD 7D 43 lda GameIsOver + 161 54C1 F0 06 beq NoGameOverYet + 162 54C3 GoGameOver + 163 54C3 20 0E 66 jsr GameOverScreen + 164 54C6 4C BE 53 jmp START + 165 54C9 NoGameOverYet + 166 54C9 EE 14 45 inc CurrentRoundNr + 167 54CC A9 15 85 9E mva #sfx_silencer sfx_effect + 168 + 169 54D0 4C E0 53 jmp MainGameLoop + 170 + 171 + 172 ;-------------------------------------------------- + 173 54D3 .proc RoundInit + 174 ;-------------------------------------------------- + 175 ; at the beginning of each Round we set energy + 176 ; of all players to 99 + 177 ; the maximum shooting energy to 990 (it is 10*energy) + 178 ; the default shooting energy to 350 + 179 ; the shooting angle is randomized + 180 ; of course gains an loses are zeroed + 181 + 182 54D3 RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 54D3 A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: game.asm + 183 + 184 54D5 20 62 75 jsr SetPMWidth ; A=0 + 185 54D8 A9 00 lda #0 + 186 54DA 8D D9 44 sta AfterBFGflag ; reset BFG flag + 187 54DD 85 02 sta COLOR2 ; status line "off" + 188 54DF 85 02 sta COLOR1 + 189 + 190 54E1 AA tax + 191 54E2 9D C2 48 @ sta singleRoundVars,x + 192 54E5 E8 inx + 193 54E6 E0 27 cpx #(singleRoundVarsEnd-singleRoundVars) + 194 54E8 D0 F8 bne @- + 195 + 196 54EA A2 05 ldx #(MaxPlayers-1) + 197 54EC SettingEnergies + 198 54EC A9 00 lda #$00 + 199 54EE 9D 90 43 sta gainL,x + 200 54F1 9D 8A 43 sta gainH,x + 201 54F4 9D 9C 43 sta loseL,x + 202 54F7 9D 96 43 sta loseH,x + 203 54FA A9 63 lda #99 + 204 54FC 9D A2 43 sta Energy,x + 205 54FF 9D AF 43 sta eXistenZ,x + 206 5502 9D B5 43 sta LASTeXistenZ,x + 207 ; anything in eXistenZ table means that this tank exist + 208 ; in the given round + 209 5505 A9 E8 lda #<1000 + 210 5507 9D E5 43 sta MaxForceTableL,x + 211 550A A9 03 lda #>1000 + 212 550C 9D EB 43 sta MaxForceTableH,x + 213 550F A9 5E lda #<350 + 214 5511 9D D9 43 sta ForceTableL,x + 215 5514 A9 01 lda #>350 + 216 5516 9D DF 43 sta ForceTableH,x + 217 + 218 ;lda #(255-45) + 219 ;it does not look good when all tanks have + 220 ;barrels pointing the same direction + 221 ;so it would be nice to have more or less random + 222 ;angles + 223 5519 20 3D 59 jsr RandomizeAngle + 224 551C 9D C3 48 sta AngleTable,x + 225 + 226 551F CA dex + 227 5520 10 CA bpl SettingEnergies + 228 + 229 ;generating the new landscape + 230 5522 20 46 75 jsr PMoutofScreen ;let P/M disappear + 231 5525 20 7C 76 jsr clearscreen ;let the screen be clean + 232 5528 20 9C 6E jsr ClearPMmemory + 233 552B 20 6A 69 jsr placetanks ;let the tanks be evenly placed + 234 552E 20 04 70 jsr calculatemountains ;let mountains be easy for the eye + 235 ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height + 236 + 237 + 238 5531 A9 00 85 72 85 73 mwa #StatusBufferROM temp + 239 5537 A9 FB 85 74 A9 42 + mwa #StatusBufferCopy temp2 + 240 553F A9 01 85 76 A9 00 + mwa #StatusBufferCopyEnd+1 modify + 241 5547 20 B7 5A jsr CopyFromROM + 242 + 243 554A 20 E4 76 jsr SetMainScreen + 244 554D 20 51 75 jsr ColorsOfSprites + 245 + 246 5550 20 B2 6E jsr drawmountains ;draw them + 247 5553 20 12 6A jsr drawtanks ;finally draw tanks + 248 + 249 5556 A9 00 85 6D mva #$00 TankSequencePointer + 250 + 251 ;---------round screen is ready--------- + 252 555A A9 0A 85 02 mva #TextForegroundColor COLOR1 ; status line "on" + 253 555E 60 rts + 254 .endp + 255 + 256 ;-------------------------------------------------- + 257 555F .proc MainRoundLoop + 258 ; here we must check if by a chance there is only one + 259 ; tank with energy greater than 0 left + 260 ;-------------------------------------------------- + 261 + 262 555F A0 00 ldy #0 ; in Y - number of tanks with energy greater than zero + 263 5561 84 02 sty ATRACT ; reset atract mode + 264 5563 A6 AE ldx NumberOfPlayers + 265 5565 CA dex + 266 5566 CheckingIfRoundIsFinished + 267 5566 BD AF 43 lda eXistenZ,x + 268 5569 F0 01 beq NoEnergy + 269 556B C8 iny + 270 556C NoEnergy + 271 556C CA dex + 272 556D 10 F7 bpl CheckingIfRoundIsFinished + 273 + 274 556F C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ? + 275 5571 B0 17 bcs DoNotFinishTheRound + 276 + 277 ;points for the last living tank + 278 5573 A6 AE ldx NumberOfPlayers + 279 5575 CA dex + 280 5576 WhichTankWonLoop + 281 5576 BD AF 43 lda eXistenZ,x + 282 5579 D0 04 bne ThisOneWon + 283 557B CA dex + 284 557C 10 F8 bpl WhichTankWonLoop + 285 ;error was here!!! + 286 ; somehow I believed program will be never here + 287 ; but it was a bad assumption + 288 ; god knows when there is such a situation + 289 ; (we've got a SITUATION here, if you know what I mean) + 290 ; there are two tanks left. + 291 ; one of them is killed by the second tank + 292 ; second tank explodes and kills the first one. + 293 ; and code lands here... + 294 ; looks like no one won! + 295 557E 60 rts + 296 + 297 557F ThisOneWon + 298 557F AD C2 48 lda CurrentResult + 299 5582 18 clc + 300 5583 7D BB 43 adc ResultsTable,x + 301 5586 9D BB 43 sta ResultsTable,x + 302 + 303 5589 60 rts ; this Round is finished + 304 + 305 558A DoNotFinishTheRound + 306 ; Seppuku here + 307 558A AD 74 43 lda noDeathCounter + 308 558D CD 49 41 cmp seppukuVal + 309 5590 90 0F bcc @+ + 310 + 311 5592 A9 00 8D 74 43 mva #0 noDeathCounter + 312 5597 A9 1A 85 9E mva #sfx_seppuku sfx_effect + 313 + 314 559B 20 19 74 jsr DisplaySeppuku + 315 559E 4C D0 57 jmp Seppuku + 316 + 317 @ + 318 ; Auto Defense - activates defensives + 319 55A1 A6 AE ldx NumberOfPlayers + 320 55A3 CA dex + 321 55A4 CheckNextTankAD + 322 55A4 BD A2 43 lda Energy,x ; only active players + 323 55A7 F0 08 beq @+ + 324 55A9 BD 03 44 lda AutoDefenseFlag,x ; with Auto Defence activated + 325 55AC F0 03 beq @+ + 326 ; run auto defense for tank in X + 327 55AE 20 F2 8A jsr AutoDefense + 328 55B1 CA @ dex + 329 55B2 10 F0 bpl CheckNextTankAD + 330 55B4 20 12 6A jsr DrawTanks ; redraw tanks with new defences + 331 ; + 332 55B7 A6 6D ldx TankSequencePointer + 333 55B9 BD 77 43 lda TankSequence,x + 334 55BC 85 6C sta TankNr + 335 55BE AA tax + 336 55BF BD A2 43 lda Energy,x ;skip if no energy + 337 55C2 D0 03 4C 90 56 jeq NextPlayerShoots + 338 + 339 + 340 + 341 55C7 A9 FF 85 DB mva #$ff plot4x4color + 342 55CB 20 44 73 jsr DisplayTankNameAbove + 343 + 344 55CE A9 01 85 A9 mva #1 color ;to display flying point + 345 + 346 55D2 A6 6C ldx tankNr + 347 55D4 BD 7F 5B lda TankStatusColoursTable,x + 348 55D7 85 02 sta COLOR2 ; set color of status line + 349 55D9 20 0F 66 jsr PutTankNameOnScreen + 350 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 351 + 352 55DC BD 39 41 lda SkillTable,x + 353 55DF F0 1C beq ManualShooting + 354 + 355 55E1 RoboTanks + 356 ; robotanks shoot here + 357 ; TankNr still in X + 358 55E1 20 C3 8F jsr ArtificialIntelligence + 359 ;pause 30 + 360 55E4 A6 6C ldx TankNr + 361 55E6 20 0F 66 jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) + 362 55E9 20 A1 59 jsr MoveBarrelToNewPosition + 363 55EC A5 02 lda kbcode + 364 55EE C9 1C cmp #@kbcode._esc ; 28 ; ESC + 365 55F0 D0 03 bne @+ + 366 55F2 20 AE 73 jsr AreYouSure + 367 55F5 A5 D7 @ lda escFlag + 368 55F7 F0 01 60 seq:rts ; keys Esc or O + 369 + 370 + 371 55FA 4C 11 56 jmp AfterManualShooting + 372 + 373 55FD ManualShooting + 374 55FD BD 25 44 lda JoyNumber,x + 375 5600 85 5D sta JoystickNumber ; set joystick port for player + 376 5602 20 71 5A jsr WaitForKeyRelease + 377 5605 A9 00 lda #%00000000 + 378 5607 85 97 sta TestFlightFlag ; set "Test Fight" off + 379 5609 20 4D 80 jsr BeforeFire + 380 560C A5 D7 lda escFlag + 381 560E F0 01 60 seq:rts ; keys Esc or O + 382 + 383 5611 AfterManualShooting + 384 5611 A9 00 85 DB mva #$00 plot4x4color + 385 5615 20 44 73 jsr DisplayTankNameAbove + 386 ; defensive weapons without flight handling + 387 5618 A6 6C ldx TankNr + 388 561A BD FD 43 lda ActiveDefenceWeapon,x + 389 561D C9 22 cmp #ind_Hovercraft_____ + 390 561F F0 14 beq GoFloat + 391 5621 C9 20 cmp #ind_White_Flag_____ ; White Flag + 392 5623 F0 0A beq ShootWhiteFlag + 393 5625 C9 2B cmp #ind_Nuclear_Winter_ + 394 5627 D0 19 bne StandardShoot + 395 5629 ShootAtomicWinter + 396 ; --- atomic winter --- + 397 5629 20 9B 8A jsr AtomicWinter + 398 562C 4C 90 56 jmp NextPlayerShoots ; and we skip shoot + 399 562F ShootWhiteFlag + 400 ; --- white flag --- + 401 562F 20 70 8A jsr WhiteFlag + 402 5632 4C 90 56 jmp NextPlayerShoots ; and we skip shoot + 403 5635 GoFloat + 404 5635 20 84 8B jsr TankFlying + 405 5638 A9 00 lda #0 + 406 563A 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate after use + 407 563D 24 D7 bit escFlag + 408 563F 10 BC bpl ManualShooting ; after floating tank can shoot + 409 5641 60 rts + 410 5642 StandardShoot + 411 5642 EE 74 43 inc noDeathCounter + 412 + 413 5645 20 98 8F jsr DecreaseWeaponBeforeShoot + 414 5648 20 0F 66 jsr DisplayStatus + 415 + 416 ; ldx TankNr + 417 564B DE A2 43 dec Energy,x ; lower energy to eventually let tanks commit suicide + 418 + 419 564E ShootNow + 420 564E 20 0C 83 jsr Shoot + 421 ;here we clear offensive text (after a shoot) + 422 5651 A4 6C ldy TankNr + 423 5653 A9 00 85 DB mva #$00 plot4x4color + 424 5657 20 88 72 jsr DisplayOffensiveTextNr + 425 + 426 565A A5 BF lda HitFlag ;0 if missed + 427 565C F0 1E beq missed + 428 + 429 565E 20 34 77 jsr Explosion + 430 + 431 5661 continueMainRoundLoopAfterSeppuku + 432 + 433 5661 AfterExplode + 434 5661 20 F4 6E jsr SoilDown2 ; allways + 435 5664 NoFallDown2 + 436 ;here tanks are falling down + 437 5664 A5 6C 85 7E mva tankNr tempor2 + 438 5668 A6 AE ldx NumberOfPlayers + 439 566A CA dex + 440 566B TanksFallDown + 441 566B 86 6C stx TankNr + 442 566D BD AF 43 lda eXistenZ,x + 443 5670 F0 03 beq NoExistNoFall + 444 5672 20 2E 6D jsr TankFalls + 445 5675 NoExistNoFall + 446 5675 CA dex + 447 5676 10 F3 bpl TanksFallDown + 448 5678 A6 7E 86 6C mvx tempor2 TankNr + 449 + 450 567C missed + 451 567C AC 09 44 ldy WeaponDepleted + 452 567F D0 06 bne @+ + 453 5681 A6 6C ldx TankNr + 454 5683 98 tya + 455 5684 9D F7 43 sta ActiveWeapon,x + 456 @ + 457 + 458 ;here we clear offensive text (after a shoot) + 459 5687 A4 6C ldy TankNr + 460 5689 A9 00 85 DB mva #$00 plot4x4color + 461 568D 20 88 72 jsr DisplayOffensiveTextNr + 462 + 463 5690 NextPlayerShoots + 464 ;before it shoots, the eXistenZ table must be updated + 465 ;accordingly to actual energy (was forgotten, sorry to ourselves) + 466 + 467 5690 A2 05 ldx #(MaxPlayers-1) + 468 5692 SeteXistenZ + 469 5692 BD A2 43 lda Energy,x + 470 5695 9D AF 43 sta eXistenZ,x + 471 + 472 5698 20 2A 58 jsr MaxForceCalculate + 473 + 474 569B CA dex + 475 569C 10 F4 bpl SeteXistenZ + 476 + 477 ;was setup of maximum energy for players + 478 + 479 + 480 569E PlayersAgain + 481 + 482 ; In LASTeXistenZ there are values of eXistenZ before shoot + 483 ; from the next tank. + 484 ; Now it must be checked if by a chance something that had + 485 ; LASTeXistenZ>0 is not equal to 0 right now, + 486 ; because it means this tank died during this round. + 487 ; Most important thing is: + 488 ; after each explosion of the tank these operations must be + 489 ; performed from the beginning! + 490 ; (it is made by another jump into the after explosion routines) + 491 ; It is because exploding tank can destroy their neighbours, + 492 ; additionally this tank just have had LASTeXistenZ set to 0, + 493 ; otherwise it would explode again and again. + 494 ; OK, text how to do it is ready, now comes coding . + 495 ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ + 496 + 497 569E A9 16 85 9E mva #sfx_next_player sfx_effect + 498 + 499 56A2 A6 AE ldx NumberOfPlayers + 500 56A4 CA dex + 501 56A5 CheckingPlayersDeath + 502 56A5 BD B5 43 lda LASTeXistenZ,x + 503 56A8 F0 05 beq NoPlayerNoDeath + 504 56AA BD AF 43 lda eXistenZ,x + 505 56AD F0 19 beq PlayerXdeath + 506 56AF NoPlayerNoDeath + 507 56AF CA dex + 508 56B0 10 F3 bpl CheckingPlayersDeath + 509 ; if processor is here it means there are no more explosions + 510 + 511 56B2 E6 6D A5 6D inc:lda TankSequencePointer + 512 56B6 C5 AE cmp NumberOfPlayers + 513 56B8 D0 0B bne NotLastPlayerInRound + 514 56BA A9 00 85 6D mva #0 TankSequencePointer + 515 + 516 56BE A5 5C lda WindChangeInRound + 517 56C0 F0 03 beq NoWindChangeNow + 518 56C2 20 E7 57 jsr GetRandomWind ; wind change after each turn (not round only) + 519 56C5 NoWindChangeNow + 520 56C5 NotLastPlayerInRound + 521 56C5 4C 5F 55 jmp MainRoundLoop + 522 .endp + 523 + 524 ;--------------------------------- + 525 56C8 .proc PlayerXdeath + 526 ; this tank should not explode anymore: + 527 ; there is 0 in A, and Tank Number in X, so... + 528 ;--------------------------------- + 529 + 530 56C8 9D B5 43 sta LASTeXistenZ,x + 531 ; save x somewhere + 532 56CB 8E C1 48 stx TankTempY + 533 + 534 ;clear NoDeathCounter here + 535 56CE 8D 74 43 sta noDeathCounter + 536 + 537 56D1 A9 06 85 9E mva #sfx_death_begin sfx_effect + 538 + 539 ; display defensive text here (well, defensive + 540 ; is not the real meaning, it should be pre-death, + 541 ; but I am too lazy to change names of variables) + 542 + 543 ; in X there is a number of tank that died + 544 + 545 56D5 A9 4E lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") + 546 56D7 2C D9 44 bit AfterBFGflag ; check BFG flag + 547 56DA 30 15 bmi TextAfterBFG + 548 ; if BFG then no points for dead tanks ... + 549 56DC AD C2 48 lda CurrentResult + 550 56DF 18 clc + 551 56E0 7D BB 43 adc ResultsTable,x + 552 56E3 9D BB 43 sta ResultsTable,x + 553 ;inc CurrentResult + 554 + 555 ; RandomizeDeffensiveText + 556 56E6 randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 56E6 ?rand + 7 56E6 AD 1B D4 lda random + 8 56E9 C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor + 9 56EB 90 F9 bcc ?rand + 10 56ED C9 74 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling + 11 56EF B0 F5 bcs ?rand +Source: game.asm + 557 56F1 TextAfterBFG + 558 56F1 8D C0 48 sta TextNumberOff + 559 56F4 EE C2 48 inc CurrentResult ; ... but increase result of winner (BFG) + 560 56F7 AC C1 48 ldy TankTempY + 561 56FA A9 FF 85 DB mva #$ff plot4x4color + 562 56FE 20 88 72 jsr DisplayOffensiveTextNr + 563 ; tank flash + 564 5701 AC C1 48 ldy TankTempY + 565 5704 A5 6C 85 74 mva TankNr temp2 ; not elegant, and probably unnecessary + 566 5708 84 6C sty TankNr + 567 570A 20 57 6B jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) + 568 570D A5 74 85 6C mva temp2 TankNr + 569 + 570 ;Deffensive text cleanup + 571 ;here we clear Deffensive text (after a shoot) + 572 5711 AC C1 48 ldy TankTempY + 573 5714 A9 00 85 DB mva #$00 plot4x4color + 574 5718 20 88 72 jsr DisplayOffensiveTextNr + 575 + 576 ; calculate position of the explosion (the post-death one) + 577 571B AE C1 48 ldx TankTempY + 578 571E 18 clc + 579 571F BD 0D 44 lda xtankstableL,x + 580 5722 69 04 adc #4 ; more or less in the middle of the tank + 581 5724 85 61 sta xdraw + 582 5726 BD 13 44 lda xtankstableH,x + 583 5729 69 00 adc #0 + 584 572B 85 62 sta xdraw+1 + 585 572D 38 sec + 586 572E BD 19 44 lda ytankstable,x + 587 5731 E9 04 sbc #4 + 588 5733 85 63 sta ydraw + 589 5735 A9 00 lda #0 + 590 5737 85 64 sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit + 591 + 592 ;cleanup of the soil fall down ranges (left and right) + 593 5739 85 D4 sta RangeRight + 594 573B 85 D5 sta RangeRight+1 + 595 573D A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft + 596 + 597 ; We are randomizing the weapon now. + 598 ; jumping into the middle of the explosion + 599 ; routine + 600 5745 MetodOfDeath + 601 5745 AD 1B D4 lda random + 602 5748 29 1F and #%00011111 ; range 0-31 + 603 574A C9 10 cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) + 604 574C B0 F7 bcs MetodOfDeath + 605 574E A8 tay + 606 574F B9 4A 60 lda weaponsOfDeath,y + 607 5752 20 3C 77 jsr ExplosionDirect + 608 5755 A9 15 85 9E mva #sfx_silencer sfx_effect + 609 + 610 ; Clear current Shooter settings. After that, Shooter will "search" for the target again + 611 5759 A6 AE ldx NumberOfPlayers + 612 575B CA dex + 613 575C BD 39 41 @ lda skillTable,x + 614 575F C9 02 cmp #2 ; clear variables only if Shooter + 615 5761 D0 0B bne NotShooter + 616 5763 A9 00 lda #0 + 617 5765 9D CC 48 sta PreviousAngle,x + 618 5768 9D D2 48 sta PreviousEnergyL,x + 619 576B 9D DE 48 sta PreviousEnergyH,x + 620 576E NotShooter + 621 576E CA dex + 622 576F 10 EB bpl @- + 623 + 624 ; jump to after explosion routines (soil fallout, etc.) + 625 ; After going through these routines we are back + 626 ; to checking if a tank exploded and maybe we have + 627 ; a deadly shot here again. + 628 5771 4C 61 56 jmp MainRoundLoop.AfterExplode + 629 .endp + 630 + 631 ;-------------------------------------------------- + 632 5774 .proc DecreaseEnergyX + 633 ;Decreases energy of player nr X by the value Y + 634 ;increases his financial loss + 635 ;increases gain of tank TankNr + 636 ;-------------------------------------------------- + 637 5774 8C AE 43 sty EnergyDecrease + 638 ; Lose increase + 639 5777 BD 9C 43 lda loseL,x + 640 577A 18 clc + 641 577B 6D AE 43 adc EnergyDecrease + 642 577E 9D 9C 43 sta loseL,x + 643 5781 BD 96 43 lda loseH,x + 644 5784 69 00 adc #$00 + 645 5786 9D 96 43 sta loseH,x + 646 ; Energy now, not less than 0 + 647 5789 BD A2 43 lda Energy,x + 648 578C CD AE 43 cmp EnergyDecrease + 649 578F 90 05 bcc ldahashzero + 650 ;sec + 651 5791 ED AE 43 sbc EnergyDecrease + 652 5794 10 02 bpl NotNegativeEnergy + 653 5796 ldahashzero + 654 5796 A9 00 lda #0 + 655 5798 NotNegativeEnergy + 656 5798 9D A2 43 sta Energy,x + 657 ;now increase the gain of the shooting tank + 658 579B A4 6C ldy TankNr + 659 579D 18 clc + 660 579E B9 90 43 lda gainL,y + 661 57A1 6D AE 43 adc EnergyDecrease + 662 57A4 99 90 43 sta gainL,y + 663 57A7 B9 8A 43 lda gainH,y + 664 57AA 69 00 adc #$00 + 665 57AC 99 8A 43 sta gainH,y + 666 57AF 60 rts + 667 .endp + 668 + 669 ;-------------------------------------------------- + 670 57B0 .proc DecreaseShieldEnergyX + 671 ; Decreases energy of shield player nr X by the value Y + 672 ; if shield energy is 0 after decrease then in Y we have + 673 ; rest of the energy - to decrease tank energy + 674 ;-------------------------------------------------- + 675 57B0 8C AE 43 sty EnergyDecrease + 676 57B3 A0 00 ldy #0 ; if Shield survive then no decrease tank anergy + 677 ; Energy cannot be less than 0 + 678 57B5 BD A8 43 lda ShieldEnergy,x + 679 57B8 CD AE 43 cmp EnergyDecrease + 680 57BB 90 05 bcc UseAllShieldEnergy + 681 ;sec + 682 57BD ED AE 43 sbc EnergyDecrease + 683 57C0 10 0A bpl NotNegativeShieldEnergy ; jump allways + 684 57C2 UseAllShieldEnergy + 685 ; now calculate rest of energy for future tank energy decrease + 686 57C2 38 sec + 687 57C3 AD AE 43 lda EnergyDecrease + 688 57C6 FD A8 43 sbc ShieldEnergy,x + 689 57C9 A8 tay + 690 57CA A9 00 lda #0 + 691 57CC NotNegativeShieldEnergy + 692 57CC 9D A8 43 sta ShieldEnergy,x + 693 57CF 60 rts + 694 .endp + 695 + 696 ;--------------------------------- + 697 57D0 .proc Seppuku + 698 ;--------------------------------- + 699 57D0 A9 00 lda #0 + 700 57D2 85 64 sta ydraw+1 + 701 ; get position of the tank + 702 57D4 A6 6C ldx TankNr + 703 ; lda #0 ; turn off defense weapons when hara-kiring + 704 57D6 9D FD 43 sta ActiveDefenceWeapon,x + 705 57D9 9D A8 43 sta ShieldEnergy,x + 706 57DC 20 67 74 jsr SetupXYdraw + 707 57DF A9 01 lda #1 ; Missile + 708 57E1 20 3C 77 jsr ExplosionDirect + 709 57E4 4C 61 56 jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku + 710 .endp + 711 + 712 ;-------------------------------------------------- + 713 57E7 .proc GetRandomWind + 714 ;in: MaxWind (byte) + 715 ;out: Wind (word) + 716 ;uses: _ + 717 ;-------------------------------------------------- + 718 57E7 AD 1B D4 lda random + 719 57EA CD 0A 44 cmp MaxWind + 720 57ED B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again + 721 57EF 85 CE sta Wind + 722 57F1 A9 00 85 CF mva #$00 Wind+1 + 723 57F5 85 D0 sta Wind+2 + 724 57F7 85 D1 sta Wind+3 + 725 ; multiply Wind by 16 + 726 ; two bytes of Wind are treated as a decimal part of vx variable + 727 57F9 06 CE 26 CF 06 CE + :4 aslw Wind + 728 ; decide the direction + 729 5809 AD 1B D4 lda random + 730 580C 29 01 and #$01 + 731 580E F0 19 beq @+ + 732 5810 38 sec ; Wind = -Wind + 733 .rept 4 + 734 LDA #$00 + 735 SBC WIND+# + 736 STA WIND+# + 737 .endr +Source: REPT + 734 5811 A9 00 LDA #$00 + 734 5813 E5 CE SBC WIND+# + 734 5815 85 CE STA WIND+# + 734 5817 A9 00 LDA #$00 + 734 5819 E5 CF SBC WIND+# + 734 581B 85 CF STA WIND+# + 734 581D A9 00 LDA #$00 + 734 581F E5 D0 SBC WIND+# + 734 5821 85 D0 STA WIND+# + 734 5823 A9 00 LDA #$00 + 734 5825 E5 D1 SBC WIND+# + 734 5827 85 D1 STA WIND+# +Source: game.asm + 738 5829 60 @ rts + 739 .endp + 740 ;-------------------------------------------------- + 741 582A .proc MaxForceCalculate + 742 ; calculates max force for tank (tanknr in X) + 743 ; Energy of tank X in A + 744 ;-------------------------------------------------- + 745 582A 85 E8 sta L1 + 746 + 747 ;DATA L1,L2 + 748 ;Multiplication 8bit*8bit, + 749 ;result 16bit + 750 ;this algiorithm is a little longer than one in Ruszczyc 6502 book + 751 ;but it is faster + 752 + 753 582C A0 08 ldy #8 + 754 582E A9 00 lda #0 + 755 5830 18 clc + 756 5831 6A LP0 ror + 757 5832 66 E8 ror L1 + 758 5834 90 03 bcc B0 + 759 5836 18 clc + 760 5837 69 0A adc #10 ; (L2) multiplication by 10 + 761 5839 88 B0 dey + 762 583A D0 F5 bne LP0 + 763 583C 6A ror + 764 583D 66 E8 ror L1 + 765 583F 9D EB 43 sta MaxForceTableH,x + 766 5842 A5 E8 lda L1 + 767 5844 9D E5 43 sta MaxForceTableL,x + 768 5847 60 rts + 769 .endp + 770 + 771 ;-------------------------------------------------- + 772 5848 .proc WeaponCleanup + 773 ; cleaning of the weapon possesion tables + 774 ; 99 of Baby Missles and White Flags, all other weapons=0) + 775 ;-------------------------------------------------- + 776 5848 A2 2F ldx #(number_of_weapons - 1) + 777 584A A9 00 @ lda #$0 + 778 584C E0 20 cpx #ind_White_Flag_____ ; White Flag + 779 584E D0 02 bne no99 + 780 5850 A9 63 set99 lda #99 + 781 5852 9D 1E 45 no99 sta TanksWeapon1,x + 782 5855 9D 4E 45 sta TanksWeapon2,x + 783 5858 9D 7E 45 sta TanksWeapon3,x + 784 585B 9D AE 45 sta TanksWeapon4,x + 785 585E 9D DE 45 sta TanksWeapon5,x + 786 5861 9D 0E 46 sta TanksWeapon6,x + 787 5864 CA dex + 788 5865 F0 E9 beq set99 ; Baby Missile (index=0) + 789 5867 10 E1 bpl @- + 790 5869 60 rts + 791 .endp + 792 + 793 ;-------------------------------------------------- + 794 586A .proc Initialize + 795 ;Initialization sequence + 796 ;uses: temp, ... + 797 ;-------------------------------------------------- + 798 = 0072 deletePtr = temp + 799 + 800 ; clean variables + 801 586A A9 00 lda #0 + 802 586C 85 D7 sta escFlag + 803 586E 85 5D sta JoystickNumber + 804 5870 A8 tay + 805 5871 A9 73 85 72 A9 43 + mwa #variablesStart deletePtr + 806 5879 98 @ tya + 807 587A 91 72 sta (deletePtr),y + 808 587C E6 72 D0 02 E6 73 inw deletePtr + 809 5882 A5 73 C9 4F D0 04 + cpw deletePtr #variablesEnd + 810 588C D0 EB bne @- + 811 + 812 ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) + 813 588E A0 01 ldy #1 + 814 5890 8C 2C 44 sty TankShape+1 + 815 5893 8C 2F 44 sty TankShape+4 + 816 5896 C8 iny + 817 5897 8C 2D 44 sty TankShape+2 + 818 589A 8C 30 44 sty TankShape+5 + 819 + 820 + 821 589D A9 00 8D E6 48 A9 + mwa #1024 RandBoundaryHigh + 822 58A7 A9 FF 8D 0C 45 mva #$ff LastWeapon + 823 58AC 85 C5 sta HowMuchToFall + 824 58AE A9 01 85 A9 mva #1 color + 825 + 826 58B2 20 FB 58 jsr SetStandardBarrels + 827 58B5 20 48 58 jsr WeaponCleanup + 828 + 829 58B8 A9 4F 85 02 mva #>WeaponFont chbas + 830 + 831 ;parameter for old plot (unPlot) max 5 points + 832 58BC A2 04 ldx #4 + 833 58BE SetunPlots + 834 58BE A9 10 lda #display + 837 58C5 9D 97 44 sta oldplotH,x + 838 58C8 A9 00 lda #0 + 839 58CA 9D A6 44 sta oldply,x + 840 58CD A9 FF lda #$ff + 841 58CF 9D A1 44 sta oldora,x + 842 58D2 CA dex + 843 58D3 10 E9 bpl SetunPlots + 844 + 845 ;setting up P/M graphics + 846 58D5 A9 18 lda #>pmgraph + 847 58D7 85 02 sta pmbase + 848 58D9 A9 03 lda #$03 ; P/M on + 849 58DB 85 02 sta GRACTL + 850 58DD 20 62 75 jsr SetPMWidth + 851 58E0 A9 21 lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 + 852 58E2 85 02 sta GPRIOR + 853 58E4 20 46 75 jsr PMoutofScreen + 854 + 855 ;let the tanks be visible! + 856 58E7 A2 05 ldx #(maxPlayers-1) + 857 58E9 A9 63 lda #99 ; tank is visible + 858 58EB MakeTanksVisible + 859 58EB 9D AF 43 sta eXistenZ,x + 860 58EE CA dex + 861 58EF 10 FA bpl MakeTanksVisible + 862 + 863 58F1 A9 01 8D 14 45 mva #1 CurrentRoundNr ;we start from round 1 + 864 58F6 A9 06 85 9C mva #6 NTSCcounter + 865 + 866 58FA 60 rts + 867 .endp + 868 ;-------------------------------------------------- + 869 58FB .proc SetStandardBarrels + 870 ; set standart barrel length and deactivate Auto Defense + 871 ; for all tanks + 872 ;-------------------------------------------------- + 873 58FB A2 05 ldx #maxPlayers-1 + 874 58FD A9 06 @ lda #StandardBarrel ; standard barrel length + 875 58FF 9D F1 43 sta BarrelLength,x + 876 5902 A9 00 lda #$00 ; deactivate Auto Defense + 877 5904 9D 03 44 sta AutoDefenseFlag,x + 878 5907 CA dex + 879 5908 10 F3 bpl @- + 880 590A 60 rts + 881 .endp + 882 ;---------------------------------------------- + 883 /* .proc RandomizeSequence0 + 884 ldx #0 + 885 @ txa + 886 sta TankSequence,x + 887 inx + 888 cpx #MaxPlayers + 889 bne @- + 890 rts + 891 .endp */ + 891 + 892 ;-------------------------------------------------- + 893 590B .proc RandomizeSequence + 894 ; in: NumberOfPlayers + 895 ; out: TankSequence + 896 ; how: get random number lower than NumberOfPlayers + 897 ; put it in the first slot. + 898 ; get another random number lower than NumberOfPlayers + 899 ; check if was previously saved in first slot + 900 ; if not then save it in second slot + 901 ; repeat untill NumberOfPlayers + 902 + 903 590B A2 00 ldx #0 + 904 590D GetRandomAgain0 + 905 590D AD 1B D4 lda RANDOM + 906 5910 29 07 and #$07 ;NumberOfPlayers < 7 + 907 5912 C5 AE cmp NumberOfPlayers + 908 5914 B0 F7 bcs GetRandomAgain0 + 909 5916 9D 77 43 sta TankSequence,x + 910 ;now first slot is ready, nexts slots are handled + 911 ;in a more complicated way + 912 + 913 5919 GetRandomAgainX + 914 5919 AD 1B D4 lda RANDOM + 915 591C 29 07 and #$07 ;NumberOfPlayers < 7 + 916 591E C5 AE cmp NumberOfPlayers + 917 5920 B0 F7 bcs GetRandomAgainX + 918 + 919 ;now we have to check if the value was not used + 920 ;in previous slots + 921 + 922 5922 86 72 stx temp + 923 5924 A4 72 ldy temp + 924 5926 UsageLoop + 925 5926 D9 77 43 cmp TankSequence,y + 926 5929 F0 EE beq GetRandomAgainX ;apparently we have already used this value + 927 592B 88 dey + 928 592C 10 F8 bpl UsageLoop + 929 + 930 ;well, looks like this value is new! + 931 592E E8 inx + 932 592F 9D 77 43 sta TankSequence,x + 933 + 934 5932 86 72 stx temp + 935 5934 E6 72 A5 72 inc:lda temp ;x+1 + 936 + 937 5938 C5 AE cmp NumberOfPlayers + 938 593A D0 DD bne GetRandomAgainX + 939 593C 60 rts + 940 .endp + 941 ;---------------------------------------------- + 942 593D .proc RandomizeAngle + 943 ; routine returns in A + 944 ; a valid angle for the tank's barrel. + 945 ; X is not changed + 946 ;---------------------------------------------- + 947 + 948 ; lets randomize someting between 0 and 180 + 949 593D AD 1B D4 lda RANDOM + 950 5940 C9 B4 cmp #180 + 951 5942 B0 F9 bcs RandomizeAngle + 952 5944 60 rts + 953 .endp + 954 ;---------------------------------------------- + 955 5945 .proc RandomizeForce + 956 ; routine returns in ForceTable/L/H + 957 ; valid force of shooting for TankNr + 958 ; in X must be TankNr + 959 ; low and high randomize boundary passed as word value + 960 ; RandBoundaryLow + 961 ; RandBoundaryHigh + 962 ;---------------------------------------------- + 963 + 964 5945 AD 1B D4 lda RANDOM + 965 5948 85 74 sta temp2 + 966 594A AD 1B D4 lda RANDOM + 967 594D 29 03 and #%00000011 ;(0..1023) + 968 594F 85 75 sta temp2+1 + 969 + 970 5951 AD E5 48 C5 75 D0 + cpw RandBoundaryLow temp2 + 971 595D F0 02 B0 E4 seq:bcs RandomizeForce + 972 + 973 5961 AD E7 48 C5 75 D0 + cpw RandBoundaryHigh temp2 + 974 596D 90 D6 bcc RandomizeForce + 975 + 976 596F A5 74 lda temp2 + 977 5971 9D D9 43 sta ForceTableL,x + 978 5974 A5 75 lda temp2+1 + 979 5976 9D DF 43 sta ForceTableH,x + 980 + 981 ;--------- + 982 5979 LimitForce + 983 ; in X must be TankNr + 984 ; cuts force to MaxForceTable + 985 5979 BD EB 43 lda MaxForceTableH,x + 986 597C DD DF 43 cmp ForceTableH,x + 987 597F D0 06 bne @+ + 988 5981 BD E5 43 lda MaxForceTableL,x + 989 5984 DD D9 43 cmp ForceTableL,x + 990 5987 B0 0C @ bcs @+ + 991 + 992 5989 BD E5 43 lda MaxForceTableL,x + 993 598C 9D D9 43 sta ForceTableL,x + 994 598F BD EB 43 lda MaxForceTableH,x + 995 5992 9D DF 43 sta ForceTableH,x + 996 @ + 997 5995 60 rts + 998 + 999 .endp + 1000 ;---------------------------------------------- + 1001 5996 .proc Table2Force + 1002 ;---------------------------------------------- + 1003 5996 BD D9 43 lda ForceTableL,x + 1004 5999 85 A4 sta Force + 1005 599B BD DF 43 lda ForceTableH,x + 1006 599E 85 A5 sta Force+1 + 1007 59A0 60 rts + 1008 .endp + 1009 ;---------------------------------------------- + 1010 59A1 .proc MoveBarrelToNewPosition + 1011 ;---------------------------------------------- + 1012 59A1 A9 01 85 AA mva #1 Erase + 1013 59A5 20 48 6B jsr DrawTankNr.BarrelChange + 1014 59A8 A9 00 85 AA mva #0 Erase + 1015 59AC MoveBarrel + 1016 59AC A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1017 59B0 20 2C 6A jsr DrawTankNr + 1018 59B3 20 0F 66 jsr DisplayStatus.displayAngle + 1019 ; ldx TankNr + 1020 59B6 A9 01 85 AA mva #1 Erase + 1021 59BA 20 89 5A jsr WaitOneFrame + 1022 59BD 20 48 6B jsr DrawTankNr.BarrelChange + 1023 59C0 A9 00 85 AA mva #0 Erase + 1024 59C4 A5 D6 lda NewAngle + 1025 59C6 DD C3 48 cmp AngleTable,x + 1026 59C9 F0 0E beq BarrelPositionIsFine + 1027 59CB 90 06 bcc rotateLeft + 1028 59CD rotateRight ; older is lower + 1029 59CD FE C3 48 inc angleTable,x + 1030 59D0 4C AC 59 jmp MoveBarrel + 1031 59D3 rotateLeft ; older is bigger + 1032 59D3 DE C3 48 dec angleTable,x + 1033 59D6 4C AC 59 jmp MoveBarrel + 1034 59D9 BarrelPositionIsFine + 1035 59D9 20 2C 6A jsr DrawTankNr + 1036 59DC 60 rts + 1037 + 1038 .endp + 1039 + 1040 ;---------------------------------------------- + 1041 59DD .proc SortSequence ; + 1042 ;---------------------------------------------- + 1043 ; here we try to get a sequence of tanks for two + 1044 ; purposes: + 1045 ; 1. to make up shooting sequence for the next round (from down to top) + 1046 ; 2. to display game results more nicely (from top to down) + 1047 ; + 1048 ; I think I will go for a stupid bubble sort... + 1049 ; it is easy to test :) + 1050 ; + 1051 ; Results are in ResultsTable, in TankSequence (Sorted Table) we want to + 1052 ; have numbers of tanks from the worst to the best. + 1053 ; in other words, if ResultsTable=(5,4,65,23,3,6) + 1054 ; the TankSequence=(4,1,0,5,3,2) + 1055 ; let's assume initially the TankSequence=(0,1,2,3,4,5) + 1056 + 1057 59DD A2 00 ldx #0 + 1058 59DF SequenceStart + 1059 59DF 8A txa + 1060 59E0 9D 77 43 sta TankSequence,x + 1061 59E3 E8 inx + 1062 59E4 E0 06 cpx #MaxPlayers + 1063 59E6 D0 F7 bne SequenceStart + 1064 + 1065 ; we will need a TempResults (TR) table to fiddle with + 1066 59E8 A2 00 ldx #0 + 1067 59EA movetotemp + 1068 59EA BD BB 43 lda ResultsTable,x + 1069 59ED 9D C1 43 sta TempResults,x + 1070 59F0 E8 inx + 1071 59F1 E4 AE cpx NumberOfPlayers + 1072 59F3 D0 F5 bne movetotemp + 1073 + 1074 ; i=0:sortflag=0 + 1075 ;loop: + 1076 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers + 1077 ; or goto loop: + 1078 ; else + 1079 ; temp=TR(i): tempo=TankSequence(i) + 1080 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) + 1081 ; TR(i+1)=temp: TankSequence(i+1)=tempo + 1082 ; i=i+1 + 1083 ; sortflag=sortflag+1 + 1084 ; go loop: + 1085 ; if sortflag=0 then finished, else repeat... + 1086 ; + 1087 ; or something like this :) + 1088 59F5 A6 AE ldx NumberOfPlayers + 1089 59F7 CA dex + 1090 59F8 86 73 stx temp+1 ; for checking end of the loop only + 1091 + 1092 59FA Bubble + 1093 59FA A2 00 ldx #0 ;i=x + 1094 59FC 86 74 stx temp2 ; sortflag=temp2 + 1095 + 1096 59FE BubbleBobble + 1097 59FE BD C1 43 lda TempResults,x + 1098 5A01 DD C2 43 cmp TempResults+1,x + 1099 5A04 90 31 bcc nextishigher + 1100 5A06 D0 10 bne swapvalues + 1101 5A08 nextisequal + 1102 ; if results are equal, check Direct Hits + 1103 5A08 BC 77 43 ldy TankSequence,x + 1104 5A0B B9 C7 43 lda DirectHits,y + 1105 5A0E BC 78 43 ldy TankSequence+1,x + 1106 5A11 D9 C7 43 cmp DirectHits,y + 1107 ; + 1108 5A14 F0 21 beq nextishigher ; this is to block hangs when 2 equal values meet + 1109 5A16 90 1F bcc nextishigher + 1110 ;here we must swap values + 1111 ;because next is smaller than previous + 1112 5A18 swapvalues + 1113 5A18 85 72 sta temp + 1114 5A1A BD C2 43 lda TempResults+1,x + 1115 5A1D 9D C1 43 sta TempResults,x + 1116 5A20 A5 72 lda temp + 1117 5A22 9D C2 43 sta TempResults+1,x + 1118 ; + 1119 5A25 BD 77 43 lda TankSequence,x + 1120 5A28 85 72 sta temp + 1121 5A2A BD 78 43 lda TankSequence+1,x + 1122 5A2D 9D 77 43 sta TankSequence,x + 1123 5A30 A5 72 lda temp + 1124 5A32 9D 78 43 sta TankSequence+1,x + 1125 5A35 E6 74 inc temp2 + 1126 5A37 nextishigher + 1127 5A37 E8 inx + 1128 5A38 E4 73 cpx temp+1 ;cpx ^NumberOfPlayers-1 + 1129 5A3A D0 C2 bne BubbleBobble + 1130 + 1131 5A3C A5 74 lda temp2 + 1132 + 1133 5A3E D0 BA bne Bubble + 1134 + 1135 5A40 60 rts + 1136 .endp + 1137 ;-------------------------------------------------- + 1138 5A41 .proc SetWallsType + 1139 ;-------------------------------------------------- + 1140 5A41 A9 00 8D 0C 44 mva #0 WallsType + 1141 5A46 AD 47 41 lda OptionsTable+8 + 1142 5A49 C9 04 cmp #4 + 1143 5A4B F0 09 beq SetRandomWalls + 1144 5A4D 4A lsr + 1145 5A4E 6E 0C 44 ror WallsType + 1146 5A51 4A lsr + 1147 5A52 6E 0C 44 ror WallsType + 1148 5A55 60 rts + 1149 5A56 SetRandomWalls + 1150 5A56 AD 1B D4 lda random + 1151 5A59 29 C0 and #%11000000 + 1152 5A5B 8D 0C 44 sta WallsType + 1153 5A5E 60 rts + 1154 .endp + 1155 + 1156 .ENDIF + 236 ;-------------------------------------------------- + 237 + 238 + 239 ;-------------------------------------------------- + 240 5A5F .proc GetKey + 241 ; waits for pressing a key and returns pressed value in A + 242 ; when [ESC] is pressed, escFlag is set + 243 ; result: A=keycode + 244 ;-------------------------------------------------- + 245 5A5F 20 71 5A jsr WaitForKeyRelease + 246 5A62 A9 00 lda #0 + 247 5A64 85 D7 sta escFlag + 248 5A66 A9 FF lda #$ff + 249 5A68 60 rts + 250 .endp + 251 + 252 ;-------------------------------------------------- + 253 5A69 .proc getkeynowait + 254 ;-------------------------------------------------- + 255 5A69 20 71 5A jsr WaitForKeyRelease + 256 5A6C A5 02 lda kbcode + 257 5A6E 29 3F and #$3f ;CTRL and SHIFT ellimination + 258 5A70 60 rts + 259 .endp + 260 + 261 ;-------------------------------------------------- + 262 5A71 .proc WaitForKeyRelease + 263 ;-------------------------------------------------- + 264 5A71 StillWait + 265 5A71 60 rts + 266 .endp + 267 ;-------------------------------------------------- + 268 5A72 .proc IsKeyPressed + 269 ; result: A=0 - yes , A>0 - no + 270 ;-------------------------------------------------- + 271 5A72 A9 01 lda #1 + 272 5A74 60 rts + 273 .endp + 274 ;-------------------------------------------------- + 275 5A75 .proc DemoModeOrKey + 276 ; Waits for the key pressed if at least one human is playing. + 277 ; Otherwise, waits 3 seconds (demo mode). + 278 ;-------------------------------------------------- + 279 ;check demo mode + 280 5A75 A6 AE ldx numberOfPlayers + 281 5A77 CA dex + 282 5A78 checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + 283 5A78 BD 39 41 lda skillTable,x + 284 5A7B F0 09 beq peopleAreHere + 285 5A7D CA dex + 286 5A7E 10 F8 bpl checkForHuman + 287 ; no people, just wait a bit + 288 ;pause 150 + 289 5A80 A0 4B ldy #75 + 290 5A82 20 9D 5A jsr PauseYFrames + 291 5A85 60 rts + 292 5A86 peopleAreHere + 293 5A86 4C 5F 5A jmp getkey ; jsr:rts + 294 .endp + 295 + 296 ;-------------------------------------------------- + 297 5A89 MakeDarkScreen + 298 ;-------------------------------------------------- + 299 ; mva #0 dmactls ; dark screen + 300 ; and wait one frame :) + 301 ;-------------------------------------------------- + 302 5A89 .proc WaitOneFrame + 303 ;-------------------------------------------------- + 304 5A89 wait ; or waitRTC ? +Macro: WAIT [Source: MACRO.ASM] + 3 5A89 AD 12 D0 ?ze LDA $D012 + 4 5A8C C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) + 5 5A8E 90 F9 bcc ?ze + 6 5A90 E9 0A sbc #10 ; last lines correction + 7 5A92 CD 12 D0 ?wa cmp $D012 + 8 5A95 90 FB bcc ?wa + 9 5A97 CD 12 D0 ?wf cmp $D012 + 10 5A9A B0 FB bcs ?wf +Source: scorchC64.asm + 305 5A9C 60 rts + 306 .endp + 307 + 308 ;-------------------------------------------------- + 309 5A9D .proc PauseYFrames + 310 ; Y - number of frames to wait (divided by 2) + 311 ; pauses for maximally 510 frames (255 * 2) + 312 ;-------------------------------------------------- + 313 5A9D 20 89 5A @ jsr WaitOneFrame + 314 5AA0 20 89 5A jsr WaitOneFrame + 315 5AA3 88 dey + 316 5AA4 D0 F7 bne @- + 317 5AA6 60 rts + 318 .endp + 319 + 320 ;-------------------------------------------------- + 321 5AA7 .proc ShellDelay + 322 5AA7 AE 76 43 ldx flyDelay + 323 5AAA DelayLoop + 324 5AAA AD 12 D0 lda $d012 + 325 5AAD CD 12 D0 @ cmp $d012 + 326 5AB0 F0 FB beq @- + 327 5AB2 CA dex + 328 5AB3 D0 F5 bne DelayLoop + 329 5AB5 noShellDelay + 330 5AB5 60 rts + 331 .endp + 332 ;-------------------------------------------------- + 333 5AB6 .proc RmtSongSelect + 334 ; starting song line 0-255 to A reg + 335 ;-------------------------------------------------- + 336 5AB6 60 rts + 337 .endp + 338 5AB7 .proc CopyFromRom + 339 5AB7 60 rts + 340 .endp + 341 ;-------------------------------------------------- + 342 5AB8 icl 'C64/interrupts.asm' +Source: interrupts.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 = 0000 DLIinterruptGraph = 0 + 6 ;-------------------------------------------------- + 7 .macro SetDLI + 8 ; SetDLI #WORD + 9 ; Initialises Display List Interrupts + 10 LDY # <:1 + 11 LDX # >:1 + 12 jsr _SetDLIproc + 13 .endm + 14 5AB8 .proc _SetDLIproc + 15 ; LDA #$C0 + 16 ; STY VDSLST + 17 ; STX VDSLST+1 + 18 ; STA NMIEN + 19 5AB8 60 rts + 20 .endp + 21 + 22 .ENDIF + 343 ;---------------------------------------------- + 344 5AB9 icl 'constants.asm' +Source: constants.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ; initial values for some variables + 6 5AB9 initialvaluesStart + 7 5AB9 00 01 02 02 00 01 + I_OptionsTable .by 0,1,2,2,0,1,3,2,0 + 8 5AC2 0A I_RoundsInTheGame .by 10 ;how many rounds in the current game + 9 5AC3 4B I_seppukuVal .by 75 + 10 5AC4 03 I_mountainDeltaH .by 3 + 11 5AC5 FF I_mountainDeltaL .by $ff + 12 ;---------------------------------------------------- + 13 5AC6 I_LineHeader1 + 14 5AC6 03 00 32 2F 35 2E + dta d"# ROUND: " + 15 5ACF I_RoundNrDisplay + 16 5ACF 00 00 00 00 03 FF dta d" #", $ff + 17 = 001C initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes ! + 18 ;=================================================================================== + 19 ;==========================CONSTANT TABLES, do not erase!=========================== + 20 ;=================================================================================== + 21 + 22 5AD5 00 01 03 05 07 mountainsDeltaTableH .by 0,1,3,5,7 + 23 5ADA 1F 7F FF 7F FF mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff + 24 ;------------------------------------------------ + 25 5ADF LevelNameBeginL ; begins of level names + 26 5ADF 00 0A 14 .by NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) + 31 5AEB 00 00 00 .by >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) + 32 5AEE 00 00 00 .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) + 33 ;-------------- + 34 5AF1 TanksWeaponsTableL + 35 5AF1 1E 4E 7E AE DE 0E .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 + 38 ;-------------- + 39 5AFD XtankOffsetGO_L + 40 5AFD 06 38 6A 9C CE 00 .by 6,56,106,156,206,0 + 41 5B03 XtankOffsetGO_H + 42 5B03 00 00 00 00 00 01 .by 0,0,0,0,0,1 + 43 ;-----4x4 texts----- + 44 5B09 LineTop + 45 5B09 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%%)" + 46 ;# - vertical, () * +, % - horizontal + 47 5B17 LineBottom + 48 5B17 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%%+" + 49 5B25 LineEmpty + 50 5B25 03 00 00 00 00 00 + dta d"# #" + 51 5B33 LineHeader2 + 52 5B33 03 00 00 32 25 33 + dta d"# RESULTS #" + 53 5B41 LineGameOver + 54 5B41 03 00 27 21 2D 25 + dta d"# GAME OVER #" + 55 5B4F seppukuText + 56 5B4F 03 00 00 33 25 30 + dta d"# SEPPUKU! #" + 57 5B5D areYouSureText + 58 5B5D 03 00 33 35 32 25 + dta d"# SURE? Y/N #" + 59 5B6B lineClear + 60 5B6B 00 00 00 00 00 00 + dta d" " + 61 + 62 5B79 58 2A 96 CA 7A ED TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed + 63 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order + 64 5B7F 74 C4 24 E4 54 94 TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order + 65 ;----------- + 66 5B85 GradientAddrL + 67 5B85 BC BC 8B .by dliColorsFore, >dliColorsFore, >dliColorsFore2 + 70 5B8B dliColorsFore2 ; colors for NTSC + 71 5B8B 0A .by $0a ; one mountains color + 72 5B8C 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + 73 5B96 3A 1A 1A EA EA D8 + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 + 74 5BA0 dliColorsFore2PAL ; colors for PAL + 75 5BA0 0A .by $0a ; one mountains color + 76 5BA1 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a + 77 5BAB 3A 1A 1A EA EA C8 + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 + 78 + 79 ;----------- + 80 5BB5 pmtableL ; addressess of the P/M memory for 6 tanks + 81 5BB5 00 .by <(pmgraph+$400) + 82 5BB6 00 .by <(pmgraph+$500) + 83 5BB7 00 .by <(pmgraph+$600) + 84 5BB8 00 .by <(pmgraph+$700) + 85 5BB9 00 .by <(pmgraph+$300) ; this is a missile background + 86 5BBA 00 .by <(pmgraph+$300) ; this is a missile background + 87 5BBB pmtableH + 88 5BBB 1C .by >(pmgraph+$400) + 89 5BBC 1D .by >(pmgraph+$500) + 90 5BBD 1E .by >(pmgraph+$600) + 91 5BBE 1F .by >(pmgraph+$700) + 92 5BBF 1B .by >(pmgraph+$300) + 93 5BC0 1B .by >(pmgraph+$300) + 94 ;----------- + 95 5BC1 sintable + 96 5BC1 01 .by 1 + 97 5BC2 04 .by 4 + 98 5BC3 08 .by 8 + 99 5BC4 0D .by 13 + 100 5BC5 11 .by 17 + 101 5BC6 16 .by 22 + 102 5BC7 1A .by 26 + 103 5BC8 1F .by 31 + 104 5BC9 23 .by 35 + 105 5BCA 28 .by 40 + 106 5BCB 2C .by 44 + 107 5BCC 30 .by 48 + 108 5BCD 35 .by 53 + 109 5BCE 39 .by 57 + 110 5BCF 3D .by 61 + 111 5BD0 42 .by 66 + 112 5BD1 46 .by 70 + 113 5BD2 4A .by 74 + 114 5BD3 4F .by 79 + 115 5BD4 53 .by 83 + 116 5BD5 57 .by 87 + 117 5BD6 5B .by 91 + 118 5BD7 5F .by 95 + 119 5BD8 64 .by 100 + 120 5BD9 68 .by 104 + 121 5BDA 6C .by 108 + 122 5BDB 70 .by 112 + 123 5BDC 74 .by 116 + 124 5BDD 78 .by 120 + 125 5BDE 7C .by 124 + 126 5BDF 80 .by 128 + 127 5BE0 83 .by 131 + 128 5BE1 87 .by 135 + 129 5BE2 8B .by 139 + 130 5BE3 8F .by 143 + 131 5BE4 92 .by 146 + 132 5BE5 96 .by 150 + 133 5BE6 9A .by 154 + 134 5BE7 9D .by 157 + 135 5BE8 A1 .by 161 + 136 5BE9 A4 .by 164 + 137 5BEA A7 .by 167 + 138 5BEB AB .by 171 + 139 5BEC AE .by 174 + 140 5BED B1 .by 177 + 141 5BEE B5 .by 181 + 142 5BEF B8 .by 184 + 143 5BF0 BB .by 187 + 144 5BF1 BE .by 190 + 145 5BF2 C1 .by 193 + 146 5BF3 C4 .by 196 + 147 5BF4 C6 .by 198 + 148 5BF5 C9 .by 201 + 149 5BF6 CC .by 204 + 150 5BF7 CF .by 207 + 151 5BF8 D1 .by 209 + 152 5BF9 D4 .by 212 + 153 5BFA D6 .by 214 + 154 5BFB D9 .by 217 + 155 5BFC DB .by 219 + 156 5BFD DD .by 221 + 157 5BFE DF .by 223 + 158 5BFF E2 .by 226 + 159 5C00 E4 .by 228 + 160 5C01 E6 .by 230 + 161 5C02 E8 .by 232 + 162 5C03 E9 .by 233 + 163 5C04 EB .by 235 + 164 5C05 ED .by 237 + 165 5C06 EE .by 238 + 166 5C07 F0 .by 240 + 167 5C08 F2 .by 242 + 168 5C09 F3 .by 243 + 169 5C0A F4 .by 244 + 170 5C0B F6 .by 246 + 171 5C0C F7 .by 247 + 172 5C0D F8 .by 248 + 173 5C0E F9 .by 249 + 174 5C0F FA .by 250 + 175 5C10 FB .by 251 + 176 5C11 FC .by 252 + 177 5C12 FC .by 252 + 178 5C13 FD .by 253 + 179 5C14 FE .by 254 + 180 5C15 FE .by 254 + 181 5C16 FF .by 255 + 182 5C17 FF .by 255 + 183 5C18 FF .by 255 + 184 5C19 FF .by 255 + 185 5C1A FF .by 255 + 186 5C1B FF .by 255 ;anti self destruction byte + 187 + 188 ;linetableL + 189 ; :screenheight+1 .by <(display+screenBytes*#) + 190 ;linetableH + 191 ; :screenheight+1 .by >(display+screenBytes*#) + 192 ;---------------------------- + 193 5C1C bittable + 194 5C1C 80 40 20 10 08 04 + .by $80,$40,$20,$10,$08,$04,$02,$01 + 195 5C24 bittable2 + 196 5C24 7F BF DF EF F7 FB + .by $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe + 197 ;---------------------------- + 198 5C2C disktance ;tanks distance + 199 5C2C 00 00 .by 0,0 + 200 5C2E 6A .by screenwidth/3 + 201 5C2F 50 .by screenwidth/4 + 202 5C30 40 .by screenwidth/5 + 203 5C31 35 .by screenwidth/6 + 204 5C32 2D .by screenwidth/7 + 205 ;max number of players=6 + 206 + 207 ; this table is for deciding where a tank should slide + 208 ; accordingly to what is below the tank + 209 ; values in table mean that tank is moving to the left + 210 5C33 SlideLeftTable + 211 5C33 01 .BY %00000001 + 212 5C34 02 .BY %00000010 + 213 5C35 03 .BY %00000011 + 214 5C36 04 .BY %00000100 + 215 5C37 05 .BY %00000101 + 216 5C38 06 .BY %00000110 + 217 5C39 07 .BY %00000111 + 218 ; .BY %00001100 + 219 = 0007 SlideLeftTableLen = *-SlideLeftTable + 220 ;------------------------------------------------- + 221 5C3A TanksNamesDefault + 222 5C3A 11 73 74 0E 34 61 + dta d"1st.Tank" + 223 5C42 12 6E 64 0E 34 61 + dta d"2nd.Tank" + 224 5C4A 13 72 64 0E 34 61 + dta d"3rd.Tank" + 225 5C52 14 74 68 0E 34 61 + dta d"4th.Tank" + 226 5C5A 15 74 68 0E 34 61 + dta d"5th.Tank" + 227 5C62 16 74 68 0E 34 61 + dta d"6th.Tank" + 228 ;------------------------------------------------- + 229 5C6A 20 TankShapesTable .BYTE char_tank1___________ + 230 5C6B 24 .BYTE char_tank2___________ + 231 5C6C 2C .BYTE char_tank3___________ + 232 5C6D 28 .BYTE char_tank4___________ + 233 ;------------------------------------------------- + 234 5C6E WeaponPriceH ; weapons prices (tables with prices of weapons) + 235 5C6E 00 .by >price_Baby_Missile___ + 236 5C6F 00 .by >price_Missile________ + 237 5C70 00 .by >price_Baby_Nuke______ + 238 5C71 00 .by >price_Nuke___________ + 239 5C72 00 .by >price_LeapFrog_______ + 240 5C73 01 .by >price_Funky_Bomb_____ + 241 5C74 01 .by >price_MIRV___________ + 242 5C75 01 .by >price_Death_s_Head___ + 243 5C76 00 .by >price_Napalm_________ + 244 5C77 00 .by >price_Hot_Napalm_____ + 245 5C78 00 .by >price_Tracer_________ + 246 5C79 01 .by >price_Smoke_Tracer___ + 247 5C7A 00 .by >price_Baby_Roller____ + 248 5C7B 00 .by >price_Roller_________ + 249 5C7C 01 .by >price_Heavy_Roller___ + 250 5C7D 00 .by >price_Riot_Charge____ + 251 5C7E 00 .by >price_Riot_Blast_____ + 252 5C7F 01 .by >price_Riot_Bomb______ + 253 5C80 01 .by >price_Heavy_Riot_Bomb + 254 5C81 00 .by >price_Baby_Digger____ + 255 5C82 00 .by >price_Digger_________ + 256 5C83 00 .by >price_Heavy_Digger___ + 257 5C84 00 .by >price_Baby_Sandhog___ + 258 5C85 00 .by >price_Sandhog________ + 259 5C86 00 .by >price_Heavy_Sandhog__ + 260 5C87 00 .by >price_Dirt_Clod______ + 261 5C88 00 .by >price_Dirt_Ball______ + 262 5C89 00 .by >price_Ton_of_Dirt____ + 263 5C8A 01 .by >price_Liquid_Dirt____ + 264 5C8B 01 .by >price_Dirt_Charge____ + 265 5C8C 00 .by >price_Buy_me_________ + 266 5C8D 01 .by >price_Laser__________ + 267 5C8E 00 .by >price_White_Flag_____ + 268 5C8F 01 .by >price_Battery________ + 269 5C90 01 .by >price_Hovercraft_____ + 270 5C91 00 .by >price_Parachute______ + 271 5C92 03 .by >price_StrongParachute + 272 5C93 02 .by >price_Mag_Deflector__ + 273 5C94 00 .by >price_Shield_________ + 274 5C95 02 .by >price_Heavy_Shield___ + 275 5C96 04 .by >price_Force_Shield___ + 276 5C97 02 .by >price_Bouncy_Castle__ + 277 5C98 08 .by >price_Long_Barrel____ + 278 5C99 03 .by >price_Nuclear_Winter_ + 279 5C9A 01 .by >price_Lazy_Boy_______ + 280 5C9B 02 .by >price_Lazy_Darwin____ + 281 5C9C 00 .by >price_Auto_Defense___ + 282 5C9D 00 .by >price_Spy_Hard_______ + 283 5C9E WeaponPriceL + 284 5C9E 00 .by 0 + 5 + 6 = 0000 WeaponsListDL = 0 + 7 = 0000 NamesOfLevels = 0 + 8 ;---------------------------------------- + 9 ; this module contains routines used in text mode + 10 ; like shop and start-up options + 11 ;---------------------------------------- + 12 + 13 ;-------------------------------------------------- + 14 62E5 .proc Options + 15 ;-------------------------------------------------- + 16 ; start-up screen - options, etc. + 17 ; this function returns: + 18 ; - number of players (NumberOfPlayers) + 19 ; - money each player has on the beginning of the game (moneyL i moneyH) + 20 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight + 21 + 22 + 23 62E5 A2 08 ldx #$08 + 24 62E7 BD F1 62 @ lda Autoplay_OptionsTable,x + 25 62EA 9D 3F 41 sta OptionsTable,x + 26 62ED CA dex + 27 62EE 10 F7 bpl @- + 28 + 29 62F0 60 rts + 30 + 31 62F1 04 04 02 02 04 01 + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 + 32 + 33 .endp + 34 + 35 62FA .proc SelectNextGradient + 36 62FA AD 75 43 lda OptionsY ; if "Wind" option selected + 37 62FD C9 03 cmp #$03 + 38 62FF D0 07 bne NotWind + 39 6301 A5 5C lda WindChangeInRound ; wind change after each turn (not round only) flag + 40 6303 49 1F eor #$1f ; '?' character + 41 6305 85 5C sta WindChangeInRound + 42 6307 60 rts + 43 6308 NotWind + 44 6308 A4 59 ldy GradientNr + 45 630A C8 iny + 46 630B C0 03 cpy #$03 + 47 630D D0 02 bne NoGradientLoop + 48 630F A0 00 ldy #$00 + 49 6311 NoGradientLoop + 50 6311 84 59 sty GradientNr + 51 6313 B9 85 5B lda GradientAddrL,y + 52 6316 85 5A sta GradientColors + 53 6318 B9 88 5B lda GradientAddrH,y + 54 631B 85 5B sta GradientColors+1 + 55 631D 60 rts + 56 .endp + 57 + 58 ; -------------------------------------- + 59 ; Sets the appropriate variables based on the options table + 60 ; + 61 631E .proc SetVariablesFromOptions + 62 ;first option + 63 631E AC 3F 41 ldy OptionsTable + 64 6321 C8 iny + 65 6322 C8 iny + 66 6323 84 AE sty NumberOfPlayers ;1=1 player (but minimum is 2) + 67 + 68 ;second option (cash) + 69 + 70 + 71 6325 AC 40 41 ldy OptionsTable+1 + 72 6328 A2 00 ldx #0 + 73 @ + 74 632A B9 D1 A2 lda CashOptionL,y + 75 632D 9D 84 43 sta moneyL,x + 76 6330 B9 D6 A2 lda CashOptionH,y + 77 6333 9D 7E 43 sta moneyH,x + 78 6336 E8 inx + 79 6337 E4 AE cpx NumberOfPlayers + 80 6339 D0 EF bne @- + 81 + 82 ;third option (gravity) + 83 633B AC 41 41 ldy OptionsTable+2 + 84 633E B9 DB A2 lda GravityTable,y + 85 6341 85 E0 sta gravity + 86 + 87 ;fourth option (wind) + 88 6343 AC 42 41 ldy OptionsTable+3 + 89 6346 B9 E0 A2 lda MaxWindTable,y + 90 6349 8D 0A 44 sta MaxWind + 91 + 92 ;fifth option (no of rounds) + 93 634C AC 43 41 ldy OptionsTable+4 + 94 634F B9 E5 A2 lda RoundsTable,y + 95 6352 8D 48 41 sta RoundsInTheGame + 96 + 97 ;6th option (shell speed) + 98 6355 AC 44 41 ldy OptionsTable+5 + 99 6358 B9 F4 A2 lda flyDelayTable,y + 100 635B 8D 76 43 sta flyDelay + 101 + 102 ;7th option (Airstrike after how many missess) + 103 635E AC 45 41 ldy OptionsTable+6 + 104 6361 B9 F9 A2 lda seppukuTable,y + 105 6364 8D 49 41 sta seppukuVal + 106 + 107 ;8th option (how aggressive are mountains) + 108 6367 AC 46 41 ldy OptionsTable+7 + 109 636A B9 D5 5A lda mountainsDeltaTableH,y + 110 636D 8D 4A 41 sta mountainDeltaH + 111 6370 B9 DA 5A lda mountainsDeltaTableL,y + 112 6373 8D 4B 41 sta mountainDeltaL + 113 + 114 + 115 6376 60 rts + 116 .endp + 117 + 118 ;------------------------------------------- + 119 ; call of the purchase (and activate) screens for each tank + 120 6377 .proc CallPurchaseForEveryTank + 121 + 122 6377 A9 00 85 6C mva #0 TankNr + 123 637B 85 E4 sta isInventory + 124 @ + 125 637D A6 6C ldx TankNr + 126 637F BD 39 41 lda SkillTable,x + 127 6382 F0 06 beq ManualPurchase + 128 6384 20 A3 94 jsr PurchaseAI ; remember to make ActivateAI :) !!! + 129 6387 4C A3 63 jmp AfterManualPurchase + 130 638A ManualPurchase + 131 638A BD 25 44 lda JoyNumber,x + 132 638D 85 5D sta JoystickNumber ; set joystick port for player + 133 638F A9 00 85 E4 mva #0 isInventory + 134 6393 20 C0 63 jsr Purchase ; purchase weapons + 135 6396 24 D7 bit escFlag + 136 6398 10 01 60 spl:rts + 137 639B 20 AC 63 jsr DefensivesActivate ; activate weapons + 138 639E 24 D7 bit escFlag + 139 63A0 10 01 60 spl:rts + 140 63A3 AfterManualPurchase + 141 63A3 E6 6C A5 6C inc:lda TankNr + 142 63A7 C5 AE cmp NumberOfPlayers + 143 63A9 D0 D2 bne @- + 144 63AB 60 rts + 145 .endp + 146 ;-------------------------------------------------- + 147 63AC .proc DefensivesActivate + 148 ;-------------------------------------------------- + 149 ; This proc call Inventory and set Defensives activation first + 150 + 151 63AC A9 ED 85 00 A9 4C + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + 152 63B4 A9 FF 85 E4 mva #$ff IsInventory + 153 63B8 A9 80 8D 0D 45 mva #%10000000 WhichList + 154 ; offensive weapon - 0, defensive - %10000000 + 155 63BD 4C C5 63 jmp Purchase.GoToActivation + 156 .endp + 157 + 158 + 159 ;-------------------------------------------------- + 160 63C0 .proc Purchase ; + 161 ;-------------------------------------------------- + 162 ; In tanknr there is a number of the tank (player) + 163 ; that is buying weapons now (from 0). + 164 ; Rest of the data is taken from appropriate tables + 165 ; and during the purchase these tables are modified. + 166 + 167 + 168 ; we are clearing list of the weapons + 169 63C0 A9 00 8D 0D 45 mva #$00 WhichList + 170 ; offensive weapon - 0, deffensive - %10000000 + 171 63C5 GoToActivation + 172 63C5 60 rts + 173 + 174 .endp + 175 + 176 ; ----------------------------------------------------- + 177 63C6 .proc EnterPlayerNames + 178 ;entering names of players + 179 + 180 63C6 A9 00 85 6C mva #0 TankNr + 181 63CA 85 02 sta COLBAKS ; set color of background + 182 63CC AA @ tax + 183 63CD BD 7F 5B lda TankStatusColoursTable,x + 184 63D0 85 02 sta COLOR2 ; set color of player name line + 185 63D2 20 E6 63 jsr EnterPlayerName + 186 63D5 24 D7 bit escFlag + 187 63D7 10 01 60 spl:rts + 188 63DA 20 46 A2 jsr CheckTankCheat + 189 63DD E6 6C inc TankNr + 190 63DF A5 6C lda TankNr + 191 63E1 C5 AE cmp NumberOfPlayers + 192 63E3 D0 E7 bne @- + 193 63E5 60 rts + 194 .endp + 195 ; ----------------------------------------------------- + 196 63E6 .proc EnterPlayerName + 197 ; in: TankNr + 198 ; Out: TanksNames, SkillTable + 199 + 200 ; this little thing is for choosing Player's skill (if computer) + 201 ; and entering his name + 202 ; If no name entered, there should be name "1st Tank", etc. + 203 ; Default tanks names are in table TanksNamesDefault + 204 ; ----------------------------------------------------- + 205 + 206 ; + 207 + 208 63E6 EndOfNick + 209 ; storing name of the player and its level + 210 + 211 ; level of the computer opponent goes to + 212 ; the table of levels (difficulties) + 213 63E6 A6 6C ldx tanknr + 214 63E8 A9 06 lda #6 ; Spoiler + 215 63EA 85 E5 sta DifficultyLevel + 216 63EC 9D 39 41 sta skilltable,x + 217 63EF F0 05 beq NotRobot + 218 63F1 A9 03 lda #$03 ; shape for robotanks + 219 63F3 9D 2B 44 sta TankShape,x + 220 63F6 NotRobot + 221 ; storing name of the tank in the right space + 222 ; (without cursor!) + 223 63F6 A0 00 ldy #$00 + 224 63F8 8A txa ; ldx TankNr + 225 63F9 0A asl + 226 63FA 0A asl + 227 63FB 0A asl ; 8 chars per name + 228 63FC AA tax ; in X where to put new name + 229 + 230 63FD A9 16 85 9E mva #sfx_next_player sfx_effect + 231 + 232 + 233 ; check if all chars are empty (" ") + 234 6401 A0 07 ldy #7 + 235 6403 A9 00 lda #0 + 236 6405 09 00 @ ora #0 ; NameAdr,y + 237 6407 29 7F and #$7F ; remove inverse (Cursor) + 238 6409 88 dey + 239 640A 10 F9 bpl @- + 240 640C A8 tay + 241 640D F0 10 beq MakeDefaultName + 242 + 243 640F A0 00 ldy #0 + 244 6411 nextchar04 + 245 6411 A9 00 lda #0 ; NameAdr,y + 246 6413 29 7F and #$7f ; remove inverse (Cursor) + 247 6415 9D 09 41 sta tanksnames,x + 248 6418 E8 inx + 249 6419 C8 iny + 250 641A C0 08 cpy #$08 + 251 641C D0 F3 bne nextchar04 + 252 641E 60 rts + 253 641F MakeDefaultName + 254 641F nextchar05 + 255 641F BD 3A 5C lda tanksnamesDefault,x + 256 6422 9D 09 41 sta tanksnames,x + 257 6425 E8 inx + 258 6426 C8 iny + 259 6427 C0 08 cpy #$08 + 260 6429 D0 F4 bne nextchar05 + 261 642B 60 rts + 262 .endp + 263 ;-------------------------------------------------- + 264 642C .proc displaydec5 ;decimal (word), displayposition (word) + 265 ;-------------------------------------------------- + 266 ; displays decimal number as in parameters (in text mode) + 267 ; leading zeroes are removed + 268 ; the range is (00000..65565 - two bytes) + 269 + 270 642C A0 04 ldy #4 ; there will be 5 digits + 271 642E NextDigit + 272 642E A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times + 273 6430 A9 00 lda #$00 + 274 6432 Rotate000 + 275 6432 aslw decimal +Macro: ASLW [Source: MACRO.ASM] + 1 6432 06 AC ASL DECIMAL + 2 6434 26 AD ROL DECIMAL+1 +Source: textproc.asm + 276 6436 2A rol ; scroll dividee + 277 ; (as highest byte - additional - byte is A) + 278 6437 C9 0A cmp #10 ; divider + 279 6439 90 04 bcc TooLittle000 ; if A is smaller than divider + 280 ; there is nothing to substract + 281 643B E9 0A sbc #10 ; divider + 282 643D E6 AC inc decimal ; lowest bit set to 1 + 283 ; because it is 0 and this is the fastest way + 284 643F CA TooLittle000 dex + 285 6440 D0 F0 bne Rotate000 ; and Rotate 16 times, Result will be in decimal + 286 6442 AA tax ; and the rest in A + 287 ; (and it goes to X because + 288 ; it is our decimal digit) + 289 6443 BD AA 60 lda digits,x + 290 6446 99 0F 45 sta decimalresult,y + 291 6449 88 dey + 292 644A 10 E2 bpl NextDigit ; Result again /10 and we have next digit + 293 + 294 ;rightnumber + 295 ; displaying without leading zeroes (if zeroes exist then display space at this position) + 296 644C A0 00 ldy #0 + 297 644E A2 00 ldx #0 ; digit flag (cut leading zeroes) + 298 6450 displayloop + 299 6450 B9 0F 45 lda decimalresult,y + 300 6453 E0 00 cpx #0 + 301 6455 D0 0D bne noleading0 + 302 6457 C0 04 cpy #4 + 303 6459 F0 09 beq noleading0 ; if 00000 - last 0 must stay + 304 645B CD AA 60 cmp zero + 305 645E D0 04 bne noleading0 + 306 6460 A9 00 lda #space + 307 6462 F0 01 beq displaychar ; space = 0 ! + 308 6464 noleading0 + 309 6464 E8 inx ; set flag (no leading zeroes to cut) + 310 6465 displaychar + 311 6465 91 76 sta (displayposition),y + 312 6467 nexdigit + 313 6467 C8 iny + 314 6468 C0 05 cpy #5 + 315 646A D0 E4 bne displayloop + 316 + 317 646C 60 rts + 318 .endp + 319 ;-------------------------------------------------- + 320 646D .proc displaybyte ;decimal (byte), displayposition (word) + 321 ;-------------------------------------------------- + 322 ; displays decimal number as in parameters (in text mode) + 323 ; leading zeores are removed + 324 ; the range is (00..99 - one byte) + 325 + 326 646D A0 01 ldy #1 ; there will be 2 digits + 327 646F NextDigit2 + 328 646F A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times + 329 6471 A9 00 lda #$00 + 330 6473 Rotate001 + 331 6473 06 AC asl decimal + 332 6475 2A rol ; scroll dividee + 333 ; (as highest byte - additional - byte is A) + 334 6476 C9 0A cmp #10 ; divider + 335 6478 90 04 bcc TooLittle001 ; if A is smaller than divider + 336 ; there is nothing to substract + 337 647A E9 0A sbc #10 ; divider + 338 647C E6 AC inc decimal ; because it is 0 and this is the fastest way + 339 647E CA TooLittle001 dex + 340 647F D0 F2 bne Rotate001 ; and Rotate 8 times, Result will be in decimal + 341 6481 AA tax ; and the rest in A + 342 ; (and it goes to X because + 343 ; it is our decimal digit) + 344 6482 BD AA 60 lda digits,x + 345 6485 99 0F 45 sta decimalresult,y + 346 6488 88 dey + 347 6489 10 E4 bpl NextDigit2 ; Result again /10 and we have next digit + 348 + 349 ; now cut leading zeroes (02 goes 2) + 350 648B AD 0F 45 lda decimalresult + 351 648E CD AA 60 cmp zero + 352 6491 D0 05 bne decimalend1 + 353 6493 A9 00 lda #space + 354 6495 8D 0F 45 sta decimalresult + 355 + 356 6498 decimalend1 + 357 ; displaying + 358 6498 A0 01 ldy #1 + 359 649A displayloop1 + 360 649A B9 0F 45 lda decimalresult,y + 361 649D 91 76 sta (displayposition),y + 362 649F 88 dey + 363 64A0 10 F8 bpl displayloop1 + 364 + 365 64A2 60 rts + 366 .endp + 367 + 368 ;-------------------------------- + 369 64A3 .proc DisplayResults ; + 370 ;displays results of the round + 371 ;using 4x4 font + 372 + 373 + 374 64A3 A9 FF 85 DB mva #$ff plot4x4color + 375 + 376 ;centering the result screen + 377 64A7 A9 44 85 B2 mva #((ScreenHeight/2)-(8*4)) ResultY + 378 + 379 + 380 ;upper frame + 381 64AB A5 B2 85 D8 mva ResultY LineYdraw + 382 64AF 20 E8 65 jsr TL4x4_top + 383 + 384 64B2 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 385 + 386 ;Header1 + 387 ;Displays round number + 388 64B9 AD 14 45 lda CurrentRoundNr + 389 64BC CD 48 41 cmp RoundsInTheGame + 390 64BF F0 26 beq GameOver4x4 + 391 + 392 64C1 85 AC sta decimal + 393 64C3 A9 55 85 76 A9 41 + mwa #RoundNrDisplay displayposition + 394 64CB 20 6D 64 jsr displaybyte ;decimal (byte), displayposition (word) + 395 + 396 64CE A9 4C 85 B3 A9 41 + mwa #LineHeader1 LineAddress4x4 + 397 64D6 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 398 64DE A5 B2 85 D8 mva ResultY LineYdraw + 399 64E2 20 6E 73 jsr TypeLine4x4 + 400 64E5 F0 1E beq @+ ;unconditional jump, because TypeLine4x4 ends with beq + 401 + 402 64E7 GameOver4x4 + 403 64E7 RmtSong song_round_over +Macro: RMTSONG [Source: scorchC64.asm] + 1 64E7 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 +Source: textproc.asm + 404 64E9 A9 41 85 B3 A9 5B + mwa #LineGameOver LineAddress4x4 + 405 64F1 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 406 64F9 A5 B2 85 D8 mva ResultY LineYdraw + 407 64FD 20 6E 73 jsr TypeLine4x4 + 408 6500 A9 01 8D 7D 43 mva #1 GameIsOver + 409 + 410 @ + 411 6505 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 412 + 413 ;Empty line + 414 650C A5 B2 85 D8 mva ResultY LineYdraw + 415 6510 20 FB 65 jsr TL4x4_empty + 416 + 417 6513 A5 B2 18 69 02 85 + adb ResultY #2 ;next line + 418 + 419 + 420 ;Header2 + 421 651A A9 33 85 B3 A9 5B + mwa #LineHeader2 LineAddress4x4 + 422 6522 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 423 652A A5 B2 85 D8 mva ResultY LineYdraw + 424 652E 20 6E 73 jsr TypeLine4x4 + 425 + 426 6531 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 427 + 428 ;Empty line + 429 6538 A5 B2 85 D8 mva ResultY LineYdraw + 430 653C 20 FB 65 jsr TL4x4_empty + 431 + 432 653F A5 B2 38 E9 02 85 + sbb ResultY #2 ;next line (was empty) + 433 + 434 6546 A6 AE ldx NumberOfPlayers ;we start from the highest (best) tank + 435 6548 CA dex ;and it is the last one + 436 6549 8E EA 48 stx ResultOfTankNr ;in TankSequence table + 437 + 438 654C A9 09 85 78 A9 41 + mwa #TanksNames tempXROLLER + 439 + 440 6554 ResultOfTheNextPlayer + 441 6554 AE EA 48 ldx ResultOfTankNr ;we are after a round, so we can use TankNr + 442 6557 BD 77 43 lda TankSequence,x ;and we keep here real number if the tank + 443 655A 85 6C sta TankNr ;for which we are displaying results + 444 + 445 + 446 + 447 + 448 655C A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 449 + 450 ;there are at least 2 players, so we can safely + 451 ;start displaying the result + 452 + 453 6563 A9 03 lda #3 ;it means | + 454 6565 8D 5A 41 sta ResultLineBuffer + 455 + 456 6568 A4 6C ldy TankNr + 457 656A B9 BB 43 lda ResultsTable,y + 458 656D 85 AC sta decimal + 459 656F A9 00 85 AD mva #0 decimal+1 + 460 6573 A9 62 85 76 A9 41 + mwa #(ResultLineBuffer+8) displayposition + 461 657B 20 2C 64 jsr displaydec5 ;decimal (byte), displayposition (word) + 462 + 463 ; overwrite the second digit of the points (max 255) + 464 ;it means ":" + 465 657E A9 1A 8D 63 41 mva #26 ResultLineBuffer+9 + 466 + 467 6583 A2 00 ldx #0 + 468 6585 A5 6C lda TankNr + 469 6587 0A asl + 470 6588 0A asl ; times 8, because it is lengtgh + 471 6589 0A asl ; of the names of the tanks + 472 658A A8 tay + 473 + 474 658B TankNameCopyLoop + 475 658B B1 78 lda (tempXROLLER),y ;XROLLER is not working now + 476 658D 29 3F and #$3f ;always CAPITAL letters + 477 658F E8 inx + 478 6590 9D 5A 41 sta ResultLineBuffer,x + 479 6593 C8 iny + 480 6594 E0 08 cpx #8 ; end of name + 481 6596 D0 F3 bne TankNameCopyLoop + 482 ; last letter of tank name overwrites first digit of the points (max 255) + 483 + 484 + 485 ;just after the digits + 486 ;it means | + 487 6598 A9 03 8D 67 41 mva #$3 ResultLineBuffer+13 + 488 + 489 ;result line display + 490 659D A9 5A 85 B3 A9 41 + mwa #ResultLineBuffer LineAddress4x4 + 491 65A5 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 492 65AD A5 B2 85 D8 mva ResultY LineYdraw + 493 65B1 20 6E 73 jsr TypeLine4x4 + 494 + 495 65B4 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 496 + 497 ;Empty line + 498 65BB A5 B2 85 D8 mva ResultY LineYdraw + 499 65BF 20 FB 65 jsr TL4x4_empty + 500 + 501 65C2 CE EA 48 dec ResultOfTankNr + 502 65C5 30 0A bmi FinishResultDisplay + 503 + 504 65C7 A5 B2 38 E9 02 85 + sbb ResultY #2 ;distance between lines is smaller + 505 + 506 65CE 4C 54 65 jmp ResultOfTheNextPlayer + 507 + 508 65D1 FinishResultDisplay + 509 65D1 A5 B2 85 D8 mva ResultY LineYdraw + 510 ;jmp TL4x4_bottom ; just go + 511 .endp + 512 + 513 65D5 .proc TL4x4_bottom + 514 ;bottom of the frame + 515 65D5 A9 17 85 B3 A9 5B + mwa #LineBottom LineAddress4x4 + 516 65DD A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 517 65E5 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 518 .endp + 519 + 520 65E8 .proc TL4x4_top + 521 ;bottom of the frame + 522 65E8 A9 09 85 B3 A9 5B + mwa #LineTop LineAddress4x4 + 523 65F0 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 524 65F8 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 525 .endp + 526 + 527 65FB .proc TL4x4_empty + 528 ;empty frame + 529 65FB A9 25 85 B3 A9 5B + mwa #LineEmpty LineAddress4x4 + 530 6603 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw + 531 660B 4C 6E 73 jmp TypeLine4x4 ; jsr:rts + 532 .endp + 533 + 534 ;-------------------------------------------------- + 535 660E .proc GameOverScreen + 536 ;-------------------------------------------------- + 537 + 538 660E 60 rts + 539 .endp + 540 ;------------------------------------------------- + 541 660F .proc PutTankNameOnScreen + 542 ;------------------------------------------------- + 543 + 544 .endp + 545 ;------------------------------------------------- + 546 660F .proc DisplayStatus + 547 ;------------------------------------------------- + 548 660F DisplayAngle + 549 660F A6 6C ldx TankNr + 550 6611 60 rts + 551 .endp + 552 ;------------------------------------------------- + 553 + 554 + 555 .endif + 347 ;---------------------------------------------- + 348 6612 icl 'grafproc.asm' +Source: grafproc.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 + 6 ;-------------------------------------------------- + 7 6612 .proc draw ;;fuxxing good draw :) + 8 ; xdraw,ydraw (word) - coordinates of first point + 9 ; xbyte,ybyte (word) - coordinates of last point + 10 ;-------------------------------------------------- + 11 ;creditz to Dr Jankowski / MIM U.W. + 12 ; (xi,yi)-----(xk,yk) + 13 ;20 DX=XK-XI + 14 ;30 DY=YK-YI + 15 ;40 DP=2*DY + 16 ;50 DD=2*(DY-DX) + 17 ;60 DI=2*DY-DX + 18 ;70 REPEAT + 19 ;80 IF DI>=0 + 20 ;90 DI=DI+DD + 21 ;100 YI=YI+1 + 22 ;110 ELSE + 23 ;120 DI=DI+DP + 24 ;130 ENDIF + 25 ;140 plot XI,YI + 26 ;150 XI=XI+1 + 27 ;160 UNTIL XI=XK + 28 + 29 + 30 ; begin: xdraw,ydraw - end: xbyte,ybyte + 31 ; let's store starting coordinates + 32 ; will be needed, because everything is calculated relatively + 33 6612 A9 FF 85 E1 85 E2 mwa #$ffff LineLength + 34 6618 A5 61 85 7A A5 62 + mwa xdraw xtempDRAW + 35 6620 A5 63 85 7C A5 64 + mwa ydraw ytempDRAW + 36 + 37 ; if line goes our of the screen we are not drawing it, but... + 38 + 39 6628 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 40 6632 B0 14 bcs DrawOutOfTheScreen + 41 6634 A5 66 C9 01 D0 04 + cpw xbyte #screenwidth + 42 663E B0 08 bcs DrawOutOfTheScreen + 43 ;cpw ydraw #screenheight + 44 ;bcs DrawOutOfTheScreen + 45 ;cpw ybyte #screenheight + 46 ;bcc DrawOnTheScreen + 47 6640 A5 64 lda ydraw+1 + 48 6642 30 04 bmi DrawOutOfTheScreen + 49 6644 A5 68 lda ybyte+1 + 50 6646 10 01 bpl DrawOnTheScreen + 51 6648 DrawOutOfTheScreen + 52 ;jsr DrawJumpPad + 53 6648 60 rts + 54 6649 DrawOnTheScreen + 55 ; constant parameters + 56 ; XI=0 ,YI=0 + 57 6649 A9 00 lda #0 + 58 664B 85 81 sta XI + 59 664D 85 82 sta XI+1 + 60 664F 85 84 sta YI + 61 6651 85 85 sta YI+1 + 62 + 63 ; setting the direction controll bits + 64 6653 A5 64 C5 68 D0 04 + cpw ydraw ybyte + 65 665D 90 14 bcc LineDown + 66 ; here one line up + 67 ; we are setting bit 0 + 68 665F A9 01 85 DF mva #1 HowToDraw ;here we can because it's first operation + 69 ; we are subctracting Yend from Ybegin (reverse order) + 70 ; DY=YI-YK + 71 6663 38 A5 63 E5 67 85 + sbw ydraw ybyte DY + 72 6670 4C 84 66 jmp CheckDirectionX + 73 6673 LineDown + 74 ; one line down here + 75 ; we are setting bit 0 + 76 6673 A9 00 85 DF mva #0 HowToDraw ;here we can because it's first operation + 77 ; substract Ybegin from Yend (normal order) + 78 ; DY=YK-YI + 79 6677 38 A5 67 E5 63 85 + sbw ybyte ydraw DY + 80 6684 CheckDirectionX + 81 6684 A5 62 C5 66 D0 04 + cpw xdraw xbyte + 82 668E 90 16 bcc LineRight + 83 ; here goes line to the left + 84 ; we set bit 1 + 85 + 86 6690 A5 DF lda HowToDraw + 87 6692 09 02 ora #$02 + 88 6694 85 DF sta HowToDraw + 89 ; substract Xend from Xbegin (reverse) + 90 ; DX=XI-XK + 91 6696 38 A5 61 E5 65 85 + sbw xdraw xbyte DX + 92 66A3 4C B3 66 jmp CheckDirectionFactor + 93 66A6 LineRight + 94 ; here goes one line to the right + 95 ; we clear bit 0 + 96 ; we can do nothing because the bit is cleared! + 97 + 98 ;lda HowToDraw + 99 ;and #$FD + 100 ;sta HowToDraw + 101 + 102 ; substracting Xbegin from Xend (normal way) + 103 ; DX=XK-XI + 104 66A6 38 A5 65 E5 61 85 + sbw xbyte xdraw DX + 105 66B3 CheckDirectionFactor + 106 ; here we check Direction Factor + 107 ; I do not know if we are using proper English word + 108 ; but the meaning is 'a' in y=ax+b + 109 + 110 ; lda DX + 111 ; we already have DX in A + 112 66B3 A5 8C C5 8E D0 04 + cpw DX DY + 113 + 114 66BD 90 0B bcc SwapXY + 115 ; 'a' factor is fire, so we copy parameters + 116 ; XK=DX + 117 66BF A5 8B 85 87 A5 8C + mwa DX XK + 118 ; and clearing bit 2 + 119 ; and bit 2 clear + 120 ; (is not needed because already cleared) + 121 ;lda HowToDraw + 122 ;and #$FB + 123 ;sta HowToDraw + 124 66C7 4C E8 66 jmp LineParametersReady + 125 66CA SwapXY + 126 ; not this half of a quarter! - parameters must be swapped + 127 ; XK=DY + 128 ; DY=DX + 129 ; DX=XK - because DY is there so DY and DX are swapped + 130 ; YK ... not used + 131 66CA A5 8D 85 87 A5 8E + mwa DY XK + 132 66D2 A5 8B 85 8D A5 8C + mwa DX DY + 133 66DA A5 87 85 8B A5 88 + mwa XK DX + 134 + 135 ; and let's set bit 2 + 136 66E2 A5 DF lda HowToDraw + 137 66E4 09 04 ora #$04 + 138 66E6 85 DF sta HowToDraw + 139 66E8 LineParametersReady + 140 ; let's check if length is not zero + 141 66E8 A5 8B lda DX + 142 66EA 05 8C ora DX+1 + 143 66EC 05 8D ora DY + 144 66EE 05 8E ora DY+1 + 145 66F0 D0 07 bne NotOnePoint + 146 ; length=0 + 147 66F2 85 E1 sta LineLength + 148 66F4 85 E2 sta LineLength+1 + 149 66F6 4C 39 68 jmp EndOfDraw + 150 + 151 66F9 NotOnePoint + 152 ; here we have DX,DY,XK and we know which operations + 153 ; are to be performed with these factors when doing PLOT + 154 ; (accordingly to given bits of 'HowToDraw') + 155 ; Now we must calculate DP, DD and DI + 156 ; DP=2*DY + 157 ; DD=2*(DY-DX) + 158 ; DI=2*DY-DX + 159 + 160 66F9 A5 8D 85 93 A5 8E + mwa DY DP + 161 6701 aslw DP +Macro: ASLW [Source: MACRO.ASM] + 1 6701 06 93 ASL DP + 2 6703 26 94 ROL DP+1 +Source: grafproc.asm + 162 + 163 6705 38 A5 8D E5 8B 85 + sbw DY DX DD + 164 6712 aslw DD +Macro: ASLW [Source: MACRO.ASM] + 1 6712 06 8F ASL DD + 2 6714 26 90 ROL DD+1 +Source: grafproc.asm + 165 + 166 6716 A5 8D 85 91 A5 8E + mwa DY DI + 167 671E aslw DI +Macro: ASLW [Source: MACRO.ASM] + 1 671E 06 91 ASL DI + 2 6720 26 92 ROL DI+1 +Source: grafproc.asm + 168 6722 38 A5 91 E5 8B 85 + sbw DI DX + 169 + 170 672F DrawLoop + 171 ; REPEAT + 172 ; IF DI>=0 + 173 672F A5 92 lda DI+1 + 174 6731 30 16 bmi DINegative + 175 ; DI=DI+DD + 176 ; YI=YI+1 + 177 6733 18 A5 91 65 8F 85 + adw DI DD + 178 6740 E6 84 D0 02 E6 85 inw YI + 179 6746 4C 56 67 jmp drplot + 180 6749 DINegative + 181 ; ELSE + 182 ; DI=DI+DP + 183 6749 18 A5 91 65 93 85 + adw DI DP + 184 + 185 6756 drplot ; Our plot that checks how to calculate pixels. + 186 ; In xtempDRAW and ycircle there are begin coordinates + 187 ; of our line + 188 ; First we check the 'a' factor (like in y=ax+b) + 189 ; If necessary we swap XI and YI + 190 ; (as we can not change XI and YI we move XI to temp2 + 191 ; and YI to temp) + 192 + 193 + 194 6756 A5 DF lda HowToDraw + 195 6758 29 04 and #$04 + 196 675A D0 13 bne SwappedXY + 197 675C A5 81 85 72 A5 82 + mwa XI temp + 198 6764 A5 84 85 74 A5 85 + mwa YI temp2 + 199 676C 4C 7F 67 jmp CheckPlotY + 200 676F SwappedXY + 201 676F A5 81 85 74 A5 82 + mwa XI temp2 + 202 6777 A5 84 85 72 A5 85 + mwa YI temp + 203 677F CheckPlotY + 204 677F A5 DF lda HowToDraw + 205 6781 29 01 and #01 + 206 6783 D0 10 bne LineGoesUp + 207 ; here we know that line goes down and we are not changing Y + 208 6785 18 A5 74 65 7C 85 + adw temp2 ytempDRAW ydraw ; YI + 209 6792 4C A2 67 jmp CheckPlotX + 210 6795 LineGoesUp + 211 ; line goes up here - we are reversing Y + 212 6795 38 A5 7C E5 74 85 + sbw ytempDRAW temp2 ydraw ; YI + 213 67A2 CheckPlotX + 214 67A2 A5 DF lda HowToDraw + 215 67A4 29 02 and #02 + 216 67A6 D0 10 bne LineGoesLeft + 217 ; here we know that line goes right and we are not changing X + 218 67A8 18 A5 72 65 7A 85 + adw temp xtempDRAW xdraw ; XI + 219 67B5 4C C5 67 jmp PutPixelinDraw + 220 67B8 LineGoesLeft + 221 ; line goes left - we are reversing X + 222 67B8 38 A5 7A E5 72 85 + sbw xtempDRAW temp xdraw ; XI + 223 67C5 PutPixelinDraw + 224 + 225 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) + 226 67C5 2C 73 43 bit drawFunction + 227 67C8 10 0D bpl @+ + 228 67CA E6 E1 D0 02 E6 E2 inw LineLength + 229 67D0 24 60 bit Vdebug + 230 67D2 30 4D bmi MeasureVisualisation + 231 67D4 4C 24 68 jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff + 232 @ + 233 67D7 50 48 bvc @+ + 234 67D9 DrawCheck + 235 67D9 A5 E3 lda tracerflag + 236 67DB 0D 8A 44 ora SmokeTracerFlag + 237 67DE yestrace + 238 67DE F0 03 beq notrace + 239 67E0 20 14 76 jsr plot + 240 67E3 notrace + 241 ;aftertrace + 242 ;key + 243 67E3 A5 BF lda HitFlag + 244 67E5 D0 37 bne StopHitChecking + 245 + 246 67E7 CheckCollisionDraw + 247 ; checking collision! + 248 67E7 A5 64 lda ydraw+1 + 249 67E9 30 33 bmi StopHitChecking + 250 + 251 67EB 20 84 8E jsr CheckCollisionWithTank + 252 67EE A5 BF lda HitFlag + 253 67F0 D0 2C bne StopHitChecking + 254 + 255 67F2 18 clc + 256 67F3 A5 61 lda xdraw + 257 67F5 69 3E adc #mountaintable + 261 67FD 85 73 sta temp+1 + 262 + 263 67FF A0 00 ldy #0 + 264 6801 A5 63 lda ydraw + 265 6803 D1 72 cmp (temp),y + 266 6805 90 17 bcc StopHitChecking + 267 + 268 6807 A5 61 85 C1 A5 62 + mwa xdraw XHit + 269 680F B1 72 lda (temp),y + 270 6811 38 sec + 271 6812 E9 01 sbc #1 + 272 6814 8D 5F 44 sta YHit + 273 6817 8C 60 44 sty YHit+1 + 274 681A A9 FF 85 BF mva #$ff HitFlag + 275 681E StopHitChecking + 276 681E 4C 24 68 jmp ContinueDraw + 277 @ + 278 6821 MeasureVisualisation + 279 6821 20 14 76 jsr plot + 280 + 281 6824 ContinueDraw + 282 ; XI=XI+1 + 283 ; UNTIL XI=XK + 284 6824 E6 81 D0 02 E6 82 inw XI + 285 682A A5 82 C5 88 D0 04 + cpw XI XK + 286 6834 F0 03 4C 2F 67 jne DrawLoop + 287 + 288 6839 EndOfDraw + 289 6839 A5 7A 85 61 A5 7B + mwa xtempDRAW xdraw + 290 6841 A5 7C 85 63 A5 7D + mwa ytempDRAW ydraw + 291 6849 60 rts + 292 .endp + 293 + 294 ;-------------------------------------------------- + 295 684A .proc circle ;fxxxing good circle drawing :) + 296 ; xdraw,ydraw (word) - coordinates of circle center + 297 ; radius (byte) - radius of circle + 298 ;-------------------------------------------------- + 299 ;Turbo Basic source + 300 ; R=30 + 301 ; XC=0:YC=R + 302 ; FX=0:FY=8*R:FS=4*R+3 + 303 ; WHILE FX0 + 308 ; FS=FS-FX-4 + 309 ; ELSE + 310 ; YC=YC-1 + 311 ; FY=FY-8 + 312 ; FS=FS-FX-4+FY + 313 ; ENDIF + 314 ; WEND + 315 ; splot8 + 316 + 317 684A A5 61 85 B3 A5 62 + mwa xdraw xcircle + 318 6852 A5 63 85 B5 A5 64 + mwa ydraw ycircle + 319 + 320 685A A9 00 85 70 85 71 mwa #0 xc + 321 6860 A5 AB 85 8A mva radius yc + 322 6864 A9 00 85 83 mva #0 fx + 323 6868 A5 AB 85 86 mva radius fy + 324 686C 06 86 asl FY + 325 686E 06 86 asl FY + 326 6870 A5 86 85 89 mva FY FS + 327 6874 06 86 asl FY + 328 6876 18 clc + 329 6877 A5 89 lda FS + 330 6879 69 03 adc #3 + 331 687B 85 89 sta FS + 332 + 333 687D circleloop + 334 687D A5 83 lda FX + 335 687F C5 86 cmp FY + 336 6881 B0 34 bcs endcircleloop + 337 6883 20 CB 68 jsr splot8 + 338 6886 E6 70 inc XC + 339 + 340 6888 18 clc + 341 6889 A5 83 lda FX + 342 688B 69 08 adc #8 + 343 688D 85 83 sta FX + 344 + 345 688F A5 89 lda FS + 346 6891 F0 0C beq else01 + 347 6893 30 0A bmi else01 + 348 6895 38 sec + 349 6896 E5 83 sbc FX + 350 6898 E9 04 sbc #4 + 351 689A 85 89 sta FS + 352 689C 4C B4 68 jmp endif01 + 353 689F else01 + 354 689F C6 8A dec YC + 355 68A1 38 sec + 356 68A2 A5 86 lda FY + 357 68A4 E9 08 sbc #8 + 358 68A6 85 86 sta FY + 359 + 360 68A8 A5 89 lda FS + 361 68AA 38 sec + 362 68AB E5 83 sbc FX + 363 68AD E9 04 sbc #4 + 364 68AF 18 clc + 365 68B0 65 86 adc FY + 366 68B2 85 89 sta FS + 367 68B4 endif01 + 368 68B4 4C 7D 68 jmp circleloop + 369 68B7 endcircleloop + 370 + 371 68B7 20 CB 68 jsr splot8 + 372 + 373 68BA A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 374 68C2 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 375 68CA 60 rts + 376 .endp + 377 ;---- + 378 68CB .proc splot8 + 379 ; plot xcircle+XC,ycircle+YC + 380 ; plot xcircle+XC,ycircle-YC + 381 ; plot xcircle-XC,ycircle-YC + 382 ; plot xcircle-XC,ycircle+YC + 383 + 384 ; plot xcircle+YC,ycircle+XC + 385 ; plot xcircle+YC,ycircle-XC + 386 ; plot xcircle-YC,ycircle-XC + 387 ; plot xcircle-YC,ycircle+XC + 388 + 389 68CB 18 clc + 390 68CC A5 B3 lda xcircle + 391 68CE 65 70 adc XC + 392 68D0 85 61 sta xdraw + 393 68D2 A5 B4 lda xcircle+1 + 394 68D4 69 00 adc #0 + 395 68D6 85 62 sta xdraw+1 + 396 ;clc + 397 68D8 A5 B5 lda ycircle + 398 68DA 65 8A adc YC + 399 68DC 85 63 sta ydraw + 400 68DE 8D 61 44 sta tempcir + 401 68E1 A5 B6 lda ycircle+1 + 402 68E3 69 00 adc #$00 + 403 68E5 85 64 sta ydraw+1 + 404 68E7 8D 62 44 sta tempcir+1 + 405 68EA 20 14 76 jsr plot + 406 + 407 68ED 38 sec + 408 68EE A5 B5 lda ycircle + 409 68F0 E5 8A sbc YC + 410 68F2 85 63 sta ydraw + 411 68F4 A5 B6 lda ycircle+1 + 412 68F6 E9 00 sbc #$00 + 413 68F8 85 64 sta ydraw+1 + 414 68FA 20 14 76 jsr plot + 415 + 416 68FD 38 sec + 417 68FE A5 B3 lda xcircle + 418 6900 E5 70 sbc XC + 419 6902 85 61 sta xdraw + 420 6904 A5 B4 lda xcircle+1 + 421 6906 E9 00 sbc #0 + 422 6908 85 62 sta xdraw+1 + 423 690A 20 14 76 jsr plot + 424 + 425 690D AD 61 44 lda tempcir + 426 6910 85 63 sta ydraw + 427 6912 AD 62 44 lda tempcir+1 + 428 6915 85 64 sta ydraw+1 + 429 6917 20 14 76 jsr plot + 430 ;--- + 431 691A 18 clc + 432 691B A5 B3 lda xcircle + 433 691D 65 8A adc yC + 434 691F 85 61 sta xdraw + 435 6921 A5 B4 lda xcircle+1 + 436 6923 69 00 adc #0 + 437 6925 85 62 sta xdraw+1 + 438 ;clc + 439 6927 A5 B5 lda ycircle + 440 6929 65 70 adc xC + 441 692B 85 63 sta ydraw + 442 692D 8D 61 44 sta tempcir + 443 6930 A5 B6 lda ycircle+1 + 444 6932 69 00 adc #$00 + 445 6934 85 64 sta ydraw+1 + 446 6936 8D 62 44 sta tempcir+1 + 447 6939 20 14 76 jsr plot + 448 + 449 693C 38 sec + 450 693D A5 B5 lda ycircle + 451 693F E5 70 sbc xC + 452 6941 85 63 sta ydraw + 453 6943 A5 B6 lda ycircle+1 + 454 6945 E9 00 sbc #$00 + 455 6947 85 64 sta ydraw+1 + 456 6949 20 14 76 jsr plot + 457 + 458 694C 38 sec + 459 694D A5 B3 lda xcircle + 460 694F E5 8A sbc yC + 461 6951 85 61 sta xdraw + 462 6953 A5 B4 lda xcircle+1 + 463 6955 E9 00 sbc #0 + 464 6957 85 62 sta xdraw+1 + 465 6959 20 14 76 jsr plot + 466 + 467 695C AD 61 44 lda tempcir + 468 695F 85 63 sta ydraw + 469 6961 AD 62 44 lda tempcir+1 + 470 6964 85 64 sta ydraw+1 + 471 6966 20 14 76 jsr plot + 472 + 473 6969 60 RTS + 474 .endp + 475 + 476 ;-------------------------------*------------------ + 477 696A .proc placetanks + 478 ;-------------------------------------------------- + 479 696A A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 + 480 696C A9 00 lda #0 + 481 @ + 482 ; clearing the tables with coordinates of the tank + 483 ; it is necessary, because randomizing checks + 484 ; if the given tank is already placed + 485 ; after check if its position is not (0,0) + 486 + 487 ; I will be honest with you - I have no idea + 488 ; what the above comment was intending to mean :) + 489 + 490 696E 9D 0D 44 sta XtankstableL,x + 491 6971 9D 13 44 sta XtankstableH,x + 492 6974 9D 19 44 sta Ytankstable,x + 493 6977 CA dex + 494 6978 10 F4 bpl @- + 495 + 496 + 497 697A A9 00 8D D6 44 8D + mwa #0 temptankX + 498 6982 A9 00 8D D8 44 mva #0 temptankNr ;player number + 499 6987 StillRandomize + 500 6987 A6 AE ldx NumberOfPlayers + 501 6989 AD 1B D4 lda random + 502 698C 29 07 and #$07 + 503 698E A8 tay + 504 698F C4 AE cpy NumberOfPlayers + 505 6991 B0 F4 bcs StillRandomize + 506 6993 B9 0D 44 lda xtankstableL,y + 507 6996 D0 EF bne StillRandomize + 508 6998 B9 13 44 lda xtankstableH,y + 509 699B D0 EA bne StillRandomize + 510 ; here we know that we got a random number + 511 ; of the tank that is not in use + 512 ; this number is in Y + 513 + 514 699D 18 clc + 515 699E AD D6 44 lda temptankX + 516 69A1 7D 2C 5C adc disktance,x + 517 69A4 8D D6 44 sta temptankX + 518 69A7 99 0D 44 sta xtankstableL,y + 519 69AA 90 03 bcc NotHigherByte03 + 520 69AC EE D7 44 inc temptankX+1 + 521 69AF NotHigherByte03 + 522 69AF AD D7 44 lda temptankX+1 + 523 69B2 99 13 44 sta xtankstableH,y + 524 69B5 EE D8 44 INC temptankNr + 525 69B8 AE D8 44 ldx temptankNr + 526 69BB E4 AE Cpx NumberOfPlayers + 527 69BD D0 C8 bne StillRandomize + 528 + 529 ; getting random displacements relative to even positions + 530 69BF A2 00 ldx #$00 + 531 69C1 StillRandomize02 + 532 69C1 AD 1B D4 lda random + 533 69C4 29 1F and #$1f ; maximal displacement is 31 pixels + 534 + 535 69C6 18 clc + 536 69C7 7D 0D 44 adc xtankstableL,x + 537 69CA 9D 0D 44 sta xtankstableL,x + 538 69CD 90 03 bcc NotHigherByte02 + 539 69CF FE 13 44 inc xtankstableH,x + 540 69D2 NotHigherByte02 + 541 ; and we deduct 15 to make the displacement work two ways + 542 69D2 38 sec + 543 69D3 BD 0D 44 lda xtankstableL,x + 544 69D6 E9 0F sbc #$0f + 545 ; and clear lowest bit to be sure that the X coordinate is even + 546 ; (this is to have P/M background look nice) + 547 ; "AND" does not change "Carry" bit. + 548 ; x correction for P/M + 549 ; -- + 550 .IF XCORRECTION_FOR_PM = 1 + 551 and #$fe + 552 .ENDIF + 553 ; -- + 554 69D8 9D 0D 44 sta xtankstableL,x + 555 69DB B0 03 bcs NotHigherByte01 + 556 69DD DE 13 44 dec xtankstableH,x + 557 69E0 NotHigherByte01 + 558 + 559 69E0 E8 inx + 560 69E1 E4 AE Cpx NumberOfPlayers + 561 69E3 D0 DC bne StillRandomize02 + 562 69E5 60 rts + 563 + 564 ; during calculating heights of thw mountains + 565 ; check if the tank is not somewhere around + 566 ; if so, make horizontal line 8 pixels long + 567 69E6 CheckTank + 568 69E6 A6 AE ldx NumberOfPlayers + 569 69E8 CA dex + 570 69E9 CheckNextTank + 571 69E9 BD 0D 44 lda xtankstableL,x + 572 69EC C5 61 cmp xdraw + 573 69EE D0 17 bne UnequalTanks + 574 69F0 BD 13 44 lda xtankstableH,x + 575 69F3 C5 62 cmp xdraw+1 + 576 69F5 D0 10 bne UnequalTanks + 577 69F7 A5 63 lda ydraw + 578 ;sec + 579 ;sbc #$01 ; minus 1, because it was 1 pixel too high + 580 69F9 9D 19 44 sta ytankstable,x ; what's the heck is that????!!!! + 581 69FC A9 07 8D D4 44 mva #7 deltaX + 582 6A01 A9 00 85 C3 85 C4 mwa #0 delta + 583 6A07 UnequalTanks + 584 6A07 CA dex + 585 6A08 10 DF bpl CheckNextTank + 586 6A0A 60 rts + 587 .endp + 588 + 589 ;------------------------------------------------- + 590 6A0B .proc ClearTanks + 591 6A0B 20 46 75 jsr PMoutofScreen + 592 6A0E A9 01 85 AA mva #1 Erase ; erase tanks flag + 593 .endp + 594 ;-- + 595 6A12 .proc drawtanks + 596 ;------------------------------------------------- + 597 6A12 A5 6C lda TankNr + 598 6A14 48 pha + 599 6A15 A2 00 ldx #$00 + 600 6A17 86 6C stx TankNr + 601 + 602 6A19 DrawNextTank + 603 6A19 20 2C 6A jsr drawtanknr + 604 6A1C E6 6C inc TankNr + 605 6A1E A6 6C ldx TankNr + 606 6A20 E4 AE Cpx NumberOfPlayers + 607 6A22 D0 F5 bne DrawNextTank + 608 + 609 6A24 68 pla + 610 6A25 85 6C sta TankNr + 611 + 612 6A27 A9 00 85 AA mva #0 Erase ; no erase tanks flag + 613 6A2B 60 rts + 614 .endp + 615 ;--------- + 616 6A2C .proc DrawTankNr + 617 6A2C A6 6C ldx tankNr + 618 ; let's check the energy + 619 6A2E BD AF 43 lda eXistenZ,x + 620 6A31 D0 21 bne SkipHidingPM ; if energy=0 then no tank + 621 + 622 ; hide P/M + 623 6A33 BD A2 A2 lda TanksPMOrder,x + 624 6A36 AA tax + 625 6A37 A9 00 lda #0 + 626 6A39 E0 04 cpx #$4 ; 5th tank is defferent + 627 6A3B D0 06 bne No5thTankHide + 628 6A3D 85 06 sta hposp0+4 + 629 6A3F 85 07 sta hposp0+5 + 630 6A41 F0 0C beq @+ + 631 6A43 No5thTankHide + 632 6A43 E0 05 cpx #$5 ; 6th tank is defferent + 633 6A45 D0 06 bne No6thTankHide + 634 6A47 85 08 sta hposp0+6 + 635 6A49 85 09 sta hposp0+7 + 636 6A4B F0 02 beq @+ + 637 6A4D No6thTankHide + 638 6A4D 95 02 sta hposp0,x + 639 @ + 640 6A4F A6 6C ldx TankNr + 641 6A51 4C 56 6B jmp DoNotDrawTankNr + 642 6A54 SkipHidingPM + 643 + 644 6A54 BD 2B 44 lda TankShape,x + 645 6A57 AA tax + 646 6A58 BC 6A 5C ldy TankShapesTable,x + 647 6A5B A6 6C ldx TankNr + 648 6A5D BD C3 48 lda AngleTable,x + 649 6A60 C9 5B cmp #91 ; left or right tank shape + 650 6A62 B0 02 bcs LeftTank + 651 6A64 C8 C8 :2 iny ; right tank + 652 6A66 LeftTank + 653 6A66 84 69 sty CharCode + 654 6A68 DrawTankNrX + 655 6A68 A6 6C ldx tanknr + 656 6A6A 20 67 74 jsr SetupXYdraw + 657 + 658 6A6D 20 E7 70 jsr TypeChar + 659 6A70 A5 AA lda Erase + 660 6A72 F0 03 4C F9 6A jne noTankNoPM + 661 ; now P/M graphics on the screen (only for 5 tanks) + 662 ; horizontal position + 663 6A77 A6 6C ldx TankNr + 664 6A79 BD A2 A2 lda TanksPMOrder,x + 665 6A7C AA tax + 666 6A7D A5 61 85 65 A5 62 + mwa xdraw xbyte + 667 6A85 rorw xbyte ; divide by 2 (carry does not matter) +Macro: RORW [Source: MACRO.ASM] + 1 6A85 66 66 ROR XBYTE+1 + 2 6A87 66 65 ROR XBYTE +Source: grafproc.asm + 668 6A89 A5 65 lda xbyte + 669 6A8B 18 clc + 670 6A8C 69 2C adc #PMOffsetX ; P/M to graphics offset + 671 6A8E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent + 672 6A90 D0 09 bne No5thTank + 673 6A92 18 clc + 674 6A93 69 04 adc #$04 ; missile offset offset + 675 6A95 85 06 sta hposp0+4 + 676 6A97 85 07 sta hposp0+5 + 677 6A99 D0 0F bne NoMissile + 678 6A9B No5thTank + 679 6A9B E0 05 cpx #$5 ; 6th tank are joined missiles and offset is defferent + 680 6A9D D0 09 bne Tanks1to4 + 681 6A9F 18 clc + 682 6AA0 69 04 adc #$04 ; missile offset offset + 683 6AA2 85 08 sta hposp0+6 + 684 6AA4 85 09 sta hposp0+7 + 685 6AA6 D0 02 bne NoMissile + 686 6AA8 Tanks1to4 + 687 6AA8 95 02 sta hposp0,x + 688 + 689 6AAA NoMissile + 690 ; vertical position + 691 6AAA BD B5 5B lda pmtableL,x + 692 6AAD 85 65 sta xbyte + 693 6AAF BD BB 5B lda pmtableH,x + 694 6AB2 85 66 sta xbyte+1 + 695 + 696 ; calculate start position of the tank + 697 6AB4 A5 63 lda ydraw + 698 6AB6 18 clc + 699 6AB7 69 2A adc #PMOffsetY + 700 6AB9 85 72 sta temp + 701 6ABB A0 00 ldy #$00 + 702 6ABD E0 05 cpx #$5 + 703 6ABF B0 1D bcs PMForTank6 + 704 ; clear sprite and put 3 lines on the tank at the same time + 705 6AC1 A2 03 ldx #3 ; three lines of PM + 706 6AC3 ClearPM + 707 6AC3 C4 72 cpy temp + 708 6AC5 D0 0C bne ZeroesToGo + 709 6AC7 B1 65 @ lda (xbyte),y + 710 6AC9 29 F0 and #%11110000 + 711 6ACB 09 0F ora #%00001111 ; (2 bits set) we set on two pixels in three lines + 712 6ACD 91 65 sta (xbyte),y + 713 6ACF 88 dey + 714 6AD0 CA dex + 715 6AD1 D0 F4 bne @- + 716 6AD3 ZeroesToGo + 717 6AD3 B1 65 lda (xbyte),y + 718 6AD5 29 F0 and #%11110000 + 719 6AD7 91 65 sta (xbyte),y + 720 6AD9 88 dey + 721 6ADA D0 E7 bne ClearPM + 722 6ADC F0 1B beq NoPlayerMissile + 723 6ADE PMForTank6 + 724 ; clear sprite and put 3 lines on the tank at the same time + 725 6ADE A2 03 ldx #3 ; three lines of PM + 726 6AE0 ClearPM6 + 727 6AE0 C4 72 cpy temp + 728 6AE2 D0 0C bne ZeroesToGo6 + 729 6AE4 B1 65 @ lda (xbyte),y + 730 6AE6 29 0F and #%00001111 + 731 6AE8 09 F0 ora #%11110000 ; (2 bits set) we set on two pixels in three lines + 732 6AEA 91 65 sta (xbyte),y + 733 6AEC 88 dey + 734 6AED CA dex + 735 6AEE D0 F4 bne @- + 736 6AF0 ZeroesToGo6 + 737 6AF0 B1 65 lda (xbyte),y + 738 6AF2 29 0F and #%00001111 + 739 6AF4 91 65 sta (xbyte),y + 740 6AF6 88 dey + 741 6AF7 D0 E7 bne ClearPM6 + 742 + 743 6AF9 NoPlayerMissile + 744 6AF9 noTankNoPM + 745 6AF9 A0 01 ldy #$01 + 746 6AFB A5 AA lda Erase + 747 6AFD F0 01 beq @+ + 748 6AFF 88 dey + 749 6B00 84 A9 @ sty color + 750 ; draw defensive weapons like shield ( tank number in X ) + 751 ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char + 752 6B02 A6 6C ldx TankNr + 753 6B04 BD FD 43 lda ActiveDefenceWeapon,x + 754 6B07 C9 26 cmp #ind_Shield_________ ; one shot shield + 755 6B09 F0 16 beq DrawTankSh + 756 6B0B C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute + 757 6B0D F0 21 beq DrawTankShieldBold + 758 6B0F C9 27 cmp #ind_Heavy_Shield___ ; shield with energy + 759 6B11 F0 1D beq DrawTankShieldBold + 760 6B13 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence + 761 6B15 F0 10 beq DrawTankShieldWihHorns + 762 6B17 C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector + 763 6B19 F0 0C beq DrawTankShieldWihHorns + 764 6B1B C9 20 cmp #ind_White_Flag_____ ; White Flag + 765 6B1D F0 1A beq DrawTankFlag + 766 6B1F D0 27 bne NoShieldDraw + 767 6B21 DrawTankSh + 768 6B21 20 86 6B jsr DrawTankShield + 769 6B24 4C 48 6B jmp NoShieldDraw + 770 6B27 DrawTankShieldWihHorns + 771 6B27 20 86 6B jsr DrawTankShield + 772 6B2A 20 F7 6B jsr DrawTankShieldHorns + 773 6B2D 4C 48 6B jmp NoShieldDraw + 774 6B30 DrawTankShieldBold + 775 6B30 20 86 6B jsr DrawTankShield + 776 6B33 20 3C 6C jsr DrawTankShieldBoldLine + 777 6B36 4C 48 6B jmp NoShieldDraw + 778 6B39 DrawTankFlag + 779 6B39 A9 1E lda #char_flag____________ ; flag symbol + 780 6B3B 85 69 sta CharCode + 781 6B3D BD 19 44 lda Ytankstable,x + 782 6B40 38 sec + 783 6B41 E9 08 sbc #8 + 784 6B43 85 63 sta ydraw + 785 6B45 20 E7 70 jsr TypeChar + 786 6B48 NoShieldDraw + 787 6B48 BarrelChange + 788 6B48 A0 01 ldy #$01 + 789 6B4A A5 AA lda Erase + 790 6B4C F0 01 beq @+ + 791 6B4E 88 dey + 792 6B4F 84 A9 @ sty color + 793 6B51 20 7B 74 jsr DrawBarrel + 794 6B54 A6 6C ldx TankNr + 795 6B56 DoNotDrawTankNr + 796 6B56 60 rts + 797 .endp + 798 + 799 ; ------------------------------------- + 800 6B57 .proc FlashTank + 801 ; ------------------------------------- + 802 ; number of blinking tank in TankNr + 803 6B57 A9 12 85 89 mva #18 fs ; temp, how many times flash the tank + 804 6B5B tankflash_loop + 805 6B5B A5 02 lda CONSOL ; turbo mode + 806 6B5D 29 01 and #%00000001 ; START KEY + 807 6B5F D0 04 A9 01 85 89 sne:mva #1 fs ; finish it + 808 6B65 A9 01 85 AA mva #1 Erase + 809 6B69 A6 6C ldx TankNr + 810 6B6B 20 54 6A jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! + 811 ;PAUSE 2 + 812 6B6E A0 01 ldy #1 + 813 6B70 20 9D 5A jsr PauseYFrames + 814 6B73 A9 00 85 AA mva #0 Erase + 815 6B77 A6 6C ldx TankNr + 816 6B79 20 54 6A jsr DrawTankNr.SkipHidingPM + 817 ;PAUSE 2 + 818 6B7C A0 01 ldy #1 + 819 6B7E 20 9D 5A jsr PauseYFrames + 820 6B81 C6 89 dec fs + 821 6B83 D0 D6 jne tankflash_loop + 822 6B85 60 rts + 823 .endp + 824 + 825 ;-------------------------------------------------- + 826 6B86 .proc DrawTankShield + 827 ; X - tank number + 828 ; if use DrawInPosition entry point then: + 829 ; xdraw, ydraw - coordinates left LOWER corner of Tank char + 830 ; values remain there after a DrawTankNr proc. + 831 ; + 832 ; this proc change xdraw, ydraw and temp! + 833 ;-------------------------------------------------- + 834 6B86 38 A5 61 E9 03 85 + sbw xdraw #$03 ; 3 pixels to left + 835 ; draw left vertical line of shield ( | ) + 836 6B91 A9 07 85 72 mva #7 temp ; strange !!! + 837 @ + 838 6B95 20 14 76 jsr plot + 839 6B98 A5 63 D0 02 C6 64 + .nowarn dew ydraw + 840 6BA0 C6 72 dec temp + 841 6BA2 D0 F1 bne @- + 842 ; draw left oblique line of shield ( / ) + 843 6BA4 A9 03 85 72 mva #3 temp + 844 @ + 845 6BA8 20 14 76 jsr plot + 846 6BAB A5 63 D0 02 C6 64 + .nowarn dew ydraw + 847 6BB3 E6 61 D0 02 E6 62 inw xdraw + 848 6BB9 C6 72 dec temp + 849 6BBB D0 EB bne @- + 850 ; draw top horizontal line of shield ( _ ) + 851 6BBD A9 07 85 72 mva #7 temp + 852 @ + 853 6BC1 20 14 76 jsr plot + 854 6BC4 E6 61 D0 02 E6 62 inw xdraw + 855 6BCA C6 72 dec temp + 856 6BCC D0 F3 bne @- + 857 ; draw right oblique line of shield ( \ ) + 858 6BCE A9 03 85 72 mva #3 temp + 859 @ + 860 6BD2 20 14 76 jsr plot + 861 6BD5 E6 63 D0 02 E6 64 inw ydraw + 862 6BDB E6 61 D0 02 E6 62 inw xdraw + 863 6BE1 C6 72 dec temp + 864 6BE3 D0 ED bne @- + 865 ; draw right vertical line of shield ( | ) + 866 6BE5 A9 07 85 72 mva #7 temp + 867 @ + 868 6BE9 20 14 76 jsr plot + 869 6BEC E6 63 D0 02 E6 64 inw ydraw + 870 6BF2 C6 72 dec temp + 871 6BF4 D0 F3 bne @- + 872 6BF6 60 rts + 873 .endp + 874 ;-------------------------------------------------- + 875 6BF7 .proc DrawTankShieldHorns + 876 ; use only directly after DrawTankShield + 877 ; this proc draws a little "horns" on shield. + 878 ; Symbol of defensive but aggressive :) weapon + 879 ;-------------------------------------------------- + 880 6BF7 A5 61 D0 02 C6 62 + .nowarn dew xdraw ; 1 pixel left + 881 6BFF 38 A5 63 E9 0A 85 + sbw ydraw #$0a ; 10 pixels up + 882 6C0A 20 14 76 jsr plot + 883 6C0D A5 63 D0 02 C6 64 + .nowarn dew ydraw + 884 6C15 E6 61 D0 02 E6 62 inw xdraw + 885 6C1B 20 14 76 jsr plot + 886 6C1E 38 A5 61 E9 0D 85 + sbw xdraw #$0d ; 13 pixels left + 887 6C29 20 14 76 jsr plot + 888 6C2C E6 61 D0 02 E6 62 inw xdraw + 889 6C32 E6 63 D0 02 E6 64 inw ydraw + 890 6C38 20 14 76 jsr plot + 891 6C3B 60 rts + 892 .endp + 893 ;-------------------------------------------------- + 894 6C3C .proc DrawTankShieldBoldLine + 895 ; use only directly after DrawTankShield + 896 ; this proc draws bold top on shield. + 897 ; Symbol of ablative shield ? :) + 898 ;-------------------------------------------------- + 899 6C3C 38 A5 61 E9 04 85 + sbw xdraw #$04 ; 5 pixels left + 900 6C47 38 A5 63 E9 0B 85 + sbw ydraw #$0b ; 11 pixels up + 901 ; draw additional top horizontal line of shield ( _ ) + 902 6C52 A9 06 85 72 mva #6 temp + 903 @ + 904 6C56 20 14 76 jsr plot + 905 6C59 A5 61 D0 02 C6 62 + .nowarn dew xdraw + 906 6C61 C6 72 dec temp + 907 6C63 D0 F1 bne @- + 908 6C65 60 rts + 909 .endp + 910 ;-------------------------------------------------- + 911 6C66 .proc DrawTankParachute + 912 ;Tank number in X + 913 ;-------------------------------------------------- + 914 6C66 A9 02 lda #char_parachute_______ ; parachute symbol + 915 6C68 85 69 sta CharCode + 916 6C6A BD 19 44 lda Ytankstable,x + 917 6C6D C9 10 cmp #16 + 918 6C6F 90 0A bcc ToHighToParachute + 919 ;sec + 920 6C71 E9 08 sbc #8 + 921 6C73 85 63 sta ydraw + 922 6C75 20 70 74 jsr SetupXYdraw.X + 923 6C78 20 E7 70 jsr TypeChar + 924 6C7B ToHighToParachute + 925 6C7B A6 6C ldx TankNr + 926 6C7D 60 rts + 927 .endp + 928 + 929 ;-------------------------------------------------- + 930 6C7E .proc DrawTankRocketEngine + 931 ; X - tank number + 932 ; + 933 ; this proc change xdraw, ydraw and temp! + 934 ;-------------------------------------------------- + 935 6C7E 18 clc + 936 6C7F BD 19 44 lda Ytankstable,x + 937 6C82 69 02 adc #2 ; 1 pixel down + 938 6C84 85 63 sta ydraw + 939 6C86 A9 00 85 64 mva #0 ydraw+1 + 940 + 941 6C8A 18 clc + 942 6C8B BD 0D 44 lda XtanksTableL,x + 943 6C8E 69 02 adc #2 ; 2 pixels to right + 944 6C90 85 61 sta xdraw + 945 6C92 BD 13 44 lda XtanksTableH,x + 946 6C95 69 00 adc #0 + 947 6C97 85 62 sta xdraw+1 + 948 + 949 ; draw first horizontal line + 950 6C99 A9 05 85 72 mva #5 temp + 951 @ + 952 6C9D 20 14 76 jsr plot + 953 6CA0 E6 61 D0 02 E6 62 inw xdraw + 954 6CA6 C6 72 dec temp + 955 6CA8 D0 F3 bne @- + 956 + 957 6CAA 38 A5 61 E9 02 85 + sbw xdraw #2 ; 2 pixels left + 958 6CB5 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down + 959 + 960 ; draw second horizontal line + 961 6CBB A9 03 85 72 mva #3 temp + 962 @ + 963 6CBF 20 14 76 jsr plot + 964 6CC2 A5 61 D0 02 C6 62 + .nowarn dew xdraw + 965 6CCA C6 72 dec temp + 966 6CCC D0 F1 bne @- + 967 + 968 6CCE 18 A5 61 69 02 85 + adw xdraw #2 ; 2 pixels right + 969 6CD9 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down + 970 + 971 ; and last pixel + 972 6CDF 20 14 76 jsr plot + 973 + 974 6CE2 A6 6C ldx TankNr + 975 6CE4 60 rts + 976 .endp + 977 ;-------------------------------------------------- + 978 6CE5 .proc DrawTankEngine + 979 ; X - tank number + 980 ; + 981 ; this proc change xdraw, ydraw and temp! + 982 ;-------------------------------------------------- + 983 ; one pixel under tank + 984 6CE5 18 clc + 985 6CE6 BD 19 44 lda Ytankstable,x + 986 6CE9 69 01 adc #1 + 987 6CEB 85 63 sta ydraw + 988 6CED A9 00 85 64 mva #0 ydraw+1 + 989 6CF1 BD 0D 44 lda XtankstableL,x + 990 6CF4 85 61 sta xdraw + 991 6CF6 BD 13 44 lda XtankstableH,x + 992 6CF9 85 62 sta xdraw+1 + 993 ; clear first pixel under tank + 994 6CFB A9 00 85 A9 mva #0 color + 995 6CFF 20 14 76 jsr plot + 996 6D02 E6 61 D0 02 E6 62 inw xdraw + 997 ; plot 6 random color pixels + 998 6D08 A9 06 85 72 mva #6 temp + 999 6D0C A5 AA @ lda Erase + 1000 6D0E 49 01 eor #%00000001 + 1001 6D10 2D 1B D4 and random + 1002 6D13 29 01 and #%00000001 + 1003 6D15 85 A9 sta color + 1004 6D17 20 14 76 jsr plot + 1005 6D1A E6 61 D0 02 E6 62 inw xdraw + 1006 6D20 C6 72 dec temp + 1007 6D22 D0 E8 bne @- + 1008 ; clear last pixel under tank + 1009 6D24 A9 00 85 A9 mva #0 color + 1010 6D28 20 14 76 jsr plot + 1011 6D2B A6 6C ldx TankNr + 1012 6D2D 60 rts + 1013 .endp + 1014 ;-------------------------------------------------- + 1015 6D2E .proc TankFalls; + 1016 ;-------------------------------------------------- + 1017 6D2E A9 00 lda #0 + 1018 6D30 8D 64 44 sta PreviousFall ; bit 7 - left, bit 6 - right + 1019 6D33 8D 65 44 sta EndOfTheFallFlag + 1020 6D36 85 A8 sta Parachute + 1021 6D38 A9 02 8D 63 44 mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop + 1022 + 1023 ; let's check if the given tank has got the parachute + 1024 6D3D A6 6C ldx TankNr + 1025 6D3F BD FD 43 lda ActiveDefenceWeapon,x + 1026 6D42 C9 23 cmp #ind_Parachute______ ; parachute + 1027 6D44 F0 08 beq ParachuteActive + 1028 6D46 C9 24 cmp #ind_StrongParachute ; strong parachute + 1029 6D48 F0 04 beq ParachuteActive + 1030 6D4A C9 28 cmp #ind_Force_Shield___ ; shield witch energy and parachute + 1031 6D4C D0 02 bne TankFallsX + 1032 6D4E ParachuteActive + 1033 6D4E E6 A8 inc Parachute + 1034 6D50 TankFallsX + 1035 ; sound only if really falls + 1036 6D50 A5 A8 lda Parachute + 1037 6D52 2D 63 44 and FallingSoundBit ; bit 1 + 1038 6D55 F0 09 beq NoFallingSound + 1039 6D57 A9 00 8D 63 44 mva #0 FallingSoundBit + 1040 6D5C A9 0E 85 9E mva #sfx_shield_off sfx_effect + 1041 6D60 NoFallingSound + 1042 ; clear previous position + 1043 6D60 A9 01 85 AA mva #1 Erase + 1044 6D64 20 2C 6A jsr DrawTankNr + 1045 ; and the parachute (if present) + 1046 6D67 A5 A8 lda Parachute + 1047 6D69 29 01 and #01 + 1048 6D6B F0 03 beq DoNotClearParachute + 1049 ; here we clear the parachute + 1050 ; ldx TankNr + 1051 6D6D 20 66 6C jsr DrawTankParachute + 1052 6D70 DoNotClearParachute + 1053 6D70 A9 00 85 AA mva #0 Erase + 1054 ; ldx TankNr + 1055 6D74 AD 65 44 lda EndOfTheFallFlag ; We only get byte below the tank if still falling + 1056 6D77 D0 2C bne NoGroundCheck + 1057 ; coordinates of the first pixel under the tank + 1058 6D79 A6 6C ldx TankNr + 1059 6D7B 20 70 74 jsr SetupXYdraw.X + 1060 6D7E BD 19 44 lda Ytankstable,x + 1061 6D81 18 clc + 1062 6D82 69 01 adc #1 ; in this point the comment helped us! For the very first + 1063 ; time in our lives! Tada! It opens a new chapter!!! + 1064 6D84 85 63 sta ydraw + 1065 ; + 1066 ; UnderTank1 ; byte under tank + 1067 ; UnderTank2 ; byte under tank reversed (for simple check right direction) + 1068 6D86 A9 08 lda #08 + 1069 6D88 85 72 sta temp ; Loop Counter + 1070 6D8A ByteBelowTank + 1071 6D8A 20 5A 76 jsr point_plot + 1072 6D8D F0 06 beq EmptyPoint2 + 1073 6D8F 38 sec + 1074 6D90 66 96 ror UnderTank2 + 1075 6D92 38 sec + 1076 6D93 B0 04 bcs ROLPoint2 + 1077 6D95 EmptyPoint2 + 1078 6D95 18 clc + 1079 6D96 66 96 ror UnderTank2 + 1080 6D98 18 clc + 1081 6D99 ROLPoint2 + 1082 6D99 26 95 rol UnderTank1 + 1083 6D9B E6 61 D0 02 E6 62 inw xdraw + 1084 6DA1 C6 72 dec temp + 1085 6DA3 D0 E5 bne ByteBelowTank + 1086 6DA5 NoGroundCheck + 1087 6DA5 A6 6C ldx TankNr + 1088 6DA7 BD 19 44 lda Ytankstable,x + 1089 6DAA C9 C7 cmp #screenheight-1 ; tank on lowest position (no falling down) + 1090 6DAC 90 03 4C 71 6E jcs EndOfFall + 1091 6DB1 A5 95 lda UnderTank1 + 1092 6DB3 D0 3C bne NoFallingDown + 1093 ; Tank falling down ---- + 1094 6DB5 A5 A8 lda Parachute + 1095 6DB7 29 01 and #1 + 1096 6DB9 D0 05 bne ParachutePresent + 1097 ; decreasing energy + 1098 6DBB A0 02 ldy #2 ; how much energy to substract if no parachute + 1099 6DBD 20 74 57 jsr DecreaseEnergyX + 1100 6DC0 ParachutePresent + 1101 ; check parachute type + 1102 6DC0 BD FD 43 lda ActiveDefenceWeapon,x + 1103 6DC3 C9 24 cmp #ind_StrongParachute ; strong parachute + 1104 6DC5 D0 18 bne OneTimeParachute + 1105 ; decreasing energy of parachute + 1106 6DC7 A0 01 ldy #1 ; how much parachute energy to substract + 1107 6DC9 20 B0 57 jsr DecreaseShieldEnergyX + 1108 6DCC C0 00 cpy #0 ; is necessary to reduce tenk energy ? + 1109 6DCE F0 03 beq @+ + 1110 6DD0 20 74 57 jsr DecreaseEnergyX + 1111 @ + 1112 ; check energy of parachute + 1113 6DD3 BD A8 43 lda ShieldEnergy,x + 1114 6DD6 D0 07 bne OneTimeParachute + 1115 6DD8 A9 00 lda #$00 + 1116 6DDA 85 A8 sta Parachute + 1117 6DDC 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defence + 1118 6DDF OneTimeParachute + 1119 6DDF A5 A8 lda Parachute + 1120 6DE1 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + 1121 6DE3 85 A8 sta Parachute + 1122 ; tank is falling down - modify coorinates + 1123 6DE5 BD 19 44 lda Ytankstable,x + 1124 6DE8 18 clc + 1125 6DE9 69 01 adc #1 + 1126 6DEB 9D 19 44 sta Ytankstable,x + 1127 6DEE 4C 5A 6E jmp EndOfFCycle + 1128 6DF1 NoFallingDown + 1129 ; check direction (left or right) + 1130 6DF1 A0 06 ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) + 1131 6DF3 B9 33 5C @ lda SlideLeftTable,y + 1132 6DF6 C5 95 cmp UnderTank1 + 1133 6DF8 F0 34 beq FallingLeft + 1134 6DFA C5 96 cmp UnderTank2 + 1135 6DFC F0 05 beq FallingRight + 1136 6DFE 88 dey + 1137 6DFF 10 F2 bpl @- + 1138 6E01 30 54 bmi NoLeftOrRight + 1139 6E03 FallingRight + 1140 ; tank is falling right + 1141 6E03 2C 64 44 bit PreviousFall ; bit 6 - left + 1142 6E06 70 4F bvs EndRightFall + 1143 ; we finish falling right if the tank reached the edge of the screen + 1144 6E08 BD 13 44 lda XtanksTableH,x + 1145 6E0B C9 01 cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + 1146 6E0D D0 05 bne @+ + 1147 6E0F BD 0D 44 lda XtanksTableL,x + 1148 6E12 C9 36 cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank + 1149 6E14 B0 41 @ bcs EndRightFall + 1150 6E16 NotRightEdge + 1151 ; tank is falling right - modify coorinates + 1152 6E16 18 clc + 1153 6E17 BD 0D 44 lda XtankstableL,x + 1154 6E1A 69 01 adc #1 + 1155 6E1C 9D 0D 44 sta XtankstableL,x + 1156 6E1F BD 13 44 lda XtankstableH,x + 1157 6E22 69 00 adc #0 + 1158 6E24 9D 13 44 sta XtankstableH,x + 1159 6E27 A9 80 8D 64 44 mva #%10000000 PreviousFall ; set bit 7 - right + 1160 6E2C D0 2C bne EndOfFCycle + 1161 6E2E FallingLeft + 1162 ; tank is falling left + 1163 6E2E 2C 64 44 bit PreviousFall ; bit 7 - right + 1164 6E31 30 24 bmi EndLeftFall + 1165 ; we finish falling left if the tank reached the edge of the screen + 1166 6E33 BD 13 44 lda XtanksTableH,x + 1167 6E36 D0 07 bne NotLeftEdge + 1168 6E38 BD 0D 44 lda XtanksTableL,x + 1169 6E3B C9 03 cmp #3 ; 2 pixels correction due to a barrel wider than tank + 1170 6E3D 90 18 bcc EndLeftFall + 1171 6E3F NotLeftEdge + 1172 ; tank is falling left - modify coorinates + 1173 6E3F 38 sec + 1174 6E40 BD 0D 44 lda XtankstableL,x + 1175 6E43 E9 01 sbc #1 + 1176 6E45 9D 0D 44 sta XtankstableL,x + 1177 6E48 BD 13 44 lda XtankstableH,x + 1178 6E4B E9 00 sbc #0 + 1179 6E4D 9D 13 44 sta XtankstableH,x + 1180 6E50 A9 40 8D 64 44 mva #%01000000 PreviousFall ; set bit 6 - left + 1181 6E55 D0 03 bne EndOfFCycle + 1182 6E57 EndLeftFall + 1183 6E57 EndRightFall + 1184 6E57 NoLeftOrRight + 1185 6E57 EE 65 44 inc EndOfTheFallFlag ; after this is shouldn't fall + 1186 6E5A EndOfFCycle + 1187 ; draw tank on new position + 1188 6E5A 20 2C 6A jsr DrawTankNr ; ew have TankNr in X (I hope :) ) + 1189 ; checking is parachute present and if so, draw it + 1190 6E5D A5 A8 lda Parachute + 1191 6E5F C9 03 cmp #3 ; parachute and falling + 1192 6E61 D0 06 bne DoNotDrawParachute + 1193 ; here we draw parachute + 1194 ; ldx TankNr + 1195 6E63 20 66 6C jsr DrawTankParachute + 1196 6E66 20 89 5A jsr WaitOneFrame ; only if tank with parachute + 1197 6E69 RapidFalling + 1198 6E69 DoNotDrawParachute + 1199 6E69 AD 65 44 lda EndOfTheFallFlag + 1200 6E6C D0 03 4C 50 6D jeq TankFallsX + 1201 ; Tank falling down already finished, but it is not sure that + 1202 ; the horizontal coordinate is even. + 1203 ; If it is odd then it must be corrected because otherwise + 1204 ; P/M graphics background would not look OK + 1205 ; ldx TankNr + 1206 ; x correction for P/M + 1207 ; -- + 1208 .IF XCORRECTION_FOR_PM = 1 + 1209 lda XtanksTableL,x + 1210 and #$01 + 1211 beq EndOfFall ; if it is even then it is the end + 1212 ; and if not, we push it one pixel the way it was falling before + 1213 lda #%10000000 ; set "virtual ground" for right falling + 1214 ldy #%00000001 + 1215 bit PreviousFall + 1216 bmi ForceFallLeft + 1217 tay ; tricky - replaces ldy #%10000000 + 1218 lda #%00000001 ; set "virtual ground" for left falling + 1219 ForceFallLeft + 1220 sta UnderTank1 + 1221 sty UnderTank2 + 1222 jmp TankFallsX + 1223 .ENDIF + 1224 ; -- + 1225 6E71 EndOfFall + 1226 6E71 A9 01 85 AA mva #1 Erase + 1227 ; ldx TankNr + 1228 ; if tank was falling down having parachute, + 1229 ; we must deduct one parachute + 1230 6E75 A5 A8 lda Parachute + 1231 6E77 C9 03 cmp #$03 ; was falling down and the parachute + 1232 6E79 D0 0C bne NoParachuteWeapon + 1233 ; first we check type of parachute + 1234 6E7B BD FD 43 lda ActiveDefenceWeapon,x + 1235 6E7E C9 23 cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) + 1236 6E80 D0 05 bne NoParachuteWeapon + 1237 6E82 A9 00 9D FD 43 mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) + 1238 6E87 NoParachuteWeapon + 1239 ; now we clear parachute on the screen if present + 1240 6E87 A5 A8 lda Parachute + 1241 6E89 29 01 and #01 + 1242 6E8B F0 03 beq ThereWasNoParachute + 1243 6E8D 20 66 6C jsr DrawTankParachute + 1244 6E90 ThereWasNoParachute + 1245 6E90 A9 00 85 AA mva #0 Erase + 1246 ; ldx TankNr + 1247 6E94 20 2C 6A jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) + 1248 6E97 A9 15 85 9E mva #sfx_silencer sfx_effect + 1249 6E9B 60 rts + 1250 + 1251 .endp + 1252 + 1253 ;-------------------------------------------------- + 1254 6E9C .proc ClearPMmemory + 1255 ;-------------------------------------------------- + 1256 + 1257 6E9C A9 00 lda #$00 + 1258 6E9E A8 tay + 1259 6E9F 99 00 1B @ sta pmgraph+$300,y + 1260 6EA2 99 00 1C sta pmgraph+$400,y + 1261 6EA5 99 00 1D sta pmgraph+$500,y + 1262 6EA8 99 00 1E sta pmgraph+$600,y + 1263 6EAB 99 00 1F sta pmgraph+$700,y + 1264 6EAE C8 iny + 1265 6EAF D0 EE bne @- + 1266 6EB1 60 rts + 1267 .endp + 1268 + 1269 ;-------------------------------------------------- + 1270 6EB2 .proc drawmountains + 1271 ;-------------------------------------------------- + 1272 6EB2 A9 00 85 61 85 62 mwa #0 xdraw + 1273 6EB8 A9 3E 85 76 A9 46 + mwa #mountaintable modify + 1274 6EC0 A9 01 85 A9 mva #1 color + 1275 + 1276 6EC4 drawmountainsloop + 1277 6EC4 A0 00 ldy #0 + 1278 6EC6 B1 76 lda (modify),y + 1279 6EC8 C9 C8 cmp #screenheight + 1280 6ECA F0 0F beq NoMountain + 1281 6ECC 85 63 sta ydraw + 1282 6ECE 84 64 sty ydraw+1 + 1283 .IF FASTER_GRAF_PROCS = 1 + 1284 ; there was Drawline proc + 1285 lda #screenheight + 1286 sec + 1287 sbc ydraw + 1288 sta tempbyte01 + 1289 jsr plot.MakePlot + 1290 ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) + 1291 ; jmp IntoDraw ; jumps inside Draw routine + 1292 ; because one pixel is already plotted (and who cares? :) ) + 1293 @ + 1294 lda (xbyte),y + 1295 and bittable2,x + 1296 sta (xbyte),y + 1297 ;IntoDraw + 1298 adw xbyte #screenBytes + 1299 dec tempbyte01 + 1300 bne @- + 1301 ; end of Drawline proc + 1302 .ELSE + 1303 ; there was Drawline proc + 1304 6ED0 drawline + 1305 6ED0 20 2C 76 jsr plot.MakePlot + 1306 6ED3 E6 63 inc ydraw + 1307 6ED5 A5 63 lda ydraw + 1308 6ED7 C9 C8 cmp #screenheight + 1309 6ED9 D0 F5 bne drawline + 1310 ; end of Drawline proc + 1311 .ENDIF + 1312 6EDB NoMountain + 1313 6EDB E6 76 D0 02 E6 77 inw modify + 1314 6EE1 E6 61 D0 02 E6 62 inw xdraw + 1315 6EE7 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 1316 6EF1 D0 D1 bne drawmountainsloop + 1317 6EF3 60 rts + 1318 /* + 1319 ;-------------------------------------------------- + 1320 drawmountainspixel ; never used ? + 1321 ;-------------------------------------------------- + 1322 mwa #0 xdraw + 1323 mwa #mountaintable modify + 1324 drawmountainspixelloop + 1325 ldy #0 + 1326 lda (modify),y + 1327 sta ydraw + 1328 sty ydraw+1 + 1329 jsr plot + 1330 inw modify + 1331 inw xdraw + 1332 cpw xdraw #screenwidth + 1333 bne drawmountainspixelloop + 1334 rts + 1335 */ + 1335 + 1336 .endp + 1337 ;-------------------------------------------------- + 1338 6EF4 .proc SoilDown2 + 1339 ;-------------------------------------------------- + 1340 + 1341 ; how it is supposed to work: + 1342 ; first loop is looking for the highest pixels + 1343 ; and fills with their Y coordinates both temporary tables + 1344 ; + 1345 ; second (main) loop works this way: + 1346 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) + 1347 ; goes through the horizontal line checking if + 1348 ; Y coordinate from the first table equals to height of the peak + 1349 ; if so, it goes further + 1350 ; if not: + 1351 ; sets end-of-soil-fall-down-flag to 0 + 1352 ; increases Y from the first table + 1353 ; if there is no pixel there it plots here and + 1354 ; zeroes pixel from the second table and after that + 1355 ; increases Y of the second table + 1356 ; repeats with next pixels au to the end of the line + 1357 ; if the flag is 0 then repeat the main loop + 1358 ; and that's it :) + 1359 ; + 1360 ; I am sorry but after these 4 years I have no idea + 1361 ; how it works. I have just translated Polish comment + 1362 ; but I do not understand a word of it :) + 1363 ; If you know how it works, please write here :)))) + 1364 6EF4 20 0B 6A jsr ClearTanks + 1365 6EF7 NoClearTanks + 1366 + 1367 ; Fix for lonely pixel after nuclear winter :) #103 + 1368 6EF7 A9 00 lda #0 + 1369 6EF9 85 61 sta xdraw + 1370 6EFB 85 62 sta xdraw+1 + 1371 6EFD 85 63 sta ydraw + 1372 6EFF 85 64 sta ydraw+1 + 1373 6F01 85 A9 sta color + 1374 6F03 20 14 76 jsr plot + 1375 + 1376 ; First we look for highest pixels and fill with their coordinates + 1377 ; both tables + 1378 + 1379 6F06 A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw + 1380 6F0E 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp + 1381 6F1B 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 + 1382 + 1383 6F28 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1384 6F32 90 03 4C FC 6F jcs NothingToFall + 1385 + 1386 6F37 NextColumn1 + 1387 6F37 A9 00 85 63 85 64 mwa #0 ydraw + 1388 6F3D NextPoint1 + 1389 6F3D 20 5A 76 jsr point_plot + 1390 6F40 F0 0B beq StillNothing + 1391 6F42 A0 00 ldy #0 + 1392 6F44 A5 63 lda ydraw + 1393 6F46 91 7E sta (tempor2),y + 1394 6F48 91 72 sta (temp),y + 1395 6F4A 4C 5D 6F jmp FoundPeek1 + 1396 6F4D StillNothing + 1397 6F4D E6 63 inc ydraw + 1398 6F4F A5 63 lda ydraw + 1399 6F51 C9 C8 cmp #screenheight + 1400 6F53 D0 E8 bne NextPoint1 + 1401 ; no pixels on whole column !!! + 1402 6F55 A0 00 ldy #0 + 1403 6F57 A5 63 lda ydraw + 1404 6F59 91 7E sta (tempor2),y + 1405 6F5B 91 72 sta (temp),y + 1406 6F5D FoundPeek1 + 1407 6F5D E6 7E D0 02 E6 7F inw tempor2 + 1408 6F63 E6 72 D0 02 E6 73 inw temp + 1409 6F69 E6 61 D0 02 E6 62 inw xdraw + 1410 ;vcmp xdraw,screenwidth,NextColumn1 + 1411 6F6F A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1412 6F79 90 BC bcc NextColumn1 + 1413 6F7B F0 BA beq NextColumn1 + 1414 ; we have both tables filled with starting values + 1415 + 1416 ; main loop starts here + 1417 6F7D MainFallout2 + 1418 6F7D A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw + 1419 6F85 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp + 1420 6F92 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 + 1421 + 1422 6F9F A9 01 85 9D mva #1 IsEndOfTheFallFlag + 1423 6FA3 FalloutOfLine + 1424 6FA3 A0 00 ldy #0 + 1425 + 1426 ; is Y coordinate from the first table + 1427 ; equal to peak height, if so, go ahead + 1428 6FA5 B1 7E lda (tempor2),y + 1429 6FA7 C9 C7 cmp #screenheight-1 ;cmp (temp),y + 1430 6FA9 B0 2B bcs ColumnIsReady + 1431 ; in the other case there are things to be done + 1432 6FAB 84 9D sty IsEndOfTheFallFlag ; flag to 0 + 1433 ; we are increasing Y in the first table + 1434 ;lda (tempor2),y + 1435 6FAD 18 clc + 1436 6FAE 69 01 adc #1 + 1437 6FB0 91 7E sta (tempor2),y + 1438 ; and checking if there is a pixel there + 1439 6FB2 85 63 sta ydraw + 1440 6FB4 20 5A 76 jsr point_plot + 1441 6FB7 D0 1D bne ThereIsPixelHere + 1442 ; if no pixel we plot it + 1443 6FB9 A9 01 85 A9 mva #1 color + 1444 6FBD 20 2C 76 jsr plot.MakePlot + 1445 ; zeroing pixel from the second table + 1446 ; and increase Y in second table + 1447 6FC0 A0 00 ldy #0 + 1448 6FC2 B1 72 lda (temp),y + 1449 6FC4 85 63 sta ydraw + 1450 6FC6 B1 72 lda (temp),y + 1451 6FC8 18 clc + 1452 6FC9 69 01 adc #1 + 1453 6FCB 91 72 sta (temp),y + 1454 6FCD 84 A9 sty color + 1455 6FCF 20 2C 76 jsr plot.MakePlot + 1456 6FD2 A9 15 85 9E mva #sfx_silencer sfx_effect + 1457 + 1458 6FD6 ThereIsPixelHere + 1459 6FD6 ColumnIsReady + 1460 6FD6 E6 72 D0 02 E6 73 inw temp + 1461 6FDC E6 7E D0 02 E6 7F inw tempor2 + 1462 6FE2 E6 61 D0 02 E6 62 inw xdraw + 1463 ;vcmp xdraw,screenwidth,FalloutOfLine + 1464 6FE8 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight + 1465 6FF2 90 AF bcc FalloutOfLine + 1466 6FF4 F0 AD beq FalloutOfLine + 1467 + 1468 6FF6 A5 9D lda IsEndOfTheFallFlag + 1469 ; we repeat untill at some point first table reaches + 1470 ; level of the mountains + 1471 6FF8 F0 83 jeq MainFallout2 + 1472 ; now correct heights are in the mountaintable + 1473 6FFA 85 A9 sta color ; Pozor! :) we know - now A=1 + 1474 6FFC NothingToFall + 1475 6FFC A9 15 85 9E mva #sfx_silencer sfx_effect + 1476 7000 20 12 6A jsr DrawTanks + 1477 7003 60 rts + 1478 .endp + 1479 + 1480 ;-------------------------------------------------- + 1481 7004 .proc calculatemountains + 1482 ;-------------------------------------------------- + 1483 7004 A9 00 85 61 85 62 mwa #0 xdraw + 1484 + 1485 ; starting point + 1486 700A getrandomY ;getting random Y coordinate + 1487 700A 38 sec + 1488 700B AD 1B D4 lda random + 1489 700E C9 28 cmp #screenheight-(margin*4) ;it means that max line=199 + 1490 7010 B0 F8 bcs getrandomY + 1491 7012 18 clc + 1492 7013 69 50 adc #(margin*2) + 1493 7015 85 63 sta ydraw + 1494 7017 8D D3 44 sta yfloat+1 + 1495 701A A9 00 8D D2 44 mva #0 yfloat ;yfloat equals to e.g. 140.0 + 1496 701F A9 9B 8D D3 44 mva #screenheight-margin-5 yfloat+1 + 1497 7024 85 63 sta ydraw + 1498 + 1499 ; how to make nice looking mountains? + 1500 ; randomize points and join them with lines + 1501 ; Here we do it simpler way - we randomize X (or deltaX) + 1502 ; and "delta" (change of Y coordinate) + 1503 + 1504 7026 NextPart + 1505 7026 AD 1B D4 lda random + 1506 7029 2D 4B 41 and mountainDeltaL + 1507 702C 85 C3 sta delta ; it is after the dot (xxx.delta) + 1508 702E AD 1B D4 lda random + 1509 7031 2D 4A 41 and mountainDeltaH ;(max delta) + 1510 7034 85 C4 sta delta+1 ; before the dot (delta+1.delta) + 1511 + 1512 7036 AD 1B D4 lda random + 1513 7039 29 01 and #$01 ;random sign (+/- or up/down) + 1514 703B 8D D5 44 sta UpNdown + 1515 + 1516 ; theoretically we have here ready + 1517 ; fixed-point delta value + 1518 ; (-1*(UpNdown))*(delta+1.delta) + 1519 + 1520 ;loop drawing one line + 1521 + 1522 703E ChangingDirection + 1523 703E AD 1B D4 lda random ;length of the line + 1524 7041 29 0F and #$0f ;max line length + 1525 7043 AA tax + 1526 7044 E8 inx + 1527 7045 E8 inx + 1528 7046 E8 inx + 1529 7047 8E D4 44 stx deltaX + 1530 + 1531 704A OnePart + 1532 704A 20 E6 69 jsr placeTanks.CheckTank + 1533 ; checks if at a given X coordinate + 1534 ; is any tank and if so + 1535 ; changes parameters of drawing + 1536 ; to generate flat 8 pixels + 1537 ; (it will be the place for the tank) + 1538 ; it also stores Y position of the tank + 1539 704D 18 A5 61 69 3E 85 + adw xdraw #mountaintable modify + 1540 + 1541 705A A5 63 lda ydraw + 1542 705C A0 00 ldy #0 + 1543 705E 91 76 sta (modify),y + 1544 + 1545 ; Up or Down + 1546 7060 AD D5 44 lda UpNdown + 1547 7063 F0 20 beq ToBottom + 1548 + 1549 7065 ToTop ;it means substracting + 1550 + 1551 7065 38 AD D2 44 E5 C3 + sbw yfloat delta + 1552 7076 AD D3 44 lda yfloat+1 + 1553 7079 C9 28 cmp #margin + 1554 707B B0 25 bcs @+ + 1555 ; if smaller than 10 + 1556 707D A2 00 ldx #$00 + 1557 707F 8E D5 44 stx UpNdown + 1558 7082 4C A2 70 jmp @+ + 1559 + 1560 7085 ToBottom + 1561 7085 18 AD D2 44 65 C3 + adw yfloat delta + 1562 7096 AD D3 44 lda yfloat+1 + 1563 7099 C9 A0 cmp #screenheight-margin + 1564 709B 90 05 bcc @+ + 1565 ; if higher than screen + 1566 709D A2 01 ldx #$01 + 1567 709F 8E D5 44 stx UpNdown + 1568 @ + 1569 70A2 85 63 sta ydraw + 1570 + 1571 70A4 E6 61 D0 02 E6 62 inw xdraw + 1572 + 1573 70AA A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 1574 70B4 F0 08 beq EndDrawing + 1575 + 1576 70B6 CE D4 44 dec deltaX + 1577 70B9 D0 8F bne OnePart + 1578 + 1579 70BB 4C 26 70 jmp NextPart + 1580 70BE EndDrawing + 1581 + 1582 70BE 60 rts + 1583 .endp + 1584 + 1585 /* + 1586 ;-------------------------------------------------- + 1587 .proc calculatemountains0 + 1588 ; Only for testing - makes ground flat (0 pixels) + 1589 ; and places tanks on it + 1590 ; remember to remove in final compilation :) + 1591 ;-------------------------------------------------- + 1592 mwa #0 xdraw + 1593 nextPointDrawing + 1594 adw xdraw #mountaintable modify + 1595 lda #screenheight + 1596 ldy #0 + 1597 sta (modify),y + 1598 inw xdraw + 1599 cpw xdraw #screenwidth + 1600 bne nextPointDrawing + 1601 ldx NumberOfPlayers + 1602 dex + 1603 SetYofNextTank + 1604 lda #screenheight-1 + 1605 sta ytankstable,x + 1606 dex + 1607 bpl SetYofNextTank + 1608 rts + 1609 .endp + 1610 */ + 1610 + 1611 + 1612 ;-------------------------------------------------- + 1613 70BF .proc CheckMaxMountain + 1614 ; in A return y coordinate of highest mountain + 1615 ;-------------------------------------------------- + 1616 70BF A9 3E 85 76 A9 46 + mwa #mountaintable modify + 1617 70C7 A0 00 ldy #0 + 1618 70C9 A2 C7 ldx #screenheight-1 + 1619 70CB nextPointChecking + 1620 70CB 8A txa + 1621 70CC D1 76 cmp (modify),y + 1622 70CE 90 03 bcc NotHigher + 1623 70D0 B1 76 lda (modify),y + 1624 70D2 AA tax + 1625 70D3 NotHigher + 1626 70D3 E6 76 D0 02 E6 77 inw modify + 1627 70D9 A5 77 C9 47 D0 04 + cpw modify #(mountaintable+screenwidth) + 1628 70E3 D0 E6 bne nextPointChecking + 1629 70E5 8A txa + 1630 70E6 60 rts + 1631 .endp + 1632 + 1633 + 1634 ;-------------------------------------------------- + 1635 70E7 .proc TypeChar + 1636 ; puts char on the graphics screen + 1637 ; in: CharCode + 1638 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) + 1639 ;-------------------------------------------------- + 1640 ; char to the table + 1641 70E7 A5 69 lda CharCode + 1642 70E9 85 6A sta fontind + 1643 70EB A9 00 lda #$00 + 1644 70ED 85 6B sta fontind+1 + 1645 ; char intex times 8 + 1646 70EF aslw fontind +Macro: ASLW [Source: MACRO.ASM] + 1 70EF 06 6A ASL FONTIND + 2 70F1 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1647 70F3 rolw fontind +Macro: ROLW [Source: MACRO.ASM] + 1 70F3 26 6A ROL FONTIND + 2 70F5 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1648 70F7 rolw fontind +Macro: ROLW [Source: MACRO.ASM] + 1 70F7 26 6A ROL FONTIND + 2 70F9 26 6B ROL FONTIND+1 +Source: grafproc.asm + 1649 + 1650 70FB 18 A5 6A 69 46 85 + adw fontind #TankFont + 1651 + 1652 ; and 8 bytes to the table + 1653 7108 A0 07 ldy #7 + 1654 710A CopyChar + 1655 710A B1 6A lda (fontind),y + 1656 710C 49 FF eor #$ff + 1657 710E 99 C0 44 sta char1,y + 1658 7111 A9 FF lda #$ff + 1659 7113 99 C8 44 sta char2,y + 1660 7116 88 dey + 1661 7117 10 F1 bpl CopyChar + 1662 ; and 8 subsequent bytes as a mask + 1663 7119 18 A5 6A 69 08 85 + adw fontind #8 + 1664 7124 A0 07 ldy #7 + 1665 7126 CopyMask + 1666 7126 B1 6A lda (fontind),y + 1667 7128 49 FF eor #$ff + 1668 712A 99 B0 44 sta mask1,y + 1669 712D A9 00 lda #$00 + 1670 712F 99 B8 44 sta mask2,y + 1671 7132 88 dey + 1672 7133 10 F1 bpl CopyMask + 1673 + 1674 .IF FASTER_GRAF_PROCS = 1 + 1675 ; calculating coordinates from xdraw and ydraw + 1676 mwa xdraw xbyte + 1677 + 1678 lda xbyte + 1679 and #$7 + 1680 sta ybit + 1681 + 1682 lsrw xbyte ; div 8 + 1683 rorw xbyte + 1684 rorw xbyte + 1685 ;--- + 1686 ldy xbyte + 1687 + 1688 lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? + 1689 sec + 1690 sbc #7 + 1691 tax + 1692 + 1693 lda linetableL,x + 1694 sta xbyte + 1695 lda linetableH,x + 1696 sta xbyte+1 + 1697 ; mask preparation and character shifting + 1698 ldx ybit + 1699 beq MaskOK00 + 1700 MakeMask00 + 1701 .rept 8 + 1702 lsr mask1+# + 1703 ror mask2+# + 1704 .endr + 1705 sec + 1706 .rept 8 + 1707 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 1708 ror char2+# + 1709 .endr + 1710 dex + 1711 bne MakeMask00 + 1712 MaskOK00 + 1713 ; here x=0 + 1714 lda Erase + 1715 beq CharLoopi ; it works, because x=0 + 1716 lda #$ff + 1717 ldx #7 + 1718 EmptyChar + 1719 sta char1,x + 1720 sta char2,x + 1721 dex + 1722 bpl EmptyChar + 1723 ldx #0 + 1724 CharLoopi + 1725 lda (xbyte),y + 1726 ora mask1,x + 1727 and char1,x + 1728 sta (xbyte),y + 1729 iny + 1730 lda (xbyte),y + 1731 ora mask2,x + 1732 and char2,x + 1733 sta (xbyte),y + 1734 dey + 1735 adw xbyte #screenBytes + 1736 inx + 1737 cpx #8 + 1738 bne CharLoopi + 1739 .ELSE + 1740 7135 A2 07 86 72 mvx #7 temp ; line counter (Y) + 1741 7139 CharLoop1 + 1742 7139 A9 07 85 73 mva #7 temp+1 ; pixel counter (X) + 1743 713D CharLoop2 + 1744 713D A9 00 85 A9 mva #0 color + 1745 7141 3E B0 44 rol mask1,x + 1746 7144 90 38 bcc NoMaskNoPlot + 1747 7146 3E C0 44 rol char1,x + 1748 7149 B0 06 bcs NoPlot + 1749 714B MakeCharPlot + 1750 714B A5 AA lda Erase + 1751 714D D0 02 bne ErasingChar + 1752 714F E6 A9 inc color + 1753 7151 ErasingChar + 1754 7151 NoPlot + 1755 7151 20 2C 76 jsr plot.MakePlot + 1756 7154 AfterCharPlot + 1757 7154 E6 61 D0 02 E6 62 inw xdraw + 1758 715A A6 72 ldx temp + 1759 715C C6 73 dec temp+1 + 1760 715E 10 DD bpl CharLoop2 + 1761 7160 38 sec + 1762 7161 38 A5 61 E9 08 85 + sbw xdraw #8 + 1763 716C C6 63 dec ydraw + 1764 716E A6 72 ldx temp + 1765 7170 CA dex + 1766 7171 86 72 stx temp + 1767 7173 10 C4 bpl CharLoop1 + 1768 7175 18 clc + 1769 7176 A5 63 lda ydraw + 1770 7178 69 08 adc #8 + 1771 717A 85 63 sta ydraw + 1772 717C D0 06 bne EndPutChar + 1773 717E NoMaskNoPlot + 1774 717E 3E C0 44 rol char1,x + 1775 7181 4C 54 71 jmp AfterCharPlot + 1776 .ENDIF + 1777 7184 EndPutChar + 1778 7184 60 rts + 1779 .endp + 1780 + 1781 ;-------------------------------------------------- + 1782 7185 .proc PutChar4x4 + 1783 ; puts 4x4 pixels char on the graphics screen + 1784 ; in: dx, dy (LOWER left corner of the char) + 1785 ; in: CharCode4x4 (.sbyte) + 1786 ; in: plot4x4color (0/255) + 1787 ; all pixels are being drawn + 1788 ; (empty and not empty) + 1789 ;-------------------------------------------------- + 1790 7185 A5 8E C9 00 D0 04 + cpw dy #(screenheight-1) + 1791 718F B0 F3 jcs TypeChar.EndPutChar ;nearest RTS + 1792 7191 A5 8E C9 00 D0 04 + cpw dy #(4) + 1793 719B 90 E7 jcc TypeChar.EndPutChar ;nearest RTS + 1794 719D A5 8C C9 01 D0 04 + cpw dx #(screenwidth-4) + 1795 71A7 B0 DB jcs TypeChar.EndPutChar ;nearest RTS + 1796 ; checks ommited. + 1797 ; char to the table + 1798 71A9 AD EC 48 lda CharCode4x4 + 1799 71AC 29 01 and #%00000001 + 1800 71AE F0 02 beq Upper4bits + 1801 71B0 A9 FF lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) + 1802 71B2 Upper4bits + 1803 71B2 8D EB 48 sta nibbler4x4 + 1804 71B5 AD EC 48 lda CharCode4x4 + 1805 71B8 4A lsr + 1806 71B9 85 6A sta fontind + 1807 71BB A9 00 lda #$00 + 1808 71BD 85 6B sta fontind+1 + 1809 + 1810 71BF 18 A5 6A 69 C6 85 + adw fontind #font4x4 + 1811 + 1812 ; and 4 bytes to the table + 1813 71CC A0 00 ldy #0 + 1814 71CE A2 03 ldx #3 + 1815 71D0 CopyChar + 1816 71D0 B1 6A lda (fontind),y ; Y must be 0 !!!! + 1817 71D2 2C EB 48 bit nibbler4x4 + 1818 71D5 10 04 bpl GetUpper4bits + 1819 71D7 2A 2A 2A 2A :4 rol + 1820 71DB GetUpper4bits + 1821 71DB 09 0F ora #$0f + 1822 71DD 9D C0 44 sta char1,x + 1823 71E0 A9 FF lda #$ff + 1824 71E2 9D C8 44 sta char2,x + 1825 ; and 4 bytes as a mask + 1826 71E5 A9 F0 lda #$f0 + 1827 71E7 9D B0 44 sta mask1,x + 1828 71EA A9 00 lda #$00 + 1829 71EC 9D B8 44 sta mask2,x + 1830 71EF 18 A5 6A 69 20 85 + adw fontind #32 ; next byte of 4x4 font + 1831 71FA CA dex + 1832 71FB 10 D3 bpl CopyChar + 1833 + 1834 .IF FASTER_GRAF_PROCS = 1 + 1835 ; calculating coordinates from xdraw and ydraw + 1836 mwa dx xbyte + 1837 + 1838 lda xbyte + 1839 and #$7 + 1840 sta ybit + 1841 + 1842 :3 lsrw xbyte ; div 8 + 1843 ; rorw xbyte + 1844 ; rorw xbyte + 1845 ;--- + 1846 ldy xbyte ; horizontal byte offet stored in Y + 1847 lda dy ; y = y - 3 because left lower. + 1848 sec + 1849 sbc #3 + 1850 tax + 1851 + 1852 lda linetableL,x + 1853 sta xbyte + 1854 lda linetableH,x + 1855 sta xbyte+1 + 1856 ; mask preparation and character shifting + 1857 ldx ybit + 1858 beq MaskOK01 + 1859 MakeMask01 + 1860 .rept 4 + 1861 lsr mask1+# + 1862 ror mask2+# + 1863 .endr + 1864 sec + 1865 .rept 4 + 1866 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough + 1867 ror char2+# + 1868 .endr + 1869 dex + 1870 bne MakeMask01 + 1871 MaskOK01 + 1872 ldx #0 + 1873 CharLoopi4x4 + 1874 lda (xbyte),y + 1875 ora mask1,x + 1876 bit plot4x4color + 1877 bpl PutInColor0_1 ; only mask - no char + 1878 and char1,x + 1879 PutInColor0_1 + 1880 sta (xbyte),y + 1881 iny + 1882 lda (xbyte),y + 1883 ora mask2,x + 1884 bit plot4x4color + 1885 bpl PutInColor0_2 ; only mask - no char + 1886 and char2,x + 1887 PutInColor0_2 + 1888 sta (xbyte),y + 1889 dey + 1890 adw xbyte #screenBytes + 1891 inx + 1892 cpx #4 + 1893 bne CharLoopi4x4 + 1894 .ELSE + 1895 71FD A5 61 8D C8 44 A5 + mwa xdraw char2 + 1896 7207 A5 63 8D B8 44 A5 + mwa ydraw mask2 + 1897 7211 A5 A9 8D BA 44 mva color mask2+2 + 1898 7216 A5 8B 85 61 A5 8C + mwa dx xdraw + 1899 721E A5 8D 85 63 A5 8E + mwa dy ydraw + 1900 7226 A2 03 86 72 mvx #3 temp ; line counter (Y) + 1901 722A CharLoop1 + 1902 722A A9 03 85 73 mva #3 temp+1 ; pixel counter (X) + 1903 722E CharLoop2 + 1904 722E A9 00 85 A9 mva #0 color + 1905 7232 3E B0 44 rol mask1,x + 1906 7235 90 4A bcc NoMaskNoPlot + 1907 7237 3E C0 44 rol char1,x + 1908 723A B0 06 bcs NoPlot + 1909 723C MakeCharPlot + 1910 723C A5 DB lda plot4x4color + 1911 723E F0 02 beq ErasingChar + 1912 7240 E6 A9 inc color + 1913 7242 ErasingChar + 1914 7242 NoPlot + 1915 7242 20 2C 76 jsr plot.MakePlot + 1916 7245 AfterCharPlot + 1917 7245 E6 61 D0 02 E6 62 inw xdraw + 1918 724B A6 72 ldx temp + 1919 724D C6 73 dec temp+1 + 1920 724F 10 DD bpl CharLoop2 + 1921 7251 38 sec + 1922 7252 38 A5 61 E9 04 85 + sbw xdraw #4 + 1923 725D C6 63 dec ydraw + 1924 725F A6 72 ldx temp + 1925 7261 CA dex + 1926 7262 86 72 stx temp + 1927 7264 10 C4 bpl CharLoop1 + 1928 7266 AD C8 44 85 61 AD + mwa char2 xdraw + 1929 7270 AD B8 44 85 63 AD + mwa mask2 ydraw + 1930 727A AD BA 44 85 A9 mva mask2+2 color + 1931 727F 10 06 bpl EndPut4x4 + 1932 7281 NoMaskNoPlot + 1933 7281 3E C0 44 rol char1,x + 1934 7284 4C 45 72 jmp AfterCharPlot + 1935 .ENDIF + 1936 7287 EndPut4x4 + 1937 7287 60 rts + 1938 .endp + 1939 + 1940 ;-------------------------------------------------------- + 1941 7288 .proc DisplayOffensiveTextNr ; + 1942 7288 AE C0 48 ldx TextNumberOff + 1943 728B BD 2B 9F lda talk.OffensiveTextTableL,x + 1944 728E 85 B3 sta LineAddress4x4 + 1945 7290 BD A0 9F lda talk.OffensiveTextTableH,x + 1946 7293 85 B4 sta LineAddress4x4+1 + 1947 7295 E8 inx ; the next text + 1948 7296 BD A0 9F lda talk.OffensiveTextTableH,x + 1949 7299 85 73 sta temp+1 + 1950 729B BD 2B 9F lda talk.OffensiveTextTableL,x + 1951 729E 85 72 sta temp ; opty possible + 1952 ; substract address of the next text from previous to get text length + 1953 72A0 38 A5 72 E5 B3 85 + sbw temp LineAddress4x4 temp2 + 1954 72AD A5 74 85 83 mva temp2 fx + 1955 + 1956 ;jsr Display4x4AboveTank + 1957 ;rts + 1958 ; POZOR !!! + 1959 .endp + 1960 + 1961 ;-------------------------------------------------------- + 1962 72B1 .proc Display4x4AboveTank ; + 1963 ; Displays texts using PutChar4x4 above tank and mountains. + 1964 ; Pretty cool, eh! + 1965 ;parameters are: + 1966 ;Y - number of tank above which text is displayed + 1967 ;fx - length of text + 1968 ;LineAddress4x4 - address of the text + 1969 + 1970 ;lets calculate position of the text first! + 1971 ;that's easy because we have number of tank + 1972 ;and xtankstableL and H keep X position of a given tank + 1973 + 1974 72B1 B9 0D 44 lda xtankstableL,y + 1975 72B4 85 72 sta temp + 1976 72B6 B9 13 44 lda xtankstableH,y + 1977 72B9 85 73 sta temp+1 + 1978 ;now we should substract length of the text-1 + 1979 ;temp2 = (fx-1)*2 + 1980 72BB A4 83 ldy fx + 1981 72BD 88 dey + 1982 72BE 98 tya + 1983 72BF 0A asl + 1984 72C0 85 74 sta temp2 + 1985 72C2 A9 00 85 75 mva #0 temp2+1 + 1986 ;now we have HALF length in pixels + 1987 ;stored in temp2 + 1988 + 1989 ;here we assume max length of text + 1990 ;to display is 127 chars, but later it turns out it must be max 63! + 1991 + 1992 72C6 38 A5 72 E5 74 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!! + 1993 ;now we should check overflows + 1994 ;lda temp+1 ; opty + 1995 72D3 10 08 bpl DOTNnotLessThanZero + 1996 ;less than zero, so should be zero + 1997 72D5 A9 00 85 72 85 73 mwa #0 temp + 1998 72DB F0 32 beq DOTNnoOverflow + 1999 + 2000 72DD DOTNnotLessThanZero + 2001 ;so check if end larger than screenwidth + 2002 + 2003 + 2004 72DD A5 83 lda fx + 2005 72DF 0A asl + 2006 72E0 0A asl + 2007 ;length in pixels - + 2008 ;text length max 63 chars !!!!!!!! + 2009 + 2010 + 2011 72E1 18 clc + 2012 72E2 65 72 adc temp + 2013 72E4 85 74 sta temp2 + 2014 72E6 A9 00 lda #0 + 2015 72E8 65 73 adc temp+1 + 2016 72EA 85 75 sta temp2+1 + 2017 ;now in temp2 is end of the text in pixels + 2018 ;so check if not greater than screenwitdth + 2019 72EC A5 75 C9 01 D0 04 + cpw temp2 #screenwidth + 2020 72F6 90 17 bcc DOTNnoOverflow + 2021 + 2022 ;if end is greater than screenwidth + 2023 ;then screenwidth - length is fine + 2024 72F8 A5 83 lda fx + 2025 72FA 0A asl + 2026 72FB 0A asl + 2027 72FC 85 72 sta temp + 2028 72FE A9 00 85 73 mva #0 temp+1 + 2029 + 2030 7302 38 sec + 2031 7303 A9 3F lda #<(screenwidth-1) + 2032 7305 E5 72 sbc temp + 2033 7307 85 72 sta temp + 2034 7309 A9 01 lda #>(screenwidth-1) + 2035 730B E5 73 sbc temp+1 + 2036 730D 85 73 sta temp+1 + 2037 730F DOTNnoOverflow + 2038 ;here in temp we have really good x position of text + 2039 + 2040 730F A5 72 85 D9 A5 73 + mwa temp LineXdraw + 2041 + 2042 ;now let's get y position + 2043 ;we will try to put text as low as possible + 2044 ;just above mountains (so mountaintable will be checked) + 2045 7317 A5 83 lda fx + 2046 7319 0A asl + 2047 731A 0A asl + 2048 731B A8 tay + 2049 ;in temp there still is X position of text + 2050 ;if we add temp and Y we will get end of the text + 2051 ;so, lets go through mountaintable and look for + 2052 ;the lowest value within + 2053 ;Mountaitable+temp and Mountaitable+temp+Y + 2054 + 2055 731C 18 A5 72 69 3E 85 + adw temp #MountainTable + 2056 + 2057 7329 A9 C8 85 74 mva #screenheight temp2 ;initialisation of the lowest value + 2058 + 2059 732D DOTLowestMountainValueLoop + 2060 732D B1 72 lda (temp),y + 2061 732F C5 74 cmp temp2 + 2062 7331 B0 02 bcs DOTOldLowestValue ;old lowest value + 2063 ;new lowest value + 2064 7333 85 74 sta temp2 + 2065 7335 DOTOldLowestValue + 2066 7335 88 dey + 2067 7336 C0 FF cpy #$ff + 2068 7338 D0 F3 bne DOTLowestMountainValueLoop + 2069 + 2070 733A 38 sec + 2071 733B A5 74 lda temp2 + 2072 733D E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...) + 2073 733F 85 D8 sta LineYdraw + 2074 + 2075 7341 4C 76 73 jmp TypeLine4x4.noLengthNoColor ; rts + 2076 + 2077 .endp + 2078 + 2079 ;-------------------------------------------------------- + 2080 7344 .proc DisplayTankNameAbove ; + 2081 7344 A5 6C lda tankNr + 2082 7346 0A 0A 0A :3 asl ; *8 + 2083 7349 18 clc + 2084 734A 69 09 adc #Tanksnames + 2088 7352 85 73 sta temp+1 ; TextAddress+1 + 2089 7354 A5 72 85 B3 A5 73 + mwa temp LineAddress4x4 + 2090 + 2091 ;find length of the tank's name + 2092 735C A0 07 ldy #7 + 2093 @ + 2094 735E B1 72 lda (temp),y + 2095 7360 D0 03 bne end_found + 2096 7362 88 dey + 2097 7363 D0 F9 bne @- + 2098 + 2099 7365 end_found + 2100 7365 C8 iny + 2101 7366 84 83 sty fx + 2102 7368 A4 6C ldy tankNr + 2103 736A 20 B1 72 jsr Display4x4AboveTank + 2104 736D 60 rts + 2105 .endp + 2106 + 2107 ;------------------------------- + 2108 736E .proc TypeLine4x4 ; + 2109 ;------------------------------- + 2110 ;this routine prints line of length `fx` + 2111 ;address in LineAddress4x4 + 2112 ;starting from LineXdraw, LineYdraw + 2113 + 2114 736E A9 0E lda #14 ; default length of 4x4 texts + 2115 7370 85 83 sta fx + 2116 + 2117 7372 variableLength + 2118 7372 A9 FF lda #$ff ; $ff - visible characters, $00 - clearing + 2119 + 2120 7374 staplot4x4color + 2121 7374 85 DB sta plot4x4color + 2122 7376 noLengthNoColor + 2123 + 2124 7376 A0 00 ldy #0 + 2125 7378 8C E9 48 sty LineCharNr + 2126 + 2127 737B TypeLine4x4Loop + 2128 737B AC E9 48 ldy LineCharNr + 2129 + 2130 737E B1 B3 lda (LineAddress4x4),y + 2131 7380 29 3F and #$3f ;always CAPITAL letters + 2132 7382 8D EC 48 sta CharCode4x4 + 2133 7385 A5 D9 85 8B A5 DA + mwa LineXdraw dx + 2134 738D A5 D8 85 8D mva LineYdraw dy + 2135 7391 A9 00 85 8E mva #0 dy+1 ; dy is 2 bytes value + 2136 7395 20 85 71 jsr PutChar4x4 ;type empty pixels as well! + 2137 7398 18 A5 D9 69 04 85 + adw LineXdraw #4 + 2138 73A3 EE E9 48 AD E9 48 inc:lda LineCharNr + 2139 73A9 C5 83 cmp fx + 2140 73AB D0 CE bne TypeLine4x4Loop + 2141 + 2142 73AD EndOfTypeLine4x4 + 2143 73AD 60 rts + 2144 .endp + 2145 + 2146 + 2147 ;-------------------------------- + 2148 73AE .proc AreYouSure + 2149 ;using 4x4 font + 2150 + 2151 73AE A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen + 2152 + 2153 ;top frame + 2154 73B2 A5 B2 85 D8 mva ResultY LineYdraw + 2155 73B6 20 E8 65 jsr TL4x4_top + 2156 73B9 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2157 + 2158 ;sure? + 2159 73C0 A9 5D 85 B3 A9 5B + mwa #areYouSureText LineAddress4x4 + 2160 73C8 20 02 74 jsr _sep_opty + 2161 ;bottom frame + 2162 73CB A5 B2 85 D8 mva ResultY LineYdraw + 2163 73CF 20 D5 65 jsr TL4x4_bottom + 2164 + 2165 + 2166 73D2 20 5F 5A jsr GetKey + 2167 73D5 C9 2B cmp #@kbcode._Y ; $2b ; "Y" + 2168 73D7 D0 06 bne @+ + 2169 73D9 A9 80 85 D7 mva #$80 escFlag + 2170 73DD D0 04 bne skip01 + 2171 73DF A9 00 85 D7 @ mva #0 escFlag + 2172 73E3 skip01 + 2173 73E3 20 71 5A jsr WaitForKeyRelease + 2174 + 2175 ;clean + 2176 73E6 A9 03 85 91 mva #3 di + 2177 73EA A9 04 85 B2 mva #4 ResultY + 2178 @ + 2179 73EE A9 FF 85 DB mva #$ff plot4x4color + 2180 73F2 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 + 2181 73FA 20 02 74 jsr _sep_opty + 2182 73FD C6 91 dec di + 2183 73FF D0 ED bne @- + 2184 + 2185 7401 quit_areyousure + 2186 7401 60 rts + 2187 .endp + 2188 + 2189 7402 .proc _sep_opty + 2190 7402 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering + 2191 740A A5 B2 85 D8 mva ResultY LineYdraw + 2192 740E 20 6E 73 jsr TypeLine4x4 + 2193 7411 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2194 7418 60 rts + 2195 .endp + 2196 + 2197 ;-------------------------------- + 2198 7419 .proc DisplaySeppuku + 2199 ;using 4x4 font + 2200 + 2201 + 2202 7419 A9 14 85 89 mva #20 fs ; temp, how many times blink the billboard + 2203 741D seppuku_loop + 2204 741D A5 02 lda CONSOL ; turbo mode + 2205 741F 29 01 and #%00000001 ; START KEY + 2206 7421 D0 04 A9 01 85 89 sne:mva #1 fs ; finish it + 2207 + 2208 7427 A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen + 2209 + 2210 ;top frame + 2211 742B A5 B2 85 D8 mva ResultY LineYdraw + 2212 742F 20 E8 65 jsr TL4x4_top + 2213 7432 A5 B2 18 69 04 85 + adb ResultY #4 ;next line + 2214 + 2215 ;seppuku + 2216 7439 A9 4F 85 B3 A9 5B + mwa #seppukuText LineAddress4x4 + 2217 7441 20 02 74 jsr _sep_opty + 2218 + 2219 ;bottom frame + 2220 7444 A5 B2 85 D8 mva ResultY LineYdraw + 2221 7448 20 D5 65 jsr TL4x4_bottom ; just go + 2222 + 2223 ;clean seppuku + 2224 + 2225 744B A9 03 85 91 mva #3 di + 2226 ;mva #4 ResultY + 2227 744F A9 04 lda #4 + 2228 7451 85 B2 sta ResultY + 2229 7453 loplop ;@ + 2230 7453 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 + 2231 745B 20 02 74 jsr _sep_opty + 2232 + 2233 745E C6 91 dec di + 2234 7460 D0 F1 bne loplop ;@- + 2235 + 2236 7462 C6 89 dec fs + 2237 7464 D0 B7 jne seppuku_loop + 2238 + 2239 7466 quit_seppuku + 2240 7466 60 rts + 2241 + 2242 .endp + 2243 + 2244 ; ------------------------------------- + 2245 7467 .proc SetupXYdraw + 2246 7467 BD 19 44 lda ytankstable,x + 2247 746A 85 63 sta ydraw + 2248 746C A9 00 85 64 mva #0 ydraw+1 + 2249 7470 BD 0D 44 X lda XtanksTableL,x + 2250 7473 85 61 sta xdraw + 2251 7475 BD 13 44 lda XtanksTableH,x + 2252 7478 85 62 sta xdraw+1 + 2253 747A 60 rts + 2254 .endp + 2255 ;-------------------------------------------------- + 2256 747B .proc DrawBarrel + 2257 ; X - tankNr + 2258 ; changes xdraw, ydraw, fx, fy + 2259 ;-------------------------------------------------- + 2260 ;vx calculation + 2261 ;vx = sin(90-Angle) for Angle <=90 + 2262 ;vx = -sin(Angle-90) for 90 < Angle <= 180 + 2263 + 2264 ; erase previous barrel + 2265 + 2266 ;cos(Angle) (but we use sin table only so some shenanigans happen) + 2267 ; mva #0 color + 2268 ; lda previousBarrelAngle,x + 2269 ; sta Angle + 2270 ; jsr DrawBarrelTech + 2271 ; + 2272 ; mva #1 color + 2273 747B A6 6C ldx TankNr + 2274 747D 20 67 74 jsr SetupXYdraw + 2275 7480 BD F1 43 lda BarrelLength,x + 2276 7483 85 8A sta yc ; current tank barrel length + 2277 7485 BD C3 48 lda angleTable,x + 2278 7488 85 A7 sta Angle + 2279 748A 20 8E 74 jsr DrawBarrelTech + 2280 748D 60 rts + 2281 .endp + 2282 + 2283 748E .proc DrawBarrelTech + 2284 ; angle in Angle and A + 2285 + 2286 748E A2 00 86 E6 mvx #0 goleft + 2287 7492 C9 5B cmp #91 + 2288 7494 90 17 bcc angleUnder90 + 2289 + 2290 ;over 90 + 2291 7496 38 sec + 2292 7497 E9 5A sbc #90 + 2293 7499 AA tax + 2294 ; barrel start offset over 90deg + 2295 749A 18 A5 61 69 04 85 + adw xdraw #4 xdraw + 2296 74A7 A9 01 85 E6 mva #1 goleft + 2297 74AB 10 13 bpl @+ ; jmp @+ + 2298 + 2299 74AD angleUnder90 + 2300 74AD 38 sec ; X = 90-Angle + 2301 74AE A9 5A lda #90 + 2302 74B0 E5 A7 sbc Angle + 2303 74B2 AA tax + 2304 ; barrel start offset under 90deg + 2305 74B3 18 A5 61 69 03 85 + adw xdraw #3 xdraw + 2306 + 2307 @ + 2308 74C0 38 A5 63 E9 03 85 + sbw ydraw #3 ydraw + 2309 74CD BD C1 5B lda sintable,x ; cos(X) + 2310 74D0 85 BB sta vx + 2311 + 2312 ;======vy + 2313 ;vy = sin(Angle) for Angle <=90 + 2314 ;vy = sin(180-Angle) for 90 < Angle <= 180 + 2315 + 2316 ;-- + 2317 74D2 A5 A7 lda Angle + 2318 74D4 C9 5B cmp #91 + 2319 74D6 90 05 bcc YangleUnder90 + 2320 + 2321 74D8 A9 B4 lda #180 + 2322 74DA 38 sec + 2323 74DB E5 A7 sbc Angle + 2324 74DD YangleUnder90 + 2325 74DD AA tax + 2326 74DE BD C1 5B lda sintable,x + 2327 74E1 85 B7 sta vy + 2328 + 2329 74E3 A9 00 lda #0 ; all arithmetic to zero + 2330 74E5 85 BC sta vx+1 + 2331 74E7 85 B8 sta vy+1 + 2332 74E9 A9 80 lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) + 2333 74EB 85 83 sta fx + 2334 74ED 85 86 sta fy + 2335 + 2336 ; draw by vx vy + 2337 ; in each step + 2338 ; 1. plot(xdraw, ydraw) + 2339 ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy + 2340 ; 3 check length, if shorter, go to 1. + 2341 + 2342 ; mva #6 yc ; barrel length + 2343 74EF barrelLoop + 2344 + 2345 74EF A5 E6 lda goleft + 2346 74F1 D0 16 bne goright + 2347 74F3 18 clc + 2348 74F4 A5 83 lda fx + 2349 74F6 65 BB adc vx + 2350 74F8 85 83 sta fx + 2351 74FA 90 0A bcc @+ + 2352 74FC A5 61 lda xdraw + 2353 74FE 65 BC adc vx+1 + 2354 7500 85 61 sta xdraw + 2355 7502 90 02 bcc @+ + 2356 7504 E6 62 inc xdraw+1 + 2357 @ + 2358 7506 4C 1C 75 jmp ybarrel + 2359 7509 goright + 2360 7509 38 sec + 2361 750A A5 83 lda fx + 2362 750C E5 BB sbc vx + 2363 750E 85 83 sta fx + 2364 7510 B0 0A bcs @+ + 2365 7512 A5 61 lda xdraw + 2366 7514 E5 BC sbc vx+1 + 2367 7516 85 61 sta xdraw + 2368 7518 B0 02 bcs @+ + 2369 751A C6 62 dec xdraw+1 + 2370 @ + 2371 751C ybarrel + 2372 751C 38 sec + 2373 751D A5 86 lda fy + 2374 751F E5 B7 sbc vy + 2375 7521 85 86 sta fy + 2376 7523 B0 0A bcs @+ + 2377 7525 A5 63 lda ydraw + 2378 7527 E5 B8 sbc vy+1 + 2379 7529 85 63 sta ydraw + 2380 752B B0 02 bcs @+ + 2381 752D C6 64 dec ydraw+1 + 2382 @ + 2383 752F 20 14 76 jsr plot ;.MakePlot + 2384 + 2385 7532 C6 8A dec yc + 2386 7534 D0 B9 bne barrelLoop + 2387 + 2388 7536 A5 61 8D C9 48 A5 + mwa xdraw EndOfTheBarrelX + 2389 7540 A5 63 8D CB 48 mva ydraw EndOfTheBarrelY + 2390 + 2391 7545 60 rts + 2392 .endp + 2393 ;-------------------------------------------------- + 2394 7546 .proc PMoutofScreen + 2395 ;-------------------------------------------------- + 2396 7546 A9 00 lda #$00 ; let all P/M disappear + 2397 7548 A0 07 ldy #7 + 2398 754A 99 02 00 @ sta hposp0,y + 2399 754D 88 dey + 2400 754E 10 FA bpl @- + 2401 ;:8 sta hposp0+# ; optimized... but Y! + 2402 7550 60 rts + 2403 .endp + 2404 ;-------------------------------------------------- + 2405 7551 .proc ColorsOfSprites + 2406 7551 A0 03 ldy #3 + 2407 7553 B9 79 5B @ lda TankColoursTable,y ; colours of sprites under tanks + 2408 7556 99 02 00 sta PCOLR0,y + 2409 7559 88 dey + 2410 755A 10 F7 bpl @- + 2411 755C AD 7D 5B LDA TankColoursTable+4 + 2412 755F 85 02 STA COLOR3 ; joined missiles (5th tank) + 2413 7561 60 rts + 2414 .endp + 2415 ;-------------------------------------------------- + 2416 7562 .proc SetPMWidth + 2417 7562 A9 55 lda #%01010101 + 2418 7564 85 02 sta sizem ; all missiles, double width + 2419 7566 A9 00 lda #$00 + 2420 7568 85 02 sta sizep0 ; P0-P3 widths + 2421 756A 85 03 sta sizep0+1 + 2422 756C 85 04 sta sizep0+2 + 2423 756E 85 05 sta sizep0+3 + 2424 7570 60 rts + 2425 .endp + 2426 + 2427 .endif + 349 7571 icl 'C64/gr_basics.asm' +Source: gr_basics.asm + 1 .IF *>0 ;this is a trick that prevents compiling this file alone + 2 + 3 ; Basic hardware-dependent graphics routines. + 4 + 5 ; ----------------------------------------- + 6 7571 .proc unPlot + 7 ; plots a point and saves the plotted byte, reverts the previous plot. + 8 ; ----------------------------------------- + 9 7571 A2 00 ldx #0 ; only one pixel + 10 7573 unPlotAfterX + 11 7573 8E 96 44 stx WhichUnPlot + 12 + 13 ; first remake the oldie + 14 7576 BD 9C 44 lda oldplotL,x + 15 7579 85 6E sta oldplot + 16 757B BD 97 44 lda oldplotH,x + 17 757E 85 6F sta oldplot+1 + 18 + 19 7580 A0 00 ldy #0 + 20 7582 BD A1 44 lda oldora,x + 21 7585 91 6E sta (oldplot),y + 22 + 23 + 24 ; is it not out of the screen ???? + 25 7587 A5 64 C9 00 D0 04 + cpw ydraw #screenheight + 26 7591 90 06 jcc CheckX + 27 7593 A9 00 85 63 85 64 mwa #0 ydraw + 28 7599 CheckX + 29 7599 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 30 75A3 B0 6E jcs EndOfUnPlot + 31 75A5 MakeUnPlot + 32 ; let's count coordinates taken from xdraw and ydraw + 33 75A5 A5 61 lda xdraw + 34 75A7 29 F8 and #%11111000 + 35 ;sta xbyte + 36 ;--- + 37 75A9 A6 63 ldx ydraw + 38 75AB 18 clc + 39 75AC 7D 68 41 adc linetableL,x + 40 75AF 85 65 sta xbyte + 41 75B1 85 6E sta oldplot + 42 75B3 BD 31 42 lda linetableH,x + 43 75B6 65 62 adc xdraw+1 + 44 75B8 85 66 sta xbyte+1 + 45 75BA 85 6F sta oldplot+1 + 46 + 47 75BC A5 61 lda xdraw + 48 75BE 29 07 and #$7 + 49 75C0 AA tax + 50 75C1 A0 00 ldy #0 + 51 + 52 75C3 A5 A9 lda color + 53 75C5 D0 0C bne ClearUnPlot + 54 + 55 ;plotting here + 56 75C7 B1 65 lda (xbyte),y + 57 75C9 8D AB 44 sta OldOraTemp + 58 75CC 1D 1C 5C ora bittable,x + 59 75CF 91 65 sta (xbyte),y + 60 75D1 D0 0A bne ContinueUnPlot ; allways <>0 + 61 75D3 ClearUnPlot + 62 75D3 B1 65 lda (xbyte),y + 63 75D5 8D AB 44 sta OldOraTemp + 64 75D8 3D 24 5C and bittable2,x + 65 75DB 91 65 sta (xbyte),y + 66 75DD ContinueUnPlot + 67 75DD AE 96 44 ldx WhichUnPlot + 68 75E0 AD AB 44 lda OldOraTemp + 69 75E3 9D A1 44 sta oldora,x + 70 75E6 A5 6E lda oldplot + 71 75E8 9D 9C 44 sta oldplotL,x + 72 75EB A5 6F lda oldplot+1 + 73 75ED 9D 97 44 sta oldplotH,x + 74 ; and now we must solve the problem of several plots + 75 ; in one byte + 76 75F0 A2 04 ldx #4 + 77 75F2 AC 96 44 ldy WhichUnPlot + 78 75F5 LetsCheckOverlapping + 79 75F5 EC 96 44 cpx WhichUnPlot + 80 75F8 F0 16 beq SkipThisPlot + 81 75FA BD 9C 44 lda oldplotL,x + 82 75FD D9 9C 44 cmp oldplotL,y + 83 7600 D0 0E bne NotTheSamePlot + 84 7602 BD 97 44 lda oldplotH,x + 85 7605 D9 97 44 cmp oldplotH,y + 86 7608 D0 06 bne NotTheSamePlot + 87 ; the pixel is in the same byte so let's take correct contents + 88 760A BD A1 44 lda oldora,x + 89 760D 99 A1 44 sta oldora,y + 90 7610 NotTheSamePlot + 91 7610 SkipThisPlot + 92 7610 CA dex + 93 7611 10 E2 bpl LetsCheckOverlapping + 94 7613 EndOfUnPlot + 95 7613 60 rts + 96 .endp + 97 + 98 ; ----------------------------------------- + 99 7614 .proc plot ;plot (xdraw, ydraw, color) + 100 ; color == 1 --> put pixel + 101 ; color == 0 --> erase pixel + 102 ; this is one of the most important routines in the whole + 103 ; game. If you are going to speed up the game, start with + 104 ; plot - it is used by every single effect starting from explosions + 105 ; through line drawing and small text output!!! + 106 ; + 107 ; Optimized by 0xF (Fox) THXXXX!!! + 108 + 109 ; ----------------------------------------- + 110 ; is it not over the screen ??? + 111 7614 A5 64 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + 112 761E B0 F3 bcs unPlot.EndOfUnPlot ;nearest RTS + 113 7620 CheckX02 + 114 7620 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 115 762A B0 25 bcs EndOfPlot + 116 762C MakePlot + 117 ; let's calculate coordinates from xdraw and ydraw + 118 + 119 762C A5 61 lda xdraw + 120 762E 29 F8 and #%11111000 + 121 ;sta xbyte + 122 ;--- + 123 7630 A6 63 ldx ydraw + 124 7632 18 clc + 125 7633 7D 68 41 adc linetableL,x + 126 7636 85 65 sta xbyte + 127 7638 BD 31 42 lda linetableH,x + 128 763B 65 62 adc xdraw+1 + 129 763D 85 66 sta xbyte+1 + 130 + 131 763F A5 61 lda xdraw + 132 7641 29 07 and #$7 + 133 7643 AA tax + 134 7644 A0 00 ldy #0 + 135 7646 A5 A9 lda color + 136 7648 D0 08 bne ClearPlot + 137 + 138 764A B1 65 lda (xbyte),y + 139 764C 1D 1C 5C ora bittable,x + 140 764F 91 65 sta (xbyte),y + 141 7651 EndOfPlot + 142 7651 60 rts + 143 7652 ClearPlot + 144 7652 B1 65 lda (xbyte),y + 145 7654 3D 24 5C and bittable2,x + 146 7657 91 65 sta (xbyte),y + 147 7659 60 rts + 148 .endp + 149 + 150 ; ----------------------------------------- + 151 765A .proc point_plot + 152 ; ----------------------------------------- + 153 ; checks state of the pixel (coordinates in xdraw and ydraw) + 154 ; result is in A (zero or appropriate bit is set) + 155 + 156 ; let's calculate coordinates from xdraw and ydraw + 157 + 158 765A A5 61 lda xdraw + 159 765C 29 F8 and #%11111000 + 160 ;sta xbyte + 161 ;--- + 162 765E A6 63 ldx ydraw + 163 7660 18 clc + 164 7661 7D 68 41 adc linetableL,x + 165 7664 85 65 sta xbyte + 166 7666 BD 31 42 lda linetableH,x + 167 7669 65 62 adc xdraw+1 + 168 766B 85 66 sta xbyte+1 + 169 + 170 766D A5 61 lda xdraw + 171 766F 29 07 and #$7 + 172 7671 AA tax + 173 7672 A0 00 ldy #0 + 174 7674 B1 65 lda (xbyte),y + 175 7676 49 FF eor #$ff + 176 7678 3D 1C 5C and bittable,x + 177 767B 60 rts + 178 .endp + 179 + 180 ;-------------------------------------------------- + 181 767C .proc ClearScreen + 182 ;-------------------------------------------------- + 183 767C A9 00 85 72 A9 20 + mwa #displayC64 temp + 184 7684 A0 00 ldy #0 + 185 7686 A9 FF @ lda #$ff + 186 7688 91 72 sta (temp),y + 187 768A E6 72 D0 02 E6 73 inw temp + 188 7690 A5 73 C9 3F D0 04 + cpw temp #displayC64+screenheight*screenBytes+1 + 189 769A D0 EA bne @- + 190 769C 60 rts + 191 .endp + 192 + 193 ;-------------------------------------------------- + 194 769D .proc GenerateLineTable + 195 + 196 769D A9 00 85 72 A9 20 + mwa #displayC64 temp + 197 76A5 A9 68 85 74 A9 41 + mwa #linetableL temp2 + 198 76AD A9 31 85 76 A9 42 + mwa #linetableH modify + 199 76B5 A0 00 ldy #0 + 200 76B7 A2 00 ldx #0 + 201 76B9 A5 72 @ lda temp + 202 76BB 91 74 sta (temp2),y + 203 76BD A5 73 lda temp+1 + 204 76BF 91 76 sta (modify),y + 205 76C1 E0 07 cpx #7 + 206 76C3 D0 12 bne NotChar + 207 76C5 A2 00 ldx #0 + 208 76C7 18 A5 72 69 39 85 + adw temp #(320-7) + 209 76D4 4C DE 76 jmp next8lines + 210 76D7 NotChar + 211 76D7 E6 72 D0 02 E6 73 inw temp + 212 76DD E8 inx + 213 76DE next8lines + 214 76DE C8 iny + 215 76DF C0 C9 cpy #screenheight+1 + 216 76E1 D0 D6 bne @- + 217 76E3 60 rts + 218 .endp + 219 ;-------------------------------------------------- + 220 76E4 .proc SetMainScreen + 221 76E4 A9 0B lda #$b ; Grey background and border + 222 76E6 8D 20 D0 sta $d020 + 223 76E9 8D 21 D0 sta $d021 + 224 + 225 76EC AD 00 DD lda $dd00 ; Set video bank to start at 0 + 226 76EF 29 FC and #252 + 227 76F1 09 03 ora #3 + 228 76F3 8D 00 DD sta $dd00 + 229 76F6 A9 18 lda #$18 + 230 76F8 8D 18 D0 sta $d018 + 231 + 232 ; SwitchVICBank(0) + 233 ; SetScreenMemory($2000) + 234 76FB SetHiresBitmapMode ; Hires mode on +Macro: SETHIRESBITMAPMODE [Source: MACRO.ASM] + 4 76FB AD 11 D0 lda $d011 + 5 76FE 29 BF and #%10111111 + 6 7700 09 20 ora #%00100000 + 7 7702 8D 11 D0 sta $d011 + 12 7705 AD 16 D0 lda $d016 + 13 7708 29 EF and #%11101111 + 14 770A 8D 16 D0 sta $d016 +Source: gr_basics.asm + 235 770D A9 00 lda #$00 + 236 770F 8D 21 D0 sta 53281 + 237 ; clear color RAM + 238 7712 A2 00 ldx #0 + 239 7714 A9 01 @ lda #1 + 240 7716 9D 00 D8 sta $d800,x + 241 7719 9D 00 D9 sta $d900,x + 242 771C 9D 00 DA sta $da00,x + 243 771F 9D 00 DB sta $db00,x + 244 7722 A9 0F lda #$0f + 245 7724 9D 00 04 sta $0400,x + 246 7727 9D 00 05 sta $0500,x + 247 772A 9D 00 06 sta $0600,x + 248 772D 9D 00 07 sta $0700,x + 249 7730 E8 inx + 250 7731 D0 E1 bne @- + 251 + 252 + 253 7733 60 rts + 254 .endp + 255 + 256 .ENDIF + 350 ;---------------------------------------------- + 351 7734 icl 'weapons.asm' +Source: weapons.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 ;-------------------------------------------------- + 5 7734 .proc Explosion + 6 ; xdraw,ydraw (word) - coordinates of explosion center + 7 ; TankNr - number of shooting tank + 8 ; ActiveWeapon(TankNr) - weapon that tank fires + 9 ;-------------------------------------------------- + 10 ;cleanup of the soil fall down ranges (left and right) + 11 7734 20 89 8F jsr ClearScreenSoilRange + 12 + 13 7737 A6 6C ldx TankNr + 14 7739 BD F7 43 lda ActiveWeapon,x + 15 .endp + 16 773C .proc ExplosionDirect + 17 773C 0A asl + 18 773D AA tax + 19 773E BD 48 77 lda ExplosionRoutines+1,x + 20 7741 48 pha + 21 7742 BD 47 77 lda ExplosionRoutines,x + 22 7745 48 pha + 23 7746 60 rts + 24 7747 ExplosionRoutines + 25 7747 A1 77 .word babymissile-1 ;Baby_Missile___;_00 + 26 7749 AC 77 .word missile-1 ;Missile________;_01 + 27 774B B2 77 .word babynuke-1 ;Baby_Nuke______;_02 + 28 774D BC 77 .word nuke-1 ;Nuke___________;_03 + 29 774F C2 77 .word leapfrog-1 ;LeapFrog_______;_04 + 30 7751 FE 77 .word funkybomb-1 ;Funky_Bomb_____;_05 + 31 7753 FD 77 .word mirv-1 ;MIRV___________;_06 + 32 7755 B6 78 .word deathshead-1 ;Death_s_Head___;_07 + 33 7757 55 79 .word napalm-1 ;Napalm_________;_08 + 34 7759 5B 79 .word hotnapalm-1 ;Hot_Napalm_____;_09 + 35 775B 86 77 .word tracer-1 ;Tracer_________;_10 + 36 775D 86 77 .word tracer-1 ;Smoke_Tracer___;_11 + 37 775F 69 7A .word babyroller-1 ;Baby_Roller____;_12 + 38 7761 70 7A .word roller-1 ;Roller_________;_13 + 39 7763 76 7A .word heavyroller-1 ;Heavy_Roller___;_14 + 40 7765 06 7C .word riotcharge-1 ;Riot_Charge____;_15 + 41 7767 10 7C .word riotblast-1 ;Riot_Blast_____;_16 + 42 7769 7C 7A .word riotbomb-1 ;Riot_Bomb______;_17 + 43 776B 86 7A .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 + 44 776D 8C 7A .word babydigger-1 ;Baby_Digger____;_19 + 45 776F A1 7A .word digger-1 ;Digger_________;_20 + 46 7771 A8 7A .word heavydigger-1 ;Heavy_Digger___;_21 + 47 7773 AF 7A .word babysandhog-1 ;Baby_Sandhog___;_22 + 48 7775 B6 7A .word sandhog-1 ;Sandhog________;_23 + 49 7777 BD 7A .word heavysandhog-1 ;Heavy_Sandhog__;_24 + 50 7779 BE 7B .word dirtclod-1 ;Dirt_Clod______;_25 + 51 777B C4 7B .word dirtball-1 ;Dirt_Ball______;_26 + 52 777D CA 7B .word tonofdirt-1 ;Ton_of_Dirt____;_27 + 53 777F 22 7C .word liquiddirt-1 ;Liquid_Dirt____;_28 + 54 7781 FC 7B .word dirtcharge-1 ;Dirt_Charge____;_29 + 55 7783 87 77 .word BFG-1 ;Buy_me_________;_30 + 56 7785 FC 7C .word laser-1 ;Laser__________;_31 + 57 + 58 7787 VOID + 59 7787 tracer + 60 7787 60 rts + 61 .endp + 62 7788 .proc BFG + 63 7788 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect + 64 778C 20 9C A2 jsr BFGblink + 65 ; Kill all :) + 66 778F A6 AE ldx NumberOfPlayers + 67 7791 CA dex + 68 7792 A9 00 lda #$00 + 69 7794 CheckNextTankBFG + 70 7794 E4 6C cpx TankNr ; not me! + 71 7796 F0 03 beq @+ + 72 7798 9D A2 43 sta Energy,x + 73 779B CA @ dex + 74 779C 10 F6 bpl CheckNextTankBFG + 75 779E 8E D9 44 stx AfterBFGflag ; $ff + 76 77A1 60 rts + 77 .endp + 78 ; ------------------------ + 79 77A2 .proc babymissile + 80 77A2 A9 0B 85 B0 mva #11 ExplosionRadius + 81 77A6 GoBabyMissileSFX + 82 77A6 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 83 77AA GoXmissile + 84 77AA 4C C5 7D jmp xmissile + 85 .endp + 86 ; ------------------------ + 87 77AD .proc missile ; + 88 77AD A9 11 85 B0 mva #17 ExplosionRadius + 89 77B1 D0 F3 bne babymissile.GoBabyMissileSFX + 90 ; jmp xmissile + 91 .endp + 92 ; ------------------------ + 93 77B3 .proc babynuke + 94 77B3 A9 19 85 B0 mva #25 ExplosionRadius + 95 77B7 GoBabyNukeSFX + 96 77B7 A9 04 85 9E mva #sfx_nuke sfx_effect ; allways <>0 + 97 77BB D0 ED bne babymissile.GoXmissile + 98 ; jmp xmissile + 99 .endp + 100 ; ------------------------ + 101 77BD .proc nuke + 102 77BD A9 1E 85 B0 mva #30 ExplosionRadius + 103 77C1 D0 F4 bne babynuke.GoBabyNukeSFX + 104 ; jmp xmissile + 105 .endp + 106 ; ------------------------ + 107 77C3 .proc leapfrog + 108 77C3 A9 11 85 B0 mva #17 ExplosionRadius + 109 ; mva #sfx_baby_missile sfx_effect + 110 ; jsr xmissile + 111 77C7 20 A6 77 jsr babymissile.GoBabyMissileSFX + 112 + 113 77CA 20 CD 77 jsr SecondRepeat + 114 + 115 77CD SecondRepeat + 116 ; soil must fall down now! there is no other way... + 117 ; hide tanks or they fall down with soil + 118 77CD 20 F4 6E jsr SoilDown2 + 119 + 120 ; it looks like force is divided by 4 here BUT" + 121 ; in Flight routine force is multiplied by 2 and left + 122 ; so, we have Force divided by 2 here (not accurately) + 123 ;lsr Force+1 + 124 ;ror Force + 125 77D0 46 A5 lsr Force+1 + 126 77D2 66 A4 ror Force + 127 77D4 AD 15 45 85 A7 mva LeapFrogAngle Angle + 128 77D9 A9 0C 85 9E mva #sfx_funky_hit sfx_effect + 129 77DD 38 A5 CC E9 05 85 + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + 130 77E8 20 A0 83 jsr Flight + 131 77EB A5 BF lda HitFlag + 132 77ED F0 0E beq EndOfLeapping + 133 77EF A9 0E 85 B0 mva #14 ExplosionRadius + 134 77F3 20 09 8F jsr CalculateExplosionRange0 + 135 77F6 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 136 77FA 4C C8 7D jmp xmissile.NoRangeCalc + 137 77FD EndOfLeapping + 138 77FD 60 rts + 139 .endp + 140 ; ------------------------ + 141 77FE .proc mirv ; the whole mirv is performed by Flight routine + 142 77FE 60 rts + 143 .endp + 144 ; ------------------------ + 145 77FF .proc funkybomb ; + 146 77FF A9 05 85 9E mva #sfx_baby_missile sfx_effect + 147 7803 A5 C9 8D AC 44 A5 + mwa xtraj+1 xtrajfb + 148 780D 38 A5 CC E9 05 8D + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) + 149 ;central Explosion + 150 781C A9 15 85 B0 mva #21 ExplosionRadius + 151 7820 20 09 8F jsr CalculateExplosionRange0 + 152 7823 20 C8 7D jsr xmissile.NoRangeCalc + 153 + 154 7826 20 F4 6E jsr SoilDown2 + 155 ; + 156 7829 20 0B 6A jsr cleartanks ; maybe not? + 157 782C A9 01 85 A9 mva #1 color + 158 7830 A9 00 85 A2 mva #0 FunkyWallFlag + 159 7834 A9 05 85 B1 mva #5 FunkyBombCounter + 160 7838 FunkyBombLoop + 161 7838 A9 01 85 E3 mva #1 tracerflag + 162 ;force randomization (range: 256-511) + 163 783C AD 1B D4 lda random + 164 783F 85 A4 sta Force + 165 7841 A9 01 85 A5 mva #1 Force+1 + 166 ;Angle randomization Range: (70-110 degrees) + 167 7845 randomize 70 110 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 7845 ?rand + 7 7845 AD 1B D4 lda random + 8 7848 C9 46 cmp #70 ;floor + 9 784A 90 F9 bcc ?rand + 10 784C C9 6F cmp #110+1 ;ceiling + 11 784E B0 F5 bcs ?rand +Source: weapons.asm + 168 7850 85 A7 sta Angle + 169 + 170 7852 A9 00 lda #0 + 171 7854 85 C8 sta xtraj + 172 7856 85 CB sta ytraj + 173 7858 AD AC 44 85 C9 AD + mwa xtrajfb xtraj+1 + 174 7862 AD AE 44 85 CC AD + mwa ytrajfb ytraj+1 + 175 786C A9 0C 85 9E mva #sfx_funky_hit sfx_effect + 176 7870 20 A0 83 jsr Flight + 177 7873 A9 00 85 B0 mva #0 ExplosionRadius ; if no explosion (off screen) + 178 ; if xdraw if over range then fix it + 179 7877 A5 62 lda xdraw+1 + 180 7879 10 06 bpl NoOnLeftEdge + 181 787B A9 00 lda #0 + 182 787D 85 61 sta xdraw + 183 787F 85 62 sta xdraw+1 + 184 7881 NoOnLeftEdge + 185 7881 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 186 788B 90 08 bcc NoOnRightEdge + 187 788D A9 40 85 61 A9 01 + mwa #screenwidth xdraw + 188 7895 NoOnRightEdge + 189 7895 20 0C 8F jsr CalculateExplosionRange ; add end of flight coordinates to soildown range + 190 7898 A5 BF lda HitFlag + 191 789A F0 0B beq NoExplosionInFunkyBomb + 192 789C A9 05 85 9E mva #sfx_baby_missile sfx_effect + 193 78A0 A9 0B 85 B0 mva #11 ExplosionRadius + 194 78A4 20 C5 7D jsr xmissile + 195 78A7 NoExplosionInFunkyBomb + 196 78A7 C6 B1 dec FunkyBombCounter + 197 78A9 D0 8D bne FunkyBombLoop + 198 78AB A9 00 85 E3 mva #0 tracerflag + 199 78AF A5 A2 lda FunkyWallFlag + 200 78B1 F0 03 beq NoWallsInFunky + 201 78B3 20 7A 8F jsr SetFullScreenSoilRange + 202 78B6 NoWallsInFunky + 203 78B6 60 rts + 204 .endp + 205 ; ------------------------ + 206 78B7 .proc deathshead + 207 78B7 A9 1E 85 B0 mva #30 ExplosionRadius + 208 78BB A9 04 85 9E mva #sfx_nuke sfx_effect + 209 78BF 20 32 79 jsr GoXmissileWithSaveXYdraw + 210 78C2 38 A5 61 E9 22 85 + sbw xdraw #34 + 211 78CD A9 04 85 9E mva #sfx_nuke sfx_effect + 212 78D1 20 32 79 jsr GoXmissileWithSaveXYdraw + 213 78D4 18 A5 61 69 44 85 + adw xdraw #68 + 214 78DF A9 04 85 9E mva #sfx_nuke sfx_effect + 215 78E3 20 32 79 jsr GoXmissileWithSaveXYdraw + 216 78E6 38 A5 61 E9 22 85 + sbw xdraw #34 + 217 ; + 218 78F1 38 A5 63 E9 22 85 + sbw ydraw #34 + 219 ;jsr CalculateExplosionRange + 220 78FC A5 64 C9 00 D0 04 + cpw ydraw #screenHeight + 221 7906 B0 07 bcs NoUpperCircle + 222 7908 A9 04 85 9E mva #sfx_nuke sfx_effect + 223 790C 20 32 79 jsr GoXmissileWithSaveXYdraw + 224 790F NoUpperCircle + 225 790F 18 A5 63 69 44 85 + adw ydraw #68 + 226 ;jsr CalculateExplosionRange + 227 791A A5 64 C9 00 D0 04 + cpw ydraw #screenHeight + 228 7924 B0 07 bcs NoLowerCircle + 229 7926 A9 04 85 9E mva #sfx_nuke sfx_effect + 230 792A 20 32 79 jsr GoXmissileWithSaveXYdraw + 231 792D NoLowerCircle + 232 792D A9 15 85 9E mva #sfx_silencer sfx_effect + 233 7931 60 rts + 234 + 235 7932 GoXmissileWithSaveXYdraw + 236 7932 A5 61 85 78 A5 62 + mwa xdraw tempXROLLER + 237 793A A5 63 85 76 A5 64 + mwa ydraw modify + 238 7942 20 C5 7D jsr xmissile + 239 7945 A5 78 85 61 A5 79 + mwa tempXROLLER xdraw + 240 794D A5 76 85 63 A5 77 + mwa modify ydraw + 241 7955 60 rts + 242 .endp + 243 ; ------------------------ + 244 7956 .proc napalm + 245 7956 A9 00 85 B1 mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm + 246 795A F0 04 beq xnapalm + 247 .endp + 248 ; ------------------------ + 249 795C .proc hotnapalm + 250 795C A9 01 85 B1 mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm + 251 ; jmp xnapalm + 252 .endp + 253 ; ------------------------ + 254 7960 .proc xnapalm + 255 7960 A9 09 85 9E mva #sfx_napalm sfx_effect + 256 7964 A9 0E 85 B0 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) + 257 7968 20 0C 8F jsr CalculateExplosionRange + 258 ; + 259 796B A5 61 85 B3 A5 62 + mwa xdraw xcircle ; store hitpoint for future repeats + 260 7973 A0 1E ldy #30 ; repeat 30 times + 261 7975 84 C6 sty magic + 262 7977 RepeatNapalm ; external loop (for fire animation) + 263 7977 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 264 797F 38 A5 61 E9 0A 85 + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point + 265 798A A0 00 ldy #0 + 266 798C 84 C7 sty magic+1 + 267 798E RepeatFlame ; internal loop (draw flames) + 268 798E A0 00 ldy #0 + 269 7990 18 A5 61 69 3E 85 + adw xdraw #mountaintable temp + 270 799D 84 64 sty ydraw+1 + 271 799F B1 72 lda (temp),y + 272 79A1 38 sec + 273 79A2 E9 01 sbc #1 ; over ground + 274 79A4 85 63 sta ydraw + 275 79A6 A5 61 lda xdraw + 276 79A8 25 B1 and HotNapalmFlag ; if hotnapalm and x is odd: + 277 79AA 0A 0A :2 asl ; modify y position 4 pixels up + 278 79AC A4 63 ldy ydraw + 279 79AE 85 63 sta ydraw + 280 79B0 98 tya + 281 79B1 38 sec + 282 79B2 E5 63 sbc ydraw + 283 79B4 85 63 sta ydraw + 284 79B6 38 A5 61 E9 04 85 + sbw xdraw #4 ; half character correction + 285 ; draw flame symbol + 286 79C1 A5 C6 lda magic ; if last repeat - clear flames + 287 79C3 F0 0A beq LastNapalmRepeat + 288 79C5 AD 1B D4 lda random + 289 79C8 29 06 and #%00000110 + 290 79CA 18 clc + 291 79CB 69 14 adc #char_flame___________ + 292 79CD D0 02 bne PutFlameChar + 293 79CF LastNapalmRepeat + 294 79CF A9 1C lda #char_clear_flame_____ ; clear flame symbol + 295 79D1 PutFlameChar + 296 79D1 85 69 sta CharCode + 297 ; check coordinates + 298 79D3 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-7) + 299 79DD B0 0D bcs CharOffTheScreen + 300 79DF A5 63 lda ydraw + 301 79E1 C9 07 cmp #7 + 302 79E3 90 07 bcc CharOffTheScreen + 303 79E5 C9 C7 cmp #(screenHeight-1) + 304 79E7 B0 03 bcs CharOffTheScreen + 305 79E9 20 E7 70 jsr TypeChar + 306 79EC CharOffTheScreen + 307 79EC 18 A5 61 69 04 85 + adw xdraw #4 ; reverse half character correction (we need positon of character center) + 308 79F7 18 A5 61 69 01 85 + adw xdraw #1 ; next char 1 pixels to right + 309 7A02 E6 C7 inc magic+1 + 310 7A04 A5 C7 lda magic+1 + 311 7A06 C9 15 cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center + 312 7A08 D0 84 jne RepeatFlame + 313 7A0A C6 C6 dec magic + 314 7A0C 30 03 4C 77 79 jpl RepeatNapalm + 315 ; after napalm + 316 ;now we must check tanks in range + 317 7A11 A6 AE ldx NumberOfPlayers + 318 7A13 CA dex + 319 7A14 BurnedCheckLoop + 320 7A14 BD AF 43 lda eXistenZ,x + 321 7A17 F0 49 beq EndNurnedCheckLoop + 322 ;here the tank exist + 323 ; calculate right edge of the fire + 324 7A19 18 A5 B3 69 12 85 + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction + 325 ; now we compare tank position with right edge of the fire (napalm) + 326 7A26 BD 13 44 lda XtankstableH,x + 327 7A29 C5 62 cmp xdraw+1 + 328 7A2B D0 05 bne @+ + 329 7A2D BD 0D 44 lda XtankstableL,x + 330 7A30 C5 61 cmp xdraw + 331 @ + 332 7A32 B0 2E bcs TankOutOfFire + 333 ; let's calculate left edge of the fire + 334 7A34 38 A5 B3 E9 12 85 + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction + 335 7A41 10 06 bpl @+ + 336 7A43 A9 00 85 61 85 62 mwa #0 xdraw ; left screen edge + 337 @ + 338 ; now we compare tank position with left edge of the fire (napalm) + 339 7A49 BD 13 44 lda XtankstableH,x + 340 7A4C C5 62 cmp xdraw+1 + 341 7A4E D0 05 bne @+ + 342 7A50 BD 0D 44 lda XtankstableL,x + 343 7A53 C5 61 cmp xdraw + 344 @ + 345 7A55 90 0B bcc TankOutOfFire + 346 + 347 7A57 A0 28 ldy #40 ; energy decrease (napalm) - but if hotnapalm: + 348 7A59 A5 B1 lda HotNapalmFlag + 349 7A5B F0 02 beq NotHot + 350 7A5D A0 50 ldy #80 ; energy decrease (hotnapalm) + 351 7A5F NotHot + 352 ; check shields ( joke :) ) + 353 7A5F 20 74 57 jsr DecreaseEnergyX + 354 7A62 TankOutOfFire + 355 7A62 EndNurnedCheckLoop + 356 7A62 CA dex + 357 7A63 10 AF bpl BurnedCheckLoop + 358 7A65 A9 15 85 9E mva #sfx_silencer sfx_effect + 359 7A69 60 rts + 360 .endp + 361 ; ------------------------ + 362 7A6A .proc babyroller + 363 7A6A A9 0B 85 B0 mva #11 ExplosionRadius + 364 7A6E GoRoller + 365 7A6E 4C A6 7E jmp xroller + 366 .endp + 367 ; ------------------------ + 368 7A71 .proc roller ; + 369 7A71 A9 15 85 B0 mva #21 ExplosionRadius + 370 7A75 D0 F7 bne babyroller.GoRoller ; 1 byte saved + 371 ; jmp xroller + 372 .endp + 373 ; ------------------------ + 374 7A77 .proc heavyroller + 375 7A77 A9 1E 85 B0 mva #30 ExplosionRadius + 376 7A7B D0 F1 bne babyroller.GoRoller ; 1 byte saved + 377 ; jmp xroller + 378 .endp + 379 ; ------------------------ + 380 7A7D .proc riotbomb + 381 7A7D A9 11 85 B0 mva #17 ExplosionRadius + 382 7A81 GoRiotBomb + 383 7A81 20 0C 8F jsr CalculateExplosionRange + 384 7A84 4C 8C 7E jmp xriotbomb + 385 .endp + 386 ; ------------------------ + 387 7A87 .proc heavyriotbomb + 388 7A87 A9 1D 85 B0 mva #29 ExplosionRadius + 389 7A8B D0 F4 bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) + 390 ; jsr CalculateExplosionRange + 391 ; jmp xriotbomb + 392 .endp + 393 ; ------------------------ + 394 7A8D .proc babydigger + 395 7A8D A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) + 396 7A92 GoBabydiggerSFX + 397 7A92 A9 14 85 9E mva #sfx_digger sfx_effect + 398 7A96 A9 00 8D 5E 44 mva #0 sandhogflag + 399 7A9B A9 0D 8D 39 44 mva #13 DigLong + 400 7AA0 D0 2F bne xdigger + 401 .endp + 402 ; ------------------------ + 403 7AA2 .proc digger ; + 404 7AA2 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) + 405 7AA7 D0 E9 bne babydigger.GoBabydiggerSFX + 406 .endp + 407 ; ------------------------ + 408 7AA9 .proc heavydigger + 409 7AA9 A9 07 8D 38 44 mva #7 diggery ; how many branches (-1) + 410 7AAE D0 E2 bne babydigger.GoBabydiggerSFX + 411 .endp + 412 ; ------------------------ + 413 7AB0 .proc babysandhog + 414 7AB0 A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) + 415 7AB5 D0 0C bne heavysandhog.GoHeavysandhogSFX + 416 .endp + 417 ; ------------------------ + 418 7AB7 .proc sandhog + 419 7AB7 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) + 420 7ABC D0 05 bne heavysandhog.GoHeavysandhogSFX + 421 .endp + 422 ; ------------------------ + 423 7ABE .proc heavysandhog + 424 7ABE A9 05 8D 38 44 mva #5 diggery ; how many branches (-1) + 425 7AC3 GoHeavysandhogSFX + 426 7AC3 A9 12 85 9E mva #sfx_sandhog sfx_effect + 427 7AC7 A9 08 8D 5E 44 mva #char_sandhog_offset sandhogflag + 428 7ACC A9 0D 8D 39 44 mva #13 DigLong + 429 ; jmp xdigger + 430 .endp + 431 ; ------------------------ + 432 7AD1 .proc xdigger + 433 ;mwa xdraw digstartx + 434 ;mwa ydraw digstarty + 435 7AD1 AE 38 44 ldx diggery + 436 7AD4 WriteToBranches + 437 7AD4 A5 61 lda xdraw + 438 7AD6 9D 3A 44 sta digtabxL,x + 439 7AD9 A5 62 lda xdraw+1 + 440 7ADB 9D 42 44 sta digtabxH,x + 441 7ADE A5 63 lda ydraw + 442 7AE0 9D 4A 44 sta digtabyL,x + 443 7AE3 A5 64 lda ydraw+1 + 444 7AE5 9D 52 44 sta digtabyH,x + 445 7AE8 CA dex + 446 7AE9 10 E9 bpl WriteToBranches + 447 7AEB 20 A3 7B jsr DiggerCharacter ; start character + 448 + 449 7AEE 18 A5 61 69 04 85 + adw xdraw #4 + 450 7AF9 AD 39 44 lda DigLong + 451 ; looks strange, but it is (DigLong+2)*4 + 452 7AFC 18 clc + 453 7AFD 69 02 adc #$2 + 454 7AFF 0A asl + 455 7B00 0A asl + 456 7B01 85 B0 sta ExplosionRadius + 457 7B03 20 0C 8F jsr CalculateExplosionRange + 458 7B06 BranchNotFinished + 459 7B06 AE 38 44 ldx diggery + 460 7B09 CalculateBranches + 461 7B09 8A txa + 462 7B0A 29 01 and #$01 + 463 7B0C D0 14 bne DigRight + 464 7B0E diglewy ; even branches go left + 465 7B0E 38 sec + 466 7B0F BD 3A 44 lda digtabxL,x + 467 7B12 E9 04 sbc #$04 + 468 7B14 9D 3A 44 sta digtabxL,x + 469 7B17 BD 42 44 lda digtabxH,x + 470 7B1A E9 00 sbc #$00 + 471 7B1C 9D 42 44 sta digtabxH,x + 472 7B1F 4C 33 7B jmp DigRandomize + 473 7B22 DigRight ; odd go right (everytime 4 pixels) + 474 7B22 18 clc + 475 7B23 BD 3A 44 lda digtabxL,x + 476 7B26 69 04 adc #$04 + 477 7B28 9D 3A 44 sta digtabxL,x + 478 7B2B BD 42 44 lda digtabxH,x + 479 7B2E 69 00 adc #$00 + 480 7B30 9D 42 44 sta digtabxH,x + 481 7B33 DigRandomize + 482 7B33 AD 1B D4 lda random + 483 7B36 29 87 and #$87 + 484 7B38 30 20 bmi DigUp + 485 7B3A DigDown + 486 7B3A 29 07 and #$07 + 487 7B3C 18 clc + 488 7B3D 7D 4A 44 adc digtabyL,x + 489 7B40 9D 4A 44 sta digtabyL,x + 490 7B43 BD 52 44 lda digtabyH,x + 491 7B46 69 00 adc #$00 + 492 7B48 9D 52 44 sta digtabyH,x + 493 ;crashing bug here - if too much added to digtaby, it gets over screenheight and starts writing over random areas + 494 ;WARNING! fix for 1 byte screenheight. TODO + 495 7B4B BD 4A 44 lda digtabyL,x + 496 7B4E C9 C8 cmp #screenheight + 497 7B50 90 05 bcc @+ ; branch if less + 498 7B52 A9 C7 lda #screenheight-1 + 499 7B54 9D 4A 44 sta digtabyL,x + 500 7B57 4C 6F 7B @ jmp DigCalculateNext + 501 7B5A DigUp + 502 7B5A 29 07 and #$07 + 503 7B5C 85 72 sta temp + 504 7B5E 38 sec + 505 7B5F BD 4A 44 lda digtabyL,x + 506 7B62 E5 72 sbc temp + 507 7B64 9D 4A 44 sta digtabyL,x + 508 7B67 BD 52 44 lda digtabyH,x + 509 7B6A E9 00 sbc #$00 + 510 7B6C 9D 52 44 sta digtabyH,x + 511 7B6F DigCalculateNext + 512 7B6F CA dex + 513 7B70 10 97 bpl CalculateBranches + 514 ; here we draw... + 515 7B72 AE 38 44 ldx diggery + 516 7B75 DigDrawing + 517 7B75 BD 3A 44 lda digtabxL,x + 518 7B78 85 61 sta xdraw + 519 7B7A BD 42 44 lda digtabxH,x + 520 7B7D 85 62 sta xdraw+1 + 521 7B7F BD 4A 44 lda digtabyL,x + 522 7B82 85 63 sta ydraw + 523 7B84 BD 52 44 lda digtabyH,x + 524 7B87 85 64 sta ydraw+1 + 525 7B89 phx +Macro: PHX [Source: MACRO.ASM] + 1 7B89 8A txa + 2 7B8A 48 pha +Source: weapons.asm + 526 7B8B 20 A3 7B jsr DiggerCharacter + 527 7B8E plx +Macro: PLX [Source: MACRO.ASM] + 1 7B8E 68 pla + 2 7B8F AA tax +Source: weapons.asm + 528 7B90 CA dex + 529 7B91 10 E2 bpl DigDrawing + 530 7B93 CE 39 44 AD 39 44 dec:lda DigLong + 531 7B99 30 03 4C 06 7B jpl BranchNotFinished + 532 7B9E DoNotPutDig + 533 7B9E A9 15 85 9E mva #sfx_silencer sfx_effect + 534 7BA2 60 rts + 535 7BA3 DiggerCharacter + 536 7BA3 AD 1B D4 lda random + 537 7BA6 29 06 and #$06 + 538 7BA8 18 clc + 539 7BA9 69 04 adc #char_digger__________ + 540 7BAB 6D 5E 44 adc sandhogflag + 541 7BAE 85 69 sta CharCode + 542 7BB0 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-6) + 543 7BBA B0 E2 bcs DoNotPutDig + 544 7BBC 4C E7 70 jmp TypeChar + 545 .endp + 546 ; ------------------------ + 547 7BBF .proc dirtclod + 548 7BBF A9 0C 85 B0 mva #12 ExplosionRadius + 549 7BC3 D0 0A bne xdirt + 550 .endp + 551 ; ------------------------ + 552 7BC5 .proc dirtball + 553 7BC5 A9 16 85 B0 mva #22 ExplosionRadius + 554 7BC9 D0 04 bne xdirt + 555 .endp + 556 ; ------------------------ + 557 7BCB .proc tonofdirt + 558 7BCB A9 1F 85 B0 mva #31 ExplosionRadius + 559 ; jmp xdirt + 560 .endp + 561 ; ----------------- + 562 7BCF .proc xdirt ; + 563 ; ----------------- + 564 7BCF 20 0C 8F jsr CalculateExplosionRange + 565 7BD2 A9 0A 85 9E mva #sfx_dirt_charge sfx_effect + 566 7BD6 A9 01 lda #1 + 567 7BD8 85 AB sta radius + 568 7BDA 85 A9 sta color + 569 7BDC dirtLoop + 570 7BDC 20 4A 68 jsr circle + 571 7BDF E6 63 D0 02 E6 64 inw ydraw + 572 7BE5 20 4A 68 jsr circle + 573 7BE8 A5 63 D0 02 C6 64 + .nowarn dew ydraw + 574 7BF0 E6 AB inc radius + 575 7BF2 A5 AB lda radius + 576 7BF4 C5 B0 cmp ExplosionRadius + 577 7BF6 D0 E4 bne dirtLoop + 578 7BF8 A9 15 85 9E mva #sfx_silencer sfx_effect + 579 7BFC 60 rts + 580 .endp + 581 ; ------------------------ + 582 7BFD .proc dirtcharge + 583 7BFD A9 3D 85 B0 mva #61 ExplosionRadius + 584 7C01 20 0C 8F jsr CalculateExplosionRange + 585 7C04 4C E1 7F jmp ofdirt + 586 .endp + 587 ; ------------------------ + 588 7C07 .proc riotcharge + 589 7C07 A9 11 85 9E mva #sfx_riot_blast sfx_effect + 590 7C0B A9 1F 85 B0 mva #31 ExplosionRadius + 591 7C0F D0 08 bne cleanDirt + 592 .endp + 593 ; ------------------------ + 594 7C11 .proc riotblast + 595 7C11 A9 11 85 9E mva #sfx_riot_blast sfx_effect + 596 7C15 A9 3D 85 B0 mva #61 ExplosionRadius + 597 ; jmp cleanDirt + 598 .endp + 599 ; ----------------- + 600 7C19 .proc cleanDirt + 601 ; ----------------- + 602 7C19 20 0C 8F jsr CalculateExplosionRange + 603 7C1C A9 00 85 A9 mva #0 color + 604 7C20 4C E9 7F jmp ofdirt.NoColor + 605 .endp + 606 ; ------------------------ + 607 7C23 .proc liquiddirt + 608 7C23 A9 1B 85 9E mva #sfx_liquid_dirt sfx_effect + 609 7C27 A9 FE 8D 5C 44 A9 + mwa #510 FillCounter + 610 ; ----- + 611 7C31 A5 61 8D 5A 44 A5 + mwa xdraw TempXfill + 612 7C3B RepeatFill + 613 7C3B AD 5A 44 85 61 AD + mwa TempXfill xdraw + 614 7C45 20 5A 7F jsr checkRollDirection + 615 ; HowMuchToFall - direction + 616 ; $FF - we are in a hole (flying in missile direction) + 617 ; 1 - right, 2 - left + 618 7C48 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 619 7C55 A0 00 ldy #0 + 620 7C57 B1 78 lda (tempXROLLER),y + 621 7C59 8D 37 44 sta HeightRol ; relative point + 622 + 623 7C5C RollinContinuesLiquid + 624 ; new point is set + 625 7C5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 626 7C69 A0 00 ldy #0 + 627 7C6B B1 78 lda (tempXROLLER),y + 628 7C6D 85 63 sta ydraw + 629 7C6F CD 37 44 cmp HeightRol + 630 7C72 F0 02 beq UpNotYet2 + 631 7C74 90 32 bcc FillNow + 632 7C76 UpNotYet2 + 633 7C76 38 sec ;clc + 634 7C77 8D 37 44 sta HeightRol + 635 7C7A E9 01 sbc #1 + 636 7C7C 85 63 sta ydraw + 637 7C7E A5 C5 lda HowMuchToFall + 638 7C80 C9 01 cmp #1 + 639 7C82 F0 12 beq HowMuchToFallRight3 + 640 7C84 A5 61 D0 02 C6 62 + .NOWARN dew xdraw + 641 7C8C A5 61 lda xdraw + 642 7C8E 25 62 and xdraw+1 + 643 7C90 C9 FF cmp #$ff ; like cpw xdraw #$ffff + 644 ;ora xdraw+1 ; like cpw xdraw #$0000 + 645 7C92 D0 C8 jne RollinContinuesLiquid + 646 7C94 F0 12 beq FillNow + 647 7C96 HowMuchToFallRight3 + 648 7C96 E6 61 D0 02 E6 62 inw xdraw + 649 7C9C A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 650 7CA6 D0 B4 jne RollinContinuesLiquid + 651 7CA8 FillNow + 652 ; finally one pixel more + 653 7CA8 A0 00 ldy #0 + 654 7CAA A5 C5 lda HowMuchToFall + 655 7CAC 30 18 bmi FillHole + 656 7CAE C9 01 cmp #1 + 657 7CB0 F0 0C beq FillLeft + 658 7CB2 E6 61 D0 02 E6 62 inw xdraw + 659 7CB8 E6 61 D0 02 E6 62 inw xdraw ; tricky but we must rollback xdraw in proper direction + 660 7CBE FillLeft + 661 7CBE A5 61 D0 02 C6 62 + .nowarn dew xdraw + 662 7CC6 FillHole + 663 7CC6 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 664 7CD3 B1 78 lda (tempXROLLER),y + 665 7CD5 85 63 sta ydraw + 666 7CD7 F0 0D beq ToHighFill ; if we filled all playfield (very rare but possible) + 667 7CD9 C6 63 dec ydraw ; one pixel up + 668 7CDB A5 63 lda ydraw + 669 7CDD 91 78 sta (tempXROLLER),y ;mountaintable update + 670 7CDF A9 01 85 A9 mva #1 color + 671 7CE3 20 2C 76 jsr plot.MakePlot + 672 7CE6 ToHighFill + 673 7CE6 AD 5C 44 D0 03 CE + .nowarn dew FillCounter + 674 7CF1 AD 5C 44 lda FillCounter + 675 7CF4 0D 5D 44 ora FillCounter+1 + 676 7CF7 F0 03 4C 3B 7C jne RepeatFill + 677 7CFC 60 rts + 678 .endp + 679 ; ------------------------ + 680 7CFD .proc laser + 681 ; in xdraw and ydraw we have hit point coordinates + 682 ; from Shoot/Flight procedures (invisible flight) + 683 ; ------------------------ + 684 7CFD A6 6C ldx TankNr + 685 7CFF BD C3 48 lda AngleTable,x + 686 7D02 A8 tay + 687 + 688 7D03 AD C9 48 85 65 AD + mwa EndOfTheBarrelX xbyte + 689 7D0D AD CB 48 85 67 mva EndOfTheBarrelY ybyte + 690 7D12 A9 00 85 68 mva #0 ybyte+1 + 691 7D16 8D 8B 44 sta LaserFlag ; turn on gravity and wind after shot :) + 692 + 693 7D19 A5 61 8D 16 45 A5 + mwa xdraw LaserCoordinate + 694 7D23 A5 63 8D 18 45 A5 + mwa ydraw LaserCoordinate+2 + 695 7D2D A5 65 8D 1A 45 A5 + mwa xbyte LaserCoordinate+4 + 696 7D37 A5 67 8D 1C 45 A5 + mwa ybyte LaserCoordinate+6 + 697 + 698 7D41 A9 02 85 9E mva #sfx_lightning sfx_effect + 699 + 700 7D45 A9 80 8D 73 43 mva #%10000000 drawFunction + 701 ;the above switches Draw to measuring length + 702 7D4A 20 12 66 jsr draw + 703 7D4D A9 00 8D 73 43 mva #0 drawFunction + 704 7D52 46 E2 lsr LineLength+1 ; LineLength / 8 + 705 7D54 66 E1 ror LineLength + 706 7D56 46 E1 lsr LineLength ; max line lenght is about 380 (9 bits) + 707 7D58 46 E1 lsr LineLength + 708 7D5A 38 sec + 709 7D5B A9 3C lda #60 + 710 7D5D E5 E1 sbc LineLength + 711 7D5F 85 8A sta yc ; laser blink counter 60-(LineLength/8) + 712 @ + 713 7D61 A5 8A lda yc + 714 7D63 29 01 and #$01 + 715 7D65 49 01 eor #$01 + 716 7D67 85 A9 sta color + 717 7D69 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw + 718 7D73 AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw + 719 7D7D AD 1A 45 85 65 AD + mwa LaserCoordinate+4 xbyte + 720 7D87 AD 1C 45 85 67 AD + mwa LaserCoordinate+6 ybyte + 721 7D91 A9 02 85 9E mva #sfx_lightning sfx_effect + 722 7D95 20 12 66 jsr draw + 723 + 724 7D98 C6 8A dec yc + 725 7D9A D0 C5 bne @- + 726 + 727 7D9C A9 01 85 A9 mva #1 color + 728 7DA0 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw + 729 7DAA AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw + 730 7DB4 A9 00 85 BF mva #0 HitFlag + 731 7DB8 20 84 8E jsr CheckCollisionWithTank + 732 7DBB A5 BF lda HitFlag + 733 7DBD F0 05 beq LaserMisses + 734 ; here we hit a tank (X) + 735 7DBF A0 64 ldy #100 + 736 7DC1 20 74 57 jsr DecreaseEnergyX + 737 7DC4 LaserMisses + 738 7DC4 60 rts + 739 .endp + 740 ; ----------------- + 741 7DC5 .proc xmissile ; + 742 ; ----------------- + 743 7DC5 20 0C 8F jsr CalculateExplosionRange + 744 7DC8 NoRangeCalc + 745 7DC8 A9 01 lda #1 + 746 7DCA 85 AB sta radius + 747 7DCC 85 A9 sta color + 748 7DCE ExplosionLoop + 749 7DCE 20 4A 68 jsr circle + 750 7DD1 E6 AB E6 AB :2 inc radius + 751 7DD5 A5 AB lda radius + 752 7DD7 C5 B0 cmp ExplosionRadius + 753 7DD9 90 F3 bcc ExplosionLoop + 754 + 755 7DDB A2 00 ldx #0 + 756 7DDD 86 A9 stx color + 757 7DDF E8 inx + 758 7DE0 86 AB stx radius + 759 7DE2 ExplosionLoop2 + 760 7DE2 20 4A 68 jsr circle + 761 7DE5 E6 AB inc radius + 762 7DE7 A5 AB lda radius + 763 7DE9 C5 B0 cmp ExplosionRadius + 764 7DEB 90 F5 bcc ExplosionLoop2 + 765 + 766 7DED A9 01 85 A9 mva #1 color + 767 + 768 ;check tanks' distance from the centre of the explosion + 769 + 770 7DF1 A9 80 8D 73 43 mva #%10000000 drawFunction + 771 ;the above switches Draw to measuring length + 772 ;trick is easy - how many pixels does it take to draw + 773 ;a line from one point to another + 774 ;it must be somehow easier than regular Pitagoras + 775 ;calculation + 776 + 777 7DF6 A6 AE ldx NumberOfPlayers + 778 7DF8 CA dex + 779 7DF9 DistanceCheckLoop + 780 7DF9 BD AF 43 lda eXistenZ,x + 781 7DFC D0 03 4C 81 7E jeq EndOfDistanceCheckLoop + 782 ;here the tank exist + 783 7E01 BD 0D 44 lda XtankstableL,x + 784 7E04 18 clc + 785 7E05 69 03 adc #3 ;measure from middle of the tank + 786 7E07 85 65 sta xbyte + 787 7E09 BD 13 44 lda XtankstableH,x + 788 7E0C 18 clc + 789 7E0D 69 00 adc #0 ;measure from middle of the tank + 790 7E0F 85 66 sta xbyte+1 + 791 7E11 BD 19 44 lda Ytankstable,x + 792 7E14 38 sec + 793 7E15 E9 02 sbc #2 ;measure from middle of the tank + 794 7E17 85 67 sta ybyte + 795 7E19 A9 00 lda #0 + 796 7E1B 85 68 sta ybyte+1 + 797 7E1D phx +Macro: PHX [Source: MACRO.ASM] + 1 7E1D 8A txa + 2 7E1E 48 pha +Source: weapons.asm + 798 7E1F 20 12 66 jsr draw + 799 7E22 plx +Macro: PLX [Source: MACRO.ASM] + 1 7E22 68 pla + 2 7E23 AA tax +Source: weapons.asm + 800 ;if tank within range of the explosion? + 801 7E24 A5 E2 lda LineLength+1 + 802 7E26 D0 59 bne TankIsNotWithinTheRange + 803 7E28 A5 E1 lda LineLength + 804 7E2A C5 B0 cmp ExplosionRadius + 805 7E2C B0 53 bcs TankIsNotWithinTheRange + 806 7E2E A5 B0 lda ExplosionRadius + 807 7E30 38 sec + 808 7E31 E5 E1 sbc LineLength + 809 ;multiply difference by 8 + 810 7E33 18 clc + 811 7E34 69 01 adc #1 + 812 7E36 0A 0A 0A :3 asl + 813 7E39 A8 tay + 814 ; check shields + 815 7E3A BD FD 43 lda ActiveDefenceWeapon,x + 816 7E3D C9 26 cmp #ind_Shield_________ ; one hit shield + 817 7E3F F0 25 beq UseShield + 818 7E41 C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute + 819 7E43 F0 12 beq UseShieldWithEnergy + 820 7E45 C9 27 cmp #ind_Heavy_Shield___ ; shield with energy + 821 7E47 F0 0E beq UseShieldWithEnergy + 822 7E49 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + 823 7E4B F0 0A beq UseShieldWithEnergy + 824 7E4D C9 25 cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) + 825 7E4F F0 06 beq UseShieldWithEnergy + 826 7E51 20 74 57 jsr DecreaseEnergyX + 827 7E54 4C 81 7E jmp EndOfDistanceCheckLoop + 828 7E57 UseShieldWithEnergy + 829 7E57 20 B0 57 jsr DecreaseShieldEnergyX + 830 7E5A C0 00 cpy #0 ; is necessary to reduce tenk energy ? + 831 7E5C F0 03 beq ShieldCoveredTank + 832 7E5E 20 74 57 jsr DecreaseEnergyX + 833 7E61 ShieldCoveredTank + 834 7E61 BD A8 43 lda ShieldEnergy,x + 835 7E64 D0 1B jne EndOfDistanceCheckLoop + 836 7E66 ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) + 837 7E66 UseShield + 838 7E66 A9 01 85 AA mva #1 Erase + 839 7E6A A5 6C lda TankNr + 840 7E6C 48 pha ; store TankNr + 841 7E6D 86 6C stx TankNr ; store X in TankNr :) + 842 7E6F 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 843 7E72 A9 00 lda #0 + 844 7E74 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defense weapons + 845 7E77 85 AA sta Erase + 846 7E79 20 2C 6A jsr DrawTankNr ; draw tank without shield + 847 7E7C A6 6C ldx TankNr ; restore X value :) + 848 7E7E 68 pla + 849 7E7F 85 6C sta TankNr ; restore TankNr value :) + 850 7E81 TankIsNotWithinTheRange + 851 7E81 EndOfDistanceCheckLoop + 852 7E81 CA dex + 853 7E82 30 03 4C F9 7D jpl DistanceCheckLoop + 854 7E87 A9 15 85 9E mva #sfx_silencer sfx_effect + 855 7E8B 60 rts + 856 .endp + 857 ; ----------------- + 858 7E8C .proc xriotbomb ; + 859 ; ----------------- + 860 7E8C A9 11 85 9E mva #sfx_riot_blast sfx_effect + 861 7E90 A9 00 lda #0 + 862 7E92 85 AB sta radius + 863 7E94 85 A9 sta color + 864 7E96 rbombLoop + 865 7E96 20 4A 68 jsr circle + 866 7E99 E6 AB inc radius + 867 7E9B A5 AB lda radius + 868 7E9D C5 B0 cmp ExplosionRadius + 869 7E9F D0 F5 bne rbombLoop + 870 7EA1 A9 01 85 A9 mva #1 color + 871 7EA5 60 rts + 872 .endp + 873 ; ---------------- + 874 7EA6 .proc xroller ; + 875 ; now collisions are detected with modified draw routine + 876 ; therefore YDRAW value must be taken from mountaintable + 877 7EA6 20 5A 7F jsr checkRollDirection + 878 ; HowMuchToFall - direction + 879 ; $FF - we are in a hole (flying in missile direction) + 880 ; 1 - right, 2 - left + 881 7EA9 Rollin + 882 7EA9 A9 0E 85 9E mva #sfx_shield_off sfx_effect + 883 7EAD 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 884 7EBA A0 00 ldy #0 + 885 7EBC B1 78 lda (tempXROLLER),y + 886 7EBE 8D 37 44 sta HeightRol ; relative point + 887 + 888 7EC1 RollinContinues + 889 7EC1 20 89 5A jsr WaitOneFrame + 890 7EC4 20 89 5A jsr WaitOneFrame + 891 ; new point is set + 892 7EC7 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 893 7ED4 A0 00 ldy #0 + 894 7ED6 B1 78 lda (tempXROLLER),y + 895 7ED8 85 63 sta ydraw + 896 7EDA 84 64 sty ydraw+1 + 897 7EDC F0 43 beq ExplodeNow + 898 7EDE CD 37 44 cmp HeightRol + 899 7EE1 F0 02 beq UpNotYet + 900 7EE3 90 3C bcc ExplodeNow + 901 7EE5 UpNotYet + 902 7EE5 38 sec ;clc + 903 7EE6 8D 37 44 sta HeightRol + 904 7EE9 E9 01 sbc #1 + 905 7EEB 85 63 sta ydraw + 906 ;check tank collision prior to PLOT + 907 7EED 84 BF sty HitFlag ; set to 0 + 908 + 909 7EEF 20 84 8E jsr CheckCollisionWithTank + 910 + 911 7EF2 A5 BF lda HitFlag + 912 7EF4 D0 2B bne ExplodeNow + 913 7EF6 20 71 75 jsr unPlot + 914 ; let's go the right direction + 915 7EF9 A5 C5 lda HowMuchToFall + 916 7EFB C9 01 cmp #1 + 917 7EFD F0 10 beq HowMuchToFallRight2 + 918 7EFF A5 61 D0 02 C6 62 + .nowarn dew xdraw + 919 7F07 A5 61 lda xdraw + 920 7F09 05 62 ora xdraw+1 + 921 7F0B D0 B4 jne RollinContinues ; like cpw xdraw #0 + 922 7F0D F0 12 beq ExplodeNow + 923 7F0F HowMuchToFallRight2 + 924 7F0F E6 61 D0 02 E6 62 inw xdraw + 925 7F15 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 926 7F1F D0 A0 jne RollinContinues + 927 7F21 ExplodeNow + 928 7F21 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store somewhere (BAD) + 929 7F29 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw (BAD) + 930 7F31 A9 00 85 61 85 62 mwa #0 xdraw + 931 7F37 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 932 7F3F 20 71 75 jsr unPlot + 933 7F42 A5 B3 85 61 A5 B4 + mwa xcircle xdraw ;(bad) + 934 7F4A A5 B5 85 63 A5 B6 + mwa ycircle ydraw ;(bad) + 935 + 936 ; finally a little explosion + 937 7F52 A9 05 85 9E mva #sfx_baby_missile sfx_effect + 938 7F56 4C C5 7D jmp xmissile + 939 7F59 60 rts + 940 .endp + 941 ; -------------------------------------------------- + 942 7F5A .proc checkRollDirection + 943 ; check rolling direction (for roller and other rolling weapons) + 944 ; xdraw (word) - X coordinate + 945 ; Y coordinate is taken from mountaintable and go to ydraw (word) + 946 ; shoot direction is taken from VX+3 + 947 ; result: + 948 ; HowMuchToFall - direction + 949 ; $FF - we are in a hole (flying in missile direction) + 950 ; 1 - right, 2 - left + 951 ; -------------------------------------------------- + 952 7F5A A0 00 ldy #0 + 953 7F5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 954 7F69 B1 78 lda (tempXROLLER),y + 955 7F6B 85 63 sta ydraw + 956 7F6D 84 64 sty ydraw+1 + 957 + 958 7F6F A5 BE lda vx+3 + 959 ; if horizontal velocity is negative then change the direction + 960 7F71 10 06 bpl PositiveVelocity + 961 7F73 A5 E6 lda goleft + 962 7F75 09 01 ora #$01 + 963 7F77 85 E6 sta goleft + 964 7F79 PositiveVelocity + 965 ; first we look for the left slope + 966 ; then righ slope and set the flag + 967 ; $FF - we are in a hole (flying in missile direction) + 968 ; 1 - right, 2 - left + 969 7F79 A9 FF 85 C5 mva #$ff HowMuchToFall + 970 7F7D A5 63 8D 37 44 mva ydraw HeightRol + 971 7F82 SeekLeft + 972 7F82 A5 79 C9 46 D0 04 + cpw tempXROLLER #mountaintable + 973 7F8C F0 13 beq GoRightNow ; "bounce" if we have on left end + 974 7F8E A5 78 D0 02 C6 79 + .nowarn dew tempXROLLER + 975 7F96 B1 78 lda (tempXROLLER),y ;fukk! beware of Y value + 976 7F98 CD 37 44 cmp HeightRol + 977 7F9B HowMuchToFallLeft + 978 7F9B B0 04 bcs GoRightNow + 979 7F9D A9 01 85 C5 mva #1 HowMuchToFall + 980 7FA1 GoRightNow + 981 7FA1 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER + 982 7FAE SeekRight + 983 7FAE A5 79 C9 47 D0 04 + cpw tempXROLLER #(mountaintable+screenwidth) + 984 7FB8 F0 1B beq HowMuchToFallKnown ; "stop" if we have on left end + 985 7FBA E6 78 D0 02 E6 79 inw tempXROLLER + 986 7FC0 B1 78 lda (tempXROLLER),y + 987 7FC2 CD 37 44 cmp HeightRol + 988 7FC5 HowMuchToFallRight + 989 7FC5 B0 0E bcs HowMuchToFallKnown + 990 7FC7 A5 C5 lda HowMuchToFall + 991 7FC9 10 06 bpl ItIsLeftAlready + 992 7FCB A9 02 85 C5 mva #2 HowMuchToFall + 993 7FCF D0 04 bne HowMuchToFallKnown + 994 7FD1 ItIsLeftAlready + 995 7FD1 A9 FF 85 C5 mva #$ff HowMuchToFall + 996 7FD5 HowMuchToFallKnown + 997 7FD5 A5 C5 lda HowMuchToFall + 998 7FD7 10 07 bpl DirectionChecked + 999 7FD9 A9 01 lda #1 + 1000 7FDB 18 clc + 1001 7FDC 65 E6 adc goleft + 1002 7FDE 85 C5 sta HowMuchToFall + 1003 7FE0 DirectionChecked + 1004 7FE0 60 rts + 1005 .endp + 1006 + 1007 ; -------------------------------------------------- + 1008 7FE1 .proc ofdirt ; + 1009 ; -------------------------------------------------- + 1010 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height + 1011 7FE1 A9 13 85 9E mva #sfx_dirt_chrg_s sfx_effect + 1012 + 1013 7FE5 A9 01 85 A9 mva #1 color + 1014 7FE9 NoColor ; jump here with color=0 to clean dirt + 1015 7FE9 A5 61 85 B3 A5 62 + mwa xdraw xcircle + 1016 7FF1 A5 63 85 B5 A5 64 + mwa ydraw ycircle + 1017 7FF9 A9 01 lda #1 + 1018 ; current dirt width + 1019 7FFB 85 C6 sta magic + 1020 7FFD NextRow + 1021 7FFD 20 89 5A jsr WaitOneFrame + 1022 8000 A4 C6 ldy magic + 1023 8002 NextLine + 1024 8002 AD 1B D4 lda random + 1025 8005 29 01 and #$01 + 1026 8007 F0 07 beq DoNotPlot + 1027 8009 84 C7 sty magic+1 + 1028 800B 20 14 76 jsr plot + 1029 800E A4 C7 ldy magic+1 + 1030 8010 DoNotPlot + 1031 8010 E6 61 D0 02 E6 62 inw xdraw + 1032 8016 88 dey + 1033 8017 D0 E9 bne NextLine + 1034 8019 C6 63 dec ydraw ; 1 line up + 1035 801B A5 63 lda ydraw + 1036 801D C9 FF cmp #$ff + 1037 801F F0 1B beq EndOfTheDirt ;if horizontal Counter wraps + 1038 8021 E6 C6 inc magic ; width+2 + 1039 8023 E6 C6 inc magic + 1040 8025 A5 C6 lda magic + 1041 8027 85 C7 sta magic+1 ; just for a second + 1042 8029 46 C7 lsr magic+1 + 1043 802B 38 sec + 1044 802C A5 B3 lda xcircle + 1045 802E E5 C7 sbc magic+1 + 1046 8030 85 61 sta xdraw + 1047 8032 A5 B4 lda xcircle+1 + 1048 8034 E9 00 sbc #0 + 1049 8036 85 62 sta xdraw+1 ; new starting coordinate in a given row + 1050 8038 C6 B0 dec ExplosionRadius + 1051 803A D0 C1 bne NextRow + 1052 803C EndOfTheDirt + 1053 803C A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 1054 8044 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 1055 804C 60 rts + 1056 .endp + 1057 ;-------------------------------------------------- + 1058 804D .proc BeforeFire ;TankNr (byte) + 1059 ;-------------------------------------------------- + 1060 ;this nice routine makes the whole shooting + 1061 ;preparation: aiming and displaying + 1062 ;angle and shooting force values + 1063 ; + 1064 + 1065 ;first, get current parameters (angle+force) + 1066 ;for an active tank and display them + 1067 ;(these values are taken from the previous round) + 1068 + 1069 804D A6 6C ldx TankNr + 1070 + 1071 ;Checking the maximal force + 1072 804F BD EB 43 lda MaxForceTableH,x + 1073 8052 DD DF 43 cmp ForceTableH,x + 1074 8055 D0 06 bne ContinueToCheckMaxForce2 + 1075 8057 BD E5 43 lda MaxForceTableL,x + 1076 805A DD D9 43 cmp ForceTableL,x + 1077 805D ContinueToCheckMaxForce2 + 1078 805D B0 0C bcs @+ + 1079 805F BD EB 43 lda MaxForceTableH,x + 1080 8062 9D DF 43 sta ForceTableH,x + 1081 8065 BD E5 43 lda MaxForceTableL,x + 1082 8068 9D D9 43 sta ForceTableL,x + 1083 @ + 1084 806B A9 00 85 AA mva #0 Erase + 1085 806F 20 0F 66 jsr PutTankNameOnScreen + 1086 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 1087 + 1088 8072 20 2C 6A jsr DrawTankNr + 1089 + 1090 8075 20 89 5A jsr WaitOneFrame ; best after drawing a tank + 1091 + 1092 8078 24 97 bit TestFlightFlag + 1093 807A 10 03 bpl @+ + 1094 807C 20 23 83 jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation + 1095 @ + 1096 ;keyboard reading + 1097 ; KBCODE keeps code of last keybi + 1098 ; SKSTAT $ff - nothing pressed + 1099 ; $FB - any key + 1100 ; $f7 - shift + 1101 ; $f3 - shift+key + 1102 + 1103 807F notpressed + 1104 807F A6 6C ldx TankNr ; for optimize + 1105 ; Select and Option + 1106 8081 A5 02 lda CONSOL + 1107 8083 A8 tay + 1108 8084 29 05 and #%00000101 ; Start + Option + 1109 8086 F0 2C beq QuitToGameover + 1110 8088 98 tya + 1111 8089 29 04 and #%00000100 + 1112 808B F0 3C beq callActivation ; Option key + 1113 808D 98 tya + 1114 808E 29 02 and #%00000010 + 1115 8090 D0 03 4C A0 82 jeq pressedTAB ; Select key + 1116 8095 A5 02 lda SKSTAT + 1117 8097 C9 FF cmp #$ff + 1118 8099 D0 03 4C 52 81 jeq checkJoy + 1119 809E C9 F7 cmp #$f7 ; SHIFT + 1120 80A0 D0 03 4C 52 81 jeq checkJoy + 1121 + 1122 80A5 A5 02 lda kbcode + 1123 80A7 29 BF and #%10111111 ; SHIFT elimination + 1124 + 1125 80A9 C9 08 cmp #@kbcode._O ; $08 ; O + 1126 80AB D0 0C bne @+ + 1127 80AD 20 AE 73 jsr AreYouSure + 1128 80B0 24 D7 bit escFlag + 1129 80B2 10 CB bpl notpressed + 1130 ;---O pressed-quit game to game over screen--- + 1131 80B4 QuitToGameover + 1132 80B4 A9 40 85 D7 mva #$40 escFlag + 1133 80B8 60 rts + 1134 @ + 1135 80B9 C9 1C cmp #@kbcode._esc ; 28 ; ESC + 1136 80BB D0 08 bne @+ + 1137 80BD 20 AE 73 jsr AreYouSure + 1138 80C0 24 D7 bit escFlag + 1139 80C2 10 BB bpl notpressed + 1140 ;---esc pressed-quit game--- + 1141 80C4 60 rts + 1142 @ + 1143 80C5 C9 3F cmp #@kbcode._A ; $3f ; A + 1144 80C7 D0 09 bne @+ + 1145 80C9 callActivation + 1146 ; Hide all tanks - after inventory they may have other shapes + 1147 80C9 20 0B 6A jsr ClearTanks + 1148 80CC 20 AC 63 jsr DefensivesActivate + 1149 80CF 4C E0 80 jmp afterInventory + 1150 + 1151 @ + 1152 80D2 C9 0D cmp #@kbcode._I ; $0d ; I + 1153 80D4 D0 2D bne @+ + 1154 80D6 callInventory + 1155 ; Hide all tanks - after inventory they may have other shapes + 1156 80D6 20 0B 6A jsr ClearTanks + 1157 ; + 1158 80D9 A9 FF 85 E4 mva #$ff isInventory + 1159 80DD 20 C0 63 jsr Purchase + 1160 80E0 afterInventory + 1161 80E0 20 89 5A jsr MakeDarkScreen + 1162 80E3 20 0F 66 jsr DisplayStatus + 1163 80E6 20 E4 76 jsr SetMainScreen + 1164 80E9 20 12 6A jsr DrawTanks + 1165 ;jsr WaitOneFrame ; not necessary + 1166 80EC 24 5E bit LazyFlag + 1167 80EE 50 03 bvc NoLazy + 1168 80F0 20 4A 8B jsr LazyBoys + 1169 80F3 NoLazy + 1170 80F3 24 5F bit SpyHardFlag + 1171 80F5 10 03 bpl NoSpyHard + 1172 80F7 20 FC 8A jsr SpyHard + 1173 80FA NoSpyHard + 1174 80FA RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 80FA A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: weapons.asm + 1175 80FC A9 00 85 D7 mva #0 escFlag + 1176 8100 4C F3 82 jmp ReleaseAndLoop + 1177 @ + 1178 8103 C9 8E cmp #$80|@kbcode._up + 1179 8105 D0 03 4C AD 81 jeq CTRLPressedUp + 1180 810A C9 8F cmp #$80|@kbcode._down + 1181 810C D0 03 4C E8 81 jeq CTRLPressedDown + 1182 8111 C9 AC cmp #$80|@kbcode._tab + 1183 8113 D0 03 4C BF 82 jeq CTRLPressedTAB + 1184 + 1185 8118 jumpFromStick + 1186 .IF TARGET = 800 + 1187 cmp #$80|17 ; Ctrl+Help + 1188 bne NoVdebugSwitch + 1189 lda Vdebug + 1190 eor #$ff + 1191 sta Vdebug + 1192 jmp ReleaseAndLoop + 1193 NoVdebugSwitch + 1194 .ENDIF + 1195 8118 29 3F and #$3f ;CTRL and SHIFT ellimination + 1196 811A C9 0E cmp #@kbcode._up ; $e + 1197 811C F0 55 jeq pressedUp + 1198 811E C9 0F cmp #@kbcode._down ; $f + 1199 8120 D0 03 4C BE 81 jeq pressedDown + 1200 8125 C9 06 cmp #@kbcode._left ; $6 + 1201 8127 D0 03 4C 51 82 jeq pressedLeft + 1202 812C C9 07 cmp #@kbcode._right ; $7 + 1203 812E D0 03 4C 02 82 jeq pressedRight + 1204 8133 C9 21 cmp #@kbcode._space ; $21 + 1205 8135 D0 03 4C F9 82 jeq pressedSpace + 1206 813A C9 2C cmp #@kbcode._tab ; $2c + 1207 813C D0 03 4C A0 82 jeq pressedTAB + 1208 8141 C9 25 cmp #@kbcode._M ; $25 ; M + 1209 8143 D0 03 4C DE 82 jeq pressedM + 1210 8148 C9 3E cmp #@kbcode._S ; $3e ; S + 1211 814A D0 03 4C EB 82 jeq pressedS + 1212 .IF TARGET = 800 + 1213 cmp #61 ; G + 1214 bne EndKeys + 1215 jsr SelectNextGradient.NotWind + 1216 jmp ReleaseAndLoop + 1217 .ENDIF + 1218 814F EndKeys + 1219 814F 4C 7F 80 jmp notpressed + 1220 8152 checkJoy + 1221 ;------------JOY------------- + 1222 ;happy happy joy joy + 1223 ;check for joystick now + 1224 8152 A5 02 lda STICK0 + 1225 8154 29 0F and #$0f + 1226 8156 C9 0F cmp #$0f + 1227 8158 F0 0B beq notpressedJoy + 1228 815A A8 tay + 1229 815B A9 00 85 02 mva #0 ATRACT ; reset atract mode + 1230 815F B9 5A 60 lda joyToKeyTable,y + 1231 8162 4C 18 81 jmp jumpFromStick + 1232 8165 notpressedJoy + 1233 ;fire + 1234 8165 A5 02 lda STRIG0 + 1235 8167 D0 03 4C F9 82 jeq pressedSpace + 1236 816C A9 FF 85 9B mva #$ff pressTimer ; stop counting frames + 1237 8170 4C 7F 80 jmp notpressed + 1238 + 1239 ; + 1240 8173 pressedUp + 1241 8173 A5 9B lda pressTimer + 1242 8175 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1243 817B C9 19 cmp #25 ; 1/2s + 1244 817D B0 2E bcs CTRLPressedUp + 1245 + 1246 + 1247 ;force increaseeee! + 1248 ;ldx TankNr ; optimized + 1249 817F FE D9 43 inc ForceTableL,x + 1250 8182 D0 03 bne CheckingMaxForce + 1251 8184 FE DF 43 inc ForceTableH,x + 1252 + 1253 8187 CheckingMaxForce + 1254 + 1255 8187 A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1256 + 1257 818B BD EB 43 lda MaxForceTableH,x + 1258 818E DD DF 43 cmp ForceTableH,x + 1259 8191 D0 06 bne FurtherCheckMaxForce + 1260 8193 BD E5 43 lda MaxForceTableL,x + 1261 8196 DD D9 43 cmp ForceTableL,x + 1262 8199 FurtherCheckMaxForce + 1263 8199 90 03 4C 4D 80 jcs BeforeFire + 1264 + 1265 819E BD EB 43 lda MaxForceTableH,x + 1266 81A1 9D DF 43 sta ForceTableH,x + 1267 81A4 BD E5 43 lda MaxForceTableL,x + 1268 81A7 9D D9 43 sta ForceTableL,x + 1269 + 1270 81AA 4C 4D 80 jmp BeforeFire + 1271 + 1272 81AD CTRLPressedUp + 1273 ;ldx TankNr ; optimized + 1274 81AD BD D9 43 lda ForceTableL,x + 1275 81B0 18 clc + 1276 81B1 69 0A adc #10 + 1277 81B3 9D D9 43 sta ForceTableL,x + 1278 81B6 90 CF bcc CheckingMaxForce + 1279 81B8 FE DF 43 inc ForceTableH,x + 1280 81BB 4C 87 81 jmp CheckingMaxForce + 1281 + 1282 + 1283 81BE pressedDown + 1284 81BE A5 9B lda pressTimer + 1285 81C0 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1286 81C6 C9 19 cmp #25 ; 1/2s + 1287 81C8 B0 1E bcs CTRLPressedDown + 1288 + 1289 81CA A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1290 + 1291 ;ldx TankNr ; optimized + 1292 81CE DE D9 43 dec ForceTableL,x + 1293 81D1 BD D9 43 lda ForceTableL,x + 1294 81D4 C9 FF cmp #$ff + 1295 81D6 D0 0D bne @+ + 1296 81D8 DE DF 43 dec ForceTableH,x + 1297 81DB 10 08 bpl @+ + 1298 81DD ForceGoesZero + 1299 81DD A9 00 lda #0 + 1300 81DF 9D DF 43 sta ForceTableH,x + 1301 81E2 9D D9 43 sta ForceTableL,x + 1302 @ + 1303 81E5 4C 4D 80 jmp BeforeFire + 1304 + 1305 81E8 CTRLPressedDown + 1306 81E8 A9 00 85 9E mva #sfx_set_power_1 sfx_effect + 1307 + 1308 ;ldx TankNr ; optimized + 1309 81EC 38 sec + 1310 81ED BD D9 43 lda ForceTableL,x + 1311 81F0 E9 0A sbc #10 + 1312 81F2 9D D9 43 sta ForceTableL,x + 1313 81F5 90 03 4C 4D 80 jcs BeforeFire + 1314 81FA DE DF 43 dec ForceTableH,x + 1315 81FD 30 DE bmi ForceGoesZero + 1316 81FF 4C 4D 80 jmp BeforeFire + 1317 + 1318 8202 pressedRight + 1319 ;ldx TankNr ; optimized + 1320 8202 A5 9B lda pressTimer + 1321 8204 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1322 820A C9 19 cmp #25 ; 1/2s + 1323 820C B0 20 bcs CTRLPressedRight + 1324 + 1325 820E A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1326 8212 A9 01 85 AA mva #1 Erase + 1327 8216 20 48 6B jsr DrawTankNr.BarrelChange + 1328 8219 DE C3 48 BD C3 48 dec:lda AngleTable,x + 1329 821F C9 FF cmp #255 ; -1 + 1330 8221 F0 03 4C 4D 80 jne BeforeFire + 1331 8226 A9 B4 lda #180 + 1332 8228 9D C3 48 sta AngleTable,x + 1333 822B 4C 4D 80 jmp BeforeFire + 1334 + 1335 822E CTRLPressedRight + 1336 ;ldx TankNr ; optimized + 1337 822E A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1338 8232 A9 01 85 AA mva #1 Erase + 1339 8236 20 48 6B jsr DrawTankNr.BarrelChange + 1340 8239 BD C3 48 lda AngleTable,x + 1341 823C 38 sec + 1342 823D E9 04 sbc #4 + 1343 823F 9D C3 48 sta AngleTable,x + 1344 8242 C9 04 cmp #4 ; smallest angle for speed rotating + 1345 8244 90 03 4C 4D 80 jcs BeforeFire + 1346 8249 A9 B4 lda #180 + 1347 824B 9D C3 48 sta AngleTable,x + 1348 824E 4C 4D 80 jmp BeforeFire + 1349 + 1350 + 1351 8251 pressedLeft + 1352 ;ldx TankNr ; optimized + 1353 8251 A5 9B lda pressTimer + 1354 8253 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 + 1355 8259 C9 19 cmp #25 ; 1/2s + 1356 825B B0 20 bcs CTRLPressedLeft + 1357 + 1358 825D A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1359 8261 A9 01 85 AA mva #1 Erase + 1360 8265 20 48 6B jsr DrawTankNr.BarrelChange + 1361 8268 FE C3 48 INC AngleTable,x + 1362 826B BD C3 48 lda AngleTable,x + 1363 826E C9 B4 cmp #180 + 1364 8270 B0 03 4C 4D 80 jcc BeforeFire + 1365 8275 A9 00 lda #0 + 1366 8277 9D C3 48 sta AngleTable,x + 1367 827A 4C 4D 80 jmp BeforeFire + 1368 + 1369 827D CTRLPressedLeft + 1370 ;ldx TankNr ; optimized + 1371 827D A9 01 85 9E mva #sfx_set_power_2 sfx_effect + 1372 8281 A9 01 85 AA mva #1 Erase + 1373 8285 20 48 6B jsr DrawTankNr.BarrelChange + 1374 8288 BD C3 48 lda AngleTable,x + 1375 828B 18 clc + 1376 828C 69 04 adc #4 + 1377 828E 9D C3 48 sta AngleTable,x + 1378 8291 C9 B0 cmp #180-4 + 1379 8293 B0 03 4C 4D 80 jcc BeforeFire + 1380 8298 A9 00 lda #0 + 1381 829A 9D C3 48 sta AngleTable,x + 1382 829D 4C 4D 80 jmp BeforeFire + 1383 + 1384 82A0 pressedTAB + 1385 82A0 A9 17 85 9E mva #sfx_purchase sfx_effect + 1386 ;ldx TankNr ; optimized + 1387 82A4 BD F7 43 lda ActiveWeapon,x + 1388 82A7 C9 1F cmp #last_offensive_____ ; the last possible offensive weapon + 1389 82A9 D0 07 bne ?notlasttofirst + 1390 82AB A9 00 lda #first_offensive____ ; #0 + 1391 82AD 9D F7 43 sta ActiveWeapon,x + 1392 82B0 F0 03 beq @+ ; allways = 0 + 1393 82B2 ?notlasttofirst + 1394 82B2 FE F7 43 inc ActiveWeapon,x + 1395 @ + 1396 82B5 BD F7 43 lda ActiveWeapon,x + 1397 82B8 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 1398 82BB F0 E3 beq pressedTAB + 1399 82BD D0 34 bne ReleaseAndLoop + 1400 + 1401 82BF CTRLpressedTAB + 1402 82BF A9 17 85 9E mva #sfx_purchase sfx_effect + 1403 ;ldx TankNr ; optimized + 1404 82C3 BD F7 43 lda ActiveWeapon,x + 1405 82C6 C9 00 cmp #first_offensive____ ; #0 + 1406 82C8 D0 07 bne ?notfirsttolast + 1407 82CA A9 1F lda #last_offensive_____ ; the last possible offensive weapon + 1408 82CC 9D F7 43 sta ActiveWeapon,x + 1409 82CF D0 03 bne @+ ; allways <> 0 + 1410 82D1 ?notfirsttolast + 1411 82D1 DE F7 43 dec ActiveWeapon,x + 1412 @ + 1413 82D4 BD F7 43 lda ActiveWeapon,x + 1414 82D7 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 1415 82DA F0 E3 beq CTRLpressedTAB + 1416 82DC D0 15 bne ReleaseAndLoop + 1417 + 1418 82DE pressedM + 1419 ; have you tried turning the music off and on again? + 1420 82DE A9 FF lda #$ff + 1421 82E0 4D 00 41 8D 00 41 eor:sta noMusic + 1422 82E6 RmtSong song_ingame +Macro: RMTSONG [Source: scorchC64.asm] + 1 82E6 A9 06 lda #SONG_INGAME ; do nothing in C64 +Source: weapons.asm + 1423 82E8 4C F3 82 jmp ReleaseAndLoop + 1424 + 1425 82EB pressedS + 1426 ; have you tried turning sfx off and on again? + 1427 82EB A9 FF lda #$ff + 1428 82ED 4D 01 41 8D 01 41 eor:sta noSfx + 1429 82F3 ReleaseAndLoop + 1430 82F3 20 71 5A jsr WaitForKeyRelease + 1431 82F6 4C 4D 80 jmp BeforeFire + 1432 + 1433 82F9 pressedSpace + 1434 ;================================= + 1435 ;we shoot here!!! + 1436 82F9 A9 00 lda #0 + 1437 82FB 85 02 sta ATRACT ; reset atract mode + 1438 82FD 85 9B sta pressTimer ; reset + 1439 82FF 20 71 5A jsr WaitForKeyRelease.StillWait + 1440 8302 A5 9B lda pressTimer + 1441 8304 C9 19 cmp #25 ; 1/2s + 1442 8306 90 03 bcc fire + 1443 8308 4C D6 80 jmp callInventory + 1444 830B fire + 1445 830B 60 RTS + 1446 .endp + 1447 + 1448 ;-------------------------------------------------- + 1449 830C .proc Shoot ;TankNr (byte) + 1450 ;-------------------------------------------------- + 1451 ;it looks like this routine is too big - + 1452 ;- more and more functions were being added... + 1453 ;good idea would be to rewrite it completely + 1454 ;with much more separate blocks, but you know - + 1455 ;- do not touch it if it works... + 1456 + 1457 830C A9 00 85 97 mva #0 TestFlightFlag + 1458 + 1459 ;the latest addition to this routine is + 1460 ;displaying offensive texts! + 1461 + 1462 8310 RandomizeOffensiveText + 1463 8310 AD 1B D4 lda random + 1464 8313 C9 36 cmp #talk.NumberOfOffensiveTexts + 1465 8315 B0 F9 bcs RandomizeOffensiveText + 1466 + 1467 8317 8D C0 48 sta TextNumberOff + 1468 831A A4 6C ldy TankNr + 1469 831C A9 FF 85 DB mva #$ff plot4x4color + 1470 8320 20 88 72 jsr DisplayOffensiveTextNr + 1471 + 1472 8323 AfterOffensiveText + 1473 8323 A9 00 8D 8B 44 mva #0 LaserFlag ; $ff - Laser + 1474 8328 A6 6C ldx TankNr + 1475 832A BD F7 43 lda ActiveWeapon,x + 1476 832D C9 1F cmp #ind_Laser__________ ; laser + 1477 832F D0 15 bne NotStrongShoot + 1478 ; Laser: (not)very strong - invisible - shot for laser beam end coordinates + 1479 8331 24 60 bit Vdebug + 1480 8333 30 04 bmi @+ + 1481 8335 A9 00 85 A9 mva #0 color + 1482 8339 A9 01 @ lda #1 + 1483 833B 85 A4 sta Force + 1484 833D 85 A5 sta Force+1 + 1485 833F A9 FF 8D 8B 44 mva #$ff LaserFlag ; $ff - Laser + 1486 8344 D0 0B bne AfterStrongShoot + 1487 8346 NotStrongShoot + 1488 8346 20 96 59 jsr Table2Force + 1489 8349 24 97 bit TestFlightFlag + 1490 834B 30 04 bmi AfterStrongShoot + 1491 834D A9 19 85 9E mva #sfx_shoot sfx_effect + 1492 8351 AfterStrongShoot + 1493 8351 BD C3 48 lda AngleTable,x + 1494 8354 85 A7 sta Angle + 1495 + 1496 ; Shoots tank nr X !!! :) + 1497 ; set the starting coordinates of bullet with correction + 1498 ; to start where the tank's barrel ends + 1499 ; (without it bullet would go from the left lower corner of the tank) + 1500 ;ldx TankNr + 1501 + 1502 8356 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 + 1503 8360 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 + 1504 8365 A9 00 lda #0 + 1505 8367 85 A6 sta Force+2 + 1506 8369 85 CD sta ytraj+2 + 1507 836B 85 C8 sta xtraj + 1508 836D 85 CB sta ytraj + 1509 + 1510 ; checking if the shot is underground (no Flight but Hit :) ) + 1511 836F A8 tay ; A=0 ! + 1512 8370 18 A5 C9 69 3E 85 + adw xtraj+1 #mountaintable temp + 1513 837D A5 CC lda ytraj+1 + 1514 837F D1 72 cmp (temp),y ; check collision with mountains + 1515 8381 B0 08 bcs ShotUnderGround + 1516 8383 20 A0 83 jsr Flight + 1517 8386 A9 01 85 A9 mva #1 color + 1518 838A 60 rts + 1519 838B ShotUnderGround + 1520 838B A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? + 1521 8393 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 1522 839B A9 FF 85 BF mva #$ff HitFlag + 1523 839F 60 rts + 1524 .endp + 1525 + 1526 ;-------------------------------------------------- + 1527 83A0 .proc Flight ; Force(byte.byte), Wind(0.word) + 1528 ; Angle(byte) 128=0, 255=maxright, 0=maxleft + 1529 ; if 7bit and 6bit of TestFlightFlag is set no real flight - hit test only (for AI) + 1530 ; 7bit - fast, test flight + 1531 ; 6bit - invisible bullet + 1532 ;-------------------------------------------------- + 1533 ;g=-0.1 + 1534 ;vx=Force*cos(Angle) + 1535 ;vy=Force*sin(Angle) + 1536 ; + 1537 ;:begin + 1538 ;ytraj=ytray-vy + 1539 ;vy=vy-g + 1540 ;xtraj=xtraj+vx - without Wind + 1541 ;vx=vx+Wind (Wind is a small fraction) + 1542 ;plot xtraj,ytraj - there is clearing in plot + 1543 ;goto begin- + 1544 + 1545 + 1546 ; smoke tracer :) + 1547 83A0 A0 00 ldy #0 + 1548 83A2 24 97 bit TestFlightFlag ; if test flight for AI or Lazy Darwin + 1549 83A4 30 0A bmi noSmokeTracer ; no Smoke Tracer display + 1550 83A6 A6 6C ldx TankNr + 1551 83A8 BD F7 43 lda ActiveWeapon,x + 1552 83AB C9 0B cmp #ind_Smoke_Tracer___ ; Smoke tracer + 1553 83AD D0 01 bne noSmokeTracer + 1554 83AF C8 iny + 1555 83B0 noSmokeTracer + 1556 83B0 8C 8A 44 sty SmokeTracerFlag + 1557 + 1558 83B3 RepeatIfSmokeTracer + 1559 83B3 RepeatFlight + 1560 83B3 A5 CC 8D 92 44 A5 + mwa ytraj+1 Ytrajold+1 + 1561 83BD A5 C9 8D 8F 44 A5 + mwa xtraj+1 Xtrajold+1 + 1562 83C7 A9 40 8D 73 43 mva #%01000000 drawFunction + 1563 + 1564 83CC A9 00 lda #0 + 1565 83CE 85 BB sta vx + 1566 83D0 85 BC sta vx+1 + 1567 83D2 85 BD sta vx+2 + 1568 83D4 85 BF sta HitFlag + 1569 83D6 85 61 sta xdraw + 1570 83D8 85 62 sta xdraw+1 + 1571 83DA 85 63 sta ydraw + 1572 83DC 85 64 sta ydraw+1 + 1573 + 1574 ;vx calculation + 1575 ;vx = sin(90-Angle) for Angle <=90 + 1576 ;vx = -sin(Angle-90) for 90 < Angle <= 180 + 1577 83DE aslw Force ;Force = Force * 2 +Macro: ASLW [Source: MACRO.ASM] + 1 83DE 06 A4 ASL FORCE + 2 83E0 26 A5 ROL FORCE+1 +Source: weapons.asm + 1578 + 1579 ;cos(Angle) (but we use sin table only so some shenanigans happen) + 1580 83E2 A6 A7 ldx Angle + 1581 83E4 8E 15 45 stx LeapFrogAngle ; we will need it later + 1582 + 1583 ;Angle works like this: + 1584 ;0 'degrees' is horizontally right + 1585 ;90 'degrees' is straight up + 1586 ;180 horizontally left + 1587 + 1588 ; (we have to set goleft used in rolling weapons) + 1589 + 1590 83E7 E0 5B cpx #91 + 1591 83E9 90 0C bcc angleUnder90 + 1592 + 1593 ;over 90 + 1594 83EB A9 01 85 E6 mva #1 goleft + 1595 83EF 38 sec + 1596 83F0 8A txa ; lda # Angle + 1597 83F1 E9 5A sbc #90 + 1598 83F3 AA tax + 1599 83F4 4C 01 84 jmp @+ + 1600 + 1601 83F7 angleUnder90 + 1602 83F7 A9 00 85 E6 mva #0 goleft + 1603 83FB 38 sec ; X = 90-Angle + 1604 83FC A9 5A lda #90 + 1605 83FE E5 A7 sbc Angle + 1606 8400 AA tax + 1607 @ + 1608 8401 BD C1 5B lda sintable,x ; cos(X) + 1609 8404 8D 94 44 sta Multiplee ; *Force + 1610 8407 A5 A4 85 DC A5 A5 + mwa Force Multiplier + 1611 840F A9 00 lda #$0 + 1612 8411 85 DE sta Multiplier+2 + 1613 8413 A2 08 ldx #8 + 1614 8415 MultiplyLoop + 1615 8415 6E 94 44 ror Multiplee + 1616 8418 90 13 bcc DoNotAdd + 1617 841A 18 clc + 1618 841B A5 DC lda Multiplier + 1619 841D 65 BB adc vx + 1620 841F 85 BB sta vx + 1621 8421 A5 DD lda Multiplier+1 + 1622 8423 65 BC adc vx+1 + 1623 8425 85 BC sta vx+1 + 1624 8427 A5 DE lda Multiplier+2 + 1625 8429 65 BD adc vx+2 + 1626 842B 85 BD sta vx+2 + 1627 842D DoNotAdd + 1628 ;clc ;carry always cleared here (anyway we hope so :) + 1629 842D 26 DC rol Multiplier + 1630 842F 26 DD rol Multiplier+1 + 1631 8431 26 DE rol Multiplier+2 + 1632 8433 CA dex + 1633 8434 D0 DF bne MultiplyLoop + 1634 + 1635 8436 A9 00 85 BE mva #0 vx+3 + 1636 ; here in vx there is a number + 1637 ; xxxx.xx00 = sin(Angle)*Force + 1638 ; negate it if going left + 1639 843A A5 E6 lda goleft + 1640 843C F0 18 beq @+ + 1641 .rept 4 + 1642 LDA #$00 + 1643 SBC VX+# + 1644 STA VX+# + 1645 .endr +Source: REPT + 1642 843E A9 00 LDA #$00 + 1642 8440 E5 BB SBC VX+# + 1642 8442 85 BB STA VX+# + 1642 8444 A9 00 LDA #$00 + 1642 8446 E5 BC SBC VX+# + 1642 8448 85 BC STA VX+# + 1642 844A A9 00 LDA #$00 + 1642 844C E5 BD SBC VX+# + 1642 844E 85 BD STA VX+# + 1642 8450 A9 00 LDA #$00 + 1642 8452 E5 BE SBC VX+# + 1642 8454 85 BE STA VX+# +Source: weapons.asm + 1646 @ + 1647 ;======vy + 1648 ;vy = sin(Angle) for Angle <=90 + 1649 ;vy = sin(180-Angle) for 90 < Angle <= 180 + 1650 + 1651 8456 A9 00 lda #0 + 1652 8458 85 B7 sta vy + 1653 845A 85 B8 sta vy+1 + 1654 845C 85 B9 sta vy+2 + 1655 ;-- + 1656 845E A6 A7 ldx Angle + 1657 8460 E0 5B cpx #91 + 1658 8462 90 06 bcc YangleUnder90 + 1659 + 1660 8464 A9 B4 lda #180 + 1661 8466 38 sec + 1662 8467 E5 A7 sbc Angle + 1663 8469 AA tax + 1664 + 1665 846A YangleUnder90 + 1666 846A BD C1 5B lda sintable,x + 1667 + 1668 846D 8D 94 44 sta Multiplee ;sin(Angle)*Force + 1669 8470 A5 A4 85 DC A5 A5 + mwa Force Multiplier + 1670 8478 A9 00 lda #$0 + 1671 847A 85 DE sta Multiplier+2 + 1672 847C A2 08 ldx #8 + 1673 847E MultiplyLoopY + 1674 847E 6E 94 44 ror Multiplee + 1675 8481 90 13 bcc DoNotAddY + 1676 8483 18 clc + 1677 8484 A5 DC lda Multiplier + 1678 8486 65 B7 adc vy + 1679 8488 85 B7 sta vy + 1680 848A A5 DD lda Multiplier+1 + 1681 848C 65 B8 adc vy+1 + 1682 848E 85 B8 sta vy+1 + 1683 8490 A5 DE lda Multiplier+2 + 1684 8492 65 B9 adc vy+2 + 1685 8494 85 B9 sta vy+2 + 1686 8496 DoNotAddY + 1687 ;clc ;carry always cleared here (anyway we hope so :) + 1688 8496 26 DC rol Multiplier + 1689 8498 26 DD rol Multiplier+1 + 1690 849A 26 DE rol Multiplier+2 + 1691 849C CA dex + 1692 849D D0 DF bne MultiplyLoopY + 1693 ; here in vy there is a number + 1694 ; yyyy.yy=cos(Angle)*Force + 1695 + 1696 849F A9 00 85 BA mva #0 vy+3 ;vy=cos(Angle)*Force + 1697 + 1698 84A3 Loopi + 1699 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 1700 84A3 38 sec + 1701 84A4 A5 CB lda ytraj + 1702 84A6 E5 B8 sbc vy+1 + 1703 84A8 85 CB sta ytraj + 1704 84AA A5 CC lda ytraj+1 + 1705 84AC E5 B9 sbc vy+2 + 1706 84AE 85 CC sta ytraj+1 + 1707 84B0 A5 CD lda ytraj+2 + 1708 84B2 E5 BA sbc vy+3 + 1709 84B4 85 CD sta ytraj+2 + 1710 + 1711 84B6 2C 8B 44 bit LaserFlag ; no gravity if Laser + 1712 84B9 30 25 bmi NoGravity + 1713 ;vy=vy-g (again without least significant byte of vy) + 1714 84BB 38 sec + 1715 84BC A5 B8 lda vy+1 + 1716 84BE E5 E0 sbc gravity + 1717 84C0 85 B8 sta vy+1 + 1718 84C2 A5 B9 lda vy+2 + 1719 84C4 E9 00 sbc #0 + 1720 84C6 85 B9 sta vy+2 + 1721 84C8 A5 BA lda vy+3 + 1722 84CA E9 00 sbc #0 + 1723 84CC 85 BA sta vy+3 + 1724 84CE 10 10 bpl StillUp + 1725 ; where we know that the bullet starts to fall down + 1726 ; we check if it is MIRV and if so, jump to MIRV routine + 1727 84D0 24 97 bit TestFlightFlag + 1728 84D2 30 0C bmi NoTestForMIRV + 1729 84D4 A6 6C ldx TankNr + 1730 84D6 BD F7 43 lda ActiveWeapon,x + 1731 84D9 C9 06 cmp #ind_MIRV___________ ; MIRV + 1732 84DB D0 03 4C 7C 87 jeq MIRVdownLoop + 1733 84E0 NoTestForMIRV + 1734 84E0 NoGravity + 1735 84E0 StillUp + 1736 + 1737 84E0 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx) + 1738 84E1 A5 C8 lda xtraj ;here of course Fight to right + 1739 84E3 65 BC adc vx+1 + 1740 84E5 85 C8 sta xtraj + 1741 84E7 A5 C9 lda xtraj+1 + 1742 84E9 65 BD adc vx+2 + 1743 84EB 85 C9 sta xtraj+1 + 1744 84ED A5 CA lda xtraj+2 + 1745 84EF 65 BE adc vx+3 + 1746 84F1 85 CA sta xtraj+2 + 1747 + 1748 84F3 2C 8B 44 bit LaserFlag ; no wind if Laser + 1749 84F6 30 19 bmi NoWind + 1750 84F8 18 clc + 1751 .rept 4 + 1752 LDA VX+# + 1753 ADC WIND+# + 1754 STA VX+# + 1755 .endr +Source: REPT + 1752 84F9 A5 BB LDA VX+# + 1752 84FB 65 CE ADC WIND+# + 1752 84FD 85 BB STA VX+# + 1752 84FF A5 BC LDA VX+# + 1752 8501 65 CF ADC WIND+# + 1752 8503 85 BC STA VX+# + 1752 8505 A5 BD LDA VX+# + 1752 8507 65 D0 ADC WIND+# + 1752 8509 85 BD STA VX+# + 1752 850B A5 BE LDA VX+# + 1752 850D 65 D1 ADC WIND+# + 1752 850F 85 BE STA VX+# +Source: weapons.asm + 1756 8511 NoWind + 1757 8511 AD 8F 44 85 61 AD + mwa xtrajold+1 xdraw + 1758 851B AD 92 44 85 63 AD + mwa ytrajold+1 ydraw + 1759 8525 A5 C9 85 65 A5 CA + mwa xtraj+1 xbyte + 1760 852D A5 CC 85 67 A5 CD + mwa ytraj+1 ybyte + 1761 8535 20 12 66 jsr draw + 1762 ;key + 1763 8538 2C 8B 44 bit LaserFlag + 1764 853B 30 03 bmi LaserNoWalls + 1765 ; Check for walls + 1766 853D 20 E7 89 jsr MakeWalls + 1767 ; + 1768 8540 LaserNoWalls + 1769 8540 A5 C9 8D 8F 44 A5 + mwa xtraj+1 XtrajOld+1 + 1770 854A A5 CC 8D 92 44 A5 + mwa ytraj+1 YtrajOld+1 + 1771 + 1772 8554 24 97 bit TestFlightFlag + 1773 8556 30 14 bmi nowait + 1774 8558 2C 8B 44 bit LaserFlag ; faster laser prepare + 1775 855B 10 04 bpl nolaserwait + 1776 855D 24 60 bit Vdebug + 1777 855F 10 0B bpl nowait + 1778 8561 nolaserwait + 1779 8561 A5 A9 lda color + 1780 8563 F0 04 beq nonowait ; smoke tracer erases slowly + 1781 8565 A5 E3 lda tracerflag + 1782 8567 D0 03 bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) + 1783 8569 nonowait + 1784 8569 20 A7 5A jsr shellDelay + 1785 + 1786 856C nowait + 1787 856C A5 BF lda HitFlag + 1788 856E D0 66 bne Hit + 1789 ; --- only for Laser + 1790 8570 2C 8B 44 bit LaserFlag + 1791 8573 10 29 bpl NoCheckEdgesForLaser + 1792 ; If laser fires, edges of the screen finish "flying" and laser hits. + 1793 8575 A5 CD lda ytraj+2 + 1794 8577 30 0C bmi LaserHitEdge + 1795 8579 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth ;+1 + 1796 8583 90 19 bcc LaserNoHitEdge + 1797 8585 LaserHitEdge + 1798 8585 A5 61 85 C1 A5 62 + mwa xdraw XHit + 1799 858D A5 63 8D 5F 44 A5 + mwa ydraw YHit + 1800 8597 A9 FF 85 BF mva #$ff HitFlag ; screen edgs like ground (only for Laser) + 1801 859B 4C EF 85 jmp EndOfFlight + 1802 859E LaserNoHitEdge + 1803 ; ------------------ + 1804 859E NoCheckEdgesForLaser + 1805 + 1806 859E A5 CD C9 00 D0 04 + cpw ytraj+1 #screenheight+1 + 1807 85A8 90 04 bcc YTrayLowerThanScreenHeight + 1808 85AA A5 CD lda ytraj+2 + 1809 85AC 10 41 bpl EndOfFlight + 1810 + 1811 85AE YTrayLowerThanScreenHeight ; it means it is still on screen and not above + 1812 + 1813 85AE SkipCollisionCheck + 1814 + 1815 85AE A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw + 1816 85B6 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 1817 + 1818 85BE 24 97 bit TestFlightFlag + 1819 85C0 50 0A bvc NoTestFlight + 1820 85C2 24 60 bit Vdebug + 1821 85C4 10 0D bpl NoUnplot + 1822 85C6 20 89 5A jsr WaitOneFrame ; visualize AI targeting + 1823 85C9 4C D0 85 jmp YesUnPlot + 1824 85CC NoTestFlight + 1825 85CC A5 E3 lda tracerflag + 1826 85CE D0 03 bne NoUnPlot + 1827 + 1828 85D0 YesUnPlot + 1829 85D0 20 71 75 jsr UnPlot + 1830 + 1831 85D3 NoUnPlot + 1832 + 1833 85D3 4C A3 84 jmp Loopi + 1834 + 1835 85D6 Hit + 1836 85D6 A5 C1 85 61 A5 C2 + mwa XHit xdraw + 1837 85DE AD 5F 44 85 63 AD + mwa YHit ydraw + 1838 85E8 24 97 bit TestFlightFlag + 1839 85EA 70 03 bvs EndOfFlight + 1840 85EC 20 71 75 jsr unPlot + 1841 85EF EndOfFlight + 1842 85EF A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store for a little while + 1843 85F7 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!! + 1844 85FF A9 00 85 61 85 62 mwa #0 xdraw + 1845 8605 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 1846 860D 20 71 75 jsr unPlot + 1847 8610 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 1848 8618 A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 1849 + 1850 8620 AC 8A 44 ldy SmokeTracerFlag + 1851 8623 F0 07 beq EndOfFlight2 + 1852 8625 88 dey + 1853 8626 8C 8A 44 sty SmokeTracerFlag + 1854 8629 4C 4E 87 jmp SecondFlight + 1855 862C EndOfFlight2 + 1856 862C A9 00 85 E3 mva #0 tracerflag ; don't know why + 1857 + 1858 8630 24 97 bit TestFlightFlag + 1859 8632 10 03 4C F1 86 jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check + 1860 ; and now check for defensive-aggressive weapon + 1861 8637 A5 BF lda HitFlag + 1862 8639 D0 03 4C F1 86 jeq NoHitAtEndOfFight ; RTS only !!! + 1863 863E 10 03 4C F1 86 jmi NoTankHitAtEndOfFight + 1864 ; tank hit - increase direct hits points + 1865 8643 A6 6C ldx TankNr + 1866 8645 E8 inx + 1867 8646 E4 BF cpx HitFlag ; we don't count suicides :) + 1868 8648 F0 04 beq @+ + 1869 864A CA dex + 1870 864B FE C7 43 inc DirectHits,x + 1871 ; bne @+ ; one byte enough + 1872 ; inc DirectHitsH,x + 1873 @ + 1874 ; tank hit - check defensive weapon of this tank + 1875 864E AA tax + 1876 864F CA dex ; index of hitted tank in X + 1877 8650 A4 6C ldy TankNr + 1878 8652 B9 F7 43 lda ActiveWeapon,y + 1879 8655 C9 0A cmp #ind_Tracer_________ ; defence not fire by tracers + 1880 8657 F0 16 beq JNoDefence + 1881 8659 C9 0B cmp #ind_Smoke_Tracer___ + 1882 865B F0 12 beq JNoDefence + 1883 865D C9 1F cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser + 1884 865F F0 0E beq JNoDefence + 1885 8661 BD FD 43 lda ActiveDefenceWeapon,x + 1886 8664 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence + 1887 8666 D0 03 4C F6 86 jeq BouncyCastle + 1888 866B C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector + 1889 866D F0 03 beq MagDeflector + 1890 866F JNoDefence + 1891 866F 4C F1 86 jmp NoDefence + 1892 8672 MagDeflector + 1893 ; now run defensive-aggressive weapon - Mag Deflector! + 1894 ; get tank position + 1895 8672 18 clc + 1896 8673 BD 0D 44 lda xtankstableL,x + 1897 8676 69 04 adc #$04 ; almost in tak center :) + 1898 8678 85 C1 sta XHit + 1899 867A BD 13 44 lda xtankstableH,x + 1900 867D 69 00 adc #$00 + 1901 867F 85 C2 sta XHit+1 + 1902 8681 A9 FF lda #$ff ; change to ground hit (we hope) + 1903 8683 85 BF sta HitFlag + 1904 8685 2C 1B D4 bit random ; left or right deflection ? + 1905 8688 10 1D bpl RightDeflection + 1906 868A LeftDeflection + 1907 868A 38 A5 C1 E9 12 85 + sbw XHit #18 ; 18 pixels to left and explode... + 1908 8695 24 C2 bit XHit+1 ; if off-screen ... + 1909 8697 10 32 bpl EndOfMagDeflector ; hit of course but we need RTS + 1910 8699 18 A5 C1 69 24 85 + adw XHit #36 ; change to right :) + 1911 86A4 4C CB 86 jmp EndOfMagDeflector + 1912 86A7 RightDeflection + 1913 86A7 18 A5 C1 69 12 85 + adw XHit #18 ; 18 pixels to right and explode... + 1914 86B2 A5 C2 CD 41 01 D0 + cpw XHit screenwidth ; if off-screen ... + 1915 86BE B0 0B bcs EndOfMagDeflector ; hit of course but we need RTS + 1916 86C0 38 A5 C1 E9 24 85 + sbw XHit #36 ; change to left + 1917 86CB EndOfMagDeflector + 1918 86CB A9 01 85 AA mva #1 Erase + 1919 86CF A5 6C lda TankNr + 1920 86D1 48 pha ; store TankNr + 1921 86D2 86 6C stx TankNr ; store X in TankNr :) + 1922 86D4 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 1923 86D7 A9 00 lda #0 + 1924 86D9 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon + 1925 86DC 9D A8 43 sta ShieldEnergy,x + 1926 86DF 85 AA sta Erase + 1927 86E1 20 2C 6A jsr DrawTankNr ; draw tank without shield + 1928 86E4 A6 6C ldx TankNr ; restore X value :) + 1929 86E6 68 pla + 1930 86E7 85 6C sta TankNr ; restore TankNr value :) + 1931 86E9 A5 C1 85 61 A5 C2 + mwa XHit xdraw ; why? !!! + 1932 86F1 NoTankHitAtEndOfFight + 1933 86F1 NoHitAtEndOfFight + 1934 86F1 NoDefence + 1935 86F1 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 +Macro: LSRW [Source: MACRO.ASM] + 1 86F1 46 A5 LSR FORCE+1 + 2 86F3 66 A4 ROR FORCE +Source: weapons.asm + 1936 86F5 60 rts ; END !!! + 1937 86F6 BouncyCastle + 1938 ; now in Y we have number of of the attacking player (TankNr) ! + 1939 86F6 B9 F7 43 lda ActiveWeapon,y + 1940 ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down + 1941 86F9 C9 05 cmp #ind_Funky_Bomb_____ + 1942 86FB D0 03 bne @+ + 1943 86FD 20 7A 8F jsr SetFullScreenSoilRange + 1944 @ + 1945 8700 A9 0D 85 9E mva #sfx_shield_on sfx_effect + 1946 ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! + 1947 8704 A9 01 85 AA mva #1 Erase + 1948 8708 A5 6C lda TankNr + 1949 870A 48 pha ; store TankNr + 1950 870B 86 6C stx TankNr ; store X in TankNr :) + 1951 870D 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) + 1952 8710 A9 00 lda #0 + 1953 8712 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon + 1954 8715 9D A8 43 sta ShieldEnergy,x + 1955 8718 85 C8 sta xtraj ; prepare coordinates + 1956 871A 85 CB sta ytraj + 1957 ; sta xtraj+2 + 1958 ; sta ytraj+2 + 1959 871C 85 AA sta Erase + 1960 871E 20 2C 6A jsr DrawTankNr ; draw tank without shield + 1961 ; ldx TankNr ; restore X value :) ... but we don't need X now .. + 1962 8721 68 pla + 1963 8722 85 6C sta TankNr ; restore TankNr value :) + 1964 8724 38 sec + 1965 8725 A9 B4 lda #180 + 1966 8727 ED 15 45 sbc LeapFrogAngle + 1967 872A 85 A7 sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) + 1968 872C lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 +Macro: LSRW [Source: MACRO.ASM] + 1 872C 46 A5 LSR FORCE+1 + 2 872E 66 A4 ROR FORCE +Source: weapons.asm + 1969 8730 A5 C1 85 C9 A5 C2 + mwa XHit xtraj+1 + 1970 8738 38 AD 5F 44 E9 05 + sbw YHit #5 ytraj+1 + 1971 8747 A9 01 85 A9 mva #1 color + 1972 874B 4C B3 83 jmp RepeatFlight ; and repeat Fight + 1973 .endp + 1974 + 1975 874E .proc SecondFlight + 1976 ; ---------------- copied code fragment from before firing. not too elegant. + 1977 ; ---------------- get fire parameters again + 1978 + 1979 874E A6 6C ldx TankNr + 1980 8750 20 96 59 jsr Table2Force + 1981 8753 BD C3 48 lda AngleTable,x + 1982 8756 85 A7 sta Angle + 1983 + 1984 ; Shoots tank nr X !!! :) + 1985 ; set the starting coordinates of bullet with correction + 1986 ; to start where the tank's barrel ends + 1987 ; (without it bullet would go from the left lower corner of the tank) + 1988 ;ldx TankNr + 1989 + 1990 8758 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 + 1991 8762 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 + 1992 8767 A9 00 lda #0 + 1993 8769 85 A6 sta Force+2 + 1994 876B 85 CD sta ytraj+2 + 1995 876D 85 C8 sta xtraj + 1996 876F 85 CB sta ytraj + 1997 8771 85 A9 sta color + 1998 + 1999 + 2000 8773 A0 64 ldy #100 ; ??? + 2001 8775 A9 01 85 E3 mva #1 tracerflag ; I do not know (I mean I think I know ;) ) + 2002 ; 10 years later - I do not know!!! + 2003 ; 20 years later - still do not know :] + 2004 8779 4C B3 83 jmp Flight.RepeatIfSmokeTracer + 2005 .endp + 2006 + 2007 ; ------------------------------------------------- + 2008 877C .proc MIRVdownLoop + 2009 ; MIRV loop - here mirv bullets fall down + 2010 ; ------------------------------------------------- + 2011 ; copy Flight parameters to the table + 2012 877C A2 04 ldx #4 + 2013 877E MIRVcopyParameters + 2014 877E A5 C8 lda xtraj + 2015 8780 9D 66 44 sta xtraj00,x + 2016 8783 A5 C9 lda xtraj+1 + 2017 8785 9D 6B 44 sta xtraj01,x + 2018 8788 A5 CA lda xtraj+2 + 2019 878A 9D 70 44 sta xtraj02,x + 2020 ;lda vx + 2021 ;sta vx00,x + 2022 878D A5 BC lda vx+1 + 2023 878F 9D 75 44 sta vx01,x + 2024 8792 A5 BD lda vx+2 + 2025 8794 9D 7A 44 sta vx02,x + 2026 8797 A5 BE lda vx+3 + 2027 8799 9D 7F 44 sta vx03,x + 2028 879C A9 00 lda #0 + 2029 879E 9D 84 44 sta MirvDown,x + 2030 87A1 CA dex + 2031 87A2 10 DA bpl MIRVcopyParameters + 2032 ; modification (to make bullets "split away" and go different directions) + 2033 ; bullet indexed 0 is in the middle + 2034 + 2035 ; bullet 1 + 2036 87A4 18 clc + 2037 87A5 A5 BC lda vx+1 + 2038 87A7 69 64 adc #100 + 2039 87A9 8D 76 44 sta vx01+1 + 2040 87AC A5 BD lda vx+2 + 2041 87AE 69 00 adc #0 + 2042 87B0 8D 7B 44 sta vx02+1 + 2043 87B3 A5 BE lda vx+3 + 2044 87B5 69 00 adc #0 + 2045 87B7 8D 80 44 sta vx03+1 + 2046 ; bullet 2 + 2047 87BA 38 sec + 2048 87BB A5 BC lda vx+1 + 2049 87BD E9 64 sbc #100 + 2050 87BF 8D 77 44 sta vx01+2 + 2051 87C2 A5 BD lda vx+2 + 2052 87C4 E9 00 sbc #0 + 2053 87C6 8D 7C 44 sta vx02+2 + 2054 87C9 A5 BE lda vx+3 + 2055 87CB E9 00 sbc #0 + 2056 87CD 8D 81 44 sta vx03+2 + 2057 ; bullet 3 + 2058 87D0 18 clc + 2059 87D1 A5 BC lda vx+1 + 2060 87D3 69 C8 adc #200 + 2061 87D5 8D 78 44 sta vx01+3 + 2062 87D8 A5 BD lda vx+2 + 2063 87DA 69 00 adc #0 + 2064 87DC 8D 7D 44 sta vx02+3 + 2065 87DF A5 BE lda vx+3 + 2066 87E1 69 00 adc #0 + 2067 87E3 8D 82 44 sta vx03+3 + 2068 ; bullet 4 + 2069 87E6 38 sec + 2070 87E7 A5 BC lda vx+1 + 2071 87E9 E9 C8 sbc #200 + 2072 87EB 8D 79 44 sta vx01+4 + 2073 87EE A5 BD lda vx+2 + 2074 87F0 E9 00 sbc #0 + 2075 87F2 8D 7E 44 sta vx02+4 + 2076 87F5 A5 BE lda vx+3 + 2077 87F7 E9 00 sbc #0 + 2078 87F9 8D 83 44 sta vx03+4 + 2079 + 2080 ; clearing ranges of soil down registers + 2081 87FC 20 89 8F jsr ClearScreenSoilRange + 2082 + 2083 87FF A2 FF ldx #$FF ; it will turn 0 in a moment anyway + 2084 8801 8E 89 44 stx MirvMissileCounter + 2085 8804 mrLoopi + 2086 8804 AE 89 44 ldx MirvMissileCounter + 2087 8807 E8 inx + 2088 8808 E0 05 cpx #5 + 2089 880A D0 02 bne @+ + 2090 880C A2 00 ldx #0 + 2091 880E 8E 89 44 @ stx MirvMissileCounter + 2092 + 2093 ; Y changes only for bullet number 0 + 2094 ; because rest of the bullets have the same Y (height) + 2095 + 2096 8811 D0 29 bne MIRVdoNotChangeY + 2097 ; Y is the same for all falling bullets + 2098 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 2099 8813 38 sec + 2100 8814 A5 CB lda ytraj + 2101 8816 E5 B8 sbc vy+1 + 2102 8818 85 CB sta ytraj + 2103 881A A5 CC lda ytraj+1 + 2104 881C E5 B9 sbc vy+2 + 2105 881E 85 CC sta ytraj+1 + 2106 8820 A5 CD lda ytraj+2 + 2107 8822 E5 BA sbc vy+3 + 2108 8824 85 CD sta ytraj+2 + 2109 + 2110 ;vy=vy-g (also without least significant byte of vy) + 2111 8826 38 sec + 2112 8827 A5 B8 lda vy+1 + 2113 8829 E5 E0 sbc gravity + 2114 882B 85 B8 sta vy+1 + 2115 882D A5 B9 lda vy+2 + 2116 882F E9 00 sbc #0 + 2117 8831 85 B9 sta vy+2 + 2118 8833 A5 BA lda vy+3 + 2119 8835 E9 00 sbc #0 + 2120 8837 85 BA sta vy+3 + 2121 + 2122 8839 20 A7 5A jsr ShellDelay + 2123 + 2124 883C MIRVdoNotChangeY + 2125 + 2126 883C BD 84 44 lda MirvDown,x ; if bullet is already down we go with the next one + 2127 883F F0 03 4C 93 89 jne MIRVnextBullet + 2128 + 2129 8844 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) + 2130 8845 BD 66 44 lda xtraj00,x ;and here of course Flight to the right + 2131 8848 7D 75 44 adc vx01,x + 2132 884B 9D 66 44 sta xtraj00,x + 2133 884E BD 6B 44 lda xtraj01,x + 2134 8851 7D 7A 44 adc vx02,x + 2135 8854 9D 6B 44 sta xtraj01,x + 2136 8857 BD 70 44 lda xtraj02,x + 2137 885A 7D 7F 44 adc vx03,x + 2138 885D 9D 70 44 sta xtraj02,x + 2139 + 2140 ;vx=vx+Wind + 2141 + 2142 8860 18 clc + 2143 .rept 4 + 2144 LDA VX+# + 2145 ADC WIND+# + 2146 STA VX+# + 2147 .endr +Source: REPT + 2144 8861 A5 BB LDA VX+# + 2144 8863 65 CE ADC WIND+# + 2144 8865 85 BB STA VX+# + 2144 8867 A5 BC LDA VX+# + 2144 8869 65 CF ADC WIND+# + 2144 886B 85 BC STA VX+# + 2144 886D A5 BD LDA VX+# + 2144 886F 65 D0 ADC WIND+# + 2144 8871 85 BD STA VX+# + 2144 8873 A5 BE LDA VX+# + 2144 8875 65 D1 ADC WIND+# + 2144 8877 85 BE STA VX+# +Source: weapons.asm + 2148 + 2149 ; rules for a falling MIRV bulets. + 2150 ; if Y is negative and any X (bullet over the screen) - continue flying + 2151 ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying + 2152 ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision + 2153 ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit + 2154 ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) + 2155 + 2156 ; check bullet position and set flags: + 2157 ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) + 2158 ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) + 2159 8879 A9 00 lda #$00 + 2160 887B 8D 8C 44 sta XposFlag + 2161 887E 8D 8D 44 sta YposFlag + 2162 8881 A5 CD lda ytraj+2 ; Y high byte + 2163 8883 10 07 bpl @+ + 2164 8885 A9 80 8D 8D 44 mva #%10000000 YposFlag ; bullet over the screen (Y) + 2165 888A 30 0B bmi MIRVsetXflag + 2166 @ + 2167 888C A5 CC lda ytraj+1 ; Y low byte + 2168 888E C9 C8 cmp #screenheight + 2169 8890 90 05 bcc MIRVsetXflag ; bullet on screen (Y) + 2170 8892 A9 40 8D 8D 44 mva #%01000000 YposFlag ; bullet under the screen (Y) + 2171 8897 MIRVsetXflag + 2172 8897 BD 70 44 lda xtraj02,x ; X high byte + 2173 889A C9 01 cmp #>screenwidth + 2174 889C D0 05 bne @+ + 2175 889E BD 6B 44 lda xtraj01,x ; X low byte + 2176 88A1 C9 40 cmp #mountaintable + 2236 8918 85 73 sta temp+1 + 2237 + 2238 891A A0 00 ldy #0 + 2239 891C A5 CC lda ytraj+1 + 2240 891E D1 72 cmp (temp),y ; check collision with mountains + 2241 8920 B0 20 bcs mrHit + 2242 + 2243 8922 mrSkipCollisionCheck + 2244 ;mwa xtraj01 xdraw + 2245 8922 BD 6B 44 lda xtraj01,x + 2246 8925 85 61 sta xdraw + 2247 8927 BD 70 44 lda xtraj02,x + 2248 892A 85 62 sta xdraw+1 + 2249 892C A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw + 2250 + 2251 8934 20 73 75 jsr unPlot.unPlotAfterX + 2252 8937 AE 89 44 ldx MirvMissileCounter + 2253 893A F0 03 4C 04 88 jne mrLoopi + 2254 + 2255 893F 4C 04 88 jmp mrLoopi + 2256 + 2257 8942 mrHit + 2258 ; we have to make unPlot over the screen (to initialise it) + 2259 ; before actual explosion + 2260 8942 A9 00 85 61 85 62 mwa #0 xdraw + 2261 8948 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2262 8950 20 73 75 jsr unPlot.unPlotAfterX + 2263 8953 AE 89 44 ldx MirvMissileCounter + 2264 8956 A0 00 ldy #0 + 2265 ; concurrent moving xtraj+1 -> xdraw and calculating temp + 2266 8958 18 clc + 2267 8959 BD 6B 44 lda xtraj01,x + 2268 895C 85 61 sta xdraw + 2269 895E 69 3E adc #mountaintable + 2274 8969 85 73 sta temp+1 + 2275 896B B1 72 lda (temp),y + 2276 896D 38 sec + 2277 896E E9 01 sbc #1 + 2278 8970 85 63 sta ydraw + 2279 8972 84 64 sty ydraw+1 ;we know that y=0 + 2280 8974 20 AD 77 jsr missile ; explode .... + 2281 + 2282 8977 mrEndOfFlight + 2283 8977 AE 89 44 ldx MirvMissileCounter + 2284 897A A9 00 85 61 85 62 mwa #0 xdraw + 2285 8980 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2286 8988 20 73 75 jsr unPlot.unPlotAfterX + 2287 898B AE 89 44 ldx MirvMissileCounter + 2288 898E A9 01 lda #1 + 2289 8990 9D 84 44 sta MirvDown,x + 2290 8993 MIRVnextBullet + 2291 ; checking if all bullets already fallen down + 2292 8993 A2 04 ldx #4 + 2293 8995 MIRVcheckIfEnd + 2294 8995 BD 84 44 lda MirvDown,x + 2295 8998 F0 05 beq MIRVstillNotAll + 2296 899A CA dex + 2297 899B 10 F8 bpl MIRVcheckIfEnd + 2298 899D 30 03 bmi MIRValreadyAll + 2299 899F MIRVstillNotAll + 2300 899F 4C 04 88 jmp mrLoopi + 2301 89A2 MIRValreadyAll + 2302 89A2 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store them (for a while) + 2303 89AA A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw + 2304 89B2 A9 00 85 61 85 62 mwa #0 xdraw + 2305 89B8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw + 2306 89C0 AE 89 44 ldx MirvMissileCounter + 2307 89C3 20 73 75 jsr unPlot.unPlotAfterX + 2308 89C6 A5 B3 85 61 A5 B4 + mwa xcircle xdraw + 2309 89CE A5 B5 85 63 A5 B6 + mwa ycircle ydraw + 2310 + 2311 ; we must do it manually because of the VOID pointer + 2312 + 2313 ;first clean the offensive text... + 2314 89D6 A4 6C ldy TankNr + 2315 89D8 A9 00 85 DB mva #$00 plot4x4color + 2316 89DC 20 88 72 jsr DisplayOffensiveTextNr + 2317 + 2318 ; temporary removing tanks from the screen (otherwise they will fall down with soil) + 2319 89DF 20 F4 6E jsr SoilDown2 + 2320 89E2 A9 FF 85 BF mva #$ff HitFlag ; but why ?? + 2321 89E6 60 rts + 2322 .endp + 2323 ; ------------------------------------------------- + 2324 89E7 .proc MakeWalls + 2325 ; ------------------------------------------------- + 2326 89E7 2C 0C 44 bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy + 2327 89EA 10 54 bpl WrapAndNone + 2328 89EC 50 21 bvc MakeBump + 2329 ; top bounce + 2330 89EE 24 CD bit ytraj+2 + 2331 89F0 10 1D bpl NoOnTop + 2332 89F2 24 BA bit vy+3 + 2333 89F4 30 19 bmi FlyingDown + 2334 89F6 38 sec + 2335 .rept 4 + 2336 LDA #$00 + 2337 SBC VY+# + 2338 STA VY+# + 2339 .endr +Source: REPT + 2336 89F7 A9 00 LDA #$00 + 2336 89F9 E5 B7 SBC VY+# + 2336 89FB 85 B7 STA VY+# + 2336 89FD A9 00 LDA #$00 + 2336 89FF E5 B8 SBC VY+# + 2336 8A01 85 B8 STA VY+# + 2336 8A03 A9 00 LDA #$00 + 2336 8A05 E5 B9 SBC VY+# + 2336 8A07 85 B9 STA VY+# + 2336 8A09 A9 00 LDA #$00 + 2336 8A0B E5 BA SBC VY+# + 2336 8A0D 85 BA STA VY+# +Source: weapons.asm + 2340 8A0F FlyingDown + 2341 8A0F NoOnTop + 2342 8A0F MakeBump + 2343 8A0F A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth + 2344 8A19 90 54 bcc OnScreen + 2345 ; inverse vx (bouncing wall) + 2346 8A1B 38 sec + 2347 .rept 4 + 2348 LDA #$00 + 2349 SBC VX+# + 2350 STA VX+# + 2351 .endr +Source: REPT + 2348 8A1C A9 00 LDA #$00 + 2348 8A1E E5 BB SBC VX+# + 2348 8A20 85 BB STA VX+# + 2348 8A22 A9 00 LDA #$00 + 2348 8A24 E5 BC SBC VX+# + 2348 8A26 85 BC STA VX+# + 2348 8A28 A9 00 LDA #$00 + 2348 8A2A E5 BD SBC VX+# + 2348 8A2C 85 BD STA VX+# + 2348 8A2E A9 00 LDA #$00 + 2348 8A30 E5 BE SBC VX+# + 2348 8A32 85 BE STA VX+# +Source: weapons.asm + 2352 ; and bouce feapfrog :) + 2353 8A34 38 sec + 2354 8A35 A9 B4 lda #180 + 2355 8A37 ED 15 45 sbc LeapFrogAngle + 2356 8A3A 8D 15 45 sta LeapFrogAngle ; swap angle (LeapFrogAngle) + 2357 8A3D E6 A2 inc FunkyWallFlag + 2358 8A3F 60 rts + 2359 8A40 WrapAndNone + 2360 8A40 50 2D bvc NoWall + 2361 8A42 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth + 2362 8A4C 90 21 bcc OnScreen + 2363 ; (wrapping wall) + 2364 8A4E E6 A2 inc FunkyWallFlag + 2365 8A50 24 CA bit xtraj+2 + 2366 8A52 30 0E bmi LeftWrap + 2367 8A54 RightWrap + 2368 8A54 38 A5 C9 E9 40 85 + sbw xtraj+1 #screenwidth + 2369 8A61 60 rts + 2370 8A62 LeftWrap + 2371 8A62 18 A5 C9 69 40 85 + adw xtraj+1 #screenwidth + 2372 8A6F OnScreen + 2373 8A6F NoWall + 2374 8A6F 60 rts + 2375 .endp + 2376 ; ------------------------------------------------- + 2377 8A70 .proc WhiteFlag + 2378 ; ------------------------------------------------- + 2379 ; This routine is run from inside of the main loop + 2380 ; and replaces Shoot and Flight routines + 2381 ; X and TankNr - index of shooting tank + 2382 ; ------------------------------------------------- + 2383 8A70 A9 06 85 9E mva #sfx_death_begin sfx_effect + 2384 8A74 20 57 6B jsr FlashTank ; first we flash tank + 2385 8A77 A9 01 85 AA mva #1 Erase + 2386 8A7B 20 2C 6A jsr DrawTankNr ; and erase tank + 2387 8A7E A9 00 lda #0 + 2388 8A80 85 AA sta Erase + 2389 8A82 A6 6C ldx TankNr + 2390 8A84 9D A2 43 sta Energy,x ; clear tank energy + 2391 8A87 9D AF 43 sta eXistenZ,x ; erase from existence + 2392 8A8A 9D B5 43 sta LASTeXistenZ,x ; to prevent explosion + 2393 8A8D 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate White Flag + 2394 8A90 20 46 75 jsr PMoutofScreen + 2395 8A93 20 12 6A jsr drawtanks ; for restore PM + 2396 8A96 A9 15 85 9E mva #sfx_silencer sfx_effect + 2397 8A9A 60 rts + 2398 .endp + 2399 + 2400 ; ------------------------------------------------- + 2401 8A9B .proc AtomicWinter + 2402 ; ------------------------------------------------- + 2403 ; This routine is run from inside of the main loop + 2404 ; and replaces Shoot and Flight routines + 2405 ; X and TankNr - index of shooting tank + 2406 ; ------------------------------------------------- + 2407 8A9B A9 12 85 9E mva #sfx_sandhog sfx_effect + 2408 .IF FASTER_GRAF_PROCS = 1 + 2409 ldy #0 ; byte counter (from 0 to 39) + 2410 NextColumn + 2411 ; big loop - we repat internal loops for each column of bytes + 2412 sty magic + 2413 ldx #120 ; line counter (from 0 to 60 ) + 2414 ; first loop - inverse column of bytes for a while + 2415 ldy magic + 2416 NextLine1 + 2417 jsr InverseScreenByte + 2418 dex + 2419 dex + 2420 bpl NextLine1 + 2421 ; + 2422 jsr WaitOneFrame ; wait uses A only + 2423 ; second loop - inverse again and put random "snow" to column of bytes + 2424 ldx #120 + 2425 ldy magic + 2426 mva #$55 magic+1 + 2427 NextLine2 + 2428 jsr InverseScreenByte + 2429 lda random + 2430 ora magic+1 + 2431 and (temp),y + 2432 sta (temp),y + 2433 lda magic+1 + 2434 eor #$ff + 2435 sta magic+1 + 2436 dex + 2437 dex + 2438 bpl NextLine2 + 2439 ; and go to next column + 2440 iny + 2441 cpy #40 + 2442 bne NextColumn + 2443 .ELSE + 2444 8A9F A9 01 85 A9 mva #1 color + 2445 8AA3 A9 78 85 63 A9 00 + mwa #120 ydraw + 2446 8AAB NextLineSlow + 2447 8AAB A9 00 lda #0 + 2448 8AAD 85 61 sta xdraw + 2449 8AAF 85 62 sta xdraw+1 + 2450 8AB1 NextPixelSlow + 2451 8AB1 2C 1B D4 bit random + 2452 8AB4 10 05 bpl NoPlot + 2453 8AB6 50 03 bvc NoPlot + 2454 8AB8 20 2C 76 jsr plot.MakePlot + 2455 8ABB NoPlot + 2456 8ABB E6 61 D0 02 E6 62 inw xdraw + 2457 8AC1 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth + 2458 8ACB D0 E4 bne NextPixelSlow + 2459 8ACD C6 63 dec ydraw + 2460 8ACF C6 63 dec ydraw + 2461 8AD1 10 D8 bpl NextLineSlow + 2462 .ENDIF + 2463 ; and we have "snow" :) + 2464 8AD3 A9 00 lda #0 + 2465 8AD5 A6 6C ldx TankNr + 2466 8AD7 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter + 2467 8ADA 20 7A 8F jsr SetFullScreenSoilRange + 2468 8ADD 20 F7 6E jsr SoilDown2.NoClearTanks + 2469 8AE0 60 rts + 2470 + 2471 ; in order to optimize the fragment repeated in both internal loops + 2472 ; we save 15 bytes :) + 2473 8AE1 InverseScreenByte + 2474 8AE1 BD 68 41 lda LineTableL,x + 2475 8AE4 85 72 sta temp + 2476 8AE6 BD 31 42 lda LineTableH,x + 2477 8AE9 85 73 sta temp+1 + 2478 8AEB B1 72 lda (temp),y + 2479 8AED 49 FF eor #$ff + 2480 8AEF 91 72 sta (temp),y + 2481 8AF1 60 rts + 2482 .endp + 2483 ; ------------------------------------------------- + 2484 8AF2 .proc AutoDefense + 2485 ; ------------------------------------------------- + 2486 ; This routine is run from inside of the main loop + 2487 ; X - index of tank + 2488 ; ------------------------------------------------- + 2489 8AF2 20 EB 8F jsr PrepareAIShoot.WepTableToTemp + 2490 8AF5 20 45 91 jsr UseBattery + 2491 8AF8 20 98 91 jsr TosserDefensives + 2492 8AFB 60 rts + 2493 .endp + 2494 ; ------------------------------------------------- + 2495 8AFC .proc SpyHard + 2496 ; ------------------------------------------------- + 2497 8AFC A6 6C 8E 31 44 mvx TankNr TargetTankNr ; save + 2498 8B01 RepeatSpy + 2499 8B01 A2 00 86 6C mvx #0 TankNr + 2500 8B05 86 5F stx SpyHardFlag ; 0 - optimization + 2501 8B07 CheckNextTankSH + 2502 8B07 EC 31 44 cpx TargetTankNr + 2503 8B0A F0 22 beq ThisTankItsMe + 2504 8B0C BD A2 43 lda Energy,x ; only active players + 2505 8B0F F0 1D beq ThisTankIsDead + 2506 ; run SpyHard for tank in X + 2507 8B11 20 41 8B jsr DisplaySpyInfo + 2508 8B14 20 57 6B jsr FlashTank + 2509 8B17 20 5F 5A @ jsr GetKey + 2510 8B1A 24 D7 bit escFlag + 2511 8B1C 30 1A bmi SpyHardEnd + 2512 8B1E C9 21 cmp #@kbcode._space ; $21 ; Space + 2513 8B20 F0 16 beq SpyHardEnd + 2514 8B22 C9 0C cmp #@kbcode._ret ; Return key (5200 - fire) + 2515 8B24 F0 12 beq SpyHardEnd + 2516 8B26 C9 06 cmp #@kbcode._left ; $6 + 2517 8B28 F0 04 beq SelectNextTank + 2518 8B2A C9 07 cmp #@kbcode._right ; $07 ; cursor right + 2519 8B2C D0 E9 bne @- + 2520 8B2E ThisTankIsDead + 2521 8B2E ThisTankItsMe + 2522 8B2E SelectNextTank + 2523 8B2E E6 6C inc TankNr + 2524 8B30 A6 6C ldx TankNr + 2525 8B32 E4 AE cpx NumberOfPlayers + 2526 8B34 D0 D1 bne CheckNextTankSH + 2527 8B36 F0 C9 beq RepeatSpy + 2528 8B38 SpyHardEnd + 2529 8B38 AE 31 44 86 6C mvx TargetTankNr TankNr ; restore + 2530 8B3D 20 41 8B jsr DisplaySpyInfo + 2531 8B40 60 rts + 2532 .endp + 2533 8B41 .proc DisplaySpyInfo + 2534 8B41 BD 7F 5B lda TankStatusColoursTable,x + 2535 8B44 85 02 sta COLOR2 ; set color of status line + 2536 8B46 20 0F 66 jsr PutTankNameOnScreen + 2537 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen + 2538 8B49 60 rts + 2539 .endp + 2540 ; ------------------------------------------------- + 2541 8B4A .proc LazyBoys + 2542 ; ------------------------------------------------- + 2543 8B4A A9 2C 85 9E mva #sfx_lazy_boys sfx_effect + 2544 8B4E 20 CF 8F jsr PrepareAIShoot + 2545 8B51 A6 6C ldx TankNr + 2546 8B53 24 5E bit LazyFlag + 2547 8B55 30 0A bmi GoDarwin + 2548 8B57 20 C0 92 jsr FindBestTarget2 ; find nearest tank neighbour + 2549 8B5A 20 70 8B jsr LazyAim + 2550 8B5D A9 00 lda #%00000000 ; set "visual aiming" off + 2551 8B5F F0 08 beq EndLazy + 2552 8B61 GoDarwin + 2553 8B61 20 81 92 jsr FindBestTarget3 ; find target with lowest energy + 2554 8B64 20 70 8B jsr LazyAim + 2555 8B67 A9 80 lda #%10000000 + 2556 8B69 EndLazy + 2557 8B69 85 97 sta TestFlightFlag ; set "visual aiming" on + 2558 8B6B A9 00 85 5E mva #0 LazyFlag + 2559 8B6F 60 rts + 2560 .endp + 2561 8B70 .proc LazyAim + 2562 ; aiming proc for Lazy ... weapons + 2563 ; as proc for memory optimisation + 2564 ; Y - target tan nr + 2565 ; A - target direction + 2566 8B70 8C 31 44 sty TargetTankNr + 2567 ; aiming + 2568 8B73 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 2569 8B76 A5 A4 lda Force + 2570 8B78 9D D9 43 sta ForceTableL,x + 2571 8B7B A5 A5 lda Force+1 + 2572 8B7D 9D DF 43 sta ForceTableH,x + 2573 8B80 20 A1 59 jsr MoveBarrelToNewPosition + 2574 8B83 60 rts + 2575 .endp + 2576 ; ------------------------------------------------- + 2577 8B84 .proc TankFlying + 2578 ; ------------------------------------------------- + 2579 ; This routine is run from inside of the main loop + 2580 ; and replaces Shoot and Flight routines + 2581 ; X and TankNr - index of flying tank + 2582 ; ------------------------------------------------- + 2583 ; Let's designate the flight altitude. + 2584 8B84 20 BF 70 jsr CheckMaxMountain + 2585 8B87 C9 1E cmp #(12+18) ; tank with shield (12) and max alt (18) check + 2586 8B89 90 04 bcc IsToHigh + 2587 8B8B E9 0C sbc #12 ; tank with shield high correction + 2588 8B8D D0 02 bne StoreMaxAlt + 2589 8B8F IsToHigh + 2590 8B8F A9 12 lda #18 + 2591 8B91 StoreMaxAlt + 2592 8B91 85 A2 sta FloatingAlt + 2593 ; mva #18 FloatingAlt ; for testing + 2594 8B93 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect + 2595 + 2596 ; display text 4x4 - fuel full + 2597 + 2598 8B97 A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 + 2599 8B9F A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering + 2600 8BA7 A9 1D 85 83 mva #hoverFullEnd-hoverFull-1 fx ; length + 2601 8BAB 38 sec + 2602 8BAC A5 A2 lda FloatingAlt + 2603 8BAE E9 0C sbc #12 + 2604 8BB0 85 D8 sta LineYdraw + 2605 8BB2 20 72 73 jsr TypeLine4x4.variableLength + 2606 + 2607 8BB5 A6 6C ldx TankNr + 2608 + 2609 ; TankNr in X reg. + 2610 ; now animate Up + 2611 8BB7 A9 00 85 76 mva #0 modify ; it's a counter + 2612 8BBB TankGoUp + 2613 8BBB BD 19 44 lda ytankstable,x + 2614 8BBE C5 A2 cmp FloatingAlt ; Floating altitude + 2615 8BC0 90 33 bcc ReachSky + 2616 ; first erase old tank position + 2617 8BC2 A9 01 85 AA mva #1 Erase + 2618 8BC6 20 2C 6A jsr DrawTankNr + 2619 8BC9 A5 76 lda modify + 2620 8BCB C9 05 cmp #5 + 2621 8BCD 90 07 bcc NoEngineClear + 2622 8BCF A9 00 85 A9 mva #0 color + 2623 8BD3 20 7E 6C jsr DrawTankRocketEngine + 2624 8BD6 NoEngineClear + 2625 8BD6 A9 00 85 AA mva #0 Erase + 2626 8BDA DE 19 44 dec ytankstable,x + 2627 8BDD E6 76 inc modify + 2628 ; then draw tank on new position + 2629 8BDF 20 2C 6A jsr DrawTankNr + 2630 8BE2 A5 76 lda modify + 2631 8BE4 C9 05 cmp #5 + 2632 8BE6 90 0A bcc NoEngine + 2633 8BE8 AD 1B D4 lda random + 2634 8BEB 29 01 and #%00000001 + 2635 8BED 85 A9 sta color + 2636 8BEF 20 7E 6C jsr DrawTankRocketEngine + 2637 8BF2 NoEngine + 2638 ; jsr WaitOneFrame + 2639 8BF2 4C BB 8B jmp TankGoUp + 2640 + 2641 8BF5 ReachSky + 2642 ; engine symbol erase + 2643 8BF5 A9 00 85 A9 mva #0 color + 2644 8BF9 20 7E 6C jsr DrawTankRocketEngine + 2645 + 2646 ; display text 4x4 - fuel full (clear text) + 2647 8BFC A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 + 2648 8C04 A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering + 2649 8C0C A9 1D 85 83 mva #(hoverFullEnd-hoverFull-1) fx ; length + 2650 8C10 38 sec + 2651 8C11 A5 A2 lda FloatingAlt + 2652 8C13 E9 0C sbc #12 + 2653 8C15 85 D8 sta LineYdraw + 2654 8C17 A9 00 lda #$00 + 2655 8C19 20 74 73 jsr TypeLine4x4.staplot4x4color + 2656 ; and Soildown at the start (for correct mountaintable if tank was buried) + 2657 ; calculate range + 2658 8C1C A6 6C ldx TankNr + 2659 8C1E 38 sec + 2660 8C1F BD 0D 44 lda XtankstableL,x + 2661 8C22 E9 02 sbc #2 + 2662 8C24 85 D2 sta RangeLeft + 2663 8C26 BD 13 44 lda XtankstableH,x + 2664 8C29 E9 00 sbc #0 + 2665 8C2B 85 D3 sta RangeLeft+1 + 2666 8C2D 18 clc + 2667 8C2E BD 0D 44 lda XtankstableL,x + 2668 8C31 69 0A adc #10 + 2669 8C33 85 D4 sta RangeRight + 2670 8C35 BD 13 44 lda XtankstableH,x + 2671 8C38 69 00 adc #0 + 2672 8C3A 85 D5 sta RangeRight+1 + 2673 ; hide tanks and ... + 2674 8C3C 20 F4 6E jsr SoilDown2 + 2675 8C3F 20 89 8F jsr ClearScreenSoilRange + 2676 8C42 A6 6C ldx TankNr + 2677 + 2678 ; check keyboard/joy and move tank left/right - code copied from BeforeFire + 2679 ;keyboard reading + 2680 ; KBCODE keeps code of last keybi + 2681 ; SKSTAT $ff - nothing pressed + 2682 ; $FB - any key + 2683 ; $f7 - shift + 2684 ; $f3 - shift+key + 2685 8C44 KeyboardAndJoyCheck + 2686 8C44 A9 1F 85 9E mva #sfx_tank_move sfx_effect + 2687 8C48 BD A8 43 lda ShieldEnergy,x + 2688 8C4B C9 14 cmp #20 + 2689 8C4D D0 20 bne LotOfFuel + 2690 + 2691 ; display text 4x4 - low fuel + 2692 8C4F A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 + 2693 8C57 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering + 2694 8C5F A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length + 2695 8C63 38 sec + 2696 8C64 A5 A2 lda FloatingAlt + 2697 8C66 E9 0C sbc #12 + 2698 8C68 85 D8 sta LineYdraw + 2699 8C6A 20 72 73 jsr TypeLine4x4.variableLength + 2700 8C6D A6 6C ldx TankNr + 2701 + 2702 8C6F LotOfFuel + 2703 8C6F notpressed + 2704 ; let's animate "engine" + 2705 8C6F 20 E5 6C jsr DrawTankEngine + 2706 ; enimation ends + 2707 + 2708 8C72 A5 02 lda SKSTAT + 2709 8C74 C9 FF cmp #$ff + 2710 8C76 F0 26 jeq checkJoy + 2711 8C78 C9 F7 cmp #$f7 ; SHIFT + 2712 8C7A F0 22 jeq checkJoy + 2713 + 2714 8C7C A5 02 lda kbcode + 2715 8C7E 29 3F and #%00111111 ; CTRL and SHIFT elimination + 2716 + 2717 8C80 C9 1C cmp #@kbcode._esc ; 28 ; ESC + 2718 8C82 D0 08 bne @+ + 2719 8C84 20 AE 73 jsr AreYouSure + 2720 8C87 24 D7 bit escFlag + 2721 8C89 10 E4 bpl notpressed + 2722 ;---esc pressed-quit game--- + 2723 8C8B 60 rts + 2724 @ + 2725 8C8C jumpFromStick + 2726 8C8C C9 06 cmp #@kbcode._left ; $6 + 2727 8C8E F0 60 jeq pressedLeft + 2728 8C90 C9 07 cmp #@kbcode._right ; $7 + 2729 8C92 F0 23 jeq pressedRight + 2730 8C94 C9 21 cmp #@kbcode._space ; $21 + 2731 8C96 D0 03 4C 3B 8D jeq pressedSpace + 2732 8C9B 4C 6F 8C jmp notpressed + 2733 8C9E checkJoy + 2734 ;------------JOY------------- + 2735 ;happy happy joy joy + 2736 ;check for joystick now + 2737 8C9E A5 02 lda STICK0 + 2738 8CA0 29 0F and #$0f + 2739 8CA2 C9 0F cmp #$0f + 2740 8CA4 F0 07 beq notpressedJoy + 2741 8CA6 A8 tay + 2742 8CA7 B9 5A 60 lda joyToKeyTable,y + 2743 8CAA 4C 8C 8C jmp jumpFromStick + 2744 8CAD notpressedJoy + 2745 ;fire + 2746 8CAD A5 02 lda STRIG0 + 2747 8CAF D0 03 4C 3B 8D jeq pressedSpace + 2748 8CB4 4C 6F 8C jmp notpressed + 2749 + 2750 + 2751 8CB7 pressedRight + 2752 8CB7 BD A8 43 lda ShieldEnergy,x + 2753 8CBA F0 7F jeq pressedSpace + 2754 8CBC A0 01 ldy #1 + 2755 8CBE 20 B0 57 jsr DecreaseShieldEnergyX + 2756 ; first erase old tank position + 2757 8CC1 A9 01 85 AA mva #1 Erase + 2758 8CC5 20 2C 6A jsr DrawTankNr + 2759 8CC8 A9 00 85 AA mva #0 Erase + 2760 8CCC BD 13 44 lda XtankstableH,x + 2761 8CCF C9 01 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 + 2762 8CD1 D0 05 bne @+ + 2763 8CD3 BD 0D 44 lda XtankstableL,x + 2764 8CD6 C9 34 cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels + 2765 8CD8 B0 0B @ bcs RightScreenEdge + 2766 8CDA FE 0D 44 inc XtankstableL,x + 2767 8CDD D0 03 FE 13 44 sne:inc XtankstableH,x + 2768 8CE2 4C E9 8C jmp NoREdge + 2769 8CE5 RightScreenEdge + 2770 8CE5 A9 03 85 9E mva #sfx_dunno sfx_effect + 2771 8CE9 NoREdge + 2772 8CE9 A9 12 9D C3 48 mva #18 AngleTable,x + 2773 8CEE D0 3C bne DrawFloatingTank ; then draw tank on new position + 2774 + 2775 8CF0 pressedLeft + 2776 8CF0 BD A8 43 lda ShieldEnergy,x + 2777 8CF3 F0 46 beq pressedSpace + 2778 8CF5 A0 01 ldy #1 + 2779 8CF7 20 B0 57 jsr DecreaseShieldEnergyX + 2780 ; first erase old tank position + 2781 8CFA A9 01 85 AA mva #1 Erase + 2782 8CFE 20 2C 6A jsr DrawTankNr + 2783 8D01 A9 00 85 AA mva #0 Erase + 2784 8D05 BD 13 44 lda XtankstableH,x + 2785 8D08 C9 00 cmp #0 + 2786 8D0A D0 05 bne @+ + 2787 8D0C BD 0D 44 lda XtankstableL,x + 2788 8D0F C9 05 cmp #5 ; 4 pixles from left edge + 2789 8D11 90 10 @ bcc LeftScreenEdge + 2790 8D13 DE 0D 44 dec XtankstableL,x + 2791 8D16 BD 0D 44 lda XtankstableL,x + 2792 8D19 C9 FF cmp #$ff + 2793 8D1B D0 03 DE 13 44 sne:dec XtankstableH,x + 2794 8D20 4C 27 8D jmp NoLEdge + 2795 8D23 LeftScreenEdge + 2796 8D23 A9 03 85 9E mva #sfx_dunno sfx_effect + 2797 8D27 NoLEdge + 2798 8D27 A9 A2 9D C3 48 mva #162 AngleTable,x + 2799 ; then draw tank on new position + 2800 8D2C DrawFloatingTank + 2801 8D2C 20 2C 6A jsr DrawTankNr + 2802 8D2F 20 0F 66 jsr DisplayStatus + 2803 8D32 20 89 5A jsr WaitOneFrame + 2804 8D35 20 6B 8E jsr CalculateSoildown + 2805 8D38 4C 44 8C jmp KeyboardAndJoyCheck + 2806 + 2807 8D3B pressedSpace + 2808 ; display text 4x4 - low fuel (clear text) + 2809 8D3B A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 + 2810 8D43 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering + 2811 8D4B A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length + 2812 8D4F 38 sec + 2813 8D50 A5 A2 lda FloatingAlt + 2814 8D52 E9 0C sbc #12 + 2815 8D54 85 D8 sta LineYdraw + 2816 8D56 A9 00 lda #$00 + 2817 8D58 20 74 73 jsr TypeLine4x4.staplot4x4color + 2818 8D5B A6 6C ldx TankNr + 2819 ;================================= + 2820 ; left or right from center of screen ? + 2821 8D5D A0 00 ldy #0 + 2822 8D5F BD 13 44 lda XtankstableH,x + 2823 8D62 C9 00 cmp #>((screenwidth/2)-TankWidth) + 2824 8D64 D0 05 bne @+ + 2825 8D66 BD 0D 44 lda XtankstableL,x + 2826 8D69 C9 98 cmp #<((screenwidth/2)-TankWidth) + 2827 8D6B 90 01 @ bcc TankOnLeftSide + 2828 8D6D TankOnRightSide + 2829 8D6D 88 dey + 2830 8D6E TankOnLeftSide + 2831 8D6E 84 A3 sty OverTankDir ; (0 go right, $ff go left) + 2832 ; now we have direction of bypassing tanks on screen + 2833 + 2834 ; clear "engine pixels" under tank + 2835 8D70 A9 01 85 AA mva #1 erase + 2836 8D74 20 E5 6C jsr DrawTankEngine + 2837 + 2838 8D77 CheckForTanksBelow + 2839 8D77 BD 0D 44 lda XtankstableL,x + 2840 8D7A 85 61 sta xdraw + 2841 8D7C BD 13 44 lda XtankstableH,x + 2842 8D7F 85 62 sta xdraw+1 + 2843 8D81 A6 AE ldx NumberOfPlayers + 2844 8D83 CA dex + 2845 8D84 CheckCollisionWithTankLoop + 2846 8D84 E4 6C cpx TankNr + 2847 8D86 F0 63 beq ItIsMe + 2848 8D88 BD AF 43 lda eXistenZ,x + 2849 8D8B F0 5E beq DeadTank + 2850 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + 2851 ; it is tricky but fast and much shorter + 2852 8D8D BD 0D 44 lda xtankstableL,x + 2853 8D90 38 sec + 2854 8D91 E9 09 sbc #9 ; 2 pixels more on left side + tank width + 2855 8D93 A8 tay + 2856 8D94 BD 13 44 lda xtankstableH,x + 2857 8D97 E9 00 sbc #0 + 2858 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + 2859 8D99 C5 62 cmp xdraw+1 + 2860 8D9B D0 02 bne @+ + 2861 8D9D C4 61 cpy xdraw + 2862 @ + 2863 8D9F B0 4A bcs LeftFromTheTank + 2864 8DA1 98 tya ;add 20 (tank size*2 +2 and +2) + 2865 8DA2 18 clc + 2866 8DA3 69 14 adc #20 + 2867 8DA5 A8 tay + 2868 8DA6 BD 13 44 lda xtankstableH,x + 2869 8DA9 69 00 adc #0 + 2870 8DAB C5 62 cmp xdraw+1 + 2871 8DAD D0 02 bne @+ + 2872 8DAF C4 61 cpy xdraw + 2873 @ + 2874 8DB1 90 38 bcc RightFromTheTank + 2875 8DB3 TankBelow + 2876 ; tank below - we must move our tank + 2877 8DB3 A6 6C ldx TankNr + 2878 ; first erase old tank position + 2879 8DB5 A9 01 85 AA mva #1 Erase + 2880 8DB9 20 2C 6A jsr DrawTankNr + 2881 8DBC A9 00 85 AA mva #0 Erase + 2882 8DC0 24 A3 bit OverTankDir + 2883 8DC2 30 0F bmi PassLeft + 2884 8DC4 PassRight + 2885 8DC4 FE 0D 44 inc XtankstableL,x + 2886 8DC7 D0 03 FE 13 44 sne:inc XtankstableH,x + 2887 8DCC A9 12 9D C3 48 mva #18 AngleTable,x + 2888 8DD1 D0 12 bne Bypassing + 2889 8DD3 PassLeft + 2890 8DD3 DE 0D 44 dec XtankstableL,x + 2891 8DD6 BD 0D 44 lda XtankstableL,x + 2892 8DD9 C9 FF cmp #$ff + 2893 8DDB D0 03 DE 13 44 sne:dec XtankstableH,x + 2894 8DE0 A9 A2 9D C3 48 mva #162 AngleTable,x + 2895 8DE5 Bypassing + 2896 ; then draw tank on new position + 2897 8DE5 20 2C 6A jsr DrawTankNr + 2898 8DE8 4C 77 8D jmp CheckForTanksBelow + 2899 8DEB RightFromTheTank + 2900 8DEB LeftFromTheTank + 2901 8DEB DeadTank + 2902 8DEB ItIsMe + 2903 8DEB CA dex + 2904 8DEC 10 96 bpl CheckCollisionWithTankLoop + 2905 8DEE A6 6C ldx TankNr + 2906 8DF0 A9 0E 85 9E mva #sfx_shield_off sfx_effect + 2907 8DF4 A9 01 85 AA mva #1 Erase + 2908 8DF8 20 2C 6A jsr DrawTankNr + 2909 8DFB A9 00 85 AA mva #0 Erase + 2910 ; x correction for P/M + 2911 ; -- + 2912 .IF XCORRECTION_FOR_PM = 1 + 2913 lda XtankstableL,x + 2914 and #%11111110 ; correction for PM + 2915 sta XtankstableL,x + 2916 .ENDIF + 2917 ; -- + 2918 8DFF GoDown + 2919 + 2920 8DFF A9 3E 85 72 A9 46 + mwa #mountaintable temp + 2921 8E07 18 clc + 2922 8E08 A5 72 lda temp + 2923 8E0A 7D 0D 44 adc XtankstableL,x + 2924 8E0D 85 72 sta temp + 2925 8E0F A5 73 lda temp+1 + 2926 8E11 7D 13 44 adc XtankstableH,x + 2927 8E14 85 73 sta temp+1 + 2928 8E16 18 A5 72 69 04 85 + adw temp #4 ; center of the tank + 2929 8E21 A0 00 ldy #0 + 2930 8E23 B1 72 lda (temp),y + 2931 8E25 85 A3 sta OverTankDir ; not elegant!!! Reuse as height of tank flight + 2932 8E27 FloatDown + 2933 8E27 BD 19 44 lda ytankstable,x + 2934 8E2A C5 A3 cmp OverTankDir + 2935 8E2C B0 1D bcs OnGround + 2936 ; first erase old tank position + 2937 8E2E A9 01 85 AA mva #1 Erase + 2938 8E32 20 2C 6A jsr DrawTankNr + 2939 8E35 20 66 6C jsr DrawTankParachute + 2940 8E38 A9 00 85 AA mva #0 Erase + 2941 8E3C FE 19 44 inc ytankstable,x + 2942 ; then draw tank on new position + 2943 8E3F 20 2C 6A jsr DrawTankNr + 2944 8E42 20 66 6C jsr DrawTankParachute + 2945 8E45 20 89 5A jsr WaitOneFrame + 2946 8E48 4C 27 8E jmp FloatDown + 2947 8E4B OnGround + 2948 ; clear parachute + 2949 8E4B A9 01 85 AA mva #1 Erase + 2950 8E4F 20 66 6C jsr DrawTankParachute + 2951 8E52 A9 00 85 AA mva #0 Erase + 2952 8E56 20 71 5A jsr WaitForKeyRelease + 2953 ; and Soildown at the end (for correct mountaintable) + 2954 ; If tank did not fly at maximum altitude there is no need to soildown to much + 2955 8E59 A5 A2 lda FloatingAlt + 2956 8E5B C9 12 cmp #18 + 2957 8E5D F0 03 beq NotHighest + 2958 8E5F 20 89 8F jsr ClearScreenSoilRange + 2959 8E62 NotHighest + 2960 ; calculate range + 2961 8E62 20 6B 8E jsr CalculateSoildown + 2962 ; hide tanks and ... + 2963 8E65 20 F4 6E jsr SoilDown2 + 2964 8E68 A6 6C ldx TankNr + 2965 8E6A 60 rts + 2966 + 2967 8E6B CalculateSoildown + 2968 8E6B A6 6C ldx TankNr + 2969 8E6D 18 clc + 2970 8E6E BD 0D 44 lda XtankstableL,x + 2971 8E71 69 04 adc #4 + 2972 8E73 85 61 sta xdraw + 2973 8E75 BD 13 44 lda XtankstableH,x + 2974 8E78 69 00 adc #0 + 2975 8E7A 85 62 sta xdraw+1 + 2976 8E7C A9 04 85 B0 mva #$04 ExplosionRadius + 2977 8E80 20 0C 8F jsr CalculateExplosionRange + 2978 8E83 60 rts + 2979 .endp + 2980 + 2981 ; ------------------------------------------------- + 2982 8E84 .proc CheckCollisionWithTank + 2983 ; ------------------------------------------------- + 2984 ; Check collision with Tank :) + 2985 ; xdraw , ydraw - coordinates of the checked point + 2986 ; results: + 2987 ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1) + 2988 ; XHit , YHit - coordinates of hit + 2989 ; X - index of the hit tank + 2990 + 2991 8E84 A6 AE ldx NumberOfPlayers + 2992 8E86 CA dex + 2993 8E87 CheckCollisionWithTankLoop + 2994 8E87 BD AF 43 lda eXistenZ,x + 2995 8E8A F0 51 beq DeadTank + 2996 ; first we test top and bottom (same with and without shield!) + 2997 8E8C BD 19 44 lda ytankstable,x + 2998 8E8F C5 63 cmp ydraw ; check range + 2999 8E91 90 4A bcc BelowTheTank ;(ytankstable,ytankstable+3) + 3000 8E93 E9 03 sbc #3 ; hitbox height + 3001 8E95 C5 63 cmp ydraw + 3002 8E97 B0 44 bcs OverTheTank + 3003 ; with or without shield ? + 3004 + 3005 8E99 BD FD 43 lda ActiveDefenceWeapon,x + 3006 8E9C C9 25 cmp #ind_Mag_Deflector__ ; first shielded weapon + 3007 8E9E 90 04 bcc CheckCollisionWithNotShieldedTank + 3008 8EA0 C9 2A cmp #ind_Bouncy_Castle__+1 ; last shielded weapon + 3009 8EA2 90 3D bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) + 3010 + 3011 ;lda ShieldEnergy,x ; there is wrong method to check shield :) + 3012 ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) + 3013 + 3014 8EA4 CheckCollisionWithNotShieldedTank + 3015 8EA4 BD 13 44 lda xtankstableH,x + 3016 8EA7 C5 62 cmp xdraw+1 + 3017 8EA9 D0 05 bne @+ + 3018 8EAB BD 0D 44 lda xtankstableL,x + 3019 8EAE C5 61 cmp xdraw + 3020 @ + 3021 8EB0 B0 2B bcs LeftFromTheTank + 3022 ; add 8 double byte + 3023 ; now we use Y as low byte and A as high byte of checked position (right edge of tank) + 3024 ; it is tricky but fast and much shorter + 3025 8EB2 18 clc + 3026 8EB3 BD 0D 44 lda xtankstableL,x + 3027 8EB6 69 08 adc #TankWidth + 3028 8EB8 A8 tay + 3029 8EB9 BD 13 44 lda xtankstableH,x + 3030 8EBC 69 00 adc #0 + 3031 8EBE C5 62 cmp xdraw+1 + 3032 8EC0 D0 02 bne @+ + 3033 8EC2 C4 61 cpy xdraw + 3034 @ + 3035 8EC4 90 17 bcc RightFromTheTank + 3036 8EC6 TankHit + 3037 8EC6 E8 inx + 3038 8EC7 86 BF stx HitFlag ; index of hit tank+1 + 3039 8EC9 CA dex + 3040 8ECA A5 61 85 C1 A5 62 + mwa xdraw XHit + 3041 8ED2 A5 63 8D 5F 44 A5 + mwa ydraw YHit + 3042 8EDC 60 rts ; in X there is an index of the hit tank + 3043 8EDD RightFromTheTank + 3044 8EDD LeftFromTheTank + 3045 8EDD OverTheTank + 3046 8EDD BelowTheTank + 3047 8EDD DeadTank + 3048 8EDD CA dex + 3049 8EDE 10 A7 bpl CheckCollisionWithTankLoop + 3050 8EE0 60 rts + 3051 8EE1 CheckCollisionWithShieldedTank + 3052 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) + 3053 ; it is tricky but fast and much shorter + 3054 8EE1 BD 0D 44 lda xtankstableL,x + 3055 8EE4 38 sec + 3056 8EE5 E9 04 sbc #4 ; 5 pixels more on left side + 3057 8EE7 A8 tay + 3058 8EE8 BD 13 44 lda xtankstableH,x + 3059 8EEB E9 00 sbc #0 + 3060 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! + 3061 8EED C5 62 cmp xdraw+1 + 3062 8EEF D0 02 bne @+ + 3063 8EF1 C4 61 cpy xdraw + 3064 @ + 3065 8EF3 B0 E8 bcs LeftFromTheTank + 3066 8EF5 98 tya ;add 16 double byte + 3067 8EF6 18 clc + 3068 8EF7 69 10 adc #TankWidth+4+4 + 3069 8EF9 A8 tay + 3070 8EFA BD 13 44 lda xtankstableH,x + 3071 8EFD 69 00 adc #0 + 3072 8EFF C5 62 cmp xdraw+1 + 3073 8F01 D0 02 bne @+ + 3074 8F03 C4 61 cpy xdraw + 3075 @ + 3076 8F05 90 D6 bcc RightFromTheTank + 3077 8F07 B0 BD bcs TankHit + 3078 .endp + 3079 ;-------------------------------------------------- + 3080 8F09 CalculateExplosionRange0 + 3081 ;-------------------------------------------------- + 3082 + 3083 ;the same as below, but without summing up + 3084 ;(for the first or single explosion) + 3085 + 3086 ;zero soil fall out ranges + 3087 8F09 20 89 8F jsr ClearScreenSoilRange + 3088 ;-------------------------------------------------- + 3089 8F0C .proc CalculateExplosionRange + 3090 ;-------------------------------------------------- + 3091 ;calculates total horizontal range of explosion by + 3092 ;"summing up" ranges of all separate explosions + 3093 + 3094 ; WeaponRangeRight = xdraw + ExplosionRadius + 3095 8F0C 18 clc + 3096 8F0D A5 61 lda xdraw + 3097 8F0F 65 B0 adc ExplosionRadius + 3098 8F11 8D 35 44 sta WeaponRangeRight + 3099 8F14 A5 62 lda xdraw+1 + 3100 8F16 69 00 adc #$00 + 3101 8F18 8D 36 44 sta WeaponRangeRight+1 + 3102 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now + 3103 ; cpw WeaponRangeRight #screenwidth-1 + 3104 8F1B C9 01 cmp #>(screenwidth-1) + 3105 8F1D D0 05 bne @+ + 3106 8F1F AD 35 44 lda WeaponRangeRight + 3107 8F22 C9 3F cmp #<(screenwidth-1) + 3108 8F24 90 0A @ bcc NotOutOfTheScreenRight + 3109 8F26 A9 3F 8D 35 44 A9 + mwa #screenwidth-1 WeaponRangeRight + 3110 + 3111 8F30 NotOutOfTheScreenRight + 3112 ; WeaponRangeLeft = xdraw - ExplosionRadius + 3113 8F30 38 sec + 3114 8F31 A5 61 lda xdraw + 3115 8F33 E5 B0 sbc ExplosionRadius + 3116 8F35 8D 33 44 sta WeaponRangeLeft + 3117 8F38 A5 62 lda xdraw+1 + 3118 8F3A E9 00 sbc #$00 + 3119 8F3C 8D 34 44 sta WeaponRangeLeft+1 + 3120 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now + 3121 ; lda WeaponRangeLeft+1 + 3122 8F3F 10 08 bpl NotOutOfTheScreenLeft + 3123 8F41 A9 00 lda #0 + 3124 8F43 8D 33 44 sta WeaponRangeLeft + 3125 8F46 8D 34 44 sta WeaponRangeLeft+1 + 3126 8F49 NotOutOfTheScreenLeft + 3127 + 3128 8F49 A5 D3 CD 34 44 D0 + cpw RangeLeft WeaponRangeLeft + 3129 8F55 90 0A bcc CheckRangeRight + 3130 8F57 AD 33 44 85 D2 AD + mwa WeaponRangeLeft RangeLeft + 3131 8F61 CheckRangeRight + 3132 8F61 A5 D5 CD 36 44 D0 + cpw RangeRight WeaponRangeRight + 3133 8F6D B0 0A bcs RangesChecked + 3134 8F6F AD 35 44 85 D4 AD + mwa WeaponRangeRight RangeRight + 3135 8F79 RangesChecked + 3136 + 3137 8F79 60 rts + 3138 .endp + 3139 + 3140 ;-------------------------------------------------- + 3141 8F7A .proc SetFullScreenSoilRange + 3142 ; whole screen in range of soil down + 3143 ;-------------------------------------------------- + 3144 8F7A A9 00 lda #0 + 3145 8F7C 85 D2 sta RangeLeft + 3146 8F7E 85 D3 sta RangeLeft+1 + 3147 8F80 A9 40 85 D4 A9 01 + mwa #screenwidth RangeRight + 3148 8F88 60 rts + 3149 .endp + 3150 ;-------------------------------------------------- + 3151 8F89 .proc ClearScreenSoilRange + 3152 ; cleanup of the soil fall down ranges (left and right) + 3153 ;-------------------------------------------------- + 3154 8F89 A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft + 3155 8F91 A9 00 lda #0 + 3156 8F93 85 D4 sta RangeRight + 3157 8F95 85 D5 sta RangeRight+1 + 3158 8F97 60 rts + 3159 .endp + 3160 ;-------------------------------------------------- + 3161 8F98 .proc DecreaseWeaponBeforeShoot + 3162 ;-------------------------------------------------- + 3163 8F98 A6 6C ldx TankNr + 3164 8F9A BD F7 43 lda ActiveWeapon,x + 3165 8F9D 20 A4 8F jsr DecreaseWeapon + 3166 ; and here we have amount of possessed ammo for given weapon + 3167 8FA0 8D 09 44 sta WeaponDepleted + 3168 8FA3 60 rts + 3169 .endp + 3170 + 3171 ;-------------------------------------------------- + 3172 8FA4 .proc DecreaseWeapon + 3173 ; in: A: Weapon number, TankNr + 3174 ; out: A: number of shells left, Y: weapon number + 3175 ; decreases 1 bullet from a weapon(A) of tank(TankNr) + 3176 ;-------------------------------------------------- + 3177 8FA4 20 B3 8F jsr HowManyBullets + 3178 8FA7 F0 09 beq noBullets ; no bullets - no decreasing (additional check) + 3179 8FA9 C0 00 cpy #0 + 3180 8FAB F0 05 beq defaultWeapon ; no decreasing Baby Missile + 3181 8FAD 38 sec + 3182 8FAE E9 01 sbc #1 + 3183 8FB0 91 98 sta (weaponPointer),y ; we have good values after HowManyBullets + 3184 8FB2 defaultWeapon + 3185 8FB2 noBullets + 3186 8FB2 60 rts + 3187 .endp + 3188 + 3189 ;-------------------------------------------------- + 3190 8FB3 .proc HowManyBullets + 3191 ; in: A <-- Weapon number, TankNr + 3192 ; out: A <-- How many bullets in the weapon, Y: weapon number + 3193 ; how many bullets weapon of tank(TankNr) has, Result in A + 3194 ;-------------------------------------------------- + 3195 8FB3 A8 tay + 3196 8FB4 A6 6C ldx TankNr + 3197 8FB6 BD F1 5A lda TanksWeaponsTableL,x + 3198 8FB9 85 98 sta weaponPointer + 3199 8FBB BD F7 5A lda TanksWeaponsTableH,x + 3200 8FBE 85 99 sta weaponPointer+1 + 3201 + 3202 8FC0 B1 98 lda (weaponPointer),y ; and we have number of bullets in A + 3203 8FC2 60 rts + 3204 .endp + 3205 + 3206 + 3207 .ENDIF + 3208 + 352 ;---------------------------------------------- + 353 8FC3 icl 'ai.asm' +Source: ai.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 ; artificial intelligence of tanks goes here! + 4 ; in A there is a level of tank's intelligence + 5 ; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all) + 6 ; at the moment (2003-08-15) I have no idea how + 7 ; to program better opponents, but moron is easy - + 8 ; - shoots random direction and force + 9 ; greeeting to myself 10 years older in 2013-11-09... still no idea + 10 + 11 + 12 ;---------------------------------------------- + 13 8FC3 .proc ArtificialIntelligence ; + 14 ; A - skill of the TankNr (in X) + 15 ; returns shoot energy and angle in + 16 ; ForceTable/L/H and AngleTable + 17 ;---------------------------------------------- + 18 8FC3 0A asl + 19 8FC4 A8 tay + 20 8FC5 88 88 :2 dey ;credit KK + 21 8FC7 B9 F7 8F lda AIRoutines+1,y + 22 8FCA 48 pha + 23 8FCB B9 F6 8F lda AIRoutines,y + 24 8FCE 48 pha + 25 ; it's no necessary - PrepareAIShoot is next proc :) + 26 ; jsr PrepareAIShoot + 27 ; rts + 28 .endp + 29 ;---------------------------------------------- + 30 8FCF .proc PrepareAIShoot + 31 ; create low precision table of positions + 32 ; by dividing positions by 4 + 33 8FCF A0 05 ldy #MaxPlayers-1 + 34 8FD1 loop + 35 8FD1 B9 0D 44 lda xtankstableL,y + 36 8FD4 85 72 sta temp + 37 8FD6 B9 13 44 lda xtankstableH,y + 38 8FD9 85 73 sta temp+1 + 39 ;= /4 + 40 8FDB 46 73 66 72 46 73 + :2 lsrw temp + 41 8FE3 A5 72 lda temp + 42 8FE5 99 1F 44 sta LowResDistances,y + 43 8FE8 88 dey + 44 8FE9 10 E6 bpl loop + 45 + 46 ; common values used in AI routines + 47 ; address of weapons table (for future use) + 48 8FEB WepTableToTemp + 49 8FEB BD F1 5A lda TanksWeaponsTableL,x + 50 8FEE 85 72 sta temp + 51 8FF0 BD F7 5A lda TanksWeaponsTableH,x + 52 8FF3 85 73 sta temp+1 + 53 8FF5 60 rts + 54 .endp + 55 ;---------------- + 56 8FF6 AIRoutines + 57 8FF6 1C 90 .word Moron-1 + 58 8FF8 3D 90 .word Shooter-1 ;Shooter + 59 8FFA CD 90 .word Poolshark-1 ;Poolshark + 60 8FFC 8E 91 .word Tosser-1 ;Tosser + 61 8FFE B7 91 .word Chooser-1 ;Chooser + 62 9000 05 92 .word Spoiler-1 ;Spoiler + 63 9002 53 92 .word Cyborg-1 ;Cyborg + 64 9004 05 90 .word Unknown-1 ;Unknown + 65 + 66 ;---------------------------------------------- + 67 9006 .proc Unknown + 68 ; random robotank (from Poolshark to Cyborg) + 69 9006 randomize 4 13 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9006 ?rand + 7 9006 AD 1B D4 lda random + 8 9009 C9 04 cmp #4 ;floor + 9 900B 90 F9 bcc ?rand + 10 900D C9 0E cmp #13+1 ;ceiling + 11 900F B0 F5 bcs ?rand +Source: ai.asm + 70 9011 29 FE and #%11111110 + 71 9013 A8 tay + 72 9014 B9 F7 8F lda AIRoutines+1,y + 73 9017 48 pha + 74 9018 B9 F6 8F lda AIRoutines,y + 75 901B 48 pha + 76 901C 60 rts + 77 .endp + 78 ;---------------------------------------------- + 79 901D .proc Moron + 80 901D 20 3D 59 jsr RandomizeAngle + 81 9020 85 D6 sta NewAngle + 82 9022 A9 50 8D E4 48 A9 + mwa #80 RandBoundaryLow + 83 902C A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh + 84 9036 20 45 59 jsr RandomizeForce + 85 ; choose the best weapon + 86 9039 A0 1F ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) + 87 903B 4C F4 95 jmp ChooseBestOffensive.NotFromAll + 88 ;rts + 89 .endp + 90 ;---------------------------------------------- + 91 903E .proc Shooter + 92 + 93 903E BD CC 48 lda PreviousAngle,x + 94 9041 1D D2 48 ora PreviousEnergyL,x + 95 9044 1D DE 48 ora PreviousEnergyH,x + 96 9047 F0 2D beq firstShoot + 97 + 98 9049 BD CC 48 lda PreviousAngle,x + 99 904C C9 5A cmp #90 + 100 904E B0 09 bcs shootingLeftAtThisMomentOfTime + 101 ; shooting right at this moment of time + 102 9050 38 sec + 103 9051 E9 05 sbc #5 + 104 9053 C9 0A cmp #10 + 105 9055 B0 09 bcs @+ ;not smaller than 10 + 106 9057 90 1D bcc firstShoot ; GET THE aim againg + 107 + 108 9059 shootingLeftAtThisMomentOfTime + 109 + 110 9059 18 clc + 111 905A 69 05 adc #5 + 112 905C C9 AA cmp #170 ; maximum shooter angle + 113 905E B0 16 bcs firstShoot + 114 @ + 115 9060 85 D6 sta NewAngle + 116 + 117 9062 38 sec + 118 9063 BD D2 48 lda PreviousEnergyL,x + 119 9066 E9 05 sbc #5 + 120 9068 9D D9 43 sta ForceTableL,x + 121 906B BD DE 48 lda PreviousEnergyH,x + 122 906E E9 00 sbc #0 + 123 9070 9D DF 43 sta ForceTableH,x + 124 9073 4C B7 90 jmp endo + 125 + 126 9076 firstShoot + 127 ; compare the x position with the middle of the screen + 128 9076 BD 13 44 lda xTanksTableH,x + 129 9079 C9 00 cmp #>(screenwidth/2) + 130 907B D0 05 bne @+ + 131 907D BD 0D 44 lda xTanksTableL,x + 132 9080 C9 A0 cmp #<(screenwidth/2) + 133 9082 90 0F @ bcc tankIsOnTheRight + 134 + 135 ; enemy tank is on the left + 136 9084 randomize 95 125 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9084 ?rand + 7 9084 AD 1B D4 lda random + 8 9087 C9 5F cmp #95 ;floor + 9 9089 90 F9 bcc ?rand + 10 908B C9 7E cmp #125+1 ;ceiling + 11 908D B0 F5 bcs ?rand +Source: ai.asm + 137 908F 85 D6 sta NewAngle + 138 9091 D0 0D bne forceNow + 139 + 140 9093 tankIsOnTheRight + 141 9093 randomize 55 85 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9093 ?rand + 7 9093 AD 1B D4 lda random + 8 9096 C9 37 cmp #55 ;floor + 9 9098 90 F9 bcc ?rand + 10 909A C9 56 cmp #85+1 ;ceiling + 11 909C B0 F5 bcs ?rand +Source: ai.asm + 142 909E 85 D6 sta NewAngle + 143 + 144 90A0 forceNow + 145 90A0 A9 64 8D E4 48 A9 + mwa #100 RandBoundaryLow + 146 90AA A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh + 147 ;ldx TankNr ;this is possibly not necessary + 148 90B4 20 45 59 jsr RandomizeForce + 149 + 150 90B7 endo + 151 ;ldx TankNr ;this is possibly not necessary + 152 90B7 20 79 59 jsr RandomizeForce.LimitForce + 153 90BA A5 D6 lda NewAngle + 154 90BC 9D CC 48 sta PreviousAngle,x + 155 90BF BD D9 43 lda ForceTableL,x + 156 90C2 9D D2 48 sta PreviousEnergyL,x + 157 90C5 BD DF 43 lda ForceTableH,x + 158 90C8 9D DE 48 sta PreviousEnergyH,x + 159 + 160 ; choose the best weapon + 161 + 162 90CB 4C F2 95 jmp ChooseBestOffensive + 163 ;rts + 164 .endp + 165 ;---------------------------------------------- + 166 90CE .proc Poolshark + 167 90CE 20 35 91 jsr UseBatteryOrFlag + 168 ; defensives + 169 90D1 20 60 91 jsr PoolsharkDefensives + 170 90D4 firstShoot + 171 ;find nearest tank neighbour + 172 90D4 20 C0 92 jsr FindBestTarget2 + 173 90D7 F0 0F beq EnemyOnLeft + 174 ; calculate index to shotangle table + 175 ; in temp2 we have x distance divided by 8 + 176 90D9 A5 74 lda temp2 + 177 90DB 4A 4A 4A :3 lsr @ + 178 90DE 29 07 and #%00000111 + 179 90E0 18 clc + 180 90E1 69 08 adc #8 + 181 90E3 8D E8 48 sta AngleTablePointer + 182 90E6 D0 0C bne AngleIsSet + 183 90E8 EnemyOnLeft + 184 90E8 A5 74 lda temp2 + 185 90EA 4A 4A 4A :3 lsr @ + 186 90ED 29 07 and #%00000111 + 187 90EF 49 07 eor #%00000111 + 188 90F1 8D E8 48 sta AngleTablePointer + 189 90F4 AngleIsSet + 190 + 191 90F4 randomize 0 8 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 90F4 ?rand + 7 90F4 AD 1B D4 lda random + 8 90F7 C9 00 cmp #0 ;floor + 9 90F9 90 F9 bcc ?rand + 10 90FB C9 09 cmp #8+1 ;ceiling + 11 90FD B0 F5 bcs ?rand +Source: ai.asm + 192 90FF AC E8 48 ldy AngleTablePointer + 193 9102 18 clc + 194 9103 79 25 91 adc AngleTable,y + 195 9106 85 D6 sta NewAngle + 196 + 197 9108 forceNow + 198 9108 A9 2C 8D E4 48 A9 + mwa #300 RandBoundaryLow + 199 9112 A9 BC 8D E6 48 A9 + mwa #700 RandBoundaryHigh + 200 911C A6 6C ldx TankNr + 201 911E 20 45 59 jsr RandomizeForce + 202 + 203 9121 endo + 204 ; choose the best weapon + 205 + 206 9121 20 F2 95 jsr ChooseBestOffensive + 207 9124 60 rts + 208 + 209 ;---------------------------------------------- + 210 9125 AngleTable ; 16 bytes ;ba w $348b L$3350 + 211 9125 6A 72 7A 82 8A 92 + .by 106,114,122,130,138,146,154,162 + 212 912D 12 1A 22 2B 32 3A + .by 18,26,34,43,50,58,66,74 + 213 .endp + 214 ;---------------------------------------------- + 215 9135 .proc UseBatteryOrFlag + 216 9135 20 45 91 jsr UseBattery ; as subroutine for reuse in AutoDefense + 217 ; if very low energy and no battery then use White Flag + 218 9138 BD A2 43 lda Energy,x + 219 913B C9 05 cmp #5 + 220 913D B0 05 bcs EnoughEnergy + 221 ; lower than 5 units - white flag + 222 913F A9 20 lda #ind_White_Flag_____ + 223 9141 9D FD 43 sta ActiveDefenceWeapon,x + 224 9144 EnoughEnergy + 225 9144 60 rts + 226 .endp + 227 ; + 228 9145 .proc UseBattery + 229 ; if low energy ten use battery + 230 9145 BD A2 43 lda Energy,x + 231 9148 C9 1E cmp #30 + 232 914A B0 13 bcs EnoughEnergy + 233 ; lower than 30 units - check battery + 234 914C A0 21 ldy #ind_Battery________ + 235 914E B1 72 lda (temp),y ; has address of TanksWeaponsTable + 236 9150 F0 0D beq NoBatteries + 237 ; we have batteries - use one + 238 9152 38 sec + 239 9153 E9 01 sbc #1 + 240 9155 91 72 sta (temp),y + 241 9157 A9 63 lda #99 + 242 9159 9D A2 43 sta Energy,x + 243 915C 20 2A 58 jsr MaxForceCalculate + 244 915F EnoughEnergy + 245 915F NoBatteries + 246 915F 60 rts + 247 .endp + 248 ;---------------------------------------------- + 249 9160 .proc PoolsharkDefensives + 250 ; use best defensive :) + 251 ; but not allways + 252 9160 randomize 1 3 +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9160 ?rand + 7 9160 AD 1B D4 lda random + 8 9163 C9 01 cmp #1 ;floor + 9 9165 90 F9 bcc ?rand + 10 9167 C9 04 cmp #3+1 ;ceiling + 11 9169 B0 F5 bcs ?rand +Source: ai.asm + 253 916B C9 01 cmp #1 + 254 916D D0 1F bne NoUseDefensive + 255 ; first check check if any is in use + 256 916F BD FD 43 lda ActiveDefenceWeapon,x + 257 9172 D0 1A bne DefensiveInUse + 258 9174 A0 2A ldy #last_real_defensive+1 ;the last defensive weapon + 259 @ + 260 9176 88 dey + 261 9177 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + 262 9179 F0 13 beq NoUseDefensive + 263 917B B1 72 lda (temp),y ; has address of TanksWeaponsTable + 264 917D F0 F7 beq @- + 265 ; decrease in inventory + 266 917F 38 sec + 267 9180 E9 01 sbc #1 + 268 9182 91 72 sta (temp),y ; has address of TanksWeaponsTable + 269 ; activate defensive weapon + 270 9184 98 tya ; number of selectet defensive weapon + 271 9185 9D FD 43 sta ActiveDefenceWeapon,x + 272 9188 B9 1A 60 lda DefensiveEnergy,y + 273 918B 9D A8 43 sta ShieldEnergy,x + 274 918E NoUseDefensive + 275 918E DefensiveInUse + 276 918E 60 rts + 277 .endp + 278 ;---------------------------------------------- + 279 918F .proc Tosser + 280 918F 20 35 91 jsr UseBatteryOrFlag + 281 ; use best defensive :) + 282 9192 20 98 91 jsr TosserDefensives + 283 ; Toosser is like Poolshark but allways uses defensives + 284 9195 4C D4 90 jmp Poolshark.firstShoot + 285 .endp + 286 ;---------------------------------------------- + 287 9198 .proc TosserDefensives + 288 ; use best defensive :) + 289 ; allways + 290 ; first check check if any is in use + 291 9198 BD FD 43 lda ActiveDefenceWeapon,x + 292 919B D0 1A bne DefensiveInUse + 293 919D A0 2A ldy #last_real_defensive+1 ;the last defensive weapon + 294 @ + 295 919F 88 dey + 296 91A0 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) + 297 91A2 F0 13 beq NoUseDefensive + 298 91A4 B1 72 lda (temp),y ; has address of TanksWeaponsTable + 299 91A6 F0 F7 beq @- + 300 ; decrease in inventory + 301 91A8 38 sec + 302 91A9 E9 01 sbc #1 + 303 91AB 91 72 sta (temp),y ; has address of TanksWeaponsTable + 304 ; activate defensive weapon + 305 91AD 98 tya ; number of selectet defensive weapon + 306 91AE 9D FD 43 sta ActiveDefenceWeapon,x + 307 91B1 B9 1A 60 lda DefensiveEnergy,y + 308 91B4 9D A8 43 sta ShieldEnergy,x + 309 91B7 DefensiveInUse + 310 91B7 NoUseDefensive + 311 91B7 60 rts + 312 .endp + 313 ;---------------------------------------------- + 314 91B8 .proc Chooser + 315 ; like cyborg but more randomizing force + 316 91B8 20 35 91 jsr UseBatteryOrFlag + 317 ; use defensives like Tosser + 318 91BB 20 98 91 jsr TosserDefensives + 319 ; now select best target + 320 91BE A9 00 lda #$00 ; no prefer humans + 321 91C0 20 81 92 jsr FindBestTarget3 + 322 91C3 8C 31 44 sty TargetTankNr + 323 ; aiming + 324 91C6 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 325 + 326 ; choose the best weapon + 327 91C9 20 F2 95 jsr ChooseBestOffensive + 328 + 329 ; randomizing force +-100 + 330 91CC 38 A5 A4 E9 64 8D + sbw Force #100 RandBoundaryLow + 331 91DB 10 0A bpl NotNegativeEnergy + 332 91DD A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow + 333 91E7 NotNegativeEnergy + 334 91E7 18 A5 A4 69 64 8D + adw Force #100 RandBoundaryHigh + 335 91F6 20 45 59 jsr RandomizeForce + 336 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + 337 91F9 20 08 96 jsr GetDistance + 338 91FC C9 06 cmp #6 ; 24/4 + 339 91FE B0 05 bcs HighForce + 340 9200 A9 00 lda #ind_Baby_Missile___ + 341 9202 9D F7 43 sta ActiveWeapon,x + 342 9205 HighForce + 343 9205 60 rts + 344 .endp + 345 ;---------------------------------------------- + 346 9206 .proc Spoiler + 347 ; like cyborg but little randomizing force + 348 9206 20 35 91 jsr UseBatteryOrFlag + 349 ; use defensives like Tosser + 350 9209 20 98 91 jsr TosserDefensives + 351 ; now select best target + 352 920C A9 00 lda #$00 ; no prefer humans + 353 920E 20 81 92 jsr FindBestTarget3 + 354 9211 8C 31 44 sty TargetTankNr + 355 ; aiming + 356 9214 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 357 + 358 ; choose the best weapon + 359 9217 20 F2 95 jsr ChooseBestOffensive + 360 + 361 ; randomizing force +-50 + 362 921A 38 A5 A4 E9 32 8D + sbw Force #50 RandBoundaryLow + 363 9229 10 0A bpl NotNegativeEnergy + 364 922B A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow + 365 9235 NotNegativeEnergy + 366 9235 18 A5 A4 69 32 8D + adw Force #50 RandBoundaryHigh + 367 9244 20 45 59 jsr RandomizeForce + 368 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + 369 9247 20 08 96 jsr GetDistance + 370 924A C9 06 cmp #6 ; 24/4 + 371 924C B0 05 bcs HighForce + 372 924E A9 00 lda #ind_Baby_Missile___ + 373 9250 9D F7 43 sta ActiveWeapon,x + 374 9253 HighForce + 375 9253 60 rts + 376 .endp + 377 ;---------------------------------------------- + 378 9254 .proc Cyborg + 379 9254 20 35 91 jsr UseBatteryOrFlag + 380 ; use defensives like Tosser + 381 9257 20 98 91 jsr TosserDefensives + 382 ; now select best target + 383 925A A9 64 lda #100 ; prefer humans + 384 925C 20 81 92 jsr FindBestTarget3 + 385 925F 8C 31 44 sty TargetTankNr + 386 ; aiming + 387 9262 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) + 388 + 389 ; choose the best weapon + 390 9265 A0 04 ldy #ind_Nuke___________+1 + 391 9267 20 F4 95 jsr ChooseBestOffensive.NotFromAll + 392 + 393 926A A5 A4 lda Force + 394 926C 9D D9 43 sta ForceTableL,x + 395 926F A5 A5 lda Force+1 + 396 9271 9D DF 43 sta ForceTableH,x + 397 ; if target distance lower than 32 - set weapon to Baby Missile (for security :) + 398 9274 20 08 96 jsr GetDistance + 399 9277 C9 08 cmp #8 ;32/4 + 400 9279 B0 05 bcs HighForce + 401 927B A9 00 lda #ind_Baby_Missile___ + 402 927D 9D F7 43 sta ActiveWeapon,x + 403 9280 HighForce + 404 9280 60 rts + 405 .endp + 406 + 407 ;---------------------------------------------- + 408 9281 .proc FindBestTarget3 + 409 ; find target with lowest energy + 410 ; X - shooting tank number + 411 ; A - 100 - prefer humans , 0 - equality :) + 412 ; returns target tank number in Y and + 413 ; direcion of shoot in A (0 - left, >0 - right) + 414 ;---------------------------------------------- + 415 9281 85 A2 sta PreferHumansFlag + 416 ; jsr MakeLowResDistances + 417 9283 A9 CA lda #202 + 418 9285 85 74 sta temp2 ; max possible energy + 419 9287 A9 00 lda #0 + 420 9289 85 7E sta tempor2 ; direction of shoot + 421 ;ldx TankNr + 422 928B A4 AE ldy NumberOfPlayers + 423 928D 88 dey + 424 + 425 928E loop01 + 426 928E C4 6C cpy TankNr + 427 9290 F0 26 beq skipThisPlayer + 428 9292 B9 AF 43 lda eXistenZ,y + 429 9295 F0 21 beq skipThisPlayer + 430 + 431 9297 B9 39 41 lda skilltable,y + 432 929A F0 02 beq ItIsHuman + 433 929C A5 A2 lda PreferHumansFlag + 434 929E ItIsHuman + 435 929E 18 clc + 436 929F 79 A2 43 adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) + 437 92A2 C5 74 cmp temp2 ; lowest + 438 92A4 B0 12 bcs lowestIsLower + 439 92A6 85 74 sta temp2 + 440 92A8 84 75 sty temp2+1 ; number of the closest tank + 441 92AA A9 00 85 7E mva #0 tempor2 + 442 92AE BD 1F 44 lda LowResDistances,x + 443 92B1 D9 1F 44 cmp LowResDistances,y + 444 92B4 B0 02 bcs EnemyOnTheLeft + 445 ; enemy on right + 446 92B6 E6 7E inc tempor2 ; set direction to right + 447 + 448 92B8 EnemyOnTheLeft + 449 92B8 lowestIsLower + 450 92B8 skipThisPlayer + 451 92B8 88 dey + 452 92B9 10 D3 bpl loop01 + 453 ; now we have number of the farthest tank in temp2+1 + 454 ; and direction (0 - left, >0 - right) in tempor2 + 455 ; let's move them to registers + 456 ; in temp2 we have energy of target + 457 92BB A4 75 ldy temp2+1 + 458 92BD A5 7E lda tempor2 + 459 92BF 60 rts + 460 .endp + 461 ;---------------------------------------------- + 462 92C0 .proc FindBestTarget2 + 463 ; find nearest tank neighbour + 464 ; X - shooting tank number + 465 ; returns target tank number in Y and + 466 ; direcion of shoot in A (0 - left, >0 - right) + 467 ;---------------------------------------------- + 468 ; jsr MakeLowResDistances + 469 92C0 A9 FF 85 74 mva #$ff temp2 ; min possible distance + 470 92C4 A9 00 85 7E mva #0 tempor2 ; direction of shoot + 471 + 472 ;ldx TankNr + 473 92C8 A4 AE ldy NumberOfPlayers + 474 92CA 88 dey + 475 + 476 92CB loop01 + 477 92CB C4 6C cpy TankNr + 478 92CD F0 2F beq skipThisPlayer + 479 92CF B9 AF 43 lda eXistenZ,y + 480 92D2 F0 2A beq skipThisPlayer + 481 + 482 92D4 BD 1F 44 lda LowResDistances,x + 483 92D7 D9 1F 44 cmp LowResDistances,y + 484 92DA B0 13 bcs EnemyOnTheLeft + 485 ;enemy on the right + 486 92DC 38 sec + 487 92DD B9 1F 44 lda LowResDistances,y + 488 92E0 FD 1F 44 sbc LowResDistances,x + 489 92E3 C5 74 cmp temp2 ; lowest + 490 92E5 B0 17 bcs lowestIsLower + 491 92E7 85 74 sta temp2 + 492 92E9 84 75 sty temp2+1 ; number of the closest tank + 493 92EB E6 7E inc tempor2 ; set direction to right + 494 92ED D0 0F bne lowestIsLower + 495 + 496 92EF EnemyOnTheLeft + 497 92EF 38 sec + 498 92F0 BD 1F 44 lda LowResDistances,x + 499 92F3 F9 1F 44 sbc LowResDistances,y + 500 92F6 C5 74 cmp temp2 ; lowest + 501 92F8 B0 04 bcs lowestIsLower + 502 92FA 85 74 sta temp2 + 503 92FC 84 75 sty temp2+1 ; number of the closest tank + 504 + 505 92FE lowestIsLower + 506 92FE skipThisPlayer + 507 92FE 88 dey + 508 92FF 10 CA bpl loop01 + 509 ; now we have number of the closest tank in temp2+1 + 510 ; and direction (0 - left, >0 - right) in tempor2 + 511 ; let's move them to registers + 512 ; in temp2 we have x distance divided by 8 + 513 9301 A4 75 ldy temp2+1 + 514 9303 A5 7E lda tempor2 + 515 9305 60 rts + 516 .endp + 517 + 518 ;---------------------------------------------- + 519 9306 .proc TakeAim + 520 ; targeting the tank number TargetTankNr (and Y) + 521 ; A (and tempor2) - direction from shooting tank (0 - left, >0 - right) + 522 ; returns angle and power of shoot tank X (TankNr) + 523 ; in the appropriate variables (Angle and Force) + 524 ;---------------------------------------------- + 525 9306 BD F7 43 lda ActiveWeapon,x + 526 9309 48 pha ; store active weapon + 527 930A A9 FF 8D 32 44 mva #$ff SecondTryFlag + 528 ; set initial Angle and Force values + 529 930F AD 41 41 lda OptionsTable+2 ; selected gravity + 530 9312 0A asl + 531 9313 A8 tay + 532 ; force correction - lower tank Y position - higher possible force + 533 9314 38 sec + 534 9315 A9 C8 lda #screenheight + 535 9317 FD 19 44 sbc Ytankstable,x + 536 931A 85 74 sta temp2 + 537 931C 18 clc + 538 931D B9 EA A2 lda AIForceTable,y + 539 9320 8D E4 48 sta RandBoundaryLow + 540 9323 65 74 adc temp2 + 541 9325 8D E6 48 sta RandBoundaryHigh + 542 9328 B9 EB A2 lda AIForceTable+1,y + 543 932B 8D E5 48 sta RandBoundaryLow+1 + 544 932E 69 00 adc #0 + 545 9330 8D E7 48 sta RandBoundaryHigh+1 + 546 9333 20 45 59 jsr RandomizeForce + 547 9336 RepeatAim + 548 9336 20 96 59 jsr Table2Force + 549 ; wind correction 90+(wind/8) + 550 9339 A5 CE 85 74 A5 CF + mwa Wind temp2 + 551 9341 46 75 66 74 46 75 + :7 lsrw temp2 + 552 935D 18 clc + 553 935E A9 5A lda #90 + 554 9360 65 74 adc temp2 + 555 9362 85 D6 sta NewAngle + 556 ; set virtual weapon :) + 557 9364 A9 00 lda #ind_Baby_Missile___ + 558 9366 9D F7 43 sta ActiveWeapon,x + 559 ; now we have initial valuses + 560 9369 A9 C0 85 97 mva #%11000000 TestFlightFlag + 561 ; check targeting direction + 562 936D A5 7E lda tempor2 + 563 936F F0 03 4C 06 94 jne AimingLeft + 564 9374 AimingRight + 565 ; make test Shoot (Flight) + 566 9374 20 7E 94 jsr SetStartAndFlight + 567 9377 A5 BF lda HitFlag + 568 9379 F0 29 beq NoHitInFirstLoopR ; impossible :) + 569 937B 30 08 bmi GroundHitInFirstLoopR + 570 937D TankHitInFirstLoopR + 571 ; tank hit, but which tank? + 572 ; it's our target or not? + 573 937D A4 BF ldy HitFlag + 574 937F 88 dey + 575 9380 CC 31 44 cpy TargetTankNr + 576 9383 F0 28 beq EndOfFirstLoopR ; it's our target! + 577 ; if it's another tank then check position like ground hit + 578 9385 GroundHitInFirstLoopR + 579 ; checking only x position of hit + 580 9385 AC 31 44 ldy TargetTankNr + 581 9388 B9 13 44 lda xTanksTableH,y + 582 938B C5 C2 cmp XHit+1 + 583 938D D0 05 bne @+ + 584 938F B9 0D 44 lda xTanksTableL,y + 585 9392 C5 C1 cmp XHit + 586 @ + 587 9394 B0 15 bcs HitOnRightSideOfTargetR + 588 ; continue targeting + 589 9396 18 clc + 590 9397 A5 D6 lda NewAngle + 591 9399 69 05 adc #5 ; 5 deg to right + 592 939B C9 A0 cmp #(180-20) + 593 ; bcs EndOfFirstLoopR ; if angle 180-20 or higher + 594 939D B0 4F bcs AimSecondTry + 595 939F 85 D6 sta NewAngle + 596 93A1 4C 74 93 jmp AimingRight + 597 93A4 NoHitInFirstLoopR + 598 ; Angle 5 deg to left and end loop + 599 93A4 38 sec + 600 93A5 A5 D6 lda NewAngle + 601 93A7 E9 05 sbc #5 + 602 93A9 85 D6 sta NewAngle + 603 93AB HitOnRightSideOfTargetR + 604 93AB C6 D6 dec NewAngle + 605 93AD EndOfFirstLoopR + 606 93AD A9 05 85 76 mva #5 modify ; set counter (5 turns) + 607 93B1 SecondLoopR + 608 ; make test Shoot (Flight) + 609 93B1 20 7E 94 jsr SetStartAndFlight + 610 93B4 A5 BF lda HitFlag + 611 93B6 F0 2F beq NoHitInSecondLoopR ; impossible :) + 612 93B8 30 08 bmi GroundHitInSecondLoopR + 613 93BA TankHitInSecondLoopR + 614 ; tank hit, but which tank? + 615 ; it's our target or not? + 616 93BA A4 BF ldy HitFlag + 617 93BC 88 dey + 618 93BD CC 31 44 cpy TargetTankNr + 619 93C0 F0 27 beq EndOfSecondLoopR ; it's our target! + 620 ; if it's another tank then check position like ground hit + 621 93C2 GroundHitInSecondLoopR + 622 ; checking only x position of hit + 623 93C2 AC 31 44 ldy TargetTankNr + 624 93C5 B9 13 44 lda xTanksTableH,y + 625 93C8 C5 C2 cmp XHit+1 + 626 93CA D0 05 bne @+ + 627 93CC B9 0D 44 lda xTanksTableL,y + 628 93CF C5 C1 cmp XHit + 629 @ + 630 93D1 90 09 bcc HitOnLeftSideOfTargetR + 631 ; continue targeting + 632 93D3 C6 D6 dec NewAngle ; 1 deg to left + 633 93D5 C6 76 dec modify ; max 5 turns + 634 93D7 F0 10 beq EndOfSecondLoopR + 635 93D9 4C B1 93 jmp SecondLoopR + 636 93DC HitOnLeftSideOfTargetR + 637 ; decrease energy (a little) + 638 93DC 38 A5 A4 E9 05 85 + sbw Force #5 + 639 93E7 NoHitInSecondLoopR + 640 ; Angle 1 deg to right and end loop + 641 93E7 E6 D6 inc NewAngle + 642 93E9 EndOfSecondLoopR + 643 93E9 EndOfAim + 644 93E9 68 pla ; and restore active weapon + 645 93EA 9D F7 43 sta ActiveWeapon,x + 646 93ED 60 rts + 647 + 648 93EE AimSecondTry + 649 93EE 2C 32 44 bit SecondTryFlag + 650 93F1 10 F6 bpl EndOfAim ; closest RTS + 651 93F3 EE 32 44 inc SecondTryFlag + 652 93F6 A9 E8 lda #<1000 + 653 93F8 9D D9 43 sta ForceTableL,x + 654 93FB A9 03 lda #>1000 + 655 93FD 9D DF 43 sta ForceTableH,x + 656 9400 20 79 59 jsr RandomizeForce.LimitForce + 657 9403 4C 36 93 jmp RepeatAim + 658 + 659 9406 AimingLeft + 660 ; make test Shoot (Flight) + 661 9406 20 7E 94 jsr SetStartAndFlight + 662 9409 A5 BF lda HitFlag + 663 940B F0 29 beq NoHitInFirstLoopL ; impossible :) + 664 940D 30 08 bmi GroundHitInFirstLoopL + 665 940F TankHitInFirstLoopL + 666 ; tank hit, but which tank? + 667 ; it's our target or not? + 668 940F A4 BF ldy HitFlag + 669 9411 88 dey + 670 9412 CC 31 44 cpy TargetTankNr + 671 9415 F0 28 beq EndOfFirstLoopL ; it's our target! + 672 ; if it's another tank then check position like ground hit + 673 9417 GroundHitInFirstLoopL + 674 ; checking only x position of hit + 675 9417 AC 31 44 ldy TargetTankNr + 676 941A B9 13 44 lda xTanksTableH,y + 677 941D C5 C2 cmp XHit+1 + 678 941F D0 05 bne @+ + 679 9421 B9 0D 44 lda xTanksTableL,y + 680 9424 C5 C1 cmp XHit + 681 @ + 682 9426 90 15 bcc HitOnLeftSideOfTargetL + 683 ; continue targeting + 684 9428 38 sec + 685 9429 A5 D6 lda NewAngle + 686 942B E9 05 sbc #5 ; 5 deg to left + 687 942D C9 15 cmp #21 + 688 ; bcc EndOfFirstLoopL ; if angle 20 or lower + 689 942F 90 BD bcc AimSecondTry + 690 9431 85 D6 sta NewAngle + 691 9433 4C 06 94 jmp AimingLeft + 692 9436 NoHitInFirstLoopL + 693 ; Angle 5 deg to right and end loop + 694 9436 18 clc + 695 9437 A5 D6 lda NewAngle + 696 9439 69 05 adc #5 + 697 943B 85 D6 sta NewAngle + 698 943D HitOnLeftSideOfTargetL + 699 943D E6 D6 inc NewAngle + 700 943F EndOfFirstLoopL + 701 943F A9 05 85 76 mva #5 modify ; set counter (5 turns) + 702 9443 SecondLoopL + 703 ; make test Shoot (Flight) + 704 9443 20 7E 94 jsr SetStartAndFlight + 705 9446 A5 BF lda HitFlag + 706 9448 F0 2F beq NoHitInSecondLoopL ; impossible :) + 707 944A 30 08 bmi GroundHitInSecondLoopL + 708 944C TankHitInSecondLoopL + 709 ; tank hit, but which tank? + 710 ; it's our target or not? + 711 944C A4 BF ldy HitFlag + 712 944E 88 dey + 713 944F CC 31 44 cpy TargetTankNr + 714 9452 F0 27 beq EndOfSecondLoopL ; it's our target! + 715 ; if it's another tank then check position like ground hit + 716 9454 GroundHitInSecondLoopL + 717 ; checking only x position of hit + 718 9454 AC 31 44 ldy TargetTankNr + 719 9457 B9 13 44 lda xTanksTableH,y + 720 945A C5 C2 cmp XHit+1 + 721 945C D0 05 bne @+ + 722 945E B9 0D 44 lda xTanksTableL,y + 723 9461 C5 C1 cmp XHit + 724 @ + 725 9463 B0 09 bcs HitOnRightSideOfTargetL + 726 ; continue targeting + 727 9465 E6 D6 inc NewAngle ; 1 deg to right + 728 9467 C6 76 dec modify ; max 5 turns + 729 9469 F0 10 beq EndOfSecondLoopL + 730 946B 4C 43 94 jmp SecondLoopL + 731 946E HitOnRightSideOfTargetL + 732 ; decrease energy (a little) + 733 946E 38 A5 A4 E9 05 85 + sbw Force #5 + 734 9479 NoHitInSecondLoopL + 735 ; Angle 1 deg to left and end loop + 736 9479 C6 D6 dec NewAngle + 737 947B EndOfSecondLoopL + 738 947B 4C E9 93 jmp EndOfAim + 739 + 740 947E SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight + 741 ; xtraj+1 and ytraj+1 set + 742 947E 18 clc + 743 947F BD 0D 44 lda xTanksTableL,x + 744 9482 69 04 adc #4 + 745 9484 85 C9 sta xtraj+1 + 746 9486 BD 13 44 lda xTanksTableH,x + 747 9489 69 00 adc #0 + 748 948B 85 CA sta xtraj+2 + 749 948D 38 sec + 750 948E BD 19 44 lda yTanksTable,x + 751 9491 E9 04 sbc #4 + 752 9493 85 CC sta ytraj+1 + 753 9495 A9 00 85 CD mva #0 ytraj+2 + 754 9499 A5 D6 85 A7 mva NewAngle Angle + 755 949D 20 A0 83 jsr Flight + 756 94A0 A6 6C ldx TankNr + 757 94A2 60 rts + 758 .endp + 759 ;---------------------------------------------- + 760 94A3 .proc PurchaseAI ; + 761 ; A - skill of the TankNr + 762 ; makes purchase for AI opponents + 763 ; results of this routine are not visible on the screen + 764 ;---------------------------------------------- + 765 94A3 0A asl + 766 94A4 AA tax + 767 94A5 CA CA :2 dex ;credit KK + 768 94A7 BD B1 94 lda PurchaseAIRoutines+1,x + 769 94AA 48 pha + 770 94AB BD B0 94 lda PurchaseAIRoutines,x + 771 94AE 48 pha + 772 94AF 60 rts + 773 .endp + 774 + 775 ;---------------- + 776 94B0 PurchaseAIRoutines + 777 94B0 BF 94 .word MoronPurchase-1 + 778 94B2 39 95 .word ShooterPurchase-1 ;ShooterPurchase + 779 94B4 60 95 .word PoolsharkPurchase-1 ;PoolsharkPurchase + 780 94B6 89 95 .word TosserPurchase-1 ;TosserPurchase + 781 94B8 89 95 .word TosserPurchase-1 ;ChooserPurchase + 782 94BA BC 95 .word CyborgPurchase-1 ;SpoilerPurchase + 783 94BC BC 95 .word CyborgPurchase-1 ;CyborgPurchase + 784 94BE 89 95 .word TosserPurchase-1 ;UnknownPurchase + 785 + 786 ;---------------------------------------------- + 787 94C0 .proc MoronPurchase + 788 ;Moron buys nothing + 789 94C0 60 rts + 790 .endp + 791 ;------- + 792 94C1 .proc TryToPurchaseOnePiece2 ; for Cyborg + 793 ; A - weapon number, better it will be in range(1,32) + 794 ; TankNr in X + 795 ; DOES NOT CHANGE X + 796 94C1 A8 tay + 797 94C2 85 73 sta temp+1 + 798 94C4 4A 4A 4A :3 lsr ; A=A/8 + 799 94C7 85 72 sta temp + 800 94C9 98 tya + 801 94CA 29 07 and #%00000111 + 802 94CC A8 tay + 803 94CD B9 1C 5C lda bittable,y + 804 94D0 A4 72 ldy temp + 805 94D2 39 04 5D and PurchaseMeTable2,y + 806 94D5 F0 62 beq TryToPurchaseOnePiece.SorryNoPurchase + 807 94D7 4C F0 94 jmp TryToPurchaseOnePiece.PurchaseIt + 808 .endp + 809 ;------- + 810 94DA .proc TryToPurchaseOnePiece + 811 ; A - weapon number, better it will be in range(1,32) + 812 ; TankNr in X + 813 ; DOES NOT CHANGE X + 814 94DA A8 tay + 815 94DB 85 73 sta temp+1 + 816 94DD 4A 4A 4A :3 lsr ; A=A/8 + 817 94E0 85 72 sta temp + 818 94E2 98 tya + 819 94E3 29 07 and #%00000111 + 820 94E5 A8 tay + 821 94E6 B9 1C 5C lda bittable,y + 822 94E9 A4 72 ldy temp + 823 94EB 39 FE 5C and PurchaseMeTable,y + 824 94EE F0 49 beq SorryNoPurchase + 825 94F0 PurchaseIt + 826 94F0 A4 73 ldy temp+1 + 827 94F2 B9 9E 5C lda WeaponPriceL,y + 828 94F5 85 72 sta temp + 829 94F7 B9 6E 5C lda WeaponPriceH,y + 830 94FA 85 73 sta temp+1 + 831 ;price of the weapon in temp + 832 94FC BD 84 43 lda MoneyL,x + 833 94FF 85 74 sta temp2 + 834 9501 BD 7E 43 lda MoneyH,x + 835 9504 85 75 sta temp2+1 + 836 ;current monies in temp2 + 837 9506 A5 75 C5 73 D0 04 + cpw temp2 temp + 838 9510 90 27 bcc SorryNoPurchase + 839 ; deduct monies from the bank account + 840 9512 38 sec + 841 9513 A5 74 lda temp2 + 842 9515 E5 72 sbc temp + 843 9517 9D 84 43 sta MoneyL,x + 844 951A A5 75 lda temp2+1 + 845 951C E5 73 sbc temp+1 + 846 951E 9D 7E 43 sta MoneyH,x + 847 + 848 9521 BD F1 5A lda TanksWeaponsTableL,x + 849 9524 85 72 sta temp + 850 9526 BD F7 5A lda TanksWeaponsTableH,x + 851 9529 85 73 sta temp+1 + 852 + 853 952B B9 CE 5C lda WeaponUnits,y + 854 952E 18 clc + 855 952F 71 72 adc (temp),y + 856 9531 C9 63 cmp #99 ;max number of weapon units + 857 9533 90 02 bcc NotExceeded + 858 9535 A9 63 lda #99 + 859 9537 NotExceeded + 860 9537 91 72 sta (temp),y + 861 + 862 + 863 9539 SorryNoPurchase + 864 9539 60 rts + 865 .endp + 866 + 867 + 868 ;---------------------------------------------- + 869 953A .proc ShooterPurchase + 870 ; first try to buy defensives + 871 ; mva #2 tempXroller; number of offensive purchases to perform + 872 953A A6 6C ldx TankNr + 873 @ + 874 953C randomize ind_Battery________ ind_StrongParachute +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 953C ?rand + 7 953C AD 1B D4 lda random + 8 953F C9 21 cmp #IND_BATTERY________ ;floor + 9 9541 90 F9 bcc ?rand + 10 9543 C9 25 cmp #IND_STRONGPARACHUTE+1 ;ceiling + 11 9545 B0 F5 bcs ?rand +Source: ai.asm + 875 9547 20 DA 94 jsr TryToPurchaseOnePiece + 876 ; dec tempXroller + 877 ; bne @- + 878 + 879 ; and now offensives + 880 954A A9 04 85 78 mva #4 tempXroller; number of offensive purchases to perform + 881 ;ldx TankNr + 882 @ + 883 954E randomize ind_Missile________ ind_Heavy_Roller___ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 954E ?rand + 7 954E AD 1B D4 lda random + 8 9551 C9 01 cmp #IND_MISSILE________ ;floor + 9 9553 90 F9 bcc ?rand + 10 9555 C9 0F cmp #IND_HEAVY_ROLLER___+1 ;ceiling + 11 9557 B0 F5 bcs ?rand +Source: ai.asm + 884 9559 20 DA 94 jsr TryToPurchaseOnePiece + 885 955C C6 78 dec tempXroller + 886 955E D0 EE bne @- + 887 + 888 9560 60 rts + 889 .endp + 890 ;---------------------------------------------- + 891 9561 .proc PoolsharkPurchase + 892 ; first try to buy defensives + 893 ; mva #2 tempXroller; number of offensive purchases to perform + 894 9561 A6 6C ldx TankNr + 895 @ + 896 9563 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9563 ?rand + 7 9563 AD 1B D4 lda random + 8 9566 C9 21 cmp #IND_BATTERY________ ;floor + 9 9568 90 F9 bcc ?rand + 10 956A C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 956C B0 F5 bcs ?rand +Source: ai.asm + 897 956E 20 DA 94 jsr TryToPurchaseOnePiece + 898 9571 C6 78 dec tempXroller + 899 ; bpl @- + 900 + 901 ; and now offensives + 902 9573 A9 06 85 78 mva #6 tempXroller; number of purchases to perform + 903 ;ldx TankNr + 904 @ + 905 9577 randomize ind_Missile________ ind_Dirt_Charge____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9577 ?rand + 7 9577 AD 1B D4 lda random + 8 957A C9 01 cmp #IND_MISSILE________ ;floor + 9 957C 90 F9 bcc ?rand + 10 957E C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling + 11 9580 B0 F5 bcs ?rand +Source: ai.asm + 906 9582 20 DA 94 jsr TryToPurchaseOnePiece + 907 9585 C6 78 dec tempXroller + 908 9587 D0 EE bne @- + 909 + 910 9589 60 rts + 911 .endp + 912 ;---------------------------------------------- + 913 958A .proc TosserPurchase + 914 + 915 ; what is my money level + 916 958A A6 6C ldx TankNr + 917 958C BD 7E 43 lda MoneyH,x ; money / 256 + 918 958F 4A lsr ; /2 + 919 9590 85 78 sta tempXroller ; perform this many purchase attempts + 920 ; first try to buy defensives + 921 ; mva #1 tempXroller; number of defensive purchases to perform + 922 @ + 923 9592 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 9592 ?rand + 7 9592 AD 1B D4 lda random + 8 9595 C9 21 cmp #IND_BATTERY________ ;floor + 9 9597 90 F9 bcc ?rand + 10 9599 C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 959B B0 F5 bcs ?rand +Source: ai.asm + 924 959D 20 DA 94 jsr TryToPurchaseOnePiece + 925 95A0 C6 78 dec tempXroller + 926 95A2 10 EE bpl @- + 927 + 928 ; and now offensives + 929 95A4 BD 7E 43 lda MoneyH,x ; money / 256 + 930 95A7 0A asl ;*2 + 931 95A8 85 78 sta tempXroller ; perform this many purchase attempts + 932 @ + 933 95AA randomize ind_Missile________ ind_Dirt_Charge____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95AA ?rand + 7 95AA AD 1B D4 lda random + 8 95AD C9 01 cmp #IND_MISSILE________ ;floor + 9 95AF 90 F9 bcc ?rand + 10 95B1 C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling + 11 95B3 B0 F5 bcs ?rand +Source: ai.asm + 934 95B5 20 DA 94 jsr TryToPurchaseOnePiece + 935 95B8 C6 78 dec tempXroller + 936 95BA 10 EE bpl @- + 937 + 938 95BC 60 rts + 939 .endp + 940 ;---------------------------------------------- + 941 95BD .proc CyborgPurchase + 942 + 943 ; what is my money level + 944 95BD A6 6C ldx TankNr + 945 95BF BD 7E 43 lda MoneyH,x ; money / 256 + 946 95C2 4A lsr ; /2 + 947 95C3 85 78 sta tempXroller ; perform this many purchase attempts + 948 ; first try to buy defensives + 949 ; mva #1 tempXroller; number of defensive purchases to perform + 950 @ + 951 95C5 randomize ind_Battery________ ind_Bouncy_Castle__ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95C5 ?rand + 7 95C5 AD 1B D4 lda random + 8 95C8 C9 21 cmp #IND_BATTERY________ ;floor + 9 95CA 90 F9 bcc ?rand + 10 95CC C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling + 11 95CE B0 F5 bcs ?rand +Source: ai.asm + 952 95D0 20 C1 94 jsr TryToPurchaseOnePiece2 + 953 95D3 C6 78 dec tempXroller + 954 95D5 10 EE bpl @- + 955 + 956 ; and now offensives + 957 95D7 BD 7E 43 lda MoneyH,x ; money / 256 + 958 95DA 0A 0A 0A :3 asl ;*8 + 959 95DD 85 78 sta tempXroller ; perform this many purchase attempts + 960 @ + 961 95DF randomize first_offensive____ last_offensive_____ +Macro: RANDOMIZE [Source: MACRO.ASM] + 6 95DF ?rand + 7 95DF AD 1B D4 lda random + 8 95E2 C9 00 cmp #FIRST_OFFENSIVE____ ;floor + 9 95E4 90 F9 bcc ?rand + 10 95E6 C9 20 cmp #LAST_OFFENSIVE_____+1 ;ceiling + 11 95E8 B0 F5 bcs ?rand +Source: ai.asm + 962 95EA 20 C1 94 jsr TryToPurchaseOnePiece2 + 963 95ED C6 78 dec tempXroller + 964 95EF 10 EE bpl @- + 965 + 966 95F1 60 rts + 967 .endp + 968 ;---------------------------------------------- + 969 95F2 .proc ChooseBestOffensive + 970 ; choose the best weapon + 971 ; X - TankNr + 972 ;---------------------------------------------- + 973 95F2 A0 1E ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) + 974 95F4 NotFromAll + 975 ; Y - the last offensive weapon to use + 1 + 976 95F4 BD F1 5A lda TanksWeaponsTableL,x + 977 95F7 85 72 sta temp + 978 95F9 BD F7 5A lda TanksWeaponsTableH,x + 979 95FC 85 73 sta temp+1 + 980 95FE loop + 981 95FE 88 dey + 982 95FF B1 72 lda (temp),y + 983 9601 F0 FB beq loop + 984 9603 98 tya + 985 9604 9D F7 43 sta ActiveWeapon,x + 986 9607 60 rts + 987 .endp + 988 ;---------------------------------------------- + 989 9608 .proc GetDistance + 990 ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) + 991 ; result in A + 992 ;---------------------------------------------- + 993 9608 AC 31 44 ldy TargetTankNr + 994 960B BD 1F 44 lda LowResDistances,x + 995 960E D9 1F 44 cmp LowResDistances,y + 996 9611 B0 08 @ bcs YisLower + 997 9613 38 sec + 998 9614 B9 1F 44 lda LowResDistances,y + 999 9617 FD 1F 44 sbc LowResDistances,x + 1000 961A 60 rts + 1001 961B YisLower + 1002 961B BD 1F 44 lda LowResDistances,x + 1003 961E F9 1F 44 sbc LowResDistances,y + 1004 9621 60 rts + 1005 .endp + 354 ;---------------------------------------------- + 355 9622 icl 'artwork/talk.asm' +Source: talk.asm + 1 9622 .proc talk + 2 ; Maximum text length is 63 characters!!! + 3 9622 23 39 2B 21 00 22 + L0 dta d"CYKA BLAT" + 4 962B 24 29 25 01 L1 dta d"DIE!" + 5 962F 25 21 34 00 2D 39 + L2 dta d"EAT MY SHORTS!" + 6 963D 39 2F 35 07 32 25 + L3 dta d"YOU'RE TOAST!" + 7 964A 22 21 2E 3A 21 29 + L4 dta d"BANZAI!" + 8 9651 26 32 2F 2D 00 28 + L5 dta d"FROM HELL'S HEART I STAB AT THEE..." + 9 9674 29 00 24 29 24 2E + L6 dta d"I DIDN'T DO IT. NOBODY SAW ME DO IT." + 10 9698 34 21 2B 25 00 21 + L7 dta d"TAKE A HIKE!" + 11 96A4 39 2F 35 07 32 25 + L8 dta d"YOU'RE DEAD MEAT." + 12 96B5 2D 21 2B 25 00 2D + L9 dta d"MAKE MY DAY." + 13 96C1 23 28 21 32 27 25 + L10 dta d"CHARGE!" + 14 96C8 21 34 34 21 23 2B + L11 dta d"ATTACK!" + 15 96CF 39 2F 35 07 32 25 + L12 dta d"YOU'RE OUTTA HERE." + 16 96E1 37 21 34 34 33 21 + L13 dta d"WATTSA MATTA YOU?" + 17 96F2 26 32 25 25 3A 25 + L14 dta d"FREEZE, OR I'LL SHOOT!" + 18 9708 28 21 00 28 21 00 + L15 dta d"HA HA HA." + 19 9711 37 25 00 23 2F 2D + L16 dta d"WE COME IN PEACE - SHOOT TO KILL!" + 20 9732 29 2E 00 39 2F 35 + L17 dta d"IN YOUR FACE!" + 21 973F 24 29 25 00 23 2F + L18 dta d"DIE COMMIE PIG!" + 22 974E 29 00 2C 2F 36 25 + L19 dta d"I LOVE THE SMELL OF NAPALM IN THE MORNING." + 23 9778 36 29 23 34 2F 32 + L20 dta d"VICTORY!" + 24 9780 33 28 2F 37 00 33 + L21 dta d"SHOW SOME RESPECT." + 25 9792 2A 35 33 34 00 37 + L22 dta d"JUST WHO DO YOU THINK YOU ARE?" + 26 97B0 2C 2F 2F 2B 00 2F + L23 dta d"LOOK OUT BELOW!" + 27 97BF 2B 2E 2F 23 2B 0C + L24 dta d"KNOCK, KNOCK." + 28 97CC 2C 2F 2F 2B 00 2F + L25 dta d"LOOK OVER THERE." + 29 97DC 27 35 25 33 33 00 + L26 dta d"GUESS WHAT'S COMING FOR DINNER?" + 30 97FB 2D 25 32 32 39 00 + L27 dta d"MERRY CHRISTMAS." + 31 980B 2F 30 25 2E 00 37 + L28 dta d"OPEN WIDE!" + 32 9815 28 25 32 25 00 27 + L29 dta d"HERE GOES NOTHING..." + 33 9829 24 2F 2E 07 34 00 + L30 dta d"DON'T WORRY, IT ISN'T A LIVE ROUND." + 34 984C 22 2C 2F 2F 24 0C + L31 dta d"BLOOD, PAIN, VIOLENCE!" + 35 9862 34 21 2B 25 00 34 + L32 dta d"TAKE THIS, SISSY!" + 36 9873 29 00 33 28 21 2C + L33 dta d"I SHALL FLATTEN YOU!" + 37 9887 29 00 33 28 21 2C + L34 dta d"I SHALL SMASH YOUR UGLY TANK!" + 38 98A4 29 00 37 2F 2E 24 + L35 dta d"I WONDER WHAT THIS BUTTON DOES?" + 39 98C3 24 2F 2E 07 34 00 + L36 dta d"DON'T TAKE THIS PERSONALLY." + 40 98DE 37 2F 35 2C 24 00 + L37 dta d"WOULD THIS MAKE YOU MAD?" + 41 98F6 29 00 34 2F 2C 24 + L38 dta d"I TOLD YOU TO LEAVE MY SISTER ALONE!" + 42 991A 29 00 23 2F 35 2C + L39 dta d"I COULD SPARE YOU, BUT WHY?" + 43 9935 2D 39 00 22 2F 2D + L40 dta d"MY BOMB IS BIGGER THAN YOURS." + 44 9952 24 2F 2E 07 34 00 + L41 dta d"DON'T FORGET ABOUT ME!" + 45 9968 28 21 33 34 21 00 + L42 dta d"HASTA LA VISTA, BABY!" + 46 997D 34 28 29 33 00 29 + L43 dta d"THIS IS YOUR BRAIN ON SCORCH." + 47 999A 34 21 2B 25 00 34 + L44 dta d"TAKE THIS!" + 48 99A4 34 28 29 33 00 33 + L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." + 49 99D4 24 29 25 0C 00 21 + L46 dta d"DIE, ALIEN SWINE!" + 50 99E5 21 37 32 35 2B 01 + L47 dta d"AWRUK!!!" + 51 99ED 29 00 33 28 21 2C + L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD." + 52 9A13 24 29 25 0C 00 34 + L49 dta d"DIE, TANK-SCUM!" + 53 9A22 29 07 2D 00 27 2F + L50 dta d"I'M GONNA BREAK YOUR FACE!" + 54 9A3C 2D 21 2D 21 00 33 + L51 dta d"MAMA SAID KNOCK YOU OUT!" + 55 9A54 29 00 28 2F 30 25 + L52 dta d"I HOPE YOU ENJOY PAIN!" + 56 9A6A 28 2F 37 07 24 00 + L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son) + 57 ;-------------------------------- + 58 9A8E 30 21 32 34 29 2E + L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!" + 59 9AB2 35 27 28 01 L55 dta d"UGH!" + 60 9AB6 21 21 32 27 28 01 L56 dta d"AARGH!" + 61 9ABC 21 21 21 27 27 28 + L57 dta d"AAAGGHHH!" + 62 9AC5 29 07 2D 00 2D 25 + L58 dta d"I'M MELTING!" + 63 9AD1 2F 2F 26 0E 0E L59 dta d"OOF.." + 64 9AD6 2F 28 01 L60 dta d"OH!" + 65 9AD9 25 25 25 2B 01 L61 dta d"EEEK!" + 66 9ADE 21 21 23 23 28 01 L62 dta d"AACCH!" + 67 9AE4 29 00 28 21 34 25 + L63 dta d"I HATE IT WHEN THAT HAPPENS." + 68 9B00 2F 2E 25 00 24 29 + L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." + 69 9B27 2F 28 00 2E 2F 01 L65 dta d"OH NO!" + 70 9B2D 2E 2F 34 00 2D 25 + L66 dta d"NOT ME!" + 71 9B34 2F 35 23 28 0E L67 dta d"OUCH." + 72 9B39 2F 28 00 2E 2F 0C + L68 dta d"OH NO, NOT AGAIN." + 73 9B4A 21 2E 2F 34 28 25 + L69 dta d"ANOTHER ONE BITES THE DUST." + 74 9B65 27 2F 2F 24 22 39 + L70 dta d"GOODBYE." + 75 9B6D 28 25 2C 30 00 2D + L71 dta d"HELP ME!" + 76 9B75 26 21 32 25 37 25 + L72 dta d"FAREWELL, CRUEL WORLD." + 77 9B8B 32 25 2D 25 2D 22 + L73 dta d"REMEMBER THE ALAMO!" + 78 9B9E 2F 28 00 2D 21 2E + L74 dta d"OH MAN!" + 79 9BA5 24 2F 2F 35 27 28 + L75 dta d"DOOUGH!" + 80 9BAC 21 2E 2F 34 28 25 + L76 dta d"ANOTHER DAY, ANOTHER BOMB." + 81 9BC6 34 28 29 33 00 29 + L77 dta d"THIS IS THE END, MY ONLY FRIEND." + 82 9BE6 36 25 32 39 00 26 + L78 dta d"VERY FUNNY." + 83 9BF1 34 28 25 00 26 21 + L79 dta d"THE FAT LADY SANG." + 84 9C03 37 28 39 00 24 2F + L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?" + 85 9C24 29 07 2D 00 27 2F + L81 dta d"I'M GOING DOWN." + 86 9C33 29 07 36 25 00 27 + L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS." + 87 9C55 23 32 21 30 2F 2C + L83 dta d"CRAPOLA." + 88 9C5D 30 2F 37 01 L84 dta d"POW!" + 89 9C61 22 29 26 01 L85 dta d"BIF!" + 90 9C65 22 21 2D 01 L86 dta d"BAM!" + 91 9C69 3A 2F 2E 2B 01 L87 dta d"ZONK!" + 92 9C6E 29 00 33 28 2F 35 + L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." + 93 9C92 29 00 37 21 2C 2B + L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." + 94 9CBC 37 28 21 34 00 37 + L90 dta d"WHAT WAS THAT NOISE?" + 95 9CD0 2D 21 2D 21 00 33 + L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." + 96 9CF4 29 34 33 00 2A 35 + L92 dta d"ITS JUST ONE OF THOSE DAYS..." + 97 9D11 29 00 33 25 25 00 + L93 dta d"I SEE A BRIGHT LIGHT..." + 98 9D28 2D 2F 2D 2D 39 1F + L94 dta d"MOMMY? IS THAT YOU?" + 99 9D3B 29 00 2C 25 34 00 + L95 dta d"I LET YOU HIT ME!" + 100 9D4C 33 35 23 2B 25 32 + L96 dta d"SUCKER SHOT!" + 101 9D58 29 00 24 29 24 2E + L97 dta d"I DIDN'T WANT TO LIVE ANYWAY." + 102 9D75 0D 1C 33 2F 22 1E + L98 dta d"--" + 103 9D7C 37 21 33 00 34 28 + L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?" + 104 9DA0 2A 2F 29 2E 00 34 + L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." + 105 9DC7 29 34 00 37 21 33 + L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" + 106 9DF0 29 00 24 29 24 2E + L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" + 107 9E0E 29 00 34 28 2F 35 + L103 dta d"I THOUGHT YOU LIKED ME?" + 108 9E25 23 34 2F 00 38 39 + L104 dta d"CTO XYEB" + 109 9E2D 29 00 34 28 29 2E + L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY." + 110 9E4F 33 2F 2D 25 28 2F + L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." + 111 9E79 28 25 39 01 00 2B + L107 dta d"HEY! KILLIN' AIN'T COOL." + 112 9E91 27 25 25 0E 0E 0E + L108 dta d"GEE... THANKS." + 113 9E9F 29 07 36 25 00 26 + L109 dta d"I'VE FALLEN AND I CAN'T GET UP!" + 114 9EBE 19 11 11 1F L110 dta d"911?" + 115 9EC2 2F 28 00 2E 2F 01 + L111 dta d"OH NO! HERE I BLOW AGAIN!" + 116 9EDB 29 07 2C 2C 00 22 + L112 dta d"I'LL BE BACK..." + 117 9EEA 28 25 39 00 0D 00 + L113 dta d"HEY - I'VE GOT LAWYERS." + 118 9F01 34 29 2D 25 00 34 + L114 dta d"TIME TO CALL 1-900-SUE-TANK." + 119 9F1D 39 2F 35 00 22 29 + L115 dta d"YOU BIG DUMMY!" ;(sanford and son) + 120 9F2B LEND + 121 9F2B OffensiveTextTableL + 122 9F2B 22 2B 2F 3D 4A 51 + dta L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53 + 127 9FD6 9A 9A 9A 9A 9A 9A + dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115 + 128 A014 9F dta >LEND + 129 = 0036 NumberOfOffensiveTexts=54 + 130 = 003E NumberOfDeffensiveTexts=62 + 131 .endp + 132 A015 2D 39 00 28 2F 36 + hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!" + 133 A033 hoverFullEnd + 134 A033 32 35 2E 2E 29 2E + hoverEmpty dta d"RUNNING OUT OF EELS" + 135 A046 hoverEmptyEnd + 356 ;---------------------------------------------- + 357 A046 TankFont + 358 A046 00 00 00 00 00 00 + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only + 359 ;---------------------------------------------- + 360 A1C6 font4x4 + 361 A1C6 FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62 + 362 ;------------------------------------------------- + 363 A246 .proc CheckTankCheat + 364 A246 A0 07 ldy #$07 + 365 A248 A5 6C lda TankNr + 366 A24A 0A asl + 367 A24B 0A asl + 368 A24C 0A asl ; 8 chars per name + 369 A24D AA tax + 370 @ + 371 A24E B9 73 A2 lda CheatName,y + 372 A251 38 sec + 373 A252 FD 09 41 sbc tanksnames,x + 374 A255 C9 27 cmp #$27 + 375 A257 D0 19 bne NoCheat + 376 A259 E8 inx + 377 A25A 88 dey + 378 A25B 10 F1 bpl @- + 379 A25D YesCheat + 380 A25D A6 6C ldx TankNr + 381 A25F BD F1 5A lda TanksWeaponsTableL,x + 382 A262 85 72 sta temp + 383 A264 BD F7 5A lda TanksWeaponsTableH,x + 384 A267 85 73 sta temp+1 + 385 A269 A9 63 lda #99 + 386 A26B C8 @ iny + 387 A26C 91 72 sta (temp),y + 388 A26E C0 2F cpy #(number_of_weapons - 1) + 389 A270 D0 F9 bne @- + 390 A272 NoCheat + 391 A272 60 rts + 392 .endp + 393 A273 CheatName + 394 A273 27 27 27 37 37 3F + dta d" 008.T"+$27 + 395 ;---------------------------------------------- + 396 A27B .proc DLIinterruptBFG + 397 A27B 48 pha + 398 A27C A5 9A lda dliCounter + 399 A27E D0 18 bne EndofBFGDLI + 400 A280 AD BC A2 lda dliColorsFore + 401 A283 2C 1B D4 bit random + 402 A286 30 02 bmi @+ + 403 A288 A5 58 lda DliColorBack + 404 A28A 85 02 @ sta COLPF2 + 405 A28C AD BC A2 lda dliColorsFore + 406 A28F 2C 1B D4 bit random + 407 A292 30 02 bmi @+ + 408 A294 A5 58 lda DliColorBack + 409 A296 85 02 @ sta COLPF1 + 410 A298 EndofBFGDLI + 411 A298 E6 9A inc dliCounter + 412 A29A 68 pla + 413 A29B 40 rti + 414 .endp + 415 ; ------------------------ + 416 A29C .proc BFGblink + 417 ; SetDLI DLIinterruptBFG ; blinking on + 418 A29C A0 32 ldy #50 + 419 A29E 20 9D 5A jsr PauseYFrames + 420 ; SetDLI DLIinterruptGraph ; blinking off + 421 A2A1 60 rts + 422 .endp + 423 ;---------------------------------------------- + 424 A2A2 icl 'constants_top.asm' +Source: constants_top.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 + 6 A2A2 04 03 01 05 00 02 TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 + 7 A2A8 dliColorsBack + 8 A2A8 02 00 02 00 02 00 + :10 .by $02,$00 + 9 A2BC dliColorsFore + 10 A2BC 0A .by $0a ; one mountains color + 11 ; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array + 12 ; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05 + 13 A2BD 0E 0C 0C 0C 0C 0A + .by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new + 14 A2C7 08 08 08 06 06 06 + .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 + 15 A2D1 CashOptionL ;(one zero less than on the screen) + 16 A2D1 00 C8 20 B0 D0 .by 0,<200,<800,<1200,<2000 + 17 A2D6 CashOptionH + 18 A2D6 00 00 03 04 07 .by 0,>200,>800,>1200,>2000 + 19 A2DB 0A 14 19 1E 28 GravityTable .by 10,20,25,30,40 + 20 A2E0 05 14 28 46 63 MaxWindTable .by 5,20,40,70,99 + 21 A2E5 0A 14 1E 28 32 RoundsTable .by 10,20,30,40,50 + 22 A2EA 77 01 D6 01 76 02 + AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity + 23 A2F4 FF 96 4B 23 01 flyDelayTable .by 255,150,75,35,1 + 24 A2F9 FF 2D 19 0F 09 seppukuTable .by 255, 45,25,15,9 + 25 .endif + 425 ;---------------------------------------------- + 426 A2FE NMI + 427 A2FE EE 20 D0 INC $D020 ; change border colour, indication for a NMI + 428 A301 40 RTI ; exit interrupt + 429 ; (not acknowledged!) + 430 diff --git a/scorchC64.prg b/scorchC64.prg index ae26d50..1fba9cd 100644 Binary files a/scorchC64.prg and b/scorchC64.prg differ diff --git a/weapons.asm b/weapons.asm index 252e79e..e9e6b04 100644 --- a/weapons.asm +++ b/weapons.asm @@ -3203,24 +3203,6 @@ noBullets rts .endp -;-------------------------------------------------- -.proc ShellDelay - lda CONSOL - and #%00000101 ; Start + Option - bne @+ - mva #$40 escFlag -@ and #%00000001 - beq noShellDelay - ldx flyDelay -DelayLoop - lda VCOUNT -@ cmp VCOUNT - beq @- - dex - bne DelayLoop -noShellDelay - rts -.endp .ENDIF \ No newline at end of file