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