diff --git a/.gitignore b/.gitignore index 015326c..8cb7caf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ .project *.bak -scorch.lab -scorch.lst -textproc.lab -textproc.lst +*.lab +*.lst artwork/talk.as_ diff --git a/Atari/display_main_menu.asm b/Atari/display_main_menu.asm index 44ae147..94661e1 100644 --- a/Atari/display_main_menu.asm +++ b/Atari/display_main_menu.asm @@ -4,7 +4,7 @@ ;----------------------------------------------- ; start of "variables" (RAM) ;----------------------------------------------- -OptionsHere +OptionsHere ; 0123456789012345678901234567890123456789 dta d"Players : 2 3 4 5 6 " dta d"Cash : none 2K 8K 12K 20K " diff --git a/Atari/display_static.asm b/Atari/display_static.asm index 07f6b0d..f56a21f 100644 --- a/Atari/display_static.asm +++ b/Atari/display_static.asm @@ -8,54 +8,54 @@ ;----------------------------------------------- OptionsScreen dta d"Welcome to Scorch v. " - build ; 4 bytes from scorch.asm (fancy method) :) + build ; 4 bytes from scorch.asm (fancy method) :) dta d" (un)2000-2023" .IF TARGET = 800 - dta d" Please select option with " - dta $fe,$dc,$dd,$ff ; cursors in inverse - dta d" and " - dta d"Tab"* - dta d" " - dta d" Press " - dta d"Return"* - dta d" to proceed " + dta d" Please select option with " + dta $fe,$dc,$dd,$ff ; cursors in inverse + dta d" and " + dta d"Tab"* + dta d" " + dta d" Press " + dta d"Return"* + dta d" to proceed " .ELIF TARGET = 5200 - dta d" Please select option with joystick one " - dta d" and press FIRE to proceed " + dta d" Please select option with joystick one " + dta d" and press FIRE to proceed " .ENDIF ; 0123456789012345678901234567890123456789 ;----------------------------------------------- NameScreen .IF TARGET = 800 - dta d" Enter names of players " + dta d" Enter names of players " .ELIF TARGET = 5200 - dta d"Hold " - dta d "FIRE"* - dta d " to enter player names " + dta d"Hold " + dta d "FIRE"* + dta d " to enter player names " .ENDIF NameScreen3 dta d" Human/Atari (difficulty level) " NameScreen5 .IF TARGET = 800 - dta d"TAB"* - dta d" - Port nr " - dta $fe,$dc,$dd,$ff ; cursors in inverse - dta d" - Difficulty" - dta d" " - dta d"INV"* - dta d" - Shape " - dta d"Return"* - dta d" - Proceed " + dta d"TAB"* + dta d" - Port nr " + dta $fe,$dc,$dd,$ff ; cursors in inverse + dta d" - Difficulty" + dta d" " + dta d"INV"* + dta d" - Shape " + dta d"Return"* + dta d" - Proceed " .ELIF TARGET = 5200 - dta d" " - dta d"(5)"* - dta d" - Port/Shape " - dta d"Joy"* - dta d" - Diffic. " - dta d" " - dta d"FIRE"* - dta d" - Proceed " + dta d" " + dta d"(5)"* + dta d" - Port/Shape " + dta d"Joy"* + dta d" - Diffic. " + dta d" " + dta d"FIRE"* + dta d" - Proceed " .ENDIF ;----------------------------------------------- MoreUp @@ -73,51 +73,46 @@ MoreDown WeaponsDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Tab"* - dta d ": Defensive/Offensive weapon " + dta d"Tab"* + dta d ": Defensive/Offensive weapon " .ELIF TARGET = 5200 - dta d"Left"* - dta d ": Defensive/Offensive weapon" + dta d"Left"* + dta d ": Defensive/Offensive weapon" .ENDIF PurchaseDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Space"* - dta d": Purchase " - dta d"Return"* - dta d": Finish " + dta d"Space"* + dta d": Purchase " + dta d"Return"* + dta d": Finish " .ELIF TARGET = 5200 - dta d"Right"* - dta d": Purchase " - dta d"FIRE"* - dta d": Finish " + dta d"Right"* + dta d": Purchase " + dta d"FIRE"* + dta d": Finish " .ENDIF ActivateDescription ; 0123456789012345678901234567890123456789 .IF TARGET = 800 - dta d"Space"* - dta d": Activate " - dta d"Return"* - dta d": Finish " + dta d"Space"* + dta d": Activate " + dta d"Return"* + dta d": Finish " .ELIF TARGET = 5200 - dta d"Right"* - dta d": Activate " - dta d"FIRE"* - dta d": Finish " + dta d"Right"* + dta d": Activate " + dta d"FIRE"* + dta d": Finish " .ENDIF EmptyLine dta d" " ;--------------------------------------------------- OptionsTitle .IF TARGET = 800 - dta d" scorch "* + dta d" scorch "* .ELIF TARGET = 5200 - dta d" scorch supersystem "* -; dta d" scorch "* -; dta d"5" -; dta d"k"* -; dta d"2" -; dta d" "* + dta d" scorch supersystem "* .ENDIF DifficultyTitle dta d" difficulty "* @@ -135,7 +130,7 @@ GameOverTitle2 dl ; MAIN game display list .byte $70 - .byte $42 + .byte $42 .word statusBuffer .byte $02, $02 .byte $10+$80 ; 2 blank lines + DLI diff --git a/Atari/gr_basics.asm b/Atari/gr_basics.asm index 18219dd..46858ca 100644 --- a/Atari/gr_basics.asm +++ b/Atari/gr_basics.asm @@ -113,7 +113,7 @@ EndOfUnPlot ; game. If you are going to speed up the game, start with ; plot - it is used by every single effect starting from explosions ; through line drawing and small text output!!! -; +; ; Optimized by 0xF (Fox) THXXXX!!! ; ----------------------------------------- @@ -122,7 +122,7 @@ EndOfUnPlot bcs unPlot.EndOfUnPlot ;nearest RTS CheckX02 cpw xdraw #screenwidth - bcs EndOfPlot + bcs EndOfPlot MakePlot ; let's calculate coordinates from xdraw and ydraw @@ -190,7 +190,7 @@ ClearPlot rts .endp ;-------------------------------------------------- -.proc drawmountains +.proc drawmountains ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify @@ -204,7 +204,7 @@ drawmountainsloop sta ydraw sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw @@ -223,7 +223,7 @@ drawmountainsloop bne @- ; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot inc ydraw @@ -331,12 +331,12 @@ EmptyChar ldx #0 CharLoopi lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y iny lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y dey @@ -398,7 +398,7 @@ EndPutChar cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS ; checks ommited. @@ -414,7 +414,7 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table @@ -480,7 +480,7 @@ MaskOK01 ldx #0 CharLoopi4x4 lda (xbyte),y - ora mask1,x + ora mask1,x bit plot4x4color bpl PutInColor0_1 ; only mask - no char and char1,x @@ -488,7 +488,7 @@ PutInColor0_1 sta (xbyte),y iny lda (xbyte),y - ora mask2,x + ora mask2,x bit plot4x4color bpl PutInColor0_2 ; only mask - no char and char2,x @@ -555,7 +555,7 @@ EndPut4x4 inw temp cpw temp #display+screenheight*screenBytes+1 bne @- - rts + rts .endp ;-------------------------------------------------- @@ -577,14 +577,14 @@ EndPut4x4 .endp ;-------------------------------------------------- .proc SetMainScreen -; mva #0 dmactls +; mva #0 dmactls SetDLI DLIinterruptGraph ; jsr SetDLI for graphics (game) screen mwa #dl dlptrs ; issue #72 (glitches when switches) lda #%00111110 ; and #$fc ; ora #$02 ; 2=normal, 3 = wide screen width sta dmactls - mva WallsType COLBAKS ; set color of background + mva WallsType COLBAKS ; set color of background jsr WaitOneFrame rts .endp diff --git a/Atari/interrupts.asm b/Atari/interrupts.asm index e78b4fb..21bfd42 100644 --- a/Atari/interrupts.asm +++ b/Atari/interrupts.asm @@ -98,13 +98,13 @@ EndOfDLI_Text pla DLIinterruptNone rti - + .endp ;-------------------------------------------------- .proc VBLinterrupt mva #0 dliCounter mva #$02 DliColorBack - + lda PAL and #%00001110 beq itsPAL @@ -118,7 +118,7 @@ DLIinterruptNone itsPAL ; pressTimer is trigger tick counter. always 50 ticks / s bit:smi:inc pressTimer ; timer halted if >127. max time measured 2.5 s - + SkippedIfNTSC bit RMT_blocked @@ -138,7 +138,7 @@ SkippedIfNTSC lab2 jsr RASTERMUSICTRACKER+3 ;1 play ; ------- RMT ------- -SkipRMTVBL +SkipRMTVBL bit ScrollFlag bpl EndOfCreditsVBI CreditsVBI @@ -170,7 +170,15 @@ nextlinedisplay ; bne EndOfCreditsVBI mwa #Credits DLCreditsAddr EndOfCreditsVBI - .IF TARGET = 5200 + .IF TARGET = 800 + ; support for joysticks :) + ldx JoystickNumber + lda STICK0,x + sta STICK0 + lda STRIG0,x + sta STRIG0 + jmp XITVBV + .ELIF TARGET = 5200 lda SkStatSimulator bmi @+ inc SkStatSimulator @@ -181,7 +189,7 @@ EndOfCreditsVBI center = 114 ;Read analog stick and make it look like a digital stick threshold = 60 - + lda JoystickNumber asl tax @@ -190,28 +198,28 @@ EndOfCreditsVBI rol stick0 ;Feed carry into digital stick value cmp #center-threshold ;Compare with left threshold rol stick0 ;Feed carry into digital stick value - + lda paddl1,x ;Read POT1 value (vertical position) cmp #center+threshold ;Compare with down threshold rol stick0 ;Feed carry into digital stick value cmp #center-threshold ;Compare with down threshold rol stick0 ;Feed carry into digital stick value - + lda stick0 ;0 indicates a press so the right/down values need to be inverted eor #2+8 and #$0f sta stick0 - + ldx JoystickNumber ; check shift key (5200 second fire button) lda SKSTAT :3 lsr ; third bit - and trig0,x ; and first button + and trig0,x ; and first button ;lda trig0,x sta strig0 ;Move hardware to shadow - + mva chbas chbase - + lda skstat ;Reset consol key shadow is no key is pressed anymore and #4 beq @+ @@ -225,14 +233,6 @@ EndOfCreditsVBI tax pla rti - .ELSE - ; support for joysticks :) - ldx JoystickNumber - lda STICK0,x - sta STICK0 - lda STRIG0,x - sta STRIG0 - jmp XITVBV .ENDIF .endp .IF TARGET = 5200 @@ -245,7 +245,7 @@ exit pla tax pla rti -.endp +.endp .ENDIF ;-------------------------------------------------- diff --git a/Atari/textproc.asm b/Atari/textproc.asm index b64ff2e..dbf0abe 100644 --- a/Atari/textproc.asm +++ b/Atari/textproc.asm @@ -32,7 +32,7 @@ jsr ColorsOfSprites mva #$ca COLOR1 mva #$00 COLBAKS ; set color of background - + SetDLI DLIinterruptOptions ; jsr SetDLI for Options text screen ; -------- setup bottom (tanks) line @@ -70,7 +70,7 @@ OptionsMainLoop jsr getkey bit escFlag spl:rts - + cmp #@kbcode._down ; $f ;cursor down bne OptionsNoDown inc:lda OptionsY @@ -113,7 +113,7 @@ OptionsNoRight cmp #@kbcode._ret ; $c ;Return key bne OptionsNoReturn rts ; options selected - + OptionsNoReturn cmp #@kbcode._tab ; Tab key bne OptionsNoTab @@ -141,7 +141,7 @@ NoGradientLoop lda GradientAddrL,y sta GradientColors lda GradientAddrH,y - sta GradientColors+1 + sta GradientColors+1 rts .endp @@ -174,7 +174,7 @@ OptionsLoop cpy #optionWidth ; width of the option highlight bne OptionsLoop ldy #0 - ; next X position of the + ; next X position of the adw temp #optionWidth ; width of the option highlight inc:lda XPos cmp #5 ; number of options in a row @@ -191,12 +191,12 @@ OptionsLoop _inverter beq invertme ; clean inversion otherwise - lda (temp),y + lda (temp),y and #$7f ; clear the top bit sta (temp),y bpl @+ ; JMP invertme - lda (temp),y + lda (temp),y ora #$80 ; set the top bit sta (temp),y @ @@ -227,7 +227,7 @@ ManualPurchase spl:rts jsr DefensivesActivate ; activate weapons bit escFlag - spl:rts + spl:rts AfterManualPurchase inc:lda TankNr cmp NumberOfPlayers @@ -238,8 +238,8 @@ AfterManualPurchase .proc DefensivesActivate ;-------------------------------------------------- ; This proc call Inventory and set Defensives activation first - - mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 @@ -265,7 +265,7 @@ AfterManualPurchase jsr CopyFromPurchaseAndGameOver mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons - + ; we are clearing list of the weapons mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 @@ -283,7 +283,7 @@ GoToActivation bpl @+ lda #song_inventory @ jsr RmtSongSelect - + ldx tankNr lda TankStatusColoursTable,x sta COLOR2 @@ -331,15 +331,15 @@ AfterPurchase ldx #$00 ; index of the checked weapon stx HowManyOnTheListOff ; amounts of weapons (shells, bullets) in both lists stx HowManyOnTheListDef - + jsr CreateList - bit isInventory ; + bit isInventory ; bpl ChoosingItemForPurchase - + lda whichList bne PositionDefensive - + ; calculate positionOnTheList from the activeWeapon (offensives) ldx tankNr lda activeWeapon,x @@ -356,7 +356,7 @@ AfterPurchase beq ?weaponFound ; jmp PositionDefensive jsr calcPosDefensive - + ?weaponFound ; weapon index in Y @@ -368,7 +368,7 @@ PositionDefensive ;-------------------------------------------------- ChoosingItemForPurchase ;-------------------------------------------------- - + jsr PutLitteChar ; Places pointer at the right position jsr getkey bit escFlag @@ -497,11 +497,11 @@ CreateList lda WeaponUnits,x jeq NoWeapon - ldy tanknr - + ldy tanknr + bit isInventory jmi itIsInventory - + ; put "Purchase" on the screen mwa #PurchaseDescription PurActDescAddr ; and Title @@ -516,7 +516,7 @@ CreateList cmp WeaponPriceL,x @ jcc TooLittleCash - + ; we have enough cash and the weapon can be ; added to the list @@ -585,7 +585,7 @@ notInventory jsr HowManyBullets sta decimal - adw xbyte #1 displayposition + adw xbyte #1 displayposition jsr displaybyte ldx temp ;weapon index @@ -665,7 +665,7 @@ NoWeapon mwa #ListOfDefensiveWeapons xbyte NoDefense cpx #last_defensive +1 - + jne CreateList ; offset may be only too big @@ -686,14 +686,14 @@ WeHaveOffset lda HowManyOnTheListOff sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; + lda #$00 ; sta xbyte+1 ; higher byte of the Result ldx #$05 ; 2^5 @ asl xbyte rol xbyte+1 dex bne @- - + ; add to the address of the list adw xbyte #ListOfWeapons ldy #0 @@ -711,7 +711,7 @@ ListCleared1 ; of the first erased char. lda HowManyOnTheListDef sta xbyte ; multiplier (temporarily here, it will be erased anyway) - lda #$00 ; + lda #$00 ; sta xbyte+1 ; higher byte of the Result ldx #$05 ; 2^5 @ asl xbyte @@ -766,36 +766,36 @@ PurchaseAll lda moneyH,x sbc WeaponPriceH,y sta moneyH,x - -positiveMoney + +positiveMoney ; now we have to get address of ; the table of the weapon of the tank ; and add appropriate number of shells sty LastWeapon ; store last purchased weapon ; because we must put screen pointer next to it - + ; but if we purchasing "Buy me!" then we must draw the winning weapon. - - cpy #ind_Buy_me + + cpy #ind_Buy_me bne NoSuprise - + Suprise ; get a random weapon lda random cmp #51 ; defensive weapons are less likely because they are more expensive - probability 255:51 (5:1) bcc GetRandomDefensive GetRandomOffensive - randomize ind_Missile last_offensive + randomize ind_Missile last_offensive ;cmp #ind_Buy_me ; buy me do not buy buy me :) ;beq GetRandomOffensive tay bne NoSuprise ; Y always <> 0 GetRandomDefensive - randomize ind_Battery last_defensive + randomize ind_Battery last_defensive tay ; lda WeaponUnits,y ; check if weapon exist ; beq GetRandomDefensive - + NoSuprise lda TanksWeaponsTableL,x sta weaponPointer @@ -824,13 +824,13 @@ inventorySelect ldx tankNr sta activeWeapon,x jmp WaitForKeyRelease ; rts - + invSelectDef ldy PositionOnTheList lda IndexesOfWeaponsL2,y tay ldx tankNr - cmp #ind_Battery + cmp #ind_Battery bne NotBattery ; if activate battery, we do it differently mva #sfx_battery sfx_effect @@ -840,38 +840,38 @@ invSelectDef ply jmp DecreaseDefensive ; bypass activation NotBattery - cmp #ind_Auto_Defense + cmp #ind_Auto_Defense bne NoAutoDefense ; Auto Defense - do it like battery mva #sfx_auto_defense sfx_effect mva #$A1 AutoDefenseFlag,x ; this is "A" in inverse - for status line :) jmp DecreaseDefensive ; bypass activation NoAutoDefense - cmp #ind_Lazy_Boy + cmp #ind_Lazy_Boy bne NoLazyBoy ; Lazy Boy - do it like battery mva #%01000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyBoy - cmp #ind_Lazy_Darwin + cmp #ind_Lazy_Darwin bne NoLazyDarwin ; Lazy Darwin - do it like battery mva #%11000000 LazyFlag jmp DecreaseDefensive ; bypass activation NoLazyDarwin - cmp #ind_Spy_Hard + cmp #ind_Spy_Hard bne NotSpy mva #$ff SpyHardFlag - jmp DecreaseDefensive ; bypass activation + jmp DecreaseDefensive ; bypass activation NotSpy - cmp #ind_Long_Barrel + cmp #ind_Long_Barrel bne NotBarrel ; if activate long barrel, we do it differently too mva #sfx_long_barrel sfx_effect mva #LongBarrel BarrelLength,x - bne DecreaseDefensive ; bypass activation + bne DecreaseDefensive ; bypass activation NotBarrel - cmp #ind_White_Flag + cmp #ind_White_Flag bne NotWhiteFlag cmp ActiveDefenceWeapon,x bne NoDeactivateWhiteFlag @@ -897,7 +897,7 @@ DecreaseDefensive sec sbc #1 sta (weaponPointer),y - + DefActivationEnd jmp WaitForKeyRelease ; rts .endp @@ -1084,7 +1084,7 @@ NoArrowDown lda TankNr :3 asl tax - + ldy #0 @ lda TanksNames,x sta NameAdr,y @@ -1114,12 +1114,12 @@ CheckKeys lda TankShape,x tay lda digits+1,y - sta NameScreen2+15 ; display tank shape number + sta NameScreen2+15 ; display tank shape number jsr CursorDisplay jsr getkey bit escFlag spl:rts - + .IF TARGET = 800 ; only the A800 has a keyboard ; is the char to be recorded? ldx #keycodesEnd-keycodes ;table was 38 chars long @@ -1256,7 +1256,7 @@ NotRobot ; check if all chars are empty (" ") ldy #7 lda #0 -@ ora NameAdr,y +@ ora NameAdr,y and #$7F ; remove inverse (Cursor) dey bpl @- @@ -1333,7 +1333,7 @@ CharacterFound beq checkjoy bit pressTimer ; trick (no A change) bpl @- -checkjoy +checkjoy lda STICK0 and #$0f cmp #$0f @@ -1543,7 +1543,7 @@ displayloop1 sta dmactls lda #%00100100 ; playfield before P/M sta GPRIOR - jsr SetPMWidth + jsr SetPMWidth jsr ColorsOfSprites mva #0 COLOR1 sta COLBAKS ; set color of background @@ -1628,7 +1628,7 @@ ThisIsAI NotAItank tya ldy #38 - sta (temp),y + sta (temp),y ; put earned money on the screen lda EarnedMoneyL,x sta decimal @@ -1669,10 +1669,10 @@ MakeAllTanksVisible jsr RandomizeTankPos dex bpl @- -MainTanksFloatingLoop +MainTanksFloatingLoop ; main tanks floating loop ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 -AllTanksFloatingDown +AllTanksFloatingDown stx TankNr lda Ytankstable,x cmp #(72-7) ; tank under screen - no erase @@ -1842,7 +1842,7 @@ ThisIsAI ;------------------------------------------------- ldx TankNr - + ;========================= ;displaying symbol of the weapon ;========================= @@ -1872,7 +1872,7 @@ ThisIsAI aslw temp dey bpl @- - + adw temp #NamesOfWeapons ldy #15 @ @@ -1900,7 +1900,7 @@ ThisIsAI sta statusBuffer+80+22 sta statusBuffer+80+39 mwa #emptyLine temp - jmp ClearingOnly + jmp ClearingOnly ActiveDefence sta temp ;get back number of the weapon mva #0 temp+1 @@ -1910,7 +1910,7 @@ ActiveDefence aslw temp dey bpl @- - + adw temp #NamesOfWeapons ClearingOnly ldy #15 @@ -1950,7 +1950,7 @@ ClearingOnly jsr displaybyte lda #$09 ; ) sta statusBuffer+40+13 -NoDefenceWeapon +NoDefenceWeapon NoShieldEnergy ;========================= @@ -1981,7 +1981,7 @@ DisplayWindValue sta decimal mwa #statusBuffer+80+18 displayposition jsr displaybyte - + ;========================= ;display round number ;========================= @@ -2027,7 +2027,7 @@ AngleToLeft sty statusBuffer+40+25 ; (space) character lda #$7e ;(del) char sta statusBuffer+40+22 - bne AngleDisplay + bne AngleDisplay VerticallyUp ; now we have value 90 sta decimal @@ -2037,7 +2037,7 @@ VerticallyUp AngleDisplay mwa #statusBuffer+40+23 displayposition jsr displaybyte - ldx TankNr + ldx TankNr rts .endp ;------------------------------------------------- @@ -2047,7 +2047,7 @@ AngleDisplay dey lda gameOverSpritesTop,y sta temp - + ; clean the whole sprite lda #0 tax @@ -2055,11 +2055,11 @@ AngleDisplay sta PMGraph+$500,x dex bne @- - + lda #$01 sta sizep0 ; P0-P1 widths sta sizep0+1 - + ; set background lda #$ff ldx #100+7 ; top of the sprites @@ -2071,10 +2071,10 @@ AngleDisplay GOSbeg = 112 mva #GOSbeg hposp0 mva #GOSbeg+12 hposp0+1 - + mva #15 PCOLR0 sta PCOLR1 - + rts .endp diff --git a/C64/gr_basics.asm b/C64/gr_basics.asm index d9feec8..78fb207 100644 --- a/C64/gr_basics.asm +++ b/C64/gr_basics.asm @@ -103,7 +103,7 @@ EndOfUnPlot ; game. If you are going to speed up the game, start with ; plot - it is used by every single effect starting from explosions ; through line drawing and small text output!!! -; +; ; Optimized by 0xF (Fox) THXXXX!!! ; ----------------------------------------- @@ -112,7 +112,7 @@ EndOfUnPlot bcs unPlot.EndOfUnPlot ;nearest RTS CheckX02 cpw xdraw #screenwidth - bcs EndOfPlot + bcs EndOfPlot MakePlot ; let's calculate coordinates from xdraw and ydraw @@ -177,7 +177,7 @@ ClearPlot rts .endp ;-------------------------------------------------- -.proc drawmountains +.proc drawmountains ;-------------------------------------------------- mwa #0 xdraw mwa #mountaintable modify @@ -191,7 +191,7 @@ drawmountainsloop sta ydraw sty ydraw+1 .IF FASTER_GRAF_PROCS = 1 -; there was Drawline proc +; there was Drawline proc lda #screenheight sec sbc ydraw @@ -217,12 +217,12 @@ drawmountainsloop lda linetableH,y adc xdraw+1 sta xbyte+1 - ldy #0 + ldy #0 dec tempbyte01 bne @- ; end of Drawline proc .ELSE -; there was Drawline proc +; there was Drawline proc drawline jsr plot.MakePlot inc ydraw @@ -326,12 +326,12 @@ CharLoopi ;-- ldy #0 lda (xbyte),y - ora mask1,x + ora mask1,x and char1,x sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x + ora mask2,x and char2,x sta (xbyte),y inc ydraw @@ -392,7 +392,7 @@ EndPutChar cpw dy #(screenheight-1) jcs TypeChar.EndPutChar ;nearest RTS cpw dy #(4) - jcc TypeChar.EndPutChar ;nearest RTS + jcc TypeChar.EndPutChar ;nearest RTS cpw dx #(screenwidth-4) jcs TypeChar.EndPutChar ;nearest RTS ; checks ommited. @@ -408,7 +408,7 @@ Upper4bits sta fontind lda #$00 sta fontind+1 - + adw fontind #font4x4 ; and 4 bytes to the table @@ -471,7 +471,7 @@ CharLoopi4x4 ;-- ldy #0 lda (xbyte),y - ora mask1,x + ora mask1,x bit plot4x4color bpl PutInColor0_1 ; only mask - no char and char1,x @@ -479,7 +479,7 @@ PutInColor0_1 sta (xbyte),y ldy #8 lda (xbyte),y - ora mask2,x + ora mask2,x bit plot4x4color bpl PutInColor0_2 ; only mask - no char and char2,x @@ -545,7 +545,7 @@ EndPut4x4 inw temp cpw temp #displayC64+screenheight*screenBytes+1 bne @- - rts + rts .endp ;-------------------------------------------------- @@ -581,7 +581,7 @@ next8lines :4 rol sta $d020 sta $d021 - + lda $dd00 ; Set video bank to start at 0 and #252 ora #3 diff --git a/C64/textproc.asm b/C64/textproc.asm index 34615f4..3c770bc 100644 --- a/C64/textproc.asm +++ b/C64/textproc.asm @@ -2,7 +2,7 @@ .IF *>0 - + WeaponsListDL = 0 NamesOfLevels = 0 ;---------------------------------------- @@ -27,7 +27,7 @@ NamesOfLevels = 0 bpl @- rts - + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 .endp @@ -51,7 +51,7 @@ NoGradientLoop lda GradientAddrL,y sta GradientColors lda GradientAddrH,y - sta GradientColors+1 + sta GradientColors+1 rts .endp @@ -76,7 +76,7 @@ ManualPurchase spl:rts jsr DefensivesActivate ; activate weapons bit escFlag - spl:rts + spl:rts AfterManualPurchase inc:lda TankNr cmp NumberOfPlayers @@ -87,8 +87,8 @@ AfterManualPurchase .proc DefensivesActivate ;-------------------------------------------------- ; This proc call Inventory and set Defensives activation first - - mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons + + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons mva #$ff IsInventory mva #%10000000 WhichList ; offensive weapon - 0, defensive - %10000000 @@ -104,13 +104,13 @@ AfterManualPurchase ; Rest of the data is taken from appropriate tables ; and during the purchase these tables are modified. - + ; we are clearing list of the weapons mva #$00 WhichList ; offensive weapon - 0, deffensive - %10000000 GoToActivation rts - + .endp ; ----------------------------------------------------- @@ -173,7 +173,7 @@ NotRobot ; check if all chars are empty (" ") ldy #7 lda #0 -@ ora #0 ; NameAdr,y +@ ora #0 ; NameAdr,y and #$7F ; remove inverse (Cursor) dey bpl @- @@ -306,7 +306,7 @@ displayloop1 .endp ;------------------------------------------------- .proc RoundOverSprites - ; fill sprites with bytes + ; fill sprites with bytes rts .endp diff --git a/ai.asm b/ai.asm index f6f18f1..564a9f2 100644 --- a/ai.asm +++ b/ai.asm @@ -25,9 +25,9 @@ ; it's no necessary - PrepareAIShoot is next proc :) ; jsr PrepareAIShoot ; rts -.endp +.endp ;---------------------------------------------- -.proc PrepareAIShoot +.proc PrepareAIShoot ; create low precision table of positions ; by dividing positions by 4 ldy #MaxPlayers-1 @@ -76,11 +76,11 @@ AIRoutines rts .endp ;---------------------------------------------- -.proc Moron +.proc Moron jsr RandomizeAngle sta NewAngle mwa #80 RandBoundaryLow - mwa #800 RandBoundaryHigh + mwa #800 RandBoundaryHigh jsr RandomizeForce ; choose the best weapon ldy #ind_Buy_me +1 ; if the cheat is active it will fire the BFG :) @@ -88,13 +88,13 @@ AIRoutines ;rts .endp ;---------------------------------------------- -.proc Shooter +.proc Shooter lda PreviousAngle,x ora PreviousEnergyL,x ora PreviousEnergyH,x beq firstShoot - + lda PreviousAngle,x cmp #90 bcs shootingLeftAtThisMomentOfTime @@ -104,9 +104,9 @@ AIRoutines cmp #10 bcs @+ ;not smaller than 10 bcc firstShoot ; GET THE aim againg - + shootingLeftAtThisMomentOfTime - + clc adc #5 cmp #170 ; maximum shooter angle @@ -115,7 +115,7 @@ shootingLeftAtThisMomentOfTime sta NewAngle sec - lda PreviousEnergyL,x + lda PreviousEnergyL,x sbc #5 sta ForceTableL,x lda PreviousEnergyH,x @@ -140,10 +140,10 @@ firstShoot tankIsOnTheRight randomize 55 85 sta NewAngle - + forceNow mwa #100 RandBoundaryLow - mwa #800 RandBoundaryHigh + mwa #800 RandBoundaryHigh ;ldx TankNr ;this is possibly not necessary jsr RandomizeForce @@ -153,12 +153,12 @@ endo lda NewAngle sta PreviousAngle,x lda ForceTableL,x - sta PreviousEnergyL,x + sta PreviousEnergyL,x lda ForceTableH,x sta PreviousEnergyH,x - + ; choose the best weapon - + jmp ChooseBestOffensive ;rts .endp @@ -172,40 +172,40 @@ firstShoot jsr FindBestTarget2 beq EnemyOnLeft ; calculate index to shotangle table - ; in temp2 we have x distance divided by 8 + ; in temp2 we have x distance divided by 8 lda temp2 :3 lsr @ and #%00000111 clc adc #8 sta AngleTablePointer - bne AngleIsSet + bne AngleIsSet EnemyOnLeft lda temp2 :3 lsr @ and #%00000111 eor #%00000111 - sta AngleTablePointer + sta AngleTablePointer AngleIsSet - + randomize 0 8 ldy AngleTablePointer clc adc AngleTable,y sta NewAngle - + forceNow mwa #300 RandBoundaryLow - mwa #700 RandBoundaryHigh + mwa #700 RandBoundaryHigh ldx TankNr jsr RandomizeForce -endo +endo ; choose the best weapon - + jsr ChooseBestOffensive rts - + ;---------------------------------------------- AngleTable ; 16 bytes ;ba w $348b L$3350 .by 106,114,122,130,138,146,154,162 @@ -220,7 +220,7 @@ AngleTable ; 16 bytes ;ba w $348b L$3350 bcs EnoughEnergy ; lower than 5 units - white flag jsr ClearTankNr ; we must hide tank to erase shields (issue #138) - lda #ind_White_Flag + lda #ind_White_Flag sta ActiveDefenceWeapon,x jsr PutTankNr ; and draw tank witch Flag EnoughEnergy @@ -233,7 +233,7 @@ EnoughEnergy cmp #30 bcs EnoughEnergy ; lower than 30 units - check battery - ldy #ind_Battery + ldy #ind_Battery lda (temp),y ; has address of TanksWeaponsTable beq NoBatteries ; we have batteries - use one @@ -263,7 +263,7 @@ NoBatteries cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) beq NoUseDefensive lda (temp),y ; has address of TanksWeaponsTable - beq @- + beq @- ; decrease in inventory sec sbc #1 @@ -292,13 +292,13 @@ DefensiveInUse ; first check check if any is in use lda ActiveDefenceWeapon,x bne DefensiveInUse - ldy #last_real_defensive+1 ;the last defensive weapon + ldy #last_real_defensive+1 ;the last defensive weapon @ dey cpy #ind_Hovercraft ;first defensive weapon (White Flag, Battery and Hovercraft - never use) beq NoUseDefensive lda (temp),y ; has address of TanksWeaponsTable - beq @- + beq @- ; decrease in inventory sec sbc #1 @@ -324,7 +324,7 @@ NoUseDefensive sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon jsr ChooseBestOffensive @@ -335,11 +335,11 @@ NoUseDefensive NotNegativeEnergy adw Force #100 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #6 ; 24/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -356,7 +356,7 @@ HighForce sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon jsr ChooseBestOffensive @@ -367,11 +367,11 @@ HighForce NotNegativeEnergy adw Force #50 RandBoundaryHigh jsr RandomizeForce - ; if target distance lower than 24 - set weapon to Baby Missile (for security :) + ; if target distance lower than 24 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #6 ; 24/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -387,7 +387,7 @@ HighForce sty TargetTankNr ; aiming jsr TakeAim ; direction still in A (0 - left, >0 - right) - + ; choose the best weapon ldy #ind_Nuke +1 jsr ChooseBestOffensive.NotFromAll @@ -396,11 +396,11 @@ HighForce sta ForceTableL,x lda Force+1 sta ForceTableH,x - ; if target distance lower than 32 - set weapon to Baby Missile (for security :) + ; if target distance lower than 32 - set weapon to Baby Missile (for security :) jsr GetDistance cmp #8 ;32/4 bcs HighForce - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x HighForce rts @@ -423,7 +423,7 @@ HighForce ;ldx TankNr ldy NumberOfPlayers dey - + loop01 cpy TankNr beq skipThisPlayer @@ -446,8 +446,8 @@ ItIsHuman bcs EnemyOnTheLeft ; enemy on right inc tempor2 ; set direction to right - -EnemyOnTheLeft + +EnemyOnTheLeft lowestIsLower skipThisPlayer dey @@ -455,7 +455,7 @@ skipThisPlayer ; now we have number of the farthest tank in temp2+1 ; and direction (0 - left, >0 - right) in tempor2 ; let's move them to registers - ; in temp2 we have energy of target + ; in temp2 we have energy of target ldy temp2+1 lda tempor2 rts @@ -474,13 +474,13 @@ skipThisPlayer ;ldx TankNr ldy NumberOfPlayers dey - + loop01 cpy TankNr beq skipThisPlayer lda eXistenZ,y beq skipThisPlayer - + lda LowResDistances,x cmp LowResDistances,y bcs EnemyOnTheLeft @@ -503,7 +503,7 @@ EnemyOnTheLeft bcs lowestIsLower sta temp2 sty temp2+1 ; number of the closest tank - + lowestIsLower skipThisPlayer dey @@ -511,7 +511,7 @@ skipThisPlayer ; now we have number of the closest tank in temp2+1 ; and direction (0 - left, >0 - right) in tempor2 ; let's move them to registers - ; in temp2 we have x distance divided by 8 + ; in temp2 we have x distance divided by 8 ldy temp2+1 lda tempor2 rts @@ -529,7 +529,7 @@ skipThisPlayer mva #$ff SecondTryFlag ; set initial Angle and Force values lda OptionsTable+2 ; selected gravity - asl + asl tay ; force correction - lower tank Y position - higher possible force sec @@ -556,7 +556,7 @@ RepeatAim adc temp2 sta NewAngle ; set virtual weapon :) - lda #ind_Baby_Missile + lda #ind_Baby_Missile sta ActiveWeapon,x ; now we have initial valuses mva #%11000000 TestFlightFlag @@ -597,11 +597,11 @@ GroundHitInFirstLoopR sta NewAngle jmp AimingRight NoHitInFirstLoopR - ; Angle 5 deg to left and end loop + ; Angle 5 deg to left and end loop sec lda NewAngle sbc #5 - sta NewAngle + sta NewAngle HitOnRightSideOfTargetR dec NewAngle EndOfFirstLoopR @@ -639,7 +639,7 @@ HitOnLeftSideOfTargetR ; decrease energy (a little) sbw Force #5 NoHitInSecondLoopR - ; Angle 1 deg to right and end loop + ; Angle 1 deg to right and end loop inc NewAngle EndOfSecondLoopR EndOfAim @@ -657,7 +657,7 @@ AimSecondTry sta ForceTableH,x jsr RandomizeForce.LimitForce jmp RepeatAim - + AimingLeft ; make test Shoot (Flight) jsr SetStartAndFlight @@ -692,11 +692,11 @@ GroundHitInFirstLoopL sta NewAngle jmp AimingLeft NoHitInFirstLoopL - ; Angle 5 deg to right and end loop + ; Angle 5 deg to right and end loop clc lda NewAngle adc #5 - sta NewAngle + sta NewAngle HitOnLeftSideOfTargetL inc NewAngle EndOfFirstLoopL @@ -734,11 +734,11 @@ HitOnRightSideOfTargetL ; decrease energy (a little) sbw Force #5 NoHitInSecondLoopL - ; Angle 1 deg to left and end loop + ; Angle 1 deg to left and end loop dec NewAngle EndOfSecondLoopL jmp EndOfAim - + SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight ; xtraj+1 and ytraj+1 set clc @@ -759,7 +759,7 @@ SetStartAndFlight ; set start point (virtual barrel end :) ) and make test fl rts .endp ;---------------------------------------------- -.proc PurchaseAI ; +.proc PurchaseAI ; ; A - skill of the TankNr ; makes purchase for AI opponents ; results of this routine are not visible on the screen @@ -804,7 +804,7 @@ PurchaseAIRoutines tay lda bittable,y ldy temp - and PurchaseMeTable2,y + and PurchaseMeTable2,y beq TryToPurchaseOnePiece.SorryNoPurchase jmp TryToPurchaseOnePiece.PurchaseIt .endp @@ -846,7 +846,7 @@ PurchaseIt lda temp2+1 sbc temp+1 sta MoneyH,x - + lda TanksWeaponsTableL,x sta temp lda TanksWeaponsTableH,x @@ -860,12 +860,12 @@ PurchaseIt lda #99 NotExceeded sta (temp),y - - + + SorryNoPurchase - rts + rts .endp - + ;---------------------------------------------- .proc ShooterPurchase @@ -877,17 +877,17 @@ SorryNoPurchase jsr TryToPurchaseOnePiece ; dec tempXroller ; bne @- - + ; and now offensives mva #4 tempXroller; number of offensive purchases to perform ;ldx TankNr @ - randomize ind_Missile ind_Heavy_Roller + randomize ind_Missile ind_Heavy_Roller jsr TryToPurchaseOnePiece dec tempXroller bne @- - rts + rts .endp ;---------------------------------------------- .proc PoolsharkPurchase @@ -895,21 +895,21 @@ SorryNoPurchase ; mva #2 tempXroller; number of offensive purchases to perform ldx TankNr @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece dec tempXroller ; bpl @- - + ; and now offensives mva #6 tempXroller; number of purchases to perform ;ldx TankNr @ - randomize ind_Missile ind_Dirt_Charge + randomize ind_Missile ind_Dirt_Charge jsr TryToPurchaseOnePiece dec tempXroller bne @- - rts + rts .endp ;---------------------------------------------- .proc TosserPurchase @@ -922,22 +922,22 @@ SorryNoPurchase ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece dec tempXroller bpl @- - + ; and now offensives lda MoneyH,x ; money / 256 asl ;*2 sta tempXroller ; perform this many purchase attempts @ - randomize ind_Missile ind_Dirt_Charge + randomize ind_Missile ind_Dirt_Charge jsr TryToPurchaseOnePiece dec tempXroller bpl @- - rts + rts .endp ;---------------------------------------------- .proc CyborgPurchase @@ -950,22 +950,22 @@ SorryNoPurchase ; first try to buy defensives ; mva #1 tempXroller; number of defensive purchases to perform @ - randomize ind_Battery ind_Bouncy_Castle + randomize ind_Battery ind_Bouncy_Castle jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- - + ; and now offensives lda MoneyH,x ; money / 256 :3 asl ;*8 sta tempXroller ; perform this many purchase attempts @ - randomize first_offensive last_offensive + randomize first_offensive last_offensive jsr TryToPurchaseOnePiece2 dec tempXroller bpl @- - rts + rts .endp ;---------------------------------------------- .proc ChooseBestOffensive @@ -973,7 +973,7 @@ SorryNoPurchase ; X - TankNr ;---------------------------------------------- ldy #ind_Dirt_Charge +1 ;the last weapon to choose +1 (not BFG or Laser :) ) -NotFromAll +NotFromAll ; Y - the last offensive weapon to use + 1 lda TanksWeaponsTableL,x sta temp @@ -982,7 +982,7 @@ NotFromAll loop dey lda (temp),y - beq loop + beq loop tya sta ActiveWeapon,x rts diff --git a/artwork/joytest.asm b/artwork/joytest.asm index 0dbf434..0bd66ce 100644 --- a/artwork/joytest.asm +++ b/artwork/joytest.asm @@ -1,10 +1,10 @@ icl '../lib/atari.hea' - + org $2000 -joytest +joytest mva #0 dmactls - + @ lda trig0 beq pressed @@ -15,6 +15,5 @@ pressed ;ora jstick0 sta colbak jmp @- - - run joytest - \ No newline at end of file + + run joytest diff --git a/artwork/sfx/rmtplayr_modified.asm b/artwork/sfx/rmtplayr_modified.asm index dfbe15c..0ba35d0 100644 --- a/artwork/sfx/rmtplayr_modified.asm +++ b/artwork/sfx/rmtplayr_modified.asm @@ -620,7 +620,7 @@ rmt_p5 .IF TARGET = 800 ldx #$10 ; pseudo stereo bne SetPokey_OffsetX ; pseudo stereo -.ELSE +.ELIF TARGET = 5200 rts .ENDIF SetPokey diff --git a/artwork/splash_v2/lzss_player.asm b/artwork/splash_v2/lzss_player.asm index f3c6eff..f276135 100644 --- a/artwork/splash_v2/lzss_player.asm +++ b/artwork/splash_v2/lzss_player.asm @@ -6,7 +6,7 @@ song_end buffers .ds 256 * 9 - + POKEY2 = POKEY+$10 ; stereo ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -22,7 +22,7 @@ POKEY2 = POKEY+$10 ; stereo mva #1 bit_data ; Example: here initializes song pointer: - + ;mwa #song_data song_ptr ; Init all channels: @@ -67,7 +67,7 @@ delay sta POKEY2,x ; stereo dex ;stereo bpl @- ; stereo - + lda #>buffers sta bptr+1 @@ -150,4 +150,3 @@ skip stereo_buff ; stereo .ds 9 ; stereo - \ No newline at end of file diff --git a/artwork/splash_v2/splash.asm b/artwork/splash_v2/splash.asm index 5b4f552..93accb2 100644 --- a/artwork/splash_v2/splash.asm +++ b/artwork/splash_v2/splash.asm @@ -4,7 +4,7 @@ /***************************************/ icl "splash.h" - + ; --- dmsc LZSS player routine on zero page org $80 @@ -57,7 +57,7 @@ fnt .ds $0300 pmg SPRITES eif - + FontSplash ins '../../artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' @@ -103,14 +103,14 @@ LOOP lda vcount ;synchronization for the first screen (picture) line mva >ant dlptr+1 icl "output.png.rp.ini" - + ;--- 16 lines down ---- !!! :16 sta wsync - + ; wait 13 cycles !!! :4 nop inc byt2 - + ;--- wait 18 cycles ; jsr _rts ; inc byt3 @@ -185,7 +185,7 @@ stop mva #$00 pmcntl ;PMG disabled sta POKEY2,x ; stereo dex bpl @- - + ;no glitching please (issue #67) lda #0 sta $D400 ;dmactl diff --git a/constants.asm b/constants.asm index f1b7ca4..cf10a5e 100644 --- a/constants.asm +++ b/constants.asm @@ -59,11 +59,11 @@ LineGameOver seppukuText dta d"# SEPPUKU! #" areYouSureText - .IF target != 5200 + .IF TARGET = 800 dta d"# SURE? Y/N #" - .ELSE + .ELIF TARGET = 5200 dta d"#END? Y-1/N-0#" - .ENDIF + .ENDIF lineClear dta d" " @@ -232,109 +232,109 @@ TanksNamesDefault dta d":1th.Tank" .ENDR ;------------------------------------------------- -TankShapesTable .BYTE char_tank1 - .BYTE char_tank2 - .BYTE char_tank3 - .BYTE char_tank4 -;------------------------------------------------- +TankShapesTable .BYTE char_tank1 + .BYTE char_tank2 + .BYTE char_tank3 + .BYTE char_tank4 +;------------------------------------------------- WeaponPriceH ; weapons prices (tables with prices of weapons) - .by >price_Baby_Missile - .by >price_Missile - .by >price_Baby_Nuke - .by >price_Nuke - .by >price_LeapFrog - .by >price_Funky_Bomb - .by >price_MIRV - .by >price_Death_s_Head - .by >price_Napalm - .by >price_Hot_Napalm - .by >price_Tracer - .by >price_Smoke_Tracer - .by >price_Baby_Roller - .by >price_Roller - .by >price_Heavy_Roller - .by >price_Riot_Charge - .by >price_Riot_Blast - .by >price_Riot_Bomb + .by >price_Baby_Missile + .by >price_Missile + .by >price_Baby_Nuke + .by >price_Nuke + .by >price_LeapFrog + .by >price_Funky_Bomb + .by >price_MIRV + .by >price_Death_s_Head + .by >price_Napalm + .by >price_Hot_Napalm + .by >price_Tracer + .by >price_Smoke_Tracer + .by >price_Baby_Roller + .by >price_Roller + .by >price_Heavy_Roller + .by >price_Riot_Charge + .by >price_Riot_Blast + .by >price_Riot_Bomb .by >price_Heavy_Riot_Bomb - .by >price_Baby_Digger - .by >price_Digger - .by >price_Heavy_Digger - .by >price_Baby_Sandhog - .by >price_Sandhog - .by >price_Heavy_Sandhog - .by >price_Dirt_Clod - .by >price_Dirt_Ball - .by >price_Ton_of_Dirt - .by >price_Liquid_Dirt - .by >price_Dirt_Charge - .by >price_Buy_me - .by >price_Laser - .by >price_White_Flag - .by >price_Battery - .by >price_Hovercraft - .by >price_Parachute + .by >price_Baby_Digger + .by >price_Digger + .by >price_Heavy_Digger + .by >price_Baby_Sandhog + .by >price_Sandhog + .by >price_Heavy_Sandhog + .by >price_Dirt_Clod + .by >price_Dirt_Ball + .by >price_Ton_of_Dirt + .by >price_Liquid_Dirt + .by >price_Dirt_Charge + .by >price_Buy_me + .by >price_Laser + .by >price_White_Flag + .by >price_Battery + .by >price_Hovercraft + .by >price_Parachute .by >price_StrongParachute - .by >price_Mag_Deflector - .by >price_Shield - .by >price_Heavy_Shield - .by >price_Force_Shield - .by >price_Bouncy_Castle - .by >price_Long_Barrel + .by >price_Mag_Deflector + .by >price_Shield + .by >price_Heavy_Shield + .by >price_Force_Shield + .by >price_Bouncy_Castle + .by >price_Long_Barrel .by >price_Nuclear_Winter_ - .by >price_Lazy_Boy - .by >price_Lazy_Darwin - .by >price_Auto_Defense - .by >price_Spy_Hard + .by >price_Lazy_Boy + .by >price_Lazy_Darwin + .by >price_Auto_Defense + .by >price_Spy_Hard WeaponPriceL - .by 0 diff --git a/constants_top.asm b/constants_top.asm index 7ba3afe..9ee1268 100644 --- a/constants_top.asm +++ b/constants_top.asm @@ -14,7 +14,7 @@ dliColorsFore .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 CashOptionL ;(one zero less than on the screen) .by 0,<200,<800,<1200,<2000 -CashOptionH +CashOptionH .by 0,>200,>800,>1200,>2000 GravityTable .by 10,20,25,30,40 MaxWindTable .by 5,20,40,70,99 diff --git a/definitions.asm b/definitions.asm index f6c6f3d..536388b 100644 --- a/definitions.asm +++ b/definitions.asm @@ -34,7 +34,7 @@ char_flame = $14 char_clear_flame = $1c char_digger = $04 char_sandhog = $0c -char_sandhog_offset = char_sandhog - char_digger +char_sandhog_offset = char_sandhog - char_digger char_tank1 = $20 char_tank2 = $24 char_tank3 = $2c @@ -74,16 +74,16 @@ price_Dirt_Charge = 343 ;_29 price_Buy_me = 170 ;_30 price_Laser = 277 ;_31 price_White_Flag = $0 ;_32 -price_Battery = 300 ;_33 -price_Hovercraft = 352 ;_34 -price_Parachute = 234 ;_35 -price_StrongParachute = 1000 ;_36 -price_Mag_Deflector = 745 ;_37 -price_Shield = 224 ;_38 -price_Heavy_Shield = 628 ;_39 -price_Force_Shield = 1100 ;_40 -price_Bouncy_Castle = 512 ;_41 -price_Long_Barrel = 2100 ;_42 +price_Battery = 300 ;_33 +price_Hovercraft = 352 ;_34 +price_Parachute = 234 ;_35 +price_StrongParachute = 1000 ;_36 +price_Mag_Deflector = 745 ;_37 +price_Shield = 224 ;_38 +price_Heavy_Shield = 628 ;_39 +price_Force_Shield = 1100 ;_40 +price_Bouncy_Castle = 512 ;_41 +price_Long_Barrel = 2100 ;_42 price_Nuclear_Winter_ = 1000 ;_43 price_Lazy_Boy = 500 ;_44 price_Lazy_Darwin = 730 ;_45 @@ -91,7 +91,7 @@ price_Auto_Defense = 250 ;_46 price_Spy_Hard = 83 ;_47 ;Weapon indexes (numbers) ind_Baby_Missile = 0 -first_offensive = ind_Baby_Missile +first_offensive = ind_Baby_Missile ind_Missile = 1 ind_Baby_Nuke = 2 ind_Nuke = 3 @@ -123,26 +123,26 @@ ind_Liquid_Dirt = 28 ind_Dirt_Charge = 29 ind_Buy_me = 30 ind_Laser = 31 -last_offensive = ind_Laser +last_offensive = ind_Laser ind_White_Flag = 32 -first_defensive = ind_White_Flag -ind_Battery = 33 -ind_Hovercraft = 34 -ind_Parachute = 35 -ind_StrongParachute = 36 -ind_Mag_Deflector = 37 -ind_Shield = 38 -ind_Heavy_Shield = 39 -ind_Force_Shield = 40 -ind_Bouncy_Castle = 41 -ind_Long_Barrel = 42 +first_defensive = ind_White_Flag +ind_Battery = 33 +ind_Hovercraft = 34 +ind_Parachute = 35 +ind_StrongParachute = 36 +ind_Mag_Deflector = 37 +ind_Shield = 38 +ind_Heavy_Shield = 39 +ind_Force_Shield = 40 +ind_Bouncy_Castle = 41 +ind_Long_Barrel = 42 ind_Nuclear_Winter_ = 43 ind_Lazy_Boy = 44 ind_Lazy_Darwin = 45 ind_Auto_Defense = 46 ind_Spy_Hard = 47 -last_defensive = ind_Spy_Hard -last_real_defensive = ind_Bouncy_Castle +last_defensive = ind_Spy_Hard +last_real_defensive = ind_Bouncy_Castle number_of_offensives = last_offensive - first_offensive +1 number_of_defensives = (last_defensive - first_defensive +1) number_of_weapons = number_of_offensives + number_of_defensives diff --git a/game.asm b/game.asm index ad57161..c08763d 100644 --- a/game.asm +++ b/game.asm @@ -8,7 +8,7 @@ START jsr Initialize ;jsr GameOverScreen ; only for test !!! - + RMTSong song_main_menu jsr Options ;startup screen @@ -24,7 +24,7 @@ START jsr RandomizeSequence ; for the round #1 shooting sequence is random - + MainGameLoop jsr SetWallsType ; first set default barrel lengths (fix for Long Schlong activation :) ) @@ -40,20 +40,20 @@ MainGameLoop jsr GetRandomWind jsr RoundInit - + jsr MainRoundLoop bit escFlag jvs GoGameOver bmi START jsr CalculateGains - + jsr SortSequence - - mva #0 TankNr ; + + mva #0 TankNr ; sta COLBAKS ; set background color to black sta JoystickNumber ; set joystick port for player - + ; Hide all (easier than hide last ;) ) tanks jsr cleartanks ; A=0 @@ -69,7 +69,7 @@ MainGameLoop jsr DemoModeOrKey jsr MakeDarkScreen - + lda GameIsOver beq NoGameOverYet GoGameOver @@ -80,7 +80,7 @@ NoGameOverYet mva #sfx_silencer sfx_effect jmp MainGameLoop - + ;-------------------------------------------------- .proc CalculateGains ;-------------------------------------------------- @@ -96,7 +96,7 @@ NoGameOverYet ldx NumberOfPlayers dex CalculateGainsLoop - + ; adding the remaining energy of the tank to gain ; winner gets more ! :) lda Energy,x @@ -104,7 +104,7 @@ CalculateGainsLoop sta gainL,x bcc @+ inc gainH,x -@ +@ ; add gain * 2 asl gainL,x rol gainH,x @@ -175,7 +175,7 @@ eskipzeroing rts .endp ;-------------------------------------------------- -.proc RoundInit +.proc RoundInit ;-------------------------------------------------- ; at the beginning of each Round we set energy ; of all players to 99 @@ -191,7 +191,7 @@ eskipzeroing sta AfterBFGflag ; reset BFG flag sta COLOR2 ; status line "off" sta COLOR1 - + tax @ sta singleRoundVars,x inx @@ -219,7 +219,7 @@ SettingEnergies sta ForceTableL,x lda #>350 sta ForceTableH,x - + ;lda #(255-45) ;it does not look good when all tanks have ;barrels pointing the same direction @@ -227,7 +227,7 @@ SettingEnergies ;angles jsr RandomizeAngle sta AngleTable,x - + dex bpl SettingEnergies @@ -312,10 +312,10 @@ DoNotFinishTheRound lda noDeathCounter cmp seppukuVal bcc @+ - + mva #0 noDeathCounter mva #sfx_seppuku sfx_effect - + jsr DisplaySeppuku jmp Seppuku @@ -342,10 +342,10 @@ CheckNextTankAD jeq NextPlayerShoots - + mva #$ff plot4x4color jsr DisplayTankNameAbove - + mva #1 color ;to display flying point ldx tankNr @@ -358,7 +358,7 @@ CheckNextTankAD beq ManualShooting RoboTanks - ; robotanks shoot here + ; robotanks shoot here ; TankNr still in X jsr ArtificialIntelligence ;pause 30 @@ -391,7 +391,7 @@ AfterManualShooting ; defensive weapons without flight handling ldx TankNr lda ActiveDefenceWeapon,x - cmp #ind_Hovercraft + cmp #ind_Hovercraft beq GoFloat cmp #ind_White_Flag ; White Flag beq ShootWhiteFlag @@ -431,10 +431,10 @@ ShootNow bit escFlag spl:rts ; keys Esc or O - + lda HitFlag ;0 if missed beq missed - + jsr Explosion continueMainRoundLoopAfterSeppuku @@ -461,7 +461,7 @@ missed bne @+ ldx TankNr tya - sta ActiveWeapon,x + sta ActiveWeapon,x @ ;here we clear offensive text (after a shoot) @@ -477,7 +477,7 @@ NextPlayerShoots SeteXistenZ lda Energy,x sta eXistenZ,x - + jsr MaxForceCalculate dex @@ -504,7 +504,7 @@ PlayersAgain ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ mva #sfx_next_player sfx_effect - + ldx NumberOfPlayers dex CheckingPlayersDeath @@ -521,7 +521,7 @@ NoPlayerNoDeath cmp NumberOfPlayers bne NotLastPlayerInRound mva #0 TankSequencePointer - + lda WindChangeInRound beq NoWindChangeNow jsr GetRandomWind ; wind change after each turn (not round only) @@ -529,7 +529,7 @@ NoWindChangeNow NotLastPlayerInRound jmp MainRoundLoop .endp - + ;--------------------------------- .proc PlayerXdeath ; this tank should not explode anymore: @@ -560,9 +560,9 @@ NotLastPlayerInRound adc ResultsTable,x sta ResultsTable,x ;inc CurrentResult - + ; RandomizeDeffensiveText - randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) + randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) TextAfterBFG sta TextNumberOff inc CurrentResult ; ... but increase result of winner (BFG) @@ -574,7 +574,7 @@ TextAfterBFG mva TankNr temp2 ; not elegant, and probably unnecessary sty TankNr jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) - mva temp2 TankNr + mva temp2 TankNr ;Deffensive text cleanup ;here we clear Deffensive text (after a shoot) @@ -752,7 +752,7 @@ NotNegativeShieldEnergy ; Energy of tank X in A ;-------------------------------------------------- sta L1 - + ;DATA L1,L2 ;Multiplication 8bit*8bit, ;result 16bit @@ -786,7 +786,7 @@ B0 dey @ lda #$0 cpx #ind_White_Flag ; White Flag bne no99 -set99 lda #99 +set99 lda #99 no99 .REPT MaxPlayers, #+1 sta TanksWeapon:1,x @@ -823,16 +823,16 @@ deletePtr = temp iny sty TankShape+2 sty TankShape+5 - + mwa #1024 RandBoundaryHigh mva #$ff LastWeapon sta HowMuchToFall mva #1 color - + jsr SetStandardBarrels - jsr WeaponCleanup - + jsr WeaponCleanup + mva #>WeaponFont chbas ;parameter for old plot (unPlot) max 5 points @@ -869,7 +869,7 @@ MakeTanksVisible mva #1 CurrentRoundNr ;we start from round 1 mva #6 NTSCcounter - + rts .endp ;-------------------------------------------------- @@ -973,7 +973,7 @@ UsageLoop lda RANDOM and #%00000011 ;(0..1023) sta temp2+1 - + cpw RandBoundaryLow temp2 seq:bcs RandomizeForce @@ -984,9 +984,9 @@ UsageLoop sta ForceTableL,x lda temp2+1 sta ForceTableH,x - + ;--------- -LimitForce +LimitForce ; in X must be TankNr ; cuts force to MaxForceTable lda MaxForceTableH,x @@ -995,7 +995,7 @@ LimitForce lda MaxForceTableL,x cmp ForceTableL,x @ bcs @+ - + lda MaxForceTableL,x sta ForceTableL,x lda MaxForceTableH,x @@ -1045,7 +1045,7 @@ rotateLeft ; older is bigger BarrelPositionIsFine jsr DrawTankNr rts - + .endp ;---------------------------------------------- @@ -1166,7 +1166,7 @@ SetRandomWalls .endp ; -------------------------------------- ; Sets the appropriate variables based on the options table -; +; .proc SetVariablesFromOptions ;first option ldy OptionsTable @@ -1196,29 +1196,29 @@ SetRandomWalls ldy OptionsTable+3 lda MaxWindTable,y sta MaxWind - + ;fifth option (no of rounds) ldy OptionsTable+4 lda RoundsTable,y sta RoundsInTheGame - + ;6th option (shell speed) ldy OptionsTable+5 lda flyDelayTable,y sta flyDelay - + ;7th option (Airstrike after how many missess) ldy OptionsTable+6 lda seppukuTable,y sta seppukuVal - + ;8th option (how aggressive are mountains) ldy OptionsTable+7 lda mountainsDeltaTableH,y sta mountainDeltaH lda mountainsDeltaTableL,y sta mountainDeltaL - + rts .endp @@ -1228,9 +1228,9 @@ SetRandomWalls ;using 4x4 font jsr RoundOverSprites - + mva #$ff plot4x4color - + ;centering the result screen mva #((ScreenHeight/2)-(8*4)) ResultY @@ -1246,7 +1246,7 @@ SetRandomWalls lda CurrentRoundNr cmp RoundsInTheGame beq GameOver4x4 - + sta decimal mwa #RoundNrDisplay displayposition jsr displaybyte ;decimal (byte), displayposition (word) @@ -1264,7 +1264,7 @@ GameOver4x4 mva ResultY LineYdraw jsr TypeLine4x4 mva #1 GameIsOver - + @ adb ResultY #4 ;next line @@ -1321,7 +1321,7 @@ ResultOfTheNextPlayer ; overwrite the second digit of the points (max 255) ;it means ":" mva #26 ResultLineBuffer+9 - + ldx #0 lda TankNr asl diff --git a/grafproc.asm b/grafproc.asm index f1351bc..cbe8eb4 100644 --- a/grafproc.asm +++ b/grafproc.asm @@ -4,7 +4,7 @@ ;-------------------------------------------------- -.proc draw ;;fuxxing good draw :) +.proc draw ;;fuxxing good draw :) ; xdraw,ydraw (word) - coordinates of first point ; xbyte,ybyte (word) - coordinates of last point ;-------------------------------------------------- @@ -221,7 +221,7 @@ LineGoesLeft ; line goes left - we are reversing X sbw xtempDRAW temp xdraw ; XI PutPixelinDraw - + ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) bit drawFunction bpl @+ @@ -276,7 +276,7 @@ StopHitChecking jmp ContinueDraw @ MeasureVisualisation - jsr plot + jsr plot ContinueDraw ; XI=XI+1 @@ -292,9 +292,9 @@ EndOfDraw .endp ;-------------------------------------------------- -.proc circle ;fxxxing good circle drawing :) +.proc circle ;fxxxing good circle drawing :) ; xdraw,ydraw (word) - coordinates of circle center -; radius (byte) - radius of circle +; radius (byte) - radius of circle ;-------------------------------------------------- ;Turbo Basic source ; R=30 @@ -483,10 +483,10 @@ endcircleloop ; it is necessary, because randomizing checks ; if the given tank is already placed ; after check if its position is not (0,0) - + ; I will be honest with you - I have no idea ; what the above comment was intending to mean :) - + sta XtankstableL,x sta XtankstableH,x sta Ytankstable,x @@ -708,7 +708,7 @@ NoMissile bcs PMForTank6 ; clear sprite and put 3 lines on the tank at the same time ldx #3 ; three lines of PM -ClearPM +ClearPM cpy temp bne ZeroesToGo @ lda (xbyte),y @@ -728,7 +728,7 @@ ZeroesToGo PMForTank6 ; clear sprite and put 3 lines on the tank at the same time ldx #3 ; three lines of PM -ClearPM6 +ClearPM6 cpy temp bne ZeroesToGo6 @ lda (xbyte),y @@ -756,7 +756,7 @@ noTankNoPM ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char ldx TankNr lda ActiveDefenceWeapon,x - cmp #ind_Shield ; one shot shield + cmp #ind_Shield ; one shot shield beq DrawTankSh cmp #ind_Force_Shield ; shield with energy and parachute beq DrawTankShieldBold @@ -809,7 +809,7 @@ DoNotDrawTankNr tankflash_loop lda CONSOL ; turbo mode and #%00000001 ; START KEY - sne:mva #1 fs ; finish it + sne:mva #1 fs ; finish it mva #1 Erase ldx TankNr jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! @@ -833,7 +833,7 @@ tankflash_loop ; if use DrawInPosition entry point then: ; xdraw, ydraw - coordinates left LOWER corner of Tank char ; values remain there after a DrawTankNr proc. -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- sbw xdraw #$03 ; 3 pixels to left @@ -934,7 +934,7 @@ ToHighToParachute ;-------------------------------------------------- .proc DrawTankRocketEngine ; X - tank number -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- clc @@ -942,7 +942,7 @@ ToHighToParachute adc #2 ; 1 pixel down sta ydraw mva #0 ydraw+1 - + clc lda XtanksTableL,x adc #2 ; 2 pixels to right @@ -951,18 +951,18 @@ ToHighToParachute adc #0 sta xdraw+1 - ; draw first horizontal line + ; draw first horizontal line mva #5 temp @ jsr plot inw xdraw dec temp bne @- - - sbw xdraw #2 ; 2 pixels left + + sbw xdraw #2 ; 2 pixels left inw ydraw ; 1 pixel down - - ; draw second horizontal line + + ; draw second horizontal line mva #3 temp @ jsr plot @@ -970,7 +970,7 @@ ToHighToParachute dec temp bne @- - adw xdraw #2 ; 2 pixels right + adw xdraw #2 ; 2 pixels right inw ydraw ; 1 pixel down ; and last pixel @@ -982,7 +982,7 @@ ToHighToParachute ;-------------------------------------------------- .proc DrawTankEngine ; X - tank number -; +; ; this proc change xdraw, ydraw and temp! ;-------------------------------------------------- ; one pixel under tank @@ -1087,7 +1087,7 @@ ROLPoint2 rol UnderTank1 inw xdraw dec temp - bne ByteBelowTank + bne ByteBelowTank NoGroundCheck ldx TankNr lda Ytankstable,x @@ -1099,7 +1099,7 @@ NoGroundCheck lda Parachute and #1 bne ParachutePresent - ; decreasing energy + ; decreasing energy ldy #2 ; how much energy to substract if no parachute jsr DecreaseEnergyX ParachutePresent @@ -1114,7 +1114,7 @@ ParachutePresent beq @+ jsr DecreaseEnergyX @ - ; check energy of parachute + ; check energy of parachute lda ShieldEnergy,x bne OneTimeParachute lda #$00 @@ -1187,7 +1187,7 @@ NotLeftEdge EndLeftFall EndRightFall NoLeftOrRight - inc EndOfTheFallFlag ; after this is shouldn't fall + inc EndOfTheFallFlag ; after this is shouldn't fall EndOfFCycle ; draw tank on new position jsr DrawTankNr ; ew have TankNr in X (I hope :) ) @@ -1247,7 +1247,7 @@ NoParachuteWeapon beq ThereWasNoParachute jsr DrawTankParachute ThereWasNoParachute -; ldx TankNr +; ldx TankNr jsr PutTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) mva #sfx_silencer sfx_effect rts @@ -1267,7 +1267,7 @@ ThereWasNoParachute sta pmgraph+$700,y iny bne @- - rts + rts .endp /* @@ -1419,7 +1419,7 @@ ColumnIsReady bcc FalloutOfLine beq FalloutOfLine - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' lda IsEndOfTheFallFlag @@ -1539,7 +1539,7 @@ EndDrawing rts .endp -/* +/* ;-------------------------------------------------- .proc calculatemountains0 ; Only for testing - makes ground flat (0 pixels) @@ -1601,7 +1601,7 @@ NotHigher sta temp ; opty possible ; substract address of the next text from previous to get text length sbw temp LineAddress4x4 temp2 - mva temp2 fx + mva temp2 fx ;jsr Display4x4AboveTank ;rts @@ -1745,7 +1745,7 @@ DOTOldLowestValue bne end_found dey bne @- - + end_found iny sty fx @@ -1797,21 +1797,21 @@ EndOfTypeLine4x4 ;-------------------------------- .proc AreYouSure ;using 4x4 font - + mva #4 ResultY ; where seppuku text starts Y-wise on the screen - + ;top frame mva ResultY LineYdraw jsr TL4x4_top adb ResultY #4 ;next line - + ;sure? mwa #areYouSureText LineAddress4x4 - jsr _sep_opty + jsr _sep_opty ;bottom frame mva ResultY LineYdraw jsr TL4x4_bottom - + jsr GetKey cmp #@kbcode._Y ; $2b ; "Y" @@ -1821,14 +1821,14 @@ EndOfTypeLine4x4 @ mva #0 escFlag skip01 jsr WaitForKeyRelease - + ;clean mva #3 di mva #4 ResultY @ mva #$ff plot4x4color mwa #lineClear LineAddress4x4 - jsr _sep_opty + jsr _sep_opty dec di bne @- @@ -1847,31 +1847,31 @@ quit_areyousure ;-------------------------------- .proc DisplaySeppuku ;using 4x4 font - + mva #20 fs ; temp, how many times blink the billboard seppuku_loop lda CONSOL ; turbo mode and #%00000001 ; START KEY - sne:mva #1 fs ; finish it + sne:mva #1 fs ; finish it mva #4 ResultY ; where seppuku text starts Y-wise on the screen - + ;top frame mva ResultY LineYdraw jsr TL4x4_top adb ResultY #4 ;next line - + ;seppuku mwa #seppukuText LineAddress4x4 jsr _sep_opty - + ;bottom frame mva ResultY LineYdraw jsr TL4x4_bottom ; just go ;clean seppuku - + mva #3 di ;mva #4 ResultY lda #4 @@ -1879,7 +1879,7 @@ seppuku_loop loplop ;@ mwa #lineClear LineAddress4x4 jsr _sep_opty - + dec di bne loplop ;@- @@ -1888,7 +1888,7 @@ loplop ;@ quit_seppuku rts - + .endp ; ------------------------------------- @@ -1909,7 +1909,7 @@ X lda XtanksTableL,x ;-------------------------------------------------- ;vx calculation ;vx = sin(90-Angle) for Angle <=90 - ;vx = -sin(Angle-90) for 90 < Angle <= 180 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 ; erase previous barrel @@ -1918,7 +1918,7 @@ X lda XtanksTableL,x ; lda previousBarrelAngle,x ; sta Angle ; jsr DrawBarrelTech - ; + ; ; mva #1 color ldx TankNr jsr SetupXYdraw @@ -1932,11 +1932,11 @@ X lda XtanksTableL,x .proc DrawBarrelTech ; angle in Angle and A - + mvx #0 goleft cmp #91 bcc angleUnder90 - + ;over 90 sec sbc #90 @@ -1953,8 +1953,8 @@ angleUnder90 tax ; barrel start offset under 90deg adw xdraw #3 xdraw - -@ + +@ sbw ydraw #3 ydraw lda sintable,x ; cos(X) sta vx @@ -1967,7 +1967,7 @@ angleUnder90 lda Angle cmp #91 bcc YangleUnder90 - + lda #180 sec sbc Angle @@ -1984,14 +1984,14 @@ YangleUnder90 sta fy ; draw by vx vy - ; in each step + ; in each step ; 1. plot(xdraw, ydraw) ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy ; 3 check length, if shorter, go to 1. - + ; mva #6 yc ; barrel length barrelLoop - + lda goleft bne goright clc @@ -2029,15 +2029,15 @@ ybarrel sta ydraw bcs @+ dec ydraw+1 -@ +@ jsr plot ;.MakePlot dec yc bne barrelLoop - + mwa xdraw EndOfTheBarrelX mva ydraw EndOfTheBarrelY - + rts .endp ;-------------------------------------------------- diff --git a/scorch.asm b/scorch.asm index b89fcf4..9a14dbd 100644 --- a/scorch.asm +++ b/scorch.asm @@ -7,7 +7,7 @@ ;--------------------------------------------------- .IFNDEF TARGET - .def TARGET = 800 ; 5200 ; or 64 + .def TARGET = 800 ; 5200 .ENDIF ;atari800 -5200 -cart ${outputFilePath} -cart-type 4 ;atari800 -run ${outputFilePath} @@ -64,7 +64,7 @@ FirstZpageVariable = $57 .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine - .zpvar fx .byte + .zpvar fx .byte .zpvar yi .word ;Y (word) in draw routine .zpvar fy .byte .zpvar xk .word @@ -77,7 +77,7 @@ FirstZpageVariable = $57 .zpvar dp .word ;---------------------------- .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank2 .byte ;---------------------------- .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word @@ -131,7 +131,7 @@ FirstZpageVariable = $57 .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -152,11 +152,15 @@ FirstZpageVariable = $57 ;----------------------------------------------- ; libraries ;----------------------------------------------- - .IF TARGET = 5200 + .IF TARGET = 800 + icl 'Atari/lib/ATARISYS.ASM' + icl 'Atari/lib/MACRO.ASM' + icl 'artwork/splash_v2/splash.asm' ; splash screen and musix + .ELIF TARGET = 5200 OPT h-f+ ; no headers, single block --> cart bin file icl 'Atari/lib/5200SYS.ASM' icl 'Atari/lib/5200MACRO.ASM' - .enum @kbcode + .enum @kbcode /* _0 _1 @@ -193,21 +197,17 @@ FirstZpageVariable = $57 _none = $0f .ende - .ELSE - icl 'Atari/lib/ATARISYS.ASM' - icl 'Atari/lib/MACRO.ASM' - icl 'artwork/splash_v2/splash.asm' ; splash screen and musix .ENDIF - + ;----------------------------------------------- ; variable declarations in RAM (no code) ;----------------------------------------------- ORG PMGraph + $0300 - (variablesEnd - OneTimeZeroVariables + 1) icl 'variables.asm' - + ; Game loading address ORG $4000 - + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' @@ -220,25 +220,25 @@ DisplayCopyStart icl 'Atari/display_main_menu.asm' DisplayCopyEnd org DisplayCopyRom + (DisplayCopyEnd - DisplayCopyStart) - + DisplayCopyPurchaseDlROM = * org DisplayCopyPurchase, DisplayCopyPurchaseDlROM DisplayCopyPurchaseStart icl 'Atari/display_purchasedl.asm' DisplayCopyPurchaseEnd org DisplayCopyPurchaseDlROM + (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart) - + StatusBufferROM = * org StatusBufferCopy, StatusBufferROM StatusBufferCopyStart icl 'Atari/display_status.asm' StatusBufferCopyEnd org StatusBufferROM + (StatusBufferCopyEnd - StatusBufferCopyStart) - + icl 'Atari/display_static.asm' ;---------------------------------------------- - + ;-------------------------------------------------- ; Game Code ;-------------------------------------------------- @@ -246,16 +246,11 @@ FirstSTART .IF TARGET = 5200 ; start in 5200 diagnostic mode ; move original startup procedure to RAM + Modified5200Splash = $2100 ; apparently there is some free space here - ; 6502 initialization - ; SEI - ; CLD - ; LDX #$FF - ; TXS - ; check kernel version Atari5200KernelByte = $fff8 - ; $32 - 4 joy + ; $32 - 4 joy ; $00 - 2 joy ; $ff - Altirra kernel @@ -276,11 +271,11 @@ rom2joy @ mwa $fffc temp ; startup proc address mwa #Modified5200Splash temp2 - jsr CopyFromROM + jsr CopyFromROM ; modify the end of the splash procedure lda #$60 ; rts sta (temp2),y - + jsr Modified5200Splash+$0f ; after the diag cart detection ; modify the text splash_text = $3c80 ; '.scorch.supersystem.copyright.19xx.atari' @@ -290,12 +285,12 @@ rom2joy @ lda NewSplashText,y sta splash_copyright,y dey - bpl @- - + bpl @- + ; splash screen delay. maybe add fire to speed up? @ cpx RTCLOK+1 bne @- -no5200splash +no5200splash .ENDIF jsr MakeDarkScreen @@ -305,13 +300,13 @@ no5200splash @ sta OneTimeZeroVariables,y dey bpl @- - + ; one time zero variables in RAM (zero page) ldy #FirstZpageVariable @ sta $0000,y iny bne @- - + ; initialize variables in RAM (non zero page) ldy #initialvaluesCount-1 @ lda initialvaluesStart,y @@ -327,41 +322,32 @@ no5200splash jsr GenerateLineTable .IF TARGET = 800 - -; pokeys init - lda #3 ; stereo - sta POKEY+$0f ; stereo - sta POKEY+$1f ; stereo - - lda PAL - and #%00001110 - bne NoRMT_PALchange - ;it is PAL here - ; Change RMT to PAL version - ; 5 values in RMT file - ; not elegant :( - mva #$06 MODUL-6+$967 ; $07 > $06 - ;mva #$06 MODUL-6+$bc3 ; $07 > $06 - ;mva #$06 MODUL-6+$e69 ; $08 > $06 - ;mva #$06 MODUL-6+$ebc ; $08 > $06 - sta MODUL-6+$bc3 ; $07 > $06 - sta MODUL-6+$e69 ; $08 > $06 - sta MODUL-6+$ebc ; $08 > $06 - mva #$10 MODUL-6+$a69 ; $12 > $10 - mva #$04 MODUL-6+$bf8 ; $05 > $04 - mva #$08 MODUL-6+$e3d ; $0a > $08 - - ; and mountains colors table address - mva #dliColorsFore2PAL GradientAddrH+2 -; mva #$c4 dliColorsFore2+16 -; mva #$c6 dliColorsFore2+17 -; mva #$a4 dliColorsFore2+18 -; mva #$a6 dliColorsFore2+19 -; sta dliColorsFore2+20 + ; pokeys init + lda #3 ; stereo + sta POKEY+$0f ; stereo + sta POKEY+$1f ; stereo + + lda PAL + and #%00001110 + bne NoRMT_PALchange + ;it is PAL here + ; Change RMT to PAL version + ; 5 values in RMT file + ; not elegant :( + mva #$06 MODUL-6+$967 ; $07 > $06 + sta MODUL-6+$bc3 ; $07 > $06 + sta MODUL-6+$e69 ; $08 > $06 + sta MODUL-6+$ebc ; $08 > $06 + mva #$10 MODUL-6+$a69 ; $12 > $10 + mva #$04 MODUL-6+$bf8 ; $05 > $04 + mva #$08 MODUL-6+$e3d ; $0a > $08 + + ; and mountains colors table address + mva #dliColorsFore2PAL GradientAddrH+2 NoRMT_PALchange - .ELSE - mva #$7f SkStatSimulator + .ELIF TARGET = 5200 + mva #$7f SkStatSimulator .ENDIF @@ -380,7 +366,7 @@ NoRMT_PALchange mwa #kb_continue VKEYCNT ;Keyboard handler .ENDIF VMAIN VBLinterrupt,7 ;jsr SetVBL - + mva #2 chactl ; necessary for 5200 ;-------------------------------------------------- @@ -388,7 +374,7 @@ NoRMT_PALchange icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -396,26 +382,26 @@ NoRMT_PALchange ; result: A=keycode ;-------------------------------------------------- jsr WaitForKeyRelease -@ - .IF TARGET = 800 - lda SKSTAT - cmp #$ff - beq checkJoyGetKey ; key not pressed, check Joy - cmp #$f7 ; SHIFT - beq checkJoyGetKey - .ELSE - lda SkStatSimulator - and #%11111110 - bne checkJoyGetKey ; key not pressed, check Joy - .ENDIF - lda kbcode - cmp #@kbcode._none - beq checkJoyGetKey - and #$3f ;CTRL and SHIFT ellimination - cmp #@kbcode._esc ; 28 ; ESC - bne getkeyend - mvy #$80 escFlag - bne getkeyend +getKeyAfterWait + .IF TARGET = 800 + lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 ; SHIFT + beq checkJoyGetKey + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + bne checkJoyGetKey ; key not pressed, check Joy + .ENDIF + lda kbcode + cmp #@kbcode._none + beq checkJoyGetKey + and #$3f ;CTRL and SHIFT ellimination + cmp #@kbcode._esc ; 28 ; ESC + bne getkeyend + mvy #$80 escFlag + bne getkeyend checkJoyGetKey ;------------JOY------------- @@ -425,7 +411,7 @@ checkJoyGetKey and #$0f cmp #$0f beq notpressedJoyGetKey - tay + tay lda joyToKeyTable,y bne getkeyend @@ -434,26 +420,26 @@ notpressedJoyGetKey lda STRIG0 beq JoyButton .IF TARGET = 800 ; Select and Option key only on A800 - bne checkSelectKey + bne checkSelectKey checkSelectKey - lda CONSOL - and #%00000010 ; Select - beq SelectPressed - lda CONSOL - and #%00000100 ; Option + lda CONSOL + and #%00000010 ; Select + beq SelectPressed + lda CONSOL + and #%00000100 ; Option .ENDIF - bne @- + bne getKeyAfterWait OptionPressed lda #@kbcode._atari ; Option key - bne getkeyend + bne getkeyend SelectPressed lda #@kbcode._tab ; Select key bne getkeyend JoyButton - lda #@kbcode._ret ;Return key + lda #@kbcode._ret ;Return key getkeyend ldy #0 - sty ATRACT ; reset atract mode + sty ATRACT ; reset atract mode mvy #sfx_keyclick sfx_effect rts .endp @@ -461,7 +447,7 @@ getkeyend ;-------------------------------------------------- .proc getkeynowait ;-------------------------------------------------- - jsr WaitForKeyRelease + jsr WaitForKeyRelease lda kbcode and #$3f ;CTRL and SHIFT ellimination rts @@ -471,7 +457,7 @@ getkeyend .proc WaitForKeyRelease ;-------------------------------------------------- mva #128-KeyRepeatSpeed pressTimer ; tricky -StillWait +StillWait bit pressTimer bmi KeyReleased lda STICK0 @@ -488,10 +474,10 @@ StillWait and #%00000110 ; Select and Option only cmp #%00000110 bne StillWait - .ELSE - lda SkStatSimulator - and #%11111110 - beq StillWait + .ELIF TARGET = 5200 + lda SkStatSimulator + and #%11111110 + beq StillWait .ENDIF KeyReleased rts @@ -745,19 +731,21 @@ EndofBFGDLI .ERROR 'Code and data too long' .ENDIF .ECHO "Bytes left: ",$b000-* - - + + org $b000 ;address of RMT module -MODUL +MODUL ;RMT module is standard Atari binary file already ins "artwork/sfx/scorch_str9-NTSC.rmt",+6 ;include music RMT module MODULEND ;---------------------------------------------- icl 'constants_top.asm' ;---------------------------------------------- - + .ECHO "Bytes on top left: ",$bfe8-* ;ROM_SETTINGS-* - .IF target = 5200 + .IF TARGET = 800 + run FirstSTART + .ELIF TARGET = 5200 .IF * > ROM_SETTINGS-1 .ERROR 'Code and RMT song too long to fit in 5200' .ENDIF @@ -766,6 +754,4 @@ MODULEND .byte " scorch supersystem " ;20 characters title .byte " ", $ff ;$BFFD == $ff means diagnostic cart, no splash screen .word FirstSTART - .ELSE - run FirstSTART .ENDIF diff --git a/scorchC64.asm b/scorchC64.asm index 974b125..1387312 100644 --- a/scorchC64.asm +++ b/scorchC64.asm @@ -20,8 +20,8 @@ org $801 org [a($801)],$801 basic_start(FirstSTART) - - + + ;--------------------------------------------------- .macro build dta d"1.28" ; number of this build (4 bytes) @@ -64,7 +64,7 @@ FirstZpageVariable = $58 ; $57 .zpvar CreditsVScrol .byte ;--------------temps used in circle routine .zpvar xi .word ;X (word) in draw routine - .zpvar fx .byte + .zpvar fx .byte .zpvar yi .word ;Y (word) in draw routine .zpvar fy .byte .zpvar xk .word @@ -77,7 +77,7 @@ FirstZpageVariable = $58 ; $57 .zpvar dp .word ;---------------------------- .zpvar UnderTank1 .byte - .zpvar UnderTank2 .byte + .zpvar UnderTank2 .byte ;---------------------------- .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) .zpvar weaponPointer .word @@ -131,7 +131,7 @@ FirstZpageVariable = $58 ; $57 .zpvar escFlag .byte ; 7 bit - Exit game, 6 bit - Exit to GameOver (cleared - exit to Menu), 0 - nothing .zpvar LineYdraw .byte .zpvar LineXdraw .word - .zpvar plot4x4color .byte ; $00 / $ff + .zpvar plot4x4color .byte ; $00 / $ff .zpvar Multiplier .word .zpvar Multiplier_ .byte ; 3 bytes .zpvar HowToDraw .byte @@ -155,19 +155,19 @@ FirstZpageVariable = $58 ; $57 icl 'C64/lib/C64_ATARISYS.ASM' icl 'C64/lib/C64SYS.ASM' icl 'C64/lib/MACRO.ASM' - + ;----------------------------------------------- ; variable declarations in RAM (no code) ;----------------------------------------------- - + ; Game loading address ORG $4100 icl 'variables.asm' - + WeaponFont ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' - + ;-------------------------------------------------- ; Game Code ;-------------------------------------------------- @@ -199,22 +199,22 @@ FirstSTART ; from here on NMI is disabled - + jsr MakeDarkScreen - + ; one time zero variables in RAM (non zero page) lda #0 ldy #OneTimeZeroVariablesCount-1 @ sta OneTimeZeroVariables,y dey bpl @- - + ; one time zero variables in RAM (zero page) ldy #FirstZpageVariable @ sta $0000,y iny bne @- - + ; initialize variables in RAM (non zero page) ldy #initialvaluesCount-1 @ lda initialvaluesStart,y @@ -235,7 +235,7 @@ FirstSTART icl 'game.asm' ;-------------------------------------------------- - + ;-------------------------------------------------- .proc GetKey ; waits for pressing a key and returns pressed value in A @@ -252,7 +252,7 @@ FirstSTART ;-------------------------------------------------- .proc getkeynowait ;-------------------------------------------------- - jsr WaitForKeyRelease + jsr WaitForKeyRelease lda kbcode and #$3f ;CTRL and SHIFT ellimination rts @@ -361,7 +361,7 @@ noShellDelay icl 'C64/textproc.asm' ;---------------------------------------------- icl 'grafproc.asm' - icl 'C64/gr_basics.asm' + icl 'C64/gr_basics.asm' ;---------------------------------------------- icl 'weapons.asm' ;---------------------------------------------- @@ -442,4 +442,3 @@ NMI INC $D020 ; change border colour, indication for a NMI RTI ; exit interrupt ; (not acknowledged!) - \ No newline at end of file diff --git a/scorchC64.lst b/scorchC64.lst deleted file mode 100644 index f581145..0000000 --- a/scorchC64.lst +++ /dev/null @@ -1,11712 +0,0 @@ -mads 2.1.5 build 3 (21 Feb 22) -Source: scorchC64.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 ;C64 8-bit Scorched Earth source code - 3 ;--------------------------------------------------- - 4 ;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski - 5 ;Warsaw 2000, 2001, 2002, 2003, 2009, 2012, 2013 - 6 ;Miami & Warsaw 2022, 2023 - 7 - 8 ;--------------------------------------------------- - 9 = 0040 .def TARGET = 64 ; :) - 10 ;--------------------------------------------------- - 11 = 0000 .def XCORRECTION_FOR_PM = 0 - 12 ; if 1 - active x position of tanks correction fo PMG - 13 = 0000 .def FASTER_GRAF_PROCS = 0 - 14 ; if 1 - activates faster graphics routines - 15 ; (direct writes to screen memory - atari only :) ) - 16 ;--------------------------------------------------- - 17 - 18 - 19 opt h-f+ - 20 org $801 - 21 0801 01 08 org [a($801)],$801 - 22 0801 basic_start(FirstSTART) -Macro: BASIC_START [Source: MACRO.ASM] - 2 0801 0C 08 .word upstartEnd // link address - 3 0803 0A 00 .word 10 // line num - 4 0805 9E .byte $9e // sys - 6 = 0000 ?a=0 - 7 = 0000 ?b=0 - 8 = 0000 ?c=0 - 9 = 0000 ?d=0 - 10 = 0000 ?e=0 - 12 = 536A ?v = (FIRSTSTART) - 15 = 0002 ?a=?v/10000 - 16 = 054A ?v=?v-(?a*10000) - 20 = 0001 ?b=?v/1000 - 21 = 0162 ?v=?v-(?b*1000) - 25 = 0003 ?c=?v/100 - 26 = 0036 ?v=?v-(?c*100) - 30 = 0005 ?d=?v/10 - 31 = 0004 ?v=?v-(?d*10) - 34 = 0004 ?e=?v%10 - 36 0806 32 31 33 35 34 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 - 38 080B 00 .byte 0 - 39 080C upstartEnd - 40 080C 00 00 .word 0 // empty link signals the end of the program -Source: scorchC64.asm - 23 - 24 - 25 ;--------------------------------------------------- - 26 .macro build - 27 dta d"1.28" ; number of this build (4 bytes) - 28 .endm - 29 - 30 .macro RMTSong - 31 lda #:1 ; do nothing in C64 - 32 .endm - 33 - 34 ;--------------------------------------------------- - 35 080E icl 'definitions.asm' -Source: definitions.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 = 00C8 screenheight = 200 - 4 = 0028 screenBytes = 40 - 5 = 0140 screenwidth = screenBytes*8 ; Max screenwidth = 512!!! - 6 - 7 = 0008 TankWidth = 8 - 8 ;---------------------------------------------- - 9 ; Player/missile memory - 10 = 1800 PMGraph = $1800 ; real PM start = PMGraph + $0300 - 11 ; Generated tables - 12 = 2010 display = $2010 ;screen takes $1f68 because it has screenHeight+1 lines because of out of screen tracer(?) - 13 ;---------------------------------------------- - 14 - 15 = 0028 margin = 40 ;mountain drawing Y variable margin - 16 = 0006 MaxPlayers = 6 - 17 = 0009 maxOptions = 9 ;number of all options - 18 = 002C PMOffsetX = $2C ; P/M to graphics offset - 19 = 002A PMOffsetY = $2A ; P/M to graphics offset - 20 = 000A napalmRadius = 10 - 21 = 0006 StandardBarrel = 6 ; standard tank barrel length - 22 = 0014 LongBarrel = 20 ; long barrel length - 23 - 24 = 0002 TextBackgroundColor = $02 ; REAL constans - use: LDA #TextBackgroundColor - 25 = 000A TextForegroundColor = $0A - 26 = 0000 space = 0 ; space in screencodes - 27 - 28 = 000A KeyRepeatSpeed = 10 ; (max 127 !!!) - 29 - 30 ;character codes for symbols (tank, parachute, etc. ) - 31 = 0002 char_parachute_______ = $02 - 32 = 001E char_flag____________ = $1e - 33 = 0014 char_flame___________ = $14 - 34 = 001C char_clear_flame_____ = $1c - 35 = 0004 char_digger__________ = $04 - 36 = 000C char_sandhog_________ = $0c - 37 = 0008 char_sandhog_offset = char_sandhog_________ - char_digger__________ - 38 = 0020 char_tank1___________ = $20 - 39 = 0024 char_tank2___________ = $24 - 40 = 002C char_tank3___________ = $2c - 41 = 0028 char_tank4___________ = $28 ; robotank shape - 42 - 43 ;Weapon prices (*10 on screen) - 44 = 0000 price_Baby_Missile___ = 0 ;_00 - 45 = 0060 price_Missile________ = 96 ;_01 - 46 = 006F price_Baby_Nuke______ = 111 ;_02 - 47 = 0090 price_Nuke___________ = 144 ;_03 - 48 = 00C0 price_LeapFrog_______ = 192 ;_04 - 49 = 0125 price_Funky_Bomb_____ = 293 ;_05 - 50 = 01C8 price_MIRV___________ = 456 ;_06 - 51 = 0151 price_Death_s_Head___ = 337 ;_07 - 52 = 007D price_Napalm_________ = 125 ;_08 - 53 = 00A2 price_Hot_Napalm_____ = 162 ;_09 - 54 = 0066 price_Tracer_________ = 102 ;_10 - 55 = 0123 price_Smoke_Tracer___ = 291 ;_11 - 56 = 00D3 price_Baby_Roller____ = 211 ;_12 - 57 = 00F4 price_Roller_________ = 244 ;_13 - 58 = 0146 price_Heavy_Roller___ = 326 ;_14 - 59 = 00E6 price_Riot_Charge____ = 230 ;_15 - 60 = 00F1 price_Riot_Blast_____ = 241 ;_16 - 61 = 0103 price_Riot_Bomb______ = 259 ;_17 - 62 = 0110 price_Heavy_Riot_Bomb = 272 ;_18 - 63 = 0088 price_Baby_Digger____ = 136 ;_19 - 64 = 00B0 price_Digger_________ = 176 ;_20 - 65 = 00CF price_Heavy_Digger___ = 207 ;_21 - 66 = 009E price_Baby_Sandhog___ = 158 ;_22 - 67 = 00BF price_Sandhog________ = 191 ;_23 - 68 = 00DF price_Heavy_Sandhog__ = 223 ;_24 - 69 = 0068 price_Dirt_Clod______ = 104 ;_25 - 70 = 0082 price_Dirt_Ball______ = 130 ;_26 - 71 = 00AB price_Ton_of_Dirt____ = 171 ;_27 - 72 = 014A price_Liquid_Dirt____ = 330 ;_28 - 73 = 0157 price_Dirt_Charge____ = 343 ;_29 - 74 = 00AA price_Buy_me_________ = 170 ;_30 - 75 = 0115 price_Laser__________ = 277 ;_31 - 76 = 0000 price_White_Flag_____ = $0 ;_32 - 77 = 012C price_Battery________ = 300 ;_33 - 78 = 0160 price_Hovercraft_____ = 352 ;_34 - 79 = 00EA price_Parachute______ = 234 ;_35 - 80 = 03E8 price_StrongParachute = 1000 ;_36 - 81 = 02E9 price_Mag_Deflector__ = 745 ;_37 - 82 = 00E0 price_Shield_________ = 224 ;_38 - 83 = 0274 price_Heavy_Shield___ = 628 ;_39 - 84 = 044C price_Force_Shield___ = 1100 ;_40 - 85 = 0200 price_Bouncy_Castle__ = 512 ;_41 - 86 = 0834 price_Long_Barrel____ = 2100 ;_42 - 87 = 03E8 price_Nuclear_Winter_ = 1000 ;_43 - 88 = 01F4 price_Lazy_Boy_______ = 500 ;_44 - 89 = 02DA price_Lazy_Darwin____ = 730 ;_45 - 90 = 00FA price_Auto_Defense___ = 250 ;_46 - 91 = 0053 price_Spy_Hard_______ = 83 ;_47 - 92 ;Weapon indexes (numbers) - 93 = 0000 ind_Baby_Missile___ = 0 - 94 = 0000 first_offensive____ = ind_Baby_Missile___ - 95 = 0001 ind_Missile________ = 1 - 96 = 0002 ind_Baby_Nuke______ = 2 - 97 = 0003 ind_Nuke___________ = 3 - 98 = 0004 ind_LeapFrog_______ = 4 - 99 = 0005 ind_Funky_Bomb_____ = 5 - 100 = 0006 ind_MIRV___________ = 6 - 101 = 0007 ind_Death_s_Head___ = 7 - 102 = 0008 ind_Napalm_________ = 8 - 103 = 0009 ind_Hot_Napalm_____ = 9 - 104 = 000A ind_Tracer_________ = 10 - 105 = 000B ind_Smoke_Tracer___ = 11 - 106 = 000C ind_Baby_Roller____ = 12 - 107 = 000D ind_Roller_________ = 13 - 108 = 000E ind_Heavy_Roller___ = 14 - 109 = 000F ind_Riot_Charge____ = 15 - 110 = 0010 ind_Riot_Blast_____ = 16 - 111 = 0011 ind_Riot_Bomb______ = 17 - 112 = 0012 ind_Heavy_Riot_Bomb = 18 - 113 = 0013 ind_Baby_Digger____ = 19 - 114 = 0014 ind_Digger_________ = 20 - 115 = 0015 ind_Heavy_Digger___ = 21 - 116 = 0016 ind_Baby_Sandhog___ = 22 - 117 = 0017 ind_Sandhog________ = 23 - 118 = 0018 ind_Heavy_Sandhog__ = 24 - 119 = 0019 ind_Dirt_Clod______ = 25 - 120 = 001A ind_Dirt_Ball______ = 26 - 121 = 001B ind_Ton_of_Dirt____ = 27 - 122 = 001C ind_Liquid_Dirt____ = 28 - 123 = 001D ind_Dirt_Charge____ = 29 - 124 = 001E ind_Buy_me_________ = 30 - 125 = 001F ind_Laser__________ = 31 - 126 = 001F last_offensive_____ = ind_Laser__________ - 127 = 0020 ind_White_Flag_____ = 32 - 128 = 0020 first_defensive____ = ind_White_Flag_____ - 129 = 0021 ind_Battery________ = 33 - 130 = 0022 ind_Hovercraft_____ = 34 - 131 = 0023 ind_Parachute______ = 35 - 132 = 0024 ind_StrongParachute = 36 - 133 = 0025 ind_Mag_Deflector__ = 37 - 134 = 0026 ind_Shield_________ = 38 - 135 = 0027 ind_Heavy_Shield___ = 39 - 136 = 0028 ind_Force_Shield___ = 40 - 137 = 0029 ind_Bouncy_Castle__ = 41 - 138 = 002A ind_Long_Barrel____ = 42 - 139 = 002B ind_Nuclear_Winter_ = 43 - 140 = 002C ind_Lazy_Boy_______ = 44 - 141 = 002D ind_Lazy_Darwin____ = 45 - 142 = 002E ind_Auto_Defense___ = 46 - 143 = 002F ind_Spy_Hard_______ = 47 - 144 = 002F last_defensive_____ = ind_Spy_Hard_______ - 145 = 0029 last_real_defensive = ind_Bouncy_Castle__ - 146 = 0020 number_of_offensives = last_offensive_____ - first_offensive____+1 - 147 = 0010 number_of_defensives = (last_defensive_____ - first_defensive____+1) - 148 = 0030 number_of_weapons = number_of_offensives + number_of_defensives - 149 ;-------------------------------- - 150 ; names of RMT instruments (sfx) - 151 ;-------------------------------- - 152 = 0000 sfx_set_power_1 = $00 ;A - 153 = 0001 sfx_set_power_2 = $01 ;b - 154 = 0002 sfx_lightning = $02 ;c - 155 = 0003 sfx_dunno = $03 ;d - 156 = 0004 sfx_nuke = $04 ;e - 157 = 0005 sfx_baby_missile= $05 ;f - 158 = 0006 sfx_death_begin = $06 ;g - 159 = 0007 sfx_plasma_1_2 = $07 ;h - 160 = 0008 sfx_plasma_2_2 = $08 ;i - 161 = 0009 sfx_napalm = $09 ;j - 162 = 000A sfx_dirt_charge = $0a ;k - 163 = 000B sfx_missile_hit = $0b ;l - 164 = 000C sfx_funky_hit = $0c ;m - 165 = 000D sfx_shield_on = $0d ;n - 166 = 000E sfx_shield_off = $0e ;o - 167 = 000F sfx_parachute = $0f ;p - 168 = 0010 sfx_smoke_cloud = $10 ;q - 169 = 0011 sfx_riot_blast = $11 ;r - 170 = 0012 sfx_sandhog = $12 ;s - 171 = 0013 sfx_dirt_chrg_s = $13 ;t - 172 = 0014 sfx_digger = $14 ;u - 173 = 0015 sfx_silencer = $15 ;v - 174 = 0016 sfx_next_player = $16 ;w - 175 = 0017 sfx_purchase = $17 ;x - 176 = 0018 sfx_keyclick = $18 ;y - 177 = 0019 sfx_shoot = $19 ;z - 178 = 001A sfx_seppuku = $1a ;1 - 179 = 001B sfx_liquid_dirt = $1b ;2 - 180 = 001C sfx_battery = $1c ;3 - 181 = 001D sfx_white_flag = $1d ;4 - 182 = 001E sfx_long_barrel = $1e - 183 = 001F sfx_tank_move = $1f - 184 = 002B sfx_auto_defense= $2b - 185 = 002C sfx_lazy_boys = $2c - 186 ;-------------------------------- - 187 ; RMT songs (lines) - 188 ;-------------------------------- - 189 = 0000 song_silencio = $00 - 190 = 0002 song_main_menu = $02 - 191 = 0006 song_ingame = $06 - 192 = 000B song_round_over = $0b - 193 = 000E song_ending_looped = $0e - 194 = 001B song_supermarket = $1b - 195 = 001D song_inventory = $1d - 36 ;--------------------------------------------------- - 37 - 38 = 0058 FirstZpageVariable = $58 ; $57 - 39 080E .zpvar DliColorBack .byte = FirstZpageVariable - 40 080E .zpvar GradientNr .byte - 41 080E .zpvar GradientColors .word - 42 080E .zpvar WindChangeInRound .byte ; wind change after each turn (not round only) flag - (0 - round only, >0 - each turn) - 43 080E .zpvar JoystickNumber .byte - 44 080E .zpvar LazyFlag .byte ; 7 bit - run Lazy Darwin, 6 bit - run Lazy Boy or Darwin (!) after inventory, 0 - nothing - 45 080E .zpvar SpyHardFlag .byte ; >$7f - run SpyHard after inventory - 46 080E .zpvar Vdebug .byte ; "visual debug" flag ($00 - off, $ff - on) - 47 080E .zpvar xdraw .word ;= $64 ;variable X for plot - 48 080E .zpvar ydraw .word ;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) - 49 080E .zpvar xbyte .word - 50 080E .zpvar ybyte .word - 51 080E .zpvar CharCode .byte - 52 080E .zpvar fontind .word - 53 080E .zpvar tanknr .byte - 54 080E .zpvar TankSequencePointer .byte - 55 080E .zpvar oldplot .word - 56 080E .zpvar xc .word - 57 080E .zpvar temp .word ;temporary word for the most embeded loops only - 58 080E .zpvar temp2 .word ;same as above - 59 080E .zpvar modify .word ;origially used to replace self-modyfying code - 60 080E .zpvar tempXROLLER .word ;same as above for XROLLER routine (used also in result display routine) - 61 080E .zpvar xtempDRAW .word ;same as above for XDRAW routine - 62 080E .zpvar ytempDRAW .word ;same as above for XDRAW routine - 63 080E .zpvar tempor2 .word - 64 080E .zpvar CreditsVScrol .byte - 65 ;--------------temps used in circle routine - 66 080E .zpvar xi .word ;X (word) in draw routine - 67 080E .zpvar fx .byte - 68 080E .zpvar yi .word ;Y (word) in draw routine - 69 080E .zpvar fy .byte - 70 080E .zpvar xk .word - 71 080E .zpvar fs .byte - 72 080E .zpvar yc .byte ;ycircle - temporary for circle - 73 080E .zpvar dx .word - 74 080E .zpvar dy .word - 75 080E .zpvar dd .word - 76 080E .zpvar di .word - 77 080E .zpvar dp .word - 78 ;---------------------------- - 79 080E .zpvar UnderTank1 .byte - 80 080E .zpvar UnderTank2 .byte - 81 ;---------------------------- - 82 080E .zpvar TestFlightFlag .byte ; For AI test flights ($ff - test, $00 - standard shoot flight) - 83 080E .zpvar weaponPointer .word - 84 080E .zpvar dliCounter .byte - 85 080E .zpvar pressTimer .byte - 86 080E .zpvar NTSCcounter .byte - 87 080E .zpvar IsEndOfTheFallFlag .byte ; for small speedup ground falling - 88 080E .zpvar sfx_effect .byte - 89 080E .zpvar RMT_blocked .byte - 90 080E .zpvar ScrollFlag .byte - 91 080E .zpvar SkStatSimulator .byte - 92 080E .zpvar FloatingAlt .byte ; floating tank altitude - 93 080E .zpvar OverTankDir .byte ; (0 go right, $ff go left) direction of bypassing tanks on screen - 94 - 95 ; --------------OPTIMIZATION VARIABLES-------------- - 96 080E .zpvar Force .word - 97 080E .zpvar Force_ .byte ; Force is 3 bytes long - 98 080E .zpvar Angle .byte - 99 080E .zpvar Parachute .byte ; are you insured with parachute? - 100 080E .zpvar color .byte - 101 080E .zpvar Erase .byte ; if 1 only mask of the character is printed - 102 ; on the graphics screen. if 0 character is printed normally - 103 080E .zpvar radius .byte - 104 080E .zpvar decimal .word - 105 080E .zpvar NumberOfPlayers .byte ;current number of players (counted from 1) - 106 080E .zpvar Counter .byte ;temporary Counter for outside loops - 107 080E .zpvar ExplosionRadius .byte - 108 080E .zpvar FunkyBombCounter .byte - 109 080E .zpvar ResultY .byte - 110 080E .zpvar xcircle .word - 111 080E .zpvar ycircle .word - 112 080E .zpvar vy .word - 113 080E .zpvar vy_ .word ; 4 bytes - 114 080E .zpvar vx .word - 115 080E .zpvar vx_ .word ; 4 bytes - 116 080E .zpvar HitFlag .byte ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank - 117 080E .zpvar PositionOnTheList .byte ; pointer position on the list being displayed - 118 080E .zpvar XHit .word - 119 080E .zpvar delta .word - 120 080E .zpvar HowMuchToFall .byte - 121 080E .zpvar magic .word - 122 080E .zpvar xtraj .word - 123 080E .zpvar xtraj_ .byte ; 3 bytes - 124 080E .zpvar ytraj .word - 125 080E .zpvar ytraj_ .byte ; 3 bytes - 126 080E .zpvar Wind .word - 127 080E .zpvar Wind_ .word ; 4 bytes - 128 080E .zpvar RangeLeft .word - 129 080E .zpvar RangeRight .word - 130 080E .zpvar NewAngle .byte - 131 080E .zpvar escFlag .byte - 132 080E .zpvar LineYdraw .byte - 133 080E .zpvar LineXdraw .word - 134 080E .zpvar plot4x4color .byte ; $00 / $ff - 135 080E .zpvar Multiplier .word - 136 080E .zpvar Multiplier_ .byte ; 3 bytes - 137 080E .zpvar HowToDraw .byte - 138 080E .zpvar gravity .byte - 139 080E .zpvar LineLength .word - 140 080E .zpvar tracerflag .byte - 141 080E .zpvar isInventory .byte - 142 080E .zpvar DifficultyLevel .byte - 143 080E .zpvar goleft .byte - 144 080E .zpvar OffsetDL1 .byte - 145 080E .zpvar L1 .byte - 146 = 00B1 HotNapalmFlag = FunkyBombCounter ; reuse variable! - 147 ;* RMT ZeroPage addresses in artwork/sfx/rmtplayr.a65 - 148 - 149 = 0076 displayposition = modify - 150 = 00B3 LineAddress4x4 = xcircle - 151 - 152 ;----------------------------------------------- - 153 ; libraries - 154 ;----------------------------------------------- - 155 080E icl 'C64/lib/C64_ATARISYS.ASM' -Source: C64_ATARISYS.ASM - 1 ;**************************************************************************** - 2 ;* ATARI PERSONAL COMPUTER * - 3 ;* SYSTEM EQUATES * - 4 ;**************************************************************************** - 5 - 6 = 0002 FAKEADDR EQU $0002 - 7 - 8 = 0002 ATRACT EQU FAKEADDR - 9 = 0012 RTCLOK EQU $12 ;REAL TIME CLOCK - 10 ; - 11 ; PAGE TWO RAM ASSIGNMENTS - 12 ; - 13 = 0002 VDSLST EQU FAKEADDR ;DSP LIST NMI VECTOR - 14 = 0002 VPRCED EQU FAKEADDR ;PROCEED IRQ VECTOR - 15 = 0002 VINTER EQU FAKEADDR ;INTERUPT IRQ VECTOR - 16 = 0002 VBREAK EQU FAKEADDR ;BRK INST IRQ VECTOR - 17 = 0002 VKEYBD EQU FAKEADDR ;POKEY KB IRQ VECTOR - 18 = 0002 VSERIN EQU FAKEADDR ;POKEY INPUT RDY IRQ - 19 = 0002 VSEROR EQU FAKEADDR ;POKEY OUTPUT RDY - 20 = 0002 VSEROC EQU FAKEADDR ;POKEY OUTPUT DONE - 21 = 0002 VTIMR1 EQU FAKEADDR ;POKEY TIMER 1 IRQ - 22 = 0002 VTIMR2 EQU FAKEADDR ;POKEY TIMER 2 IRQ - 23 = 0002 VTIMR4 EQU FAKEADDR ;POKEY TIMER 4 IRQ - 24 = 0002 VIMIRQ EQU FAKEADDR ;IMMED IRQ VECTOR - 25 = 0002 CDTMV1 EQU FAKEADDR ;COUNT DOWN TIMER 1 - 26 = 0002 CDTMV2 EQU FAKEADDR ;COUNT DOWN TIMER 2 - 27 = 0002 CDTMV3 EQU FAKEADDR ;COUNT DOWN TIMER 3 - 28 = 0002 CDTMV4 EQU FAKEADDR ;COUNT DOWN TIMER 4 - 29 = 0002 CDTMV5 EQU FAKEADDR ;COUNT DOWN TIMER 5 - 30 = 0002 VVBLKI EQU FAKEADDR ;IMM VBLK NMI VECTOR - 31 = 0002 VVBLKD EQU FAKEADDR ;DEF VBLK NMI VECTOR - 32 = 0002 CDTMA1 EQU FAKEADDR ;CDTMV1 JSR ADDRESS - 33 = 0002 CDTMA2 EQU FAKEADDR ;CDTMV2 JSR ADDRESS - 34 = 0002 CDTMF3 EQU FAKEADDR ;CDTMV3 FLAG - 35 = 0002 SRTIMR EQU FAKEADDR ;SOFTWARE REPEAT TMR - 36 = 0002 CDTMF4 EQU FAKEADDR ;CDTMV4 FLAG - 37 = 0002 INTEMP EQU FAKEADDR ;IAN'S TEMP - 38 = 0002 CDTMF5 EQU FAKEADDR ;CDTMV5 FLAG - 39 = 0002 DMACTLS EQU FAKEADDR ;SAVE DMACTL REG - 40 = 0002 DLPTRS EQU FAKEADDR ;SAVE DISP LIST LO - 41 ;SDLSTH EQU $0231 ;SAVE DISP LIST HI - 42 = 0002 SSKCTL EQU FAKEADDR ;SKCTL REGISTER RAM - 43 = 0002 LCOUNT EQU FAKEADDR ;LOADER TEMP - 44 = 0002 LPENH EQU FAKEADDR ;LIGHT PEN HORIZONTAL - 45 = 0002 LPENV EQU FAKEADDR ;LIGHT PEN VERTICAL - 46 = 0002 BRKKY EQU FAKEADDR ;BREAK KEY VECTOR - 47 = 0002 RELADR EQU FAKEADDR ;LOADER REL ADDR - 48 = 0002 CDEVIC EQU FAKEADDR ;COMMAND BUFFER-DEV - 49 = 0002 CCOMND EQU FAKEADDR ;COMMAND BUFFER-CMND - 50 = 0002 CAUX1 EQU FAKEADDR ;COMMAND BUFFER AUX1 - 51 = 0002 CAUX2 EQU FAKEADDR ;COMMAND BUFFER AUX2 - 52 ;TEMP EQU $023E ;TEMPORARY RAM CELL - 53 = 0002 ERRFLG EQU FAKEADDR ;DEVICE ERROR FLAG - 54 = 0002 DFLAGS EQU FAKEADDR ;DISK FLAGS(SECTOR1) - 55 = 0002 DBSECT EQU FAKEADDR ;# DISK BOOT SECTORS - 56 = 0002 BOOTAD EQU FAKEADDR ;DISK BOOT ADDRESS - 57 = 0002 COLDST EQU FAKEADDR ;COLDSTART FLAG 1=CS - 58 = 0002 RECLEN EQU FAKEADDR ;LOADER LENGTH - 59 = 0002 DSKTIM EQU FAKEADDR ;DISK TIME OUT REG - 60 = 0002 VSFLAG EQU FAKEADDR ;FINE SCROLL TEMP - 61 = 0002 KEYDIS EQU FAKEADDR ;KEY DISABLE FLAG - 62 = 0002 FINE EQU FAKEADDR ;FINE SCROLL ENABLE(A1200) - 63 = 0002 GPRIOR EQU FAKEADDR ;GLOBAL PRIORITY - 64 = 0002 PADDL0 EQU FAKEADDR ;POT 0 RAM CELL - 65 = 0002 PADDL1 EQU FAKEADDR - 66 = 0002 PADDL2 EQU FAKEADDR - 67 = 0002 PADDL3 EQU FAKEADDR - 68 = 0002 STICK0 EQU FAKEADDR ;JOYSTICK 0 RAM CELL - 69 = 0002 STICK1 EQU FAKEADDR - 70 = 0002 PTRIG0 EQU FAKEADDR ;PADDLE TRIGGER 0 - 71 = 0002 PTRIG1 EQU FAKEADDR - 72 = 0002 PTRIG2 EQU FAKEADDR - 73 = 0002 PTRIG3 EQU FAKEADDR - 74 = 0002 STRIG0 EQU FAKEADDR ;JOYSTICK TRIGGER 0 - 75 = 0002 STRIG1 EQU FAKEADDR - 76 = 0002 HIBYTE EQU FAKEADDR ;LOADER - 77 = 0002 WMODE EQU FAKEADDR ;CASSETTE R/W MODE - 78 = 0002 BLIM EQU FAKEADDR ;CASSETTE RECORD SIZE - 79 = 0002 IMASK EQU FAKEADDR - 80 = 0002 JVECK EQU FAKEADDR ;JUMP VECTOR - 81 = 0002 NEWADR EQU FAKEADDR ;LOADER NEW ADDRESS - 82 = 0002 TXTROW EQU FAKEADDR ;TEXT ROWCRS - 83 = 0002 TXTCOL EQU FAKEADDR ;TEXT COLCRS - 84 = 0002 TINDEX EQU FAKEADDR ;TEXT INDEX - 85 = 0002 TXTMSC EQU FAKEADDR ;TEXT WINDOW MEM ADD - 86 = 0002 TXTOLD EQU FAKEADDR ;TEXT OLDROW & COL - 87 = 0002 CRETRY EQU FAKEADDR ;# COMMAND RETRIES - 88 = 0002 HOLD3 EQU FAKEADDR - 89 = 0002 SUBTMP EQU FAKEADDR - 90 = 0002 HOLD2 EQU FAKEADDR - 91 = 0002 DMASK EQU FAKEADDR ;PIXEL LOCATION MASK - 92 = 0002 TMPLBT EQU FAKEADDR - 93 = 0002 ESCFLG EQU FAKEADDR ;ESCAPE FLAG - 94 = 0002 TABMAP EQU FAKEADDR ;TAB STOP MAP - 95 = 0002 LOGMAP EQU FAKEADDR ;LINE START BIT MAP - 96 = 0002 INVFLG EQU FAKEADDR ;INVERSE VIDEO FLAG - 97 = 0002 FILFLG EQU FAKEADDR ;FILL FLAG FOR DRAW - 98 = 0002 TMPROW EQU FAKEADDR - 99 = 0002 TMPCOL EQU FAKEADDR - 100 = 0002 SCRFLG EQU FAKEADDR ;SET IF SCROLLING - 101 = 0002 HOLD4 EQU FAKEADDR ;TEMP USED BY DRAW - 102 = 0002 DRETRY EQU FAKEADDR ;# OF DEVICE RETRIES - 103 = 0002 SHFLOK EQU FAKEADDR ;SHIFT/CTL LOCK FLAG - 104 = 0002 BOTSCR EQU FAKEADDR ;BOTTOM OF SCREEN - 105 = 0002 PCOLR0 EQU FAKEADDR ;P0 COLOR - 106 = 0002 PCOLR1 EQU FAKEADDR ;P1 COLOR - 107 = 0002 PCOLR2 EQU FAKEADDR ;P2 COLOR - 108 = 0002 PCOLR3 EQU FAKEADDR ;P3 COLOR - 109 = 0002 COLOR0 EQU FAKEADDR ;COLOR 0 - 110 = 0002 COLOR1 EQU FAKEADDR - 111 = 0002 COLOR2 EQU FAKEADDR - 112 = 0002 COLOR3 EQU FAKEADDR - 113 = 0002 COLOR4 EQU FAKEADDR - 114 = 0002 COLBAKS EQU COLOR4 - 115 = 0002 CHBAS EQU FAKEADDR ;CHBAS REGISTER RAM - 116 ; - 117 ; COLLEEN MNEMONICS - 118 ; - 119 ; --------------------------------------------------------------------------- - 120 = 0002 POKEY EQU FAKEADDR - 121 ; --------------------------------------------------------------------------- - 122 ; - 123 ; READ - 124 ; - 125 = 0002 POT0 EQU POKEY+$00 - 126 = 0002 POT1 EQU POKEY+$00 - 127 = 0002 POT2 EQU POKEY+$00 - 128 = 0002 POT3 EQU POKEY+$00 - 129 = 0002 POT4 EQU POKEY+$00 - 130 = 0002 POT5 EQU POKEY+$00 - 131 = 0002 POT6 EQU POKEY+$00 - 132 = 0002 POT7 EQU POKEY+$00 - 133 = 0002 ALLPOT EQU POKEY+$00 - 134 = 0002 KBCODE EQU POKEY+$00 - 135 ; !!!!! - 136 ;RANDOM EQU POKEY+$00 - 137 ; - 138 = 0002 POTGO EQU POKEY+$00 - 139 = 0002 SERIN EQU POKEY+$00 - 140 = 0002 IRQST EQU POKEY+$00 - 141 = 0002 SKSTAT EQU POKEY+$00 - 142 ; - 143 ; WRITE - 144 ; - 145 = 0002 AUDF1 EQU POKEY+$00 - 146 = 0002 AUDC1 EQU POKEY+$00 - 147 = 0002 AUDF2 EQU POKEY+$00 - 148 = 0002 AUDC2 EQU POKEY+$00 - 149 = 0002 AUDF3 EQU POKEY+$00 - 150 = 0002 AUDC3 EQU POKEY+$00 - 151 = 0002 AUDF4 EQU POKEY+$00 - 152 = 0002 AUDC4 EQU POKEY+$00 - 153 = 0002 AUDCTL EQU POKEY+$00 - 154 = 0002 STIMER EQU POKEY+$00 - 155 = 0002 SKRES EQU POKEY+$00 - 156 = 0002 SEROUT EQU POKEY+$00 - 157 = 0002 IRQEN EQU POKEY+$00 - 158 = 0002 SKCTL EQU POKEY+$00 - 159 ; - 160 ; - 161 ; - 162 ; --------------------------------------------------------------------------- - 163 = 0002 GTIA EQU FAKEADDR - 164 ; --------------------------------------------------------------------------- - 165 ; - 166 ; WRITE - 167 ; - 168 = 0002 HPOSP0 EQU GTIA+$00 - 169 = 0002 HPOSP1 EQU GTIA+$00 - 170 = 0002 HPOSP2 EQU GTIA+$00 - 171 = 0002 HPOSP3 EQU GTIA+$00 - 172 = 0002 HPOSM0 EQU GTIA+$00 - 173 = 0002 HPOSM1 EQU GTIA+$00 - 174 = 0002 HPOSM2 EQU GTIA+$00 - 175 = 0002 HPOSM3 EQU GTIA+$00 - 176 = 0002 SIZEP0 EQU GTIA+$00 - 177 = 0002 SIZEP1 EQU GTIA+$00 - 178 = 0002 SIZEP2 EQU GTIA+$00 - 179 = 0002 SIZEP3 EQU GTIA+$00 - 180 = 0002 SIZEM EQU GTIA+$00 - 181 = 0002 GRAFP0 EQU GTIA+$00 - 182 = 0002 GRAFP1 EQU GTIA+$00 - 183 = 0002 GRAFP2 EQU GTIA+$00 - 184 = 0002 GRAFP3 EQU GTIA+$00 - 185 = 0002 GRAFM EQU GTIA+$00 - 186 = 0002 COLPM0 EQU GTIA+$00 - 187 = 0002 COLPM1 EQU GTIA+$00 - 188 = 0002 COLPM2 EQU GTIA+$00 - 189 = 0002 COLPM3 EQU GTIA+$00 - 190 = 0002 COLPF0 EQU GTIA+$00 - 191 = 0002 COLPF1 EQU GTIA+$00 - 192 = 0002 COLPF2 EQU GTIA+$00 - 193 = 0002 COLPF3 EQU GTIA+$00 - 194 = 0002 COLBAK EQU GTIA+$00 - 195 = 0002 PRIOR EQU GTIA+$00 - 196 = 0002 VDELAY EQU GTIA+$00 - 197 = 0002 GRACTL EQU GTIA+$00 - 198 = 0002 HITCLR EQU GTIA+$00 - 199 = 0002 CONSOL EQU GTIA+$00 - 200 ; - 201 ; READ - 202 ; - 203 = 0002 M0PF EQU GTIA+$00 - 204 = 0002 M1PF EQU GTIA+$00 - 205 = 0002 M2PF EQU GTIA+$00 - 206 = 0002 M3PF EQU GTIA+$00 - 207 = 0002 P0PF EQU GTIA+$00 - 208 = 0002 P1PF EQU GTIA+$00 - 209 = 0002 P2PF EQU GTIA+$00 - 210 = 0002 P3PF EQU GTIA+$00 - 211 = 0002 M0PL EQU GTIA+$00 - 212 = 0002 M1PL EQU GTIA+$00 - 213 = 0002 M2PL EQU GTIA+$00 - 214 = 0002 M3PL EQU GTIA+$00 - 215 = 0002 P0PL EQU GTIA+$00 - 216 = 0002 P1PL EQU GTIA+$00 - 217 = 0002 P2PL EQU GTIA+$00 - 218 = 0002 P3PL EQU GTIA+$00 - 219 = 0002 TRIG0 EQU GTIA+$00 - 220 = 0002 TRIG1 EQU GTIA+$00 - 221 = 0002 TRIG2 EQU GTIA+$00 - 222 = 0002 TRIG3 EQU GTIA+$00 - 223 = 0002 PAL EQU GTIA+$00 - 224 ; - 225 ; - 226 ; --------------------------------------------------------------------------- - 227 = 0002 ANTIC EQU FAKEADDR - 228 ; --------------------------------------------------------------------------- - 229 ; - 230 = 0002 DMACTL EQU ANTIC+$00 - 231 = 0002 CHACTL EQU ANTIC+$00 - 232 = 0002 DLPTR EQU ANTIC+$00 - 233 ;DLISTH EQU ANTIC+$00 - 234 = 0002 HSCROL EQU ANTIC+$00 - 235 = 0002 VSCROL EQU ANTIC+$00 - 236 = 0002 PMBASE EQU ANTIC+$00 - 237 = 0002 CHBASE EQU ANTIC+$00 - 238 = 0002 WSYNC EQU ANTIC+$00 - 239 ; !!!! - 240 = 0002 VCOUNT EQU ANTIC+$00 - 241 ; ---- - 242 = 0002 PENH EQU ANTIC+$00 - 243 = 0002 PENV EQU ANTIC+$00 - 244 = 0002 NMIEN EQU ANTIC+$00 - 245 = 0002 NMIRES EQU ANTIC+$00 - 246 = 0002 NMIST EQU ANTIC+$00 - 247 ; - 248 ; - 249 ; --------------------------------------------------------------------------- - 250 = 0002 PIA EQU FAKEADDR - 251 ; --------------------------------------------------------------------------- - 252 ; - 253 = 0002 PORTA EQU PIA+0 - 254 = 0002 PORTB EQU PIA+0 - 255 = 0002 PACTL EQU PIA+0 - 256 = 0002 PBCTL EQU PIA+0 - 257 ; - 258 ; --------------------------------------------------------------------------- - 259 ; Atari ANTIC chip display list equates - 260 ; --------------------------------------------------------------------------- - 261 ; - 262 = 0001 JUMP EQU $01 ; display list jump instruction (3 byte) - 263 = 0041 JVB EQU $41 ; display list jump and wait for vblank instruction (3) - 264 ; - 265 = 0010 SCH EQU $10 ; display list horizontal scrolling - 266 = 0020 SCV EQU $20 ; display list vertical scrolling - 267 = 0040 LMS EQU $40 ; display list load memory scan instruction (3 byte) - 268 = 0080 DLII EQU $80 ; display list interrupt instruction - 269 ; - 270 = 0000 SKIP1 EQU $00 ; display list skip 1 scan line instruction - 271 = 0010 SKIP2 EQU $10 ; display list skip 2 scan lines instruction - 272 = 0020 SKIP3 EQU $20 ; display list skip 3 scan lines instruction - 273 = 0030 SKIP4 EQU $30 ; display list skip 4 scan lines instruction - 274 = 0040 SKIP5 EQU $40 ; display list skip 5 scan lines instruction - 275 = 0050 SKIP6 EQU $50 ; display list skip 6 scan lines instruction - 276 = 0060 SKIP7 EQU $60 ; display list skip 7 scan lines instruction - 277 = 0070 SKIP8 EQU $70 ; display list skip 8 scan lines instruction - 278 ; - 279 = 0002 MODE2 EQU $02 ; display list mode 2 - 280 = 0004 MODE4 EQU $04 ; display list mode 4 - 281 = 0008 MODE8 EQU $08 ; display list mode 8 - 282 = 000E MODEE EQU $0E ; display list mode E - 283 = 000F MODEF EQU $0F ; display list mode F - 284 - 285 ; --------------------------------------------------------------------------- - 286 ; KBCODEs - 287 ; --------------------------------------------------------------------------- - 288 080E .enum @kbcode - 289 = 00FF _none = 255 - 290 = 001C _esc = 28 - 291 = 001F _1 = 31 - 292 = 001E _2 = 30 - 293 = 001A _3 = 26 - 294 = 0018 _4 = 24 - 295 = 001D _5 = 29 - 296 = 001B _6 = 27 - 297 = 0033 _7 = 51 - 298 = 0035 _8 = 53 - 299 = 0030 _9 = 48 - 300 = 0032 _0 = 50 - 301 = 0036 _lt = 54 - 302 = 0037 _gt = 55 - 303 = 0034 _del = 52 - 304 = 002C _tab = 44 - 305 = 002F _Q = 47 - 306 = 002E _W = 46 - 307 = 002A _E = 42 - 308 = 0028 _R = 40 - 309 = 002D _T = 45 - 310 = 002B _Y = 43 - 311 = 000B _U = 11 - 312 = 000D _I = 13 - 313 = 0008 _O = 8 - 314 = 000A _P = 10 - 315 = 000E _min = 14 - 316 = 000E _up = 14 ; cursor function - 317 = 000F _eq = 15 - 318 = 000F _down = 15 ; cursor function - 319 = 000C _ret = 12 - 320 = 003F _A = 63 - 321 = 003E _S = 62 - 322 = 003A _D = 58 - 323 = 0038 _F = 56 - 324 = 003D _G = 61 - 325 = 0039 _H = 57 - 326 = 0001 _J = 1 - 327 = 0005 _K = 5 - 328 = 0000 _L = 0 - 329 = 0002 _semicolon = 2 - 330 = 0006 _plus = 6 - 331 = 0006 _left = 6 ; cursor function - 332 = 0007 _asterisk = 7 - 333 = 0007 _right = 7 ; cursor function - 334 = 003C _caps = 60 - 335 = 0017 _Z = 23 - 336 = 0016 _X = 22 - 337 = 0012 _C = 18 - 338 = 0010 _V = 16 - 339 = 0015 _B = 21 - 340 = 0024 _N = 36 - 341 = 0025 _M = 37 - 342 = 0020 _comma = 32 - 343 = 0022 _dot = 34 - 344 = 0026 _slash = 38 - 345 = 0027 _atari = 39 - 346 = 0011 _help = 17 - 347 = 0003 _F1 = 3 - 348 = 0004 _F2 = 4 - 349 = 0013 _F3 = 19 - 350 = 0014 _F4 = 20 - 351 = 0021 _space = 33 - 352 .ende - 352 = 0058 DLICOLORBACK - 352 = 0059 GRADIENTNR - 352 = 005A GRADIENTCOLORS - 352 = 005C WINDCHANGEINROUND - 352 = 005D JOYSTICKNUMBER - 352 = 005E LAZYFLAG - 352 = 005F SPYHARDFLAG - 352 = 0060 VDEBUG - 352 = 0061 XDRAW - 352 = 0063 YDRAW - 352 = 0065 XBYTE - 352 = 0067 YBYTE - 352 = 0069 CHARCODE - 352 = 006A FONTIND - 352 = 006C TANKNR - 352 = 006D TANKSEQUENCEPOINTER - 352 = 006E OLDPLOT - 352 = 0070 XC - 352 = 0072 TEMP - 352 = 0074 TEMP2 - 352 = 0076 MODIFY - 352 = 0078 TEMPXROLLER - 352 = 007A XTEMPDRAW - 352 = 007C YTEMPDRAW - 352 = 007E TEMPOR2 - 352 = 0080 CREDITSVSCROL - 352 = 0081 XI - 352 = 0083 FX - 352 = 0084 YI - 352 = 0086 FY - 352 = 0087 XK - 352 = 0089 FS - 352 = 008A YC - 352 = 008B DX - 352 = 008D DY - 352 = 008F DD - 352 = 0091 DI - 352 = 0093 DP - 352 = 0095 UNDERTANK1 - 352 = 0096 UNDERTANK2 - 352 = 0097 TESTFLIGHTFLAG - 352 = 0098 WEAPONPOINTER - 352 = 009A DLICOUNTER - 352 = 009B PRESSTIMER - 352 = 009C NTSCCOUNTER - 352 = 009D ISENDOFTHEFALLFLAG - 352 = 009E SFX_EFFECT - 352 = 009F RMT_BLOCKED - 352 = 00A0 SCROLLFLAG - 352 = 00A1 SKSTATSIMULATOR - 352 = 00A2 FLOATINGALT - 352 = 00A3 OVERTANKDIR - 352 = 00A4 FORCE - 352 = 00A6 FORCE_ - 352 = 00A7 ANGLE - 352 = 00A8 PARACHUTE - 352 = 00A9 COLOR - 352 = 00AA ERASE - 352 = 00AB RADIUS - 352 = 00AC DECIMAL - 352 = 00AE NUMBEROFPLAYERS - 352 = 00AF COUNTER - 352 = 00B0 EXPLOSIONRADIUS - 352 = 00B1 FUNKYBOMBCOUNTER - 352 = 00B2 RESULTY - 352 = 00B3 XCIRCLE - 352 = 00B5 YCIRCLE - 352 = 00B7 VY - 352 = 00B9 VY_ - 352 = 00BB VX - 352 = 00BD VX_ - 352 = 00BF HITFLAG - 352 = 00C0 POSITIONONTHELIST - 352 = 00C1 XHIT - 352 = 00C3 DELTA - 352 = 00C5 HOWMUCHTOFALL - 352 = 00C6 MAGIC - 352 = 00C8 XTRAJ - 352 = 00CA XTRAJ_ - 352 = 00CB YTRAJ - 352 = 00CD YTRAJ_ - 352 = 00CE WIND - 352 = 00D0 WIND_ - 352 = 00D2 RANGELEFT - 352 = 00D4 RANGERIGHT - 352 = 00D6 NEWANGLE - 352 = 00D7 ESCFLAG - 352 = 00D8 LINEYDRAW - 352 = 00D9 LINEXDRAW - 352 = 00DB PLOT4X4COLOR - 352 = 00DC MULTIPLIER - 352 = 00DE MULTIPLIER_ - 352 = 00DF HOWTODRAW - 352 = 00E0 GRAVITY - 352 = 00E1 LINELENGTH - 352 = 00E3 TRACERFLAG - 352 = 00E4 ISINVENTORY - 352 = 00E5 DIFFICULTYLEVEL - 352 = 00E6 GOLEFT - 352 = 00E7 OFFSETDL1 - 352 = 00E8 L1 - 156 080E icl 'C64/lib/C64SYS.ASM' -Source: C64SYS.ASM - 1 = D000 vic_spr0_x = $D000 - 2 = D001 vic_spr0_y = $D001 - 3 = D002 vic_spr1_x = $D002 - 4 = D003 vic_spr1_y = $D003 - 5 = D004 vic_spr2_x = $D004 - 6 = D005 vic_spr2_y = $D005 - 7 = D006 vic_spr3_x = $D006 - 8 = D007 vic_spr3_y = $D007 - 9 = D008 vic_spr4_x = $D008 - 10 = D009 vic_spr4_y = $D009 - 11 = D00A vic_spr5_x = $D00A - 12 = D00B vic_spr5_y = $D00B - 13 = D00C vic_spr6_x = $D00C - 14 = D00D vic_spr6_y = $D00D - 15 = D00E vic_spr7_x = $D00E - 16 = D00F vic_spr7_y = $D00F - 17 = D010 vic_spr_hi_x = $D010 - 18 = D011 vic_cr1 = $D011 - 19 = D012 vic_raster = $D012 - 20 = D013 vic_lp_x = $D013 - 21 = D014 vic_lp_y = $D014 - 22 = D015 vic_spr_ena = $D015 - 23 = D016 vic_cr2 = $D016 - 24 = D017 vic_spr_exp_y = $D017 - 25 = D018 vic_mem = $D018 - 26 = D019 vic_irq = $D019 - 27 = D01A vic_irq_ena = $D01A - 28 = D01B vic_spr_dp = $D01B - 29 = D01C vic_spr_mcolor = $D01C - 30 = D01D vic_spr_exp_x = $D01D - 31 = D01E vic_spr_ss_col = $D01E - 32 = D01F vic_spr_sd_col = $D01F - 33 = D020 vic_border = $D020 - 34 = D021 vic_bg_color0 = $D021 - 35 = D022 vic_bg_color1 = $D022 - 36 = D023 vic_bg_color2 = $D023 - 37 = D024 vic_bg_color3 = $D024 - 38 = D025 vic_spr_color1 = $D025 - 39 = D026 vic_spr_color2 = $D026 - 40 = D027 vic_spr0_color = $D027 - 41 = D028 vic_spr1_color = $D028 - 42 = D029 vic_spr2_color = $D029 - 43 = D02A vic_spr3_color = $D02A - 44 = D02B vic_spr4_color = $D02B - 45 = D02C vic_spr5_color = $D02C - 46 = D02D vic_spr6_color = $D02D - 47 = D02E vic_spr7_color = $D02E - 48 - 49 = D41B RANDOM = $D41B - 157 080E icl 'C64/lib/MACRO.ASM' -Source: MACRO.ASM - 1 - 2 - 3 - 4 .macro basic_start(addr) - 5 - 6 .word upstartEnd // link address - 7 .word 10 // line num - 8 .byte $9e // sys - 9 - 10 ?a=0 - 11 ?b=0 - 12 ?c=0 - 13 ?d=0 - 14 ?e=0 - 15 - 16 ?v = %%addr - 17 - 18 ift ?v>=10000 - 19 ?a=?v/10000 - 20 ?v=?v-(?a*10000) - 21 eif - 22 - 23 ift ?v>=1000 - 24 ?b=?v/1000 - 25 ?v=?v-(?b*1000) - 26 eif - 27 - 28 ift ?v>=100 - 29 ?c=?v/100 - 30 ?v=?v-(?c*100) - 31 eif - 32 - 33 ift ?v>=10 - 34 ?d=?v/10 - 35 ?v=?v-(?d*10) - 36 eif - 37 - 38 ?e=?v%10 - 39 - 40 dta ?a+$30,?b+$30,?c+$30,?d+$30,?e+$30 - 41 - 42 .byte 0 - 43 upstartEnd - 44 .word 0 // empty link signals the end of the program - 45 - 46 .endm - 47 - 48 - 49 // - 50 // Switch bank in VIC-II - 51 // - 52 // Args: - 53 // bank: bank number to switch to. Valid values: 0-3. - 54 // - 55 .macro SwitchVICBank(bank) - 56 // - 57 // The VIC-II chip can only access 16K bytes at a time. In order to - 58 // have it access all of the 64K available, we have to tell it to look - 59 // at one of four banks. - 60 // - 61 // This is controller by bits 0 and 1 in $dd00 (PORT A of CIA #2). - 62 // - 63 // +------+-------+----------+-------------------------------------+ - 64 // | BITS | BANK | STARTING | VIC-II CHIP RANGE | - 65 // | | | LOCATION | | - 66 // +------+-------+----------+-------------------------------------+ - 67 // | 00 | 3 | 49152 | ($C000-$FFFF)* | - 68 // | 01 | 2 | 32768 | ($8000-$BFFF) | - 69 // | 10 | 1 | 16384 | ($4000-$7FFF)* | - 70 // | 11 | 0 | 0 | ($0000-$3FFF) (DEFAULT VALUE) | - 71 // +------+-------+----------+-------------------------------------+ - 72 ?bits=%11 - 73 - 74 ift (%%bank==0) - 75 ?bits=%11 - 76 eli (%%bank==1) - 77 ?bits=%10 - 78 eli (%%bank==2) - 79 ?bits=%01 - 80 eli (%%bank==3) - 81 ?bits=%00 - 82 eif - 83 - 84 // - 85 // Set Data Direction for CIA #2, Port A to output - 86 // - 87 lda $dd02 - 88 and #%11111100 // Mask the bits were interested in. - 89 ora #$03 // Set bits 0 and 1. - 90 sta $dd02 - 91 - 92 // - 93 // Tell VIC-II to switch to bank - 94 // - 95 lda $dd00 - 96 and #%11111100 - 97 ora #?bits - 98 sta $dd00 - 99 .endm - 100 - 101 - 102 // - 103 // Enter hires bitmap mode (a.k.a. standard bitmap mode) - 104 // - 105 .macro SetHiresBitmapMode - 106 // - 107 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) - 108 // - 109 lda $d011 - 110 and #%10111111 - 111 ora #%00100000 - 112 sta $d011 - 113 - 114 // - 115 // Clear multi color mode (bit 4) - 116 // - 117 lda $d016 - 118 and #%11101111 - 119 sta $d016 - 120 .endm - 121 - 122 - 123 // - 124 // Enter hires bitmap mode (a.k.a. standard bitmap mode) - 125 // - 126 .macro SetMulticolorBitmapMode - 127 // - 128 // Clear extended color mode (bit 6) and set bitmap mode (bit 5) - 129 // - 130 lda $d011 - 131 and #%10111111 - 132 ora #%00100000 - 133 sta $d011 - 134 - 135 // - 136 // Clear multi color mode (bit 4) - 137 // - 138 lda $d016 - 139 ora #%00010000 - 140 sta $d016 - 141 .endm - 142 - 143 - 144 // - 145 // Switch location of screen memory. - 146 // - 147 // Args: - 148 // address: Address relative to current VIC-II bank base address. - 149 // Valid values: $0000-$3c00. Must be a multiple of $0400. - 150 // - 151 .macro SetScreenMemory(address) - 152 // - 153 // The most significant nibble of $D018 selects where the screen is - 154 // located in the current VIC-II bank. - 155 // - 156 // +------------+-----------------------------+ - 157 // | | LOCATION* | - 158 // | BITS +---------+-------------------+ - 159 // | | DECIMAL | HEX | - 160 // +------------+---------+-------------------+ - 161 // | 0000XXXX | 0 | $0000 | - 162 // | 0001XXXX | 1024 | $0400 (DEFAULT) | - 163 // | 0010XXXX | 2048 | $0800 | - 164 // | 0011XXXX | 3072 | $0C00 | - 165 // | 0100XXXX | 4096 | $1000 | - 166 // | 0101XXXX | 5120 | $1400 | - 167 // | 0110XXXX | 6144 | $1800 | - 168 // | 0111XXXX | 7168 | $1C00 | - 169 // | 1000XXXX | 8192 | $2000 | - 170 // | 1001XXXX | 9216 | $2400 | - 171 // | 1010XXXX | 10240 | $2800 | - 172 // | 1011XXXX | 11264 | $2C00 | - 173 // | 1100XXXX | 12288 | $3000 | - 174 // | 1101XXXX | 13312 | $3400 | - 175 // | 1110XXXX | 14336 | $3800 | - 176 // | 1111XXXX | 15360 | $3C00 | - 177 // +------------+---------+-------------------+ - 178 // - 179 ?bits = (%%address / $0400) << 4 - 180 - 181 lda $d018 - 182 and #%00001111 - 183 ora #?bits - 184 sta $d018 - 185 .endm - 186 - 187 - 188 // - 189 // Set location of bitmap. - 190 // - 191 // Args: - 192 // address: Address relative to VIC-II bank address. - 193 // Valid values: $0000 (bitmap at $0000-$1FFF) - 194 // $2000 (bitmap at $2000-$3FFF) - 195 // - 196 .macro SetBitmapAddress(address) - 197 // - 198 // In standard bitmap mode the location of the bitmap area can - 199 // be set to either BANK address + $0000 or BANK address + $2000 - 200 // - 201 // By setting bit 3, we can configure which of the locations to use. - 202 // - 203 - 204 lda $d018 - 205 - 206 ift %%address == $0000 - 207 and #%11110111 - 208 eli %%address == $2000 - 209 ora #%00001000 - 210 eif - 211 - 212 sta $d018 - 213 .endm - 214 - 215 // - 216 // Once this is done, random values appear in location $D41B (RANDOM) - 217 // - 218 .macro InitializeSIDrnd - 219 LDA #$FF ; maximum frequency value - 220 STA $D40E ; voice 3 frequency low byte - 221 STA $D40F ; voice 3 frequency high byte - 222 LDA #$80 ; noise waveform, gate bit off - 223 STA $D412 ; voice 3 control register - 224 .endm - 225 - 226 ;------------------------------------- - 227 .MACRO rolw - 228 ROL :1 - 229 ROL :1+1 - 230 .ENDM - 231 ;------------------------------------- - 232 .MACRO aslw - 233 ASL :1 - 234 ROL :1+1 - 235 .ENDM - 236 ;------------------------------------- - 237 .MACRO rorw - 238 ROR :1+1 - 239 ROR :1 - 240 .ENDM - 241 ;------------------------------------- - 242 .MACRO lsrw - 243 LSR :1+1 - 244 ROR :1 - 245 .ENDM - 246 ;------------------------------------- - 247 .macro randomize - 248 ;usage: randomize floor ceiling - 249 ;returns (in A) a random .byte between "floor" and "ceiling" - 250 .if :2 < :1 - 251 .error "floor higher than ceiling" - 252 .endif - 253 ?rand - 254 lda random - 255 cmp #:1 ;floor - 256 bcc ?rand - 257 cmp #:2+1 ;ceiling - 258 bcs ?rand - 259 .endm - 260 ;------------------------------------- - 261 .macro phx - 262 txa - 263 pha - 264 .endm - 265 ;------------------------------------- - 266 .macro phy - 267 tya - 268 pha - 269 .endm - 270 ;------------------------------------- - 271 .macro plx - 272 pla - 273 tax - 274 .endm - 275 ;------------------------------------- - 276 .macro ply - 277 pla - 278 tay - 279 .endm - 280 ;------------------------------------- - 281 .MACRO WAIT - 282 ; WAIT - 283 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) - 284 ?ze LDA $D012 - 285 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) - 286 bcc ?ze - 287 sbc #10 ; last lines correction - 288 ?wa cmp $D012 - 289 bcc ?wa - 290 ?wf cmp $D012 - 291 bcs ?wf - 292 .ENDM - 293 ;------------------------------------- - 294 .macro halt - 295 ?s jmp ?s - 296 .endm - 158 - 159 ;----------------------------------------------- - 160 ; variable declarations in RAM (no code) - 161 ;----------------------------------------------- - 162 - 163 ; Game loading address - 164 ORG $4100 - 165 4100 icl 'variables.asm' -Source: variables.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 ;===================================================== - 5 ; most important non-zero page variables - 6 ; used by the given subroutines - 7 ; moved to one place for easier - 8 ; compilation to e.g. cartridge - 9 ; zero page variables are declared in program.s65 module - 10 ;===================================================== - 11 4100 OneTimeZeroVariables - 12 = 003F OneTimeZeroVariablesCount = variablesToInitialize-OneTimeZeroVariables ; MAX 128 bytes ! - 13 .if OneTimeZeroVariablesCount > 127 - 14 .error "OneTimeZeroVariablesCount too large, ",OneTimeZeroVariablesCount - 15 .endif - 16 - 17 = 4100 noMusic .ds 1 ;.by 0 ; 0 - play music, $ff - do not play music - 18 = 4101 noSfx .ds 1 ;.by 0 ; 0 - play SFX, $ff - do not play SFX - 19 ;---------------------------------------------------- - 20 ; Color table for Game Over Screen (created in a gameover routine) - 21 = 4102 .ds 1 ;.by $00 ; labels line color - 22 = 4103 GameOverColoursTable .ds MaxPlayers; .BYTE $80,$40,$c4,$20,$c0,$e4 - 23 ;---------------------------------------------------- - 24 4109 TanksNames ; DO NOT ZERO ON GAME RESTART - ticket #24 - 25 ;:6 dta d" " - 26 = 4109 .ds 6*8 - 27 ;---------------------------------------------------- - 28 4139 skilltable ; computer controlled players' skills (1-8), 0 - human (no cleaning, ticket #30) - 29 = 4139 .DS MaxPlayers - 30 ;---------------------------------------------------- - 31 413F variablesToInitialize - 32 ;Options DO NOT ZERO ON RESTART GAME - ticket #27 - 33 = 413F OptionsTable .ds maxOptions ;.by 0,1,2,2,0,1,3,2,0 - 34 = 4148 RoundsInTheGame .ds 1 ;.by 10 ;how many rounds in the current game - 35 = 4149 seppukuVal .ds 1 ;.by 75 - 36 = 414A mountainDeltaH .ds 1 ;.by 3 - 37 = 414B mountainDeltaL .ds 1 ;.by $ff - 38 ;---------------------------------------------------- - 39 414C LineHeader1 - 40 = 414C .ds 9 ;dta d"# ROUND: " - 41 4155 RoundNrDisplay - 42 = 4155 .ds 5 ;dta d" #", $ff - 43 ; 4x4 text buffer - 44 415A ResultLineBuffer - 45 = 415A .ds 14 ;dta d" ", $ff - 46 4168 linetableL ; = PMGraph + $0300 - (screenHeight+1)*2 - 47 = 4168 .ds (screenHeight+1) - 48 4231 linetableH ; = PMGraph + $0300 - (screenHeight+1) - 49 = 4231 .ds (screenHeight+1) - 50 42FA DisplayCopyPurchase - 51 = 42FA .ds (DisplayCopyPurchaseEnd - DisplayCopyPurchaseStart +1) - 52 42FB StatusBufferCopy - 53 = 42FB .ds screenBytes*3 - 54 ;===================================================== - 55 4373 variablesStart ; zeroing starts here - 56 ;===================================================== - 57 ;isInventory .ds 1 ; 0 - purchase, $ff - inventory - 58 ;-------------- - 59 = 4373 drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) - 60 ;-------------- - 61 = 4374 noDeathCounter .ds 1 - 62 ;-------------- - 63 = 4375 OptionsY .ds 1 ;vertical position of cursor on Options screen - 64 = 4376 flyDelay .ds 1 - 65 ;-------------- - 66 ;NumberOfPlayers .DS 1 ;current number of players (counted from 1) - 67 = 4377 TankSequence .DS MaxPlayers ;sequence of shooting during the Round - 68 = 437D GameIsOver .DS 1 ; 1 means it was the last round in the game - 69 ;---------------------------------------------------- - 70 437E moneyH ;we place zero at the end of prices and money - 71 ;and have range from 0 to 99990 (not too much) - 72 ;money players have (maybe one more byte is needed?) - 73 = 437E .DS MaxPlayers - 74 4384 moneyL - 75 = 4384 .DS MaxPlayers - 76 ;---------------------------------------------------- - 77 438A gainH ;how much money player gets after the round - 78 ;it is gathered during the round basing on energy - 79 ;opponents lose after player's shoots - 80 = 438A .DS MaxPlayers - 81 4390 gainL - 82 = 4390 .DS MaxPlayers - 83 ;---------------------------------------------------- - 84 4396 loseH ;how much player looses after the round - 85 ;calculated from REAL energy loss - 86 ;(not only to zero energy) - 87 = 4396 .DS MaxPlayers - 88 439C loseL - 89 = 439C .DS MaxPlayers - 90 ;---------------------------------------------------- - 91 43A2 Energy - 92 = 43A2 .DS MaxPlayers - 93 43A8 ShieldEnergy - 94 = 43A8 .DS MaxPlayers - 95 = 43AE EnergyDecrease .DS 1 - 96 43AF eXistenZ - 97 = 43AF .DS MaxPlayers - 98 43B5 LASTeXistenZ ; eXistenZ before shoot - 99 = 43B5 .DS MaxPlayers - 100 - 101 43BB ResultsTable ;the results in the gameeeeee - 102 = 43BB .DS MaxPlayers - 103 43C1 TempResults - 104 = 43C1 .DS MaxPlayers - 105 ;DirectHitsH ; one byte enough - 106 ; .DS MaxPlayers - 107 43C7 DirectHits - 108 = 43C7 .DS MaxPlayers - 109 43CD EarnedMoneyH - 110 = 43CD .DS MaxPlayers - 111 43D3 EarnedMoneyL - 112 = 43D3 .DS MaxPlayers - 113 ;---------------------------------------------------- - 114 43D9 ForceTableL ;shooting Force of the tank during the round - 115 = 43D9 .DS MaxPlayers - 116 43DF ForceTableH - 117 = 43DF .DS MaxPlayers ;maxplayers=6 - 118 43E5 MaxForceTableL ;Energy of the tank during the round - 119 ;(limes superior force of the Shoot) - 120 = 43E5 .DS MaxPlayers ;1000 is the default - 121 43EB MaxForceTableH - 122 = 43EB .DS MaxPlayers - 123 ;---------------------------------------------------- - 124 43F1 BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round start! - 125 = 43F1 .DS MaxPlayers - 126 43F7 ActiveWeapon ;number of the selected weapon - 127 = 43F7 .DS MaxPlayers - 128 43FD ActiveDefenceWeapon ;number of the activated defence weapon - 0 - 129 = 43FD .DS MaxPlayers - 130 4403 AutoDefenseFlag ; 0 - not activated, >$7f - activated - 131 = 4403 .DS MaxPlayers - 132 = 4409 WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile - 133 ;---------------------------------------------------- - 134 - 135 ;format of the 3-byte static point number used in the game - 136 ; 20203.5 => 128 : <20203 : >20203 - 137 ;---------------------------------------------------- - 138 - 139 ;L1 .DS 1 ; variable used in multiplications (by 10:) - 140 ;gravity .DS 1 ;only the decimal part (1/10 = 25) - 141 ;---------------------------------------------------- - 142 - 143 ;Wind .ds 4 ;format: 0000.hhll - 144 ;walue displayed on the screen is - 145 ;decimal portion divided by 16 (>>4) - 146 ;---------------------------------------------------- - 147 = 440A MaxWind .ds 1 ; - 148 = 440B WindOrientation .DS 1 ;(0-right,1-left) - 149 ;---------------------------------------------------- - 150 ;Counter .DS 1 ;temporary Counter for outside loops - 151 ;HitFlag .DS 1 ;$ff when missile hit ground, $00 when no hit, $01-$06 tank index+1 when hit tank - 152 = 440C WallsType .ds 1 ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy - 153 ;---------------------------------------------------- - 154 440D xtankstableL ;X positions of tanks (lower left point) - 155 = 440D .DS MaxPlayers - 156 4413 xtankstableH - 157 = 4413 .DS MaxPlayers - 158 4419 ytankstable ;Y positions of tanks (lower left point) - 159 = 4419 .DS MaxPlayers - 160 441F LowResDistances ; coarse tank positions divided by 4 (to be in just one byte) - 161 = 441F .DS MaxPlayers - 162 4425 JoyNumber ; Joystick port number (from 0 to 3) - 163 = 4425 .DS MaxPlayers - 164 442B TankShape ; Tank shape number (from 0 to 2) - 165 = 442B .DS MaxPlayers - 166 ;---------------------------------------------------- - 167 4431 TargetTankNr ; Target tank index (for AI routines) - 168 = 4431 .DS 1 - 169 4432 SecondTryFlag ; For precise AI aiming - 170 = 4432 .DS 1 - 171 ;---------------------------------------------------- - 172 ;Erase .DS 1 ; if 1 only mask of the character is printed - 173 ; on the graphics screen. if 0 character is printed normally - 174 - 175 ;---------------------------------------------------- - 176 ;RangeLeft .DS 2 ;range of the soil to be fallen down - 177 ;RangeRight .DS 2 ;it is being set by all Explosions - 178 ;---------------------------------------------------- - 179 = 4433 WeaponRangeLeft .DS 2 ;Range of the Explosion of the given weapon - 180 = 4435 WeaponRangeRight .DS 2 - 181 ;---------------------------------------------------- - 182 ;xroller - 183 ;HowMuchToFall .ds 1 - 184 = 4437 HeightRol .DS 1 - 185 ;digger - 186 ;digstartx .DS 2 - 187 ;digstarty .DS 2 - 188 = 4438 diggery .DS 1 - 189 = 4439 DigLong .DS 1 - 190 = 443A digtabxL .DS [8] - 191 = 4442 digtabxH .DS [8] - 192 = 444A digtabyL .DS [8] - 193 = 4452 digtabyH .DS [8] - 194 ; liquiddirt - 195 = 445A TempXfill .ds 2 - 196 = 445C FillCounter .ds 2 - 197 ;sandhog - 198 = 445E sandhogflag .DS 1 ; (0 digger, 8 sandhog) - 199 ;ofdirt - 200 ;magic .DS 2 ; was tempor2, but it was not compiling!!! (bug in OMC65) - 201 ;draw - 202 ;HowToDraw .DS 1 - 203 ; bits here mean - 204 ; 0 - negative X (go up) - 205 ; 1 - negative Y (left) - 206 ; 2 - directional value > 1 (more than 45 degrees) - 207 ; if all 0 then standart routine - 208 ;XHit .DS 2 - 209 = 445F YHit .DS 2 - 210 ;LineLength .DS 2 - 211 ;circle - 212 ;radius .DS 1 - 213 ;xcircle .DS 2 - 214 ;ycircle .DS 2 - 215 = 4461 tempcir .DS 2 - 216 ;TankFalls - 217 = 4463 FallingSoundBit .DS 1 - 218 = 4464 PreviousFall .DS 1 - 219 = 4465 EndOfTheFallFlag .DS 1 ; in case of the infinite fall - 220 ;Parachute .DS 1 ; are you insured with parachute? - 221 ;FloatingAlt .DS 1 ; floating tank altitude - 222 = 00A2 FunkyWallFlag = FloatingAlt ; reuse this variable in different weapon (Funky Bomb)! - 223 = 00A2 PreferHumansFlag = FloatingAlt ; second reuse in AI Aim proc - 224 ;---------------------------------------------------- - 225 ;Flight - 226 ;variables for 5 missiles (used for mirv) - 227 = 4466 xtraj00 .DS [5] ; 3 bytes of xtraj times 5. Lowest byte - 228 = 446B xtraj01 .DS [5] ; middle byte - 229 = 4470 xtraj02 .DS [5] ; high byte - 230 ;vx00 .DS [5] ; looks like it is not really used anywhere - 231 = 4475 vx01 .DS [5] - 232 = 447A vx02 .DS [5] - 233 = 447F vx03 .DS [5] - 234 = 4484 MirvDown .DS [5] ; is given missile down? - 235 = 4489 MirvMissileCounter .DS 1 ; missile Counter (mainly for X) - 236 = 448A SmokeTracerFlag .DS 1 ; if Smoketracer - 237 = 448B LaserFlag .DS 1 ; $ff if Laser - 238 = 448C XposFlag .DS 1 ; bullet positon X (0 - on screen , %1000000 - off-screen) - 239 = 448D YposFlag .DS 1 ; bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) - 240 ;---------------------------------------------------- - 241 ;CheckCollisionWithTank - 242 ;vx .ds 4 ; 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) - 243 ;vy .ds 4 ;0,0,0,0 - 244 ;xtraj .ds 3 ; 0,0,0 - 245 ;ytraj .ds 3 ; 0,0,0 - 246 = 448E xtrajold .ds 3 ; 0,0,0 - 247 = 4491 ytrajold .ds 3 ; 0,0,0 - 248 ;Angle .DS 1 - 249 ;Force .ds 3 ; 0,0,0 - 250 ;Multiplier .ds 3 ; 0,0,0 - 251 = 4494 Multiplee .ds 2 ; 0,0 - 252 ;goleft .DS 1 ;if 1 then flights left - 253 ;---------------------------------------------------- - 254 ;unPlot - 255 = 4496 WhichUnPlot .DS 1 - 256 ; max 5 concurrent unPlots - 257 = 4497 oldplotH .DS [5] - 258 = 449C oldplotL .DS [5] - 259 = 44A1 oldora .DS [5] - 260 = 44A6 oldply .DS [5] - 261 = 44AB OldOraTemp .DS 1 - 262 = 44AC xtrajfb .DS 2 - 263 = 44AE ytrajfb .DS 2 - 264 ; - 265 ;tracerflag .DS 1 - 266 ;---------------------------------------------------- - 267 ;TypeChar - 268 = 44B0 mask1 .DS [8] - 269 = 44B8 mask2 .DS [8] - 270 - 271 = 44C0 char1 .DS [8] - 272 = 44C8 char2 .DS [8] - 273 ;color .DS 1 - 274 = 44D0 ybit .DS 1 - 275 = 44D1 tempbyte01 .DS 1 - 276 ;delta .DS 2 - 277 = 44D2 yfloat .DS 2 - 278 = 44D4 deltaX .DS 1 - 279 = 44D5 UpNdown .DS 1 - 280 - 281 = 44D6 temptankX .DS 2 - 282 = 44D8 temptankNr .DS 1 - 283 = 44D9 AfterBFGflag .DS 1 - 284 - 285 ;---------------------------------------------------- - 286 ;Variables from textproc.s65 - 287 ; tables with indexes of weapons on the right lists - 288 ; OK (2022) so, L1 is list of offensive weapons, L2 - defensive - 289 44DA IndexesOfWeaponsL1 - 290 = 44DA .ds (last_offensive_____ - first_offensive____+1) - 291 44FA IndexesOfWeaponsL2 - 292 = 44FA .ds (last_defensive_____ - first_defensive____+1) - 293 ;---------------------------------------------------- - 294 - 295 ; variables storing amount of weapons on the first and second - 296 ; list and pointer position - 297 - 298 450A HowManyOnTheListOff - 299 = 450A .DS 1 - 300 450B HowManyOnTheListDef - 301 = 450B .DS 1 - 302 ;PositionOnTheList ; pointer position on the list being displayed - 303 ; .DS 1 - 304 450C LastWeapon - 305 ; number of the last previously purchased weapon - 306 ; it is necessary when after purchase some weapon - 307 ; is removed from the list (because too expensive) - 308 ; and the cursor must be placed elsewhere - 309 = 450C .DS 1 - 310 450D WhichList ; list currently on the screen - 311 ; (0-offensive, %10000000 - defensive (check with bit:bmi for defensives) - 312 = 450D .DS 1 - 313 ;OffsetDL1 .DS 1 ; offset of the list screen (how many lines).... - 314 - 315 - 316 ;---------------------------------------------------- - 317 - 318 ;mark the level - 319 450E PositionInName ; cursor position in name of the player when name input - 320 = 450E .DS 1 - 321 ;DifficultyLevel .DS 1 ; Difficulty Level (human/cpu) - 322 - 323 ;---------------------------------------------------- - 324 ;displaydecimal - 325 ;decimal .DS 2 - 326 = 450F decimalresult .DS 5 - 327 - 328 ;xmissile - 329 ;ExplosionRadius .DS 2 ;because when adding in xdraw it is double byte - 330 ;round - 331 = 4514 CurrentRoundNr .DS 1 - 332 ;FallDown2 .DS 1 - 333 ;leapfrog - 334 = 4515 LeapFrogAngle .DS 1 - 335 ;laser - 336 = 4516 LaserCoordinate .DS 8 ; 2,2,2,2 - 337 ;---------------------------------------------------- - 338 ; Here go tables with weapons possesed by a given tank - 339 ; Index in the table means weapon type - 340 ; number entered means ammo for given weapon possessed (max 99) - 341 ; Let 0 be "baby missile" - 342 ; from $30 the defensive weapons begin - 343 451E TanksWeapons - 344 451E TanksWeapon1 - 345 = 451E .DS number_of_weapons - 346 454E TanksWeapon2 - 347 = 454E .DS number_of_weapons - 348 457E TanksWeapon3 - 349 = 457E .DS number_of_weapons - 350 45AE TanksWeapon4 - 351 = 45AE .DS number_of_weapons - 352 45DE TanksWeapon5 - 353 = 45DE .DS number_of_weapons - 354 460E TanksWeapon6 - 355 = 460E .DS number_of_weapons - 356 - 357 463E mountaintable ;table of mountains (size=screenwidth) - 358 = 463E .DS [screenwidth] - 359 = 477E .DS 1 ; additional byte for fallout (sometimes 1 pixel) - 360 477F mountaintable2 ;table of mountains (size=screenwidth) - 361 = 477F .DS [screenwidth] - 362 = 48BF .DS 1 ; additional byte for fallout (sometimes 1 pixel) - 363 48C0 MountaintableEnd ;good for table clearing - 364 ;---------------------------------------------------- - 365 = 48C0 TextNumberOff .DS 1 - 366 ;-------------- - 367 48C1 TankTempY - 368 = 48C1 .DS 1 - 369 ;---------------------------------------------------- - 370 ;-------------- single round variables -------------- - 371 ;---------------------------------------------------- - 372 48C2 singleRoundVars - 373 ;-------------- - 374 ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed - 375 ;-------------- - 376 48C2 CurrentResult - 377 = 48C2 .DS 1 - 378 ;-------------- - 379 48C3 AngleTable ;Angle of the barrel of each tank during the round - 380 = 48C3 .DS MaxPlayers - 381 48C9 EndOfTheBarrelX - 382 = 48C9 .ds 2 - 383 48CB EndOfTheBarrelY - 384 = 48CB .ds 1 - 385 ;---------------------------------------------------- - 386 48CC previousAngle - 387 = 48CC .DS MaxPlayers - 388 48D2 previousEnergyL - 389 = 48D2 .DS MaxPlayers - 390 48D8 previousLeftRange - 391 = 48D8 .DS MaxPlayers - 392 48DE previousEnergyH - 393 = 48DE .DS MaxPlayers - 394 48E4 RandBoundaryLow - 395 = 48E4 .ds 2 - 396 48E6 RandBoundaryHigh - 397 = 48E6 .ds 2 - 398 48E8 AngleTablePointer - 399 = 48E8 .DS 1 - 400 48E9 singleRoundVarsEnd - 401 ;---------------------------------------------------- - 402 ; 4x4 texts - 403 ;---------------------------------------------------- - 404 ;LineAddress4x4 .DS 2 - 405 = 48E9 LineCharNr .DS 1 - 406 ;LineXdraw .DS 2 - 407 ;LineYdraw .DS 1 - 408 - 409 ;----------- - 410 48EA ResultOfTankNr - 411 = 48EA .DS 1 - 412 - 413 ;---------------------------------------------------- - 414 ;PutChar4x4 - 415 ;---------------------------------------------------- - 416 = 48EB nibbler4x4 .DS 1 - 417 = 48EC CharCode4x4 .DS 1 - 418 ;plot4x4color .DS 1 ;1-white, 0-background - 419 ; This is moved from display.asm to be easier to relocate - 420 48ED ListOfWeapons - 421 ; 0123456789012345678901234567890123456789 - 422 ; :number_of_offensives dta d" " - 423 ;:32 dta d" " - 424 = 48ED .ds 32*32 - 425 4CED ListOfWeapons1End - 426 4CED ListOfDefensiveWeapons - 427 ; :number_of_defensives dta d" " - 428 ;:16 dta d" " - 429 = 4CED .ds 16*32 - 430 4EED ListOfDefensiveWeaponsEnd ;constant useful when clearing - 431 4EED track_variables - 432 = 4EED trackn_db .ds TRACKS - 433 = 4EF1 trackn_hb .ds TRACKS - 434 = 4EF5 trackn_idx .ds TRACKS - 435 = 4EF9 trackn_pause .ds TRACKS - 436 = 4EFD trackn_note .ds TRACKS - 437 = 4F01 trackn_volume .ds TRACKS - 438 = 4F05 trackn_distor .ds TRACKS - 439 = 4F09 trackn_shiftfrq .ds TRACKS - 440 = 4F0D trackn_instrx2 .ds TRACKS - 441 = 4F11 trackn_instrdb .ds TRACKS - 442 = 4F15 trackn_instrhb .ds TRACKS - 443 = 4F19 trackn_instridx .ds TRACKS - 444 = 4F1D trackn_instrlen .ds TRACKS - 445 = 4F21 trackn_instrlop .ds TRACKS - 446 = 4F25 trackn_instrreachend .ds TRACKS - 447 = 4F29 trackn_volumeslidedepth .ds TRACKS - 448 = 4F2D trackn_volumeslidevalue .ds TRACKS - 449 = 4F31 trackn_effdelay .ds TRACKS - 450 = 4F35 trackn_effvibratoa .ds TRACKS - 451 = 4F39 trackn_effshift .ds TRACKS - 452 = 4F3D trackn_tabletypespeed .ds TRACKS - 453 = 4F41 trackn_tablenote .ds TRACKS - 454 = 4F45 trackn_tablea .ds TRACKS - 455 = 4F49 trackn_tableend .ds TRACKS - 456 = 4F4D trackn_tablelop .ds TRACKS - 457 = 4F51 trackn_tablespeeda .ds TRACKS - 458 = 4F55 trackn_command .ds TRACKS - 459 = 4F59 trackn_filter .ds TRACKS - 460 = 4F5D trackn_audf .ds TRACKS - 461 = 4F61 trackn_audc .ds TRACKS - 462 = 4F65 trackn_audctl .ds TRACKS - 463 = 4F69 v_aspeed .ds 1 - 464 4F6A track_endvariables - 465 - 466 4F6A variablesEnd - 467 ;---------------------------------------------------- - 468 - 469 .endif - 166 - 167 4F6A WeaponFont - 168 4F6A 00 00 00 00 00 00 + ins 'artwork/weapons_AW6_mod.fnt' ; 'artwork/weapons.fnt' - 169 - 170 - 171 ;-------------------------------------------------- - 172 ; Game Code - 173 ;-------------------------------------------------- - 174 536A FirstSTART - 175 = 0000 DL = 0 - 176 = 0000 StatusBufferROM = 0 - 177 ;StatusBufferCopy = 0 - 178 = 0000 StatusBufferCopyEnd = 0 - 179 = 0004 TRACKS = 4 - 180 = 0000 DisplayCopyPurchaseEnd = 0 - 181 = 0000 DisplayCopyPurchaseStart = 0 - 182 = 2000 displayC64 = $2000 ; graphics screen memory start - 183 - 184 536A 78 SEI ; disable IRQ - 185 536B A9 36 LDA #$36 - 186 536D 85 01 STA $0001 ; Turn Off BASIC ROM - 187 536F A9 FE LDA #NMI ; to our routine - 190 5376 8D 19 03 STA $0319 ; - 191 5379 A9 00 LDA #$00 ; stop Timer A - 192 537B 8D 0E DD STA $DD0E ; - 193 537E 8D 04 DD STA $DD04 ; set Timer A to 0, after starting - 194 5381 8D 05 DD STA $DD05 ; NMI will occur immediately - 195 5384 A9 81 LDA #$81 ; - 196 5386 8D 0D DD STA $DD0D ; set Timer A as source for NMI - 197 5389 A9 01 LDA #$01 ; - 198 538B 8D 0E DD STA $DD0E ; start Timer A -> NMI - 199 - 200 ; from here on NMI is disabled - 201 - 202 - 203 538E 20 89 5A jsr MakeDarkScreen - 204 - 205 ; one time zero variables in RAM (non zero page) - 206 5391 A9 00 lda #0 - 207 5393 A0 3E ldy #OneTimeZeroVariablesCount-1 - 208 5395 99 00 41 @ sta OneTimeZeroVariables,y - 209 5398 88 dey - 210 5399 10 FA bpl @- - 211 - 212 ; one time zero variables in RAM (zero page) - 213 539B A0 58 ldy #FirstZpageVariable - 214 539D 99 00 00 @ sta $0000,y - 215 53A0 C8 iny - 216 53A1 D0 FA bne @- - 217 - 218 ; initialize variables in RAM (non zero page) - 219 53A3 A0 1B ldy #initialvaluesCount-1 - 220 53A5 B9 B9 5A @ lda initialvaluesStart,y - 221 53A8 99 3F 41 sta variablesToInitialize,y - 222 53AB 88 dey - 223 53AC 10 F7 bpl @- - 224 - 225 - 226 ; generate linetables - 227 53AE 20 9D 76 jsr GenerateLineTable - 228 - 229 - 230 ; Random INIT - 231 53B1 InitializeSIDrnd -Macro: INITIALIZESIDRND [Source: MACRO.ASM] - 1 53B1 A9 FF LDA #$FF ; maximum frequency value - 2 53B3 8D 0E D4 STA $D40E ; voice 3 frequency low byte - 3 53B6 8D 0F D4 STA $D40F ; voice 3 frequency high byte - 4 53B9 A9 80 LDA #$80 ; noise waveform, gate bit off - 5 53BB 8D 12 D4 STA $D412 ; voice 3 control register -Source: scorchC64.asm - 232 - 233 ;-------------------------------------------------- - 234 ; Main program of the game - 235 53BE icl 'game.asm' -Source: game.asm - 1 .IF *>0 ;this is a trick that prevents compiling this file alone - 2 - 3 ; All main procedures of the game not dependent on hardware (I hope) :) - 4 - 5 53BE START - 6 53BE 20 89 5A jsr MakeDarkScreen - 7 ; Startup sequence - 8 53C1 20 6A 58 jsr Initialize - 9 - 10 ;jsr GameOverScreen ; only for test !!! - 11 - 12 53C4 RMTSong song_main_menu -Macro: RMTSONG [Source: scorchC64.asm] - 1 53C4 A9 02 lda #SONG_MAIN_MENU ; do nothing in C64 -Source: game.asm - 13 - 14 53C6 20 E5 62 jsr Options ;startup screen - 15 53C9 20 1E 63 jsr SetVariablesFromOptions - 16 53CC 20 89 5A jsr MakeDarkScreen - 17 53CF 24 D7 bit escFlag - 18 53D1 30 EB bmi START - 19 - 20 53D3 20 C6 63 jsr EnterPlayerNames - 21 53D6 20 89 5A jsr MakeDarkScreen - 22 53D9 24 D7 bit escFlag - 23 53DB 30 E1 bmi START - 24 - 25 53DD 20 0B 59 jsr RandomizeSequence - 26 ; for the round #1 shooting sequence is random - 27 - 28 53E0 MainGameLoop - 29 53E0 20 41 5A jsr SetWallsType - 30 ; first set default barrel lengths (fix for Long Schlong activation :) ) - 31 ; we must do it before purchase/activate - 32 ; and set Auto Defense to off - 33 53E3 20 FB 58 jsr SetStandardBarrels - 34 - 35 53E6 20 77 63 jsr CallPurchaseForEveryTank - 36 53E9 20 89 5A jsr MakeDarkScreen - 37 53EC 24 D7 bit escFlag - 38 53EE 30 CE bmi START - 39 - 40 53F0 20 E7 57 jsr GetRandomWind - 41 - 42 53F3 20 D3 54 jsr RoundInit - 43 - 44 53F6 20 5F 55 jsr MainRoundLoop - 45 53F9 24 D7 bit escFlag - 46 53FB 30 C1 bmi START - 47 53FD 50 03 4C C3 54 jvs GoGameOver - 48 - 49 5402 20 DD 59 jsr SortSequence - 50 - 51 5405 A9 00 85 6C mva #0 TankNr ; - 52 5409 85 02 sta COLBAKS ; set background color to black - 53 540B 85 5D sta JoystickNumber ; set joystick port for player - 54 - 55 ; Hide all (easier than hide last ;) ) tanks - 56 540D 20 0B 6A jsr cleartanks ; A=0 - 57 - 58 ; here gains and losses should be displayed (dollars) - 59 ; finally we have changed our minds and money of players - 60 ; is displayed only in weapons shop - 61 - 62 ; Results are number of other deaths - 63 ; before the player dies itself - 64 - 65 5410 RmtSong song_round_over -Macro: RMTSONG [Source: scorchC64.asm] - 1 5410 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 -Source: game.asm - 66 5412 20 A3 64 jsr DisplayResults - 67 - 68 5415 20 75 5A jsr DemoModeOrKey - 69 5418 20 89 5A jsr MakeDarkScreen - 70 - 71 541B A6 AE ldx NumberOfPlayers - 72 541D CA dex - 73 541E CalculateGains - 74 ; add gains and substract losses - 75 ; gain is what player gets for lost energy of opponents - 76 ; energy lost by opponents is added during Round and - 77 ; little below in source, multiplied by 2 to get "dollars". - 78 ; By analogy, loss is energy that given player losses during - 79 ; each Round. - 80 ; Important! If player has 10 energy and gets a central hit - 81 ; from nuke that would take 90 energy points, his loss - 82 ; is 90, not 10 - 83 - 84 ; adding the remaining energy of the tank to gain - 85 ; winner gets more ! :) - 86 541E BD A2 43 lda Energy,x - 87 5421 7D 90 43 adc gainL,x - 88 5424 9D 90 43 sta gainL,x - 89 5427 90 03 bcc @+ - 90 5429 FE 8A 43 inc gainH,x - 91 @ - 92 ; add gain * 2 - 93 542C 1E 90 43 asl gainL,x - 94 542F 3E 8A 43 rol gainH,x - 95 5432 18 clc - 96 5433 BD 84 43 lda moneyL,x - 97 5436 7D 90 43 adc gainL,x - 98 5439 9D 84 43 sta moneyL,x - 99 543C BD 7E 43 lda moneyH,x - 100 543F 7D 8A 43 adc gainH,x - 101 5442 9D 7E 43 sta moneyH,x - 102 ; substract lose - 103 ; if lose is greater than money then zero money - 104 5445 BD 7E 43 lda moneyH,x - 105 5448 DD 96 43 cmp loseH,x - 106 544B 90 20 bcc zeromoney - 107 544D D0 08 bne substractlose - 108 544F BD 84 43 lda moneyL,x - 109 5452 DD 9C 43 cmp loseL,x - 110 5455 90 16 bcc zeromoney - 111 5457 substractlose - 112 5457 38 sec - 113 5458 BD 84 43 lda moneyL,x - 114 545B FD 9C 43 sbc loseL,x - 115 545E 9D 84 43 sta moneyL,x - 116 5461 BD 7E 43 lda moneyH,x - 117 5464 FD 96 43 sbc loseH,x - 118 5467 9D 7E 43 sta moneyH,x - 119 546A 4C 75 54 jmp skipzeroing - 120 546D zeromoney - 121 546D A9 00 lda #0 - 122 546F 9D 84 43 sta moneyL,x - 123 5472 9D 7E 43 sta moneyH,x - 124 5475 skipzeroing - 125 ; and earned money for summary - 126 5475 18 clc - 127 5476 BD D3 43 lda EarnedMoneyL,x - 128 5479 7D 90 43 adc gainL,x - 129 547C 9D D3 43 sta EarnedMoneyL,x - 130 547F BD CD 43 lda EarnedMoneyH,x - 131 5482 7D 8A 43 adc gainH,x - 132 5485 9D CD 43 sta EarnedMoneyH,x - 133 ; substract lose - 134 ; if lose is greater than money then zero money - 135 5488 BD CD 43 lda EarnedMoneyH,x - 136 548B DD 96 43 cmp loseH,x - 137 548E 90 20 bcc ezeromoney - 138 5490 D0 08 bne esubstractlose - 139 5492 BD D3 43 lda EarnedMoneyL,x - 140 5495 DD 9C 43 cmp loseL,x - 141 5498 90 16 bcc ezeromoney - 142 549A esubstractlose - 143 549A 38 sec - 144 549B BD D3 43 lda EarnedMoneyL,x - 145 549E FD 9C 43 sbc loseL,x - 146 54A1 9D D3 43 sta EarnedMoneyL,x - 147 54A4 BD CD 43 lda EarnedMoneyH,x - 148 54A7 FD 96 43 sbc loseH,x - 149 54AA 9D CD 43 sta EarnedMoneyH,x - 150 54AD 4C B8 54 jmp eskipzeroing - 151 54B0 ezeromoney - 152 54B0 A9 00 lda #0 - 153 54B2 9D D3 43 sta EarnedMoneyL,x - 154 54B5 9D CD 43 sta EarnedMoneyH,x - 155 54B8 eskipzeroing - 156 - 157 54B8 CA dex - 158 54B9 30 03 4C 1E 54 jpl CalculateGains - 159 - 160 54BE AD 7D 43 lda GameIsOver - 161 54C1 F0 06 beq NoGameOverYet - 162 54C3 GoGameOver - 163 54C3 20 0E 66 jsr GameOverScreen - 164 54C6 4C BE 53 jmp START - 165 54C9 NoGameOverYet - 166 54C9 EE 14 45 inc CurrentRoundNr - 167 54CC A9 15 85 9E mva #sfx_silencer sfx_effect - 168 - 169 54D0 4C E0 53 jmp MainGameLoop - 170 - 171 - 172 ;-------------------------------------------------- - 173 54D3 .proc RoundInit - 174 ;-------------------------------------------------- - 175 ; at the beginning of each Round we set energy - 176 ; of all players to 99 - 177 ; the maximum shooting energy to 990 (it is 10*energy) - 178 ; the default shooting energy to 350 - 179 ; the shooting angle is randomized - 180 ; of course gains an loses are zeroed - 181 - 182 54D3 RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 54D3 A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: game.asm - 183 - 184 54D5 20 62 75 jsr SetPMWidth ; A=0 - 185 54D8 A9 00 lda #0 - 186 54DA 8D D9 44 sta AfterBFGflag ; reset BFG flag - 187 54DD 85 02 sta COLOR2 ; status line "off" - 188 54DF 85 02 sta COLOR1 - 189 - 190 54E1 AA tax - 191 54E2 9D C2 48 @ sta singleRoundVars,x - 192 54E5 E8 inx - 193 54E6 E0 27 cpx #(singleRoundVarsEnd-singleRoundVars) - 194 54E8 D0 F8 bne @- - 195 - 196 54EA A2 05 ldx #(MaxPlayers-1) - 197 54EC SettingEnergies - 198 54EC A9 00 lda #$00 - 199 54EE 9D 90 43 sta gainL,x - 200 54F1 9D 8A 43 sta gainH,x - 201 54F4 9D 9C 43 sta loseL,x - 202 54F7 9D 96 43 sta loseH,x - 203 54FA A9 63 lda #99 - 204 54FC 9D A2 43 sta Energy,x - 205 54FF 9D AF 43 sta eXistenZ,x - 206 5502 9D B5 43 sta LASTeXistenZ,x - 207 ; anything in eXistenZ table means that this tank exist - 208 ; in the given round - 209 5505 A9 E8 lda #<1000 - 210 5507 9D E5 43 sta MaxForceTableL,x - 211 550A A9 03 lda #>1000 - 212 550C 9D EB 43 sta MaxForceTableH,x - 213 550F A9 5E lda #<350 - 214 5511 9D D9 43 sta ForceTableL,x - 215 5514 A9 01 lda #>350 - 216 5516 9D DF 43 sta ForceTableH,x - 217 - 218 ;lda #(255-45) - 219 ;it does not look good when all tanks have - 220 ;barrels pointing the same direction - 221 ;so it would be nice to have more or less random - 222 ;angles - 223 5519 20 3D 59 jsr RandomizeAngle - 224 551C 9D C3 48 sta AngleTable,x - 225 - 226 551F CA dex - 227 5520 10 CA bpl SettingEnergies - 228 - 229 ;generating the new landscape - 230 5522 20 46 75 jsr PMoutofScreen ;let P/M disappear - 231 5525 20 7C 76 jsr clearscreen ;let the screen be clean - 232 5528 20 9C 6E jsr ClearPMmemory - 233 552B 20 6A 69 jsr placetanks ;let the tanks be evenly placed - 234 552E 20 04 70 jsr calculatemountains ;let mountains be easy for the eye - 235 ;jsr calculatemountains0 ;only for tests - makes mountains flat and 0 height - 236 - 237 - 238 5531 A9 00 85 72 85 73 mwa #StatusBufferROM temp - 239 5537 A9 FB 85 74 A9 42 + mwa #StatusBufferCopy temp2 - 240 553F A9 01 85 76 A9 00 + mwa #StatusBufferCopyEnd+1 modify - 241 5547 20 B7 5A jsr CopyFromROM - 242 - 243 554A 20 E4 76 jsr SetMainScreen - 244 554D 20 51 75 jsr ColorsOfSprites - 245 - 246 5550 20 B2 6E jsr drawmountains ;draw them - 247 5553 20 12 6A jsr drawtanks ;finally draw tanks - 248 - 249 5556 A9 00 85 6D mva #$00 TankSequencePointer - 250 - 251 ;---------round screen is ready--------- - 252 555A A9 0A 85 02 mva #TextForegroundColor COLOR1 ; status line "on" - 253 555E 60 rts - 254 .endp - 255 - 256 ;-------------------------------------------------- - 257 555F .proc MainRoundLoop - 258 ; here we must check if by a chance there is only one - 259 ; tank with energy greater than 0 left - 260 ;-------------------------------------------------- - 261 - 262 555F A0 00 ldy #0 ; in Y - number of tanks with energy greater than zero - 263 5561 84 02 sty ATRACT ; reset atract mode - 264 5563 A6 AE ldx NumberOfPlayers - 265 5565 CA dex - 266 5566 CheckingIfRoundIsFinished - 267 5566 BD AF 43 lda eXistenZ,x - 268 5569 F0 01 beq NoEnergy - 269 556B C8 iny - 270 556C NoEnergy - 271 556C CA dex - 272 556D 10 F7 bpl CheckingIfRoundIsFinished - 273 - 274 556F C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ? - 275 5571 B0 17 bcs DoNotFinishTheRound - 276 - 277 ;points for the last living tank - 278 5573 A6 AE ldx NumberOfPlayers - 279 5575 CA dex - 280 5576 WhichTankWonLoop - 281 5576 BD AF 43 lda eXistenZ,x - 282 5579 D0 04 bne ThisOneWon - 283 557B CA dex - 284 557C 10 F8 bpl WhichTankWonLoop - 285 ;error was here!!! - 286 ; somehow I believed program will be never here - 287 ; but it was a bad assumption - 288 ; god knows when there is such a situation - 289 ; (we've got a SITUATION here, if you know what I mean) - 290 ; there are two tanks left. - 291 ; one of them is killed by the second tank - 292 ; second tank explodes and kills the first one. - 293 ; and code lands here... - 294 ; looks like no one won! - 295 557E 60 rts - 296 - 297 557F ThisOneWon - 298 557F AD C2 48 lda CurrentResult - 299 5582 18 clc - 300 5583 7D BB 43 adc ResultsTable,x - 301 5586 9D BB 43 sta ResultsTable,x - 302 - 303 5589 60 rts ; this Round is finished - 304 - 305 558A DoNotFinishTheRound - 306 ; Seppuku here - 307 558A AD 74 43 lda noDeathCounter - 308 558D CD 49 41 cmp seppukuVal - 309 5590 90 0F bcc @+ - 310 - 311 5592 A9 00 8D 74 43 mva #0 noDeathCounter - 312 5597 A9 1A 85 9E mva #sfx_seppuku sfx_effect - 313 - 314 559B 20 19 74 jsr DisplaySeppuku - 315 559E 4C D0 57 jmp Seppuku - 316 - 317 @ - 318 ; Auto Defense - activates defensives - 319 55A1 A6 AE ldx NumberOfPlayers - 320 55A3 CA dex - 321 55A4 CheckNextTankAD - 322 55A4 BD A2 43 lda Energy,x ; only active players - 323 55A7 F0 08 beq @+ - 324 55A9 BD 03 44 lda AutoDefenseFlag,x ; with Auto Defence activated - 325 55AC F0 03 beq @+ - 326 ; run auto defense for tank in X - 327 55AE 20 F2 8A jsr AutoDefense - 328 55B1 CA @ dex - 329 55B2 10 F0 bpl CheckNextTankAD - 330 55B4 20 12 6A jsr DrawTanks ; redraw tanks with new defences - 331 ; - 332 55B7 A6 6D ldx TankSequencePointer - 333 55B9 BD 77 43 lda TankSequence,x - 334 55BC 85 6C sta TankNr - 335 55BE AA tax - 336 55BF BD A2 43 lda Energy,x ;skip if no energy - 337 55C2 D0 03 4C 90 56 jeq NextPlayerShoots - 338 - 339 - 340 - 341 55C7 A9 FF 85 DB mva #$ff plot4x4color - 342 55CB 20 44 73 jsr DisplayTankNameAbove - 343 - 344 55CE A9 01 85 A9 mva #1 color ;to display flying point - 345 - 346 55D2 A6 6C ldx tankNr - 347 55D4 BD 7F 5B lda TankStatusColoursTable,x - 348 55D7 85 02 sta COLOR2 ; set color of status line - 349 55D9 20 0F 66 jsr PutTankNameOnScreen - 350 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 351 - 352 55DC BD 39 41 lda SkillTable,x - 353 55DF F0 1C beq ManualShooting - 354 - 355 55E1 RoboTanks - 356 ; robotanks shoot here - 357 ; TankNr still in X - 358 55E1 20 C3 8F jsr ArtificialIntelligence - 359 ;pause 30 - 360 55E4 A6 6C ldx TankNr - 361 55E6 20 0F 66 jsr DisplayStatus ; to make visible AI selected defensive (and offensive :) ) - 362 55E9 20 A1 59 jsr MoveBarrelToNewPosition - 363 55EC A5 02 lda kbcode - 364 55EE C9 1C cmp #@kbcode._esc ; 28 ; ESC - 365 55F0 D0 03 bne @+ - 366 55F2 20 AE 73 jsr AreYouSure - 367 55F5 A5 D7 @ lda escFlag - 368 55F7 F0 01 60 seq:rts ; keys Esc or O - 369 - 370 - 371 55FA 4C 11 56 jmp AfterManualShooting - 372 - 373 55FD ManualShooting - 374 55FD BD 25 44 lda JoyNumber,x - 375 5600 85 5D sta JoystickNumber ; set joystick port for player - 376 5602 20 71 5A jsr WaitForKeyRelease - 377 5605 A9 00 lda #%00000000 - 378 5607 85 97 sta TestFlightFlag ; set "Test Fight" off - 379 5609 20 4D 80 jsr BeforeFire - 380 560C A5 D7 lda escFlag - 381 560E F0 01 60 seq:rts ; keys Esc or O - 382 - 383 5611 AfterManualShooting - 384 5611 A9 00 85 DB mva #$00 plot4x4color - 385 5615 20 44 73 jsr DisplayTankNameAbove - 386 ; defensive weapons without flight handling - 387 5618 A6 6C ldx TankNr - 388 561A BD FD 43 lda ActiveDefenceWeapon,x - 389 561D C9 22 cmp #ind_Hovercraft_____ - 390 561F F0 14 beq GoFloat - 391 5621 C9 20 cmp #ind_White_Flag_____ ; White Flag - 392 5623 F0 0A beq ShootWhiteFlag - 393 5625 C9 2B cmp #ind_Nuclear_Winter_ - 394 5627 D0 19 bne StandardShoot - 395 5629 ShootAtomicWinter - 396 ; --- atomic winter --- - 397 5629 20 9B 8A jsr AtomicWinter - 398 562C 4C 90 56 jmp NextPlayerShoots ; and we skip shoot - 399 562F ShootWhiteFlag - 400 ; --- white flag --- - 401 562F 20 70 8A jsr WhiteFlag - 402 5632 4C 90 56 jmp NextPlayerShoots ; and we skip shoot - 403 5635 GoFloat - 404 5635 20 84 8B jsr TankFlying - 405 5638 A9 00 lda #0 - 406 563A 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate after use - 407 563D 24 D7 bit escFlag - 408 563F 10 BC bpl ManualShooting ; after floating tank can shoot - 409 5641 60 rts - 410 5642 StandardShoot - 411 5642 EE 74 43 inc noDeathCounter - 412 - 413 5645 20 98 8F jsr DecreaseWeaponBeforeShoot - 414 5648 20 0F 66 jsr DisplayStatus - 415 - 416 ; ldx TankNr - 417 564B DE A2 43 dec Energy,x ; lower energy to eventually let tanks commit suicide - 418 - 419 564E ShootNow - 420 564E 20 0C 83 jsr Shoot - 421 ;here we clear offensive text (after a shoot) - 422 5651 A4 6C ldy TankNr - 423 5653 A9 00 85 DB mva #$00 plot4x4color - 424 5657 20 88 72 jsr DisplayOffensiveTextNr - 425 - 426 565A A5 BF lda HitFlag ;0 if missed - 427 565C F0 1E beq missed - 428 - 429 565E 20 34 77 jsr Explosion - 430 - 431 5661 continueMainRoundLoopAfterSeppuku - 432 - 433 5661 AfterExplode - 434 5661 20 F4 6E jsr SoilDown2 ; allways - 435 5664 NoFallDown2 - 436 ;here tanks are falling down - 437 5664 A5 6C 85 7E mva tankNr tempor2 - 438 5668 A6 AE ldx NumberOfPlayers - 439 566A CA dex - 440 566B TanksFallDown - 441 566B 86 6C stx TankNr - 442 566D BD AF 43 lda eXistenZ,x - 443 5670 F0 03 beq NoExistNoFall - 444 5672 20 2E 6D jsr TankFalls - 445 5675 NoExistNoFall - 446 5675 CA dex - 447 5676 10 F3 bpl TanksFallDown - 448 5678 A6 7E 86 6C mvx tempor2 TankNr - 449 - 450 567C missed - 451 567C AC 09 44 ldy WeaponDepleted - 452 567F D0 06 bne @+ - 453 5681 A6 6C ldx TankNr - 454 5683 98 tya - 455 5684 9D F7 43 sta ActiveWeapon,x - 456 @ - 457 - 458 ;here we clear offensive text (after a shoot) - 459 5687 A4 6C ldy TankNr - 460 5689 A9 00 85 DB mva #$00 plot4x4color - 461 568D 20 88 72 jsr DisplayOffensiveTextNr - 462 - 463 5690 NextPlayerShoots - 464 ;before it shoots, the eXistenZ table must be updated - 465 ;accordingly to actual energy (was forgotten, sorry to ourselves) - 466 - 467 5690 A2 05 ldx #(MaxPlayers-1) - 468 5692 SeteXistenZ - 469 5692 BD A2 43 lda Energy,x - 470 5695 9D AF 43 sta eXistenZ,x - 471 - 472 5698 20 2A 58 jsr MaxForceCalculate - 473 - 474 569B CA dex - 475 569C 10 F4 bpl SeteXistenZ - 476 - 477 ;was setup of maximum energy for players - 478 - 479 - 480 569E PlayersAgain - 481 - 482 ; In LASTeXistenZ there are values of eXistenZ before shoot - 483 ; from the next tank. - 484 ; Now it must be checked if by a chance something that had - 485 ; LASTeXistenZ>0 is not equal to 0 right now, - 486 ; because it means this tank died during this round. - 487 ; Most important thing is: - 488 ; after each explosion of the tank these operations must be - 489 ; performed from the beginning! - 490 ; (it is made by another jump into the after explosion routines) - 491 ; It is because exploding tank can destroy their neighbours, - 492 ; additionally this tank just have had LASTeXistenZ set to 0, - 493 ; otherwise it would explode again and again. - 494 ; OK, text how to do it is ready, now comes coding . - 495 ; Aaaah! - in the main loop we have to set eXistenZ and LASTeXistenZ - 496 - 497 569E A9 16 85 9E mva #sfx_next_player sfx_effect - 498 - 499 56A2 A6 AE ldx NumberOfPlayers - 500 56A4 CA dex - 501 56A5 CheckingPlayersDeath - 502 56A5 BD B5 43 lda LASTeXistenZ,x - 503 56A8 F0 05 beq NoPlayerNoDeath - 504 56AA BD AF 43 lda eXistenZ,x - 505 56AD F0 19 beq PlayerXdeath - 506 56AF NoPlayerNoDeath - 507 56AF CA dex - 508 56B0 10 F3 bpl CheckingPlayersDeath - 509 ; if processor is here it means there are no more explosions - 510 - 511 56B2 E6 6D A5 6D inc:lda TankSequencePointer - 512 56B6 C5 AE cmp NumberOfPlayers - 513 56B8 D0 0B bne NotLastPlayerInRound - 514 56BA A9 00 85 6D mva #0 TankSequencePointer - 515 - 516 56BE A5 5C lda WindChangeInRound - 517 56C0 F0 03 beq NoWindChangeNow - 518 56C2 20 E7 57 jsr GetRandomWind ; wind change after each turn (not round only) - 519 56C5 NoWindChangeNow - 520 56C5 NotLastPlayerInRound - 521 56C5 4C 5F 55 jmp MainRoundLoop - 522 .endp - 523 - 524 ;--------------------------------- - 525 56C8 .proc PlayerXdeath - 526 ; this tank should not explode anymore: - 527 ; there is 0 in A, and Tank Number in X, so... - 528 ;--------------------------------- - 529 - 530 56C8 9D B5 43 sta LASTeXistenZ,x - 531 ; save x somewhere - 532 56CB 8E C1 48 stx TankTempY - 533 - 534 ;clear NoDeathCounter here - 535 56CE 8D 74 43 sta noDeathCounter - 536 - 537 56D1 A9 06 85 9E mva #sfx_death_begin sfx_effect - 538 - 539 ; display defensive text here (well, defensive - 540 ; is not the real meaning, it should be pre-death, - 541 ; but I am too lazy to change names of variables) - 542 - 543 ; in X there is a number of tank that died - 544 - 545 56D5 A9 4E lda #78 ; mumber of defensive text after BFG! ("VERY FUNNY.") - 546 56D7 2C D9 44 bit AfterBFGflag ; check BFG flag - 547 56DA 30 15 bmi TextAfterBFG - 548 ; if BFG then no points for dead tanks ... - 549 56DC AD C2 48 lda CurrentResult - 550 56DF 18 clc - 551 56E0 7D BB 43 adc ResultsTable,x - 552 56E3 9D BB 43 sta ResultsTable,x - 553 ;inc CurrentResult - 554 - 555 ; RandomizeDeffensiveText - 556 56E6 randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 56E6 ?rand - 7 56E6 AD 1B D4 lda random - 8 56E9 C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor - 9 56EB 90 F9 bcc ?rand - 10 56ED C9 74 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling - 11 56EF B0 F5 bcs ?rand -Source: game.asm - 557 56F1 TextAfterBFG - 558 56F1 8D C0 48 sta TextNumberOff - 559 56F4 EE C2 48 inc CurrentResult ; ... but increase result of winner (BFG) - 560 56F7 AC C1 48 ldy TankTempY - 561 56FA A9 FF 85 DB mva #$ff plot4x4color - 562 56FE 20 88 72 jsr DisplayOffensiveTextNr - 563 ; tank flash - 564 5701 AC C1 48 ldy TankTempY - 565 5704 A5 6C 85 74 mva TankNr temp2 ; not elegant, and probably unnecessary - 566 5708 84 6C sty TankNr - 567 570A 20 57 6B jsr FlashTank ; blinking and pausing (like PAUSE 72 - 18x(2+2) ) - 568 570D A5 74 85 6C mva temp2 TankNr - 569 - 570 ;Deffensive text cleanup - 571 ;here we clear Deffensive text (after a shoot) - 572 5711 AC C1 48 ldy TankTempY - 573 5714 A9 00 85 DB mva #$00 plot4x4color - 574 5718 20 88 72 jsr DisplayOffensiveTextNr - 575 - 576 ; calculate position of the explosion (the post-death one) - 577 571B AE C1 48 ldx TankTempY - 578 571E 18 clc - 579 571F BD 0D 44 lda xtankstableL,x - 580 5722 69 04 adc #4 ; more or less in the middle of the tank - 581 5724 85 61 sta xdraw - 582 5726 BD 13 44 lda xtankstableH,x - 583 5729 69 00 adc #0 - 584 572B 85 62 sta xdraw+1 - 585 572D 38 sec - 586 572E BD 19 44 lda ytankstable,x - 587 5731 E9 04 sbc #4 - 588 5733 85 63 sta ydraw - 589 5735 A9 00 lda #0 - 590 5737 85 64 sta ydraw+1 ; there is 0 left in A, so... TODO: bad code above. revisit - 591 - 592 ;cleanup of the soil fall down ranges (left and right) - 593 5739 85 D4 sta RangeRight - 594 573B 85 D5 sta RangeRight+1 - 595 573D A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft - 596 - 597 ; We are randomizing the weapon now. - 598 ; jumping into the middle of the explosion - 599 ; routine - 600 5745 MetodOfDeath - 601 5745 AD 1B D4 lda random - 602 5748 29 1F and #%00011111 ; range 0-31 - 603 574A C9 10 cmp #(weaponsOfDeathEnd-weaponsOfDeath) ; we have 20 weapons in table (from 0 to 19) - 604 574C B0 F7 bcs MetodOfDeath - 605 574E A8 tay - 606 574F B9 4A 60 lda weaponsOfDeath,y - 607 5752 20 3C 77 jsr ExplosionDirect - 608 5755 A9 15 85 9E mva #sfx_silencer sfx_effect - 609 - 610 ; Clear current Shooter settings. After that, Shooter will "search" for the target again - 611 5759 A6 AE ldx NumberOfPlayers - 612 575B CA dex - 613 575C BD 39 41 @ lda skillTable,x - 614 575F C9 02 cmp #2 ; clear variables only if Shooter - 615 5761 D0 0B bne NotShooter - 616 5763 A9 00 lda #0 - 617 5765 9D CC 48 sta PreviousAngle,x - 618 5768 9D D2 48 sta PreviousEnergyL,x - 619 576B 9D DE 48 sta PreviousEnergyH,x - 620 576E NotShooter - 621 576E CA dex - 622 576F 10 EB bpl @- - 623 - 624 ; jump to after explosion routines (soil fallout, etc.) - 625 ; After going through these routines we are back - 626 ; to checking if a tank exploded and maybe we have - 627 ; a deadly shot here again. - 628 5771 4C 61 56 jmp MainRoundLoop.AfterExplode - 629 .endp - 630 - 631 ;-------------------------------------------------- - 632 5774 .proc DecreaseEnergyX - 633 ;Decreases energy of player nr X by the value Y - 634 ;increases his financial loss - 635 ;increases gain of tank TankNr - 636 ;-------------------------------------------------- - 637 5774 8C AE 43 sty EnergyDecrease - 638 ; Lose increase - 639 5777 BD 9C 43 lda loseL,x - 640 577A 18 clc - 641 577B 6D AE 43 adc EnergyDecrease - 642 577E 9D 9C 43 sta loseL,x - 643 5781 BD 96 43 lda loseH,x - 644 5784 69 00 adc #$00 - 645 5786 9D 96 43 sta loseH,x - 646 ; Energy now, not less than 0 - 647 5789 BD A2 43 lda Energy,x - 648 578C CD AE 43 cmp EnergyDecrease - 649 578F 90 05 bcc ldahashzero - 650 ;sec - 651 5791 ED AE 43 sbc EnergyDecrease - 652 5794 10 02 bpl NotNegativeEnergy - 653 5796 ldahashzero - 654 5796 A9 00 lda #0 - 655 5798 NotNegativeEnergy - 656 5798 9D A2 43 sta Energy,x - 657 ;now increase the gain of the shooting tank - 658 579B A4 6C ldy TankNr - 659 579D 18 clc - 660 579E B9 90 43 lda gainL,y - 661 57A1 6D AE 43 adc EnergyDecrease - 662 57A4 99 90 43 sta gainL,y - 663 57A7 B9 8A 43 lda gainH,y - 664 57AA 69 00 adc #$00 - 665 57AC 99 8A 43 sta gainH,y - 666 57AF 60 rts - 667 .endp - 668 - 669 ;-------------------------------------------------- - 670 57B0 .proc DecreaseShieldEnergyX - 671 ; Decreases energy of shield player nr X by the value Y - 672 ; if shield energy is 0 after decrease then in Y we have - 673 ; rest of the energy - to decrease tank energy - 674 ;-------------------------------------------------- - 675 57B0 8C AE 43 sty EnergyDecrease - 676 57B3 A0 00 ldy #0 ; if Shield survive then no decrease tank anergy - 677 ; Energy cannot be less than 0 - 678 57B5 BD A8 43 lda ShieldEnergy,x - 679 57B8 CD AE 43 cmp EnergyDecrease - 680 57BB 90 05 bcc UseAllShieldEnergy - 681 ;sec - 682 57BD ED AE 43 sbc EnergyDecrease - 683 57C0 10 0A bpl NotNegativeShieldEnergy ; jump allways - 684 57C2 UseAllShieldEnergy - 685 ; now calculate rest of energy for future tank energy decrease - 686 57C2 38 sec - 687 57C3 AD AE 43 lda EnergyDecrease - 688 57C6 FD A8 43 sbc ShieldEnergy,x - 689 57C9 A8 tay - 690 57CA A9 00 lda #0 - 691 57CC NotNegativeShieldEnergy - 692 57CC 9D A8 43 sta ShieldEnergy,x - 693 57CF 60 rts - 694 .endp - 695 - 696 ;--------------------------------- - 697 57D0 .proc Seppuku - 698 ;--------------------------------- - 699 57D0 A9 00 lda #0 - 700 57D2 85 64 sta ydraw+1 - 701 ; get position of the tank - 702 57D4 A6 6C ldx TankNr - 703 ; lda #0 ; turn off defense weapons when hara-kiring - 704 57D6 9D FD 43 sta ActiveDefenceWeapon,x - 705 57D9 9D A8 43 sta ShieldEnergy,x - 706 57DC 20 67 74 jsr SetupXYdraw - 707 57DF A9 01 lda #1 ; Missile - 708 57E1 20 3C 77 jsr ExplosionDirect - 709 57E4 4C 61 56 jmp MainRoundLoop.continueMainRoundLoopAfterSeppuku - 710 .endp - 711 - 712 ;-------------------------------------------------- - 713 57E7 .proc GetRandomWind - 714 ;in: MaxWind (byte) - 715 ;out: Wind (word) - 716 ;uses: _ - 717 ;-------------------------------------------------- - 718 57E7 AD 1B D4 lda random - 719 57EA CD 0A 44 cmp MaxWind - 720 57ED B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again - 721 57EF 85 CE sta Wind - 722 57F1 A9 00 85 CF mva #$00 Wind+1 - 723 57F5 85 D0 sta Wind+2 - 724 57F7 85 D1 sta Wind+3 - 725 ; multiply Wind by 16 - 726 ; two bytes of Wind are treated as a decimal part of vx variable - 727 57F9 06 CE 26 CF 06 CE + :4 aslw Wind - 728 ; decide the direction - 729 5809 AD 1B D4 lda random - 730 580C 29 01 and #$01 - 731 580E F0 19 beq @+ - 732 5810 38 sec ; Wind = -Wind - 733 .rept 4 - 734 LDA #$00 - 735 SBC WIND+# - 736 STA WIND+# - 737 .endr -Source: REPT - 734 5811 A9 00 LDA #$00 - 734 5813 E5 CE SBC WIND+# - 734 5815 85 CE STA WIND+# - 734 5817 A9 00 LDA #$00 - 734 5819 E5 CF SBC WIND+# - 734 581B 85 CF STA WIND+# - 734 581D A9 00 LDA #$00 - 734 581F E5 D0 SBC WIND+# - 734 5821 85 D0 STA WIND+# - 734 5823 A9 00 LDA #$00 - 734 5825 E5 D1 SBC WIND+# - 734 5827 85 D1 STA WIND+# -Source: game.asm - 738 5829 60 @ rts - 739 .endp - 740 ;-------------------------------------------------- - 741 582A .proc MaxForceCalculate - 742 ; calculates max force for tank (tanknr in X) - 743 ; Energy of tank X in A - 744 ;-------------------------------------------------- - 745 582A 85 E8 sta L1 - 746 - 747 ;DATA L1,L2 - 748 ;Multiplication 8bit*8bit, - 749 ;result 16bit - 750 ;this algiorithm is a little longer than one in Ruszczyc 6502 book - 751 ;but it is faster - 752 - 753 582C A0 08 ldy #8 - 754 582E A9 00 lda #0 - 755 5830 18 clc - 756 5831 6A LP0 ror - 757 5832 66 E8 ror L1 - 758 5834 90 03 bcc B0 - 759 5836 18 clc - 760 5837 69 0A adc #10 ; (L2) multiplication by 10 - 761 5839 88 B0 dey - 762 583A D0 F5 bne LP0 - 763 583C 6A ror - 764 583D 66 E8 ror L1 - 765 583F 9D EB 43 sta MaxForceTableH,x - 766 5842 A5 E8 lda L1 - 767 5844 9D E5 43 sta MaxForceTableL,x - 768 5847 60 rts - 769 .endp - 770 - 771 ;-------------------------------------------------- - 772 5848 .proc WeaponCleanup - 773 ; cleaning of the weapon possesion tables - 774 ; 99 of Baby Missles and White Flags, all other weapons=0) - 775 ;-------------------------------------------------- - 776 5848 A2 2F ldx #(number_of_weapons - 1) - 777 584A A9 00 @ lda #$0 - 778 584C E0 20 cpx #ind_White_Flag_____ ; White Flag - 779 584E D0 02 bne no99 - 780 5850 A9 63 set99 lda #99 - 781 5852 9D 1E 45 no99 sta TanksWeapon1,x - 782 5855 9D 4E 45 sta TanksWeapon2,x - 783 5858 9D 7E 45 sta TanksWeapon3,x - 784 585B 9D AE 45 sta TanksWeapon4,x - 785 585E 9D DE 45 sta TanksWeapon5,x - 786 5861 9D 0E 46 sta TanksWeapon6,x - 787 5864 CA dex - 788 5865 F0 E9 beq set99 ; Baby Missile (index=0) - 789 5867 10 E1 bpl @- - 790 5869 60 rts - 791 .endp - 792 - 793 ;-------------------------------------------------- - 794 586A .proc Initialize - 795 ;Initialization sequence - 796 ;uses: temp, ... - 797 ;-------------------------------------------------- - 798 = 0072 deletePtr = temp - 799 - 800 ; clean variables - 801 586A A9 00 lda #0 - 802 586C 85 D7 sta escFlag - 803 586E 85 5D sta JoystickNumber - 804 5870 A8 tay - 805 5871 A9 73 85 72 A9 43 + mwa #variablesStart deletePtr - 806 5879 98 @ tya - 807 587A 91 72 sta (deletePtr),y - 808 587C E6 72 D0 02 E6 73 inw deletePtr - 809 5882 A5 73 C9 4F D0 04 + cpw deletePtr #variablesEnd - 810 588C D0 EB bne @- - 811 - 812 ; ser initial shapes for each tank (tanks 0-5 has shape 0 now) - 813 588E A0 01 ldy #1 - 814 5890 8C 2C 44 sty TankShape+1 - 815 5893 8C 2F 44 sty TankShape+4 - 816 5896 C8 iny - 817 5897 8C 2D 44 sty TankShape+2 - 818 589A 8C 30 44 sty TankShape+5 - 819 - 820 - 821 589D A9 00 8D E6 48 A9 + mwa #1024 RandBoundaryHigh - 822 58A7 A9 FF 8D 0C 45 mva #$ff LastWeapon - 823 58AC 85 C5 sta HowMuchToFall - 824 58AE A9 01 85 A9 mva #1 color - 825 - 826 58B2 20 FB 58 jsr SetStandardBarrels - 827 58B5 20 48 58 jsr WeaponCleanup - 828 - 829 58B8 A9 4F 85 02 mva #>WeaponFont chbas - 830 - 831 ;parameter for old plot (unPlot) max 5 points - 832 58BC A2 04 ldx #4 - 833 58BE SetunPlots - 834 58BE A9 10 lda #display - 837 58C5 9D 97 44 sta oldplotH,x - 838 58C8 A9 00 lda #0 - 839 58CA 9D A6 44 sta oldply,x - 840 58CD A9 FF lda #$ff - 841 58CF 9D A1 44 sta oldora,x - 842 58D2 CA dex - 843 58D3 10 E9 bpl SetunPlots - 844 - 845 ;setting up P/M graphics - 846 58D5 A9 18 lda #>pmgraph - 847 58D7 85 02 sta pmbase - 848 58D9 A9 03 lda #$03 ; P/M on - 849 58DB 85 02 sta GRACTL - 850 58DD 20 62 75 jsr SetPMWidth - 851 58E0 A9 21 lda #%00100001 ; P/M priorities (multicolor players on) - prior=1 - 852 58E2 85 02 sta GPRIOR - 853 58E4 20 46 75 jsr PMoutofScreen - 854 - 855 ;let the tanks be visible! - 856 58E7 A2 05 ldx #(maxPlayers-1) - 857 58E9 A9 63 lda #99 ; tank is visible - 858 58EB MakeTanksVisible - 859 58EB 9D AF 43 sta eXistenZ,x - 860 58EE CA dex - 861 58EF 10 FA bpl MakeTanksVisible - 862 - 863 58F1 A9 01 8D 14 45 mva #1 CurrentRoundNr ;we start from round 1 - 864 58F6 A9 06 85 9C mva #6 NTSCcounter - 865 - 866 58FA 60 rts - 867 .endp - 868 ;-------------------------------------------------- - 869 58FB .proc SetStandardBarrels - 870 ; set standart barrel length and deactivate Auto Defense - 871 ; for all tanks - 872 ;-------------------------------------------------- - 873 58FB A2 05 ldx #maxPlayers-1 - 874 58FD A9 06 @ lda #StandardBarrel ; standard barrel length - 875 58FF 9D F1 43 sta BarrelLength,x - 876 5902 A9 00 lda #$00 ; deactivate Auto Defense - 877 5904 9D 03 44 sta AutoDefenseFlag,x - 878 5907 CA dex - 879 5908 10 F3 bpl @- - 880 590A 60 rts - 881 .endp - 882 ;---------------------------------------------- - 883 /* .proc RandomizeSequence0 - 884 ldx #0 - 885 @ txa - 886 sta TankSequence,x - 887 inx - 888 cpx #MaxPlayers - 889 bne @- - 890 rts - 891 .endp */ - 891 - 892 ;-------------------------------------------------- - 893 590B .proc RandomizeSequence - 894 ; in: NumberOfPlayers - 895 ; out: TankSequence - 896 ; how: get random number lower than NumberOfPlayers - 897 ; put it in the first slot. - 898 ; get another random number lower than NumberOfPlayers - 899 ; check if was previously saved in first slot - 900 ; if not then save it in second slot - 901 ; repeat untill NumberOfPlayers - 902 - 903 590B A2 00 ldx #0 - 904 590D GetRandomAgain0 - 905 590D AD 1B D4 lda RANDOM - 906 5910 29 07 and #$07 ;NumberOfPlayers < 7 - 907 5912 C5 AE cmp NumberOfPlayers - 908 5914 B0 F7 bcs GetRandomAgain0 - 909 5916 9D 77 43 sta TankSequence,x - 910 ;now first slot is ready, nexts slots are handled - 911 ;in a more complicated way - 912 - 913 5919 GetRandomAgainX - 914 5919 AD 1B D4 lda RANDOM - 915 591C 29 07 and #$07 ;NumberOfPlayers < 7 - 916 591E C5 AE cmp NumberOfPlayers - 917 5920 B0 F7 bcs GetRandomAgainX - 918 - 919 ;now we have to check if the value was not used - 920 ;in previous slots - 921 - 922 5922 86 72 stx temp - 923 5924 A4 72 ldy temp - 924 5926 UsageLoop - 925 5926 D9 77 43 cmp TankSequence,y - 926 5929 F0 EE beq GetRandomAgainX ;apparently we have already used this value - 927 592B 88 dey - 928 592C 10 F8 bpl UsageLoop - 929 - 930 ;well, looks like this value is new! - 931 592E E8 inx - 932 592F 9D 77 43 sta TankSequence,x - 933 - 934 5932 86 72 stx temp - 935 5934 E6 72 A5 72 inc:lda temp ;x+1 - 936 - 937 5938 C5 AE cmp NumberOfPlayers - 938 593A D0 DD bne GetRandomAgainX - 939 593C 60 rts - 940 .endp - 941 ;---------------------------------------------- - 942 593D .proc RandomizeAngle - 943 ; routine returns in A - 944 ; a valid angle for the tank's barrel. - 945 ; X is not changed - 946 ;---------------------------------------------- - 947 - 948 ; lets randomize someting between 0 and 180 - 949 593D AD 1B D4 lda RANDOM - 950 5940 C9 B4 cmp #180 - 951 5942 B0 F9 bcs RandomizeAngle - 952 5944 60 rts - 953 .endp - 954 ;---------------------------------------------- - 955 5945 .proc RandomizeForce - 956 ; routine returns in ForceTable/L/H - 957 ; valid force of shooting for TankNr - 958 ; in X must be TankNr - 959 ; low and high randomize boundary passed as word value - 960 ; RandBoundaryLow - 961 ; RandBoundaryHigh - 962 ;---------------------------------------------- - 963 - 964 5945 AD 1B D4 lda RANDOM - 965 5948 85 74 sta temp2 - 966 594A AD 1B D4 lda RANDOM - 967 594D 29 03 and #%00000011 ;(0..1023) - 968 594F 85 75 sta temp2+1 - 969 - 970 5951 AD E5 48 C5 75 D0 + cpw RandBoundaryLow temp2 - 971 595D F0 02 B0 E4 seq:bcs RandomizeForce - 972 - 973 5961 AD E7 48 C5 75 D0 + cpw RandBoundaryHigh temp2 - 974 596D 90 D6 bcc RandomizeForce - 975 - 976 596F A5 74 lda temp2 - 977 5971 9D D9 43 sta ForceTableL,x - 978 5974 A5 75 lda temp2+1 - 979 5976 9D DF 43 sta ForceTableH,x - 980 - 981 ;--------- - 982 5979 LimitForce - 983 ; in X must be TankNr - 984 ; cuts force to MaxForceTable - 985 5979 BD EB 43 lda MaxForceTableH,x - 986 597C DD DF 43 cmp ForceTableH,x - 987 597F D0 06 bne @+ - 988 5981 BD E5 43 lda MaxForceTableL,x - 989 5984 DD D9 43 cmp ForceTableL,x - 990 5987 B0 0C @ bcs @+ - 991 - 992 5989 BD E5 43 lda MaxForceTableL,x - 993 598C 9D D9 43 sta ForceTableL,x - 994 598F BD EB 43 lda MaxForceTableH,x - 995 5992 9D DF 43 sta ForceTableH,x - 996 @ - 997 5995 60 rts - 998 - 999 .endp - 1000 ;---------------------------------------------- - 1001 5996 .proc Table2Force - 1002 ;---------------------------------------------- - 1003 5996 BD D9 43 lda ForceTableL,x - 1004 5999 85 A4 sta Force - 1005 599B BD DF 43 lda ForceTableH,x - 1006 599E 85 A5 sta Force+1 - 1007 59A0 60 rts - 1008 .endp - 1009 ;---------------------------------------------- - 1010 59A1 .proc MoveBarrelToNewPosition - 1011 ;---------------------------------------------- - 1012 59A1 A9 01 85 AA mva #1 Erase - 1013 59A5 20 48 6B jsr DrawTankNr.BarrelChange - 1014 59A8 A9 00 85 AA mva #0 Erase - 1015 59AC MoveBarrel - 1016 59AC A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1017 59B0 20 2C 6A jsr DrawTankNr - 1018 59B3 20 0F 66 jsr DisplayStatus.displayAngle - 1019 ; ldx TankNr - 1020 59B6 A9 01 85 AA mva #1 Erase - 1021 59BA 20 89 5A jsr WaitOneFrame - 1022 59BD 20 48 6B jsr DrawTankNr.BarrelChange - 1023 59C0 A9 00 85 AA mva #0 Erase - 1024 59C4 A5 D6 lda NewAngle - 1025 59C6 DD C3 48 cmp AngleTable,x - 1026 59C9 F0 0E beq BarrelPositionIsFine - 1027 59CB 90 06 bcc rotateLeft - 1028 59CD rotateRight ; older is lower - 1029 59CD FE C3 48 inc angleTable,x - 1030 59D0 4C AC 59 jmp MoveBarrel - 1031 59D3 rotateLeft ; older is bigger - 1032 59D3 DE C3 48 dec angleTable,x - 1033 59D6 4C AC 59 jmp MoveBarrel - 1034 59D9 BarrelPositionIsFine - 1035 59D9 20 2C 6A jsr DrawTankNr - 1036 59DC 60 rts - 1037 - 1038 .endp - 1039 - 1040 ;---------------------------------------------- - 1041 59DD .proc SortSequence ; - 1042 ;---------------------------------------------- - 1043 ; here we try to get a sequence of tanks for two - 1044 ; purposes: - 1045 ; 1. to make up shooting sequence for the next round (from down to top) - 1046 ; 2. to display game results more nicely (from top to down) - 1047 ; - 1048 ; I think I will go for a stupid bubble sort... - 1049 ; it is easy to test :) - 1050 ; - 1051 ; Results are in ResultsTable, in TankSequence (Sorted Table) we want to - 1052 ; have numbers of tanks from the worst to the best. - 1053 ; in other words, if ResultsTable=(5,4,65,23,3,6) - 1054 ; the TankSequence=(4,1,0,5,3,2) - 1055 ; let's assume initially the TankSequence=(0,1,2,3,4,5) - 1056 - 1057 59DD A2 00 ldx #0 - 1058 59DF SequenceStart - 1059 59DF 8A txa - 1060 59E0 9D 77 43 sta TankSequence,x - 1061 59E3 E8 inx - 1062 59E4 E0 06 cpx #MaxPlayers - 1063 59E6 D0 F7 bne SequenceStart - 1064 - 1065 ; we will need a TempResults (TR) table to fiddle with - 1066 59E8 A2 00 ldx #0 - 1067 59EA movetotemp - 1068 59EA BD BB 43 lda ResultsTable,x - 1069 59ED 9D C1 43 sta TempResults,x - 1070 59F0 E8 inx - 1071 59F1 E4 AE cpx NumberOfPlayers - 1072 59F3 D0 F5 bne movetotemp - 1073 - 1074 ; i=0:sortflag=0 - 1075 ;loop: - 1076 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers - 1077 ; or goto loop: - 1078 ; else - 1079 ; temp=TR(i): tempo=TankSequence(i) - 1080 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) - 1081 ; TR(i+1)=temp: TankSequence(i+1)=tempo - 1082 ; i=i+1 - 1083 ; sortflag=sortflag+1 - 1084 ; go loop: - 1085 ; if sortflag=0 then finished, else repeat... - 1086 ; - 1087 ; or something like this :) - 1088 59F5 A6 AE ldx NumberOfPlayers - 1089 59F7 CA dex - 1090 59F8 86 73 stx temp+1 ; for checking end of the loop only - 1091 - 1092 59FA Bubble - 1093 59FA A2 00 ldx #0 ;i=x - 1094 59FC 86 74 stx temp2 ; sortflag=temp2 - 1095 - 1096 59FE BubbleBobble - 1097 59FE BD C1 43 lda TempResults,x - 1098 5A01 DD C2 43 cmp TempResults+1,x - 1099 5A04 90 31 bcc nextishigher - 1100 5A06 D0 10 bne swapvalues - 1101 5A08 nextisequal - 1102 ; if results are equal, check Direct Hits - 1103 5A08 BC 77 43 ldy TankSequence,x - 1104 5A0B B9 C7 43 lda DirectHits,y - 1105 5A0E BC 78 43 ldy TankSequence+1,x - 1106 5A11 D9 C7 43 cmp DirectHits,y - 1107 ; - 1108 5A14 F0 21 beq nextishigher ; this is to block hangs when 2 equal values meet - 1109 5A16 90 1F bcc nextishigher - 1110 ;here we must swap values - 1111 ;because next is smaller than previous - 1112 5A18 swapvalues - 1113 5A18 85 72 sta temp - 1114 5A1A BD C2 43 lda TempResults+1,x - 1115 5A1D 9D C1 43 sta TempResults,x - 1116 5A20 A5 72 lda temp - 1117 5A22 9D C2 43 sta TempResults+1,x - 1118 ; - 1119 5A25 BD 77 43 lda TankSequence,x - 1120 5A28 85 72 sta temp - 1121 5A2A BD 78 43 lda TankSequence+1,x - 1122 5A2D 9D 77 43 sta TankSequence,x - 1123 5A30 A5 72 lda temp - 1124 5A32 9D 78 43 sta TankSequence+1,x - 1125 5A35 E6 74 inc temp2 - 1126 5A37 nextishigher - 1127 5A37 E8 inx - 1128 5A38 E4 73 cpx temp+1 ;cpx ^NumberOfPlayers-1 - 1129 5A3A D0 C2 bne BubbleBobble - 1130 - 1131 5A3C A5 74 lda temp2 - 1132 - 1133 5A3E D0 BA bne Bubble - 1134 - 1135 5A40 60 rts - 1136 .endp - 1137 ;-------------------------------------------------- - 1138 5A41 .proc SetWallsType - 1139 ;-------------------------------------------------- - 1140 5A41 A9 00 8D 0C 44 mva #0 WallsType - 1141 5A46 AD 47 41 lda OptionsTable+8 - 1142 5A49 C9 04 cmp #4 - 1143 5A4B F0 09 beq SetRandomWalls - 1144 5A4D 4A lsr - 1145 5A4E 6E 0C 44 ror WallsType - 1146 5A51 4A lsr - 1147 5A52 6E 0C 44 ror WallsType - 1148 5A55 60 rts - 1149 5A56 SetRandomWalls - 1150 5A56 AD 1B D4 lda random - 1151 5A59 29 C0 and #%11000000 - 1152 5A5B 8D 0C 44 sta WallsType - 1153 5A5E 60 rts - 1154 .endp - 1155 - 1156 .ENDIF - 236 ;-------------------------------------------------- - 237 - 238 - 239 ;-------------------------------------------------- - 240 5A5F .proc GetKey - 241 ; waits for pressing a key and returns pressed value in A - 242 ; when [ESC] is pressed, escFlag is set - 243 ; result: A=keycode - 244 ;-------------------------------------------------- - 245 5A5F 20 71 5A jsr WaitForKeyRelease - 246 5A62 A9 00 lda #0 - 247 5A64 85 D7 sta escFlag - 248 5A66 A9 FF lda #$ff - 249 5A68 60 rts - 250 .endp - 251 - 252 ;-------------------------------------------------- - 253 5A69 .proc getkeynowait - 254 ;-------------------------------------------------- - 255 5A69 20 71 5A jsr WaitForKeyRelease - 256 5A6C A5 02 lda kbcode - 257 5A6E 29 3F and #$3f ;CTRL and SHIFT ellimination - 258 5A70 60 rts - 259 .endp - 260 - 261 ;-------------------------------------------------- - 262 5A71 .proc WaitForKeyRelease - 263 ;-------------------------------------------------- - 264 5A71 StillWait - 265 5A71 60 rts - 266 .endp - 267 ;-------------------------------------------------- - 268 5A72 .proc IsKeyPressed - 269 ; result: A=0 - yes , A>0 - no - 270 ;-------------------------------------------------- - 271 5A72 A9 01 lda #1 - 272 5A74 60 rts - 273 .endp - 274 ;-------------------------------------------------- - 275 5A75 .proc DemoModeOrKey - 276 ; Waits for the key pressed if at least one human is playing. - 277 ; Otherwise, waits 3 seconds (demo mode). - 278 ;-------------------------------------------------- - 279 ;check demo mode - 280 5A75 A6 AE ldx numberOfPlayers - 281 5A77 CA dex - 282 5A78 checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE - 283 5A78 BD 39 41 lda skillTable,x - 284 5A7B F0 09 beq peopleAreHere - 285 5A7D CA dex - 286 5A7E 10 F8 bpl checkForHuman - 287 ; no people, just wait a bit - 288 ;pause 150 - 289 5A80 A0 4B ldy #75 - 290 5A82 20 9D 5A jsr PauseYFrames - 291 5A85 60 rts - 292 5A86 peopleAreHere - 293 5A86 4C 5F 5A jmp getkey ; jsr:rts - 294 .endp - 295 - 296 ;-------------------------------------------------- - 297 5A89 MakeDarkScreen - 298 ;-------------------------------------------------- - 299 ; mva #0 dmactls ; dark screen - 300 ; and wait one frame :) - 301 ;-------------------------------------------------- - 302 5A89 .proc WaitOneFrame - 303 ;-------------------------------------------------- - 304 5A89 wait ; or waitRTC ? -Macro: WAIT [Source: MACRO.ASM] - 3 5A89 AD 12 D0 ?ze LDA $D012 - 4 5A8C C9 10 cmp #16 ; if line<16 then wait for line>15 (long VBI protection) - 5 5A8E 90 F9 bcc ?ze - 6 5A90 E9 0A sbc #10 ; last lines correction - 7 5A92 CD 12 D0 ?wa cmp $D012 - 8 5A95 90 FB bcc ?wa - 9 5A97 CD 12 D0 ?wf cmp $D012 - 10 5A9A B0 FB bcs ?wf -Source: scorchC64.asm - 305 5A9C 60 rts - 306 .endp - 307 - 308 ;-------------------------------------------------- - 309 5A9D .proc PauseYFrames - 310 ; Y - number of frames to wait (divided by 2) - 311 ; pauses for maximally 510 frames (255 * 2) - 312 ;-------------------------------------------------- - 313 5A9D 20 89 5A @ jsr WaitOneFrame - 314 5AA0 20 89 5A jsr WaitOneFrame - 315 5AA3 88 dey - 316 5AA4 D0 F7 bne @- - 317 5AA6 60 rts - 318 .endp - 319 - 320 ;-------------------------------------------------- - 321 5AA7 .proc ShellDelay - 322 5AA7 AE 76 43 ldx flyDelay - 323 5AAA DelayLoop - 324 5AAA AD 12 D0 lda $d012 - 325 5AAD CD 12 D0 @ cmp $d012 - 326 5AB0 F0 FB beq @- - 327 5AB2 CA dex - 328 5AB3 D0 F5 bne DelayLoop - 329 5AB5 noShellDelay - 330 5AB5 60 rts - 331 .endp - 332 ;-------------------------------------------------- - 333 5AB6 .proc RmtSongSelect - 334 ; starting song line 0-255 to A reg - 335 ;-------------------------------------------------- - 336 5AB6 60 rts - 337 .endp - 338 5AB7 .proc CopyFromRom - 339 5AB7 60 rts - 340 .endp - 341 ;-------------------------------------------------- - 342 5AB8 icl 'C64/interrupts.asm' -Source: interrupts.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 = 0000 DLIinterruptGraph = 0 - 6 ;-------------------------------------------------- - 7 .macro SetDLI - 8 ; SetDLI #WORD - 9 ; Initialises Display List Interrupts - 10 LDY # <:1 - 11 LDX # >:1 - 12 jsr _SetDLIproc - 13 .endm - 14 5AB8 .proc _SetDLIproc - 15 ; LDA #$C0 - 16 ; STY VDSLST - 17 ; STX VDSLST+1 - 18 ; STA NMIEN - 19 5AB8 60 rts - 20 .endp - 21 - 22 .ENDIF - 343 ;---------------------------------------------- - 344 5AB9 icl 'constants.asm' -Source: constants.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 ; initial values for some variables - 6 5AB9 initialvaluesStart - 7 5AB9 00 01 02 02 00 01 + I_OptionsTable .by 0,1,2,2,0,1,3,2,0 - 8 5AC2 0A I_RoundsInTheGame .by 10 ;how many rounds in the current game - 9 5AC3 4B I_seppukuVal .by 75 - 10 5AC4 03 I_mountainDeltaH .by 3 - 11 5AC5 FF I_mountainDeltaL .by $ff - 12 ;---------------------------------------------------- - 13 5AC6 I_LineHeader1 - 14 5AC6 03 00 32 2F 35 2E + dta d"# ROUND: " - 15 5ACF I_RoundNrDisplay - 16 5ACF 00 00 00 00 03 FF dta d" #", $ff - 17 = 001C initialvaluesCount = *-initialvaluesstart ; MAX 128 bytes ! - 18 ;=================================================================================== - 19 ;==========================CONSTANT TABLES, do not erase!=========================== - 20 ;=================================================================================== - 21 - 22 5AD5 00 01 03 05 07 mountainsDeltaTableH .by 0,1,3,5,7 - 23 5ADA 1F 7F FF 7F FF mountainsDeltaTableL .by $1f, $7f, $ff, $7f, $ff - 24 ;------------------------------------------------ - 25 5ADF LevelNameBeginL ; begins of level names - 26 5ADF 00 0A 14 .by NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) - 31 5AEB 00 00 00 .by >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) - 32 5AEE 00 00 00 .by >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) - 33 ;-------------- - 34 5AF1 TanksWeaponsTableL - 35 5AF1 1E 4E 7E AE DE 0E .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 - 38 ;-------------- - 39 5AFD XtankOffsetGO_L - 40 5AFD 06 38 6A 9C CE 00 .by 6,56,106,156,206,0 - 41 5B03 XtankOffsetGO_H - 42 5B03 00 00 00 00 00 01 .by 0,0,0,0,0,1 - 43 ;-----4x4 texts----- - 44 5B09 LineTop - 45 5B09 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%%)" - 46 ;# - vertical, () * +, % - horizontal - 47 5B17 LineBottom - 48 5B17 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%%+" - 49 5B25 LineEmpty - 50 5B25 03 00 00 00 00 00 + dta d"# #" - 51 5B33 LineHeader2 - 52 5B33 03 00 00 32 25 33 + dta d"# RESULTS #" - 53 5B41 LineGameOver - 54 5B41 03 00 27 21 2D 25 + dta d"# GAME OVER #" - 55 5B4F seppukuText - 56 5B4F 03 00 00 33 25 30 + dta d"# SEPPUKU! #" - 57 5B5D areYouSureText - 58 5B5D 03 00 33 35 32 25 + dta d"# SURE? Y/N #" - 59 5B6B lineClear - 60 5B6B 00 00 00 00 00 00 + dta d" " - 61 - 62 5B79 58 2A 96 CA 7A ED TankColoursTable .BYTE $58,$2a,$96,$ca,$7a,$ed - 63 ;TankStatusColoursTable .BYTE $54,$24,$92,$c4,$74,$e4 ; standard order - 64 5B7F 74 C4 24 E4 54 94 TankStatusColoursTable .BYTE $74,$c4,$24,$e4,$54,$94 ; Adam's order - 65 ;----------- - 66 5B85 GradientAddrL - 67 5B85 BC BC 8B .by dliColorsFore, >dliColorsFore, >dliColorsFore2 - 70 5B8B dliColorsFore2 ; colors for NTSC - 71 5B8B 0A .by $0a ; one mountains color - 72 5B8C 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - 73 5B96 3A 1A 1A EA EA D8 + .by $3a,$1a,$1a,$ea,$ea,$d8,$d8,$b8,$b8,$b8 - 74 5BA0 dliColorsFore2PAL ; colors for PAL - 75 5BA0 0A .by $0a ; one mountains color - 76 5BA1 7A 7A 7A 6A 6A 5A + .by $7a,$7a,$7a,$6a,$6a,$5a,$5a,$4a,$4a,$3a - 77 5BAB 3A 1A 1A EA EA C8 + .by $3a,$1a,$1a,$ea,$ea,$c8,$c8,$a8,$a8,$a8 - 78 - 79 ;----------- - 80 5BB5 pmtableL ; addressess of the P/M memory for 6 tanks - 81 5BB5 00 .by <(pmgraph+$400) - 82 5BB6 00 .by <(pmgraph+$500) - 83 5BB7 00 .by <(pmgraph+$600) - 84 5BB8 00 .by <(pmgraph+$700) - 85 5BB9 00 .by <(pmgraph+$300) ; this is a missile background - 86 5BBA 00 .by <(pmgraph+$300) ; this is a missile background - 87 5BBB pmtableH - 88 5BBB 1C .by >(pmgraph+$400) - 89 5BBC 1D .by >(pmgraph+$500) - 90 5BBD 1E .by >(pmgraph+$600) - 91 5BBE 1F .by >(pmgraph+$700) - 92 5BBF 1B .by >(pmgraph+$300) - 93 5BC0 1B .by >(pmgraph+$300) - 94 ;----------- - 95 5BC1 sintable - 96 5BC1 01 .by 1 - 97 5BC2 04 .by 4 - 98 5BC3 08 .by 8 - 99 5BC4 0D .by 13 - 100 5BC5 11 .by 17 - 101 5BC6 16 .by 22 - 102 5BC7 1A .by 26 - 103 5BC8 1F .by 31 - 104 5BC9 23 .by 35 - 105 5BCA 28 .by 40 - 106 5BCB 2C .by 44 - 107 5BCC 30 .by 48 - 108 5BCD 35 .by 53 - 109 5BCE 39 .by 57 - 110 5BCF 3D .by 61 - 111 5BD0 42 .by 66 - 112 5BD1 46 .by 70 - 113 5BD2 4A .by 74 - 114 5BD3 4F .by 79 - 115 5BD4 53 .by 83 - 116 5BD5 57 .by 87 - 117 5BD6 5B .by 91 - 118 5BD7 5F .by 95 - 119 5BD8 64 .by 100 - 120 5BD9 68 .by 104 - 121 5BDA 6C .by 108 - 122 5BDB 70 .by 112 - 123 5BDC 74 .by 116 - 124 5BDD 78 .by 120 - 125 5BDE 7C .by 124 - 126 5BDF 80 .by 128 - 127 5BE0 83 .by 131 - 128 5BE1 87 .by 135 - 129 5BE2 8B .by 139 - 130 5BE3 8F .by 143 - 131 5BE4 92 .by 146 - 132 5BE5 96 .by 150 - 133 5BE6 9A .by 154 - 134 5BE7 9D .by 157 - 135 5BE8 A1 .by 161 - 136 5BE9 A4 .by 164 - 137 5BEA A7 .by 167 - 138 5BEB AB .by 171 - 139 5BEC AE .by 174 - 140 5BED B1 .by 177 - 141 5BEE B5 .by 181 - 142 5BEF B8 .by 184 - 143 5BF0 BB .by 187 - 144 5BF1 BE .by 190 - 145 5BF2 C1 .by 193 - 146 5BF3 C4 .by 196 - 147 5BF4 C6 .by 198 - 148 5BF5 C9 .by 201 - 149 5BF6 CC .by 204 - 150 5BF7 CF .by 207 - 151 5BF8 D1 .by 209 - 152 5BF9 D4 .by 212 - 153 5BFA D6 .by 214 - 154 5BFB D9 .by 217 - 155 5BFC DB .by 219 - 156 5BFD DD .by 221 - 157 5BFE DF .by 223 - 158 5BFF E2 .by 226 - 159 5C00 E4 .by 228 - 160 5C01 E6 .by 230 - 161 5C02 E8 .by 232 - 162 5C03 E9 .by 233 - 163 5C04 EB .by 235 - 164 5C05 ED .by 237 - 165 5C06 EE .by 238 - 166 5C07 F0 .by 240 - 167 5C08 F2 .by 242 - 168 5C09 F3 .by 243 - 169 5C0A F4 .by 244 - 170 5C0B F6 .by 246 - 171 5C0C F7 .by 247 - 172 5C0D F8 .by 248 - 173 5C0E F9 .by 249 - 174 5C0F FA .by 250 - 175 5C10 FB .by 251 - 176 5C11 FC .by 252 - 177 5C12 FC .by 252 - 178 5C13 FD .by 253 - 179 5C14 FE .by 254 - 180 5C15 FE .by 254 - 181 5C16 FF .by 255 - 182 5C17 FF .by 255 - 183 5C18 FF .by 255 - 184 5C19 FF .by 255 - 185 5C1A FF .by 255 - 186 5C1B FF .by 255 ;anti self destruction byte - 187 - 188 ;linetableL - 189 ; :screenheight+1 .by <(display+screenBytes*#) - 190 ;linetableH - 191 ; :screenheight+1 .by >(display+screenBytes*#) - 192 ;---------------------------- - 193 5C1C bittable - 194 5C1C 80 40 20 10 08 04 + .by $80,$40,$20,$10,$08,$04,$02,$01 - 195 5C24 bittable2 - 196 5C24 7F BF DF EF F7 FB + .by $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe - 197 ;---------------------------- - 198 5C2C disktance ;tanks distance - 199 5C2C 00 00 .by 0,0 - 200 5C2E 6A .by screenwidth/3 - 201 5C2F 50 .by screenwidth/4 - 202 5C30 40 .by screenwidth/5 - 203 5C31 35 .by screenwidth/6 - 204 5C32 2D .by screenwidth/7 - 205 ;max number of players=6 - 206 - 207 ; this table is for deciding where a tank should slide - 208 ; accordingly to what is below the tank - 209 ; values in table mean that tank is moving to the left - 210 5C33 SlideLeftTable - 211 5C33 01 .BY %00000001 - 212 5C34 02 .BY %00000010 - 213 5C35 03 .BY %00000011 - 214 5C36 04 .BY %00000100 - 215 5C37 05 .BY %00000101 - 216 5C38 06 .BY %00000110 - 217 5C39 07 .BY %00000111 - 218 ; .BY %00001100 - 219 = 0007 SlideLeftTableLen = *-SlideLeftTable - 220 ;------------------------------------------------- - 221 5C3A TanksNamesDefault - 222 5C3A 11 73 74 0E 34 61 + dta d"1st.Tank" - 223 5C42 12 6E 64 0E 34 61 + dta d"2nd.Tank" - 224 5C4A 13 72 64 0E 34 61 + dta d"3rd.Tank" - 225 5C52 14 74 68 0E 34 61 + dta d"4th.Tank" - 226 5C5A 15 74 68 0E 34 61 + dta d"5th.Tank" - 227 5C62 16 74 68 0E 34 61 + dta d"6th.Tank" - 228 ;------------------------------------------------- - 229 5C6A 20 TankShapesTable .BYTE char_tank1___________ - 230 5C6B 24 .BYTE char_tank2___________ - 231 5C6C 2C .BYTE char_tank3___________ - 232 5C6D 28 .BYTE char_tank4___________ - 233 ;------------------------------------------------- - 234 5C6E WeaponPriceH ; weapons prices (tables with prices of weapons) - 235 5C6E 00 .by >price_Baby_Missile___ - 236 5C6F 00 .by >price_Missile________ - 237 5C70 00 .by >price_Baby_Nuke______ - 238 5C71 00 .by >price_Nuke___________ - 239 5C72 00 .by >price_LeapFrog_______ - 240 5C73 01 .by >price_Funky_Bomb_____ - 241 5C74 01 .by >price_MIRV___________ - 242 5C75 01 .by >price_Death_s_Head___ - 243 5C76 00 .by >price_Napalm_________ - 244 5C77 00 .by >price_Hot_Napalm_____ - 245 5C78 00 .by >price_Tracer_________ - 246 5C79 01 .by >price_Smoke_Tracer___ - 247 5C7A 00 .by >price_Baby_Roller____ - 248 5C7B 00 .by >price_Roller_________ - 249 5C7C 01 .by >price_Heavy_Roller___ - 250 5C7D 00 .by >price_Riot_Charge____ - 251 5C7E 00 .by >price_Riot_Blast_____ - 252 5C7F 01 .by >price_Riot_Bomb______ - 253 5C80 01 .by >price_Heavy_Riot_Bomb - 254 5C81 00 .by >price_Baby_Digger____ - 255 5C82 00 .by >price_Digger_________ - 256 5C83 00 .by >price_Heavy_Digger___ - 257 5C84 00 .by >price_Baby_Sandhog___ - 258 5C85 00 .by >price_Sandhog________ - 259 5C86 00 .by >price_Heavy_Sandhog__ - 260 5C87 00 .by >price_Dirt_Clod______ - 261 5C88 00 .by >price_Dirt_Ball______ - 262 5C89 00 .by >price_Ton_of_Dirt____ - 263 5C8A 01 .by >price_Liquid_Dirt____ - 264 5C8B 01 .by >price_Dirt_Charge____ - 265 5C8C 00 .by >price_Buy_me_________ - 266 5C8D 01 .by >price_Laser__________ - 267 5C8E 00 .by >price_White_Flag_____ - 268 5C8F 01 .by >price_Battery________ - 269 5C90 01 .by >price_Hovercraft_____ - 270 5C91 00 .by >price_Parachute______ - 271 5C92 03 .by >price_StrongParachute - 272 5C93 02 .by >price_Mag_Deflector__ - 273 5C94 00 .by >price_Shield_________ - 274 5C95 02 .by >price_Heavy_Shield___ - 275 5C96 04 .by >price_Force_Shield___ - 276 5C97 02 .by >price_Bouncy_Castle__ - 277 5C98 08 .by >price_Long_Barrel____ - 278 5C99 03 .by >price_Nuclear_Winter_ - 279 5C9A 01 .by >price_Lazy_Boy_______ - 280 5C9B 02 .by >price_Lazy_Darwin____ - 281 5C9C 00 .by >price_Auto_Defense___ - 282 5C9D 00 .by >price_Spy_Hard_______ - 283 5C9E WeaponPriceL - 284 5C9E 00 .by 0 - 5 - 6 = 0000 WeaponsListDL = 0 - 7 = 0000 NamesOfLevels = 0 - 8 ;---------------------------------------- - 9 ; this module contains routines used in text mode - 10 ; like shop and start-up options - 11 ;---------------------------------------- - 12 - 13 ;-------------------------------------------------- - 14 62E5 .proc Options - 15 ;-------------------------------------------------- - 16 ; start-up screen - options, etc. - 17 ; this function returns: - 18 ; - number of players (NumberOfPlayers) - 19 ; - money each player has on the beginning of the game (moneyL i moneyH) - 20 ; - and I am sure maxwind, gravity, no_of_rounds in a game, speed of shell flight - 21 - 22 - 23 62E5 A2 08 ldx #$08 - 24 62E7 BD F1 62 @ lda Autoplay_OptionsTable,x - 25 62EA 9D 3F 41 sta OptionsTable,x - 26 62ED CA dex - 27 62EE 10 F7 bpl @- - 28 - 29 62F0 60 rts - 30 - 31 62F1 04 04 02 02 04 01 + Autoplay_OptionsTable .by 4,4,2,2,4,1,3,2,4 - 32 - 33 .endp - 34 - 35 62FA .proc SelectNextGradient - 36 62FA AD 75 43 lda OptionsY ; if "Wind" option selected - 37 62FD C9 03 cmp #$03 - 38 62FF D0 07 bne NotWind - 39 6301 A5 5C lda WindChangeInRound ; wind change after each turn (not round only) flag - 40 6303 49 1F eor #$1f ; '?' character - 41 6305 85 5C sta WindChangeInRound - 42 6307 60 rts - 43 6308 NotWind - 44 6308 A4 59 ldy GradientNr - 45 630A C8 iny - 46 630B C0 03 cpy #$03 - 47 630D D0 02 bne NoGradientLoop - 48 630F A0 00 ldy #$00 - 49 6311 NoGradientLoop - 50 6311 84 59 sty GradientNr - 51 6313 B9 85 5B lda GradientAddrL,y - 52 6316 85 5A sta GradientColors - 53 6318 B9 88 5B lda GradientAddrH,y - 54 631B 85 5B sta GradientColors+1 - 55 631D 60 rts - 56 .endp - 57 - 58 ; -------------------------------------- - 59 ; Sets the appropriate variables based on the options table - 60 ; - 61 631E .proc SetVariablesFromOptions - 62 ;first option - 63 631E AC 3F 41 ldy OptionsTable - 64 6321 C8 iny - 65 6322 C8 iny - 66 6323 84 AE sty NumberOfPlayers ;1=1 player (but minimum is 2) - 67 - 68 ;second option (cash) - 69 - 70 - 71 6325 AC 40 41 ldy OptionsTable+1 - 72 6328 A2 00 ldx #0 - 73 @ - 74 632A B9 D1 A2 lda CashOptionL,y - 75 632D 9D 84 43 sta moneyL,x - 76 6330 B9 D6 A2 lda CashOptionH,y - 77 6333 9D 7E 43 sta moneyH,x - 78 6336 E8 inx - 79 6337 E4 AE cpx NumberOfPlayers - 80 6339 D0 EF bne @- - 81 - 82 ;third option (gravity) - 83 633B AC 41 41 ldy OptionsTable+2 - 84 633E B9 DB A2 lda GravityTable,y - 85 6341 85 E0 sta gravity - 86 - 87 ;fourth option (wind) - 88 6343 AC 42 41 ldy OptionsTable+3 - 89 6346 B9 E0 A2 lda MaxWindTable,y - 90 6349 8D 0A 44 sta MaxWind - 91 - 92 ;fifth option (no of rounds) - 93 634C AC 43 41 ldy OptionsTable+4 - 94 634F B9 E5 A2 lda RoundsTable,y - 95 6352 8D 48 41 sta RoundsInTheGame - 96 - 97 ;6th option (shell speed) - 98 6355 AC 44 41 ldy OptionsTable+5 - 99 6358 B9 F4 A2 lda flyDelayTable,y - 100 635B 8D 76 43 sta flyDelay - 101 - 102 ;7th option (Airstrike after how many missess) - 103 635E AC 45 41 ldy OptionsTable+6 - 104 6361 B9 F9 A2 lda seppukuTable,y - 105 6364 8D 49 41 sta seppukuVal - 106 - 107 ;8th option (how aggressive are mountains) - 108 6367 AC 46 41 ldy OptionsTable+7 - 109 636A B9 D5 5A lda mountainsDeltaTableH,y - 110 636D 8D 4A 41 sta mountainDeltaH - 111 6370 B9 DA 5A lda mountainsDeltaTableL,y - 112 6373 8D 4B 41 sta mountainDeltaL - 113 - 114 - 115 6376 60 rts - 116 .endp - 117 - 118 ;------------------------------------------- - 119 ; call of the purchase (and activate) screens for each tank - 120 6377 .proc CallPurchaseForEveryTank - 121 - 122 6377 A9 00 85 6C mva #0 TankNr - 123 637B 85 E4 sta isInventory - 124 @ - 125 637D A6 6C ldx TankNr - 126 637F BD 39 41 lda SkillTable,x - 127 6382 F0 06 beq ManualPurchase - 128 6384 20 A3 94 jsr PurchaseAI ; remember to make ActivateAI :) !!! - 129 6387 4C A3 63 jmp AfterManualPurchase - 130 638A ManualPurchase - 131 638A BD 25 44 lda JoyNumber,x - 132 638D 85 5D sta JoystickNumber ; set joystick port for player - 133 638F A9 00 85 E4 mva #0 isInventory - 134 6393 20 C0 63 jsr Purchase ; purchase weapons - 135 6396 24 D7 bit escFlag - 136 6398 10 01 60 spl:rts - 137 639B 20 AC 63 jsr DefensivesActivate ; activate weapons - 138 639E 24 D7 bit escFlag - 139 63A0 10 01 60 spl:rts - 140 63A3 AfterManualPurchase - 141 63A3 E6 6C A5 6C inc:lda TankNr - 142 63A7 C5 AE cmp NumberOfPlayers - 143 63A9 D0 D2 bne @- - 144 63AB 60 rts - 145 .endp - 146 ;-------------------------------------------------- - 147 63AC .proc DefensivesActivate - 148 ;-------------------------------------------------- - 149 ; This proc call Inventory and set Defensives activation first - 150 - 151 63AC A9 ED 85 00 A9 4C + mwa #ListOfDefensiveWeapons WeaponsListDL ;switch to the list of offensive weapons - 152 63B4 A9 FF 85 E4 mva #$ff IsInventory - 153 63B8 A9 80 8D 0D 45 mva #%10000000 WhichList - 154 ; offensive weapon - 0, defensive - %10000000 - 155 63BD 4C C5 63 jmp Purchase.GoToActivation - 156 .endp - 157 - 158 - 159 ;-------------------------------------------------- - 160 63C0 .proc Purchase ; - 161 ;-------------------------------------------------- - 162 ; In tanknr there is a number of the tank (player) - 163 ; that is buying weapons now (from 0). - 164 ; Rest of the data is taken from appropriate tables - 165 ; and during the purchase these tables are modified. - 166 - 167 - 168 ; we are clearing list of the weapons - 169 63C0 A9 00 8D 0D 45 mva #$00 WhichList - 170 ; offensive weapon - 0, deffensive - %10000000 - 171 63C5 GoToActivation - 172 63C5 60 rts - 173 - 174 .endp - 175 - 176 ; ----------------------------------------------------- - 177 63C6 .proc EnterPlayerNames - 178 ;entering names of players - 179 - 180 63C6 A9 00 85 6C mva #0 TankNr - 181 63CA 85 02 sta COLBAKS ; set color of background - 182 63CC AA @ tax - 183 63CD BD 7F 5B lda TankStatusColoursTable,x - 184 63D0 85 02 sta COLOR2 ; set color of player name line - 185 63D2 20 E6 63 jsr EnterPlayerName - 186 63D5 24 D7 bit escFlag - 187 63D7 10 01 60 spl:rts - 188 63DA 20 46 A2 jsr CheckTankCheat - 189 63DD E6 6C inc TankNr - 190 63DF A5 6C lda TankNr - 191 63E1 C5 AE cmp NumberOfPlayers - 192 63E3 D0 E7 bne @- - 193 63E5 60 rts - 194 .endp - 195 ; ----------------------------------------------------- - 196 63E6 .proc EnterPlayerName - 197 ; in: TankNr - 198 ; Out: TanksNames, SkillTable - 199 - 200 ; this little thing is for choosing Player's skill (if computer) - 201 ; and entering his name - 202 ; If no name entered, there should be name "1st Tank", etc. - 203 ; Default tanks names are in table TanksNamesDefault - 204 ; ----------------------------------------------------- - 205 - 206 ; - 207 - 208 63E6 EndOfNick - 209 ; storing name of the player and its level - 210 - 211 ; level of the computer opponent goes to - 212 ; the table of levels (difficulties) - 213 63E6 A6 6C ldx tanknr - 214 63E8 A9 06 lda #6 ; Spoiler - 215 63EA 85 E5 sta DifficultyLevel - 216 63EC 9D 39 41 sta skilltable,x - 217 63EF F0 05 beq NotRobot - 218 63F1 A9 03 lda #$03 ; shape for robotanks - 219 63F3 9D 2B 44 sta TankShape,x - 220 63F6 NotRobot - 221 ; storing name of the tank in the right space - 222 ; (without cursor!) - 223 63F6 A0 00 ldy #$00 - 224 63F8 8A txa ; ldx TankNr - 225 63F9 0A asl - 226 63FA 0A asl - 227 63FB 0A asl ; 8 chars per name - 228 63FC AA tax ; in X where to put new name - 229 - 230 63FD A9 16 85 9E mva #sfx_next_player sfx_effect - 231 - 232 - 233 ; check if all chars are empty (" ") - 234 6401 A0 07 ldy #7 - 235 6403 A9 00 lda #0 - 236 6405 09 00 @ ora #0 ; NameAdr,y - 237 6407 29 7F and #$7F ; remove inverse (Cursor) - 238 6409 88 dey - 239 640A 10 F9 bpl @- - 240 640C A8 tay - 241 640D F0 10 beq MakeDefaultName - 242 - 243 640F A0 00 ldy #0 - 244 6411 nextchar04 - 245 6411 A9 00 lda #0 ; NameAdr,y - 246 6413 29 7F and #$7f ; remove inverse (Cursor) - 247 6415 9D 09 41 sta tanksnames,x - 248 6418 E8 inx - 249 6419 C8 iny - 250 641A C0 08 cpy #$08 - 251 641C D0 F3 bne nextchar04 - 252 641E 60 rts - 253 641F MakeDefaultName - 254 641F nextchar05 - 255 641F BD 3A 5C lda tanksnamesDefault,x - 256 6422 9D 09 41 sta tanksnames,x - 257 6425 E8 inx - 258 6426 C8 iny - 259 6427 C0 08 cpy #$08 - 260 6429 D0 F4 bne nextchar05 - 261 642B 60 rts - 262 .endp - 263 ;-------------------------------------------------- - 264 642C .proc displaydec5 ;decimal (word), displayposition (word) - 265 ;-------------------------------------------------- - 266 ; displays decimal number as in parameters (in text mode) - 267 ; leading zeroes are removed - 268 ; the range is (00000..65565 - two bytes) - 269 - 270 642C A0 04 ldy #4 ; there will be 5 digits - 271 642E NextDigit - 272 642E A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times - 273 6430 A9 00 lda #$00 - 274 6432 Rotate000 - 275 6432 aslw decimal -Macro: ASLW [Source: MACRO.ASM] - 1 6432 06 AC ASL DECIMAL - 2 6434 26 AD ROL DECIMAL+1 -Source: textproc.asm - 276 6436 2A rol ; scroll dividee - 277 ; (as highest byte - additional - byte is A) - 278 6437 C9 0A cmp #10 ; divider - 279 6439 90 04 bcc TooLittle000 ; if A is smaller than divider - 280 ; there is nothing to substract - 281 643B E9 0A sbc #10 ; divider - 282 643D E6 AC inc decimal ; lowest bit set to 1 - 283 ; because it is 0 and this is the fastest way - 284 643F CA TooLittle000 dex - 285 6440 D0 F0 bne Rotate000 ; and Rotate 16 times, Result will be in decimal - 286 6442 AA tax ; and the rest in A - 287 ; (and it goes to X because - 288 ; it is our decimal digit) - 289 6443 BD AA 60 lda digits,x - 290 6446 99 0F 45 sta decimalresult,y - 291 6449 88 dey - 292 644A 10 E2 bpl NextDigit ; Result again /10 and we have next digit - 293 - 294 ;rightnumber - 295 ; displaying without leading zeroes (if zeroes exist then display space at this position) - 296 644C A0 00 ldy #0 - 297 644E A2 00 ldx #0 ; digit flag (cut leading zeroes) - 298 6450 displayloop - 299 6450 B9 0F 45 lda decimalresult,y - 300 6453 E0 00 cpx #0 - 301 6455 D0 0D bne noleading0 - 302 6457 C0 04 cpy #4 - 303 6459 F0 09 beq noleading0 ; if 00000 - last 0 must stay - 304 645B CD AA 60 cmp zero - 305 645E D0 04 bne noleading0 - 306 6460 A9 00 lda #space - 307 6462 F0 01 beq displaychar ; space = 0 ! - 308 6464 noleading0 - 309 6464 E8 inx ; set flag (no leading zeroes to cut) - 310 6465 displaychar - 311 6465 91 76 sta (displayposition),y - 312 6467 nexdigit - 313 6467 C8 iny - 314 6468 C0 05 cpy #5 - 315 646A D0 E4 bne displayloop - 316 - 317 646C 60 rts - 318 .endp - 319 ;-------------------------------------------------- - 320 646D .proc displaybyte ;decimal (byte), displayposition (word) - 321 ;-------------------------------------------------- - 322 ; displays decimal number as in parameters (in text mode) - 323 ; leading zeores are removed - 324 ; the range is (00..99 - one byte) - 325 - 326 646D A0 01 ldy #1 ; there will be 2 digits - 327 646F NextDigit2 - 328 646F A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times - 329 6471 A9 00 lda #$00 - 330 6473 Rotate001 - 331 6473 06 AC asl decimal - 332 6475 2A rol ; scroll dividee - 333 ; (as highest byte - additional - byte is A) - 334 6476 C9 0A cmp #10 ; divider - 335 6478 90 04 bcc TooLittle001 ; if A is smaller than divider - 336 ; there is nothing to substract - 337 647A E9 0A sbc #10 ; divider - 338 647C E6 AC inc decimal ; because it is 0 and this is the fastest way - 339 647E CA TooLittle001 dex - 340 647F D0 F2 bne Rotate001 ; and Rotate 8 times, Result will be in decimal - 341 6481 AA tax ; and the rest in A - 342 ; (and it goes to X because - 343 ; it is our decimal digit) - 344 6482 BD AA 60 lda digits,x - 345 6485 99 0F 45 sta decimalresult,y - 346 6488 88 dey - 347 6489 10 E4 bpl NextDigit2 ; Result again /10 and we have next digit - 348 - 349 ; now cut leading zeroes (02 goes 2) - 350 648B AD 0F 45 lda decimalresult - 351 648E CD AA 60 cmp zero - 352 6491 D0 05 bne decimalend1 - 353 6493 A9 00 lda #space - 354 6495 8D 0F 45 sta decimalresult - 355 - 356 6498 decimalend1 - 357 ; displaying - 358 6498 A0 01 ldy #1 - 359 649A displayloop1 - 360 649A B9 0F 45 lda decimalresult,y - 361 649D 91 76 sta (displayposition),y - 362 649F 88 dey - 363 64A0 10 F8 bpl displayloop1 - 364 - 365 64A2 60 rts - 366 .endp - 367 - 368 ;-------------------------------- - 369 64A3 .proc DisplayResults ; - 370 ;displays results of the round - 371 ;using 4x4 font - 372 - 373 - 374 64A3 A9 FF 85 DB mva #$ff plot4x4color - 375 - 376 ;centering the result screen - 377 64A7 A9 44 85 B2 mva #((ScreenHeight/2)-(8*4)) ResultY - 378 - 379 - 380 ;upper frame - 381 64AB A5 B2 85 D8 mva ResultY LineYdraw - 382 64AF 20 E8 65 jsr TL4x4_top - 383 - 384 64B2 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 385 - 386 ;Header1 - 387 ;Displays round number - 388 64B9 AD 14 45 lda CurrentRoundNr - 389 64BC CD 48 41 cmp RoundsInTheGame - 390 64BF F0 26 beq GameOver4x4 - 391 - 392 64C1 85 AC sta decimal - 393 64C3 A9 55 85 76 A9 41 + mwa #RoundNrDisplay displayposition - 394 64CB 20 6D 64 jsr displaybyte ;decimal (byte), displayposition (word) - 395 - 396 64CE A9 4C 85 B3 A9 41 + mwa #LineHeader1 LineAddress4x4 - 397 64D6 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 398 64DE A5 B2 85 D8 mva ResultY LineYdraw - 399 64E2 20 6E 73 jsr TypeLine4x4 - 400 64E5 F0 1E beq @+ ;unconditional jump, because TypeLine4x4 ends with beq - 401 - 402 64E7 GameOver4x4 - 403 64E7 RmtSong song_round_over -Macro: RMTSONG [Source: scorchC64.asm] - 1 64E7 A9 0B lda #SONG_ROUND_OVER ; do nothing in C64 -Source: textproc.asm - 404 64E9 A9 41 85 B3 A9 5B + mwa #LineGameOver LineAddress4x4 - 405 64F1 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 406 64F9 A5 B2 85 D8 mva ResultY LineYdraw - 407 64FD 20 6E 73 jsr TypeLine4x4 - 408 6500 A9 01 8D 7D 43 mva #1 GameIsOver - 409 - 410 @ - 411 6505 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 412 - 413 ;Empty line - 414 650C A5 B2 85 D8 mva ResultY LineYdraw - 415 6510 20 FB 65 jsr TL4x4_empty - 416 - 417 6513 A5 B2 18 69 02 85 + adb ResultY #2 ;next line - 418 - 419 - 420 ;Header2 - 421 651A A9 33 85 B3 A9 5B + mwa #LineHeader2 LineAddress4x4 - 422 6522 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 423 652A A5 B2 85 D8 mva ResultY LineYdraw - 424 652E 20 6E 73 jsr TypeLine4x4 - 425 - 426 6531 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 427 - 428 ;Empty line - 429 6538 A5 B2 85 D8 mva ResultY LineYdraw - 430 653C 20 FB 65 jsr TL4x4_empty - 431 - 432 653F A5 B2 38 E9 02 85 + sbb ResultY #2 ;next line (was empty) - 433 - 434 6546 A6 AE ldx NumberOfPlayers ;we start from the highest (best) tank - 435 6548 CA dex ;and it is the last one - 436 6549 8E EA 48 stx ResultOfTankNr ;in TankSequence table - 437 - 438 654C A9 09 85 78 A9 41 + mwa #TanksNames tempXROLLER - 439 - 440 6554 ResultOfTheNextPlayer - 441 6554 AE EA 48 ldx ResultOfTankNr ;we are after a round, so we can use TankNr - 442 6557 BD 77 43 lda TankSequence,x ;and we keep here real number if the tank - 443 655A 85 6C sta TankNr ;for which we are displaying results - 444 - 445 - 446 - 447 - 448 655C A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 449 - 450 ;there are at least 2 players, so we can safely - 451 ;start displaying the result - 452 - 453 6563 A9 03 lda #3 ;it means | - 454 6565 8D 5A 41 sta ResultLineBuffer - 455 - 456 6568 A4 6C ldy TankNr - 457 656A B9 BB 43 lda ResultsTable,y - 458 656D 85 AC sta decimal - 459 656F A9 00 85 AD mva #0 decimal+1 - 460 6573 A9 62 85 76 A9 41 + mwa #(ResultLineBuffer+8) displayposition - 461 657B 20 2C 64 jsr displaydec5 ;decimal (byte), displayposition (word) - 462 - 463 ; overwrite the second digit of the points (max 255) - 464 ;it means ":" - 465 657E A9 1A 8D 63 41 mva #26 ResultLineBuffer+9 - 466 - 467 6583 A2 00 ldx #0 - 468 6585 A5 6C lda TankNr - 469 6587 0A asl - 470 6588 0A asl ; times 8, because it is lengtgh - 471 6589 0A asl ; of the names of the tanks - 472 658A A8 tay - 473 - 474 658B TankNameCopyLoop - 475 658B B1 78 lda (tempXROLLER),y ;XROLLER is not working now - 476 658D 29 3F and #$3f ;always CAPITAL letters - 477 658F E8 inx - 478 6590 9D 5A 41 sta ResultLineBuffer,x - 479 6593 C8 iny - 480 6594 E0 08 cpx #8 ; end of name - 481 6596 D0 F3 bne TankNameCopyLoop - 482 ; last letter of tank name overwrites first digit of the points (max 255) - 483 - 484 - 485 ;just after the digits - 486 ;it means | - 487 6598 A9 03 8D 67 41 mva #$3 ResultLineBuffer+13 - 488 - 489 ;result line display - 490 659D A9 5A 85 B3 A9 41 + mwa #ResultLineBuffer LineAddress4x4 - 491 65A5 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 492 65AD A5 B2 85 D8 mva ResultY LineYdraw - 493 65B1 20 6E 73 jsr TypeLine4x4 - 494 - 495 65B4 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 496 - 497 ;Empty line - 498 65BB A5 B2 85 D8 mva ResultY LineYdraw - 499 65BF 20 FB 65 jsr TL4x4_empty - 500 - 501 65C2 CE EA 48 dec ResultOfTankNr - 502 65C5 30 0A bmi FinishResultDisplay - 503 - 504 65C7 A5 B2 38 E9 02 85 + sbb ResultY #2 ;distance between lines is smaller - 505 - 506 65CE 4C 54 65 jmp ResultOfTheNextPlayer - 507 - 508 65D1 FinishResultDisplay - 509 65D1 A5 B2 85 D8 mva ResultY LineYdraw - 510 ;jmp TL4x4_bottom ; just go - 511 .endp - 512 - 513 65D5 .proc TL4x4_bottom - 514 ;bottom of the frame - 515 65D5 A9 17 85 B3 A9 5B + mwa #LineBottom LineAddress4x4 - 516 65DD A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 517 65E5 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 518 .endp - 519 - 520 65E8 .proc TL4x4_top - 521 ;bottom of the frame - 522 65E8 A9 09 85 B3 A9 5B + mwa #LineTop LineAddress4x4 - 523 65F0 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 524 65F8 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 525 .endp - 526 - 527 65FB .proc TL4x4_empty - 528 ;empty frame - 529 65FB A9 25 85 B3 A9 5B + mwa #LineEmpty LineAddress4x4 - 530 6603 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw - 531 660B 4C 6E 73 jmp TypeLine4x4 ; jsr:rts - 532 .endp - 533 - 534 ;-------------------------------------------------- - 535 660E .proc GameOverScreen - 536 ;-------------------------------------------------- - 537 - 538 660E 60 rts - 539 .endp - 540 ;------------------------------------------------- - 541 660F .proc PutTankNameOnScreen - 542 ;------------------------------------------------- - 543 - 544 .endp - 545 ;------------------------------------------------- - 546 660F .proc DisplayStatus - 547 ;------------------------------------------------- - 548 660F DisplayAngle - 549 660F A6 6C ldx TankNr - 550 6611 60 rts - 551 .endp - 552 ;------------------------------------------------- - 553 - 554 - 555 .endif - 347 ;---------------------------------------------- - 348 6612 icl 'grafproc.asm' -Source: grafproc.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 - 6 ;-------------------------------------------------- - 7 6612 .proc draw ;;fuxxing good draw :) - 8 ; xdraw,ydraw (word) - coordinates of first point - 9 ; xbyte,ybyte (word) - coordinates of last point - 10 ;-------------------------------------------------- - 11 ;creditz to Dr Jankowski / MIM U.W. - 12 ; (xi,yi)-----(xk,yk) - 13 ;20 DX=XK-XI - 14 ;30 DY=YK-YI - 15 ;40 DP=2*DY - 16 ;50 DD=2*(DY-DX) - 17 ;60 DI=2*DY-DX - 18 ;70 REPEAT - 19 ;80 IF DI>=0 - 20 ;90 DI=DI+DD - 21 ;100 YI=YI+1 - 22 ;110 ELSE - 23 ;120 DI=DI+DP - 24 ;130 ENDIF - 25 ;140 plot XI,YI - 26 ;150 XI=XI+1 - 27 ;160 UNTIL XI=XK - 28 - 29 - 30 ; begin: xdraw,ydraw - end: xbyte,ybyte - 31 ; let's store starting coordinates - 32 ; will be needed, because everything is calculated relatively - 33 6612 A9 FF 85 E1 85 E2 mwa #$ffff LineLength - 34 6618 A5 61 85 7A A5 62 + mwa xdraw xtempDRAW - 35 6620 A5 63 85 7C A5 64 + mwa ydraw ytempDRAW - 36 - 37 ; if line goes our of the screen we are not drawing it, but... - 38 - 39 6628 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 40 6632 B0 14 bcs DrawOutOfTheScreen - 41 6634 A5 66 C9 01 D0 04 + cpw xbyte #screenwidth - 42 663E B0 08 bcs DrawOutOfTheScreen - 43 ;cpw ydraw #screenheight - 44 ;bcs DrawOutOfTheScreen - 45 ;cpw ybyte #screenheight - 46 ;bcc DrawOnTheScreen - 47 6640 A5 64 lda ydraw+1 - 48 6642 30 04 bmi DrawOutOfTheScreen - 49 6644 A5 68 lda ybyte+1 - 50 6646 10 01 bpl DrawOnTheScreen - 51 6648 DrawOutOfTheScreen - 52 ;jsr DrawJumpPad - 53 6648 60 rts - 54 6649 DrawOnTheScreen - 55 ; constant parameters - 56 ; XI=0 ,YI=0 - 57 6649 A9 00 lda #0 - 58 664B 85 81 sta XI - 59 664D 85 82 sta XI+1 - 60 664F 85 84 sta YI - 61 6651 85 85 sta YI+1 - 62 - 63 ; setting the direction controll bits - 64 6653 A5 64 C5 68 D0 04 + cpw ydraw ybyte - 65 665D 90 14 bcc LineDown - 66 ; here one line up - 67 ; we are setting bit 0 - 68 665F A9 01 85 DF mva #1 HowToDraw ;here we can because it's first operation - 69 ; we are subctracting Yend from Ybegin (reverse order) - 70 ; DY=YI-YK - 71 6663 38 A5 63 E5 67 85 + sbw ydraw ybyte DY - 72 6670 4C 84 66 jmp CheckDirectionX - 73 6673 LineDown - 74 ; one line down here - 75 ; we are setting bit 0 - 76 6673 A9 00 85 DF mva #0 HowToDraw ;here we can because it's first operation - 77 ; substract Ybegin from Yend (normal order) - 78 ; DY=YK-YI - 79 6677 38 A5 67 E5 63 85 + sbw ybyte ydraw DY - 80 6684 CheckDirectionX - 81 6684 A5 62 C5 66 D0 04 + cpw xdraw xbyte - 82 668E 90 16 bcc LineRight - 83 ; here goes line to the left - 84 ; we set bit 1 - 85 - 86 6690 A5 DF lda HowToDraw - 87 6692 09 02 ora #$02 - 88 6694 85 DF sta HowToDraw - 89 ; substract Xend from Xbegin (reverse) - 90 ; DX=XI-XK - 91 6696 38 A5 61 E5 65 85 + sbw xdraw xbyte DX - 92 66A3 4C B3 66 jmp CheckDirectionFactor - 93 66A6 LineRight - 94 ; here goes one line to the right - 95 ; we clear bit 0 - 96 ; we can do nothing because the bit is cleared! - 97 - 98 ;lda HowToDraw - 99 ;and #$FD - 100 ;sta HowToDraw - 101 - 102 ; substracting Xbegin from Xend (normal way) - 103 ; DX=XK-XI - 104 66A6 38 A5 65 E5 61 85 + sbw xbyte xdraw DX - 105 66B3 CheckDirectionFactor - 106 ; here we check Direction Factor - 107 ; I do not know if we are using proper English word - 108 ; but the meaning is 'a' in y=ax+b - 109 - 110 ; lda DX - 111 ; we already have DX in A - 112 66B3 A5 8C C5 8E D0 04 + cpw DX DY - 113 - 114 66BD 90 0B bcc SwapXY - 115 ; 'a' factor is fire, so we copy parameters - 116 ; XK=DX - 117 66BF A5 8B 85 87 A5 8C + mwa DX XK - 118 ; and clearing bit 2 - 119 ; and bit 2 clear - 120 ; (is not needed because already cleared) - 121 ;lda HowToDraw - 122 ;and #$FB - 123 ;sta HowToDraw - 124 66C7 4C E8 66 jmp LineParametersReady - 125 66CA SwapXY - 126 ; not this half of a quarter! - parameters must be swapped - 127 ; XK=DY - 128 ; DY=DX - 129 ; DX=XK - because DY is there so DY and DX are swapped - 130 ; YK ... not used - 131 66CA A5 8D 85 87 A5 8E + mwa DY XK - 132 66D2 A5 8B 85 8D A5 8C + mwa DX DY - 133 66DA A5 87 85 8B A5 88 + mwa XK DX - 134 - 135 ; and let's set bit 2 - 136 66E2 A5 DF lda HowToDraw - 137 66E4 09 04 ora #$04 - 138 66E6 85 DF sta HowToDraw - 139 66E8 LineParametersReady - 140 ; let's check if length is not zero - 141 66E8 A5 8B lda DX - 142 66EA 05 8C ora DX+1 - 143 66EC 05 8D ora DY - 144 66EE 05 8E ora DY+1 - 145 66F0 D0 07 bne NotOnePoint - 146 ; length=0 - 147 66F2 85 E1 sta LineLength - 148 66F4 85 E2 sta LineLength+1 - 149 66F6 4C 39 68 jmp EndOfDraw - 150 - 151 66F9 NotOnePoint - 152 ; here we have DX,DY,XK and we know which operations - 153 ; are to be performed with these factors when doing PLOT - 154 ; (accordingly to given bits of 'HowToDraw') - 155 ; Now we must calculate DP, DD and DI - 156 ; DP=2*DY - 157 ; DD=2*(DY-DX) - 158 ; DI=2*DY-DX - 159 - 160 66F9 A5 8D 85 93 A5 8E + mwa DY DP - 161 6701 aslw DP -Macro: ASLW [Source: MACRO.ASM] - 1 6701 06 93 ASL DP - 2 6703 26 94 ROL DP+1 -Source: grafproc.asm - 162 - 163 6705 38 A5 8D E5 8B 85 + sbw DY DX DD - 164 6712 aslw DD -Macro: ASLW [Source: MACRO.ASM] - 1 6712 06 8F ASL DD - 2 6714 26 90 ROL DD+1 -Source: grafproc.asm - 165 - 166 6716 A5 8D 85 91 A5 8E + mwa DY DI - 167 671E aslw DI -Macro: ASLW [Source: MACRO.ASM] - 1 671E 06 91 ASL DI - 2 6720 26 92 ROL DI+1 -Source: grafproc.asm - 168 6722 38 A5 91 E5 8B 85 + sbw DI DX - 169 - 170 672F DrawLoop - 171 ; REPEAT - 172 ; IF DI>=0 - 173 672F A5 92 lda DI+1 - 174 6731 30 16 bmi DINegative - 175 ; DI=DI+DD - 176 ; YI=YI+1 - 177 6733 18 A5 91 65 8F 85 + adw DI DD - 178 6740 E6 84 D0 02 E6 85 inw YI - 179 6746 4C 56 67 jmp drplot - 180 6749 DINegative - 181 ; ELSE - 182 ; DI=DI+DP - 183 6749 18 A5 91 65 93 85 + adw DI DP - 184 - 185 6756 drplot ; Our plot that checks how to calculate pixels. - 186 ; In xtempDRAW and ycircle there are begin coordinates - 187 ; of our line - 188 ; First we check the 'a' factor (like in y=ax+b) - 189 ; If necessary we swap XI and YI - 190 ; (as we can not change XI and YI we move XI to temp2 - 191 ; and YI to temp) - 192 - 193 - 194 6756 A5 DF lda HowToDraw - 195 6758 29 04 and #$04 - 196 675A D0 13 bne SwappedXY - 197 675C A5 81 85 72 A5 82 + mwa XI temp - 198 6764 A5 84 85 74 A5 85 + mwa YI temp2 - 199 676C 4C 7F 67 jmp CheckPlotY - 200 676F SwappedXY - 201 676F A5 81 85 74 A5 82 + mwa XI temp2 - 202 6777 A5 84 85 72 A5 85 + mwa YI temp - 203 677F CheckPlotY - 204 677F A5 DF lda HowToDraw - 205 6781 29 01 and #01 - 206 6783 D0 10 bne LineGoesUp - 207 ; here we know that line goes down and we are not changing Y - 208 6785 18 A5 74 65 7C 85 + adw temp2 ytempDRAW ydraw ; YI - 209 6792 4C A2 67 jmp CheckPlotX - 210 6795 LineGoesUp - 211 ; line goes up here - we are reversing Y - 212 6795 38 A5 7C E5 74 85 + sbw ytempDRAW temp2 ydraw ; YI - 213 67A2 CheckPlotX - 214 67A2 A5 DF lda HowToDraw - 215 67A4 29 02 and #02 - 216 67A6 D0 10 bne LineGoesLeft - 217 ; here we know that line goes right and we are not changing X - 218 67A8 18 A5 72 65 7A 85 + adw temp xtempDRAW xdraw ; XI - 219 67B5 4C C5 67 jmp PutPixelinDraw - 220 67B8 LineGoesLeft - 221 ; line goes left - we are reversing X - 222 67B8 38 A5 7A E5 72 85 + sbw xtempDRAW temp xdraw ; XI - 223 67C5 PutPixelinDraw - 224 - 225 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) - 226 67C5 2C 73 43 bit drawFunction - 227 67C8 10 0D bpl @+ - 228 67CA E6 E1 D0 02 E6 E2 inw LineLength - 229 67D0 24 60 bit Vdebug - 230 67D2 30 4D bmi MeasureVisualisation - 231 67D4 4C 24 68 jmp ContinueDraw ; was `bne` - not good, because LineLength starts from $ffff - 232 @ - 233 67D7 50 48 bvc @+ - 234 67D9 DrawCheck - 235 67D9 A5 E3 lda tracerflag - 236 67DB 0D 8A 44 ora SmokeTracerFlag - 237 67DE yestrace - 238 67DE F0 03 beq notrace - 239 67E0 20 14 76 jsr plot - 240 67E3 notrace - 241 ;aftertrace - 242 ;key - 243 67E3 A5 BF lda HitFlag - 244 67E5 D0 37 bne StopHitChecking - 245 - 246 67E7 CheckCollisionDraw - 247 ; checking collision! - 248 67E7 A5 64 lda ydraw+1 - 249 67E9 30 33 bmi StopHitChecking - 250 - 251 67EB 20 84 8E jsr CheckCollisionWithTank - 252 67EE A5 BF lda HitFlag - 253 67F0 D0 2C bne StopHitChecking - 254 - 255 67F2 18 clc - 256 67F3 A5 61 lda xdraw - 257 67F5 69 3E adc #mountaintable - 261 67FD 85 73 sta temp+1 - 262 - 263 67FF A0 00 ldy #0 - 264 6801 A5 63 lda ydraw - 265 6803 D1 72 cmp (temp),y - 266 6805 90 17 bcc StopHitChecking - 267 - 268 6807 A5 61 85 C1 A5 62 + mwa xdraw XHit - 269 680F B1 72 lda (temp),y - 270 6811 38 sec - 271 6812 E9 01 sbc #1 - 272 6814 8D 5F 44 sta YHit - 273 6817 8C 60 44 sty YHit+1 - 274 681A A9 FF 85 BF mva #$ff HitFlag - 275 681E StopHitChecking - 276 681E 4C 24 68 jmp ContinueDraw - 277 @ - 278 6821 MeasureVisualisation - 279 6821 20 14 76 jsr plot - 280 - 281 6824 ContinueDraw - 282 ; XI=XI+1 - 283 ; UNTIL XI=XK - 284 6824 E6 81 D0 02 E6 82 inw XI - 285 682A A5 82 C5 88 D0 04 + cpw XI XK - 286 6834 F0 03 4C 2F 67 jne DrawLoop - 287 - 288 6839 EndOfDraw - 289 6839 A5 7A 85 61 A5 7B + mwa xtempDRAW xdraw - 290 6841 A5 7C 85 63 A5 7D + mwa ytempDRAW ydraw - 291 6849 60 rts - 292 .endp - 293 - 294 ;-------------------------------------------------- - 295 684A .proc circle ;fxxxing good circle drawing :) - 296 ; xdraw,ydraw (word) - coordinates of circle center - 297 ; radius (byte) - radius of circle - 298 ;-------------------------------------------------- - 299 ;Turbo Basic source - 300 ; R=30 - 301 ; XC=0:YC=R - 302 ; FX=0:FY=8*R:FS=4*R+3 - 303 ; WHILE FX0 - 308 ; FS=FS-FX-4 - 309 ; ELSE - 310 ; YC=YC-1 - 311 ; FY=FY-8 - 312 ; FS=FS-FX-4+FY - 313 ; ENDIF - 314 ; WEND - 315 ; splot8 - 316 - 317 684A A5 61 85 B3 A5 62 + mwa xdraw xcircle - 318 6852 A5 63 85 B5 A5 64 + mwa ydraw ycircle - 319 - 320 685A A9 00 85 70 85 71 mwa #0 xc - 321 6860 A5 AB 85 8A mva radius yc - 322 6864 A9 00 85 83 mva #0 fx - 323 6868 A5 AB 85 86 mva radius fy - 324 686C 06 86 asl FY - 325 686E 06 86 asl FY - 326 6870 A5 86 85 89 mva FY FS - 327 6874 06 86 asl FY - 328 6876 18 clc - 329 6877 A5 89 lda FS - 330 6879 69 03 adc #3 - 331 687B 85 89 sta FS - 332 - 333 687D circleloop - 334 687D A5 83 lda FX - 335 687F C5 86 cmp FY - 336 6881 B0 34 bcs endcircleloop - 337 6883 20 CB 68 jsr splot8 - 338 6886 E6 70 inc XC - 339 - 340 6888 18 clc - 341 6889 A5 83 lda FX - 342 688B 69 08 adc #8 - 343 688D 85 83 sta FX - 344 - 345 688F A5 89 lda FS - 346 6891 F0 0C beq else01 - 347 6893 30 0A bmi else01 - 348 6895 38 sec - 349 6896 E5 83 sbc FX - 350 6898 E9 04 sbc #4 - 351 689A 85 89 sta FS - 352 689C 4C B4 68 jmp endif01 - 353 689F else01 - 354 689F C6 8A dec YC - 355 68A1 38 sec - 356 68A2 A5 86 lda FY - 357 68A4 E9 08 sbc #8 - 358 68A6 85 86 sta FY - 359 - 360 68A8 A5 89 lda FS - 361 68AA 38 sec - 362 68AB E5 83 sbc FX - 363 68AD E9 04 sbc #4 - 364 68AF 18 clc - 365 68B0 65 86 adc FY - 366 68B2 85 89 sta FS - 367 68B4 endif01 - 368 68B4 4C 7D 68 jmp circleloop - 369 68B7 endcircleloop - 370 - 371 68B7 20 CB 68 jsr splot8 - 372 - 373 68BA A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 374 68C2 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 375 68CA 60 rts - 376 .endp - 377 ;---- - 378 68CB .proc splot8 - 379 ; plot xcircle+XC,ycircle+YC - 380 ; plot xcircle+XC,ycircle-YC - 381 ; plot xcircle-XC,ycircle-YC - 382 ; plot xcircle-XC,ycircle+YC - 383 - 384 ; plot xcircle+YC,ycircle+XC - 385 ; plot xcircle+YC,ycircle-XC - 386 ; plot xcircle-YC,ycircle-XC - 387 ; plot xcircle-YC,ycircle+XC - 388 - 389 68CB 18 clc - 390 68CC A5 B3 lda xcircle - 391 68CE 65 70 adc XC - 392 68D0 85 61 sta xdraw - 393 68D2 A5 B4 lda xcircle+1 - 394 68D4 69 00 adc #0 - 395 68D6 85 62 sta xdraw+1 - 396 ;clc - 397 68D8 A5 B5 lda ycircle - 398 68DA 65 8A adc YC - 399 68DC 85 63 sta ydraw - 400 68DE 8D 61 44 sta tempcir - 401 68E1 A5 B6 lda ycircle+1 - 402 68E3 69 00 adc #$00 - 403 68E5 85 64 sta ydraw+1 - 404 68E7 8D 62 44 sta tempcir+1 - 405 68EA 20 14 76 jsr plot - 406 - 407 68ED 38 sec - 408 68EE A5 B5 lda ycircle - 409 68F0 E5 8A sbc YC - 410 68F2 85 63 sta ydraw - 411 68F4 A5 B6 lda ycircle+1 - 412 68F6 E9 00 sbc #$00 - 413 68F8 85 64 sta ydraw+1 - 414 68FA 20 14 76 jsr plot - 415 - 416 68FD 38 sec - 417 68FE A5 B3 lda xcircle - 418 6900 E5 70 sbc XC - 419 6902 85 61 sta xdraw - 420 6904 A5 B4 lda xcircle+1 - 421 6906 E9 00 sbc #0 - 422 6908 85 62 sta xdraw+1 - 423 690A 20 14 76 jsr plot - 424 - 425 690D AD 61 44 lda tempcir - 426 6910 85 63 sta ydraw - 427 6912 AD 62 44 lda tempcir+1 - 428 6915 85 64 sta ydraw+1 - 429 6917 20 14 76 jsr plot - 430 ;--- - 431 691A 18 clc - 432 691B A5 B3 lda xcircle - 433 691D 65 8A adc yC - 434 691F 85 61 sta xdraw - 435 6921 A5 B4 lda xcircle+1 - 436 6923 69 00 adc #0 - 437 6925 85 62 sta xdraw+1 - 438 ;clc - 439 6927 A5 B5 lda ycircle - 440 6929 65 70 adc xC - 441 692B 85 63 sta ydraw - 442 692D 8D 61 44 sta tempcir - 443 6930 A5 B6 lda ycircle+1 - 444 6932 69 00 adc #$00 - 445 6934 85 64 sta ydraw+1 - 446 6936 8D 62 44 sta tempcir+1 - 447 6939 20 14 76 jsr plot - 448 - 449 693C 38 sec - 450 693D A5 B5 lda ycircle - 451 693F E5 70 sbc xC - 452 6941 85 63 sta ydraw - 453 6943 A5 B6 lda ycircle+1 - 454 6945 E9 00 sbc #$00 - 455 6947 85 64 sta ydraw+1 - 456 6949 20 14 76 jsr plot - 457 - 458 694C 38 sec - 459 694D A5 B3 lda xcircle - 460 694F E5 8A sbc yC - 461 6951 85 61 sta xdraw - 462 6953 A5 B4 lda xcircle+1 - 463 6955 E9 00 sbc #0 - 464 6957 85 62 sta xdraw+1 - 465 6959 20 14 76 jsr plot - 466 - 467 695C AD 61 44 lda tempcir - 468 695F 85 63 sta ydraw - 469 6961 AD 62 44 lda tempcir+1 - 470 6964 85 64 sta ydraw+1 - 471 6966 20 14 76 jsr plot - 472 - 473 6969 60 RTS - 474 .endp - 475 - 476 ;-------------------------------*------------------ - 477 696A .proc placetanks - 478 ;-------------------------------------------------- - 479 696A A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 - 480 696C A9 00 lda #0 - 481 @ - 482 ; clearing the tables with coordinates of the tank - 483 ; it is necessary, because randomizing checks - 484 ; if the given tank is already placed - 485 ; after check if its position is not (0,0) - 486 - 487 ; I will be honest with you - I have no idea - 488 ; what the above comment was intending to mean :) - 489 - 490 696E 9D 0D 44 sta XtankstableL,x - 491 6971 9D 13 44 sta XtankstableH,x - 492 6974 9D 19 44 sta Ytankstable,x - 493 6977 CA dex - 494 6978 10 F4 bpl @- - 495 - 496 - 497 697A A9 00 8D D6 44 8D + mwa #0 temptankX - 498 6982 A9 00 8D D8 44 mva #0 temptankNr ;player number - 499 6987 StillRandomize - 500 6987 A6 AE ldx NumberOfPlayers - 501 6989 AD 1B D4 lda random - 502 698C 29 07 and #$07 - 503 698E A8 tay - 504 698F C4 AE cpy NumberOfPlayers - 505 6991 B0 F4 bcs StillRandomize - 506 6993 B9 0D 44 lda xtankstableL,y - 507 6996 D0 EF bne StillRandomize - 508 6998 B9 13 44 lda xtankstableH,y - 509 699B D0 EA bne StillRandomize - 510 ; here we know that we got a random number - 511 ; of the tank that is not in use - 512 ; this number is in Y - 513 - 514 699D 18 clc - 515 699E AD D6 44 lda temptankX - 516 69A1 7D 2C 5C adc disktance,x - 517 69A4 8D D6 44 sta temptankX - 518 69A7 99 0D 44 sta xtankstableL,y - 519 69AA 90 03 bcc NotHigherByte03 - 520 69AC EE D7 44 inc temptankX+1 - 521 69AF NotHigherByte03 - 522 69AF AD D7 44 lda temptankX+1 - 523 69B2 99 13 44 sta xtankstableH,y - 524 69B5 EE D8 44 INC temptankNr - 525 69B8 AE D8 44 ldx temptankNr - 526 69BB E4 AE Cpx NumberOfPlayers - 527 69BD D0 C8 bne StillRandomize - 528 - 529 ; getting random displacements relative to even positions - 530 69BF A2 00 ldx #$00 - 531 69C1 StillRandomize02 - 532 69C1 AD 1B D4 lda random - 533 69C4 29 1F and #$1f ; maximal displacement is 31 pixels - 534 - 535 69C6 18 clc - 536 69C7 7D 0D 44 adc xtankstableL,x - 537 69CA 9D 0D 44 sta xtankstableL,x - 538 69CD 90 03 bcc NotHigherByte02 - 539 69CF FE 13 44 inc xtankstableH,x - 540 69D2 NotHigherByte02 - 541 ; and we deduct 15 to make the displacement work two ways - 542 69D2 38 sec - 543 69D3 BD 0D 44 lda xtankstableL,x - 544 69D6 E9 0F sbc #$0f - 545 ; and clear lowest bit to be sure that the X coordinate is even - 546 ; (this is to have P/M background look nice) - 547 ; "AND" does not change "Carry" bit. - 548 ; x correction for P/M - 549 ; -- - 550 .IF XCORRECTION_FOR_PM = 1 - 551 and #$fe - 552 .ENDIF - 553 ; -- - 554 69D8 9D 0D 44 sta xtankstableL,x - 555 69DB B0 03 bcs NotHigherByte01 - 556 69DD DE 13 44 dec xtankstableH,x - 557 69E0 NotHigherByte01 - 558 - 559 69E0 E8 inx - 560 69E1 E4 AE Cpx NumberOfPlayers - 561 69E3 D0 DC bne StillRandomize02 - 562 69E5 60 rts - 563 - 564 ; during calculating heights of thw mountains - 565 ; check if the tank is not somewhere around - 566 ; if so, make horizontal line 8 pixels long - 567 69E6 CheckTank - 568 69E6 A6 AE ldx NumberOfPlayers - 569 69E8 CA dex - 570 69E9 CheckNextTank - 571 69E9 BD 0D 44 lda xtankstableL,x - 572 69EC C5 61 cmp xdraw - 573 69EE D0 17 bne UnequalTanks - 574 69F0 BD 13 44 lda xtankstableH,x - 575 69F3 C5 62 cmp xdraw+1 - 576 69F5 D0 10 bne UnequalTanks - 577 69F7 A5 63 lda ydraw - 578 ;sec - 579 ;sbc #$01 ; minus 1, because it was 1 pixel too high - 580 69F9 9D 19 44 sta ytankstable,x ; what's the heck is that????!!!! - 581 69FC A9 07 8D D4 44 mva #7 deltaX - 582 6A01 A9 00 85 C3 85 C4 mwa #0 delta - 583 6A07 UnequalTanks - 584 6A07 CA dex - 585 6A08 10 DF bpl CheckNextTank - 586 6A0A 60 rts - 587 .endp - 588 - 589 ;------------------------------------------------- - 590 6A0B .proc ClearTanks - 591 6A0B 20 46 75 jsr PMoutofScreen - 592 6A0E A9 01 85 AA mva #1 Erase ; erase tanks flag - 593 .endp - 594 ;-- - 595 6A12 .proc drawtanks - 596 ;------------------------------------------------- - 597 6A12 A5 6C lda TankNr - 598 6A14 48 pha - 599 6A15 A2 00 ldx #$00 - 600 6A17 86 6C stx TankNr - 601 - 602 6A19 DrawNextTank - 603 6A19 20 2C 6A jsr drawtanknr - 604 6A1C E6 6C inc TankNr - 605 6A1E A6 6C ldx TankNr - 606 6A20 E4 AE Cpx NumberOfPlayers - 607 6A22 D0 F5 bne DrawNextTank - 608 - 609 6A24 68 pla - 610 6A25 85 6C sta TankNr - 611 - 612 6A27 A9 00 85 AA mva #0 Erase ; no erase tanks flag - 613 6A2B 60 rts - 614 .endp - 615 ;--------- - 616 6A2C .proc DrawTankNr - 617 6A2C A6 6C ldx tankNr - 618 ; let's check the energy - 619 6A2E BD AF 43 lda eXistenZ,x - 620 6A31 D0 21 bne SkipHidingPM ; if energy=0 then no tank - 621 - 622 ; hide P/M - 623 6A33 BD A2 A2 lda TanksPMOrder,x - 624 6A36 AA tax - 625 6A37 A9 00 lda #0 - 626 6A39 E0 04 cpx #$4 ; 5th tank is defferent - 627 6A3B D0 06 bne No5thTankHide - 628 6A3D 85 06 sta hposp0+4 - 629 6A3F 85 07 sta hposp0+5 - 630 6A41 F0 0C beq @+ - 631 6A43 No5thTankHide - 632 6A43 E0 05 cpx #$5 ; 6th tank is defferent - 633 6A45 D0 06 bne No6thTankHide - 634 6A47 85 08 sta hposp0+6 - 635 6A49 85 09 sta hposp0+7 - 636 6A4B F0 02 beq @+ - 637 6A4D No6thTankHide - 638 6A4D 95 02 sta hposp0,x - 639 @ - 640 6A4F A6 6C ldx TankNr - 641 6A51 4C 56 6B jmp DoNotDrawTankNr - 642 6A54 SkipHidingPM - 643 - 644 6A54 BD 2B 44 lda TankShape,x - 645 6A57 AA tax - 646 6A58 BC 6A 5C ldy TankShapesTable,x - 647 6A5B A6 6C ldx TankNr - 648 6A5D BD C3 48 lda AngleTable,x - 649 6A60 C9 5B cmp #91 ; left or right tank shape - 650 6A62 B0 02 bcs LeftTank - 651 6A64 C8 C8 :2 iny ; right tank - 652 6A66 LeftTank - 653 6A66 84 69 sty CharCode - 654 6A68 DrawTankNrX - 655 6A68 A6 6C ldx tanknr - 656 6A6A 20 67 74 jsr SetupXYdraw - 657 - 658 6A6D 20 E7 70 jsr TypeChar - 659 6A70 A5 AA lda Erase - 660 6A72 F0 03 4C F9 6A jne noTankNoPM - 661 ; now P/M graphics on the screen (only for 5 tanks) - 662 ; horizontal position - 663 6A77 A6 6C ldx TankNr - 664 6A79 BD A2 A2 lda TanksPMOrder,x - 665 6A7C AA tax - 666 6A7D A5 61 85 65 A5 62 + mwa xdraw xbyte - 667 6A85 rorw xbyte ; divide by 2 (carry does not matter) -Macro: RORW [Source: MACRO.ASM] - 1 6A85 66 66 ROR XBYTE+1 - 2 6A87 66 65 ROR XBYTE -Source: grafproc.asm - 668 6A89 A5 65 lda xbyte - 669 6A8B 18 clc - 670 6A8C 69 2C adc #PMOffsetX ; P/M to graphics offset - 671 6A8E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent - 672 6A90 D0 09 bne No5thTank - 673 6A92 18 clc - 674 6A93 69 04 adc #$04 ; missile offset offset - 675 6A95 85 06 sta hposp0+4 - 676 6A97 85 07 sta hposp0+5 - 677 6A99 D0 0F bne NoMissile - 678 6A9B No5thTank - 679 6A9B E0 05 cpx #$5 ; 6th tank are joined missiles and offset is defferent - 680 6A9D D0 09 bne Tanks1to4 - 681 6A9F 18 clc - 682 6AA0 69 04 adc #$04 ; missile offset offset - 683 6AA2 85 08 sta hposp0+6 - 684 6AA4 85 09 sta hposp0+7 - 685 6AA6 D0 02 bne NoMissile - 686 6AA8 Tanks1to4 - 687 6AA8 95 02 sta hposp0,x - 688 - 689 6AAA NoMissile - 690 ; vertical position - 691 6AAA BD B5 5B lda pmtableL,x - 692 6AAD 85 65 sta xbyte - 693 6AAF BD BB 5B lda pmtableH,x - 694 6AB2 85 66 sta xbyte+1 - 695 - 696 ; calculate start position of the tank - 697 6AB4 A5 63 lda ydraw - 698 6AB6 18 clc - 699 6AB7 69 2A adc #PMOffsetY - 700 6AB9 85 72 sta temp - 701 6ABB A0 00 ldy #$00 - 702 6ABD E0 05 cpx #$5 - 703 6ABF B0 1D bcs PMForTank6 - 704 ; clear sprite and put 3 lines on the tank at the same time - 705 6AC1 A2 03 ldx #3 ; three lines of PM - 706 6AC3 ClearPM - 707 6AC3 C4 72 cpy temp - 708 6AC5 D0 0C bne ZeroesToGo - 709 6AC7 B1 65 @ lda (xbyte),y - 710 6AC9 29 F0 and #%11110000 - 711 6ACB 09 0F ora #%00001111 ; (2 bits set) we set on two pixels in three lines - 712 6ACD 91 65 sta (xbyte),y - 713 6ACF 88 dey - 714 6AD0 CA dex - 715 6AD1 D0 F4 bne @- - 716 6AD3 ZeroesToGo - 717 6AD3 B1 65 lda (xbyte),y - 718 6AD5 29 F0 and #%11110000 - 719 6AD7 91 65 sta (xbyte),y - 720 6AD9 88 dey - 721 6ADA D0 E7 bne ClearPM - 722 6ADC F0 1B beq NoPlayerMissile - 723 6ADE PMForTank6 - 724 ; clear sprite and put 3 lines on the tank at the same time - 725 6ADE A2 03 ldx #3 ; three lines of PM - 726 6AE0 ClearPM6 - 727 6AE0 C4 72 cpy temp - 728 6AE2 D0 0C bne ZeroesToGo6 - 729 6AE4 B1 65 @ lda (xbyte),y - 730 6AE6 29 0F and #%00001111 - 731 6AE8 09 F0 ora #%11110000 ; (2 bits set) we set on two pixels in three lines - 732 6AEA 91 65 sta (xbyte),y - 733 6AEC 88 dey - 734 6AED CA dex - 735 6AEE D0 F4 bne @- - 736 6AF0 ZeroesToGo6 - 737 6AF0 B1 65 lda (xbyte),y - 738 6AF2 29 0F and #%00001111 - 739 6AF4 91 65 sta (xbyte),y - 740 6AF6 88 dey - 741 6AF7 D0 E7 bne ClearPM6 - 742 - 743 6AF9 NoPlayerMissile - 744 6AF9 noTankNoPM - 745 6AF9 A0 01 ldy #$01 - 746 6AFB A5 AA lda Erase - 747 6AFD F0 01 beq @+ - 748 6AFF 88 dey - 749 6B00 84 A9 @ sty color - 750 ; draw defensive weapons like shield ( tank number in X ) - 751 ; in xdraw, ydraw we have coordinates left LOWER corner of Tank char - 752 6B02 A6 6C ldx TankNr - 753 6B04 BD FD 43 lda ActiveDefenceWeapon,x - 754 6B07 C9 26 cmp #ind_Shield_________ ; one shot shield - 755 6B09 F0 16 beq DrawTankSh - 756 6B0B C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute - 757 6B0D F0 21 beq DrawTankShieldBold - 758 6B0F C9 27 cmp #ind_Heavy_Shield___ ; shield with energy - 759 6B11 F0 1D beq DrawTankShieldBold - 760 6B13 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence - 761 6B15 F0 10 beq DrawTankShieldWihHorns - 762 6B17 C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector - 763 6B19 F0 0C beq DrawTankShieldWihHorns - 764 6B1B C9 20 cmp #ind_White_Flag_____ ; White Flag - 765 6B1D F0 1A beq DrawTankFlag - 766 6B1F D0 27 bne NoShieldDraw - 767 6B21 DrawTankSh - 768 6B21 20 86 6B jsr DrawTankShield - 769 6B24 4C 48 6B jmp NoShieldDraw - 770 6B27 DrawTankShieldWihHorns - 771 6B27 20 86 6B jsr DrawTankShield - 772 6B2A 20 F7 6B jsr DrawTankShieldHorns - 773 6B2D 4C 48 6B jmp NoShieldDraw - 774 6B30 DrawTankShieldBold - 775 6B30 20 86 6B jsr DrawTankShield - 776 6B33 20 3C 6C jsr DrawTankShieldBoldLine - 777 6B36 4C 48 6B jmp NoShieldDraw - 778 6B39 DrawTankFlag - 779 6B39 A9 1E lda #char_flag____________ ; flag symbol - 780 6B3B 85 69 sta CharCode - 781 6B3D BD 19 44 lda Ytankstable,x - 782 6B40 38 sec - 783 6B41 E9 08 sbc #8 - 784 6B43 85 63 sta ydraw - 785 6B45 20 E7 70 jsr TypeChar - 786 6B48 NoShieldDraw - 787 6B48 BarrelChange - 788 6B48 A0 01 ldy #$01 - 789 6B4A A5 AA lda Erase - 790 6B4C F0 01 beq @+ - 791 6B4E 88 dey - 792 6B4F 84 A9 @ sty color - 793 6B51 20 7B 74 jsr DrawBarrel - 794 6B54 A6 6C ldx TankNr - 795 6B56 DoNotDrawTankNr - 796 6B56 60 rts - 797 .endp - 798 - 799 ; ------------------------------------- - 800 6B57 .proc FlashTank - 801 ; ------------------------------------- - 802 ; number of blinking tank in TankNr - 803 6B57 A9 12 85 89 mva #18 fs ; temp, how many times flash the tank - 804 6B5B tankflash_loop - 805 6B5B A5 02 lda CONSOL ; turbo mode - 806 6B5D 29 01 and #%00000001 ; START KEY - 807 6B5F D0 04 A9 01 85 89 sne:mva #1 fs ; finish it - 808 6B65 A9 01 85 AA mva #1 Erase - 809 6B69 A6 6C ldx TankNr - 810 6B6B 20 54 6A jsr DrawTankNr.SkipHidingPM ; it's necessary becouse DrawTankNr skips tanks with no energy ! - 811 ;PAUSE 2 - 812 6B6E A0 01 ldy #1 - 813 6B70 20 9D 5A jsr PauseYFrames - 814 6B73 A9 00 85 AA mva #0 Erase - 815 6B77 A6 6C ldx TankNr - 816 6B79 20 54 6A jsr DrawTankNr.SkipHidingPM - 817 ;PAUSE 2 - 818 6B7C A0 01 ldy #1 - 819 6B7E 20 9D 5A jsr PauseYFrames - 820 6B81 C6 89 dec fs - 821 6B83 D0 D6 jne tankflash_loop - 822 6B85 60 rts - 823 .endp - 824 - 825 ;-------------------------------------------------- - 826 6B86 .proc DrawTankShield - 827 ; X - tank number - 828 ; if use DrawInPosition entry point then: - 829 ; xdraw, ydraw - coordinates left LOWER corner of Tank char - 830 ; values remain there after a DrawTankNr proc. - 831 ; - 832 ; this proc change xdraw, ydraw and temp! - 833 ;-------------------------------------------------- - 834 6B86 38 A5 61 E9 03 85 + sbw xdraw #$03 ; 3 pixels to left - 835 ; draw left vertical line of shield ( | ) - 836 6B91 A9 07 85 72 mva #7 temp ; strange !!! - 837 @ - 838 6B95 20 14 76 jsr plot - 839 6B98 A5 63 D0 02 C6 64 + .nowarn dew ydraw - 840 6BA0 C6 72 dec temp - 841 6BA2 D0 F1 bne @- - 842 ; draw left oblique line of shield ( / ) - 843 6BA4 A9 03 85 72 mva #3 temp - 844 @ - 845 6BA8 20 14 76 jsr plot - 846 6BAB A5 63 D0 02 C6 64 + .nowarn dew ydraw - 847 6BB3 E6 61 D0 02 E6 62 inw xdraw - 848 6BB9 C6 72 dec temp - 849 6BBB D0 EB bne @- - 850 ; draw top horizontal line of shield ( _ ) - 851 6BBD A9 07 85 72 mva #7 temp - 852 @ - 853 6BC1 20 14 76 jsr plot - 854 6BC4 E6 61 D0 02 E6 62 inw xdraw - 855 6BCA C6 72 dec temp - 856 6BCC D0 F3 bne @- - 857 ; draw right oblique line of shield ( \ ) - 858 6BCE A9 03 85 72 mva #3 temp - 859 @ - 860 6BD2 20 14 76 jsr plot - 861 6BD5 E6 63 D0 02 E6 64 inw ydraw - 862 6BDB E6 61 D0 02 E6 62 inw xdraw - 863 6BE1 C6 72 dec temp - 864 6BE3 D0 ED bne @- - 865 ; draw right vertical line of shield ( | ) - 866 6BE5 A9 07 85 72 mva #7 temp - 867 @ - 868 6BE9 20 14 76 jsr plot - 869 6BEC E6 63 D0 02 E6 64 inw ydraw - 870 6BF2 C6 72 dec temp - 871 6BF4 D0 F3 bne @- - 872 6BF6 60 rts - 873 .endp - 874 ;-------------------------------------------------- - 875 6BF7 .proc DrawTankShieldHorns - 876 ; use only directly after DrawTankShield - 877 ; this proc draws a little "horns" on shield. - 878 ; Symbol of defensive but aggressive :) weapon - 879 ;-------------------------------------------------- - 880 6BF7 A5 61 D0 02 C6 62 + .nowarn dew xdraw ; 1 pixel left - 881 6BFF 38 A5 63 E9 0A 85 + sbw ydraw #$0a ; 10 pixels up - 882 6C0A 20 14 76 jsr plot - 883 6C0D A5 63 D0 02 C6 64 + .nowarn dew ydraw - 884 6C15 E6 61 D0 02 E6 62 inw xdraw - 885 6C1B 20 14 76 jsr plot - 886 6C1E 38 A5 61 E9 0D 85 + sbw xdraw #$0d ; 13 pixels left - 887 6C29 20 14 76 jsr plot - 888 6C2C E6 61 D0 02 E6 62 inw xdraw - 889 6C32 E6 63 D0 02 E6 64 inw ydraw - 890 6C38 20 14 76 jsr plot - 891 6C3B 60 rts - 892 .endp - 893 ;-------------------------------------------------- - 894 6C3C .proc DrawTankShieldBoldLine - 895 ; use only directly after DrawTankShield - 896 ; this proc draws bold top on shield. - 897 ; Symbol of ablative shield ? :) - 898 ;-------------------------------------------------- - 899 6C3C 38 A5 61 E9 04 85 + sbw xdraw #$04 ; 5 pixels left - 900 6C47 38 A5 63 E9 0B 85 + sbw ydraw #$0b ; 11 pixels up - 901 ; draw additional top horizontal line of shield ( _ ) - 902 6C52 A9 06 85 72 mva #6 temp - 903 @ - 904 6C56 20 14 76 jsr plot - 905 6C59 A5 61 D0 02 C6 62 + .nowarn dew xdraw - 906 6C61 C6 72 dec temp - 907 6C63 D0 F1 bne @- - 908 6C65 60 rts - 909 .endp - 910 ;-------------------------------------------------- - 911 6C66 .proc DrawTankParachute - 912 ;Tank number in X - 913 ;-------------------------------------------------- - 914 6C66 A9 02 lda #char_parachute_______ ; parachute symbol - 915 6C68 85 69 sta CharCode - 916 6C6A BD 19 44 lda Ytankstable,x - 917 6C6D C9 10 cmp #16 - 918 6C6F 90 0A bcc ToHighToParachute - 919 ;sec - 920 6C71 E9 08 sbc #8 - 921 6C73 85 63 sta ydraw - 922 6C75 20 70 74 jsr SetupXYdraw.X - 923 6C78 20 E7 70 jsr TypeChar - 924 6C7B ToHighToParachute - 925 6C7B A6 6C ldx TankNr - 926 6C7D 60 rts - 927 .endp - 928 - 929 ;-------------------------------------------------- - 930 6C7E .proc DrawTankRocketEngine - 931 ; X - tank number - 932 ; - 933 ; this proc change xdraw, ydraw and temp! - 934 ;-------------------------------------------------- - 935 6C7E 18 clc - 936 6C7F BD 19 44 lda Ytankstable,x - 937 6C82 69 02 adc #2 ; 1 pixel down - 938 6C84 85 63 sta ydraw - 939 6C86 A9 00 85 64 mva #0 ydraw+1 - 940 - 941 6C8A 18 clc - 942 6C8B BD 0D 44 lda XtanksTableL,x - 943 6C8E 69 02 adc #2 ; 2 pixels to right - 944 6C90 85 61 sta xdraw - 945 6C92 BD 13 44 lda XtanksTableH,x - 946 6C95 69 00 adc #0 - 947 6C97 85 62 sta xdraw+1 - 948 - 949 ; draw first horizontal line - 950 6C99 A9 05 85 72 mva #5 temp - 951 @ - 952 6C9D 20 14 76 jsr plot - 953 6CA0 E6 61 D0 02 E6 62 inw xdraw - 954 6CA6 C6 72 dec temp - 955 6CA8 D0 F3 bne @- - 956 - 957 6CAA 38 A5 61 E9 02 85 + sbw xdraw #2 ; 2 pixels left - 958 6CB5 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down - 959 - 960 ; draw second horizontal line - 961 6CBB A9 03 85 72 mva #3 temp - 962 @ - 963 6CBF 20 14 76 jsr plot - 964 6CC2 A5 61 D0 02 C6 62 + .nowarn dew xdraw - 965 6CCA C6 72 dec temp - 966 6CCC D0 F1 bne @- - 967 - 968 6CCE 18 A5 61 69 02 85 + adw xdraw #2 ; 2 pixels right - 969 6CD9 E6 63 D0 02 E6 64 inw ydraw ; 1 pixel down - 970 - 971 ; and last pixel - 972 6CDF 20 14 76 jsr plot - 973 - 974 6CE2 A6 6C ldx TankNr - 975 6CE4 60 rts - 976 .endp - 977 ;-------------------------------------------------- - 978 6CE5 .proc DrawTankEngine - 979 ; X - tank number - 980 ; - 981 ; this proc change xdraw, ydraw and temp! - 982 ;-------------------------------------------------- - 983 ; one pixel under tank - 984 6CE5 18 clc - 985 6CE6 BD 19 44 lda Ytankstable,x - 986 6CE9 69 01 adc #1 - 987 6CEB 85 63 sta ydraw - 988 6CED A9 00 85 64 mva #0 ydraw+1 - 989 6CF1 BD 0D 44 lda XtankstableL,x - 990 6CF4 85 61 sta xdraw - 991 6CF6 BD 13 44 lda XtankstableH,x - 992 6CF9 85 62 sta xdraw+1 - 993 ; clear first pixel under tank - 994 6CFB A9 00 85 A9 mva #0 color - 995 6CFF 20 14 76 jsr plot - 996 6D02 E6 61 D0 02 E6 62 inw xdraw - 997 ; plot 6 random color pixels - 998 6D08 A9 06 85 72 mva #6 temp - 999 6D0C A5 AA @ lda Erase - 1000 6D0E 49 01 eor #%00000001 - 1001 6D10 2D 1B D4 and random - 1002 6D13 29 01 and #%00000001 - 1003 6D15 85 A9 sta color - 1004 6D17 20 14 76 jsr plot - 1005 6D1A E6 61 D0 02 E6 62 inw xdraw - 1006 6D20 C6 72 dec temp - 1007 6D22 D0 E8 bne @- - 1008 ; clear last pixel under tank - 1009 6D24 A9 00 85 A9 mva #0 color - 1010 6D28 20 14 76 jsr plot - 1011 6D2B A6 6C ldx TankNr - 1012 6D2D 60 rts - 1013 .endp - 1014 ;-------------------------------------------------- - 1015 6D2E .proc TankFalls; - 1016 ;-------------------------------------------------- - 1017 6D2E A9 00 lda #0 - 1018 6D30 8D 64 44 sta PreviousFall ; bit 7 - left, bit 6 - right - 1019 6D33 8D 65 44 sta EndOfTheFallFlag - 1020 6D36 85 A8 sta Parachute - 1021 6D38 A9 02 8D 63 44 mva #2 FallingSoundBit ; another trick for only one sfx initialization in loop - 1022 - 1023 ; let's check if the given tank has got the parachute - 1024 6D3D A6 6C ldx TankNr - 1025 6D3F BD FD 43 lda ActiveDefenceWeapon,x - 1026 6D42 C9 23 cmp #ind_Parachute______ ; parachute - 1027 6D44 F0 08 beq ParachuteActive - 1028 6D46 C9 24 cmp #ind_StrongParachute ; strong parachute - 1029 6D48 F0 04 beq ParachuteActive - 1030 6D4A C9 28 cmp #ind_Force_Shield___ ; shield witch energy and parachute - 1031 6D4C D0 02 bne TankFallsX - 1032 6D4E ParachuteActive - 1033 6D4E E6 A8 inc Parachute - 1034 6D50 TankFallsX - 1035 ; sound only if really falls - 1036 6D50 A5 A8 lda Parachute - 1037 6D52 2D 63 44 and FallingSoundBit ; bit 1 - 1038 6D55 F0 09 beq NoFallingSound - 1039 6D57 A9 00 8D 63 44 mva #0 FallingSoundBit - 1040 6D5C A9 0E 85 9E mva #sfx_shield_off sfx_effect - 1041 6D60 NoFallingSound - 1042 ; clear previous position - 1043 6D60 A9 01 85 AA mva #1 Erase - 1044 6D64 20 2C 6A jsr DrawTankNr - 1045 ; and the parachute (if present) - 1046 6D67 A5 A8 lda Parachute - 1047 6D69 29 01 and #01 - 1048 6D6B F0 03 beq DoNotClearParachute - 1049 ; here we clear the parachute - 1050 ; ldx TankNr - 1051 6D6D 20 66 6C jsr DrawTankParachute - 1052 6D70 DoNotClearParachute - 1053 6D70 A9 00 85 AA mva #0 Erase - 1054 ; ldx TankNr - 1055 6D74 AD 65 44 lda EndOfTheFallFlag ; We only get byte below the tank if still falling - 1056 6D77 D0 2C bne NoGroundCheck - 1057 ; coordinates of the first pixel under the tank - 1058 6D79 A6 6C ldx TankNr - 1059 6D7B 20 70 74 jsr SetupXYdraw.X - 1060 6D7E BD 19 44 lda Ytankstable,x - 1061 6D81 18 clc - 1062 6D82 69 01 adc #1 ; in this point the comment helped us! For the very first - 1063 ; time in our lives! Tada! It opens a new chapter!!! - 1064 6D84 85 63 sta ydraw - 1065 ; - 1066 ; UnderTank1 ; byte under tank - 1067 ; UnderTank2 ; byte under tank reversed (for simple check right direction) - 1068 6D86 A9 08 lda #08 - 1069 6D88 85 72 sta temp ; Loop Counter - 1070 6D8A ByteBelowTank - 1071 6D8A 20 5A 76 jsr point_plot - 1072 6D8D F0 06 beq EmptyPoint2 - 1073 6D8F 38 sec - 1074 6D90 66 96 ror UnderTank2 - 1075 6D92 38 sec - 1076 6D93 B0 04 bcs ROLPoint2 - 1077 6D95 EmptyPoint2 - 1078 6D95 18 clc - 1079 6D96 66 96 ror UnderTank2 - 1080 6D98 18 clc - 1081 6D99 ROLPoint2 - 1082 6D99 26 95 rol UnderTank1 - 1083 6D9B E6 61 D0 02 E6 62 inw xdraw - 1084 6DA1 C6 72 dec temp - 1085 6DA3 D0 E5 bne ByteBelowTank - 1086 6DA5 NoGroundCheck - 1087 6DA5 A6 6C ldx TankNr - 1088 6DA7 BD 19 44 lda Ytankstable,x - 1089 6DAA C9 C7 cmp #screenheight-1 ; tank on lowest position (no falling down) - 1090 6DAC 90 03 4C 71 6E jcs EndOfFall - 1091 6DB1 A5 95 lda UnderTank1 - 1092 6DB3 D0 3C bne NoFallingDown - 1093 ; Tank falling down ---- - 1094 6DB5 A5 A8 lda Parachute - 1095 6DB7 29 01 and #1 - 1096 6DB9 D0 05 bne ParachutePresent - 1097 ; decreasing energy - 1098 6DBB A0 02 ldy #2 ; how much energy to substract if no parachute - 1099 6DBD 20 74 57 jsr DecreaseEnergyX - 1100 6DC0 ParachutePresent - 1101 ; check parachute type - 1102 6DC0 BD FD 43 lda ActiveDefenceWeapon,x - 1103 6DC3 C9 24 cmp #ind_StrongParachute ; strong parachute - 1104 6DC5 D0 18 bne OneTimeParachute - 1105 ; decreasing energy of parachute - 1106 6DC7 A0 01 ldy #1 ; how much parachute energy to substract - 1107 6DC9 20 B0 57 jsr DecreaseShieldEnergyX - 1108 6DCC C0 00 cpy #0 ; is necessary to reduce tenk energy ? - 1109 6DCE F0 03 beq @+ - 1110 6DD0 20 74 57 jsr DecreaseEnergyX - 1111 @ - 1112 ; check energy of parachute - 1113 6DD3 BD A8 43 lda ShieldEnergy,x - 1114 6DD6 D0 07 bne OneTimeParachute - 1115 6DD8 A9 00 lda #$00 - 1116 6DDA 85 A8 sta Parachute - 1117 6DDC 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defence - 1118 6DDF OneTimeParachute - 1119 6DDF A5 A8 lda Parachute - 1120 6DE1 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) - 1121 6DE3 85 A8 sta Parachute - 1122 ; tank is falling down - modify coorinates - 1123 6DE5 BD 19 44 lda Ytankstable,x - 1124 6DE8 18 clc - 1125 6DE9 69 01 adc #1 - 1126 6DEB 9D 19 44 sta Ytankstable,x - 1127 6DEE 4C 5A 6E jmp EndOfFCycle - 1128 6DF1 NoFallingDown - 1129 ; check direction (left or right) - 1130 6DF1 A0 06 ldy #SlideLeftTableLen-1 ; SlideLeftTable length -1 (from 0 to 7) - 1131 6DF3 B9 33 5C @ lda SlideLeftTable,y - 1132 6DF6 C5 95 cmp UnderTank1 - 1133 6DF8 F0 34 beq FallingLeft - 1134 6DFA C5 96 cmp UnderTank2 - 1135 6DFC F0 05 beq FallingRight - 1136 6DFE 88 dey - 1137 6DFF 10 F2 bpl @- - 1138 6E01 30 54 bmi NoLeftOrRight - 1139 6E03 FallingRight - 1140 ; tank is falling right - 1141 6E03 2C 64 44 bit PreviousFall ; bit 6 - left - 1142 6E06 70 4F bvs EndRightFall - 1143 ; we finish falling right if the tank reached the edge of the screen - 1144 6E08 BD 13 44 lda XtanksTableH,x - 1145 6E0B C9 01 cmp #>(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank - 1146 6E0D D0 05 bne @+ - 1147 6E0F BD 0D 44 lda XtanksTableL,x - 1148 6E12 C9 36 cmp #<(screenwidth-TankWidth-2) ; 2 pixels correction due to a barrel wider than tank - 1149 6E14 B0 41 @ bcs EndRightFall - 1150 6E16 NotRightEdge - 1151 ; tank is falling right - modify coorinates - 1152 6E16 18 clc - 1153 6E17 BD 0D 44 lda XtankstableL,x - 1154 6E1A 69 01 adc #1 - 1155 6E1C 9D 0D 44 sta XtankstableL,x - 1156 6E1F BD 13 44 lda XtankstableH,x - 1157 6E22 69 00 adc #0 - 1158 6E24 9D 13 44 sta XtankstableH,x - 1159 6E27 A9 80 8D 64 44 mva #%10000000 PreviousFall ; set bit 7 - right - 1160 6E2C D0 2C bne EndOfFCycle - 1161 6E2E FallingLeft - 1162 ; tank is falling left - 1163 6E2E 2C 64 44 bit PreviousFall ; bit 7 - right - 1164 6E31 30 24 bmi EndLeftFall - 1165 ; we finish falling left if the tank reached the edge of the screen - 1166 6E33 BD 13 44 lda XtanksTableH,x - 1167 6E36 D0 07 bne NotLeftEdge - 1168 6E38 BD 0D 44 lda XtanksTableL,x - 1169 6E3B C9 03 cmp #3 ; 2 pixels correction due to a barrel wider than tank - 1170 6E3D 90 18 bcc EndLeftFall - 1171 6E3F NotLeftEdge - 1172 ; tank is falling left - modify coorinates - 1173 6E3F 38 sec - 1174 6E40 BD 0D 44 lda XtankstableL,x - 1175 6E43 E9 01 sbc #1 - 1176 6E45 9D 0D 44 sta XtankstableL,x - 1177 6E48 BD 13 44 lda XtankstableH,x - 1178 6E4B E9 00 sbc #0 - 1179 6E4D 9D 13 44 sta XtankstableH,x - 1180 6E50 A9 40 8D 64 44 mva #%01000000 PreviousFall ; set bit 6 - left - 1181 6E55 D0 03 bne EndOfFCycle - 1182 6E57 EndLeftFall - 1183 6E57 EndRightFall - 1184 6E57 NoLeftOrRight - 1185 6E57 EE 65 44 inc EndOfTheFallFlag ; after this is shouldn't fall - 1186 6E5A EndOfFCycle - 1187 ; draw tank on new position - 1188 6E5A 20 2C 6A jsr DrawTankNr ; ew have TankNr in X (I hope :) ) - 1189 ; checking is parachute present and if so, draw it - 1190 6E5D A5 A8 lda Parachute - 1191 6E5F C9 03 cmp #3 ; parachute and falling - 1192 6E61 D0 06 bne DoNotDrawParachute - 1193 ; here we draw parachute - 1194 ; ldx TankNr - 1195 6E63 20 66 6C jsr DrawTankParachute - 1196 6E66 20 89 5A jsr WaitOneFrame ; only if tank with parachute - 1197 6E69 RapidFalling - 1198 6E69 DoNotDrawParachute - 1199 6E69 AD 65 44 lda EndOfTheFallFlag - 1200 6E6C D0 03 4C 50 6D jeq TankFallsX - 1201 ; Tank falling down already finished, but it is not sure that - 1202 ; the horizontal coordinate is even. - 1203 ; If it is odd then it must be corrected because otherwise - 1204 ; P/M graphics background would not look OK - 1205 ; ldx TankNr - 1206 ; x correction for P/M - 1207 ; -- - 1208 .IF XCORRECTION_FOR_PM = 1 - 1209 lda XtanksTableL,x - 1210 and #$01 - 1211 beq EndOfFall ; if it is even then it is the end - 1212 ; and if not, we push it one pixel the way it was falling before - 1213 lda #%10000000 ; set "virtual ground" for right falling - 1214 ldy #%00000001 - 1215 bit PreviousFall - 1216 bmi ForceFallLeft - 1217 tay ; tricky - replaces ldy #%10000000 - 1218 lda #%00000001 ; set "virtual ground" for left falling - 1219 ForceFallLeft - 1220 sta UnderTank1 - 1221 sty UnderTank2 - 1222 jmp TankFallsX - 1223 .ENDIF - 1224 ; -- - 1225 6E71 EndOfFall - 1226 6E71 A9 01 85 AA mva #1 Erase - 1227 ; ldx TankNr - 1228 ; if tank was falling down having parachute, - 1229 ; we must deduct one parachute - 1230 6E75 A5 A8 lda Parachute - 1231 6E77 C9 03 cmp #$03 ; was falling down and the parachute - 1232 6E79 D0 0C bne NoParachuteWeapon - 1233 ; first we check type of parachute - 1234 6E7B BD FD 43 lda ActiveDefenceWeapon,x - 1235 6E7E C9 23 cmp #ind_Parachute______ ; deactivate weapon only if parachute (54) - 1236 6E80 D0 05 bne NoParachuteWeapon - 1237 6E82 A9 00 9D FD 43 mva #0 ActiveDefenceWeapon,x ; deactivate defence weapon (parachute) - 1238 6E87 NoParachuteWeapon - 1239 ; now we clear parachute on the screen if present - 1240 6E87 A5 A8 lda Parachute - 1241 6E89 29 01 and #01 - 1242 6E8B F0 03 beq ThereWasNoParachute - 1243 6E8D 20 66 6C jsr DrawTankParachute - 1244 6E90 ThereWasNoParachute - 1245 6E90 A9 00 85 AA mva #0 Erase - 1246 ; ldx TankNr - 1247 6E94 20 2C 6A jsr DrawTankNr ; redraw tank after erase parachute (exactly for redraw leaky schield :) ) - 1248 6E97 A9 15 85 9E mva #sfx_silencer sfx_effect - 1249 6E9B 60 rts - 1250 - 1251 .endp - 1252 - 1253 ;-------------------------------------------------- - 1254 6E9C .proc ClearPMmemory - 1255 ;-------------------------------------------------- - 1256 - 1257 6E9C A9 00 lda #$00 - 1258 6E9E A8 tay - 1259 6E9F 99 00 1B @ sta pmgraph+$300,y - 1260 6EA2 99 00 1C sta pmgraph+$400,y - 1261 6EA5 99 00 1D sta pmgraph+$500,y - 1262 6EA8 99 00 1E sta pmgraph+$600,y - 1263 6EAB 99 00 1F sta pmgraph+$700,y - 1264 6EAE C8 iny - 1265 6EAF D0 EE bne @- - 1266 6EB1 60 rts - 1267 .endp - 1268 - 1269 ;-------------------------------------------------- - 1270 6EB2 .proc drawmountains - 1271 ;-------------------------------------------------- - 1272 6EB2 A9 00 85 61 85 62 mwa #0 xdraw - 1273 6EB8 A9 3E 85 76 A9 46 + mwa #mountaintable modify - 1274 6EC0 A9 01 85 A9 mva #1 color - 1275 - 1276 6EC4 drawmountainsloop - 1277 6EC4 A0 00 ldy #0 - 1278 6EC6 B1 76 lda (modify),y - 1279 6EC8 C9 C8 cmp #screenheight - 1280 6ECA F0 0F beq NoMountain - 1281 6ECC 85 63 sta ydraw - 1282 6ECE 84 64 sty ydraw+1 - 1283 .IF FASTER_GRAF_PROCS = 1 - 1284 ; there was Drawline proc - 1285 lda #screenheight - 1286 sec - 1287 sbc ydraw - 1288 sta tempbyte01 - 1289 jsr plot.MakePlot - 1290 ; after plot we have: (xbyte),y - addres of screen byte; X - index in bittable (number of bit) - 1291 ; jmp IntoDraw ; jumps inside Draw routine - 1292 ; because one pixel is already plotted (and who cares? :) ) - 1293 @ - 1294 lda (xbyte),y - 1295 and bittable2,x - 1296 sta (xbyte),y - 1297 ;IntoDraw - 1298 adw xbyte #screenBytes - 1299 dec tempbyte01 - 1300 bne @- - 1301 ; end of Drawline proc - 1302 .ELSE - 1303 ; there was Drawline proc - 1304 6ED0 drawline - 1305 6ED0 20 2C 76 jsr plot.MakePlot - 1306 6ED3 E6 63 inc ydraw - 1307 6ED5 A5 63 lda ydraw - 1308 6ED7 C9 C8 cmp #screenheight - 1309 6ED9 D0 F5 bne drawline - 1310 ; end of Drawline proc - 1311 .ENDIF - 1312 6EDB NoMountain - 1313 6EDB E6 76 D0 02 E6 77 inw modify - 1314 6EE1 E6 61 D0 02 E6 62 inw xdraw - 1315 6EE7 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 1316 6EF1 D0 D1 bne drawmountainsloop - 1317 6EF3 60 rts - 1318 /* - 1319 ;-------------------------------------------------- - 1320 drawmountainspixel ; never used ? - 1321 ;-------------------------------------------------- - 1322 mwa #0 xdraw - 1323 mwa #mountaintable modify - 1324 drawmountainspixelloop - 1325 ldy #0 - 1326 lda (modify),y - 1327 sta ydraw - 1328 sty ydraw+1 - 1329 jsr plot - 1330 inw modify - 1331 inw xdraw - 1332 cpw xdraw #screenwidth - 1333 bne drawmountainspixelloop - 1334 rts - 1335 */ - 1335 - 1336 .endp - 1337 ;-------------------------------------------------- - 1338 6EF4 .proc SoilDown2 - 1339 ;-------------------------------------------------- - 1340 - 1341 ; how it is supposed to work: - 1342 ; first loop is looking for the highest pixels - 1343 ; and fills with their Y coordinates both temporary tables - 1344 ; - 1345 ; second (main) loop works this way: - 1346 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) - 1347 ; goes through the horizontal line checking if - 1348 ; Y coordinate from the first table equals to height of the peak - 1349 ; if so, it goes further - 1350 ; if not: - 1351 ; sets end-of-soil-fall-down-flag to 0 - 1352 ; increases Y from the first table - 1353 ; if there is no pixel there it plots here and - 1354 ; zeroes pixel from the second table and after that - 1355 ; increases Y of the second table - 1356 ; repeats with next pixels au to the end of the line - 1357 ; if the flag is 0 then repeat the main loop - 1358 ; and that's it :) - 1359 ; - 1360 ; I am sorry but after these 4 years I have no idea - 1361 ; how it works. I have just translated Polish comment - 1362 ; but I do not understand a word of it :) - 1363 ; If you know how it works, please write here :)))) - 1364 6EF4 20 0B 6A jsr ClearTanks - 1365 6EF7 NoClearTanks - 1366 - 1367 ; Fix for lonely pixel after nuclear winter :) #103 - 1368 6EF7 A9 00 lda #0 - 1369 6EF9 85 61 sta xdraw - 1370 6EFB 85 62 sta xdraw+1 - 1371 6EFD 85 63 sta ydraw - 1372 6EFF 85 64 sta ydraw+1 - 1373 6F01 85 A9 sta color - 1374 6F03 20 14 76 jsr plot - 1375 - 1376 ; First we look for highest pixels and fill with their coordinates - 1377 ; both tables - 1378 - 1379 6F06 A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw - 1380 6F0E 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp - 1381 6F1B 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 - 1382 - 1383 6F28 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1384 6F32 90 03 4C FC 6F jcs NothingToFall - 1385 - 1386 6F37 NextColumn1 - 1387 6F37 A9 00 85 63 85 64 mwa #0 ydraw - 1388 6F3D NextPoint1 - 1389 6F3D 20 5A 76 jsr point_plot - 1390 6F40 F0 0B beq StillNothing - 1391 6F42 A0 00 ldy #0 - 1392 6F44 A5 63 lda ydraw - 1393 6F46 91 7E sta (tempor2),y - 1394 6F48 91 72 sta (temp),y - 1395 6F4A 4C 5D 6F jmp FoundPeek1 - 1396 6F4D StillNothing - 1397 6F4D E6 63 inc ydraw - 1398 6F4F A5 63 lda ydraw - 1399 6F51 C9 C8 cmp #screenheight - 1400 6F53 D0 E8 bne NextPoint1 - 1401 ; no pixels on whole column !!! - 1402 6F55 A0 00 ldy #0 - 1403 6F57 A5 63 lda ydraw - 1404 6F59 91 7E sta (tempor2),y - 1405 6F5B 91 72 sta (temp),y - 1406 6F5D FoundPeek1 - 1407 6F5D E6 7E D0 02 E6 7F inw tempor2 - 1408 6F63 E6 72 D0 02 E6 73 inw temp - 1409 6F69 E6 61 D0 02 E6 62 inw xdraw - 1410 ;vcmp xdraw,screenwidth,NextColumn1 - 1411 6F6F A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1412 6F79 90 BC bcc NextColumn1 - 1413 6F7B F0 BA beq NextColumn1 - 1414 ; we have both tables filled with starting values - 1415 - 1416 ; main loop starts here - 1417 6F7D MainFallout2 - 1418 6F7D A5 D2 85 61 A5 D3 + mwa RangeLeft xdraw - 1419 6F85 18 A5 D2 69 3E 85 + adw RangeLeft #mountaintable temp - 1420 6F92 18 A5 D2 69 7F 85 + adw RangeLeft #mountaintable2 tempor2 - 1421 - 1422 6F9F A9 01 85 9D mva #1 IsEndOfTheFallFlag - 1423 6FA3 FalloutOfLine - 1424 6FA3 A0 00 ldy #0 - 1425 - 1426 ; is Y coordinate from the first table - 1427 ; equal to peak height, if so, go ahead - 1428 6FA5 B1 7E lda (tempor2),y - 1429 6FA7 C9 C7 cmp #screenheight-1 ;cmp (temp),y - 1430 6FA9 B0 2B bcs ColumnIsReady - 1431 ; in the other case there are things to be done - 1432 6FAB 84 9D sty IsEndOfTheFallFlag ; flag to 0 - 1433 ; we are increasing Y in the first table - 1434 ;lda (tempor2),y - 1435 6FAD 18 clc - 1436 6FAE 69 01 adc #1 - 1437 6FB0 91 7E sta (tempor2),y - 1438 ; and checking if there is a pixel there - 1439 6FB2 85 63 sta ydraw - 1440 6FB4 20 5A 76 jsr point_plot - 1441 6FB7 D0 1D bne ThereIsPixelHere - 1442 ; if no pixel we plot it - 1443 6FB9 A9 01 85 A9 mva #1 color - 1444 6FBD 20 2C 76 jsr plot.MakePlot - 1445 ; zeroing pixel from the second table - 1446 ; and increase Y in second table - 1447 6FC0 A0 00 ldy #0 - 1448 6FC2 B1 72 lda (temp),y - 1449 6FC4 85 63 sta ydraw - 1450 6FC6 B1 72 lda (temp),y - 1451 6FC8 18 clc - 1452 6FC9 69 01 adc #1 - 1453 6FCB 91 72 sta (temp),y - 1454 6FCD 84 A9 sty color - 1455 6FCF 20 2C 76 jsr plot.MakePlot - 1456 6FD2 A9 15 85 9E mva #sfx_silencer sfx_effect - 1457 - 1458 6FD6 ThereIsPixelHere - 1459 6FD6 ColumnIsReady - 1460 6FD6 E6 72 D0 02 E6 73 inw temp - 1461 6FDC E6 7E D0 02 E6 7F inw tempor2 - 1462 6FE2 E6 61 D0 02 E6 62 inw xdraw - 1463 ;vcmp xdraw,screenwidth,FalloutOfLine - 1464 6FE8 A5 62 C5 D5 D0 04 + cpw xdraw RangeRight - 1465 6FF2 90 AF bcc FalloutOfLine - 1466 6FF4 F0 AD beq FalloutOfLine - 1467 - 1468 6FF6 A5 9D lda IsEndOfTheFallFlag - 1469 ; we repeat untill at some point first table reaches - 1470 ; level of the mountains - 1471 6FF8 F0 83 jeq MainFallout2 - 1472 ; now correct heights are in the mountaintable - 1473 6FFA 85 A9 sta color ; Pozor! :) we know - now A=1 - 1474 6FFC NothingToFall - 1475 6FFC A9 15 85 9E mva #sfx_silencer sfx_effect - 1476 7000 20 12 6A jsr DrawTanks - 1477 7003 60 rts - 1478 .endp - 1479 - 1480 ;-------------------------------------------------- - 1481 7004 .proc calculatemountains - 1482 ;-------------------------------------------------- - 1483 7004 A9 00 85 61 85 62 mwa #0 xdraw - 1484 - 1485 ; starting point - 1486 700A getrandomY ;getting random Y coordinate - 1487 700A 38 sec - 1488 700B AD 1B D4 lda random - 1489 700E C9 28 cmp #screenheight-(margin*4) ;it means that max line=199 - 1490 7010 B0 F8 bcs getrandomY - 1491 7012 18 clc - 1492 7013 69 50 adc #(margin*2) - 1493 7015 85 63 sta ydraw - 1494 7017 8D D3 44 sta yfloat+1 - 1495 701A A9 00 8D D2 44 mva #0 yfloat ;yfloat equals to e.g. 140.0 - 1496 701F A9 9B 8D D3 44 mva #screenheight-margin-5 yfloat+1 - 1497 7024 85 63 sta ydraw - 1498 - 1499 ; how to make nice looking mountains? - 1500 ; randomize points and join them with lines - 1501 ; Here we do it simpler way - we randomize X (or deltaX) - 1502 ; and "delta" (change of Y coordinate) - 1503 - 1504 7026 NextPart - 1505 7026 AD 1B D4 lda random - 1506 7029 2D 4B 41 and mountainDeltaL - 1507 702C 85 C3 sta delta ; it is after the dot (xxx.delta) - 1508 702E AD 1B D4 lda random - 1509 7031 2D 4A 41 and mountainDeltaH ;(max delta) - 1510 7034 85 C4 sta delta+1 ; before the dot (delta+1.delta) - 1511 - 1512 7036 AD 1B D4 lda random - 1513 7039 29 01 and #$01 ;random sign (+/- or up/down) - 1514 703B 8D D5 44 sta UpNdown - 1515 - 1516 ; theoretically we have here ready - 1517 ; fixed-point delta value - 1518 ; (-1*(UpNdown))*(delta+1.delta) - 1519 - 1520 ;loop drawing one line - 1521 - 1522 703E ChangingDirection - 1523 703E AD 1B D4 lda random ;length of the line - 1524 7041 29 0F and #$0f ;max line length - 1525 7043 AA tax - 1526 7044 E8 inx - 1527 7045 E8 inx - 1528 7046 E8 inx - 1529 7047 8E D4 44 stx deltaX - 1530 - 1531 704A OnePart - 1532 704A 20 E6 69 jsr placeTanks.CheckTank - 1533 ; checks if at a given X coordinate - 1534 ; is any tank and if so - 1535 ; changes parameters of drawing - 1536 ; to generate flat 8 pixels - 1537 ; (it will be the place for the tank) - 1538 ; it also stores Y position of the tank - 1539 704D 18 A5 61 69 3E 85 + adw xdraw #mountaintable modify - 1540 - 1541 705A A5 63 lda ydraw - 1542 705C A0 00 ldy #0 - 1543 705E 91 76 sta (modify),y - 1544 - 1545 ; Up or Down - 1546 7060 AD D5 44 lda UpNdown - 1547 7063 F0 20 beq ToBottom - 1548 - 1549 7065 ToTop ;it means substracting - 1550 - 1551 7065 38 AD D2 44 E5 C3 + sbw yfloat delta - 1552 7076 AD D3 44 lda yfloat+1 - 1553 7079 C9 28 cmp #margin - 1554 707B B0 25 bcs @+ - 1555 ; if smaller than 10 - 1556 707D A2 00 ldx #$00 - 1557 707F 8E D5 44 stx UpNdown - 1558 7082 4C A2 70 jmp @+ - 1559 - 1560 7085 ToBottom - 1561 7085 18 AD D2 44 65 C3 + adw yfloat delta - 1562 7096 AD D3 44 lda yfloat+1 - 1563 7099 C9 A0 cmp #screenheight-margin - 1564 709B 90 05 bcc @+ - 1565 ; if higher than screen - 1566 709D A2 01 ldx #$01 - 1567 709F 8E D5 44 stx UpNdown - 1568 @ - 1569 70A2 85 63 sta ydraw - 1570 - 1571 70A4 E6 61 D0 02 E6 62 inw xdraw - 1572 - 1573 70AA A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 1574 70B4 F0 08 beq EndDrawing - 1575 - 1576 70B6 CE D4 44 dec deltaX - 1577 70B9 D0 8F bne OnePart - 1578 - 1579 70BB 4C 26 70 jmp NextPart - 1580 70BE EndDrawing - 1581 - 1582 70BE 60 rts - 1583 .endp - 1584 - 1585 /* - 1586 ;-------------------------------------------------- - 1587 .proc calculatemountains0 - 1588 ; Only for testing - makes ground flat (0 pixels) - 1589 ; and places tanks on it - 1590 ; remember to remove in final compilation :) - 1591 ;-------------------------------------------------- - 1592 mwa #0 xdraw - 1593 nextPointDrawing - 1594 adw xdraw #mountaintable modify - 1595 lda #screenheight - 1596 ldy #0 - 1597 sta (modify),y - 1598 inw xdraw - 1599 cpw xdraw #screenwidth - 1600 bne nextPointDrawing - 1601 ldx NumberOfPlayers - 1602 dex - 1603 SetYofNextTank - 1604 lda #screenheight-1 - 1605 sta ytankstable,x - 1606 dex - 1607 bpl SetYofNextTank - 1608 rts - 1609 .endp - 1610 */ - 1610 - 1611 - 1612 ;-------------------------------------------------- - 1613 70BF .proc CheckMaxMountain - 1614 ; in A return y coordinate of highest mountain - 1615 ;-------------------------------------------------- - 1616 70BF A9 3E 85 76 A9 46 + mwa #mountaintable modify - 1617 70C7 A0 00 ldy #0 - 1618 70C9 A2 C7 ldx #screenheight-1 - 1619 70CB nextPointChecking - 1620 70CB 8A txa - 1621 70CC D1 76 cmp (modify),y - 1622 70CE 90 03 bcc NotHigher - 1623 70D0 B1 76 lda (modify),y - 1624 70D2 AA tax - 1625 70D3 NotHigher - 1626 70D3 E6 76 D0 02 E6 77 inw modify - 1627 70D9 A5 77 C9 47 D0 04 + cpw modify #(mountaintable+screenwidth) - 1628 70E3 D0 E6 bne nextPointChecking - 1629 70E5 8A txa - 1630 70E6 60 rts - 1631 .endp - 1632 - 1633 - 1634 ;-------------------------------------------------- - 1635 70E7 .proc TypeChar - 1636 ; puts char on the graphics screen - 1637 ; in: CharCode - 1638 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) - 1639 ;-------------------------------------------------- - 1640 ; char to the table - 1641 70E7 A5 69 lda CharCode - 1642 70E9 85 6A sta fontind - 1643 70EB A9 00 lda #$00 - 1644 70ED 85 6B sta fontind+1 - 1645 ; char intex times 8 - 1646 70EF aslw fontind -Macro: ASLW [Source: MACRO.ASM] - 1 70EF 06 6A ASL FONTIND - 2 70F1 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1647 70F3 rolw fontind -Macro: ROLW [Source: MACRO.ASM] - 1 70F3 26 6A ROL FONTIND - 2 70F5 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1648 70F7 rolw fontind -Macro: ROLW [Source: MACRO.ASM] - 1 70F7 26 6A ROL FONTIND - 2 70F9 26 6B ROL FONTIND+1 -Source: grafproc.asm - 1649 - 1650 70FB 18 A5 6A 69 46 85 + adw fontind #TankFont - 1651 - 1652 ; and 8 bytes to the table - 1653 7108 A0 07 ldy #7 - 1654 710A CopyChar - 1655 710A B1 6A lda (fontind),y - 1656 710C 49 FF eor #$ff - 1657 710E 99 C0 44 sta char1,y - 1658 7111 A9 FF lda #$ff - 1659 7113 99 C8 44 sta char2,y - 1660 7116 88 dey - 1661 7117 10 F1 bpl CopyChar - 1662 ; and 8 subsequent bytes as a mask - 1663 7119 18 A5 6A 69 08 85 + adw fontind #8 - 1664 7124 A0 07 ldy #7 - 1665 7126 CopyMask - 1666 7126 B1 6A lda (fontind),y - 1667 7128 49 FF eor #$ff - 1668 712A 99 B0 44 sta mask1,y - 1669 712D A9 00 lda #$00 - 1670 712F 99 B8 44 sta mask2,y - 1671 7132 88 dey - 1672 7133 10 F1 bpl CopyMask - 1673 - 1674 .IF FASTER_GRAF_PROCS = 1 - 1675 ; calculating coordinates from xdraw and ydraw - 1676 mwa xdraw xbyte - 1677 - 1678 lda xbyte - 1679 and #$7 - 1680 sta ybit - 1681 - 1682 lsrw xbyte ; div 8 - 1683 rorw xbyte - 1684 rorw xbyte - 1685 ;--- - 1686 ldy xbyte - 1687 - 1688 lda ydraw ; y = y - 7 because left lower. shouldn't it be 8? - 1689 sec - 1690 sbc #7 - 1691 tax - 1692 - 1693 lda linetableL,x - 1694 sta xbyte - 1695 lda linetableH,x - 1696 sta xbyte+1 - 1697 ; mask preparation and character shifting - 1698 ldx ybit - 1699 beq MaskOK00 - 1700 MakeMask00 - 1701 .rept 8 - 1702 lsr mask1+# - 1703 ror mask2+# - 1704 .endr - 1705 sec - 1706 .rept 8 - 1707 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 1708 ror char2+# - 1709 .endr - 1710 dex - 1711 bne MakeMask00 - 1712 MaskOK00 - 1713 ; here x=0 - 1714 lda Erase - 1715 beq CharLoopi ; it works, because x=0 - 1716 lda #$ff - 1717 ldx #7 - 1718 EmptyChar - 1719 sta char1,x - 1720 sta char2,x - 1721 dex - 1722 bpl EmptyChar - 1723 ldx #0 - 1724 CharLoopi - 1725 lda (xbyte),y - 1726 ora mask1,x - 1727 and char1,x - 1728 sta (xbyte),y - 1729 iny - 1730 lda (xbyte),y - 1731 ora mask2,x - 1732 and char2,x - 1733 sta (xbyte),y - 1734 dey - 1735 adw xbyte #screenBytes - 1736 inx - 1737 cpx #8 - 1738 bne CharLoopi - 1739 .ELSE - 1740 7135 A2 07 86 72 mvx #7 temp ; line counter (Y) - 1741 7139 CharLoop1 - 1742 7139 A9 07 85 73 mva #7 temp+1 ; pixel counter (X) - 1743 713D CharLoop2 - 1744 713D A9 00 85 A9 mva #0 color - 1745 7141 3E B0 44 rol mask1,x - 1746 7144 90 38 bcc NoMaskNoPlot - 1747 7146 3E C0 44 rol char1,x - 1748 7149 B0 06 bcs NoPlot - 1749 714B MakeCharPlot - 1750 714B A5 AA lda Erase - 1751 714D D0 02 bne ErasingChar - 1752 714F E6 A9 inc color - 1753 7151 ErasingChar - 1754 7151 NoPlot - 1755 7151 20 2C 76 jsr plot.MakePlot - 1756 7154 AfterCharPlot - 1757 7154 E6 61 D0 02 E6 62 inw xdraw - 1758 715A A6 72 ldx temp - 1759 715C C6 73 dec temp+1 - 1760 715E 10 DD bpl CharLoop2 - 1761 7160 38 sec - 1762 7161 38 A5 61 E9 08 85 + sbw xdraw #8 - 1763 716C C6 63 dec ydraw - 1764 716E A6 72 ldx temp - 1765 7170 CA dex - 1766 7171 86 72 stx temp - 1767 7173 10 C4 bpl CharLoop1 - 1768 7175 18 clc - 1769 7176 A5 63 lda ydraw - 1770 7178 69 08 adc #8 - 1771 717A 85 63 sta ydraw - 1772 717C D0 06 bne EndPutChar - 1773 717E NoMaskNoPlot - 1774 717E 3E C0 44 rol char1,x - 1775 7181 4C 54 71 jmp AfterCharPlot - 1776 .ENDIF - 1777 7184 EndPutChar - 1778 7184 60 rts - 1779 .endp - 1780 - 1781 ;-------------------------------------------------- - 1782 7185 .proc PutChar4x4 - 1783 ; puts 4x4 pixels char on the graphics screen - 1784 ; in: dx, dy (LOWER left corner of the char) - 1785 ; in: CharCode4x4 (.sbyte) - 1786 ; in: plot4x4color (0/255) - 1787 ; all pixels are being drawn - 1788 ; (empty and not empty) - 1789 ;-------------------------------------------------- - 1790 7185 A5 8E C9 00 D0 04 + cpw dy #(screenheight-1) - 1791 718F B0 F3 jcs TypeChar.EndPutChar ;nearest RTS - 1792 7191 A5 8E C9 00 D0 04 + cpw dy #(4) - 1793 719B 90 E7 jcc TypeChar.EndPutChar ;nearest RTS - 1794 719D A5 8C C9 01 D0 04 + cpw dx #(screenwidth-4) - 1795 71A7 B0 DB jcs TypeChar.EndPutChar ;nearest RTS - 1796 ; checks ommited. - 1797 ; char to the table - 1798 71A9 AD EC 48 lda CharCode4x4 - 1799 71AC 29 01 and #%00000001 - 1800 71AE F0 02 beq Upper4bits - 1801 71B0 A9 FF lda #$ff ; better option to check (nibbler4x4 = $00 or $ff) - 1802 71B2 Upper4bits - 1803 71B2 8D EB 48 sta nibbler4x4 - 1804 71B5 AD EC 48 lda CharCode4x4 - 1805 71B8 4A lsr - 1806 71B9 85 6A sta fontind - 1807 71BB A9 00 lda #$00 - 1808 71BD 85 6B sta fontind+1 - 1809 - 1810 71BF 18 A5 6A 69 C6 85 + adw fontind #font4x4 - 1811 - 1812 ; and 4 bytes to the table - 1813 71CC A0 00 ldy #0 - 1814 71CE A2 03 ldx #3 - 1815 71D0 CopyChar - 1816 71D0 B1 6A lda (fontind),y ; Y must be 0 !!!! - 1817 71D2 2C EB 48 bit nibbler4x4 - 1818 71D5 10 04 bpl GetUpper4bits - 1819 71D7 2A 2A 2A 2A :4 rol - 1820 71DB GetUpper4bits - 1821 71DB 09 0F ora #$0f - 1822 71DD 9D C0 44 sta char1,x - 1823 71E0 A9 FF lda #$ff - 1824 71E2 9D C8 44 sta char2,x - 1825 ; and 4 bytes as a mask - 1826 71E5 A9 F0 lda #$f0 - 1827 71E7 9D B0 44 sta mask1,x - 1828 71EA A9 00 lda #$00 - 1829 71EC 9D B8 44 sta mask2,x - 1830 71EF 18 A5 6A 69 20 85 + adw fontind #32 ; next byte of 4x4 font - 1831 71FA CA dex - 1832 71FB 10 D3 bpl CopyChar - 1833 - 1834 .IF FASTER_GRAF_PROCS = 1 - 1835 ; calculating coordinates from xdraw and ydraw - 1836 mwa dx xbyte - 1837 - 1838 lda xbyte - 1839 and #$7 - 1840 sta ybit - 1841 - 1842 :3 lsrw xbyte ; div 8 - 1843 ; rorw xbyte - 1844 ; rorw xbyte - 1845 ;--- - 1846 ldy xbyte ; horizontal byte offet stored in Y - 1847 lda dy ; y = y - 3 because left lower. - 1848 sec - 1849 sbc #3 - 1850 tax - 1851 - 1852 lda linetableL,x - 1853 sta xbyte - 1854 lda linetableH,x - 1855 sta xbyte+1 - 1856 ; mask preparation and character shifting - 1857 ldx ybit - 1858 beq MaskOK01 - 1859 MakeMask01 - 1860 .rept 4 - 1861 lsr mask1+# - 1862 ror mask2+# - 1863 .endr - 1864 sec - 1865 .rept 4 - 1866 ror char1+# ; in second (and next) lines we have C=1 - one SEC enough - 1867 ror char2+# - 1868 .endr - 1869 dex - 1870 bne MakeMask01 - 1871 MaskOK01 - 1872 ldx #0 - 1873 CharLoopi4x4 - 1874 lda (xbyte),y - 1875 ora mask1,x - 1876 bit plot4x4color - 1877 bpl PutInColor0_1 ; only mask - no char - 1878 and char1,x - 1879 PutInColor0_1 - 1880 sta (xbyte),y - 1881 iny - 1882 lda (xbyte),y - 1883 ora mask2,x - 1884 bit plot4x4color - 1885 bpl PutInColor0_2 ; only mask - no char - 1886 and char2,x - 1887 PutInColor0_2 - 1888 sta (xbyte),y - 1889 dey - 1890 adw xbyte #screenBytes - 1891 inx - 1892 cpx #4 - 1893 bne CharLoopi4x4 - 1894 .ELSE - 1895 71FD A5 61 8D C8 44 A5 + mwa xdraw char2 - 1896 7207 A5 63 8D B8 44 A5 + mwa ydraw mask2 - 1897 7211 A5 A9 8D BA 44 mva color mask2+2 - 1898 7216 A5 8B 85 61 A5 8C + mwa dx xdraw - 1899 721E A5 8D 85 63 A5 8E + mwa dy ydraw - 1900 7226 A2 03 86 72 mvx #3 temp ; line counter (Y) - 1901 722A CharLoop1 - 1902 722A A9 03 85 73 mva #3 temp+1 ; pixel counter (X) - 1903 722E CharLoop2 - 1904 722E A9 00 85 A9 mva #0 color - 1905 7232 3E B0 44 rol mask1,x - 1906 7235 90 4A bcc NoMaskNoPlot - 1907 7237 3E C0 44 rol char1,x - 1908 723A B0 06 bcs NoPlot - 1909 723C MakeCharPlot - 1910 723C A5 DB lda plot4x4color - 1911 723E F0 02 beq ErasingChar - 1912 7240 E6 A9 inc color - 1913 7242 ErasingChar - 1914 7242 NoPlot - 1915 7242 20 2C 76 jsr plot.MakePlot - 1916 7245 AfterCharPlot - 1917 7245 E6 61 D0 02 E6 62 inw xdraw - 1918 724B A6 72 ldx temp - 1919 724D C6 73 dec temp+1 - 1920 724F 10 DD bpl CharLoop2 - 1921 7251 38 sec - 1922 7252 38 A5 61 E9 04 85 + sbw xdraw #4 - 1923 725D C6 63 dec ydraw - 1924 725F A6 72 ldx temp - 1925 7261 CA dex - 1926 7262 86 72 stx temp - 1927 7264 10 C4 bpl CharLoop1 - 1928 7266 AD C8 44 85 61 AD + mwa char2 xdraw - 1929 7270 AD B8 44 85 63 AD + mwa mask2 ydraw - 1930 727A AD BA 44 85 A9 mva mask2+2 color - 1931 727F 10 06 bpl EndPut4x4 - 1932 7281 NoMaskNoPlot - 1933 7281 3E C0 44 rol char1,x - 1934 7284 4C 45 72 jmp AfterCharPlot - 1935 .ENDIF - 1936 7287 EndPut4x4 - 1937 7287 60 rts - 1938 .endp - 1939 - 1940 ;-------------------------------------------------------- - 1941 7288 .proc DisplayOffensiveTextNr ; - 1942 7288 AE C0 48 ldx TextNumberOff - 1943 728B BD 2B 9F lda talk.OffensiveTextTableL,x - 1944 728E 85 B3 sta LineAddress4x4 - 1945 7290 BD A0 9F lda talk.OffensiveTextTableH,x - 1946 7293 85 B4 sta LineAddress4x4+1 - 1947 7295 E8 inx ; the next text - 1948 7296 BD A0 9F lda talk.OffensiveTextTableH,x - 1949 7299 85 73 sta temp+1 - 1950 729B BD 2B 9F lda talk.OffensiveTextTableL,x - 1951 729E 85 72 sta temp ; opty possible - 1952 ; substract address of the next text from previous to get text length - 1953 72A0 38 A5 72 E5 B3 85 + sbw temp LineAddress4x4 temp2 - 1954 72AD A5 74 85 83 mva temp2 fx - 1955 - 1956 ;jsr Display4x4AboveTank - 1957 ;rts - 1958 ; POZOR !!! - 1959 .endp - 1960 - 1961 ;-------------------------------------------------------- - 1962 72B1 .proc Display4x4AboveTank ; - 1963 ; Displays texts using PutChar4x4 above tank and mountains. - 1964 ; Pretty cool, eh! - 1965 ;parameters are: - 1966 ;Y - number of tank above which text is displayed - 1967 ;fx - length of text - 1968 ;LineAddress4x4 - address of the text - 1969 - 1970 ;lets calculate position of the text first! - 1971 ;that's easy because we have number of tank - 1972 ;and xtankstableL and H keep X position of a given tank - 1973 - 1974 72B1 B9 0D 44 lda xtankstableL,y - 1975 72B4 85 72 sta temp - 1976 72B6 B9 13 44 lda xtankstableH,y - 1977 72B9 85 73 sta temp+1 - 1978 ;now we should substract length of the text-1 - 1979 ;temp2 = (fx-1)*2 - 1980 72BB A4 83 ldy fx - 1981 72BD 88 dey - 1982 72BE 98 tya - 1983 72BF 0A asl - 1984 72C0 85 74 sta temp2 - 1985 72C2 A9 00 85 75 mva #0 temp2+1 - 1986 ;now we have HALF length in pixels - 1987 ;stored in temp2 - 1988 - 1989 ;here we assume max length of text - 1990 ;to display is 127 chars, but later it turns out it must be max 63! - 1991 - 1992 72C6 38 A5 72 E5 74 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!! - 1993 ;now we should check overflows - 1994 ;lda temp+1 ; opty - 1995 72D3 10 08 bpl DOTNnotLessThanZero - 1996 ;less than zero, so should be zero - 1997 72D5 A9 00 85 72 85 73 mwa #0 temp - 1998 72DB F0 32 beq DOTNnoOverflow - 1999 - 2000 72DD DOTNnotLessThanZero - 2001 ;so check if end larger than screenwidth - 2002 - 2003 - 2004 72DD A5 83 lda fx - 2005 72DF 0A asl - 2006 72E0 0A asl - 2007 ;length in pixels - - 2008 ;text length max 63 chars !!!!!!!! - 2009 - 2010 - 2011 72E1 18 clc - 2012 72E2 65 72 adc temp - 2013 72E4 85 74 sta temp2 - 2014 72E6 A9 00 lda #0 - 2015 72E8 65 73 adc temp+1 - 2016 72EA 85 75 sta temp2+1 - 2017 ;now in temp2 is end of the text in pixels - 2018 ;so check if not greater than screenwitdth - 2019 72EC A5 75 C9 01 D0 04 + cpw temp2 #screenwidth - 2020 72F6 90 17 bcc DOTNnoOverflow - 2021 - 2022 ;if end is greater than screenwidth - 2023 ;then screenwidth - length is fine - 2024 72F8 A5 83 lda fx - 2025 72FA 0A asl - 2026 72FB 0A asl - 2027 72FC 85 72 sta temp - 2028 72FE A9 00 85 73 mva #0 temp+1 - 2029 - 2030 7302 38 sec - 2031 7303 A9 3F lda #<(screenwidth-1) - 2032 7305 E5 72 sbc temp - 2033 7307 85 72 sta temp - 2034 7309 A9 01 lda #>(screenwidth-1) - 2035 730B E5 73 sbc temp+1 - 2036 730D 85 73 sta temp+1 - 2037 730F DOTNnoOverflow - 2038 ;here in temp we have really good x position of text - 2039 - 2040 730F A5 72 85 D9 A5 73 + mwa temp LineXdraw - 2041 - 2042 ;now let's get y position - 2043 ;we will try to put text as low as possible - 2044 ;just above mountains (so mountaintable will be checked) - 2045 7317 A5 83 lda fx - 2046 7319 0A asl - 2047 731A 0A asl - 2048 731B A8 tay - 2049 ;in temp there still is X position of text - 2050 ;if we add temp and Y we will get end of the text - 2051 ;so, lets go through mountaintable and look for - 2052 ;the lowest value within - 2053 ;Mountaitable+temp and Mountaitable+temp+Y - 2054 - 2055 731C 18 A5 72 69 3E 85 + adw temp #MountainTable - 2056 - 2057 7329 A9 C8 85 74 mva #screenheight temp2 ;initialisation of the lowest value - 2058 - 2059 732D DOTLowestMountainValueLoop - 2060 732D B1 72 lda (temp),y - 2061 732F C5 74 cmp temp2 - 2062 7331 B0 02 bcs DOTOldLowestValue ;old lowest value - 2063 ;new lowest value - 2064 7333 85 74 sta temp2 - 2065 7335 DOTOldLowestValue - 2066 7335 88 dey - 2067 7336 C0 FF cpy #$ff - 2068 7338 D0 F3 bne DOTLowestMountainValueLoop - 2069 - 2070 733A 38 sec - 2071 733B A5 74 lda temp2 - 2072 733D E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...) - 2073 733F 85 D8 sta LineYdraw - 2074 - 2075 7341 4C 76 73 jmp TypeLine4x4.noLengthNoColor ; rts - 2076 - 2077 .endp - 2078 - 2079 ;-------------------------------------------------------- - 2080 7344 .proc DisplayTankNameAbove ; - 2081 7344 A5 6C lda tankNr - 2082 7346 0A 0A 0A :3 asl ; *8 - 2083 7349 18 clc - 2084 734A 69 09 adc #Tanksnames - 2088 7352 85 73 sta temp+1 ; TextAddress+1 - 2089 7354 A5 72 85 B3 A5 73 + mwa temp LineAddress4x4 - 2090 - 2091 ;find length of the tank's name - 2092 735C A0 07 ldy #7 - 2093 @ - 2094 735E B1 72 lda (temp),y - 2095 7360 D0 03 bne end_found - 2096 7362 88 dey - 2097 7363 D0 F9 bne @- - 2098 - 2099 7365 end_found - 2100 7365 C8 iny - 2101 7366 84 83 sty fx - 2102 7368 A4 6C ldy tankNr - 2103 736A 20 B1 72 jsr Display4x4AboveTank - 2104 736D 60 rts - 2105 .endp - 2106 - 2107 ;------------------------------- - 2108 736E .proc TypeLine4x4 ; - 2109 ;------------------------------- - 2110 ;this routine prints line of length `fx` - 2111 ;address in LineAddress4x4 - 2112 ;starting from LineXdraw, LineYdraw - 2113 - 2114 736E A9 0E lda #14 ; default length of 4x4 texts - 2115 7370 85 83 sta fx - 2116 - 2117 7372 variableLength - 2118 7372 A9 FF lda #$ff ; $ff - visible characters, $00 - clearing - 2119 - 2120 7374 staplot4x4color - 2121 7374 85 DB sta plot4x4color - 2122 7376 noLengthNoColor - 2123 - 2124 7376 A0 00 ldy #0 - 2125 7378 8C E9 48 sty LineCharNr - 2126 - 2127 737B TypeLine4x4Loop - 2128 737B AC E9 48 ldy LineCharNr - 2129 - 2130 737E B1 B3 lda (LineAddress4x4),y - 2131 7380 29 3F and #$3f ;always CAPITAL letters - 2132 7382 8D EC 48 sta CharCode4x4 - 2133 7385 A5 D9 85 8B A5 DA + mwa LineXdraw dx - 2134 738D A5 D8 85 8D mva LineYdraw dy - 2135 7391 A9 00 85 8E mva #0 dy+1 ; dy is 2 bytes value - 2136 7395 20 85 71 jsr PutChar4x4 ;type empty pixels as well! - 2137 7398 18 A5 D9 69 04 85 + adw LineXdraw #4 - 2138 73A3 EE E9 48 AD E9 48 inc:lda LineCharNr - 2139 73A9 C5 83 cmp fx - 2140 73AB D0 CE bne TypeLine4x4Loop - 2141 - 2142 73AD EndOfTypeLine4x4 - 2143 73AD 60 rts - 2144 .endp - 2145 - 2146 - 2147 ;-------------------------------- - 2148 73AE .proc AreYouSure - 2149 ;using 4x4 font - 2150 - 2151 73AE A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen - 2152 - 2153 ;top frame - 2154 73B2 A5 B2 85 D8 mva ResultY LineYdraw - 2155 73B6 20 E8 65 jsr TL4x4_top - 2156 73B9 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2157 - 2158 ;sure? - 2159 73C0 A9 5D 85 B3 A9 5B + mwa #areYouSureText LineAddress4x4 - 2160 73C8 20 02 74 jsr _sep_opty - 2161 ;bottom frame - 2162 73CB A5 B2 85 D8 mva ResultY LineYdraw - 2163 73CF 20 D5 65 jsr TL4x4_bottom - 2164 - 2165 - 2166 73D2 20 5F 5A jsr GetKey - 2167 73D5 C9 2B cmp #@kbcode._Y ; $2b ; "Y" - 2168 73D7 D0 06 bne @+ - 2169 73D9 A9 80 85 D7 mva #$80 escFlag - 2170 73DD D0 04 bne skip01 - 2171 73DF A9 00 85 D7 @ mva #0 escFlag - 2172 73E3 skip01 - 2173 73E3 20 71 5A jsr WaitForKeyRelease - 2174 - 2175 ;clean - 2176 73E6 A9 03 85 91 mva #3 di - 2177 73EA A9 04 85 B2 mva #4 ResultY - 2178 @ - 2179 73EE A9 FF 85 DB mva #$ff plot4x4color - 2180 73F2 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 - 2181 73FA 20 02 74 jsr _sep_opty - 2182 73FD C6 91 dec di - 2183 73FF D0 ED bne @- - 2184 - 2185 7401 quit_areyousure - 2186 7401 60 rts - 2187 .endp - 2188 - 2189 7402 .proc _sep_opty - 2190 7402 A9 80 85 D9 A9 00 + mwa #((ScreenWidth/2)-(8*4)) LineXdraw ; centering - 2191 740A A5 B2 85 D8 mva ResultY LineYdraw - 2192 740E 20 6E 73 jsr TypeLine4x4 - 2193 7411 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2194 7418 60 rts - 2195 .endp - 2196 - 2197 ;-------------------------------- - 2198 7419 .proc DisplaySeppuku - 2199 ;using 4x4 font - 2200 - 2201 - 2202 7419 A9 14 85 89 mva #20 fs ; temp, how many times blink the billboard - 2203 741D seppuku_loop - 2204 741D A5 02 lda CONSOL ; turbo mode - 2205 741F 29 01 and #%00000001 ; START KEY - 2206 7421 D0 04 A9 01 85 89 sne:mva #1 fs ; finish it - 2207 - 2208 7427 A9 04 85 B2 mva #4 ResultY ; where seppuku text starts Y-wise on the screen - 2209 - 2210 ;top frame - 2211 742B A5 B2 85 D8 mva ResultY LineYdraw - 2212 742F 20 E8 65 jsr TL4x4_top - 2213 7432 A5 B2 18 69 04 85 + adb ResultY #4 ;next line - 2214 - 2215 ;seppuku - 2216 7439 A9 4F 85 B3 A9 5B + mwa #seppukuText LineAddress4x4 - 2217 7441 20 02 74 jsr _sep_opty - 2218 - 2219 ;bottom frame - 2220 7444 A5 B2 85 D8 mva ResultY LineYdraw - 2221 7448 20 D5 65 jsr TL4x4_bottom ; just go - 2222 - 2223 ;clean seppuku - 2224 - 2225 744B A9 03 85 91 mva #3 di - 2226 ;mva #4 ResultY - 2227 744F A9 04 lda #4 - 2228 7451 85 B2 sta ResultY - 2229 7453 loplop ;@ - 2230 7453 A9 6B 85 B3 A9 5B + mwa #lineClear LineAddress4x4 - 2231 745B 20 02 74 jsr _sep_opty - 2232 - 2233 745E C6 91 dec di - 2234 7460 D0 F1 bne loplop ;@- - 2235 - 2236 7462 C6 89 dec fs - 2237 7464 D0 B7 jne seppuku_loop - 2238 - 2239 7466 quit_seppuku - 2240 7466 60 rts - 2241 - 2242 .endp - 2243 - 2244 ; ------------------------------------- - 2245 7467 .proc SetupXYdraw - 2246 7467 BD 19 44 lda ytankstable,x - 2247 746A 85 63 sta ydraw - 2248 746C A9 00 85 64 mva #0 ydraw+1 - 2249 7470 BD 0D 44 X lda XtanksTableL,x - 2250 7473 85 61 sta xdraw - 2251 7475 BD 13 44 lda XtanksTableH,x - 2252 7478 85 62 sta xdraw+1 - 2253 747A 60 rts - 2254 .endp - 2255 ;-------------------------------------------------- - 2256 747B .proc DrawBarrel - 2257 ; X - tankNr - 2258 ; changes xdraw, ydraw, fx, fy - 2259 ;-------------------------------------------------- - 2260 ;vx calculation - 2261 ;vx = sin(90-Angle) for Angle <=90 - 2262 ;vx = -sin(Angle-90) for 90 < Angle <= 180 - 2263 - 2264 ; erase previous barrel - 2265 - 2266 ;cos(Angle) (but we use sin table only so some shenanigans happen) - 2267 ; mva #0 color - 2268 ; lda previousBarrelAngle,x - 2269 ; sta Angle - 2270 ; jsr DrawBarrelTech - 2271 ; - 2272 ; mva #1 color - 2273 747B A6 6C ldx TankNr - 2274 747D 20 67 74 jsr SetupXYdraw - 2275 7480 BD F1 43 lda BarrelLength,x - 2276 7483 85 8A sta yc ; current tank barrel length - 2277 7485 BD C3 48 lda angleTable,x - 2278 7488 85 A7 sta Angle - 2279 748A 20 8E 74 jsr DrawBarrelTech - 2280 748D 60 rts - 2281 .endp - 2282 - 2283 748E .proc DrawBarrelTech - 2284 ; angle in Angle and A - 2285 - 2286 748E A2 00 86 E6 mvx #0 goleft - 2287 7492 C9 5B cmp #91 - 2288 7494 90 17 bcc angleUnder90 - 2289 - 2290 ;over 90 - 2291 7496 38 sec - 2292 7497 E9 5A sbc #90 - 2293 7499 AA tax - 2294 ; barrel start offset over 90deg - 2295 749A 18 A5 61 69 04 85 + adw xdraw #4 xdraw - 2296 74A7 A9 01 85 E6 mva #1 goleft - 2297 74AB 10 13 bpl @+ ; jmp @+ - 2298 - 2299 74AD angleUnder90 - 2300 74AD 38 sec ; X = 90-Angle - 2301 74AE A9 5A lda #90 - 2302 74B0 E5 A7 sbc Angle - 2303 74B2 AA tax - 2304 ; barrel start offset under 90deg - 2305 74B3 18 A5 61 69 03 85 + adw xdraw #3 xdraw - 2306 - 2307 @ - 2308 74C0 38 A5 63 E9 03 85 + sbw ydraw #3 ydraw - 2309 74CD BD C1 5B lda sintable,x ; cos(X) - 2310 74D0 85 BB sta vx - 2311 - 2312 ;======vy - 2313 ;vy = sin(Angle) for Angle <=90 - 2314 ;vy = sin(180-Angle) for 90 < Angle <= 180 - 2315 - 2316 ;-- - 2317 74D2 A5 A7 lda Angle - 2318 74D4 C9 5B cmp #91 - 2319 74D6 90 05 bcc YangleUnder90 - 2320 - 2321 74D8 A9 B4 lda #180 - 2322 74DA 38 sec - 2323 74DB E5 A7 sbc Angle - 2324 74DD YangleUnder90 - 2325 74DD AA tax - 2326 74DE BD C1 5B lda sintable,x - 2327 74E1 85 B7 sta vy - 2328 - 2329 74E3 A9 00 lda #0 ; all arithmetic to zero - 2330 74E5 85 BC sta vx+1 - 2331 74E7 85 B8 sta vy+1 - 2332 74E9 A9 80 lda #128 ; ; add 0.5 to fx and fy (not vx and vx) for better rounding - it's my opinion (Pecus) - 2333 74EB 85 83 sta fx - 2334 74ED 85 86 sta fy - 2335 - 2336 ; draw by vx vy - 2337 ; in each step - 2338 ; 1. plot(xdraw, ydraw) - 2339 ; 2. add vx and vy to 3 byte variables xdraw.fx, ydraw.fy - 2340 ; 3 check length, if shorter, go to 1. - 2341 - 2342 ; mva #6 yc ; barrel length - 2343 74EF barrelLoop - 2344 - 2345 74EF A5 E6 lda goleft - 2346 74F1 D0 16 bne goright - 2347 74F3 18 clc - 2348 74F4 A5 83 lda fx - 2349 74F6 65 BB adc vx - 2350 74F8 85 83 sta fx - 2351 74FA 90 0A bcc @+ - 2352 74FC A5 61 lda xdraw - 2353 74FE 65 BC adc vx+1 - 2354 7500 85 61 sta xdraw - 2355 7502 90 02 bcc @+ - 2356 7504 E6 62 inc xdraw+1 - 2357 @ - 2358 7506 4C 1C 75 jmp ybarrel - 2359 7509 goright - 2360 7509 38 sec - 2361 750A A5 83 lda fx - 2362 750C E5 BB sbc vx - 2363 750E 85 83 sta fx - 2364 7510 B0 0A bcs @+ - 2365 7512 A5 61 lda xdraw - 2366 7514 E5 BC sbc vx+1 - 2367 7516 85 61 sta xdraw - 2368 7518 B0 02 bcs @+ - 2369 751A C6 62 dec xdraw+1 - 2370 @ - 2371 751C ybarrel - 2372 751C 38 sec - 2373 751D A5 86 lda fy - 2374 751F E5 B7 sbc vy - 2375 7521 85 86 sta fy - 2376 7523 B0 0A bcs @+ - 2377 7525 A5 63 lda ydraw - 2378 7527 E5 B8 sbc vy+1 - 2379 7529 85 63 sta ydraw - 2380 752B B0 02 bcs @+ - 2381 752D C6 64 dec ydraw+1 - 2382 @ - 2383 752F 20 14 76 jsr plot ;.MakePlot - 2384 - 2385 7532 C6 8A dec yc - 2386 7534 D0 B9 bne barrelLoop - 2387 - 2388 7536 A5 61 8D C9 48 A5 + mwa xdraw EndOfTheBarrelX - 2389 7540 A5 63 8D CB 48 mva ydraw EndOfTheBarrelY - 2390 - 2391 7545 60 rts - 2392 .endp - 2393 ;-------------------------------------------------- - 2394 7546 .proc PMoutofScreen - 2395 ;-------------------------------------------------- - 2396 7546 A9 00 lda #$00 ; let all P/M disappear - 2397 7548 A0 07 ldy #7 - 2398 754A 99 02 00 @ sta hposp0,y - 2399 754D 88 dey - 2400 754E 10 FA bpl @- - 2401 ;:8 sta hposp0+# ; optimized... but Y! - 2402 7550 60 rts - 2403 .endp - 2404 ;-------------------------------------------------- - 2405 7551 .proc ColorsOfSprites - 2406 7551 A0 03 ldy #3 - 2407 7553 B9 79 5B @ lda TankColoursTable,y ; colours of sprites under tanks - 2408 7556 99 02 00 sta PCOLR0,y - 2409 7559 88 dey - 2410 755A 10 F7 bpl @- - 2411 755C AD 7D 5B LDA TankColoursTable+4 - 2412 755F 85 02 STA COLOR3 ; joined missiles (5th tank) - 2413 7561 60 rts - 2414 .endp - 2415 ;-------------------------------------------------- - 2416 7562 .proc SetPMWidth - 2417 7562 A9 55 lda #%01010101 - 2418 7564 85 02 sta sizem ; all missiles, double width - 2419 7566 A9 00 lda #$00 - 2420 7568 85 02 sta sizep0 ; P0-P3 widths - 2421 756A 85 03 sta sizep0+1 - 2422 756C 85 04 sta sizep0+2 - 2423 756E 85 05 sta sizep0+3 - 2424 7570 60 rts - 2425 .endp - 2426 - 2427 .endif - 349 7571 icl 'C64/gr_basics.asm' -Source: gr_basics.asm - 1 .IF *>0 ;this is a trick that prevents compiling this file alone - 2 - 3 ; Basic hardware-dependent graphics routines. - 4 - 5 ; ----------------------------------------- - 6 7571 .proc unPlot - 7 ; plots a point and saves the plotted byte, reverts the previous plot. - 8 ; ----------------------------------------- - 9 7571 A2 00 ldx #0 ; only one pixel - 10 7573 unPlotAfterX - 11 7573 8E 96 44 stx WhichUnPlot - 12 - 13 ; first remake the oldie - 14 7576 BD 9C 44 lda oldplotL,x - 15 7579 85 6E sta oldplot - 16 757B BD 97 44 lda oldplotH,x - 17 757E 85 6F sta oldplot+1 - 18 - 19 7580 A0 00 ldy #0 - 20 7582 BD A1 44 lda oldora,x - 21 7585 91 6E sta (oldplot),y - 22 - 23 - 24 ; is it not out of the screen ???? - 25 7587 A5 64 C9 00 D0 04 + cpw ydraw #screenheight - 26 7591 90 06 jcc CheckX - 27 7593 A9 00 85 63 85 64 mwa #0 ydraw - 28 7599 CheckX - 29 7599 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 30 75A3 B0 6E jcs EndOfUnPlot - 31 75A5 MakeUnPlot - 32 ; let's count coordinates taken from xdraw and ydraw - 33 75A5 A5 61 lda xdraw - 34 75A7 29 F8 and #%11111000 - 35 ;sta xbyte - 36 ;--- - 37 75A9 A6 63 ldx ydraw - 38 75AB 18 clc - 39 75AC 7D 68 41 adc linetableL,x - 40 75AF 85 65 sta xbyte - 41 75B1 85 6E sta oldplot - 42 75B3 BD 31 42 lda linetableH,x - 43 75B6 65 62 adc xdraw+1 - 44 75B8 85 66 sta xbyte+1 - 45 75BA 85 6F sta oldplot+1 - 46 - 47 75BC A5 61 lda xdraw - 48 75BE 29 07 and #$7 - 49 75C0 AA tax - 50 75C1 A0 00 ldy #0 - 51 - 52 75C3 A5 A9 lda color - 53 75C5 D0 0C bne ClearUnPlot - 54 - 55 ;plotting here - 56 75C7 B1 65 lda (xbyte),y - 57 75C9 8D AB 44 sta OldOraTemp - 58 75CC 1D 1C 5C ora bittable,x - 59 75CF 91 65 sta (xbyte),y - 60 75D1 D0 0A bne ContinueUnPlot ; allways <>0 - 61 75D3 ClearUnPlot - 62 75D3 B1 65 lda (xbyte),y - 63 75D5 8D AB 44 sta OldOraTemp - 64 75D8 3D 24 5C and bittable2,x - 65 75DB 91 65 sta (xbyte),y - 66 75DD ContinueUnPlot - 67 75DD AE 96 44 ldx WhichUnPlot - 68 75E0 AD AB 44 lda OldOraTemp - 69 75E3 9D A1 44 sta oldora,x - 70 75E6 A5 6E lda oldplot - 71 75E8 9D 9C 44 sta oldplotL,x - 72 75EB A5 6F lda oldplot+1 - 73 75ED 9D 97 44 sta oldplotH,x - 74 ; and now we must solve the problem of several plots - 75 ; in one byte - 76 75F0 A2 04 ldx #4 - 77 75F2 AC 96 44 ldy WhichUnPlot - 78 75F5 LetsCheckOverlapping - 79 75F5 EC 96 44 cpx WhichUnPlot - 80 75F8 F0 16 beq SkipThisPlot - 81 75FA BD 9C 44 lda oldplotL,x - 82 75FD D9 9C 44 cmp oldplotL,y - 83 7600 D0 0E bne NotTheSamePlot - 84 7602 BD 97 44 lda oldplotH,x - 85 7605 D9 97 44 cmp oldplotH,y - 86 7608 D0 06 bne NotTheSamePlot - 87 ; the pixel is in the same byte so let's take correct contents - 88 760A BD A1 44 lda oldora,x - 89 760D 99 A1 44 sta oldora,y - 90 7610 NotTheSamePlot - 91 7610 SkipThisPlot - 92 7610 CA dex - 93 7611 10 E2 bpl LetsCheckOverlapping - 94 7613 EndOfUnPlot - 95 7613 60 rts - 96 .endp - 97 - 98 ; ----------------------------------------- - 99 7614 .proc plot ;plot (xdraw, ydraw, color) - 100 ; color == 1 --> put pixel - 101 ; color == 0 --> erase pixel - 102 ; this is one of the most important routines in the whole - 103 ; game. If you are going to speed up the game, start with - 104 ; plot - it is used by every single effect starting from explosions - 105 ; through line drawing and small text output!!! - 106 ; - 107 ; Optimized by 0xF (Fox) THXXXX!!! - 108 - 109 ; ----------------------------------------- - 110 ; is it not over the screen ??? - 111 7614 A5 64 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) - 112 761E B0 F3 bcs unPlot.EndOfUnPlot ;nearest RTS - 113 7620 CheckX02 - 114 7620 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 115 762A B0 25 bcs EndOfPlot - 116 762C MakePlot - 117 ; let's calculate coordinates from xdraw and ydraw - 118 - 119 762C A5 61 lda xdraw - 120 762E 29 F8 and #%11111000 - 121 ;sta xbyte - 122 ;--- - 123 7630 A6 63 ldx ydraw - 124 7632 18 clc - 125 7633 7D 68 41 adc linetableL,x - 126 7636 85 65 sta xbyte - 127 7638 BD 31 42 lda linetableH,x - 128 763B 65 62 adc xdraw+1 - 129 763D 85 66 sta xbyte+1 - 130 - 131 763F A5 61 lda xdraw - 132 7641 29 07 and #$7 - 133 7643 AA tax - 134 7644 A0 00 ldy #0 - 135 7646 A5 A9 lda color - 136 7648 D0 08 bne ClearPlot - 137 - 138 764A B1 65 lda (xbyte),y - 139 764C 1D 1C 5C ora bittable,x - 140 764F 91 65 sta (xbyte),y - 141 7651 EndOfPlot - 142 7651 60 rts - 143 7652 ClearPlot - 144 7652 B1 65 lda (xbyte),y - 145 7654 3D 24 5C and bittable2,x - 146 7657 91 65 sta (xbyte),y - 147 7659 60 rts - 148 .endp - 149 - 150 ; ----------------------------------------- - 151 765A .proc point_plot - 152 ; ----------------------------------------- - 153 ; checks state of the pixel (coordinates in xdraw and ydraw) - 154 ; result is in A (zero or appropriate bit is set) - 155 - 156 ; let's calculate coordinates from xdraw and ydraw - 157 - 158 765A A5 61 lda xdraw - 159 765C 29 F8 and #%11111000 - 160 ;sta xbyte - 161 ;--- - 162 765E A6 63 ldx ydraw - 163 7660 18 clc - 164 7661 7D 68 41 adc linetableL,x - 165 7664 85 65 sta xbyte - 166 7666 BD 31 42 lda linetableH,x - 167 7669 65 62 adc xdraw+1 - 168 766B 85 66 sta xbyte+1 - 169 - 170 766D A5 61 lda xdraw - 171 766F 29 07 and #$7 - 172 7671 AA tax - 173 7672 A0 00 ldy #0 - 174 7674 B1 65 lda (xbyte),y - 175 7676 49 FF eor #$ff - 176 7678 3D 1C 5C and bittable,x - 177 767B 60 rts - 178 .endp - 179 - 180 ;-------------------------------------------------- - 181 767C .proc ClearScreen - 182 ;-------------------------------------------------- - 183 767C A9 00 85 72 A9 20 + mwa #displayC64 temp - 184 7684 A0 00 ldy #0 - 185 7686 A9 FF @ lda #$ff - 186 7688 91 72 sta (temp),y - 187 768A E6 72 D0 02 E6 73 inw temp - 188 7690 A5 73 C9 3F D0 04 + cpw temp #displayC64+screenheight*screenBytes+1 - 189 769A D0 EA bne @- - 190 769C 60 rts - 191 .endp - 192 - 193 ;-------------------------------------------------- - 194 769D .proc GenerateLineTable - 195 - 196 769D A9 00 85 72 A9 20 + mwa #displayC64 temp - 197 76A5 A9 68 85 74 A9 41 + mwa #linetableL temp2 - 198 76AD A9 31 85 76 A9 42 + mwa #linetableH modify - 199 76B5 A0 00 ldy #0 - 200 76B7 A2 00 ldx #0 - 201 76B9 A5 72 @ lda temp - 202 76BB 91 74 sta (temp2),y - 203 76BD A5 73 lda temp+1 - 204 76BF 91 76 sta (modify),y - 205 76C1 E0 07 cpx #7 - 206 76C3 D0 12 bne NotChar - 207 76C5 A2 00 ldx #0 - 208 76C7 18 A5 72 69 39 85 + adw temp #(320-7) - 209 76D4 4C DE 76 jmp next8lines - 210 76D7 NotChar - 211 76D7 E6 72 D0 02 E6 73 inw temp - 212 76DD E8 inx - 213 76DE next8lines - 214 76DE C8 iny - 215 76DF C0 C9 cpy #screenheight+1 - 216 76E1 D0 D6 bne @- - 217 76E3 60 rts - 218 .endp - 219 ;-------------------------------------------------- - 220 76E4 .proc SetMainScreen - 221 76E4 A9 0B lda #$b ; Grey background and border - 222 76E6 8D 20 D0 sta $d020 - 223 76E9 8D 21 D0 sta $d021 - 224 - 225 76EC AD 00 DD lda $dd00 ; Set video bank to start at 0 - 226 76EF 29 FC and #252 - 227 76F1 09 03 ora #3 - 228 76F3 8D 00 DD sta $dd00 - 229 76F6 A9 18 lda #$18 - 230 76F8 8D 18 D0 sta $d018 - 231 - 232 ; SwitchVICBank(0) - 233 ; SetScreenMemory($2000) - 234 76FB SetHiresBitmapMode ; Hires mode on -Macro: SETHIRESBITMAPMODE [Source: MACRO.ASM] - 4 76FB AD 11 D0 lda $d011 - 5 76FE 29 BF and #%10111111 - 6 7700 09 20 ora #%00100000 - 7 7702 8D 11 D0 sta $d011 - 12 7705 AD 16 D0 lda $d016 - 13 7708 29 EF and #%11101111 - 14 770A 8D 16 D0 sta $d016 -Source: gr_basics.asm - 235 770D A9 00 lda #$00 - 236 770F 8D 21 D0 sta 53281 - 237 ; clear color RAM - 238 7712 A2 00 ldx #0 - 239 7714 A9 01 @ lda #1 - 240 7716 9D 00 D8 sta $d800,x - 241 7719 9D 00 D9 sta $d900,x - 242 771C 9D 00 DA sta $da00,x - 243 771F 9D 00 DB sta $db00,x - 244 7722 A9 0F lda #$0f - 245 7724 9D 00 04 sta $0400,x - 246 7727 9D 00 05 sta $0500,x - 247 772A 9D 00 06 sta $0600,x - 248 772D 9D 00 07 sta $0700,x - 249 7730 E8 inx - 250 7731 D0 E1 bne @- - 251 - 252 - 253 7733 60 rts - 254 .endp - 255 - 256 .ENDIF - 350 ;---------------------------------------------- - 351 7734 icl 'weapons.asm' -Source: weapons.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 ;-------------------------------------------------- - 5 7734 .proc Explosion - 6 ; xdraw,ydraw (word) - coordinates of explosion center - 7 ; TankNr - number of shooting tank - 8 ; ActiveWeapon(TankNr) - weapon that tank fires - 9 ;-------------------------------------------------- - 10 ;cleanup of the soil fall down ranges (left and right) - 11 7734 20 89 8F jsr ClearScreenSoilRange - 12 - 13 7737 A6 6C ldx TankNr - 14 7739 BD F7 43 lda ActiveWeapon,x - 15 .endp - 16 773C .proc ExplosionDirect - 17 773C 0A asl - 18 773D AA tax - 19 773E BD 48 77 lda ExplosionRoutines+1,x - 20 7741 48 pha - 21 7742 BD 47 77 lda ExplosionRoutines,x - 22 7745 48 pha - 23 7746 60 rts - 24 7747 ExplosionRoutines - 25 7747 A1 77 .word babymissile-1 ;Baby_Missile___;_00 - 26 7749 AC 77 .word missile-1 ;Missile________;_01 - 27 774B B2 77 .word babynuke-1 ;Baby_Nuke______;_02 - 28 774D BC 77 .word nuke-1 ;Nuke___________;_03 - 29 774F C2 77 .word leapfrog-1 ;LeapFrog_______;_04 - 30 7751 FE 77 .word funkybomb-1 ;Funky_Bomb_____;_05 - 31 7753 FD 77 .word mirv-1 ;MIRV___________;_06 - 32 7755 B6 78 .word deathshead-1 ;Death_s_Head___;_07 - 33 7757 55 79 .word napalm-1 ;Napalm_________;_08 - 34 7759 5B 79 .word hotnapalm-1 ;Hot_Napalm_____;_09 - 35 775B 86 77 .word tracer-1 ;Tracer_________;_10 - 36 775D 86 77 .word tracer-1 ;Smoke_Tracer___;_11 - 37 775F 69 7A .word babyroller-1 ;Baby_Roller____;_12 - 38 7761 70 7A .word roller-1 ;Roller_________;_13 - 39 7763 76 7A .word heavyroller-1 ;Heavy_Roller___;_14 - 40 7765 06 7C .word riotcharge-1 ;Riot_Charge____;_15 - 41 7767 10 7C .word riotblast-1 ;Riot_Blast_____;_16 - 42 7769 7C 7A .word riotbomb-1 ;Riot_Bomb______;_17 - 43 776B 86 7A .word heavyriotbomb-1 ;Heavy_Riot_Bomb;_18 - 44 776D 8C 7A .word babydigger-1 ;Baby_Digger____;_19 - 45 776F A1 7A .word digger-1 ;Digger_________;_20 - 46 7771 A8 7A .word heavydigger-1 ;Heavy_Digger___;_21 - 47 7773 AF 7A .word babysandhog-1 ;Baby_Sandhog___;_22 - 48 7775 B6 7A .word sandhog-1 ;Sandhog________;_23 - 49 7777 BD 7A .word heavysandhog-1 ;Heavy_Sandhog__;_24 - 50 7779 BE 7B .word dirtclod-1 ;Dirt_Clod______;_25 - 51 777B C4 7B .word dirtball-1 ;Dirt_Ball______;_26 - 52 777D CA 7B .word tonofdirt-1 ;Ton_of_Dirt____;_27 - 53 777F 22 7C .word liquiddirt-1 ;Liquid_Dirt____;_28 - 54 7781 FC 7B .word dirtcharge-1 ;Dirt_Charge____;_29 - 55 7783 87 77 .word BFG-1 ;Buy_me_________;_30 - 56 7785 FC 7C .word laser-1 ;Laser__________;_31 - 57 - 58 7787 VOID - 59 7787 tracer - 60 7787 60 rts - 61 .endp - 62 7788 .proc BFG - 63 7788 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect - 64 778C 20 9C A2 jsr BFGblink - 65 ; Kill all :) - 66 778F A6 AE ldx NumberOfPlayers - 67 7791 CA dex - 68 7792 A9 00 lda #$00 - 69 7794 CheckNextTankBFG - 70 7794 E4 6C cpx TankNr ; not me! - 71 7796 F0 03 beq @+ - 72 7798 9D A2 43 sta Energy,x - 73 779B CA @ dex - 74 779C 10 F6 bpl CheckNextTankBFG - 75 779E 8E D9 44 stx AfterBFGflag ; $ff - 76 77A1 60 rts - 77 .endp - 78 ; ------------------------ - 79 77A2 .proc babymissile - 80 77A2 A9 0B 85 B0 mva #11 ExplosionRadius - 81 77A6 GoBabyMissileSFX - 82 77A6 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 83 77AA GoXmissile - 84 77AA 4C C5 7D jmp xmissile - 85 .endp - 86 ; ------------------------ - 87 77AD .proc missile ; - 88 77AD A9 11 85 B0 mva #17 ExplosionRadius - 89 77B1 D0 F3 bne babymissile.GoBabyMissileSFX - 90 ; jmp xmissile - 91 .endp - 92 ; ------------------------ - 93 77B3 .proc babynuke - 94 77B3 A9 19 85 B0 mva #25 ExplosionRadius - 95 77B7 GoBabyNukeSFX - 96 77B7 A9 04 85 9E mva #sfx_nuke sfx_effect ; allways <>0 - 97 77BB D0 ED bne babymissile.GoXmissile - 98 ; jmp xmissile - 99 .endp - 100 ; ------------------------ - 101 77BD .proc nuke - 102 77BD A9 1E 85 B0 mva #30 ExplosionRadius - 103 77C1 D0 F4 bne babynuke.GoBabyNukeSFX - 104 ; jmp xmissile - 105 .endp - 106 ; ------------------------ - 107 77C3 .proc leapfrog - 108 77C3 A9 11 85 B0 mva #17 ExplosionRadius - 109 ; mva #sfx_baby_missile sfx_effect - 110 ; jsr xmissile - 111 77C7 20 A6 77 jsr babymissile.GoBabyMissileSFX - 112 - 113 77CA 20 CD 77 jsr SecondRepeat - 114 - 115 77CD SecondRepeat - 116 ; soil must fall down now! there is no other way... - 117 ; hide tanks or they fall down with soil - 118 77CD 20 F4 6E jsr SoilDown2 - 119 - 120 ; it looks like force is divided by 4 here BUT" - 121 ; in Flight routine force is multiplied by 2 and left - 122 ; so, we have Force divided by 2 here (not accurately) - 123 ;lsr Force+1 - 124 ;ror Force - 125 77D0 46 A5 lsr Force+1 - 126 77D2 66 A4 ror Force - 127 77D4 AD 15 45 85 A7 mva LeapFrogAngle Angle - 128 77D9 A9 0C 85 9E mva #sfx_funky_hit sfx_effect - 129 77DD 38 A5 CC E9 05 85 + sbw ytraj+1 #$05 ; next missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) - 130 77E8 20 A0 83 jsr Flight - 131 77EB A5 BF lda HitFlag - 132 77ED F0 0E beq EndOfLeapping - 133 77EF A9 0E 85 B0 mva #14 ExplosionRadius - 134 77F3 20 09 8F jsr CalculateExplosionRange0 - 135 77F6 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 136 77FA 4C C8 7D jmp xmissile.NoRangeCalc - 137 77FD EndOfLeapping - 138 77FD 60 rts - 139 .endp - 140 ; ------------------------ - 141 77FE .proc mirv ; the whole mirv is performed by Flight routine - 142 77FE 60 rts - 143 .endp - 144 ; ------------------------ - 145 77FF .proc funkybomb ; - 146 77FF A9 05 85 9E mva #sfx_baby_missile sfx_effect - 147 7803 A5 C9 8D AC 44 A5 + mwa xtraj+1 xtrajfb - 148 780D 38 A5 CC E9 05 8D + sbw ytraj+1 #$05 ytrajfb ; funky missiles start point goes 5 pixel UP to prevent multiple explosion at one point if tank is hit (4 pixels tank height + 1) - 149 ;central Explosion - 150 781C A9 15 85 B0 mva #21 ExplosionRadius - 151 7820 20 09 8F jsr CalculateExplosionRange0 - 152 7823 20 C8 7D jsr xmissile.NoRangeCalc - 153 - 154 7826 20 F4 6E jsr SoilDown2 - 155 ; - 156 7829 20 0B 6A jsr cleartanks ; maybe not? - 157 782C A9 01 85 A9 mva #1 color - 158 7830 A9 00 85 A2 mva #0 FunkyWallFlag - 159 7834 A9 05 85 B1 mva #5 FunkyBombCounter - 160 7838 FunkyBombLoop - 161 7838 A9 01 85 E3 mva #1 tracerflag - 162 ;force randomization (range: 256-511) - 163 783C AD 1B D4 lda random - 164 783F 85 A4 sta Force - 165 7841 A9 01 85 A5 mva #1 Force+1 - 166 ;Angle randomization Range: (70-110 degrees) - 167 7845 randomize 70 110 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 7845 ?rand - 7 7845 AD 1B D4 lda random - 8 7848 C9 46 cmp #70 ;floor - 9 784A 90 F9 bcc ?rand - 10 784C C9 6F cmp #110+1 ;ceiling - 11 784E B0 F5 bcs ?rand -Source: weapons.asm - 168 7850 85 A7 sta Angle - 169 - 170 7852 A9 00 lda #0 - 171 7854 85 C8 sta xtraj - 172 7856 85 CB sta ytraj - 173 7858 AD AC 44 85 C9 AD + mwa xtrajfb xtraj+1 - 174 7862 AD AE 44 85 CC AD + mwa ytrajfb ytraj+1 - 175 786C A9 0C 85 9E mva #sfx_funky_hit sfx_effect - 176 7870 20 A0 83 jsr Flight - 177 7873 A9 00 85 B0 mva #0 ExplosionRadius ; if no explosion (off screen) - 178 ; if xdraw if over range then fix it - 179 7877 A5 62 lda xdraw+1 - 180 7879 10 06 bpl NoOnLeftEdge - 181 787B A9 00 lda #0 - 182 787D 85 61 sta xdraw - 183 787F 85 62 sta xdraw+1 - 184 7881 NoOnLeftEdge - 185 7881 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 186 788B 90 08 bcc NoOnRightEdge - 187 788D A9 40 85 61 A9 01 + mwa #screenwidth xdraw - 188 7895 NoOnRightEdge - 189 7895 20 0C 8F jsr CalculateExplosionRange ; add end of flight coordinates to soildown range - 190 7898 A5 BF lda HitFlag - 191 789A F0 0B beq NoExplosionInFunkyBomb - 192 789C A9 05 85 9E mva #sfx_baby_missile sfx_effect - 193 78A0 A9 0B 85 B0 mva #11 ExplosionRadius - 194 78A4 20 C5 7D jsr xmissile - 195 78A7 NoExplosionInFunkyBomb - 196 78A7 C6 B1 dec FunkyBombCounter - 197 78A9 D0 8D bne FunkyBombLoop - 198 78AB A9 00 85 E3 mva #0 tracerflag - 199 78AF A5 A2 lda FunkyWallFlag - 200 78B1 F0 03 beq NoWallsInFunky - 201 78B3 20 7A 8F jsr SetFullScreenSoilRange - 202 78B6 NoWallsInFunky - 203 78B6 60 rts - 204 .endp - 205 ; ------------------------ - 206 78B7 .proc deathshead - 207 78B7 A9 1E 85 B0 mva #30 ExplosionRadius - 208 78BB A9 04 85 9E mva #sfx_nuke sfx_effect - 209 78BF 20 32 79 jsr GoXmissileWithSaveXYdraw - 210 78C2 38 A5 61 E9 22 85 + sbw xdraw #34 - 211 78CD A9 04 85 9E mva #sfx_nuke sfx_effect - 212 78D1 20 32 79 jsr GoXmissileWithSaveXYdraw - 213 78D4 18 A5 61 69 44 85 + adw xdraw #68 - 214 78DF A9 04 85 9E mva #sfx_nuke sfx_effect - 215 78E3 20 32 79 jsr GoXmissileWithSaveXYdraw - 216 78E6 38 A5 61 E9 22 85 + sbw xdraw #34 - 217 ; - 218 78F1 38 A5 63 E9 22 85 + sbw ydraw #34 - 219 ;jsr CalculateExplosionRange - 220 78FC A5 64 C9 00 D0 04 + cpw ydraw #screenHeight - 221 7906 B0 07 bcs NoUpperCircle - 222 7908 A9 04 85 9E mva #sfx_nuke sfx_effect - 223 790C 20 32 79 jsr GoXmissileWithSaveXYdraw - 224 790F NoUpperCircle - 225 790F 18 A5 63 69 44 85 + adw ydraw #68 - 226 ;jsr CalculateExplosionRange - 227 791A A5 64 C9 00 D0 04 + cpw ydraw #screenHeight - 228 7924 B0 07 bcs NoLowerCircle - 229 7926 A9 04 85 9E mva #sfx_nuke sfx_effect - 230 792A 20 32 79 jsr GoXmissileWithSaveXYdraw - 231 792D NoLowerCircle - 232 792D A9 15 85 9E mva #sfx_silencer sfx_effect - 233 7931 60 rts - 234 - 235 7932 GoXmissileWithSaveXYdraw - 236 7932 A5 61 85 78 A5 62 + mwa xdraw tempXROLLER - 237 793A A5 63 85 76 A5 64 + mwa ydraw modify - 238 7942 20 C5 7D jsr xmissile - 239 7945 A5 78 85 61 A5 79 + mwa tempXROLLER xdraw - 240 794D A5 76 85 63 A5 77 + mwa modify ydraw - 241 7955 60 rts - 242 .endp - 243 ; ------------------------ - 244 7956 .proc napalm - 245 7956 A9 00 85 B1 mva #0 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm - 246 795A F0 04 beq xnapalm - 247 .endp - 248 ; ------------------------ - 249 795C .proc hotnapalm - 250 795C A9 01 85 B1 mva #1 HotNapalmFlag ; in this weapon - flag: 0 - napalm, 1 - hotnapalm - 251 ; jmp xnapalm - 252 .endp - 253 ; ------------------------ - 254 7960 .proc xnapalm - 255 7960 A9 09 85 9E mva #sfx_napalm sfx_effect - 256 7964 A9 0E 85 B0 mva #(napalmRadius+4) ExplosionRadius ; real radius + 4 pixels (half characrer width) - 257 7968 20 0C 8F jsr CalculateExplosionRange - 258 ; - 259 796B A5 61 85 B3 A5 62 + mwa xdraw xcircle ; store hitpoint for future repeats - 260 7973 A0 1E ldy #30 ; repeat 30 times - 261 7975 84 C6 sty magic - 262 7977 RepeatNapalm ; external loop (for fire animation) - 263 7977 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 264 797F 38 A5 61 E9 0A 85 + sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point - 265 798A A0 00 ldy #0 - 266 798C 84 C7 sty magic+1 - 267 798E RepeatFlame ; internal loop (draw flames) - 268 798E A0 00 ldy #0 - 269 7990 18 A5 61 69 3E 85 + adw xdraw #mountaintable temp - 270 799D 84 64 sty ydraw+1 - 271 799F B1 72 lda (temp),y - 272 79A1 38 sec - 273 79A2 E9 01 sbc #1 ; over ground - 274 79A4 85 63 sta ydraw - 275 79A6 A5 61 lda xdraw - 276 79A8 25 B1 and HotNapalmFlag ; if hotnapalm and x is odd: - 277 79AA 0A 0A :2 asl ; modify y position 4 pixels up - 278 79AC A4 63 ldy ydraw - 279 79AE 85 63 sta ydraw - 280 79B0 98 tya - 281 79B1 38 sec - 282 79B2 E5 63 sbc ydraw - 283 79B4 85 63 sta ydraw - 284 79B6 38 A5 61 E9 04 85 + sbw xdraw #4 ; half character correction - 285 ; draw flame symbol - 286 79C1 A5 C6 lda magic ; if last repeat - clear flames - 287 79C3 F0 0A beq LastNapalmRepeat - 288 79C5 AD 1B D4 lda random - 289 79C8 29 06 and #%00000110 - 290 79CA 18 clc - 291 79CB 69 14 adc #char_flame___________ - 292 79CD D0 02 bne PutFlameChar - 293 79CF LastNapalmRepeat - 294 79CF A9 1C lda #char_clear_flame_____ ; clear flame symbol - 295 79D1 PutFlameChar - 296 79D1 85 69 sta CharCode - 297 ; check coordinates - 298 79D3 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-7) - 299 79DD B0 0D bcs CharOffTheScreen - 300 79DF A5 63 lda ydraw - 301 79E1 C9 07 cmp #7 - 302 79E3 90 07 bcc CharOffTheScreen - 303 79E5 C9 C7 cmp #(screenHeight-1) - 304 79E7 B0 03 bcs CharOffTheScreen - 305 79E9 20 E7 70 jsr TypeChar - 306 79EC CharOffTheScreen - 307 79EC 18 A5 61 69 04 85 + adw xdraw #4 ; reverse half character correction (we need positon of character center) - 308 79F7 18 A5 61 69 01 85 + adw xdraw #1 ; next char 1 pixels to right - 309 7A02 E6 C7 inc magic+1 - 310 7A04 A5 C7 lda magic+1 - 311 7A06 C9 15 cmp #(2*napalmRadius+1) ; 10 pixels on left, 10 pixels on right and 1 in center - 312 7A08 D0 84 jne RepeatFlame - 313 7A0A C6 C6 dec magic - 314 7A0C 30 03 4C 77 79 jpl RepeatNapalm - 315 ; after napalm - 316 ;now we must check tanks in range - 317 7A11 A6 AE ldx NumberOfPlayers - 318 7A13 CA dex - 319 7A14 BurnedCheckLoop - 320 7A14 BD AF 43 lda eXistenZ,x - 321 7A17 F0 49 beq EndNurnedCheckLoop - 322 ;here the tank exist - 323 ; calculate right edge of the fire - 324 7A19 18 A5 B3 69 12 85 + adw xcircle #(napalmRadius+4+4) xdraw ; 10 pixels on right side hit point + half character width + correction - 325 ; now we compare tank position with right edge of the fire (napalm) - 326 7A26 BD 13 44 lda XtankstableH,x - 327 7A29 C5 62 cmp xdraw+1 - 328 7A2B D0 05 bne @+ - 329 7A2D BD 0D 44 lda XtankstableL,x - 330 7A30 C5 61 cmp xdraw - 331 @ - 332 7A32 B0 2E bcs TankOutOfFire - 333 ; let's calculate left edge of the fire - 334 7A34 38 A5 B3 E9 12 85 + sbw xcircle #(napalmRadius+TankWidth+4-4) xdraw ; 10 pixels on left + character width (tank) + half character - correction - 335 7A41 10 06 bpl @+ - 336 7A43 A9 00 85 61 85 62 mwa #0 xdraw ; left screen edge - 337 @ - 338 ; now we compare tank position with left edge of the fire (napalm) - 339 7A49 BD 13 44 lda XtankstableH,x - 340 7A4C C5 62 cmp xdraw+1 - 341 7A4E D0 05 bne @+ - 342 7A50 BD 0D 44 lda XtankstableL,x - 343 7A53 C5 61 cmp xdraw - 344 @ - 345 7A55 90 0B bcc TankOutOfFire - 346 - 347 7A57 A0 28 ldy #40 ; energy decrease (napalm) - but if hotnapalm: - 348 7A59 A5 B1 lda HotNapalmFlag - 349 7A5B F0 02 beq NotHot - 350 7A5D A0 50 ldy #80 ; energy decrease (hotnapalm) - 351 7A5F NotHot - 352 ; check shields ( joke :) ) - 353 7A5F 20 74 57 jsr DecreaseEnergyX - 354 7A62 TankOutOfFire - 355 7A62 EndNurnedCheckLoop - 356 7A62 CA dex - 357 7A63 10 AF bpl BurnedCheckLoop - 358 7A65 A9 15 85 9E mva #sfx_silencer sfx_effect - 359 7A69 60 rts - 360 .endp - 361 ; ------------------------ - 362 7A6A .proc babyroller - 363 7A6A A9 0B 85 B0 mva #11 ExplosionRadius - 364 7A6E GoRoller - 365 7A6E 4C A6 7E jmp xroller - 366 .endp - 367 ; ------------------------ - 368 7A71 .proc roller ; - 369 7A71 A9 15 85 B0 mva #21 ExplosionRadius - 370 7A75 D0 F7 bne babyroller.GoRoller ; 1 byte saved - 371 ; jmp xroller - 372 .endp - 373 ; ------------------------ - 374 7A77 .proc heavyroller - 375 7A77 A9 1E 85 B0 mva #30 ExplosionRadius - 376 7A7B D0 F1 bne babyroller.GoRoller ; 1 byte saved - 377 ; jmp xroller - 378 .endp - 379 ; ------------------------ - 380 7A7D .proc riotbomb - 381 7A7D A9 11 85 B0 mva #17 ExplosionRadius - 382 7A81 GoRiotBomb - 383 7A81 20 0C 8F jsr CalculateExplosionRange - 384 7A84 4C 8C 7E jmp xriotbomb - 385 .endp - 386 ; ------------------------ - 387 7A87 .proc heavyriotbomb - 388 7A87 A9 1D 85 B0 mva #29 ExplosionRadius - 389 7A8B D0 F4 bne riotbomb.GoRiotBomb ; 4 bytes saved - optimization :) - 390 ; jsr CalculateExplosionRange - 391 ; jmp xriotbomb - 392 .endp - 393 ; ------------------------ - 394 7A8D .proc babydigger - 395 7A8D A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) - 396 7A92 GoBabydiggerSFX - 397 7A92 A9 14 85 9E mva #sfx_digger sfx_effect - 398 7A96 A9 00 8D 5E 44 mva #0 sandhogflag - 399 7A9B A9 0D 8D 39 44 mva #13 DigLong - 400 7AA0 D0 2F bne xdigger - 401 .endp - 402 ; ------------------------ - 403 7AA2 .proc digger ; - 404 7AA2 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) - 405 7AA7 D0 E9 bne babydigger.GoBabydiggerSFX - 406 .endp - 407 ; ------------------------ - 408 7AA9 .proc heavydigger - 409 7AA9 A9 07 8D 38 44 mva #7 diggery ; how many branches (-1) - 410 7AAE D0 E2 bne babydigger.GoBabydiggerSFX - 411 .endp - 412 ; ------------------------ - 413 7AB0 .proc babysandhog - 414 7AB0 A9 01 8D 38 44 mva #1 diggery ; how many branches (-1) - 415 7AB5 D0 0C bne heavysandhog.GoHeavysandhogSFX - 416 .endp - 417 ; ------------------------ - 418 7AB7 .proc sandhog - 419 7AB7 A9 03 8D 38 44 mva #3 diggery ; how many branches (-1) - 420 7ABC D0 05 bne heavysandhog.GoHeavysandhogSFX - 421 .endp - 422 ; ------------------------ - 423 7ABE .proc heavysandhog - 424 7ABE A9 05 8D 38 44 mva #5 diggery ; how many branches (-1) - 425 7AC3 GoHeavysandhogSFX - 426 7AC3 A9 12 85 9E mva #sfx_sandhog sfx_effect - 427 7AC7 A9 08 8D 5E 44 mva #char_sandhog_offset sandhogflag - 428 7ACC A9 0D 8D 39 44 mva #13 DigLong - 429 ; jmp xdigger - 430 .endp - 431 ; ------------------------ - 432 7AD1 .proc xdigger - 433 ;mwa xdraw digstartx - 434 ;mwa ydraw digstarty - 435 7AD1 AE 38 44 ldx diggery - 436 7AD4 WriteToBranches - 437 7AD4 A5 61 lda xdraw - 438 7AD6 9D 3A 44 sta digtabxL,x - 439 7AD9 A5 62 lda xdraw+1 - 440 7ADB 9D 42 44 sta digtabxH,x - 441 7ADE A5 63 lda ydraw - 442 7AE0 9D 4A 44 sta digtabyL,x - 443 7AE3 A5 64 lda ydraw+1 - 444 7AE5 9D 52 44 sta digtabyH,x - 445 7AE8 CA dex - 446 7AE9 10 E9 bpl WriteToBranches - 447 7AEB 20 A3 7B jsr DiggerCharacter ; start character - 448 - 449 7AEE 18 A5 61 69 04 85 + adw xdraw #4 - 450 7AF9 AD 39 44 lda DigLong - 451 ; looks strange, but it is (DigLong+2)*4 - 452 7AFC 18 clc - 453 7AFD 69 02 adc #$2 - 454 7AFF 0A asl - 455 7B00 0A asl - 456 7B01 85 B0 sta ExplosionRadius - 457 7B03 20 0C 8F jsr CalculateExplosionRange - 458 7B06 BranchNotFinished - 459 7B06 AE 38 44 ldx diggery - 460 7B09 CalculateBranches - 461 7B09 8A txa - 462 7B0A 29 01 and #$01 - 463 7B0C D0 14 bne DigRight - 464 7B0E diglewy ; even branches go left - 465 7B0E 38 sec - 466 7B0F BD 3A 44 lda digtabxL,x - 467 7B12 E9 04 sbc #$04 - 468 7B14 9D 3A 44 sta digtabxL,x - 469 7B17 BD 42 44 lda digtabxH,x - 470 7B1A E9 00 sbc #$00 - 471 7B1C 9D 42 44 sta digtabxH,x - 472 7B1F 4C 33 7B jmp DigRandomize - 473 7B22 DigRight ; odd go right (everytime 4 pixels) - 474 7B22 18 clc - 475 7B23 BD 3A 44 lda digtabxL,x - 476 7B26 69 04 adc #$04 - 477 7B28 9D 3A 44 sta digtabxL,x - 478 7B2B BD 42 44 lda digtabxH,x - 479 7B2E 69 00 adc #$00 - 480 7B30 9D 42 44 sta digtabxH,x - 481 7B33 DigRandomize - 482 7B33 AD 1B D4 lda random - 483 7B36 29 87 and #$87 - 484 7B38 30 20 bmi DigUp - 485 7B3A DigDown - 486 7B3A 29 07 and #$07 - 487 7B3C 18 clc - 488 7B3D 7D 4A 44 adc digtabyL,x - 489 7B40 9D 4A 44 sta digtabyL,x - 490 7B43 BD 52 44 lda digtabyH,x - 491 7B46 69 00 adc #$00 - 492 7B48 9D 52 44 sta digtabyH,x - 493 ;crashing bug here - if too much added to digtaby, it gets over screenheight and starts writing over random areas - 494 ;WARNING! fix for 1 byte screenheight. TODO - 495 7B4B BD 4A 44 lda digtabyL,x - 496 7B4E C9 C8 cmp #screenheight - 497 7B50 90 05 bcc @+ ; branch if less - 498 7B52 A9 C7 lda #screenheight-1 - 499 7B54 9D 4A 44 sta digtabyL,x - 500 7B57 4C 6F 7B @ jmp DigCalculateNext - 501 7B5A DigUp - 502 7B5A 29 07 and #$07 - 503 7B5C 85 72 sta temp - 504 7B5E 38 sec - 505 7B5F BD 4A 44 lda digtabyL,x - 506 7B62 E5 72 sbc temp - 507 7B64 9D 4A 44 sta digtabyL,x - 508 7B67 BD 52 44 lda digtabyH,x - 509 7B6A E9 00 sbc #$00 - 510 7B6C 9D 52 44 sta digtabyH,x - 511 7B6F DigCalculateNext - 512 7B6F CA dex - 513 7B70 10 97 bpl CalculateBranches - 514 ; here we draw... - 515 7B72 AE 38 44 ldx diggery - 516 7B75 DigDrawing - 517 7B75 BD 3A 44 lda digtabxL,x - 518 7B78 85 61 sta xdraw - 519 7B7A BD 42 44 lda digtabxH,x - 520 7B7D 85 62 sta xdraw+1 - 521 7B7F BD 4A 44 lda digtabyL,x - 522 7B82 85 63 sta ydraw - 523 7B84 BD 52 44 lda digtabyH,x - 524 7B87 85 64 sta ydraw+1 - 525 7B89 phx -Macro: PHX [Source: MACRO.ASM] - 1 7B89 8A txa - 2 7B8A 48 pha -Source: weapons.asm - 526 7B8B 20 A3 7B jsr DiggerCharacter - 527 7B8E plx -Macro: PLX [Source: MACRO.ASM] - 1 7B8E 68 pla - 2 7B8F AA tax -Source: weapons.asm - 528 7B90 CA dex - 529 7B91 10 E2 bpl DigDrawing - 530 7B93 CE 39 44 AD 39 44 dec:lda DigLong - 531 7B99 30 03 4C 06 7B jpl BranchNotFinished - 532 7B9E DoNotPutDig - 533 7B9E A9 15 85 9E mva #sfx_silencer sfx_effect - 534 7BA2 60 rts - 535 7BA3 DiggerCharacter - 536 7BA3 AD 1B D4 lda random - 537 7BA6 29 06 and #$06 - 538 7BA8 18 clc - 539 7BA9 69 04 adc #char_digger__________ - 540 7BAB 6D 5E 44 adc sandhogflag - 541 7BAE 85 69 sta CharCode - 542 7BB0 A5 62 C9 01 D0 04 + cpw xdraw #(screenwidth-6) - 543 7BBA B0 E2 bcs DoNotPutDig - 544 7BBC 4C E7 70 jmp TypeChar - 545 .endp - 546 ; ------------------------ - 547 7BBF .proc dirtclod - 548 7BBF A9 0C 85 B0 mva #12 ExplosionRadius - 549 7BC3 D0 0A bne xdirt - 550 .endp - 551 ; ------------------------ - 552 7BC5 .proc dirtball - 553 7BC5 A9 16 85 B0 mva #22 ExplosionRadius - 554 7BC9 D0 04 bne xdirt - 555 .endp - 556 ; ------------------------ - 557 7BCB .proc tonofdirt - 558 7BCB A9 1F 85 B0 mva #31 ExplosionRadius - 559 ; jmp xdirt - 560 .endp - 561 ; ----------------- - 562 7BCF .proc xdirt ; - 563 ; ----------------- - 564 7BCF 20 0C 8F jsr CalculateExplosionRange - 565 7BD2 A9 0A 85 9E mva #sfx_dirt_charge sfx_effect - 566 7BD6 A9 01 lda #1 - 567 7BD8 85 AB sta radius - 568 7BDA 85 A9 sta color - 569 7BDC dirtLoop - 570 7BDC 20 4A 68 jsr circle - 571 7BDF E6 63 D0 02 E6 64 inw ydraw - 572 7BE5 20 4A 68 jsr circle - 573 7BE8 A5 63 D0 02 C6 64 + .nowarn dew ydraw - 574 7BF0 E6 AB inc radius - 575 7BF2 A5 AB lda radius - 576 7BF4 C5 B0 cmp ExplosionRadius - 577 7BF6 D0 E4 bne dirtLoop - 578 7BF8 A9 15 85 9E mva #sfx_silencer sfx_effect - 579 7BFC 60 rts - 580 .endp - 581 ; ------------------------ - 582 7BFD .proc dirtcharge - 583 7BFD A9 3D 85 B0 mva #61 ExplosionRadius - 584 7C01 20 0C 8F jsr CalculateExplosionRange - 585 7C04 4C E1 7F jmp ofdirt - 586 .endp - 587 ; ------------------------ - 588 7C07 .proc riotcharge - 589 7C07 A9 11 85 9E mva #sfx_riot_blast sfx_effect - 590 7C0B A9 1F 85 B0 mva #31 ExplosionRadius - 591 7C0F D0 08 bne cleanDirt - 592 .endp - 593 ; ------------------------ - 594 7C11 .proc riotblast - 595 7C11 A9 11 85 9E mva #sfx_riot_blast sfx_effect - 596 7C15 A9 3D 85 B0 mva #61 ExplosionRadius - 597 ; jmp cleanDirt - 598 .endp - 599 ; ----------------- - 600 7C19 .proc cleanDirt - 601 ; ----------------- - 602 7C19 20 0C 8F jsr CalculateExplosionRange - 603 7C1C A9 00 85 A9 mva #0 color - 604 7C20 4C E9 7F jmp ofdirt.NoColor - 605 .endp - 606 ; ------------------------ - 607 7C23 .proc liquiddirt - 608 7C23 A9 1B 85 9E mva #sfx_liquid_dirt sfx_effect - 609 7C27 A9 FE 8D 5C 44 A9 + mwa #510 FillCounter - 610 ; ----- - 611 7C31 A5 61 8D 5A 44 A5 + mwa xdraw TempXfill - 612 7C3B RepeatFill - 613 7C3B AD 5A 44 85 61 AD + mwa TempXfill xdraw - 614 7C45 20 5A 7F jsr checkRollDirection - 615 ; HowMuchToFall - direction - 616 ; $FF - we are in a hole (flying in missile direction) - 617 ; 1 - right, 2 - left - 618 7C48 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 619 7C55 A0 00 ldy #0 - 620 7C57 B1 78 lda (tempXROLLER),y - 621 7C59 8D 37 44 sta HeightRol ; relative point - 622 - 623 7C5C RollinContinuesLiquid - 624 ; new point is set - 625 7C5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 626 7C69 A0 00 ldy #0 - 627 7C6B B1 78 lda (tempXROLLER),y - 628 7C6D 85 63 sta ydraw - 629 7C6F CD 37 44 cmp HeightRol - 630 7C72 F0 02 beq UpNotYet2 - 631 7C74 90 32 bcc FillNow - 632 7C76 UpNotYet2 - 633 7C76 38 sec ;clc - 634 7C77 8D 37 44 sta HeightRol - 635 7C7A E9 01 sbc #1 - 636 7C7C 85 63 sta ydraw - 637 7C7E A5 C5 lda HowMuchToFall - 638 7C80 C9 01 cmp #1 - 639 7C82 F0 12 beq HowMuchToFallRight3 - 640 7C84 A5 61 D0 02 C6 62 + .NOWARN dew xdraw - 641 7C8C A5 61 lda xdraw - 642 7C8E 25 62 and xdraw+1 - 643 7C90 C9 FF cmp #$ff ; like cpw xdraw #$ffff - 644 ;ora xdraw+1 ; like cpw xdraw #$0000 - 645 7C92 D0 C8 jne RollinContinuesLiquid - 646 7C94 F0 12 beq FillNow - 647 7C96 HowMuchToFallRight3 - 648 7C96 E6 61 D0 02 E6 62 inw xdraw - 649 7C9C A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 650 7CA6 D0 B4 jne RollinContinuesLiquid - 651 7CA8 FillNow - 652 ; finally one pixel more - 653 7CA8 A0 00 ldy #0 - 654 7CAA A5 C5 lda HowMuchToFall - 655 7CAC 30 18 bmi FillHole - 656 7CAE C9 01 cmp #1 - 657 7CB0 F0 0C beq FillLeft - 658 7CB2 E6 61 D0 02 E6 62 inw xdraw - 659 7CB8 E6 61 D0 02 E6 62 inw xdraw ; tricky but we must rollback xdraw in proper direction - 660 7CBE FillLeft - 661 7CBE A5 61 D0 02 C6 62 + .nowarn dew xdraw - 662 7CC6 FillHole - 663 7CC6 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 664 7CD3 B1 78 lda (tempXROLLER),y - 665 7CD5 85 63 sta ydraw - 666 7CD7 F0 0D beq ToHighFill ; if we filled all playfield (very rare but possible) - 667 7CD9 C6 63 dec ydraw ; one pixel up - 668 7CDB A5 63 lda ydraw - 669 7CDD 91 78 sta (tempXROLLER),y ;mountaintable update - 670 7CDF A9 01 85 A9 mva #1 color - 671 7CE3 20 2C 76 jsr plot.MakePlot - 672 7CE6 ToHighFill - 673 7CE6 AD 5C 44 D0 03 CE + .nowarn dew FillCounter - 674 7CF1 AD 5C 44 lda FillCounter - 675 7CF4 0D 5D 44 ora FillCounter+1 - 676 7CF7 F0 03 4C 3B 7C jne RepeatFill - 677 7CFC 60 rts - 678 .endp - 679 ; ------------------------ - 680 7CFD .proc laser - 681 ; in xdraw and ydraw we have hit point coordinates - 682 ; from Shoot/Flight procedures (invisible flight) - 683 ; ------------------------ - 684 7CFD A6 6C ldx TankNr - 685 7CFF BD C3 48 lda AngleTable,x - 686 7D02 A8 tay - 687 - 688 7D03 AD C9 48 85 65 AD + mwa EndOfTheBarrelX xbyte - 689 7D0D AD CB 48 85 67 mva EndOfTheBarrelY ybyte - 690 7D12 A9 00 85 68 mva #0 ybyte+1 - 691 7D16 8D 8B 44 sta LaserFlag ; turn on gravity and wind after shot :) - 692 - 693 7D19 A5 61 8D 16 45 A5 + mwa xdraw LaserCoordinate - 694 7D23 A5 63 8D 18 45 A5 + mwa ydraw LaserCoordinate+2 - 695 7D2D A5 65 8D 1A 45 A5 + mwa xbyte LaserCoordinate+4 - 696 7D37 A5 67 8D 1C 45 A5 + mwa ybyte LaserCoordinate+6 - 697 - 698 7D41 A9 02 85 9E mva #sfx_lightning sfx_effect - 699 - 700 7D45 A9 80 8D 73 43 mva #%10000000 drawFunction - 701 ;the above switches Draw to measuring length - 702 7D4A 20 12 66 jsr draw - 703 7D4D A9 00 8D 73 43 mva #0 drawFunction - 704 7D52 46 E2 lsr LineLength+1 ; LineLength / 8 - 705 7D54 66 E1 ror LineLength - 706 7D56 46 E1 lsr LineLength ; max line lenght is about 380 (9 bits) - 707 7D58 46 E1 lsr LineLength - 708 7D5A 38 sec - 709 7D5B A9 3C lda #60 - 710 7D5D E5 E1 sbc LineLength - 711 7D5F 85 8A sta yc ; laser blink counter 60-(LineLength/8) - 712 @ - 713 7D61 A5 8A lda yc - 714 7D63 29 01 and #$01 - 715 7D65 49 01 eor #$01 - 716 7D67 85 A9 sta color - 717 7D69 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw - 718 7D73 AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw - 719 7D7D AD 1A 45 85 65 AD + mwa LaserCoordinate+4 xbyte - 720 7D87 AD 1C 45 85 67 AD + mwa LaserCoordinate+6 ybyte - 721 7D91 A9 02 85 9E mva #sfx_lightning sfx_effect - 722 7D95 20 12 66 jsr draw - 723 - 724 7D98 C6 8A dec yc - 725 7D9A D0 C5 bne @- - 726 - 727 7D9C A9 01 85 A9 mva #1 color - 728 7DA0 AD 16 45 85 61 AD + mwa LaserCoordinate xdraw - 729 7DAA AD 18 45 85 63 AD + mwa LaserCoordinate+2 ydraw - 730 7DB4 A9 00 85 BF mva #0 HitFlag - 731 7DB8 20 84 8E jsr CheckCollisionWithTank - 732 7DBB A5 BF lda HitFlag - 733 7DBD F0 05 beq LaserMisses - 734 ; here we hit a tank (X) - 735 7DBF A0 64 ldy #100 - 736 7DC1 20 74 57 jsr DecreaseEnergyX - 737 7DC4 LaserMisses - 738 7DC4 60 rts - 739 .endp - 740 ; ----------------- - 741 7DC5 .proc xmissile ; - 742 ; ----------------- - 743 7DC5 20 0C 8F jsr CalculateExplosionRange - 744 7DC8 NoRangeCalc - 745 7DC8 A9 01 lda #1 - 746 7DCA 85 AB sta radius - 747 7DCC 85 A9 sta color - 748 7DCE ExplosionLoop - 749 7DCE 20 4A 68 jsr circle - 750 7DD1 E6 AB E6 AB :2 inc radius - 751 7DD5 A5 AB lda radius - 752 7DD7 C5 B0 cmp ExplosionRadius - 753 7DD9 90 F3 bcc ExplosionLoop - 754 - 755 7DDB A2 00 ldx #0 - 756 7DDD 86 A9 stx color - 757 7DDF E8 inx - 758 7DE0 86 AB stx radius - 759 7DE2 ExplosionLoop2 - 760 7DE2 20 4A 68 jsr circle - 761 7DE5 E6 AB inc radius - 762 7DE7 A5 AB lda radius - 763 7DE9 C5 B0 cmp ExplosionRadius - 764 7DEB 90 F5 bcc ExplosionLoop2 - 765 - 766 7DED A9 01 85 A9 mva #1 color - 767 - 768 ;check tanks' distance from the centre of the explosion - 769 - 770 7DF1 A9 80 8D 73 43 mva #%10000000 drawFunction - 771 ;the above switches Draw to measuring length - 772 ;trick is easy - how many pixels does it take to draw - 773 ;a line from one point to another - 774 ;it must be somehow easier than regular Pitagoras - 775 ;calculation - 776 - 777 7DF6 A6 AE ldx NumberOfPlayers - 778 7DF8 CA dex - 779 7DF9 DistanceCheckLoop - 780 7DF9 BD AF 43 lda eXistenZ,x - 781 7DFC D0 03 4C 81 7E jeq EndOfDistanceCheckLoop - 782 ;here the tank exist - 783 7E01 BD 0D 44 lda XtankstableL,x - 784 7E04 18 clc - 785 7E05 69 03 adc #3 ;measure from middle of the tank - 786 7E07 85 65 sta xbyte - 787 7E09 BD 13 44 lda XtankstableH,x - 788 7E0C 18 clc - 789 7E0D 69 00 adc #0 ;measure from middle of the tank - 790 7E0F 85 66 sta xbyte+1 - 791 7E11 BD 19 44 lda Ytankstable,x - 792 7E14 38 sec - 793 7E15 E9 02 sbc #2 ;measure from middle of the tank - 794 7E17 85 67 sta ybyte - 795 7E19 A9 00 lda #0 - 796 7E1B 85 68 sta ybyte+1 - 797 7E1D phx -Macro: PHX [Source: MACRO.ASM] - 1 7E1D 8A txa - 2 7E1E 48 pha -Source: weapons.asm - 798 7E1F 20 12 66 jsr draw - 799 7E22 plx -Macro: PLX [Source: MACRO.ASM] - 1 7E22 68 pla - 2 7E23 AA tax -Source: weapons.asm - 800 ;if tank within range of the explosion? - 801 7E24 A5 E2 lda LineLength+1 - 802 7E26 D0 59 bne TankIsNotWithinTheRange - 803 7E28 A5 E1 lda LineLength - 804 7E2A C5 B0 cmp ExplosionRadius - 805 7E2C B0 53 bcs TankIsNotWithinTheRange - 806 7E2E A5 B0 lda ExplosionRadius - 807 7E30 38 sec - 808 7E31 E5 E1 sbc LineLength - 809 ;multiply difference by 8 - 810 7E33 18 clc - 811 7E34 69 01 adc #1 - 812 7E36 0A 0A 0A :3 asl - 813 7E39 A8 tay - 814 ; check shields - 815 7E3A BD FD 43 lda ActiveDefenceWeapon,x - 816 7E3D C9 26 cmp #ind_Shield_________ ; one hit shield - 817 7E3F F0 25 beq UseShield - 818 7E41 C9 28 cmp #ind_Force_Shield___ ; shield with energy and parachute - 819 7E43 F0 12 beq UseShieldWithEnergy - 820 7E45 C9 27 cmp #ind_Heavy_Shield___ ; shield with energy - 821 7E47 F0 0E beq UseShieldWithEnergy - 822 7E49 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - 823 7E4B F0 0A beq UseShieldWithEnergy - 824 7E4D C9 25 cmp #ind_Mag_Deflector__ ; Mag deflector (it works only if hit ground next to tank. Tank hit is handled in Flight proc) - 825 7E4F F0 06 beq UseShieldWithEnergy - 826 7E51 20 74 57 jsr DecreaseEnergyX - 827 7E54 4C 81 7E jmp EndOfDistanceCheckLoop - 828 7E57 UseShieldWithEnergy - 829 7E57 20 B0 57 jsr DecreaseShieldEnergyX - 830 7E5A C0 00 cpy #0 ; is necessary to reduce tenk energy ? - 831 7E5C F0 03 beq ShieldCoveredTank - 832 7E5E 20 74 57 jsr DecreaseEnergyX - 833 7E61 ShieldCoveredTank - 834 7E61 BD A8 43 lda ShieldEnergy,x - 835 7E64 D0 1B jne EndOfDistanceCheckLoop - 836 7E66 ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) - 837 7E66 UseShield - 838 7E66 A9 01 85 AA mva #1 Erase - 839 7E6A A5 6C lda TankNr - 840 7E6C 48 pha ; store TankNr - 841 7E6D 86 6C stx TankNr ; store X in TankNr :) - 842 7E6F 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 843 7E72 A9 00 lda #0 - 844 7E74 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate defense weapons - 845 7E77 85 AA sta Erase - 846 7E79 20 2C 6A jsr DrawTankNr ; draw tank without shield - 847 7E7C A6 6C ldx TankNr ; restore X value :) - 848 7E7E 68 pla - 849 7E7F 85 6C sta TankNr ; restore TankNr value :) - 850 7E81 TankIsNotWithinTheRange - 851 7E81 EndOfDistanceCheckLoop - 852 7E81 CA dex - 853 7E82 30 03 4C F9 7D jpl DistanceCheckLoop - 854 7E87 A9 15 85 9E mva #sfx_silencer sfx_effect - 855 7E8B 60 rts - 856 .endp - 857 ; ----------------- - 858 7E8C .proc xriotbomb ; - 859 ; ----------------- - 860 7E8C A9 11 85 9E mva #sfx_riot_blast sfx_effect - 861 7E90 A9 00 lda #0 - 862 7E92 85 AB sta radius - 863 7E94 85 A9 sta color - 864 7E96 rbombLoop - 865 7E96 20 4A 68 jsr circle - 866 7E99 E6 AB inc radius - 867 7E9B A5 AB lda radius - 868 7E9D C5 B0 cmp ExplosionRadius - 869 7E9F D0 F5 bne rbombLoop - 870 7EA1 A9 01 85 A9 mva #1 color - 871 7EA5 60 rts - 872 .endp - 873 ; ---------------- - 874 7EA6 .proc xroller ; - 875 ; now collisions are detected with modified draw routine - 876 ; therefore YDRAW value must be taken from mountaintable - 877 7EA6 20 5A 7F jsr checkRollDirection - 878 ; HowMuchToFall - direction - 879 ; $FF - we are in a hole (flying in missile direction) - 880 ; 1 - right, 2 - left - 881 7EA9 Rollin - 882 7EA9 A9 0E 85 9E mva #sfx_shield_off sfx_effect - 883 7EAD 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 884 7EBA A0 00 ldy #0 - 885 7EBC B1 78 lda (tempXROLLER),y - 886 7EBE 8D 37 44 sta HeightRol ; relative point - 887 - 888 7EC1 RollinContinues - 889 7EC1 20 89 5A jsr WaitOneFrame - 890 7EC4 20 89 5A jsr WaitOneFrame - 891 ; new point is set - 892 7EC7 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 893 7ED4 A0 00 ldy #0 - 894 7ED6 B1 78 lda (tempXROLLER),y - 895 7ED8 85 63 sta ydraw - 896 7EDA 84 64 sty ydraw+1 - 897 7EDC F0 43 beq ExplodeNow - 898 7EDE CD 37 44 cmp HeightRol - 899 7EE1 F0 02 beq UpNotYet - 900 7EE3 90 3C bcc ExplodeNow - 901 7EE5 UpNotYet - 902 7EE5 38 sec ;clc - 903 7EE6 8D 37 44 sta HeightRol - 904 7EE9 E9 01 sbc #1 - 905 7EEB 85 63 sta ydraw - 906 ;check tank collision prior to PLOT - 907 7EED 84 BF sty HitFlag ; set to 0 - 908 - 909 7EEF 20 84 8E jsr CheckCollisionWithTank - 910 - 911 7EF2 A5 BF lda HitFlag - 912 7EF4 D0 2B bne ExplodeNow - 913 7EF6 20 71 75 jsr unPlot - 914 ; let's go the right direction - 915 7EF9 A5 C5 lda HowMuchToFall - 916 7EFB C9 01 cmp #1 - 917 7EFD F0 10 beq HowMuchToFallRight2 - 918 7EFF A5 61 D0 02 C6 62 + .nowarn dew xdraw - 919 7F07 A5 61 lda xdraw - 920 7F09 05 62 ora xdraw+1 - 921 7F0B D0 B4 jne RollinContinues ; like cpw xdraw #0 - 922 7F0D F0 12 beq ExplodeNow - 923 7F0F HowMuchToFallRight2 - 924 7F0F E6 61 D0 02 E6 62 inw xdraw - 925 7F15 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 926 7F1F D0 A0 jne RollinContinues - 927 7F21 ExplodeNow - 928 7F21 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store somewhere (BAD) - 929 7F29 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw (BAD) - 930 7F31 A9 00 85 61 85 62 mwa #0 xdraw - 931 7F37 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 932 7F3F 20 71 75 jsr unPlot - 933 7F42 A5 B3 85 61 A5 B4 + mwa xcircle xdraw ;(bad) - 934 7F4A A5 B5 85 63 A5 B6 + mwa ycircle ydraw ;(bad) - 935 - 936 ; finally a little explosion - 937 7F52 A9 05 85 9E mva #sfx_baby_missile sfx_effect - 938 7F56 4C C5 7D jmp xmissile - 939 7F59 60 rts - 940 .endp - 941 ; -------------------------------------------------- - 942 7F5A .proc checkRollDirection - 943 ; check rolling direction (for roller and other rolling weapons) - 944 ; xdraw (word) - X coordinate - 945 ; Y coordinate is taken from mountaintable and go to ydraw (word) - 946 ; shoot direction is taken from VX+3 - 947 ; result: - 948 ; HowMuchToFall - direction - 949 ; $FF - we are in a hole (flying in missile direction) - 950 ; 1 - right, 2 - left - 951 ; -------------------------------------------------- - 952 7F5A A0 00 ldy #0 - 953 7F5C 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 954 7F69 B1 78 lda (tempXROLLER),y - 955 7F6B 85 63 sta ydraw - 956 7F6D 84 64 sty ydraw+1 - 957 - 958 7F6F A5 BE lda vx+3 - 959 ; if horizontal velocity is negative then change the direction - 960 7F71 10 06 bpl PositiveVelocity - 961 7F73 A5 E6 lda goleft - 962 7F75 09 01 ora #$01 - 963 7F77 85 E6 sta goleft - 964 7F79 PositiveVelocity - 965 ; first we look for the left slope - 966 ; then righ slope and set the flag - 967 ; $FF - we are in a hole (flying in missile direction) - 968 ; 1 - right, 2 - left - 969 7F79 A9 FF 85 C5 mva #$ff HowMuchToFall - 970 7F7D A5 63 8D 37 44 mva ydraw HeightRol - 971 7F82 SeekLeft - 972 7F82 A5 79 C9 46 D0 04 + cpw tempXROLLER #mountaintable - 973 7F8C F0 13 beq GoRightNow ; "bounce" if we have on left end - 974 7F8E A5 78 D0 02 C6 79 + .nowarn dew tempXROLLER - 975 7F96 B1 78 lda (tempXROLLER),y ;fukk! beware of Y value - 976 7F98 CD 37 44 cmp HeightRol - 977 7F9B HowMuchToFallLeft - 978 7F9B B0 04 bcs GoRightNow - 979 7F9D A9 01 85 C5 mva #1 HowMuchToFall - 980 7FA1 GoRightNow - 981 7FA1 18 A5 61 69 3E 85 + adw xdraw #mountaintable tempXROLLER - 982 7FAE SeekRight - 983 7FAE A5 79 C9 47 D0 04 + cpw tempXROLLER #(mountaintable+screenwidth) - 984 7FB8 F0 1B beq HowMuchToFallKnown ; "stop" if we have on left end - 985 7FBA E6 78 D0 02 E6 79 inw tempXROLLER - 986 7FC0 B1 78 lda (tempXROLLER),y - 987 7FC2 CD 37 44 cmp HeightRol - 988 7FC5 HowMuchToFallRight - 989 7FC5 B0 0E bcs HowMuchToFallKnown - 990 7FC7 A5 C5 lda HowMuchToFall - 991 7FC9 10 06 bpl ItIsLeftAlready - 992 7FCB A9 02 85 C5 mva #2 HowMuchToFall - 993 7FCF D0 04 bne HowMuchToFallKnown - 994 7FD1 ItIsLeftAlready - 995 7FD1 A9 FF 85 C5 mva #$ff HowMuchToFall - 996 7FD5 HowMuchToFallKnown - 997 7FD5 A5 C5 lda HowMuchToFall - 998 7FD7 10 07 bpl DirectionChecked - 999 7FD9 A9 01 lda #1 - 1000 7FDB 18 clc - 1001 7FDC 65 E6 adc goleft - 1002 7FDE 85 C5 sta HowMuchToFall - 1003 7FE0 DirectionChecked - 1004 7FE0 60 rts - 1005 .endp - 1006 - 1007 ; -------------------------------------------------- - 1008 7FE1 .proc ofdirt ; - 1009 ; -------------------------------------------------- - 1010 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height - 1011 7FE1 A9 13 85 9E mva #sfx_dirt_chrg_s sfx_effect - 1012 - 1013 7FE5 A9 01 85 A9 mva #1 color - 1014 7FE9 NoColor ; jump here with color=0 to clean dirt - 1015 7FE9 A5 61 85 B3 A5 62 + mwa xdraw xcircle - 1016 7FF1 A5 63 85 B5 A5 64 + mwa ydraw ycircle - 1017 7FF9 A9 01 lda #1 - 1018 ; current dirt width - 1019 7FFB 85 C6 sta magic - 1020 7FFD NextRow - 1021 7FFD 20 89 5A jsr WaitOneFrame - 1022 8000 A4 C6 ldy magic - 1023 8002 NextLine - 1024 8002 AD 1B D4 lda random - 1025 8005 29 01 and #$01 - 1026 8007 F0 07 beq DoNotPlot - 1027 8009 84 C7 sty magic+1 - 1028 800B 20 14 76 jsr plot - 1029 800E A4 C7 ldy magic+1 - 1030 8010 DoNotPlot - 1031 8010 E6 61 D0 02 E6 62 inw xdraw - 1032 8016 88 dey - 1033 8017 D0 E9 bne NextLine - 1034 8019 C6 63 dec ydraw ; 1 line up - 1035 801B A5 63 lda ydraw - 1036 801D C9 FF cmp #$ff - 1037 801F F0 1B beq EndOfTheDirt ;if horizontal Counter wraps - 1038 8021 E6 C6 inc magic ; width+2 - 1039 8023 E6 C6 inc magic - 1040 8025 A5 C6 lda magic - 1041 8027 85 C7 sta magic+1 ; just for a second - 1042 8029 46 C7 lsr magic+1 - 1043 802B 38 sec - 1044 802C A5 B3 lda xcircle - 1045 802E E5 C7 sbc magic+1 - 1046 8030 85 61 sta xdraw - 1047 8032 A5 B4 lda xcircle+1 - 1048 8034 E9 00 sbc #0 - 1049 8036 85 62 sta xdraw+1 ; new starting coordinate in a given row - 1050 8038 C6 B0 dec ExplosionRadius - 1051 803A D0 C1 bne NextRow - 1052 803C EndOfTheDirt - 1053 803C A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 1054 8044 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 1055 804C 60 rts - 1056 .endp - 1057 ;-------------------------------------------------- - 1058 804D .proc BeforeFire ;TankNr (byte) - 1059 ;-------------------------------------------------- - 1060 ;this nice routine makes the whole shooting - 1061 ;preparation: aiming and displaying - 1062 ;angle and shooting force values - 1063 ; - 1064 - 1065 ;first, get current parameters (angle+force) - 1066 ;for an active tank and display them - 1067 ;(these values are taken from the previous round) - 1068 - 1069 804D A6 6C ldx TankNr - 1070 - 1071 ;Checking the maximal force - 1072 804F BD EB 43 lda MaxForceTableH,x - 1073 8052 DD DF 43 cmp ForceTableH,x - 1074 8055 D0 06 bne ContinueToCheckMaxForce2 - 1075 8057 BD E5 43 lda MaxForceTableL,x - 1076 805A DD D9 43 cmp ForceTableL,x - 1077 805D ContinueToCheckMaxForce2 - 1078 805D B0 0C bcs @+ - 1079 805F BD EB 43 lda MaxForceTableH,x - 1080 8062 9D DF 43 sta ForceTableH,x - 1081 8065 BD E5 43 lda MaxForceTableL,x - 1082 8068 9D D9 43 sta ForceTableL,x - 1083 @ - 1084 806B A9 00 85 AA mva #0 Erase - 1085 806F 20 0F 66 jsr PutTankNameOnScreen - 1086 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 1087 - 1088 8072 20 2C 6A jsr DrawTankNr - 1089 - 1090 8075 20 89 5A jsr WaitOneFrame ; best after drawing a tank - 1091 - 1092 8078 24 97 bit TestFlightFlag - 1093 807A 10 03 bpl @+ - 1094 807C 20 23 83 jsr Shoot.AfterOffensiveText ; Lazy Darwin - aiming visualisation - 1095 @ - 1096 ;keyboard reading - 1097 ; KBCODE keeps code of last keybi - 1098 ; SKSTAT $ff - nothing pressed - 1099 ; $FB - any key - 1100 ; $f7 - shift - 1101 ; $f3 - shift+key - 1102 - 1103 807F notpressed - 1104 807F A6 6C ldx TankNr ; for optimize - 1105 ; Select and Option - 1106 8081 A5 02 lda CONSOL - 1107 8083 A8 tay - 1108 8084 29 05 and #%00000101 ; Start + Option - 1109 8086 F0 2C beq QuitToGameover - 1110 8088 98 tya - 1111 8089 29 04 and #%00000100 - 1112 808B F0 3C beq callActivation ; Option key - 1113 808D 98 tya - 1114 808E 29 02 and #%00000010 - 1115 8090 D0 03 4C A0 82 jeq pressedTAB ; Select key - 1116 8095 A5 02 lda SKSTAT - 1117 8097 C9 FF cmp #$ff - 1118 8099 D0 03 4C 52 81 jeq checkJoy - 1119 809E C9 F7 cmp #$f7 ; SHIFT - 1120 80A0 D0 03 4C 52 81 jeq checkJoy - 1121 - 1122 80A5 A5 02 lda kbcode - 1123 80A7 29 BF and #%10111111 ; SHIFT elimination - 1124 - 1125 80A9 C9 08 cmp #@kbcode._O ; $08 ; O - 1126 80AB D0 0C bne @+ - 1127 80AD 20 AE 73 jsr AreYouSure - 1128 80B0 24 D7 bit escFlag - 1129 80B2 10 CB bpl notpressed - 1130 ;---O pressed-quit game to game over screen--- - 1131 80B4 QuitToGameover - 1132 80B4 A9 40 85 D7 mva #$40 escFlag - 1133 80B8 60 rts - 1134 @ - 1135 80B9 C9 1C cmp #@kbcode._esc ; 28 ; ESC - 1136 80BB D0 08 bne @+ - 1137 80BD 20 AE 73 jsr AreYouSure - 1138 80C0 24 D7 bit escFlag - 1139 80C2 10 BB bpl notpressed - 1140 ;---esc pressed-quit game--- - 1141 80C4 60 rts - 1142 @ - 1143 80C5 C9 3F cmp #@kbcode._A ; $3f ; A - 1144 80C7 D0 09 bne @+ - 1145 80C9 callActivation - 1146 ; Hide all tanks - after inventory they may have other shapes - 1147 80C9 20 0B 6A jsr ClearTanks - 1148 80CC 20 AC 63 jsr DefensivesActivate - 1149 80CF 4C E0 80 jmp afterInventory - 1150 - 1151 @ - 1152 80D2 C9 0D cmp #@kbcode._I ; $0d ; I - 1153 80D4 D0 2D bne @+ - 1154 80D6 callInventory - 1155 ; Hide all tanks - after inventory they may have other shapes - 1156 80D6 20 0B 6A jsr ClearTanks - 1157 ; - 1158 80D9 A9 FF 85 E4 mva #$ff isInventory - 1159 80DD 20 C0 63 jsr Purchase - 1160 80E0 afterInventory - 1161 80E0 20 89 5A jsr MakeDarkScreen - 1162 80E3 20 0F 66 jsr DisplayStatus - 1163 80E6 20 E4 76 jsr SetMainScreen - 1164 80E9 20 12 6A jsr DrawTanks - 1165 ;jsr WaitOneFrame ; not necessary - 1166 80EC 24 5E bit LazyFlag - 1167 80EE 50 03 bvc NoLazy - 1168 80F0 20 4A 8B jsr LazyBoys - 1169 80F3 NoLazy - 1170 80F3 24 5F bit SpyHardFlag - 1171 80F5 10 03 bpl NoSpyHard - 1172 80F7 20 FC 8A jsr SpyHard - 1173 80FA NoSpyHard - 1174 80FA RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 80FA A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: weapons.asm - 1175 80FC A9 00 85 D7 mva #0 escFlag - 1176 8100 4C F3 82 jmp ReleaseAndLoop - 1177 @ - 1178 8103 C9 8E cmp #$80|@kbcode._up - 1179 8105 D0 03 4C AD 81 jeq CTRLPressedUp - 1180 810A C9 8F cmp #$80|@kbcode._down - 1181 810C D0 03 4C E8 81 jeq CTRLPressedDown - 1182 8111 C9 AC cmp #$80|@kbcode._tab - 1183 8113 D0 03 4C BF 82 jeq CTRLPressedTAB - 1184 - 1185 8118 jumpFromStick - 1186 .IF TARGET = 800 - 1187 cmp #$80|17 ; Ctrl+Help - 1188 bne NoVdebugSwitch - 1189 lda Vdebug - 1190 eor #$ff - 1191 sta Vdebug - 1192 jmp ReleaseAndLoop - 1193 NoVdebugSwitch - 1194 .ENDIF - 1195 8118 29 3F and #$3f ;CTRL and SHIFT ellimination - 1196 811A C9 0E cmp #@kbcode._up ; $e - 1197 811C F0 55 jeq pressedUp - 1198 811E C9 0F cmp #@kbcode._down ; $f - 1199 8120 D0 03 4C BE 81 jeq pressedDown - 1200 8125 C9 06 cmp #@kbcode._left ; $6 - 1201 8127 D0 03 4C 51 82 jeq pressedLeft - 1202 812C C9 07 cmp #@kbcode._right ; $7 - 1203 812E D0 03 4C 02 82 jeq pressedRight - 1204 8133 C9 21 cmp #@kbcode._space ; $21 - 1205 8135 D0 03 4C F9 82 jeq pressedSpace - 1206 813A C9 2C cmp #@kbcode._tab ; $2c - 1207 813C D0 03 4C A0 82 jeq pressedTAB - 1208 8141 C9 25 cmp #@kbcode._M ; $25 ; M - 1209 8143 D0 03 4C DE 82 jeq pressedM - 1210 8148 C9 3E cmp #@kbcode._S ; $3e ; S - 1211 814A D0 03 4C EB 82 jeq pressedS - 1212 .IF TARGET = 800 - 1213 cmp #61 ; G - 1214 bne EndKeys - 1215 jsr SelectNextGradient.NotWind - 1216 jmp ReleaseAndLoop - 1217 .ENDIF - 1218 814F EndKeys - 1219 814F 4C 7F 80 jmp notpressed - 1220 8152 checkJoy - 1221 ;------------JOY------------- - 1222 ;happy happy joy joy - 1223 ;check for joystick now - 1224 8152 A5 02 lda STICK0 - 1225 8154 29 0F and #$0f - 1226 8156 C9 0F cmp #$0f - 1227 8158 F0 0B beq notpressedJoy - 1228 815A A8 tay - 1229 815B A9 00 85 02 mva #0 ATRACT ; reset atract mode - 1230 815F B9 5A 60 lda joyToKeyTable,y - 1231 8162 4C 18 81 jmp jumpFromStick - 1232 8165 notpressedJoy - 1233 ;fire - 1234 8165 A5 02 lda STRIG0 - 1235 8167 D0 03 4C F9 82 jeq pressedSpace - 1236 816C A9 FF 85 9B mva #$ff pressTimer ; stop counting frames - 1237 8170 4C 7F 80 jmp notpressed - 1238 - 1239 ; - 1240 8173 pressedUp - 1241 8173 A5 9B lda pressTimer - 1242 8175 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1243 817B C9 19 cmp #25 ; 1/2s - 1244 817D B0 2E bcs CTRLPressedUp - 1245 - 1246 - 1247 ;force increaseeee! - 1248 ;ldx TankNr ; optimized - 1249 817F FE D9 43 inc ForceTableL,x - 1250 8182 D0 03 bne CheckingMaxForce - 1251 8184 FE DF 43 inc ForceTableH,x - 1252 - 1253 8187 CheckingMaxForce - 1254 - 1255 8187 A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1256 - 1257 818B BD EB 43 lda MaxForceTableH,x - 1258 818E DD DF 43 cmp ForceTableH,x - 1259 8191 D0 06 bne FurtherCheckMaxForce - 1260 8193 BD E5 43 lda MaxForceTableL,x - 1261 8196 DD D9 43 cmp ForceTableL,x - 1262 8199 FurtherCheckMaxForce - 1263 8199 90 03 4C 4D 80 jcs BeforeFire - 1264 - 1265 819E BD EB 43 lda MaxForceTableH,x - 1266 81A1 9D DF 43 sta ForceTableH,x - 1267 81A4 BD E5 43 lda MaxForceTableL,x - 1268 81A7 9D D9 43 sta ForceTableL,x - 1269 - 1270 81AA 4C 4D 80 jmp BeforeFire - 1271 - 1272 81AD CTRLPressedUp - 1273 ;ldx TankNr ; optimized - 1274 81AD BD D9 43 lda ForceTableL,x - 1275 81B0 18 clc - 1276 81B1 69 0A adc #10 - 1277 81B3 9D D9 43 sta ForceTableL,x - 1278 81B6 90 CF bcc CheckingMaxForce - 1279 81B8 FE DF 43 inc ForceTableH,x - 1280 81BB 4C 87 81 jmp CheckingMaxForce - 1281 - 1282 - 1283 81BE pressedDown - 1284 81BE A5 9B lda pressTimer - 1285 81C0 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1286 81C6 C9 19 cmp #25 ; 1/2s - 1287 81C8 B0 1E bcs CTRLPressedDown - 1288 - 1289 81CA A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1290 - 1291 ;ldx TankNr ; optimized - 1292 81CE DE D9 43 dec ForceTableL,x - 1293 81D1 BD D9 43 lda ForceTableL,x - 1294 81D4 C9 FF cmp #$ff - 1295 81D6 D0 0D bne @+ - 1296 81D8 DE DF 43 dec ForceTableH,x - 1297 81DB 10 08 bpl @+ - 1298 81DD ForceGoesZero - 1299 81DD A9 00 lda #0 - 1300 81DF 9D DF 43 sta ForceTableH,x - 1301 81E2 9D D9 43 sta ForceTableL,x - 1302 @ - 1303 81E5 4C 4D 80 jmp BeforeFire - 1304 - 1305 81E8 CTRLPressedDown - 1306 81E8 A9 00 85 9E mva #sfx_set_power_1 sfx_effect - 1307 - 1308 ;ldx TankNr ; optimized - 1309 81EC 38 sec - 1310 81ED BD D9 43 lda ForceTableL,x - 1311 81F0 E9 0A sbc #10 - 1312 81F2 9D D9 43 sta ForceTableL,x - 1313 81F5 90 03 4C 4D 80 jcs BeforeFire - 1314 81FA DE DF 43 dec ForceTableH,x - 1315 81FD 30 DE bmi ForceGoesZero - 1316 81FF 4C 4D 80 jmp BeforeFire - 1317 - 1318 8202 pressedRight - 1319 ;ldx TankNr ; optimized - 1320 8202 A5 9B lda pressTimer - 1321 8204 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1322 820A C9 19 cmp #25 ; 1/2s - 1323 820C B0 20 bcs CTRLPressedRight - 1324 - 1325 820E A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1326 8212 A9 01 85 AA mva #1 Erase - 1327 8216 20 48 6B jsr DrawTankNr.BarrelChange - 1328 8219 DE C3 48 BD C3 48 dec:lda AngleTable,x - 1329 821F C9 FF cmp #255 ; -1 - 1330 8221 F0 03 4C 4D 80 jne BeforeFire - 1331 8226 A9 B4 lda #180 - 1332 8228 9D C3 48 sta AngleTable,x - 1333 822B 4C 4D 80 jmp BeforeFire - 1334 - 1335 822E CTRLPressedRight - 1336 ;ldx TankNr ; optimized - 1337 822E A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1338 8232 A9 01 85 AA mva #1 Erase - 1339 8236 20 48 6B jsr DrawTankNr.BarrelChange - 1340 8239 BD C3 48 lda AngleTable,x - 1341 823C 38 sec - 1342 823D E9 04 sbc #4 - 1343 823F 9D C3 48 sta AngleTable,x - 1344 8242 C9 04 cmp #4 ; smallest angle for speed rotating - 1345 8244 90 03 4C 4D 80 jcs BeforeFire - 1346 8249 A9 B4 lda #180 - 1347 824B 9D C3 48 sta AngleTable,x - 1348 824E 4C 4D 80 jmp BeforeFire - 1349 - 1350 - 1351 8251 pressedLeft - 1352 ;ldx TankNr ; optimized - 1353 8251 A5 9B lda pressTimer - 1354 8253 10 04 A9 00 85 9B spl:mva #0 pressTimer ; if >128 then reset to 0 - 1355 8259 C9 19 cmp #25 ; 1/2s - 1356 825B B0 20 bcs CTRLPressedLeft - 1357 - 1358 825D A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1359 8261 A9 01 85 AA mva #1 Erase - 1360 8265 20 48 6B jsr DrawTankNr.BarrelChange - 1361 8268 FE C3 48 INC AngleTable,x - 1362 826B BD C3 48 lda AngleTable,x - 1363 826E C9 B4 cmp #180 - 1364 8270 B0 03 4C 4D 80 jcc BeforeFire - 1365 8275 A9 00 lda #0 - 1366 8277 9D C3 48 sta AngleTable,x - 1367 827A 4C 4D 80 jmp BeforeFire - 1368 - 1369 827D CTRLPressedLeft - 1370 ;ldx TankNr ; optimized - 1371 827D A9 01 85 9E mva #sfx_set_power_2 sfx_effect - 1372 8281 A9 01 85 AA mva #1 Erase - 1373 8285 20 48 6B jsr DrawTankNr.BarrelChange - 1374 8288 BD C3 48 lda AngleTable,x - 1375 828B 18 clc - 1376 828C 69 04 adc #4 - 1377 828E 9D C3 48 sta AngleTable,x - 1378 8291 C9 B0 cmp #180-4 - 1379 8293 B0 03 4C 4D 80 jcc BeforeFire - 1380 8298 A9 00 lda #0 - 1381 829A 9D C3 48 sta AngleTable,x - 1382 829D 4C 4D 80 jmp BeforeFire - 1383 - 1384 82A0 pressedTAB - 1385 82A0 A9 17 85 9E mva #sfx_purchase sfx_effect - 1386 ;ldx TankNr ; optimized - 1387 82A4 BD F7 43 lda ActiveWeapon,x - 1388 82A7 C9 1F cmp #last_offensive_____ ; the last possible offensive weapon - 1389 82A9 D0 07 bne ?notlasttofirst - 1390 82AB A9 00 lda #first_offensive____ ; #0 - 1391 82AD 9D F7 43 sta ActiveWeapon,x - 1392 82B0 F0 03 beq @+ ; allways = 0 - 1393 82B2 ?notlasttofirst - 1394 82B2 FE F7 43 inc ActiveWeapon,x - 1395 @ - 1396 82B5 BD F7 43 lda ActiveWeapon,x - 1397 82B8 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... - 1398 82BB F0 E3 beq pressedTAB - 1399 82BD D0 34 bne ReleaseAndLoop - 1400 - 1401 82BF CTRLpressedTAB - 1402 82BF A9 17 85 9E mva #sfx_purchase sfx_effect - 1403 ;ldx TankNr ; optimized - 1404 82C3 BD F7 43 lda ActiveWeapon,x - 1405 82C6 C9 00 cmp #first_offensive____ ; #0 - 1406 82C8 D0 07 bne ?notfirsttolast - 1407 82CA A9 1F lda #last_offensive_____ ; the last possible offensive weapon - 1408 82CC 9D F7 43 sta ActiveWeapon,x - 1409 82CF D0 03 bne @+ ; allways <> 0 - 1410 82D1 ?notfirsttolast - 1411 82D1 DE F7 43 dec ActiveWeapon,x - 1412 @ - 1413 82D4 BD F7 43 lda ActiveWeapon,x - 1414 82D7 20 B3 8F jsr HowManyBullets ; and we have qty of owned shells. Ufff.... - 1415 82DA F0 E3 beq CTRLpressedTAB - 1416 82DC D0 15 bne ReleaseAndLoop - 1417 - 1418 82DE pressedM - 1419 ; have you tried turning the music off and on again? - 1420 82DE A9 FF lda #$ff - 1421 82E0 4D 00 41 8D 00 41 eor:sta noMusic - 1422 82E6 RmtSong song_ingame -Macro: RMTSONG [Source: scorchC64.asm] - 1 82E6 A9 06 lda #SONG_INGAME ; do nothing in C64 -Source: weapons.asm - 1423 82E8 4C F3 82 jmp ReleaseAndLoop - 1424 - 1425 82EB pressedS - 1426 ; have you tried turning sfx off and on again? - 1427 82EB A9 FF lda #$ff - 1428 82ED 4D 01 41 8D 01 41 eor:sta noSfx - 1429 82F3 ReleaseAndLoop - 1430 82F3 20 71 5A jsr WaitForKeyRelease - 1431 82F6 4C 4D 80 jmp BeforeFire - 1432 - 1433 82F9 pressedSpace - 1434 ;================================= - 1435 ;we shoot here!!! - 1436 82F9 A9 00 lda #0 - 1437 82FB 85 02 sta ATRACT ; reset atract mode - 1438 82FD 85 9B sta pressTimer ; reset - 1439 82FF 20 71 5A jsr WaitForKeyRelease.StillWait - 1440 8302 A5 9B lda pressTimer - 1441 8304 C9 19 cmp #25 ; 1/2s - 1442 8306 90 03 bcc fire - 1443 8308 4C D6 80 jmp callInventory - 1444 830B fire - 1445 830B 60 RTS - 1446 .endp - 1447 - 1448 ;-------------------------------------------------- - 1449 830C .proc Shoot ;TankNr (byte) - 1450 ;-------------------------------------------------- - 1451 ;it looks like this routine is too big - - 1452 ;- more and more functions were being added... - 1453 ;good idea would be to rewrite it completely - 1454 ;with much more separate blocks, but you know - - 1455 ;- do not touch it if it works... - 1456 - 1457 830C A9 00 85 97 mva #0 TestFlightFlag - 1458 - 1459 ;the latest addition to this routine is - 1460 ;displaying offensive texts! - 1461 - 1462 8310 RandomizeOffensiveText - 1463 8310 AD 1B D4 lda random - 1464 8313 C9 36 cmp #talk.NumberOfOffensiveTexts - 1465 8315 B0 F9 bcs RandomizeOffensiveText - 1466 - 1467 8317 8D C0 48 sta TextNumberOff - 1468 831A A4 6C ldy TankNr - 1469 831C A9 FF 85 DB mva #$ff plot4x4color - 1470 8320 20 88 72 jsr DisplayOffensiveTextNr - 1471 - 1472 8323 AfterOffensiveText - 1473 8323 A9 00 8D 8B 44 mva #0 LaserFlag ; $ff - Laser - 1474 8328 A6 6C ldx TankNr - 1475 832A BD F7 43 lda ActiveWeapon,x - 1476 832D C9 1F cmp #ind_Laser__________ ; laser - 1477 832F D0 15 bne NotStrongShoot - 1478 ; Laser: (not)very strong - invisible - shot for laser beam end coordinates - 1479 8331 24 60 bit Vdebug - 1480 8333 30 04 bmi @+ - 1481 8335 A9 00 85 A9 mva #0 color - 1482 8339 A9 01 @ lda #1 - 1483 833B 85 A4 sta Force - 1484 833D 85 A5 sta Force+1 - 1485 833F A9 FF 8D 8B 44 mva #$ff LaserFlag ; $ff - Laser - 1486 8344 D0 0B bne AfterStrongShoot - 1487 8346 NotStrongShoot - 1488 8346 20 96 59 jsr Table2Force - 1489 8349 24 97 bit TestFlightFlag - 1490 834B 30 04 bmi AfterStrongShoot - 1491 834D A9 19 85 9E mva #sfx_shoot sfx_effect - 1492 8351 AfterStrongShoot - 1493 8351 BD C3 48 lda AngleTable,x - 1494 8354 85 A7 sta Angle - 1495 - 1496 ; Shoots tank nr X !!! :) - 1497 ; set the starting coordinates of bullet with correction - 1498 ; to start where the tank's barrel ends - 1499 ; (without it bullet would go from the left lower corner of the tank) - 1500 ;ldx TankNr - 1501 - 1502 8356 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 - 1503 8360 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 - 1504 8365 A9 00 lda #0 - 1505 8367 85 A6 sta Force+2 - 1506 8369 85 CD sta ytraj+2 - 1507 836B 85 C8 sta xtraj - 1508 836D 85 CB sta ytraj - 1509 - 1510 ; checking if the shot is underground (no Flight but Hit :) ) - 1511 836F A8 tay ; A=0 ! - 1512 8370 18 A5 C9 69 3E 85 + adw xtraj+1 #mountaintable temp - 1513 837D A5 CC lda ytraj+1 - 1514 837F D1 72 cmp (temp),y ; check collision with mountains - 1515 8381 B0 08 bcs ShotUnderGround - 1516 8383 20 A0 83 jsr Flight - 1517 8386 A9 01 85 A9 mva #1 color - 1518 838A 60 rts - 1519 838B ShotUnderGround - 1520 838B A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw ; but why not XHit and YHit !!!??? - 1521 8393 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 1522 839B A9 FF 85 BF mva #$ff HitFlag - 1523 839F 60 rts - 1524 .endp - 1525 - 1526 ;-------------------------------------------------- - 1527 83A0 .proc Flight ; Force(byte.byte), Wind(0.word) - 1528 ; Angle(byte) 128=0, 255=maxright, 0=maxleft - 1529 ; if 7bit and 6bit of TestFlightFlag is set no real flight - hit test only (for AI) - 1530 ; 7bit - fast, test flight - 1531 ; 6bit - invisible bullet - 1532 ;-------------------------------------------------- - 1533 ;g=-0.1 - 1534 ;vx=Force*cos(Angle) - 1535 ;vy=Force*sin(Angle) - 1536 ; - 1537 ;:begin - 1538 ;ytraj=ytray-vy - 1539 ;vy=vy-g - 1540 ;xtraj=xtraj+vx - without Wind - 1541 ;vx=vx+Wind (Wind is a small fraction) - 1542 ;plot xtraj,ytraj - there is clearing in plot - 1543 ;goto begin- - 1544 - 1545 - 1546 ; smoke tracer :) - 1547 83A0 A0 00 ldy #0 - 1548 83A2 24 97 bit TestFlightFlag ; if test flight for AI or Lazy Darwin - 1549 83A4 30 0A bmi noSmokeTracer ; no Smoke Tracer display - 1550 83A6 A6 6C ldx TankNr - 1551 83A8 BD F7 43 lda ActiveWeapon,x - 1552 83AB C9 0B cmp #ind_Smoke_Tracer___ ; Smoke tracer - 1553 83AD D0 01 bne noSmokeTracer - 1554 83AF C8 iny - 1555 83B0 noSmokeTracer - 1556 83B0 8C 8A 44 sty SmokeTracerFlag - 1557 - 1558 83B3 RepeatIfSmokeTracer - 1559 83B3 RepeatFlight - 1560 83B3 A5 CC 8D 92 44 A5 + mwa ytraj+1 Ytrajold+1 - 1561 83BD A5 C9 8D 8F 44 A5 + mwa xtraj+1 Xtrajold+1 - 1562 83C7 A9 40 8D 73 43 mva #%01000000 drawFunction - 1563 - 1564 83CC A9 00 lda #0 - 1565 83CE 85 BB sta vx - 1566 83D0 85 BC sta vx+1 - 1567 83D2 85 BD sta vx+2 - 1568 83D4 85 BF sta HitFlag - 1569 83D6 85 61 sta xdraw - 1570 83D8 85 62 sta xdraw+1 - 1571 83DA 85 63 sta ydraw - 1572 83DC 85 64 sta ydraw+1 - 1573 - 1574 ;vx calculation - 1575 ;vx = sin(90-Angle) for Angle <=90 - 1576 ;vx = -sin(Angle-90) for 90 < Angle <= 180 - 1577 83DE aslw Force ;Force = Force * 2 -Macro: ASLW [Source: MACRO.ASM] - 1 83DE 06 A4 ASL FORCE - 2 83E0 26 A5 ROL FORCE+1 -Source: weapons.asm - 1578 - 1579 ;cos(Angle) (but we use sin table only so some shenanigans happen) - 1580 83E2 A6 A7 ldx Angle - 1581 83E4 8E 15 45 stx LeapFrogAngle ; we will need it later - 1582 - 1583 ;Angle works like this: - 1584 ;0 'degrees' is horizontally right - 1585 ;90 'degrees' is straight up - 1586 ;180 horizontally left - 1587 - 1588 ; (we have to set goleft used in rolling weapons) - 1589 - 1590 83E7 E0 5B cpx #91 - 1591 83E9 90 0C bcc angleUnder90 - 1592 - 1593 ;over 90 - 1594 83EB A9 01 85 E6 mva #1 goleft - 1595 83EF 38 sec - 1596 83F0 8A txa ; lda # Angle - 1597 83F1 E9 5A sbc #90 - 1598 83F3 AA tax - 1599 83F4 4C 01 84 jmp @+ - 1600 - 1601 83F7 angleUnder90 - 1602 83F7 A9 00 85 E6 mva #0 goleft - 1603 83FB 38 sec ; X = 90-Angle - 1604 83FC A9 5A lda #90 - 1605 83FE E5 A7 sbc Angle - 1606 8400 AA tax - 1607 @ - 1608 8401 BD C1 5B lda sintable,x ; cos(X) - 1609 8404 8D 94 44 sta Multiplee ; *Force - 1610 8407 A5 A4 85 DC A5 A5 + mwa Force Multiplier - 1611 840F A9 00 lda #$0 - 1612 8411 85 DE sta Multiplier+2 - 1613 8413 A2 08 ldx #8 - 1614 8415 MultiplyLoop - 1615 8415 6E 94 44 ror Multiplee - 1616 8418 90 13 bcc DoNotAdd - 1617 841A 18 clc - 1618 841B A5 DC lda Multiplier - 1619 841D 65 BB adc vx - 1620 841F 85 BB sta vx - 1621 8421 A5 DD lda Multiplier+1 - 1622 8423 65 BC adc vx+1 - 1623 8425 85 BC sta vx+1 - 1624 8427 A5 DE lda Multiplier+2 - 1625 8429 65 BD adc vx+2 - 1626 842B 85 BD sta vx+2 - 1627 842D DoNotAdd - 1628 ;clc ;carry always cleared here (anyway we hope so :) - 1629 842D 26 DC rol Multiplier - 1630 842F 26 DD rol Multiplier+1 - 1631 8431 26 DE rol Multiplier+2 - 1632 8433 CA dex - 1633 8434 D0 DF bne MultiplyLoop - 1634 - 1635 8436 A9 00 85 BE mva #0 vx+3 - 1636 ; here in vx there is a number - 1637 ; xxxx.xx00 = sin(Angle)*Force - 1638 ; negate it if going left - 1639 843A A5 E6 lda goleft - 1640 843C F0 18 beq @+ - 1641 .rept 4 - 1642 LDA #$00 - 1643 SBC VX+# - 1644 STA VX+# - 1645 .endr -Source: REPT - 1642 843E A9 00 LDA #$00 - 1642 8440 E5 BB SBC VX+# - 1642 8442 85 BB STA VX+# - 1642 8444 A9 00 LDA #$00 - 1642 8446 E5 BC SBC VX+# - 1642 8448 85 BC STA VX+# - 1642 844A A9 00 LDA #$00 - 1642 844C E5 BD SBC VX+# - 1642 844E 85 BD STA VX+# - 1642 8450 A9 00 LDA #$00 - 1642 8452 E5 BE SBC VX+# - 1642 8454 85 BE STA VX+# -Source: weapons.asm - 1646 @ - 1647 ;======vy - 1648 ;vy = sin(Angle) for Angle <=90 - 1649 ;vy = sin(180-Angle) for 90 < Angle <= 180 - 1650 - 1651 8456 A9 00 lda #0 - 1652 8458 85 B7 sta vy - 1653 845A 85 B8 sta vy+1 - 1654 845C 85 B9 sta vy+2 - 1655 ;-- - 1656 845E A6 A7 ldx Angle - 1657 8460 E0 5B cpx #91 - 1658 8462 90 06 bcc YangleUnder90 - 1659 - 1660 8464 A9 B4 lda #180 - 1661 8466 38 sec - 1662 8467 E5 A7 sbc Angle - 1663 8469 AA tax - 1664 - 1665 846A YangleUnder90 - 1666 846A BD C1 5B lda sintable,x - 1667 - 1668 846D 8D 94 44 sta Multiplee ;sin(Angle)*Force - 1669 8470 A5 A4 85 DC A5 A5 + mwa Force Multiplier - 1670 8478 A9 00 lda #$0 - 1671 847A 85 DE sta Multiplier+2 - 1672 847C A2 08 ldx #8 - 1673 847E MultiplyLoopY - 1674 847E 6E 94 44 ror Multiplee - 1675 8481 90 13 bcc DoNotAddY - 1676 8483 18 clc - 1677 8484 A5 DC lda Multiplier - 1678 8486 65 B7 adc vy - 1679 8488 85 B7 sta vy - 1680 848A A5 DD lda Multiplier+1 - 1681 848C 65 B8 adc vy+1 - 1682 848E 85 B8 sta vy+1 - 1683 8490 A5 DE lda Multiplier+2 - 1684 8492 65 B9 adc vy+2 - 1685 8494 85 B9 sta vy+2 - 1686 8496 DoNotAddY - 1687 ;clc ;carry always cleared here (anyway we hope so :) - 1688 8496 26 DC rol Multiplier - 1689 8498 26 DD rol Multiplier+1 - 1690 849A 26 DE rol Multiplier+2 - 1691 849C CA dex - 1692 849D D0 DF bne MultiplyLoopY - 1693 ; here in vy there is a number - 1694 ; yyyy.yy=cos(Angle)*Force - 1695 - 1696 849F A9 00 85 BA mva #0 vy+3 ;vy=cos(Angle)*Force - 1697 - 1698 84A3 Loopi - 1699 ;ytraj=ytraj-vy (skipping least significant byte of vy) - 1700 84A3 38 sec - 1701 84A4 A5 CB lda ytraj - 1702 84A6 E5 B8 sbc vy+1 - 1703 84A8 85 CB sta ytraj - 1704 84AA A5 CC lda ytraj+1 - 1705 84AC E5 B9 sbc vy+2 - 1706 84AE 85 CC sta ytraj+1 - 1707 84B0 A5 CD lda ytraj+2 - 1708 84B2 E5 BA sbc vy+3 - 1709 84B4 85 CD sta ytraj+2 - 1710 - 1711 84B6 2C 8B 44 bit LaserFlag ; no gravity if Laser - 1712 84B9 30 25 bmi NoGravity - 1713 ;vy=vy-g (again without least significant byte of vy) - 1714 84BB 38 sec - 1715 84BC A5 B8 lda vy+1 - 1716 84BE E5 E0 sbc gravity - 1717 84C0 85 B8 sta vy+1 - 1718 84C2 A5 B9 lda vy+2 - 1719 84C4 E9 00 sbc #0 - 1720 84C6 85 B9 sta vy+2 - 1721 84C8 A5 BA lda vy+3 - 1722 84CA E9 00 sbc #0 - 1723 84CC 85 BA sta vy+3 - 1724 84CE 10 10 bpl StillUp - 1725 ; where we know that the bullet starts to fall down - 1726 ; we check if it is MIRV and if so, jump to MIRV routine - 1727 84D0 24 97 bit TestFlightFlag - 1728 84D2 30 0C bmi NoTestForMIRV - 1729 84D4 A6 6C ldx TankNr - 1730 84D6 BD F7 43 lda ActiveWeapon,x - 1731 84D9 C9 06 cmp #ind_MIRV___________ ; MIRV - 1732 84DB D0 03 4C 7C 87 jeq MIRVdownLoop - 1733 84E0 NoTestForMIRV - 1734 84E0 NoGravity - 1735 84E0 StillUp - 1736 - 1737 84E0 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx) - 1738 84E1 A5 C8 lda xtraj ;here of course Fight to right - 1739 84E3 65 BC adc vx+1 - 1740 84E5 85 C8 sta xtraj - 1741 84E7 A5 C9 lda xtraj+1 - 1742 84E9 65 BD adc vx+2 - 1743 84EB 85 C9 sta xtraj+1 - 1744 84ED A5 CA lda xtraj+2 - 1745 84EF 65 BE adc vx+3 - 1746 84F1 85 CA sta xtraj+2 - 1747 - 1748 84F3 2C 8B 44 bit LaserFlag ; no wind if Laser - 1749 84F6 30 19 bmi NoWind - 1750 84F8 18 clc - 1751 .rept 4 - 1752 LDA VX+# - 1753 ADC WIND+# - 1754 STA VX+# - 1755 .endr -Source: REPT - 1752 84F9 A5 BB LDA VX+# - 1752 84FB 65 CE ADC WIND+# - 1752 84FD 85 BB STA VX+# - 1752 84FF A5 BC LDA VX+# - 1752 8501 65 CF ADC WIND+# - 1752 8503 85 BC STA VX+# - 1752 8505 A5 BD LDA VX+# - 1752 8507 65 D0 ADC WIND+# - 1752 8509 85 BD STA VX+# - 1752 850B A5 BE LDA VX+# - 1752 850D 65 D1 ADC WIND+# - 1752 850F 85 BE STA VX+# -Source: weapons.asm - 1756 8511 NoWind - 1757 8511 AD 8F 44 85 61 AD + mwa xtrajold+1 xdraw - 1758 851B AD 92 44 85 63 AD + mwa ytrajold+1 ydraw - 1759 8525 A5 C9 85 65 A5 CA + mwa xtraj+1 xbyte - 1760 852D A5 CC 85 67 A5 CD + mwa ytraj+1 ybyte - 1761 8535 20 12 66 jsr draw - 1762 ;key - 1763 8538 2C 8B 44 bit LaserFlag - 1764 853B 30 03 bmi LaserNoWalls - 1765 ; Check for walls - 1766 853D 20 E7 89 jsr MakeWalls - 1767 ; - 1768 8540 LaserNoWalls - 1769 8540 A5 C9 8D 8F 44 A5 + mwa xtraj+1 XtrajOld+1 - 1770 854A A5 CC 8D 92 44 A5 + mwa ytraj+1 YtrajOld+1 - 1771 - 1772 8554 24 97 bit TestFlightFlag - 1773 8556 30 14 bmi nowait - 1774 8558 2C 8B 44 bit LaserFlag ; faster laser prepare - 1775 855B 10 04 bpl nolaserwait - 1776 855D 24 60 bit Vdebug - 1777 855F 10 0B bpl nowait - 1778 8561 nolaserwait - 1779 8561 A5 A9 lda color - 1780 8563 F0 04 beq nonowait ; smoke tracer erases slowly - 1781 8565 A5 E3 lda tracerflag - 1782 8567 D0 03 bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) - 1783 8569 nonowait - 1784 8569 20 A7 5A jsr shellDelay - 1785 - 1786 856C nowait - 1787 856C A5 BF lda HitFlag - 1788 856E D0 66 bne Hit - 1789 ; --- only for Laser - 1790 8570 2C 8B 44 bit LaserFlag - 1791 8573 10 29 bpl NoCheckEdgesForLaser - 1792 ; If laser fires, edges of the screen finish "flying" and laser hits. - 1793 8575 A5 CD lda ytraj+2 - 1794 8577 30 0C bmi LaserHitEdge - 1795 8579 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth ;+1 - 1796 8583 90 19 bcc LaserNoHitEdge - 1797 8585 LaserHitEdge - 1798 8585 A5 61 85 C1 A5 62 + mwa xdraw XHit - 1799 858D A5 63 8D 5F 44 A5 + mwa ydraw YHit - 1800 8597 A9 FF 85 BF mva #$ff HitFlag ; screen edgs like ground (only for Laser) - 1801 859B 4C EF 85 jmp EndOfFlight - 1802 859E LaserNoHitEdge - 1803 ; ------------------ - 1804 859E NoCheckEdgesForLaser - 1805 - 1806 859E A5 CD C9 00 D0 04 + cpw ytraj+1 #screenheight+1 - 1807 85A8 90 04 bcc YTrayLowerThanScreenHeight - 1808 85AA A5 CD lda ytraj+2 - 1809 85AC 10 41 bpl EndOfFlight - 1810 - 1811 85AE YTrayLowerThanScreenHeight ; it means it is still on screen and not above - 1812 - 1813 85AE SkipCollisionCheck - 1814 - 1815 85AE A5 C9 85 61 A5 CA + mwa xtraj+1 xdraw - 1816 85B6 A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 1817 - 1818 85BE 24 97 bit TestFlightFlag - 1819 85C0 50 0A bvc NoTestFlight - 1820 85C2 24 60 bit Vdebug - 1821 85C4 10 0D bpl NoUnplot - 1822 85C6 20 89 5A jsr WaitOneFrame ; visualize AI targeting - 1823 85C9 4C D0 85 jmp YesUnPlot - 1824 85CC NoTestFlight - 1825 85CC A5 E3 lda tracerflag - 1826 85CE D0 03 bne NoUnPlot - 1827 - 1828 85D0 YesUnPlot - 1829 85D0 20 71 75 jsr UnPlot - 1830 - 1831 85D3 NoUnPlot - 1832 - 1833 85D3 4C A3 84 jmp Loopi - 1834 - 1835 85D6 Hit - 1836 85D6 A5 C1 85 61 A5 C2 + mwa XHit xdraw - 1837 85DE AD 5F 44 85 63 AD + mwa YHit ydraw - 1838 85E8 24 97 bit TestFlightFlag - 1839 85EA 70 03 bvs EndOfFlight - 1840 85EC 20 71 75 jsr unPlot - 1841 85EF EndOfFlight - 1842 85EF A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store for a little while - 1843 85F7 A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw .... but this values are in YHit and XHit !!! - 1844 85FF A9 00 85 61 85 62 mwa #0 xdraw - 1845 8605 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 1846 860D 20 71 75 jsr unPlot - 1847 8610 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 1848 8618 A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 1849 - 1850 8620 AC 8A 44 ldy SmokeTracerFlag - 1851 8623 F0 07 beq EndOfFlight2 - 1852 8625 88 dey - 1853 8626 8C 8A 44 sty SmokeTracerFlag - 1854 8629 4C 4E 87 jmp SecondFlight - 1855 862C EndOfFlight2 - 1856 862C A9 00 85 E3 mva #0 tracerflag ; don't know why - 1857 - 1858 8630 24 97 bit TestFlightFlag - 1859 8632 10 03 4C F1 86 jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check - 1860 ; and now check for defensive-aggressive weapon - 1861 8637 A5 BF lda HitFlag - 1862 8639 D0 03 4C F1 86 jeq NoHitAtEndOfFight ; RTS only !!! - 1863 863E 10 03 4C F1 86 jmi NoTankHitAtEndOfFight - 1864 ; tank hit - increase direct hits points - 1865 8643 A6 6C ldx TankNr - 1866 8645 E8 inx - 1867 8646 E4 BF cpx HitFlag ; we don't count suicides :) - 1868 8648 F0 04 beq @+ - 1869 864A CA dex - 1870 864B FE C7 43 inc DirectHits,x - 1871 ; bne @+ ; one byte enough - 1872 ; inc DirectHitsH,x - 1873 @ - 1874 ; tank hit - check defensive weapon of this tank - 1875 864E AA tax - 1876 864F CA dex ; index of hitted tank in X - 1877 8650 A4 6C ldy TankNr - 1878 8652 B9 F7 43 lda ActiveWeapon,y - 1879 8655 C9 0A cmp #ind_Tracer_________ ; defence not fire by tracers - 1880 8657 F0 16 beq JNoDefence - 1881 8659 C9 0B cmp #ind_Smoke_Tracer___ - 1882 865B F0 12 beq JNoDefence - 1883 865D C9 1F cmp #ind_Laser__________ ; Bouncy and Mag not fire by Laser - 1884 865F F0 0E beq JNoDefence - 1885 8661 BD FD 43 lda ActiveDefenceWeapon,x - 1886 8664 C9 29 cmp #ind_Bouncy_Castle__ ; Auto Defence - 1887 8666 D0 03 4C F6 86 jeq BouncyCastle - 1888 866B C9 25 cmp #ind_Mag_Deflector__ ; Mag Deflector - 1889 866D F0 03 beq MagDeflector - 1890 866F JNoDefence - 1891 866F 4C F1 86 jmp NoDefence - 1892 8672 MagDeflector - 1893 ; now run defensive-aggressive weapon - Mag Deflector! - 1894 ; get tank position - 1895 8672 18 clc - 1896 8673 BD 0D 44 lda xtankstableL,x - 1897 8676 69 04 adc #$04 ; almost in tak center :) - 1898 8678 85 C1 sta XHit - 1899 867A BD 13 44 lda xtankstableH,x - 1900 867D 69 00 adc #$00 - 1901 867F 85 C2 sta XHit+1 - 1902 8681 A9 FF lda #$ff ; change to ground hit (we hope) - 1903 8683 85 BF sta HitFlag - 1904 8685 2C 1B D4 bit random ; left or right deflection ? - 1905 8688 10 1D bpl RightDeflection - 1906 868A LeftDeflection - 1907 868A 38 A5 C1 E9 12 85 + sbw XHit #18 ; 18 pixels to left and explode... - 1908 8695 24 C2 bit XHit+1 ; if off-screen ... - 1909 8697 10 32 bpl EndOfMagDeflector ; hit of course but we need RTS - 1910 8699 18 A5 C1 69 24 85 + adw XHit #36 ; change to right :) - 1911 86A4 4C CB 86 jmp EndOfMagDeflector - 1912 86A7 RightDeflection - 1913 86A7 18 A5 C1 69 12 85 + adw XHit #18 ; 18 pixels to right and explode... - 1914 86B2 A5 C2 CD 41 01 D0 + cpw XHit screenwidth ; if off-screen ... - 1915 86BE B0 0B bcs EndOfMagDeflector ; hit of course but we need RTS - 1916 86C0 38 A5 C1 E9 24 85 + sbw XHit #36 ; change to left - 1917 86CB EndOfMagDeflector - 1918 86CB A9 01 85 AA mva #1 Erase - 1919 86CF A5 6C lda TankNr - 1920 86D1 48 pha ; store TankNr - 1921 86D2 86 6C stx TankNr ; store X in TankNr :) - 1922 86D4 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 1923 86D7 A9 00 lda #0 - 1924 86D9 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used mag deflector weapon - 1925 86DC 9D A8 43 sta ShieldEnergy,x - 1926 86DF 85 AA sta Erase - 1927 86E1 20 2C 6A jsr DrawTankNr ; draw tank without shield - 1928 86E4 A6 6C ldx TankNr ; restore X value :) - 1929 86E6 68 pla - 1930 86E7 85 6C sta TankNr ; restore TankNr value :) - 1931 86E9 A5 C1 85 61 A5 C2 + mwa XHit xdraw ; why? !!! - 1932 86F1 NoTankHitAtEndOfFight - 1933 86F1 NoHitAtEndOfFight - 1934 86F1 NoDefence - 1935 86F1 lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 -Macro: LSRW [Source: MACRO.ASM] - 1 86F1 46 A5 LSR FORCE+1 - 2 86F3 66 A4 ROR FORCE -Source: weapons.asm - 1936 86F5 60 rts ; END !!! - 1937 86F6 BouncyCastle - 1938 ; now in Y we have number of of the attacking player (TankNr) ! - 1939 86F6 B9 F7 43 lda ActiveWeapon,y - 1940 ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down - 1941 86F9 C9 05 cmp #ind_Funky_Bomb_____ - 1942 86FB D0 03 bne @+ - 1943 86FD 20 7A 8F jsr SetFullScreenSoilRange - 1944 @ - 1945 8700 A9 0D 85 9E mva #sfx_shield_on sfx_effect - 1946 ; now run defensive-aggressive weapon - Bouncy Castle (previously known as Auto Defence)! - 1947 8704 A9 01 85 AA mva #1 Erase - 1948 8708 A5 6C lda TankNr - 1949 870A 48 pha ; store TankNr - 1950 870B 86 6C stx TankNr ; store X in TankNr :) - 1951 870D 20 2C 6A jsr DrawTankNr ; now erase tank with shield (to erase shield) - 1952 8710 A9 00 lda #0 - 1953 8712 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate used auto defense weapon - 1954 8715 9D A8 43 sta ShieldEnergy,x - 1955 8718 85 C8 sta xtraj ; prepare coordinates - 1956 871A 85 CB sta ytraj - 1957 ; sta xtraj+2 - 1958 ; sta ytraj+2 - 1959 871C 85 AA sta Erase - 1960 871E 20 2C 6A jsr DrawTankNr ; draw tank without shield - 1961 ; ldx TankNr ; restore X value :) ... but we don't need X now .. - 1962 8721 68 pla - 1963 8722 85 6C sta TankNr ; restore TankNr value :) - 1964 8724 38 sec - 1965 8725 A9 B4 lda #180 - 1966 8727 ED 15 45 sbc LeapFrogAngle - 1967 872A 85 A7 sta Angle ; swap angle (LeapFrogAngle - because we have strored angle in this variable) - 1968 872C lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 -Macro: LSRW [Source: MACRO.ASM] - 1 872C 46 A5 LSR FORCE+1 - 2 872E 66 A4 ROR FORCE -Source: weapons.asm - 1969 8730 A5 C1 85 C9 A5 C2 + mwa XHit xtraj+1 - 1970 8738 38 AD 5F 44 E9 05 + sbw YHit #5 ytraj+1 - 1971 8747 A9 01 85 A9 mva #1 color - 1972 874B 4C B3 83 jmp RepeatFlight ; and repeat Fight - 1973 .endp - 1974 - 1975 874E .proc SecondFlight - 1976 ; ---------------- copied code fragment from before firing. not too elegant. - 1977 ; ---------------- get fire parameters again - 1978 - 1979 874E A6 6C ldx TankNr - 1980 8750 20 96 59 jsr Table2Force - 1981 8753 BD C3 48 lda AngleTable,x - 1982 8756 85 A7 sta Angle - 1983 - 1984 ; Shoots tank nr X !!! :) - 1985 ; set the starting coordinates of bullet with correction - 1986 ; to start where the tank's barrel ends - 1987 ; (without it bullet would go from the left lower corner of the tank) - 1988 ;ldx TankNr - 1989 - 1990 8758 AD C9 48 85 C9 AD + mwa EndOfTheBarrelX xtraj+1 - 1991 8762 AD CB 48 85 CC mva EndOfTheBarrely ytraj+1 - 1992 8767 A9 00 lda #0 - 1993 8769 85 A6 sta Force+2 - 1994 876B 85 CD sta ytraj+2 - 1995 876D 85 C8 sta xtraj - 1996 876F 85 CB sta ytraj - 1997 8771 85 A9 sta color - 1998 - 1999 - 2000 8773 A0 64 ldy #100 ; ??? - 2001 8775 A9 01 85 E3 mva #1 tracerflag ; I do not know (I mean I think I know ;) ) - 2002 ; 10 years later - I do not know!!! - 2003 ; 20 years later - still do not know :] - 2004 8779 4C B3 83 jmp Flight.RepeatIfSmokeTracer - 2005 .endp - 2006 - 2007 ; ------------------------------------------------- - 2008 877C .proc MIRVdownLoop - 2009 ; MIRV loop - here mirv bullets fall down - 2010 ; ------------------------------------------------- - 2011 ; copy Flight parameters to the table - 2012 877C A2 04 ldx #4 - 2013 877E MIRVcopyParameters - 2014 877E A5 C8 lda xtraj - 2015 8780 9D 66 44 sta xtraj00,x - 2016 8783 A5 C9 lda xtraj+1 - 2017 8785 9D 6B 44 sta xtraj01,x - 2018 8788 A5 CA lda xtraj+2 - 2019 878A 9D 70 44 sta xtraj02,x - 2020 ;lda vx - 2021 ;sta vx00,x - 2022 878D A5 BC lda vx+1 - 2023 878F 9D 75 44 sta vx01,x - 2024 8792 A5 BD lda vx+2 - 2025 8794 9D 7A 44 sta vx02,x - 2026 8797 A5 BE lda vx+3 - 2027 8799 9D 7F 44 sta vx03,x - 2028 879C A9 00 lda #0 - 2029 879E 9D 84 44 sta MirvDown,x - 2030 87A1 CA dex - 2031 87A2 10 DA bpl MIRVcopyParameters - 2032 ; modification (to make bullets "split away" and go different directions) - 2033 ; bullet indexed 0 is in the middle - 2034 - 2035 ; bullet 1 - 2036 87A4 18 clc - 2037 87A5 A5 BC lda vx+1 - 2038 87A7 69 64 adc #100 - 2039 87A9 8D 76 44 sta vx01+1 - 2040 87AC A5 BD lda vx+2 - 2041 87AE 69 00 adc #0 - 2042 87B0 8D 7B 44 sta vx02+1 - 2043 87B3 A5 BE lda vx+3 - 2044 87B5 69 00 adc #0 - 2045 87B7 8D 80 44 sta vx03+1 - 2046 ; bullet 2 - 2047 87BA 38 sec - 2048 87BB A5 BC lda vx+1 - 2049 87BD E9 64 sbc #100 - 2050 87BF 8D 77 44 sta vx01+2 - 2051 87C2 A5 BD lda vx+2 - 2052 87C4 E9 00 sbc #0 - 2053 87C6 8D 7C 44 sta vx02+2 - 2054 87C9 A5 BE lda vx+3 - 2055 87CB E9 00 sbc #0 - 2056 87CD 8D 81 44 sta vx03+2 - 2057 ; bullet 3 - 2058 87D0 18 clc - 2059 87D1 A5 BC lda vx+1 - 2060 87D3 69 C8 adc #200 - 2061 87D5 8D 78 44 sta vx01+3 - 2062 87D8 A5 BD lda vx+2 - 2063 87DA 69 00 adc #0 - 2064 87DC 8D 7D 44 sta vx02+3 - 2065 87DF A5 BE lda vx+3 - 2066 87E1 69 00 adc #0 - 2067 87E3 8D 82 44 sta vx03+3 - 2068 ; bullet 4 - 2069 87E6 38 sec - 2070 87E7 A5 BC lda vx+1 - 2071 87E9 E9 C8 sbc #200 - 2072 87EB 8D 79 44 sta vx01+4 - 2073 87EE A5 BD lda vx+2 - 2074 87F0 E9 00 sbc #0 - 2075 87F2 8D 7E 44 sta vx02+4 - 2076 87F5 A5 BE lda vx+3 - 2077 87F7 E9 00 sbc #0 - 2078 87F9 8D 83 44 sta vx03+4 - 2079 - 2080 ; clearing ranges of soil down registers - 2081 87FC 20 89 8F jsr ClearScreenSoilRange - 2082 - 2083 87FF A2 FF ldx #$FF ; it will turn 0 in a moment anyway - 2084 8801 8E 89 44 stx MirvMissileCounter - 2085 8804 mrLoopi - 2086 8804 AE 89 44 ldx MirvMissileCounter - 2087 8807 E8 inx - 2088 8808 E0 05 cpx #5 - 2089 880A D0 02 bne @+ - 2090 880C A2 00 ldx #0 - 2091 880E 8E 89 44 @ stx MirvMissileCounter - 2092 - 2093 ; Y changes only for bullet number 0 - 2094 ; because rest of the bullets have the same Y (height) - 2095 - 2096 8811 D0 29 bne MIRVdoNotChangeY - 2097 ; Y is the same for all falling bullets - 2098 ;ytraj=ytraj-vy (skipping least significant byte of vy) - 2099 8813 38 sec - 2100 8814 A5 CB lda ytraj - 2101 8816 E5 B8 sbc vy+1 - 2102 8818 85 CB sta ytraj - 2103 881A A5 CC lda ytraj+1 - 2104 881C E5 B9 sbc vy+2 - 2105 881E 85 CC sta ytraj+1 - 2106 8820 A5 CD lda ytraj+2 - 2107 8822 E5 BA sbc vy+3 - 2108 8824 85 CD sta ytraj+2 - 2109 - 2110 ;vy=vy-g (also without least significant byte of vy) - 2111 8826 38 sec - 2112 8827 A5 B8 lda vy+1 - 2113 8829 E5 E0 sbc gravity - 2114 882B 85 B8 sta vy+1 - 2115 882D A5 B9 lda vy+2 - 2116 882F E9 00 sbc #0 - 2117 8831 85 B9 sta vy+2 - 2118 8833 A5 BA lda vy+3 - 2119 8835 E9 00 sbc #0 - 2120 8837 85 BA sta vy+3 - 2121 - 2122 8839 20 A7 5A jsr ShellDelay - 2123 - 2124 883C MIRVdoNotChangeY - 2125 - 2126 883C BD 84 44 lda MirvDown,x ; if bullet is already down we go with the next one - 2127 883F F0 03 4C 93 89 jne MIRVnextBullet - 2128 - 2129 8844 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) - 2130 8845 BD 66 44 lda xtraj00,x ;and here of course Flight to the right - 2131 8848 7D 75 44 adc vx01,x - 2132 884B 9D 66 44 sta xtraj00,x - 2133 884E BD 6B 44 lda xtraj01,x - 2134 8851 7D 7A 44 adc vx02,x - 2135 8854 9D 6B 44 sta xtraj01,x - 2136 8857 BD 70 44 lda xtraj02,x - 2137 885A 7D 7F 44 adc vx03,x - 2138 885D 9D 70 44 sta xtraj02,x - 2139 - 2140 ;vx=vx+Wind - 2141 - 2142 8860 18 clc - 2143 .rept 4 - 2144 LDA VX+# - 2145 ADC WIND+# - 2146 STA VX+# - 2147 .endr -Source: REPT - 2144 8861 A5 BB LDA VX+# - 2144 8863 65 CE ADC WIND+# - 2144 8865 85 BB STA VX+# - 2144 8867 A5 BC LDA VX+# - 2144 8869 65 CF ADC WIND+# - 2144 886B 85 BC STA VX+# - 2144 886D A5 BD LDA VX+# - 2144 886F 65 D0 ADC WIND+# - 2144 8871 85 BD STA VX+# - 2144 8873 A5 BE LDA VX+# - 2144 8875 65 D1 ADC WIND+# - 2144 8877 85 BE STA VX+# -Source: weapons.asm - 2148 - 2149 ; rules for a falling MIRV bulets. - 2150 ; if Y is negative and any X (bullet over the screen) - continue flying - 2151 ; if (Y>=0 and Y<=screenhight) and X>screenwidth (bullet off-screen on the left or right side) - continue flying - 2152 ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision - 2153 ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit - 2154 ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) - 2155 - 2156 ; check bullet position and set flags: - 2157 ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) - 2158 ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) - 2159 8879 A9 00 lda #$00 - 2160 887B 8D 8C 44 sta XposFlag - 2161 887E 8D 8D 44 sta YposFlag - 2162 8881 A5 CD lda ytraj+2 ; Y high byte - 2163 8883 10 07 bpl @+ - 2164 8885 A9 80 8D 8D 44 mva #%10000000 YposFlag ; bullet over the screen (Y) - 2165 888A 30 0B bmi MIRVsetXflag - 2166 @ - 2167 888C A5 CC lda ytraj+1 ; Y low byte - 2168 888E C9 C8 cmp #screenheight - 2169 8890 90 05 bcc MIRVsetXflag ; bullet on screen (Y) - 2170 8892 A9 40 8D 8D 44 mva #%01000000 YposFlag ; bullet under the screen (Y) - 2171 8897 MIRVsetXflag - 2172 8897 BD 70 44 lda xtraj02,x ; X high byte - 2173 889A C9 01 cmp #>screenwidth - 2174 889C D0 05 bne @+ - 2175 889E BD 6B 44 lda xtraj01,x ; X low byte - 2176 88A1 C9 40 cmp #mountaintable - 2236 8918 85 73 sta temp+1 - 2237 - 2238 891A A0 00 ldy #0 - 2239 891C A5 CC lda ytraj+1 - 2240 891E D1 72 cmp (temp),y ; check collision with mountains - 2241 8920 B0 20 bcs mrHit - 2242 - 2243 8922 mrSkipCollisionCheck - 2244 ;mwa xtraj01 xdraw - 2245 8922 BD 6B 44 lda xtraj01,x - 2246 8925 85 61 sta xdraw - 2247 8927 BD 70 44 lda xtraj02,x - 2248 892A 85 62 sta xdraw+1 - 2249 892C A5 CC 85 63 A5 CD + mwa ytraj+1 ydraw - 2250 - 2251 8934 20 73 75 jsr unPlot.unPlotAfterX - 2252 8937 AE 89 44 ldx MirvMissileCounter - 2253 893A F0 03 4C 04 88 jne mrLoopi - 2254 - 2255 893F 4C 04 88 jmp mrLoopi - 2256 - 2257 8942 mrHit - 2258 ; we have to make unPlot over the screen (to initialise it) - 2259 ; before actual explosion - 2260 8942 A9 00 85 61 85 62 mwa #0 xdraw - 2261 8948 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2262 8950 20 73 75 jsr unPlot.unPlotAfterX - 2263 8953 AE 89 44 ldx MirvMissileCounter - 2264 8956 A0 00 ldy #0 - 2265 ; concurrent moving xtraj+1 -> xdraw and calculating temp - 2266 8958 18 clc - 2267 8959 BD 6B 44 lda xtraj01,x - 2268 895C 85 61 sta xdraw - 2269 895E 69 3E adc #mountaintable - 2274 8969 85 73 sta temp+1 - 2275 896B B1 72 lda (temp),y - 2276 896D 38 sec - 2277 896E E9 01 sbc #1 - 2278 8970 85 63 sta ydraw - 2279 8972 84 64 sty ydraw+1 ;we know that y=0 - 2280 8974 20 AD 77 jsr missile ; explode .... - 2281 - 2282 8977 mrEndOfFlight - 2283 8977 AE 89 44 ldx MirvMissileCounter - 2284 897A A9 00 85 61 85 62 mwa #0 xdraw - 2285 8980 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2286 8988 20 73 75 jsr unPlot.unPlotAfterX - 2287 898B AE 89 44 ldx MirvMissileCounter - 2288 898E A9 01 lda #1 - 2289 8990 9D 84 44 sta MirvDown,x - 2290 8993 MIRVnextBullet - 2291 ; checking if all bullets already fallen down - 2292 8993 A2 04 ldx #4 - 2293 8995 MIRVcheckIfEnd - 2294 8995 BD 84 44 lda MirvDown,x - 2295 8998 F0 05 beq MIRVstillNotAll - 2296 899A CA dex - 2297 899B 10 F8 bpl MIRVcheckIfEnd - 2298 899D 30 03 bmi MIRValreadyAll - 2299 899F MIRVstillNotAll - 2300 899F 4C 04 88 jmp mrLoopi - 2301 89A2 MIRValreadyAll - 2302 89A2 A5 61 85 B3 A5 62 + mwa xdraw xcircle ; we must store them (for a while) - 2303 89AA A5 63 85 B5 A5 64 + mwa ydraw ycircle ; xdraw and ydraw - 2304 89B2 A9 00 85 61 85 62 mwa #0 xdraw - 2305 89B8 A9 C7 85 63 A9 00 + mwa #screenheight-1 ydraw - 2306 89C0 AE 89 44 ldx MirvMissileCounter - 2307 89C3 20 73 75 jsr unPlot.unPlotAfterX - 2308 89C6 A5 B3 85 61 A5 B4 + mwa xcircle xdraw - 2309 89CE A5 B5 85 63 A5 B6 + mwa ycircle ydraw - 2310 - 2311 ; we must do it manually because of the VOID pointer - 2312 - 2313 ;first clean the offensive text... - 2314 89D6 A4 6C ldy TankNr - 2315 89D8 A9 00 85 DB mva #$00 plot4x4color - 2316 89DC 20 88 72 jsr DisplayOffensiveTextNr - 2317 - 2318 ; temporary removing tanks from the screen (otherwise they will fall down with soil) - 2319 89DF 20 F4 6E jsr SoilDown2 - 2320 89E2 A9 FF 85 BF mva #$ff HitFlag ; but why ?? - 2321 89E6 60 rts - 2322 .endp - 2323 ; ------------------------------------------------- - 2324 89E7 .proc MakeWalls - 2325 ; ------------------------------------------------- - 2326 89E7 2C 0C 44 bit WallsType ; ; bits 6 and 7: 00 - none, 01 - bump, 10 - wrap, 11 - boxy - 2327 89EA 10 54 bpl WrapAndNone - 2328 89EC 50 21 bvc MakeBump - 2329 ; top bounce - 2330 89EE 24 CD bit ytraj+2 - 2331 89F0 10 1D bpl NoOnTop - 2332 89F2 24 BA bit vy+3 - 2333 89F4 30 19 bmi FlyingDown - 2334 89F6 38 sec - 2335 .rept 4 - 2336 LDA #$00 - 2337 SBC VY+# - 2338 STA VY+# - 2339 .endr -Source: REPT - 2336 89F7 A9 00 LDA #$00 - 2336 89F9 E5 B7 SBC VY+# - 2336 89FB 85 B7 STA VY+# - 2336 89FD A9 00 LDA #$00 - 2336 89FF E5 B8 SBC VY+# - 2336 8A01 85 B8 STA VY+# - 2336 8A03 A9 00 LDA #$00 - 2336 8A05 E5 B9 SBC VY+# - 2336 8A07 85 B9 STA VY+# - 2336 8A09 A9 00 LDA #$00 - 2336 8A0B E5 BA SBC VY+# - 2336 8A0D 85 BA STA VY+# -Source: weapons.asm - 2340 8A0F FlyingDown - 2341 8A0F NoOnTop - 2342 8A0F MakeBump - 2343 8A0F A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth - 2344 8A19 90 54 bcc OnScreen - 2345 ; inverse vx (bouncing wall) - 2346 8A1B 38 sec - 2347 .rept 4 - 2348 LDA #$00 - 2349 SBC VX+# - 2350 STA VX+# - 2351 .endr -Source: REPT - 2348 8A1C A9 00 LDA #$00 - 2348 8A1E E5 BB SBC VX+# - 2348 8A20 85 BB STA VX+# - 2348 8A22 A9 00 LDA #$00 - 2348 8A24 E5 BC SBC VX+# - 2348 8A26 85 BC STA VX+# - 2348 8A28 A9 00 LDA #$00 - 2348 8A2A E5 BD SBC VX+# - 2348 8A2C 85 BD STA VX+# - 2348 8A2E A9 00 LDA #$00 - 2348 8A30 E5 BE SBC VX+# - 2348 8A32 85 BE STA VX+# -Source: weapons.asm - 2352 ; and bouce feapfrog :) - 2353 8A34 38 sec - 2354 8A35 A9 B4 lda #180 - 2355 8A37 ED 15 45 sbc LeapFrogAngle - 2356 8A3A 8D 15 45 sta LeapFrogAngle ; swap angle (LeapFrogAngle) - 2357 8A3D E6 A2 inc FunkyWallFlag - 2358 8A3F 60 rts - 2359 8A40 WrapAndNone - 2360 8A40 50 2D bvc NoWall - 2361 8A42 A5 CA C9 01 D0 04 + cpw xtraj+1 #screenwidth - 2362 8A4C 90 21 bcc OnScreen - 2363 ; (wrapping wall) - 2364 8A4E E6 A2 inc FunkyWallFlag - 2365 8A50 24 CA bit xtraj+2 - 2366 8A52 30 0E bmi LeftWrap - 2367 8A54 RightWrap - 2368 8A54 38 A5 C9 E9 40 85 + sbw xtraj+1 #screenwidth - 2369 8A61 60 rts - 2370 8A62 LeftWrap - 2371 8A62 18 A5 C9 69 40 85 + adw xtraj+1 #screenwidth - 2372 8A6F OnScreen - 2373 8A6F NoWall - 2374 8A6F 60 rts - 2375 .endp - 2376 ; ------------------------------------------------- - 2377 8A70 .proc WhiteFlag - 2378 ; ------------------------------------------------- - 2379 ; This routine is run from inside of the main loop - 2380 ; and replaces Shoot and Flight routines - 2381 ; X and TankNr - index of shooting tank - 2382 ; ------------------------------------------------- - 2383 8A70 A9 06 85 9E mva #sfx_death_begin sfx_effect - 2384 8A74 20 57 6B jsr FlashTank ; first we flash tank - 2385 8A77 A9 01 85 AA mva #1 Erase - 2386 8A7B 20 2C 6A jsr DrawTankNr ; and erase tank - 2387 8A7E A9 00 lda #0 - 2388 8A80 85 AA sta Erase - 2389 8A82 A6 6C ldx TankNr - 2390 8A84 9D A2 43 sta Energy,x ; clear tank energy - 2391 8A87 9D AF 43 sta eXistenZ,x ; erase from existence - 2392 8A8A 9D B5 43 sta LASTeXistenZ,x ; to prevent explosion - 2393 8A8D 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate White Flag - 2394 8A90 20 46 75 jsr PMoutofScreen - 2395 8A93 20 12 6A jsr drawtanks ; for restore PM - 2396 8A96 A9 15 85 9E mva #sfx_silencer sfx_effect - 2397 8A9A 60 rts - 2398 .endp - 2399 - 2400 ; ------------------------------------------------- - 2401 8A9B .proc AtomicWinter - 2402 ; ------------------------------------------------- - 2403 ; This routine is run from inside of the main loop - 2404 ; and replaces Shoot and Flight routines - 2405 ; X and TankNr - index of shooting tank - 2406 ; ------------------------------------------------- - 2407 8A9B A9 12 85 9E mva #sfx_sandhog sfx_effect - 2408 .IF FASTER_GRAF_PROCS = 1 - 2409 ldy #0 ; byte counter (from 0 to 39) - 2410 NextColumn - 2411 ; big loop - we repat internal loops for each column of bytes - 2412 sty magic - 2413 ldx #120 ; line counter (from 0 to 60 ) - 2414 ; first loop - inverse column of bytes for a while - 2415 ldy magic - 2416 NextLine1 - 2417 jsr InverseScreenByte - 2418 dex - 2419 dex - 2420 bpl NextLine1 - 2421 ; - 2422 jsr WaitOneFrame ; wait uses A only - 2423 ; second loop - inverse again and put random "snow" to column of bytes - 2424 ldx #120 - 2425 ldy magic - 2426 mva #$55 magic+1 - 2427 NextLine2 - 2428 jsr InverseScreenByte - 2429 lda random - 2430 ora magic+1 - 2431 and (temp),y - 2432 sta (temp),y - 2433 lda magic+1 - 2434 eor #$ff - 2435 sta magic+1 - 2436 dex - 2437 dex - 2438 bpl NextLine2 - 2439 ; and go to next column - 2440 iny - 2441 cpy #40 - 2442 bne NextColumn - 2443 .ELSE - 2444 8A9F A9 01 85 A9 mva #1 color - 2445 8AA3 A9 78 85 63 A9 00 + mwa #120 ydraw - 2446 8AAB NextLineSlow - 2447 8AAB A9 00 lda #0 - 2448 8AAD 85 61 sta xdraw - 2449 8AAF 85 62 sta xdraw+1 - 2450 8AB1 NextPixelSlow - 2451 8AB1 2C 1B D4 bit random - 2452 8AB4 10 05 bpl NoPlot - 2453 8AB6 50 03 bvc NoPlot - 2454 8AB8 20 2C 76 jsr plot.MakePlot - 2455 8ABB NoPlot - 2456 8ABB E6 61 D0 02 E6 62 inw xdraw - 2457 8AC1 A5 62 C9 01 D0 04 + cpw xdraw #screenwidth - 2458 8ACB D0 E4 bne NextPixelSlow - 2459 8ACD C6 63 dec ydraw - 2460 8ACF C6 63 dec ydraw - 2461 8AD1 10 D8 bpl NextLineSlow - 2462 .ENDIF - 2463 ; and we have "snow" :) - 2464 8AD3 A9 00 lda #0 - 2465 8AD5 A6 6C ldx TankNr - 2466 8AD7 9D FD 43 sta ActiveDefenceWeapon,x ; deactivate Nuclear Winter - 2467 8ADA 20 7A 8F jsr SetFullScreenSoilRange - 2468 8ADD 20 F7 6E jsr SoilDown2.NoClearTanks - 2469 8AE0 60 rts - 2470 - 2471 ; in order to optimize the fragment repeated in both internal loops - 2472 ; we save 15 bytes :) - 2473 8AE1 InverseScreenByte - 2474 8AE1 BD 68 41 lda LineTableL,x - 2475 8AE4 85 72 sta temp - 2476 8AE6 BD 31 42 lda LineTableH,x - 2477 8AE9 85 73 sta temp+1 - 2478 8AEB B1 72 lda (temp),y - 2479 8AED 49 FF eor #$ff - 2480 8AEF 91 72 sta (temp),y - 2481 8AF1 60 rts - 2482 .endp - 2483 ; ------------------------------------------------- - 2484 8AF2 .proc AutoDefense - 2485 ; ------------------------------------------------- - 2486 ; This routine is run from inside of the main loop - 2487 ; X - index of tank - 2488 ; ------------------------------------------------- - 2489 8AF2 20 EB 8F jsr PrepareAIShoot.WepTableToTemp - 2490 8AF5 20 45 91 jsr UseBattery - 2491 8AF8 20 98 91 jsr TosserDefensives - 2492 8AFB 60 rts - 2493 .endp - 2494 ; ------------------------------------------------- - 2495 8AFC .proc SpyHard - 2496 ; ------------------------------------------------- - 2497 8AFC A6 6C 8E 31 44 mvx TankNr TargetTankNr ; save - 2498 8B01 RepeatSpy - 2499 8B01 A2 00 86 6C mvx #0 TankNr - 2500 8B05 86 5F stx SpyHardFlag ; 0 - optimization - 2501 8B07 CheckNextTankSH - 2502 8B07 EC 31 44 cpx TargetTankNr - 2503 8B0A F0 22 beq ThisTankItsMe - 2504 8B0C BD A2 43 lda Energy,x ; only active players - 2505 8B0F F0 1D beq ThisTankIsDead - 2506 ; run SpyHard for tank in X - 2507 8B11 20 41 8B jsr DisplaySpyInfo - 2508 8B14 20 57 6B jsr FlashTank - 2509 8B17 20 5F 5A @ jsr GetKey - 2510 8B1A 24 D7 bit escFlag - 2511 8B1C 30 1A bmi SpyHardEnd - 2512 8B1E C9 21 cmp #@kbcode._space ; $21 ; Space - 2513 8B20 F0 16 beq SpyHardEnd - 2514 8B22 C9 0C cmp #@kbcode._ret ; Return key (5200 - fire) - 2515 8B24 F0 12 beq SpyHardEnd - 2516 8B26 C9 06 cmp #@kbcode._left ; $6 - 2517 8B28 F0 04 beq SelectNextTank - 2518 8B2A C9 07 cmp #@kbcode._right ; $07 ; cursor right - 2519 8B2C D0 E9 bne @- - 2520 8B2E ThisTankIsDead - 2521 8B2E ThisTankItsMe - 2522 8B2E SelectNextTank - 2523 8B2E E6 6C inc TankNr - 2524 8B30 A6 6C ldx TankNr - 2525 8B32 E4 AE cpx NumberOfPlayers - 2526 8B34 D0 D1 bne CheckNextTankSH - 2527 8B36 F0 C9 beq RepeatSpy - 2528 8B38 SpyHardEnd - 2529 8B38 AE 31 44 86 6C mvx TargetTankNr TankNr ; restore - 2530 8B3D 20 41 8B jsr DisplaySpyInfo - 2531 8B40 60 rts - 2532 .endp - 2533 8B41 .proc DisplaySpyInfo - 2534 8B41 BD 7F 5B lda TankStatusColoursTable,x - 2535 8B44 85 02 sta COLOR2 ; set color of status line - 2536 8B46 20 0F 66 jsr PutTankNameOnScreen - 2537 ; jsr DisplayStatus ; There is no need anymore, it is always after PutTankNameOnScreen - 2538 8B49 60 rts - 2539 .endp - 2540 ; ------------------------------------------------- - 2541 8B4A .proc LazyBoys - 2542 ; ------------------------------------------------- - 2543 8B4A A9 2C 85 9E mva #sfx_lazy_boys sfx_effect - 2544 8B4E 20 CF 8F jsr PrepareAIShoot - 2545 8B51 A6 6C ldx TankNr - 2546 8B53 24 5E bit LazyFlag - 2547 8B55 30 0A bmi GoDarwin - 2548 8B57 20 C0 92 jsr FindBestTarget2 ; find nearest tank neighbour - 2549 8B5A 20 70 8B jsr LazyAim - 2550 8B5D A9 00 lda #%00000000 ; set "visual aiming" off - 2551 8B5F F0 08 beq EndLazy - 2552 8B61 GoDarwin - 2553 8B61 20 81 92 jsr FindBestTarget3 ; find target with lowest energy - 2554 8B64 20 70 8B jsr LazyAim - 2555 8B67 A9 80 lda #%10000000 - 2556 8B69 EndLazy - 2557 8B69 85 97 sta TestFlightFlag ; set "visual aiming" on - 2558 8B6B A9 00 85 5E mva #0 LazyFlag - 2559 8B6F 60 rts - 2560 .endp - 2561 8B70 .proc LazyAim - 2562 ; aiming proc for Lazy ... weapons - 2563 ; as proc for memory optimisation - 2564 ; Y - target tan nr - 2565 ; A - target direction - 2566 8B70 8C 31 44 sty TargetTankNr - 2567 ; aiming - 2568 8B73 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 2569 8B76 A5 A4 lda Force - 2570 8B78 9D D9 43 sta ForceTableL,x - 2571 8B7B A5 A5 lda Force+1 - 2572 8B7D 9D DF 43 sta ForceTableH,x - 2573 8B80 20 A1 59 jsr MoveBarrelToNewPosition - 2574 8B83 60 rts - 2575 .endp - 2576 ; ------------------------------------------------- - 2577 8B84 .proc TankFlying - 2578 ; ------------------------------------------------- - 2579 ; This routine is run from inside of the main loop - 2580 ; and replaces Shoot and Flight routines - 2581 ; X and TankNr - index of flying tank - 2582 ; ------------------------------------------------- - 2583 ; Let's designate the flight altitude. - 2584 8B84 20 BF 70 jsr CheckMaxMountain - 2585 8B87 C9 1E cmp #(12+18) ; tank with shield (12) and max alt (18) check - 2586 8B89 90 04 bcc IsToHigh - 2587 8B8B E9 0C sbc #12 ; tank with shield high correction - 2588 8B8D D0 02 bne StoreMaxAlt - 2589 8B8F IsToHigh - 2590 8B8F A9 12 lda #18 - 2591 8B91 StoreMaxAlt - 2592 8B91 85 A2 sta FloatingAlt - 2593 ; mva #18 FloatingAlt ; for testing - 2594 8B93 A9 08 85 9E mva #sfx_plasma_2_2 sfx_effect - 2595 - 2596 ; display text 4x4 - fuel full - 2597 - 2598 8B97 A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 - 2599 8B9F A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - 2600 8BA7 A9 1D 85 83 mva #hoverFullEnd-hoverFull-1 fx ; length - 2601 8BAB 38 sec - 2602 8BAC A5 A2 lda FloatingAlt - 2603 8BAE E9 0C sbc #12 - 2604 8BB0 85 D8 sta LineYdraw - 2605 8BB2 20 72 73 jsr TypeLine4x4.variableLength - 2606 - 2607 8BB5 A6 6C ldx TankNr - 2608 - 2609 ; TankNr in X reg. - 2610 ; now animate Up - 2611 8BB7 A9 00 85 76 mva #0 modify ; it's a counter - 2612 8BBB TankGoUp - 2613 8BBB BD 19 44 lda ytankstable,x - 2614 8BBE C5 A2 cmp FloatingAlt ; Floating altitude - 2615 8BC0 90 33 bcc ReachSky - 2616 ; first erase old tank position - 2617 8BC2 A9 01 85 AA mva #1 Erase - 2618 8BC6 20 2C 6A jsr DrawTankNr - 2619 8BC9 A5 76 lda modify - 2620 8BCB C9 05 cmp #5 - 2621 8BCD 90 07 bcc NoEngineClear - 2622 8BCF A9 00 85 A9 mva #0 color - 2623 8BD3 20 7E 6C jsr DrawTankRocketEngine - 2624 8BD6 NoEngineClear - 2625 8BD6 A9 00 85 AA mva #0 Erase - 2626 8BDA DE 19 44 dec ytankstable,x - 2627 8BDD E6 76 inc modify - 2628 ; then draw tank on new position - 2629 8BDF 20 2C 6A jsr DrawTankNr - 2630 8BE2 A5 76 lda modify - 2631 8BE4 C9 05 cmp #5 - 2632 8BE6 90 0A bcc NoEngine - 2633 8BE8 AD 1B D4 lda random - 2634 8BEB 29 01 and #%00000001 - 2635 8BED 85 A9 sta color - 2636 8BEF 20 7E 6C jsr DrawTankRocketEngine - 2637 8BF2 NoEngine - 2638 ; jsr WaitOneFrame - 2639 8BF2 4C BB 8B jmp TankGoUp - 2640 - 2641 8BF5 ReachSky - 2642 ; engine symbol erase - 2643 8BF5 A9 00 85 A9 mva #0 color - 2644 8BF9 20 7E 6C jsr DrawTankRocketEngine - 2645 - 2646 ; display text 4x4 - fuel full (clear text) - 2647 8BFC A9 15 85 B3 A9 A0 + mwa #hoverFull LineAddress4x4 - 2648 8C04 A9 64 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverFullEnd-hoverFull)*2)) LineXdraw ; centering - 2649 8C0C A9 1D 85 83 mva #(hoverFullEnd-hoverFull-1) fx ; length - 2650 8C10 38 sec - 2651 8C11 A5 A2 lda FloatingAlt - 2652 8C13 E9 0C sbc #12 - 2653 8C15 85 D8 sta LineYdraw - 2654 8C17 A9 00 lda #$00 - 2655 8C19 20 74 73 jsr TypeLine4x4.staplot4x4color - 2656 ; and Soildown at the start (for correct mountaintable if tank was buried) - 2657 ; calculate range - 2658 8C1C A6 6C ldx TankNr - 2659 8C1E 38 sec - 2660 8C1F BD 0D 44 lda XtankstableL,x - 2661 8C22 E9 02 sbc #2 - 2662 8C24 85 D2 sta RangeLeft - 2663 8C26 BD 13 44 lda XtankstableH,x - 2664 8C29 E9 00 sbc #0 - 2665 8C2B 85 D3 sta RangeLeft+1 - 2666 8C2D 18 clc - 2667 8C2E BD 0D 44 lda XtankstableL,x - 2668 8C31 69 0A adc #10 - 2669 8C33 85 D4 sta RangeRight - 2670 8C35 BD 13 44 lda XtankstableH,x - 2671 8C38 69 00 adc #0 - 2672 8C3A 85 D5 sta RangeRight+1 - 2673 ; hide tanks and ... - 2674 8C3C 20 F4 6E jsr SoilDown2 - 2675 8C3F 20 89 8F jsr ClearScreenSoilRange - 2676 8C42 A6 6C ldx TankNr - 2677 - 2678 ; check keyboard/joy and move tank left/right - code copied from BeforeFire - 2679 ;keyboard reading - 2680 ; KBCODE keeps code of last keybi - 2681 ; SKSTAT $ff - nothing pressed - 2682 ; $FB - any key - 2683 ; $f7 - shift - 2684 ; $f3 - shift+key - 2685 8C44 KeyboardAndJoyCheck - 2686 8C44 A9 1F 85 9E mva #sfx_tank_move sfx_effect - 2687 8C48 BD A8 43 lda ShieldEnergy,x - 2688 8C4B C9 14 cmp #20 - 2689 8C4D D0 20 bne LotOfFuel - 2690 - 2691 ; display text 4x4 - low fuel - 2692 8C4F A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 - 2693 8C57 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - 2694 8C5F A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - 2695 8C63 38 sec - 2696 8C64 A5 A2 lda FloatingAlt - 2697 8C66 E9 0C sbc #12 - 2698 8C68 85 D8 sta LineYdraw - 2699 8C6A 20 72 73 jsr TypeLine4x4.variableLength - 2700 8C6D A6 6C ldx TankNr - 2701 - 2702 8C6F LotOfFuel - 2703 8C6F notpressed - 2704 ; let's animate "engine" - 2705 8C6F 20 E5 6C jsr DrawTankEngine - 2706 ; enimation ends - 2707 - 2708 8C72 A5 02 lda SKSTAT - 2709 8C74 C9 FF cmp #$ff - 2710 8C76 F0 26 jeq checkJoy - 2711 8C78 C9 F7 cmp #$f7 ; SHIFT - 2712 8C7A F0 22 jeq checkJoy - 2713 - 2714 8C7C A5 02 lda kbcode - 2715 8C7E 29 3F and #%00111111 ; CTRL and SHIFT elimination - 2716 - 2717 8C80 C9 1C cmp #@kbcode._esc ; 28 ; ESC - 2718 8C82 D0 08 bne @+ - 2719 8C84 20 AE 73 jsr AreYouSure - 2720 8C87 24 D7 bit escFlag - 2721 8C89 10 E4 bpl notpressed - 2722 ;---esc pressed-quit game--- - 2723 8C8B 60 rts - 2724 @ - 2725 8C8C jumpFromStick - 2726 8C8C C9 06 cmp #@kbcode._left ; $6 - 2727 8C8E F0 60 jeq pressedLeft - 2728 8C90 C9 07 cmp #@kbcode._right ; $7 - 2729 8C92 F0 23 jeq pressedRight - 2730 8C94 C9 21 cmp #@kbcode._space ; $21 - 2731 8C96 D0 03 4C 3B 8D jeq pressedSpace - 2732 8C9B 4C 6F 8C jmp notpressed - 2733 8C9E checkJoy - 2734 ;------------JOY------------- - 2735 ;happy happy joy joy - 2736 ;check for joystick now - 2737 8C9E A5 02 lda STICK0 - 2738 8CA0 29 0F and #$0f - 2739 8CA2 C9 0F cmp #$0f - 2740 8CA4 F0 07 beq notpressedJoy - 2741 8CA6 A8 tay - 2742 8CA7 B9 5A 60 lda joyToKeyTable,y - 2743 8CAA 4C 8C 8C jmp jumpFromStick - 2744 8CAD notpressedJoy - 2745 ;fire - 2746 8CAD A5 02 lda STRIG0 - 2747 8CAF D0 03 4C 3B 8D jeq pressedSpace - 2748 8CB4 4C 6F 8C jmp notpressed - 2749 - 2750 - 2751 8CB7 pressedRight - 2752 8CB7 BD A8 43 lda ShieldEnergy,x - 2753 8CBA F0 7F jeq pressedSpace - 2754 8CBC A0 01 ldy #1 - 2755 8CBE 20 B0 57 jsr DecreaseShieldEnergyX - 2756 ; first erase old tank position - 2757 8CC1 A9 01 85 AA mva #1 Erase - 2758 8CC5 20 2C 6A jsr DrawTankNr - 2759 8CC8 A9 00 85 AA mva #0 Erase - 2760 8CCC BD 13 44 lda XtankstableH,x - 2761 8CCF C9 01 cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 - 2762 8CD1 D0 05 bne @+ - 2763 8CD3 BD 0D 44 lda XtankstableL,x - 2764 8CD6 C9 34 cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels - 2765 8CD8 B0 0B @ bcs RightScreenEdge - 2766 8CDA FE 0D 44 inc XtankstableL,x - 2767 8CDD D0 03 FE 13 44 sne:inc XtankstableH,x - 2768 8CE2 4C E9 8C jmp NoREdge - 2769 8CE5 RightScreenEdge - 2770 8CE5 A9 03 85 9E mva #sfx_dunno sfx_effect - 2771 8CE9 NoREdge - 2772 8CE9 A9 12 9D C3 48 mva #18 AngleTable,x - 2773 8CEE D0 3C bne DrawFloatingTank ; then draw tank on new position - 2774 - 2775 8CF0 pressedLeft - 2776 8CF0 BD A8 43 lda ShieldEnergy,x - 2777 8CF3 F0 46 beq pressedSpace - 2778 8CF5 A0 01 ldy #1 - 2779 8CF7 20 B0 57 jsr DecreaseShieldEnergyX - 2780 ; first erase old tank position - 2781 8CFA A9 01 85 AA mva #1 Erase - 2782 8CFE 20 2C 6A jsr DrawTankNr - 2783 8D01 A9 00 85 AA mva #0 Erase - 2784 8D05 BD 13 44 lda XtankstableH,x - 2785 8D08 C9 00 cmp #0 - 2786 8D0A D0 05 bne @+ - 2787 8D0C BD 0D 44 lda XtankstableL,x - 2788 8D0F C9 05 cmp #5 ; 4 pixles from left edge - 2789 8D11 90 10 @ bcc LeftScreenEdge - 2790 8D13 DE 0D 44 dec XtankstableL,x - 2791 8D16 BD 0D 44 lda XtankstableL,x - 2792 8D19 C9 FF cmp #$ff - 2793 8D1B D0 03 DE 13 44 sne:dec XtankstableH,x - 2794 8D20 4C 27 8D jmp NoLEdge - 2795 8D23 LeftScreenEdge - 2796 8D23 A9 03 85 9E mva #sfx_dunno sfx_effect - 2797 8D27 NoLEdge - 2798 8D27 A9 A2 9D C3 48 mva #162 AngleTable,x - 2799 ; then draw tank on new position - 2800 8D2C DrawFloatingTank - 2801 8D2C 20 2C 6A jsr DrawTankNr - 2802 8D2F 20 0F 66 jsr DisplayStatus - 2803 8D32 20 89 5A jsr WaitOneFrame - 2804 8D35 20 6B 8E jsr CalculateSoildown - 2805 8D38 4C 44 8C jmp KeyboardAndJoyCheck - 2806 - 2807 8D3B pressedSpace - 2808 ; display text 4x4 - low fuel (clear text) - 2809 8D3B A9 33 85 B3 A9 A0 + mwa #hoverEmpty LineAddress4x4 - 2810 8D43 A9 7A 85 D9 A9 00 + mwa #((ScreenWidth/2)-((hoverEmptyEnd-hoverEmpty)*2)) LineXdraw ; centering - 2811 8D4B A9 12 85 83 mva #hoverEmptyEnd-hoverEmpty-1 fx ; length - 2812 8D4F 38 sec - 2813 8D50 A5 A2 lda FloatingAlt - 2814 8D52 E9 0C sbc #12 - 2815 8D54 85 D8 sta LineYdraw - 2816 8D56 A9 00 lda #$00 - 2817 8D58 20 74 73 jsr TypeLine4x4.staplot4x4color - 2818 8D5B A6 6C ldx TankNr - 2819 ;================================= - 2820 ; left or right from center of screen ? - 2821 8D5D A0 00 ldy #0 - 2822 8D5F BD 13 44 lda XtankstableH,x - 2823 8D62 C9 00 cmp #>((screenwidth/2)-TankWidth) - 2824 8D64 D0 05 bne @+ - 2825 8D66 BD 0D 44 lda XtankstableL,x - 2826 8D69 C9 98 cmp #<((screenwidth/2)-TankWidth) - 2827 8D6B 90 01 @ bcc TankOnLeftSide - 2828 8D6D TankOnRightSide - 2829 8D6D 88 dey - 2830 8D6E TankOnLeftSide - 2831 8D6E 84 A3 sty OverTankDir ; (0 go right, $ff go left) - 2832 ; now we have direction of bypassing tanks on screen - 2833 - 2834 ; clear "engine pixels" under tank - 2835 8D70 A9 01 85 AA mva #1 erase - 2836 8D74 20 E5 6C jsr DrawTankEngine - 2837 - 2838 8D77 CheckForTanksBelow - 2839 8D77 BD 0D 44 lda XtankstableL,x - 2840 8D7A 85 61 sta xdraw - 2841 8D7C BD 13 44 lda XtankstableH,x - 2842 8D7F 85 62 sta xdraw+1 - 2843 8D81 A6 AE ldx NumberOfPlayers - 2844 8D83 CA dex - 2845 8D84 CheckCollisionWithTankLoop - 2846 8D84 E4 6C cpx TankNr - 2847 8D86 F0 63 beq ItIsMe - 2848 8D88 BD AF 43 lda eXistenZ,x - 2849 8D8B F0 5E beq DeadTank - 2850 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - 2851 ; it is tricky but fast and much shorter - 2852 8D8D BD 0D 44 lda xtankstableL,x - 2853 8D90 38 sec - 2854 8D91 E9 09 sbc #9 ; 2 pixels more on left side + tank width - 2855 8D93 A8 tay - 2856 8D94 BD 13 44 lda xtankstableH,x - 2857 8D97 E9 00 sbc #0 - 2858 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! - 2859 8D99 C5 62 cmp xdraw+1 - 2860 8D9B D0 02 bne @+ - 2861 8D9D C4 61 cpy xdraw - 2862 @ - 2863 8D9F B0 4A bcs LeftFromTheTank - 2864 8DA1 98 tya ;add 20 (tank size*2 +2 and +2) - 2865 8DA2 18 clc - 2866 8DA3 69 14 adc #20 - 2867 8DA5 A8 tay - 2868 8DA6 BD 13 44 lda xtankstableH,x - 2869 8DA9 69 00 adc #0 - 2870 8DAB C5 62 cmp xdraw+1 - 2871 8DAD D0 02 bne @+ - 2872 8DAF C4 61 cpy xdraw - 2873 @ - 2874 8DB1 90 38 bcc RightFromTheTank - 2875 8DB3 TankBelow - 2876 ; tank below - we must move our tank - 2877 8DB3 A6 6C ldx TankNr - 2878 ; first erase old tank position - 2879 8DB5 A9 01 85 AA mva #1 Erase - 2880 8DB9 20 2C 6A jsr DrawTankNr - 2881 8DBC A9 00 85 AA mva #0 Erase - 2882 8DC0 24 A3 bit OverTankDir - 2883 8DC2 30 0F bmi PassLeft - 2884 8DC4 PassRight - 2885 8DC4 FE 0D 44 inc XtankstableL,x - 2886 8DC7 D0 03 FE 13 44 sne:inc XtankstableH,x - 2887 8DCC A9 12 9D C3 48 mva #18 AngleTable,x - 2888 8DD1 D0 12 bne Bypassing - 2889 8DD3 PassLeft - 2890 8DD3 DE 0D 44 dec XtankstableL,x - 2891 8DD6 BD 0D 44 lda XtankstableL,x - 2892 8DD9 C9 FF cmp #$ff - 2893 8DDB D0 03 DE 13 44 sne:dec XtankstableH,x - 2894 8DE0 A9 A2 9D C3 48 mva #162 AngleTable,x - 2895 8DE5 Bypassing - 2896 ; then draw tank on new position - 2897 8DE5 20 2C 6A jsr DrawTankNr - 2898 8DE8 4C 77 8D jmp CheckForTanksBelow - 2899 8DEB RightFromTheTank - 2900 8DEB LeftFromTheTank - 2901 8DEB DeadTank - 2902 8DEB ItIsMe - 2903 8DEB CA dex - 2904 8DEC 10 96 bpl CheckCollisionWithTankLoop - 2905 8DEE A6 6C ldx TankNr - 2906 8DF0 A9 0E 85 9E mva #sfx_shield_off sfx_effect - 2907 8DF4 A9 01 85 AA mva #1 Erase - 2908 8DF8 20 2C 6A jsr DrawTankNr - 2909 8DFB A9 00 85 AA mva #0 Erase - 2910 ; x correction for P/M - 2911 ; -- - 2912 .IF XCORRECTION_FOR_PM = 1 - 2913 lda XtankstableL,x - 2914 and #%11111110 ; correction for PM - 2915 sta XtankstableL,x - 2916 .ENDIF - 2917 ; -- - 2918 8DFF GoDown - 2919 - 2920 8DFF A9 3E 85 72 A9 46 + mwa #mountaintable temp - 2921 8E07 18 clc - 2922 8E08 A5 72 lda temp - 2923 8E0A 7D 0D 44 adc XtankstableL,x - 2924 8E0D 85 72 sta temp - 2925 8E0F A5 73 lda temp+1 - 2926 8E11 7D 13 44 adc XtankstableH,x - 2927 8E14 85 73 sta temp+1 - 2928 8E16 18 A5 72 69 04 85 + adw temp #4 ; center of the tank - 2929 8E21 A0 00 ldy #0 - 2930 8E23 B1 72 lda (temp),y - 2931 8E25 85 A3 sta OverTankDir ; not elegant!!! Reuse as height of tank flight - 2932 8E27 FloatDown - 2933 8E27 BD 19 44 lda ytankstable,x - 2934 8E2A C5 A3 cmp OverTankDir - 2935 8E2C B0 1D bcs OnGround - 2936 ; first erase old tank position - 2937 8E2E A9 01 85 AA mva #1 Erase - 2938 8E32 20 2C 6A jsr DrawTankNr - 2939 8E35 20 66 6C jsr DrawTankParachute - 2940 8E38 A9 00 85 AA mva #0 Erase - 2941 8E3C FE 19 44 inc ytankstable,x - 2942 ; then draw tank on new position - 2943 8E3F 20 2C 6A jsr DrawTankNr - 2944 8E42 20 66 6C jsr DrawTankParachute - 2945 8E45 20 89 5A jsr WaitOneFrame - 2946 8E48 4C 27 8E jmp FloatDown - 2947 8E4B OnGround - 2948 ; clear parachute - 2949 8E4B A9 01 85 AA mva #1 Erase - 2950 8E4F 20 66 6C jsr DrawTankParachute - 2951 8E52 A9 00 85 AA mva #0 Erase - 2952 8E56 20 71 5A jsr WaitForKeyRelease - 2953 ; and Soildown at the end (for correct mountaintable) - 2954 ; If tank did not fly at maximum altitude there is no need to soildown to much - 2955 8E59 A5 A2 lda FloatingAlt - 2956 8E5B C9 12 cmp #18 - 2957 8E5D F0 03 beq NotHighest - 2958 8E5F 20 89 8F jsr ClearScreenSoilRange - 2959 8E62 NotHighest - 2960 ; calculate range - 2961 8E62 20 6B 8E jsr CalculateSoildown - 2962 ; hide tanks and ... - 2963 8E65 20 F4 6E jsr SoilDown2 - 2964 8E68 A6 6C ldx TankNr - 2965 8E6A 60 rts - 2966 - 2967 8E6B CalculateSoildown - 2968 8E6B A6 6C ldx TankNr - 2969 8E6D 18 clc - 2970 8E6E BD 0D 44 lda XtankstableL,x - 2971 8E71 69 04 adc #4 - 2972 8E73 85 61 sta xdraw - 2973 8E75 BD 13 44 lda XtankstableH,x - 2974 8E78 69 00 adc #0 - 2975 8E7A 85 62 sta xdraw+1 - 2976 8E7C A9 04 85 B0 mva #$04 ExplosionRadius - 2977 8E80 20 0C 8F jsr CalculateExplosionRange - 2978 8E83 60 rts - 2979 .endp - 2980 - 2981 ; ------------------------------------------------- - 2982 8E84 .proc CheckCollisionWithTank - 2983 ; ------------------------------------------------- - 2984 ; Check collision with Tank :) - 2985 ; xdraw , ydraw - coordinates of the checked point - 2986 ; results: - 2987 ; HitFlag - $ff - hit ground, 0 - no hit, 1-6 - hit tank (index+1) - 2988 ; XHit , YHit - coordinates of hit - 2989 ; X - index of the hit tank - 2990 - 2991 8E84 A6 AE ldx NumberOfPlayers - 2992 8E86 CA dex - 2993 8E87 CheckCollisionWithTankLoop - 2994 8E87 BD AF 43 lda eXistenZ,x - 2995 8E8A F0 51 beq DeadTank - 2996 ; first we test top and bottom (same with and without shield!) - 2997 8E8C BD 19 44 lda ytankstable,x - 2998 8E8F C5 63 cmp ydraw ; check range - 2999 8E91 90 4A bcc BelowTheTank ;(ytankstable,ytankstable+3) - 3000 8E93 E9 03 sbc #3 ; hitbox height - 3001 8E95 C5 63 cmp ydraw - 3002 8E97 B0 44 bcs OverTheTank - 3003 ; with or without shield ? - 3004 - 3005 8E99 BD FD 43 lda ActiveDefenceWeapon,x - 3006 8E9C C9 25 cmp #ind_Mag_Deflector__ ; first shielded weapon - 3007 8E9E 90 04 bcc CheckCollisionWithNotShieldedTank - 3008 8EA0 C9 2A cmp #ind_Bouncy_Castle__+1 ; last shielded weapon - 3009 8EA2 90 3D bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) - 3010 - 3011 ;lda ShieldEnergy,x ; there is wrong method to check shield :) - 3012 ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) - 3013 - 3014 8EA4 CheckCollisionWithNotShieldedTank - 3015 8EA4 BD 13 44 lda xtankstableH,x - 3016 8EA7 C5 62 cmp xdraw+1 - 3017 8EA9 D0 05 bne @+ - 3018 8EAB BD 0D 44 lda xtankstableL,x - 3019 8EAE C5 61 cmp xdraw - 3020 @ - 3021 8EB0 B0 2B bcs LeftFromTheTank - 3022 ; add 8 double byte - 3023 ; now we use Y as low byte and A as high byte of checked position (right edge of tank) - 3024 ; it is tricky but fast and much shorter - 3025 8EB2 18 clc - 3026 8EB3 BD 0D 44 lda xtankstableL,x - 3027 8EB6 69 08 adc #TankWidth - 3028 8EB8 A8 tay - 3029 8EB9 BD 13 44 lda xtankstableH,x - 3030 8EBC 69 00 adc #0 - 3031 8EBE C5 62 cmp xdraw+1 - 3032 8EC0 D0 02 bne @+ - 3033 8EC2 C4 61 cpy xdraw - 3034 @ - 3035 8EC4 90 17 bcc RightFromTheTank - 3036 8EC6 TankHit - 3037 8EC6 E8 inx - 3038 8EC7 86 BF stx HitFlag ; index of hit tank+1 - 3039 8EC9 CA dex - 3040 8ECA A5 61 85 C1 A5 62 + mwa xdraw XHit - 3041 8ED2 A5 63 8D 5F 44 A5 + mwa ydraw YHit - 3042 8EDC 60 rts ; in X there is an index of the hit tank - 3043 8EDD RightFromTheTank - 3044 8EDD LeftFromTheTank - 3045 8EDD OverTheTank - 3046 8EDD BelowTheTank - 3047 8EDD DeadTank - 3048 8EDD CA dex - 3049 8EDE 10 A7 bpl CheckCollisionWithTankLoop - 3050 8EE0 60 rts - 3051 8EE1 CheckCollisionWithShieldedTank - 3052 ; now we use Y as low byte and A as high byte of checked position (left right edgs of shield) - 3053 ; it is tricky but fast and much shorter - 3054 8EE1 BD 0D 44 lda xtankstableL,x - 3055 8EE4 38 sec - 3056 8EE5 E9 04 sbc #4 ; 5 pixels more on left side - 3057 8EE7 A8 tay - 3058 8EE8 BD 13 44 lda xtankstableH,x - 3059 8EEB E9 00 sbc #0 - 3060 ; bmi ShieldOverLeftEdge ; I do not know whether to check it. Probably not :) !!! - 3061 8EED C5 62 cmp xdraw+1 - 3062 8EEF D0 02 bne @+ - 3063 8EF1 C4 61 cpy xdraw - 3064 @ - 3065 8EF3 B0 E8 bcs LeftFromTheTank - 3066 8EF5 98 tya ;add 16 double byte - 3067 8EF6 18 clc - 3068 8EF7 69 10 adc #TankWidth+4+4 - 3069 8EF9 A8 tay - 3070 8EFA BD 13 44 lda xtankstableH,x - 3071 8EFD 69 00 adc #0 - 3072 8EFF C5 62 cmp xdraw+1 - 3073 8F01 D0 02 bne @+ - 3074 8F03 C4 61 cpy xdraw - 3075 @ - 3076 8F05 90 D6 bcc RightFromTheTank - 3077 8F07 B0 BD bcs TankHit - 3078 .endp - 3079 ;-------------------------------------------------- - 3080 8F09 CalculateExplosionRange0 - 3081 ;-------------------------------------------------- - 3082 - 3083 ;the same as below, but without summing up - 3084 ;(for the first or single explosion) - 3085 - 3086 ;zero soil fall out ranges - 3087 8F09 20 89 8F jsr ClearScreenSoilRange - 3088 ;-------------------------------------------------- - 3089 8F0C .proc CalculateExplosionRange - 3090 ;-------------------------------------------------- - 3091 ;calculates total horizontal range of explosion by - 3092 ;"summing up" ranges of all separate explosions - 3093 - 3094 ; WeaponRangeRight = xdraw + ExplosionRadius - 3095 8F0C 18 clc - 3096 8F0D A5 61 lda xdraw - 3097 8F0F 65 B0 adc ExplosionRadius - 3098 8F11 8D 35 44 sta WeaponRangeRight - 3099 8F14 A5 62 lda xdraw+1 - 3100 8F16 69 00 adc #$00 - 3101 8F18 8D 36 44 sta WeaponRangeRight+1 - 3102 ; adw xdraw ExplosionRadius WeaponRangeRight ; Pozor! ExplosionRadius is one byte now - 3103 ; cpw WeaponRangeRight #screenwidth-1 - 3104 8F1B C9 01 cmp #>(screenwidth-1) - 3105 8F1D D0 05 bne @+ - 3106 8F1F AD 35 44 lda WeaponRangeRight - 3107 8F22 C9 3F cmp #<(screenwidth-1) - 3108 8F24 90 0A @ bcc NotOutOfTheScreenRight - 3109 8F26 A9 3F 8D 35 44 A9 + mwa #screenwidth-1 WeaponRangeRight - 3110 - 3111 8F30 NotOutOfTheScreenRight - 3112 ; WeaponRangeLeft = xdraw - ExplosionRadius - 3113 8F30 38 sec - 3114 8F31 A5 61 lda xdraw - 3115 8F33 E5 B0 sbc ExplosionRadius - 3116 8F35 8D 33 44 sta WeaponRangeLeft - 3117 8F38 A5 62 lda xdraw+1 - 3118 8F3A E9 00 sbc #$00 - 3119 8F3C 8D 34 44 sta WeaponRangeLeft+1 - 3120 ; sbw xdraw ExplosionRadius WeaponRangeLeft ; Pozor! ExplosionRadius is one byte now - 3121 ; lda WeaponRangeLeft+1 - 3122 8F3F 10 08 bpl NotOutOfTheScreenLeft - 3123 8F41 A9 00 lda #0 - 3124 8F43 8D 33 44 sta WeaponRangeLeft - 3125 8F46 8D 34 44 sta WeaponRangeLeft+1 - 3126 8F49 NotOutOfTheScreenLeft - 3127 - 3128 8F49 A5 D3 CD 34 44 D0 + cpw RangeLeft WeaponRangeLeft - 3129 8F55 90 0A bcc CheckRangeRight - 3130 8F57 AD 33 44 85 D2 AD + mwa WeaponRangeLeft RangeLeft - 3131 8F61 CheckRangeRight - 3132 8F61 A5 D5 CD 36 44 D0 + cpw RangeRight WeaponRangeRight - 3133 8F6D B0 0A bcs RangesChecked - 3134 8F6F AD 35 44 85 D4 AD + mwa WeaponRangeRight RangeRight - 3135 8F79 RangesChecked - 3136 - 3137 8F79 60 rts - 3138 .endp - 3139 - 3140 ;-------------------------------------------------- - 3141 8F7A .proc SetFullScreenSoilRange - 3142 ; whole screen in range of soil down - 3143 ;-------------------------------------------------- - 3144 8F7A A9 00 lda #0 - 3145 8F7C 85 D2 sta RangeLeft - 3146 8F7E 85 D3 sta RangeLeft+1 - 3147 8F80 A9 40 85 D4 A9 01 + mwa #screenwidth RangeRight - 3148 8F88 60 rts - 3149 .endp - 3150 ;-------------------------------------------------- - 3151 8F89 .proc ClearScreenSoilRange - 3152 ; cleanup of the soil fall down ranges (left and right) - 3153 ;-------------------------------------------------- - 3154 8F89 A9 40 85 D2 A9 01 + mwa #screenwidth RangeLeft - 3155 8F91 A9 00 lda #0 - 3156 8F93 85 D4 sta RangeRight - 3157 8F95 85 D5 sta RangeRight+1 - 3158 8F97 60 rts - 3159 .endp - 3160 ;-------------------------------------------------- - 3161 8F98 .proc DecreaseWeaponBeforeShoot - 3162 ;-------------------------------------------------- - 3163 8F98 A6 6C ldx TankNr - 3164 8F9A BD F7 43 lda ActiveWeapon,x - 3165 8F9D 20 A4 8F jsr DecreaseWeapon - 3166 ; and here we have amount of possessed ammo for given weapon - 3167 8FA0 8D 09 44 sta WeaponDepleted - 3168 8FA3 60 rts - 3169 .endp - 3170 - 3171 ;-------------------------------------------------- - 3172 8FA4 .proc DecreaseWeapon - 3173 ; in: A: Weapon number, TankNr - 3174 ; out: A: number of shells left, Y: weapon number - 3175 ; decreases 1 bullet from a weapon(A) of tank(TankNr) - 3176 ;-------------------------------------------------- - 3177 8FA4 20 B3 8F jsr HowManyBullets - 3178 8FA7 F0 09 beq noBullets ; no bullets - no decreasing (additional check) - 3179 8FA9 C0 00 cpy #0 - 3180 8FAB F0 05 beq defaultWeapon ; no decreasing Baby Missile - 3181 8FAD 38 sec - 3182 8FAE E9 01 sbc #1 - 3183 8FB0 91 98 sta (weaponPointer),y ; we have good values after HowManyBullets - 3184 8FB2 defaultWeapon - 3185 8FB2 noBullets - 3186 8FB2 60 rts - 3187 .endp - 3188 - 3189 ;-------------------------------------------------- - 3190 8FB3 .proc HowManyBullets - 3191 ; in: A <-- Weapon number, TankNr - 3192 ; out: A <-- How many bullets in the weapon, Y: weapon number - 3193 ; how many bullets weapon of tank(TankNr) has, Result in A - 3194 ;-------------------------------------------------- - 3195 8FB3 A8 tay - 3196 8FB4 A6 6C ldx TankNr - 3197 8FB6 BD F1 5A lda TanksWeaponsTableL,x - 3198 8FB9 85 98 sta weaponPointer - 3199 8FBB BD F7 5A lda TanksWeaponsTableH,x - 3200 8FBE 85 99 sta weaponPointer+1 - 3201 - 3202 8FC0 B1 98 lda (weaponPointer),y ; and we have number of bullets in A - 3203 8FC2 60 rts - 3204 .endp - 3205 - 3206 - 3207 .ENDIF - 3208 - 352 ;---------------------------------------------- - 353 8FC3 icl 'ai.asm' -Source: ai.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 ; artificial intelligence of tanks goes here! - 4 ; in A there is a level of tank's intelligence - 5 ; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all) - 6 ; at the moment (2003-08-15) I have no idea how - 7 ; to program better opponents, but moron is easy - - 8 ; - shoots random direction and force - 9 ; greeeting to myself 10 years older in 2013-11-09... still no idea - 10 - 11 - 12 ;---------------------------------------------- - 13 8FC3 .proc ArtificialIntelligence ; - 14 ; A - skill of the TankNr (in X) - 15 ; returns shoot energy and angle in - 16 ; ForceTable/L/H and AngleTable - 17 ;---------------------------------------------- - 18 8FC3 0A asl - 19 8FC4 A8 tay - 20 8FC5 88 88 :2 dey ;credit KK - 21 8FC7 B9 F7 8F lda AIRoutines+1,y - 22 8FCA 48 pha - 23 8FCB B9 F6 8F lda AIRoutines,y - 24 8FCE 48 pha - 25 ; it's no necessary - PrepareAIShoot is next proc :) - 26 ; jsr PrepareAIShoot - 27 ; rts - 28 .endp - 29 ;---------------------------------------------- - 30 8FCF .proc PrepareAIShoot - 31 ; create low precision table of positions - 32 ; by dividing positions by 4 - 33 8FCF A0 05 ldy #MaxPlayers-1 - 34 8FD1 loop - 35 8FD1 B9 0D 44 lda xtankstableL,y - 36 8FD4 85 72 sta temp - 37 8FD6 B9 13 44 lda xtankstableH,y - 38 8FD9 85 73 sta temp+1 - 39 ;= /4 - 40 8FDB 46 73 66 72 46 73 + :2 lsrw temp - 41 8FE3 A5 72 lda temp - 42 8FE5 99 1F 44 sta LowResDistances,y - 43 8FE8 88 dey - 44 8FE9 10 E6 bpl loop - 45 - 46 ; common values used in AI routines - 47 ; address of weapons table (for future use) - 48 8FEB WepTableToTemp - 49 8FEB BD F1 5A lda TanksWeaponsTableL,x - 50 8FEE 85 72 sta temp - 51 8FF0 BD F7 5A lda TanksWeaponsTableH,x - 52 8FF3 85 73 sta temp+1 - 53 8FF5 60 rts - 54 .endp - 55 ;---------------- - 56 8FF6 AIRoutines - 57 8FF6 1C 90 .word Moron-1 - 58 8FF8 3D 90 .word Shooter-1 ;Shooter - 59 8FFA CD 90 .word Poolshark-1 ;Poolshark - 60 8FFC 8E 91 .word Tosser-1 ;Tosser - 61 8FFE B7 91 .word Chooser-1 ;Chooser - 62 9000 05 92 .word Spoiler-1 ;Spoiler - 63 9002 53 92 .word Cyborg-1 ;Cyborg - 64 9004 05 90 .word Unknown-1 ;Unknown - 65 - 66 ;---------------------------------------------- - 67 9006 .proc Unknown - 68 ; random robotank (from Poolshark to Cyborg) - 69 9006 randomize 4 13 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9006 ?rand - 7 9006 AD 1B D4 lda random - 8 9009 C9 04 cmp #4 ;floor - 9 900B 90 F9 bcc ?rand - 10 900D C9 0E cmp #13+1 ;ceiling - 11 900F B0 F5 bcs ?rand -Source: ai.asm - 70 9011 29 FE and #%11111110 - 71 9013 A8 tay - 72 9014 B9 F7 8F lda AIRoutines+1,y - 73 9017 48 pha - 74 9018 B9 F6 8F lda AIRoutines,y - 75 901B 48 pha - 76 901C 60 rts - 77 .endp - 78 ;---------------------------------------------- - 79 901D .proc Moron - 80 901D 20 3D 59 jsr RandomizeAngle - 81 9020 85 D6 sta NewAngle - 82 9022 A9 50 8D E4 48 A9 + mwa #80 RandBoundaryLow - 83 902C A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh - 84 9036 20 45 59 jsr RandomizeForce - 85 ; choose the best weapon - 86 9039 A0 1F ldy #ind_Buy_me_________+1 ; if the cheat is active it will fire the BFG :) - 87 903B 4C F4 95 jmp ChooseBestOffensive.NotFromAll - 88 ;rts - 89 .endp - 90 ;---------------------------------------------- - 91 903E .proc Shooter - 92 - 93 903E BD CC 48 lda PreviousAngle,x - 94 9041 1D D2 48 ora PreviousEnergyL,x - 95 9044 1D DE 48 ora PreviousEnergyH,x - 96 9047 F0 2D beq firstShoot - 97 - 98 9049 BD CC 48 lda PreviousAngle,x - 99 904C C9 5A cmp #90 - 100 904E B0 09 bcs shootingLeftAtThisMomentOfTime - 101 ; shooting right at this moment of time - 102 9050 38 sec - 103 9051 E9 05 sbc #5 - 104 9053 C9 0A cmp #10 - 105 9055 B0 09 bcs @+ ;not smaller than 10 - 106 9057 90 1D bcc firstShoot ; GET THE aim againg - 107 - 108 9059 shootingLeftAtThisMomentOfTime - 109 - 110 9059 18 clc - 111 905A 69 05 adc #5 - 112 905C C9 AA cmp #170 ; maximum shooter angle - 113 905E B0 16 bcs firstShoot - 114 @ - 115 9060 85 D6 sta NewAngle - 116 - 117 9062 38 sec - 118 9063 BD D2 48 lda PreviousEnergyL,x - 119 9066 E9 05 sbc #5 - 120 9068 9D D9 43 sta ForceTableL,x - 121 906B BD DE 48 lda PreviousEnergyH,x - 122 906E E9 00 sbc #0 - 123 9070 9D DF 43 sta ForceTableH,x - 124 9073 4C B7 90 jmp endo - 125 - 126 9076 firstShoot - 127 ; compare the x position with the middle of the screen - 128 9076 BD 13 44 lda xTanksTableH,x - 129 9079 C9 00 cmp #>(screenwidth/2) - 130 907B D0 05 bne @+ - 131 907D BD 0D 44 lda xTanksTableL,x - 132 9080 C9 A0 cmp #<(screenwidth/2) - 133 9082 90 0F @ bcc tankIsOnTheRight - 134 - 135 ; enemy tank is on the left - 136 9084 randomize 95 125 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9084 ?rand - 7 9084 AD 1B D4 lda random - 8 9087 C9 5F cmp #95 ;floor - 9 9089 90 F9 bcc ?rand - 10 908B C9 7E cmp #125+1 ;ceiling - 11 908D B0 F5 bcs ?rand -Source: ai.asm - 137 908F 85 D6 sta NewAngle - 138 9091 D0 0D bne forceNow - 139 - 140 9093 tankIsOnTheRight - 141 9093 randomize 55 85 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9093 ?rand - 7 9093 AD 1B D4 lda random - 8 9096 C9 37 cmp #55 ;floor - 9 9098 90 F9 bcc ?rand - 10 909A C9 56 cmp #85+1 ;ceiling - 11 909C B0 F5 bcs ?rand -Source: ai.asm - 142 909E 85 D6 sta NewAngle - 143 - 144 90A0 forceNow - 145 90A0 A9 64 8D E4 48 A9 + mwa #100 RandBoundaryLow - 146 90AA A9 20 8D E6 48 A9 + mwa #800 RandBoundaryHigh - 147 ;ldx TankNr ;this is possibly not necessary - 148 90B4 20 45 59 jsr RandomizeForce - 149 - 150 90B7 endo - 151 ;ldx TankNr ;this is possibly not necessary - 152 90B7 20 79 59 jsr RandomizeForce.LimitForce - 153 90BA A5 D6 lda NewAngle - 154 90BC 9D CC 48 sta PreviousAngle,x - 155 90BF BD D9 43 lda ForceTableL,x - 156 90C2 9D D2 48 sta PreviousEnergyL,x - 157 90C5 BD DF 43 lda ForceTableH,x - 158 90C8 9D DE 48 sta PreviousEnergyH,x - 159 - 160 ; choose the best weapon - 161 - 162 90CB 4C F2 95 jmp ChooseBestOffensive - 163 ;rts - 164 .endp - 165 ;---------------------------------------------- - 166 90CE .proc Poolshark - 167 90CE 20 35 91 jsr UseBatteryOrFlag - 168 ; defensives - 169 90D1 20 60 91 jsr PoolsharkDefensives - 170 90D4 firstShoot - 171 ;find nearest tank neighbour - 172 90D4 20 C0 92 jsr FindBestTarget2 - 173 90D7 F0 0F beq EnemyOnLeft - 174 ; calculate index to shotangle table - 175 ; in temp2 we have x distance divided by 8 - 176 90D9 A5 74 lda temp2 - 177 90DB 4A 4A 4A :3 lsr @ - 178 90DE 29 07 and #%00000111 - 179 90E0 18 clc - 180 90E1 69 08 adc #8 - 181 90E3 8D E8 48 sta AngleTablePointer - 182 90E6 D0 0C bne AngleIsSet - 183 90E8 EnemyOnLeft - 184 90E8 A5 74 lda temp2 - 185 90EA 4A 4A 4A :3 lsr @ - 186 90ED 29 07 and #%00000111 - 187 90EF 49 07 eor #%00000111 - 188 90F1 8D E8 48 sta AngleTablePointer - 189 90F4 AngleIsSet - 190 - 191 90F4 randomize 0 8 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 90F4 ?rand - 7 90F4 AD 1B D4 lda random - 8 90F7 C9 00 cmp #0 ;floor - 9 90F9 90 F9 bcc ?rand - 10 90FB C9 09 cmp #8+1 ;ceiling - 11 90FD B0 F5 bcs ?rand -Source: ai.asm - 192 90FF AC E8 48 ldy AngleTablePointer - 193 9102 18 clc - 194 9103 79 25 91 adc AngleTable,y - 195 9106 85 D6 sta NewAngle - 196 - 197 9108 forceNow - 198 9108 A9 2C 8D E4 48 A9 + mwa #300 RandBoundaryLow - 199 9112 A9 BC 8D E6 48 A9 + mwa #700 RandBoundaryHigh - 200 911C A6 6C ldx TankNr - 201 911E 20 45 59 jsr RandomizeForce - 202 - 203 9121 endo - 204 ; choose the best weapon - 205 - 206 9121 20 F2 95 jsr ChooseBestOffensive - 207 9124 60 rts - 208 - 209 ;---------------------------------------------- - 210 9125 AngleTable ; 16 bytes ;ba w $348b L$3350 - 211 9125 6A 72 7A 82 8A 92 + .by 106,114,122,130,138,146,154,162 - 212 912D 12 1A 22 2B 32 3A + .by 18,26,34,43,50,58,66,74 - 213 .endp - 214 ;---------------------------------------------- - 215 9135 .proc UseBatteryOrFlag - 216 9135 20 45 91 jsr UseBattery ; as subroutine for reuse in AutoDefense - 217 ; if very low energy and no battery then use White Flag - 218 9138 BD A2 43 lda Energy,x - 219 913B C9 05 cmp #5 - 220 913D B0 05 bcs EnoughEnergy - 221 ; lower than 5 units - white flag - 222 913F A9 20 lda #ind_White_Flag_____ - 223 9141 9D FD 43 sta ActiveDefenceWeapon,x - 224 9144 EnoughEnergy - 225 9144 60 rts - 226 .endp - 227 ; - 228 9145 .proc UseBattery - 229 ; if low energy ten use battery - 230 9145 BD A2 43 lda Energy,x - 231 9148 C9 1E cmp #30 - 232 914A B0 13 bcs EnoughEnergy - 233 ; lower than 30 units - check battery - 234 914C A0 21 ldy #ind_Battery________ - 235 914E B1 72 lda (temp),y ; has address of TanksWeaponsTable - 236 9150 F0 0D beq NoBatteries - 237 ; we have batteries - use one - 238 9152 38 sec - 239 9153 E9 01 sbc #1 - 240 9155 91 72 sta (temp),y - 241 9157 A9 63 lda #99 - 242 9159 9D A2 43 sta Energy,x - 243 915C 20 2A 58 jsr MaxForceCalculate - 244 915F EnoughEnergy - 245 915F NoBatteries - 246 915F 60 rts - 247 .endp - 248 ;---------------------------------------------- - 249 9160 .proc PoolsharkDefensives - 250 ; use best defensive :) - 251 ; but not allways - 252 9160 randomize 1 3 -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9160 ?rand - 7 9160 AD 1B D4 lda random - 8 9163 C9 01 cmp #1 ;floor - 9 9165 90 F9 bcc ?rand - 10 9167 C9 04 cmp #3+1 ;ceiling - 11 9169 B0 F5 bcs ?rand -Source: ai.asm - 253 916B C9 01 cmp #1 - 254 916D D0 1F bne NoUseDefensive - 255 ; first check check if any is in use - 256 916F BD FD 43 lda ActiveDefenceWeapon,x - 257 9172 D0 1A bne DefensiveInUse - 258 9174 A0 2A ldy #last_real_defensive+1 ;the last defensive weapon - 259 @ - 260 9176 88 dey - 261 9177 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - 262 9179 F0 13 beq NoUseDefensive - 263 917B B1 72 lda (temp),y ; has address of TanksWeaponsTable - 264 917D F0 F7 beq @- - 265 ; decrease in inventory - 266 917F 38 sec - 267 9180 E9 01 sbc #1 - 268 9182 91 72 sta (temp),y ; has address of TanksWeaponsTable - 269 ; activate defensive weapon - 270 9184 98 tya ; number of selectet defensive weapon - 271 9185 9D FD 43 sta ActiveDefenceWeapon,x - 272 9188 B9 1A 60 lda DefensiveEnergy,y - 273 918B 9D A8 43 sta ShieldEnergy,x - 274 918E NoUseDefensive - 275 918E DefensiveInUse - 276 918E 60 rts - 277 .endp - 278 ;---------------------------------------------- - 279 918F .proc Tosser - 280 918F 20 35 91 jsr UseBatteryOrFlag - 281 ; use best defensive :) - 282 9192 20 98 91 jsr TosserDefensives - 283 ; Toosser is like Poolshark but allways uses defensives - 284 9195 4C D4 90 jmp Poolshark.firstShoot - 285 .endp - 286 ;---------------------------------------------- - 287 9198 .proc TosserDefensives - 288 ; use best defensive :) - 289 ; allways - 290 ; first check check if any is in use - 291 9198 BD FD 43 lda ActiveDefenceWeapon,x - 292 919B D0 1A bne DefensiveInUse - 293 919D A0 2A ldy #last_real_defensive+1 ;the last defensive weapon - 294 @ - 295 919F 88 dey - 296 91A0 C0 22 cpy #ind_Hovercraft_____ ;first defensive weapon (White Flag, Battery and Hovercraft - never use) - 297 91A2 F0 13 beq NoUseDefensive - 298 91A4 B1 72 lda (temp),y ; has address of TanksWeaponsTable - 299 91A6 F0 F7 beq @- - 300 ; decrease in inventory - 301 91A8 38 sec - 302 91A9 E9 01 sbc #1 - 303 91AB 91 72 sta (temp),y ; has address of TanksWeaponsTable - 304 ; activate defensive weapon - 305 91AD 98 tya ; number of selectet defensive weapon - 306 91AE 9D FD 43 sta ActiveDefenceWeapon,x - 307 91B1 B9 1A 60 lda DefensiveEnergy,y - 308 91B4 9D A8 43 sta ShieldEnergy,x - 309 91B7 DefensiveInUse - 310 91B7 NoUseDefensive - 311 91B7 60 rts - 312 .endp - 313 ;---------------------------------------------- - 314 91B8 .proc Chooser - 315 ; like cyborg but more randomizing force - 316 91B8 20 35 91 jsr UseBatteryOrFlag - 317 ; use defensives like Tosser - 318 91BB 20 98 91 jsr TosserDefensives - 319 ; now select best target - 320 91BE A9 00 lda #$00 ; no prefer humans - 321 91C0 20 81 92 jsr FindBestTarget3 - 322 91C3 8C 31 44 sty TargetTankNr - 323 ; aiming - 324 91C6 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 325 - 326 ; choose the best weapon - 327 91C9 20 F2 95 jsr ChooseBestOffensive - 328 - 329 ; randomizing force +-100 - 330 91CC 38 A5 A4 E9 64 8D + sbw Force #100 RandBoundaryLow - 331 91DB 10 0A bpl NotNegativeEnergy - 332 91DD A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow - 333 91E7 NotNegativeEnergy - 334 91E7 18 A5 A4 69 64 8D + adw Force #100 RandBoundaryHigh - 335 91F6 20 45 59 jsr RandomizeForce - 336 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - 337 91F9 20 08 96 jsr GetDistance - 338 91FC C9 06 cmp #6 ; 24/4 - 339 91FE B0 05 bcs HighForce - 340 9200 A9 00 lda #ind_Baby_Missile___ - 341 9202 9D F7 43 sta ActiveWeapon,x - 342 9205 HighForce - 343 9205 60 rts - 344 .endp - 345 ;---------------------------------------------- - 346 9206 .proc Spoiler - 347 ; like cyborg but little randomizing force - 348 9206 20 35 91 jsr UseBatteryOrFlag - 349 ; use defensives like Tosser - 350 9209 20 98 91 jsr TosserDefensives - 351 ; now select best target - 352 920C A9 00 lda #$00 ; no prefer humans - 353 920E 20 81 92 jsr FindBestTarget3 - 354 9211 8C 31 44 sty TargetTankNr - 355 ; aiming - 356 9214 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 357 - 358 ; choose the best weapon - 359 9217 20 F2 95 jsr ChooseBestOffensive - 360 - 361 ; randomizing force +-50 - 362 921A 38 A5 A4 E9 32 8D + sbw Force #50 RandBoundaryLow - 363 9229 10 0A bpl NotNegativeEnergy - 364 922B A9 01 8D E4 48 A9 + mwa #1 RandBoundaryLow - 365 9235 NotNegativeEnergy - 366 9235 18 A5 A4 69 32 8D + adw Force #50 RandBoundaryHigh - 367 9244 20 45 59 jsr RandomizeForce - 368 ; if target distance lower than 24 - set weapon to Baby Missile (for security :) - 369 9247 20 08 96 jsr GetDistance - 370 924A C9 06 cmp #6 ; 24/4 - 371 924C B0 05 bcs HighForce - 372 924E A9 00 lda #ind_Baby_Missile___ - 373 9250 9D F7 43 sta ActiveWeapon,x - 374 9253 HighForce - 375 9253 60 rts - 376 .endp - 377 ;---------------------------------------------- - 378 9254 .proc Cyborg - 379 9254 20 35 91 jsr UseBatteryOrFlag - 380 ; use defensives like Tosser - 381 9257 20 98 91 jsr TosserDefensives - 382 ; now select best target - 383 925A A9 64 lda #100 ; prefer humans - 384 925C 20 81 92 jsr FindBestTarget3 - 385 925F 8C 31 44 sty TargetTankNr - 386 ; aiming - 387 9262 20 06 93 jsr TakeAim ; direction still in A (0 - left, >0 - right) - 388 - 389 ; choose the best weapon - 390 9265 A0 04 ldy #ind_Nuke___________+1 - 391 9267 20 F4 95 jsr ChooseBestOffensive.NotFromAll - 392 - 393 926A A5 A4 lda Force - 394 926C 9D D9 43 sta ForceTableL,x - 395 926F A5 A5 lda Force+1 - 396 9271 9D DF 43 sta ForceTableH,x - 397 ; if target distance lower than 32 - set weapon to Baby Missile (for security :) - 398 9274 20 08 96 jsr GetDistance - 399 9277 C9 08 cmp #8 ;32/4 - 400 9279 B0 05 bcs HighForce - 401 927B A9 00 lda #ind_Baby_Missile___ - 402 927D 9D F7 43 sta ActiveWeapon,x - 403 9280 HighForce - 404 9280 60 rts - 405 .endp - 406 - 407 ;---------------------------------------------- - 408 9281 .proc FindBestTarget3 - 409 ; find target with lowest energy - 410 ; X - shooting tank number - 411 ; A - 100 - prefer humans , 0 - equality :) - 412 ; returns target tank number in Y and - 413 ; direcion of shoot in A (0 - left, >0 - right) - 414 ;---------------------------------------------- - 415 9281 85 A2 sta PreferHumansFlag - 416 ; jsr MakeLowResDistances - 417 9283 A9 CA lda #202 - 418 9285 85 74 sta temp2 ; max possible energy - 419 9287 A9 00 lda #0 - 420 9289 85 7E sta tempor2 ; direction of shoot - 421 ;ldx TankNr - 422 928B A4 AE ldy NumberOfPlayers - 423 928D 88 dey - 424 - 425 928E loop01 - 426 928E C4 6C cpy TankNr - 427 9290 F0 26 beq skipThisPlayer - 428 9292 B9 AF 43 lda eXistenZ,y - 429 9295 F0 21 beq skipThisPlayer - 430 - 431 9297 B9 39 41 lda skilltable,y - 432 929A F0 02 beq ItIsHuman - 433 929C A5 A2 lda PreferHumansFlag - 434 929E ItIsHuman - 435 929E 18 clc - 436 929F 79 A2 43 adc Energy,y ; if robotank energy=energy+100 (100 or 0 from PreferHumansFlag) - 437 92A2 C5 74 cmp temp2 ; lowest - 438 92A4 B0 12 bcs lowestIsLower - 439 92A6 85 74 sta temp2 - 440 92A8 84 75 sty temp2+1 ; number of the closest tank - 441 92AA A9 00 85 7E mva #0 tempor2 - 442 92AE BD 1F 44 lda LowResDistances,x - 443 92B1 D9 1F 44 cmp LowResDistances,y - 444 92B4 B0 02 bcs EnemyOnTheLeft - 445 ; enemy on right - 446 92B6 E6 7E inc tempor2 ; set direction to right - 447 - 448 92B8 EnemyOnTheLeft - 449 92B8 lowestIsLower - 450 92B8 skipThisPlayer - 451 92B8 88 dey - 452 92B9 10 D3 bpl loop01 - 453 ; now we have number of the farthest tank in temp2+1 - 454 ; and direction (0 - left, >0 - right) in tempor2 - 455 ; let's move them to registers - 456 ; in temp2 we have energy of target - 457 92BB A4 75 ldy temp2+1 - 458 92BD A5 7E lda tempor2 - 459 92BF 60 rts - 460 .endp - 461 ;---------------------------------------------- - 462 92C0 .proc FindBestTarget2 - 463 ; find nearest tank neighbour - 464 ; X - shooting tank number - 465 ; returns target tank number in Y and - 466 ; direcion of shoot in A (0 - left, >0 - right) - 467 ;---------------------------------------------- - 468 ; jsr MakeLowResDistances - 469 92C0 A9 FF 85 74 mva #$ff temp2 ; min possible distance - 470 92C4 A9 00 85 7E mva #0 tempor2 ; direction of shoot - 471 - 472 ;ldx TankNr - 473 92C8 A4 AE ldy NumberOfPlayers - 474 92CA 88 dey - 475 - 476 92CB loop01 - 477 92CB C4 6C cpy TankNr - 478 92CD F0 2F beq skipThisPlayer - 479 92CF B9 AF 43 lda eXistenZ,y - 480 92D2 F0 2A beq skipThisPlayer - 481 - 482 92D4 BD 1F 44 lda LowResDistances,x - 483 92D7 D9 1F 44 cmp LowResDistances,y - 484 92DA B0 13 bcs EnemyOnTheLeft - 485 ;enemy on the right - 486 92DC 38 sec - 487 92DD B9 1F 44 lda LowResDistances,y - 488 92E0 FD 1F 44 sbc LowResDistances,x - 489 92E3 C5 74 cmp temp2 ; lowest - 490 92E5 B0 17 bcs lowestIsLower - 491 92E7 85 74 sta temp2 - 492 92E9 84 75 sty temp2+1 ; number of the closest tank - 493 92EB E6 7E inc tempor2 ; set direction to right - 494 92ED D0 0F bne lowestIsLower - 495 - 496 92EF EnemyOnTheLeft - 497 92EF 38 sec - 498 92F0 BD 1F 44 lda LowResDistances,x - 499 92F3 F9 1F 44 sbc LowResDistances,y - 500 92F6 C5 74 cmp temp2 ; lowest - 501 92F8 B0 04 bcs lowestIsLower - 502 92FA 85 74 sta temp2 - 503 92FC 84 75 sty temp2+1 ; number of the closest tank - 504 - 505 92FE lowestIsLower - 506 92FE skipThisPlayer - 507 92FE 88 dey - 508 92FF 10 CA bpl loop01 - 509 ; now we have number of the closest tank in temp2+1 - 510 ; and direction (0 - left, >0 - right) in tempor2 - 511 ; let's move them to registers - 512 ; in temp2 we have x distance divided by 8 - 513 9301 A4 75 ldy temp2+1 - 514 9303 A5 7E lda tempor2 - 515 9305 60 rts - 516 .endp - 517 - 518 ;---------------------------------------------- - 519 9306 .proc TakeAim - 520 ; targeting the tank number TargetTankNr (and Y) - 521 ; A (and tempor2) - direction from shooting tank (0 - left, >0 - right) - 522 ; returns angle and power of shoot tank X (TankNr) - 523 ; in the appropriate variables (Angle and Force) - 524 ;---------------------------------------------- - 525 9306 BD F7 43 lda ActiveWeapon,x - 526 9309 48 pha ; store active weapon - 527 930A A9 FF 8D 32 44 mva #$ff SecondTryFlag - 528 ; set initial Angle and Force values - 529 930F AD 41 41 lda OptionsTable+2 ; selected gravity - 530 9312 0A asl - 531 9313 A8 tay - 532 ; force correction - lower tank Y position - higher possible force - 533 9314 38 sec - 534 9315 A9 C8 lda #screenheight - 535 9317 FD 19 44 sbc Ytankstable,x - 536 931A 85 74 sta temp2 - 537 931C 18 clc - 538 931D B9 EA A2 lda AIForceTable,y - 539 9320 8D E4 48 sta RandBoundaryLow - 540 9323 65 74 adc temp2 - 541 9325 8D E6 48 sta RandBoundaryHigh - 542 9328 B9 EB A2 lda AIForceTable+1,y - 543 932B 8D E5 48 sta RandBoundaryLow+1 - 544 932E 69 00 adc #0 - 545 9330 8D E7 48 sta RandBoundaryHigh+1 - 546 9333 20 45 59 jsr RandomizeForce - 547 9336 RepeatAim - 548 9336 20 96 59 jsr Table2Force - 549 ; wind correction 90+(wind/8) - 550 9339 A5 CE 85 74 A5 CF + mwa Wind temp2 - 551 9341 46 75 66 74 46 75 + :7 lsrw temp2 - 552 935D 18 clc - 553 935E A9 5A lda #90 - 554 9360 65 74 adc temp2 - 555 9362 85 D6 sta NewAngle - 556 ; set virtual weapon :) - 557 9364 A9 00 lda #ind_Baby_Missile___ - 558 9366 9D F7 43 sta ActiveWeapon,x - 559 ; now we have initial valuses - 560 9369 A9 C0 85 97 mva #%11000000 TestFlightFlag - 561 ; check targeting direction - 562 936D A5 7E lda tempor2 - 563 936F F0 03 4C 06 94 jne AimingLeft - 564 9374 AimingRight - 565 ; make test Shoot (Flight) - 566 9374 20 7E 94 jsr SetStartAndFlight - 567 9377 A5 BF lda HitFlag - 568 9379 F0 29 beq NoHitInFirstLoopR ; impossible :) - 569 937B 30 08 bmi GroundHitInFirstLoopR - 570 937D TankHitInFirstLoopR - 571 ; tank hit, but which tank? - 572 ; it's our target or not? - 573 937D A4 BF ldy HitFlag - 574 937F 88 dey - 575 9380 CC 31 44 cpy TargetTankNr - 576 9383 F0 28 beq EndOfFirstLoopR ; it's our target! - 577 ; if it's another tank then check position like ground hit - 578 9385 GroundHitInFirstLoopR - 579 ; checking only x position of hit - 580 9385 AC 31 44 ldy TargetTankNr - 581 9388 B9 13 44 lda xTanksTableH,y - 582 938B C5 C2 cmp XHit+1 - 583 938D D0 05 bne @+ - 584 938F B9 0D 44 lda xTanksTableL,y - 585 9392 C5 C1 cmp XHit - 586 @ - 587 9394 B0 15 bcs HitOnRightSideOfTargetR - 588 ; continue targeting - 589 9396 18 clc - 590 9397 A5 D6 lda NewAngle - 591 9399 69 05 adc #5 ; 5 deg to right - 592 939B C9 A0 cmp #(180-20) - 593 ; bcs EndOfFirstLoopR ; if angle 180-20 or higher - 594 939D B0 4F bcs AimSecondTry - 595 939F 85 D6 sta NewAngle - 596 93A1 4C 74 93 jmp AimingRight - 597 93A4 NoHitInFirstLoopR - 598 ; Angle 5 deg to left and end loop - 599 93A4 38 sec - 600 93A5 A5 D6 lda NewAngle - 601 93A7 E9 05 sbc #5 - 602 93A9 85 D6 sta NewAngle - 603 93AB HitOnRightSideOfTargetR - 604 93AB C6 D6 dec NewAngle - 605 93AD EndOfFirstLoopR - 606 93AD A9 05 85 76 mva #5 modify ; set counter (5 turns) - 607 93B1 SecondLoopR - 608 ; make test Shoot (Flight) - 609 93B1 20 7E 94 jsr SetStartAndFlight - 610 93B4 A5 BF lda HitFlag - 611 93B6 F0 2F beq NoHitInSecondLoopR ; impossible :) - 612 93B8 30 08 bmi GroundHitInSecondLoopR - 613 93BA TankHitInSecondLoopR - 614 ; tank hit, but which tank? - 615 ; it's our target or not? - 616 93BA A4 BF ldy HitFlag - 617 93BC 88 dey - 618 93BD CC 31 44 cpy TargetTankNr - 619 93C0 F0 27 beq EndOfSecondLoopR ; it's our target! - 620 ; if it's another tank then check position like ground hit - 621 93C2 GroundHitInSecondLoopR - 622 ; checking only x position of hit - 623 93C2 AC 31 44 ldy TargetTankNr - 624 93C5 B9 13 44 lda xTanksTableH,y - 625 93C8 C5 C2 cmp XHit+1 - 626 93CA D0 05 bne @+ - 627 93CC B9 0D 44 lda xTanksTableL,y - 628 93CF C5 C1 cmp XHit - 629 @ - 630 93D1 90 09 bcc HitOnLeftSideOfTargetR - 631 ; continue targeting - 632 93D3 C6 D6 dec NewAngle ; 1 deg to left - 633 93D5 C6 76 dec modify ; max 5 turns - 634 93D7 F0 10 beq EndOfSecondLoopR - 635 93D9 4C B1 93 jmp SecondLoopR - 636 93DC HitOnLeftSideOfTargetR - 637 ; decrease energy (a little) - 638 93DC 38 A5 A4 E9 05 85 + sbw Force #5 - 639 93E7 NoHitInSecondLoopR - 640 ; Angle 1 deg to right and end loop - 641 93E7 E6 D6 inc NewAngle - 642 93E9 EndOfSecondLoopR - 643 93E9 EndOfAim - 644 93E9 68 pla ; and restore active weapon - 645 93EA 9D F7 43 sta ActiveWeapon,x - 646 93ED 60 rts - 647 - 648 93EE AimSecondTry - 649 93EE 2C 32 44 bit SecondTryFlag - 650 93F1 10 F6 bpl EndOfAim ; closest RTS - 651 93F3 EE 32 44 inc SecondTryFlag - 652 93F6 A9 E8 lda #<1000 - 653 93F8 9D D9 43 sta ForceTableL,x - 654 93FB A9 03 lda #>1000 - 655 93FD 9D DF 43 sta ForceTableH,x - 656 9400 20 79 59 jsr RandomizeForce.LimitForce - 657 9403 4C 36 93 jmp RepeatAim - 658 - 659 9406 AimingLeft - 660 ; make test Shoot (Flight) - 661 9406 20 7E 94 jsr SetStartAndFlight - 662 9409 A5 BF lda HitFlag - 663 940B F0 29 beq NoHitInFirstLoopL ; impossible :) - 664 940D 30 08 bmi GroundHitInFirstLoopL - 665 940F TankHitInFirstLoopL - 666 ; tank hit, but which tank? - 667 ; it's our target or not? - 668 940F A4 BF ldy HitFlag - 669 9411 88 dey - 670 9412 CC 31 44 cpy TargetTankNr - 671 9415 F0 28 beq EndOfFirstLoopL ; it's our target! - 672 ; if it's another tank then check position like ground hit - 673 9417 GroundHitInFirstLoopL - 674 ; checking only x position of hit - 675 9417 AC 31 44 ldy TargetTankNr - 676 941A B9 13 44 lda xTanksTableH,y - 677 941D C5 C2 cmp XHit+1 - 678 941F D0 05 bne @+ - 679 9421 B9 0D 44 lda xTanksTableL,y - 680 9424 C5 C1 cmp XHit - 681 @ - 682 9426 90 15 bcc HitOnLeftSideOfTargetL - 683 ; continue targeting - 684 9428 38 sec - 685 9429 A5 D6 lda NewAngle - 686 942B E9 05 sbc #5 ; 5 deg to left - 687 942D C9 15 cmp #21 - 688 ; bcc EndOfFirstLoopL ; if angle 20 or lower - 689 942F 90 BD bcc AimSecondTry - 690 9431 85 D6 sta NewAngle - 691 9433 4C 06 94 jmp AimingLeft - 692 9436 NoHitInFirstLoopL - 693 ; Angle 5 deg to right and end loop - 694 9436 18 clc - 695 9437 A5 D6 lda NewAngle - 696 9439 69 05 adc #5 - 697 943B 85 D6 sta NewAngle - 698 943D HitOnLeftSideOfTargetL - 699 943D E6 D6 inc NewAngle - 700 943F EndOfFirstLoopL - 701 943F A9 05 85 76 mva #5 modify ; set counter (5 turns) - 702 9443 SecondLoopL - 703 ; make test Shoot (Flight) - 704 9443 20 7E 94 jsr SetStartAndFlight - 705 9446 A5 BF lda HitFlag - 706 9448 F0 2F beq NoHitInSecondLoopL ; impossible :) - 707 944A 30 08 bmi GroundHitInSecondLoopL - 708 944C TankHitInSecondLoopL - 709 ; tank hit, but which tank? - 710 ; it's our target or not? - 711 944C A4 BF ldy HitFlag - 712 944E 88 dey - 713 944F CC 31 44 cpy TargetTankNr - 714 9452 F0 27 beq EndOfSecondLoopL ; it's our target! - 715 ; if it's another tank then check position like ground hit - 716 9454 GroundHitInSecondLoopL - 717 ; checking only x position of hit - 718 9454 AC 31 44 ldy TargetTankNr - 719 9457 B9 13 44 lda xTanksTableH,y - 720 945A C5 C2 cmp XHit+1 - 721 945C D0 05 bne @+ - 722 945E B9 0D 44 lda xTanksTableL,y - 723 9461 C5 C1 cmp XHit - 724 @ - 725 9463 B0 09 bcs HitOnRightSideOfTargetL - 726 ; continue targeting - 727 9465 E6 D6 inc NewAngle ; 1 deg to right - 728 9467 C6 76 dec modify ; max 5 turns - 729 9469 F0 10 beq EndOfSecondLoopL - 730 946B 4C 43 94 jmp SecondLoopL - 731 946E HitOnRightSideOfTargetL - 732 ; decrease energy (a little) - 733 946E 38 A5 A4 E9 05 85 + sbw Force #5 - 734 9479 NoHitInSecondLoopL - 735 ; Angle 1 deg to left and end loop - 736 9479 C6 D6 dec NewAngle - 737 947B EndOfSecondLoopL - 738 947B 4C E9 93 jmp EndOfAim - 739 - 740 947E SetStartAndFlight ; set start point (virtual barrel end :) ) and make test flight - 741 ; xtraj+1 and ytraj+1 set - 742 947E 18 clc - 743 947F BD 0D 44 lda xTanksTableL,x - 744 9482 69 04 adc #4 - 745 9484 85 C9 sta xtraj+1 - 746 9486 BD 13 44 lda xTanksTableH,x - 747 9489 69 00 adc #0 - 748 948B 85 CA sta xtraj+2 - 749 948D 38 sec - 750 948E BD 19 44 lda yTanksTable,x - 751 9491 E9 04 sbc #4 - 752 9493 85 CC sta ytraj+1 - 753 9495 A9 00 85 CD mva #0 ytraj+2 - 754 9499 A5 D6 85 A7 mva NewAngle Angle - 755 949D 20 A0 83 jsr Flight - 756 94A0 A6 6C ldx TankNr - 757 94A2 60 rts - 758 .endp - 759 ;---------------------------------------------- - 760 94A3 .proc PurchaseAI ; - 761 ; A - skill of the TankNr - 762 ; makes purchase for AI opponents - 763 ; results of this routine are not visible on the screen - 764 ;---------------------------------------------- - 765 94A3 0A asl - 766 94A4 AA tax - 767 94A5 CA CA :2 dex ;credit KK - 768 94A7 BD B1 94 lda PurchaseAIRoutines+1,x - 769 94AA 48 pha - 770 94AB BD B0 94 lda PurchaseAIRoutines,x - 771 94AE 48 pha - 772 94AF 60 rts - 773 .endp - 774 - 775 ;---------------- - 776 94B0 PurchaseAIRoutines - 777 94B0 BF 94 .word MoronPurchase-1 - 778 94B2 39 95 .word ShooterPurchase-1 ;ShooterPurchase - 779 94B4 60 95 .word PoolsharkPurchase-1 ;PoolsharkPurchase - 780 94B6 89 95 .word TosserPurchase-1 ;TosserPurchase - 781 94B8 89 95 .word TosserPurchase-1 ;ChooserPurchase - 782 94BA BC 95 .word CyborgPurchase-1 ;SpoilerPurchase - 783 94BC BC 95 .word CyborgPurchase-1 ;CyborgPurchase - 784 94BE 89 95 .word TosserPurchase-1 ;UnknownPurchase - 785 - 786 ;---------------------------------------------- - 787 94C0 .proc MoronPurchase - 788 ;Moron buys nothing - 789 94C0 60 rts - 790 .endp - 791 ;------- - 792 94C1 .proc TryToPurchaseOnePiece2 ; for Cyborg - 793 ; A - weapon number, better it will be in range(1,32) - 794 ; TankNr in X - 795 ; DOES NOT CHANGE X - 796 94C1 A8 tay - 797 94C2 85 73 sta temp+1 - 798 94C4 4A 4A 4A :3 lsr ; A=A/8 - 799 94C7 85 72 sta temp - 800 94C9 98 tya - 801 94CA 29 07 and #%00000111 - 802 94CC A8 tay - 803 94CD B9 1C 5C lda bittable,y - 804 94D0 A4 72 ldy temp - 805 94D2 39 04 5D and PurchaseMeTable2,y - 806 94D5 F0 62 beq TryToPurchaseOnePiece.SorryNoPurchase - 807 94D7 4C F0 94 jmp TryToPurchaseOnePiece.PurchaseIt - 808 .endp - 809 ;------- - 810 94DA .proc TryToPurchaseOnePiece - 811 ; A - weapon number, better it will be in range(1,32) - 812 ; TankNr in X - 813 ; DOES NOT CHANGE X - 814 94DA A8 tay - 815 94DB 85 73 sta temp+1 - 816 94DD 4A 4A 4A :3 lsr ; A=A/8 - 817 94E0 85 72 sta temp - 818 94E2 98 tya - 819 94E3 29 07 and #%00000111 - 820 94E5 A8 tay - 821 94E6 B9 1C 5C lda bittable,y - 822 94E9 A4 72 ldy temp - 823 94EB 39 FE 5C and PurchaseMeTable,y - 824 94EE F0 49 beq SorryNoPurchase - 825 94F0 PurchaseIt - 826 94F0 A4 73 ldy temp+1 - 827 94F2 B9 9E 5C lda WeaponPriceL,y - 828 94F5 85 72 sta temp - 829 94F7 B9 6E 5C lda WeaponPriceH,y - 830 94FA 85 73 sta temp+1 - 831 ;price of the weapon in temp - 832 94FC BD 84 43 lda MoneyL,x - 833 94FF 85 74 sta temp2 - 834 9501 BD 7E 43 lda MoneyH,x - 835 9504 85 75 sta temp2+1 - 836 ;current monies in temp2 - 837 9506 A5 75 C5 73 D0 04 + cpw temp2 temp - 838 9510 90 27 bcc SorryNoPurchase - 839 ; deduct monies from the bank account - 840 9512 38 sec - 841 9513 A5 74 lda temp2 - 842 9515 E5 72 sbc temp - 843 9517 9D 84 43 sta MoneyL,x - 844 951A A5 75 lda temp2+1 - 845 951C E5 73 sbc temp+1 - 846 951E 9D 7E 43 sta MoneyH,x - 847 - 848 9521 BD F1 5A lda TanksWeaponsTableL,x - 849 9524 85 72 sta temp - 850 9526 BD F7 5A lda TanksWeaponsTableH,x - 851 9529 85 73 sta temp+1 - 852 - 853 952B B9 CE 5C lda WeaponUnits,y - 854 952E 18 clc - 855 952F 71 72 adc (temp),y - 856 9531 C9 63 cmp #99 ;max number of weapon units - 857 9533 90 02 bcc NotExceeded - 858 9535 A9 63 lda #99 - 859 9537 NotExceeded - 860 9537 91 72 sta (temp),y - 861 - 862 - 863 9539 SorryNoPurchase - 864 9539 60 rts - 865 .endp - 866 - 867 - 868 ;---------------------------------------------- - 869 953A .proc ShooterPurchase - 870 ; first try to buy defensives - 871 ; mva #2 tempXroller; number of offensive purchases to perform - 872 953A A6 6C ldx TankNr - 873 @ - 874 953C randomize ind_Battery________ ind_StrongParachute -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 953C ?rand - 7 953C AD 1B D4 lda random - 8 953F C9 21 cmp #IND_BATTERY________ ;floor - 9 9541 90 F9 bcc ?rand - 10 9543 C9 25 cmp #IND_STRONGPARACHUTE+1 ;ceiling - 11 9545 B0 F5 bcs ?rand -Source: ai.asm - 875 9547 20 DA 94 jsr TryToPurchaseOnePiece - 876 ; dec tempXroller - 877 ; bne @- - 878 - 879 ; and now offensives - 880 954A A9 04 85 78 mva #4 tempXroller; number of offensive purchases to perform - 881 ;ldx TankNr - 882 @ - 883 954E randomize ind_Missile________ ind_Heavy_Roller___ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 954E ?rand - 7 954E AD 1B D4 lda random - 8 9551 C9 01 cmp #IND_MISSILE________ ;floor - 9 9553 90 F9 bcc ?rand - 10 9555 C9 0F cmp #IND_HEAVY_ROLLER___+1 ;ceiling - 11 9557 B0 F5 bcs ?rand -Source: ai.asm - 884 9559 20 DA 94 jsr TryToPurchaseOnePiece - 885 955C C6 78 dec tempXroller - 886 955E D0 EE bne @- - 887 - 888 9560 60 rts - 889 .endp - 890 ;---------------------------------------------- - 891 9561 .proc PoolsharkPurchase - 892 ; first try to buy defensives - 893 ; mva #2 tempXroller; number of offensive purchases to perform - 894 9561 A6 6C ldx TankNr - 895 @ - 896 9563 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9563 ?rand - 7 9563 AD 1B D4 lda random - 8 9566 C9 21 cmp #IND_BATTERY________ ;floor - 9 9568 90 F9 bcc ?rand - 10 956A C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 956C B0 F5 bcs ?rand -Source: ai.asm - 897 956E 20 DA 94 jsr TryToPurchaseOnePiece - 898 9571 C6 78 dec tempXroller - 899 ; bpl @- - 900 - 901 ; and now offensives - 902 9573 A9 06 85 78 mva #6 tempXroller; number of purchases to perform - 903 ;ldx TankNr - 904 @ - 905 9577 randomize ind_Missile________ ind_Dirt_Charge____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9577 ?rand - 7 9577 AD 1B D4 lda random - 8 957A C9 01 cmp #IND_MISSILE________ ;floor - 9 957C 90 F9 bcc ?rand - 10 957E C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling - 11 9580 B0 F5 bcs ?rand -Source: ai.asm - 906 9582 20 DA 94 jsr TryToPurchaseOnePiece - 907 9585 C6 78 dec tempXroller - 908 9587 D0 EE bne @- - 909 - 910 9589 60 rts - 911 .endp - 912 ;---------------------------------------------- - 913 958A .proc TosserPurchase - 914 - 915 ; what is my money level - 916 958A A6 6C ldx TankNr - 917 958C BD 7E 43 lda MoneyH,x ; money / 256 - 918 958F 4A lsr ; /2 - 919 9590 85 78 sta tempXroller ; perform this many purchase attempts - 920 ; first try to buy defensives - 921 ; mva #1 tempXroller; number of defensive purchases to perform - 922 @ - 923 9592 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 9592 ?rand - 7 9592 AD 1B D4 lda random - 8 9595 C9 21 cmp #IND_BATTERY________ ;floor - 9 9597 90 F9 bcc ?rand - 10 9599 C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 959B B0 F5 bcs ?rand -Source: ai.asm - 924 959D 20 DA 94 jsr TryToPurchaseOnePiece - 925 95A0 C6 78 dec tempXroller - 926 95A2 10 EE bpl @- - 927 - 928 ; and now offensives - 929 95A4 BD 7E 43 lda MoneyH,x ; money / 256 - 930 95A7 0A asl ;*2 - 931 95A8 85 78 sta tempXroller ; perform this many purchase attempts - 932 @ - 933 95AA randomize ind_Missile________ ind_Dirt_Charge____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95AA ?rand - 7 95AA AD 1B D4 lda random - 8 95AD C9 01 cmp #IND_MISSILE________ ;floor - 9 95AF 90 F9 bcc ?rand - 10 95B1 C9 1E cmp #IND_DIRT_CHARGE____+1 ;ceiling - 11 95B3 B0 F5 bcs ?rand -Source: ai.asm - 934 95B5 20 DA 94 jsr TryToPurchaseOnePiece - 935 95B8 C6 78 dec tempXroller - 936 95BA 10 EE bpl @- - 937 - 938 95BC 60 rts - 939 .endp - 940 ;---------------------------------------------- - 941 95BD .proc CyborgPurchase - 942 - 943 ; what is my money level - 944 95BD A6 6C ldx TankNr - 945 95BF BD 7E 43 lda MoneyH,x ; money / 256 - 946 95C2 4A lsr ; /2 - 947 95C3 85 78 sta tempXroller ; perform this many purchase attempts - 948 ; first try to buy defensives - 949 ; mva #1 tempXroller; number of defensive purchases to perform - 950 @ - 951 95C5 randomize ind_Battery________ ind_Bouncy_Castle__ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95C5 ?rand - 7 95C5 AD 1B D4 lda random - 8 95C8 C9 21 cmp #IND_BATTERY________ ;floor - 9 95CA 90 F9 bcc ?rand - 10 95CC C9 2A cmp #IND_BOUNCY_CASTLE__+1 ;ceiling - 11 95CE B0 F5 bcs ?rand -Source: ai.asm - 952 95D0 20 C1 94 jsr TryToPurchaseOnePiece2 - 953 95D3 C6 78 dec tempXroller - 954 95D5 10 EE bpl @- - 955 - 956 ; and now offensives - 957 95D7 BD 7E 43 lda MoneyH,x ; money / 256 - 958 95DA 0A 0A 0A :3 asl ;*8 - 959 95DD 85 78 sta tempXroller ; perform this many purchase attempts - 960 @ - 961 95DF randomize first_offensive____ last_offensive_____ -Macro: RANDOMIZE [Source: MACRO.ASM] - 6 95DF ?rand - 7 95DF AD 1B D4 lda random - 8 95E2 C9 00 cmp #FIRST_OFFENSIVE____ ;floor - 9 95E4 90 F9 bcc ?rand - 10 95E6 C9 20 cmp #LAST_OFFENSIVE_____+1 ;ceiling - 11 95E8 B0 F5 bcs ?rand -Source: ai.asm - 962 95EA 20 C1 94 jsr TryToPurchaseOnePiece2 - 963 95ED C6 78 dec tempXroller - 964 95EF 10 EE bpl @- - 965 - 966 95F1 60 rts - 967 .endp - 968 ;---------------------------------------------- - 969 95F2 .proc ChooseBestOffensive - 970 ; choose the best weapon - 971 ; X - TankNr - 972 ;---------------------------------------------- - 973 95F2 A0 1E ldy #ind_Dirt_Charge____+1 ;the last weapon to choose +1 (not BFG or Laser :) ) - 974 95F4 NotFromAll - 975 ; Y - the last offensive weapon to use + 1 - 976 95F4 BD F1 5A lda TanksWeaponsTableL,x - 977 95F7 85 72 sta temp - 978 95F9 BD F7 5A lda TanksWeaponsTableH,x - 979 95FC 85 73 sta temp+1 - 980 95FE loop - 981 95FE 88 dey - 982 95FF B1 72 lda (temp),y - 983 9601 F0 FB beq loop - 984 9603 98 tya - 985 9604 9D F7 43 sta ActiveWeapon,x - 986 9607 60 rts - 987 .endp - 988 ;---------------------------------------------- - 989 9608 .proc GetDistance - 990 ; calculates lores ( /4 ) distance from tank X to TargetTankNr(Y) - 991 ; result in A - 992 ;---------------------------------------------- - 993 9608 AC 31 44 ldy TargetTankNr - 994 960B BD 1F 44 lda LowResDistances,x - 995 960E D9 1F 44 cmp LowResDistances,y - 996 9611 B0 08 @ bcs YisLower - 997 9613 38 sec - 998 9614 B9 1F 44 lda LowResDistances,y - 999 9617 FD 1F 44 sbc LowResDistances,x - 1000 961A 60 rts - 1001 961B YisLower - 1002 961B BD 1F 44 lda LowResDistances,x - 1003 961E F9 1F 44 sbc LowResDistances,y - 1004 9621 60 rts - 1005 .endp - 354 ;---------------------------------------------- - 355 9622 icl 'artwork/talk.asm' -Source: talk.asm - 1 9622 .proc talk - 2 ; Maximum text length is 63 characters!!! - 3 9622 23 39 2B 21 00 22 + L0 dta d"CYKA BLAT" - 4 962B 24 29 25 01 L1 dta d"DIE!" - 5 962F 25 21 34 00 2D 39 + L2 dta d"EAT MY SHORTS!" - 6 963D 39 2F 35 07 32 25 + L3 dta d"YOU'RE TOAST!" - 7 964A 22 21 2E 3A 21 29 + L4 dta d"BANZAI!" - 8 9651 26 32 2F 2D 00 28 + L5 dta d"FROM HELL'S HEART I STAB AT THEE..." - 9 9674 29 00 24 29 24 2E + L6 dta d"I DIDN'T DO IT. NOBODY SAW ME DO IT." - 10 9698 34 21 2B 25 00 21 + L7 dta d"TAKE A HIKE!" - 11 96A4 39 2F 35 07 32 25 + L8 dta d"YOU'RE DEAD MEAT." - 12 96B5 2D 21 2B 25 00 2D + L9 dta d"MAKE MY DAY." - 13 96C1 23 28 21 32 27 25 + L10 dta d"CHARGE!" - 14 96C8 21 34 34 21 23 2B + L11 dta d"ATTACK!" - 15 96CF 39 2F 35 07 32 25 + L12 dta d"YOU'RE OUTTA HERE." - 16 96E1 37 21 34 34 33 21 + L13 dta d"WATTSA MATTA YOU?" - 17 96F2 26 32 25 25 3A 25 + L14 dta d"FREEZE, OR I'LL SHOOT!" - 18 9708 28 21 00 28 21 00 + L15 dta d"HA HA HA." - 19 9711 37 25 00 23 2F 2D + L16 dta d"WE COME IN PEACE - SHOOT TO KILL!" - 20 9732 29 2E 00 39 2F 35 + L17 dta d"IN YOUR FACE!" - 21 973F 24 29 25 00 23 2F + L18 dta d"DIE COMMIE PIG!" - 22 974E 29 00 2C 2F 36 25 + L19 dta d"I LOVE THE SMELL OF NAPALM IN THE MORNING." - 23 9778 36 29 23 34 2F 32 + L20 dta d"VICTORY!" - 24 9780 33 28 2F 37 00 33 + L21 dta d"SHOW SOME RESPECT." - 25 9792 2A 35 33 34 00 37 + L22 dta d"JUST WHO DO YOU THINK YOU ARE?" - 26 97B0 2C 2F 2F 2B 00 2F + L23 dta d"LOOK OUT BELOW!" - 27 97BF 2B 2E 2F 23 2B 0C + L24 dta d"KNOCK, KNOCK." - 28 97CC 2C 2F 2F 2B 00 2F + L25 dta d"LOOK OVER THERE." - 29 97DC 27 35 25 33 33 00 + L26 dta d"GUESS WHAT'S COMING FOR DINNER?" - 30 97FB 2D 25 32 32 39 00 + L27 dta d"MERRY CHRISTMAS." - 31 980B 2F 30 25 2E 00 37 + L28 dta d"OPEN WIDE!" - 32 9815 28 25 32 25 00 27 + L29 dta d"HERE GOES NOTHING..." - 33 9829 24 2F 2E 07 34 00 + L30 dta d"DON'T WORRY, IT ISN'T A LIVE ROUND." - 34 984C 22 2C 2F 2F 24 0C + L31 dta d"BLOOD, PAIN, VIOLENCE!" - 35 9862 34 21 2B 25 00 34 + L32 dta d"TAKE THIS, SISSY!" - 36 9873 29 00 33 28 21 2C + L33 dta d"I SHALL FLATTEN YOU!" - 37 9887 29 00 33 28 21 2C + L34 dta d"I SHALL SMASH YOUR UGLY TANK!" - 38 98A4 29 00 37 2F 2E 24 + L35 dta d"I WONDER WHAT THIS BUTTON DOES?" - 39 98C3 24 2F 2E 07 34 00 + L36 dta d"DON'T TAKE THIS PERSONALLY." - 40 98DE 37 2F 35 2C 24 00 + L37 dta d"WOULD THIS MAKE YOU MAD?" - 41 98F6 29 00 34 2F 2C 24 + L38 dta d"I TOLD YOU TO LEAVE MY SISTER ALONE!" - 42 991A 29 00 23 2F 35 2C + L39 dta d"I COULD SPARE YOU, BUT WHY?" - 43 9935 2D 39 00 22 2F 2D + L40 dta d"MY BOMB IS BIGGER THAN YOURS." - 44 9952 24 2F 2E 07 34 00 + L41 dta d"DON'T FORGET ABOUT ME!" - 45 9968 28 21 33 34 21 00 + L42 dta d"HASTA LA VISTA, BABY!" - 46 997D 34 28 29 33 00 29 + L43 dta d"THIS IS YOUR BRAIN ON SCORCH." - 47 999A 34 21 2B 25 00 34 + L44 dta d"TAKE THIS!" - 48 99A4 34 28 29 33 00 33 + L45 dta d"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." - 49 99D4 24 29 25 0C 00 21 + L46 dta d"DIE, ALIEN SWINE!" - 50 99E5 21 37 32 35 2B 01 + L47 dta d"AWRUK!!!" - 51 99ED 29 00 33 28 21 2C + L48 dta d"I SHALL OIL MY TURRET WITH YOUR BLOOD." - 52 9A13 24 29 25 0C 00 34 + L49 dta d"DIE, TANK-SCUM!" - 53 9A22 29 07 2D 00 27 2F + L50 dta d"I'M GONNA BREAK YOUR FACE!" - 54 9A3C 2D 21 2D 21 00 33 + L51 dta d"MAMA SAID KNOCK YOU OUT!" - 55 9A54 29 00 28 2F 30 25 + L52 dta d"I HOPE YOU ENJOY PAIN!" - 56 9A6A 28 2F 37 07 24 00 + L53 dta d"HOW'D YOU LIKE ONE ACROSS YOUR LIPS?" ;(sanford and son) - 57 ;-------------------------------- - 58 9A8E 30 21 32 34 29 2E + L54 dta d"PARTING IS SUCH SWEET SORROW... NOT!" - 59 9AB2 35 27 28 01 L55 dta d"UGH!" - 60 9AB6 21 21 32 27 28 01 L56 dta d"AARGH!" - 61 9ABC 21 21 21 27 27 28 + L57 dta d"AAAGGHHH!" - 62 9AC5 29 07 2D 00 2D 25 + L58 dta d"I'M MELTING!" - 63 9AD1 2F 2F 26 0E 0E L59 dta d"OOF.." - 64 9AD6 2F 28 01 L60 dta d"OH!" - 65 9AD9 25 25 25 2B 01 L61 dta d"EEEK!" - 66 9ADE 21 21 23 23 28 01 L62 dta d"AACCH!" - 67 9AE4 29 00 28 21 34 25 + L63 dta d"I HATE IT WHEN THAT HAPPENS." - 68 9B00 2F 2E 25 00 24 29 + L64 dta d"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." - 69 9B27 2F 28 00 2E 2F 01 L65 dta d"OH NO!" - 70 9B2D 2E 2F 34 00 2D 25 + L66 dta d"NOT ME!" - 71 9B34 2F 35 23 28 0E L67 dta d"OUCH." - 72 9B39 2F 28 00 2E 2F 0C + L68 dta d"OH NO, NOT AGAIN." - 73 9B4A 21 2E 2F 34 28 25 + L69 dta d"ANOTHER ONE BITES THE DUST." - 74 9B65 27 2F 2F 24 22 39 + L70 dta d"GOODBYE." - 75 9B6D 28 25 2C 30 00 2D + L71 dta d"HELP ME!" - 76 9B75 26 21 32 25 37 25 + L72 dta d"FAREWELL, CRUEL WORLD." - 77 9B8B 32 25 2D 25 2D 22 + L73 dta d"REMEMBER THE ALAMO!" - 78 9B9E 2F 28 00 2D 21 2E + L74 dta d"OH MAN!" - 79 9BA5 24 2F 2F 35 27 28 + L75 dta d"DOOUGH!" - 80 9BAC 21 2E 2F 34 28 25 + L76 dta d"ANOTHER DAY, ANOTHER BOMB." - 81 9BC6 34 28 29 33 00 29 + L77 dta d"THIS IS THE END, MY ONLY FRIEND." - 82 9BE6 36 25 32 39 00 26 + L78 dta d"VERY FUNNY." - 83 9BF1 34 28 25 00 26 21 + L79 dta d"THE FAT LADY SANG." - 84 9C03 37 28 39 00 24 2F + L80 dta d"WHY DOES EVERYTHING HAPPEN TO ME?" - 85 9C24 29 07 2D 00 27 2F + L81 dta d"I'M GOING DOWN." - 86 9C33 29 07 36 25 00 27 + L82 dta d"I'VE GOT A BAD FEELING ABOUT THIS." - 87 9C55 23 32 21 30 2F 2C + L83 dta d"CRAPOLA." - 88 9C5D 30 2F 37 01 L84 dta d"POW!" - 89 9C61 22 29 26 01 L85 dta d"BIF!" - 90 9C65 22 21 2D 01 L86 dta d"BAM!" - 91 9C69 3A 2F 2E 2B 01 L87 dta d"ZONK!" - 92 9C6E 29 00 33 28 2F 35 + L88 dta d"I SHOULD'VE LISTENED TO MY MOTHER..." - 93 9C92 29 00 37 21 2C 2B + L89 dta d"I WALK THROUGH THE VALLEY OF THE SHADOW..." - 94 9CBC 37 28 21 34 00 37 + L90 dta d"WHAT WAS THAT NOISE?" - 95 9CD0 2D 21 2D 21 00 33 + L91 dta d"MAMA SAID THERE'D BE DAYS LIKE THIS." - 96 9CF4 29 34 33 00 2A 35 + L92 dta d"ITS JUST ONE OF THOSE DAYS..." - 97 9D11 29 00 33 25 25 00 + L93 dta d"I SEE A BRIGHT LIGHT..." - 98 9D28 2D 2F 2D 2D 39 1F + L94 dta d"MOMMY? IS THAT YOU?" - 99 9D3B 29 00 2C 25 34 00 + L95 dta d"I LET YOU HIT ME!" - 100 9D4C 33 35 23 2B 25 32 + L96 dta d"SUCKER SHOT!" - 101 9D58 29 00 24 29 24 2E + L97 dta d"I DIDN'T WANT TO LIVE ANYWAY." - 102 9D75 0D 1C 33 2F 22 1E + L98 dta d"--" - 103 9D7C 37 21 33 00 34 28 + L99 dta d"WAS THAT AS CLOSE AS I THINK IT WAS?" - 104 9DA0 2A 2F 29 2E 00 34 + L100 dta d"JOIN THE ARMY, SEE THE WORLD THEY SAID." - 105 9DC7 29 34 00 37 21 33 + L101 dta d"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" - 106 9DF0 29 00 24 29 24 2E + L102 dta d"I DIDN'T LIKE VIOLENCE ANYWAY!" - 107 9E0E 29 00 34 28 2F 35 + L103 dta d"I THOUGHT YOU LIKED ME?" - 108 9E25 23 34 2F 00 38 39 + L104 dta d"CTO XYEB" - 109 9E2D 29 00 34 28 29 2E + L105 dta d"I THINK THIS GUY'S A LITTLE CRAZY." - 110 9E4F 33 2F 2D 25 28 2F + L106 dta d"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." - 111 9E79 28 25 39 01 00 2B + L107 dta d"HEY! KILLIN' AIN'T COOL." - 112 9E91 27 25 25 0E 0E 0E + L108 dta d"GEE... THANKS." - 113 9E9F 29 07 36 25 00 26 + L109 dta d"I'VE FALLEN AND I CAN'T GET UP!" - 114 9EBE 19 11 11 1F L110 dta d"911?" - 115 9EC2 2F 28 00 2E 2F 01 + L111 dta d"OH NO! HERE I BLOW AGAIN!" - 116 9EDB 29 07 2C 2C 00 22 + L112 dta d"I'LL BE BACK..." - 117 9EEA 28 25 39 00 0D 00 + L113 dta d"HEY - I'VE GOT LAWYERS." - 118 9F01 34 29 2D 25 00 34 + L114 dta d"TIME TO CALL 1-900-SUE-TANK." - 119 9F1D 39 2F 35 00 22 29 + L115 dta d"YOU BIG DUMMY!" ;(sanford and son) - 120 9F2B LEND - 121 9F2B OffensiveTextTableL - 122 9F2B 22 2B 2F 3D 4A 51 + dta L0,>L1,>L2,>L3,>L4,>L5,>L6,>L7,>L8,>L9,>L10,>L11,>L12,>L13,>L14,>L15,>L16,>L17,>L18,>L19,>L20,>L21,>L22,>L23,>L24,>L25,>L26,>L27,>L28,>L29,>L30,>L31,>L32,>L33,>L34,>L35,>L36,>L37,>L38,>L39,>L40,>L41,>L42,>L43,>L44,>L45,>L46,>L47,>L48,>L49,>L50,>L51,>L52,>L53 - 127 9FD6 9A 9A 9A 9A 9A 9A + dta >L54,>L55,>L56,>L57,>L58,>L59,>L60,>L61,>L62,>L63,>L64,>L65,>L66,>L67,>L68,>L69,>L70,>L71,>L72,>L73,>L74,>L75,>L76,>L77,>L78,>L79,>L80,>L81,>L82,>L83,>L84,>L85,>L86,>L87,>L88,>L89,>L90,>L91,>L92,>L93,>L94,>L95,>L96,>L97,>L98,>L99,>L100,>L101,>L102,>L103,>L104,>L105,>L106,>L107,>L108,>L109,>L110,>L111,>L112,>L113,>L114,>L115 - 128 A014 9F dta >LEND - 129 = 0036 NumberOfOffensiveTexts=54 - 130 = 003E NumberOfDeffensiveTexts=62 - 131 .endp - 132 A015 2D 39 00 28 2F 36 + hoverFull dta d"MY HOVERCRAFT IS FULL OF EELS!" - 133 A033 hoverFullEnd - 134 A033 32 35 2E 2E 29 2E + hoverEmpty dta d"RUNNING OUT OF EELS" - 135 A046 hoverEmptyEnd - 356 ;---------------------------------------------- - 357 A046 TankFont - 358 A046 00 00 00 00 00 00 + ins 'artwork/tanksv4.fnt',+0,384 ; 48 characters only - 359 ;---------------------------------------------- - 360 A1C6 font4x4 - 361 A1C6 FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62 - 362 ;------------------------------------------------- - 363 A246 .proc CheckTankCheat - 364 A246 A0 07 ldy #$07 - 365 A248 A5 6C lda TankNr - 366 A24A 0A asl - 367 A24B 0A asl - 368 A24C 0A asl ; 8 chars per name - 369 A24D AA tax - 370 @ - 371 A24E B9 73 A2 lda CheatName,y - 372 A251 38 sec - 373 A252 FD 09 41 sbc tanksnames,x - 374 A255 C9 27 cmp #$27 - 375 A257 D0 19 bne NoCheat - 376 A259 E8 inx - 377 A25A 88 dey - 378 A25B 10 F1 bpl @- - 379 A25D YesCheat - 380 A25D A6 6C ldx TankNr - 381 A25F BD F1 5A lda TanksWeaponsTableL,x - 382 A262 85 72 sta temp - 383 A264 BD F7 5A lda TanksWeaponsTableH,x - 384 A267 85 73 sta temp+1 - 385 A269 A9 63 lda #99 - 386 A26B C8 @ iny - 387 A26C 91 72 sta (temp),y - 388 A26E C0 2F cpy #(number_of_weapons - 1) - 389 A270 D0 F9 bne @- - 390 A272 NoCheat - 391 A272 60 rts - 392 .endp - 393 A273 CheatName - 394 A273 27 27 27 37 37 3F + dta d" 008.T"+$27 - 395 ;---------------------------------------------- - 396 A27B .proc DLIinterruptBFG - 397 A27B 48 pha - 398 A27C A5 9A lda dliCounter - 399 A27E D0 18 bne EndofBFGDLI - 400 A280 AD BC A2 lda dliColorsFore - 401 A283 2C 1B D4 bit random - 402 A286 30 02 bmi @+ - 403 A288 A5 58 lda DliColorBack - 404 A28A 85 02 @ sta COLPF2 - 405 A28C AD BC A2 lda dliColorsFore - 406 A28F 2C 1B D4 bit random - 407 A292 30 02 bmi @+ - 408 A294 A5 58 lda DliColorBack - 409 A296 85 02 @ sta COLPF1 - 410 A298 EndofBFGDLI - 411 A298 E6 9A inc dliCounter - 412 A29A 68 pla - 413 A29B 40 rti - 414 .endp - 415 ; ------------------------ - 416 A29C .proc BFGblink - 417 ; SetDLI DLIinterruptBFG ; blinking on - 418 A29C A0 32 ldy #50 - 419 A29E 20 9D 5A jsr PauseYFrames - 420 ; SetDLI DLIinterruptGraph ; blinking off - 421 A2A1 60 rts - 422 .endp - 423 ;---------------------------------------------- - 424 A2A2 icl 'constants_top.asm' -Source: constants_top.asm - 1 ; @com.wudsn.ide.asm.mainsourcefile=scorch.asm - 2 - 3 .IF *>0 ;this is a trick that prevents compiling this file alone - 4 - 5 ;TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 - 6 A2A2 04 03 01 05 00 02 TanksPMOrder .BYTE 4,3,1,5,0,2 ; 0-3 = P0-P3 , 4 = M0+M1 , 5 = M2+M3 - 7 A2A8 dliColorsBack - 8 A2A8 02 00 02 00 02 00 + :10 .by $02,$00 - 9 A2BC dliColorsFore - 10 A2BC 0A .by $0a ; one mountains color - 11 ; .by $0e,$0c,$0c,$0b,$0b,$0a,$0a,$09,$09,$08 ; mountains colors array - 12 ; .by $08,$08,$07,$07,$07,$06,$06,$06,$06,$05 - 13 A2BD 0E 0C 0C 0C 0C 0A + .by $0e,$0c,$0c,$0c,$0c,$0a,$0a,$0a,$0a,$08 ; mountains colors array new - 14 A2C7 08 08 08 06 06 06 + .by $08,$08,$08,$06,$06,$06,$06,$06,$06,$04 - 15 A2D1 CashOptionL ;(one zero less than on the screen) - 16 A2D1 00 C8 20 B0 D0 .by 0,<200,<800,<1200,<2000 - 17 A2D6 CashOptionH - 18 A2D6 00 00 03 04 07 .by 0,>200,>800,>1200,>2000 - 19 A2DB 0A 14 19 1E 28 GravityTable .by 10,20,25,30,40 - 20 A2E0 05 14 28 46 63 MaxWindTable .by 5,20,40,70,99 - 21 A2E5 0A 14 1E 28 32 RoundsTable .by 10,20,30,40,50 - 22 A2EA 77 01 D6 01 76 02 + AIForceTable .wo 375,470,630,720,820 ; starting shoot forces for different gravity - 23 A2F4 FF 96 4B 23 01 flyDelayTable .by 255,150,75,35,1 - 24 A2F9 FF 2D 19 0F 09 seppukuTable .by 255, 45,25,15,9 - 25 .endif - 425 ;---------------------------------------------- - 426 A2FE NMI - 427 A2FE EE 20 D0 INC $D020 ; change border colour, indication for a NMI - 428 A301 40 RTI ; exit interrupt - 429 ; (not acknowledged!) - 430 diff --git a/variables.asm b/variables.asm index 38f4b83..9038e5d 100644 --- a/variables.asm +++ b/variables.asm @@ -55,9 +55,9 @@ StatusBufferCopy variablesStart ; zeroing starts here ;===================================================== ;isInventory .ds 1 ; 0 - purchase, $ff - inventory -;-------------- +;-------------- drawFunction .ds 1 ; 0 - plot, %10000000 - LineLength (N), %01000000 - DrawCheck (V) -;-------------- +;-------------- noDeathCounter .ds 1 ;-------------- OptionsY .ds 1 ;vertical position of cursor on Options screen @@ -125,9 +125,9 @@ BarrelLength ;length of the tank barrel - dont forget to set it to 6 at round st .DS MaxPlayers ActiveWeapon ;number of the selected weapon .DS MaxPlayers -ActiveDefenceWeapon ;number of the activated defence weapon - 0 +ActiveDefenceWeapon ;number of the activated defence weapon - 0 .DS MaxPlayers -AutoDefenseFlag ; 0 - not activated, >$7f - activated +AutoDefenseFlag ; 0 - not activated, >$7f - activated .DS MaxPlayers WeaponDepleted .DS 1 ; if 0 deactivate the weapon and switch to Baby Missile ;---------------------------------------------------- @@ -301,7 +301,7 @@ HowManyOnTheListDef .DS 1 ;PositionOnTheList ; pointer position on the list being displayed ; .DS 1 -LastWeapon +LastWeapon ; number of the last previously purchased weapon ; it is necessary when after purchase some weapon ; is removed from the list (because too expensive) @@ -361,9 +361,9 @@ TankTempY ;-------------- single round variables -------------- ;---------------------------------------------------- singleRoundVars -;-------------- +;-------------- ;escFlag .ds 1 ; 0 - Esc or O not pressed, $80 - Esc pressed, $40 - O pressed -;-------------- +;-------------- CurrentResult .DS 1 ;-------------- diff --git a/weapons.asm b/weapons.asm index f4a3984..d1cfcfe 100644 --- a/weapons.asm +++ b/weapons.asm @@ -22,7 +22,7 @@ pha rts ExplosionRoutines - .word babymissile-1 ;Baby_Missile ;_00 + .word babymissile-1 ;Baby_Missile ;_00 .word missile-1 ;Missile ;_01 .word babynuke-1 ;Baby_Nuke ;_02 .word nuke-1 ;Nuke ;_03 @@ -60,7 +60,7 @@ tracer rts .endp .proc BFG - mva #sfx_plasma_2_2 sfx_effect + mva #sfx_plasma_2_2 sfx_effect jsr BFGblink ; Kill all :) ldx NumberOfPlayers @@ -79,7 +79,7 @@ CheckNextTankBFG .proc babymissile mva #11 ExplosionRadius GoBabyMissileSFX - mva #sfx_baby_missile sfx_effect + mva #sfx_baby_missile sfx_effect GoXmissile jmp xmissile .endp @@ -106,12 +106,12 @@ GoBabyNukeSFX ; ------------------------ .proc leapfrog mva #17 ExplosionRadius -; mva #sfx_baby_missile sfx_effect +; mva #sfx_baby_missile sfx_effect ; jsr xmissile jsr babymissile.GoBabyMissileSFX jsr SecondRepeat - + SecondRepeat ; soil must fall down now! there is no other way... ; hide tanks or they fall down with soil @@ -150,7 +150,7 @@ EndOfLeapping mva #21 ExplosionRadius jsr CalculateExplosionRange0 jsr xmissile.NoRangeCalc - + jsr SoilDown2 ; jsr cleartanks ; maybe not? @@ -208,10 +208,10 @@ NoWallsInFunky mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw sbw xdraw #34 - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw adw xdraw #68 - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw sbw xdraw #34 ; @@ -219,14 +219,14 @@ NoWallsInFunky ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoUpperCircle - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw NoUpperCircle adw ydraw #68 ;jsr CalculateExplosionRange cpw ydraw #screenHeight bcs NoLowerCircle - mva #sfx_nuke sfx_effect + mva #sfx_nuke sfx_effect jsr GoXmissileWithSaveXYdraw NoLowerCircle mva #sfx_silencer sfx_effect @@ -258,7 +258,7 @@ GoXmissileWithSaveXYdraw ; mwa xdraw xcircle ; store hitpoint for future repeats ldy #30 ; repeat 30 times - sty magic + sty magic RepeatNapalm ; external loop (for fire animation) mwa xcircle xdraw sbw xdraw #(napalmRadius) ; 10 pixels on left side hit point @@ -280,7 +280,7 @@ RepeatFlame ; internal loop (draw flames) tya sec sbc ydraw - sta ydraw + sta ydraw sbw xdraw #4 ; half character correction ; draw flame symbol lda magic ; if last repeat - clear flames @@ -288,7 +288,7 @@ RepeatFlame ; internal loop (draw flames) lda random and #%00000110 clc - adc #char_flame + adc #char_flame bne PutFlameChar LastNapalmRepeat lda #char_clear_flame ; clear flame symbol @@ -312,7 +312,7 @@ CharOffTheScreen jne RepeatFlame dec magic jpl RepeatNapalm - ; after napalm + ; after napalm ;now we must check tanks in range ldx NumberOfPlayers dex @@ -536,7 +536,7 @@ DiggerCharacter lda random and #$06 clc - adc #char_digger + adc #char_digger adc sandhogflag sta CharCode cpw xdraw #(screenwidth-6) @@ -619,7 +619,7 @@ RepeatFill ldy #0 lda (tempXROLLER),y sta HeightRol ; relative point - + RollinContinuesLiquid ; new point is set adw xdraw #mountaintable tempXROLLER @@ -684,19 +684,19 @@ ToHighFill ldx TankNr lda AngleTable,x tay - + mwa EndOfTheBarrelX xbyte mva EndOfTheBarrelY ybyte mva #0 ybyte+1 sta LaserFlag ; turn on gravity and wind after shot :) - + mwa xdraw LaserCoordinate mwa ydraw LaserCoordinate+2 mwa xbyte LaserCoordinate+4 mwa ybyte LaserCoordinate+6 mva #sfx_lightning sfx_effect - + mva #%10000000 drawFunction ;the above switches Draw to measuring length jsr draw @@ -723,7 +723,7 @@ ToHighFill dec yc bne @- - + mva #1 color mwa LaserCoordinate xdraw mwa LaserCoordinate+2 ydraw @@ -764,7 +764,7 @@ ExplosionLoop2 bcc ExplosionLoop2 mva #1 color - + ;check tanks' distance from the centre of the explosion mva #%10000000 drawFunction @@ -830,10 +830,10 @@ UseShieldWithEnergy cpy #0 ; is necessary to reduce tenk energy ? beq ShieldCoveredTank jsr DecreaseEnergyX -ShieldCoveredTank +ShieldCoveredTank lda ShieldEnergy,x jne EndOfDistanceCheckLoop -ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) +ShieldEnergy0 ; deactivate if no energy. it's like use one hit shield :) UseShield lda TankNr pha ; store TankNr @@ -1007,7 +1007,7 @@ DirectionChecked ; -------------------------------------------------- ; makes dirt on xdraw,ydraw position and of ExplosionRadius height mva #sfx_dirt_chrg_s sfx_effect - + mva #1 color NoColor ; jump here with color=0 to clean dirt mwa xdraw xcircle @@ -1098,10 +1098,10 @@ ContinueToCheckMaxForce2 ; $f3 - shift+key notpressed - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' - ldx TankNr ; for optimize + ldx TankNr ; for optimize ; Select and Option lda CONSOL tay @@ -1127,7 +1127,7 @@ callActivation jsr DefensivesActivate jmp afterInventory -@ +@ cmp #@kbcode._I ; $0d ; I bne @+ callInventory @@ -1137,9 +1137,9 @@ callInventory mva #$ff isInventory jsr Purchase afterInventory - jsr MakeDarkScreen + jsr MakeDarkScreen jsr DisplayStatus - jsr SetMainScreen + jsr SetMainScreen jsr DrawTanks ;jsr WaitOneFrame ; not necessary bit LazyFlag @@ -1152,7 +1152,7 @@ NoLazy NoSpyHard RmtSong song_ingame mva #0 escFlag - jmp ReleaseAndLoop + jmp ReleaseAndLoop @ cmp #$80|@kbcode._up jeq CTRLPressedUp @@ -1163,13 +1163,13 @@ NoSpyHard jumpFromStick .IF TARGET = 800 - cmp #$80|17 ; Ctrl+Help - bne NoVdebugSwitch - lda Vdebug - eor #$ff - sta Vdebug - jmp ReleaseAndLoop -NoVdebugSwitch + cmp #$80|17 ; Ctrl+Help + bne NoVdebugSwitch + lda Vdebug + eor #$ff + sta Vdebug + jmp ReleaseAndLoop +NoVdebugSwitch .ENDIF and #$3f ;CTRL and SHIFT ellimination cmp #@kbcode._up ; $e @@ -1189,10 +1189,10 @@ NoVdebugSwitch cmp #@kbcode._S ; $3e ; S jeq pressedS .IF TARGET = 800 - cmp #61 ; G - bne EndKeys - jsr SelectNextGradient.NotWind - jmp ReleaseAndLoop + cmp #61 ; G + bne EndKeys + jsr SelectNextGradient.NotWind + jmp ReleaseAndLoop .ENDIF EndKeys jmp notpressed @@ -1205,7 +1205,7 @@ checkJoy cmp #$0f beq notpressedJoy tay - mva #0 ATRACT ; reset atract mode + mva #0 ATRACT ; reset atract mode lda joyToKeyTable,y jmp jumpFromStick notpressedJoy @@ -1221,14 +1221,14 @@ pressedUp spl:mva #0 pressTimer ; if >128 then reset to 0 cmp #25 ; 1/2s bcs CTRLPressedUp - - + + ;force increaseeee! ;ldx TankNr ; optimized inc ForceTableL,x bne CheckingMaxForce inc ForceTableH,x - + CheckingMaxForce mva #sfx_set_power_1 sfx_effect @@ -1305,7 +1305,7 @@ pressedRight mva #1 Erase jsr DrawTankNr.BarrelChange dec:lda AngleTable,x - cmp #255 ; -1 + cmp #255 ; -1 jne BeforeFire lda #180 sta AngleTable,x @@ -1325,7 +1325,7 @@ CTRLPressedRight lda #180 sta AngleTable,x jmp BeforeFire - + pressedLeft ;ldx TankNr ; optimized @@ -1369,7 +1369,7 @@ pressedTAB lda #first_offensive ; #0 sta ActiveWeapon,x beq @+ ; allways = 0 -?notlasttofirst +?notlasttofirst inc ActiveWeapon,x @ lda ActiveWeapon,x @@ -1413,7 +1413,7 @@ pressedSpace ;================================= ;we shoot here!!! lda #0 - sta ATRACT ; reset atract mode + sta ATRACT ; reset atract mode sta pressTimer ; reset jsr WaitForKeyRelease.StillWait lda pressTimer @@ -1447,7 +1447,7 @@ RandomizeOffensiveText ldy TankNr mva #$ff plot4x4color jsr DisplayOffensiveTextNr - + AfterOffensiveText mva #0 LaserFlag ; $ff - Laser ldx TankNr @@ -1477,7 +1477,7 @@ AfterStrongShoot ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - + mwa EndOfTheBarrelX xtraj+1 mva EndOfTheBarrely ytraj+1 lda #0 @@ -1535,12 +1535,12 @@ noSmokeTracer sty SmokeTracerFlag RepeatIfSmokeTracer -RepeatFlight +RepeatFlight mwa ytraj+1 Ytrajold+1 mwa xtraj+1 Xtrajold+1 mva #%01000000 drawFunction - lda #0 + lda #0 sta vx sta vx+1 sta vx+2 @@ -1552,7 +1552,7 @@ RepeatFlight ;vx calculation ;vx = sin(90-Angle) for Angle <=90 - ;vx = -sin(Angle-90) for 90 < Angle <= 180 + ;vx = -sin(Angle-90) for 90 < Angle <= 180 aslw Force ;Force = Force * 2 ;cos(Angle) (but we use sin table only so some shenanigans happen) @@ -1565,10 +1565,10 @@ RepeatFlight ;180 horizontally left ; (we have to set goleft used in rolling weapons) - + cpx #91 bcc angleUnder90 - + ;over 90 mva #1 goleft sec @@ -1583,7 +1583,7 @@ angleUnder90 lda #90 sbc Angle tax -@ +@ lda sintable,x ; cos(X) sta Multiplee ; *Force mwa Force Multiplier @@ -1610,9 +1610,9 @@ DoNotAdd rol Multiplier+2 dex bne MultiplyLoop - + mva #0 vx+3 - ; here in vx there is a number + ; here in vx there is a number ; xxxx.xx00 = sin(Angle)*Force ; negate it if going left lda goleft @@ -1627,7 +1627,7 @@ DoNotAdd ;vy = sin(Angle) for Angle <=90 ;vy = sin(180-Angle) for 90 < Angle <= 180 - lda #0 + lda #0 sta vy sta vy+1 sta vy+2 @@ -1635,7 +1635,7 @@ DoNotAdd ldx Angle cpx #91 bcc YangleUnder90 - + lda #180 sec sbc Angle @@ -1669,7 +1669,7 @@ DoNotAddY rol Multiplier+2 dex bne MultiplyLoopY - ; here in vy there is a number + ; here in vy there is a number ; yyyy.yy=cos(Angle)*Force mva #0 vy+3 ;vy=cos(Angle)*Force @@ -1757,12 +1757,12 @@ LaserNoWalls nolaserwait lda color beq nonowait ; smoke tracer erases slowly - lda tracerflag + lda tracerflag bne nowait ; funky bomb explotes fast ( tracerflag in real is funkyflag :) ) -nonowait +nonowait jsr shellDelay ; - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys spl:rts ; exit if pressed 'Exit keys' ldx TankNr ; @@ -1797,7 +1797,7 @@ SkipCollisionCheck mwa xtraj+1 xdraw mwa ytraj+1 ydraw - + bit TestFlightFlag bvc NoTestFlight bit Vdebug @@ -1807,7 +1807,7 @@ SkipCollisionCheck NoTestFlight lda tracerflag bne NoUnPlot - + YesUnPlot jsr UnPlot @@ -1837,7 +1837,7 @@ EndOfFlight jmp SecondFlight EndOfFlight2 mva #0 tracerflag ; don't know why - + bit TestFlightFlag jmi NoHitAtEndOfFight ; RTS only !!! - no defendsives check ; and now check for defensive-aggressive weapon @@ -1861,7 +1861,7 @@ EndOfFlight2 lda ActiveWeapon,y cmp #ind_Tracer ; defence not fire by tracers beq JNoDefence - cmp #ind_Smoke_Tracer + cmp #ind_Smoke_Tracer beq JNoDefence cmp #ind_Laser ; Bouncy and Mag not fire by Laser beq JNoDefence @@ -1914,12 +1914,12 @@ NoTankHitAtEndOfFight NoHitAtEndOfFight NoDefence lsrw Force ; Force = Force / 2 - because earlier we multiplied by 2 - rts ; END !!! + rts ; END !!! BouncyCastle ; now in Y we have number of of the attacking player (TankNr) ! lda ActiveWeapon,y ; if Bouncy Castle bounced Funky Bomb - whole screen in range of soil down - cmp #ind_Funky_Bomb + cmp #ind_Funky_Bomb bne @+ jsr SetFullScreenSoilRange @ @@ -1965,7 +1965,7 @@ BouncyCastle ; to start where the tank's barrel ends ; (without it bullet would go from the left lower corner of the tank) ;ldx TankNr - + mwa EndOfTheBarrelX xtraj+1 mva EndOfTheBarrely ytraj+1 lda #0 @@ -1975,7 +1975,7 @@ BouncyCastle sta ytraj sta color - + ldy #100 ; ??? mva #1 tracerflag ; I do not know (I mean I think I know ;) ) ; 10 years later - I do not know!!! @@ -2068,7 +2068,7 @@ mrLoopi bne @+ ldx #0 @ stx MirvMissileCounter - + ; Y changes only for bullet number 0 ; because rest of the bullets have the same Y (height) @@ -2101,14 +2101,14 @@ mrLoopi jsr ShellDelay ; phx - jsr CheckExitKeys ; Check for O, Esc or Start+Option keys + jsr CheckExitKeys ; Check for O, Esc or Start+Option keys bpl ExitnotPressed plx rts ; exit if pressed 'Exit keys' ExitnotPressed plx ; - + MIRVdoNotChangeY lda MirvDown,x ; if bullet is already down we go with the next one @@ -2140,14 +2140,14 @@ MIRVdoNotChangeY ; if (Y>=0 and Y<=screenhight) and X<=screenwidth (bullet on the screen) - check collision ; if Y>screenhight and X>screenwidth (bullet under the screen on the left or right side) - stop flying without hit ; if Y>screenhight and X<=screenwidth (bullet under the screen) - check collision (allways hit) - - ; check bullet position and set flags: + + ; check bullet position and set flags: ; XposFlag - bullet positon X (0 - on screen , %1000000 - off-screen) ; YposFlag - bullet positon Y (0 - on screen , %1000000 - over the screen , %0100000 - under the screen) lda #$00 sta XposFlag sta YposFlag - lda ytraj+2 ; Y high byte + lda ytraj+2 ; Y high byte bpl @+ mva #%10000000 YposFlag ; bullet over the screen (Y) bmi MIRVsetXflag @@ -2341,13 +2341,13 @@ MakeBump sec lda #180 sbc LeapFrogAngle - sta LeapFrogAngle ; swap angle (LeapFrogAngle) + sta LeapFrogAngle ; swap angle (LeapFrogAngle) inc FunkyWallFlag rts WrapAndNone bvc NoWall cpw xtraj+1 #screenwidth - bcc OnScreen + bcc OnScreen ; (wrapping wall) inc FunkyWallFlag bit xtraj+2 @@ -2431,7 +2431,7 @@ SelectNextTank beq RepeatSpy SpyHardEnd mvx TargetTankNr TankNr ; restore - jsr DisplaySpyInfo + jsr DisplaySpyInfo rts .endp .proc DisplaySpyInfo @@ -2490,7 +2490,7 @@ EndLazy bcc IsToHigh sbc #12 ; tank with shield high correction bne StoreMaxAlt -IsToHigh +IsToHigh lda #18 StoreMaxAlt sta FloatingAlt @@ -2502,10 +2502,10 @@ StoreMaxAlt jsr TypeLine4x4.variableLength ldx TankNr - + ; TankNr in X reg. ; now animate Up - mva #0 modify ; it's a counter + mva #0 modify ; it's a counter TankGoUp lda ytankstable,x cmp FloatingAlt ; Floating altitude @@ -2576,7 +2576,7 @@ KeyboardAndJoyCheck lda ShieldEnergy,x cmp #20 bne LotOfFuel - + ; display text 4x4 - low fuel jsr SetLowFuelText jsr TypeLine4x4.variableLength @@ -2590,7 +2590,7 @@ notpressed ; let's animate "engine" jsr DrawTankEngine ; enimation ends - + lda SKSTAT cmp #$ff jeq checkJoy @@ -2616,7 +2616,7 @@ checkJoy and #$0f cmp #$0f beq notpressedJoy - tay + tay lda joyToKeyTable,y jmp jumpFromStick notpressedJoy @@ -2635,11 +2635,11 @@ pressedRight jsr ClearTankNr mva #0 Erase lda XtankstableH,x - cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 + cmp #>(screenwidth-TankWidth-4) ; tank width correction +4 bne @+ lda XtankstableL,x - cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels -@ bcs RightScreenEdge + cmp #<(screenwidth-TankWidth-4) ; tank width correction +4 pixels +@ bcs RightScreenEdge inc XtankstableL,x sne:inc XtankstableH,x jmp NoREdge @@ -2729,10 +2729,10 @@ CheckCollisionWithTankLoop bne @+ cpy xdraw @ - bcs LeftFromTheTank + bcs LeftFromTheTank tya ;add 20 (tank size*2 +2 and +2) clc - adc #20 + adc #20 tay lda xtankstableH,x adc #0 @@ -2828,7 +2828,7 @@ NotHighest jsr SoilDown2 ldx TankNr rts - + CalculateSoildown ldx TankNr clc @@ -2888,11 +2888,11 @@ CheckCollisionWithTankLoop cmp #ind_Mag_Deflector ; first shielded weapon bcc CheckCollisionWithNotShieldedTank cmp #ind_Bouncy_Castle +1 ; last shielded weapon - bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) - + bcc CheckCollisionWithShieldedTank ; tank with shield is bigger :) + ;lda ShieldEnergy,x ; there is wrong method to check shield :) ;bne CheckCollisionWithShieldedTank ; tank with shield is bigger :) - + CheckCollisionWithNotShieldedTank lda xtankstableH,x cmp xdraw+1 @@ -2944,10 +2944,10 @@ CheckCollisionWithShieldedTank bne @+ cpy xdraw @ - bcs LeftFromTheTank + bcs LeftFromTheTank tya ;add 16 double byte clc - adc #TankWidth+4+4 + adc #TankWidth+4+4 tay lda xtankstableH,x adc #0 @@ -3017,7 +3017,7 @@ CheckRangeRight RangesChecked rts -.endp +.endp ;-------------------------------------------------- .proc SetFullScreenSoilRange @@ -3031,7 +3031,7 @@ RangesChecked .endp ;-------------------------------------------------- .proc ClearScreenSoilRange -; cleanup of the soil fall down ranges (left and right) +; cleanup of the soil fall down ranges (left and right) ;-------------------------------------------------- mwa #screenwidth RangeLeft lda #0 @@ -3072,7 +3072,7 @@ noBullets .proc HowManyBullets ; in: A <-- Weapon number, TankNr ; out: A <-- How many bullets in the weapon, Y: weapon number -; how many bullets weapon of tank(TankNr) has, Result in A +; how many bullets weapon of tank(TankNr) has, Result in A ;-------------------------------------------------- tay ldx TankNr @@ -3080,11 +3080,10 @@ noBullets sta weaponPointer lda TanksWeaponsTableH,x sta weaponPointer+1 - + lda (weaponPointer),y ; and we have number of bullets in A rts .endp - + .ENDIF - \ No newline at end of file