commit 5dcf6bea02abf5a0fcbd3b0c40ee141fe73f9cd6 Author: Pawel Kalinowski Date: Sun Apr 22 01:34:59 2018 +0200 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3c577b0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5583c40 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# scorch diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..6057581 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,67 @@ +TODO and BUGS file +rev. 2013-11-17 + +--------------------------------------------------------- +Known bugs (+ means bug is fixed) ++001. when bullet goes straight down very fast it misses the tank + it happens only when tank is standing on the bottom of + the screen (no groud below) ++002. points after the round are not calculated correctly ++003. if death's head explodes low, the lowest explosion wraps + and appears on the top of the screen +004. when parachute is on and the tank dies (e.g. hit by a powerful + weapon) the dead (invisible) tank falls on parachute + (and uses one parachute more than necessary) +005. tank stands still on a one pixel spike - it should fall + (possibly all that is necessary is adjust of WhereToSlideTable) +006. After some attacks (like MIRV and leapfrog the OffensiveText + stays on the screen (and becomes a static decoration) + It possibly happens when a tank kills itself with mirv or leapfrog. +007. Decreasing of number of bullets after a shoot does not work correctly + (e.g. 2 bullets are deducted instead of 1) ++008. After a round the last tank sprite stays on the screen. + This hurts only when the last tank is under the table with results! +009. When result in points is >99 then only 2 first digits are displayed ++010. Even MORONS shoot their feet too often - increase min. randomised energy. ++011. High flying bullets sometimes cause brief screen garbage - like a DL damaged + for a fraction of a frame. + Update - these are NOT high flying bullets - it just happens during bullet flight ++012. (newly introduced) Death explosions are offset right and possibly up. ++013. sometimes demo mode does not work (it stops on results display) ++014: FunkyBomb shoots with too high angle +015: Only first shoot of FunkyBomb is correct (with smoke and fast), + the next are like missiles +016: Additional explosions after Frogger are not fallen down +017: Observed MIRV loops - it shoots and shoots MIRV all over the screen. Very rare. +-018: MINOR: ydraw, yhit, ybyte variable is sometimes treated as WORD, sometimes as BYTE. + Making it consistent would save both time and space (not much) + REJECTED: too much work - different routines depend on checking high byte. +--------------------------------------------------------- +To do ++001. Start each round with a)worst tank or b)random tank + (Worst tank starts first) ++002. Start each round with random angles (not always 45 degrees left) ++003. Add colour of the given tank to the screen + E.g. when a given tank is shooting it's colour could be behind + tank name on the text screen +004. The game has no end!!! Add ending!!! + A good idea for an ending - a TIP pic - Red Army taking Berlin :) + Another - vector tanks like in BattleZone + Another - stickman tankmen +005. Add number of rounds to the options menu +006. Add sound effects (maybe sampled? or mp0 (sound based on fft)) +007. There is no deffensive weapon handling (only parachute works, + but also provisionally ++008. No computer operated opponents - make a frame for AI!!! +009. Make AI in the existing frame +010. It is impossible to look up a number of parachutes left. ++011. Colouring the top status lines in a colour of the active tank. +012. Decreased number of bullets should be displayed just after the shoot. +013. Check LineTable - possibly it is unnecessarily long ++014. Demo mode - when all tanks are CPUs let them play non-stop! + (replace waiting for a key-press after a round with a small delay) ++015. Switch to mads for easier development (mads speeds it up, no doubt) +016. Speed up death's head (e.g.: draw each second circle) +-017. Wide screen mode (with scroll?) +018. Speed up soil down after soil eating weapons - correctly calculate + ranges as now range is very broad even when very little soil is eaten. diff --git a/ai.asm b/ai.asm new file mode 100644 index 0000000..04f7f63 --- /dev/null +++ b/ai.asm @@ -0,0 +1,402 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm + +; artificial intelligence of tanks goes here! +; in A there is a level of tank's intelligence +; 1-moron, ..., 7-cyborg, 8-UNKNOWN (the best of all) +; at the moment (2003-08-15) I have no idea how +; to program better opponents, but moron is easy - +; - shoots random direction and force +; greeeting to myself 10 years older in 2013-11-09... still no idea + +;---------------------------------------------- +MakeLowResDistances .proc + ; create low precision table of positions + ; by dividing positions by 4 + + ldy #MaxPlayers-1 +loop + lda xtankstableL,y + sta temp + lda xtankstableH,y + sta temp+1 + + ;= /4 + :2 lsrw temp + lda temp + sta LowResDistances,y + dey + bpl loop + rts +.endp + +;---------------------------------------------- +ArtificialIntelligence .proc ; +; A - skill of the TankNr +; returns shoot energy and angle in +; EnergyTable/L/H and AngleTable +;---------------------------------------------- + asl + tax + :2 dex ;credit KK + lda AIRoutines+1,x + pha + lda AIRoutines,x + pha + rts +.endp +;---------------- +AIRoutines + .word Moron-1 + .word Shooter-1 ;Shooter + .word Poolshark-1 ;Poolshark + .word Poolshark-1 ;Toosser + .word Poolshark-1 ;Chooser + .word Poolshark-1 ;Spoiler + .word Poolshark-1 ;Cyborg + .word Poolshark-1 ;Unknown + +;---------------------------------------------- +Moron .proc + ldx TankNr + jsr RandomizeAngle + sta NewAngle + mwa #80 RandBoundaryLow + mwa #800 RandBoundaryHigh + jsr RandomizeForce + rts +.endp +;---------------------------------------------- +Shooter .proc + + ldx TankNr + lda PreviousAngle,x + ora PreviousEnergyL,x + ora PreviousEnergyH,x + beq firstShoot + + lda PreviousAngle,x + clc + adc #5 + bmi leftQuadrant + cmp #90 + bcc continue + lda #(-90) + bne continue +leftQuadrant + + + +continue + sta NewAngle + + lda PreviousEnergyL,x + sta EnergyTableL,x + lda PreviousEnergyH,x + sta EnergyTableH,x + + jmp endo +firstShoot + ; compare the x position with the middle of the screen + lda xTanksTableL,x + sta temp + lda xTanksTableH,x + sta temp+1 + cpw temp #(screenwidth/2) + bcs tankIsOnTheRight + + lda RANDOM + and #$1F + clc + adc #5 + ;lda #45 + + sta NewAngle + jmp forceNow +tankIsOnTheRight + lda RANDOM + and #$1F + clc + adc #(-85) + ;lda #-45 + sta NewAngle + +forceNow + mwa #100 RandBoundaryLow + mwa #800 RandBoundaryHigh + jsr RandomizeForce + +endo + ldx TankNr ;this is possibly not necessary + lda NewAngle + sta PreviousAngle,x + lda EnergyTableL,x + sta PreviousEnergyL,x + lda EnergyTableH,x + sta PreviousEnergyH,x + + ; choose the best weapon + + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #32 ;the last weapon +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + rts + .endp +;---------------------------------------------- +Poolshark .proc + +firstShoot + ;find nearest tank neighbour + jsr MakeLowResDistances + mva #$ff temp2 ; min possible distance + + ldx TankNr + ldy NumberOfPlayers + dey + +loop01 + cpy TankNr + beq skipThisPlayer + lda eXistenZ,y + beq skipThisPlayer + + lda LowResDistances,x + cmp LowResDistances,y + bcs EnemyOnTheLeft + ;enemy on the right + sec + lda LowResDistances,y + sbc LowResDistances,x + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + ; calculate index to shotangle table + :3 lsr @ + and #%00000111 + clc + adc #8 + sta AngleTablePointer + jmp lowestIsLower + +EnemyOnTheLeft + sec + lda LowResDistances,x + sbc LowResDistances,y + cmp temp2 ; lowest + bcs lowestIsLower + sta temp2 + sty temp2+1 ; number of the closest tank + ; calculate index to shotangle table + :3 lsr @ + and #%00000111 + eor #%00000111 + sta AngleTablePointer + +lowestIsLower +skipThisPlayer + dey + bpl loop01 + + randomize 0 8 + ldy AngleTablePointer + clc + adc AngleTable,y + sta NewAngle + +forceNow + mwa #300 RandBoundaryLow + mwa #700 RandBoundaryHigh + jsr RandomizeForce + +endo + ldx TankNr ;this is possibly not necessary + + ; choose the best weapon + + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + ldy #32 ;the last weapon +loop + dey + lda (temp),y + beq loop + tya + sta ActiveWeapon,x + rts + +;---------------------------------------------- +AngleTable ; 16 bytes ;ba w $348b L$3350 + .by 178,186,194,202,210,218,226,234 + .by 16,24,32,40,48,56,64,72 + .endp +;---------------------------------------------- +PurchaseAI .proc ; +; A - skill of the TankNr +; makes purchase for AI opponents +; results of this routine are not visible on the screen +;---------------------------------------------- + asl + tax + :2 dex ;credit KK + lda PurchaseAIRoutines+1,x + pha + lda PurchaseAIRoutines,x + pha + rts + .endp + +;---------------- +PurchaseAIRoutines + .word MoronPurchase-1 + .word ShooterPurchase-1 ;ShooterPurchase + .word PoolsharkPurchase-1 ;PoolsharkPurchase + .word PoolsharkPurchase-1 ;ToosserPurchase + .word PoolsharkPurchase-1 ;ChooserPurchase + .word PoolsharkPurchase-1 ;SpoilerPurchase + .word PoolsharkPurchase-1 ;CyborgPurchase + .word PoolsharkPurchase-1 ;UnknownPurchase + +;---------------------------------------------- +MoronPurchase +;Moron buys nothing + rts + +;------- +TryToPurchaseOnePiece .proc + ; A - weapon number, better it will be in range(1,32) + ; TankNr in X + tay + lda PurchaseMeTable,y + beq SorryNoPurchase + lda WeaponPriceL,y + sta temp + lda WeaponPriceH,y + sta temp+1 + ;price of the weapon in temp + lda MoneyL,x + sta temp2 + lda MoneyH,x + sta temp2+1 + ;current monies in temp2 + cpw temp2 temp + bcc SorryNoPurchase + ; deduct monies from the bank account + sec + lda temp2 + sbc temp + sta MoneyL,x + lda temp2+1 + sbc temp+1 + sta MoneyH,x + + lda TanksWeaponsTableL,x + sta temp + lda TanksWeaponsTableH,x + sta temp+1 + + lda WeaponUnits,y + clc + adc (temp),y + cmp #99 ;max number of weapon units + bcc NotExceeded + lda #99 +NotExceeded + sta (temp),y + + +SorryNoPurchase + rts + .endp + + +;---------------------------------------------- +ShooterPurchase .proc + mva #4 tempXroller; number of purchases to perform + + ldx TankNr +loop + randomize 1 14 + jsr TryToPurchaseOnePiece + dec tempXroller + bne loop + + rts + .endp +;---------------------------------------------- +PoolsharkPurchase .proc + mva #8 tempXroller; number of purchases to perform + + ldx TankNr +loop + randomize 1 30 + jsr TryToPurchaseOnePiece + dec tempXroller + bne loop + + rts +.endp + + +PurchaseMeTable .proc ;weapons good to be purchased by the robot + ;the comment is an index in the tables + dta 1 ;"Baby Missile " ; 0 + dta 1 ;"Missile " ; 1 + dta 1 ;"Baby Nuke " ; 2 + dta 1 ;"Nuke " ; 3 + dta 1 ;"LeapFrog " ; 4 + dta 1 ;"Funky Bomb " ; 5 + dta 1 ;"MIRV " ; 6 + dta 1 ;"Death's Head " ; 7 + dta 0 ;"Napalm " ; 8 + dta 0 ;"Hot Napalm " ; 9 + dta 0 ;"Tracer " ; 10 + dta 0 ;"Smoke Tracer " ; 11 + dta 1 ;"Baby Roller " ; 12 + dta 1 ;"Roller " ; 13 + dta 1 ;"Heavy Roller " ; 14 + dta 0 ;"Riot Charge " ; 15 + dta 0 ;"Riot Blast " ; 16 + dta 0 ;"Riot Bomb " ; 17 + dta 0 ;"Heavy Riot Bomb " ; 18 + dta 0 ;"Baby Digger " ; 19 + dta 0 ;"Digger " ; 20 + dta 0 ;"Heavy Digger " ; 21 + dta 0 ;"Baby Sandhog " ; 22 + dta 0 ;"Sandhog " ; 23 + dta 0 ;"Heavy Sandhog " ; 24 + dta 0 ;"Dirt Clod " ; 25 + dta 0 ;"Dirt Ball " ; 26 + dta 0 ;"Ton of Dirt " ; 27 + dta 1 ;"Liquid Dirt " ; 28 + dta 0 ;"Dirt Charge " ; 29 + dta 0 ;"Earth Disrupter " ; 30 + dta 1 ;"Plasma Blast " ; 31 + dta 1 ;"Laser " ; 32 + dta 0 ;"----------------" ; 33 + dta 0 ;"----------------" ; 34 + dta 0 ;"----------------" ; 35 + dta 0 ;"----------------" ; 36 + dta 0 ;"----------------" ; 37 + dta 0 ;"----------------" ; 38 + dta 0 ;"----------------" ; 39 + dta 0 ;"----------------" ; 40 + dta 0 ;"----------------" ; 41 + dta 0 ;"----------------" ; 42 + dta 0 ;"----------------" ; 43 + dta 0 ;"----------------" ; 44 + dta 0 ;"----------------" ; 45 + dta 0 ;"----------------" ; 46 + dta 0 ;"----------------" ; 47 + +.endp + \ No newline at end of file diff --git a/artwork/TALK1.txt b/artwork/TALK1.txt new file mode 100644 index 0000000..6606cbe --- /dev/null +++ b/artwork/TALK1.txt @@ -0,0 +1,54 @@ +IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW. +DIE! +EAT MY SHORTS! +YOU'RE TOAST! +BANZAI! +FROM HELL'S HEART I STAB AT THEE... +I DIDN'T DO IT. NOBODY SAW ME DO IT. +TAKE A HIKE! +YOU'RE DEAD MEAT. +MAKE MY DAY. +CHARGE! +ATTACK! +YOU'RE OUTTA HERE. +WATTSA MATTA YOU? +FREEZE, OR I'LL SHOOT! +HA HA HA. +WE COME IN PEACE - SHOOT TO KILL! +IN YOUR FACE! +DIE COMMIE PIG! +I LOVE THE SMELL OF NAPALM IN THE MORNING. +VICTORY! +SHOW SOME RESPECT. +JUST WHO DO YOU THINK YOU ARE? +LOOK OUT BELOW! +KNOCK, KNOCK. +LOOK OVER THERE. +GUESS WHAT'S COMING FOR DINNER? +MERRY CHRISTMAS. +OPEN WIDE! +HERE GOES NOTHING... +DON'T WORRY, IT ISN'T A LIVE ROUND. +BLOOD, PAIN, VIOLENCE! +TAKE THIS, SISSY! +I SHALL FLATTEN YOU! +I SHALL SMASH YOUR UGLY TANK! +I WONDER WHAT THIS BUTTON DOES? +DON'T TAKE THIS PERSONALLY. +WOULD THIS MAKE YOU MAD? +I TOLD YOU TO LEAVE MY SISTER ALONE! +I COULD SPARE YOU, BUT WHY? +MY BOMB IS BIGGER THAN YOURS. +DON'T FORGET ABOUT ME! +HASTA LA VISTA, BABY! +THIS IS YOUR BRAIN ON SCORCH. +TAKE THIS! +THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US. +DIE, ALIEN SWINE! +SAY "ARRGGHHHHH...." +I SHALL OIL MY TURRET WITH YOUR BLOOD. +DIE, TANK-SCUM! +I'M GONNA BREAK YOUR FACE! +MAMA SAID KNOCK YOU OUT! +I HOPE YOU ENJOY PAIN! +PARTING IS SUCH SWEET SORROW... NOT! diff --git a/artwork/TALK2.txt b/artwork/TALK2.txt new file mode 100644 index 0000000..ef9156a --- /dev/null +++ b/artwork/TALK2.txt @@ -0,0 +1,60 @@ +UGH! +AARGH! +AAAGGHHH! +I'M MELTING! +OOF.. +OH! +EEEK! +AACCH! +I HATE IT WHEN THAT HAPPENS. +ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY. +OH NO! +NOT ME! +OUCH. +OH NO, NOT AGAIN. +ANOTHER ONE BITES THE DUST. +GOODBYE. +HELP ME! +FAREWELL, CRUEL WORLD. +REMEMBER THE ALAMO! +OH MAN! +DOOUGH! +ANOTHER DAY, ANOTHER BOMB. +THIS IS THE END, MY ONLY FRIEND. +IT'S ALL OVER. +THE FAT LADY SANG. +WHY DOES EVERYTHING HAPPEN TO ME? +I'M GOING DOWN. +I'VE GOT A BAD FEELING ABOUT THIS. +CRAPOLA. +POW! +BIF! +BAM! +ZONK! +I SHOULD'VE LISTENED TO MY MOTHER... +NO... A BUD LIGHT! +WHAT WAS THAT NOISE? +MAMA SAID THERE'D BE DAYS LIKE THIS. +ITS JUST ONE OF THOSE DAYS... +I SEE A BRIGHT LIGHT... +MOMMY? IS THAT YOU? +I LET YOU HIT ME! +SUCKER SHOT! +I DIDN'T WANT TO LIVE ANYWAY. +-- +WAS THAT AS CLOSE AS I THINK IT WAS? +JOIN THE ARMY, SEE THE WORLD THEY SAID. +IT WASN'T JUST A JOB IT WAS AN ADVENTURE! +I DIDN'T LIKE VIOLENCE ANYWAY! +I THOUGHT YOU LIKED ME? +SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT. +I THINK THIS GUY'S A LITTLE CRAZY. +SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE. +HEY! KILLIN' AIN'T COOL. +GEE... THANKS. +I'VE FALLEN AND I CAN'T GET UP! +911? +OH NO! HERE I BLOW AGAIN! +I'LL BE BACK... +HEY - I'VE GOT LAWYERS. +TIME TO CALL 1-900-SUE-TANK. diff --git a/artwork/font4x4s.bmp b/artwork/font4x4s.bmp new file mode 100644 index 0000000..f2d826d Binary files /dev/null and b/artwork/font4x4s.bmp differ diff --git a/artwork/talk.asm b/artwork/talk.asm new file mode 100644 index 0000000..6f99c7e --- /dev/null +++ b/artwork/talk.asm @@ -0,0 +1,125 @@ +.proc talk +L0 dta c"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW." +L1 dta c"DIE!" +L2 dta c"EAT MY SHORTS!" +L3 dta c"YOU'RE TOAST!" +L4 dta c"BANZAI!" +L5 dta c"FROM HELL'S HEART I STAB AT THEE..." +L6 dta c"I DIDN'T DO IT. NOBODY SAW ME DO IT." +L7 dta c"TAKE A HIKE!" +L8 dta c"YOU'RE DEAD MEAT." +L9 dta c"MAKE MY DAY." +L10 dta c"CHARGE!" +L11 dta c"ATTACK!" +L12 dta c"YOU'RE OUTTA HERE." +L13 dta c"WATTSA MATTA YOU?" +L14 dta c"FREEZE, OR I'LL SHOOT!" +L15 dta c"HA HA HA." +L16 dta c"WE COME IN PEACE - SHOOT TO KILL!" +L17 dta c"IN YOUR FACE!" +L18 dta c"DIE COMMIE PIG!" +L19 dta c"I LOVE THE SMELL OF NAPALM IN THE MORNING." +L20 dta c"VICTORY!" +L21 dta c"SHOW SOME RESPECT." +L22 dta c"JUST WHO DO YOU THINK YOU ARE?" +L23 dta c"LOOK OUT BELOW!" +L24 dta c"KNOCK, KNOCK." +L25 dta c"LOOK OVER THERE." +L26 dta c"GUESS WHAT'S COMING FOR DINNER?" +L27 dta c"MERRY CHRISTMAS." +L28 dta c"OPEN WIDE!" +L29 dta c"HERE GOES NOTHING..." +L30 dta c"DON'T WORRY, IT ISN'T A LIVE ROUND." +L31 dta c"BLOOD, PAIN, VIOLENCE!" +L32 dta c"TAKE THIS, SISSY!" +L33 dta c"I SHALL FLATTEN YOU!" +L34 dta c"I SHALL SMASH YOUR UGLY TANK!" +L35 dta c"I WONDER WHAT THIS BUTTON DOES?" +L36 dta c"DON'T TAKE THIS PERSONALLY." +L37 dta c"WOULD THIS MAKE YOU MAD?" +L38 dta c"I TOLD YOU TO LEAVE MY SISTER ALONE!" +L39 dta c"I COULD SPARE YOU, BUT WHY?" +L40 dta c"MY BOMB IS BIGGER THAN YOURS." +L41 dta c"DON'T FORGET ABOUT ME!" +L42 dta c"HASTA LA VISTA, BABY!" +L43 dta c"THIS IS YOUR BRAIN ON SCORCH." +L44 dta c"TAKE THIS!" +L45 dta c"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." +L46 dta c"DIE, ALIEN SWINE!" +L47 dta c"SAY ARRGGHHHHH...." +L48 dta c"I SHALL OIL MY TURRET WITH YOUR BLOOD." +L49 dta c"DIE, TANK-SCUM!" +L50 dta c"I'M GONNA BREAK YOUR FACE!" +L51 dta c"MAMA SAID KNOCK YOU OUT!" +L52 dta c"I HOPE YOU ENJOY PAIN!" +;-------------------------------- +L53 dta c"PARTING IS SUCH SWEET SORROW... NOT!" +L54 dta c"UGH!" +L55 dta c"AARGH!" +L56 dta c"AAAGGHHH!" +L57 dta c"I'M MELTING!" +L58 dta c"OOF.." +L59 dta c"OH!" +L60 dta c"EEEK!" +L61 dta c"AACCH!" +L62 dta c"I HATE IT WHEN THAT HAPPENS." +L63 dta c"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." +L64 dta c"OH NO!" +L65 dta c"NOT ME!" +L66 dta c"OUCH." +L67 dta c"OH NO, NOT AGAIN." +L68 dta c"ANOTHER ONE BITES THE DUST." +L69 dta c"GOODBYE." +L70 dta c"HELP ME!" +L71 dta c"FAREWELL, CRUEL WORLD." +L72 dta c"REMEMBER THE ALAMO!" +L73 dta c"OH MAN!" +L74 dta c"DOOUGH!" +L75 dta c"ANOTHER DAY, ANOTHER BOMB." +L76 dta c"THIS IS THE END, MY ONLY FRIEND." +L77 dta c"IT'S ALL OVER." +L78 dta c"THE FAT LADY SANG." +L79 dta c"WHY DOES EVERYTHING HAPPEN TO ME?" +L80 dta c"I'M GOING DOWN." +L81 dta c"I'VE GOT A BAD FEELING ABOUT THIS." +L82 dta c"CRAPOLA." +L83 dta c"POW!" +L84 dta c"BIF!" +L85 dta c"BAM!" +L86 dta c"ZONK!" +L87 dta c"I SHOULD'VE LISTENED TO MY MOTHER..." +L88 dta c"NO... A BUD LIGHT!" +L89 dta c"WHAT WAS THAT NOISE?" +L90 dta c"MAMA SAID THERE'D BE DAYS LIKE THIS." +L91 dta c"ITS JUST ONE OF THOSE DAYS..." +L92 dta c"I SEE A BRIGHT LIGHT..." +L93 dta c"MOMMY? IS THAT YOU?" +L94 dta c"I LET YOU HIT ME!" +L95 dta c"SUCKER SHOT!" +L96 dta c"I DIDN'T WANT TO LIVE ANYWAY." +L97 dta c"--" +L98 dta c"WAS THAT AS CLOSE AS I THINK IT WAS?" +L99 dta c"JOIN THE ARMY, SEE THE WORLD THEY SAID." +L100 dta c"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" +L101 dta c"I DIDN'T LIKE VIOLENCE ANYWAY!" +L102 dta c"I THOUGHT YOU LIKED ME?" +L103 dta c"SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT." +L104 dta c"I THINK THIS GUY'S A LITTLE CRAZY." +L105 dta c"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." +L106 dta c"HEY! KILLIN' AIN'T COOL." +L107 dta c"GEE... THANKS." +L108 dta c"I'VE FALLEN AND I CAN'T GET UP!" +L109 dta c"911?" +L110 dta c"OH NO! HERE I BLOW AGAIN!" +L111 dta c"I'LL BE BACK..." +L112 dta c"HEY - I'VE GOT LAWYERS." +L113 dta c"TIME TO CALL 1-900-SUE-TANK." +OffensiveTextTableL + 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,>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 +OffensiveTextLengths + dta 43,4,14,13,7,35,37,12,17,12,7,7,18,17,22,9,33,13,15,42,8,18,30,15,13,16,31,16,10,20,35,22,17,20,29,31,27,24,36,27,29,22,21,29,10,48,17,20,38,15,26,24,22,36,4,6,9,12,5,3,5,6,28,39,6,7,5,17,27,8,8,22,19,7,7,26,32,14,18,33,15,34,8,4,4,4,5,36,18,20,36,29,23,19,17,12,29,7,36,39,41,30,23,48,34,42,25,14,31,4,26,15,23,28 +NumberOfOffensiveTexts=54 +NumberOfDeffensiveTexts=60 +.endp diff --git a/artwork/tanks.fnt b/artwork/tanks.fnt new file mode 100644 index 0000000..e7d11ef Binary files /dev/null and b/artwork/tanks.fnt differ diff --git a/artwork/textconv.py b/artwork/textconv.py new file mode 100644 index 0000000..f52f71b --- /dev/null +++ b/artwork/textconv.py @@ -0,0 +1,48 @@ +import sys +from string import strip + +lineCount = 0 +lengths = [] +alltexts = [] + +for line in open("TALK1.txt"): + lineCount+=1 + line = strip(line) + lengths.append(len(line)) + alltexts.append(line) +off = lineCount + +for line in open("TALK2.txt"): + lineCount+=1 + line = strip(line) + lengths.append(len(line)) + alltexts.append(line) + +tmpNo = 0 +for line in alltexts: + print ("L"+str(tmpNo)+' dta "'+line+'"') + tmpNo+= 1 +l="" +for i in range(0,lineCount): + l+="0 ;this is a trick that prevents compiling this file alone + +;----------------------------------------------------- +;-------------display-lists--------------------------- +;----------------------------------------------------- +PurchaseDL + .byte $70,$70,$20 + .byte $42 + .word textbuffer2 + .byte $02,$10,$42 +MoreUpdl + .word EmptyLine + .byte 0,$42 +WeaponsListDL + .word ListOfWeapons + .byte 0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0 + .byte $42 +MoreDownDL + .word EmptyLine + .byte $10,$42 + .word WeaponsDescription + .byte 2 + .byte $41 + .word PurchaseDL +;------------------------ +OptionsDL + .byte $70,$70,$70,$70,$70 + .byte $42 + .word OptionsScreen + .byte $02,$02,$70,$02,0,$02,0,$2,0,$2 + .byte $41 + .word OptionsDL +;------------------------ +;Enter names of tanks DL +NameDL + .byte $70,$70,$70,$70,$70 + .byte $42 + .word NameScreen + .byte $30 + .byte $02,$30,$2 + .byte $10,2,2,2,$30,2,2 + .byte $41 + .word NameDL +; ------------------------------------------------- + +dl ; MAIN game display list + .byte $70,$00 + .byte $42 + .word textbuffer + .byte $02 +$80 ;DLI + .byte $00 + + .byte $4f + .word WhiteLine + .byte $4f + .word PlotLine + .byte $4f + .word WhiteLine + + .byte $4f + .word display + + :100 .by $0f + .by $0f + .by $4f + .wo display+$0ff0 + :97 .byte $0f + .byte $41 + .word dl +; horizontal line +WhiteLine + :screenBytes .by $ff +PlotLine = display + screenHeight*screenBytes ; the last line is plot pointer +;----------------------------------------------- +;Screen displays go first to avoid crossing 4kb barrier +;----------------------------------------------- +OptionsScreen + dta d"Welcome to Scorch ver. 124 (cc)2000-2013" + dta d" Please select option with cursor keys " + dta d" and press (Return) to proceed " +OptionsHere + ; 0123456789012345678901234567890123456789 + dta d"Players : 2 3 4 5 6 " + dta d"Cash : none 2K 5K 8K 10K " + dta d"Gravity : 0.2G 0.5G 1G 2G 4G " + dta d"Wind : 1B 3B 5B 7B 9B " +OptionsScreenEnd +; ------------------------------------------------- +NameScreen + dta d" Enter names of players " + dta d" Tank 01 Name:" +NameAdr + dta d" " + dta d" Human/Atari (difficulty level) " + dta d" " +NamesOfLevels + dta d" HUMAN Moron Shooter " + dta d" Poolshark Toosser Chooser " + dta d" Spoiler Cyborg Unknown " + dta d" " + dta d"Tab"* + dta d" - Player/Difficulty level " + dta d" " + dta d"Return"* + dta d" - Proceed " +;--------------------------------------------------- +MoreUp + dta d" " + dta 92,92,92 + dta d" more " + dta 92,92,92 + dta d" " +MoreDown + dta d" " + dta 93,93,93 + dta d" more " + dta 93,93,93 + dta d" " +ListOfWeapons + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " +ListOfWeapons1End +ListOfDefensiveWeapons + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " + dta d" " +ListOfDefensiveWeaponsEnd ;constant useful when clearing +WeaponsDescription + dta d" " + dta d"Tab"* + dta d" - Defensive/Offensive weapon " + dta d" " + dta d"Space"* + dta d" - Purchase " + dta d"Return"* + dta d" - Finish " +EmptyLine + dta d" " +;----------------------------------------------- +textbuffer + dta d"Player: " + dta d" " +textbuffer2 + dta d"Player: ******** Cash: 00000 " + dta d"----------------------------------------" + + +.endif diff --git a/grafproc.asm b/grafproc.asm new file mode 100644 index 0000000..4742c4f --- /dev/null +++ b/grafproc.asm @@ -0,0 +1,1512 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm + + .IF *>0 ;this is a trick that prevents compiling this file alone + + +;-------------------------------------------------- +draw .proc ;;fuxxing good draw :) +;-------------------------------------------------- +;creditz to Dr Jankowski / MIM U.W. +; (xi,yi)-----(xk,yk) +;20 DX=XK-XI +;30 DY=YK-YI +;40 DP=2*DY +;50 DD=2*(DY-DX) +;60 DI=2*DY-DX +;70 REPEAT +;80 IF DI>=0 +;90 DI=DI+DD +;100 YI=YI+1 +;110 ELSE +;120 DI=DI+DP +;130 ENDIF +;140 plot XI,YI +;150 XI=XI+1 +;160 UNTIL XI=XK + + + ; begin: xdraw,ydraw - end: xbyte,ybyte + ; let's store starting coordinates + ; will be needed, because everything is calculated relatively + mwa #0 LineLength + mwa xdraw xtempDRAW + mwa ydraw ytempDRAW + + ; if line goes our of the screen we are not drawing it, but... + + cpw xdraw #screenwidth + bcs DrawOutOfTheScreen + cpw xbyte #screenwidth + bcs DrawOutOfTheScreen + ;cpw ydraw #screenheight + ;bcs DrawOutOfTheScreen + ;cpw ybyte #screenheight + ;bcc DrawOnTheScreen + lda ydraw+1 + bne DrawOutOfTheScreen + lda ybyte+1 + beq DrawOnTheScreen +DrawOutOfTheScreen + ;jsr DrawJumpPad + rts +DrawOnTheScreen + ; constant parameters + ; XI=0 ,YI=0 + lda #0 + sta XI + sta XI+1 + sta YI + sta YI+1 + + ; setting the direction controll bits + cpw ydraw ybyte + bcc LineDown + ; here one line up + ; we are setting bit 0 + mva #1 HowToDraw ;here we can because it's first operation + ; we are subctracting Yend from Ybegin (reverse order) + ; DY=YI-YK + sbw ydraw ybyte DY + jmp CheckDirectionX +LineDown + ; one line down here + ; we are setting bit 0 + mva #0 HowToDraw ;here we can because it's first operation + ; substract Ybegin from Yend (normal order) + ; DY=YK-YI + sbw ybyte ydraw DY +CheckDirectionX + cpw xdraw xbyte + bcc LineRight + ; here goes line to the left + ; we set bit 1 + + lda HowToDraw + ora #$02 + sta HowToDraw + ; substract Xend from Xbegin (reverse) + ; DX=XI-XK + sbw xdraw xbyte DX + jmp CheckDirectionFactor +LineRight + ; here goes one line to the right + ; we clear bit 0 + ; we can do nothing because the bit is cleared! + + ;lda HowToDraw + ;and #$FD + ;sta HowToDraw + + ; substracting Xbegin from Xend (normal way) + ; DX=XK-XI + sbw xbyte xdraw DX +CheckDirectionFactor + ; here we check Direction Factor + ; I do not know if we are using proper English word + ; but the meaning is 'a' in y=ax+b + + ; lda DX + ; we already have DX in A + cpw DX DY + + bcc SwapXY + ; 'a' factor is fire, so we copy parameters + ; XK=DX + mwa DX XK + ; i kasowanie bitu 2 + ; and bit 2 clear + ; (is not needed because already cleared) + ;lda HowToDraw + ;and #$FB + ;sta HowToDraw + jmp LineParametersReady +SwapXY + ; not this half of a quarter! - parameters must be swapped + ; XK=DY + ; DY=DX + ; DX=XK - because DY is there so DY and DX are swapped + ; YK ... not used + mwa DY XK + mwa DX DY + mwa XK DX + + ; and let's set bit 2 + lda HowToDraw + ora #$04 + sta HowToDraw +LineParametersReady + ; let's check if length is not zero + lda DX + ora DX+1 + ora DY + ora DY+1 + jeq EndOfDraw + + ; here we have DX,DY,XK and we know which operations + ; are to be performed with these factors when doing PLOT + ; (accordingly to given bits of 'HowToDraw') + ; Now we must calculate DP, DD and DI + ; DP=2*DY + ; DD=2*(DY-DX) + ; DI=2*DY-DX + + mwa DY DP + aslw DP + + sbw DY DX DD + aslw DD + + mwa DY DI + aslw DI + sbw DI DX + +DrawLoop + ; REPEAT + ; IF DI>=0 + lda DI+1 + bmi DINegative + ; DI=DI+DD + ; YI=YI+1 + adw DI DD + adw YI #1 + jmp drplot +DINegative + ; ELSE + ; DI=DI+DP + adw DI DP + +drplot ; Our plot that checks how to calculate pixels. + ; In xtempDRAW and ycircle there are begin coordinates + ; of our line + ; First we check the 'a' factor (like in y=ax+b) + ; If necessary we swap XI and YI + ; (as we can not change XI and YI we move XI to temp2 + ; and YI to temp) + + + lda HowToDraw + and #$04 + bne SwappedXY + mwa XI temp + mwa YI temp2 + jmp CheckPlotY +SwappedXY + mwa XI temp2 + mwa YI temp +CheckPlotY + lda HowToDraw + and #01 + bne LineGoesUp + ; here we know that line goes down and we are not changing Y + adw temp2 ytempDRAW ydraw ; YI + jmp CheckPlotX +LineGoesUp + ; line goes up here - we are reversing Y + sbw ytempDRAW temp2 ydraw ; YI +CheckPlotX + lda HowToDraw + and #02 + bne LineGoesLeft + ; here we know that line goes right and we are not changing X + adw temp xtempDRAW xdraw ; XI + jmp PutPixelinDraw +LineGoesLeft + ; line goes left - we are reversing X + sbw xtempDRAW temp xdraw ; XI +PutPixelinDraw + jsr DrawJumpPad +; end of the special PLOT for DRAW + + ; XI=XI+1 + ; UNTIL XI=XK + adw XI #1 + cpw XI XK + jne DrawLoop + +EndOfDraw + mwa xtempDRAW xdraw + mva ytempDRAW ydraw + rts +.endp + +DrawJumpPad + jmp (DrawJumpAddr) +Drawplot + jmp plot +DrawLen + adw LineLength #1 + rts + +DrawCheck .proc +; lda SmokeTracerFlag +; bne yestrace ; jakie to głupie.... + lda tracerflag + ora SmokeTracerFlag +yestrace + beq notrace + jsr plot +notrace +;aftertrace + lda HitFlag + bne StopHitChecking + +CheckCollisionDraw + ; checking collision! + lda ydraw+1 + bne StopHitChecking + + jsr CheckCollisionWithTank + lda HitFlag + bne StopHitChecking + + mwa xdraw temp + ;adw temp --- it does not work!!!!!!!! and should? OMC ??? #mountaintable + clc + lda temp + adc #mountaintable + sta temp+1 + + ldy #0 + lda ydraw + cmp (temp),y + bcc StopHitChecking + + mva #1 HitFlag + mwa xdraw XHit + mwa ydraw YHit + + +StopHitChecking + rts +.endp + +;-------------------------------------------------- +circle .proc ;fxxxing good circle drawing :) +;-------------------------------------------------- +;Turbo Basic source +; R=30 +; XC=0:YC=R +; FX=0:FY=8*R:FS=4*R+3 +; WHILE FX0 +; FS=FS-FX-4 +; ELSE +; YC=YC-1 +; FY=FY-8 +; FS=FS-FX-4+FY +; ENDIF +; WEND +; splot8 + + mwa xdraw xcircle + mva ydraw ycircle + + mwa #0 xc + mva radius yc + mva #0 fx + mva radius fy + asl FY + asl FY + mva FY FS + asl FY + clc + lda FS + adc #3 + sta FS + +circleloop + lda FX + cmp FY + bcs endcircleloop + jsr splot8 + inc XC + + clc + lda FX + adc #8 + sta FX + + lda FS + beq else01 + bmi else01 + sec + sbc FX + sbc #4 + sta FS + jmp endif01 +else01 + dec YC + sec + lda FY + sbc #8 + sta FY + + lda FS + sec + sbc FX + sbc #4 + clc + adc FY + sta FS +endif01 + jmp circleloop +endcircleloop + + jsr splot8 + + mwa xcircle xdraw + mva ycircle ydraw + rts +.endp +;---- +splot8 .proc +; plot xcircle+XC,ycircle+YC +; plot xcircle+XC,ycircle-YC +; plot xcircle-XC,ycircle-YC +; plot xcircle-XC,ycircle+YC + +; plot xcircle+YC,ycircle+XC +; plot xcircle+YC,ycircle-XC +; plot xcircle-YC,ycircle-XC +; plot xcircle-YC,ycircle+XC + + clc + lda xcircle + adc XC + sta xdraw + lda xcircle+1 + adc #0 + sta xdraw+1 + ;clc + lda ycircle + adc YC + sta ydraw + sta tempcir + jsr plot + + sec + lda ycircle + sbc YC + sta ydraw + jsr plot + + sec + lda xcircle + sbc XC + sta xdraw + lda xcircle+1 + sbc #0 + sta xdraw+1 + jsr plot + + lda tempcir + sta ydraw + jsr plot +;--- + clc + lda xcircle + adc yC + sta xdraw + lda xcircle+1 + adc #0 + sta xdraw+1 + ;clc + lda ycircle + adc xC + sta ydraw + sta tempcir + jsr plot + + sec + lda ycircle + sbc xC + sta ydraw + jsr plot + + sec + lda xcircle + sbc yC + sta xdraw + lda xcircle+1 + sbc #0 + sta xdraw+1 + jsr plot + + lda tempcir + sta ydraw + jsr plot + + RTS +.endp + +;-------------------------------------------------- +WaitForKeyRelease .proc +;-------------------------------------------------- + lda SKSTAT + cmp #$ff + beq KeyIsReleased + cmp #$f7 + bne WaitForKeyRelease +KeyIsReleased + rts +.endp + +;-------------------------------------------------- +clearscreen .proc +;-------------------------------------------------- + lda #0 + tax +Loopi1 + sta display,x + sta display+$100,x + sta display+$200,x + sta display+$300,x + sta display+$400,x + sta display+$500,x + sta display+$600,x + sta display+$700,x + sta display+$800,x + sta display+$900,x + sta display+$a00,x + sta display+$b00,x + sta display+$c00,x + sta display+$d00,x + sta display+$e00,x + sta display+$f00,x + sta display+$1000,x + sta display+$1100,x + sta display+$1200,x + sta display+$1300,x + sta display+$1400,x + sta display+$1500,x + sta display+$1600,x + sta display+$1700,x + sta display+$1800,x + sta display+$1900,x + sta display+$1a00,x + sta display+$1b00,x + sta display+$1c00,x + sta display+$1d00,x + sta display+$1e00,x + sta display+$1f00,x + inx + bne Loopi1 + rts +.endp +;-------------------------------*------------------ +placetanks .proc +;-------------------------------------------------- + ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 + lda #0 +skip09 + ; clearing the tables with coordinates of the tank + ; 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 + dex + bpl skip09 + + + mwa #0 temptankX + mva #0 temptankNr ;player number +StillRandomize + ldx NumberOfPlayers + lda random + and #$07 + tay + cpy NumberOfPlayers + bcs StillRandomize + lda xtankstableL,y + bne StillRandomize + lda xtankstableH,y + bne StillRandomize + ; here we know that we got a random number + ; of the tank that is not in use + ; this number is in Y + + clc + lda temptankX + adc disktance,x + sta temptankX + sta xtankstableL,y + bcc NotHigherByte03 + inc temptankX+1 +NotHigherByte03 + lda temptankX+1 + sta xtankstableH,y + INC temptankNr + ldx temptankNr + Cpx NumberOfPlayers + bne StillRandomize + +; getting random displacements relative to even positions + ldx #$00 +StillRandomize02 + lda random + and #$1f ; maximal displacement is 31 pixels + + clc + adc xtankstableL,x + sta xtankstableL,x + bcc NotHigherByte02 + inc xtankstableH,x +NotHigherByte02 +; and we deduct 15 to make the displacement work two ways + sec + lda xtankstableL,x + sbc #$0f + sta xtankstableL,x + bcs NotHigherByte01 + dec xtankstableH,x +NotHigherByte01 + +; and clear lowest bit to be sure that the X coordinate is even +; (this is to have P/M background look nice) + lda xtankstableL,x + and #$fe + sta xtankstableL,x + inx + Cpx NumberOfPlayers + bne StillRandomize02 + rts + +; during calculating heights of thw mountains +; check if the tank is not somewhere around +; if so, make horizontal line 8 pixels long +CheckTank + ldx NumberOfPlayers + dex +CheckNextTank + lda xtankstableL,x + cmp xdraw + bne UnequalTanks + lda xtankstableH,x + cmp xdraw+1 + bne UnequalTanks + lda ydraw + ;sec + ;sbc #$01 ; minus 1, because it was 1 pixel too high + sta ytankstable,x ; what's the heck is that????!!!! + mva #7 deltaX + mwa #0 delta +UnequalTanks + dex + bpl CheckNextTank + rts +.endp +;------------------------------------------------- +drawtanks +;------------------------------------------------- + + + lda tanknr + pha + ldx #$00 + stx tanknr + +DrawNextTank + jsr drawtanknr + inc tanknr + ldx tanknr + Cpx NumberOfPlayers + bne DrawNextTank + + pla + sta tankNr + + rts +;--------- +drawtanknr + ldx tanknr + ; let's check the energy + lda eXistenZ,x + bne SkipRemovigPM ; if energy=0 then no tank + + ; hide P/M + lda #0 + sta hposp0,x + jmp DoNotDrawTankNr +SkipRemovigPM + + + lda AngleTable,x + bmi AngleToLeft01 + lda #90 + sec + sbc AngleTable,x + tay + lda BarrelTableR,y + jmp CharacterAlreadyKnown +AngleToLeft01 + sec + sbc #(255-90) + tay + lda BarrelTableL,y +CharacterAlreadyKnown + sta CharCode +DrawTankNrX + ldx tanknr + lda xtankstableL,x + sta xdraw + lda xtankstableH,x + sta xdraw+1 + lda ytankstable,x + sta ydraw + + jsr TypeChar + + ; now P/M graphics on the screen (only for 5 tanks) + ; horizontal position + mwa xdraw xbyte + ldx tanknr + cpx #$5 + bcs NoPlayerMissile + rorw xbyte ; divide by 2 (carry does not matter) + lda xbyte + clc + adc #$24 ; P/M to graphics offser + cpx #$4 ; 5th tank are joined missiles and offset is defferent + bne NoMissile + clc + adc #$0C +NoMissile + sta hposp0,x + ; vertical position + lda pmtableL,x + sta xbyte + lda pmtableH,x + sta xbyte+1 + + ; calculate start position of the tank + lda ydraw + clc + adc #$25 ; P/M to graphics offset + sta temp + ; clear sprite and put 3 lines on the tank at the same time + ldy #$00 + tya +ClearPM cpy temp + bne ZeroesToGo + lda #$03 ; (2 bits set) we set on two pixels in three lines + sta (xbyte),y + dey + sta (xbyte),y + dey + sta (xbyte),y + dey + lda #$00 +ZeroesToGo + sta (xbyte),y + dey + bne ClearPM + +NoPlayerMissile +DoNotDrawTankNr + rts + +;-------------------------------------------------- +drawmountains .proc +;-------------------------------------------------- + mwa #0 xdraw + mwa #mountaintable modify + + +drawmountainsloop + ldy #0 + lda (modify),y + sta ydraw + jsr DrawLine + adw modify #1 + adw xdraw #1 + cpw xdraw #screenwidth + bne drawmountainsloop + + rts +;-------------------------------------------------- +drawmountainspixel +;-------------------------------------------------- + mwa #0 xdraw + mwa #mountaintable modify + + +drawmountainspixelloop + ldy #0 + lda (modify),y + sta ydraw + jsr plot + adw modify #1 + adw xdraw #1 + cpw xdraw #screenwidth + bne drawmountainspixelloop + + rts +.endp +;-------------------------------------------------- +SoilDown2 .proc +;-------------------------------------------------- + +; how it is supposed to work: +; first loop is looking for the highest pixels +; and fills with their Y coordinates both temporary tables +; +; second (main) loop works this way: +; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) +; goes through the horizontal line checking if +; Y coordinate from the first table equals to height of the peak +; if so, it goes further +; if not: +; sets end-of-soil-fall-down-flag to 0 +; increases Y from the first table +; if there is no pixel there it plots here and +; zeroes pixel from the second table and after that +; increases Y of the second table +; repeats with next pixels au to the end of the line +; if the flag is 0 then repeat the main loop +; and that's it :) +; +; I am sorry but after these 4 years I have no idea +; how it works. I have just translated Polish comment +; but I do not understand a word of it :) +; If you know how it works, please write here :)))) + + jsr PMoutofscreen + +; First we look for highest pixels and fill with their coordinates +; both tables + + mwa RangeLeft xdraw + adw RangeLeft #mountaintable2 tempor2 + adw RangeLeft #mountaintable3 tempor3 + +NextColumn1 + mva #0 ydraw +NextPoint1 + jsr point + beq StillNothing + ldy #0 + lda ydraw + sta (tempor2),y + sta (tempor3),y + jmp FoundPeek1 +StillNothing + inc ydraw + lda ydraw + cmp #screenheight + bne NextPoint1 +FoundPeek1 + adw tempor2 #1 + adw tempor3 #1 + adw xdraw #1 + ;vcmp xdraw,screenwidth,NextColumn1 + cpw xdraw RangeRight + bcc NextColumn1 + beq NextColumn1 +; we have both tables filled with starting values + +; main loop starts here +MainFallout2 + mwa RangeLeft xdraw + adw RangeLeft #mountaintable temp + adw RangeLeft #mountaintable2 tempor2 + adw RangeLeft #mountaintable3 tempor3 + + mwa #1 IsEndOfTheFallFlag +FalloutOfLine + ldy #0 + + ; is Y coordinate from the first table + ; equal to peak height, if so, go ahead + lda (tempor2),y + cmp #screenheight-1 ;cmp (temp),y + bcs ColumnIsReady + ; in the other case there are things to be done + sty IsEndOfTheFallFlag ; flag to 0 + ; we are increasing Y in the first table + ;lda (tempor2),y + clc + adc #1 + sta (tempor2),y + ; and checking if there is a pixel there + sta ydraw + jsr point + bne ThereIsPixelHere + ; if no pixel we plot it + mva #1 color + jsr plot.MakePlot + ; zeroing pixel from the second table + ; and increase Y in second table + ldy #0 + lda (tempor3),y + sta ydraw + lda (tempor3),y + clc + adc #1 + sta (tempor3),y + sty color + jsr plot.MakePlot + +ThereIsPixelHere +ColumnIsReady + adw temp #1 + adw tempor2 #1 + adw tempor3 #1 + adw xdraw #1 + ;vcmp xdraw,screenwidth,FalloutOfLine + cpw xdraw RangeRight + bcc FalloutOfLine + beq FalloutOfLine + + lda IsEndOfTheFallFlag +; we repeat untill at some point first table reaches +; level of the mountains + jeq MainFallout2 +; now correct heights are in the second temporary table +; so we copy + mwa RangeLeft xdraw + adw RangeLeft #mountaintable temp + adw RangeLeft #mountaintable3 tempor3 + + ldy #0 +CopyHeights + lda (tempor3),y + sta (temp),y + adw temp #1 + adw tempor3 #1 + adw xdraw #1 + ;vcmp xdraw,screenwidth,CopyHeights + cpw xdraw RangeRight + bcc CopyHeights + beq CopyHeights + mva #1 color + rts +.endp +;-------------------------------------------------- +calculatemountains .proc +;-------------------------------------------------- + mwa #0 xdraw + +; starting point +getrandomY ;getting random Y coordinate + sec + lda random + cmp #screenheight-(margin*4) ;it means that max line=199 + bcs getrandomY + clc + adc #(margin*2) + sta ydraw + sta yfloat+1 + mva #0 yfloat ;yfloat equals to e.g. 140.0 + +; how to make nice looking mountains? +; randomize points and join them with lines +; Here we do it simpler way - we randomize X (or deltaX) +; and "delta" (change of Y coordinate) + +NextPart + lda random + sta delta ; it is after the dot (xxx.delta) + lda random + and #$03 ;(max delta) + sta delta+1 ; before the dot (delta+1.delta) + + lda random + and #$01 ;random sign (+/- or up/down) + sta UpNdown + + ; theoretically we have here ready + ; fixed-point delta value + ; (-1*(UpNdown))*(delta+1.delta) + + ;loop drawing one line + +ChangingDirection + lda random ;length of the line + and #$0f ;max line length + tax + inx + inx + inx + stx deltaX + +OnePart + jsr placeTanks.CheckTank + ; checks if at a given X coordinate + ; is any tank and if so + ; changes parameters of drawing + ; to generate flat 8 pixels + ; (it will be the place for the tank) + ; it also stores Y position of the tank + adw xdraw #mountaintable modify + + lda ydraw + ldy #0 + sta (modify),y + + ; Up or Down + lda UpNdown + beq ToBottom + +ToTop ;it means substracting + + sbw yfloat delta + lda yfloat+1 + cmp #margin + bcs Skip01 + ; if smaller than 10 + ldx #$00 + stx UpNdown + jmp Skip01 + +ToBottom + adw yfloat delta + lda yfloat+1 + cmp #screenheight-margin + bcc Skip01 + ; if higher than screen + ldx #$01 + stx UpNdown +Skip01 + sta ydraw + + adw xdraw #1 + + cpw xdraw #screenwidth + beq EndDrawing + + dec deltaX + bne OnePart + + jmp NextPart +EndDrawing + + rts +.endp +; ----------------------------------------- +unPlot .proc +; ----------------------------------------- + ldx #0 ; only one pixel +unPlotAfterX + stx WhichUnPlot + + ; first remake the oldie + lda oldplotL,x + sta oldplot + lda oldplotH,x + sta oldplot+1 + + lda oldply,x + tay + lda oldora,x + sta (oldplot),y + + + ; is it not out of the screen ???? + cpw ydraw #screenheight + jcs EndOfUnPlot +CheckX + cpw xdraw #screenwidth + jcs EndOfUnPlot +MakeUnPlot + ; let's count coordinates taken from xdraw and ydraw + mwa xdraw xbyte + + lda xbyte + and #$7 + sta ybit + + lsrw xbyte + rorw xbyte + rorw xbyte +;--- + ldy xbyte + + ldx WhichUnPlot + tya + sta oldply,x + + + ldx ydraw + lda linetableL,x + sta xbyte + sta oldplot + lda linetableH,x + sta xbyte+1 + sta oldplot+1 + ldx ybit + + + lda color + beq ClearUnPlot + + lda (xbyte),y + sta OldOraTemp + ora bittable,x + sta (xbyte),y + jmp ContinueUnPlot +ClearUnPlot + lda (xbyte),y + sta OldOraTemp + and bittable2,x +; sta (xbyte),y +ContinueUnPlot + ldx WhichUnPlot + lda OldOraTemp + sta oldora,x + lda oldplot + sta oldplotL,x + lda oldplot+1 + sta oldplotH,x + ; and now we must solve the problem of several plots + ; in one byte + ldx #4 + ldy WhichUnPlot +LetsCheckOverlapping + cpx WhichUnPlot + beq SkipThisPlot + lda oldplotL,x + cmp oldplotL,y + bne NotTheSamePlot + lda oldplotH,x + cmp oldplotH,y + bne NotTheSamePlot + lda oldply,x + cmp oldply,y + bne NotTheSamePlot + ; the pixel is in the same byte so let's take correct contents + lda oldora,x + sta oldora,y +NotTheSamePlot +SkipThisPlot + dex + bpl LetsCheckOverlapping +EndOfUnPlot + rts +.endp +; ----------------------------------------- +plot .proc ;plot (xdraw, ydraw) +; this is one of the most important routines in the whole +; 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!!! +; We tried to keep it clear and therefore it is far from +; optimal speed. + +; ----------------------------------------- + ; is it not over the screen ??? + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + bcs unPlot.EndOfUnPlot +CheckX02 + cpw xdraw #screenwidth + bcs EndOfPlot ;nearest RTS +MakePlot + ; let's calculate coordinates from xdraw and ydraw + mwa xdraw xbyte + + + lda xbyte + and #$7 + sta ybit + + ;xbyte = xbyte/8 + lda xbyte + lsr xbyte+1 + ror ;just one bit over 256. Max screenwidht = 512!!! + lsr + lsr + tay ;save +;--- + + + + + ldx ydraw + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + + ldx ybit + lda color + beq ClearPlot + + lda (xbyte),y + ora bittable,x + sta (xbyte),y +EndOfPlot + rts +ClearPlot + lda (xbyte),y + and bittable2,x + sta (xbyte),y + rts +.endp +; ----------------------------------------- +point .proc +; ----------------------------------------- + ; checks state of the pixel (coordinates in xdraw and ydraw) + ; result is in A (zero or appropriate bit is set) + + + ; let's calculate coordinates from xdraw and ydraw + mwa xdraw xbyte + + + lda xbyte + and #$7 + sta ybit + + ;xbyte = xbyte/8 + lda xbyte + lsr xbyte+1 + ror ;just one bit over 256. Max screenwidht = 512!!! + lsr + lsr + tay ;save + +;--- + + ldx ydraw + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + + ldx ybit + + lda (xbyte),y + and bittable,x + rts +.endp + +; ----------------------------------------- +PlotPointer .proc +; ----------------------------------------- +; draws pointer that shows where is the bullet +; when it is over the screen +; (it is on the top of the screen) + + + mwa xdraw tempCir + + mva #0 color + mwa #screenHeight ydraw + mwa oldPlotPointerX xdraw + jsr plot + + + mwa tempCir xdraw + + mva #1 color + mwa #screenHeight ydraw + jsr plot + + mwa xdraw oldPlotPointerX + + rts + +.endp +;-------------------------------------------------- +DrawLine .proc +;-------------------------------------------------- + mva #0 ydraw+1 + lda #screenheight + sec + sbc ydraw + sta tempbyte01 + jsr plot + ;rts + jmp IntoDraw ; jumps inside Draw routine + ; because one pixel is already plotted + + +loopdraw + + lda (xbyte),y + ora bittable,x + sta (xbyte),y +IntoDraw adw xbyte #screenBytes + + dec tempbyte01 + bne loopdraw + rts +.endp +; +; ------------------------------------------ +TypeChar .proc +; puts char on the graphics screen +; in: CharCode +; in: left LOWER corner of the char coordinates (xdraw, ydraw) +;-------------------------------------------------- + ; char to the table + lda CharCode + sta fontind + lda #$00 + sta fontind+1 + ; char intex times 8 + aslw fontind + rolw fontind + rolw fontind + + adw fontind #TankFont + + ; and 8 bytes to the table + ldy #7 +CopyChar + lda (fontind),y + sta char1,y + lda #$00 + sta char2,y + dey + bpl CopyChar + ; and 8 subsequent bytes as a mask + adw fontind #8 + ldy #7 +CopyMask + lda (fontind),y + sta mask1,y + lda #$ff + sta mask2,y + dey + bpl CopyMask + + ; calculating coordinates from xdraw and ydraw + mwa xdraw xbyte + + lda xbyte + and #$7 + sta ybit + + lsrw xbyte + rorw xbyte + rorw xbyte + +;--- + ldy xbyte + + ldx ydraw + .rept 7 + dex + .endr + + lda linetableL,x + sta xbyte + lda linetableH,x + sta xbyte+1 + ; mask preparation and character shifting + ldx ybit + beq MaskOK00 +MakeMask00 + sec + ror mask1 + ror mask2 + sec + ror mask1+1 + ror mask2+1 + sec + ror mask1+2 + ror mask2+2 + sec + ror mask1+3 + ror mask2+3 + sec + ror mask1+4 + ror mask2+4 + sec + ror mask1+5 + ror mask2+5 + sec + ror mask1+6 + ror mask2+6 + sec + ror mask1+7 + ror mask2+7 + lsr char1 + ror char2 + ror char1+1 + ror char2+1 + ror char1+2 + ror char2+2 + ror char1+3 + ror char2+3 + ror char1+4 + ror char2+4 + ror char1+5 + ror char2+5 + ror char1+6 + ror char2+6 + ror char1+7 + ror char2+7 + dex + bne MakeMask00 +MaskOK00 + ; here x=0 + lda Erase + beq CharLoopi ; it works, because x=0 + lda #0 + ldx #7 +EmptyChar + sta char1,x + sta char2,x + dex + bpl EmptyChar + ldx #0 +CharLoopi + lda (xbyte),y + and mask1,x + ora char1,x + sta (xbyte),y + iny + lda (xbyte),y + and mask2,x + ora char2,x + sta (xbyte),y + dey + adw xbyte #screenBytes + inx + cpx #8 + bne CharLoopi + rts +.endp +; ------------------------------------------ +PutChar4x4 .proc ;puts 4x4 pixels char on the graphics screen +; in: xdraw, ydraw (upper left corner of the char) +; in: CharCode4x4 (.sbyte) +;-------------------------------------------------- + lda plot4x4color + sta color + + +; calculating address of the first byte + mva #4 LoopCounter4x4 + lda CharCode4x4 + and #1 + sta nibbler4x4 + lda CharCode4x4 + ror + ; in carry there is which nibble of the byte is to be taken + clc + adc #(3*32) + sta y4x4 +nextline4x4 + mva #4 Xcounter4x4 + ldy y4x4 + lda font4x4,y ;there was a problem with OMC here, but it works now + + ldx nibbler4x4 + beq uppernibble + + asl + asl + asl + asl +uppernibble + rol + sta StoreA4x4 + bcs EmptyPixel ; the font I drawn is in inverse ... + ;lda plot4x4color ;these lines are not necessary + ;sta color ;if a plots are one color only + jsr plot + ;jmp Loop4x4Continued +EmptyPixel + ;lda #1 ;reverse color (color==1-color) + ;sec + ;sbc plot4x4color + ;sta color + ;jsr plot + ;this is turned off for speed + ;anyway we assume the text is being drawn + ;over an empty space +Loop4x4Continued + adw xdraw #1 + lda StoreA4x4 + dec Xcounter4x4 + ldx Xcounter4x4 + bne uppernibble + ; here we have on screen one line of the char + adw ydraw #1 + sbw xdraw #4 + sbw y4x4 #32 + dec:lda LoopCounter4x4 + bne nextline4x4 + + rts +.endp +; ------------------------------------------ +PutChar4x4FULL .proc; +;this routine works just like PutChar4x4, +;but this time all pixels are being drawn +;(empty and not empty) +;-------------------------------------------------- + lda plot4x4color + sta color + +; calculating address of the first byte + mva #4 LoopCounter4x4 + lda CharCode4x4 + and #1 + sta nibbler4x4 + lda CharCode4x4 + ror + ; in carry there is which nibble of the byte is to be taken clc + clc + adc #(3*32) + sta y4x4 +nextline4x4FULL + mva #4 Xcounter4x4 + ldy y4x4 + lda font4x4,y + + ldx nibbler4x4 + beq uppernibbleFULL + + asl + asl + asl + asl +uppernibbleFULL + rol + sta StoreA4x4 + bcs EmptyPixelFULL + lda plot4x4color ;these lines are not necessary + sta color ;if a plots are one color only + jsr plot + jmp Loop4x4ContinuedFULL +EmptyPixelFULL + lda #1 ;reverse color (color==1-color) + sec + sbc plot4x4color + sta color + jsr plot + ;this is turned on now + ;of course it is slower + +Loop4x4ContinuedFULL + adw xdraw #1 + lda StoreA4x4 + dec Xcounter4x4 + ldx Xcounter4x4 + bne uppernibbleFULL + ; here we have on screen one line of the char + adw ydraw #1 + sbw xdraw #4 + sbw y4x4 #32 + dec:lda LoopCounter4x4 + bne nextline4x4FULL + + rts +.endp + +.endif \ No newline at end of file diff --git a/program.asm b/program.asm new file mode 100644 index 0000000..092983f --- /dev/null +++ b/program.asm @@ -0,0 +1,1144 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm +;Atari 8-bit Scorched Earth source code +;--------------------------------------------------- +;by Tomasz 'pecus' Pecko and Pawel 'pirx' Kalinowski +;Warsaw 2000,2001,2002,2003,2009,2012,2013 +;you can contact us at pecus@poczta.fm or pirx@91.pl +;home page of this project is http://pecus.pigwa.net/pliki/Atari/scorch/ + +;this source code was compiled under OMC65 crossassembler +;and on 2012-06-21 translated to mads +; +;game source code is split into 5 parts: +;program.s65 is the main game code (with many assorted routines) +;grafproc.s65 - graphics routines like line or circle +;textproc.s65 - text routines like list of weapons and shop +;variables.s65 - all non-zero page variables and constans +;display.s65 - display lists and text screen definitions + +;we were trying to use as much macros and pseudoops as possible +;they are defined in atari.hea and macro.hea files together with many +;atari constans. This way it shoud be relatively easy to +;port this code to e.g. C64 +; +;After those N years of working on this piece of code +;we are sure it would be much wiser to write it in C or +;Action!, but on the other hand it is so much fun to type 150 chars +;where you want to have y=ax+b :) +; +;originally most variables were in Polish, comments were sparse +;but we wanted to release this piece of code to public +;and due to being always short of time (to finish the game) +;we decided it must go in 'English' to let other people work on it + + .zpvar xdraw .word = $80 ;variable X for plot + .zpvar ydraw .word;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + .zpvar xbyte .word + + .zpvar ybyte .word + .zpvar CharCode .byte + .zpvar fontind .word + .zpvar tanknr .byte + .zpvar TankSequencePointer .byte + .zpvar oldplot .word + .zpvar xc .word + .zpvar temp .word ;temporary word for the most embeded loops only + .zpvar temp2 .word;same as above + .zpvar tempXROLLER .word;same as above for XROLLER routine + ;(used also in result display routine) + .zpvar xtempDRAW .word ;same as above for XDRAW routine + .zpvar ytempDRAW .word ;same as above for XDRAW routine + ;--------------temps used in circle routine + .zpvar xi .word ;X (word) in draw routine + .zpvar fx .byte ;circle drawing variables + .zpvar yi .word ;Y (word) in draw routine + .zpvar fy .byte + .zpvar xk .word + .zpvar fs .byte + .zpvar yc .byte ;ycircle - temporary for circle + .zpvar dx .word + .zpvar tempor2 .byte + .zpvar dy .word + .zpvar tempor3 .word + .zpvar dd .word + .zpvar di .word + .zpvar dp .word + .zpvar modify .word + .zpvar weaponPointer .word + +;------------------------------- +;constants +FlyDelay=150 +screenheight=200 +screenBytes = 40 +screenwidth=screenBytes*8 +margin=48 ;mountain drawing Y variable margin +display=$1010 ;kill dos with the casette recorder! +MaxPlayers = 6 + + icl '../lib/atari.hea' + icl '../lib/macro.hea' + + ;Game loading address + ORG $3010 ;two hex thousands for screen +;----------------------------------------------- +;Screen displays go first to avoid crossing 4kb barrier +;----------------------------------------------- + icl 'display.asm' +;---------------------------------------------- + icl 'variables.asm' +;-------------------------------------------------- +OffensiveTexts + icl 'artwork/talk.asm' +;-------------------------------------------------- +; Game Code +;-------------------------------------------------- +START + + ; Startup sequence + jsr Initialize + + mwa #OptionsDL dlptrs + lda dmactls + and #$fc + ora #$02 ; normal screen width + sta dmactls + + jsr Options ;startup screen + + ;entering names of players + mwa #NameDL dlptrs + lda dmactls + and #$fc + ora #$01 ; narrow screen (32 chars) + sta dmactls + + mva #0 TankNr + +loop01 + jsr EnterPlayerName + inc TankNr + lda TankNr + cmp NumberOfPlayers + bne loop01 + + mwa #dl dlptrs + lda dmactls + and #$fc + ora #$02 ; normal screen width + sta dmactls + + jsr RandomizeSequence + ; for the round #1 shooting sequence is random + +MainGameLoop + + jsr CallPurchaseForEveryTank + + jsr SetDLI + mwa #dl dlptrs + lda dmactls + and #$fc + ora #$02 ; 2=normal, 3 = wide screen width + sta dmactls + + jsr GetRandomWind + + jsr Round + + jsr SortSequence + + ; Hide all (easier than hide last ;) ) tanks + mva #1 Erase + jsr drawtanks + mva #0 Erase + jsr PMoutofScreen ;let P/M disappear + + ; here gains and looses should be displayed (dollars) + ; finally we have changed our minds and money of players + ; is displayed only in weapons shop + + ; Results are number of other deaths + ; before the player dies itself + + ; add gains and substract looses + ; gain is what player gets for lost energy of opponents + ; energy lost by opponents is added during Round and + ; little below in source multiplied by 2 to get "dollars". + ; By analogy, loose is energy that given player looses during + ; each Round. + ; Important! If player has 10 energy and gets central hit + ; from nuke that would take 90 energy point his loose + ; is 90, not 10 + jsr DisplayResults + + ;check demo mode + ldx numberOfPlayers + dex +checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + lda skillTable,x + beq peopleAreHere + dex + bpl checkForHuman + tay + ; no people, just wait a bit + pause 150 + jmp noKey + +peopleAreHere + ;key ; only if there is a human player + lda SKSTAT + cmp #$ff + beq checkFire + cmp #$f7 + beq checkFire + jmp noKey ;key pressed, so go +checkFire + ;------------JOY------------- + ;happy happy joy joy + ;check for joystick now + ;fire + lda TRIG0 + bne peopleAreHere ;fire not pressed, so loop + +noKey + ldx NumberOfPlayers + dex +CalculateGains + ; add gain * 2 + asl gainL,x + rol gainH,x + clc + lda moneyL,x + adc gainL,x + sta moneyL,x + lda moneyH,x + adc gainH,x + sta moneyH,x + ; substract loose + ; if loose is greater than money then zero money + lda moneyH,x + cmp looseH,x + bcc zeromoney + bne substractloose + lda moneyL,x + cmp looseL,x + bcc zeromoney +substractloose + sec + lda moneyL,x + sbc looseL,x + sta moneyL,x + lda moneyH,x + sbc looseH,x + sta moneyH,x + jmp skipzeroing +zeromoney + lda #0 + sta moneyL,x + sta moneyH,x + +skipzeroing + dex + bpl CalculateGains + + + + inc CurrentRoundNr + jmp MainGameLoop + + +;-------------------------------------------------- +Round .proc ; +;-------------------------------------------------- +; at the beginning of each Round we set energy +; of all players to 100 +; the maximum shooting energy to 1000 (it is 10*energy) +; the default shooting energy to 350 +; the default shooting angle to 45 degrees +; of course gains an looses are zeroed + + lda #0 + tax +loop + sta previousAngle,x + inx + cpx #(clearEnd-PreviousAngle) + bne loop + .endp + + ldx #5 +SettingEnergies + lda #$00 + sta gainL,x + sta gainH,x + sta looseL,x + sta looseH,x + lda #99 + sta Energy,x + sta eXistenZ,x + sta LASTeXistenZ,x + ; anything in eXistenZ table means that this tank exist + ; in the given round + lda #232 + sta MaxEnergyTableL,x + lda #3 + sta MaxEnergyTableH,x + lda #94 + sta EnergyTableL,x + lda #1 + sta EnergyTableH,x + ;lda #(255-45) + ;it does not look good when all tanks have + ;barrels pointing the same direction + ;so it would be nice to have more or less random + ;angles + + jsr RandomizeAngle + sta AngleTable,x + + + dex + bpl SettingEnergies + + mva #0 CurrentResult + +;generating the new landscape + jsr PMoutofScreen ;let P/M disappear + jsr clearscreen ;let the screen be clean + jsr placetanks ;let the tanks be evenly placed + jsr calculatemountains ;let mountains be nice for the eye + jsr drawmountains ;draw them + jsr drawtanks ;finally draw tanks + +;--------------------round screen is ready--------- + + ;mva #0 TankNr + mva #0 TankSequencePointer + +MainRoundLoop + ; here we must check if by a chance there is only one + ; tank with energy greater than 0 left + + ldy #0 ; number of tanks with energy greater than zero + ldx NumberOfPlayers + dex +CheckingIfRoundIsFinished + lda eXistenZ,x + beq NoEnergy + iny +NoEnergy + dex + bpl CheckingIfRoundIsFinished + + cpy #2 ; is it less than 2 tanks have energy >0 ? + bcs DoNotFinishTheRound + +;points for the last living tank + ldx NumberOfPlayers + dex +WhichTankWonLoop + lda eXistenZ,x + bne ThisOneWon + dex + bpl WhichTankWonLoop + ;error here!!! + ;stop + ; somehow I believed program will be never here + ; but it was a bad assumption + ; god knows when there is such a situation + ; (we've got a SITUATION here, it you know what I mean) + ; there are two tanks left. + ; one of them is killed by the second tank + ; second tank explodes and kills the first one. + ; and code lands here... + ; looks like no one won! + + rts + +ThisOneWon + lda CurrentResult + clc + adc ResultsTable,x + sta ResultsTable,x + + rts ; this Round is finished + +DoNotFinishTheRound + ;ldx TankNr + + ldx TankSequencePointer + lda TankSequence,x + sta TankNr + tax + lda Energy,x ;skip if no energy + jeq NextPlayerShoots + + + mva #1 color ;to display flying point + + lda TankColoursTable,x + sta colpf2s ; set color of status line + + lda SkillTable,x + beq ManualShooting + + ; robotanks shoot here + jsr ArtificialIntelligence + jsr MoveBarrelToNewPosition + jsr DisplayingSymbols ;all digital values like force, angle, wind, etc. + jsr PutTankNameOnScreen + ; let's move the tank's barrel so it points the right + ; direction + jmp AfterManualShooting + +ManualShooting + + jsr WaitForKeyRelease + jsr BeforeFire + +AfterManualShooting + ; lower energy to eventually let tanks commit suicide + ldx TankNr + dec Energy,x + lda ActiveWeapon,x + + jsr Shoot + lda HitFlag ;0 if missed + beq missed + lda #0 + sta FallDown1 + sta FallDown2 + jsr Explosion + + ;here we clear offensive text (after a shoot) + ldy TankNr + mva #0 plot4x4color + jsr DisplayOffensiveTextNr + + +AfterExplode + ;temporary tanks removal (would fall down with soil) + mva TankNr tempor2 + mva #1 Erase + jsr drawtanks + mva tempor2 TankNr + mva #0 Erase + lda FallDown2 + beq NoFallDown2 + jsr SoilDown2; + +NoFallDown2 + ;here tanks are falling down + mva tankNr tempor2 + mva #0 TankNr + +TanksFallDown + jsr TankFalls + inc:lda TankNr + cmp NumberOfPlayers + bne TanksFallDown + mva tempor2 TankNr +missed + + ;here we clear offensive text (after a shoot) + ;shit -- it's second time, but it must be like this + ldy TankNr + mva #0 plot4x4color + jsr DisplayOffensiveTextNr + + jsr DecreaseWeaponAfterShoot ; or before??? +NextPlayerShoots + mva #1 Erase + jsr drawtanks + + ;before it shoots, the eXistenZ table must be + ;updated accordingly to actual energy (was forgotten, sorry to ourselves) + + ldx #5 +SeteXistenZ + lda Energy,x + sta eXistenZ,x + sta L1 + + ;DATA L1,L2 + ;RESULT WH*256+L1 + ;Multiplication 8bit*8bit, + ;result 16bit + ;this algiorithm is a little longer than in Ruszczyc 6502 book + ;but it is faster + + LDy #8 + LDA #0 + CLC +LP0 + ror + ROR L1 + BCC B0 + CLC + ADC #10 ; multiplication by 10 +B0 DEy + BNE LP0 + ror + ROR L1 + STA MaxEnergyTableH,x + lda L1 + sta MaxEnergyTableL,x + + dex + bpl SeteXistenZ + + ;was setup of maximum energy for players + + mva #0 Erase + jsr drawtanks + + ;inc TankNr + ;lda TankNr + inc:lda TankSequencePointer + cmp NumberOfPlayers + bne PlayersAgain + ;mva 0 TankNr + mva #0 TankSequencePointer + +PlayersAgain .proc + +; In LASTeXistenZ there are values of eXistenZ before shoot +; from the next tank. +; Now it must be checked if by a chance something that had +; LASTeXistenZ>0 is not equal to 0 right now, +; because it means this tank died during this round. +; Most important thing is: +; after each explosion of the tank these operations must be +; performed from the beginning! +; (it is made by another jump into the after explosion routines) +; It is because exploding tank can destroy their neighbours, +; additionally this tank just have had LASTeXistenZ set to 0, +; otherwise it would explode again and again. +; OK, text how to do it is ready, now comes coding . +; Aaaah! - in main loop we have to set eXistenZ and LASTeXistenZ + + ldx NumberOfPlayers + dex +CheckingPlayersDeath + lda LASTeXistenZ,x + beq NoPlayerNoDeath + lda eXistenZ,x + beq PlayerXdeath +NoPlayerNoDeath + dex + bpl CheckingPlayersDeath + ; if processor is here it means there are no more explosions + jmp MainRoundLoop + .endp +;--------------------------------- +PlayerXdeath .proc + ; first we inform that this tank should not explode anymore: + ; there is 0 in A, and Tank Number in X, so... + + sta LASTeXistenZ,x + ; save x somewhere + stx TankTempY + + ; display defensive text here (well, defensive + ; is not the real meaning, it should be pre-death, + ; but I am too lazy to change names of variables) + + ; in X there is a number of tank that died + + lda CurrentResult + clc + adc ResultsTable,x + sta ResultsTable,x + inc CurrentResult + .endp + +;RandomizeDeffensiveText + randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) + sta TextNumberOff + ldy TankTempY + mva #1 plot4x4color + jsr DisplayOffensiveTextNr + + PAUSE 75 + ;Deffensive text cleanup + ;here we clear Deffensive text (after a shoot) + ldy TankTempY + mva #0 plot4x4color + jsr DisplayOffensiveTextNr + + + ; calculate position of the explosion (the post-death one?) + ldx TankTempY + clc + lda xtankstableL,x + adc #4 ; more or less in the middle of the tank + sta xdraw + lda xtankstableH,x + adc #0 + sta xdraw+1 + sec + lda ytankstable,x + sbc #4 + sta ydraw + lda #0 + sta ydraw+1 ; there is 0 left in A, so... + + ;cleanup of the soil fall down ranges (left and right) + sta RangeRight + sta RangeRight+1 + sta FallDown1 + sta FallDown2 + mwa #screenwidth RangeLeft + + + + ; We are randomizing the weapon now. + ; As we are jumping into the middle of the weapon + ; routine we are preparing the number *2 - + ; - to make it easier and because we are using only + ; first 32 weapons we are doing this with just one AND + + lda random + and #$3e ; range (0-31 number multiplied by 2) + jsr Explosion2 + + ; jump to after explosion routines (soil fallout, etc.) + ; After going through these routines we are back + ; to checking if a tank exploded and maybe we have + ; a deadly shot here again. + + + jmp AfterExplode + + +;-------------------------------------------------- +Explosion .proc +;-------------------------------------------------- + ;cleanup of the soil fall down ranges (left and right) + mwa #screenwidth RangeLeft + lda #0 + sta RangeRight + sta RangeRight+1 + + ldx TankNr + lda ActiveWeapon,x + asl +.endp +Explosion2 .proc + tax + lda ExplosionRoutines+1,x + pha + lda ExplosionRoutines,x + pha + rts +ExplosionRoutines + .word babymissile-1 + .word missile-1 + .word babynuke-1 + .word nuke-1 + .word leapfrog-1 + .word funkybomb-1 + .word mirv-1 + .word deathshead-1 + .word VOID-1 ;napalm + .word VOID-1 ;hotnapalm + .word tracer-1 + .word VOID-1 ;smoketracer + .word babyroller-1 + .word roller-1 + .word heavyroller-1 + .word VOID-1 ;riotcharge + .word VOID-1 ;riotblast + .word riotbomb-1 + .word heavyriotbomb-1 + .word babydigger-1 + .word digger-1 + .word heavydigger-1 + .word babysandhog-1 + .word sandhog-1 + .word heavysandhog-1 + .word dirtclod-1 + .word dirtball-1 + .word tonofdirt-1 + .word VOID-1 ;liquiddirt + .word dirtcharge-1 + .word VOID-1 ;earthdisrupter + .word VOID-1 ;plasmablast + .word laser-1 + +VOID + rts +.endp +; ------------------------ + + icl 'weapons.asm' + + +;-------------------------------------------------- +DecreaseEnergyX .proc +;Decreases energy of player nr X +;increases his financial loss +;increases gain of tank TankNr +;-------------------------------------------------- + sty EnergyDecrease + ; Loose increase + lda looseL,x + clc + adc EnergyDecrease + sta looseL,x + lda looseH,x + adc #$00 + sta looseH,x + ; Energy now, not less than 0 + lda Energy,x + cmp EnergyDecrease + bcc ldahashzero + ;sec + sbc EnergyDecrease + bpl NotNegativeEnergy +ldahashzero + lda #0 +NotNegativeEnergy + sta Energy,x + ;now increase the gain of the shooting tank + phx + ldx TankNr + clc + lda gainL,x + adc EnergyDecrease + sta gainL,x + lda gainH,x + adc #$00 + sta gainH,x + plx + rts +.endp + +;-------------------------------------------------- +GetRandomWind .proc +;-------------------------------------------------- + lda random + cmp MaxWind + bcs GetRandomWind ; if more than MaxWind then randomize again + sta Wind + mva #$00 Wind+1 + ; multiply Wind by 16 and take it as a decimal part (0.Wind) + aslw Wind + aslw Wind + aslw Wind + aslw Wind + lda random + and #$01 + sta WindOrientation + rts +.endp + +;-------------------------------------------------- +PMoutofScreen .proc +;-------------------------------------------------- + lda #$00 ; let all P/M disappear + sta hposp0 + sta hposp0+1 + sta hposp0+2 + sta hposp0+3 + sta hposp0+4 + sta hposp0+5 + sta hposp0+6 + sta hposp0+7 + rts +.endp + +;-------------------------------------------------- +.nowarn .proc WeaponCleanup; +; cleaning of the weapon possesion tables +; (99 of Baby Missles, all other weapons=0) +;-------------------------------------------------- + ldx #$3f + lda #$0 +loop05 + sta TanksWeapon1,x + sta TanksWeapon2,x + sta TanksWeapon3,x + sta TanksWeapon4,x + sta TanksWeapon5,x + sta TanksWeapon6,x + dex + bne skip13 + lda #99 + bne loop05 +skip13 bpl loop05 + rts +.endp + +;-------------------------------------------------- +Initialize .proc +;Initialization sequence +;-------------------------------------------------- + ;jsr GenerateOffensiveTextTables + ;jsr GenerateDeffensiveTextTables + + lda #0 + sta Erase + sta tracerflag + sta oldPlotPointerX + sta oldPlotPointerX+1 + + mva #$2 colpf2s + mva #12 colpf3s + mva #>WeaponFont chbas + + ;parameter for old plot (unPlot) max 5 points + ldx #4 +SetunPlots + lda #display + sta oldplotH,x + lda #0 + sta oldply,x + sta oldora,x + dex + bpl SetunPlots + + ;setting up P/M graphics + lda #>pmgraph + sta pmbase + lda dmactls + ora #$38 ; Players and Missiles single lined + sta dmactls + lda #$03 ; P/M on + sta pmcntl + lda #$01 + sta sizem ; there will be only M0, double width + sta sizep0 ; P0-P3 widths + sta sizep0+1 + sta sizep0+2 + sta sizep0+3 + lda #$10 ; P/M priorities (bit 4 joins missiles) + sta gtictls + jsr PMoutofScreen + lda #$50 ; temporary colours of sprites under tanks + sta $2c0 + lda #$30 + sta $2c1 + lda #$70 + sta $2c2 + lda #$90 + sta $2c3 + LDA #$B0 + STA COLPF3S + mva #0 hscrol + + + ;let the tanks be visible! + ldx #5 + lda #1 ; tank is visible +MakeTanksVisible + sta eXistenZ,x + dex + bpl MakeTanksVisible + + + ldx #0 + txa +ClearResults + sta ResultsTable,x + inx + cpx #MaxPlayers + bne ClearResults + + mva #1 CurrentRoundNr ;we start from round 1 + + rts +.endp + +SetDLI .proc + VDLI DLIinterrupt + rts +.endp +DLIinterrupt .proc + pha + lda #$02 ; color of playground + sta WSYNC + sta COLPF2 + pla + rti +.endp +;---------------------------------------------- +RandomizeSequence .proc +; in: NumberOfPlayers +; out: TankSequence +; how: get random number lower than NumberOfPlayers +; put it in the first slot. +; get another random number lower than NumberOfPlayers +; check if was previously saved in first slot +; if not then save it in second slot +; repeat untill NumberOfPlayers + + ldx #0 +GetRandomAgain0 + lda RANDOM + and #$07 ;NumberOfPlayers < 7 + cmp NumberOfPlayers + bcs GetRandomAgain0 + sta TankSequence,x + ;now first slot is ready, nexts slots are handled + ;in a more complicated way + +GetRandomAgainX + lda RANDOM + and #$07 ;NumberOfPlayers < 7 + cmp NumberOfPlayers + bcs GetRandomAgainX + + ;now we have to check if the value was not used + ;in previous slots + + stx temp + ldy temp +UsageLoop + cmp TankSequence,y + beq GetRandomAgainX ;apparently we have already used this value + dey + bpl UsageLoop + + ;well, looks like this value is new! + inx + sta TankSequence,x + + stx temp + inc:lda temp ;x+1 + + cmp NumberOfPlayers + bne GetRandomAgainX + rts +.endp +;---------------------------------------------- +RandomizeAngle .proc ; +; routine returns in A +; a valid angle for the tank's barrel. +; X is not changed +;---------------------------------------------- + + ;valid angle values are ((256-90)..255) and (0..90) + ;it means that values 91..165 must be elliminated... + ;so, lets randomize someting between 0 and 180 + ;and substract this value from 90 + lda RANDOM + + cmp #180 + bcs RandomizeAngle + + + sta temp + lda #90 ; CARRY=0 here + sbc temp + + rts +.endp +;---------------------------------------------- +RandomizeForce .proc +; routine returns in EnergyTable/L/H +; valid force of shooting for TankNr +; in X must be TankNr +; low and high randomize boundary passed as word value +; RandBoundaryLow +; RandBoundaryHigh +;---------------------------------------------- + + + lda MaxEnergyTableL,x + sta temp + lda MaxEnergyTableH,x + sta temp+1 +GetRandomAgain + lda RANDOM + ; gets values in range(256,765) + sta temp2 + lda RANDOM ; :) + and #%00000011 ;(0..1023) + sta temp2+1 + + cpw RandBoundaryLow temp2 + bcs GetRandomAgain + + cpw RandBoundaryHigh temp2 + bcc GetRandomAgain + + cpw temp temp2 + bcs EnergyInRange + + mwa temp temp2 + +EnergyInRange + + lda temp2 + sta EnergyTableL,x + lda temp2+1 + sta EnergyTableH,x + + rts +.endp + +;---------------------------------------------- +MoveBarrelToNewPosition .proc + jsr DrawTankNr + ldx TankNr + lda AngleTable,x + clc + adc #90 ;shift angle to the positive values + sta temp + lda NewAngle + clc + adc #90 + cmp temp + beq BarrelPositionIsFine + bcc rotateLeft ; older is bigger +rotateRight;older is lower + inc angleTable,x + bne MoveBarrelToNewPosition + + mva #$30 CharCode ; if angle goes through 0 we clear the barrel + jsr drawtankNrX + + jmp MoveBarrelToNewPosition +rotateLeft + dec angleTable,x + bpl MoveBarrelToNewPosition + mva #$2e CharCode + jsr drawtankNrX + + jmp MoveBarrelToNewPosition + +BarrelPositionIsFine + rts + + .endp + +;---------------------------------------------- +SortSequence .proc ; +;---------------------------------------------- +; here we try to get a sequence of tanks for two +; purposes: +; 1. to make up shooting sequence for the next round (from down to top) +; 2. to display game results more nicely (from top to down) +; +; I think I will go for a stupid bubble sort... +; it is easy to test :) +; +; Results are in ResultsTable, in SortedTable we want to +; have numbers of tanks from the worst to the best. +; in other words, if ResultsTable=(5,4,65,23,3,6) +; the SortedTable=(4,1,0,5,3,2) +; let's assume initially the TankSequence=(0,1,2,3,4,5) + + ldx #0 +SequenceStart + txa + sta TankSequence,x + inx + cpx #MaxPlayers + bne SequenceStart + +; we will need a TempResults (TR) table to fiddle with + ldx #0 +movetotemp + lda ResultsTable,x + sta TempResults,x + inx + cpx NumberOfPlayers + bne movetotemp + +; i=0:sortflag=0 +;loop: +; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers +; or goto loop: +; else +; temp=TR(i): tempo=TankSequence(i) +; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) +; TR(i+1)=temp: TankSequence(i+1)=tempo +; i=i+1 +; sortflag=sortflag+1 +; go loop: +; if sortflag=0 then finished, else repeat... +; +; or something like this :) + ldx NumberOfPlayers + dex + stx temp+1 ; for checking end of the loop only + +Bubble + ldx #0 ;i=x + stx temp2 ; sortflag=temp2 + +BubbleBobble + lda TempResults,x + cmp TempResults+1,x + beq nextishigher ; this is to block hangs when 2 same values meet + bcc nextishigher + ;here we must swap values + ;because next is smaller than previous + sta temp + lda TempResults+1,x + sta TempResults,x + lda temp + sta TempResults+1,x + ; + lda TankSequence,x + sta temp + lda TankSequence+1,x + sta TankSequence,x + lda temp + sta TankSequence+1,x + inc temp2 +nextishigher + inx + cpx temp+1 ;cpx ^NumberOfPlayers-1 + bne BubbleBobble + + lda temp2 + + bne Bubble + + rts +.endp +;---------------------------------------------- + icl 'textproc.asm' +;---------------------------------------------- + icl 'grafproc.asm' +;---------------------------------------------- + icl 'ai.asm' +;---------------------------------------------- + +TankColoursTable .BYTE $52,$32,$72,$92,$B2,$02 + +font4x4 + ins 'artwork/font4x4s.bmp',+62 +;---------------------------------------------- +TankFont + ins 'artwork/tanks.fnt' +TankFontend + .if TankFontEnd>$9800 + .error memory conflict + ;this is to warn if code and P/M graphics + ;overlap! + .endif +;---------------------------------------------- +; Player/missile memory + ORG $9800 +pmgraph + +;---------------------------------------------- + ORG $a400 +WeaponFont + ins 'artwork/weapons.fnt' +;---------------------------------------------- +TheEnd + .if TheEnd>$c000 + .error memory conflict + + .endif + + + run START \ No newline at end of file diff --git a/program.atdbg b/program.atdbg new file mode 100644 index 0000000..c6bead2 --- /dev/null +++ b/program.atdbg @@ -0,0 +1,6 @@ +.sourcemode on +.echo +.echo "Loading executable..." +.echo +bc * +.onexerun .echo "Launching executable..." diff --git a/program.lab b/program.lab new file mode 100644 index 0000000..c103f83 --- /dev/null +++ b/program.lab @@ -0,0 +1,1077 @@ +mads 1.9.7 build 53 (29 Sep 13) +Label table: +00 0096 FLYDELAY +00 00C8 SCREENHEIGHT +00 0028 SCREENBYTES +00 0140 SCREENWIDTH +00 0030 MARGIN +00 1010 DISPLAY +00 0006 MAXPLAYERS +00 D000 HPOSP0 +00 D001 HPOSP1 +00 D002 HPOSP2 +00 D003 HPOSP3 +00 D004 HPOSM0 +00 D005 HPOSM1 +00 D006 HPOSM2 +00 D007 HPOSM3 +00 D008 SIZEP0 +00 D009 SIZEP1 +00 D00A SIZEP2 +00 D00B SIZEP3 +00 D00C SIZEM +00 D00D GRAFP0 +00 D00E GRAFP1 +00 D00F GRAFP2 +00 D010 GRAFP3 +00 D011 GRAFM +00 D012 COLPM0 +00 D013 COLPM1 +00 D014 COLPM2 +00 D015 COLPM3 +00 D016 COLPF0 +00 D017 COLPF1 +00 D018 COLPF2 +00 D019 COLPF3 +00 D01A COLBAK +00 D016 COLOR0 +00 D017 COLOR1 +00 D018 COLOR2 +00 D019 COLOR3 +00 D000 KOLM0PF +00 D001 KOLM1PF +00 D002 KOLM2PF +00 D003 KOLM3PF +00 D004 KOLP0PF +00 D005 KOLP1PF +00 D006 KOLP2PF +00 D007 KOLP3PF +00 D008 KOLM0P +00 D009 KOLM1P +00 D00A KOLM2P +00 D00B KOLM3P +00 D00C KOLP0P +00 D00D KOLP1P +00 D00E KOLP2P +00 D00F KOLP3P +00 D010 TRIG0 +00 D011 TRIG1 +00 D013 TRIG3 +00 D014 PAL +00 D01B GTICTL +00 D01B GTIACTL +00 D01C VDELAY +00 D01D PMCNTL +00 D01E HITCLR +00 D01F CONSOL +00 0010 IRQENS +00 0011 IRQSTAT +00 D204 AUDF3 +00 D208 AUDCTL +00 D209 STIMER +00 D209 KBCODE +00 D20A SKSTRES +00 D20A RANDOM +00 D20D SEROUT +00 D20D SERIN +00 D20E IRQEN +00 D20E IRQST +00 D20F SKCTL +00 D20F SKSTAT +00 D300 PORTA +00 D301 PORTB +00 D302 PACTL +00 D303 PBCTL +00 D400 DMACTL +00 D401 CHRCTL +00 D402 DLPTR +00 D404 HSCROL +00 D405 VSCROL +00 D407 PMBASE +00 D409 CHBASE +00 D40A WSYNC +00 D40B VCOUNT +00 D40C LPENH +00 D40D LPENV +00 D40E NMIEN +00 D40F NMIST +00 02C0 COLPM0S +00 02C1 COLPM1S +00 02C2 COLPM2S +00 02C3 COLPM3S +00 02C4 COLPF0S +00 02C5 COLPF1S +00 02C6 COLPF2S +00 02C7 COLPF3S +00 02C8 COLBAKS +00 026F GTICTLS +00 022F DMACTLS +00 0230 DLPTRS +00 02F4 CHBAS +00 02FC KBCODES +00 E45C SETVBV +00 E462 XITVBV +00 E45F SYSVBV +00 0012 RTCLOK +00 02E5 MEMTOP +00 02E7 MEMLO +00 0278 JSTICK0 +00 0279 JSTICK1 +00 027A JSTICK2 +00 027B JSTICK3 +00 027C PTRIG0 +00 027D PTRIG1 +00 0284 TRIG0S +00 0285 TRIG1S +00 0286 TRIG2S +00 0287 TRIG3S +00 0080 XDRAW +00 0082 YDRAW +00 0084 XBYTE +00 0086 YBYTE +00 0088 CHARCODE +00 0089 FONTIND +00 008B TANKNR +00 008C TANKSEQUENCEPOINTER +00 008D OLDPLOT +00 008F XC +00 0091 TEMP +00 0093 TEMP2 +00 0095 TEMPXROLLER +00 0097 XTEMPDRAW +00 0099 YTEMPDRAW +00 009B XI +00 009D FX +00 009E YI +00 00A0 FY +00 00A1 XK +00 00A3 FS +00 00A4 YC +00 00A5 DX +00 00A7 TEMPOR2 +00 00A8 DY +00 00AA TEMPOR3 +00 00AC DD +00 00AE DI +00 00B0 DP +00 00B2 MODIFY +00 00B4 WEAPONPOINTER +00 3010 PURCHASEDL +00 3019 MOREUPDL +00 301D WEAPONSLISTDL +00 303F MOREDOWNDL +00 3049 OPTIONSDL +00 305E NAMEDL +00 3074 DL +00 3153 WHITELINE +00 2F50 PLOTLINE +00 317B OPTIONSSCREEN +00 31F3 OPTIONSHERE +00 3293 OPTIONSSCREENEND +00 3293 NAMESCREEN +00 32C7 NAMEADR +00 32F4 NAMESOFLEVELS +00 3393 MOREUP +00 33BB MOREDOWN +00 33E3 LISTOFWEAPONS +00 3983 LISTOFWEAPONS1END +00 3983 LISTOFDEFENSIVEWEAPONS +00 3C03 LISTOFDEFENSIVEWEAPONSEND +00 3C03 WEAPONSDESCRIPTION +00 3C51 EMPTYLINE +00 3C79 TEXTBUFFER +00 3CC9 TEXTBUFFER2 +00 3D19 NUMBEROFPLAYERS +00 3D1A TANKSEQUENCE +00 3D20 SKILLTABLE +00 3D26 MONEYH +00 3D2C MONEYL +00 3D32 GAINH +00 3D38 GAINL +00 3D3E LOOSEH +00 3D44 LOOSEL +00 3D4A ENERGY +00 3D50 ENERGYDECREASE +00 3D51 EXISTENZ +00 3D57 LASTEXISTENZ +00 3D5D RESULTSTABLE +00 3D63 TEMPRESULTS +00 3D69 CURRENTRESULT +00 3D6A ENERGYTABLEL +00 3D70 ENERGYTABLEH +00 3D76 MAXENERGYTABLEL +00 3D7C MAXENERGYTABLEH +00 3D82 ANGLETABLE +00 3D88 NEWANGLE +00 3D89 ACTIVEWEAPON +00 3D8F L1 +00 3D90 GRAVITY +00 3D91 WIND +00 3D93 MAXWIND +00 3D94 WINDORIENTATION +00 3D95 COUNTER +00 3D96 HITFLAG +00 3D97 XTANKSTABLEL +00 3D9D XTANKSTABLEH +00 3DA3 YTANKSTABLE +00 3DA9 LOWRESDISTANCES +00 3DAF KEYCODES +00 3DD5 SCRCODES +00 3DFB ERASE +00 3DFC RANGELEFT +00 3DFE RANGERIGHT +00 3E00 WEAPONRANGELEFT +00 3E02 WEAPONRANGERIGHT +00 3E04 HOWMUCHTOFALL +00 3E05 HEIGHTROL +00 3E06 DIGSTARTX +00 3E08 DIGSTARTY +00 3E0A DIGGERY +00 3E0B DIGLONG +00 3E0C DIGTABXL +00 3E14 DIGTABXH +00 3E1C DIGTABYL +00 3E24 DIGTABYH +00 3E2C SANDHOGFLAG +00 3E2D MAGIC +00 3E2F DRAWJUMPADDR +00 3E31 HOWTODRAW +00 3E32 XHIT +00 3E34 YHIT +00 3E36 LINELENGTH +00 3E38 RADIUS +00 3E39 XCIRCLE +00 3E3B YCIRCLE +00 3E3C TEMPCIR +00 3E3E IFFALLDOWN +00 3E3F PREVIOUSFALL +00 3E40 ENDOFTHEFALLFLAG +00 3E41 PARACHUTE +00 3E42 XTRAJ00 +00 3E47 XTRAJ01 +00 3E4C XTRAJ02 +00 3E51 VX00 +00 3E56 VX01 +00 3E5B VX02 +00 3E60 VX03 +00 3E65 MIRVDOWN +00 3E6A MIRVMISSILECOUNTER +00 3E6B SMOKETRACERFLAG +00 3E6C VX +00 3E70 VY +00 3E74 XTRAJ +00 3E77 YTRAJ +00 3E7A XTRAJOLD +00 3E7D YTRAJOLD +00 3E80 ANGLE +00 3E81 FORCE +00 3E84 MULTIPLIER +00 3E87 MULTIPLEE +00 3E89 RESULT +00 3E8C GOLEFT +00 3E8D ISENDOFTHEFALLFLAG +00 3E8E WHICHUNPLOT +00 3E8F OLDPLOTH +00 3E94 OLDPLOTL +00 3E99 OLDORA +00 3E9E OLDPLY +00 3EA3 OLDORATEMP +00 3EA4 FUNKYBOMBCOUNTER +00 3EA5 XTRAJFB +00 3EA7 YTRAJFB +00 3EA9 TRACERFLAG +00 3EAA MASK1 +00 3EB2 MASK2 +00 3EBA CHAR1 +00 3EC2 CHAR2 +00 3ECA COLOR +00 3ECB YBIT +00 3ECC TEMPBYTE01 +00 3ECD DELTA +00 3ECF YFLOAT +00 3ED1 DELTAX +00 3ED2 UPNDOWN +00 3ED3 TEMPTANKX +00 3ED5 TEMPTANKNR +00 3ED6 NUBERSOFWEAPONSL1 +00 3EFE NUBERSOFWEAPONSL2 +00 3F0E HOWMANYONTHELIST1 +00 3F0F HOWMANYONTHELIST2 +00 3F10 POSITIONONTHELIST +00 3F11 LASTWEAPON +00 3F12 WHICHLIST +00 3F13 OFFSETDL1 +00 3F14 OPTIONSTABLE +00 3F18 OPTIONSY +00 0004 MAXOPTIONS +00 3F19 CASHOPTIONH +00 3F1E CASHOPTIONL +00 3F23 GRAVITYTABLE +00 3F28 MAXWINDTABLE +00 3F2D POSITIONINNAME +00 3F2E DIFFICULTYLEVEL +00 3F2F LEVELNAMEBEGINL +00 3F38 LEVELNAMEBEGINH +00 3F41 DECIMAL +00 3F43 DISPLAYPOSITION +00 3F45 DECIMALRESULT +00 3F49 EXPLOSIONRADIUS +00 3F4B CURRENTROUNDNR +00 3F4C FALLDOWN1 +00 3F4D FALLDOWN2 +00 3F4E LEAPFROGANGLE +00 3F4F LASERCOORDINATE +00 3F57 TANKSNAMES +00 3F87 TANKSWEAPONS +00 3F87 TANKSWEAPON1 +00 3FC7 TANKSWEAPON2 +00 4007 TANKSWEAPON3 +00 4047 TANKSWEAPON4 +00 4087 TANKSWEAPON5 +00 40C7 TANKSWEAPON6 +00 4107 TANKSWEAPONSTABLEL +00 410D TANKSWEAPONSTABLEH +00 4113 MOUNTAINTABLE +00 4254 MOUNTAINTABLE2 +00 4395 MOUNTAINTABLE3 +00 44D6 MOUNTAINTABLEEND +00 44D6 TEXTPOSITIONX +00 44D8 TEXTPOSITIONY +00 44D9 TEXTADDRESS +00 44DB TEXTCOUNTER +00 44DC TEXTNUMBEROFF +00 44DD TANKTEMPY +00 44DE LINEADDRESS4X4 +00 44E0 LINECHARNR +00 44E1 LINEXDRAW +00 44E3 LINEYDRAW +00 44E4 LINETOP +00 44F2 LINEBOTTOM +00 4500 LINEEMPTY +00 450E LINEHEADER1 +00 4517 ROUNDNRDISPLAY +00 451C LINEHEADER2 +00 452A RESULTLINEBUFFER +00 453D RESULTX +00 453F RESULTY +00 4540 RESULTOFTANKNR +00 4541 PMTABLEL +00 4546 PMTABLEH +00 454B BARRELTABLEL +00 45A6 BARRELTABLER +00 4601 SINTABLE +00 465C COSTABLE +00 46B7 LINETABLEL +00 4780 LINETABLEH +00 4849 OLDPLOTPOINTERX +00 484B LOOPCOUNTER4X4 +00 484C Y4X4 +00 484D STOREA4X4 +00 484E XCOUNTER4X4 +00 484F NIBBLER4X4 +00 4850 CHARCODE4X4 +00 4851 PLOT4X4COLOR +00 4852 BITTABLE +00 485A BITTABLE2 +00 4862 DISKTANCE +00 4869 WHERETOSLIDETABLE +00 4969 ENDOFTHEBARRELX +00 4A69 ENDOFTHEBARRELY +00 4B69 TANKSNAMESDEFAULT +00 4B99 WEAPONPRICEH +00 4BD9 WEAPONPRICEL +00 4C19 WEAPONUNITS +00 4C59 WEAPONSYMBOLS +00 4C99 NAMESOFWEAPONS +00 5099 JOYTOKEYTABLE +00 50A9 PREVIOUSANGLE +00 50AF PREVIOUSENERGYL +00 50B5 PREVIOUSLEFTRANGE +00 50BB PREVIOUSENERGYH +00 50C1 PREVIOUSRIGHTANGLE +00 50C7 RANDBOUNDARYLOW +00 50C9 RANDBOUNDARYHIGH +00 50CB ANGLETABLEPOINTER +00 50CC CLEAREND +00 50CC OFFENSIVETEXTS +00 50CC TALK +00 50CC TALK.L0 +00 50F7 TALK.L1 +00 50FB TALK.L2 +00 5109 TALK.L3 +00 5116 TALK.L4 +00 511D TALK.L5 +00 5140 TALK.L6 +00 5165 TALK.L7 +00 5171 TALK.L8 +00 5182 TALK.L9 +00 518E TALK.L10 +00 5195 TALK.L11 +00 519C TALK.L12 +00 51AE TALK.L13 +00 51BF TALK.L14 +00 51D5 TALK.L15 +00 51DE TALK.L16 +00 51FF TALK.L17 +00 520C TALK.L18 +00 521B TALK.L19 +00 5245 TALK.L20 +00 524D TALK.L21 +00 525F TALK.L22 +00 527D TALK.L23 +00 528C TALK.L24 +00 5299 TALK.L25 +00 52A9 TALK.L26 +00 52C8 TALK.L27 +00 52D8 TALK.L28 +00 52E2 TALK.L29 +00 52F6 TALK.L30 +00 5319 TALK.L31 +00 532F TALK.L32 +00 5340 TALK.L33 +00 5354 TALK.L34 +00 5371 TALK.L35 +00 5390 TALK.L36 +00 53AB TALK.L37 +00 53C3 TALK.L38 +00 53E7 TALK.L39 +00 5402 TALK.L40 +00 541F TALK.L41 +00 5435 TALK.L42 +00 544A TALK.L43 +00 5467 TALK.L44 +00 5471 TALK.L45 +00 54A1 TALK.L46 +00 54B2 TALK.L47 +00 54C4 TALK.L48 +00 54EA TALK.L49 +00 54F9 TALK.L50 +00 5513 TALK.L51 +00 552B TALK.L52 +00 5541 TALK.L53 +00 5565 TALK.L54 +00 5569 TALK.L55 +00 556F TALK.L56 +00 5578 TALK.L57 +00 5584 TALK.L58 +00 5589 TALK.L59 +00 558C TALK.L60 +00 5591 TALK.L61 +00 5597 TALK.L62 +00 55B3 TALK.L63 +00 55DA TALK.L64 +00 55E0 TALK.L65 +00 55E7 TALK.L66 +00 55EC TALK.L67 +00 55FD TALK.L68 +00 5618 TALK.L69 +00 5620 TALK.L70 +00 5628 TALK.L71 +00 563E TALK.L72 +00 5651 TALK.L73 +00 5658 TALK.L74 +00 565F TALK.L75 +00 5679 TALK.L76 +00 5699 TALK.L77 +00 56A7 TALK.L78 +00 56B9 TALK.L79 +00 56DA TALK.L80 +00 56E9 TALK.L81 +00 570B TALK.L82 +00 5713 TALK.L83 +00 5717 TALK.L84 +00 571B TALK.L85 +00 571F TALK.L86 +00 5724 TALK.L87 +00 5748 TALK.L88 +00 575A TALK.L89 +00 576E TALK.L90 +00 5792 TALK.L91 +00 57AF TALK.L92 +00 57C6 TALK.L93 +00 57D9 TALK.L94 +00 57EA TALK.L95 +00 57F6 TALK.L96 +00 5813 TALK.L97 +00 581A TALK.L98 +00 583E TALK.L99 +00 5865 TALK.L100 +00 588E TALK.L101 +00 58AC TALK.L102 +00 58C3 TALK.L103 +00 58F3 TALK.L104 +00 5915 TALK.L105 +00 593F TALK.L106 +00 5958 TALK.L107 +00 5966 TALK.L108 +00 5985 TALK.L109 +00 5989 TALK.L110 +00 59A3 TALK.L111 +00 59B2 TALK.L112 +00 59C9 TALK.L113 +00 59E5 TALK.OFFENSIVETEXTTABLEL +00 5A57 TALK.OFFENSIVETEXTTABLEH +00 5AC9 TALK.OFFENSIVETEXTLENGTHS +00 0036 TALK.NUMBEROFOFFENSIVETEXTS +00 003C TALK.NUMBEROFDEFFENSIVETEXTS +00 5B3B START +00 5B6D LOOP01 +00 5B90 MAINGAMELOOP +00 5BCA CHECKFORHUMAN +00 5BEC PEOPLEAREHERE +00 5BFA CHECKFIRE +00 5BFF NOKEY +00 5C03 CALCULATEGAINS +00 5C2E SUBSTRACTLOOSE +00 5C44 ZEROMONEY +00 5C4C SKIPZEROING +00 5C55 ROUND +00 5C58 ROUND.LOOP +00 5C62 SETTINGENERGIES +00 5CB3 MAINROUNDLOOP +00 5CB9 CHECKINGIFROUNDISFINISHED +00 5CBF NOENERGY +00 5CCA WHICHTANKWONLOOP +00 5CD3 THISONEWON +00 5CDE DONOTFINISHTHEROUND +00 5D0D MANUALSHOOTING +00 5D13 AFTERMANUALSHOOTING +00 5D38 AFTEREXPLODE +00 5D55 NOFALLDOWN2 +00 5D5D TANKSFALLDOWN +00 5D6D MISSED +00 5D7A NEXTPLAYERSHOOTS +00 5D84 SETEXISTENZ +00 5D92 LP0 +00 5D9B B0 +00 5DC3 PLAYERSAGAIN +00 5DC7 PLAYERSAGAIN.CHECKINGPLAYERSDEATH +00 5DD1 PLAYERSAGAIN.NOPLAYERNODEATH +00 5DD7 PLAYERXDEATH +00 5E63 EXPLOSION +00 5E7B EXPLOSION2 +00 5E85 EXPLOSION2.EXPLOSIONROUTINES +00 5EC7 EXPLOSION2.VOID +00 5EC8 BABYMISSILE +00 5ED6 MISSILE +00 5EE4 BABYNUKE +00 5EF2 NUKE +00 5F00 LEAPFROG +00 5F7E ENDOFLEAPPING +00 5F7F MIRV +00 5F83 FUNKYBOMB +00 5FD6 FUNKYBOMBLOOP +00 5FEB DONOTEOR +00 601C NOEXPLOSIONINFUNKYBOMB +00 6027 DEATHSHEAD +00 607C NOUPPERCIRCLE +00 6096 NOLOWERCIRCLE +00 6097 TRACER +00 6098 BABYROLLER +00 60A3 ROLLER +00 60AE HEAVYROLLER +00 60B9 RIOTBOMB +00 60C7 HEAVYRIOTBOMB +00 60D5 BABYDIGGER +00 60EA DIGGER +00 60FF HEAVYDIGGER +00 6114 XDIGGER +00 612B WRITETOBRANCHES +00 615E BRANCHNOTFINISHED +00 6161 CALCULATEBRANCHES +00 6166 DIGLEWY +00 617A DIGRIGHT +00 618B DIGRANDOMIZE +00 6192 DIGWDOL +00 61A6 DIGUP +00 61BB DIGCALCULATENEXT +00 61C1 DIGDRAWING +00 61EB DIGGERCHARACTER +00 6207 DONOTPUTDIG +00 6208 BABYSANDHOG +00 621D SANDHOG +00 6232 HEAVYSANDHOG +00 6247 DIRTCLOD +00 6255 DIRTBALL +00 6263 TONOFDIRT +00 6271 DIRTCHARGE +00 627F LASER +00 6395 LASERMISSES +00 6396 XMISSILE +00 639E EXPLOSIONLOOP +00 63BB EXPLOSIONLOOP2 +00 63DF DISTANCECHECKLOOP +00 6426 TANKISNOTWITHINTHERANGE +00 6426 ENDOFDISTANCECHECKLOOP +00 642A XDIRT +00 6432 DIRTLOOP +00 6448 XRIOTBOMB +00 6450 RBOMBLOOP +00 6464 XROLLER +00 648C POSITIVEVELOCITY +00 64AB SEEKLEFT +00 64C9 HOWMUCHTOFALLLEFT +00 64D0 GORIGHTNOW +00 64E5 SEEKRIGHT +00 6503 HOWMUCHTOFALLRIGHT +00 6511 ITISLEFTALREADY +00 6516 HOWMUCHTOFALLKNOWN +00 6524 ROLLIN +00 6538 ROLLINCONTINUES +00 6576 UPNOTYET +00 65BF HOWMUCHTOFALLRIGHT2 +00 65DB EXPLODENOW +00 660D OFDIRT +00 6624 NEXTROW +00 6638 NEXTLINE +00 6648 DONOTPLOT +00 6682 ENDOFTHEDIRT +00 6692 BEFOREFIRE +00 66A2 BEFOREFIRE.CONTINUETOCHECKMAXFORCE2 +00 66B0 BEFOREFIRE.SKIP15 +00 66CA BEFOREFIRE.NOTPRESSED +00 66F1 BEFOREFIRE.JUMPFROMSTICK +00 6718 BEFOREFIRE.CHECKJOY +00 6728 BEFOREFIRE.NOTPRESSEDJOY +00 6732 BEFOREFIRE.JNOTFIRE +00 6735 BEFOREFIRE.PRESSEDUP +00 673F BEFOREFIRE.CHECKINGMAXFORCE +00 674D BEFOREFIRE.FURTHERCHECKMAXFORCE +00 6761 BEFOREFIRE.CTRLPRESSEDUP +00 6774 BEFOREFIRE.PRESSEDDOWN +00 6785 BEFOREFIRE.FORCEGOESZERO +00 678D BEFOREFIRE.SKIP04 +00 6790 BEFOREFIRE.CTRLPRESSEDDOWN +00 67A8 BEFOREFIRE.PRESSEDLEFT +00 67BB BEFOREFIRE.NOTTHROUGH90DEGREESLEFT +00 67CA BEFOREFIRE.PRESSEDRIGHT +00 67DB BEFOREFIRE.NOTTHROUGH90DEGREESRIGHT +00 67EA BEFOREFIRE.PRESSEDTAB +00 67FB BEFOREFIRE.SKIP14 +00 6809 BEFOREFIRE.CTRLPRESSEDTAB +00 6815 BEFOREFIRE.SKIP14CT +00 6823 BEFOREFIRE.PRESSEDSPACE +00 6824 SHOOT +00 6824 SHOOT.RANDOMIZEOFFENSIVETEXT +00 6850 SHOOT.NOTSTRONGSHOOT +00 685C SHOOT.AFTERSTRONGSHOOT +00 68B8 TANKFALLS +00 68CD TANKFALLS.TANKFALLSX +00 68E6 TANKFALLS.BYTEBELOWTANK +00 68EE TANKFALLS.EMPTYPOINT2 +00 68EF TANKFALLS.ROLPOINT2 +00 6922 TANKFALLS.ITSTILLFALLS +00 6943 TANKFALLS.FALLDIAGONALLY +00 6943 TANKFALLS.NOFALLINGDOWN +00 6943 TANKFALLS.PARACHUTEPRESENT +00 6955 TANKFALLS.FALLSTRAIGHTDOWN +00 696D TANKFALLS.RAPIDFALLING +00 6983 TANKFALLS.NOTLEFTEDGE +00 69A8 TANKFALLS.NOTRIGHTEDGE +00 69D2 TANKFALLS.DONOTCLEARPARACHUTE +00 69E7 TANKFALLS.DOESNOTFALLDOWN +00 69FD TANKFALLS.DOESNOTFALLLEFT +00 6A13 TANKFALLS.DOESNOTFALLRIGHT +00 6A38 TANKFALLS.DONOTDRAWPARACHUTE +00 6A40 TANKFALLS.ENDOFFALL +00 6A74 TANKFALLS.THEREWASNOPARACHUTE +00 6A75 FLIGHT +00 6A81 FLIGHT.NOSMOKETRACER +00 6A84 FLIGHT.REPEATIFSMOKETRACER +00 6ADF FLIGHT.FLIGHTRIGHT +00 6AE4 FLIGHT.DONTZEROGOLEFT +00 6AFD FLIGHT.MULTIPLYLOOP +00 6B1E FLIGHT.DONOTADD +00 6B68 FLIGHT.MULTIPLYLOOPY +00 6B89 FLIGHT.DONOTADDY +00 6BAC FLIGHT.LOOPI +00 6BF0 FLIGHT.STILLUP +00 6C14 FLIGHT.FLIGHTLEFT +00 6C30 FLIGHT.SKIP07 +00 6C3C FLIGHT.FLIGHTSLEFT +00 6C41 FLIGHT.LWINDTOLEFT +00 6C67 FLIGHT.WINDTOLEFT +00 6C67 FLIGHT.LWINDTORIGHT +00 6C8A FLIGHT.SKIP08 +00 6CD9 FLIGHT.DELAYLOOP +00 6CDF FLIGHT.NOWAIT +00 6CF7 FLIGHT.YTRAYLOWERTHANSCREENHEIGHT +00 6CF7 FLIGHT.SKIPCOLLISIONCHECK +00 6D13 FLIGHT.NOUNPLOT +00 6D19 FLIGHT.HIT +00 6D30 FLIGHT.ENDOFFLIGHT +00 6D67 FLIGHT.ENDOFFLIGHT2 +00 6D6D SECONDFLIGHT +00 6DD9 MIRVDOWNLOOP +00 6DDB MIRVDOWNLOOP.MIRVCOPYPARAMETERS +00 6E88 MIRVDOWNLOOP.MRLOOPI +00 6E97 MIRVDOWNLOOP.MRLOOPIX +00 6EF4 MIRVDOWNLOOP.MIRVDONOTCHANGEY +00 6F20 MIRVDOWNLOOP.MRFLIGHTLEFT +00 6F3C MIRVDOWNLOOP.MRSKIP07 +00 6F48 MIRVDOWNLOOP.MRFLIGHTSLEFT +00 6F4D MIRVDOWNLOOP.MRLWINDTOLEFT +00 6F73 MIRVDOWNLOOP.MRWINDTOLEFT +00 6F73 MIRVDOWNLOOP.MRLWINDTORIGHT +00 6F96 MIRVDOWNLOOP.MRSKIP08 +00 6FA5 MIRVDOWNLOOP.MIRVCHECKX +00 6FBE MIRVDOWNLOOP.MIRVCHECKLOWERX +00 6FD5 MIRVDOWNLOOP.MIRVCHECKCOLLISION +00 700E MIRVDOWNLOOP.MRSKIPCOLLISIONCHECK +00 7033 MIRVDOWNLOOP.MRHIT +00 7061 MIRVDOWNLOOP.MRENDOFFLIGHT +00 7079 MIRVDOWNLOOP.MIRVNEXTBULLET +00 707B MIRVDOWNLOOP.MIRVCHECKIFEND +00 7085 MIRVDOWNLOOP.MIRVSTILLNOTALL +00 7088 MIRVDOWNLOOP.MIRVALREADYALL +00 70D4 CHECKCOLLISIONWITHTANK +00 70D6 CHECKCOLLISIONWITHTANK.CHECKCOLLISIONWITHTANKLOOP +00 70E4 CHECKCOLLISIONWITHTANK.CONDITION01 +00 70F7 CHECKCOLLISIONWITHTANK.CONDITION02 +00 7126 CHECKCOLLISIONWITHTANK.RIGHTFROMTHETANK +00 7126 CHECKCOLLISIONWITHTANK.LEFTFROMTHETANK +00 7126 CHECKCOLLISIONWITHTANK.OVERTHETANK +00 7126 CHECKCOLLISIONWITHTANK.BELOWTHETANK +00 712D CALCULATEEXPLOSIONRANGE0 +00 7144 CALCULATEEXPLOSIONRANGE +00 716D CALCULATEEXPLOSIONRANGE.NOTOUTOFTHESCREENRIGHT +00 718B CALCULATEEXPLOSIONRANGE.NOTOUTOFTHESCREENLEFT +00 71A7 CALCULATEEXPLOSIONRANGE.CHECKRANGERIGHT +00 71C3 CALCULATEEXPLOSIONRANGE.RANGESCHECKED +00 71C4 DECREASEWEAPONAFTERSHOOT +00 71D5 DECREASEWEAPONAFTERSHOOT.AMMUNITIONDECREASED +00 71DC DECREASEWEAPON +00 71E5 HOWMANYBULLETS +00 71F5 DECREASEENERGYX +00 7217 DECREASEENERGYX.LDAHASHZERO +00 7219 DECREASEENERGYX.NOTNEGATIVEENERGY +00 7235 GETRANDOMWIND +00 7266 PMOUTOFSCREEN +00 7281 WEAPONCLEANUP +00 7285 WEAPONCLEANUP.LOOP05 +00 729E WEAPONCLEANUP.SKIP13 +00 72A1 INITIALIZE +00 72C0 INITIALIZE.SETUNPLOTS +00 7322 INITIALIZE.MAKETANKSVISIBLE +00 732B INITIALIZE.CLEARRESULTS +00 7339 SETDLI +00 7349 DLIINTERRUPT +00 7354 RANDOMIZESEQUENCE +00 7356 RANDOMIZESEQUENCE.GETRANDOMAGAIN0 +00 7363 RANDOMIZESEQUENCE.GETRANDOMAGAINX +00 7371 RANDOMIZESEQUENCE.USAGELOOP +00 7389 RANDOMIZEANGLE +00 7397 RANDOMIZEFORCE +00 73A1 RANDOMIZEFORCE.GETRANDOMAGAIN +00 73DD RANDOMIZEFORCE.ENERGYINRANGE +00 73E8 MOVEBARRELTONEWPOSITION +00 7401 MOVEBARRELTONEWPOSITION.ROTATERIGHT +00 7410 MOVEBARRELTONEWPOSITION.ROTATELEFT +00 741F MOVEBARRELTONEWPOSITION.BARRELPOSITIONISFINE +00 7420 SORTSEQUENCE +00 7422 SORTSEQUENCE.SEQUENCESTART +00 742D SORTSEQUENCE.MOVETOTEMP +00 743F SORTSEQUENCE.BUBBLE +00 7443 SORTSEQUENCE.BUBBLEBOBBLE +00 746C SORTSEQUENCE.NEXTISHIGHER +00 7476 GETKEY +00 74A5 GETKEY.LOPX01 +00 74B6 GETKEY.CHECKJOYGETKEY +00 74C4 GETKEY.NOTPRESSEDJOYGETKEY +00 74CC GETKEYNOWAIT +00 74DD OPTIONS +00 74E2 OPTIONS.OPTIONSMAINLOOP +00 74FE OPTIONS.OPTIONSNODOWN +00 750F OPTIONS.OPTIONSNOUP +00 7524 OPTIONS.OPTIONSNOLEFT +00 753B OPTIONS.OPTIONSNORIGHT +00 7542 OPTIONS.OPTIONSNORETURN +00 7545 OPTIONS.OPTIONSFINISHED +00 7552 OPTIONS.SKIP10 +00 7577 OPTIONS.OPTIONSINVERSION +00 7581 OPTIONS.OPTIONSINVERSIONLOOP1 +00 75B5 OPTIONS.OPTIONSSETMAINLOOP +00 75C2 OPTIONS.OPTIONSETLOOP +00 7622 OPTIONS.OPTIONSYLOOP +00 762C CALLPURCHASEFOREVERYTANK +00 7649 LOOP03 +00 7656 MANUALPURCHASE +00 7659 AFTERMANUALPURCHASE +00 7663 PURCHASE +00 7681 NEXTCHAR03 +00 768D AFTERPURCHASE +00 76BB CREATELIST +00 76D3 CHECKWEAPON01 +00 775C ROTATE02 +00 777D MODYF1 +00 7799 OMINX06 +00 779F NOTTHESAMEASLASTTIME +00 77AF SECONDLIST +00 77B8 NEXTLINEOFTHELIST +00 77C3 TOOLITTLECASH +00 77C3 NOWEAPON +00 77D0 NODEFENSE +00 77E2 WEHAVEOFFSET +00 77ED ROTATE04 +00 77F4 DONOTADDX01 +00 780B CLEARLIST1 +00 7812 DONOTINCHIGHER1 +00 7827 ROTATE05 +00 782E DONOTADDX02 +00 7845 CLEARLIST2 +00 784C DONOTINCHIGHER2 +00 7856 CHOOSINGITEMFORPURCHASE +00 7876 ENDOFPURCHASE +00 7877 PURCHASEKEYUP +00 7889 GOUP1 +00 7893 MAKEOFFSETUP +00 789E ENDUPX +00 78A1 PURCHASEKEYDOWN +00 78BB GODOWN1 +00 78CD MAKEOFFSETDOWN +00 78E1 ENDGODOWNX +00 78E4 LISTCHANGE +00 78FB SECONDSELECTED +00 7905 DALEJX01 +00 7910 PURCHASEWEAPONNOW +00 791E PURCHASEDEFFENSIVE +00 7924 PURCHASEALL +00 7942 ROTATE03 +00 7964 LESSTHAN100 +00 796A PUTLITTECHAR +00 7976 ERASELOOP +00 7985 OMINX02 +00 799A ADDLOOP2 +00 79A5 OMINX03 +00 79A8 SELECTLIST2 +00 79BD CHARTOLIST1 +00 79CA ADDLOOP1 +00 79D5 OMINX04 +00 79D8 SELECTLIST1 +00 79E9 LOOPWINDOW1 +00 79F4 OMINX05 +00 79F7 SETWINDOWLIST1 +00 7A0E NOARROWUP +00 7A29 NOARROWDOWN +00 7A30 ENTERPLAYERNAME +00 7A50 LOOPNAME01 +00 7A5B CHECKKEYS +00 7A60 ISLETTER +00 7A6A YESLETTER +00 7A74 NOTFIRSTLETTER +00 7A87 CHECKFURTHERX01 +00 7AA5 FIRSTCHAR +00 7AB8 CHANGEOFLEVELUP +00 7AC7 DONOTLOOPLEVELUP +00 7ACD CHANGEOFLEVELDOWN +00 7ADA DONOTLOOPLEVELDOWN +00 7AE0 CHANGEOFLEVEL3UP +00 7AFB DONOTLOOPLEVEL3UP +00 7B01 ENDOFNICK +00 7B17 NEXTCHAR04 +00 7B26 MAKEDEFAULTNAME +00 7B26 NEXTCHAR05 +00 7B33 SELECTLEVEL +00 7B35 CHECKNEXTLEVEL01 +00 7B46 INVERSEFURTHER +00 7B51 NOTTHISLEVEL +00 7B5A CHECKNEXTLEVEL +00 7B5E DISPLAYDEC +00 7B60 NEXTDIGIT +00 7B64 ROTATE000 +00 7B74 TOOLITTLE000 +00 7B81 RIGHTNUMBER +00 7BAB DECIMALEND +00 7BB7 DISPLAYLOOP +00 7BC0 DISPLAYBYTE +00 7BC2 NEXTDIGIT2 +00 7BC6 ROTATE001 +00 7BD3 TOOLITTLE001 +00 7BEE DECIMALEND1 +00 7BFA DISPLAYLOOP1 +00 7C03 DIGITS +00 7C0D ZERO +00 7C0E NINEPLUS +00 7C0F SPACE +00 7C10 DISPLAYOFFENSIVETEXTNR +00 7C40 DOTNNOTLESSTHANZERO +00 7C70 DOTNNOOVERFLOW +00 7C91 DOTLOWESTMOUNTAINVALUELOOP +00 7C99 DOTOLDLOWESTVALUE +00 7CB7 DOTNCHARLOOP +00 7CF5 TYPELINE4X4 +00 7CFA TYPELINE4X4LOOP +00 7D36 ENDOFTYPELINE4X4 +00 7D37 DISPLAYRESULTS +00 7E62 RESULTOFTHENEXTPLAYER +00 7E85 TANKNAMECOPYLOOP +00 7F26 FINISHRESULTDISPLAY +00 7F4B DISPLAYINGSYMBOLS +00 7F8C ROTATEDISP02 +00 7FA4 LOOP06 +00 7FEA ANGLETOLEFT +00 8000 ANGLEDISPLAY +00 801E DISPLAYLEFTWIND +00 8028 DISPLAYWINDVALUE +00 8055 PUTTANKNAMEONSCREEN +00 805D NEXTCHAR02 +00 806A DRAW +00 80A2 DRAW.DRAWOUTOFTHESCREEN +00 80A3 DRAW.DRAWONTHESCREEN +00 80CE DRAW.LINEDOWN +00 80E0 DRAW.CHECKDIRECTIONX +00 8104 DRAW.LINERIGHT +00 8111 DRAW.CHECKDIRECTIONFACTOR +00 8128 DRAW.SWAPXY +00 8148 DRAW.LINEPARAMETERSREADY +00 818B DRAW.DRAWLOOP +00 81AA DRAW.DINEGATIVE +00 81B7 DRAW.DRPLOT +00 81D1 DRAW.SWAPPEDXY +00 81E1 DRAW.CHECKPLOTY +00 81F8 DRAW.LINEGOESUP +00 8205 DRAW.CHECKPLOTX +00 821C DRAW.LINEGOESLEFT +00 8229 DRAW.PUTPIXELINDRAW +00 8246 DRAW.ENDOFDRAW +00 8253 DRAWJUMPPAD +00 8256 DRAWPLOT +00 8259 DRAWLEN +00 8268 DRAWCHECK +00 826E DRAWCHECK.YESTRACE +00 8273 DRAWCHECK.NOTRACE +00 8278 DRAWCHECK.CHECKCOLLISIONDRAW +00 82BA DRAWCHECK.STOPHITCHECKING +00 82BB CIRCLE +00 82EF CIRCLE.CIRCLELOOP +00 8311 CIRCLE.ELSE01 +00 8326 CIRCLE.ENDIF01 +00 8329 CIRCLE.ENDCIRCLELOOP +00 833C SPLOT8 +00 83BF WAITFORKEYRELEASE +00 83CA WAITFORKEYRELEASE.KEYISRELEASED +00 83CB CLEARSCREEN +00 83CE CLEARSCREEN.LOOPI1 +00 8432 PLACETANKS +00 8436 PLACETANKS.SKIP09 +00 844F PLACETANKS.STILLRANDOMIZE +00 8479 PLACETANKS.NOTHIGHERBYTE03 +00 848C PLACETANKS.STILLRANDOMIZE02 +00 849D PLACETANKS.NOTHIGHERBYTE02 +00 84AB PLACETANKS.NOTHIGHERBYTE01 +00 84BA PLACETANKS.CHECKTANK +00 84BE PLACETANKS.CHECKNEXTTANK +00 84DE PLACETANKS.UNEQUALTANKS +00 84E2 DRAWTANKS +00 84E9 DRAWNEXTTANK +00 84F9 DRAWTANKNR +00 8508 SKIPREMOVIGPM +00 851A ANGLETOLEFT01 +00 8521 CHARACTERALREADYKNOWN +00 8523 DRAWTANKNRX +00 8555 NOMISSILE +00 856C CLEARPM +00 857D ZEROESTOGO +00 8582 NOPLAYERMISSILE +00 8582 DONOTDRAWTANKNR +00 8583 DRAWMOUNTAINS +00 8591 DRAWMOUNTAINS.DRAWMOUNTAINSLOOP +00 85BD DRAWMOUNTAINS.DRAWMOUNTAINSPIXEL +00 85CB DRAWMOUNTAINS.DRAWMOUNTAINSPIXELLOOP +00 85F7 SOILDOWN2 +00 8622 SOILDOWN2.NEXTCOLUMN1 +00 8626 SOILDOWN2.NEXTPOINT1 +00 8636 SOILDOWN2.STILLNOTHING +00 863E SOILDOWN2.FOUNDPEEK1 +00 866F SOILDOWN2.MAINFALLOUT2 +00 86B0 SOILDOWN2.FALLOUTOFLINE +00 86E2 SOILDOWN2.THEREISPIXELHERE +00 86E2 SOILDOWN2.COLUMNISREADY +00 8750 SOILDOWN2.COPYHEIGHTS +00 878B CALCULATEMOUNTAINS +00 8791 CALCULATEMOUNTAINS.GETRANDOMY +00 87A6 CALCULATEMOUNTAINS.NEXTPART +00 87BC CALCULATEMOUNTAINS.CHANGINGDIRECTION +00 87C8 CALCULATEMOUNTAINS.ONEPART +00 87E3 CALCULATEMOUNTAINS.TOTOP +00 8805 CALCULATEMOUNTAINS.TOBOTTOM +00 8824 CALCULATEMOUNTAINS.SKIP01 +00 8845 CALCULATEMOUNTAINS.ENDDRAWING +00 8846 UNPLOT +00 8848 UNPLOT.UNPLOTAFTERX +00 886D UNPLOT.CHECKX +00 887C UNPLOT.MAKEUNPLOT +00 88C5 UNPLOT.CLEARUNPLOT +00 88CD UNPLOT.CONTINUEUNPLOT +00 88E5 UNPLOT.LETSCHECKOVERLAPPING +00 8908 UNPLOT.NOTTHESAMEPLOT +00 8908 UNPLOT.SKIPTHISPLOT +00 890B UNPLOT.ENDOFUNPLOT +00 890C PLOT +00 8918 PLOT.CHECKX02 +00 8924 PLOT.MAKEPLOT +00 8956 PLOT.ENDOFPLOT +00 8957 PLOT.CLEARPLOT +00 895F POINT +00 898B PLOTPOINTER +00 89D4 DRAWLINE +00 89E6 DRAWLINE.LOOPDRAW +00 89ED DRAWLINE.INTODRAW +00 89FE TYPECHAR +00 8A21 TYPECHAR.COPYCHAR +00 8A3B TYPECHAR.COPYMASK +00 8A7D TYPECHAR.MAKEMASK00 +00 8AE8 TYPECHAR.MASKOK00 +00 8AF1 TYPECHAR.EMPTYCHAR +00 8AFC TYPECHAR.CHARLOOPI +00 8B23 PUTCHAR4X4 +00 8B40 PUTCHAR4X4.NEXTLINE4X4 +00 8B54 PUTCHAR4X4.UPPERNIBBLE +00 8B5D PUTCHAR4X4.EMPTYPIXEL +00 8B5D PUTCHAR4X4.LOOP4X4CONTINUED +00 8BA0 PUTCHAR4X4FULL +00 8BBD PUTCHAR4X4FULL.NEXTLINE4X4FULL +00 8BD1 PUTCHAR4X4FULL.UPPERNIBBLEFULL +00 8BE3 PUTCHAR4X4FULL.EMPTYPIXELFULL +00 8BEF PUTCHAR4X4FULL.LOOP4X4CONTINUEDFULL +00 8C32 MAKELOWRESDISTANCES +00 8C34 MAKELOWRESDISTANCES.LOOP +00 8C4F ARTIFICIALINTELLIGENCE +00 8C5C AIROUTINES +00 8C6C MORON +00 8C8C SHOOTER +00 8CA9 SHOOTER.LEFTQUADRANT +00 8CA9 SHOOTER.CONTINUE +00 8CBB SHOOTER.FIRSTSHOOT +00 8CDF SHOOTER.TANKISONTHERIGHT +00 8CEA SHOOTER.FORCENOW +00 8D01 SHOOTER.ENDO +00 8D21 SHOOTER.LOOP +00 8D2B POOLSHARK +00 8D2B POOLSHARK.FIRSTSHOOT +00 8D38 POOLSHARK.LOOP01 +00 8D66 POOLSHARK.ENEMYONTHELEFT +00 8D7F POOLSHARK.LOWESTISLOWER +00 8D7F POOLSHARK.SKIPTHISPLAYER +00 8D97 POOLSHARK.FORCENOW +00 8DAE POOLSHARK.ENDO +00 8DBC POOLSHARK.LOOP +00 8DC6 POOLSHARK.ANGLETABLE +00 8DD6 PURCHASEAI +00 8DE3 PURCHASEAIROUTINES +00 8DF3 MORONPURCHASE +00 8DF4 TRYTOPURCHASEONEPIECE +00 8E3F TRYTOPURCHASEONEPIECE.NOTEXCEEDED +00 8E41 TRYTOPURCHASEONEPIECE.SORRYNOPURCHASE +00 8E42 SHOOTERPURCHASE +00 8E48 SHOOTERPURCHASE.LOOP +00 8E5B POOLSHARKPURCHASE +00 8E61 POOLSHARKPURCHASE.LOOP +00 8E74 PURCHASEMETABLE +00 8EA4 TANKCOLOURSTABLE +00 8EAA FONT4X4 +00 8F2A TANKFONT +00 932A TANKFONTEND +00 9800 PMGRAPH +00 A400 WEAPONFONT +00 A800 THEEND diff --git a/program.lst b/program.lst new file mode 100644 index 0000000..91a41a5 --- /dev/null +++ b/program.lst @@ -0,0 +1,9005 @@ +mads 1.9.7 build 53 (29 Sep 13) +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 ;Atari 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 ;you can contact us at pecus@poczta.fm or pirx@91.pl + 7 ;home page of this project is http://pecus.pigwa.net/pliki/Atari/scorch/ + 8 + 9 ;this source code was compiled under OMC65 crossassembler + 10 ;and on 2012-06-21 translated to mads + 11 ; + 12 ;game source code is split into 5 parts: + 13 ;program.s65 is the main game code (with many assorted routines) + 14 ;grafproc.s65 - graphics routines like line or circle + 15 ;textproc.s65 - text routines like list of weapons and shop + 16 ;variables.s65 - all non-zero page variables and constans + 17 ;display.s65 - display lists and text screen definitions + 18 + 19 ;we were trying to use as much macros and pseudoops as possible + 20 ;they are defined in atari.hea and macro.hea files together with many + 21 ;atari constans. This way it shoud be relatively easy to + 22 ;port this code to e.g. C64 + 23 ; + 24 ;After those N years of working on this piece of code + 25 ;we are sure it would be much wiser to write it in C or + 26 ;Action!, but on the other hand it is so much fun to type 150 chars + 27 ;where you want to have y=ax+b :) + 28 ; + 29 ;originally most variables were in Polish, comments were rare + 30 ;but we wanted to release this piece of code to public + 31 ;and due to being always short of time (to finish the game) + 32 ;we decided it must go in 'English' to let other people work on it + 33 + 34 .zpvar xdraw .word = $80 ;variable X for plot + 35 .zpvar ydraw .word;variable Y for plot (like in Atari Basic - Y=0 in upper right corner of the screen) + 36 .zpvar xbyte .word + 37 + 38 .zpvar ybyte .word + 39 .zpvar CharCode .byte + 40 .zpvar fontind .word + 41 .zpvar tanknr .byte + 42 .zpvar TankSequencePointer .byte + 43 .zpvar oldplot .word + 44 .zpvar xc .word + 45 .zpvar temp .word ;temporary word for the most embeded loops only + 46 .zpvar temp2 .word;same as above + 47 .zpvar tempXROLLER .word;same as above for XROLLER routine + 48 ;(used also in result display routine) + 49 .zpvar xtempDRAW .word ;same as above for XDRAW routine + 50 .zpvar ytempDRAW .word ;same as above for XDRAW routine + 51 ;--------------temps used in circle routine + 52 .zpvar xi .word ;X (word) in draw routine + 53 .zpvar fx .byte ;circle drawing variables + 54 .zpvar yi .word ;Y (word) in draw routine + 55 .zpvar fy .byte + 56 .zpvar xk .word + 57 .zpvar fs .byte + 58 .zpvar yc .byte ;ycircle - temporary for circle + 59 .zpvar dx .word + 60 .zpvar tempor2 .byte + 61 .zpvar dy .word + 62 .zpvar tempor3 .word + 63 .zpvar dd .word + 64 .zpvar di .word + 65 .zpvar dp .word + 66 .zpvar modify .word + 67 .zpvar weaponPointer .word + 68 + 69 ;------------------------------- + 70 ;constants + 71 = 0096 FlyDelay=150 + 72 = 00C8 screenheight=200 + 73 = 0028 screenBytes = 40 + 74 = 0140 screenwidth=screenBytes*8 + 75 = 0030 margin=48 ;mountain drawing Y variable margin + 76 = 1010 display=$1010 ;kill dos with the casette recorder! + 77 = 0006 MaxPlayers = 6 + 78 + 79 icl '../lib/atari.hea' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\atari.hea + 1 /* + 2 scr48 = %00111111 ;screen 48b + 3 scr40 = %00111110 ;screen 40b + 4 scr32 = %00111101 ;screen 32b + 5 */ + 5 + 6 + 7 * --------------------------------------------------------------------------------------------- + 8 * --- GTIA + 9 * --------------------------------------------------------------------------------------------- + 10 = D000 hposp0 = $D000 ; pozioma pozycja gracza 0 (Z) + 11 = D001 hposp1 = $D001 ; pozioma pozycja gracza 1 (Z) + 12 = D002 hposp2 = $D002 ; pozioma pozycja gracza 2 (Z) + 13 = D003 hposp3 = $D003 ; pozioma pozycja gracza 3 (Z) + 14 = D004 hposm0 = $D004 ; pozioma pozycja pocisku 0 (Z) + 15 = D005 hposm1 = $D005 ; pozioma pozycja pocisku 1 (Z) + 16 = D006 hposm2 = $D006 ; pozioma pozycja pocisku 2 (Z) + 17 = D007 hposm3 = $D007 ; pozioma pozycja pocisku 3 (Z) + 18 = D008 sizep0 = $D008 ; poziomy rozmiar gracza 0 (Z) + 19 = D009 sizep1 = $D009 ; poziomy rozmiar gracza 1 (Z) + 20 = D00A sizep2 = $D00A ; poziomy rozmiar gracza 2 (Z) + 21 = D00B sizep3 = $D00B ; poziomy rozmiar gracza 3 (Z) + 22 = D00C sizem = $D00C ; poziomy rozmiar pocisków (Z) + 23 = D00D grafp0 = $D00D ; rejestr grafiki gracza 0 (Z) + 24 = D00E grafp1 = $D00E ; rejestr grafiki gracza 1 (Z) + 25 = D00F grafp2 = $D00F ; rejestr grafiki gracza 2 (Z) + 26 = D010 grafp3 = $D010 ; rejestr grafiki gracza 3 (Z) + 27 = D011 grafm = $D011 ; rejestr grafiki pocisków (Z) + 28 = D012 colpm0 = $D012 ; rejestr koloru gracza i pocisku 0 (Z) + 29 = D013 colpm1 = $D013 ; rejestr koloru gracza i pocisku 1 (Z) + 30 = D014 colpm2 = $D014 ; rejestr koloru gracza i pocisku 2 (Z) + 31 = D015 colpm3 = $D015 ; rejestr koloru gracza i pocisku 3 (Z) + 32 = D016 colpf0 = $D016 ; rejestr koloru pola gry 0 (Z) + 33 = D017 colpf1 = $D017 ; rejestr koloru pola gry 1 (Z) + 34 = D018 colpf2 = $D018 ; rejestr koloru pola gry 2 (Z) + 35 = D019 colpf3 = $D019 ; rejestr koloru pola gry 3 (Z) + 36 = D01A colbak = $D01A ; rejestr koloru tła (Z) + 37 + 38 = D016 color0 = colpf0 + 39 = D017 color1 = colpf1 + 40 = D018 color2 = colpf2 + 41 = D019 color3 = colpf3 + 42 + 43 = D000 kolm0pf = $D000 ; kolizja pocisku 0 z polem gry (O) + 44 = D001 kolm1pf = $D001 ; kolizja pocisku 1 z polem gry (O) + 45 = D002 kolm2pf = $D002 ; kolizja pocisku 2 z polem gry (O) + 46 = D003 kolm3pf = $D003 ; kolizja pocisku 3 z polem gry (O) + 47 = D004 kolp0pf = $D004 ; kolizja gracza 0 z polem gry (O) + 48 = D005 kolp1pf = $D005 ; kolizja gracza 1 z polem gry (O) + 49 = D006 kolp2pf = $D006 ; kolizja gracza 2 z polem gry (O) + 50 = D007 kolp3pf = $D007 ; kolizja gracza 3 z polem gry (O) + 51 = D008 kolm0p = $D008 ; kolizja pocisku 0 z graczem (O) + 52 = D009 kolm1p = $D009 ; kolizja pocisku 1 z graczem (O) + 53 = D00A kolm2p = $D00A ; kolizja pocisku 2 z graczem (O) + 54 = D00B kolm3p = $D00B ; kolizja pocisku 3 z graczem (O) + 55 = D00C kolp0p = $D00C ; kolizja gracza 0 z innym graczem (O) + 56 = D00D kolp1p = $D00D ; kolizja gracza 1 z innym graczem (O) + 57 = D00E kolp2p = $D00E ; kolizja gracza 2 z innym graczem (O) + 58 = D00F kolp3p = $D00F ; kolizja gracza 3 z innym graczem (O) + 59 = D010 trig0 = $D010 ; stan przycisku joysticka 0 (O) + 60 = D011 trig1 = $D011 ; stan przycisku joysticka 1 (O) + 61 = D013 trig3 = $D013 ; znacznik dołączenia cartridge-a (O) + 62 = D014 pal = $D014 ; znacznik systemu TV (O) + 63 + 64 = D01B gtictl = $D01B ; rejestr kontroli układu GTIA + 65 = D01B gtiactl = gtictl + 66 + 67 = D01C vdelay = $D01C ; licznik opóźnienia pionowego P/MG + 68 = D01D pmcntl = $D01D ; rejestr kontroli graczy i pocisków + 69 = D01E hitclr = $D01E ; rejestr kasowania rejestrów kolizji + 70 = D01F consol = $D01F ; rejestr stanu klawiszy konsoli Start (bit 0), Select (bit 1), Option (bit 2) + 71 + 72 * --------------------------------------------------------------------------------------------- + 73 * --- POKEY + 74 * --------------------------------------------------------------------------------------------- + 75 + 76 = 0010 irqens = $0010 ; rejestr-cień IRQEN + 77 = 0011 irqstat = $0011 ; rejestr-cień IRQST + 78 + 79 = D204 audf3 = $D204 ; częstotliwość pracy generatora 3 (Z) + 80 = D208 audctl = $D208 ; rejestr kontroli generatorów dźwięku (Z) + 81 = D209 stimer = $D209 ; rejestr zerowania liczników (Z) + 82 = D209 kbcode = $D209 ; kod ostatnio naciśniętego klawisza (O) + 83 = D20A skstres = $D20A ; rejestr statusu złącza szeregowego (Z) + 84 = D20A random = $D20A ; rejestr liczby losowej (O) + 85 = D20D serout = $D20D ; szeregowy rejestr wyjściowy (Z) + 86 = D20D serin = $D20D ; szeregowy rejestr wejściowy (O) + 87 = D20E irqen = $D20E ; zezwolenie przerwań IRQ (Z) + 88 = D20E irqst = $D20E ; status przerwań IRQ (O) + 89 = D20F skctl = $D20F ; rejestr kontroli złącza szeregowego (Z) + 90 = D20F skstat = $D20F ; rejestr statusu złącza szeregowego (O) + 91 + 92 * --------------------------------------------------------------------------------------------- + 93 * --- PIA + 94 * --------------------------------------------------------------------------------------------- + 95 = D300 porta = $D300 ; port A układu PIA + 96 = D301 portb = $D301 ; port B układu PIA + 97 = D302 pactl = $D302 ; rejestr kontroli portu A + 98 = D303 pbctl = $D303 ; rejestr kontroli portu B + 99 + 100 * --------------------------------------------------------------------------------------------- + 101 * --- ANTIC + 102 * --------------------------------------------------------------------------------------------- + 103 = D400 dmactl = $D400 ; rejestr kontroli dostępu do pamięci + 104 = D401 chrctl = $D401 ; rejestr kontroli wyświetlania znaków + 105 = D402 dlptr = $D402 ; adres programu ANTIC-a + 106 = D404 hscrol = $D404 ; znacznik poziomego przesuwu obrazu + 107 = D405 vscrol = $D405 ; znacznik pionowego przesuwu obrazu + 108 = D407 pmbase = $D407 ; adres pamięci graczy i pocisków + 109 = D409 chbase = $D409 ; adres zestawu znaków + 110 = D40A wsync = $D40A ; znacznik oczekiwania na synchronizację poziomą + 111 = D40B vcount = $D40B ; licznik linii obrazu + 112 = D40C lpenh = $D40C ; poziome położenie pióra świetlengo + 113 = D40D lpenv = $D40D ; pionowe położenie pióra świetlnego + 114 = D40E nmien = $D40E ; rejestr zezwoleń na przerwania NMI + 115 = D40F nmist = $D40F ; rejestr statusu przerwań NMI + 116 + 117 ;------------------------------------- + 118 ;additional system variables + 119 ;------------------------------------- + 120 = 02C0 COLPM0S = $02C0 ;- - rejestr-cień COLPM0 + 121 = 02C1 COLPM1S = $02C1 ;- - rejestr-cień COLPM1 + 122 = 02C2 COLPM2S = $02C2 ;- - rejestr-cień COLPM2 + 123 = 02C3 COLPM3S = $02C3 ;- - rejestr-cień COLPM3 + 124 = 02C4 COLPF0S = $02C4 ;- - rejestr-cień COLPF0 + 125 = 02C5 COLPF1S = $02C5 ;- - rejestr-cień COLPF1 + 126 = 02C6 COLPF2S = $02C6 ;- - rejestr-cień COLPF2 + 127 = 02C7 COLPF3S = $02C7 ;- - rejestr-cień COLPF3 + 128 + 129 = 02C8 COLBAKS = $02C8 + 130 = 026F GTICTLS = $026F ;- - rejestr-cień GTIACTL + 131 + 132 = 022F DMACTLS = $022F ;- - rejestr kontroli dostępu do pamięci - cień + 133 = 0230 DLPTRS = $0230 ;- - adres programu ANTIC-a - cień + 134 = 02F4 CHBAS = $02F4 ;- - rejestr-cień CHBASE + 135 = 02FC KBCODES = $02FC ;- - rejestr-cień KBCODE + 136 + 137 = E45C SETVBV = $E45C + 138 = E462 XITVBV = $E462 + 139 = E45F SYSVBV = $E45F + 140 = 0012 RTCLOK = $0012 + 141 + 142 = 02E5 MEMTOP = $02E5 ;- - adres górnej granicy wolnej pamięci RAM + 143 = 02E7 MEMLO = $02E7 ;- - adres dolnej granicy wolnej pamięci RAM + 144 + 145 = 0278 JSTICK0 = $0278 ;- - położenie joysticka 0 + 146 = 0279 JSTICK1 = $0279 ;- JSTICK1 - położenie joysticka 1 + 147 = 027A JSTICK2 = $027A ;- JSTICK2 - położenie joysticka 0 + 148 = 027B JSTICK3 = $027B ;- JSTICK3 - położenie joysticka 1 + 149 = 027C PTRIG0 = $027C ;- PTRIG0 - przycisk potencjometru 0 + 150 = 027D PTRIG1 = $027D ;- PTRIG1 - przycisk potencjometru 1 + 151 = 0284 TRIG0S = $0284 ;- TRIG0S - przycisk joysticka 0, rejestr-cień TRIG0 + 152 = 0285 TRIG1S = $0285 ;- TRIG1S - przycisk joysticka 1, rejestr-cień TRIG1 + 153 = 0286 TRIG2S = $0286 ;- TRIG2S - rejestr-cień TRIG0 + 154 = 0287 TRIG3S = $0287 ;- TRIG3S - rejestr-cień TRIG1 + 155 + 156 + 157 /* + 158 Rejestry OS w pamięci RAM + 159 + 160 $08 - WARMST - znacznik gorącego startu + 161 $0E - APPMHI - najwyższy adres RAM zajęty przez program + 162 $10 - IRQENS - rejestr-cień IRQEN + 163 $11 - IRQSTAT - rejestr-cień IRQST + 164 $12 - RTCLOK - zegar czasu rzeczywistego + 165 $15 - BUFADR - adres bufora dla operacji dyskowych + 166 $17 - ICCOMT - rejestr przejściowy kodu operacji I/O + 167 $20 - ZIOCB - zerostronicowy blok kontroli I/O + 168 $20 - ICHIDZ - indeks wpisu urządzenia w HATABS + 169 $21 - ICDNOZ - numer urządzenia + 170 $22 - ICCOMZ - kod operacji wejścia/wyjścia + 171 $23 - ICSTZ - status operacji wejścia/wyjścia + 172 $24 - ICBAZ - adres bufora danych dla operacji I/O + 173 $26 - ICPTZ - adres procedury obsługi dla operacji + 174 $28 - ICBLZ - długość bufora danych dla operacji I/O + 175 $2A - ICAX1Z - rejestr pomocniczy ZIOCB + 176 $2B - ICAX2Z - rejestr pomocniczy ZIOCB + 177 $2C - ICAX3Z - rejestr pomocniczy ZIOCB + 178 $2D - ICAX4Z - rejestr pomocniczy ZIOCB + 179 $2E - ICAX5Z - rejestr pomocniczy ZIOCB + 180 $2F - ICAX6Z - rejestr pomocniczy ZIOCB + 181 $30 - STATUS - status aktualnej operacji SIO + 182 $31 - CHKSUM - suma kontrolna dla operacji SIO + 183 $32 - BUFR - adres bufora danych dla SIO + 184 $34 - BUFEN - adres końca bufora danych dla SIO + 185 $36 - LTEMP - pomocniczy wektor odczytu listy liniowej + 186 $38 - BUFRFL - znacznik zapełnienia bufora SIO + 187 $39 - RECVND - znacznik końca odczytu + 188 $3A - XMTDON - znacznik końca transmisji + 189 $3B - CHKSNT - znacznik nadania sumy kontrolnej + 190 $3C - NOCKSM - znacznik braku sumy kontrolnej + 191 $3D - BPTR - licznik bufora magnetofonu + 192 $3E - GAPTYP - znacznik długości przerwy między blokami + 193 $3F - FEOF - znacznik końca zbioru + 194 $40 - FREQ - licznik dźwięku przy otwarciu magnetofonu + 195 $41 - IOSNDEN - znacznik dźwięku przy transmisji + 196 $42 - CRITIC - znacznik krytycznych czasowo operacji I/O + 197 $4A - ZCHAIN - rejestr następstwa listy liniowej + 198 $4C - DSTAT - status klawiatury i ekranu + 199 $50 - TEMP - pomocniczy rejestr przejściowy + 200 $51 - HOLD1 - pomocniczy rejestr przejściowy + 201 $52 - LMARGIN - lewy margines obrazu + 202 $53 - RMARGIN - prawy margines obrazu + 203 $54 - ROWCRS - pionowa pozycja kursora + 204 $55 - COLCRS - pozioma pozycja kursora + 205 $57 - DINDEX - numer trybu graficznego OS + 206 $58 - SAVMSC - adres pamięci obrazu + 207 $5A - OLDROW - poprzednia pionowa pozycja kursora + 208 $5B - OLDCOL - poprzednia pozioma pozycja kursora + 209 $5D - OLDCHR - poprzedni znak na ekranie + 210 $5E - OLDADR - poprzedni adres znaku na ekranie + 211 $60 - FKDEFP - wektor tabeli definicji klawiszy F1-F4 + 212 $62 - PALNTS - wskaźnik systemu TV + 213 $63 - LOGCOL - adres kursora w wierszu logicznym + 214 $64 - ADRESS - rejestr adresowy dla procedur edytora + 215 $66 - MLTTMP - pomocniczy rejestr przejściowy + 216 $68 - SAVADR - pomocniczy rejestr adresowy + 217 $6A - RAMTOP - liczba stron pamięci RAM + 218 $6B - BUFCNT - licznik bufora edytora + 219 $6C - BUFSTR - adres bufora dla edytora + 220 $6E - BITMSK - maska bitowa do wyświetlenia znaku + 221 $6F - SHFAMT - liczba przesunięć punktu + 222 $70 - ROWAC - aktualny wiersz przy rysowaniu + 223 $72 - COLAC - aktualna kolumna przy rysowaniu + 224 $74 - ENDPT - znacznik końca rysowanej linii + 225 $76 - DELTAR - przyrost pionowej pozycji kursora + 226 $77 - DELTAC - przyrost poziomej pozycji kursora + 227 $79 - KEYDEFP - wektor tabeli definicji klawiszy + 228 $7B - SWPFLG - znacznik kursora w trybach z oknem + 229 $7C - HOLDCH - przechowywanie wartości znaku + 230 $7D - INSDAT - rejestr pomocniczy edytora + 231 $7E - COUNTR - licznik pamięci obrazu dla DOSCR i DRAW + 232 $0100 - STACK - stos mikroprocesora 6502 + 233 $0200 - DLIV - wektor przerwania programu ANTIC-a + 234 $0210 - VTIMR1 - wektor przerwania licznika 1 POKEY-a + 235 $0212 - VTIMR2 - wektor przerwania licznika 2 POKEY-a + 236 $0214 - VTIMR4 - wektor przerwania licznika 4 POKEY-a + 237 $0218 - TIMCNT1 - pierwszy licznik systemu + 238 $0226 - TIMVEC1 - wektor przerwania licznika TIMCNT1 + 239 $022A - TIMFLG3 - znacznik wyzerowania licznika TIMCNT3 + 240 $022F - DMACTLS - rejestr-cień DMACTL + 241 $0230 - DLPTRS - rejestr-cień DLPTR + 242 $0232 - SKCTLS - rejestr-cień SKCTL + 243 $0233 - LCOUNT - licznik odczytu dla nowego urządzenia + 244 $0234 - LPENHS - rejestr-cień LPENH + 245 $0235 - LPENVS - rejestr-cień LPENV + 246 $023A - CDEVIC - kod urządzenia dla SIO + 247 $023B - CCMND - kod operacji dla SIO + 248 $023C - CAUX1 - pierwszy bajt pomocniczy dla SIO + 249 $023D - CAUX2 - drugi bajt pomocniczy dla SIO + 250 $023E - TEMP - tymczasowy rejestr odpowiedzi urządzenia + 251 $023F - ERRFLG - znacznik błędu operacji SIO + 252 $0244 - COLDST - znacznik zimnego startu systemu + 253 $0245 - RECLEN - długość rekordu z nowego urządzenia + 254 $0246 - DSKTIM - wartość Timeout dla stacji dysków + 255 $0247 - PDVMSK - maska obecności nowych urządzeń + 256 $0248 - PDVRS - rejestr-cień PDVREG + 257 $024A - RELADR - adres procedury przemieszczalnej + 258 $024C - PPTMPA - rejestr przechowania zawartości akumulatora + 259 $024D - PPTMPX - rejestr przechowania zawartości rejestru X + 260 $026B - CHSPTR - wektor nieużywanego zestawu znaków + 261 $026C - VSFLAG - znacznik przesuwu pionowego obrazu + 262 $026E - FINE - znacznik delikatnego przesuwu obrazu + 263 $026F - GTICTLS - rejestr-cień GTIACTL + 264 $0270 - PADDL0 - rejestr-cień POT0 + 265 $0278 - JSTICK0 - położenie joysticka 0 + 266 $0279 - JSTICK1 - położenie joysticka 1 + 267 $027A - JSTICK2 - położenie joysticka 0 + 268 $027B - JSTICK3 - położenie joysticka 1 + 269 $027C - PTRIG0 - przycisk potencjometru 0 + 270 $027D - PTRIG1 - przycisk potencjometru 1 + 271 $0284 - TRIG0S - przycisk joysticka 0, rejestr-cień TRIG0 + 272 $0285 - TRIG1S - przycisk joysticka 1, rejestr-cień TRIG1 + 273 $0286 - TRIG2S - rejestr-cień TRIG0 + 274 $0287 - TRIG3S - rejestr-cień TRIG1 + 275 $0288 - HIBYTE - indeks operacji nowego urządzenia + 276 $0289 - WMODE - znacznik sposobu dostępu do magnetofonu + 277 $028A - BLIM - długość bufora magnetofonu + 278 $028E - NEWADR - adres procedury nowego urządzenia + 279 $0290 - TXTROW - wiersz kursora w oknie tekstowym + 280 $0291 - TXTCOL - kolumna kursora w oknie tekstowym + 281 $0293 - TINDEX - tryb graficzny OS w oknie tekstowym + 282 $0294 - TXTMSC - adres pamięci okna tekstowego + 283 $029C - CRETRY - liczba powtórzeń rozkazu operacji + 284 $029D - HOLD3 - pomocniczy rejestr przejściowy + 285 $029E - SUBTMP - pomocniczy rejestr przejściowy + 286 $02A0 - DMASK - maska punktów obrazu + 287 $02A2 - ESCFLG - znacznik klawisza ESC + 288 $02A3 - TABMAP - mapa pozycji tabulacji + 289 $02B2 - LOGMAP - mapa linii logicznych + 290 $02B6 - INVFLG - znacznik klawisza inverse video + 291 $02B7 - FILFLG - znacznik wypełniania obrazu + 292 $02B8 - TMPROW - tymczasowy rejestr pozycji kursora + 293 $02B9 - TMPCOL - tymczasowy rejestr pozycji kursora + 294 $02BB - SCRFLG - znacznik przesuwu obrazu + 295 $02BC - HOLD4 - pomocniczy rejestr przejściowy + 296 $02BD - DRETRY - liczba powtórzeń wywołań urządzenia + 297 $02BE - SHFLOK - znacznik klawiszy SHIFT i CONTROL + 298 $02BF - BOTSCR - liczba wierszy tekstu + 299 $02C0 - COLPM0S - rejestr-cień COLPM0 + 300 $02C1 - COLPM1S - rejestr-cień COLPM1 + 301 $02C2 - COLPM2S - rejestr-cień COLPM2 + 302 $02C3 - COLPM3S - rejestr-cień COLPM3 + 303 $02C4 - COLPF0S - rejestr-cień COLPF0 + 304 $02C5 - COLPF1S - rejestr-cień COLPF1 ;gr.8 letters + 305 $02C6 - COLPF2S - rejestr-cień COLPF2 ;gr.8 background + 306 $02C7 - COLPF3S - rejestr-cień COLPF3 + 307 $02C8 - COLBAKS - rejestr-cień COLBAK + 308 $02C9 - RUNADR - adres procedury nowego urządzenia + 309 $02CB - HIUSED - adres końcowy procedury nowego urządzenia + 310 $02CF - GBYTEA - adres procedury nowego urządzenia + 311 $02D1 - LOADAD - adres wczytywania z nowego urządzenia + 312 $02D3 - ZLOADA - pomocniczy rejestr adresu wczytywania + 313 $02D5 - DSCTLN - długość sektora dyskowego + 314 $02DB - NOCLIK - znacznik dźwięku klawiatury + 315 $02DE - PBPNT - licznik bufora drukarki + 316 $02DF - PBUFSZ - długość bufora drukarki + 317 $02E5 - MEMTOP - adres górnej granicy wolnej pamięci RAM + 318 $02E7 - MEMLO - adres dolnej granicy wolnej pamięci RAM + 319 $02E9 - HNDLOD - znacznik relokowalnej procedury obsługi I/O + 320 $02EA - DVSTAT - dodatkowy rejestr statusu urządzenia + 321 $02EC - DVTMOT - dodatkowy rejestr Timeout urządzenia + 322 $02ED - REVNUM - numer wersji nowego urządzenia + 323 $02EE - CBAUD - prędkość transmisji z magnetofonu + 324 $02F0 - CRSINH - znacznik widoczności kursora + 325 $02F3 - CHACT - rejestr-cień CHRCTL + 326 $02F4 - CHBAS - rejestr-cień CHBASE + 327 $02F5 - NEWROW - nowa pozycja pionowa kursora + 328 $02F6 - NEWCOL - nowa pozycja pozioma kursora + 329 $02F8 - ROWINC - zmiana pionowej pozycji kursora + 330 $02F9 - COLINC - zmiana poziomej pozycji kursora + 331 $02FA - CHAR - kod wewnętrzny znaku + 332 $02FB - ATACHR - kod ATASCII znaku + 333 $02FC - KBCODES - rejestr-cień KBCODE + 334 $02FD - FILDAT - numer koloru dla wypełniania + 335 $02FE - DSPFLG - znacznik wyświetlania znaków kontrolnych + 336 $02FF - SSFLAG - znacznik start/stop dla przesuwu obrazu + 337 $0300 - DDEVIC - kod identyfikacyjny urządzenia + 338 $0301 - DUNIT - numer identyfikacyjny urządzenia + 339 $0302 - DCMND - bajt rozkazu dla urządzenia + 340 $0303 - DSTATS - status urządzenia + 341 $0304 - DBUFA - adres bufora danych + 342 $0306 - DTIMLO - wartość Timeout dla urządzenia + 343 $0308 - DBYT - długość bufora danych + 344 $030A - DAUX1 - rejestr pomocniczy dla operacji I/O + 345 $030B - DAUX2 - rejestr pomocniczy dla operacji I/O + 346 $030C - INTIM1 - rejestr czasu przy odczycie z magnetofonu + 347 $030F - CASFLG - znacznik operacji z magnetofonem + 348 $0310 - INTIM2 - rejestr czasu przy odczycie z magnetofonu + 349 $0312 - TEMP1 - pomocniczy rejestr przejściowy + 350 $0313 - TEMP2 - pomocniczy rejestr przejściowy + 351 $0314 - PTIMOT - wartość Timeout dla drukarki + 352 $0315 - TEMP3 - pomocniczy rejestr przejściowy + 353 $0316 - SAVIO - rejestr przejściowy dla operacji SIO + 354 $0317 - TIMFLG - znacznik upłynięcia czasu Timeout + 355 $0318 - STACKP - rejestr wskaźnika stosu dla SIO + 356 $0319 - TSTAT - przejściowy rejestr statusu SIO + 357 $031A - HATABS - tabela wektorów procedur obsługi + 358 $0340 - IOCB0 - blok kontroli I/O numer 0 + 359 $0350 - IOCB1 - blok kontroli I/O numer 1 + 360 $0360 - IOCB2 - blok kontroli I/O numer 2 + 361 $0370 - IOCB3 - blok kontroli I/O numer 3 + 362 $0380 - IOCB4 - blok kontroli I/O numer 4 + 363 $0390 - IOCB5 - blok kontroli I/O numer 5 + 364 $03A0 - IOCB6 - blok kontroli I/O numer 6 + 365 $03B0 - IOCB7 - blok kontroli I/O numer 7 + 366 $0340 - ICCHID - indeks wpisu urządzenia w HATABS + 367 $0341 - ICDNO - numer urządzenia + 368 $0342 - ICCMD - kod rozkazu operacji I/O + 369 $0343 - ICSTAT - status operacji I/O + 370 $0344 - ICBUFA - adres bufora danych dla operacji I/O + 371 $0346 - ICPUTB - adres procedury przesyłania danych + 372 $0348 - ICBUFL - długość bufora danych dla operacji I/O + 373 $034A - ICAX1 - rejestr pomocniczy dla operacji I/O + 374 $034B - ICAX2 - rejestr pomocniczy dla operacji I/O + 375 $034C - ICAX3 - rejestr pomocniczy dla operacji I/O + 376 $034D - ICAX4 - rejestr pomocniczy dla operacji I/O + 377 $034E - ICAX5 - rejestr pomocniczy dla operacji I/O + 378 $034F - ICAX6 - rejestr pomocniczy dla operacji I/O + 379 $03C0 - PRNBUF - bufor drukarki + 380 $03E8 - SUPERF - znacznik stosowany przy odczycie klawiatury + 381 $03E9 - CKEY - znacznik klawisza START przy zimnym starcie + 382 $03EC - DERRF - znacznik błędu przy otwieraniu edytora + 383 $03FB - CHLINK - rejestr elementów listy liniowej + 384 $03FD - CSCB - bajty kontroli szybkości magnetofonu + 385 $03FF - CRCB - bajt długości rekordu magnetofonowego + 386 $0400 - CASBUF - bufor magnetofonu + 387 $047F - CASBEN - koniec bufora magnetofonu + 388 $D000 - HPOSP0 - pozioma pozycja gracza 0 (Z) + 389 $D000 - KOLM0PF - kolizja pocisku 0 z polem gry (O) + 390 $D001 - HPOSP1 - pozioma pozycja gracza 1 (Z) + 391 $D001 - KOLM1PF - kolizja pocisku 1 z polem gry (O) + 392 $D002 - HPOSP2 - pozioma pozycja gracza 2 (Z) + 393 $D002 - KOLM2PF - kolizja pocisku 2 z polem gry (O) + 394 $D003 - HPOSP3 - pozioma pozycja gracza 3 (Z) + 395 $D003 - KOLM3PF - kolizja pocisku 3 z polem gry (O) + 396 $D004 - HPOSM0 - pozioma pozycja pocisku 0 (Z) + 397 $D004 - KOLP0PF - kolizja gracza 0 z polem gry (O) + 398 $D005 - HPOSM1 - pozioma pozycja pocisku 1 (Z) + 399 $D005 - KOLP1PF - kolizja gracza 1 z polem gry (O) + 400 $D006 - HPOSM2 - pozioma pozycja pocisku 2 (Z) + 401 $D006 - KOLP2PF - kolizja gracza 2 z polem gry (O) + 402 $D007 - HPOSM3 - pozioma pozycja pocisku 3 (Z) + 403 $D007 - KOLP3PF - kolizja gracza 3 z polem gry (O) + 404 $D008 - SIZEP0 - poziomy rozmiar gracza 0 (Z) + 405 $D008 - KOLM0P - kolizja pocisku 0 z graczem (O) + 406 $D009 - SIZEP1 - poziomy rozmiar gracza 1 (Z) + 407 $D009 - KOLM1P - kolizja pocisku 1 z graczem (O) + 408 $D00A - SIZEP2 - poziomy rozmiar gracza 2 (Z) + 409 $D00A - KOLM2P - kolizja pocisku 2 z graczem (O) + 410 $D00B - SIZEP3 - poziomy rozmiar gracza 3 (Z) + 411 $D00B - KOLM3P - kolizja pocisku 3 z graczem (O) + 412 $D00C - SIZEM - poziomy rozmiar pocisków (Z) + 413 $D00C - KOLP0P - kolizja gracza 0 z innym graczem (O) + 414 $D00D - GRAFP0 - rejestr grafiki gracza 0 (Z) + 415 $D00D - KOLP1P - kolizja gracza 1 z innym graczem (O) + 416 $D00E - GRAFP1 - rejestr grafiki gracza 1 (Z) + 417 $D00E - KOLP2P - kolizja gracza 2 z innym graczem (O) + 418 $D00F - GRAFP2 - rejestr grafiki gracza 2 (Z) + 419 $D00F - KOLP3P - kolizja gracza 3 z innym graczem (O) + 420 $D010 - GRAFP3 - rejestr grafiki gracza 3 (Z) + 421 $D010 - TRIG0 - stan przycisku joysticka 0 (O) + 422 $D011 - GRAFM - rejestr grafiki pocisków (Z) + 423 $D011 - TRIG1 - stan przycisku joysticka 1 (O) + 424 $D012 - COLPM0 - rejestr koloru gracza i pocisku 0 (Z) + 425 $D013 - COLPM1 - rejestr koloru gracza i pocisku 1 (Z) + 426 $D013 - TRIG3 - znacznik dołączenia cartridge'a (O) + 427 $D014 - COLPM2 - rejestr koloru gracza i pocisku 2 (Z) + 428 $D014 - PAL - znacznik systemu TV (O) + 429 $D015 - COLPM3 - rejestr koloru gracza i pocisku 3 (Z) + 430 $D016 - COLPF0 - rejestr koloru pola gry 0 (Z) + 431 $D017 - COLPF1 - rejestr koloru pola gry 1 (Z) + 432 $D018 - COLPF2 - rejestr koloru pola gry 2 (Z) + 433 $D019 - COLPF3 - rejestr koloru pola gry 3 (Z) + 434 $D01A - COLBAK - rejestr koloru tła (Z) + 435 $D01B - GTIACTL - rejestr kontroli układu GTIA + 436 $D01C - VDELAY - licznik opóźnienia pionowego P/MG + 437 $D01D - PMCNTL - rejestr kontroli graczy i pocisków + 438 $D01E - HITCLR - rejestr kasowania rejestrów kolizji + 439 $D01F - CONSOL - rejestr stanu klawiszy konsoli + 440 $D1FF - PDVREG - rejestr wyboru nowego urządzenia + 441 $D200 - AUDF1 - częstotliwość pracy generatora 1 (Z) + 442 $D200 - POT0 - rejestr położenia potencjometru 0 (O) + 443 $D201 - AUDC1 - rejestr kontroli dźwięku generatora 1 (Z) + 444 $D201 - POT1 - rejestr położenia potencjometru 1 (O) + 445 $D202 - AUDF2 - częstotliwość pracy generatora 2 (Z) + 446 $D202 - POT2 - rejestr położenia potencjometru 2 (O) + 447 $D203 - AUDC2 - rejestr kontroli dźwięku generatora 2 (Z) + 448 $D203 - POT3 - rejestr położenia potencjometru 3 (O) + 449 $D204 - AUDF3 - częstotliwość pracy generatora 3 (Z) + 450 $D205 - AUDC3 - rejestr kontroli dźwięku generatora 3 (Z) + 451 $D206 - AUDF4 - częstotliwość pracy generatora 4 (Z) + 452 $D207 - AUDC4 - rejestr kontroli dźwięku generatora 4 (Z) + 453 $D208 - AUDCTL - rejestr kontroli generatorów dźwięku (Z) + 454 $D208 - POTST - status odczytu potencjometrów (O) + 455 $D209 - STIMER - rejestr zerowania liczników (Z) + 456 $D209 - KBCODE - kod ostatnio naciśniętego klawisza (O) + 457 $D20A - SKSTRES - reset statusu złącza szeregowego (Z) + 458 $D20A - RANDOM - rejestr liczby losowej (O) + 459 $D20B - POTG0 - znacznik przetwornika analogowo-cyfrowego (Z) + 460 $D20D - SEROUT - szeregowy rejestr wyjściowy (Z) + 461 $D20D - SERIN - szeregowy rejestr wejściowy (O) + 462 $D20E - IRQEN - zezwolenia przerwań IRQ (Z) + 463 $D20E - IRQST - status przerwań IRQ (O) + 464 $D20F - SKCTL - rejestr kontroli złącza szeregowego (Z) + 465 $D20F - SKSTAT - rejestr statusu złącza szeregowego (O) + 466 $D300 - PORTA - port A układu PIA + 467 $D301 - PORTB - port B układu PIA + 468 $D302 - PACTL - rejestr kontroli portu A + 469 $D303 - PBCTL - rejestr kontroli portu B + 470 $D400 - DMACTL - rejestr kontroli dostępu do pamięci + 471 $D401 - CHRCTL - rejestr kontroli wyświetlania znaków + 472 $D402 - DLPTR - adres programu ANTIC-a + 473 $D404 - HSCROL - znacznik poziomego przesuwu obrazu + 474 $D405 - VSCROL - znacznik pionowego przesuwu obrazu + 475 $D407 - PMBASE - adres pamięci graczy i pocisków + 476 $D409 - CHBASE - adres zestawu znaków + 477 $D40A - WSYNC - znacznik oczekiwania na synchronizację poziomą + 478 $D40B - VCOUNT - licznik linii obrazu + 479 $D40C - LPENH - poziome położenie pióra świetlengo + 480 $D40D - LPENV - pionowe położenie pióra świetlnego + 481 $D40E - NMIEN - rejestr zezwoleń na przerwania NMI + 482 $D40F - NMIST - rejestr statusu przerwań NMI + 483 */ + 483 + 483 = 0080 XDRAW + 483 = 0082 YDRAW + 483 = 0084 XBYTE + 483 = 0086 YBYTE + 483 = 0088 CHARCODE + 483 = 0089 FONTIND + 483 = 008B TANKNR + 483 = 008C TANKSEQUENCEPOINTER + 483 = 008D OLDPLOT + 483 = 008F XC + 483 = 0091 TEMP + 483 = 0093 TEMP2 + 483 = 0095 TEMPXROLLER + 483 = 0097 XTEMPDRAW + 483 = 0099 YTEMPDRAW + 483 = 009B XI + 483 = 009D FX + 483 = 009E YI + 483 = 00A0 FY + 483 = 00A1 XK + 483 = 00A3 FS + 483 = 00A4 YC + 483 = 00A5 DX + 483 = 00A7 TEMPOR2 + 483 = 00A8 DY + 483 = 00AA TEMPOR3 + 483 = 00AC DD + 483 = 00AE DI + 483 = 00B0 DP + 483 = 00B2 MODIFY + 483 = 00B4 WEAPONPOINTER + 80 icl '../lib/macro.hea' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea + 1 ;------------------------------------- + 2 .MACRO ROLW + 3 ROL :1 + 4 ROL :1+1 + 5 .ENDM + 6 ;------------------------------------- + 7 .MACRO ASLW + 8 ASL :1 + 9 ROL :1+1 + 10 .ENDM + 11 ;------------------------------------- + 12 .MACRO RORW + 13 ROR :1+1 + 14 ROR :1 + 15 .ENDM + 16 ;------------------------------------- + 17 .MACRO LSRW + 18 LSR :1+1 + 19 ROR :1 + 20 .ENDM + 21 + 22 ;------------------------------------- + 23 .MACRO VMAIN + 24 ; VMAIN #WORD,interrupt.vector + 25 ; interrupt.vector: + 26 ; 0 - VIMIRQ + 27 ; 1 - TIMCNT1 + 28 ; 2 - TIMCNT2 + 29 ; 3 - TIMCNT3 + 30 ; 4 - TIMCNT4 + 31 ; 5 - TIMCNT5 + 32 ; 6 - VVBLKI + 33 ; 7 - VVBLKD + 34 ; 8 - TIMVEC1 + 35 ; 9 - TIMVEC2 + 36 ; Initialises Vertical Blank Interrupts + 37 ; (works only with system interrupts ON) + 38 LDY # <:1 + 39 LDX # >:1 + 40 LDA #:2 + 41 JSR SETVBV + 42 .ENDM + 43 ;------------------------------------- + 44 .MACRO VDLI + 45 ; VDLI #WORD + 46 ; Initialises Display List Interrupts + 47 LDY # <:1 + 48 LDX # >:1 + 49 LDA #$C0 + 50 STY $0200 + 51 STX $0201 + 52 STA NMIEN + 53 .ENDM + 54 ;------------------------------------- + 55 .MACRO halt + 56 ?stop + 57 /* + 58 lda RANDOM + 59 and #$05 + 60 sta COLBAK + 61 */ + 62 jmp ?stop + 63 .ENDM + 64 ;------------------------------------- + 65 .MACRO KEY + 66 ; KEY + 67 ; waits for releasing and pressing "any key" + 68 PHA + 69 ?CK1 LDA SKSTAT + 70 AND #$04 + 71 BEQ ?CK1 + 72 ?CK LDA SKSTAT + 73 AND #$04 + 74 BNE ?CK + 75 PLA + 76 .ENDM + 77 ;------------------------------------- + 78 .MACRO WAIT + 79 ; WAIT + 80 ; waits one frame (1/50 s(PAL) or 1/60s(NTSC)) + 81 LDA VCOUNT + 82 STA WSYNC + 83 STA WSYNC + 84 STA WSYNC + 85 ?WA CMP VCOUNT + 86 BNE ?WA + 87 .ENDM + 88 ;------------------------------------- + 89 .macro negw + 90 ; negate the given word (0-a) + 91 ;------------------------------------- + 92 sec + 93 lda #$00 + 94 sbc :1 + 95 sta :1 + 96 lda #$00 + 97 sbc :1+1 + 98 sta :1+1 + 99 .endm + 100 ;------------------------------------- + 101 .macro randomize + 102 ;usage: randomize floor ceiling + 103 ;returns (in A) a random .byte between "floor" and "ceiling" + 104 ?rand + 105 lda random + 106 cmp #:1 ;floor + 107 bcc ?rand + 108 cmp #:2+1 ;ceiling + 109 bcs ?rand + 110 .endm + 111 ;------------------------------------- + 112 .macro phx + 113 txa + 114 pha + 115 .endm + 116 ;------------------------------------- + 117 .macro phy + 118 tya + 119 pha + 120 .endm + 121 ;------------------------------------- + 122 .macro plx + 123 pla + 124 tax + 125 .endm + 126 ;------------------------------------- + 127 .macro ply + 128 pla + 129 tay + 130 .endm + 131 ;------------------------------------- + 132 .macro pause + 133 ;waits :1 number (byte) of frames + 134 ldx #:1 + 135 ?PAUSELOOP + 136 wait + 137 dex + 138 bne ?PAUSELOOP + 139 .ENDM + 140 + 81 + 82 ;Game loading address + 83 ORG $3010 ;two hex thousands for screen + 84 ;----------------------------------------------- + 85 ;Screen displays go first to avoid crossing 4kb barrier + 86 ;----------------------------------------------- + 87 icl 'display.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\display.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ;----------------------------------------------------- + 6 ;-------------display-lists--------------------------- + 7 ;----------------------------------------------------- + 8 PurchaseDL + 9 FFFF> 3010-9329> 70 70 + .byte $70,$70,$20 + 10 3013 42 .byte $42 + 11 3014 C9 3C .word textbuffer2 + 12 3016 02 10 42 .byte $02,$10,$42 + 13 3019 MoreUpdl + 14 3019 51 3C .word EmptyLine + 15 301B 00 42 .byte 0,$42 + 16 301D WeaponsListDL + 17 301D E3 33 .word ListOfWeapons + 18 301F 00 02 00 02 00 02 + .byte 0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0 + 19 303E 42 .byte $42 + 20 303F MoreDownDL + 21 303F 51 3C .word EmptyLine + 22 3041 10 42 .byte $10,$42 + 23 3043 03 3C .word WeaponsDescription + 24 3045 02 .byte 2 + 25 3046 41 .byte $41 + 26 3047 10 30 .word PurchaseDL + 27 ;------------------------ + 28 3049 OptionsDL + 29 3049 70 70 70 70 70 .byte $70,$70,$70,$70,$70 + 30 304E 42 .byte $42 + 31 304F 7B 31 .word OptionsScreen + 32 3051 02 02 70 02 00 02 + .byte $02,$02,$70,$02,0,$02,0,$2,0,$2 + 33 305B 41 .byte $41 + 34 305C 49 30 .word OptionsDL + 35 ;------------------------ + 36 ;Enter names of tanks DL + 37 305E NameDL + 38 305E 70 70 70 70 70 .byte $70,$70,$70,$70,$70 + 39 3063 42 .byte $42 + 40 3064 93 32 .word NameScreen + 41 3066 30 .byte $30 + 42 3067 02 30 02 .byte $02,$30,$2 + 43 306A 10 02 02 02 30 02 + .byte $10,2,2,2,$30,2,2 + 44 3071 41 .byte $41 + 45 3072 5E 30 .word NameDL + 46 ; ------------------------------------------------- + 47 + 48 3074 dl ; MAIN game display list + 49 3074 70 00 .byte $70,$00 + 50 3076 42 .byte $42 + 51 3077 79 3C .word textbuffer + 52 3079 82 .byte $02 +$80 ;DLI + 53 307A 00 .byte $00 + 54 + 55 307B 4F .byte $4f + 56 307C 53 31 .word WhiteLine + 57 307E 4F .byte $4f + 58 307F 50 2F .word PlotLine + 59 3081 4F .byte $4f + 60 3082 53 31 .word WhiteLine + 61 + 62 3084 4F .byte $4f + 63 3085 10 10 .word display + 64 + 65 3087 0F 0F 0F 0F 0F 0F + :100 .by $0f + 66 30EB 0F .by $0f + 67 30EC 4F .by $4f + 68 30ED 00 20 .wo display+$0ff0 + 69 30EF 0F 0F 0F 0F 0F 0F + :97 .byte $0f + 70 3150 41 .byte $41 + 71 3151 74 30 .word dl + 72 ; horizontal line + 73 3153 WhiteLine + 74 3153 FF FF FF FF FF FF + :screenBytes .by $ff + 75 = 2F50 PlotLine = display + screenHeight*screenBytes ; the last line is plot pointer + 76 ;----------------------------------------------- + 77 ;Screen displays go first to avoid crossing 4kb barrier + 78 ;----------------------------------------------- + 79 317B OptionsScreen + 80 317B 37 65 6C 63 6F 6D + dta d"Welcome to Scorch ver. 124 (cc)2000-2013" + 81 31A3 00 30 6C 65 61 73 + dta d" Please select option with cursor keys " + 82 31CB 00 00 00 00 00 61 + dta d" and press (Return) to proceed " + 83 31F3 OptionsHere + 84 ; 0123456789012345678901234567890123456789 + 85 31F3 30 6C 61 79 65 72 + dta d"Players : 2 3 4 5 6 " + 86 321B 23 61 73 68 00 00 + dta d"Cash : none 2K 5K 8K 10K " + 87 3243 27 72 61 76 69 74 + dta d"Gravity : 0.2G 0.5G 1G 2G 4G " + 88 326B 37 69 6E 64 00 00 + dta d"Wind : 1B 3B 5B 7B 9B " + 89 3293 OptionsScreenEnd + 90 ; ------------------------------------------------- + 91 3293 NameScreen + 92 3293 00 00 00 00 25 6E + dta d" Enter names of players " + 93 32B3 00 00 00 34 61 6E + dta d" Tank 01 Name:" + 94 32C7 NameAdr + 95 32C7 00 00 00 00 00 00 + dta d" " + 96 32D3 00 28 75 6D 61 6E + dta d" Human/Atari (difficulty level) " + 97 32F3 00 dta d" " + 98 32F4 NamesOfLevels + 99 32F4 00 28 35 2D 21 2E + dta d" HUMAN Moron Shooter " + 100 3313 00 00 30 6F 6F 6C + dta d" Poolshark Toosser Chooser " + 101 3333 00 00 33 70 6F 69 + dta d" Spoiler Cyborg Unknown " + 102 3353 00 00 dta d" " + 103 3355 B4 E1 E2 dta d"Tab"* + 104 3358 00 0D 00 30 6C 61 + dta d" - Player/Difficulty level " + 105 3373 00 00 00 00 00 00 + dta d" " + 106 337A B2 E5 F4 F5 F2 EE dta d"Return"* + 107 3380 00 0D 00 30 72 6F + dta d" - Proceed " + 108 ;--------------------------------------------------- + 109 3393 MoreUp + 110 3393 00 00 00 00 00 00 + dta d" " + 111 33A0 5C 5C 5C dta 92,92,92 + 112 33A3 00 00 6D 6F 72 65 + dta d" more " + 113 33AB 5C 5C 5C dta 92,92,92 + 114 33AE 00 00 00 00 00 00 + dta d" " + 115 33BB MoreDown + 116 33BB 00 00 00 00 00 00 + dta d" " + 117 33C8 5D 5D 5D dta 93,93,93 + 118 33CB 00 00 6D 6F 72 65 + dta d" more " + 119 33D3 5D 5D 5D dta 93,93,93 + 120 33D6 00 00 00 00 00 00 + dta d" " + 121 33E3 ListOfWeapons + 122 33E3 00 00 00 00 00 00 + dta d" " + 123 340B 00 00 00 00 00 00 + dta d" " + 124 3433 00 00 00 00 00 00 + dta d" " + 125 345B 00 00 00 00 00 00 + dta d" " + 126 3483 00 00 00 00 00 00 + dta d" " + 127 34AB 00 00 00 00 00 00 + dta d" " + 128 34D3 00 00 00 00 00 00 + dta d" " + 129 34FB 00 00 00 00 00 00 + dta d" " + 130 3523 00 00 00 00 00 00 + dta d" " + 131 354B 00 00 00 00 00 00 + dta d" " + 132 3573 00 00 00 00 00 00 + dta d" " + 133 359B 00 00 00 00 00 00 + dta d" " + 134 35C3 00 00 00 00 00 00 + dta d" " + 135 35EB 00 00 00 00 00 00 + dta d" " + 136 3613 00 00 00 00 00 00 + dta d" " + 137 363B 00 00 00 00 00 00 + dta d" " + 138 3663 00 00 00 00 00 00 + dta d" " + 139 368B 00 00 00 00 00 00 + dta d" " + 140 36B3 00 00 00 00 00 00 + dta d" " + 141 36DB 00 00 00 00 00 00 + dta d" " + 142 3703 00 00 00 00 00 00 + dta d" " + 143 372B 00 00 00 00 00 00 + dta d" " + 144 3753 00 00 00 00 00 00 + dta d" " + 145 377B 00 00 00 00 00 00 + dta d" " + 146 37A3 00 00 00 00 00 00 + dta d" " + 147 37CB 00 00 00 00 00 00 + dta d" " + 148 37F3 00 00 00 00 00 00 + dta d" " + 149 381B 00 00 00 00 00 00 + dta d" " + 150 3843 00 00 00 00 00 00 + dta d" " + 151 386B 00 00 00 00 00 00 + dta d" " + 152 3893 00 00 00 00 00 00 + dta d" " + 153 38BB 00 00 00 00 00 00 + dta d" " + 154 38E3 00 00 00 00 00 00 + dta d" " + 155 390B 00 00 00 00 00 00 + dta d" " + 156 3933 00 00 00 00 00 00 + dta d" " + 157 395B 00 00 00 00 00 00 + dta d" " + 158 3983 ListOfWeapons1End + 159 3983 ListOfDefensiveWeapons + 160 3983 00 00 00 00 00 00 + dta d" " + 161 39AB 00 00 00 00 00 00 + dta d" " + 162 39D3 00 00 00 00 00 00 + dta d" " + 163 39FB 00 00 00 00 00 00 + dta d" " + 164 3A23 00 00 00 00 00 00 + dta d" " + 165 3A4B 00 00 00 00 00 00 + dta d" " + 166 3A73 00 00 00 00 00 00 + dta d" " + 167 3A9B 00 00 00 00 00 00 + dta d" " + 168 3AC3 00 00 00 00 00 00 + dta d" " + 169 3AEB 00 00 00 00 00 00 + dta d" " + 170 3B13 00 00 00 00 00 00 + dta d" " + 171 3B3B 00 00 00 00 00 00 + dta d" " + 172 3B63 00 00 00 00 00 00 + dta d" " + 173 3B8B 00 00 00 00 00 00 + dta d" " + 174 3BB3 00 00 00 00 00 00 + dta d" " + 175 3BDB 00 00 00 00 00 00 + dta d" " + 176 3C03 ListOfDefensiveWeaponsEnd ;constant useful when clearing + 177 3C03 WeaponsDescription + 178 3C03 00 00 dta d" " + 179 3C05 B4 E1 E2 dta d"Tab"* + 180 3C08 00 0D 00 24 65 66 + dta d" - Defensive/Offensive weapon " + 181 3C29 00 00 00 dta d" " + 182 3C2C B3 F0 E1 E3 E5 dta d"Space"* + 183 3C31 00 0D 00 30 75 72 + dta d" - Purchase " + 184 3C3E B2 E5 F4 F5 F2 EE dta d"Return"* + 185 3C44 00 0D 00 26 69 6E + dta d" - Finish " + 186 3C51 EmptyLine + 187 3C51 00 00 00 00 00 00 + dta d" " + 188 ;----------------------------------------------- + 189 3C79 textbuffer + 190 3C79 30 6C 61 79 65 72 + dta d"Player: " + 191 3CA1 00 00 00 00 00 00 + dta d" " + 192 3CC9 textbuffer2 + 193 3CC9 30 6C 61 79 65 72 + dta d"Player: ******** Cash: 00000 " + 194 3CF1 0D 0D 0D 0D 0D 0D + dta d"----------------------------------------" + 195 + 196 + 197 .endif + 88 ;---------------------------------------------- + 89 3D19 icl 'variables.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\variables.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ;===================================================== + 6 ; most important non-zero page variables + 7 ; zero page variables are declared in program.s65 module + 8 ;===================================================== + 9 3D19 00 NumberOfPlayers .byte 0 ;current number of players (counted from 1) + 10 3D1A 00 00 00 00 00 00 TankSequence :MaxPlayers .by 0 ;sequence of shooting during the Round + 11 ;----------------------------------- + 12 3D20 skilltable ; computer controlled players' skills (1-8), 0 - human + 13 3D20 00 00 00 00 00 00 :MaxPlayers .by 0 + 14 ;----------------------------------- + 15 3D26 moneyH ;we place zero at the end of prices and money + 16 ;and have range from 0 to 99990 (not too much) + 17 ;money players have (maybe one more byte is needed?) + 18 3D26 00 00 00 00 00 00 :MaxPlayers .by 0 + 19 3D2C moneyL + 20 3D2C 00 00 00 00 00 00 :MaxPlayers .by 0 + 21 ;----------------------------------- + 22 3D32 gainH ;how much money player gets after the round + 23 ;it is gathered during the round basing on energy + 24 ;opponents loose after player's shoots + 25 3D32 00 00 00 00 00 00 :MaxPlayers .by 0 + 26 3D38 gainL + 27 3D38 00 00 00 00 00 00 :MaxPlayers .by 0 + 28 ;----------------------------------- + 29 3D3E looseH ;how much player looses after the round + 30 ;calculated from REAL energy loss + 31 ;(not only to zero energy) + 32 3D3E 00 00 00 00 00 00 :MaxPlayers .by 0 + 33 3D44 looseL + 34 3D44 00 00 00 00 00 00 :MaxPlayers .by 0 + 35 ;----------------------------------- + 36 3D4A Energy + 37 3D4A 00 00 00 00 00 00 :MaxPlayers .by 0 + 38 3D50 00 EnergyDecrease .by 0 + 39 3D51 eXistenZ + 40 3D51 00 00 00 00 00 00 :MaxPlayers .by 0 + 41 3D57 LASTeXistenZ ; eXistenZ before shoot + 42 3D57 00 00 00 00 00 00 :MaxPlayers .by 0 + 43 + 44 3D5D ResultsTable ;the results in the gameeeeee + 45 3D5D 00 00 00 00 00 00 :MaxPlayers .by 0 + 46 3D63 TempResults + 47 3D63 00 00 00 00 00 00 :MaxPlayers .by 0 + 48 3D69 CurrentResult + 49 3D69 00 .byte 0 + 50 ;----------------------------------- + 51 3D6A EnergyTableL ;shooting Force of the tank during the round + 52 3D6A 00 00 00 00 00 00 :MaxPlayers .by 0 + 53 3D70 EnergyTableH + 54 3D70 00 00 00 00 00 00 :MaxPlayers .by 0 ;maxplayers=6 + 55 3D76 MaxEnergyTableL ;Energy of the tank during the round + 56 ;(limes superior force of the Shoot) + 57 3D76 00 00 00 00 00 00 :MaxPlayers .by 0 ;1000 is the default + 58 3D7C MaxEnergyTableH + 59 3D7C 00 00 00 00 00 00 :MaxPlayers .by 0 + 60 ;----------------------------------- + 61 + 62 3D82 AngleTable ;Angle of the barrel of each tank during the round + 63 3D82 A5 A5 A5 A5 A5 A5 .by (255-90),(255-90),(255-90),(255-90),(255-90),(255-90) + 64 3D88 NewAngle + 65 3D88 00 .by 0 + 66 ;----------------------------------- + 67 + 68 3D89 ActiveWeapon ;number of the selected weapon + 69 3D89 00 00 00 00 00 00 :MaxPlayers .by 0 + 70 ;----------------------------------- + 71 + 72 ;format of the static point number used in the game + 73 ; 20203.5 = 128 : <20203 : >20203 + 74 ;----------------------------------- + 75 + 76 3D8F 00 L1 .by 0 ; variable used in multiplications (by 10:) + 77 3D90 19 gravity .by 25 ;only the decimal part (1/10 = 25) + 78 ;----------------------------------- + 79 + 80 3D91 80 00 Wind .wo $0080 ;walue displayed on the screen + 81 ;multiplied by 16 (decimal part only) + 82 ;----------------------------------- + 83 3D93 40 MaxWind .byte $40 ; + 84 3D94 00 WindOrientation .byte 0 ;(0-right,1-left) + 85 ;----------------------------------- + 86 3D95 00 Counter .byte 0 ;temporary Counter for outside loops + 87 3D96 00 HitFlag .byte 0 ;1 when missile hit anything + 88 ;----------------------------------- + 89 3D97 xtankstableL ;X positions of tanks (lower left point) + 90 3D97 00 00 00 00 00 00 :MaxPlayers .by 0 + 91 3D9D xtankstableH + 92 3D9D 00 00 00 00 00 00 :MaxPlayers .by 0 + 93 3DA3 ytankstable ;Y positions of tanks (lower left point) + 94 3DA3 00 00 00 00 00 00 :MaxPlayers .by 0 + 95 3DA9 LowResDistances ; coarse stank positions divided by 4 (to be in just one byte) + 96 3DA9 00 00 00 00 00 00 :MaxPlayers .by 0 + 97 ;----------------------------------- + 98 3DAF keycodes ;tables for calculating KeyCode to Screen Code (38 characters) + 99 3DAF 3F 15 12 3A 2A 38 + .byte $3f,$15,$12,$3a,$2a,$38,$3d,$39 + 100 3DB7 0D 01 05 00 25 23 + .byte $0d,$01,$05,$00,$25,$23,$08,$0a + 101 3DBF 2F 28 3E 2D 0B 10 + .byte $2f,$28,$3e,$2d,$0b,$10,$2e,$16 + 102 3DC7 2B 17 1F 1E 1A 18 + .byte $2b,$17,$1f,$1e,$1a,$18,$1d,$1b + 103 3DCF 33 35 30 32 22 0E .byte $33,$35,$30,$32,$22,$0e + 104 3DD5 scrcodes + 105 3DD5 61 62 63 64 65 66 + dta d"abcdefgh" + 106 3DDD 69 6A 6B 6C 6D 6E + dta d"ijklmnop" + 107 3DE5 71 72 73 74 75 76 + dta d"qrstuvwx" + 108 3DED 79 7A 11 12 13 14 + dta d"yz123456" + 109 3DF5 17 18 19 10 0E 0D dta d"7890.-" + 110 ;----------------------------------- + 111 3DFB 00 Erase .byte 0 ; if 1 only mask of the character is printed + 112 ; on the graphics screen. if 0 character is printed normally + 113 + 114 ;----------------------------------- + 115 3DFC 00 00 RangeLeft .wo 0 ;range of the soil to be fallen down + 116 ;it is being set by all Explosions + 117 3DFE 00 00 RangeRight .wo 0 + 118 ;----------------------------------- + 119 3E00 00 00 WeaponRangeLeft .wo 0 ;Range of the Explosion of the given weapon + 120 3E02 00 00 WeaponRangeRight .wo 0 + 121 ;-------------------------------------------------- + 122 ;-------------------------------------------------- + 123 ;Variables used by the given subroutines + 124 ;moved to one place for easier + 125 ;compilation to e.g. cartridge + 126 ;-------------------------------------------------- + 127 ;xroller + 128 3E04 FF HowMuchToFall .byte $FF + 129 3E05 00 HeightRol .byte 0 + 130 ;digger + 131 3E06 00 00 digstartx .word 0 + 132 3E08 00 00 digstarty .word 0 + 133 3E0A 00 diggery .byte 0 + 134 3E0B 00 DigLong .byte 0 + 135 3E0C 00 00 00 00 00 00 + digtabxL :8 .by 0 + 136 3E14 00 00 00 00 00 00 + digtabxH :8 .by 0 + 137 3E1C 00 00 00 00 00 00 + digtabyL :8 .by 0 + 138 3E24 00 00 00 00 00 00 + digtabyH :8 .by 0 + 139 ;sandhog + 140 3E2C 00 sandhogflag .byte 0 ; (0 digger, 8 sandhog) + 141 ;ofdirt + 142 3E2D 00 00 magic .word 0 ; was tempor2, but it was not compiling!!! (bug in OMC65) + 143 ;draw + 144 3E2F 00 00 DrawJumpAddr .word 0 + 145 3E31 00 HowToDraw .byte 0 + 146 ; bits here mean + 147 ; 0 - negative X (go up) + 148 ; 1 - negative Y (left) + 149 ; 2 - directional value > 1 (more than 45 degrees) + 150 ; if all 0 then standart routine + 151 3E32 00 00 XHit .word 0 + 152 3E34 00 00 YHit .word 0 + 153 3E36 00 00 LineLength .word 0 + 154 ;circle + 155 3E38 00 radius .byte 0 + 156 3E39 00 00 xcircle .word 0 + 157 3E3B 00 ycircle .byte 0 + 158 3E3C 00 00 tempcir .word 0 + 159 ;TankFalls + 160 3E3E 00 IfFallDown .byte 0 + 161 3E3F 00 PreviousFall .byte 0 + 162 3E40 00 EndOfTheFallFlag .byte 0 ; in case of the infinite fall + 163 3E41 00 Parachute .byte 0 ; are you insured with parachute? + 164 ; ------------------------------------------------- + 165 ;Flight + 166 ;variables for 5 missiles (used for mirv) + 167 3E42 00 00 00 00 00 xtraj00 :5 .by 0 + 168 3E47 00 00 00 00 00 xtraj01 :5 .by 0 + 169 3E4C 00 00 00 00 00 xtraj02 :5 .by 0 + 170 3E51 00 00 00 00 00 vx00 :5 .by 0 + 171 3E56 00 00 00 00 00 vx01 :5 .by 0 + 172 3E5B 00 00 00 00 00 vx02 :5 .by 0 + 173 3E60 00 00 00 00 00 vx03 :5 .by 0 + 174 3E65 00 00 00 00 00 MirvDown :5 .by 0 ; is given missile down? + 175 3E6A 00 MirvMissileCounter .byte 0 ; missile Counter (mainly for X) + 176 3E6B 00 SmokeTracerFlag .byte 0 ; if Smoketracer + 177 ; ------------------------------------------------- + 178 ;CheckCollisionWithTank + 179 3E6C 00 00 00 00 vx .byte 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) + 180 3E70 00 00 00 00 vy .byte 0,0,0,0 + 181 3E74 00 00 00 xtraj .byte 0,0,0 + 182 3E77 00 00 00 ytraj .byte 0,0,0 + 183 3E7A 00 00 00 xtrajold .byte 0,0,0 + 184 3E7D 00 00 00 ytrajold .byte 0,0,0 + 185 3E80 00 Angle .byte 0 + 186 3E81 00 00 00 Force .byte 0,0,0 + 187 3E84 00 00 00 Multiplier .byte 0,0,0 + 188 3E87 00 00 Multiplee .byte 0,0 + 189 3E89 00 00 00 Result .byte 0,0,0 + 190 3E8C 00 goleft .byte 0 ;if 1 then flights left + 191 ;-------------------------------------------------- + 192 ;SoilDown2 + 193 3E8D 00 IsEndOfTheFallFlag .byte 0 + 194 ; ------------------------------------------------- + 195 ;unPlot + 196 3E8E 00 WhichUnPlot .byte 0 + 197 ; max 5 concurrent unPlots + 198 3E8F 00 00 00 00 00 oldplotH :5 .by 0 + 199 3E94 00 00 00 00 00 oldplotL :5 .by 0 + 200 3E99 00 00 00 00 00 oldora :5 .by 0 + 201 3E9E 00 00 00 00 00 oldply :5 .by 0 + 202 3EA3 00 OldOraTemp .byte 0 + 203 3EA4 00 FunkyBombCounter .byte 0 + 204 3EA5 00 00 xtrajfb .word 0 + 205 3EA7 00 00 ytrajfb .word 0 + 206 ; + 207 3EA9 00 tracerflag .byte 0 + 208 ; ------------------------------------------------- + 209 ;TypeChar + 210 3EAA 00 00 00 00 00 00 + mask1 :8 .by 0 + 211 3EB2 00 00 00 00 00 00 + mask2 :8 .by 0 + 212 + 213 3EBA 00 00 00 00 00 00 + char1 :8 .by 0 + 214 3EC2 00 00 00 00 00 00 + char2 :8 .by 0 + 215 3ECA 01 color .byte 1 + 216 3ECB 00 ybit .byte 0 + 217 3ECC 00 tempbyte01 .byte 0 + 218 3ECD 00 00 delta .word 0 + 219 3ECF 00 00 yfloat .word 0 + 220 3ED1 00 deltaX .byte 0 + 221 3ED2 00 UpNdown .byte 0 + 222 + 223 + 224 3ED3 00 00 temptankX .word 0 + 225 3ED5 00 temptankNr .byte 0 + 226 + 227 ; ------------------------------------------------- + 228 ;Variables from textproc.s65 + 229 ; tables with numbers of weapons on the right lists + 230 ; to be honest - I do not know at the moment what the above + 231 ; comment was supposed to mean... + 232 3ED6 NubersOfWeaponsL1 + 233 3ED6 FF FF FF FF FF FF + :(8*5) .by $ff + 234 3EFE NubersOfWeaponsL2 + 235 3EFE FF FF FF FF FF FF + :(8*2) .by $ff + 236 ; ------------------------------------------------- + 237 + 238 ; variables storing amount of weapons on the first and second + 239 ; list and pointer position + 240 + 241 3F0E HowManyOnTheList1 + 242 3F0E 00 .byte 0 + 243 3F0F HowManyOnTheList2 + 244 3F0F 00 .byte 0 + 245 3F10 PositionOnTheList ; pointer position on the list being displayed + 246 3F10 00 .byte 0 + 247 3F11 LastWeapon ; number of the last previously purchased weapon + 248 ; it is necessary when after purchase some weapon + 249 ; is removed from the list (because too expensive) + 250 ; and the cursor must be placed elsewhere + 251 + 252 3F11 FF .byte $ff + 253 3F12 WhichList ; list currently on the screen + 254 ; (0-offensive, 1-defensive) + 255 3F12 00 .byte 0 + 256 3F13 OffsetDL1 ; offset of the list screen (how many lines).... + 257 3F13 00 .byte 0 + 258 + 259 ; ------------------------------------------------- + 260 ;Options + 261 3F14 00 00 02 02 OptionsTable .byte 0,0,2,2 + 262 3F18 00 OptionsY .byte 0 ;vertical position of cursor on Options screen + 263 = 0004 maxoptions = 4 ;number of all options (4 in 0.01) + 264 3F19 CashOptionH ;(one zero less than on the screen) + 265 3F19 00 00 01 03 03 .byte 0,>200,>500,>800,>1000 + 266 3F1E CashOptionL + 267 3F1E 00 C8 F4 20 E8 .byte 0,<200,<500,<800,<1000 + 268 3F23 0A 14 19 1E 28 GravityTable .byte 10,20,25,30,40 + 269 3F28 05 14 28 3C 50 MaxWindTable .byte 5,20,40,60,80 + 270 ;------------------------------------------------ + 271 + 272 ;mark the level + 273 3F2D PositionInName ; cursor position in name of the player when name input + 274 3F2D 00 .byte 0 + 275 3F2E DifficultyLevel ; Difficulty Level (human/cpu) + 276 3F2E 00 .byte 0 + 277 3F2F LevelNameBeginL ; begins of level names + 278 3F2F F4 FE 08 .byte NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) + 283 3F3B 33 33 33 .byte >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) + 284 3F3E 33 33 33 .byte >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) + 285 ;------------------------------------------------- + 286 ;displaydecimal + 287 3F41 00 00 decimal .word 0 + 288 3F43 00 00 displayposition .word 0 + 289 3F45 10 10 10 10 decimalresult dta d"0000" + 290 + 291 ;xmissile + 292 3F49 00 00 ExplosionRadius .word 0 ;because when adding in xdraw it is double byte + 293 ;round + 294 3F4B 00 CurrentRoundNr .byte 0 + 295 3F4C 00 FallDown1 .byte 0 + 296 3F4D 00 FallDown2 .byte 0 + 297 ;leapfrog + 298 3F4E 00 LeapFrogAngle .byte 0 + 299 ;laser + 300 3F4F 00 00 00 00 00 00 + LaserCoordinate .word 0,0,0,0 + 301 3F57 TanksNames + 302 3F57 11 73 74 00 34 61 + dta d"1st Tank" + 303 3F5F 12 6E 64 00 34 61 + dta d"2nd Tank" + 304 3F67 13 72 64 00 34 61 + dta d"3rd Tank" + 305 3F6F 14 74 68 00 34 61 + dta d"4th Tank" + 306 3F77 15 74 68 00 34 61 + dta d"5th Tank" + 307 3F7F 16 74 68 00 34 61 + dta d"6th Tank" + 308 ; ------------------------------------------------- + 309 ; Here go tables with weapons possesed by a given tank + 310 ; Index in the table means weapon type + 311 ; number entered means ammo for given weapon possessed (max 99) + 312 ; Let 0 be "baby missile" + 313 ; from $30 the defensive weapons begin + 314 3F87 TanksWeapons + 315 3F87 TanksWeapon1 + 316 3F87 63 .by 99 + 317 3F88 00 00 00 00 00 00 + :63 .by 0 + 318 3FC7 TanksWeapon2 + 319 3FC7 63 .by 99 + 320 3FC8 00 00 00 00 00 00 + :63 .by 0 + 321 4007 TanksWeapon3 + 322 4007 63 .by 99 + 323 4008 00 00 00 00 00 00 + :63 .by 0 + 324 4047 TanksWeapon4 + 325 4047 63 .by 99 + 326 4048 00 00 00 00 00 00 + :63 .by 0 + 327 4087 TanksWeapon5 + 328 4087 63 .by 99 + 329 4088 00 00 00 00 00 00 + :63 .by 0 + 330 40C7 TanksWeapon6 + 331 40C7 63 .by 99 + 332 40C8 00 00 00 00 00 00 + :63 .by 0 + 333 4107 TanksWeaponsTableL + 334 4107 87 C7 07 47 87 C7 .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 + 337 + 338 4113 mountaintable ;table of mountains (size=screenwidth) + 339 4113 00 00 00 00 00 00 + :screenwidth .by 0 + 340 4253 00 .by 0 ; additional byte for fallout (sometimes 1 pixel) + 341 4254 mountaintable2 ;table of mountains (size=screenwidth) + 342 4254 00 00 00 00 00 00 + :screenwidth .by 0 + 343 4394 00 .by 0 ; additional byte for fallout (sometimes 1 pixel) + 344 4395 mountaintable3 + 345 4395 00 00 00 00 00 00 + :screenwidth .by 0 + 346 44D5 00 .by 0 ; additional byte for fallout (sometimes 1 pixel) + 347 44D6 MountaintableEnd ;good for table clearing + 348 ;---------------------------------------------- + 349 44D6 00 00 TextPositionX .word 0 + 350 44D8 00 TextPositionY .byte 0 + 351 44D9 00 00 TextAddress .word 0 + 352 44DB 00 TextCounter .byte 0 + 353 44DC 00 TextNumberOff .byte 0 + 354 ;-------------- + 355 44DD TankTempY + 356 44DD 00 .byte 0 + 357 ;---------------------------------------------- + 358 44DE LineAddress4x4 + 359 44DE 00 00 .word 0 + 360 44E0 LineCharNr + 361 44E0 00 .byte 0 + 362 44E1 LineXdraw + 363 44E1 00 00 .word 0 + 364 44E3 LineYdraw + 365 44E3 00 .byte 0 + 366 44E4 LineTop + 367 44E4 08 05 05 05 05 05 + dta d"(%%%%%%%%%%%)" + 368 44F1 FF .byte $ff + 369 ;# - pion, () * +, % - poziom + 370 44F2 LineBottom + 371 44F2 0A 05 05 05 05 05 + dta d"*%%%%%%%%%%%+" + 372 44FF FF .byte $ff + 373 4500 LineEmpty + 374 4500 03 00 00 00 00 00 + dta d"# #" + 375 450D FF .byte $ff + 376 450E LineHeader1 + 377 450E 03 00 32 2F 35 2E + dta d"# ROUND: " + 378 4517 RoundNrDisplay + 379 4517 00 00 00 03 dta d" #" + 380 451B FF .byte $ff + 381 451C LineHeader2 + 382 451C 03 00 00 32 25 33 + dta d"# RESULTS #" + 383 4529 FF .byte $ff + 384 + 385 + 386 + 387 ;----------- + 388 452A ResultLineBuffer + 389 452A 00 00 00 00 00 00 + dta d" " + 390 453C FF .byte $ff + 391 453D ResultX + 392 453D 00 00 .word 0 + 393 453F ResultY + 394 453F 00 .byte 0 + 395 4540 ResultOfTankNr + 396 4540 00 .byte 0 + 397 + 398 ;----------- + 399 4541 pmtableL ; addressess of the P/M memory for 5 tanks (6th is without P/M background) + 400 4541 00 .byte <(pmgraph+$400) + 401 4542 00 .byte <(pmgraph+$500) + 402 4543 00 .byte <(pmgraph+$600) + 403 4544 00 .byte <(pmgraph+$700) + 404 4545 00 .byte <(pmgraph+$300) ; this is a missile background + 405 4546 pmtableH + 406 4546 9C .byte >(pmgraph+$400) + 407 4547 9D .byte >(pmgraph+$500) + 408 4548 9E .byte >(pmgraph+$600) + 409 4549 9F .byte >(pmgraph+$700) + 410 454A 9B .byte >(pmgraph+$300) + 411 ;----------- + 412 ; this table changes Angle to the appropriate tank character + 413 454B BarrelTableL + 414 454B 02 02 02 02 02 02 + .byte $02,$02,$02,$02,$02,$02,$02,$02 + 415 4553 04 04 04 04 04 04 + .byte $04,$04,$04,$04,$04,$04,$04,$04 + 416 455B 06 06 06 06 06 06 + .byte $06,$06,$06,$06,$06,$06,$06,$06,$06 + 417 4564 08 08 08 08 08 08 + .byte $08,$08,$08,$08,$08,$08,$08,$08 + 418 456C 0A 0A 0A 0A 0A 0A + .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a + 419 4574 0C 0C 0C 0C 0C 0C + .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c + 420 457D 0E 0E 0E 0E 0E 0E + .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e + 421 4585 10 10 10 10 10 10 + .byte $10,$10,$10,$10,$10,$10,$10,$10 + 422 458D 12 12 12 12 12 12 + .byte $12,$12,$12,$12,$12,$12,$12,$12,$12 + 423 4596 14 14 14 14 14 14 + .byte $14,$14,$14,$14,$14,$14,$14,$14 + 424 459E 16 16 16 16 16 16 + .byte $16,$16,$16,$16,$16,$16,$16,$16 + 425 45A6 BarrelTableR + 426 45A6 2C 2C 2C 2C 2C 2C + .byte $2c,$2c,$2c,$2c,$2c,$2c,$2c,$2c + 427 45AE 2A 2A 2A 2A 2A 2A + .byte $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a + 428 45B6 28 28 28 28 28 28 + .byte $28,$28,$28,$28,$28,$28,$28,$28,$28 + 429 45BF 26 26 26 26 26 26 + .byte $26,$26,$26,$26,$26,$26,$26,$26 + 430 45C7 24 24 24 24 24 24 + .byte $24,$24,$24,$24,$24,$24,$24,$24 + 431 45CF 22 22 22 22 22 22 + .byte $22,$22,$22,$22,$22,$22,$22,$22,$22 + 432 45D8 20 20 20 20 20 20 + .byte $20,$20,$20,$20,$20,$20,$20,$20 + 433 45E0 1E 1E 1E 1E 1E 1E + .byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e + 434 45E8 1C 1C 1C 1C 1C 1C + .byte $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c + 435 45F1 1A 1A 1A 1A 1A 1A + .byte $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a + 436 45F9 18 18 18 18 18 18 + .byte $18,$18,$18,$18,$18,$18,$18,$18 + 437 + 438 4601 sintable + 439 4601 00 .byte 0 + 440 4602 04 .byte 4 + 441 4603 08 .byte 8 + 442 4604 0D .byte 13 + 443 4605 11 .byte 17 + 444 4606 16 .byte 22 + 445 4607 1A .byte 26 + 446 4608 1F .byte 31 + 447 4609 23 .byte 35 + 448 460A 28 .byte 40 + 449 460B 2C .byte 44 + 450 460C 30 .byte 48 + 451 460D 35 .byte 53 + 452 460E 39 .byte 57 + 453 460F 3D .byte 61 + 454 4610 42 .byte 66 + 455 4611 46 .byte 70 + 456 4612 4A .byte 74 + 457 4613 4F .byte 79 + 458 4614 53 .byte 83 + 459 4615 57 .byte 87 + 460 4616 5B .byte 91 + 461 4617 5F .byte 95 + 462 4618 64 .byte 100 + 463 4619 68 .byte 104 + 464 461A 6C .byte 108 + 465 461B 70 .byte 112 + 466 461C 74 .byte 116 + 467 461D 78 .byte 120 + 468 461E 7C .byte 124 + 469 461F 80 .byte 128 + 470 4620 83 .byte 131 + 471 4621 87 .byte 135 + 472 4622 8B .byte 139 + 473 4623 8F .byte 143 + 474 4624 92 .byte 146 + 475 4625 96 .byte 150 + 476 4626 9A .byte 154 + 477 4627 9D .byte 157 + 478 4628 A1 .byte 161 + 479 4629 A4 .byte 164 + 480 462A A7 .byte 167 + 481 462B AB .byte 171 + 482 462C AE .byte 174 + 483 462D B1 .byte 177 + 484 462E B5 .byte 181 + 485 462F B8 .byte 184 + 486 4630 BB .byte 187 + 487 4631 BE .byte 190 + 488 4632 C1 .byte 193 + 489 4633 C4 .byte 196 + 490 4634 C6 .byte 198 + 491 4635 C9 .byte 201 + 492 4636 CC .byte 204 + 493 4637 CF .byte 207 + 494 4638 D1 .byte 209 + 495 4639 D4 .byte 212 + 496 463A D6 .byte 214 + 497 463B D9 .byte 217 + 498 463C DB .byte 219 + 499 463D DD .byte 221 + 500 463E DF .byte 223 + 501 463F E2 .byte 226 + 502 4640 E4 .byte 228 + 503 4641 E6 .byte 230 + 504 4642 E8 .byte 232 + 505 4643 E9 .byte 233 + 506 4644 EB .byte 235 + 507 4645 ED .byte 237 + 508 4646 EE .byte 238 + 509 4647 F0 .byte 240 + 510 4648 F2 .byte 242 + 511 4649 F3 .byte 243 + 512 464A F4 .byte 244 + 513 464B F6 .byte 246 + 514 464C F7 .byte 247 + 515 464D F8 .byte 248 + 516 464E F9 .byte 249 + 517 464F FA .byte 250 + 518 4650 FB .byte 251 + 519 4651 FC .byte 252 + 520 4652 FC .byte 252 + 521 4653 FD .byte 253 + 522 4654 FE .byte 254 + 523 4655 FE .byte 254 + 524 4656 FF .byte 255 + 525 4657 FF .byte 255 + 526 4658 FF .byte 255 + 527 4659 FF .byte 255 + 528 465A FF .byte 255 + 529 465B FF .byte 255 ;anti self destruction byte + 530 + 531 465C costable + 532 465C FF .byte 255 ;anti self destruction byte + 533 465D FF .byte 255 + 534 465E FF .byte 255 + 535 465F FF .byte 255 + 536 4660 FF .byte 255 + 537 4661 FF .byte 255 + 538 4662 FE .byte 254 + 539 4663 FE .byte 254 + 540 4664 FD .byte 253 + 541 4665 FC .byte 252 + 542 4666 FC .byte 252 + 543 4667 FB .byte 251 + 544 4668 FA .byte 250 + 545 4669 F9 .byte 249 + 546 466A F8 .byte 248 + 547 466B F7 .byte 247 + 548 466C F6 .byte 246 + 549 466D F4 .byte 244 + 550 466E F3 .byte 243 + 551 466F F2 .byte 242 + 552 4670 F0 .byte 240 + 553 4671 EE .byte 238 + 554 4672 ED .byte 237 + 555 4673 EB .byte 235 + 556 4674 E9 .byte 233 + 557 4675 E8 .byte 232 + 558 4676 E6 .byte 230 + 559 4677 E4 .byte 228 + 560 4678 E2 .byte 226 + 561 4679 DF .byte 223 + 562 467A DD .byte 221 + 563 467B DB .byte 219 + 564 467C D9 .byte 217 + 565 467D D6 .byte 214 + 566 467E D4 .byte 212 + 567 467F D1 .byte 209 + 568 4680 CF .byte 207 + 569 4681 CC .byte 204 + 570 4682 C9 .byte 201 + 571 4683 C6 .byte 198 + 572 4684 C4 .byte 196 + 573 4685 C1 .byte 193 + 574 4686 BE .byte 190 + 575 4687 BB .byte 187 + 576 4688 B8 .byte 184 + 577 4689 B5 .byte 181 + 578 468A B1 .byte 177 + 579 468B AE .byte 174 + 580 468C AB .byte 171 + 581 468D A7 .byte 167 + 582 468E A4 .byte 164 + 583 468F A1 .byte 161 + 584 4690 9D .byte 157 + 585 4691 9A .byte 154 + 586 4692 96 .byte 150 + 587 4693 92 .byte 146 + 588 4694 8F .byte 143 + 589 4695 8B .byte 139 + 590 4696 87 .byte 135 + 591 4697 83 .byte 131 + 592 4698 80 .byte 128 + 593 4699 7C .byte 124 + 594 469A 78 .byte 120 + 595 469B 74 .byte 116 + 596 469C 70 .byte 112 + 597 469D 6C .byte 108 + 598 469E 68 .byte 104 + 599 469F 64 .byte 100 + 600 46A0 5F .byte 95 + 601 46A1 5B .byte 91 + 602 46A2 57 .byte 87 + 603 46A3 53 .byte 83 + 604 46A4 4F .byte 79 + 605 46A5 4A .byte 74 + 606 46A6 46 .byte 70 + 607 46A7 42 .byte 66 + 608 46A8 3D .byte 61 + 609 46A9 39 .byte 57 + 610 46AA 35 .byte 53 + 611 46AB 30 .byte 48 + 612 46AC 2C .byte 44 + 613 46AD 28 .byte 40 + 614 46AE 23 .byte 35 + 615 46AF 1F .byte 31 + 616 46B0 1A .byte 26 + 617 46B1 16 .byte 22 + 618 46B2 11 .byte 17 + 619 46B3 0D .byte 13 + 620 46B4 08 .byte 8 + 621 46B5 04 .byte 4 + 622 46B6 00 .byte 0 + 623 + 624 46B7 linetableL + 625 46B7 10 38 60 88 B0 D8 + :screenheight .by <(display+screenBytes*#) + 626 ;:20 .by <(display+screenBytes*#) + 627 477F 50 .by (display+screenBytes*#) + 630 ;:20 .by >(display+screenBytes*#) + 631 4848 2F .by >PlotLine + 632 ;---------------------------- + 633 4849 oldPlotPointerX + 634 4849 00 00 .wo 0 + 635 ;---------------------------- + 636 ;PutChar4x4 + 637 484B 00 LoopCounter4x4 .byte 0 + 638 484C 00 y4x4 .byte 0 + 639 484D 00 StoreA4x4 .byte 0 + 640 484E 00 Xcounter4x4 .byte 0 + 641 484F 00 nibbler4x4 .byte 0 + 642 4850 00 CharCode4x4 .byte 0 + 643 4851 00 plot4x4color .byte 0 ;1-white, 0-background + 644 + 645 4852 bittable + 646 4852 80 40 20 10 08 04 + .byte $80,$40,$20,$10,$08,$04,$02,$01 + 647 485A bittable2 + 648 485A 7F BF DF EF F7 FB + .byte $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe + 649 ;---------------------------- + 650 4862 disktance ;tanks distance + 651 4862 00 00 .byte 0,0 + 652 4864 6A .byte screenwidth/3 + 653 4865 50 .byte screenwidth/4 + 654 4866 40 .byte screenwidth/5 + 655 4867 35 .byte screenwidth/6 + 656 4868 2D .byte screenwidth/7 + 657 ;max number of players=6 + 658 + 659 ; this table is for deciding where a tank should slide + 660 ; accordingly to what is below the tank + 661 ; there are 3 bits used here + 662 ; bit 0 - go down + 663 ; bit 1 - go left + 664 ; bit 2 - go right + 665 ; position in the table equals to bit pattern of soil below tank + 666 + 667 4869 WhereToSlideTable + 668 ; we have 3 bits: 0 - go down, 1 - go right, 2 - go left + 669 ;original table + 670 ;.BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0 + 671 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 672 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 673 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 674 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 675 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 676 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 677 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 678 ;.BYTE 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 679 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 680 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 681 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 682 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 683 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 684 ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 685 ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 686 + 687 4869 01 05 04 04 04 04 + .BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0 ;16 + 688 4879 04 00 00 00 00 00 + .BYTE 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;32 + 689 4889 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;48 + 690 4899 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;64 + 691 48A9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;80 + 692 48B9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;96 + 693 48C9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;112 + 694 48D9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;128 + 695 48E9 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 696 48F9 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 697 4909 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 698 4919 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 699 4929 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 700 4939 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 701 4949 02 00 00 00 00 00 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 702 4959 00 00 00 00 00 00 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 703 + 704 4969 EndOfTheBarrelX + 705 4969 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4 + 706 4974 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5 + 707 497E 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6 + 708 4987 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + 709 4996 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7 + 710 499F 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7 + 711 49A9 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7 + 712 49B6 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7 + 713 + 714 49C4 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 715 49CE 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 716 49D8 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 717 49E2 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 718 49EC 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 719 49F6 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 720 4A00 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 721 4A0A 00 00 00 00 .byte 0,0,0,0 + 722 + 723 4A0E 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 724 4A1C 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0 + 725 4A29 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 726 4A33 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0 + 727 4A3C 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 728 4A4B 01 01 01 01 01 01 + .byte 1,1,1,1,1,1,1,1,1 + 729 4A54 02 02 02 02 02 02 + .byte 2,2,2,2,2,2,2,2,2,2 + 730 4A5E 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3 + 731 + 732 4A69 EndOfTheBarrelY + 733 4A69 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7 + 734 4A74 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7 + 735 4A7E 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7 + 736 4A87 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + 737 4A96 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6 + 738 4A9F 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5 + 739 4AA9 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4 + 740 4AB6 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3 + 741 + 742 4AC4 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 743 4ACE 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 744 4AD8 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 745 4AE2 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 746 4AEC 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 747 4AF6 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 748 4B00 00 00 00 00 00 00 + .byte 0,0,0,0,0,0,0,0,0,0 + 749 4B0A 00 00 00 00 .byte 0,0,0,0 + 750 + 751 4B0E 03 03 03 03 03 03 + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3 + 752 4B1C 04 04 04 04 04 04 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4 + 753 4B29 05 05 05 05 05 05 + .byte 5,5,5,5,5,5,5,5,5,5 + 754 4B33 06 06 06 06 06 06 + .byte 6,6,6,6,6,6,6,6,6 + 755 4B3C 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + 756 4B4B 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7 + 757 4B54 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7 + 758 4B5E 07 07 07 07 07 07 + .byte 7,7,7,7,7,7,7,7,7,7,7 + 759 ;------------------------------------------------- + 760 + 761 4B69 TanksNamesDefault + 762 4B69 11 73 74 00 34 61 + dta d"1st Tank" + 763 4B71 12 6E 64 00 34 61 + dta d"2nd Tank" + 764 4B79 13 72 64 00 34 61 + dta d"3rd Tank" + 765 4B81 14 74 68 00 34 61 + dta d"4th Tank" + 766 4B89 15 74 68 00 34 61 + dta d"5th Tank" + 767 4B91 16 74 68 00 34 61 + dta d"6th Tank" + 768 + 769 4B99 WeaponPriceH ; weapons prices (tables with prices of weapons) + 770 4B99 00 00 00 00 00 01 + .byte $00,$00,$00,$00,$00,$01,$01,$01 + 771 4BA1 01 01 00 01 02 02 + .byte $01,$01,$00,$01,$02,$02,$02,$01 + 772 4BA9 01 01 01 01 01 00 + .byte $01,$01,$01,$01,$01,$00,$00,$00 + 773 4BB1 01 00 00 00 02 02 + .byte $01,$00,$00,$00,$02,$02,$01,$01 + 774 4BB9 02 00 00 00 00 00 + .byte $02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 775 4BC9 00 00 00 00 00 04 + .byte 0,0,0,0,0,$04,0,0,0,0,0,0,0,0,0,0 + 776 4BD9 WeaponPriceL + 777 4BD9 00 60 6F 90 C0 25 + .byte $00,$60,$6F,$90,$c0,$25,$c8,$51 + 778 4BE1 F0 FF 66 23 B1 58 + .byte $f0,$ff,$66,$23,$b1,$58,$50,$4A + 779 4BE9 55 71 42 50 14 FD + .byte $55,$71,$42,$50,$14,$fd,$da,$bf + 780 4BF1 31 68 82 AB 12 45 + .byte $31,$68,$82,$ab,$12,$45,$ae,$12 + 781 4BF9 41 00 00 00 00 00 + .byte $41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 782 4C09 00 00 00 00 00 4C + .byte 0,0,0,0,0,$4c,0,0,0,0,0,0,0,0,0,0 + 783 ;------------------------------------------------- + 784 ; how many units (bulletd) of a given weapon we get for a given price + 785 ; This is a table of constans. + 786 ; If on a given position is 0 it means that this weapon + 787 ; is not present in the game. + 788 ; This is the slot for adding new weapons. + 789 4C19 WeaponUnits + 790 4C19 0A 05 03 01 02 02 + .byte 10,5,3,1,2,2,3,1,10,2,20,10,10,5,2,10 + 791 4C29 05 05 02 0A 05 02 + .byte 5,5,2,10,5,2,10,5,2,10,5,2,2,10,10,5 + 792 4C39 05 00 00 00 00 00 + .byte 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + 793 4C49 06 02 05 05 02 08 + .byte 6,2,5,5,2,8,10,2,3,3,2,2,1,10,25,0 + 794 + 795 ;------------------------------------------------- + 796 ; Screen codes of icons (chars) representing a given weapon + 797 4C59 WeaponSymbols + 798 4C59 40 41 42 43 44 45 + .byte $40,$41,$42,$43,$44,$45,$46,$47 + 799 4C61 48 49 4A 4B 4C 4D + .byte $48,$49,$4a,$4b,$4c,$4d,$4e,$4f + 800 4C69 50 51 52 53 54 55 + .byte $50,$51,$52,$53,$54,$55,$56,$57 + 801 4C71 58 59 5A 5B 60 7B + .byte $58,$59,$5a,$5b,$60,$7b,$7c,$7d + 802 4C79 20 00 00 00 00 00 + .byte $20,$00,$00,$00,$00,$00,$00,$00 + 803 4C81 00 00 00 00 00 00 + .byte $00,$00,$00,$00,$00,$00,$00,$00 + 804 4C89 02 03 06 1D 0A 1B + .byte $02,$03,$06,$1d,$0a,$1b,$1c,$1e + 805 4C91 3B 3C 3D 3E 3F 5E + .byte $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00 + 806 + 807 ; Names of weapons (16 chars lon) + 808 4C99 NamesOfWeapons ;the comment is an index in the tables + 809 4C99 22 61 62 79 00 2D + dta d"Baby Missile " ; 0 + 810 4CA9 2D 69 73 73 69 6C + dta d"Missile " ; 1 + 811 4CB9 22 61 62 79 00 2E + dta d"Baby Nuke " ; 2 + 812 4CC9 2E 75 6B 65 00 00 + dta d"Nuke " ; 3 + 813 4CD9 2C 65 61 70 26 72 + dta d"LeapFrog " ; 4 + 814 4CE9 26 75 6E 6B 79 00 + dta d"Funky Bomb " ; 5 + 815 4CF9 2D 29 32 36 00 00 + dta d"MIRV " ; 6 + 816 4D09 24 65 61 74 68 07 + dta d"Death's Head " ; 7 + 817 4D19 2E 61 70 61 6C 6D + dta d"Napalm " ; 8 + 818 4D29 28 6F 74 00 2E 61 + dta d"Hot Napalm " ; 9 + 819 4D39 34 72 61 63 65 72 + dta d"Tracer " ; 10 + 820 4D49 33 6D 6F 6B 65 00 + dta d"Smoke Tracer " ; 11 + 821 4D59 22 61 62 79 00 32 + dta d"Baby Roller " ; 12 + 822 4D69 32 6F 6C 6C 65 72 + dta d"Roller " ; 13 + 823 4D79 28 65 61 76 79 00 + dta d"Heavy Roller " ; 14 + 824 4D89 32 69 6F 74 00 23 + dta d"Riot Charge " ; 15 + 825 4D99 32 69 6F 74 00 22 + dta d"Riot Blast " ; 16 + 826 4DA9 32 69 6F 74 00 22 + dta d"Riot Bomb " ; 17 + 827 4DB9 28 65 61 76 79 00 + dta d"Heavy Riot Bomb " ; 18 + 828 4DC9 22 61 62 79 00 24 + dta d"Baby Digger " ; 19 + 829 4DD9 24 69 67 67 65 72 + dta d"Digger " ; 20 + 830 4DE9 28 65 61 76 79 00 + dta d"Heavy Digger " ; 21 + 831 4DF9 22 61 62 79 00 33 + dta d"Baby Sandhog " ; 22 + 832 4E09 33 61 6E 64 68 6F + dta d"Sandhog " ; 23 + 833 4E19 28 65 61 76 79 00 + dta d"Heavy Sandhog " ; 24 + 834 4E29 24 69 72 74 00 23 + dta d"Dirt Clod " ; 25 + 835 4E39 24 69 72 74 00 22 + dta d"Dirt Ball " ; 26 + 836 4E49 34 6F 6E 00 6F 66 + dta d"Ton of Dirt " ; 27 + 837 4E59 2C 69 71 75 69 64 + dta d"Liquid Dirt " ; 28 + 838 4E69 24 69 72 74 00 23 + dta d"Dirt Charge " ; 29 + 839 4E79 25 61 72 74 68 00 + dta d"Earth Disrupter " ; 30 + 840 4E89 30 6C 61 73 6D 61 + dta d"Plasma Blast " ; 31 + 841 4E99 2C 61 73 65 72 00 + dta d"Laser " ; 32 + 842 4EA9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 33 + 843 4EB9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 34 + 844 4EC9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 35 + 845 4ED9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 36 + 846 4EE9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 37 + 847 4EF9 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 38 + 848 4F09 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 39 + 849 4F19 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 40 + 850 4F29 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 41 + 851 4F39 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 42 + 852 4F49 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 43 + 853 4F59 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 44 + 854 4F69 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 45 + 855 4F79 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 46 + 856 4F89 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 47 + 857 + 858 4F99 28 65 61 74 00 27 + dta d"Heat Guidance " ; 48 ($30) + 859 4FA9 22 61 6C 00 27 75 + dta d"Bal Guidance " ; 49 + 860 4FB9 28 6F 72 7A 00 27 + dta d"Horz Guidance " ; 50 + 861 4FC9 36 65 72 74 00 27 + dta d"Vert Guidance " ; 51 + 862 4FD9 2C 61 7A 79 00 22 + dta d"Lazy Boy " ; 52 + 863 4FE9 30 61 72 61 63 68 + dta d"Parachute " ; 53 + 864 4FF9 22 61 74 74 65 72 + dta d"Battery " ; 54 + 865 5009 2D 61 67 00 24 65 + dta d"Mag Deflector " ; 55 + 866 5019 33 68 69 65 6C 64 + dta d"Shield " ; 56 + 867 5029 26 6F 72 63 65 00 + dta d"Force Shield " ; 57 + 868 5039 28 65 61 76 79 00 + dta d"Heavy Shield " ; 58 + 869 5049 33 75 70 65 72 00 + dta d"Super Mag " ; 59 + 870 5059 21 75 74 6F 00 24 + dta d"Auto Defense " ; 60 + 871 5069 26 75 65 6C 00 34 + dta d"Fuel Tank " ; 61 + 872 5079 23 6F 6E 74 61 63 + dta d"Contact Trigger " ; 62 + 873 5089 0D 0D 0D 0D 0D 0D + dta d"----------------" ; 63 + 874 5099 joyToKeyTable + 875 ; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15 + 876 5099 FF FF FF FF FF FF + .by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff + 877 50A9 previousAngle + 878 50A9 00 00 00 00 00 00 :MaxPlayers .by 0 + 879 50AF previousEnergyL + 880 50AF 00 00 00 00 00 00 :MaxPlayers .by 0 + 881 50B5 previousLeftRange + 882 50B5 00 00 00 00 00 00 :MaxPlayers .by 0 + 883 50BB previousEnergyH + 884 50BB 00 00 00 00 00 00 :MaxPlayers .by 0 + 885 50C1 previousRightAngle + 886 50C1 00 00 00 00 00 00 :MaxPlayers .by 0 + 887 50C7 RandBoundaryLow + 888 50C7 00 00 .wo 0 + 889 50C9 RandBoundaryHigh + 890 50C9 00 04 .wo 1024 + 891 50CB AngleTablePointer + 892 50CB 00 .by 0 + 893 + 894 + 895 50CC clearEnd + 896 + 897 .endif + 898 + 90 ;-------------------------------------------------- + 91 50CC OffensiveTexts + 92 50CC icl 'artwork/talk.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\artwork\talk.asm + 1 50CC .proc talk + 2 50CC 49 4E 20 54 49 4D + L0 dta c"IN TIMES OF TROUBLE, GO WITH WHAT YOU KNOW." + 3 50F7 44 49 45 21 L1 dta c"DIE!" + 4 50FB 45 41 54 20 4D 59 + L2 dta c"EAT MY SHORTS!" + 5 5109 59 4F 55 27 52 45 + L3 dta c"YOU'RE TOAST!" + 6 5116 42 41 4E 5A 41 49 + L4 dta c"BANZAI!" + 7 511D 46 52 4F 4D 20 48 + L5 dta c"FROM HELL'S HEART I STAB AT THEE..." + 8 5140 49 20 44 49 44 4E + L6 dta c"I DIDN'T DO IT. NOBODY SAW ME DO IT." + 9 5165 54 41 4B 45 20 41 + L7 dta c"TAKE A HIKE!" + 10 5171 59 4F 55 27 52 45 + L8 dta c"YOU'RE DEAD MEAT." + 11 5182 4D 41 4B 45 20 4D + L9 dta c"MAKE MY DAY." + 12 518E 43 48 41 52 47 45 + L10 dta c"CHARGE!" + 13 5195 41 54 54 41 43 4B + L11 dta c"ATTACK!" + 14 519C 59 4F 55 27 52 45 + L12 dta c"YOU'RE OUTTA HERE." + 15 51AE 57 41 54 54 53 41 + L13 dta c"WATTSA MATTA YOU?" + 16 51BF 46 52 45 45 5A 45 + L14 dta c"FREEZE, OR I'LL SHOOT!" + 17 51D5 48 41 20 48 41 20 + L15 dta c"HA HA HA." + 18 51DE 57 45 20 43 4F 4D + L16 dta c"WE COME IN PEACE - SHOOT TO KILL!" + 19 51FF 49 4E 20 59 4F 55 + L17 dta c"IN YOUR FACE!" + 20 520C 44 49 45 20 43 4F + L18 dta c"DIE COMMIE PIG!" + 21 521B 49 20 4C 4F 56 45 + L19 dta c"I LOVE THE SMELL OF NAPALM IN THE MORNING." + 22 5245 56 49 43 54 4F 52 + L20 dta c"VICTORY!" + 23 524D 53 48 4F 57 20 53 + L21 dta c"SHOW SOME RESPECT." + 24 525F 4A 55 53 54 20 57 + L22 dta c"JUST WHO DO YOU THINK YOU ARE?" + 25 527D 4C 4F 4F 4B 20 4F + L23 dta c"LOOK OUT BELOW!" + 26 528C 4B 4E 4F 43 4B 2C + L24 dta c"KNOCK, KNOCK." + 27 5299 4C 4F 4F 4B 20 4F + L25 dta c"LOOK OVER THERE." + 28 52A9 47 55 45 53 53 20 + L26 dta c"GUESS WHAT'S COMING FOR DINNER?" + 29 52C8 4D 45 52 52 59 20 + L27 dta c"MERRY CHRISTMAS." + 30 52D8 4F 50 45 4E 20 57 + L28 dta c"OPEN WIDE!" + 31 52E2 48 45 52 45 20 47 + L29 dta c"HERE GOES NOTHING..." + 32 52F6 44 4F 4E 27 54 20 + L30 dta c"DON'T WORRY, IT ISN'T A LIVE ROUND." + 33 5319 42 4C 4F 4F 44 2C + L31 dta c"BLOOD, PAIN, VIOLENCE!" + 34 532F 54 41 4B 45 20 54 + L32 dta c"TAKE THIS, SISSY!" + 35 5340 49 20 53 48 41 4C + L33 dta c"I SHALL FLATTEN YOU!" + 36 5354 49 20 53 48 41 4C + L34 dta c"I SHALL SMASH YOUR UGLY TANK!" + 37 5371 49 20 57 4F 4E 44 + L35 dta c"I WONDER WHAT THIS BUTTON DOES?" + 38 5390 44 4F 4E 27 54 20 + L36 dta c"DON'T TAKE THIS PERSONALLY." + 39 53AB 57 4F 55 4C 44 20 + L37 dta c"WOULD THIS MAKE YOU MAD?" + 40 53C3 49 20 54 4F 4C 44 + L38 dta c"I TOLD YOU TO LEAVE MY SISTER ALONE!" + 41 53E7 49 20 43 4F 55 4C + L39 dta c"I COULD SPARE YOU, BUT WHY?" + 42 5402 4D 59 20 42 4F 4D + L40 dta c"MY BOMB IS BIGGER THAN YOURS." + 43 541F 44 4F 4E 27 54 20 + L41 dta c"DON'T FORGET ABOUT ME!" + 44 5435 48 41 53 54 41 20 + L42 dta c"HASTA LA VISTA, BABY!" + 45 544A 54 48 49 53 20 49 + L43 dta c"THIS IS YOUR BRAIN ON SCORCH." + 46 5467 54 41 4B 45 20 54 + L44 dta c"TAKE THIS!" + 47 5471 54 48 49 53 20 53 + L45 dta c"THIS SCREEN AIN'T BIG ENOUGH FOR THE BOTH OF US." + 48 54A1 44 49 45 2C 20 41 + L46 dta c"DIE, ALIEN SWINE!" + 49 54B2 53 41 59 20 41 52 + L47 dta c"SAY ARRGGHHHHH...." + 50 54C4 49 20 53 48 41 4C + L48 dta c"I SHALL OIL MY TURRET WITH YOUR BLOOD." + 51 54EA 44 49 45 2C 20 54 + L49 dta c"DIE, TANK-SCUM!" + 52 54F9 49 27 4D 20 47 4F + L50 dta c"I'M GONNA BREAK YOUR FACE!" + 53 5513 4D 41 4D 41 20 53 + L51 dta c"MAMA SAID KNOCK YOU OUT!" + 54 552B 49 20 48 4F 50 45 + L52 dta c"I HOPE YOU ENJOY PAIN!" + 55 ;-------------------------------- + 56 5541 50 41 52 54 49 4E + L53 dta c"PARTING IS SUCH SWEET SORROW... NOT!" + 57 5565 55 47 48 21 L54 dta c"UGH!" + 58 5569 41 41 52 47 48 21 L55 dta c"AARGH!" + 59 556F 41 41 41 47 47 48 + L56 dta c"AAAGGHHH!" + 60 5578 49 27 4D 20 4D 45 + L57 dta c"I'M MELTING!" + 61 5584 4F 4F 46 2E 2E L58 dta c"OOF.." + 62 5589 4F 48 21 L59 dta c"OH!" + 63 558C 45 45 45 4B 21 L60 dta c"EEEK!" + 64 5591 41 41 43 43 48 21 L61 dta c"AACCH!" + 65 5597 49 20 48 41 54 45 + L62 dta c"I HATE IT WHEN THAT HAPPENS." + 66 55B3 4F 4E 45 20 44 49 + L63 dta c"ONE DIRECT HIT CAN RUIN YOUR WHOLE DAY." + 67 55DA 4F 48 20 4E 4F 21 L64 dta c"OH NO!" + 68 55E0 4E 4F 54 20 4D 45 + L65 dta c"NOT ME!" + 69 55E7 4F 55 43 48 2E L66 dta c"OUCH." + 70 55EC 4F 48 20 4E 4F 2C + L67 dta c"OH NO, NOT AGAIN." + 71 55FD 41 4E 4F 54 48 45 + L68 dta c"ANOTHER ONE BITES THE DUST." + 72 5618 47 4F 4F 44 42 59 + L69 dta c"GOODBYE." + 73 5620 48 45 4C 50 20 4D + L70 dta c"HELP ME!" + 74 5628 46 41 52 45 57 45 + L71 dta c"FAREWELL, CRUEL WORLD." + 75 563E 52 45 4D 45 4D 42 + L72 dta c"REMEMBER THE ALAMO!" + 76 5651 4F 48 20 4D 41 4E + L73 dta c"OH MAN!" + 77 5658 44 4F 4F 55 47 48 + L74 dta c"DOOUGH!" + 78 565F 41 4E 4F 54 48 45 + L75 dta c"ANOTHER DAY, ANOTHER BOMB." + 79 5679 54 48 49 53 20 49 + L76 dta c"THIS IS THE END, MY ONLY FRIEND." + 80 5699 49 54 27 53 20 41 + L77 dta c"IT'S ALL OVER." + 81 56A7 54 48 45 20 46 41 + L78 dta c"THE FAT LADY SANG." + 82 56B9 57 48 59 20 44 4F + L79 dta c"WHY DOES EVERYTHING HAPPEN TO ME?" + 83 56DA 49 27 4D 20 47 4F + L80 dta c"I'M GOING DOWN." + 84 56E9 49 27 56 45 20 47 + L81 dta c"I'VE GOT A BAD FEELING ABOUT THIS." + 85 570B 43 52 41 50 4F 4C + L82 dta c"CRAPOLA." + 86 5713 50 4F 57 21 L83 dta c"POW!" + 87 5717 42 49 46 21 L84 dta c"BIF!" + 88 571B 42 41 4D 21 L85 dta c"BAM!" + 89 571F 5A 4F 4E 4B 21 L86 dta c"ZONK!" + 90 5724 49 20 53 48 4F 55 + L87 dta c"I SHOULD'VE LISTENED TO MY MOTHER..." + 91 5748 4E 4F 2E 2E 2E 20 + L88 dta c"NO... A BUD LIGHT!" + 92 575A 57 48 41 54 20 57 + L89 dta c"WHAT WAS THAT NOISE?" + 93 576E 4D 41 4D 41 20 53 + L90 dta c"MAMA SAID THERE'D BE DAYS LIKE THIS." + 94 5792 49 54 53 20 4A 55 + L91 dta c"ITS JUST ONE OF THOSE DAYS..." + 95 57AF 49 20 53 45 45 20 + L92 dta c"I SEE A BRIGHT LIGHT..." + 96 57C6 4D 4F 4D 4D 59 3F + L93 dta c"MOMMY? IS THAT YOU?" + 97 57D9 49 20 4C 45 54 20 + L94 dta c"I LET YOU HIT ME!" + 98 57EA 53 55 43 4B 45 52 + L95 dta c"SUCKER SHOT!" + 99 57F6 49 20 44 49 44 4E + L96 dta c"I DIDN'T WANT TO LIVE ANYWAY." + 100 5813 2D 3C 53 4F 42 3E + L97 dta c"--" + 101 581A 57 41 53 20 54 48 + L98 dta c"WAS THAT AS CLOSE AS I THINK IT WAS?" + 102 583E 4A 4F 49 4E 20 54 + L99 dta c"JOIN THE ARMY, SEE THE WORLD THEY SAID." + 103 5865 49 54 20 57 41 53 + L100 dta c"IT WASN'T JUST A JOB IT WAS AN ADVENTURE!" + 104 588E 49 20 44 49 44 4E + L101 dta c"I DIDN'T LIKE VIOLENCE ANYWAY!" + 105 58AC 49 20 54 48 4F 55 + L102 dta c"I THOUGHT YOU LIKED ME?" + 106 58C3 53 55 43 48 20 53 + L103 dta c"SUCH SENSELESS VIOLENCE! I DON'T UNDERSTAND IT." + 107 58F3 49 20 54 48 49 4E + L104 dta c"I THINK THIS GUY'S A LITTLE CRAZY." + 108 5915 53 4F 4D 45 48 4F + L105 dta c"SOMEHOW I DON'T FEEL LIKE KILLING ANYMORE." + 109 593F 48 45 59 21 20 20 + L106 dta c"HEY! KILLIN' AIN'T COOL." + 110 5958 47 45 45 2E 2E 2E + L107 dta c"GEE... THANKS." + 111 5966 49 27 56 45 20 46 + L108 dta c"I'VE FALLEN AND I CAN'T GET UP!" + 112 5985 39 31 31 3F L109 dta c"911?" + 113 5989 4F 48 20 4E 4F 21 + L110 dta c"OH NO! HERE I BLOW AGAIN!" + 114 59A3 49 27 4C 4C 20 42 + L111 dta c"I'LL BE BACK..." + 115 59B2 48 45 59 20 2D 20 + L112 dta c"HEY - I'VE GOT LAWYERS." + 116 59C9 54 49 4D 45 20 54 + L113 dta c"TIME TO CALL 1-900-SUE-TANK." + 117 59E5 OffensiveTextTableL + 118 59E5 CC F7 FB 09 16 1D + 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,>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 + 121 5AC9 OffensiveTextLengths + 122 5AC9 2B 04 0E 0D 07 23 + dta 43,4,14,13,7,35,37,12,17,12,7,7,18,17,22,9,33,13,15,42,8,18,30,15,13,16,31,16,10,20,35,22,17,20,29,31,27,24,36,27,29,22,21,29,10,48,17,20,38,15,26,24,22,36,4,6,9,12,5,3,5,6,28,39,6,7,5,17,27,8,8,22,19,7,7,26,32,14,18,33,15,34,8,4,4,4,5,36,18,20,36,29,23,19,17,12,29,7,36,39,41,30,23,48,34,42,25,14,31,4,26,15,23,28 + 123 = 0036 NumberOfOffensiveTexts=54 + 124 = 003C NumberOfDeffensiveTexts=60 + 125 .endp + 93 ;-------------------------------------------------- + 94 ; Game Code + 95 ;-------------------------------------------------- + 96 5B3B START + 97 + 98 ; Startup sequence + 99 5B3B 20 A1 72 jsr Initialize + 100 + 101 5B3E A9 49 8D 30 02 A9 + mwa #OptionsDL dlptrs + 102 5B48 AD 2F 02 lda dmactls + 103 5B4B 29 FC and #$fc + 104 5B4D 09 02 ora #$02 ; normal screen width + 105 5B4F 8D 2F 02 sta dmactls + 106 + 107 5B52 20 DD 74 jsr Options ;startup screen + 108 + 109 ;entering names of players + 110 5B55 A9 5E 8D 30 02 A9 + mwa #NameDL dlptrs + 111 5B5F AD 2F 02 lda dmactls + 112 5B62 29 FC and #$fc + 113 5B64 09 01 ora #$01 ; narrow screen (32 chars) + 114 5B66 8D 2F 02 sta dmactls + 115 + 116 5B69 A9 00 85 8B mva #0 TankNr + 117 + 118 5B6D loop01 + 119 5B6D 20 30 7A jsr EnterPlayerName + 120 5B70 E6 8B inc TankNr + 121 5B72 A5 8B lda TankNr + 122 5B74 CD 19 3D cmp NumberOfPlayers + 123 5B77 D0 F4 bne loop01 + 124 + 125 5B79 A9 74 8D 30 02 A9 + mwa #dl dlptrs + 126 5B83 AD 2F 02 lda dmactls + 127 5B86 29 FC and #$fc + 128 5B88 09 02 ora #$02 ; normal screen width + 129 5B8A 8D 2F 02 sta dmactls + 130 + 131 5B8D 20 54 73 jsr RandomizeSequence + 132 ; for the round #1 shooting sequence is random + 133 + 134 5B90 MainGameLoop + 135 + 136 5B90 20 2C 76 jsr CallPurchaseForEveryTank + 137 + 138 5B93 20 39 73 jsr SetDLI + 139 5B96 A9 74 8D 30 02 A9 + mwa #dl dlptrs + 140 5BA0 AD 2F 02 lda dmactls + 141 5BA3 29 FC and #$fc + 142 5BA5 09 02 ora #$02 ; 2=normal, 3 = wide screen width + 143 5BA7 8D 2F 02 sta dmactls + 144 + 145 5BAA 20 35 72 jsr GetRandomWind + 146 + 147 5BAD 20 55 5C jsr Round + 148 + 149 5BB0 20 20 74 jsr SortSequence + 150 + 151 ; Hide all (easier than hide last ;) ) tanks + 152 5BB3 A9 01 8D FB 3D mva #1 Erase + 153 5BB8 20 E2 84 jsr drawtanks + 154 5BBB A9 00 8D FB 3D mva #0 Erase + 155 5BC0 20 66 72 jsr PMoutofScreen ;let P/M disappear + 156 + 157 ; here gains and looses should be displayed (dollars) + 158 ; finally we have changed our minds and money of players + 159 ; is displayed only in weapons shop + 160 + 161 ; Results are number of other deaths + 162 ; before the player dies itself + 163 + 164 ; add gains and substract looses + 165 ; gain is what player gets for lost energy of opponents + 166 ; energy lost by opponents is added during Round and + 167 ; little below in source multiplied by 2 to get "dollars". + 168 ; By analogy, loose is energy that given player looses during + 169 ; each Round. + 170 ; Important! If player has 10 energy and gets central hit + 171 ; from nuke that would take 90 energy point his loose + 172 ; is 90, not 10 + 173 5BC3 20 37 7D jsr DisplayResults + 174 + 175 ;check demo mode + 176 5BC6 AE 19 3D ldx numberOfPlayers + 177 5BC9 CA dex + 178 5BCA checkForHuman ; if all in skillTable other than 0 then switch to DEMO MODE + 179 5BCA BD 20 3D lda skillTable,x + 180 5BCD F0 1D beq peopleAreHere + 181 5BCF CA dex + 182 5BD0 10 F8 bpl checkForHuman + 183 5BD2 A8 tay + 184 ; no people, just wait a bit + 185 5BD3 pause 150 +Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 2 5BD3 A2 96 ldx #150 + 3 5BD5 ?PAUSELOOP + 3 5BD5 AD 0B D4 LDA VCOUNT + 4 5BD8 8D 0A D4 STA WSYNC + 5 5BDB 8D 0A D4 STA WSYNC + 6 5BDE 8D 0A D4 STA WSYNC + 7 5BE1 CD 0B D4 ?WA CMP VCOUNT + 8 5BE4 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 5 5BE6 CA dex + 6 5BE7 D0 EC bne ?PAUSELOOP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 186 5BE9 4C FF 5B jmp noKey + 187 + 188 5BEC peopleAreHere + 189 ;key ; only if there is a human player + 190 5BEC AD 0F D2 lda SKSTAT + 191 5BEF C9 FF cmp #$ff + 192 5BF1 F0 07 beq checkFire + 193 5BF3 C9 F7 cmp #$f7 + 194 5BF5 F0 03 beq checkFire + 195 5BF7 4C FF 5B jmp noKey ;key pressed, so go + 196 5BFA checkFire + 197 ;------------JOY------------- + 198 ;happy happy joy joy + 199 ;check for joystick now + 200 ;fire + 201 5BFA AD 10 D0 lda TRIG0 + 202 5BFD D0 ED bne peopleAreHere ;fire not pressed, so loop + 203 + 204 5BFF noKey + 205 5BFF AE 19 3D ldx NumberOfPlayers + 206 5C02 CA dex + 207 5C03 CalculateGains + 208 ; add gain * 2 + 209 5C03 1E 38 3D asl gainL,x + 210 5C06 3E 32 3D rol gainH,x + 211 5C09 18 clc + 212 5C0A BD 2C 3D lda moneyL,x + 213 5C0D 7D 38 3D adc gainL,x + 214 5C10 9D 2C 3D sta moneyL,x + 215 5C13 BD 26 3D lda moneyH,x + 216 5C16 7D 32 3D adc gainH,x + 217 5C19 9D 26 3D sta moneyH,x + 218 ; substract loose + 219 ; if loose is greater than money then zero money + 220 5C1C BD 26 3D lda moneyH,x + 221 5C1F DD 3E 3D cmp looseH,x + 222 5C22 90 20 bcc zeromoney + 223 5C24 D0 08 bne substractloose + 224 5C26 BD 2C 3D lda moneyL,x + 225 5C29 DD 44 3D cmp looseL,x + 226 5C2C 90 16 bcc zeromoney + 227 5C2E substractloose + 228 5C2E 38 sec + 229 5C2F BD 2C 3D lda moneyL,x + 230 5C32 FD 44 3D sbc looseL,x + 231 5C35 9D 2C 3D sta moneyL,x + 232 5C38 BD 26 3D lda moneyH,x + 233 5C3B FD 3E 3D sbc looseH,x + 234 5C3E 9D 26 3D sta moneyH,x + 235 5C41 4C 4C 5C jmp skipzeroing + 236 5C44 zeromoney + 237 5C44 A9 00 lda #0 + 238 5C46 9D 2C 3D sta moneyL,x + 239 5C49 9D 26 3D sta moneyH,x + 240 + 241 5C4C skipzeroing + 242 5C4C CA dex + 243 5C4D 10 B4 bpl CalculateGains + 244 + 245 + 246 + 247 5C4F EE 4B 3F inc CurrentRoundNr + 248 5C52 4C 90 5B jmp MainGameLoop + 249 + 250 + 251 ;-------------------------------------------------- + 252 5C55 Round .proc ; + 253 ;-------------------------------------------------- + 254 ; at the beginning of each Round we set energy + 255 ; of all players to 100 + 256 ; the maximum shooting energy to 1000 (it is 10*energy) + 257 ; the default shooting energy to 350 + 258 ; the default shooting angle to 45 degrees + 259 ; of course gains an looses are zeroed + 260 + 261 5C55 A9 00 lda #0 + 262 5C57 AA tax + 263 5C58 loop + 264 5C58 9D A9 50 sta previousAngle,x + 265 5C5B E8 inx + 266 5C5C E0 23 cpx #(clearEnd-PreviousAngle) + 267 5C5E D0 F8 bne loop + 268 .endp + 269 + 270 5C60 A2 05 ldx #5 + 271 5C62 SettingEnergies + 272 5C62 A9 00 lda #$00 + 273 5C64 9D 38 3D sta gainL,x + 274 5C67 9D 32 3D sta gainH,x + 275 5C6A 9D 44 3D sta looseL,x + 276 5C6D 9D 3E 3D sta looseH,x + 277 5C70 A9 63 lda #99 + 278 5C72 9D 4A 3D sta Energy,x + 279 5C75 9D 51 3D sta eXistenZ,x + 280 5C78 9D 57 3D sta LASTeXistenZ,x + 281 ; anything in eXistenZ table means that this tank exist + 282 ; in the given round + 283 5C7B A9 E8 lda #232 + 284 5C7D 9D 76 3D sta MaxEnergyTableL,x + 285 5C80 A9 03 lda #3 + 286 5C82 9D 7C 3D sta MaxEnergyTableH,x + 287 5C85 A9 5E lda #94 + 288 5C87 9D 6A 3D sta EnergyTableL,x + 289 5C8A A9 01 lda #1 + 290 5C8C 9D 70 3D sta EnergyTableH,x + 291 ;lda #(255-45) + 292 ;it does not look good when all tanks have + 293 ;barrels pointing the same direction + 294 ;so it would be nice to have more or less random + 295 ;angles + 296 + 297 5C8F 20 89 73 jsr RandomizeAngle + 298 5C92 9D 82 3D sta AngleTable,x + 299 + 300 + 301 5C95 CA dex + 302 5C96 10 CA bpl SettingEnergies + 303 + 304 5C98 A9 00 8D 69 3D mva #0 CurrentResult + 305 + 306 ;generating the new landscape + 307 5C9D 20 66 72 jsr PMoutofScreen ;let P/M disappear + 308 5CA0 20 CB 83 jsr clearscreen ;let the screen be clean + 309 5CA3 20 32 84 jsr placetanks ;let the tanks be evenly placed + 310 5CA6 20 8B 87 jsr calculatemountains ;let mountains be nice for the eye + 311 5CA9 20 83 85 jsr drawmountains ;draw them + 312 5CAC 20 E2 84 jsr drawtanks ;finally draw tanks + 313 + 314 ;--------------------round screen is ready--------- + 315 + 316 ;mva #0 TankNr + 317 5CAF A9 00 85 8C mva #0 TankSequencePointer + 318 + 319 5CB3 MainRoundLoop + 320 ; here we must check if by a chance there is only one + 321 ; tank with energy greater than 0 left + 322 + 323 5CB3 A0 00 ldy #0 ; number of tanks with energy greater than zero + 324 5CB5 AE 19 3D ldx NumberOfPlayers + 325 5CB8 CA dex + 326 5CB9 CheckingIfRoundIsFinished + 327 5CB9 BD 51 3D lda eXistenZ,x + 328 5CBC F0 01 beq NoEnergy + 329 5CBE C8 iny + 330 5CBF NoEnergy + 331 5CBF CA dex + 332 5CC0 10 F7 bpl CheckingIfRoundIsFinished + 333 + 334 5CC2 C0 02 cpy #2 ; is it less than 2 tanks have energy >0 ? + 335 5CC4 B0 18 bcs DoNotFinishTheRound + 336 + 337 ;points for the last living tank + 338 5CC6 AE 19 3D ldx NumberOfPlayers + 339 5CC9 CA dex + 340 5CCA WhichTankWonLoop + 341 5CCA BD 51 3D lda eXistenZ,x + 342 5CCD D0 04 bne ThisOneWon + 343 5CCF CA dex + 344 5CD0 10 F8 bpl WhichTankWonLoop + 345 ;error here!!! + 346 ;stop + 347 ; somehow I believed program will be never here + 348 ; but it was a bad assumption + 349 ; gode goes here when there is such a situation + 350 ; (we've got a SITUATION here, it you know what I mean) + 351 ; there are two tanks left. + 352 ; one of them is killed by the second tank + 353 ; second tank explodes and kills the first one. + 354 ; and code lands here... + 355 ; looks like no one won! + 356 + 357 5CD2 60 rts + 358 + 359 5CD3 ThisOneWon + 360 5CD3 AD 69 3D lda CurrentResult + 361 5CD6 18 clc + 362 5CD7 7D 5D 3D adc ResultsTable,x + 363 5CDA 9D 5D 3D sta ResultsTable,x + 364 + 365 5CDD 60 rts ; this Round is finished + 366 + 367 5CDE DoNotFinishTheRound + 368 ;ldx TankNr + 369 + 370 5CDE A6 8C ldx TankSequencePointer + 371 5CE0 BD 1A 3D lda TankSequence,x + 372 5CE3 85 8B sta TankNr + 373 5CE5 AA tax + 374 5CE6 BD 4A 3D lda Energy,x ;skip if no energy + 375 5CE9 D0 03 4C 7A 5D jeq NextPlayerShoots + 376 + 377 + 378 5CEE A9 01 8D CA 3E mva #1 color ;to display flying point + 379 + 380 5CF3 BD A4 8E lda TankColoursTable,x + 381 5CF6 8D C6 02 sta colpf2s ; set color of status line + 382 + 383 5CF9 BD 20 3D lda SkillTable,x + 384 5CFC F0 0F beq ManualShooting + 385 + 386 ; robotanks shoot here + 387 5CFE 20 4F 8C jsr ArtificialIntelligence + 388 5D01 20 E8 73 jsr MoveBarrelToNewPosition + 389 5D04 20 4B 7F jsr DisplayingSymbols ;all digital values like force, angle, wind, etc. + 390 5D07 20 55 80 jsr PutTankNameOnScreen + 391 ; let's move the tank's barrel so it points the right + 392 ; direction + 393 5D0A 4C 13 5D jmp AfterManualShooting + 394 + 395 5D0D ManualShooting + 396 + 397 5D0D 20 BF 83 jsr WaitForKeyRelease + 398 5D10 20 92 66 jsr BeforeFire + 399 + 400 5D13 AfterManualShooting + 401 ; lower energy to eventually let tanks commit suicide + 402 5D13 A6 8B ldx TankNr + 403 5D15 DE 4A 3D dec Energy,x + 404 5D18 BD 89 3D lda ActiveWeapon,x + 405 + 406 5D1B 20 24 68 jsr Shoot + 407 5D1E AD 96 3D lda HitFlag ;0 if missed + 408 5D21 F0 4A beq missed + 409 5D23 A9 00 lda #0 + 410 5D25 8D 4C 3F sta FallDown1 + 411 5D28 8D 4D 3F sta FallDown2 + 412 5D2B 20 63 5E jsr Explosion + 413 + 414 ;here we clear offensive text (after a shoot) + 415 5D2E A4 8B ldy TankNr + 416 5D30 A9 00 8D 51 48 mva #0 plot4x4color + 417 5D35 20 10 7C jsr DisplayOffensiveTextNr + 418 + 419 + 420 5D38 AfterExplode + 421 ;temporary tanks removal (would fall down with soil) + 422 5D38 A5 8B 85 A7 mva TankNr tempor2 + 423 5D3C A9 01 8D FB 3D mva #1 Erase + 424 5D41 20 E2 84 jsr drawtanks + 425 5D44 A5 A7 85 8B mva tempor2 TankNr + 426 5D48 A9 00 8D FB 3D mva #0 Erase + 427 5D4D AD 4D 3F lda FallDown2 + 428 5D50 F0 03 beq NoFallDown2 + 429 5D52 20 F7 85 jsr SoilDown2; + 430 + 431 5D55 NoFallDown2 + 432 ;here tanks are falling down + 433 5D55 A5 8B 85 A7 mva tankNr tempor2 + 434 5D59 A9 00 85 8B mva #0 TankNr + 435 + 436 5D5D TanksFallDown + 437 5D5D 20 B8 68 jsr TankFalls + 438 5D60 E6 8B A5 8B inc:lda TankNr + 439 5D64 CD 19 3D cmp NumberOfPlayers + 440 5D67 D0 F4 bne TanksFallDown + 441 5D69 A5 A7 85 8B mva tempor2 TankNr + 442 5D6D missed + 443 + 444 ;here we clear offensive text (after a shoot) + 445 ;shit -- it's second time, but it must be like this + 446 5D6D A4 8B ldy TankNr + 447 5D6F A9 00 8D 51 48 mva #0 plot4x4color + 448 5D74 20 10 7C jsr DisplayOffensiveTextNr + 449 + 450 5D77 20 C4 71 jsr DecreaseWeaponAfterShoot ; or before??? + 451 5D7A NextPlayerShoots + 452 5D7A A9 01 8D FB 3D mva #1 Erase + 453 5D7F 20 E2 84 jsr drawtanks + 454 + 455 ;before it shoots, the eXistenZ table must be + 456 ;updated accordingly to actual energy (was forgotten, sorry to ourselves) + 457 + 458 5D82 A2 05 ldx #5 + 459 5D84 SeteXistenZ + 460 5D84 BD 4A 3D lda Energy,x + 461 5D87 9D 51 3D sta eXistenZ,x + 462 5D8A 8D 8F 3D sta L1 + 463 + 464 ;DATA L1,L2 + 465 ;RESULT WH*256+L1 + 466 ;Multiplication 8bit*8bit, + 467 ;result 16bit + 468 ;this algiorithm is a little longer than in Ruszczyc 6502 book + 469 ;but it is faster + 470 + 471 5D8D A0 08 LDy #8 + 472 5D8F A9 00 LDA #0 + 473 5D91 18 CLC + 474 5D92 LP0 + 475 5D92 6A ror + 476 5D93 6E 8F 3D ROR L1 + 477 5D96 90 03 BCC B0 + 478 5D98 18 CLC + 479 5D99 69 0A ADC #10 ; multiplication by 10 + 480 5D9B 88 B0 DEy + 481 5D9C D0 F4 BNE LP0 + 482 5D9E 6A ror + 483 5D9F 6E 8F 3D ROR L1 + 484 5DA2 9D 7C 3D STA MaxEnergyTableH,x + 485 5DA5 AD 8F 3D lda L1 + 486 5DA8 9D 76 3D sta MaxEnergyTableL,x + 487 + 488 5DAB CA dex + 489 5DAC 10 D6 bpl SeteXistenZ + 490 + 491 ;was setup of maximum energy for players + 492 + 493 5DAE A9 00 8D FB 3D mva #0 Erase + 494 5DB3 20 E2 84 jsr drawtanks + 495 + 496 ;inc TankNr + 497 ;lda TankNr + 498 5DB6 E6 8C A5 8C inc:lda TankSequencePointer + 499 5DBA CD 19 3D cmp NumberOfPlayers + 500 5DBD D0 04 bne PlayersAgain + 501 ;mva 0 TankNr + 502 5DBF A9 00 85 8C mva #0 TankSequencePointer + 503 + 504 5DC3 PlayersAgain .proc + 505 + 506 ; In LASTeXistenZ there are values of eXistenZ before shoot + 507 ; from the next tank. + 508 ; Now it must be checked if by a chance something that had + 509 ; LASTeXistenZ>0 is not equal to 0 right now, + 510 ; because it means this tank died during this round. + 511 ; Most important thing is: + 512 ; after each explosion of the tank these operations must be + 513 ; performed from the beginning! + 514 ; (it is made by another jump into the after explosion routines) + 515 ; It is because exploding tank can destroy their neighbours, + 516 ; additionally this tank just have had LASTeXistenZ set to 0, + 517 ; otherwise it would explode again and again. + 518 ; OK, text how to do it is ready, now comes coding . + 519 ; Aaaah! - in main loop we have to set eXistenZ and LASTeXistenZ + 520 + 521 5DC3 AE 19 3D ldx NumberOfPlayers + 522 5DC6 CA dex + 523 5DC7 CheckingPlayersDeath + 524 5DC7 BD 57 3D lda LASTeXistenZ,x + 525 5DCA F0 05 beq NoPlayerNoDeath + 526 5DCC BD 51 3D lda eXistenZ,x + 527 5DCF F0 06 beq PlayerXdeath + 528 5DD1 NoPlayerNoDeath + 529 5DD1 CA dex + 530 5DD2 10 F3 bpl CheckingPlayersDeath + 531 ; if processor is here it means there are no more explosions + 532 5DD4 4C B3 5C jmp MainRoundLoop + 533 .endp + 534 ;--------------------------------- + 535 5DD7 PlayerXdeath .proc + 536 ; first we inform that this tank should not explode anymore: + 537 ; there is 0 in A, and Tank Number in X, so... + 538 + 539 5DD7 9D 57 3D sta LASTeXistenZ,x + 540 ; save x somewhere + 541 5DDA 8E DD 44 stx TankTempY + 542 + 543 ; display defensive text here (well, defensive + 544 ; is not the real meaning, it should be pre-death, + 545 ; but I am too lazy to change names of variables) + 546 + 547 ; in X there is a number of tank that died + 548 + 549 5DDD AD 69 3D lda CurrentResult + 550 5DE0 18 clc + 551 5DE1 7D 5D 3D adc ResultsTable,x + 552 5DE4 9D 5D 3D sta ResultsTable,x + 553 5DE7 EE 69 3D inc CurrentResult + 554 .endp + 555 + 556 ;RandomizeDeffensiveText + 557 5DEA randomize talk.NumberOfOffensiveTexts (talk.NumberOfDeffensiveTexts+talk.NumberOfOffensiveTexts-1) +Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 5DEA ?rand + 4 5DEA AD 0A D2 lda random + 5 5DED C9 36 cmp #TALK.NUMBEROFOFFENSIVETEXTS ;floor + 6 5DEF 90 F9 bcc ?rand + 7 5DF1 C9 72 cmp #(TALK.NUMBEROFDEFFENSIVETEXTS+TALK.NUMBEROFOFFENSIVETEXTS-1)+1 ;ceiling + 8 5DF3 B0 F5 bcs ?rand +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 558 5DF5 8D DC 44 sta TextNumberOff + 559 5DF8 AC DD 44 ldy TankTempY + 560 5DFB A9 01 8D 51 48 mva #1 plot4x4color + 561 5E00 20 10 7C jsr DisplayOffensiveTextNr + 562 + 563 5E03 PAUSE 75 +Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 2 5E03 A2 4B ldx #75 + 3 5E05 ?PAUSELOOP + 3 5E05 AD 0B D4 LDA VCOUNT + 4 5E08 8D 0A D4 STA WSYNC + 5 5E0B 8D 0A D4 STA WSYNC + 6 5E0E 8D 0A D4 STA WSYNC + 7 5E11 CD 0B D4 ?WA CMP VCOUNT + 8 5E14 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 5 5E16 CA dex + 6 5E17 D0 EC bne ?PAUSELOOP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 564 ;Deffensive text cleanup + 565 ;here we clear Deffensive text (after a shoot) + 566 5E19 AC DD 44 ldy TankTempY + 567 5E1C A9 00 8D 51 48 mva #0 plot4x4color + 568 5E21 20 10 7C jsr DisplayOffensiveTextNr + 569 + 570 + 571 ; calculate position of the explosion (the post-death one?) + 572 5E24 AE DD 44 ldx TankTempY + 573 5E27 18 clc + 574 5E28 BD 97 3D lda xtankstableL,x + 575 5E2B 69 04 adc #4 ; more or less in the middle of the tank + 576 5E2D 85 80 sta xdraw + 577 5E2F BD 9D 3D lda xtankstableH,x + 578 5E32 69 00 adc #0 + 579 5E34 85 81 sta xdraw+1 + 580 5E36 38 sec + 581 5E37 BD A3 3D lda ytankstable,x + 582 5E3A E9 04 sbc #4 + 583 5E3C 85 82 sta ydraw + 584 5E3E A9 00 lda #0 + 585 5E40 85 83 sta ydraw+1 ; there is 0 left in A, so... + 586 + 587 ;cleanup of the soil fall down ranges (left and right) + 588 5E42 8D FE 3D sta RangeRight + 589 5E45 8D FF 3D sta RangeRight+1 + 590 5E48 8D 4C 3F sta FallDown1 + 591 5E4B 8D 4D 3F sta FallDown2 + 592 5E4E A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft + 593 + 594 + 595 + 596 ; We are randomizing the weapon now. + 597 ; As we are jumping into the middle of the weapon + 598 ; routine we are preparing the number *2 - + 599 ; - to make it easier and because we are using only + 600 ; first 32 weapons we are doing this with just one AND + 601 + 602 5E58 AD 0A D2 lda random + 603 5E5B 29 3E and #$3e ; range (0-31 number multiplied by 2) + 604 5E5D 20 7B 5E jsr Explosion2 + 605 + 606 ; jump to after explosion routines (soil fallout, etc.) + 607 ; After going through these routines we are back + 608 ; to checking if a tank exploded and maybe we have + 609 ; a deadly shot here again. + 610 + 611 + 612 5E60 4C 38 5D jmp AfterExplode + 613 + 614 + 615 ;-------------------------------------------------- + 616 5E63 Explosion .proc + 617 ;-------------------------------------------------- + 618 ;cleanup of the soil fall down ranges (left and right) + 619 5E63 A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft + 620 5E6D A9 00 lda #0 + 621 5E6F 8D FE 3D sta RangeRight + 622 5E72 8D FF 3D sta RangeRight+1 + 623 + 624 5E75 A6 8B ldx TankNr + 625 5E77 BD 89 3D lda ActiveWeapon,x + 626 5E7A 0A asl + 627 .endp + 628 5E7B Explosion2 .proc + 629 5E7B AA tax + 630 5E7C BD 86 5E lda ExplosionRoutines+1,x + 631 5E7F 48 pha + 632 5E80 BD 85 5E lda ExplosionRoutines,x + 633 5E83 48 pha + 634 5E84 60 rts + 635 5E85 ExplosionRoutines + 636 5E85 C7 5E .word babymissile-1 + 637 5E87 D5 5E .word missile-1 + 638 5E89 E3 5E .word babynuke-1 + 639 5E8B F1 5E .word nuke-1 + 640 5E8D FF 5E .word leapfrog-1 + 641 5E8F 82 5F .word funkybomb-1 + 642 5E91 7E 5F .word mirv-1 + 643 5E93 26 60 .word deathshead-1 + 644 5E95 C6 5E .word VOID-1 ;napalm + 645 5E97 C6 5E .word VOID-1 ;hotnapalm + 646 5E99 96 60 .word tracer-1 + 647 5E9B C6 5E .word VOID-1 ;smoketracer + 648 5E9D 97 60 .word babyroller-1 + 649 5E9F A2 60 .word roller-1 + 650 5EA1 AD 60 .word heavyroller-1 + 651 5EA3 C6 5E .word VOID-1 ;riotcharge + 652 5EA5 C6 5E .word VOID-1 ;riotblast + 653 5EA7 B8 60 .word riotbomb-1 + 654 5EA9 C6 60 .word heavyriotbomb-1 + 655 5EAB D4 60 .word babydigger-1 + 656 5EAD E9 60 .word digger-1 + 657 5EAF FE 60 .word heavydigger-1 + 658 5EB1 07 62 .word babysandhog-1 + 659 5EB3 1C 62 .word sandhog-1 + 660 5EB5 31 62 .word heavysandhog-1 + 661 5EB7 46 62 .word dirtclod-1 + 662 5EB9 54 62 .word dirtball-1 + 663 5EBB 62 62 .word tonofdirt-1 + 664 5EBD C6 5E .word VOID-1 ;liquiddirt + 665 5EBF 70 62 .word dirtcharge-1 + 666 5EC1 C6 5E .word VOID-1 ;earthdisrupter + 667 5EC3 C6 5E .word VOID-1 ;plasmablast + 668 5EC5 7E 62 .word laser-1 + 669 + 670 5EC7 VOID + 671 5EC7 60 rts + 672 .endp + 673 ; ------------------------ + 674 + 675 5EC8 icl 'weapons.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 ; ------------------------ + 6 5EC8 babymissile + 7 5EC8 EE 4D 3F inc FallDown2 + 8 5ECB A9 0B 8D 49 3F mva #11 ExplosionRadius + 9 5ED0 20 44 71 jsr CalculateExplosionRange + 10 5ED3 4C 96 63 jmp xmissile + 11 ; ------------------------ + 12 5ED6 missile ; + 13 5ED6 EE 4D 3F inc FallDown2 + 14 5ED9 A9 11 8D 49 3F mva #17 ExplosionRadius + 15 5EDE 20 44 71 jsr CalculateExplosionRange + 16 5EE1 4C 96 63 jmp xmissile + 17 ; ------------------------ + 18 5EE4 babynuke + 19 5EE4 EE 4D 3F inc FallDown2 + 20 5EE7 A9 19 8D 49 3F mva #25 ExplosionRadius + 21 5EEC 20 44 71 jsr CalculateExplosionRange + 22 5EEF 4C 96 63 jmp xmissile + 23 ; ------------------------ + 24 5EF2 nuke + 25 5EF2 EE 4D 3F inc FallDown2 + 26 5EF5 A9 1F 8D 49 3F mva #31 ExplosionRadius + 27 5EFA 20 44 71 jsr CalculateExplosionRange + 28 5EFD 4C 96 63 jmp xmissile + 29 ; ------------------------ + 30 5F00 leapfrog + 31 5F00 EE 4D 3F inc FallDown2 + 32 5F03 A9 11 8D 49 3F mva #17 ExplosionRadius + 33 5F08 20 44 71 jsr CalculateExplosionRange + 34 5F0B 20 96 63 jsr xmissile + 35 + 36 ; soil must fall down now! there is no other way... + 37 ; hide tanks or they fall down with soil + 38 + 39 5F0E A5 8B lda TankNr + 40 5F10 48 pha + 41 5F11 A9 01 8D FB 3D mva #1 Erase + 42 5F16 20 E2 84 jsr drawtanks + 43 5F19 A9 00 8D FB 3D mva #0 Erase + 44 5F1E 20 F7 85 jsr SoilDown2 + 45 5F21 20 E2 84 jsr drawtanks + 46 5F24 68 pla + 47 5F25 85 8B sta TankNr + 48 + 49 ; it looks like force is divided by 4 here BUT" + 50 ; in Flight routine force is multiplied by 2 and left + 51 ; so, we have Force divided by 2 here (not accurately) + 52 + 53 5F27 4E 82 3E lsr Force+1 + 54 5F2A 6E 81 3E ror Force + 55 ;lsr Force+1 + 56 ;ror Force + 57 5F2D AD 4E 3F lda LeapFrogAngle + 58 5F30 8D 80 3E sta Angle + 59 5F33 20 75 6A jsr Flight + 60 5F36 AD 96 3D lda HitFlag + 61 5F39 F0 43 beq EndOfLeapping + 62 5F3B A9 0F 8D 49 3F mva #15 ExplosionRadius + 63 5F40 20 2D 71 jsr CalculateExplosionRange0 + 64 5F43 20 96 63 jsr xmissile + 65 + 66 ; soil must fall down now! there is no other way... + 67 ; hide tanks or they fall down with soil + 68 5F46 A5 8B lda TankNr + 69 5F48 48 pha + 70 5F49 A9 01 8D FB 3D mva #1 Erase + 71 5F4E 20 E2 84 jsr drawtanks + 72 5F51 A9 00 8D FB 3D mva #0 Erase + 73 5F56 20 F7 85 jsr SoilDown2 + 74 5F59 20 E2 84 jsr drawtanks + 75 5F5C 68 pla + 76 5F5D 85 8B sta TankNr + 77 + 78 ; it looks like force is divided by 4 here BUT" + 79 ; in Flight routine force is multiplied by 2 and left + 80 ; so, we have Force divided by 2 here (not accurately) + 81 ;lsr Force+1 + 82 ;ror Force + 83 5F5F 4E 82 3E lsr Force+1 + 84 5F62 6E 81 3E ror Force + 85 5F65 AD 4E 3F lda LeapFrogAngle + 86 5F68 8D 80 3E sta Angle + 87 5F6B 20 75 6A jsr Flight + 88 5F6E AD 96 3D lda HitFlag + 89 5F71 F0 0B beq EndOfLeapping + 90 5F73 A9 0D 8D 49 3F mva #13 ExplosionRadius + 91 5F78 20 2D 71 jsr CalculateExplosionRange0 + 92 5F7B 4C 96 63 jmp xmissile + 93 5F7E EndOfLeapping + 94 5F7E 60 rts + 95 ; ------------------------ + 96 5F7F mirv ; the whole mirv is performed by Flight routine + 97 5F7F EE 4D 3F inc FallDown2 + 98 5F82 60 rts + 99 ; ------------------------ + 100 5F83 funkybomb ; + 101 5F83 A9 01 8D A9 3E mva #1 tracerflag + 102 5F88 AD 75 3E 8D A5 3E + mwa xtraj+1 xtrajfb + 103 5F94 AD 78 3E 8D A7 3E + mwa ytraj+1 ytrajfb + 104 5FA0 EE 4D 3F inc FallDown2 + 105 ;central Explosion + 106 5FA3 A9 15 8D 49 3F mva #21 ExplosionRadius + 107 5FA8 20 2D 71 jsr CalculateExplosionRange0 + 108 5FAB 20 96 63 jsr xmissile + 109 + 110 5FAE A5 8B lda TankNr + 111 5FB0 48 pha + 112 5FB1 A9 01 8D FB 3D mva #1 Erase + 113 5FB6 20 E2 84 jsr drawtanks + 114 5FB9 A9 00 8D FB 3D mva #0 Erase + 115 + 116 5FBE 20 F7 85 jsr SoilDown2 + 117 ; + 118 5FC1 A9 01 8D FB 3D mva #1 Erase + 119 5FC6 20 E2 84 jsr drawtanks + 120 5FC9 A9 00 8D FB 3D mva #0 Erase + 121 5FCE 68 pla + 122 5FCF 85 8B sta TankNr + 123 + 124 5FD1 A9 05 8D A4 3E mva #5 FunkyBombCounter + 125 5FD6 FunkyBombLoop + 126 ;force randomization (range: 256-511) + 127 5FD6 AD 0A D2 lda random + 128 5FD9 8D 81 3E sta Force + 129 5FDC A9 01 lda #1 + 130 5FDE 8D 82 3E sta Force+1 + 131 ;Angle randomization Range: (-16..+16) + 132 5FE1 AD 0A D2 lda random + 133 5FE4 4A lsr + 134 5FE5 29 1F and #%00011111 + 135 5FE7 90 02 bcc DoNotEor + 136 5FE9 49 FF eor #$ff + 137 5FEB DoNotEor + 138 5FEB 8D 80 3E sta Angle + 139 + 140 5FEE A9 00 lda #0 + 141 5FF0 8D 74 3E sta xtraj + 142 5FF3 8D 77 3E sta ytraj + 143 5FF6 AD A5 3E 8D 75 3E + mwa xtrajfb xtraj+1 + 144 6002 AD A7 3E 8D 78 3E + mwa ytrajfb ytraj+1 + 145 600E 20 75 6A jsr Flight + 146 + 147 6011 AD 96 3D lda HitFlag + 148 6014 F0 06 beq NoExplosionInFunkyBomb + 149 6016 20 44 71 jsr CalculateExplosionRange + 150 6019 20 96 63 jsr xmissile + 151 601C NoExplosionInFunkyBomb + 152 601C CE A4 3E dec FunkyBombCounter + 153 601F D0 B5 bne FunkyBombLoop + 154 6021 A9 00 8D A9 3E mva #0 tracerflag + 155 6026 60 rts + 156 ; ------------------------ + 157 6027 deathshead + 158 6027 EE 4D 3F inc FallDown2 + 159 602A A9 1F 8D 49 3F mva #31 ExplosionRadius + 160 602F 20 44 71 jsr CalculateExplosionRange + 161 6032 20 96 63 jsr xmissile + 162 6035 38 A5 80 E9 23 85 + sbw xdraw #35 + 163 6040 20 44 71 jsr CalculateExplosionRange + 164 6043 20 96 63 jsr xmissile + 165 6046 18 A5 80 69 46 85 + adw xdraw #70 + 166 6051 20 44 71 jsr CalculateExplosionRange + 167 6054 20 96 63 jsr xmissile + 168 6057 38 A5 80 E9 23 85 + sbw xdraw #35 + 169 ; + 170 6062 38 A5 82 E9 23 85 + sbw ydraw #35 + 171 ;jsr CalculateExplosionRange + 172 606D A5 83 C9 00 D0 04 + cpw ydraw #screenHeight + 173 6077 B0 03 bcs NoUpperCircle + 174 6079 20 96 63 jsr xmissile + 175 607C NoUpperCircle + 176 607C 18 A5 82 69 46 85 + adw ydraw #70 + 177 ;jsr CalculateExplosionRange + 178 6087 A5 83 C9 00 D0 04 + cpw ydraw #screenHeight + 179 6091 B0 03 bcs NoLowerCircle + 180 6093 20 96 63 jsr xmissile + 181 6096 NoLowerCircle + 182 6096 60 rts + 183 ; ------------------------ + 184 6097 tracer + 185 6097 60 rts + 186 ; ------------------------ + 187 6098 babyroller + 188 6098 EE 4D 3F inc FallDown2 + 189 609B A9 0B 8D 49 3F mva #11 ExplosionRadius + 190 60A0 4C 64 64 jmp xroller + 191 ; ------------------------ + 192 60A3 roller ; + 193 60A3 EE 4D 3F inc FallDown2 + 194 60A6 A9 15 8D 49 3F mva #21 ExplosionRadius + 195 60AB 4C 64 64 jmp xroller + 196 ; ------------------------ + 197 60AE heavyroller + 198 60AE EE 4D 3F inc FallDown2 + 199 60B1 A9 1F 8D 49 3F mva #31 ExplosionRadius + 200 60B6 4C 64 64 jmp xroller + 201 ; ------------------------ + 202 60B9 riotbomb + 203 60B9 EE 4D 3F inc FallDown2 + 204 60BC A9 11 8D 49 3F mva #17 ExplosionRadius + 205 60C1 20 44 71 jsr CalculateExplosionRange + 206 60C4 4C 48 64 jmp xriotbomb + 207 ; ------------------------ + 208 60C7 heavyriotbomb + 209 60C7 EE 4D 3F inc FallDown2 + 210 60CA A9 1D 8D 49 3F mva #29 ExplosionRadius + 211 60CF 20 44 71 jsr CalculateExplosionRange + 212 60D2 4C 48 64 jmp xriotbomb + 213 ; ------------------------ + 214 60D5 babydigger + 215 60D5 A9 00 8D 2C 3E mva #0 sandhogflag + 216 60DA EE 4D 3F inc FallDown2 + 217 60DD A9 0D 8D 0B 3E mva #13 DigLong + 218 60E2 A9 01 8D 0A 3E mva #1 diggery ; how many branches (-1) + 219 60E7 4C 14 61 jmp xdigger + 220 ; ------------------------ + 221 60EA digger ; + 222 60EA A9 00 8D 2C 3E mva #0 sandhogflag + 223 60EF EE 4D 3F inc FallDown2 + 224 60F2 A9 0D 8D 0B 3E mva #13 DigLong + 225 60F7 A9 03 8D 0A 3E mva #3 diggery ; how many branches (-1) + 226 60FC 4C 14 61 jmp xdigger + 227 ; ------------------------ + 228 60FF heavydigger + 229 60FF A9 00 8D 2C 3E mva #0 sandhogflag + 230 6104 EE 4D 3F inc FallDown2 + 231 6107 A9 0D 8D 0B 3E mva #13 DigLong + 232 610C A9 07 8D 0A 3E mva #7 diggery ; how many branches (-1) + 233 6111 4C 14 61 jmp xdigger + 234 ; ------------------------ + 235 6114 xdigger + 236 6114 A5 80 8D 06 3E A5 + mwa xdraw digstartx + 237 611E A5 82 8D 08 3E A5 + mwa ydraw digstarty + 238 6128 AE 0A 3E ldx diggery + 239 612B WriteToBranches + 240 612B A5 80 lda xdraw + 241 612D 9D 0C 3E sta digtabxL,x + 242 6130 A5 81 lda xdraw+1 + 243 6132 9D 14 3E sta digtabxH,x + 244 6135 A5 82 lda ydraw + 245 6137 9D 1C 3E sta digtabyL,x + 246 613A A5 83 lda ydraw+1 + 247 613C 9D 24 3E sta digtabyH,x + 248 613F CA dex + 249 6140 10 E9 bpl WriteToBranches + 250 6142 20 EB 61 jsr DiggerCharacter ; start character + 251 + 252 6145 18 A5 80 69 04 85 + adw xdraw #4 + 253 6150 AD 0B 3E lda DigLong + 254 ; looks strange, but it is (DigLong+2)*4 + 255 6153 18 clc + 256 6154 69 02 adc #$2 + 257 6156 0A asl + 258 6157 0A asl + 259 6158 8D 49 3F sta ExplosionRadius + 260 615B 20 44 71 jsr CalculateExplosionRange + 261 615E BranchNotFinished + 262 615E AE 0A 3E ldx diggery + 263 6161 CalculateBranches + 264 6161 8A txa + 265 6162 29 01 and #$01 + 266 6164 D0 14 bne DigRight + 267 6166 diglewy ; even branches go left + 268 6166 38 sec + 269 6167 BD 0C 3E lda digtabxL,x + 270 616A E9 04 sbc #$04 + 271 616C 9D 0C 3E sta digtabxL,x + 272 616F BD 14 3E lda digtabxH,x + 273 6172 E9 00 sbc #$00 + 274 6174 9D 14 3E sta digtabxH,x + 275 6177 4C 8B 61 jmp DigRandomize + 276 617A DigRight ; odd go right (everytime 4 pixels) + 277 617A 18 clc + 278 617B BD 0C 3E lda digtabxL,x + 279 617E 69 04 adc #$04 + 280 6180 9D 0C 3E sta digtabxL,x + 281 6183 BD 14 3E lda digtabxH,x + 282 6186 69 00 adc #$00 + 283 6188 9D 14 3E sta digtabxH,x + 284 618B DigRandomize + 285 618B AD 0A D2 lda random + 286 618E 29 87 and #$87 + 287 6190 30 14 bmi DigUp + 288 6192 digwdol + 289 6192 29 07 and #$07 + 290 6194 18 clc + 291 6195 7D 1C 3E adc digtabyL,x + 292 6198 9D 1C 3E sta digtabyL,x + 293 619B BD 24 3E lda digtabyH,x + 294 619E 69 00 adc #$00 + 295 61A0 9D 24 3E sta digtabyH,x + 296 61A3 4C BB 61 jmp DigCalculateNext + 297 61A6 DigUp + 298 61A6 29 07 and #$07 + 299 61A8 85 91 sta temp + 300 61AA 38 sec + 301 61AB BD 1C 3E lda digtabyL,x + 302 61AE E5 91 sbc temp + 303 61B0 9D 1C 3E sta digtabyL,x + 304 61B3 BD 24 3E lda digtabyH,x + 305 61B6 E9 00 sbc #$00 + 306 61B8 9D 24 3E sta digtabyH,x + 307 61BB DigCalculateNext + 308 61BB CA dex + 309 61BC 10 A3 bpl CalculateBranches + 310 ; here we draw... + 311 61BE AE 0A 3E ldx diggery + 312 61C1 DigDrawing + 313 61C1 BD 0C 3E lda digtabxL,x + 314 61C4 85 80 sta xdraw + 315 61C6 BD 14 3E lda digtabxH,x + 316 61C9 85 81 sta xdraw+1 + 317 61CB BD 1C 3E lda digtabyL,x + 318 61CE 85 82 sta ydraw + 319 61D0 BD 24 3E lda digtabyH,x + 320 61D3 85 83 sta ydraw+1 + 321 61D5 phx +Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 61D5 8A txa + 2 61D6 48 pha +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 322 61D7 20 EB 61 jsr DiggerCharacter + 323 61DA plx +Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 61DA 68 pla + 2 61DB AA tax +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 324 61DC CA dex + 325 61DD 10 E2 bpl DigDrawing + 326 61DF CE 0B 3E AD 0B 3E dec:lda DigLong + 327 61E5 30 03 4C 5E 61 jpl BranchNotFinished + 328 61EA 60 rts + 329 61EB DiggerCharacter + 330 61EB AD 0A D2 lda random + 331 61EE 29 06 and #$06 + 332 61F0 18 clc + 333 61F1 69 36 adc #$36 + 334 61F3 6D 2C 3E adc sandhogflag + 335 61F6 85 88 sta CharCode + 336 61F8 A5 81 C9 01 D0 04 + cpw xdraw #(screenwidth-6) + 337 6202 B0 03 bcs DoNotPutDig + 338 6204 4C FE 89 jmp TypeChar + 339 6207 DoNotPutDig + 340 6207 60 rts + 341 ; ------------------------ + 342 6208 babysandhog + 343 6208 A9 08 8D 2C 3E mva #8 sandhogflag + 344 620D EE 4D 3F inc FallDown2 + 345 6210 A9 0D 8D 0B 3E mva #13 DigLong + 346 6215 A9 01 8D 0A 3E mva #1 diggery ; how many branches (-1) + 347 621A 4C 14 61 jmp xdigger + 348 ; ------------------------ + 349 621D sandhog + 350 621D A9 08 8D 2C 3E mva #8 sandhogflag + 351 6222 EE 4D 3F inc FallDown2 + 352 6225 A9 0D 8D 0B 3E mva #13 DigLong + 353 622A A9 03 8D 0A 3E mva #3 diggery ; how many branches (-1) + 354 622F 4C 14 61 jmp xdigger + 355 ; ------------------------ + 356 6232 heavysandhog + 357 6232 A9 08 8D 2C 3E mva #8 sandhogflag + 358 6237 EE 4D 3F inc FallDown2 + 359 623A A9 0D 8D 0B 3E mva #13 DigLong + 360 623F A9 05 8D 0A 3E mva #5 diggery ; how many branches (-1) + 361 6244 4C 14 61 jmp xdigger + 362 ; ------------------------ + 363 6247 dirtclod + 364 6247 EE 4D 3F inc FallDown2 + 365 624A A9 0C 8D 49 3F mva #12 ExplosionRadius + 366 624F 20 44 71 jsr CalculateExplosionRange + 367 6252 4C 2A 64 jmp xdirt + 368 ; ------------------------ + 369 6255 dirtball + 370 6255 EE 4D 3F inc FallDown2 + 371 6258 A9 16 8D 49 3F mva #22 ExplosionRadius + 372 625D 20 44 71 jsr CalculateExplosionRange + 373 6260 4C 2A 64 jmp xdirt + 374 ; ------------------------ + 375 6263 tonofdirt + 376 6263 EE 4D 3F inc FallDown2 + 377 6266 A9 1F 8D 49 3F mva #31 ExplosionRadius + 378 626B 20 44 71 jsr CalculateExplosionRange + 379 626E 4C 2A 64 jmp xdirt + 380 ; ------------------------ + 381 6271 dirtcharge + 382 6271 EE 4D 3F inc FallDown2 + 383 6274 A9 3D 8D 49 3F mva #61 ExplosionRadius + 384 6279 20 44 71 jsr CalculateExplosionRange + 385 627C 4C 0D 66 jmp ofdirt + 386 ; ------------------------ + 387 627F laser + 388 627F A6 8B ldx TankNr + 389 6281 BD 82 3D lda AngleTable,x + 390 6284 A8 tay + 391 6285 18 clc + 392 6286 BD 97 3D lda xtankstableL,x + 393 6289 79 69 49 adc EndOfTheBarrelX,y ; correction of the end of the barrel point + 394 628C 85 84 sta xbyte + 395 628E BD 9D 3D lda xtankstableH,x + 396 6291 69 00 adc #0 + 397 6293 85 85 sta xbyte+1 + 398 6295 38 sec + 399 6296 BD A3 3D lda ytankstable,x + 400 6299 F9 69 4A sbc EndOfTheBarrelY,y + 401 629C 85 86 sta ybyte + 402 629E A9 00 85 87 mva #0 ybyte+1 + 403 62A2 A9 56 8D 2F 3E A9 + mwa #Drawplot DrawJumpAddr + 404 62AC A5 80 8D 4F 3F A5 + mwa xdraw LaserCoordinate + 405 62B6 A5 82 8D 51 3F A5 + mwa ydraw LaserCoordinate+2 + 406 62C0 A5 84 8D 53 3F A5 + mwa xbyte LaserCoordinate+4 + 407 62CA A5 86 8D 55 3F A5 + mwa ybyte LaserCoordinate+6 + 408 + 409 62D4 20 6A 80 jsr draw + 410 62D7 A9 00 8D CA 3E mva #0 color + 411 62DC AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw + 412 62E6 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw + 413 62F0 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte + 414 62FA AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte + 415 6304 20 6A 80 jsr draw + 416 6307 A9 01 8D CA 3E mva #1 color + 417 630C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw + 418 6316 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw + 419 6320 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte + 420 632A AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte + 421 6334 20 6A 80 jsr draw + 422 6337 A9 00 8D CA 3E mva #0 color + 423 633C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw + 424 6346 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw + 425 6350 AD 53 3F 85 84 AD + mwa LaserCoordinate+4 xbyte + 426 635A AD 55 3F 85 86 AD + mwa LaserCoordinate+6 ybyte + 427 6364 20 6A 80 jsr draw + 428 6367 A9 01 8D CA 3E mva #1 color + 429 636C AD 4F 3F 85 80 AD + mwa LaserCoordinate xdraw + 430 6376 AD 51 3F 85 82 AD + mwa LaserCoordinate+2 ydraw + 431 6380 20 0C 89 jsr plot + 432 6383 A9 00 8D 96 3D mva #0 HitFlag + 433 6388 20 D4 70 jsr CheckCollisionWithTank + 434 638B AD 96 3D lda HitFlag + 435 638E F0 05 beq LaserMisses + 436 ; here we hit a tank (X) + 437 6390 A0 64 ldy #100 + 438 6392 20 F5 71 jsr DecreaseEnergyX + 439 6395 LaserMisses + 440 6395 60 rts + 441 + 442 ; ----------------- + 443 6396 xmissile ; + 444 ; ----------------- + 445 6396 A9 01 lda #1 + 446 6398 8D 38 3E sta radius + 447 639B 8D CA 3E sta color + 448 ;ora ExplosionRadius ;making sure the ExplosionRadius is odd + 449 ;sta ExplosionRadius + 450 639E ExplosionLoop + 451 639E 20 BB 82 jsr circle + 452 63A1 E6 82 inc ydraw + 453 63A3 20 BB 82 jsr circle + 454 63A6 C6 82 dec ydraw + 455 63A8 EE 38 3E EE 38 3E inc:inc radius + 456 63AE AD 38 3E lda radius + 457 63B1 CD 49 3F cmp ExplosionRadius + 458 63B4 D0 E8 bne ExplosionLoop + 459 63B6 A9 00 lda #0 + 460 63B8 8D CA 3E sta color + 461 63BB ExplosionLoop2 + 462 63BB 20 BB 82 jsr circle + 463 63BE E6 82 inc ydraw + 464 63C0 20 BB 82 jsr circle + 465 63C3 C6 82 dec ydraw + 466 63C5 CE 38 3E dec radius + 467 63C8 AD 38 3E lda radius + 468 63CB D0 EE bne ExplosionLoop2 + 469 63CD A9 01 lda #1 + 470 63CF 8D CA 3E sta color + 471 + 472 ;check tanks' distance from the centre of the explosion + 473 + 474 63D2 A9 59 8D 2F 3E A9 + mwa #DrawLen DrawJumpAddr + 475 ;the above switches Draw to measuring length + 476 ;trick is easy - how many pixels does it take to draw + 477 ;a line from one point to another + 478 ;it must be somehow easier than regular Pitagoras + 479 ;calculation + 480 + 481 63DC AE 19 3D ldx NumberOfPlayers + 482 63DF DistanceCheckLoop + 483 63DF CA dex + 484 63E0 BD 51 3D lda eXistenZ,x + 485 63E3 F0 41 beq EndOfDistanceCheckLoop + 486 ;here the tank exist + 487 63E5 BD 97 3D lda XtankstableL,x + 488 63E8 18 clc + 489 63E9 69 03 adc #3 ;measure from middle of the tank + 490 63EB 85 84 sta xbyte + 491 63ED BD 9D 3D lda XtankstableH,x + 492 63F0 18 clc + 493 63F1 69 00 adc #0 ;measure from middle of the tank + 494 63F3 85 85 sta xbyte+1 + 495 63F5 BD A3 3D lda Ytankstable,x + 496 63F8 38 sec + 497 63F9 E9 02 sbc #2 ;measure from middle of the tank + 498 63FB 85 86 sta ybyte + 499 63FD A9 00 lda #0 + 500 63FF 85 87 sta ybyte+1 + 501 6401 phx +Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 6401 8A txa + 2 6402 48 pha +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 502 6403 20 6A 80 jsr draw + 503 6406 plx +Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 6406 68 pla + 2 6407 AA tax +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 504 ;if tank within range of the explosion? + 505 6408 AD 37 3E lda LineLength+1 + 506 640B D0 19 bne TankIsNotWithinTheRange + 507 640D AD 36 3E lda LineLength + 508 6410 CD 49 3F cmp ExplosionRadius + 509 6413 B0 11 bcs TankIsNotWithinTheRange + 510 6415 AD 49 3F lda ExplosionRadius + 511 6418 38 sec + 512 6419 ED 36 3E sbc LineLength + 513 ;multiply difference by 8 + 514 641C 18 clc + 515 641D 69 01 adc #1 + 516 641F 0A asl + 517 6420 0A asl + 518 6421 0A asl + 519 6422 A8 tay + 520 6423 20 F5 71 jsr DecreaseEnergyX + 521 + 522 6426 TankIsNotWithinTheRange + 523 6426 EndOfDistanceCheckLoop + 524 6426 8A txa + 525 6427 D0 B6 bne DistanceCheckLoop + 526 6429 60 rts + 527 ; ----------------- + 528 642A xdirt ; + 529 ; ----------------- + 530 642A A9 01 lda #1 + 531 642C 8D 38 3E sta radius + 532 642F 8D CA 3E sta color + 533 6432 dirtLoop + 534 6432 20 BB 82 jsr circle + 535 6435 E6 82 inc ydraw + 536 6437 20 BB 82 jsr circle + 537 643A C6 82 dec ydraw + 538 643C EE 38 3E inc radius + 539 643F AD 38 3E lda radius + 540 6442 CD 49 3F cmp ExplosionRadius + 541 6445 D0 EB bne dirtLoop + 542 6447 60 rts + 543 ; ----------------- + 544 6448 xriotbomb ; + 545 ; ----------------- + 546 6448 A9 00 lda #0 + 547 644A 8D 38 3E sta radius + 548 644D 8D CA 3E sta color + 549 6450 rbombLoop + 550 6450 20 BB 82 jsr circle + 551 6453 EE 38 3E inc radius + 552 6456 AD 38 3E lda radius + 553 6459 CD 49 3F cmp ExplosionRadius + 554 645C D0 F2 bne rbombLoop + 555 645E A9 01 8D CA 3E mva #1 color + 556 6463 60 rts + 557 + 558 ; ---------------- + 559 + 560 6464 xroller ; + 561 ; now collisions are detected with modified draw routine + 562 ; therefore YDRAW value must be taken from mountaintable + 563 6464 A0 00 ldy #0 + 564 6466 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER + 565 + 566 646E 18 A5 95 65 80 85 + adw tempXROLLER xdraw + 567 647B B1 95 lda (tempXROLLER),y + 568 647D 85 82 sta ydraw + 569 + 570 647F AD 6F 3E lda vx+3 + 571 ; if horizontal velocity is negative then change the direction + 572 6482 10 08 bpl PositiveVelocity + 573 6484 AD 8C 3E lda goleft + 574 6487 09 01 ora #$01 + 575 6489 8D 8C 3E sta goleft + 576 648C PositiveVelocity + 577 ; first we look for the left slope + 578 ; then righ slope and set the flag + 579 ; $FF - we are in a hole (flighting in missile direction) + 580 ; 1 - right, 2 - left + 581 648C A9 FF 8D 04 3E mva #$ff HowMuchToFall + 582 6491 A5 82 8D 05 3E mva ydraw HeightRol + 583 6496 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER + 584 + 585 649E 18 A5 95 65 80 85 + adw tempXROLLER xdraw + 586 64AB SeekLeft + 587 64AB 38 A5 95 E9 01 85 + sbw tempXROLLER #1 + 588 64B6 B1 95 lda (tempXROLLER),y ;fukk! beware of Y value + 589 64B8 CD 05 3E cmp HeightRol + 590 64BB D0 0C bne HowMuchToFallLeft + 591 64BD A5 95 lda tempXROLLER + 592 64BF C9 13 cmp #mountaintable + 596 64C7 F0 07 beq GoRightNow + 597 64C9 HowMuchToFallLeft + 598 64C9 B0 05 bcs GoRightNow + 599 64CB A9 01 8D 04 3E mva #1 HowMuchToFall + 600 64D0 GoRightNow + 601 64D0 A9 13 85 95 A9 41 + mwa #mountaintable tempXROLLER + 602 64D8 18 A5 95 65 80 85 + adw tempXROLLER xdraw + 603 64E5 SeekRight + 604 64E5 18 A5 95 69 01 85 + adw tempXROLLER #1 + 605 64F0 B1 95 lda (tempXROLLER),y + 606 64F2 CD 05 3E cmp HeightRol + 607 64F5 D0 0C bne HowMuchToFallRight + 608 64F7 A5 95 lda tempXROLLER + 609 64F9 C9 53 cmp #<(mountaintable+screenwidth) + 610 64FB D0 E8 bne SeekRight + 611 64FD A5 96 lda tempXROLLER+1 + 612 64FF C9 42 cmp #>(mountaintable+screenwidth) + 613 6501 F0 13 beq HowMuchToFallKnown + 614 6503 HowMuchToFallRight + 615 ; check if up or down + 616 6503 B0 11 bcs HowMuchToFallKnown + 617 6505 AD 04 3E lda HowMuchToFall + 618 6508 10 07 bpl ItIsLeftAlready + 619 650A A9 02 8D 04 3E mva #2 HowMuchToFall + 620 650F D0 05 bne HowMuchToFallKnown + 621 6511 ItIsLeftAlready + 622 6511 A9 FF 8D 04 3E mva #$ff HowMuchToFall + 623 6516 HowMuchToFallKnown + 624 6516 AD 04 3E lda HowMuchToFall + 625 6519 10 09 bpl Rollin + 626 651B A9 01 lda #1 + 627 651D 18 clc + 628 651E 6D 8C 3E adc goleft + 629 6521 8D 04 3E sta HowMuchToFall + 630 6524 Rollin + 631 6524 18 A5 80 69 13 85 + adw xdraw #mountaintable tempXROLLER + 632 6531 A0 00 ldy #0 + 633 6533 B1 95 lda (tempXROLLER),y + 634 6535 8D 05 3E sta HeightRol ; relative point + 635 + 636 6538 RollinContinues + 637 6538 wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 6538 AD 0B D4 LDA VCOUNT + 4 653B 8D 0A D4 STA WSYNC + 5 653E 8D 0A D4 STA WSYNC + 6 6541 8D 0A D4 STA WSYNC + 7 6544 CD 0B D4 ?WA CMP VCOUNT + 8 6547 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 638 6549 wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 6549 AD 0B D4 LDA VCOUNT + 4 654C 8D 0A D4 STA WSYNC + 5 654F 8D 0A D4 STA WSYNC + 6 6552 8D 0A D4 STA WSYNC + 7 6555 CD 0B D4 ?WA CMP VCOUNT + 8 6558 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 639 ; new point is set + 640 655A 18 A5 80 69 13 85 + adw xdraw #mountaintable tempXROLLER + 641 6567 A0 00 ldy #0 + 642 6569 B1 95 lda (tempXROLLER),y + 643 656B 85 82 sta ydraw + 644 656D F0 6C beq ExplodeNow + 645 656F CD 05 3E cmp HeightRol + 646 6572 F0 02 beq UpNotYet + 647 6574 90 65 bcc ExplodeNow + 648 6576 UpNotYet + 649 6576 38 sec ;clc + 650 6577 8D 05 3E sta HeightRol + 651 657A E9 01 sbc #1 + 652 657C 85 82 sta ydraw + 653 ;check tank collision prior to PLOT + 654 657E 8C 96 3D sty HitFlag + 655 + 656 6581 A5 80 8D 75 3E A5 + mwa xdraw xtraj+1 + 657 658B A5 82 8D 78 3E A5 + mwa ydraw ytraj+1 + 658 6595 20 D4 70 jsr CheckCollisionWithTank + 659 + 660 6598 AD 96 3D lda HitFlag + 661 659B D0 3E bne ExplodeNow + 662 659D 20 46 88 jsr unPlot + 663 ; let's go the right direction + 664 65A0 AD 04 3E lda HowMuchToFall + 665 65A3 C9 01 cmp #1 + 666 65A5 F0 18 beq HowMuchToFallRight2 + 667 65A7 38 A5 80 E9 01 85 + sbw xdraw #1 + 668 65B2 A5 80 lda xdraw + 669 65B4 D0 82 bne RollinContinues + 670 65B6 A5 81 lda xdraw+1 + 671 65B8 F0 03 4C 38 65 jne RollinContinues + 672 65BD F0 1C beq ExplodeNow + 673 65BF HowMuchToFallRight2 + 674 65BF 18 A5 80 69 01 85 + adw xdraw #1 + 675 65CA A5 81 CD 41 01 D0 + cpw xdraw screenwidth + 676 65D6 F0 03 4C 38 65 jne RollinContinues + 677 65DB ExplodeNow + 678 65DB A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store somewhere (BAD) + 679 65E5 A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw (BAD) + 680 65EA A9 00 85 80 85 81 mwa #0 xdraw + 681 65F0 A9 C7 85 82 mva #screenheight-1 ydraw + 682 65F4 20 46 88 jsr unPlot + 683 65F7 AD 39 3E 85 80 AD + mwa xcircle xdraw ;(bad) + 684 6601 AD 3B 3E 85 82 mva ycircle ydraw ;(bad) + 685 + 686 ; finally a little explosion + 687 6606 20 44 71 jsr CalculateExplosionRange + 688 6609 4C 96 63 jmp xmissile + 689 660C 60 rts + 690 ; -------------------------------------------------- + 691 660D ofdirt ; + 692 ; -------------------------------------------------- + 693 ; makes dirt on xdraw,ydraw position and of ExplosionRadius height + 694 660D A5 80 8D 39 3E A5 + mwa xdraw xcircle + 695 6617 A5 82 8D 3B 3E mva ydraw ycircle + 696 661C A9 01 lda #1 + 697 ; current dirt width + 698 661E 8D 2D 3E sta magic + 699 6621 8D CA 3E sta color + 700 6624 NextRow + 701 6624 wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 6624 AD 0B D4 LDA VCOUNT + 4 6627 8D 0A D4 STA WSYNC + 5 662A 8D 0A D4 STA WSYNC + 6 662D 8D 0A D4 STA WSYNC + 7 6630 CD 0B D4 ?WA CMP VCOUNT + 8 6633 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 702 6635 AC 2D 3E ldy magic + 703 6638 NextLine + 704 6638 AD 0A D2 lda random + 705 663B 29 01 and #$01 + 706 663D F0 09 beq DoNotPlot + 707 663F 8C 2E 3E sty magic+1 + 708 6642 20 0C 89 jsr plot + 709 6645 AC 2E 3E ldy magic+1 + 710 6648 DoNotPlot + 711 6648 18 A5 80 69 01 85 + adw xdraw #1 + 712 6653 88 dey + 713 6654 D0 E2 bne NextLine + 714 6656 C6 82 dec ydraw ; 1 line up + 715 6658 A5 82 lda ydraw + 716 665A C9 FF cmp #$ff + 717 665C F0 24 beq EndOfTheDirt ;if horizontal Counter wraps + 718 665E EE 2D 3E inc magic ; width+2 + 719 6661 EE 2D 3E inc magic + 720 6664 AD 2D 3E lda magic + 721 6667 8D 2E 3E sta magic+1 ; just for a second + 722 666A 4E 2E 3E lsr magic+1 + 723 666D 38 sec + 724 666E AD 39 3E lda xcircle + 725 6671 ED 2E 3E sbc magic+1 + 726 6674 85 80 sta xdraw + 727 6676 AD 3A 3E lda xcircle+1 + 728 6679 E9 00 sbc #0 + 729 667B 85 81 sta xdraw+1 ; new starting coordinate in a given row + 730 667D CE 49 3F dec ExplosionRadius + 731 6680 D0 A2 bne NextRow + 732 6682 EndOfTheDirt + 733 6682 AD 39 3E 85 80 AD + mwa xcircle xdraw + 734 668C AD 3B 3E 85 82 mva ycircle ydraw + 735 6691 60 rts + 736 ;-------------------------------------------------- + 737 6692 BeforeFire .proc ;TankNr (byte) + 738 ;-------------------------------------------------- + 739 ;this nice routine makes the whole shooting + 740 ;preparation: aiming and displaying + 741 ;angle and shooting force values + 742 ; + 743 + 744 ;first, get current parameters (angle+force) + 745 ;for an active tank and display them + 746 ;(these values are taken from the previous round) + 747 + 748 6692 A6 8B ldx TankNr + 749 + 750 ;Checking the maximal force + 751 6694 BD 7C 3D lda MaxEnergyTableH,x + 752 6697 DD 70 3D cmp EnergyTableH,x + 753 669A D0 06 bne ContinueToCheckMaxForce2 + 754 669C BD 76 3D lda MaxEnergyTableL,x + 755 669F DD 6A 3D cmp EnergyTableL,x + 756 66A2 ContinueToCheckMaxForce2 + 757 66A2 B0 0C bcs skip15 + 758 + 759 66A4 BD 7C 3D lda MaxEnergyTableH,x + 760 66A7 9D 70 3D sta EnergyTableH,x + 761 66AA BD 76 3D lda MaxEnergyTableL,x + 762 66AD 9D 6A 3D sta EnergyTableL,x + 763 + 764 66B0 skip15 + 765 66B0 20 4B 7F jsr DisplayingSymbols ;all digital values like force, angle, wind, etc. + 766 66B3 20 55 80 jsr PutTankNameOnScreen + 767 + 768 66B6 20 F9 84 jsr DrawTankNr + 769 + 770 66B9 wait ; best after drawing a tank +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 66B9 AD 0B D4 LDA VCOUNT + 4 66BC 8D 0A D4 STA WSYNC + 5 66BF 8D 0A D4 STA WSYNC + 6 66C2 8D 0A D4 STA WSYNC + 7 66C5 CD 0B D4 ?WA CMP VCOUNT + 8 66C8 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 771 ;wait + 772 + 773 + 774 ;keyboard reading + 775 ; KBCODE keeps code of last keybi + 776 ; SKSTAT $ff - nothing pressed + 777 ; $FB - any key + 778 ; $f7 - shift + 779 ; $f3 - shift+key + 780 + 781 66CA notpressed + 782 66CA AD 0F D2 lda SKSTAT + 783 66CD C9 FF cmp #$ff + 784 66CF F0 47 beq checkJoy + 785 66D1 C9 F7 cmp #$f7 + 786 66D3 F0 43 beq checkJoy + 787 + 788 66D5 AD 09 D2 lda kbcode + 789 66D8 29 BF and #$Bf + 790 66DA C9 8E cmp #$8e + 791 66DC D0 03 4C 61 67 jeq CTRLPressedUp + 792 66E1 C9 8F cmp #$8f + 793 66E3 D0 03 4C 90 67 jeq CTRLPressedDown + 794 66E8 C9 AC cmp #$ac + 795 66EA D0 03 4C 09 68 jeq CTRLPressedTAB + 796 + 797 66EF 29 3F and #$3f ;CTRL and SHIFT ellimination + 798 66F1 jumpFromStick + 799 66F1 C9 0E cmp #$e + 800 66F3 F0 40 jeq pressedUp + 801 66F5 C9 0F cmp #$f + 802 66F7 F0 7B jeq pressedDown + 803 66F9 C9 06 cmp #$6 + 804 66FB D0 03 4C A8 67 jeq pressedLeft + 805 6700 C9 07 cmp #$7 + 806 6702 D0 03 4C CA 67 jeq pressedRight + 807 6707 C9 21 cmp #$21 + 808 6709 D0 03 4C 23 68 jeq pressedSpace + 809 670E C9 2C cmp #$2c + 810 6710 D0 03 4C EA 67 jeq pressedTAB + 811 6715 4C CA 66 jmp notpressed + 812 6718 checkJoy + 813 ;------------JOY------------- + 814 ;happy happy joy joy + 815 ;check for joystick now + 816 6718 AD 78 02 lda JSTICK0 + 817 671B 29 0F and #$0f + 818 671D C9 0F cmp #$0f + 819 671F F0 07 beq notpressedJoy + 820 6721 A8 tay + 821 6722 B9 99 50 lda joyToKeyTable,y + 822 6725 4C F1 66 jmp jumpFromStick + 823 6728 notpressedJoy + 824 ;fire + 825 6728 AD 10 D0 lda TRIG0 + 826 672B D0 05 bne JNotFire + 827 672D A9 21 lda #$21 + 828 672F 4C F1 66 jmp jumpFromStick + 829 6732 JNotFire + 830 6732 4C CA 66 jmp notpressed + 831 ; + 832 6735 pressedUp + 833 ;force increaseeee! + 834 6735 A6 8B ldx TankNr + 835 6737 FE 6A 3D inc EnergyTableL,x + 836 673A D0 03 bne CheckingMaxForce + 837 673C FE 70 3D inc EnergyTableH,x + 838 673F CheckingMaxForce + 839 673F BD 7C 3D lda MaxEnergyTableH,x + 840 6742 DD 70 3D cmp EnergyTableH,x + 841 6745 D0 06 bne FurtherCheckMaxForce + 842 6747 BD 76 3D lda MaxEnergyTableL,x + 843 674A DD 6A 3D cmp EnergyTableL,x + 844 674D FurtherCheckMaxForce + 845 674D 90 03 4C 92 66 jcs BeforeFire + 846 + 847 6752 BD 7C 3D lda MaxEnergyTableH,x + 848 6755 9D 70 3D sta EnergyTableH,x + 849 6758 BD 76 3D lda MaxEnergyTableL,x + 850 675B 9D 6A 3D sta EnergyTableL,x + 851 + 852 675E 4C 92 66 jmp BeforeFire + 853 + 854 6761 CTRLPressedUp + 855 6761 A6 8B ldx TankNr + 856 6763 BD 6A 3D lda EnergyTableL,x + 857 6766 18 clc + 858 6767 69 0A adc #10 + 859 6769 9D 6A 3D sta EnergyTableL,x + 860 676C 90 D1 bcc CheckingMaxForce + 861 676E FE 70 3D inc EnergyTableH,x + 862 6771 4C 3F 67 jmp CheckingMaxForce + 863 + 864 + 865 6774 pressedDown + 866 6774 A6 8B ldx TankNr + 867 6776 DE 6A 3D dec EnergyTableL,x + 868 6779 BD 6A 3D lda EnergyTableL,x + 869 677C C9 FF cmp #$ff + 870 677E D0 0D bne skip04 + 871 6780 DE 70 3D dec EnergyTableH,x + 872 6783 10 08 bpl skip04 + 873 6785 ForceGoesZero + 874 6785 A9 00 lda #0 + 875 6787 9D 70 3D sta EnergyTableH,x + 876 678A 9D 6A 3D sta EnergyTableL,x + 877 678D skip04 + 878 678D 4C 92 66 jmp BeforeFire + 879 + 880 6790 CTRLPressedDown + 881 6790 A6 8B ldx TankNr + 882 6792 38 sec + 883 6793 BD 6A 3D lda EnergyTableL,x + 884 6796 E9 0A sbc #10 + 885 6798 9D 6A 3D sta EnergyTableL,x + 886 679B 90 03 4C 92 66 jcs BeforeFire + 887 67A0 DE 70 3D dec EnergyTableH,x + 888 67A3 30 E0 bmi ForceGoesZero + 889 67A5 4C 92 66 jmp BeforeFire + 890 + 891 67A8 pressedLeft + 892 67A8 A6 8B ldx TankNr + 893 67AA DE 82 3D dec AngleTable,x + 894 67AD BD 82 3D lda AngleTable,x + 895 67B0 C9 FF cmp #$ff ; if angle goes through 0 we clear the barrel + 896 67B2 D0 07 bne NotThrough90DegreesLeft + 897 67B4 A9 2E 85 88 mva #$2e CharCode + 898 67B8 20 23 85 jsr drawtankNrX + 899 67BB NotThrough90DegreesLeft + 900 67BB C9 A4 cmp #(255-91) + 901 67BD F0 03 4C 92 66 jne BeforeFire + 902 67C2 A9 5A lda #90 + 903 67C4 9D 82 3D sta AngleTable,x + 904 67C7 4C 92 66 jmp BeforeFire + 905 + 906 67CA pressedRight + 907 67CA A6 8B ldx TankNr + 908 67CC FE 82 3D INC AngleTable,x + 909 67CF BD 82 3D lda AngleTable,x + 910 67D2 D0 07 bne NotThrough90DegreesRight + 911 67D4 A9 30 85 88 mva #$30 CharCode ; if angle goes through 0 we clear the barrel + 912 67D8 20 23 85 jsr drawtankNrX + 913 67DB NotThrough90DegreesRight + 914 67DB C9 5B cmp #91 + 915 67DD F0 03 4C 92 66 jne BeforeFire + 916 67E2 A9 A5 lda #(255-90) + 917 67E4 9D 82 3D sta AngleTable,x + 918 67E7 4C 92 66 jmp BeforeFire + 919 + 920 67EA pressedTAB + 921 67EA A6 8B ldx TankNr + 922 67EC FE 89 3D inc ActiveWeapon,x + 923 67EF BD 89 3D lda ActiveWeapon,x + 924 67F2 C9 30 cmp #$30 ; number of offensive weapons + 925 67F4 D0 05 bne skip14 + 926 67F6 A9 00 lda #0 + 927 67F8 9D 89 3D sta ActiveWeapon,x + 928 67FB skip14 + 929 67FB BD 89 3D lda ActiveWeapon,x + 930 67FE 20 E5 71 jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 931 6801 F0 E7 beq pressedTAB + 932 6803 20 BF 83 jsr WaitForKeyRelease + 933 6806 4C 92 66 jmp BeforeFire + 934 + 935 6809 CTRLpressedTAB + 936 6809 A6 8B ldx TankNr + 937 680B DE 89 3D dec ActiveWeapon,x + 938 680E 10 05 bpl skip14CT + 939 6810 A9 2F lda #$2f ; the last possible offensive weapon + 940 6812 9D 89 3D sta ActiveWeapon,x + 941 6815 skip14CT + 942 6815 BD 89 3D lda ActiveWeapon,x + 943 6818 20 E5 71 jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + 944 681B F0 EC beq CTRLpressedTAB + 945 681D 20 BF 83 jsr WaitForKeyRelease + 946 6820 4C 92 66 jmp BeforeFire + 947 + 948 + 949 6823 pressedSpace + 950 ;================================= + 951 ;we shoot here!!! + 952 6823 60 RTS + 953 .endp + 954 + 955 ;-------------------------------------------------- + 956 6824 Shoot .proc ;TankNr (byte) + 957 ;-------------------------------------------------- + 958 ;it looks like this routine is too big - + 959 ;- more and more functions were being added... + 960 ;good idea would be to rewrite it completely + 961 ;with much more separate blocks, but you know - + 962 ;- do not touch it if it works... + 963 + 964 ;the latest addition to this routine is + 965 ;displaying offensive texts! + 966 + 967 6824 RandomizeOffensiveText + 968 6824 AD 0A D2 lda random + 969 6827 C9 36 cmp #talk.NumberOfOffensiveTexts + 970 6829 B0 F9 bcs RandomizeOffensiveText + 971 + 972 682B 8D DC 44 sta TextNumberOff + 973 682E A4 8B ldy TankNr + 974 6830 A9 01 8D 51 48 mva #1 plot4x4color + 975 6835 20 10 7C jsr DisplayOffensiveTextNr + 976 + 977 + 978 6838 A6 8B ldx TankNr + 979 683A BD 89 3D lda ActiveWeapon,x + 980 683D C9 20 cmp #$20 ; laser + 981 683F D0 0F bne NotStrongShoot + 982 6841 A9 00 8D CA 3E mva #0 color + 983 6846 A9 07 lda #7 + 984 6848 8D 81 3E sta Force + 985 684B 8D 82 3E sta Force+1 + 986 684E D0 0C bne AfterStrongShoot + 987 6850 NotStrongShoot + 988 6850 BD 6A 3D lda EnergyTableL,x + 989 6853 8D 81 3E sta Force + 990 6856 BD 70 3D lda EnergyTableH,x + 991 6859 8D 82 3E sta Force+1 + 992 685C AfterStrongShoot + 993 685C A9 00 lda #$0 + 994 685E 8D 83 3E sta Force+2 + 995 6861 BD 82 3D lda AngleTable,x + 996 6864 8D 80 3E sta Angle + 997 + 998 6867 A9 00 lda #0 + 999 6869 8D 74 3E sta xtraj + 1000 686C 8D 77 3E sta ytraj + 1001 + 1002 ; Shoots tank nr X !!! :) + 1003 ;ldx TankNr + 1004 686F BD 97 3D lda xtankstableL,x + 1005 6872 8D 75 3E sta xtraj+1 + 1006 6875 BD 9D 3D lda xtankstableH,x + 1007 6878 8D 76 3E sta xtraj+2 + 1008 687B BD A3 3D lda ytankstable,x + 1009 687E 8D 78 3E sta ytraj+1 + 1010 6881 A9 00 lda #$00 + 1011 6883 8D 79 3E sta ytraj+2 + 1012 + 1013 ; correction of the starting coordinates of bullet + 1014 ; to start where the tank's barrel ends + 1015 ; (without it bullet would go from the left lower corner of the tank) + 1016 6886 AC 80 3E ldy Angle + 1017 6889 18 clc + 1018 688A AD 75 3E lda xtraj+1 + 1019 688D 79 69 49 adc EndOfTheBarrelX,y ; correction of X + 1020 ;adc #4 + 1021 6890 8D 75 3E sta xtraj+1 + 1022 6893 AD 76 3E lda xtraj+2 + 1023 6896 69 00 adc #0 + 1024 6898 8D 76 3E sta xtraj+2 + 1025 689B 38 sec + 1026 689C AD 78 3E lda ytraj+1 + 1027 689F F9 69 4A sbc EndOfTheBarrelY,y ; correction of Y + 1028 ;sbc #7 + 1029 68A2 8D 78 3E sta ytraj+1 + 1030 68A5 AD 79 3E lda ytraj+2 + 1031 68A8 E9 00 sbc #0 + 1032 68AA 8D 79 3E sta ytraj+2 + 1033 + 1034 68AD A0 64 ldy #100 + 1035 + 1036 68AF 20 75 6A jsr Flight + 1037 68B2 A9 01 8D CA 3E mva #1 color + 1038 ;jsr WaitForKeyRelease + 1039 68B7 60 rts + 1040 .endp + 1041 + 1042 + 1043 ;-------------------------------------------------- + 1044 68B8 TankFalls .proc; + 1045 ;-------------------------------------------------- + 1046 68B8 A9 00 lda #0 + 1047 68BA 8D 3F 3E sta PreviousFall + 1048 68BD 8D 40 3E sta EndOfTheFallFlag + 1049 68C0 8D 41 3E sta Parachute + 1050 + 1051 ; let's check if the given tank has got the parachute + 1052 68C3 A9 35 lda #$35 ; parachute + 1053 68C5 20 E5 71 jsr HowManyBullets + 1054 68C8 F0 03 beq TankFallsX + 1055 68CA EE 41 3E inc Parachute + 1056 68CD TankFallsX + 1057 ; coordinates of the first pixel under the tank + 1058 68CD A6 8B ldx TankNr + 1059 68CF BD 97 3D lda XtankstableL,x + 1060 68D2 85 80 sta xdraw + 1061 68D4 BD 9D 3D lda XtankstableH,x + 1062 68D7 85 81 sta xdraw+1 + 1063 68D9 BD A3 3D lda Ytankstable,x + 1064 68DC 18 clc + 1065 68DD 69 01 adc #1 ; in this point the comment helped us! For the very first + 1066 ; time in our lives! Tada! It opens a new chapter!!! + 1067 68DF 85 82 sta ydraw + 1068 ; + 1069 68E1 A9 08 lda #08 + 1070 68E3 8D B2 3E sta mask2 ; Loop Counter + 1071 68E6 ByteBelowTank + 1072 68E6 20 5F 89 jsr point + 1073 68E9 F0 03 beq EmptyPoint2 + 1074 68EB 38 sec + 1075 68EC B0 01 bcs ROLPoint2 + 1076 68EE EmptyPoint2 + 1077 68EE 18 clc + 1078 68EF ROLPoint2 + 1079 68EF 2E AA 3E rol mask1 + 1080 68F2 18 A5 80 69 01 85 + adw xdraw #1 + 1081 68FD CE B2 3E dec mask2 + 1082 6900 D0 E4 bne ByteBelowTank + 1083 6902 AE AA 3E ldx mask1 + 1084 6905 BD 69 48 lda WhereToSlideTable,x + 1085 6908 8D 3E 3E sta IfFallDown ; taking directions of falling down from the table + 1086 690B D0 15 bne ItStillFalls + 1087 ; Tank falling down already finished, but it is not sure that + 1088 ; the horizontal coordinate is even. + 1089 ; If it is odd then it must be corrected because otherwise + 1090 ; P/M graphics background would not look OK + 1091 690D A6 8B ldx TankNr + 1092 690F BD 97 3D lda XtanksTableL,x + 1093 6912 29 01 and #$01 + 1094 6914 D0 03 4C 40 6A jeq EndOfFall ; if it is even then it is the end + 1095 ; and if not, we push it one pixel the way it was falling before + 1096 6919 AD 3F 3E lda PreviousFall + 1097 691C 8D 3E 3E sta IfFallDown + 1098 691F EE 40 3E inc EndOfTheFallFlag ; because after this correction is shouldn't fall anymore + 1099 + 1100 ; we have 3 bits: 0 - go down, 1 - go right, 2 - go left + 1101 ;--- + 1102 6922 ItStillFalls + 1103 6922 AD 41 3E lda Parachute + 1104 6925 29 01 and #1 + 1105 6927 D0 1A bne ParachutePresent + 1106 ; decreasing energy - if the vertical fall, substract 2 + 1107 ; and if at an angle then substract 1 + 1108 6929 A0 01 ldy #1 ; how much energy to substract + 1109 692B AD 3E 3E lda IfFallDown + 1110 692E 29 01 and #1 + 1111 6930 F0 11 beq NoFallingDown + 1112 6932 A6 8B ldx TankNr + 1113 6934 20 F5 71 jsr DecreaseEnergyX + 1114 6937 AD 3E 3E lda IfFallDown + 1115 693A 29 06 and #6 + 1116 693C D0 05 bne FallDiagonally + 1117 693E A6 8B ldx TankNr + 1118 6940 20 F5 71 jsr DecreaseEnergyX + 1119 6943 FallDiagonally + 1120 6943 NoFallingDown + 1121 6943 ParachutePresent + 1122 ; we must set flag meaning that the tank was falling down + 1123 ; because later maybe the number of parachutes will decrease + 1124 ; (if there were parachutes and they were ON) + 1125 + 1126 6943 AD 41 3E lda Parachute + 1127 6946 09 02 ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + 1128 6948 8D 41 3E sta Parachute + 1129 + 1130 ; storing last direction of falling + 1131 ; (it is not necessarily the direction from the previous + 1132 ; iteraction, so we must check directional bits before storing) + 1133 694B AD 3E 3E lda IfFallDown + 1134 694E 29 06 and #$06 + 1135 6950 F0 03 beq FallStraightDown + 1136 6952 8D 3F 3E sta PreviousFall + 1137 6955 FallStraightDown + 1138 6955 AD 41 3E lda Parachute + 1139 6958 29 01 and #01 + 1140 695A F0 11 beq RapidFalling + 1141 695C wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 695C AD 0B D4 LDA VCOUNT + 4 695F 8D 0A D4 STA WSYNC + 5 6962 8D 0A D4 STA WSYNC + 6 6965 8D 0A D4 STA WSYNC + 7 6968 CD 0B D4 ?WA CMP VCOUNT + 8 696B D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 1142 696D RapidFalling + 1143 ; we finish falling down if the tank reached the edge of the screen + 1144 ; but if it falls straight down or the other way than the edge, + 1145 ; then continue falling! + 1146 696D A6 8B ldx TankNr + 1147 696F BD 97 3D lda XtanksTableL,x + 1148 6972 D0 0F bne NotLeftEdge + 1149 6974 BD 9D 3D lda XtanksTableH,x + 1150 6977 D0 0A bne NotLeftEdge + 1151 6979 AD 3E 3E lda IfFallDown + 1152 697C 29 04 and #$04 ; check if it does not fall left + 1153 697E F0 03 4C 40 6A jne EndOfFall ; if so then maybe we finish + 1154 6983 NotLeftEdge + 1155 6983 18 clc + 1156 6984 BD 97 3D lda XtanksTableL,x + 1157 6987 69 08 adc #$08 ; we'll check right side of the char + 1158 6989 85 91 sta temp + 1159 698B BD 9D 3D lda XtanksTableH,x + 1160 698E 69 00 adc #0 + 1161 6990 85 92 sta temp+1 + 1162 6992 A5 92 C9 01 D0 04 + cpw temp #screenwidth + 1163 699C D0 0A bne NotRightEdge + 1164 699E AD 3E 3E lda IfFallDown + 1165 69A1 29 02 and #$02 ; check if it does not fall right + 1166 69A3 F0 03 4C 40 6A jne EndOfFall ; if so then maybe we finish + 1167 69A8 NotRightEdge + 1168 ; clear previous position + 1169 69A8 A9 01 8D FB 3D mva #1 Erase + 1170 69AD 20 F9 84 jsr DrawTankNr + 1171 ; and the parachute (if present) + 1172 69B0 AD 41 3E lda Parachute + 1173 69B3 29 01 and #01 + 1174 69B5 F0 1B beq DoNotClearParachute + 1175 ; here we clear the parachute + 1176 69B7 A6 8B ldx TankNr + 1177 69B9 A9 34 lda #$34 + 1178 69BB 85 88 sta CharCode + 1179 69BD BD A3 3D lda Ytankstable,x + 1180 69C0 38 sec + 1181 69C1 E9 08 sbc #8 + 1182 69C3 85 82 sta ydraw + 1183 69C5 BD 97 3D lda XtanksTableL,x + 1184 69C8 85 80 sta xdraw + 1185 69CA BD 9D 3D lda XtanksTableH,x + 1186 69CD 85 81 sta xdraw+1 + 1187 69CF 20 FE 89 jsr TypeChar + 1188 69D2 DoNotClearParachute + 1189 69D2 A9 00 8D FB 3D mva #0 Erase + 1190 69D7 A6 8B ldx TankNr + 1191 69D9 4E 3E 3E lsr IfFallDown ; bit nr 0 (down) + 1192 69DC 90 09 bcc DoesNotFallDown + 1193 ; tank is falling down + 1194 69DE BD A3 3D lda Ytankstable,x + 1195 69E1 18 clc + 1196 69E2 69 01 adc #1 + 1197 69E4 9D A3 3D sta Ytankstable,x + 1198 69E7 DoesNotFallDown + 1199 69E7 4E 3E 3E lsr IfFallDown ; bit nr 1 (right) + 1200 69EA 90 11 bcc DoesNotFallLeft + 1201 ; tank is falling left + 1202 69EC 18 clc + 1203 69ED BD 97 3D lda XtankstableL,x + 1204 69F0 69 01 adc #1 + 1205 69F2 9D 97 3D sta XtankstableL,x + 1206 69F5 BD 9D 3D lda XtankstableH,x + 1207 69F8 69 00 adc #0 + 1208 69FA 9D 9D 3D sta XtankstableH,x + 1209 69FD DoesNotFallLeft + 1210 69FD 4E 3E 3E lsr IfFallDown ; bit nr 2 (left) + 1211 6A00 90 11 bcc DoesNotFallRight + 1212 ; tank is falling right + 1213 6A02 38 sec + 1214 6A03 BD 97 3D lda XtankstableL,x + 1215 6A06 E9 01 sbc #1 + 1216 6A08 9D 97 3D sta XtankstableL,x + 1217 6A0B BD 9D 3D lda XtankstableH,x + 1218 6A0E E9 00 sbc #0 + 1219 6A10 9D 9D 3D sta XtankstableH,x + 1220 6A13 DoesNotFallRight + 1221 6A13 20 F9 84 jsr DrawTankNr + 1222 + 1223 ; checking is parachute present and if so, draw it + 1224 6A16 AD 41 3E lda Parachute + 1225 6A19 29 01 and #01 + 1226 6A1B F0 1B beq DoNotDrawParachute + 1227 + 1228 ; here we draw parachute + 1229 6A1D A6 8B ldx TankNr + 1230 6A1F A9 34 lda #$34 + 1231 6A21 85 88 sta CharCode + 1232 6A23 BD A3 3D lda Ytankstable,x + 1233 6A26 38 sec + 1234 6A27 E9 08 sbc #8 + 1235 6A29 85 82 sta ydraw + 1236 6A2B BD 97 3D lda XtanksTableL,x + 1237 6A2E 85 80 sta xdraw + 1238 6A30 BD 9D 3D lda XtanksTableH,x + 1239 6A33 85 81 sta xdraw+1 + 1240 6A35 20 FE 89 jsr TypeChar + 1241 6A38 DoNotDrawParachute + 1242 6A38 AD 40 3E lda EndOfTheFallFlag + 1243 6A3B D0 03 4C CD 68 jeq TankFallsX + 1244 + 1245 6A40 EndOfFall + 1246 6A40 20 F9 84 jsr DrawTankNr + 1247 + 1248 ; if tank was falling down having parachute, + 1249 ; we must deduct one parachute + 1250 6A43 AD 41 3E lda Parachute + 1251 6A46 C9 03 cmp #$03 ; was falling down and the parachute + 1252 6A48 D0 2A bne ThereWasNoParachute + 1253 ; first we clear parachute on the screen + 1254 6A4A A9 01 8D FB 3D mva #1 Erase + 1255 6A4F A6 8B ldx TankNr + 1256 6A51 A9 34 lda #$34 + 1257 6A53 85 88 sta CharCode + 1258 6A55 BD A3 3D lda Ytankstable,x + 1259 6A58 38 sec + 1260 6A59 E9 08 sbc #8 + 1261 6A5B 85 82 sta ydraw + 1262 6A5D BD 97 3D lda XtanksTableL,x + 1263 6A60 85 80 sta xdraw + 1264 6A62 BD 9D 3D lda XtanksTableH,x + 1265 6A65 85 81 sta xdraw+1 + 1266 6A67 20 FE 89 jsr TypeChar + 1267 6A6A A9 00 8D FB 3D mva #0 Erase + 1268 ; now we can deduct one parachute from the list of weapons + 1269 + 1270 6A6F A9 35 lda #$35 ; parachute + 1271 6A71 20 DC 71 jsr DecreaseWeapon + 1272 6A74 ThereWasNoParachute + 1273 6A74 60 rts + 1274 .endp + 1275 ;-------------------------------------------------- + 1276 6A75 Flight .proc ;Force(byte.byte), Angle(byte), Wind(.byte) 128=0, 255=maxright, 0=maxleft + 1277 ;-------------------------------------------------- + 1278 + 1279 ;g=-0.1 + 1280 ;vx=Force*sin(Angle) + 1281 ;vy=Force*cos(Angle) + 1282 ; + 1283 ;:begin + 1284 ;ytraj=ytray-vy + 1285 ;vy=vy-g + 1286 ;xtraj=xtraj+vx - without Wind + 1287 ;vx=vx+Wind (Wind is a small fraction) + 1288 ;plot xtraj,ytraj - there is clearing in plot + 1289 ;goto begin + 1290 + 1291 ; smoke tracer :) + 1292 6A75 A0 00 ldy #0 + 1293 6A77 A6 8B ldx TankNr + 1294 6A79 BD 89 3D lda ActiveWeapon,x + 1295 6A7C C9 0B cmp #11 ; Smoke tracer + 1296 6A7E D0 01 bne noSmokeTracer + 1297 6A80 C8 iny + 1298 6A81 noSmokeTracer + 1299 6A81 8C 6B 3E sty SmokeTracerFlag + 1300 + 1301 6A84 RepeatIfSmokeTracer + 1302 6A84 AD 78 3E 8D 7E 3E + mwa ytraj+1 Ytrajold+1 + 1303 6A90 AD 75 3E 8D 7B 3E + mwa xtraj+1 Xtrajold+1 + 1304 6A9C A9 68 8D 2F 3E A9 + mwa #DrawCheck DrawJumpAddr + 1305 + 1306 6AA6 A9 00 lda #0 + 1307 6AA8 8D 89 3E sta Result + 1308 6AAB 8D 8A 3E sta Result+1 + 1309 6AAE 8D 8B 3E sta Result+2 + 1310 6AB1 8D 96 3D sta HitFlag + 1311 6AB4 85 80 sta xdraw + 1312 6AB6 85 81 sta xdraw+1 + 1313 6AB8 85 82 sta ydraw + 1314 6ABA 85 83 sta ydraw+1 + 1315 + 1316 ;vx calculation + 1317 6ABC aslw Force ;Force=Force*4 ... *2 +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 6ABC 0E 81 3E ASL FORCE + 2 6ABF 2E 82 3E ROL FORCE+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 1318 ;aslw Force + 1319 + 1320 ;sin(Angle) + 1321 6AC2 AE 80 3E ldx Angle + 1322 6AC5 8E 4E 3F stx LeapFrogAngle ; we will need it later + 1323 + 1324 ;Angle works like this: + 1325 ;0 'degrees' is sraight up + 1326 ;90 'degrees' is horizontally right + 1327 ;255 is straight up (same as 0) + 1328 ;255-90 (165) horizontally left + 1329 + 1330 6AC8 10 15 bpl FlightRight + 1331 + 1332 ;and if the highest bit is set then + 1333 ;Flight to LEFT + 1334 ;calculate Angle with this formula: + 1335 ;Angle=90-(Angle-165) + 1336 + 1337 6ACA 38 sec + 1338 6ACB 8A txa + 1339 6ACC E9 A5 sbc #165 ;(Angle-165) + 1340 6ACE 85 91 sta temp ;dirty trick with selfmodifying code (REMOVED) + 1341 6AD0 A9 5A lda #90 ; + 1342 6AD2 E5 91 sbc temp ;90-(Angle-165) + 1343 ;and we have rady angle here ... and we go LEFT! + 1344 6AD4 AA tax + 1345 6AD5 8D 80 3E sta Angle + 1346 6AD8 A9 01 8D 8C 3E mva #1 goleft + 1347 ; and now we contine as if nothing happened + 1348 ; (but we have goleft set to 1!!!) + 1349 6ADD D0 05 bne dontzerogoleft + 1350 + 1351 6ADF FlightRight + 1352 6ADF A9 00 8D 8C 3E mva #0 goleft + 1353 + 1354 6AE4 dontzerogoleft + 1355 + 1356 6AE4 BD 01 46 lda sintable,x ;sin(Angle) + 1357 6AE7 8D 87 3E sta Multiplee ;sin(Angle)*Force + 1358 6AEA AD 81 3E 8D 84 3E + mwa Force Multiplier + 1359 6AF6 A9 00 lda #$0 + 1360 6AF8 8D 86 3E sta Multiplier+2 + 1361 6AFB A2 08 ldx #8 + 1362 6AFD MultiplyLoop + 1363 6AFD 6E 87 3E ror Multiplee + 1364 6B00 90 1C bcc DoNotAdd + 1365 6B02 18 clc + 1366 6B03 AD 84 3E lda Multiplier + 1367 6B06 6D 89 3E adc Result + 1368 6B09 8D 89 3E sta Result + 1369 6B0C AD 85 3E lda Multiplier+1 + 1370 6B0F 6D 8A 3E adc Result+1 + 1371 6B12 8D 8A 3E sta Result+1 + 1372 6B15 AD 86 3E lda Multiplier+2 + 1373 6B18 6D 8B 3E adc Result+2 + 1374 6B1B 8D 8B 3E sta Result+2 + 1375 6B1E DoNotAdd + 1376 ;clc ;carry always cleared here (anyway we hope so :) + 1377 6B1E 2E 84 3E rol Multiplier + 1378 6B21 2E 85 3E rol Multiplier+1 + 1379 6B24 2E 86 3E rol Multiplier+2 + 1380 6B27 CA dex + 1381 6B28 D0 D3 bne MultiplyLoop + 1382 ; here in Result there is a number xxxx.yyy = sin(Angle)*Force + 1383 + 1384 6B2A AD 89 3E lda Result ;vx=sin(Angle)*Force + 1385 6B2D 8D 6C 3E sta vx + 1386 6B30 AD 8A 3E lda Result+1 + 1387 6B33 8D 6D 3E sta vx+1 + 1388 6B36 AD 8B 3E lda Result+2 + 1389 6B39 8D 6E 3E sta vx+2 + 1390 6B3C A9 00 8D 6F 3E mva #0 vx+3 + 1391 + 1392 ;======vy + 1393 6B41 A9 00 lda #0 ;cos(Angle) + 1394 6B43 8D 89 3E sta Result + 1395 6B46 8D 8A 3E sta Result+1 + 1396 6B49 8D 8B 3E sta Result+2 + 1397 ;-- + 1398 6B4C AE 80 3E ldx Angle + 1399 6B4F BD 5C 46 lda costable,x + 1400 + 1401 6B52 8D 87 3E sta Multiplee ;cos(Angle)*Force + 1402 6B55 AD 81 3E 8D 84 3E + mwa Force Multiplier + 1403 6B61 A9 00 lda #$0 + 1404 6B63 8D 86 3E sta Multiplier+2 + 1405 6B66 A2 08 ldx #8 + 1406 6B68 MultiplyLoopY + 1407 6B68 6E 87 3E ror Multiplee + 1408 6B6B 90 1C bcc DoNotAddY + 1409 6B6D 18 clc + 1410 6B6E AD 84 3E lda Multiplier + 1411 6B71 6D 89 3E adc Result + 1412 6B74 8D 89 3E sta Result + 1413 6B77 AD 85 3E lda Multiplier+1 + 1414 6B7A 6D 8A 3E adc Result+1 + 1415 6B7D 8D 8A 3E sta Result+1 + 1416 6B80 AD 86 3E lda Multiplier+2 + 1417 6B83 6D 8B 3E adc Result+2 + 1418 6B86 8D 8B 3E sta Result+2 + 1419 6B89 DoNotAddY + 1420 ;clc ;carry always cleared here (anyway we hope so :) + 1421 6B89 2E 84 3E rol Multiplier + 1422 6B8C 2E 85 3E rol Multiplier+1 + 1423 6B8F 2E 86 3E rol Multiplier+2 + 1424 6B92 CA dex + 1425 6B93 D0 D3 bne MultiplyLoopY + 1426 ; here in Result there is a number xxxx.yyy=cos(Angle)*Force + 1427 + 1428 6B95 AD 89 3E lda Result ;vy=cos(Angle)*Force + 1429 6B98 8D 70 3E sta vy + 1430 6B9B AD 8A 3E lda Result+1 + 1431 6B9E 8D 71 3E sta vy+1 + 1432 6BA1 AD 8B 3E lda Result+2 + 1433 6BA4 8D 72 3E sta vy+2 + 1434 6BA7 A9 00 8D 73 3E mva #0 vy+3 + 1435 + 1436 6BAC Loopi + 1437 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 1438 6BAC 38 sec + 1439 6BAD AD 77 3E lda ytraj + 1440 6BB0 ED 71 3E sbc vy+1 + 1441 6BB3 8D 77 3E sta ytraj + 1442 6BB6 AD 78 3E lda ytraj+1 + 1443 6BB9 ED 72 3E sbc vy+2 + 1444 6BBC 8D 78 3E sta ytraj+1 + 1445 6BBF AD 79 3E lda ytraj+2 + 1446 6BC2 ED 73 3E sbc vy+3 + 1447 6BC5 8D 79 3E sta ytraj+2 + 1448 + 1449 ;vy=vy-g (again without least significant byte of vy) + 1450 6BC8 38 sec + 1451 6BC9 AD 71 3E lda vy+1 + 1452 6BCC ED 90 3D sbc gravity + 1453 6BCF 8D 71 3E sta vy+1 + 1454 6BD2 AD 72 3E lda vy+2 + 1455 6BD5 E9 00 sbc #0 + 1456 6BD7 8D 72 3E sta vy+2 + 1457 6BDA AD 73 3E lda vy+3 + 1458 6BDD E9 00 sbc #0 + 1459 6BDF 8D 73 3E sta vy+3 + 1460 6BE2 10 0C bpl StillUp + 1461 ; where we know that the bullet starts to fall down + 1462 ; we check if it is MIRV and if so, jump to MIRV routine + 1463 6BE4 A6 8B ldx TankNr + 1464 6BE6 BD 89 3D lda ActiveWeapon,x + 1465 6BE9 C9 06 cmp #6 ; MIRV + 1466 6BEB D0 03 4C D9 6D jeq MIRVdownLoop + 1467 6BF0 StillUp + 1468 6BF0 AD 8C 3E lda goleft + 1469 6BF3 D0 1F bne FlightLeft + 1470 + 1471 6BF5 18 clc ;xtraj=xtraj+vx (skipping least significant byte of vx) + 1472 6BF6 AD 74 3E lda xtraj ;here of course Fight to right + 1473 6BF9 6D 6D 3E adc vx+1 + 1474 6BFC 8D 74 3E sta xtraj + 1475 6BFF AD 75 3E lda xtraj+1 + 1476 6C02 6D 6E 3E adc vx+2 + 1477 6C05 8D 75 3E sta xtraj+1 + 1478 6C08 AD 76 3E lda xtraj+2 + 1479 6C0B 6D 6F 3E adc vx+3 + 1480 6C0E 8D 76 3E sta xtraj+2 + 1481 6C11 4C 30 6C jmp skip07 ;skipping substracting for Flight to left + 1482 + 1483 6C14 FlightLeft + 1484 6C14 38 sec ;xtraj=xtraj-vx (skipping least significant byte of vx) + 1485 6C15 AD 74 3E lda xtraj ;here of course Fight to left + 1486 6C18 ED 6D 3E sbc vx+1 + 1487 6C1B 8D 74 3E sta xtraj + 1488 6C1E AD 75 3E lda xtraj+1 + 1489 6C21 ED 6E 3E sbc vx+2 + 1490 6C24 8D 75 3E sta xtraj+1 + 1491 6C27 AD 76 3E lda xtraj+2 + 1492 6C2A ED 6F 3E sbc vx+3 + 1493 6C2D 8D 76 3E sta xtraj+2 + 1494 + 1495 6C30 skip07 + 1496 ;vx=vx-Wind (also without least significan byte of vx) + 1497 6C30 AD 8C 3E lda goleft + 1498 6C33 D0 07 bne FlightsLeft ;blow on bullet flighting left + 1499 6C35 AD 94 3D lda WindOrientation + 1500 6C38 D0 2D bne WindToLeft + 1501 6C3A F0 05 beq LWindToLeft + 1502 6C3C FlightsLeft + 1503 6C3C AD 94 3D lda WindOrientation + 1504 6C3F F0 26 beq LWindToRight + 1505 6C41 LWindToLeft + 1506 + 1507 ; here Wind to right, bullet goes right as well, so vx=vx+Wind + 1508 ; here Wind to left, bullet goes left as well, so vx=vx+Wind + 1509 6C41 18 clc + 1510 6C42 AD 6C 3E lda vx + 1511 6C45 6D 91 3D adc Wind + 1512 6C48 8D 6C 3E sta vx + 1513 6C4B AD 6D 3E lda vx+1 + 1514 6C4E 6D 92 3D adc Wind+1 + 1515 6C51 8D 6D 3E sta vx+1 + 1516 6C54 AD 6E 3E lda vx+2 + 1517 6C57 69 00 adc #0 + 1518 6C59 8D 6E 3E sta vx+2 + 1519 6C5C AD 6F 3E lda vx+3 + 1520 6C5F 69 00 adc #0 + 1521 6C61 8D 6F 3E sta vx+3 + 1522 6C64 4C 8A 6C Jmp skip08 + 1523 6C67 WindToLeft + 1524 6C67 LWindToRight + 1525 + 1526 ;Wind to left, bullet right, so vx=vx-Wind + 1527 ;Wind to right, bullet left, so vx=vx-Wind + 1528 6C67 38 sec + 1529 6C68 AD 6C 3E lda vx + 1530 6C6B ED 91 3D sbc Wind + 1531 6C6E 8D 6C 3E sta vx + 1532 6C71 AD 6D 3E lda vx+1 + 1533 6C74 ED 92 3D sbc Wind+1 + 1534 6C77 8D 6D 3E sta vx+1 + 1535 6C7A AD 6E 3E lda vx+2 + 1536 6C7D E9 00 sbc #0 + 1537 6C7F 8D 6E 3E sta vx+2 + 1538 6C82 AD 6F 3E lda vx+3 + 1539 6C85 E9 00 sbc #0 + 1540 6C87 8D 6F 3E sta vx+3 + 1541 6C8A skip08 + 1542 6C8A AD 7B 3E 85 80 AD + mwa xtrajold+1 xdraw + 1543 6C94 AD 7E 3E 85 82 AD + mwa ytrajold+1 ydraw + 1544 6C9E AD 75 3E 85 84 AD + mwa xtraj+1 xbyte + 1545 6CA8 AD 78 3E 85 86 AD + mwa ytraj+1 ybyte + 1546 6CB2 20 6A 80 jsr draw + 1547 ;key + 1548 6CB5 AD 75 3E 8D 7B 3E + mwa xtraj+1 XtrajOld+1 + 1549 6CC1 AD 78 3E 8D 7E 3E + mwa ytraj+1 YtrajOld+1 + 1550 + 1551 6CCD AD A9 3E lda tracerflag + 1552 6CD0 D0 0D bne nowait + 1553 6CD2 AD CA 3E lda color + 1554 6CD5 F0 08 beq nowait + 1555 ;wait + 1556 ;this is where program slows down the flight of a missile + 1557 ;possibly it is too slow to wait till next frame... + 1558 ;we will see. + 1559 ;---2003-08-01 yes, it is too slow!!! shorter delay + 1560 ; must be here like few sta wsync's + 1561 ; half a frame would be the best... + 1562 6CD7 A2 96 ldx #FlyDelay + 1563 6CD9 DelayLoop + 1564 6CD9 8D 0A D4 sta wsync + 1565 6CDC CA dex + 1566 6CDD D0 FA bne DelayLoop + 1567 + 1568 6CDF nowait + 1569 6CDF AD 96 3D lda HitFlag + 1570 6CE2 D0 35 bne Hit + 1571 + 1572 6CE4 AD 79 3E C9 00 D0 + cpw ytraj+1 #screenheight + 1573 6CF0 90 05 bcc YTrayLowerThanScreenHeight + 1574 6CF2 AD 79 3E lda ytraj+2 + 1575 6CF5 10 39 bpl EndOfFlight + 1576 + 1577 6CF7 YTrayLowerThanScreenHeight ; it means it is still on screen and not above + 1578 + 1579 6CF7 SkipCollisionCheck + 1580 + 1581 6CF7 AD 75 3E 85 80 AD + mwa xtraj+1 xdraw + 1582 6D01 AD 78 3E 85 82 AD + mwa ytraj+1 ydraw + 1583 + 1584 6D0B AD A9 3E lda tracerflag + 1585 6D0E D0 03 bne NoUnPlot + 1586 + 1587 6D10 20 46 88 jsr UnPlot + 1588 + 1589 6D13 NoUnPlot + 1590 6D13 20 8B 89 jsr PlotPointer + 1591 + 1592 6D16 4C AC 6B jmp Loopi + 1593 + 1594 6D19 Hit + 1595 6D19 AD 32 3E 85 80 AD + mwa XHit xdraw + 1596 6D23 AD 34 3E 85 82 AD + mwa YHit ydraw + 1597 + 1598 6D2D 20 46 88 jsr unPlot + 1599 6D30 EndOfFlight + 1600 6D30 A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store for a little while + 1601 6D3A A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw + 1602 6D3F A9 00 85 80 85 81 mwa #0 xdraw + 1603 6D45 A9 C7 85 82 mva #screenheight-1 ydraw + 1604 6D49 20 46 88 jsr unPlot + 1605 6D4C AD 39 3E 85 80 AD + mwa xcircle xdraw + 1606 6D56 AD 3B 3E 85 82 mva ycircle ydraw + 1607 + 1608 6D5B AC 6B 3E ldy SmokeTracerFlag + 1609 6D5E F0 07 beq EndOfFlight2 + 1610 6D60 88 dey + 1611 6D61 8C 6B 3E sty SmokeTracerFlag + 1612 6D64 4C 6D 6D jmp SecondFlight + 1613 6D67 EndOfFlight2 + 1614 6D67 A9 00 lda #0 ; nie wiem czemu + 1615 6D69 8D A9 3E sta tracerflag ; + 1616 6D6C 60 rts + 1617 .endp + 1618 + 1619 6D6D SecondFlight .proc + 1620 ; ---------------- przekopiowany fragment sprzed odpalenie strzału malo kulturalne..... + 1621 ; ---------------- ponownie wyznacza parametry strzału + 1622 6D6D A6 8B ldx TankNr + 1623 6D6F BD 6A 3D lda EnergyTableL,x + 1624 6D72 8D 81 3E sta Force + 1625 6D75 BD 70 3D lda EnergyTableH,x + 1626 6D78 8D 82 3E sta Force+1 + 1627 6D7B A9 00 lda #$0 + 1628 6D7D 8D 83 3E sta Force+2 + 1629 6D80 BD 82 3D lda AngleTable,x + 1630 6D83 8D 80 3E sta Angle + 1631 + 1632 6D86 A9 00 lda #0 + 1633 6D88 8D CA 3E sta color + 1634 6D8B 8D 74 3E sta xtraj + 1635 6D8E 8D 77 3E sta ytraj + 1636 + 1637 6D91 BD 97 3D lda xtankstableL,x + 1638 6D94 8D 75 3E sta xtraj+1 + 1639 6D97 BD 9D 3D lda xtankstableH,x + 1640 6D9A 8D 76 3E sta xtraj+2 + 1641 6D9D BD A3 3D lda ytankstable,x + 1642 6DA0 8D 78 3E sta ytraj+1 + 1643 6DA3 A9 00 lda #$00 + 1644 6DA5 8D 79 3E sta ytraj+2 + 1645 + 1646 6DA8 AC 80 3E ldy Angle + 1647 6DAB 18 clc + 1648 6DAC AD 75 3E lda xtraj+1 + 1649 6DAF 79 69 49 adc EndOfTheBarrelX,y ; correction of X + 1650 6DB2 8D 75 3E sta xtraj+1 + 1651 6DB5 AD 76 3E lda xtraj+2 + 1652 6DB8 69 00 adc #0 + 1653 6DBA 8D 76 3E sta xtraj+2 + 1654 6DBD 38 sec + 1655 6DBE AD 78 3E lda ytraj+1 + 1656 6DC1 F9 69 4A sbc EndOfTheBarrelY,y ; correction of Y + 1657 6DC4 8D 78 3E sta ytraj+1 + 1658 6DC7 AD 79 3E lda ytraj+2 + 1659 6DCA E9 00 sbc #0 + 1660 6DCC 8D 79 3E sta ytraj+2 + 1661 + 1662 6DCF A0 64 ldy #100 + 1663 6DD1 A9 01 lda #1 ; nie wiem (to znaczy wydaje mi sie ze wiem ;) ) + 1664 6DD3 8D A9 3E sta tracerflag ; ..... + 1665 6DD6 4C 84 6A jmp Flight.RepeatIfSmokeTracer + 1666 .endp + 1667 + 1668 ; ------------------------------------------------- + 1669 6DD9 MIRVdownLoop .proc + 1670 ; MIRV loop - here mirv bullets fall down + 1671 ; ------------------------------------------------- + 1672 ; copy Flight parameters to the table + 1673 6DD9 A2 04 ldx #4 + 1674 6DDB MIRVcopyParameters + 1675 6DDB AD 74 3E lda xtraj + 1676 6DDE 9D 42 3E sta xtraj00,x + 1677 6DE1 AD 75 3E lda xtraj+1 + 1678 6DE4 9D 47 3E sta xtraj01,x + 1679 6DE7 AD 76 3E lda xtraj+2 + 1680 6DEA 9D 4C 3E sta xtraj02,x + 1681 6DED AD 6C 3E lda vx + 1682 6DF0 9D 51 3E sta vx00,x + 1683 6DF3 AD 6D 3E lda vx+1 + 1684 6DF6 9D 56 3E sta vx01,x + 1685 6DF9 AD 6E 3E lda vx+2 + 1686 6DFC 9D 5B 3E sta vx02,x + 1687 6DFF AD 6F 3E lda vx+3 + 1688 6E02 9D 60 3E sta vx03,x + 1689 6E05 A9 00 lda #0 + 1690 6E07 9D 65 3E sta MirvDown,x + 1691 6E0A CA dex + 1692 6E0B 10 CE bpl MIRVcopyParameters + 1693 ; modification (to make bullets "split away" and go different directions) + 1694 ; bullet indexed 0 is in the middle + 1695 + 1696 ; bullet 1 + 1697 6E0D 18 clc + 1698 6E0E AD 6D 3E lda vx+1 + 1699 6E11 69 64 adc #100 + 1700 6E13 8D 57 3E sta vx01+1 + 1701 6E16 AD 6E 3E lda vx+2 + 1702 6E19 69 00 adc #0 + 1703 6E1B 8D 5C 3E sta vx02+1 + 1704 6E1E AD 6F 3E lda vx+3 + 1705 6E21 69 00 adc #0 + 1706 6E23 8D 61 3E sta vx03+1 + 1707 ; bullet 2 + 1708 6E26 38 sec + 1709 6E27 AD 6D 3E lda vx+1 + 1710 6E2A E9 64 sbc #100 + 1711 6E2C 8D 58 3E sta vx01+2 + 1712 6E2F AD 6E 3E lda vx+2 + 1713 6E32 E9 00 sbc #0 + 1714 6E34 8D 5D 3E sta vx02+2 + 1715 6E37 AD 6F 3E lda vx+3 + 1716 6E3A E9 00 sbc #0 + 1717 6E3C 8D 62 3E sta vx03+2 + 1718 ; bullet 3 + 1719 6E3F 18 clc + 1720 6E40 AD 6D 3E lda vx+1 + 1721 6E43 69 C8 adc #200 + 1722 6E45 8D 59 3E sta vx01+3 + 1723 6E48 AD 6E 3E lda vx+2 + 1724 6E4B 69 00 adc #0 + 1725 6E4D 8D 5E 3E sta vx02+3 + 1726 6E50 AD 6F 3E lda vx+3 + 1727 6E53 69 00 adc #0 + 1728 6E55 8D 63 3E sta vx03+3 + 1729 ; bullet 4 + 1730 6E58 38 sec + 1731 6E59 AD 6D 3E lda vx+1 + 1732 6E5C E9 C8 sbc #200 + 1733 6E5E 8D 5A 3E sta vx01+4 + 1734 6E61 AD 6E 3E lda vx+2 + 1735 6E64 E9 00 sbc #0 + 1736 6E66 8D 5F 3E sta vx02+4 + 1737 6E69 AD 6F 3E lda vx+3 + 1738 6E6C E9 00 sbc #0 + 1739 6E6E 8D 64 3E sta vx03+4 + 1740 + 1741 ; clearing ranges of soil down registers + 1742 6E71 A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft + 1743 6E7B A9 00 lda #0 + 1744 6E7D 8D FE 3D sta RangeRight + 1745 6E80 8D FF 3D sta RangeRight+1 + 1746 + 1747 6E83 A2 FF ldx #$FF ; it will turn 0 in a moment anyway + 1748 6E85 8E 6A 3E stx MirvMissileCounter + 1749 6E88 mrLoopi + 1750 6E88 EE 6A 3E inc MirvMissileCounter + 1751 6E8B AD 6A 3E lda MirvMissileCounter + 1752 6E8E C9 05 cmp #5 + 1753 6E90 D0 05 bne mrLoopix + 1754 6E92 A9 00 8D 6A 3E mva #0 MirvMissileCounter + 1755 6E97 mrLoopix + 1756 6E97 AE 6A 3E ldx MirvMissileCounter + 1757 ; Y changes only for bullet number 0 + 1758 ; because rest of the bullets have the same Y (height) + 1759 + 1760 6E9A D0 58 bne MIRVdoNotChangeY + 1761 ; Y is the same for all falling bullets + 1762 ;ytraj=ytraj-vy (skipping least significant byte of vy) + 1763 6E9C 38 sec + 1764 6E9D AD 77 3E lda ytraj + 1765 6EA0 ED 71 3E sbc vy+1 + 1766 6EA3 8D 77 3E sta ytraj + 1767 6EA6 AD 78 3E lda ytraj+1 + 1768 6EA9 ED 72 3E sbc vy+2 + 1769 6EAC 8D 78 3E sta ytraj+1 + 1770 6EAF AD 79 3E lda ytraj+2 + 1771 6EB2 ED 73 3E sbc vy+3 + 1772 6EB5 8D 79 3E sta ytraj+2 + 1773 + 1774 ;vy=vy-g (also without least significan byte of vy) + 1775 6EB8 38 sec + 1776 6EB9 AD 71 3E lda vy+1 + 1777 6EBC ED 90 3D sbc gravity + 1778 6EBF 8D 71 3E sta vy+1 + 1779 6EC2 AD 72 3E lda vy+2 + 1780 6EC5 E9 00 sbc #0 + 1781 6EC7 8D 72 3E sta vy+2 + 1782 6ECA AD 73 3E lda vy+3 + 1783 6ECD E9 00 sbc #0 + 1784 6ECF 8D 73 3E sta vy+3 + 1785 + 1786 ; 3 waits for 5 bullets (will be faster) + 1787 6ED2 wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 6ED2 AD 0B D4 LDA VCOUNT + 4 6ED5 8D 0A D4 STA WSYNC + 5 6ED8 8D 0A D4 STA WSYNC + 6 6EDB 8D 0A D4 STA WSYNC + 7 6EDE CD 0B D4 ?WA CMP VCOUNT + 8 6EE1 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 1788 ;wait + 1789 6EE3 wait +Macro: WAIT [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 6EE3 AD 0B D4 LDA VCOUNT + 4 6EE6 8D 0A D4 STA WSYNC + 5 6EE9 8D 0A D4 STA WSYNC + 6 6EEC 8D 0A D4 STA WSYNC + 7 6EEF CD 0B D4 ?WA CMP VCOUNT + 8 6EF2 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\weapons.asm + 1790 + 1791 6EF4 MIRVdoNotChangeY + 1792 + 1793 6EF4 BD 65 3E lda MirvDown,x ; if bullet is already down we go with the next one + 1794 6EF7 F0 03 4C 79 70 jne MIRVnextBullet + 1795 6EFC AD 8C 3E lda goleft + 1796 6EFF D0 1F bne mrFlightLeft + 1797 + 1798 6F01 18 clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) + 1799 6F02 BD 42 3E lda xtraj00,x ;and here of course Flight to the right + 1800 6F05 7D 56 3E adc vx01,x + 1801 6F08 9D 42 3E sta xtraj00,x + 1802 6F0B BD 47 3E lda xtraj01,x + 1803 6F0E 7D 5B 3E adc vx02,x + 1804 6F11 9D 47 3E sta xtraj01,x + 1805 6F14 BD 4C 3E lda xtraj02,x + 1806 6F17 7D 60 3E adc vx03,x + 1807 6F1A 9D 4C 3E sta xtraj02,x + 1808 6F1D 4C 3C 6F jmp mrskip07 ;skip substracting for Flight to the left + 1809 + 1810 6F20 mrFlightLeft + 1811 6F20 38 sec ;xtraj=xtraj-vx (skipping the least significant byte of vx) + 1812 6F21 BD 42 3E lda xtraj00,x ;here of course Flight to the left + 1813 6F24 FD 56 3E sbc vx01,x + 1814 6F27 9D 42 3E sta xtraj00,x + 1815 6F2A BD 47 3E lda xtraj01,x + 1816 6F2D FD 5B 3E sbc vx02,x + 1817 6F30 9D 47 3E sta xtraj01,x + 1818 6F33 BD 4C 3E lda xtraj02,x + 1819 6F36 FD 60 3E sbc vx03,x + 1820 6F39 9D 4C 3E sta xtraj02,x + 1821 + 1822 + 1823 6F3C mrskip07 + 1824 ;vx=vx-Wind (also without least significan byte of vx) + 1825 + 1826 6F3C AD 8C 3E lda goleft + 1827 6F3F D0 07 bne mrFlightsLeft ;blow on bullet flighting left + 1828 6F41 AD 94 3D lda WindOrientation + 1829 6F44 D0 2D bne mrWindToLeft + 1830 6F46 F0 05 beq mrLWindToLeft + 1831 6F48 mrFlightsLeft + 1832 6F48 AD 94 3D lda WindOrientation + 1833 6F4B F0 26 beq mrLWindToRight + 1834 6F4D mrLWindToLeft + 1835 ; here Wind to right, bullet goes right as well, so vx=vx+Wind + 1836 ; here Wind to left, bullet goes left as well, so vx=vx+Wind + 1837 6F4D 18 clc + 1838 6F4E BD 51 3E lda vx00,x + 1839 6F51 6D 91 3D adc Wind + 1840 6F54 9D 51 3E sta vx00,x + 1841 6F57 BD 56 3E lda vx01,x + 1842 6F5A 6D 92 3D adc Wind+1 + 1843 6F5D 9D 56 3E sta vx01,x + 1844 6F60 BD 5B 3E lda vx02,x + 1845 6F63 69 00 adc #0 + 1846 6F65 9D 5B 3E sta vx02,x + 1847 6F68 BD 60 3E lda vx03,x + 1848 6F6B 69 00 adc #0 + 1849 6F6D 9D 60 3E sta vx03,x + 1850 6F70 4C 96 6F Jmp mrskip08 + 1851 6F73 mrWindToLeft + 1852 6F73 mrLWindToRight + 1853 ;Wind to left, bullet right, so vx=vx-Wind + 1854 ;Wind to right, bullet left, so vx=vx-Wind + 1855 6F73 38 sec + 1856 6F74 BD 51 3E lda vx00,x + 1857 6F77 ED 91 3D sbc Wind + 1858 6F7A 9D 51 3E sta vx00,x + 1859 6F7D BD 56 3E lda vx01,x + 1860 6F80 ED 92 3D sbc Wind+1 + 1861 6F83 9D 56 3E sta vx01,x + 1862 6F86 BD 5B 3E lda vx02,x + 1863 6F89 E9 00 sbc #0 + 1864 6F8B 9D 5B 3E sta vx02,x + 1865 6F8E BD 60 3E lda vx03,x + 1866 6F91 E9 00 sbc #0 + 1867 6F93 9D 60 3E sta vx03,x + 1868 6F96 mrskip08 + 1869 + 1870 ; isn't it over the screen???? + 1871 6F96 AD 79 3E lda ytraj+2 ;attention! this checks getting out of the screen through bottom + 1872 6F99 30 0A bmi MIRVcheckX ;but not that accurately.... + 1873 6F9B AD 78 3E lda ytraj+1 + 1874 6F9E C9 C8 cmp #screenheight + 1875 6FA0 90 03 4C 61 70 jcs mrEndOfFlight ; if smaller than screenheight then continue (and it will always fall down...) + 1876 6FA5 MIRVcheckX + 1877 6FA5 BD 4C 3E lda xtraj02,x + 1878 6FA8 C9 01 cmp #>screenwidth + 1879 6FAA F0 12 beq MIRVcheckLowerX + 1880 6FAC 90 27 bcc MIRVcheckCollision + 1881 ; it's over the screen horizontally (to the left or right) + 1882 6FAE A9 00 85 80 85 81 mwa #0 xdraw + 1883 6FB4 A9 C7 85 82 mva #screenheight-1 ydraw + 1884 6FB8 20 48 88 jsr unPlot.unPlotAfterX + 1885 6FBB 4C 88 6E jmp mrLoopi + 1886 6FBE MIRVcheckLowerX + 1887 6FBE BD 47 3E lda xtraj01,x + 1888 6FC1 C9 40 cmp #mountaintable + 1919 7003 85 92 sta temp+1 + 1920 ; adw mountaintable --- it does not work!!!!!!!! and should! (OMC bug?) #temp + 1921 7005 A0 00 ldy #0 + 1922 7007 AD 78 3E lda ytraj+1 + 1923 700A D1 91 cmp (temp),y + 1924 700C B0 25 bcs mrHit + 1925 + 1926 + 1927 + 1928 700E mrSkipCollisionCheck + 1929 + 1930 ;mwa xtraj01 xdraw + 1931 700E BD 47 3E lda xtraj01,x + 1932 7011 85 80 sta xdraw + 1933 7013 BD 4C 3E lda xtraj02,x + 1934 7016 85 81 sta xdraw+1 + 1935 7018 AD 78 3E 85 82 AD + mwa ytraj+1 ydraw + 1936 + 1937 7022 20 48 88 jsr unPlot.unPlotAfterX + 1938 7025 AE 6A 3E ldx MirvMissileCounter + 1939 7028 F0 03 4C 88 6E jne mrLoopi + 1940 702D 20 8B 89 jsr PlotPointer ; pointer only for bullet nr 0 + 1941 + 1942 7030 4C 88 6E jmp mrLoopi + 1943 + 1944 7033 mrHit + 1945 ; we have to make unPlot over the screen (to initialise it) + 1946 ; before actual explosion + 1947 7033 A9 00 85 80 85 81 mwa #0 xdraw + 1948 7039 A9 C7 85 82 mva #screenheight-1 ydraw + 1949 703D 20 48 88 jsr unPlot.unPlotAfterX + 1950 7040 AE 6A 3E ldx MirvMissileCounter + 1951 7043 A0 00 ldy #0 + 1952 ; concurrent moving xtraj+1 -> xdraw and calculating temp + 1953 7045 18 clc + 1954 7046 BD 47 3E lda xtraj01,x + 1955 7049 85 80 sta xdraw + 1956 704B 69 13 adc #mountaintable + 1961 7056 85 92 sta temp+1 + 1962 7058 B1 91 lda (temp),y + 1963 705A 85 82 sta ydraw + 1964 705C 84 83 sty ydraw+1 ;we know that y=0 + 1965 705E 20 D6 5E jsr missile ; explode .... + 1966 7061 mrEndOfFlight + 1967 7061 AE 6A 3E ldx MirvMissileCounter + 1968 7064 A9 00 85 80 85 81 mwa #0 xdraw + 1969 706A A9 C7 85 82 mva #screenheight-1 ydraw + 1970 706E 20 48 88 jsr unPlot.unPlotAfterX + 1971 7071 AE 6A 3E ldx MirvMissileCounter + 1972 7074 A9 01 lda #1 + 1973 7076 9D 65 3E sta MirvDown,x + 1974 7079 MIRVnextBullet + 1975 ; checking if all bullets already fallen down + 1976 7079 A2 04 ldx #4 + 1977 707B MIRVcheckIfEnd + 1978 707B BD 65 3E lda MirvDown,x + 1979 707E F0 05 beq MIRVstillNotAll + 1980 7080 CA dex + 1981 7081 10 F8 bpl MIRVcheckIfEnd + 1982 7083 30 03 bmi MIRValreadyAll + 1983 7085 MIRVstillNotAll + 1984 7085 4C 88 6E jmp mrLoopi + 1985 7088 MIRValreadyAll + 1986 7088 A5 80 8D 39 3E A5 + mwa xdraw xcircle ; we must store them (for a while) + 1987 7092 A5 82 8D 3B 3E mva ydraw ycircle ; xdraw and ydraw + 1988 7097 A9 00 85 80 85 81 mwa #0 xdraw + 1989 709D A9 C7 85 82 mva #screenheight-1 ydraw + 1990 70A1 AE 6A 3E ldx MirvMissileCounter + 1991 70A4 20 48 88 jsr unPlot.unPlotAfterX + 1992 70A7 AD 39 3E 85 80 AD + mwa xcircle xdraw + 1993 70B1 AD 3B 3E 85 82 mva ycircle ydraw + 1994 + 1995 ; we must do it manually because of the VOID pointer + 1996 + 1997 ; temporary removing tanks from the screen (otherwise they will fall down with soil) + 1998 70B6 A5 8B 85 A7 mva TankNr tempor2 + 1999 70BA A9 01 8D FB 3D mva #1 Erase + 2000 70BF 20 E2 84 jsr drawtanks + 2001 70C2 A5 A7 85 8B mva tempor2 TankNr + 2002 70C6 A9 00 8D FB 3D mva #0 Erase + 2003 70CB 20 F7 85 jsr SoilDown2 + 2004 70CE A9 01 8D 96 3D mva #1 HitFlag + 2005 ;jsr drawtanks + 2006 70D3 60 rts + 2007 .endp + 2008 + 2009 ; ------------------------------------------------- + 2010 70D4 CheckCollisionWithTank .proc + 2011 ; ------------------------------------------------- + 2012 70D4 A2 00 ldx #0 + 2013 70D6 CheckCollisionWithTankLoop + 2014 + 2015 70D6 BD 9D 3D lda xtankstableH,x + 2016 70D9 CD 76 3E cmp xtraj+2 + 2017 70DC D0 06 bne Condition01 + 2018 70DE BD 97 3D lda xtankstableL,x + 2019 70E1 CD 75 3E cmp xtraj+1 + 2020 70E4 Condition01 + 2021 70E4 B0 40 bcs LeftFromTheTank ;add 8 double byte + 2022 70E6 18 clc + 2023 70E7 69 08 adc #8 + 2024 70E9 A8 tay + 2025 70EA BD 9D 3D lda xtankstableH,x + 2026 70ED 69 00 adc #0 + 2027 70EF CD 76 3E cmp xtraj+2 + 2028 70F2 D0 03 bne Condition02 + 2029 70F4 CC 75 3E cpy xtraj+1 + 2030 70F7 Condition02 + 2031 70F7 90 2D bcc RightFromTheTank + 2032 + 2033 70F9 BD A3 3D lda ytankstable,x + 2034 70FC CD 78 3E cmp ytraj+1 ; check range + 2035 70FF 90 25 bcc BelowTheTank ;(ytankstable,ytankstable+3) + 2036 7101 E9 04 sbc #4 + 2037 7103 CD 78 3E cmp ytraj+1 + 2038 7106 B0 1E bcs OverTheTank + 2039 7108 A9 01 8D 96 3D mva #1 HitFlag + 2040 710D AD 75 3E 8D 32 3E + mwa xtraj+1 XHit + 2041 7119 AD 78 3E 8D 34 3E + mwa ytraj+1 YHit + 2042 7125 60 rts ; in X there is an index of the hit tank + 2043 7126 RightFromTheTank + 2044 7126 LeftFromTheTank + 2045 7126 OverTheTank + 2046 7126 BelowTheTank + 2047 7126 E8 inx + 2048 7127 EC 19 3D cpx NumberOfPlayers + 2049 712A D0 AA bne CheckCollisionWithTankLoop + 2050 712C 60 rts + 2051 .endp + 2052 ;-------------------------------------------------- + 2053 712D CalculateExplosionRange0 + 2054 ;-------------------------------------------------- + 2055 + 2056 ;the same as below, but without summing up + 2057 ;(for the first or single explosion) + 2058 + 2059 ;zero soil fall out ranges + 2060 712D A9 40 8D FC 3D A9 + mwa #screenwidth RangeLeft + 2061 7137 A9 00 lda #0 + 2062 7139 8D FE 3D sta RangeRight + 2063 713C 8D FF 3D sta RangeRight+1 + 2064 713F A9 0B 8D 49 3F mva #11 ExplosionRadius + 2065 ;-------------------------------------------------- + 2066 7144 CalculateExplosionRange .proc + 2067 ;-------------------------------------------------- + 2068 ;calculates total horizontal range of explosion by + 2069 ;"summing up" ranges of all separate explosions + 2070 + 2071 7144 18 A5 80 6D 49 3F + adw xdraw ExplosionRadius WeaponRangeRight + 2072 7155 AD 03 3E C9 01 D0 + cpw WeaponRangeRight #screenwidth-1 + 2073 7161 90 0A bcc NotOutOfTheScreenRight + 2074 7163 A9 3F 8D 02 3E A9 + mwa #screenwidth-1 WeaponRangeRight + 2075 + 2076 716D NotOutOfTheScreenRight + 2077 716D 38 A5 80 ED 49 3F + sbw xdraw ExplosionRadius WeaponRangeLeft + 2078 717E AD 01 3E lda WeaponRangeLeft+1 + 2079 7181 10 08 bpl NotOutOfTheScreenLeft + 2080 7183 A9 00 lda #0 + 2081 7185 8D 00 3E sta WeaponRangeLeft + 2082 7188 8D 01 3E sta WeaponRangeLeft+1 + 2083 718B NotOutOfTheScreenLeft + 2084 + 2085 718B AD FD 3D CD 01 3E + cpw RangeLeft WeaponRangeLeft + 2086 7199 90 0C bcc CheckRangeRight + 2087 719B AD 00 3E 8D FC 3D + mwa WeaponRangeLeft RangeLeft + 2088 71A7 CheckRangeRight + 2089 71A7 AD FF 3D CD 03 3E + cpw RangeRight WeaponRangeRight + 2090 71B5 B0 0C bcs RangesChecked + 2091 71B7 AD 02 3E 8D FE 3D + mwa WeaponRangeRight RangeRight + 2092 71C3 RangesChecked + 2093 + 2094 71C3 60 rts + 2095 .endp + 2096 + 2097 ;-------------------------------------------------- + 2098 71C4 DecreaseWeaponAfterShoot .proc + 2099 ;-------------------------------------------------- + 2100 71C4 A6 8B ldx TankNr + 2101 71C6 BD 89 3D lda ActiveWeapon,x + 2102 71C9 20 DC 71 jsr DecreaseWeapon + 2103 ; and here we have amount of possessed ammo for given weapon + 2104 + 2105 71CC C9 00 cmp #0 + 2106 71CE D0 05 bne AmmunitionDecreased + 2107 71D0 A9 00 lda #0 ;if ammo for given weapon ends + 2108 71D2 9D 89 3D sta ActiveWeapon,x ;then set to default weapon (baby missile) + 2109 71D5 AmmunitionDecreased + 2110 71D5 A9 63 lda #99 + 2111 71D7 A0 00 ldy #0 + 2112 71D9 91 B4 sta (weaponPointer),y ;baby missile - always 99 pieces + 2113 + 2114 ;there is a good value in temp after jsr DecreaseWeapon + 2115 + 2116 71DB 60 rts + 2117 .endp + 2118 + 2119 ;-------------------------------------------------- + 2120 71DC DecreaseWeapon .proc + 2121 ; in: A <-- Weapon number, TankNr + 2122 ; decreases 1 bullet from a weapon(A) of tank(TankNr) + 2123 ;-------------------------------------------------- + 2124 71DC 20 E5 71 jsr HowManyBullets + 2125 71DF 38 sec + 2126 71E0 E9 01 sbc #1 + 2127 71E2 91 B4 sta (weaponPointer),y ; we have good values after HowManyBullets + 2128 71E4 60 rts + 2129 .endp + 2130 + 2131 ;-------------------------------------------------- + 2132 71E5 HowManyBullets .proc + 2133 ; in: A <-- Weapon number, TankNr + 2134 ; out: A <-- How many bullets in the weapon + 2135 ; how many bullets weapon of tank(TankNr) has, Result w A + 2136 ;-------------------------------------------------- + 2137 71E5 A8 tay + 2138 71E6 A6 8B ldx TankNr + 2139 71E8 BD 07 41 lda TanksWeaponsTableL,x + 2140 71EB 85 B4 sta weaponPointer + 2141 71ED BD 0D 41 lda TanksWeaponsTableH,x + 2142 71F0 85 B5 sta weaponPointer+1 + 2143 + 2144 ;ldy #$35 ; parachute + 2145 71F2 B1 B4 lda (weaponPointer),y ; and we have number of bullets in A + 2146 71F4 60 rts + 2147 .endp + 2148 + 2149 + 2150 + 2151 .ENDIF + 2152 + 676 + 677 + 678 ;-------------------------------------------------- + 679 71F5 DecreaseEnergyX .proc + 680 ;Decreases energy of player nr X + 681 ;increases his financial loss + 682 ;increases gain of tank TankNr + 683 ;-------------------------------------------------- + 684 71F5 8C 50 3D sty EnergyDecrease + 685 ; Loose increase + 686 71F8 BD 44 3D lda looseL,x + 687 71FB 18 clc + 688 71FC 6D 50 3D adc EnergyDecrease + 689 71FF 9D 44 3D sta looseL,x + 690 7202 BD 3E 3D lda looseH,x + 691 7205 69 00 adc #$00 + 692 7207 9D 3E 3D sta looseH,x + 693 ; Energy now, not less than 0 + 694 720A BD 4A 3D lda Energy,x + 695 720D CD 50 3D cmp EnergyDecrease + 696 7210 90 05 bcc ldahashzero + 697 ;sec + 698 7212 ED 50 3D sbc EnergyDecrease + 699 7215 10 02 bpl NotNegativeEnergy + 700 7217 ldahashzero + 701 7217 A9 00 lda #0 + 702 7219 NotNegativeEnergy + 703 7219 9D 4A 3D sta Energy,x + 704 ;now increase the gain of the shooting tank + 705 721C phx +Macro: PHX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 721C 8A txa + 2 721D 48 pha +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 706 721E A6 8B ldx TankNr + 707 7220 18 clc + 708 7221 BD 38 3D lda gainL,x + 709 7224 6D 50 3D adc EnergyDecrease + 710 7227 9D 38 3D sta gainL,x + 711 722A BD 32 3D lda gainH,x + 712 722D 69 00 adc #$00 + 713 722F 9D 32 3D sta gainH,x + 714 7232 plx +Macro: PLX [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7232 68 pla + 2 7233 AA tax +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 715 7234 60 rts + 716 .endp + 717 + 718 ;-------------------------------------------------- + 719 7235 GetRandomWind .proc + 720 ;-------------------------------------------------- + 721 7235 AD 0A D2 lda random + 722 7238 CD 93 3D cmp MaxWind + 723 723B B0 F8 bcs GetRandomWind ; if more than MaxWind then randomize again + 724 723D 8D 91 3D sta Wind + 725 7240 A9 00 8D 92 3D mva #$00 Wind+1 + 726 ; multiply Wind by 16 and take it as a decimal part (0.Wind) + 727 7245 aslw Wind +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7245 0E 91 3D ASL WIND + 2 7248 2E 92 3D ROL WIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 728 724B aslw Wind +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 724B 0E 91 3D ASL WIND + 2 724E 2E 92 3D ROL WIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 729 7251 aslw Wind +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7251 0E 91 3D ASL WIND + 2 7254 2E 92 3D ROL WIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 730 7257 aslw Wind +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7257 0E 91 3D ASL WIND + 2 725A 2E 92 3D ROL WIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 731 725D AD 0A D2 lda random + 732 7260 29 01 and #$01 + 733 7262 8D 94 3D sta WindOrientation + 734 7265 60 rts + 735 .endp + 736 + 737 ;-------------------------------------------------- + 738 7266 PMoutofScreen .proc + 739 ;-------------------------------------------------- + 740 7266 A9 00 lda #$00 ; let all P/M disappear + 741 7268 8D 00 D0 sta hposp0 + 742 726B 8D 01 D0 sta hposp0+1 + 743 726E 8D 02 D0 sta hposp0+2 + 744 7271 8D 03 D0 sta hposp0+3 + 745 7274 8D 04 D0 sta hposp0+4 + 746 7277 8D 05 D0 sta hposp0+5 + 747 727A 8D 06 D0 sta hposp0+6 + 748 727D 8D 07 D0 sta hposp0+7 + 749 7280 60 rts + 750 .endp + 751 + 752 ;-------------------------------------------------- + 753 7281 .nowarn .proc WeaponCleanup; + 754 ; cleaning of the weapon possesion tables + 755 ; (99 of Baby Missles, all other weapons=0) + 756 ;-------------------------------------------------- + 757 7281 A2 3F ldx #$3f + 758 7283 A9 00 lda #$0 + 759 7285 loop05 + 760 7285 9D 87 3F sta TanksWeapon1,x + 761 7288 9D C7 3F sta TanksWeapon2,x + 762 728B 9D 07 40 sta TanksWeapon3,x + 763 728E 9D 47 40 sta TanksWeapon4,x + 764 7291 9D 87 40 sta TanksWeapon5,x + 765 7294 9D C7 40 sta TanksWeapon6,x + 766 7297 CA dex + 767 7298 D0 04 bne skip13 + 768 729A A9 63 lda #99 + 769 729C D0 E7 bne loop05 + 770 729E 10 E5 skip13 bpl loop05 + 771 72A0 60 rts + 772 .endp + 773 + 774 ;-------------------------------------------------- + 775 72A1 Initialize .proc + 776 ;Initialization sequence + 777 ;-------------------------------------------------- + 778 ;jsr GenerateOffensiveTextTables + 779 ;jsr GenerateDeffensiveTextTables + 780 + 781 72A1 A9 00 lda #0 + 782 72A3 8D FB 3D sta Erase + 783 72A6 8D A9 3E sta tracerflag + 784 72A9 8D 49 48 sta oldPlotPointerX + 785 72AC 8D 4A 48 sta oldPlotPointerX+1 + 786 + 787 72AF A9 02 8D C6 02 mva #$2 colpf2s + 788 72B4 A9 0C 8D C7 02 mva #12 colpf3s + 789 72B9 A9 A4 8D F4 02 mva #>WeaponFont chbas + 790 + 791 ;parameter for old plot (unPlot) max 5 points + 792 72BE A2 04 ldx #4 + 793 72C0 SetunPlots + 794 72C0 A9 10 lda #display + 797 72C7 9D 8F 3E sta oldplotH,x + 798 72CA A9 00 lda #0 + 799 72CC 9D 9E 3E sta oldply,x + 800 72CF 9D 99 3E sta oldora,x + 801 72D2 CA dex + 802 72D3 10 EB bpl SetunPlots + 803 + 804 ;setting up P/M graphics + 805 72D5 A9 98 lda #>pmgraph + 806 72D7 8D 07 D4 sta pmbase + 807 72DA AD 2F 02 lda dmactls + 808 72DD 09 38 ora #$38 ; Players and Missiles single lined + 809 72DF 8D 2F 02 sta dmactls + 810 72E2 A9 03 lda #$03 ; P/M on + 811 72E4 8D 1D D0 sta pmcntl + 812 72E7 A9 01 lda #$01 + 813 72E9 8D 0C D0 sta sizem ; there will be only M0, double width + 814 72EC 8D 08 D0 sta sizep0 ; P0-P3 widths + 815 72EF 8D 09 D0 sta sizep0+1 + 816 72F2 8D 0A D0 sta sizep0+2 + 817 72F5 8D 0B D0 sta sizep0+3 + 818 72F8 A9 10 lda #$10 ; P/M priorities (bit 4 joins missiles) + 819 72FA 8D 6F 02 sta gtictls + 820 72FD 20 66 72 jsr PMoutofScreen + 821 7300 A9 50 lda #$50 ; temporary colours of sprites under tanks + 822 7302 8D C0 02 sta $2c0 + 823 7305 A9 30 lda #$30 + 824 7307 8D C1 02 sta $2c1 + 825 730A A9 70 lda #$70 + 826 730C 8D C2 02 sta $2c2 + 827 730F A9 90 lda #$90 + 828 7311 8D C3 02 sta $2c3 + 829 7314 A9 B0 LDA #$B0 + 830 7316 8D C7 02 STA COLPF3S + 831 7319 A9 00 8D 04 D4 mva #0 hscrol + 832 + 833 + 834 ;let the tanks be visible! + 835 731E A2 05 ldx #5 + 836 7320 A9 01 lda #1 ; tank is visible + 837 7322 MakeTanksVisible + 838 7322 9D 51 3D sta eXistenZ,x + 839 7325 CA dex + 840 7326 10 FA bpl MakeTanksVisible + 841 + 842 + 843 7328 A2 00 ldx #0 + 844 732A 8A txa + 845 732B ClearResults + 846 732B 9D 5D 3D sta ResultsTable,x + 847 732E E8 inx + 848 732F E0 06 cpx #MaxPlayers + 849 7331 D0 F8 bne ClearResults + 850 + 851 7333 A9 01 8D 4B 3F mva #1 CurrentRoundNr ;we start from round 1 + 852 + 853 7338 60 rts + 854 .endp + 855 + 856 7339 SetDLI .proc + 857 7339 VDLI DLIinterrupt +Macro: VDLI [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 7339 A0 49 LDY # DLIINTERRUPT + 5 733D A9 C0 LDA #$C0 + 6 733F 8C 00 02 STY $0200 + 7 7342 8E 01 02 STX $0201 + 8 7345 8D 0E D4 STA NMIEN +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\program.asm + 858 7348 60 rts + 859 .endp + 860 7349 DLIinterrupt .proc + 861 7349 48 pha + 862 734A A9 02 lda #$02 ; color of playground + 863 734C 8D 0A D4 sta WSYNC + 864 734F 8D 18 D0 sta COLPF2 + 865 7352 68 pla + 866 7353 40 rti + 867 .endp + 868 ;---------------------------------------------- + 869 7354 RandomizeSequence .proc + 870 ; in: NumberOfPlayers + 871 ; out: TankSequence + 872 ; how: get random number lower than NumberOfPlayers + 873 ; put it in the first slot. + 874 ; get another random number lower than NumberOfPlayers + 875 ; check if was previously saved in first slot + 876 ; if not then save it in second slot + 877 ; repeat untill NumberOfPlayers + 878 + 879 7354 A2 00 ldx #0 + 880 7356 GetRandomAgain0 + 881 7356 AD 0A D2 lda RANDOM + 882 7359 29 07 and #$07 ;NumberOfPlayers < 7 + 883 735B CD 19 3D cmp NumberOfPlayers + 884 735E B0 F6 bcs GetRandomAgain0 + 885 7360 9D 1A 3D sta TankSequence,x + 886 ;now first slot is ready, nexts slots are handled + 887 ;in a more complicated way + 888 + 889 7363 GetRandomAgainX + 890 7363 AD 0A D2 lda RANDOM + 891 7366 29 07 and #$07 ;NumberOfPlayers < 7 + 892 7368 CD 19 3D cmp NumberOfPlayers + 893 736B B0 F6 bcs GetRandomAgainX + 894 + 895 ;now we have to check if the value was not used + 896 ;in previous slots + 897 + 898 736D 86 91 stx temp + 899 736F A4 91 ldy temp + 900 7371 UsageLoop + 901 7371 D9 1A 3D cmp TankSequence,y + 902 7374 F0 ED beq GetRandomAgainX ;apparently we have already used this value + 903 7376 88 dey + 904 7377 10 F8 bpl UsageLoop + 905 + 906 ;well, looks like this value is new! + 907 7379 E8 inx + 908 737A 9D 1A 3D sta TankSequence,x + 909 + 910 737D 86 91 stx temp + 911 737F E6 91 A5 91 inc:lda temp ;x+1 + 912 + 913 7383 CD 19 3D cmp NumberOfPlayers + 914 7386 D0 DB bne GetRandomAgainX + 915 7388 60 rts + 916 .endp + 917 ;---------------------------------------------- + 918 7389 RandomizeAngle .proc ; + 919 ; routine returns in A + 920 ; a valid angle for the tank's barrel. + 921 ; X is not changed + 922 ;---------------------------------------------- + 923 + 924 ;valid angle values are ((256-90)..255) and (0..90) + 925 ;it means that values 91..165 must be elliminated... + 926 ;so, lets randomize someting between 0 and 180 + 927 ;and substract this value from 90 + 928 7389 AD 0A D2 lda RANDOM + 929 + 930 738C C9 B4 cmp #180 + 931 738E B0 F9 bcs RandomizeAngle + 932 + 933 + 934 7390 85 91 sta temp + 935 7392 A9 5A lda #90 ; CARRY=0 here + 936 7394 E5 91 sbc temp + 937 + 938 7396 60 rts + 939 .endp + 940 ;---------------------------------------------- + 941 7397 RandomizeForce .proc + 942 ; routine returns in EnergyTable/L/H + 943 ; valid force of shooting for TankNr + 944 ; in X must be TankNr + 945 ; low and high randomize boundary passed as word value + 946 ; RandBoundaryLow + 947 ; RandBoundaryHigh + 948 ;---------------------------------------------- + 949 + 950 + 951 7397 BD 76 3D lda MaxEnergyTableL,x + 952 739A 85 91 sta temp + 953 739C BD 7C 3D lda MaxEnergyTableH,x + 954 739F 85 92 sta temp+1 + 955 73A1 GetRandomAgain + 956 73A1 AD 0A D2 lda RANDOM + 957 ; gets values in range(256,765) + 958 73A4 85 93 sta temp2 + 959 73A6 AD 0A D2 lda RANDOM ; :) + 960 73A9 29 03 and #%00000011 ;(0..1023) + 961 73AB 85 94 sta temp2+1 + 962 + 963 73AD AD C8 50 C5 94 D0 + cpw RandBoundaryLow temp2 + 964 73B9 B0 E6 bcs GetRandomAgain + 965 + 966 73BB AD CA 50 C5 94 D0 + cpw RandBoundaryHigh temp2 + 967 73C7 90 D8 bcc GetRandomAgain + 968 + 969 73C9 A5 92 C5 94 D0 04 + cpw temp temp2 + 970 73D3 B0 08 bcs EnergyInRange + 971 + 972 73D5 A5 91 85 93 A5 92 + mwa temp temp2 + 973 + 974 73DD EnergyInRange + 975 + 976 73DD A5 93 lda temp2 + 977 73DF 9D 6A 3D sta EnergyTableL,x + 978 73E2 A5 94 lda temp2+1 + 979 73E4 9D 70 3D sta EnergyTableH,x + 980 + 981 73E7 60 rts + 982 .endp + 983 + 984 ;---------------------------------------------- + 985 73E8 MoveBarrelToNewPosition .proc + 986 73E8 20 F9 84 jsr DrawTankNr + 987 73EB A6 8B ldx TankNr + 988 73ED BD 82 3D lda AngleTable,x + 989 73F0 18 clc + 990 73F1 69 5A adc #90 ;shift angle to the positive values + 991 73F3 85 91 sta temp + 992 73F5 AD 88 3D lda NewAngle + 993 73F8 18 clc + 994 73F9 69 5A adc #90 + 995 73FB C5 91 cmp temp + 996 73FD F0 20 beq BarrelPositionIsFine + 997 73FF 90 0F bcc rotateLeft ; older is bigger + 998 7401 rotateRight;older is lower + 999 7401 FE 82 3D inc angleTable,x + 1000 7404 D0 E2 bne MoveBarrelToNewPosition + 1001 + 1002 7406 A9 30 85 88 mva #$30 CharCode ; if angle goes through 0 we clear the barrel + 1003 740A 20 23 85 jsr drawtankNrX + 1004 + 1005 740D 4C E8 73 jmp MoveBarrelToNewPosition + 1006 7410 rotateLeft + 1007 7410 DE 82 3D dec angleTable,x + 1008 7413 10 D3 bpl MoveBarrelToNewPosition + 1009 7415 A9 2E 85 88 mva #$2e CharCode + 1010 7419 20 23 85 jsr drawtankNrX + 1011 + 1012 741C 4C E8 73 jmp MoveBarrelToNewPosition + 1013 + 1014 741F BarrelPositionIsFine + 1015 741F 60 rts + 1016 + 1017 .endp + 1018 + 1019 ;---------------------------------------------- + 1020 7420 SortSequence .proc ; + 1021 ;---------------------------------------------- + 1022 ; here we try to get a sequence of tanks for two + 1023 ; purposes: + 1024 ; 1. to make up shooting sequence for the next round (from down to top) + 1025 ; 2. to display game results more nicely (from top to down) + 1026 ; + 1027 ; I think I will go for a stupid bubble sort... + 1028 ; it is easy to test :) + 1029 ; + 1030 ; Results are in ResultsTable, in SortedTable we want to + 1031 ; have numbers of tanks from the worst to the best. + 1032 ; in other words, if ResultsTable=(5,4,65,23,3,6) + 1033 ; the SortedTable=(4,1,0,5,3,2) + 1034 ; let's assume initially the TankSequence=(0,1,2,3,4,5) + 1035 + 1036 7420 A2 00 ldx #0 + 1037 7422 SequenceStart + 1038 7422 8A txa + 1039 7423 9D 1A 3D sta TankSequence,x + 1040 7426 E8 inx + 1041 7427 E0 06 cpx #MaxPlayers + 1042 7429 D0 F7 bne SequenceStart + 1043 + 1044 ; we will need a TempResults (TR) table to fiddle with + 1045 742B A2 00 ldx #0 + 1046 742D movetotemp + 1047 742D BD 5D 3D lda ResultsTable,x + 1048 7430 9D 63 3D sta TempResults,x + 1049 7433 E8 inx + 1050 7434 EC 19 3D cpx NumberOfPlayers + 1051 7437 D0 F4 bne movetotemp + 1052 + 1053 ; i=0:sortflag=0 + 1054 ;loop: + 1055 ; if TR(i) < TX(i+1) then i=i+1: here quit if i=numberofplayers + 1056 ; or goto loop: + 1057 ; else + 1058 ; temp=TR(i): tempo=TankSequence(i) + 1059 ; TR(i)=TR(i+1): TankSequence(i)=TankSequence(i+1) + 1060 ; TR(i+1)=temp: TankSequence(i+1)=tempo + 1061 ; i=i+1 + 1062 ; sortflag=sortflag+1 + 1063 ; go loop: + 1064 ; if sortflag=0 then finished, else repeat... + 1065 ; + 1066 ; or something like this :) + 1067 7439 AE 19 3D ldx NumberOfPlayers + 1068 743C CA dex + 1069 743D 86 92 stx temp+1 ; for checking end of the loop only + 1070 + 1071 743F Bubble + 1072 743F A2 00 ldx #0 ;i=x + 1073 7441 86 93 stx temp2 ; sortflag=temp2 + 1074 + 1075 7443 BubbleBobble + 1076 7443 BD 63 3D lda TempResults,x + 1077 7446 DD 64 3D cmp TempResults+1,x + 1078 7449 F0 21 beq nextishigher ; this is to block hangs when 2 same values meet + 1079 744B 90 1F bcc nextishigher + 1080 ;here we must swap values + 1081 ;because next is smaller than previous + 1082 744D 85 91 sta temp + 1083 744F BD 64 3D lda TempResults+1,x + 1084 7452 9D 63 3D sta TempResults,x + 1085 7455 A5 91 lda temp + 1086 7457 9D 64 3D sta TempResults+1,x + 1087 ; + 1088 745A BD 1A 3D lda TankSequence,x + 1089 745D 85 91 sta temp + 1090 745F BD 1B 3D lda TankSequence+1,x + 1091 7462 9D 1A 3D sta TankSequence,x + 1092 7465 A5 91 lda temp + 1093 7467 9D 1B 3D sta TankSequence+1,x + 1094 746A E6 93 inc temp2 + 1095 746C nextishigher + 1096 746C E8 inx + 1097 746D E4 92 cpx temp+1 ;cpx ^NumberOfPlayers-1 + 1098 746F D0 D2 bne BubbleBobble + 1099 + 1100 7471 A5 93 lda temp2 + 1101 + 1102 7473 D0 CA bne Bubble + 1103 + 1104 7475 60 rts + 1105 .endp + 1106 ;---------------------------------------------- + 1107 7476 icl 'textproc.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 + 3 + 4 .IF *>0 + 5 ;---------------------------------------- + 6 ; this module contains routines used in text mode + 7 ; like shop and start-up options + 8 ;---------------------------------------- + 9 ;-------------------------------------------------- + 10 7476 getkey .proc; waits for pressing a key and returns pressed value in A + 11 ;-------------------------------------------------- + 12 7476 pause 5 +Macro: PAUSE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 2 7476 A2 05 ldx #5 + 3 7478 ?PAUSELOOP + 3 7478 AD 0B D4 LDA VCOUNT + 4 747B 8D 0A D4 STA WSYNC + 5 747E 8D 0A D4 STA WSYNC + 6 7481 8D 0A D4 STA WSYNC + 7 7484 CD 0B D4 ?WA CMP VCOUNT + 8 7487 D0 FB BNE ?WA +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 5 7489 CA dex + 6 748A D0 EC bne ?PAUSELOOP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 13 748C AD 0F D2 lda SKSTAT + 14 748F C9 FF cmp #$ff + 15 7491 F0 12 beq lopx01 + 16 7493 C9 F7 cmp #$f7 + 17 7495 D0 DF bne getkey ; I guess it waits for RELEASING a key + 18 7497 AD 78 02 lda JSTICK0 + 19 749A 29 0F and #$0f + 20 749C C9 0F cmp #$0f + 21 749E D0 D6 bne getkey ; waits for not moving the joy + 22 74A0 AD 10 D0 lda TRIG0 + 23 74A3 F0 D1 beq getkey ; waits for releasing FIRE + 24 + 25 + 26 74A5 AD 0F D2 lopx01 lda SKSTAT + 27 74A8 C9 FF cmp #$ff + 28 74AA F0 0A beq checkJoyGetKey ; key not pressed, check Joy + 29 74AC C9 F7 cmp #$f7 + 30 74AE F0 06 beq checkJoyGetKey ; key not pressed, check Joy + 31 + 32 74B0 AD 09 D2 lda kbcode + 33 74B3 29 3F and #$3f ;CTRL and SHIFT ellimination + 34 74B5 60 rts + 35 74B6 checkJoyGetKey + 36 ;------------JOY------------- + 37 ;happy happy joy joy + 38 ;check for joystick now + 39 74B6 AD 78 02 lda JSTICK0 + 40 74B9 29 0F and #$0f + 41 74BB C9 0F cmp #$0f + 42 74BD F0 05 beq notpressedJoyGetKey + 43 74BF A8 tay + 44 74C0 B9 99 50 lda joyToKeyTable,y + 45 74C3 60 rts + 46 74C4 notpressedJoyGetKey + 47 ;fire + 48 74C4 AD 10 D0 lda TRIG0 + 49 74C7 D0 DC bne lopx01 + 50 74C9 A9 0C lda #$0c ;Return key + 51 74CB 60 rts + 52 .endp + 53 ;-------------------------------------------------- + 54 74CC getkeynowait .proc; + 55 ;-------------------------------------------------- + 56 74CC AD 0F D2 lda SKSTAT + 57 74CF C9 FF cmp #$ff + 58 74D1 F0 F9 beq getkeynowait + 59 74D3 C9 F7 cmp #$f7 + 60 74D5 F0 F5 beq getkeynowait ; I guess it waits for RELEASING a key + 61 74D7 AD 09 D2 lda kbcode + 62 74DA 29 3F and #$3f ;CTRL and SHIFT ellimination + 63 74DC 60 rts + 64 .endp + 65 ;-------------------------------------------------- + 66 74DD Options .proc + 67 ;-------------------------------------------------- + 68 ; start-up screen - options, etc. + 69 ; this function returns: + 70 ; - number of players (NumberOfPlayers) + 71 ; - money each player has on the beginning of the game (moneyL i moneyH) + 72 ; - and I am sure maxwind, gravity, ???? + 73 + 74 74DD A9 00 8D 18 3F mva #0 OptionsY + 75 + 76 74E2 OptionsMainLoop + 77 + 78 74E2 20 77 75 jsr OptionsInversion + 79 74E5 20 76 74 jsr getkey + 80 74E8 C9 0F cmp #$f ;cursor down + 81 74EA D0 12 bne OptionsNoDown + 82 74EC EE 18 3F AD 18 3F inc:lda OptionsY + 83 74F2 C9 04 cmp #maxoptions + 84 74F4 D0 EC bne OptionsMainLoop + 85 74F6 A9 03 8D 18 3F mva #3 OptionsY + 86 74FB 4C E2 74 jmp OptionsMainLoop + 87 + 88 74FE OptionsNoDown + 89 74FE C9 0E cmp #$e ;cursor up + 90 7500 D0 0D bne OptionsNoUp + 91 7502 CE 18 3F dec OptionsY + 92 7505 10 DB bpl OptionsMainLoop + 93 7507 A9 00 8D 18 3F mva #0 OptionsY + 94 750C 4C E2 74 jmp OptionsMainLoop + 95 + 96 750F OptionsNoUp + 97 750F C9 06 cmp #$6 ;cursor left + 98 7511 D0 11 bne OptionsNoLeft + 99 7513 AE 18 3F ldx OptionsY + 100 7516 DE 14 3F dec OptionsTable,X + 101 7519 BD 14 3F lda OptionsTable,X + 102 751C 10 C4 bpl OptionsMainLoop + 103 751E FE 14 3F inc OptionsTable,X + 104 7521 4C E2 74 jmp OptionsMainLoop + 105 + 106 7524 OptionsNoLeft + 107 7524 C9 07 cmp #$7 ;cursor right + 108 7526 D0 13 bne OptionsNoRight + 109 + 110 7528 AE 18 3F ldx OptionsY + 111 752B FE 14 3F inc OptionsTable,X + 112 752E BD 14 3F lda OptionsTable,X + 113 7531 C9 05 cmp #5 + 114 7533 D0 AD bne OptionsMainLoop + 115 7535 DE 14 3F dec OptionsTable,X + 116 7538 4C E2 74 jmp OptionsMainLoop + 117 + 118 753B OptionsNoRight + 119 753B C9 0C cmp #$c ;Return key + 120 753D D0 03 bne OptionsNoReturn + 121 753F 4C 45 75 jmp OptionsFinished + 122 7542 OptionsNoReturn + 123 7542 4C E2 74 jmp OptionsMainLoop + 124 + 125 7545 OptionsFinished + 126 ;first option + 127 7545 AC 14 3F ldy OptionsTable + 128 7548 C8 iny + 129 7549 C8 iny + 130 754A 8C 19 3D sty NumberOfPlayers ;1=1 player (but minimum is 2) + 131 + 132 ;second option (cash) + 133 + 134 + 135 754D AC 15 3F ldy OptionsTable+1 + 136 7550 A2 00 ldx #0 + 137 7552 skip10 + 138 7552 B9 1E 3F lda CashOptionL,y + 139 7555 9D 2C 3D sta moneyL,x + 140 7558 B9 19 3F lda CashOptionH,y + 141 755B 9D 26 3D sta moneyH,x + 142 755E E8 inx + 143 755F EC 19 3D cpx NumberOfPlayers + 144 7562 D0 EE bne skip10 + 145 + 146 ;third option (gravity) + 147 7564 AC 16 3F ldy OptionsTable+2 + 148 7567 B9 23 3F lda GravityTable,y + 149 756A 8D 90 3D sta gravity + 150 + 151 ;fourth option (wind) + 152 + 153 756D AC 17 3F ldy OptionsTable+3 + 154 7570 B9 28 3F lda MaxWindTable,y + 155 7573 8D 93 3D sta MaxWind + 156 7576 60 rts + 157 ;-------- + 158 ; inversing choosed option (cursor) + 159 ;-------- + 160 7577 OptionsInversion + 161 7577 A9 F3 85 91 A9 31 + mwa #OptionsHere temp + 162 757F A0 00 ldy #0 + 163 7581 OptionsInversionLoop1 + 164 7581 B1 91 lda (temp),y + 165 7583 29 7F and #$7F + 166 7585 91 91 sta (temp),y + 167 7587 18 A5 91 69 01 85 + adw temp #1 + 168 7592 A5 92 C9 32 D0 04 + cpw temp #OptionsScreenEnd + 169 759C D0 E3 bne OptionsInversionLoop1 + 170 ;here all past inversions are gone... + 171 + 172 759E A9 F3 85 91 A9 31 + mwa #OptionsHere temp + 173 75A6 A9 00 85 93 mva #0 temp2 ;option number pointer + 174 75AA 18 A5 91 69 0B 85 + adw temp #11 ;offset of the first option=11 + 175 75B5 OptionsSetMainLoop + 176 75B5 A6 93 ldx temp2 + 177 75B7 BD 14 3F lda OptionsTable,x + 178 75BA 0A asl + 179 75BB 0A asl + 180 75BC 7D 14 3F adc OptionsTable,x ;OptionsTable value * 5 + 181 75BF A8 tay + 182 75C0 A2 04 ldx #4 + 183 75C2 OptionSetLoop + 184 75C2 B1 91 lda (temp),y + 185 75C4 09 80 ora #$80 + 186 75C6 91 91 sta (temp),y + 187 75C8 C8 iny + 188 75C9 CA dex + 189 75CA 10 F6 bpl OptionSetLoop ;here option is highlighted + 190 ; + 191 ; next option + 192 75CC 18 A5 91 69 28 85 + adw temp #40 ;jump to next line + 193 75D7 E6 93 A5 93 inc:lda temp2 + 194 75DB C9 04 cmp #4 ;number of options + 195 75DD D0 D6 bne OptionsSetMainLoop + 196 + 197 ;inversing the first few chars of the selected line (OptionsY) + 198 75DF AD 18 3F 85 91 mva OptionsY temp + 199 75E4 A9 00 85 92 85 93 mwa #0 temp+1 + 200 75EA 06 91 asl temp + 201 75EC 26 92 rol temp+1 + 202 75EE 06 91 asl temp + 203 75F0 26 92 rol temp+1 + 204 75F2 06 91 asl temp + 205 75F4 26 92 rol temp+1 + 206 75F6 A5 91 85 93 A5 92 + mwa temp temp2 ;here is OptionsY*8 + 207 75FE 06 91 asl temp + 208 7600 26 92 rol temp+1 + 209 7602 06 91 asl temp + 210 7604 26 92 rol temp+1 + 211 ;here is 32*OptionsY + 212 7606 18 A5 91 65 93 85 + adw temp temp2 + 213 ;in temp is 40*OptionsY + 214 7613 18 A5 91 69 F3 85 + adw temp #OptionsHere + 215 ;now in temp is adres of the line to be inversed + 216 7620 A0 07 ldy #7 ;8 letters to invers + 217 7622 OptionsYLoop + 218 7622 B1 91 lda (temp),y + 219 7624 09 80 ora #$80 + 220 7626 91 91 sta (temp),y + 221 7628 88 dey + 222 7629 10 F7 bpl OptionsYLoop + 223 + 224 + 225 762B 60 rts + 226 .endp + 227 + 228 ;------------------------------------------- + 229 ; call of the purchase screens for each tank + 230 762C CallPurchaseForEveryTank + 231 762C A9 02 8D C6 02 mva #$2 colpf2s ; set normal color + 232 7631 A9 10 8D 30 02 A9 + mwa #PurchaseDL dlptrs + 233 763B AD 2F 02 lda dmactls + 234 763E 29 FC and #$fc + 235 7640 09 02 ora #$02 ; normal screen width + 236 7642 8D 2F 02 sta dmactls + 237 + 238 7645 A9 00 85 8B mva #0 TankNr + 239 7649 loop03 + 240 7649 A6 8B ldx TankNr + 241 764B BD 20 3D lda SkillTable,x + 242 764E F0 06 beq ManualPurchase + 243 7650 20 D6 8D jsr PurchaseAI + 244 7653 4C 59 76 jmp AfterManualPurchase + 245 + 246 7656 ManualPurchase + 247 7656 20 63 76 jsr Purchase + 248 7659 AfterManualPurchase + 249 + 250 7659 E6 8B inc TankNr + 251 765B A5 8B lda TankNr + 252 765D CD 19 3D cmp NumberOfPlayers + 253 7660 D0 E7 bne loop03 + 254 7662 60 rts + 255 + 256 ;-------------------------------------------------- + 257 7663 Purchase ; + 258 ;-------------------------------------------------- + 259 ; In tanknr there is a number of the tank (player) + 260 ; that is buying weapons now (from 0). + 261 ; Rest of the data is taken from appropriate tables + 262 ; and during the purchase these tables are modified. + 263 + 264 + 265 7663 A9 E3 8D 1D 30 A9 + mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons + 266 766D 20 66 72 jsr PMoutofScreen + 267 + 268 ; we are clearing list of the weapons + 269 7670 A9 FF 8D 11 3F mva #$ff LastWeapon + 270 7675 A9 00 8D 12 3F mva #$00 WhichList + 271 ; offensive weapon - 0, deffensive - 1 + 272 + 273 ; there is a tank (player) number in tanknr + 274 ; we are displaying name of the player + 275 + 276 767A A8 tay ; from 0 to y + 277 767B A5 8B lda tanknr + 278 767D 0A asl + 279 767E 0A asl + 280 767F 0A asl ; 8 chars per name + 281 7680 AA tax + 282 7681 NextChar03 + 283 7681 BD 57 3F lda tanksnames,x + 284 7684 99 D1 3C sta textbuffer2+8,y + 285 7687 E8 inx + 286 7688 C8 iny + 287 7689 C0 08 cpy #$08 + 288 768B D0 F4 bne NextChar03 + 289 ; and we display cash of the given player + 290 + 291 ; here we must jump in after each purchase + 292 ; to generate again list of available weapons + 293 768D AfterPurchase + 294 768D A6 8B ldx tanknr + 295 768F BD 2C 3D lda moneyL,x + 296 7692 8D 41 3F sta decimal + 297 7695 BD 26 3D lda moneyH,x + 298 7698 8D 42 3F sta decimal+1 + 299 769B A9 E6 8D 43 3F A9 + mwa #textbuffer2+29 displayposition + 300 76A5 20 5E 7B jsr displaydec + 301 + 302 ; in xbyte there is the address of the line that + 303 ; is being processed now + 304 76A8 A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte + 305 76B0 A2 00 ldx #$00 ; number of the checked weapon + 306 76B2 8E 0E 3F stx HowManyOnTheList1 ; amounts of weapons (shells, bullets) in both lists + 307 76B5 8E 0F 3F stx HowManyOnTheList2 + 308 76B8 8E 10 3F stx PositionOnTheList + 309 + 310 ; Creating full list of the available weapons for displaying + 311 ; in X there is a number of the weapon to be checked, + 312 ; in 'Xbyte' address of the first char in filled screen line + 313 + 314 76BB CreateList + 315 ; checking if the weapon of the given number is present + 316 76BB BD 19 4C lda WeaponUnits,x + 317 76BE D0 03 4C C3 77 jeq NoWeapon + 318 ; checking if we can afford buying this weapon + 319 76C3 A4 8B ldy tanknr + 320 76C5 B9 26 3D lda moneyH,y + 321 76C8 DD 99 4B cmp WeaponPriceH,x + 322 76CB D0 06 bne CheckWeapon01 + 323 76CD B9 2C 3D lda moneyL,y + 324 76D0 DD D9 4B cmp WeaponPriceL,x + 325 76D3 CheckWeapon01 + 326 76D3 B0 03 4C C3 77 jcc TooLittleCash + 327 + 328 ; we have enough cash and the weapon can be + 329 ; added to the list + 330 76D8 86 91 stx temp ; number of weapon will be necessary later + 331 + 332 ; first parentheses and other special chars + 333 ; (it's easier this way) + 334 76DA A0 16 ldy #22 + 335 76DC A9 08 lda #08 ; "(" + 336 76DE 91 84 STA (XBYTE),y + 337 76E0 A0 20 ldy #32 + 338 76E2 A9 09 lda #09 ; ")" + 339 76E4 91 84 sta (xbyte),y + 340 76E6 A0 19 ldy #25 + 341 76E8 A9 0F lda #15 ; "/" + 342 76EA 91 84 sta (xbyte),y + 343 76EC C8 iny + 344 76ED A9 04 lda #04 ; "$" + 345 76EF 91 84 sta (xbyte),y + 346 76F1 A0 1F ldy #31 + 347 76F3 A9 10 lda #16 ; "0" + 348 76F5 91 84 sta (xbyte),y + 349 + 350 ; now symbol of the weapon + 351 76F7 BD 59 4C lda WeaponSymbols,x + 352 76FA A0 04 ldy #$4 ; 4 chars from the beginning of the line + 353 76FC 91 84 sta (xbyte),y + 354 + 355 ;now number of purchased units (bullets) + 356 76FE 18 clc + 357 76FF A5 84 lda xbyte + 358 7701 69 17 adc #23 ; 23 chars from the beginning of the line + 359 7703 8D 43 3F sta displayposition + 360 7706 A5 85 lda xbyte+1 + 361 7708 69 00 adc #$00 + 362 770A 8D 44 3F sta displayposition+1 + 363 770D BD 19 4C lda WeaponUnits,x + 364 7710 8D 41 3F sta decimal + 365 7713 20 C0 7B jsr displaybyte + 366 7716 A6 91 ldx temp ;getting back number of the weapon + 367 + 368 ; and now price of the weapon + 369 7718 18 clc + 370 7719 A5 84 lda xbyte + 371 771B 69 1B adc #27 ; 27 chars from the beginning of the line + 372 771D 8D 43 3F sta displayposition + 373 7720 A5 85 lda xbyte+1 + 374 7722 69 00 adc #$00 + 375 7724 8D 44 3F sta displayposition+1 + 376 7727 BD D9 4B lda WeaponPriceL,x + 377 772A 8D 41 3F sta decimal + 378 772D BD 99 4B lda WeaponPriceH,x + 379 7730 8D 42 3F sta decimal+1 + 380 7733 20 5E 7B jsr displaydec + 381 + 382 7736 A5 91 lda temp ;getting back number of the weapon + 383 7738 48 pha ;and saving it on the stack + 384 + 385 7739 20 E5 71 jsr HowManyBullets + 386 773C 8D 41 3F sta decimal + 387 + 388 773F 68 pla + 389 7740 85 91 sta temp ; let's store weapon number again + 390 + 391 7742 18 clc + 392 7743 A5 84 lda xbyte + 393 7745 69 01 adc #1 ; 1 char from the beginning of the screen + 394 7747 8D 43 3F sta displayposition + 395 774A A5 85 lda xbyte+1 + 396 774C 69 00 adc #$00 + 397 774E 8D 44 3F sta displayposition+1 + 398 7751 20 C0 7B jsr displaybyte + 399 + 400 ; and now name of the weapon and finisheeeedd !!!! + 401 7754 A6 91 ldx temp ;weapon number + 402 7756 A9 00 85 92 mva #0 temp+1 ; this number is only in X + 403 ; times 16 (it's length of the names of weapons) + 404 775A A0 03 ldy #3 ; Rotate 4 times + 405 775C Rotate02 + 406 775C 06 91 asl temp + 407 775E 26 92 rol temp+1 + 408 7760 88 dey + 409 7761 10 F9 bpl Rotate02 + 410 ; Hmmm..... Interesting why there is no CLC here? + 411 + 412 7763 18 A5 91 69 99 85 + adw temp #NamesOfWeapons modify + 413 7770 38 A5 B2 E9 06 85 + sbw modify #6 ; from 6th char + 414 + 415 777B A0 06 ldy #6 ; from 6th char + 416 + 417 777D modyf1 + 418 777D B1 B2 lda (modify),y + 419 777F 91 84 sta (xbyte),y + 420 7781 C8 iny + 421 7782 C0 16 cpy #(16+6) + 422 7784 D0 F7 bne modyf1 + 423 + 424 + 425 ; in X there is what we need + 426 + 427 ; If on screen after the purchase there is still + 428 ; present the weapon purchased recently, + 429 ; the pointer must point to it. + 430 + 431 7786 EC 11 3F cpx LastWeapon + 432 7789 D0 14 bne NotTheSameAsLastTime + 433 778B AD 12 3F lda WhichList + 434 778E D0 09 bne ominx06 + 435 7790 AD 0E 3F lda HowManyOnTheList1 + 436 7793 8D 10 3F sta PositionOnTheList + 437 7796 4C 9F 77 jmp NotTheSameAsLastTime + 438 7799 ominx06 + 439 7799 AD 0F 3F lda HowManyOnTheList2 + 440 779C 8D 10 3F sta PositionOnTheList + 441 779F NotTheSameAsLastTime + 442 ; increase appropriate counter + 443 779F 8A txa + 444 77A0 E0 30 cpx #$30 + 445 77A2 B0 0B bcs SecondList + 446 77A4 AC 0E 3F ldy HowManyOnTheList1 + 447 77A7 99 D6 3E sta NubersOfWeaponsL1,y + 448 77AA EE 0E 3F inc HowManyOnTheList1 + 449 77AD D0 09 bne NextLineOfTheList + 450 77AF SecondList + 451 77AF AC 0F 3F ldy HowManyOnTheList2 + 452 77B2 99 FE 3E sta NubersOfWeaponsL2,y + 453 77B5 EE 0F 3F inc HowManyOnTheList2 + 454 ; If everything is copied then next line + 455 77B8 NextLineOfTheList + 456 77B8 18 clc + 457 77B9 A5 84 lda xbyte + 458 77BB 69 28 adc #40 + 459 77BD 85 84 sta xbyte + 460 77BF 90 02 bcc TooLittleCash + 461 77C1 E6 85 inc xbyte+1 + 462 77C3 TooLittleCash + 463 77C3 NoWeapon + 464 + 465 ; next weapon. If no more weapons then finish! + 466 77C3 E8 inx + 467 77C4 E0 30 cpx #$30 + 468 77C6 D0 08 bne NoDefense + 469 + 470 ; if we got to the defense weapons, + 471 ; we switch address to the second table. + 472 77C8 A9 83 85 84 A9 39 + mwa #ListOfDefensiveWeapons xbyte + 473 77D0 NoDefense + 474 77D0 E0 40 cpx #$40 + 475 77D2 F0 03 4C BB 76 jne CreateList + 476 + 477 ; offset may be only too big + 478 ; (because after purchase list will never be longer) + 479 ; check it and modify if necessary. + 480 ; If offset is larger than position of the pointer, + 481 ; it must be equal. + 482 77D7 AD 10 3F lda PositionOnTheList + 483 77DA CD 13 3F cmp OffsetDL1 + 484 77DD B0 03 bcs WeHaveOffset ; do not modify offset + 485 77DF 8D 13 3F sta OffsetDL1 + 486 77E2 WeHaveOffset + 487 + 488 ; now we have to erase empty position of both lists. + 489 + 490 ; Multiply number on list 1 by 40 and set address + 491 ; of the first erased char. + 492 ; (multiplying taken from book of Ruszczyc 'Assembler 6502' + 493 + 494 77E2 AD 0E 3F lda HowManyOnTheList1 + 495 77E5 85 85 sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway) + 496 77E7 A9 00 lda #$00 ; higher byte of the Result + 497 77E9 85 84 sta xbyte ; lower byte of the Result + 498 77EB A2 08 ldx #$08 + 499 77ED Rotate04 + 500 77ED 46 85 lsr xbyte+1 + 501 77EF 90 03 bcc DoNotAddX01 + 502 77F1 18 clc + 503 77F2 69 28 adc #40 + 504 77F4 DoNotAddX01 + 505 77F4 6A ror + 506 77F5 66 84 ror xbyte + 507 77F7 CA dex + 508 77F8 D0 F3 bne Rotate04 + 509 77FA 85 85 sta xbyte+1 + 510 + 511 ; add to the address of the list + 512 77FC 18 clc + 513 77FD A5 84 lda xbyte + 514 77FF 69 E3 adc #ListOfWeapons + 518 7806 85 85 sta xbyte+1 + 519 7808 86 84 stx xbyte + 520 780A 8A txa ; now there is zero here + 521 780B ClearList1 + 522 780B 91 84 sta (xbyte),y + 523 780D C8 iny + 524 780E D0 02 bne DoNotIncHigher1 + 525 7810 E6 85 inc xbyte+1 + 526 7812 DoNotIncHigher1 + 527 7812 C0 83 cpy #ListOfWeapons1End + 531 781A D0 EF bne ClearList1 + 532 + 533 ; And the same we do with the second list + 534 + 535 ; Multiply number on list 1 by 40 and set address + 536 ; of the first erased char. + 537 781C AD 0F 3F lda HowManyOnTheList2 + 538 781F 85 85 sta xbyte+1 ; multiplier + 539 7821 A9 00 lda #$00 ; higher byte of the Result + 540 7823 85 84 sta xbyte ; lower byte of the Result + 541 7825 A2 08 ldx #$08 + 542 7827 Rotate05 + 543 7827 46 85 lsr xbyte+1 + 544 7829 90 03 bcc DoNotAddX02 + 545 782B 18 clc + 546 782C 69 28 adc #40 + 547 782E DoNotAddX02 + 548 782E 6A ror + 549 782F 66 84 ror xbyte + 550 7831 CA dex + 551 7832 D0 F3 bne Rotate05 + 552 7834 85 85 sta xbyte+1 + 553 + 554 ; add to the address of the list + 555 7836 18 clc + 556 7837 A5 84 lda xbyte + 557 7839 69 83 adc #ListOfDefensiveWeapons + 561 7840 85 85 sta xbyte+1 + 562 7842 86 84 stx xbyte + 563 7844 8A txa ; now there is zero here + 564 7845 ClearList2 + 565 7845 91 84 sta (xbyte),y + 566 7847 C8 iny + 567 7848 D0 02 bne DoNotIncHigher2 + 568 784A E6 85 inc xbyte+1 + 569 784C DoNotIncHigher2 + 570 784C C0 03 cpy #ListOfDefensiveWeaponsEnd + 574 7854 D0 EF bne ClearList2 + 575 + 576 ; here we have pretty cool lists and there is no brute force + 577 ; screen clearing at each list refresh + 578 ; (it was very ugly - I checked it :) + 579 + 580 + 581 ; Here we have all we need + 582 ; So choose the weapon for purchase ...... + 583 ;-------------------------------------------------- + 584 7856 ChoosingItemForPurchase + 585 ;-------------------------------------------------- + 586 7856 20 6A 79 jsr PutLitteChar ; Places pointer at the right position + 587 7859 20 76 74 jsr getkey + 588 785C C9 2C cmp #$2c ; Tab + 589 785E D0 03 4C E4 78 jeq ListChange + 590 7863 C9 0C cmp #$0c ; Return + 591 7865 F0 0F beq EndOfPurchase + 592 7867 C9 0E cmp #$e + 593 7869 F0 0C beq PurchaseKeyUp + 594 786B C9 0F cmp #$f + 595 786D F0 32 beq PurchaseKeyDown + 596 786F C9 21 cmp #$21 ; Space + 597 7871 D0 E3 bne ChoosingItemForPurchase + 598 7873 4C 10 79 jmp PurchaseWeaponNow + 599 7876 EndOfPurchase + 600 7876 60 rts + 601 7877 PurchaseKeyUp + 602 7877 AD 12 3F lda WhichList + 603 787A F0 0D beq GoUp1 + 604 787C CE 10 3F dec PositionOnTheList + 605 787F 10 1D bpl EndUpX + 606 7881 A9 00 lda #$00 + 607 7883 8D 10 3F sta PositionOnTheList + 608 7886 4C 56 78 jmp ChoosingItemForPurchase + 609 7889 GoUp1 + 610 7889 CE 10 3F dec PositionOnTheList + 611 788C 10 05 bpl MakeOffsetUp + 612 788E A9 00 lda #$00 + 613 7890 8D 10 3F sta PositionOnTheList + 614 + 615 7893 MakeOffsetUp + 616 ; If offset is larger than pointer position, + 617 ; it must be equal then. + 618 7893 AD 10 3F lda PositionOnTheList + 619 7896 CD 13 3F cmp OffsetDL1 + 620 7899 B0 03 bcs EndUpX ; do not modify the offset + 621 789B 8D 13 3F sta OffsetDL1 + 622 789E EndUpX + 623 789E 4C 56 78 jmp ChoosingItemForPurchase + 624 78A1 PurchaseKeyDown + 625 78A1 AD 12 3F lda WhichList + 626 78A4 F0 15 beq GoDown1 + 627 78A6 EE 10 3F inc PositionOnTheList + 628 78A9 AD 10 3F lda PositionOnTheList + 629 78AC CD 0F 3F cmp HowManyOnTheList2 + 630 78AF D0 30 bne EndGoDownX + 631 78B1 AC 0F 3F ldy HowManyOnTheList2 + 632 78B4 88 dey + 633 78B5 8C 10 3F sty PositionOnTheList + 634 78B8 4C 56 78 jmp ChoosingItemForPurchase + 635 78BB GoDown1 + 636 78BB EE 10 3F inc PositionOnTheList + 637 78BE AD 10 3F lda PositionOnTheList + 638 78C1 CD 0E 3F cmp HowManyOnTheList1 + 639 78C4 D0 07 bne MakeOffsetDown + 640 78C6 AC 0E 3F ldy HowManyOnTheList1 + 641 78C9 88 dey + 642 78CA 8C 10 3F sty PositionOnTheList + 643 78CD MakeOffsetDown + 644 78CD AD 13 3F lda OffsetDL1 + 645 78D0 18 clc + 646 78D1 69 0F adc #15 + 647 ;if offset+16 is lower than the position then it must =16 + 648 78D3 CD 10 3F cmp PositionOnTheList + 649 78D6 B0 09 bcs EndGoDownX + 650 78D8 38 sec + 651 78D9 AD 10 3F lda PositionOnTheList + 652 78DC E9 0F sbc #15 + 653 78DE 8D 13 3F sta OffsetDL1 + 654 78E1 EndGoDownX + 655 78E1 4C 56 78 jmp ChoosingItemForPurchase + 656 + 657 ; swapping the displayed list and setting pointer to position 0 + 658 78E4 ListChange + 659 78E4 AD 12 3F lda WhichList + 660 78E7 49 01 eor #$01 + 661 78E9 8D 12 3F sta WhichList + 662 78EC D0 0D bne SecondSelected + 663 78EE A9 E3 8D 1D 30 A9 + mwa #ListOfWeapons WeaponsListDL + 664 78F8 4C 05 79 jmp dalejx01 + 665 78FB SecondSelected + 666 78FB A9 83 8D 1D 30 A9 + mwa #ListOfDefensiveWeapons WeaponsListDL + 667 7905 dalejx01 + 668 7905 A9 00 lda #$00 + 669 7907 8D 10 3F sta PositionOnTheList + 670 790A 8D 13 3F sta OffsetDL1 + 671 790D 4C 56 78 jmp ChoosingItemForPurchase + 672 + 673 ; weapon purchase routne increases number of possessed bullets + 674 ; decreases cash and jumps to screen refresh + 675 ;-------------------------------------------------- + 676 7910 PurchaseWeaponNow + 677 ;-------------------------------------------------- + 678 7910 AD 12 3F lda WhichList + 679 7913 D0 09 bne PurchaseDeffensive + 680 + 681 ; here we purchase the offensive weapon + 682 7915 AC 10 3F ldy PositionOnTheList + 683 7918 B9 D6 3E lda NubersOfWeaponsL1,y + 684 791B 4C 24 79 jmp PurchaseAll + 685 791E PurchaseDeffensive + 686 791E AC 10 3F ldy PositionOnTheList + 687 7921 B9 FE 3E lda NubersOfWeaponsL2,y + 688 7924 PurchaseAll + 689 ; after getting weapon number the routine is common for all + 690 7924 A6 8B ldx tanknr + 691 7926 A8 tay ; weapon number is in Y + 692 7927 38 sec + 693 7928 BD 2C 3D lda moneyL,x ; substracting from posessed money + 694 792B F9 D9 4B sbc WeaponPriceL,y ; of price of the given weapon + 695 792E 9D 2C 3D sta moneyL,x + 696 7931 BD 26 3D lda moneyH,x + 697 7934 F9 99 4B sbc WeaponPriceH,y + 698 7937 9D 26 3D sta moneyH,x + 699 ; now we have get address of + 700 ; the table of the weapon of the tank + 701 ; and add appropriate number of bullets + 702 793A 86 91 stx temp ;we will multiply by 64 + 703 793C A9 00 85 92 mva #0 temp+1 + 704 ; times 64 + 705 ; (because it is the lenght of one record in weapon table) + 706 7940 A2 05 ldx #5 ; Rotate 6 times + 707 ; (in Y there is a weapon number, we do not touch it!!!) + 708 7942 Rotate03 + 709 7942 06 91 asl temp + 710 7944 26 92 rol temp+1 + 711 7946 CA dex + 712 7947 10 F9 bpl Rotate03 + 713 7949 A9 87 lda #TanksWeapon1 + 717 7951 65 92 adc temp+1 + 718 7953 85 92 sta temp+1 + 719 + 720 7955 B1 91 lda (temp),y ; and we have number of posessed bullets of the weapon + 721 7957 79 19 4C adc WeaponUnits,y + 722 795A 91 91 sta (temp),y ; and we added appropriate number of bullets + 723 795C C9 64 cmp #100 ; but there should be no more than 99 bullets + 724 795E 90 04 bcc LessThan100 + 725 7960 A9 63 lda #99 + 726 7962 91 91 sta (temp),y + 727 7964 LessThan100 + 728 7964 8C 11 3F sty LastWeapon ; store last purchased weapon + 729 ; because we must put screen pointer next to it + 730 7967 4C 8D 76 jmp AfterPurchase + 731 + 732 + 733 796A PutLitteChar + 734 ; first let's cleat both lists from little chars + 735 796A A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte + 736 7972 A2 34 ldx #52 ; there are 52 lines total + 737 7974 A0 00 ldy #$00 + 738 7976 EraseLoop + 739 7976 A9 00 lda #$00 + 740 7978 91 84 sta (xbyte),y + 741 797A 18 clc + 742 797B A5 84 lda xbyte + 743 797D 69 28 adc #40 + 744 797F 85 84 sta xbyte + 745 7981 90 02 bcc ominx02 + 746 7983 E6 85 inc xbyte+1 + 747 7985 ominx02 + 748 7985 CA dex + 749 7986 10 EE bpl EraseLoop + 750 ; now let's check which list is active now + 751 7988 AD 12 3F lda WhichList + 752 798B F0 30 beq CharToList1 + 753 ; we are on the second list (deffensive) + 754 ; so there is no problem with scrolling + 755 798D A9 83 85 84 A9 39 + mwa #ListOfDefensiveWeapons xbyte + 756 7995 AE 10 3F ldx PositionOnTheList + 757 7998 F0 0E beq SelectList2 ; if there is 0 we add nothing + 758 799A AddLoop2 + 759 799A 18 clc + 760 799B A5 84 lda xbyte + 761 799D 69 28 adc #40 + 762 799F 85 84 sta xbyte + 763 79A1 90 02 bcc ominx03 + 764 79A3 E6 85 inc xbyte+1 + 765 79A5 ominx03 + 766 79A5 CA dex + 767 79A6 D0 F2 bne AddLoop2 + 768 79A8 SelectList2 + 769 79A8 A9 7F lda #$7f ; little char (tab) - this is the pointer + 770 79AA 91 84 sta (xbyte),y + 771 ; now we clear flags of presence of list "out of screen" + 772 ; unfortunately I am now sure what it means... :( + 773 79AC A2 51 ldx #EmptyLine + 775 79B0 8E 19 30 stx MoreUpdl + 776 79B3 8C 1A 30 sty MoreUpdl+1 + 777 79B6 8E 3F 30 stx MoreDowndl + 778 79B9 8C 40 30 sty MoreDowndl+1 + 779 79BC 60 rts + 780 79BD CharToList1 + 781 ; we putchar on list 1 + 782 ; and later set-up list itself + 783 79BD A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte + 784 79C5 AE 10 3F ldx PositionOnTheList + 785 79C8 F0 0E beq SelectList1 ; if there is 0 we add nothing + 786 79CA AddLoop1 + 787 79CA 18 clc + 788 79CB A5 84 lda xbyte + 789 79CD 69 28 adc #40 + 790 79CF 85 84 sta xbyte + 791 79D1 90 02 bcc ominx04 + 792 79D3 E6 85 inc xbyte+1 + 793 79D5 ominx04 + 794 79D5 CA dex + 795 79D6 D0 F2 bne AddLoop1 + 796 79D8 SelectList1 + 797 79D8 A9 7F lda #$7f ; pointer = little char = (tab) + 798 79DA 91 84 sta (xbyte),y + 799 ; now moving the window basing on given offset + 800 79DC A9 E3 85 84 A9 33 + mwa #ListOfWeapons xbyte + 801 79E4 AE 13 3F ldx OffsetDL1 + 802 79E7 F0 0E beq SetWindowList1 ; if zero then add nothing + 803 79E9 LoopWindow1 + 804 79E9 18 clc + 805 79EA A5 84 lda xbyte + 806 79EC 69 28 adc #40 + 807 79EE 85 84 sta xbyte + 808 79F0 90 02 bcc ominx05 + 809 79F2 E6 85 inc xbyte+1 + 810 79F4 ominx05 + 811 79F4 CA dex + 812 79F5 D0 F2 bne LoopWindow1 + 813 79F7 SetWindowList1 + 814 79F7 A5 84 8D 1D 30 A5 + mwa xbyte WeaponsListDL ; and we change Display List + 815 + 816 ; we show screen line with arrows meaning that + 817 ; you can scroll the list up + 818 7A01 A2 51 ldx #EmptyLine + 820 7A05 AD 13 3F lda OffsetDL1 + 821 7A08 F0 04 beq NoArrowUp + 822 7A0A A2 93 ldx #MoreUp + 824 7A0E NoArrowUp + 825 7A0E 8E 19 30 stx MoreUpdl + 826 7A11 8C 1A 30 sty MoreUpdl+1 + 827 ; the same, bu scrolling down + 828 7A14 AD 0E 3F lda HowManyOnTheList1 + 829 7A17 A2 51 ldx #EmptyLine + 831 7A1B 38 sec + 832 7A1C E9 11 sbc #17 + 833 7A1E 30 09 bmi NoArrowDown + 834 7A20 CD 13 3F cmp OffsetDL1 + 835 7A23 90 04 bcc NoArrowDown + 836 7A25 A2 BB ldx #MoreDown + 838 7A29 NoArrowDown + 839 7A29 8E 3F 30 stx MoreDowndl + 840 7A2C 8C 40 30 sty MoreDowndl+1 + 841 7A2F 60 rts + 842 + 843 ; ----------------------------------------------------- + 844 7A30 EnterPlayerName + 845 ; in: TankNr + 846 ; Out: TanksNames, SkillTable + 847 + 848 ; this little thing is for choosing Player's skill (if computer) + 849 ; and entering his name + 850 ; If no name entered, there should be name "1st Tank", etc. + 851 ; Default tanks names are in table TanksNamesDefault + 852 ; ----------------------------------------------------- + 853 + 854 7A30 20 66 72 jsr PMoutofScreen + 855 ; display tank number + 856 7A33 A6 8B ldx tanknr + 857 7A35 E8 inx + 858 7A36 8E 41 3F stx decimal + 859 7A39 A9 BC 8D 43 3F A9 + mwa #(NameScreen+41) displayposition + 860 7A43 20 C0 7B jsr displaybyte + 861 7A46 20 33 7B jsr SelectLevel ; setting choosen level of the opponent (Moron, etc) + 862 ; clear the name and place cursor at position 0 + 863 7A49 A9 00 lda #0 + 864 7A4B 8D 2D 3F sta PositionInName + 865 7A4E A2 08 ldx #$08 ; one more because cursor could be there + 866 7A50 LoopName01 + 867 7A50 9D C7 32 sta NameAdr,x + 868 7A53 CA dex + 869 7A54 D0 FA bne LoopName01 + 870 7A56 A9 80 lda #$80 ; place cursor on the beginning + 871 7A58 8D C7 32 sta NameAdr + 872 7A5B CheckKeys + 873 7A5B 20 76 74 jsr getkey + 874 ; is if the char to be recorded? + 875 7A5E A2 25 ldx #37 ; table is 38 chars long + 876 7A60 IsLetter + 877 7A60 DD AF 3D cmp keycodes,x + 878 7A63 F0 05 beq YesLetter + 879 7A65 CA dex + 880 7A66 10 F8 bpl IsLetter + 881 7A68 30 1D bmi CheckFurtherX01 ; if not in the table + 882 ; we check cursors and (Return) + 883 7A6A YesLetter + 884 7A6A BD D5 3D lda scrcodes,x ; we have screen code of the char + 885 7A6D AE 2D 3F ldx PositionInName + 886 7A70 D0 02 bne NotFirstLetter + 887 7A72 29 3F and #$3f ; First letter should be Capital letter + 888 ; (nice trick does not affect digits) + 889 7A74 NotFirstLetter + 890 7A74 9D C7 32 sta NameAdr,x + 891 7A77 E8 inx + 892 7A78 A9 80 lda #$80 ; cursor behind the char + 893 7A7A 9D C7 32 sta NameAdr,x + 894 7A7D E0 08 cpx #$08 ; is there 8 characters? + 895 7A7F F0 DA beq CheckKeys ; if so, nothing increased + 896 7A81 8E 2D 3F stx PositionInName ; if not, we store + 897 ; position incremented by 1 + 898 + 899 7A84 4C 5B 7A jmp CheckKeys + 900 7A87 CheckFurtherX01 ; here we check Tab, Return and Del + 901 7A87 C9 0C cmp #$0c ; Return + 902 7A89 F0 76 beq EndOfNick + 903 7A8B C9 2C cmp #$2c ; Tab + 904 7A8D F0 29 beq ChangeOfLevelUp + 905 7A8F C9 07 cmp #$7 ;cursor right + 906 7A91 F0 25 beq ChangeOfLevelUp + 907 7A93 C9 06 cmp #$6 ;cursor left + 908 7A95 F0 36 beq ChangeOfLevelDown + 909 7A97 C9 0F cmp #$f ;cursor down + 910 7A99 F0 45 beq ChangeOfLevel3Up + 911 + 912 7A9B C9 34 cmp #$34 ; Backspace (del) + 913 7A9D D0 BC bne CheckKeys + 914 ; handling backing one char + 915 7A9F AE 2D 3F ldx PositionInName + 916 7AA2 F0 01 beq FirstChar + 917 7AA4 CA dex + 918 7AA5 FirstChar + 919 7AA5 A9 80 lda #$80 + 920 7AA7 9D C7 32 sta NameAdr,x + 921 7AAA A9 00 lda #$00 + 922 7AAC 9D C8 32 sta NameAdr+1,x + 923 7AAF 9D C9 32 sta NameAdr+2,x + 924 7AB2 8E 2D 3F stx PositionInName + 925 7AB5 4C 5B 7A jmp CheckKeys + 926 7AB8 ChangeOfLevelUp ; change difficulty level of computer opponent + 927 7AB8 EE 2E 3F AD 2E 3F inc:lda DifficultyLevel + 928 7ABE C9 09 cmp #9 ; 9 levels are possible + 929 7AC0 D0 05 bne DoNotLoopLevelUp + 930 7AC2 A9 00 8D 2E 3F mva #$0 DifficultyLevel + 931 7AC7 DoNotLoopLevelUp + 932 7AC7 20 33 7B jsr SelectLevel + 933 7ACA 4C 5B 7A jmp CheckKeys + 934 ;---- + 935 7ACD ChangeOfLevelDown + 936 7ACD CE 2E 3F AD 2E 3F dec:lda DifficultyLevel + 937 7AD3 10 05 bpl DoNotLoopLevelDown + 938 7AD5 A9 08 8D 2E 3F mva #$8 DifficultyLevel + 939 7ADA DoNotLoopLevelDown + 940 7ADA 20 33 7B jsr SelectLevel + 941 7ADD 4C 5B 7A jmp CheckKeys + 942 ;---- + 943 7AE0 ChangeOfLevel3Up + 944 ;adw DifficultyLevel #3 + 945 7AE0 18 clc + 946 7AE1 AD 2E 3F lda DifficultyLevel + 947 7AE4 69 03 adc #3 + 948 7AE6 8D 2E 3F sta DifficultyLevel + 949 + 950 7AE9 C9 09 cmp #9 + 951 7AEB 90 0E bcc DoNotLoopLevel3Up + 952 + 953 7AED 38 AD 2E 3F E9 09 + sbw DifficultyLevel #9 + 954 + 955 7AFB DoNotLoopLevel3Up + 956 7AFB 20 33 7B jsr SelectLevel + 957 7AFE 4C 5B 7A jmp CheckKeys + 958 ;---- + 959 7B01 EndOfNick + 960 ; storing name of the player and its level + 961 + 962 ; level of the computer opponent goes to + 963 ; the table of levels (difficulties) + 964 7B01 A6 8B ldx tanknr + 965 7B03 AD 2E 3F lda DifficultyLevel + 966 7B06 9D 20 3D sta skilltable,x + 967 ; storing name of the tank in the right space + 968 ; (without cursor!) + 969 7B09 A0 00 ldy #$00 + 970 7B0B 8A txa ; ldx TankNr + 971 7B0C 0A asl + 972 7B0D 0A asl + 973 7B0E 0A asl ; 8 chars per name + 974 7B0F AA tax ; in X where to put new name + 975 + 976 7B10 AD C7 32 lda NameAdr ; check if first char is " " + 977 7B13 29 7F and #$7F ; remove inverse (Cursor) + 978 7B15 F0 0F beq MakeDefaultName + 979 + 980 7B17 nextchar04 + 981 7B17 B9 C7 32 lda NameAdr,y + 982 7B1A 29 7F and #$7f ; remove inverse (Cursor) + 983 7B1C 9D 57 3F sta tanksnames,x + 984 7B1F E8 inx + 985 7B20 C8 iny + 986 7B21 C0 08 cpy #$08 + 987 7B23 D0 F2 bne nextchar04 + 988 7B25 60 rts + 989 7B26 MakeDefaultName + 990 7B26 nextchar05 + 991 7B26 BD 69 4B lda tanksnamesDefault,x + 992 7B29 9D 57 3F sta tanksnames,x + 993 7B2C E8 inx + 994 7B2D C8 iny + 995 7B2E C0 08 cpy #$08 + 996 7B30 D0 F4 bne nextchar05 + 997 7B32 60 rts + 998 + 999 + 1000 + 1001 + 1002 7B33 SelectLevel + 1003 ; this routine highlights the choosen + 1004 ; level of the computer opponent + 1005 7B33 A2 09 ldx #$9 ; 9 possible levels + 1006 7B35 CheckNextLevel01 + 1007 7B35 BD 2F 3F lda LevelNameBeginL,x ; address on the screen + 1008 7B38 85 91 sta temp + 1009 7B3A BD 38 3F lda LevelNameBeginH,x + 1010 7B3D 85 92 sta temp+1 + 1011 7B3F A0 09 ldy #9 ; flip 10 chars to inverse video + 1012 7B41 EC 2E 3F cpx DifficultyLevel ; is it the choosen level? + 1013 7B44 D0 0B bne NotThisLevel + 1014 ; change to inverse, because it is it! + 1015 7B46 InverseFurther + 1016 7B46 B1 91 lda (temp),y + 1017 7B48 09 80 ora #$80 + 1018 7B4A 91 91 sta (temp),y + 1019 7B4C 88 dey + 1020 7B4D 10 F7 bpl InverseFurther + 1021 7B4F 30 09 bmi CheckNextLevel ; Check Next Level + 1022 7B51 NotThisLevel + 1023 7B51 B1 91 lda (temp),y + 1024 7B53 29 7F and #$7f + 1025 7B55 91 91 sta (temp),y + 1026 7B57 88 dey + 1027 7B58 10 F7 bpl NotThisLevel + 1028 7B5A CheckNextLevel + 1029 7B5A CA dex + 1030 7B5B 10 D8 bpl CheckNextLevel01 + 1031 7B5D 60 rts + 1032 ;-------------------------------------------------- + 1033 7B5E displaydec ;decimal (word), displayposition (word) + 1034 ;-------------------------------------------------- + 1035 ; displays decimal number as in parameters (in text mode) + 1036 ; leading zeores are removed + 1037 ; the range is (0000..9999 - two bytes) + 1038 + 1039 7B5E A0 03 ldy #3 ; there will be 4 digits + 1040 7B60 NextDigit + 1041 7B60 A2 10 ldx #16 ; 16-bit dividee so Rotate 16 times + 1042 7B62 A9 00 lda #$00 + 1043 7B64 Rotate000 + 1044 7B64 aslw decimal +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7B64 0E 41 3F ASL DECIMAL + 2 7B67 2E 42 3F ROL DECIMAL+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1045 7B6A 2A rol ; scroll dividee + 1046 ; (as highest byte - additional - byte is A) + 1047 7B6B C9 0A cmp #10 ; divider + 1048 7B6D 90 05 bcc TooLittle000 ; if A is smaller than divider + 1049 ; there is nothing to substract + 1050 7B6F E9 0A sbc #10 ; divider + 1051 7B71 EE 41 3F inc decimal ; lowest bit set to 1 + 1052 ; because it is 0 and this is the fastest way + 1053 7B74 CA TooLittle000 dex + 1054 7B75 D0 ED bne Rotate000 ; and Rotate 16 times, Result will be in decimal + 1055 7B77 AA tax ; and the rest in A + 1056 ; (and it goes to X because + 1057 ; it is our decimal digit) + 1058 7B78 BD 03 7C lda digits,x + 1059 7B7B 99 45 3F sta decimalresult,y + 1060 7B7E 88 dey + 1061 7B7F 10 DF bpl NextDigit ; Result again /10 and we have next digit + 1062 + 1063 + 1064 7B81 rightnumber + 1065 ; now cut leading zeroes (002 goes 2) + 1066 7B81 AD 45 3F lda decimalresult + 1067 7B84 CD 0D 7C cmp zero + 1068 7B87 D0 22 bne decimalend + 1069 7B89 AD 0F 7C lda space + 1070 7B8C 8D 45 3F sta decimalresult + 1071 + 1072 7B8F AD 46 3F lda decimalresult+1 + 1073 7B92 CD 0D 7C cmp zero + 1074 7B95 D0 14 bne decimalend + 1075 7B97 AD 0F 7C lda space + 1076 7B9A 8D 46 3F sta decimalresult+1 + 1077 + 1078 7B9D AD 47 3F lda decimalresult+2 + 1079 7BA0 CD 0D 7C cmp zero + 1080 7BA3 D0 06 bne DecimalEnd + 1081 7BA5 AD 0F 7C lda space + 1082 7BA8 8D 47 3F sta decimalresult+2 + 1083 + 1084 7BAB DecimalEnd + 1085 ; displaying + 1086 7BAB AD 43 3F 85 B2 AD + mwa displayposition modify + 1087 7BB5 A0 03 ldy #3 + 1088 7BB7 displayloop + 1089 7BB7 B9 45 3F lda decimalresult,y + 1090 7BBA 91 B2 sta (modify),y + 1091 7BBC 88 dey + 1092 7BBD 10 F8 bpl displayloop + 1093 + 1094 7BBF 60 rts + 1095 + 1096 + 1097 ;-------------------------------------------------- + 1098 7BC0 displaybyte ;decimal (byte), displayposition (word) + 1099 ;-------------------------------------------------- + 1100 ; displays decimal number as in parameters (in text mode) + 1101 ; leading zeores are removed + 1102 ; the range is (00..99 - one byte) + 1103 + 1104 7BC0 A0 01 ldy #1 ; there will be 2 digits + 1105 7BC2 NextDigit2 + 1106 7BC2 A2 08 ldx #8 ; 8-bit dividee so Rotate 8 times + 1107 7BC4 A9 00 lda #$00 + 1108 7BC6 Rotate001 + 1109 7BC6 0E 41 3F asl decimal + 1110 7BC9 2A rol ; scroll dividee + 1111 ; (as highest byte - additional - byte is A) + 1112 7BCA C9 0A cmp #10 ; divider + 1113 7BCC 90 05 bcc TooLittle001 ; if A is smaller than divider + 1114 ; there is nothing to substract + 1115 7BCE E9 0A sbc #10 ; divider + 1116 7BD0 EE 41 3F inc decimal ; because it is 0 and this is the fastest way + 1117 7BD3 CA TooLittle001 dex + 1118 7BD4 D0 F0 bne Rotate001 ; and Rotate 8 times, Result will be in decimal + 1119 7BD6 AA tax ; and the rest in A + 1120 ; (and it goes to X because + 1121 ; it is our decimal digit) + 1122 7BD7 BD 03 7C lda digits,x + 1123 7BDA 99 45 3F sta decimalresult,y + 1124 7BDD 88 dey + 1125 7BDE 10 E2 bpl NextDigit2 ; Result again /10 and we have next digit + 1126 + 1127 ; now cut leading zeroes (02 goes 2) + 1128 7BE0 AD 45 3F lda decimalresult + 1129 7BE3 CD 0D 7C cmp zero + 1130 7BE6 D0 06 bne decimalend1 + 1131 7BE8 AD 0F 7C lda space + 1132 7BEB 8D 45 3F sta decimalresult + 1133 + 1134 7BEE decimalend1 + 1135 ; displaying + 1136 7BEE AD 43 3F 85 B2 AD + mwa displayposition modify + 1137 7BF8 A0 01 ldy #1 + 1138 7BFA displayloop1 + 1139 7BFA B9 45 3F lda decimalresult,y + 1140 7BFD 91 B2 sta (modify),y + 1141 7BFF 88 dey + 1142 7C00 10 F8 bpl displayloop1 + 1143 + 1144 7C02 60 rts + 1145 ;-------decimal constans + 1146 7C03 10 11 12 13 14 15 + digits dta d"0123456789" + 1147 7C0D 10 zero dta d"0" + 1148 7C0E nineplus ;.sbyte ('9+1) + 1149 7C0E 1A dta d"9"+1 + 1150 7C0F 00 space dta d" " + 1151 + 1152 ;-------------------------------------------------------- + 1153 7C10 DisplayOffensiveTextNr ; + 1154 ;This routine displays texts using PutChar4x4 + 1155 ;pretty cool, eh + 1156 ;parameters are: + 1157 ;Y - number of tank above which text is displayed + 1158 ;TextNumber - number of offensive text to display + 1159 + 1160 ;lets calculate position of the text first! + 1161 ;that's easy because we have number of tank + 1162 ;and xtankstableL and H keep X position of a given tank + 1163 + 1164 7C10 B9 97 3D lda xtankstableL,y + 1165 7C13 85 91 sta temp + 1166 7C15 B9 9D 3D lda xtankstableH,y + 1167 7C18 85 92 sta temp+1 + 1168 ;now we should substract length of the text + 1169 7C1A AE DC 44 ldx TextNumberOff + 1170 7C1D BD C9 5A lda talk.OffensiveTextLengths,x + 1171 7C20 0A asl + 1172 7C21 85 93 sta temp2 + 1173 7C23 A9 00 85 94 mva #0 temp2+1 + 1174 ;here we assume max length of text + 1175 ;to display is 127 chars! + 1176 + 1177 ;now we have HALF length in pixels + 1178 ;stored in temp2 + 1179 7C27 38 A5 91 E5 93 85 + sbw temp temp2 ; here begin of the text is in TEMP !!!! + 1180 ;now we should check overflows + 1181 7C34 A5 92 lda temp+1 + 1182 7C36 10 08 bpl DOTNnotLessThanZero + 1183 ;less than zero, so should be zero + 1184 7C38 A9 00 85 91 85 92 mwa #0 temp + 1185 7C3E F0 30 beq DOTNnoOverflow + 1186 + 1187 7C40 DOTNnotLessThanZero + 1188 ;so check if end larger than screenwidth + 1189 + 1190 + 1191 7C40 BD C9 5A lda talk.OffensiveTextLengths,x + 1192 7C43 0A asl + 1193 7C44 0A asl + 1194 ;length in pixels - + 1195 ;text length max 63 chars !!!!!!!! + 1196 + 1197 + 1198 7C45 18 clc + 1199 7C46 65 91 adc temp + 1200 7C48 85 93 sta temp2 + 1201 7C4A A9 00 lda #0 + 1202 7C4C 65 92 adc temp+1 + 1203 7C4E 85 94 sta temp2+1 + 1204 ;now in temp2 is end of the text in pixels + 1205 ;so check if not greater than screenwitdth + 1206 7C50 A5 94 C9 01 D0 04 + cpw temp2 #screenwidth + 1207 7C5A 90 14 bcc DOTNnoOverflow + 1208 ;if end is greater than screenwidth + 1209 ;then screenwidth - length is fine + 1210 + 1211 + 1212 7C5C BD C9 5A lda talk.OffensiveTextLengths,x + 1213 7C5F 0A asl + 1214 7C60 0A asl + 1215 7C61 85 91 sta temp + 1216 + 1217 7C63 38 sec + 1218 7C64 A9 3F lda #<(screenwidth-1) + 1219 7C66 E5 91 sbc temp + 1220 7C68 85 91 sta temp + 1221 7C6A A9 01 lda #>(screenwidth-1) + 1222 7C6C E5 92 sbc temp+1 + 1223 7C6E 85 92 sta temp+1 + 1224 7C70 DOTNnoOverflow + 1225 ;here in temp we have really good x position of text + 1226 + 1227 7C70 A5 91 8D D6 44 A5 + mwa temp TextPositionX + 1228 + 1229 ;now let's get y position + 1230 ;we will try to put text as low as possible + 1231 ;just above mountains (so mountaintable will be checked) + 1232 7C7A BD C9 5A lda talk.OffensiveTextLengths,x + 1233 7C7D 0A asl + 1234 7C7E 0A asl + 1235 7C7F A8 tay + 1236 ;in temp there still is X position of text + 1237 ;if we add temp and Y we will get end of the text + 1238 ;so, lets go through mountaintable and look for + 1239 ;the lowest value within + 1240 ;Mountaitable+temp and Mountaitable+temp+Y + 1241 + 1242 7C80 18 A5 91 69 13 85 + adw temp #MountainTable + 1243 + 1244 7C8D A9 C8 85 93 mva #screenheight temp2 ;initialisation of the lowest value + 1245 + 1246 7C91 DOTLowestMountainValueLoop + 1247 7C91 B1 91 lda (temp),y + 1248 7C93 C5 93 cmp temp2 + 1249 7C95 B0 02 bcs DOTOldLowestValue ;old lowest value + 1250 ;new lowest value + 1251 7C97 85 93 sta temp2 + 1252 7C99 DOTOldLowestValue + 1253 7C99 88 dey + 1254 7C9A C0 FF cpy #$ff + 1255 7C9C D0 F3 bne DOTLowestMountainValueLoop + 1256 + 1257 + 1258 + 1259 7C9E 38 sec + 1260 7C9F A5 93 lda temp2 + 1261 7CA1 E9 0D sbc #(4+9) ;9 pixels above ground (and tanks...) + 1262 7CA3 8D D8 44 sta TextPositionY + 1263 + 1264 + 1265 7CA6 BD E5 59 lda talk.OffensiveTextTableL,x + 1266 7CA9 8D D9 44 sta TextAddress + 1267 7CAC BD 57 5A lda talk.OffensiveTextTableH,x + 1268 7CAF 8D DA 44 sta TextAddress+1 + 1269 7CB2 A9 00 8D DB 44 mva #0 TextCounter + 1270 7CB7 DOTNcharloop + 1271 7CB7 AD D9 44 85 91 AD + mwa TextAddress temp + 1272 7CC1 AC DB 44 ldy TextCounter + 1273 + 1274 7CC4 B1 91 lda (temp),y + 1275 7CC6 38 SEC + 1276 7CC7 E9 20 sbc #32 ;conversion from ASCII to .sbyte + 1277 + 1278 7CC9 8D 50 48 sta CharCode4x4 + 1279 7CCC AD DB 44 lda TextCounter + 1280 7CCF 0A asl + 1281 7CD0 0A asl + 1282 7CD1 18 clc + 1283 7CD2 6D D6 44 adc TextPositionX + 1284 7CD5 85 80 sta Xdraw + 1285 7CD7 A9 00 lda #0 + 1286 7CD9 6D D7 44 adc TextPositionX+1 + 1287 7CDC 85 81 sta Xdraw+1 + 1288 7CDE AD D8 44 lda TextPositionY + 1289 7CE1 85 82 sta ydraw + 1290 7CE3 20 23 8B jsr PutChar4x4 + 1291 + 1292 7CE6 EE DB 44 inc TextCounter + 1293 7CE9 AE DC 44 ldx TextNumberOff + 1294 7CEC BD C9 5A lda talk.OffensiveTextLengths,x + 1295 7CEF CD DB 44 cmp TextCounter + 1296 7CF2 D0 C3 bne DOTNcharloop + 1297 + 1298 7CF4 60 rts + 1299 + 1300 ;------------------------------- + 1301 7CF5 TypeLine4x4 ; + 1302 ;------------------------------- + 1303 ;this routine prints line ending with $ff + 1304 ;address in LineAddress4x4 + 1305 ;starting from LineXdraw, LineYdraw + 1306 + 1307 7CF5 A0 00 ldy #0 + 1308 7CF7 8C E0 44 sty LineCharNr + 1309 + 1310 + 1311 7CFA TypeLine4x4Loop + 1312 7CFA AC E0 44 ldy LineCharNr + 1313 + 1314 + 1315 7CFD AD DE 44 85 91 AD + mwa LineAddress4x4 temp + 1316 7D07 B1 91 lda (temp),y + 1317 7D09 C9 FF cmp #$ff + 1318 7D0B F0 29 beq EndOfTypeLine4x4 + 1319 + 1320 7D0D 8D 50 48 sta CharCode4x4 + 1321 7D10 AD E1 44 85 80 AD + mwa LineXdraw Xdraw + 1322 7D1A AD E3 44 85 82 mva LineYdraw Ydraw + 1323 7D1F 20 A0 8B jsr PutChar4x4FULL ;type empty pixels as well! + 1324 7D22 18 AD E1 44 69 04 + adw LineXdraw #4 + 1325 7D30 EE E0 44 inc LineCharNr + 1326 7D33 4C FA 7C jmp TypeLine4x4Loop + 1327 + 1328 7D36 EndOfTypeLine4x4 + 1329 7D36 60 rts + 1330 + 1331 ;-------------------------------- + 1332 7D37 DisplayResults ; + 1333 ;displays results of the round + 1334 ;using 4x4 font + 1335 + 1336 ;centering the result screen + 1337 7D37 A9 84 8D 3D 45 A9 + mwa #((ScreenWidth/2)-(7*4)) ResultX + 1338 7D41 A9 44 8D 3F 45 mva #((ScreenHeight/2)-(8*4)) ResultY + 1339 + 1340 + 1341 ;upper frame + 1342 7D46 A9 E4 8D DE 44 A9 + mwa #LineTop LineAddress4x4 + 1343 7D50 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1344 7D5C AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1345 7D62 A9 01 8D 51 48 mva #1 plot4x4color + 1346 7D67 20 F5 7C jsr TypeLine4x4 + 1347 + 1348 7D6A 18 AD 3F 45 69 04 + adw ResultY #4 ;next line + 1349 + 1350 ;Header1 + 1351 ;Displays round number + 1352 7D78 AD 4B 3F lda CurrentRoundNr + 1353 7D7B 8D 41 3F sta decimal + 1354 7D7E A9 17 8D 43 3F A9 + mwa #RoundNrDisplay displayposition + 1355 7D88 20 C0 7B jsr displaybyte ;decimal (byte), displayposition (word) + 1356 + 1357 7D8B A9 0E 8D DE 44 A9 + mwa #LineHeader1 LineAddress4x4 + 1358 7D95 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1359 7DA1 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1360 7DA7 A9 01 8D 51 48 mva #1 plot4x4color + 1361 7DAC 20 F5 7C jsr TypeLine4x4 + 1362 + 1363 7DAF 18 AD 3F 45 69 04 + adw ResultY #4 ;next line + 1364 + 1365 ;Empty line + 1366 7DBD A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4 + 1367 7DC7 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1368 7DD3 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1369 7DD9 A9 01 8D 51 48 mva #1 plot4x4color + 1370 7DDE 20 F5 7C jsr TypeLine4x4 + 1371 + 1372 7DE1 18 AD 3F 45 69 02 + adw ResultY #2 ;next line + 1373 + 1374 + 1375 ;Header2 + 1376 7DEF A9 1C 8D DE 44 A9 + mwa #LineHeader2 LineAddress4x4 + 1377 7DF9 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1378 7E05 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1379 7E0B A9 01 8D 51 48 mva #1 plot4x4color + 1380 7E10 20 F5 7C jsr TypeLine4x4 + 1381 + 1382 7E13 18 AD 3F 45 69 04 + adw ResultY #4 ;next line + 1383 + 1384 ;Empty line + 1385 7E21 A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4 + 1386 7E2B AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1387 7E37 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1388 7E3D A9 01 8D 51 48 mva #1 plot4x4color + 1389 7E42 20 F5 7C jsr TypeLine4x4 + 1390 + 1391 7E45 38 AD 3F 45 E9 02 + sbw ResultY #2 ;next line (was empty) + 1392 + 1393 7E53 AE 19 3D ldx NumberOfPlayers ;we start from the highest (best) tank + 1394 7E56 CA dex ;and it is the last one + 1395 7E57 8E 40 45 stx ResultOfTankNr ;in TankSequence table + 1396 + 1397 7E5A A9 57 85 95 A9 3F + mwa #TanksNames tempXROLLER + 1398 + 1399 7E62 ResultOfTheNextPlayer + 1400 7E62 AE 40 45 ldx ResultOfTankNr ;we are after a round, so we can use TankNr + 1401 7E65 BD 1A 3D lda TankSequence,x ;and we keep here real number if the tank + 1402 7E68 85 8B sta TankNr ;for which we are displaying results + 1403 + 1404 + 1405 + 1406 + 1407 7E6A 18 AD 3F 45 69 04 + adw ResultY #4 ;next line + 1408 + 1409 ;there are at least 2 players, so we can safely + 1410 ;start displaying the result + 1411 + 1412 7E78 A2 00 ldx #0 + 1413 7E7A A9 03 lda #3 ;it means | + 1414 7E7C 9D 2A 45 sta ResultLineBuffer,x + 1415 + 1416 + 1417 7E7F A5 8B lda TankNr + 1418 7E81 0A asl + 1419 7E82 0A asl ; times 8, because it is lengtgh + 1420 7E83 0A asl ; of the names of the tanks + 1421 7E84 A8 tay + 1422 + 1423 7E85 TankNameCopyLoop + 1424 7E85 B1 95 lda (tempXROLLER),y ;XROLLER is not working now + 1425 7E87 29 3F and #$3f ;always CAPITAL letters + 1426 7E89 E8 inx + 1427 7E8A 9D 2A 45 sta ResultLineBuffer,x + 1428 7E8D C8 iny + 1429 7E8E E0 08 cpx #8 ; end of name + 1430 7E90 D0 F3 bne TankNameCopyLoop + 1431 + 1432 7E92 E8 inx + 1433 7E93 A9 1A lda #26 ;it means ":" + 1434 7E95 9D 2A 45 sta ResultLineBuffer,x + 1435 + 1436 7E98 A4 8B ldy TankNr + 1437 7E9A B9 5D 3D lda ResultsTable,y + 1438 7E9D 8D 41 3F sta decimal + 1439 7EA0 A9 34 8D 43 3F A9 + mwa #(ResultLineBuffer+10) displayposition + 1440 7EAA 20 C0 7B jsr displaybyte ;decimal (byte), displayposition (word) + 1441 + 1442 7EAD A2 0C ldx #12 ;justafter the digits + 1443 7EAF A9 03 lda #3 ;it means | + 1444 7EB1 9D 2A 45 sta ResultLineBuffer,x + 1445 + 1446 7EB4 E8 inx + 1447 7EB5 A9 FF lda #$ff ;it means end of line + 1448 7EB7 9D 2A 45 sta ResultLineBuffer,x + 1449 + 1450 + 1451 + 1452 ;result line display + 1453 7EBA A9 2A 8D DE 44 A9 + mwa #ResultLineBuffer LineAddress4x4 + 1454 7EC4 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1455 7ED0 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1456 7ED6 A9 01 8D 51 48 mva #1 plot4x4color + 1457 7EDB 20 F5 7C jsr TypeLine4x4 + 1458 + 1459 7EDE 18 AD 3F 45 69 04 + adw ResultY #4 ;next line + 1460 + 1461 ;Empty line + 1462 7EEC A9 00 8D DE 44 A9 + mwa #LineEmpty LineAddress4x4 + 1463 7EF6 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1464 7F02 AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1465 7F08 A9 01 8D 51 48 mva #1 plot4x4color + 1466 7F0D 20 F5 7C jsr TypeLine4x4 + 1467 + 1468 + 1469 + 1470 7F10 CE 40 45 dec ResultOfTankNr + 1471 + 1472 7F13 30 11 bmi FinishResultDisplay + 1473 + 1474 7F15 38 AD 3F 45 E9 02 + sbw ResultY #2 ;distance between lines is smaller + 1475 + 1476 7F23 4C 62 7E jmp ResultOfTheNextPlayer + 1477 + 1478 7F26 FinishResultDisplay + 1479 + 1480 ;bottom of the frame + 1481 7F26 A9 F2 8D DE 44 A9 + mwa #LineBottom LineAddress4x4 + 1482 7F30 AD 3D 45 8D E1 44 + mwa ResultX LineXdraw + 1483 7F3C AD 3F 45 8D E3 44 mva ResultY LineYdraw + 1484 7F42 A9 01 8D 51 48 mva #1 plot4x4color + 1485 7F47 20 F5 7C jsr TypeLine4x4 + 1486 7F4A 60 rts + 1487 + 1488 + 1489 ;------------------------------------------------- + 1490 7F4B DisplayingSymbols + 1491 ;------------------------------------------------- + 1492 + 1493 ;--------------------- + 1494 ;displaying symbol of the weapon + 1495 ;--------------------- + 1496 ;display name and symbol of the weapon + 1497 ;textbuffer+18 - symbol (1 char) + 1498 ;textbuffer+20 - quantity left + 1499 ;textbuffer+23 - name + 1500 + 1501 + 1502 + 1503 ;ldx TankNr + 1504 7F4B BC 89 3D ldy ActiveWeapon,x + 1505 7F4E B9 59 4C lda WeaponSymbols,y + 1506 7F51 8D 8B 3C sta TextBuffer+18 + 1507 + 1508 ;--------------------- + 1509 ;displaying the energy of a tank + 1510 ;--------------------- + 1511 + 1512 7F54 BD 4A 3D lda Energy,x + 1513 + 1514 7F57 8D 41 3F sta decimal + 1515 7F5A A9 A1 8D 43 3F A9 + mwa #textbuffer+40 displayposition + 1516 7F64 20 C0 7B jsr displaybyte + 1517 ;--------------------- + 1518 ;displaying quantity of the given weapon + 1519 ;--------------------- + 1520 7F67 A6 8B ldx TankNr + 1521 7F69 BD 89 3D lda ActiveWeapon,x + 1522 7F6C 20 E5 71 jsr HowManyBullets + 1523 7F6F 8D 41 3F sta decimal + 1524 7F72 A9 8D 8D 43 3F A9 + mwa #textbuffer+20 displayposition + 1525 7F7C 20 C0 7B jsr displaybyte + 1526 + 1527 ;--------------------- + 1528 ;displaying name of the weapon + 1529 ;--------------------- + 1530 7F7F A6 8B ldx TankNr + 1531 7F81 BD 89 3D lda ActiveWeapon,x + 1532 7F84 85 91 sta temp ;get back number of the weapon + 1533 7F86 A9 00 85 92 mva #0 temp+1 + 1534 ; times 16 (because this is length of weapon name) + 1535 7F8A A0 03 ldy #3 ; rotate 4 times + 1536 7F8C RotateDISP02 + 1537 7F8C aslw temp +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 7F8C 06 91 ASL TEMP + 2 7F8E 26 92 ROL TEMP+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1538 7F90 88 dey + 1539 7F91 10 F9 bpl RotateDISP02 + 1540 7F93 18 A5 91 69 99 85 + adw temp #NamesOfWeapons + 1541 7FA0 A0 06 ldy #6 ; from 6th character + 1542 + 1543 7FA2 A0 0F ldy #15 + 1544 7FA4 loop06 + 1545 7FA4 B1 91 lda (temp),y + 1546 7FA6 99 90 3C sta textbuffer+23,y + 1547 7FA9 88 dey + 1548 7FAA 10 F8 bpl loop06 + 1549 + 1550 ;========================= + 1551 ;display Force + 1552 ;========================= + 1553 7FAC A6 8B ldx TankNr + 1554 7FAE BD 6A 3D lda EnergyTableL,x + 1555 7FB1 8D 41 3F sta decimal + 1556 7FB4 BD 70 3D lda EnergyTableH,x + 1557 7FB7 8D 42 3F sta decimal+1 + 1558 7FBA A9 B8 8D 43 3F A9 + mwa #textbuffer+63 displayposition + 1559 7FC4 20 5E 7B jsr displaydec + 1560 + 1561 ;========================= + 1562 ;display Angle + 1563 ;========================= + 1564 ; additionally we are getting charcode of the tank + 1565 ; (for future display) + 1566 7FC7 A6 8B ldx TankNr + 1567 7FC9 BD 82 3D lda AngleTable,x + 1568 7FCC 30 1C bmi AngleToLeft + 1569 7FCE A9 7F lda #$7f ; (tab) character + 1570 7FD0 8D AD 3C sta textbuffer+52 + 1571 7FD3 A9 00 lda #0 ;space + 1572 7FD5 8D AA 3C sta textbuffer+49 + 1573 7FD8 A9 5A lda #90 + 1574 7FDA 38 sec + 1575 7FDB FD 82 3D sbc AngleTable,x + 1576 7FDE 8D 41 3F sta decimal + 1577 7FE1 A8 tay + 1578 7FE2 B9 A6 45 lda BarrelTableR,y + 1579 7FE5 85 88 sta CharCode + 1580 7FE7 4C 00 80 jmp AngleDisplay ;like jp, because code always <>0 + 1581 7FEA AngleToLeft + 1582 7FEA 38 sec + 1583 7FEB E9 A5 sbc #(255-90) + 1584 7FED 8D 41 3F sta decimal + 1585 7FF0 A8 tay + 1586 7FF1 B9 4B 45 lda BarrelTableL,y + 1587 7FF4 85 88 sta CharCode + 1588 7FF6 A9 7E lda #$7e ;(del) char + 1589 7FF8 8D AA 3C sta textbuffer+49 + 1590 7FFB A9 00 lda #0 ;space + 1591 7FFD 8D AD 3C sta textbuffer+52 + 1592 + 1593 8000 AngleDisplay + 1594 8000 A9 AB 8D 43 3F A9 + mwa #textbuffer+50 displayposition + 1595 800A 20 C0 7B jsr displaybyte + 1596 + 1597 + 1598 ;========================= + 1599 ;display Wind + 1600 ;========================= + 1601 800D AD 94 3D lda WindOrientation + 1602 8010 D0 0C bne DisplayLeftWind + 1603 8012 A9 7F lda #$7f ; (tab) char + 1604 8014 8D C8 3C sta textbuffer+79 + 1605 8017 A9 00 lda #0 ;space + 1606 8019 8D C5 3C sta textbuffer+76 + 1607 801C F0 0A beq DisplayWindValue + 1608 801E DisplayLeftWind + 1609 801E A9 7E lda #$7e ;(del) char + 1610 8020 8D C5 3C sta textbuffer+76 + 1611 8023 A9 00 lda #0 ;space + 1612 8025 8D C8 3C sta textbuffer+79 + 1613 8028 DisplayWindValue + 1614 8028 AD 91 3D 85 91 AD + mwa Wind temp + 1615 8032 lsrw temp ;divide by 16 to have +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8032 46 92 LSR TEMP+1 + 2 8034 66 91 ROR TEMP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1616 8036 lsrw temp ;a nice view on a screen +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8036 46 92 LSR TEMP+1 + 2 8038 66 91 ROR TEMP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1617 803A lsrw temp +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 803A 46 92 LSR TEMP+1 + 2 803C 66 91 ROR TEMP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1618 803E lsrw temp +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 803E 46 92 LSR TEMP+1 + 2 8040 66 91 ROR TEMP +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\textproc.asm + 1619 8042 A5 91 lda temp + 1620 8044 8D 41 3F sta decimal + 1621 8047 A9 C6 8D 43 3F A9 + mwa #textbuffer+77 displayposition + 1622 8051 20 C0 7B jsr displaybyte + 1623 8054 60 rts + 1624 ;------------------------------------------------- + 1625 8055 PutTankNameOnScreen + 1626 ; puts name of the tan on the screen + 1627 8055 A0 00 ldy #$00 + 1628 8057 A5 8B lda tanknr + 1629 8059 0A asl + 1630 805A 0A asl + 1631 805B 0A asl ; 8 chars per name + 1632 805C AA tax + 1633 805D NextChar02 + 1634 805D BD 57 3F lda tanksnames,x + 1635 8060 99 80 3C sta textbuffer+7,y + 1636 8063 E8 inx + 1637 8064 C8 iny + 1638 8065 C0 08 cpy #$08 + 1639 8067 D0 F4 bne NextChar02 + 1640 8069 60 rts + 1641 ;------------------------------------------------- + 1642 + 1643 .endif + 1108 ;---------------------------------------------- + 1109 806A icl 'grafproc.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.asm + 2 + 3 .IF *>0 ;this is a trick that prevents compiling this file alone + 4 + 5 + 6 ;-------------------------------------------------- + 7 806A draw .proc ;;fuxxing good draw :) + 8 ;-------------------------------------------------- + 9 ;creditz to Dr Jankowski / MIM U.W. + 10 ; (xi,yi)-----(xk,yk) + 11 ;20 DX=XK-XI + 12 ;30 DY=YK-YI + 13 ;40 DP=2*DY + 14 ;50 DD=2*(DY-DX) + 15 ;60 DI=2*DY-DX + 16 ;70 REPEAT + 17 ;80 IF DI>=0 + 18 ;90 DI=DI+DD + 19 ;100 YI=YI+1 + 20 ;110 ELSE + 21 ;120 DI=DI+DP + 22 ;130 ENDIF + 23 ;140 plot XI,YI + 24 ;150 XI=XI+1 + 25 ;160 UNTIL XI=XK + 26 + 27 + 28 ; begin: xdraw,ydraw - end: xbyte,ybyte + 29 ; let's store starting coordinates + 30 ; will be needed, because everything is calculated relatively + 31 806A A9 00 8D 36 3E 8D + mwa #0 LineLength + 32 8072 A5 80 85 97 A5 81 + mwa xdraw xtempDRAW + 33 807A A5 82 85 99 A5 83 + mwa ydraw ytempDRAW + 34 + 35 ; if line goes our of the screen we are not drawing it, but... + 36 + 37 8082 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 38 808C B0 14 bcs DrawOutOfTheScreen + 39 808E A5 85 C9 01 D0 04 + cpw xbyte #screenwidth + 40 8098 B0 08 bcs DrawOutOfTheScreen + 41 ;cpw ydraw #screenheight + 42 ;bcs DrawOutOfTheScreen + 43 ;cpw ybyte #screenheight + 44 ;bcc DrawOnTheScreen + 45 809A A5 83 lda ydraw+1 + 46 809C D0 04 bne DrawOutOfTheScreen + 47 809E A5 87 lda ybyte+1 + 48 80A0 F0 01 beq DrawOnTheScreen + 49 80A2 DrawOutOfTheScreen + 50 ;jsr DrawJumpPad + 51 80A2 60 rts + 52 80A3 DrawOnTheScreen + 53 ; constant parameters + 54 ; XI=0 ,YI=0 + 55 80A3 A9 00 lda #0 + 56 80A5 85 9B sta XI + 57 80A7 85 9C sta XI+1 + 58 80A9 85 9E sta YI + 59 80AB 85 9F sta YI+1 + 60 + 61 ; setting the direction controll bits + 62 80AD A5 83 C5 87 D0 04 + cpw ydraw ybyte + 63 80B7 90 15 bcc LineDown + 64 ; here one line up + 65 ; we are setting bit 0 + 66 80B9 A9 01 8D 31 3E mva #1 HowToDraw ;here we can because it's first operation + 67 ; we are subctracting Yend from Ybegin (reverse order) + 68 ; DY=YI-YK + 69 80BE 38 A5 82 E5 86 85 + sbw ydraw ybyte DY + 70 80CB 4C E0 80 jmp CheckDirectionX + 71 80CE LineDown + 72 ; one line down here + 73 ; we are setting bit 0 + 74 80CE A9 00 8D 31 3E mva #0 HowToDraw ;here we can because it's first operation + 75 ; substract Ybegin from Yend (normal order) + 76 ; DY=YK-YI + 77 80D3 38 A5 86 E5 82 85 + sbw ybyte ydraw DY + 78 80E0 CheckDirectionX + 79 80E0 A5 81 C5 85 D0 04 + cpw xdraw xbyte + 80 80EA 90 18 bcc LineRight + 81 ; here goes line to the left + 82 ; we set bit 1 + 83 + 84 80EC AD 31 3E lda HowToDraw + 85 80EF 09 02 ora #$02 + 86 80F1 8D 31 3E sta HowToDraw + 87 ; substract Xend from Xbegin (reverse) + 88 ; DX=XI-XK + 89 80F4 38 A5 80 E5 84 85 + sbw xdraw xbyte DX + 90 8101 4C 11 81 jmp CheckDirectionFactor + 91 8104 LineRight + 92 ; here goes one line to the right + 93 ; we clear bit 0 + 94 ; we can do nothing because the bit is cleared! + 95 + 96 ;lda HowToDraw + 97 ;and #$FD + 98 ;sta HowToDraw + 99 + 100 ; substracting Xbegin from Xend (normal way) + 101 ; DX=XK-XI + 102 8104 38 A5 84 E5 80 85 + sbw xbyte xdraw DX + 103 8111 CheckDirectionFactor + 104 ; here we check Direction Factor + 105 ; I do not know if we are using proper English word + 106 ; but the meaning is 'a' in y=ax+b + 107 + 108 ; lda DX + 109 ; we already have DX in A + 110 8111 A5 A6 C5 A9 D0 04 + cpw DX DY + 111 + 112 811B 90 0B bcc SwapXY + 113 ; 'a' factor is fire, so we copy parameters + 114 ; XK=DX + 115 811D A5 A5 85 A1 A5 A6 + mwa DX XK + 116 ; i kasowanie bitu 2 + 117 ; and bit 2 clear + 118 ; (is not needed because already cleared) + 119 ;lda HowToDraw + 120 ;and #$FB + 121 ;sta HowToDraw + 122 8125 4C 48 81 jmp LineParametersReady + 123 8128 SwapXY + 124 ; not this half of a quarter! - parameters must be swapped + 125 ; XK=DY + 126 ; DY=DX + 127 ; DX=XK - because DY is there so DY and DX are swapped + 128 ; YK ... not used + 129 8128 A5 A8 85 A1 A5 A9 + mwa DY XK + 130 8130 A5 A5 85 A8 A5 A6 + mwa DX DY + 131 8138 A5 A1 85 A5 A5 A2 + mwa XK DX + 132 + 133 ; and let's set bit 2 + 134 8140 AD 31 3E lda HowToDraw + 135 8143 09 04 ora #$04 + 136 8145 8D 31 3E sta HowToDraw + 137 8148 LineParametersReady + 138 ; let's check if length is not zero + 139 8148 A5 A5 lda DX + 140 814A 05 A6 ora DX+1 + 141 814C 05 A8 ora DY + 142 814E 05 A9 ora DY+1 + 143 8150 D0 03 4C 46 82 jeq EndOfDraw + 144 + 145 ; here we have DX,DY,XK and we know which operations + 146 ; are to be performed with these factors when doing PLOT + 147 ; (accordingly to given bits of 'HowToDraw') + 148 ; Now we must calculate DP, DD and DI + 149 ; DP=2*DY + 150 ; DD=2*(DY-DX) + 151 ; DI=2*DY-DX + 152 + 153 8155 A5 A8 85 B0 A5 A9 + mwa DY DP + 154 815D aslw DP +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 815D 06 B0 ASL DP + 2 815F 26 B1 ROL DP+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 155 + 156 8161 38 A5 A8 E5 A5 85 + sbw DY DX DD + 157 816E aslw DD +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 816E 06 AC ASL DD + 2 8170 26 AD ROL DD+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 158 + 159 8172 A5 A8 85 AE A5 A9 + mwa DY DI + 160 817A aslw DI +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 817A 06 AE ASL DI + 2 817C 26 AF ROL DI+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 161 817E 38 A5 AE E5 A5 85 + sbw DI DX + 162 + 163 818B DrawLoop + 164 ; REPEAT + 165 ; IF DI>=0 + 166 818B A5 AF lda DI+1 + 167 818D 30 1B bmi DINegative + 168 ; DI=DI+DD + 169 ; YI=YI+1 + 170 818F 18 A5 AE 65 AC 85 + adw DI DD + 171 819C 18 A5 9E 69 01 85 + adw YI #1 + 172 81A7 4C B7 81 jmp drplot + 173 81AA DINegative + 174 ; ELSE + 175 ; DI=DI+DP + 176 81AA 18 A5 AE 65 B0 85 + adw DI DP + 177 + 178 81B7 drplot ; Our plot that checks how to calculate pixels. + 179 ; In xtempDRAW and ycircle there are begin coordinates + 180 ; of our line + 181 ; First we check the 'a' factor (like in y=ax+b) + 182 ; If necessary we swap XI and YI + 183 ; (as we can not change XI and YI we move XI to temp2 + 184 ; and YI to temp) + 185 + 186 + 187 81B7 AD 31 3E lda HowToDraw + 188 81BA 29 04 and #$04 + 189 81BC D0 13 bne SwappedXY + 190 81BE A5 9B 85 91 A5 9C + mwa XI temp + 191 81C6 A5 9E 85 93 A5 9F + mwa YI temp2 + 192 81CE 4C E1 81 jmp CheckPlotY + 193 81D1 SwappedXY + 194 81D1 A5 9B 85 93 A5 9C + mwa XI temp2 + 195 81D9 A5 9E 85 91 A5 9F + mwa YI temp + 196 81E1 CheckPlotY + 197 81E1 AD 31 3E lda HowToDraw + 198 81E4 29 01 and #01 + 199 81E6 D0 10 bne LineGoesUp + 200 ; here we know that line goes down and we are not changing Y + 201 81E8 18 A5 93 65 99 85 + adw temp2 ytempDRAW ydraw ; YI + 202 81F5 4C 05 82 jmp CheckPlotX + 203 81F8 LineGoesUp + 204 ; line goes up here - we are reversing Y + 205 81F8 38 A5 99 E5 93 85 + sbw ytempDRAW temp2 ydraw ; YI + 206 8205 CheckPlotX + 207 8205 AD 31 3E lda HowToDraw + 208 8208 29 02 and #02 + 209 820A D0 10 bne LineGoesLeft + 210 ; here we know that line goes right and we are not changing X + 211 820C 18 A5 91 65 97 85 + adw temp xtempDRAW xdraw ; XI + 212 8219 4C 29 82 jmp PutPixelinDraw + 213 821C LineGoesLeft + 214 ; line goes left - we are reversing X + 215 821C 38 A5 97 E5 91 85 + sbw xtempDRAW temp xdraw ; XI + 216 8229 PutPixelinDraw + 217 8229 20 53 82 jsr DrawJumpPad + 218 ; end of the special PLOT for DRAW + 219 + 220 ; XI=XI+1 + 221 ; UNTIL XI=XK + 222 822C 18 A5 9B 69 01 85 + adw XI #1 + 223 8237 A5 9C C5 A2 D0 04 + cpw XI XK + 224 8241 F0 03 4C 8B 81 jne DrawLoop + 225 + 226 8246 EndOfDraw + 227 8246 A5 97 85 80 A5 98 + mwa xtempDRAW xdraw + 228 824E A5 99 85 82 mva ytempDRAW ydraw + 229 8252 60 rts + 230 .endp + 231 + 232 8253 DrawJumpPad + 233 8253 6C 2F 3E jmp (DrawJumpAddr) + 234 8256 Drawplot + 235 8256 4C 0C 89 jmp plot + 236 8259 DrawLen + 237 8259 18 AD 36 3E 69 01 + adw LineLength #1 + 238 8267 60 rts + 239 + 240 8268 DrawCheck .proc + 241 ; lda SmokeTracerFlag + 242 ; bne yestrace ; jakie to głupie.... + 243 8268 AD A9 3E lda tracerflag + 244 826B 0D 6B 3E ora SmokeTracerFlag + 245 826E yestrace + 246 826E F0 03 beq notrace + 247 8270 20 0C 89 jsr plot + 248 8273 notrace + 249 ;aftertrace + 250 8273 AD 96 3D lda HitFlag + 251 8276 D0 42 bne StopHitChecking + 252 + 253 8278 CheckCollisionDraw + 254 ; checking collision! + 255 8278 A5 83 lda ydraw+1 + 256 827A D0 3E bne StopHitChecking + 257 + 258 827C 20 D4 70 jsr CheckCollisionWithTank + 259 827F AD 96 3D lda HitFlag + 260 8282 D0 36 bne StopHitChecking + 261 + 262 8284 A5 80 85 91 A5 81 + mwa xdraw temp + 263 ;adw temp --- it does not work!!!!!!!! and should? OMC ??? #mountaintable + 264 828C 18 clc + 265 828D A5 91 lda temp + 266 828F 69 13 adc #mountaintable + 270 8297 85 92 sta temp+1 + 271 + 272 8299 A0 00 ldy #0 + 273 829B A5 82 lda ydraw + 274 829D D1 91 cmp (temp),y + 275 829F 90 19 bcc StopHitChecking + 276 + 277 82A1 A9 01 8D 96 3D mva #1 HitFlag + 278 82A6 A5 80 8D 32 3E A5 + mwa xdraw XHit + 279 82B0 A5 82 8D 34 3E A5 + mwa ydraw YHit + 280 + 281 + 282 82BA StopHitChecking + 283 82BA 60 rts + 284 .endp + 285 + 286 ;-------------------------------------------------- + 287 82BB circle .proc ;fxxxing good circle drawing :) + 288 ;-------------------------------------------------- + 289 ;Turbo Basic source + 290 ; R=30 + 291 ; XC=0:YC=R + 292 ; FX=0:FY=8*R:FS=4*R+3 + 293 ; WHILE FX0 + 298 ; FS=FS-FX-4 + 299 ; ELSE + 300 ; YC=YC-1 + 301 ; FY=FY-8 + 302 ; FS=FS-FX-4+FY + 303 ; ENDIF + 304 ; WEND + 305 ; splot8 + 306 + 307 82BB A5 80 8D 39 3E A5 + mwa xdraw xcircle + 308 82C5 A5 82 8D 3B 3E mva ydraw ycircle + 309 + 310 82CA A9 00 85 8F 85 90 mwa #0 xc + 311 82D0 AD 38 3E 85 A4 mva radius yc + 312 82D5 A9 00 85 9D mva #0 fx + 313 82D9 AD 38 3E 85 A0 mva radius fy + 314 82DE 06 A0 asl FY + 315 82E0 06 A0 asl FY + 316 82E2 A5 A0 85 A3 mva FY FS + 317 82E6 06 A0 asl FY + 318 82E8 18 clc + 319 82E9 A5 A3 lda FS + 320 82EB 69 03 adc #3 + 321 82ED 85 A3 sta FS + 322 + 323 82EF circleloop + 324 82EF A5 9D lda FX + 325 82F1 C5 A0 cmp FY + 326 82F3 B0 34 bcs endcircleloop + 327 82F5 20 3C 83 jsr splot8 + 328 82F8 E6 8F inc XC + 329 + 330 82FA 18 clc + 331 82FB A5 9D lda FX + 332 82FD 69 08 adc #8 + 333 82FF 85 9D sta FX + 334 + 335 8301 A5 A3 lda FS + 336 8303 F0 0C beq else01 + 337 8305 30 0A bmi else01 + 338 8307 38 sec + 339 8308 E5 9D sbc FX + 340 830A E9 04 sbc #4 + 341 830C 85 A3 sta FS + 342 830E 4C 26 83 jmp endif01 + 343 8311 else01 + 344 8311 C6 A4 dec YC + 345 8313 38 sec + 346 8314 A5 A0 lda FY + 347 8316 E9 08 sbc #8 + 348 8318 85 A0 sta FY + 349 + 350 831A A5 A3 lda FS + 351 831C 38 sec + 352 831D E5 9D sbc FX + 353 831F E9 04 sbc #4 + 354 8321 18 clc + 355 8322 65 A0 adc FY + 356 8324 85 A3 sta FS + 357 8326 endif01 + 358 8326 4C EF 82 jmp circleloop + 359 8329 endcircleloop + 360 + 361 8329 20 3C 83 jsr splot8 + 362 + 363 832C AD 39 3E 85 80 AD + mwa xcircle xdraw + 364 8336 AD 3B 3E 85 82 mva ycircle ydraw + 365 833B 60 rts + 366 .endp + 367 ;---- + 368 833C splot8 .proc + 369 ; plot xcircle+XC,ycircle+YC + 370 ; plot xcircle+XC,ycircle-YC + 371 ; plot xcircle-XC,ycircle-YC + 372 ; plot xcircle-XC,ycircle+YC + 373 + 374 ; plot xcircle+YC,ycircle+XC + 375 ; plot xcircle+YC,ycircle-XC + 376 ; plot xcircle-YC,ycircle-XC + 377 ; plot xcircle-YC,ycircle+XC + 378 + 379 833C 18 clc + 380 833D AD 39 3E lda xcircle + 381 8340 65 8F adc XC + 382 8342 85 80 sta xdraw + 383 8344 AD 3A 3E lda xcircle+1 + 384 8347 69 00 adc #0 + 385 8349 85 81 sta xdraw+1 + 386 ;clc + 387 834B AD 3B 3E lda ycircle + 388 834E 65 A4 adc YC + 389 8350 85 82 sta ydraw + 390 8352 8D 3C 3E sta tempcir + 391 8355 20 0C 89 jsr plot + 392 + 393 8358 38 sec + 394 8359 AD 3B 3E lda ycircle + 395 835C E5 A4 sbc YC + 396 835E 85 82 sta ydraw + 397 8360 20 0C 89 jsr plot + 398 + 399 8363 38 sec + 400 8364 AD 39 3E lda xcircle + 401 8367 E5 8F sbc XC + 402 8369 85 80 sta xdraw + 403 836B AD 3A 3E lda xcircle+1 + 404 836E E9 00 sbc #0 + 405 8370 85 81 sta xdraw+1 + 406 8372 20 0C 89 jsr plot + 407 + 408 8375 AD 3C 3E lda tempcir + 409 8378 85 82 sta ydraw + 410 837A 20 0C 89 jsr plot + 411 ;--- + 412 837D 18 clc + 413 837E AD 39 3E lda xcircle + 414 8381 65 A4 adc yC + 415 8383 85 80 sta xdraw + 416 8385 AD 3A 3E lda xcircle+1 + 417 8388 69 00 adc #0 + 418 838A 85 81 sta xdraw+1 + 419 ;clc + 420 838C AD 3B 3E lda ycircle + 421 838F 65 8F adc xC + 422 8391 85 82 sta ydraw + 423 8393 8D 3C 3E sta tempcir + 424 8396 20 0C 89 jsr plot + 425 + 426 8399 38 sec + 427 839A AD 3B 3E lda ycircle + 428 839D E5 8F sbc xC + 429 839F 85 82 sta ydraw + 430 83A1 20 0C 89 jsr plot + 431 + 432 83A4 38 sec + 433 83A5 AD 39 3E lda xcircle + 434 83A8 E5 A4 sbc yC + 435 83AA 85 80 sta xdraw + 436 83AC AD 3A 3E lda xcircle+1 + 437 83AF E9 00 sbc #0 + 438 83B1 85 81 sta xdraw+1 + 439 83B3 20 0C 89 jsr plot + 440 + 441 83B6 AD 3C 3E lda tempcir + 442 83B9 85 82 sta ydraw + 443 83BB 20 0C 89 jsr plot + 444 + 445 83BE 60 RTS + 446 .endp + 447 + 448 ;-------------------------------------------------- + 449 83BF WaitForKeyRelease .proc + 450 ;-------------------------------------------------- + 451 83BF AD 0F D2 lda SKSTAT + 452 83C2 C9 FF cmp #$ff + 453 83C4 F0 04 beq KeyIsReleased + 454 83C6 C9 F7 cmp #$f7 + 455 83C8 D0 F5 bne WaitForKeyRelease + 456 83CA KeyIsReleased + 457 83CA 60 rts + 458 .endp + 459 + 460 ;-------------------------------------------------- + 461 83CB clearscreen .proc + 462 ;-------------------------------------------------- + 463 83CB A9 00 lda #0 + 464 83CD AA tax + 465 83CE Loopi1 + 466 83CE 9D 10 10 sta display,x + 467 83D1 9D 10 11 sta display+$100,x + 468 83D4 9D 10 12 sta display+$200,x + 469 83D7 9D 10 13 sta display+$300,x + 470 83DA 9D 10 14 sta display+$400,x + 471 83DD 9D 10 15 sta display+$500,x + 472 83E0 9D 10 16 sta display+$600,x + 473 83E3 9D 10 17 sta display+$700,x + 474 83E6 9D 10 18 sta display+$800,x + 475 83E9 9D 10 19 sta display+$900,x + 476 83EC 9D 10 1A sta display+$a00,x + 477 83EF 9D 10 1B sta display+$b00,x + 478 83F2 9D 10 1C sta display+$c00,x + 479 83F5 9D 10 1D sta display+$d00,x + 480 83F8 9D 10 1E sta display+$e00,x + 481 83FB 9D 10 1F sta display+$f00,x + 482 83FE 9D 10 20 sta display+$1000,x + 483 8401 9D 10 21 sta display+$1100,x + 484 8404 9D 10 22 sta display+$1200,x + 485 8407 9D 10 23 sta display+$1300,x + 486 840A 9D 10 24 sta display+$1400,x + 487 840D 9D 10 25 sta display+$1500,x + 488 8410 9D 10 26 sta display+$1600,x + 489 8413 9D 10 27 sta display+$1700,x + 490 8416 9D 10 28 sta display+$1800,x + 491 8419 9D 10 29 sta display+$1900,x + 492 841C 9D 10 2A sta display+$1a00,x + 493 841F 9D 10 2B sta display+$1b00,x + 494 8422 9D 10 2C sta display+$1c00,x + 495 8425 9D 10 2D sta display+$1d00,x + 496 8428 9D 10 2E sta display+$1e00,x + 497 842B 9D 10 2F sta display+$1f00,x + 498 842E E8 inx + 499 842F D0 9D bne Loopi1 + 500 8431 60 rts + 501 .endp + 502 ;-------------------------------*------------------ + 503 8432 placetanks .proc + 504 ;-------------------------------------------------- + 505 8432 A2 05 ldx #(MaxPlayers-1) ;maxNumberOfPlayers-1 + 506 8434 A9 00 lda #0 + 507 8436 skip09 + 508 ; clearing the tables with coordinates of the tank + 509 ; it is necessary, because randomizing checks + 510 ; if the given tank is already placed + 511 ; after check if its position is not (0,0) + 512 + 513 ; I will be honest with you - I have no idea + 514 ; what the above comment was intending to mean :) + 515 + 516 8436 9D 97 3D sta XtankstableL,x + 517 8439 9D 9D 3D sta XtankstableH,x + 518 843C 9D A3 3D sta Ytankstable,x + 519 843F CA dex + 520 8440 10 F4 bpl skip09 + 521 + 522 + 523 8442 A9 00 8D D3 3E 8D + mwa #0 temptankX + 524 844A A9 00 8D D5 3E mva #0 temptankNr ;player number + 525 844F StillRandomize + 526 844F AE 19 3D ldx NumberOfPlayers + 527 8452 AD 0A D2 lda random + 528 8455 29 07 and #$07 + 529 8457 A8 tay + 530 8458 CC 19 3D cpy NumberOfPlayers + 531 845B B0 F2 bcs StillRandomize + 532 845D B9 97 3D lda xtankstableL,y + 533 8460 D0 ED bne StillRandomize + 534 8462 B9 9D 3D lda xtankstableH,y + 535 8465 D0 E8 bne StillRandomize + 536 ; here we know that we got a random number + 537 ; of the tank that is not in use + 538 ; this number is in Y + 539 + 540 8467 18 clc + 541 8468 AD D3 3E lda temptankX + 542 846B 7D 62 48 adc disktance,x + 543 846E 8D D3 3E sta temptankX + 544 8471 99 97 3D sta xtankstableL,y + 545 8474 90 03 bcc NotHigherByte03 + 546 8476 EE D4 3E inc temptankX+1 + 547 8479 NotHigherByte03 + 548 8479 AD D4 3E lda temptankX+1 + 549 847C 99 9D 3D sta xtankstableH,y + 550 847F EE D5 3E INC temptankNr + 551 8482 AE D5 3E ldx temptankNr + 552 8485 EC 19 3D Cpx NumberOfPlayers + 553 8488 D0 C5 bne StillRandomize + 554 + 555 ; getting random displacements relative to even positions + 556 848A A2 00 ldx #$00 + 557 848C StillRandomize02 + 558 848C AD 0A D2 lda random + 559 848F 29 1F and #$1f ; maximal displacement is 31 pixels + 560 + 561 8491 18 clc + 562 8492 7D 97 3D adc xtankstableL,x + 563 8495 9D 97 3D sta xtankstableL,x + 564 8498 90 03 bcc NotHigherByte02 + 565 849A FE 9D 3D inc xtankstableH,x + 566 849D NotHigherByte02 + 567 ; and we deduct 15 to make the displacement work two ways + 568 849D 38 sec + 569 849E BD 97 3D lda xtankstableL,x + 570 84A1 E9 0F sbc #$0f + 571 84A3 9D 97 3D sta xtankstableL,x + 572 84A6 B0 03 bcs NotHigherByte01 + 573 84A8 DE 9D 3D dec xtankstableH,x + 574 84AB NotHigherByte01 + 575 + 576 ; and clear lowest bit to be sure that the X coordinate is even + 577 ; (this is to have P/M background look nice) + 578 84AB BD 97 3D lda xtankstableL,x + 579 84AE 29 FE and #$fe + 580 84B0 9D 97 3D sta xtankstableL,x + 581 84B3 E8 inx + 582 84B4 EC 19 3D Cpx NumberOfPlayers + 583 84B7 D0 D3 bne StillRandomize02 + 584 84B9 60 rts + 585 + 586 ; during calculating heights of thw mountains + 587 ; check if the tank is not somewhere around + 588 ; if so, make horizontal line 8 pixels long + 589 84BA CheckTank + 590 84BA AE 19 3D ldx NumberOfPlayers + 591 84BD CA dex + 592 84BE CheckNextTank + 593 84BE BD 97 3D lda xtankstableL,x + 594 84C1 C5 80 cmp xdraw + 595 84C3 D0 19 bne UnequalTanks + 596 84C5 BD 9D 3D lda xtankstableH,x + 597 84C8 C5 81 cmp xdraw+1 + 598 84CA D0 12 bne UnequalTanks + 599 84CC A5 82 lda ydraw + 600 ;sec + 601 ;sbc #$01 ; minus 1, because it was 1 pixel too high + 602 84CE 9D A3 3D sta ytankstable,x ; what's the heck is that????!!!! + 603 84D1 A9 07 8D D1 3E mva #7 deltaX + 604 84D6 A9 00 8D CD 3E 8D + mwa #0 delta + 605 84DE UnequalTanks + 606 84DE CA dex + 607 84DF 10 DD bpl CheckNextTank + 608 84E1 60 rts + 609 .endp + 610 ;------------------------------------------------- + 611 84E2 drawtanks + 612 ;------------------------------------------------- + 613 + 614 + 615 84E2 A5 8B lda tanknr + 616 84E4 48 pha + 617 84E5 A2 00 ldx #$00 + 618 84E7 86 8B stx tanknr + 619 + 620 84E9 DrawNextTank + 621 84E9 20 F9 84 jsr drawtanknr + 622 84EC E6 8B inc tanknr + 623 84EE A6 8B ldx tanknr + 624 84F0 EC 19 3D Cpx NumberOfPlayers + 625 84F3 D0 F4 bne DrawNextTank + 626 + 627 84F5 68 pla + 628 84F6 85 8B sta tankNr + 629 + 630 84F8 60 rts + 631 ;--------- + 632 84F9 drawtanknr + 633 84F9 A6 8B ldx tanknr + 634 ; let's check the energy + 635 84FB BD 51 3D lda eXistenZ,x + 636 84FE D0 08 bne SkipRemovigPM ; if energy=0 then no tank + 637 + 638 ; hide P/M + 639 8500 A9 00 lda #0 + 640 8502 9D 00 D0 sta hposp0,x + 641 8505 4C 82 85 jmp DoNotDrawTankNr + 642 8508 SkipRemovigPM + 643 + 644 + 645 8508 BD 82 3D lda AngleTable,x + 646 850B 30 0D bmi AngleToLeft01 + 647 850D A9 5A lda #90 + 648 850F 38 sec + 649 8510 FD 82 3D sbc AngleTable,x + 650 8513 A8 tay + 651 8514 B9 A6 45 lda BarrelTableR,y + 652 8517 4C 21 85 jmp CharacterAlreadyKnown + 653 851A AngleToLeft01 + 654 851A 38 sec + 655 851B E9 A5 sbc #(255-90) + 656 851D A8 tay + 657 851E B9 4B 45 lda BarrelTableL,y + 658 8521 CharacterAlreadyKnown + 659 8521 85 88 sta CharCode + 660 8523 DrawTankNrX + 661 8523 A6 8B ldx tanknr + 662 8525 BD 97 3D lda xtankstableL,x + 663 8528 85 80 sta xdraw + 664 852A BD 9D 3D lda xtankstableH,x + 665 852D 85 81 sta xdraw+1 + 666 852F BD A3 3D lda ytankstable,x + 667 8532 85 82 sta ydraw + 668 + 669 8534 20 FE 89 jsr TypeChar + 670 + 671 ; now P/M graphics on the screen (only for 5 tanks) + 672 ; horizontal position + 673 8537 A5 80 85 84 A5 81 + mwa xdraw xbyte + 674 853F A6 8B ldx tanknr + 675 8541 E0 05 cpx #$5 + 676 8543 B0 3D bcs NoPlayerMissile + 677 8545 rorw xbyte ; divide by 2 (carry does not matter) +Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8545 66 85 ROR XBYTE+1 + 2 8547 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 678 8549 A5 84 lda xbyte + 679 854B 18 clc + 680 854C 69 24 adc #$24 ; P/M to graphics offser + 681 854E E0 04 cpx #$4 ; 5th tank are joined missiles and offset is defferent + 682 8550 D0 03 bne NoMissile + 683 8552 18 clc + 684 8553 69 0C adc #$0C + 685 8555 NoMissile + 686 8555 9D 00 D0 sta hposp0,x + 687 ; vertical position + 688 8558 BD 41 45 lda pmtableL,x + 689 855B 85 84 sta xbyte + 690 855D BD 46 45 lda pmtableH,x + 691 8560 85 85 sta xbyte+1 + 692 + 693 ; calculate start position of the tank + 694 8562 A5 82 lda ydraw + 695 8564 18 clc + 696 8565 69 25 adc #$25 ; P/M to graphics offset + 697 8567 85 91 sta temp + 698 ; clear sprite and put 3 lines on the tank at the same time + 699 8569 A0 00 ldy #$00 + 700 856B 98 tya + 701 856C C4 91 ClearPM cpy temp + 702 856E D0 0D bne ZeroesToGo + 703 8570 A9 03 lda #$03 ; (2 bits set) we set on two pixels in three lines + 704 8572 91 84 sta (xbyte),y + 705 8574 88 dey + 706 8575 91 84 sta (xbyte),y + 707 8577 88 dey + 708 8578 91 84 sta (xbyte),y + 709 857A 88 dey + 710 857B A9 00 lda #$00 + 711 857D ZeroesToGo + 712 857D 91 84 sta (xbyte),y + 713 857F 88 dey + 714 8580 D0 EA bne ClearPM + 715 + 716 8582 NoPlayerMissile + 717 8582 DoNotDrawTankNr + 718 8582 60 rts + 719 + 720 ;-------------------------------------------------- + 721 8583 drawmountains .proc + 722 ;-------------------------------------------------- + 723 8583 A9 00 85 80 85 81 mwa #0 xdraw + 724 8589 A9 13 85 B2 A9 41 + mwa #mountaintable modify + 725 + 726 + 727 8591 drawmountainsloop + 728 8591 A0 00 ldy #0 + 729 8593 B1 B2 lda (modify),y + 730 8595 85 82 sta ydraw + 731 8597 20 D4 89 jsr DrawLine + 732 859A 18 A5 B2 69 01 85 + adw modify #1 + 733 85A5 18 A5 80 69 01 85 + adw xdraw #1 + 734 85B0 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 735 85BA D0 D5 bne drawmountainsloop + 736 + 737 85BC 60 rts + 738 ;-------------------------------------------------- + 739 85BD drawmountainspixel + 740 ;-------------------------------------------------- + 741 85BD A9 00 85 80 85 81 mwa #0 xdraw + 742 85C3 A9 13 85 B2 A9 41 + mwa #mountaintable modify + 743 + 744 + 745 85CB drawmountainspixelloop + 746 85CB A0 00 ldy #0 + 747 85CD B1 B2 lda (modify),y + 748 85CF 85 82 sta ydraw + 749 85D1 20 0C 89 jsr plot + 750 85D4 18 A5 B2 69 01 85 + adw modify #1 + 751 85DF 18 A5 80 69 01 85 + adw xdraw #1 + 752 85EA A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 753 85F4 D0 D5 bne drawmountainspixelloop + 754 + 755 85F6 60 rts + 756 .endp + 757 ;-------------------------------------------------- + 758 85F7 SoilDown2 .proc + 759 ;-------------------------------------------------- + 760 + 761 ; how it is supposed to work: + 762 ; first loop is looking for the highest pixels + 763 ; and fills with their Y coordinates both temporary tables + 764 ; + 765 ; second (main) loop works this way: + 766 ; sets end-of-soil-fall-down-flag to 1 ( IsEndOfTheFallFlag=1 ) + 767 ; goes through the horizontal line checking if + 768 ; Y coordinate from the first table equals to height of the peak + 769 ; if so, it goes further + 770 ; if not: + 771 ; sets end-of-soil-fall-down-flag to 0 + 772 ; increases Y from the first table + 773 ; if there is no pixel there it plots here and + 774 ; zeroes pixel from the second table and after that + 775 ; increases Y of the second table + 776 ; repeats with next pixels au to the end of the line + 777 ; if the flag is 0 then repeat the main loop + 778 ; and that's it :) + 779 ; + 780 ; I am sorry but after these 4 years I have no idea + 781 ; how it works. I have just translated Polish comment + 782 ; but I do not understand a word of it :) + 783 ; If you know how it works, please write here :)))) + 784 + 785 85F7 20 66 72 jsr PMoutofscreen + 786 + 787 ; First we look for highest pixels and fill with their coordinates + 788 ; both tables + 789 + 790 85FA AD FC 3D 85 80 AD + mwa RangeLeft xdraw + 791 8604 18 AD FC 3D 69 54 + adw RangeLeft #mountaintable2 tempor2 + 792 8613 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3 + 793 + 794 8622 NextColumn1 + 795 8622 A9 00 85 82 mva #0 ydraw + 796 8626 NextPoint1 + 797 8626 20 5F 89 jsr point + 798 8629 F0 0B beq StillNothing + 799 862B A0 00 ldy #0 + 800 862D A5 82 lda ydraw + 801 862F 91 A7 sta (tempor2),y + 802 8631 91 AA sta (tempor3),y + 803 8633 4C 3E 86 jmp FoundPeek1 + 804 8636 StillNothing + 805 8636 E6 82 inc ydraw + 806 8638 A5 82 lda ydraw + 807 863A C9 C8 cmp #screenheight + 808 863C D0 E8 bne NextPoint1 + 809 863E FoundPeek1 + 810 863E 18 A5 A7 69 01 85 + adw tempor2 #1 + 811 8649 18 A5 AA 69 01 85 + adw tempor3 #1 + 812 8654 18 A5 80 69 01 85 + adw xdraw #1 + 813 ;vcmp xdraw,screenwidth,NextColumn1 + 814 865F A5 81 CD FF 3D D0 + cpw xdraw RangeRight + 815 866B 90 B5 bcc NextColumn1 + 816 866D F0 B3 beq NextColumn1 + 817 ; we have both tables filled with starting values + 818 + 819 ; main loop starts here + 820 866F MainFallout2 + 821 866F AD FC 3D 85 80 AD + mwa RangeLeft xdraw + 822 8679 18 AD FC 3D 69 13 + adw RangeLeft #mountaintable temp + 823 8688 18 AD FC 3D 69 54 + adw RangeLeft #mountaintable2 tempor2 + 824 8697 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3 + 825 + 826 86A6 A9 01 8D 8D 3E A9 + mwa #1 IsEndOfTheFallFlag + 827 86B0 FalloutOfLine + 828 86B0 A0 00 ldy #0 + 829 + 830 ; is Y coordinate from the first table + 831 ; equal to peak height, if so, go ahead + 832 86B2 B1 A7 lda (tempor2),y + 833 86B4 C9 C7 cmp #screenheight-1 ;cmp (temp),y + 834 86B6 B0 2A bcs ColumnIsReady + 835 ; in the other case there are things to be done + 836 86B8 8C 8D 3E sty IsEndOfTheFallFlag ; flag to 0 + 837 ; we are increasing Y in the first table + 838 ;lda (tempor2),y + 839 86BB 18 clc + 840 86BC 69 01 adc #1 + 841 86BE 91 A7 sta (tempor2),y + 842 ; and checking if there is a pixel there + 843 86C0 85 82 sta ydraw + 844 86C2 20 5F 89 jsr point + 845 86C5 D0 1B bne ThereIsPixelHere + 846 ; if no pixel we plot it + 847 86C7 A9 01 8D CA 3E mva #1 color + 848 86CC 20 24 89 jsr plot.MakePlot + 849 ; zeroing pixel from the second table + 850 ; and increase Y in second table + 851 86CF A0 00 ldy #0 + 852 86D1 B1 AA lda (tempor3),y + 853 86D3 85 82 sta ydraw + 854 86D5 B1 AA lda (tempor3),y + 855 86D7 18 clc + 856 86D8 69 01 adc #1 + 857 86DA 91 AA sta (tempor3),y + 858 86DC 8C CA 3E sty color + 859 86DF 20 24 89 jsr plot.MakePlot + 860 + 861 86E2 ThereIsPixelHere + 862 86E2 ColumnIsReady + 863 86E2 18 A5 91 69 01 85 + adw temp #1 + 864 86ED 18 A5 A7 69 01 85 + adw tempor2 #1 + 865 86F8 18 A5 AA 69 01 85 + adw tempor3 #1 + 866 8703 18 A5 80 69 01 85 + adw xdraw #1 + 867 ;vcmp xdraw,screenwidth,FalloutOfLine + 868 870E A5 81 CD FF 3D D0 + cpw xdraw RangeRight + 869 871A 90 94 bcc FalloutOfLine + 870 871C F0 92 beq FalloutOfLine + 871 + 872 871E AD 8D 3E lda IsEndOfTheFallFlag + 873 ; we repeat untill at some point first table reaches + 874 ; level of the mountains + 875 8721 D0 03 4C 6F 86 jeq MainFallout2 + 876 ; now correct heights are in the second temporary table + 877 ; so we copy + 878 8726 AD FC 3D 85 80 AD + mwa RangeLeft xdraw + 879 8730 18 AD FC 3D 69 13 + adw RangeLeft #mountaintable temp + 880 873F 18 AD FC 3D 69 95 + adw RangeLeft #mountaintable3 tempor3 + 881 + 882 874E A0 00 ldy #0 + 883 8750 CopyHeights + 884 8750 B1 AA lda (tempor3),y + 885 8752 91 91 sta (temp),y + 886 8754 18 A5 91 69 01 85 + adw temp #1 + 887 875F 18 A5 AA 69 01 85 + adw tempor3 #1 + 888 876A 18 A5 80 69 01 85 + adw xdraw #1 + 889 ;vcmp xdraw,screenwidth,CopyHeights + 890 8775 A5 81 CD FF 3D D0 + cpw xdraw RangeRight + 891 8781 90 CD bcc CopyHeights + 892 8783 F0 CB beq CopyHeights + 893 8785 A9 01 8D CA 3E mva #1 color + 894 878A 60 rts + 895 .endp + 896 ;-------------------------------------------------- + 897 878B calculatemountains .proc + 898 ;-------------------------------------------------- + 899 878B A9 00 85 80 85 81 mwa #0 xdraw + 900 + 901 ; starting point + 902 8791 getrandomY ;getting random Y coordinate + 903 8791 38 sec + 904 8792 AD 0A D2 lda random + 905 8795 C9 08 cmp #screenheight-(margin*4) ;it means that max line=199 + 906 8797 B0 F8 bcs getrandomY + 907 8799 18 clc + 908 879A 69 60 adc #(margin*2) + 909 879C 85 82 sta ydraw + 910 879E 8D D0 3E sta yfloat+1 + 911 87A1 A9 00 8D CF 3E mva #0 yfloat ;yfloat equals to e.g. 140.0 + 912 + 913 ; how to make nice looking mountains? + 914 ; randomize points and join them with lines + 915 ; Here we do it simpler way - we randomize X (or deltaX) + 916 ; and "delta" (change of Y coordinate) + 917 + 918 87A6 NextPart + 919 87A6 AD 0A D2 lda random + 920 87A9 8D CD 3E sta delta ; it is after the dot (xxx.delta) + 921 87AC AD 0A D2 lda random + 922 87AF 29 03 and #$03 ;(max delta) + 923 87B1 8D CE 3E sta delta+1 ; before the dot (delta+1.delta) + 924 + 925 87B4 AD 0A D2 lda random + 926 87B7 29 01 and #$01 ;random sign (+/- or up/down) + 927 87B9 8D D2 3E sta UpNdown + 928 + 929 ; theoretically we have here ready + 930 ; fixed-point delta value + 931 ; (-1*(UpNdown))*(delta+1.delta) + 932 + 933 ;loop drawing one line + 934 + 935 87BC ChangingDirection + 936 87BC AD 0A D2 lda random ;length of the line + 937 87BF 29 0F and #$0f ;max line length + 938 87C1 AA tax + 939 87C2 E8 inx + 940 87C3 E8 inx + 941 87C4 E8 inx + 942 87C5 8E D1 3E stx deltaX + 943 + 944 87C8 OnePart + 945 87C8 20 BA 84 jsr placeTanks.CheckTank + 946 ; checks if at a given X coordinate + 947 ; is any tank and if so + 948 ; changes parameters of drawing + 949 ; to generate flat 8 pixels + 950 ; (it will be the place for the tank) + 951 ; it also stores Y position of the tank + 952 87CB 18 A5 80 69 13 85 + adw xdraw #mountaintable modify + 953 + 954 87D8 A5 82 lda ydraw + 955 87DA A0 00 ldy #0 + 956 87DC 91 B2 sta (modify),y + 957 + 958 ; Up or Down + 959 87DE AD D2 3E lda UpNdown + 960 87E1 F0 22 beq ToBottom + 961 + 962 87E3 ToTop ;it means substracting + 963 + 964 87E3 38 AD CF 3E ED CD + sbw yfloat delta + 965 87F6 AD D0 3E lda yfloat+1 + 966 87F9 C9 30 cmp #margin + 967 87FB B0 27 bcs Skip01 + 968 ; if smaller than 10 + 969 87FD A2 00 ldx #$00 + 970 87FF 8E D2 3E stx UpNdown + 971 8802 4C 24 88 jmp Skip01 + 972 + 973 8805 ToBottom + 974 8805 18 AD CF 3E 6D CD + adw yfloat delta + 975 8818 AD D0 3E lda yfloat+1 + 976 881B C9 98 cmp #screenheight-margin + 977 881D 90 05 bcc Skip01 + 978 ; if higher than screen + 979 881F A2 01 ldx #$01 + 980 8821 8E D2 3E stx UpNdown + 981 8824 Skip01 + 982 8824 85 82 sta ydraw + 983 + 984 8826 18 A5 80 69 01 85 + adw xdraw #1 + 985 + 986 8831 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 987 883B F0 08 beq EndDrawing + 988 + 989 883D CE D1 3E dec deltaX + 990 8840 D0 86 bne OnePart + 991 + 992 8842 4C A6 87 jmp NextPart + 993 8845 EndDrawing + 994 + 995 8845 60 rts + 996 .endp + 997 ; ----------------------------------------- + 998 8846 unPlot .proc + 999 ; ----------------------------------------- + 1000 8846 A2 00 ldx #0 ; only one pixel + 1001 8848 unPlotAfterX + 1002 8848 8E 8E 3E stx WhichUnPlot + 1003 + 1004 ; first remake the oldie + 1005 884B BD 94 3E lda oldplotL,x + 1006 884E 85 8D sta oldplot + 1007 8850 BD 8F 3E lda oldplotH,x + 1008 8853 85 8E sta oldplot+1 + 1009 + 1010 8855 BD 9E 3E lda oldply,x + 1011 8858 A8 tay + 1012 8859 BD 99 3E lda oldora,x + 1013 885C 91 8D sta (oldplot),y + 1014 + 1015 + 1016 ; is it not out of the screen ???? + 1017 885E A5 83 C9 00 D0 04 + cpw ydraw #screenheight + 1018 8868 90 03 4C 0B 89 jcs EndOfUnPlot + 1019 886D CheckX + 1020 886D A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 1021 8877 90 03 4C 0B 89 jcs EndOfUnPlot + 1022 887C MakeUnPlot + 1023 ; let's count coordinates taken from xdraw and ydraw + 1024 887C A5 80 85 84 A5 81 + mwa xdraw xbyte + 1025 + 1026 8884 A5 84 lda xbyte + 1027 8886 29 07 and #$7 + 1028 8888 8D CB 3E sta ybit + 1029 + 1030 888B lsrw xbyte +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 888B 46 85 LSR XBYTE+1 + 2 888D 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1031 888F rorw xbyte +Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 888F 66 85 ROR XBYTE+1 + 2 8891 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1032 8893 rorw xbyte +Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8893 66 85 ROR XBYTE+1 + 2 8895 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1033 ;--- + 1034 8897 A4 84 ldy xbyte + 1035 + 1036 8899 AE 8E 3E ldx WhichUnPlot + 1037 889C 98 tya + 1038 889D 9D 9E 3E sta oldply,x + 1039 + 1040 + 1041 88A0 A6 82 ldx ydraw + 1042 88A2 BD B7 46 lda linetableL,x + 1043 88A5 85 84 sta xbyte + 1044 88A7 85 8D sta oldplot + 1045 88A9 BD 80 47 lda linetableH,x + 1046 88AC 85 85 sta xbyte+1 + 1047 88AE 85 8E sta oldplot+1 + 1048 88B0 AE CB 3E ldx ybit + 1049 + 1050 + 1051 88B3 AD CA 3E lda color + 1052 88B6 F0 0D beq ClearUnPlot + 1053 + 1054 88B8 B1 84 lda (xbyte),y + 1055 88BA 8D A3 3E sta OldOraTemp + 1056 88BD 1D 52 48 ora bittable,x + 1057 88C0 91 84 sta (xbyte),y + 1058 88C2 4C CD 88 jmp ContinueUnPlot + 1059 88C5 ClearUnPlot + 1060 88C5 B1 84 lda (xbyte),y + 1061 88C7 8D A3 3E sta OldOraTemp + 1062 88CA 3D 5A 48 and bittable2,x + 1063 ; sta (xbyte),y + 1064 88CD ContinueUnPlot + 1065 88CD AE 8E 3E ldx WhichUnPlot + 1066 88D0 AD A3 3E lda OldOraTemp + 1067 88D3 9D 99 3E sta oldora,x + 1068 88D6 A5 8D lda oldplot + 1069 88D8 9D 94 3E sta oldplotL,x + 1070 88DB A5 8E lda oldplot+1 + 1071 88DD 9D 8F 3E sta oldplotH,x + 1072 ; and now we must solve the problem of several plots + 1073 ; in one byte + 1074 88E0 A2 04 ldx #4 + 1075 88E2 AC 8E 3E ldy WhichUnPlot + 1076 88E5 LetsCheckOverlapping + 1077 88E5 EC 8E 3E cpx WhichUnPlot + 1078 88E8 F0 1E beq SkipThisPlot + 1079 88EA BD 94 3E lda oldplotL,x + 1080 88ED D9 94 3E cmp oldplotL,y + 1081 88F0 D0 16 bne NotTheSamePlot + 1082 88F2 BD 8F 3E lda oldplotH,x + 1083 88F5 D9 8F 3E cmp oldplotH,y + 1084 88F8 D0 0E bne NotTheSamePlot + 1085 88FA BD 9E 3E lda oldply,x + 1086 88FD D9 9E 3E cmp oldply,y + 1087 8900 D0 06 bne NotTheSamePlot + 1088 ; the pixel is in the same byte so let's take correct contents + 1089 8902 BD 99 3E lda oldora,x + 1090 8905 99 99 3E sta oldora,y + 1091 8908 NotTheSamePlot + 1092 8908 SkipThisPlot + 1093 8908 CA dex + 1094 8909 10 DA bpl LetsCheckOverlapping + 1095 890B EndOfUnPlot + 1096 890B 60 rts + 1097 .endp + 1098 ; ----------------------------------------- + 1099 890C plot .proc ;plot (xdraw, ydraw) + 1100 ; this is one of the most important routines in the whole + 1101 ; game. If you are going to speed up the game, start with + 1102 ; plot - it is used by every single effect starting from explosions + 1103 ; through line drawing and small text output!!! + 1104 ; We tried to keep it clear and therefore it is far from + 1105 ; optimal speed. + 1106 + 1107 ; ----------------------------------------- + 1108 ; is it not over the screen ??? + 1109 890C A5 83 C9 00 D0 04 + cpw ydraw #(screenheight+1); changed for one additional line. cpw ydraw #(screenheight-1) + 1110 8916 B0 F3 bcs unPlot.EndOfUnPlot + 1111 8918 CheckX02 + 1112 8918 A5 81 C9 01 D0 04 + cpw xdraw #screenwidth + 1113 8922 B0 32 bcs EndOfPlot ;nearest RTS + 1114 8924 MakePlot + 1115 ; let's calculate coordinates from xdraw and ydraw + 1116 8924 A5 80 85 84 A5 81 + mwa xdraw xbyte + 1117 + 1118 + 1119 892C A5 84 lda xbyte + 1120 892E 29 07 and #$7 + 1121 8930 8D CB 3E sta ybit + 1122 + 1123 ;xbyte = xbyte/8 + 1124 8933 A5 84 lda xbyte + 1125 8935 46 85 lsr xbyte+1 + 1126 8937 6A ror ;just one bit over 256. Max screenwidht = 512!!! + 1127 8938 4A lsr + 1128 8939 4A lsr + 1129 893A A8 tay ;save + 1130 ;--- + 1131 + 1132 + 1133 + 1134 + 1135 893B A6 82 ldx ydraw + 1136 893D BD B7 46 lda linetableL,x + 1137 8940 85 84 sta xbyte + 1138 8942 BD 80 47 lda linetableH,x + 1139 8945 85 85 sta xbyte+1 + 1140 + 1141 8947 AE CB 3E ldx ybit + 1142 894A AD CA 3E lda color + 1143 894D F0 08 beq ClearPlot + 1144 + 1145 894F B1 84 lda (xbyte),y + 1146 8951 1D 52 48 ora bittable,x + 1147 8954 91 84 sta (xbyte),y + 1148 8956 EndOfPlot + 1149 8956 60 rts + 1150 8957 ClearPlot + 1151 8957 B1 84 lda (xbyte),y + 1152 8959 3D 5A 48 and bittable2,x + 1153 895C 91 84 sta (xbyte),y + 1154 895E 60 rts + 1155 .endp + 1156 ; ----------------------------------------- + 1157 895F point .proc + 1158 ; ----------------------------------------- + 1159 ; checks state of the pixel (coordinates in xdraw and ydraw) + 1160 ; result is in A (zero or appropriate bit is set) + 1161 + 1162 + 1163 ; let's calculate coordinates from xdraw and ydraw + 1164 895F A5 80 85 84 A5 81 + mwa xdraw xbyte + 1165 + 1166 + 1167 8967 A5 84 lda xbyte + 1168 8969 29 07 and #$7 + 1169 896B 8D CB 3E sta ybit + 1170 + 1171 ;xbyte = xbyte/8 + 1172 896E A5 84 lda xbyte + 1173 8970 46 85 lsr xbyte+1 + 1174 8972 6A ror ;just one bit over 256. Max screenwidht = 512!!! + 1175 8973 4A lsr + 1176 8974 4A lsr + 1177 8975 A8 tay ;save + 1178 + 1179 ;--- + 1180 + 1181 8976 A6 82 ldx ydraw + 1182 8978 BD B7 46 lda linetableL,x + 1183 897B 85 84 sta xbyte + 1184 897D BD 80 47 lda linetableH,x + 1185 8980 85 85 sta xbyte+1 + 1186 + 1187 8982 AE CB 3E ldx ybit + 1188 + 1189 8985 B1 84 lda (xbyte),y + 1190 8987 3D 52 48 and bittable,x + 1191 898A 60 rts + 1192 .endp + 1193 + 1194 ; ----------------------------------------- + 1195 898B PlotPointer .proc + 1196 ; ----------------------------------------- + 1197 ; draws pointer that shows where is the bullet + 1198 ; when it is over the screen + 1199 ; (it is on the top of the screen) + 1200 + 1201 + 1202 898B A5 80 8D 3C 3E A5 + mwa xdraw tempCir + 1203 + 1204 8995 A9 00 8D CA 3E mva #0 color + 1205 899A A9 C8 85 82 A9 00 + mwa #screenHeight ydraw + 1206 89A2 AD 49 48 85 80 AD + mwa oldPlotPointerX xdraw + 1207 89AC 20 0C 89 jsr plot + 1208 + 1209 + 1210 89AF AD 3C 3E 85 80 AD + mwa tempCir xdraw + 1211 + 1212 89B9 A9 01 8D CA 3E mva #1 color + 1213 89BE A9 C8 85 82 A9 00 + mwa #screenHeight ydraw + 1214 89C6 20 0C 89 jsr plot + 1215 + 1216 89C9 A5 80 8D 49 48 A5 + mwa xdraw oldPlotPointerX + 1217 + 1218 89D3 60 rts + 1219 + 1220 .endp + 1221 ;-------------------------------------------------- + 1222 89D4 DrawLine .proc + 1223 ;-------------------------------------------------- + 1224 89D4 A9 00 85 83 mva #0 ydraw+1 + 1225 89D8 A9 C8 lda #screenheight + 1226 89DA 38 sec + 1227 89DB E5 82 sbc ydraw + 1228 89DD 8D CC 3E sta tempbyte01 + 1229 89E0 20 0C 89 jsr plot + 1230 ;rts + 1231 89E3 4C ED 89 jmp IntoDraw ; jumps inside Draw routine + 1232 ; because one pixel is already plotted + 1233 + 1234 + 1235 89E6 loopdraw + 1236 + 1237 89E6 B1 84 lda (xbyte),y + 1238 89E8 1D 52 48 ora bittable,x + 1239 89EB 91 84 sta (xbyte),y + 1240 89ED 18 A5 84 69 28 85 + IntoDraw adw xbyte #screenBytes + 1241 + 1242 89F8 CE CC 3E dec tempbyte01 + 1243 89FB D0 E9 bne loopdraw + 1244 89FD 60 rts + 1245 .endp + 1246 ; + 1247 ; ------------------------------------------ + 1248 89FE TypeChar .proc + 1249 ; puts char on the graphics screen + 1250 ; in: CharCode + 1251 ; in: left LOWER corner of the char coordinates (xdraw, ydraw) + 1252 ;-------------------------------------------------- + 1253 ; char to the table + 1254 89FE A5 88 lda CharCode + 1255 8A00 85 89 sta fontind + 1256 8A02 A9 00 lda #$00 + 1257 8A04 85 8A sta fontind+1 + 1258 ; char intex times 8 + 1259 8A06 aslw fontind +Macro: ASLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A06 06 89 ASL FONTIND + 2 8A08 26 8A ROL FONTIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1260 8A0A rolw fontind +Macro: ROLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A0A 26 89 ROL FONTIND + 2 8A0C 26 8A ROL FONTIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1261 8A0E rolw fontind +Macro: ROLW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A0E 26 89 ROL FONTIND + 2 8A10 26 8A ROL FONTIND+1 +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1262 + 1263 8A12 18 A5 89 69 2A 85 + adw fontind #TankFont + 1264 + 1265 ; and 8 bytes to the table + 1266 8A1F A0 07 ldy #7 + 1267 8A21 CopyChar + 1268 8A21 B1 89 lda (fontind),y + 1269 8A23 99 BA 3E sta char1,y + 1270 8A26 A9 00 lda #$00 + 1271 8A28 99 C2 3E sta char2,y + 1272 8A2B 88 dey + 1273 8A2C 10 F3 bpl CopyChar + 1274 ; and 8 subsequent bytes as a mask + 1275 8A2E 18 A5 89 69 08 85 + adw fontind #8 + 1276 8A39 A0 07 ldy #7 + 1277 8A3B CopyMask + 1278 8A3B B1 89 lda (fontind),y + 1279 8A3D 99 AA 3E sta mask1,y + 1280 8A40 A9 FF lda #$ff + 1281 8A42 99 B2 3E sta mask2,y + 1282 8A45 88 dey + 1283 8A46 10 F3 bpl CopyMask + 1284 + 1285 ; calculating coordinates from xdraw and ydraw + 1286 8A48 A5 80 85 84 A5 81 + mwa xdraw xbyte + 1287 + 1288 8A50 A5 84 lda xbyte + 1289 8A52 29 07 and #$7 + 1290 8A54 8D CB 3E sta ybit + 1291 + 1292 8A57 lsrw xbyte +Macro: LSRW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A57 46 85 LSR XBYTE+1 + 2 8A59 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1293 8A5B rorw xbyte +Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A5B 66 85 ROR XBYTE+1 + 2 8A5D 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1294 8A5F rorw xbyte +Macro: RORW [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 1 8A5F 66 85 ROR XBYTE+1 + 2 8A61 66 84 ROR XBYTE +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1295 + 1296 ;--- + 1297 8A63 A4 84 ldy xbyte + 1298 + 1299 8A65 A6 82 ldx ydraw + 1300 .rept 7 + 1301 DEX + 1302 .ENDR + 1302 .endr +Source: REPT + 1301 8A67 CA DEX + 1301 8A68 CA DEX + 1301 8A69 CA DEX + 1301 8A6A CA DEX + 1301 8A6B CA DEX + 1301 8A6C CA DEX + 1301 8A6D CA DEX +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\grafproc.asm + 1303 + 1304 8A6E BD B7 46 lda linetableL,x + 1305 8A71 85 84 sta xbyte + 1306 8A73 BD 80 47 lda linetableH,x + 1307 8A76 85 85 sta xbyte+1 + 1308 ; mask preparation and character shifting + 1309 8A78 AE CB 3E ldx ybit + 1310 8A7B F0 6B beq MaskOK00 + 1311 8A7D MakeMask00 + 1312 8A7D 38 sec + 1313 8A7E 6E AA 3E ror mask1 + 1314 8A81 6E B2 3E ror mask2 + 1315 8A84 38 sec + 1316 8A85 6E AB 3E ror mask1+1 + 1317 8A88 6E B3 3E ror mask2+1 + 1318 8A8B 38 sec + 1319 8A8C 6E AC 3E ror mask1+2 + 1320 8A8F 6E B4 3E ror mask2+2 + 1321 8A92 38 sec + 1322 8A93 6E AD 3E ror mask1+3 + 1323 8A96 6E B5 3E ror mask2+3 + 1324 8A99 38 sec + 1325 8A9A 6E AE 3E ror mask1+4 + 1326 8A9D 6E B6 3E ror mask2+4 + 1327 8AA0 38 sec + 1328 8AA1 6E AF 3E ror mask1+5 + 1329 8AA4 6E B7 3E ror mask2+5 + 1330 8AA7 38 sec + 1331 8AA8 6E B0 3E ror mask1+6 + 1332 8AAB 6E B8 3E ror mask2+6 + 1333 8AAE 38 sec + 1334 8AAF 6E B1 3E ror mask1+7 + 1335 8AB2 6E B9 3E ror mask2+7 + 1336 8AB5 4E BA 3E lsr char1 + 1337 8AB8 6E C2 3E ror char2 + 1338 8ABB 6E BB 3E ror char1+1 + 1339 8ABE 6E C3 3E ror char2+1 + 1340 8AC1 6E BC 3E ror char1+2 + 1341 8AC4 6E C4 3E ror char2+2 + 1342 8AC7 6E BD 3E ror char1+3 + 1343 8ACA 6E C5 3E ror char2+3 + 1344 8ACD 6E BE 3E ror char1+4 + 1345 8AD0 6E C6 3E ror char2+4 + 1346 8AD3 6E BF 3E ror char1+5 + 1347 8AD6 6E C7 3E ror char2+5 + 1348 8AD9 6E C0 3E ror char1+6 + 1349 8ADC 6E C8 3E ror char2+6 + 1350 8ADF 6E C1 3E ror char1+7 + 1351 8AE2 6E C9 3E ror char2+7 + 1352 8AE5 CA dex + 1353 8AE6 D0 95 bne MakeMask00 + 1354 8AE8 MaskOK00 + 1355 ; here x=0 + 1356 8AE8 AD FB 3D lda Erase + 1357 8AEB F0 0F beq CharLoopi ; it works, because x=0 + 1358 8AED A9 00 lda #0 + 1359 8AEF A2 07 ldx #7 + 1360 8AF1 EmptyChar + 1361 8AF1 9D BA 3E sta char1,x + 1362 8AF4 9D C2 3E sta char2,x + 1363 8AF7 CA dex + 1364 8AF8 10 F7 bpl EmptyChar + 1365 8AFA A2 00 ldx #0 + 1366 8AFC CharLoopi + 1367 8AFC B1 84 lda (xbyte),y + 1368 8AFE 3D AA 3E and mask1,x + 1369 8B01 1D BA 3E ora char1,x + 1370 8B04 91 84 sta (xbyte),y + 1371 8B06 C8 iny + 1372 8B07 B1 84 lda (xbyte),y + 1373 8B09 3D B2 3E and mask2,x + 1374 8B0C 1D C2 3E ora char2,x + 1375 8B0F 91 84 sta (xbyte),y + 1376 8B11 88 dey + 1377 8B12 18 A5 84 69 28 85 + adw xbyte #screenBytes + 1378 8B1D E8 inx + 1379 8B1E E0 08 cpx #8 + 1380 8B20 D0 DA bne CharLoopi + 1381 8B22 60 rts + 1382 .endp + 1383 ; ------------------------------------------ + 1384 8B23 PutChar4x4 .proc ;puts 4x4 pixels char on the graphics screen + 1385 ; in: xdraw, ydraw (upper left corner of the char) + 1386 ; in: CharCode4x4 (.sbyte) + 1387 ;-------------------------------------------------- + 1388 8B23 AD 51 48 lda plot4x4color + 1389 8B26 8D CA 3E sta color + 1390 + 1391 + 1392 ; calculating address of the first byte + 1393 8B29 A9 04 8D 4B 48 mva #4 LoopCounter4x4 + 1394 8B2E AD 50 48 lda CharCode4x4 + 1395 8B31 29 01 and #1 + 1396 8B33 8D 4F 48 sta nibbler4x4 + 1397 8B36 AD 50 48 lda CharCode4x4 + 1398 8B39 6A ror + 1399 ; in carry there is which nibble of the byte is to be taken + 1400 8B3A 18 clc + 1401 8B3B 69 60 adc #(3*32) + 1402 8B3D 8D 4C 48 sta y4x4 + 1403 8B40 nextline4x4 + 1404 8B40 A9 04 8D 4E 48 mva #4 Xcounter4x4 + 1405 8B45 AC 4C 48 ldy y4x4 + 1406 8B48 B9 AA 8E lda font4x4,y ;there was a problem with OMC here, but it works now + 1407 + 1408 8B4B AE 4F 48 ldx nibbler4x4 + 1409 8B4E F0 04 beq uppernibble + 1410 + 1411 8B50 0A asl + 1412 8B51 0A asl + 1413 8B52 0A asl + 1414 8B53 0A asl + 1415 8B54 uppernibble + 1416 8B54 2A rol + 1417 8B55 8D 4D 48 sta StoreA4x4 + 1418 8B58 B0 03 bcs EmptyPixel ; the font I drawn is in inverse ... + 1419 ;lda plot4x4color ;these lines are not necessary + 1420 ;sta color ;if a plots are one color only + 1421 8B5A 20 0C 89 jsr plot + 1422 ;jmp Loop4x4Continued + 1423 8B5D EmptyPixel + 1424 ;lda #1 ;reverse color (color==1-color) + 1425 ;sec + 1426 ;sbc plot4x4color + 1427 ;sta color + 1428 ;jsr plot + 1429 ;this is turned off for speed + 1430 ;anyway we assume the text is being drawn + 1431 ;over an empty space + 1432 8B5D Loop4x4Continued + 1433 8B5D 18 A5 80 69 01 85 + adw xdraw #1 + 1434 8B68 AD 4D 48 lda StoreA4x4 + 1435 8B6B CE 4E 48 dec Xcounter4x4 + 1436 8B6E AE 4E 48 ldx Xcounter4x4 + 1437 8B71 D0 E1 bne uppernibble + 1438 ; here we have on screen one line of the char + 1439 8B73 18 A5 82 69 01 85 + adw ydraw #1 + 1440 8B7E 38 A5 80 E9 04 85 + sbw xdraw #4 + 1441 8B89 38 AD 4C 48 E9 20 + sbw y4x4 #32 + 1442 8B97 CE 4B 48 AD 4B 48 dec:lda LoopCounter4x4 + 1443 8B9D D0 A1 bne nextline4x4 + 1444 + 1445 8B9F 60 rts + 1446 .endp + 1447 ; ------------------------------------------ + 1448 8BA0 PutChar4x4FULL .proc; + 1449 ;this routine works just like PutChar4x4, + 1450 ;but this time all pixels are being drawn + 1451 ;(empty and not empty) + 1452 ;-------------------------------------------------- + 1453 8BA0 AD 51 48 lda plot4x4color + 1454 8BA3 8D CA 3E sta color + 1455 + 1456 ; calculating address of the first byte + 1457 8BA6 A9 04 8D 4B 48 mva #4 LoopCounter4x4 + 1458 8BAB AD 50 48 lda CharCode4x4 + 1459 8BAE 29 01 and #1 + 1460 8BB0 8D 4F 48 sta nibbler4x4 + 1461 8BB3 AD 50 48 lda CharCode4x4 + 1462 8BB6 6A ror + 1463 ; in carry there is which nibble of the byte is to be taken clc + 1464 8BB7 18 clc + 1465 8BB8 69 60 adc #(3*32) + 1466 8BBA 8D 4C 48 sta y4x4 + 1467 8BBD nextline4x4FULL + 1468 8BBD A9 04 8D 4E 48 mva #4 Xcounter4x4 + 1469 8BC2 AC 4C 48 ldy y4x4 + 1470 8BC5 B9 AA 8E lda font4x4,y + 1471 + 1472 8BC8 AE 4F 48 ldx nibbler4x4 + 1473 8BCB F0 04 beq uppernibbleFULL + 1474 + 1475 8BCD 0A asl + 1476 8BCE 0A asl + 1477 8BCF 0A asl + 1478 8BD0 0A asl + 1479 8BD1 uppernibbleFULL + 1480 8BD1 2A rol + 1481 8BD2 8D 4D 48 sta StoreA4x4 + 1482 8BD5 B0 0C bcs EmptyPixelFULL + 1483 8BD7 AD 51 48 lda plot4x4color ;these lines are not necessary + 1484 8BDA 8D CA 3E sta color ;if a plots are one color only + 1485 8BDD 20 0C 89 jsr plot + 1486 8BE0 4C EF 8B jmp Loop4x4ContinuedFULL + 1487 8BE3 EmptyPixelFULL + 1488 8BE3 A9 01 lda #1 ;reverse color (color==1-color) + 1489 8BE5 38 sec + 1490 8BE6 ED 51 48 sbc plot4x4color + 1491 8BE9 8D CA 3E sta color + 1492 8BEC 20 0C 89 jsr plot + 1493 ;this is turned on now + 1494 ;of course it is slower + 1495 + 1496 8BEF Loop4x4ContinuedFULL + 1497 8BEF 18 A5 80 69 01 85 + adw xdraw #1 + 1498 8BFA AD 4D 48 lda StoreA4x4 + 1499 8BFD CE 4E 48 dec Xcounter4x4 + 1500 8C00 AE 4E 48 ldx Xcounter4x4 + 1501 8C03 D0 CC bne uppernibbleFULL + 1502 ; here we have on screen one line of the char + 1503 8C05 18 A5 82 69 01 85 + adw ydraw #1 + 1504 8C10 38 A5 80 E9 04 85 + sbw xdraw #4 + 1505 8C1B 38 AD 4C 48 E9 20 + sbw y4x4 #32 + 1506 8C29 CE 4B 48 AD 4B 48 dec:lda LoopCounter4x4 + 1507 8C2F D0 8C bne nextline4x4FULL + 1508 + 1509 8C31 60 rts + 1510 .endp + 1511 + 1512 .endif + 1110 ;---------------------------------------------- + 1111 8C32 icl 'ai.asm' +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm + 1 ; @com.wudsn.ide.asm.mainsourcefile=program.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 8C32 MakeLowResDistances .proc + 13 ; create low precision table of positions + 14 ; by dividing positions by 4 + 15 + 16 8C32 A0 05 ldy #MaxPlayers-1 + 17 8C34 loop + 18 8C34 B9 97 3D lda xtankstableL,y + 19 8C37 85 91 sta temp + 20 8C39 B9 9D 3D lda xtankstableH,y + 21 8C3C 85 92 sta temp+1 + 22 + 23 ;= /4 + 24 8C3E 46 92 66 91 46 92 + :2 lsrw temp + 25 8C46 A5 91 lda temp + 26 8C48 99 A9 3D sta LowResDistances,y + 27 8C4B 88 dey + 28 8C4C 10 E6 bpl loop + 29 8C4E 60 rts + 30 .endp + 31 + 32 ;---------------------------------------------- + 33 8C4F ArtificialIntelligence .proc ; + 34 ; A - skill of the TankNr + 35 ; returns shoot energy and angle in + 36 ; EnergyTable/L/H and AngleTable + 37 ;---------------------------------------------- + 38 8C4F 0A asl + 39 8C50 AA tax + 40 8C51 CA CA :2 dex ;credit KK + 41 8C53 BD 5D 8C lda AIRoutines+1,x + 42 8C56 48 pha + 43 8C57 BD 5C 8C lda AIRoutines,x + 44 8C5A 48 pha + 45 8C5B 60 rts + 46 .endp + 47 ;---------------- + 48 8C5C AIRoutines + 49 8C5C 6B 8C .word Moron-1 + 50 8C5E 8B 8C .word Shooter-1 ;Shooter + 51 8C60 2A 8D .word Poolshark-1 ;Poolshark + 52 8C62 2A 8D .word Poolshark-1 ;Toosser + 53 8C64 2A 8D .word Poolshark-1 ;Chooser + 54 8C66 2A 8D .word Poolshark-1 ;Spoiler + 55 8C68 2A 8D .word Poolshark-1 ;Cyborg + 56 8C6A 2A 8D .word Poolshark-1 ;Unknown + 57 + 58 ;---------------------------------------------- + 59 8C6C Moron .proc + 60 8C6C A6 8B ldx TankNr + 61 8C6E 20 89 73 jsr RandomizeAngle + 62 8C71 8D 88 3D sta NewAngle + 63 8C74 A9 50 8D C7 50 A9 + mwa #80 RandBoundaryLow + 64 8C7E A9 20 8D C9 50 A9 + mwa #800 RandBoundaryHigh + 65 8C88 20 97 73 jsr RandomizeForce + 66 8C8B 60 rts + 67 .endp + 68 ;---------------------------------------------- + 69 8C8C Shooter .proc + 70 + 71 8C8C A6 8B ldx TankNr + 72 8C8E BD A9 50 lda PreviousAngle,x + 73 8C91 1D AF 50 ora PreviousEnergyL,x + 74 8C94 1D BB 50 ora PreviousEnergyH,x + 75 8C97 F0 22 beq firstShoot + 76 + 77 8C99 BD A9 50 lda PreviousAngle,x + 78 8C9C 18 clc + 79 8C9D 69 05 adc #5 + 80 8C9F 30 08 bmi leftQuadrant + 81 8CA1 C9 5A cmp #90 + 82 8CA3 90 04 bcc continue + 83 8CA5 A9 A6 lda #(-90) + 84 8CA7 D0 00 bne continue + 85 8CA9 leftQuadrant + 86 + 87 + 88 + 89 8CA9 continue + 90 8CA9 8D 88 3D sta NewAngle + 91 + 92 8CAC BD AF 50 lda PreviousEnergyL,x + 93 8CAF 9D 6A 3D sta EnergyTableL,x + 94 8CB2 BD BB 50 lda PreviousEnergyH,x + 95 8CB5 9D 70 3D sta EnergyTableH,x + 96 + 97 8CB8 4C 01 8D jmp endo + 98 8CBB firstShoot + 99 ; compare the x position with the middle of the screen + 100 8CBB BD 97 3D lda xTanksTableL,x + 101 8CBE 85 91 sta temp + 102 8CC0 BD 9D 3D lda xTanksTableH,x + 103 8CC3 85 92 sta temp+1 + 104 8CC5 A5 92 C9 00 D0 04 + cpw temp #(screenwidth/2) + 105 8CCF B0 0E bcs tankIsOnTheRight + 106 + 107 8CD1 AD 0A D2 lda RANDOM + 108 8CD4 29 1F and #$1F + 109 8CD6 18 clc + 110 8CD7 69 05 adc #5 + 111 ;lda #45 + 112 + 113 8CD9 8D 88 3D sta NewAngle + 114 8CDC 4C EA 8C jmp forceNow + 115 8CDF tankIsOnTheRight + 116 8CDF AD 0A D2 lda RANDOM + 117 8CE2 29 1F and #$1F + 118 8CE4 18 clc + 119 8CE5 69 AB adc #(-85) + 120 ;lda #-45 + 121 8CE7 8D 88 3D sta NewAngle + 122 + 123 8CEA forceNow + 124 8CEA A9 64 8D C7 50 A9 + mwa #100 RandBoundaryLow + 125 8CF4 A9 20 8D C9 50 A9 + mwa #800 RandBoundaryHigh + 126 8CFE 20 97 73 jsr RandomizeForce + 127 + 128 8D01 endo + 129 8D01 A6 8B ldx TankNr ;this is possibly not necessary + 130 8D03 AD 88 3D lda NewAngle + 131 8D06 9D A9 50 sta PreviousAngle,x + 132 8D09 BD 6A 3D lda EnergyTableL,x + 133 8D0C 9D AF 50 sta PreviousEnergyL,x + 134 8D0F BD 70 3D lda EnergyTableH,x + 135 8D12 9D BB 50 sta PreviousEnergyH,x + 136 + 137 ; choose the best weapon + 138 + 139 8D15 BD 07 41 lda TanksWeaponsTableL,x + 140 8D18 85 91 sta temp + 141 8D1A BD 0D 41 lda TanksWeaponsTableH,x + 142 8D1D 85 92 sta temp+1 + 143 8D1F A0 20 ldy #32 ;the last weapon + 144 8D21 loop + 145 8D21 88 dey + 146 8D22 B1 91 lda (temp),y + 147 8D24 F0 FB beq loop + 148 8D26 98 tya + 149 8D27 9D 89 3D sta ActiveWeapon,x + 150 8D2A 60 rts + 151 .endp + 152 ;---------------------------------------------- + 153 8D2B Poolshark .proc + 154 + 155 8D2B firstShoot + 156 ;find nearest tank neighbour + 157 8D2B 20 32 8C jsr MakeLowResDistances + 158 8D2E A9 FF 85 93 mva #$ff temp2 ; min possible distance + 159 + 160 8D32 A6 8B ldx TankNr + 161 8D34 AC 19 3D ldy NumberOfPlayers + 162 8D37 88 dey + 163 + 164 8D38 loop01 + 165 8D38 C4 8B cpy TankNr + 166 8D3A F0 43 beq skipThisPlayer + 167 8D3C B9 51 3D lda eXistenZ,y + 168 8D3F F0 3E beq skipThisPlayer + 169 + 170 8D41 BD A9 3D lda LowResDistances,x + 171 8D44 D9 A9 3D cmp LowResDistances,y + 172 8D47 B0 1D bcs EnemyOnTheLeft + 173 ;enemy on the right + 174 8D49 38 sec + 175 8D4A B9 A9 3D lda LowResDistances,y + 176 8D4D FD A9 3D sbc LowResDistances,x + 177 8D50 C5 93 cmp temp2 ; lowest + 178 8D52 B0 2B bcs lowestIsLower + 179 8D54 85 93 sta temp2 + 180 8D56 84 94 sty temp2+1 ; number of the closest tank + 181 ; calculate index to shotangle table + 182 8D58 4A 4A 4A :3 lsr @ + 183 8D5B 29 07 and #%00000111 + 184 8D5D 18 clc + 185 8D5E 69 08 adc #8 + 186 8D60 8D CB 50 sta AngleTablePointer + 187 8D63 4C 7F 8D jmp lowestIsLower + 188 + 189 8D66 EnemyOnTheLeft + 190 8D66 38 sec + 191 8D67 BD A9 3D lda LowResDistances,x + 192 8D6A F9 A9 3D sbc LowResDistances,y + 193 8D6D C5 93 cmp temp2 ; lowest + 194 8D6F B0 0E bcs lowestIsLower + 195 8D71 85 93 sta temp2 + 196 8D73 84 94 sty temp2+1 ; number of the closest tank + 197 ; calculate index to shotangle table + 198 8D75 4A 4A 4A :3 lsr @ + 199 8D78 29 07 and #%00000111 + 200 8D7A 49 07 eor #%00000111 + 201 8D7C 8D CB 50 sta AngleTablePointer + 202 + 203 8D7F lowestIsLower + 204 8D7F skipThisPlayer + 205 8D7F 88 dey + 206 8D80 10 B6 bpl loop01 + 207 + 208 8D82 randomize 0 8 +Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 8D82 ?rand + 4 8D82 AD 0A D2 lda random + 5 8D85 C9 00 cmp #0 ;floor + 6 8D87 90 F9 bcc ?rand + 7 8D89 C9 09 cmp #8+1 ;ceiling + 8 8D8B B0 F5 bcs ?rand +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm + 209 8D8D AC CB 50 ldy AngleTablePointer + 210 8D90 18 clc + 211 8D91 79 C6 8D adc AngleTable,y + 212 8D94 8D 88 3D sta NewAngle + 213 + 214 8D97 forceNow + 215 8D97 A9 2C 8D C7 50 A9 + mwa #300 RandBoundaryLow + 216 8DA1 A9 BC 8D C9 50 A9 + mwa #700 RandBoundaryHigh + 217 8DAB 20 97 73 jsr RandomizeForce + 218 + 219 8DAE endo + 220 8DAE A6 8B ldx TankNr ;this is possibly not necessary + 221 + 222 ; choose the best weapon + 223 + 224 8DB0 BD 07 41 lda TanksWeaponsTableL,x + 225 8DB3 85 91 sta temp + 226 8DB5 BD 0D 41 lda TanksWeaponsTableH,x + 227 8DB8 85 92 sta temp+1 + 228 8DBA A0 20 ldy #32 ;the last weapon + 229 8DBC loop + 230 8DBC 88 dey + 231 8DBD B1 91 lda (temp),y + 232 8DBF F0 FB beq loop + 233 8DC1 98 tya + 234 8DC2 9D 89 3D sta ActiveWeapon,x + 235 8DC5 60 rts + 236 + 237 ;---------------------------------------------- + 238 8DC6 AngleTable ; 16 bytes ;ba w $348b L$3350 + 239 8DC6 B2 BA C2 CA D2 DA + .by 178,186,194,202,210,218,226,234 + 240 8DCE 10 18 20 28 30 38 + .by 16,24,32,40,48,56,64,72 + 241 .endp + 242 ;---------------------------------------------- + 243 8DD6 PurchaseAI .proc ; + 244 ; A - skill of the TankNr + 245 ; makes purchase for AI opponents + 246 ; results of this routine are not visible on the screen + 247 ;---------------------------------------------- + 248 8DD6 0A asl + 249 8DD7 AA tax + 250 8DD8 CA CA :2 dex ;credit KK + 251 8DDA BD E4 8D lda PurchaseAIRoutines+1,x + 252 8DDD 48 pha + 253 8DDE BD E3 8D lda PurchaseAIRoutines,x + 254 8DE1 48 pha + 255 8DE2 60 rts + 256 .endp + 257 + 258 ;---------------- + 259 8DE3 PurchaseAIRoutines + 260 8DE3 F2 8D .word MoronPurchase-1 + 261 8DE5 41 8E .word ShooterPurchase-1 ;ShooterPurchase + 262 8DE7 5A 8E .word PoolsharkPurchase-1 ;PoolsharkPurchase + 263 8DE9 5A 8E .word PoolsharkPurchase-1 ;ToosserPurchase + 264 8DEB 5A 8E .word PoolsharkPurchase-1 ;ChooserPurchase + 265 8DED 5A 8E .word PoolsharkPurchase-1 ;SpoilerPurchase + 266 8DEF 5A 8E .word PoolsharkPurchase-1 ;CyborgPurchase + 267 8DF1 5A 8E .word PoolsharkPurchase-1 ;UnknownPurchase + 268 + 269 ;---------------------------------------------- + 270 8DF3 MoronPurchase + 271 ;Moron buys nothing + 272 8DF3 60 rts + 273 + 274 ;------- + 275 8DF4 TryToPurchaseOnePiece .proc + 276 ; A - weapon number, better it will be in range(1,32) + 277 ; TankNr in X + 278 8DF4 A8 tay + 279 8DF5 B9 74 8E lda PurchaseMeTable,y + 280 8DF8 F0 47 beq SorryNoPurchase + 281 8DFA B9 D9 4B lda WeaponPriceL,y + 282 8DFD 85 91 sta temp + 283 8DFF B9 99 4B lda WeaponPriceH,y + 284 8E02 85 92 sta temp+1 + 285 ;price of the weapon in temp + 286 8E04 BD 2C 3D lda MoneyL,x + 287 8E07 85 93 sta temp2 + 288 8E09 BD 26 3D lda MoneyH,x + 289 8E0C 85 94 sta temp2+1 + 290 ;current monies in temp2 + 291 8E0E A5 94 C5 92 D0 04 + cpw temp2 temp + 292 8E18 90 27 bcc SorryNoPurchase + 293 ; deduct monies from the bank account + 294 8E1A 38 sec + 295 8E1B A5 93 lda temp2 + 296 8E1D E5 91 sbc temp + 297 8E1F 9D 2C 3D sta MoneyL,x + 298 8E22 A5 94 lda temp2+1 + 299 8E24 E5 92 sbc temp+1 + 300 8E26 9D 26 3D sta MoneyH,x + 301 + 302 8E29 BD 07 41 lda TanksWeaponsTableL,x + 303 8E2C 85 91 sta temp + 304 8E2E BD 0D 41 lda TanksWeaponsTableH,x + 305 8E31 85 92 sta temp+1 + 306 + 307 8E33 B9 19 4C lda WeaponUnits,y + 308 8E36 18 clc + 309 8E37 71 91 adc (temp),y + 310 8E39 C9 63 cmp #99 ;max number of weapon units + 311 8E3B 90 02 bcc NotExceeded + 312 8E3D A9 63 lda #99 + 313 8E3F NotExceeded + 314 8E3F 91 91 sta (temp),y + 315 + 316 + 317 8E41 SorryNoPurchase + 318 8E41 60 rts + 319 .endp + 320 + 321 + 322 ;---------------------------------------------- + 323 8E42 ShooterPurchase .proc + 324 8E42 A9 04 85 95 mva #4 tempXroller; number of purchases to perform + 325 + 326 8E46 A6 8B ldx TankNr + 327 8E48 loop + 328 8E48 randomize 1 14 +Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 8E48 ?rand + 4 8E48 AD 0A D2 lda random + 5 8E4B C9 01 cmp #1 ;floor + 6 8E4D 90 F9 bcc ?rand + 7 8E4F C9 0F cmp #14+1 ;ceiling + 8 8E51 B0 F5 bcs ?rand +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm + 329 8E53 20 F4 8D jsr TryToPurchaseOnePiece + 330 8E56 C6 95 dec tempXroller + 331 8E58 D0 EE bne loop + 332 + 333 8E5A 60 rts + 334 .endp + 335 ;---------------------------------------------- + 336 8E5B PoolsharkPurchase .proc + 337 8E5B A9 08 85 95 mva #8 tempXroller; number of purchases to perform + 338 + 339 8E5F A6 8B ldx TankNr + 340 8E61 loop + 341 8E61 randomize 1 30 +Macro: RANDOMIZE [Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\..\lib\macro.hea] + 3 8E61 ?rand + 4 8E61 AD 0A D2 lda random + 5 8E64 C9 01 cmp #1 ;floor + 6 8E66 90 F9 bcc ?rand + 7 8E68 C9 1F cmp #30+1 ;ceiling + 8 8E6A B0 F5 bcs ?rand +Source: C:\Users\Pawel\Dropbox\atari\projects\scorch_src\ai.asm + 342 8E6C 20 F4 8D jsr TryToPurchaseOnePiece + 343 8E6F C6 95 dec tempXroller + 344 8E71 D0 EE bne loop + 345 + 346 8E73 60 rts + 347 .endp + 348 + 349 + 350 8E74 PurchaseMeTable .proc ;weapons good to be purchased by the robot + 351 ;the comment is an index in the tables + 352 8E74 01 dta 1 ;"Baby Missile " ; 0 + 353 8E75 01 dta 1 ;"Missile " ; 1 + 354 8E76 01 dta 1 ;"Baby Nuke " ; 2 + 355 8E77 01 dta 1 ;"Nuke " ; 3 + 356 8E78 01 dta 1 ;"LeapFrog " ; 4 + 357 8E79 01 dta 1 ;"Funky Bomb " ; 5 + 358 8E7A 01 dta 1 ;"MIRV " ; 6 + 359 8E7B 01 dta 1 ;"Death's Head " ; 7 + 360 8E7C 00 dta 0 ;"Napalm " ; 8 + 361 8E7D 00 dta 0 ;"Hot Napalm " ; 9 + 362 8E7E 00 dta 0 ;"Tracer " ; 10 + 363 8E7F 00 dta 0 ;"Smoke Tracer " ; 11 + 364 8E80 01 dta 1 ;"Baby Roller " ; 12 + 365 8E81 01 dta 1 ;"Roller " ; 13 + 366 8E82 01 dta 1 ;"Heavy Roller " ; 14 + 367 8E83 00 dta 0 ;"Riot Charge " ; 15 + 368 8E84 00 dta 0 ;"Riot Blast " ; 16 + 369 8E85 00 dta 0 ;"Riot Bomb " ; 17 + 370 8E86 00 dta 0 ;"Heavy Riot Bomb " ; 18 + 371 8E87 00 dta 0 ;"Baby Digger " ; 19 + 372 8E88 00 dta 0 ;"Digger " ; 20 + 373 8E89 00 dta 0 ;"Heavy Digger " ; 21 + 374 8E8A 00 dta 0 ;"Baby Sandhog " ; 22 + 375 8E8B 00 dta 0 ;"Sandhog " ; 23 + 376 8E8C 00 dta 0 ;"Heavy Sandhog " ; 24 + 377 8E8D 00 dta 0 ;"Dirt Clod " ; 25 + 378 8E8E 00 dta 0 ;"Dirt Ball " ; 26 + 379 8E8F 00 dta 0 ;"Ton of Dirt " ; 27 + 380 8E90 01 dta 1 ;"Liquid Dirt " ; 28 + 381 8E91 00 dta 0 ;"Dirt Charge " ; 29 + 382 8E92 00 dta 0 ;"Earth Disrupter " ; 30 + 383 8E93 01 dta 1 ;"Plasma Blast " ; 31 + 384 8E94 01 dta 1 ;"Laser " ; 32 + 385 8E95 00 dta 0 ;"----------------" ; 33 + 386 8E96 00 dta 0 ;"----------------" ; 34 + 387 8E97 00 dta 0 ;"----------------" ; 35 + 388 8E98 00 dta 0 ;"----------------" ; 36 + 389 8E99 00 dta 0 ;"----------------" ; 37 + 390 8E9A 00 dta 0 ;"----------------" ; 38 + 391 8E9B 00 dta 0 ;"----------------" ; 39 + 392 8E9C 00 dta 0 ;"----------------" ; 40 + 393 8E9D 00 dta 0 ;"----------------" ; 41 + 394 8E9E 00 dta 0 ;"----------------" ; 42 + 395 8E9F 00 dta 0 ;"----------------" ; 43 + 396 8EA0 00 dta 0 ;"----------------" ; 44 + 397 8EA1 00 dta 0 ;"----------------" ; 45 + 398 8EA2 00 dta 0 ;"----------------" ; 46 + 399 8EA3 00 dta 0 ;"----------------" ; 47 + 400 + 401 .endp + 402 + 1112 ;---------------------------------------------- + 1113 + 1114 8EA4 52 32 72 92 B2 02 TankColoursTable .BYTE $52,$32,$72,$92,$B2,$02 + 1115 + 1116 8EAA font4x4 + 1117 8EAA FB F9 1F FF 99 FF + ins 'artwork/font4x4s.bmp',+62 + 1118 ;---------------------------------------------- + 1119 8F2A TankFont + 1120 8F2A 00 00 00 00 00 00 + ins 'artwork/tanks.fnt' + 1121 932A TankFontend + 1122 .if TankFontEnd>$9800 + 1123 .error memory conflict + 1124 ;this is to warn if code and P/M graphics + 1125 ;overlap! + 1126 .endif + 1127 ;---------------------------------------------- + 1128 ; Player/missile memory + 1129 ORG $9800 + 1130 9800 pmgraph + 1131 + 1132 ;---------------------------------------------- + 1133 ORG $a400 + 1134 A400 WeaponFont + 1135 A400-A7FF> 00 00 00 00 + ins 'artwork/weapons.fnt' + 1136 ;---------------------------------------------- + 1137 A800 TheEnd + 1138 .if TheEnd>$c000 + 1139 .error memory conflict + 1140 + 1141 .endif + 1142 + 1143 + 1144 02E0-02E1> 3B 5B run START diff --git a/program.xex b/program.xex new file mode 100644 index 0000000..d87d27a Binary files /dev/null and b/program.xex differ diff --git a/textproc.asm b/textproc.asm new file mode 100644 index 0000000..2bb9f23 --- /dev/null +++ b/textproc.asm @@ -0,0 +1,1643 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm + + + .IF *>0 +;---------------------------------------- +; this module contains routines used in text mode +; like shop and start-up options +;---------------------------------------- +;-------------------------------------------------- +getkey .proc; waits for pressing a key and returns pressed value in A +;-------------------------------------------------- + pause 5 + lda SKSTAT + cmp #$ff + beq lopx01 + cmp #$f7 + bne getkey ; I guess it waits for RELEASING a key + lda JSTICK0 + and #$0f + cmp #$0f + bne getkey ; waits for not moving the joy + lda TRIG0 + beq getkey ; waits for releasing FIRE + + +lopx01 lda SKSTAT + cmp #$ff + beq checkJoyGetKey ; key not pressed, check Joy + cmp #$f7 + beq checkJoyGetKey ; key not pressed, check Joy + + lda kbcode + and #$3f ;CTRL and SHIFT ellimination + rts +checkJoyGetKey + ;------------JOY------------- + ;happy happy joy joy + ;check for joystick now + lda JSTICK0 + and #$0f + cmp #$0f + beq notpressedJoyGetKey + tay + lda joyToKeyTable,y + rts +notpressedJoyGetKey + ;fire + lda TRIG0 + bne lopx01 + lda #$0c ;Return key + rts +.endp +;-------------------------------------------------- +getkeynowait .proc; +;-------------------------------------------------- + lda SKSTAT + cmp #$ff + beq getkeynowait + cmp #$f7 + beq getkeynowait ; I guess it waits for RELEASING a key + lda kbcode + and #$3f ;CTRL and SHIFT ellimination + rts +.endp +;-------------------------------------------------- +Options .proc +;-------------------------------------------------- +; start-up screen - options, etc. +; this function returns: +; - number of players (NumberOfPlayers) +; - money each player has on the beginning of the game (moneyL i moneyH) +; - and I am sure maxwind, gravity, ???? + + mva #0 OptionsY + +OptionsMainLoop + + jsr OptionsInversion + jsr getkey + cmp #$f ;cursor down + bne OptionsNoDown + inc:lda OptionsY + cmp #maxoptions + bne OptionsMainLoop + mva #3 OptionsY + jmp OptionsMainLoop + +OptionsNoDown + cmp #$e ;cursor up + bne OptionsNoUp + dec OptionsY + bpl OptionsMainLoop + mva #0 OptionsY + jmp OptionsMainLoop + +OptionsNoUp + cmp #$6 ;cursor left + bne OptionsNoLeft + ldx OptionsY + dec OptionsTable,X + lda OptionsTable,X + bpl OptionsMainLoop + inc OptionsTable,X + jmp OptionsMainLoop + +OptionsNoLeft + cmp #$7 ;cursor right + bne OptionsNoRight + + ldx OptionsY + inc OptionsTable,X + lda OptionsTable,X + cmp #5 + bne OptionsMainLoop + dec OptionsTable,X + jmp OptionsMainLoop + +OptionsNoRight + cmp #$c ;Return key + bne OptionsNoReturn + jmp OptionsFinished +OptionsNoReturn + jmp OptionsMainLoop + +OptionsFinished + ;first option + ldy OptionsTable + iny + iny + sty NumberOfPlayers ;1=1 player (but minimum is 2) + + ;second option (cash) + + + ldy OptionsTable+1 + ldx #0 +skip10 + lda CashOptionL,y + sta moneyL,x + lda CashOptionH,y + sta moneyH,x + inx + cpx NumberOfPlayers + bne skip10 + + ;third option (gravity) + ldy OptionsTable+2 + lda GravityTable,y + sta gravity + + ;fourth option (wind) + + ldy OptionsTable+3 + lda MaxWindTable,y + sta MaxWind + rts +;-------- +; inversing choosed option (cursor) +;-------- +OptionsInversion + mwa #OptionsHere temp + ldy #0 +OptionsInversionLoop1 + lda (temp),y + and #$7F + sta (temp),y + adw temp #1 + cpw temp #OptionsScreenEnd + bne OptionsInversionLoop1 +;here all past inversions are gone... + + mwa #OptionsHere temp + mva #0 temp2 ;option number pointer + adw temp #11 ;offset of the first option=11 +OptionsSetMainLoop + ldx temp2 + lda OptionsTable,x + asl + asl + adc OptionsTable,x ;OptionsTable value * 5 + tay + ldx #4 +OptionSetLoop + lda (temp),y + ora #$80 + sta (temp),y + iny + dex + bpl OptionSetLoop ;here option is highlighted +; +; next option + adw temp #40 ;jump to next line + inc:lda temp2 + cmp #4 ;number of options + bne OptionsSetMainLoop + +;inversing the first few chars of the selected line (OptionsY) + mva OptionsY temp + mwa #0 temp+1 + asl temp + rol temp+1 + asl temp + rol temp+1 + asl temp + rol temp+1 + mwa temp temp2 ;here is OptionsY*8 + asl temp + rol temp+1 + asl temp + rol temp+1 + ;here is 32*OptionsY + adw temp temp2 + ;in temp is 40*OptionsY + adw temp #OptionsHere + ;now in temp is adres of the line to be inversed + ldy #7 ;8 letters to invers +OptionsYLoop + lda (temp),y + ora #$80 + sta (temp),y + dey + bpl OptionsYLoop + + + rts +.endp + +;------------------------------------------- +; call of the purchase screens for each tank +CallPurchaseForEveryTank + mva #$2 colpf2s ; set normal color + mwa #PurchaseDL dlptrs + lda dmactls + and #$fc + ora #$02 ; normal screen width + sta dmactls + + mva #0 TankNr +loop03 + ldx TankNr + lda SkillTable,x + beq ManualPurchase + jsr PurchaseAI + jmp AfterManualPurchase + +ManualPurchase + jsr Purchase +AfterManualPurchase + + inc TankNr + lda TankNr + cmp NumberOfPlayers + bne loop03 + rts + +;-------------------------------------------------- +Purchase ; +;-------------------------------------------------- +; In tanknr there is a number of the tank (player) +; that is buying weapons now (from 0). +; Rest of the data is taken from appropriate tables +; and during the purchase these tables are modified. + + + mwa #ListOfWeapons WeaponsListDL ;switch to the list of offensive weapons + jsr PMoutofScreen + +; we are clearing list of the weapons + mva #$ff LastWeapon + mva #$00 WhichList + ; offensive weapon - 0, deffensive - 1 + + ; there is a tank (player) number in tanknr + ; we are displaying name of the player + + tay ; from 0 to y + lda tanknr + asl + asl + asl ; 8 chars per name + tax +NextChar03 + lda tanksnames,x + sta textbuffer2+8,y + inx + iny + cpy #$08 + bne NextChar03 + ; and we display cash of the given player + +; here we must jump in after each purchase +; to generate again list of available weapons +AfterPurchase + ldx tanknr + lda moneyL,x + sta decimal + lda moneyH,x + sta decimal+1 + mwa #textbuffer2+29 displayposition + jsr displaydec + + ; in xbyte there is the address of the line that + ; is being processed now + mwa #ListOfWeapons xbyte + ldx #$00 ; number of the checked weapon + stx HowManyOnTheList1 ; amounts of weapons (shells, bullets) in both lists + stx HowManyOnTheList2 + stx PositionOnTheList + +; Creating full list of the available weapons for displaying +; in X there is a number of the weapon to be checked, +; in 'Xbyte' address of the first char in filled screen line + +CreateList + ; checking if the weapon of the given number is present + lda WeaponUnits,x + jeq NoWeapon + ; checking if we can afford buying this weapon + ldy tanknr + lda moneyH,y + cmp WeaponPriceH,x + bne CheckWeapon01 + lda moneyL,y + cmp WeaponPriceL,x +CheckWeapon01 + jcc TooLittleCash + + ; we have enough cash and the weapon can be + ; added to the list + stx temp ; number of weapon will be necessary later + + ; first parentheses and other special chars + ; (it's easier this way) + ldy #22 + lda #08 ; "(" + STA (XBYTE),y + ldy #32 + lda #09 ; ")" + sta (xbyte),y + ldy #25 + lda #15 ; "/" + sta (xbyte),y + iny + lda #04 ; "$" + sta (xbyte),y + ldy #31 + lda #16 ; "0" + sta (xbyte),y + + ; now symbol of the weapon + lda WeaponSymbols,x + ldy #$4 ; 4 chars from the beginning of the line + sta (xbyte),y + + ;now number of purchased units (bullets) + clc + lda xbyte + adc #23 ; 23 chars from the beginning of the line + sta displayposition + lda xbyte+1 + adc #$00 + sta displayposition+1 + lda WeaponUnits,x + sta decimal + jsr displaybyte + ldx temp ;getting back number of the weapon + + ; and now price of the weapon + clc + lda xbyte + adc #27 ; 27 chars from the beginning of the line + sta displayposition + lda xbyte+1 + adc #$00 + sta displayposition+1 + lda WeaponPriceL,x + sta decimal + lda WeaponPriceH,x + sta decimal+1 + jsr displaydec + + lda temp ;getting back number of the weapon + pha ;and saving it on the stack + + jsr HowManyBullets + sta decimal + + pla + sta temp ; let's store weapon number again + + clc + lda xbyte + adc #1 ; 1 char from the beginning of the screen + sta displayposition + lda xbyte+1 + adc #$00 + sta displayposition+1 + jsr displaybyte + + ; and now name of the weapon and finisheeeedd !!!! + ldx temp ;weapon number + mva #0 temp+1 ; this number is only in X + ; times 16 (it's length of the names of weapons) + ldy #3 ; Rotate 4 times +Rotate02 + asl temp + rol temp+1 + dey + bpl Rotate02 + ; Hmmm..... Interesting why there is no CLC here? + + adw temp #NamesOfWeapons modify + sbw modify #6 ; from 6th char + + ldy #6 ; from 6th char + +modyf1 + lda (modify),y + sta (xbyte),y + iny + cpy #(16+6) + bne modyf1 + + + ; in X there is what we need + + ; If on screen after the purchase there is still + ; present the weapon purchased recently, + ; the pointer must point to it. + + cpx LastWeapon + bne NotTheSameAsLastTime + lda WhichList + bne ominx06 + lda HowManyOnTheList1 + sta PositionOnTheList + jmp NotTheSameAsLastTime +ominx06 + lda HowManyOnTheList2 + sta PositionOnTheList +NotTheSameAsLastTime + ; increase appropriate counter + txa + cpx #$30 + bcs SecondList + ldy HowManyOnTheList1 + sta NubersOfWeaponsL1,y + inc HowManyOnTheList1 + bne NextLineOfTheList +SecondList + ldy HowManyOnTheList2 + sta NubersOfWeaponsL2,y + inc HowManyOnTheList2 + ; If everything is copied then next line +NextLineOfTheList + clc + lda xbyte + adc #40 + sta xbyte + bcc TooLittleCash + inc xbyte+1 +TooLittleCash +NoWeapon + + ; next weapon. If no more weapons then finish! + inx + cpx #$30 + bne NoDefense + +; if we got to the defense weapons, +; we switch address to the second table. + mwa #ListOfDefensiveWeapons xbyte +NoDefense + cpx #$40 + jne CreateList + + ; offset may be only too big + ; (because after purchase list will never be longer) + ; check it and modify if necessary. + ; If offset is larger than position of the pointer, + ; it must be equal. + lda PositionOnTheList + cmp OffsetDL1 + bcs WeHaveOffset ; do not modify offset + sta OffsetDL1 +WeHaveOffset + + ; now we have to erase empty position of both lists. + + ; Multiply number on list 1 by 40 and set address + ; of the first erased char. + ; (multiplying taken from book of Ruszczyc 'Assembler 6502' + + lda HowManyOnTheList1 + sta xbyte+1 ; multiplier (temporarily here, it will be erased anyway) + lda #$00 ; higher byte of the Result + sta xbyte ; lower byte of the Result + ldx #$08 +Rotate04 + lsr xbyte+1 + bcc DoNotAddX01 + clc + adc #40 +DoNotAddX01 + ror + ror xbyte + dex + bne Rotate04 + sta xbyte+1 + + ; add to the address of the list + clc + lda xbyte + adc #ListOfWeapons + sta xbyte+1 + stx xbyte + txa ; now there is zero here +ClearList1 + sta (xbyte),y + iny + bne DoNotIncHigher1 + inc xbyte+1 +DoNotIncHigher1 + cpy #ListOfWeapons1End + bne ClearList1 + + ; And the same we do with the second list + + ; Multiply number on list 1 by 40 and set address + ; of the first erased char. + lda HowManyOnTheList2 + sta xbyte+1 ; multiplier + lda #$00 ; higher byte of the Result + sta xbyte ; lower byte of the Result + ldx #$08 +Rotate05 + lsr xbyte+1 + bcc DoNotAddX02 + clc + adc #40 +DoNotAddX02 + ror + ror xbyte + dex + bne Rotate05 + sta xbyte+1 + + ; add to the address of the list + clc + lda xbyte + adc #ListOfDefensiveWeapons + sta xbyte+1 + stx xbyte + txa ; now there is zero here +ClearList2 + sta (xbyte),y + iny + bne DoNotIncHigher2 + inc xbyte+1 +DoNotIncHigher2 + cpy #ListOfDefensiveWeaponsEnd + bne ClearList2 + +; here we have pretty cool lists and there is no brute force +; screen clearing at each list refresh +; (it was very ugly - I checked it :) + + +; Here we have all we need +; So choose the weapon for purchase ...... +;-------------------------------------------------- +ChoosingItemForPurchase +;-------------------------------------------------- + jsr PutLitteChar ; Places pointer at the right position + jsr getkey + cmp #$2c ; Tab + jeq ListChange + cmp #$0c ; Return + beq EndOfPurchase + cmp #$e + beq PurchaseKeyUp + cmp #$f + beq PurchaseKeyDown + cmp #$21 ; Space + bne ChoosingItemForPurchase + jmp PurchaseWeaponNow +EndOfPurchase + rts +PurchaseKeyUp + lda WhichList + beq GoUp1 + dec PositionOnTheList + bpl EndUpX + lda #$00 + sta PositionOnTheList + jmp ChoosingItemForPurchase +GoUp1 + dec PositionOnTheList + bpl MakeOffsetUp + lda #$00 + sta PositionOnTheList + +MakeOffsetUp + ; If offset is larger than pointer position, + ; it must be equal then. + lda PositionOnTheList + cmp OffsetDL1 + bcs EndUpX ; do not modify the offset + sta OffsetDL1 +EndUpX + jmp ChoosingItemForPurchase +PurchaseKeyDown + lda WhichList + beq GoDown1 + inc PositionOnTheList + lda PositionOnTheList + cmp HowManyOnTheList2 + bne EndGoDownX + ldy HowManyOnTheList2 + dey + sty PositionOnTheList + jmp ChoosingItemForPurchase +GoDown1 + inc PositionOnTheList + lda PositionOnTheList + cmp HowManyOnTheList1 + bne MakeOffsetDown + ldy HowManyOnTheList1 + dey + sty PositionOnTheList +MakeOffsetDown + lda OffsetDL1 + clc + adc #15 + ;if offset+16 is lower than the position then it must =16 + cmp PositionOnTheList + bcs EndGoDownX + sec + lda PositionOnTheList + sbc #15 + sta OffsetDL1 +EndGoDownX + jmp ChoosingItemForPurchase + +; swapping the displayed list and setting pointer to position 0 +ListChange + lda WhichList + eor #$01 + sta WhichList + bne SecondSelected + mwa #ListOfWeapons WeaponsListDL + jmp dalejx01 +SecondSelected + mwa #ListOfDefensiveWeapons WeaponsListDL +dalejx01 + lda #$00 + sta PositionOnTheList + sta OffsetDL1 + jmp ChoosingItemForPurchase + +; weapon purchase routne increases number of possessed bullets +; decreases cash and jumps to screen refresh +;-------------------------------------------------- +PurchaseWeaponNow +;-------------------------------------------------- + lda WhichList + bne PurchaseDeffensive + + ; here we purchase the offensive weapon + ldy PositionOnTheList + lda NubersOfWeaponsL1,y + jmp PurchaseAll +PurchaseDeffensive + ldy PositionOnTheList + lda NubersOfWeaponsL2,y +PurchaseAll + ; after getting weapon number the routine is common for all + ldx tanknr + tay ; weapon number is in Y + sec + lda moneyL,x ; substracting from posessed money + sbc WeaponPriceL,y ; of price of the given weapon + sta moneyL,x + lda moneyH,x + sbc WeaponPriceH,y + sta moneyH,x + ; now we have get address of + ; the table of the weapon of the tank + ; and add appropriate number of bullets + stx temp ;we will multiply by 64 + mva #0 temp+1 + ; times 64 + ; (because it is the lenght of one record in weapon table) + ldx #5 ; Rotate 6 times + ; (in Y there is a weapon number, we do not touch it!!!) +Rotate03 + asl temp + rol temp+1 + dex + bpl Rotate03 + lda #TanksWeapon1 + adc temp+1 + sta temp+1 + + lda (temp),y ; and we have number of posessed bullets of the weapon + adc WeaponUnits,y + sta (temp),y ; and we added appropriate number of bullets + cmp #100 ; but there should be no more than 99 bullets + bcc LessThan100 + lda #99 + sta (temp),y +LessThan100 + sty LastWeapon ; store last purchased weapon + ; because we must put screen pointer next to it + jmp AfterPurchase + + +PutLitteChar + ; first let's cleat both lists from little chars + mwa #ListOfWeapons xbyte + ldx #52 ; there are 52 lines total + ldy #$00 +EraseLoop + lda #$00 + sta (xbyte),y + clc + lda xbyte + adc #40 + sta xbyte + bcc ominx02 + inc xbyte+1 +ominx02 + dex + bpl EraseLoop + ; now let's check which list is active now + lda WhichList + beq CharToList1 + ; we are on the second list (deffensive) + ; so there is no problem with scrolling + mwa #ListOfDefensiveWeapons xbyte + ldx PositionOnTheList + beq SelectList2 ; if there is 0 we add nothing +AddLoop2 + clc + lda xbyte + adc #40 + sta xbyte + bcc ominx03 + inc xbyte+1 +ominx03 + dex + bne AddLoop2 +SelectList2 + lda #$7f ; little char (tab) - this is the pointer + sta (xbyte),y + ; now we clear flags of presence of list "out of screen" + ; unfortunately I am now sure what it means... :( + ldx #EmptyLine + stx MoreUpdl + sty MoreUpdl+1 + stx MoreDowndl + sty MoreDowndl+1 + rts +CharToList1 + ; we putchar on list 1 + ; and later set-up list itself + mwa #ListOfWeapons xbyte + ldx PositionOnTheList + beq SelectList1 ; if there is 0 we add nothing +AddLoop1 + clc + lda xbyte + adc #40 + sta xbyte + bcc ominx04 + inc xbyte+1 +ominx04 + dex + bne AddLoop1 +SelectList1 + lda #$7f ; pointer = little char = (tab) + sta (xbyte),y + ; now moving the window basing on given offset + mwa #ListOfWeapons xbyte + ldx OffsetDL1 + beq SetWindowList1 ; if zero then add nothing +LoopWindow1 + clc + lda xbyte + adc #40 + sta xbyte + bcc ominx05 + inc xbyte+1 +ominx05 + dex + bne LoopWindow1 +SetWindowList1 + mwa xbyte WeaponsListDL ; and we change Display List + + ; we show screen line with arrows meaning that + ; you can scroll the list up + ldx #EmptyLine + lda OffsetDL1 + beq NoArrowUp + ldx #MoreUp +NoArrowUp + stx MoreUpdl + sty MoreUpdl+1 + ; the same, bu scrolling down + lda HowManyOnTheList1 + ldx #EmptyLine + sec + sbc #17 + bmi NoArrowDown + cmp OffsetDL1 + bcc NoArrowDown + ldx #MoreDown +NoArrowDown + stx MoreDowndl + sty MoreDowndl+1 + rts + +; ----------------------------------------------------- +EnterPlayerName +; in: TankNr +; Out: TanksNames, SkillTable + +; this little thing is for choosing Player's skill (if computer) +; and entering his name +; If no name entered, there should be name "1st Tank", etc. +; Default tanks names are in table TanksNamesDefault +; ----------------------------------------------------- + + jsr PMoutofScreen + ; display tank number + ldx tanknr + inx + stx decimal + mwa #(NameScreen+41) displayposition + jsr displaybyte + jsr SelectLevel ; setting choosen level of the opponent (Moron, etc) + ; clear the name and place cursor at position 0 + lda #0 + sta PositionInName + ldx #$08 ; one more because cursor could be there +LoopName01 + sta NameAdr,x + dex + bne LoopName01 + lda #$80 ; place cursor on the beginning + sta NameAdr +CheckKeys + jsr getkey + ; is if the char to be recorded? + ldx #37 ; table is 38 chars long +IsLetter + cmp keycodes,x + beq YesLetter + dex + bpl IsLetter + bmi CheckFurtherX01 ; if not in the table + ; we check cursors and (Return) +YesLetter + lda scrcodes,x ; we have screen code of the char + ldx PositionInName + bne NotFirstLetter + and #$3f ; First letter should be Capital letter + ; (nice trick does not affect digits) +NotFirstLetter + sta NameAdr,x + inx + lda #$80 ; cursor behind the char + sta NameAdr,x + cpx #$08 ; is there 8 characters? + beq CheckKeys ; if so, nothing increased + stx PositionInName ; if not, we store + ; position incremented by 1 + + jmp CheckKeys +CheckFurtherX01 ; here we check Tab, Return and Del + cmp #$0c ; Return + beq EndOfNick + cmp #$2c ; Tab + beq ChangeOfLevelUp + cmp #$7 ;cursor right + beq ChangeOfLevelUp + cmp #$6 ;cursor left + beq ChangeOfLevelDown + cmp #$f ;cursor down + beq ChangeOfLevel3Up + + cmp #$34 ; Backspace (del) + bne CheckKeys + ; handling backing one char + ldx PositionInName + beq FirstChar + dex +FirstChar + lda #$80 + sta NameAdr,x + lda #$00 + sta NameAdr+1,x + sta NameAdr+2,x + stx PositionInName + jmp CheckKeys +ChangeOfLevelUp ; change difficulty level of computer opponent + inc:lda DifficultyLevel + cmp #9 ; 9 levels are possible + bne DoNotLoopLevelUp + mva #$0 DifficultyLevel +DoNotLoopLevelUp + jsr SelectLevel + jmp CheckKeys +;---- +ChangeOfLevelDown + dec:lda DifficultyLevel + bpl DoNotLoopLevelDown + mva #$8 DifficultyLevel +DoNotLoopLevelDown + jsr SelectLevel + jmp CheckKeys +;---- +ChangeOfLevel3Up + ;adw DifficultyLevel #3 + clc + lda DifficultyLevel + adc #3 + sta DifficultyLevel + + cmp #9 + bcc DoNotLoopLevel3Up + + sbw DifficultyLevel #9 + +DoNotLoopLevel3Up + jsr SelectLevel + jmp CheckKeys +;---- +EndOfNick + ; storing name of the player and its level + + ; level of the computer opponent goes to + ; the table of levels (difficulties) + ldx tanknr + lda DifficultyLevel + sta skilltable,x + ; storing name of the tank in the right space + ; (without cursor!) + ldy #$00 + txa ; ldx TankNr + asl + asl + asl ; 8 chars per name + tax ; in X where to put new name + + lda NameAdr ; check if first char is " " + and #$7F ; remove inverse (Cursor) + beq MakeDefaultName + +nextchar04 + lda NameAdr,y + and #$7f ; remove inverse (Cursor) + sta tanksnames,x + inx + iny + cpy #$08 + bne nextchar04 + rts +MakeDefaultName +nextchar05 + lda tanksnamesDefault,x + sta tanksnames,x + inx + iny + cpy #$08 + bne nextchar05 + rts + + + + +SelectLevel + ; this routine highlights the choosen + ; level of the computer opponent + ldx #$9 ; 9 possible levels +CheckNextLevel01 + lda LevelNameBeginL,x ; address on the screen + sta temp + lda LevelNameBeginH,x + sta temp+1 + ldy #9 ; flip 10 chars to inverse video + cpx DifficultyLevel ; is it the choosen level? + bne NotThisLevel + ; change to inverse, because it is it! +InverseFurther + lda (temp),y + ora #$80 + sta (temp),y + dey + bpl InverseFurther + bmi CheckNextLevel ; Check Next Level +NotThisLevel + lda (temp),y + and #$7f + sta (temp),y + dey + bpl NotThisLevel +CheckNextLevel + dex + bpl CheckNextLevel01 + rts +;-------------------------------------------------- +displaydec ;decimal (word), displayposition (word) +;-------------------------------------------------- +; displays decimal number as in parameters (in text mode) +; leading zeores are removed +; the range is (0000..9999 - two bytes) + + ldy #3 ; there will be 4 digits +NextDigit + ldx #16 ; 16-bit dividee so Rotate 16 times + lda #$00 +Rotate000 + aslw decimal + rol ; scroll dividee + ; (as highest byte - additional - byte is A) + cmp #10 ; divider + bcc TooLittle000 ; if A is smaller than divider + ; there is nothing to substract + sbc #10 ; divider + inc decimal ; lowest bit set to 1 + ; because it is 0 and this is the fastest way +TooLittle000 dex + bne Rotate000 ; and Rotate 16 times, Result will be in decimal + tax ; and the rest in A + ; (and it goes to X because + ; it is our decimal digit) + lda digits,x + sta decimalresult,y + dey + bpl NextDigit ; Result again /10 and we have next digit + + +rightnumber +; now cut leading zeroes (002 goes 2) + lda decimalresult + cmp zero + bne decimalend + lda space + sta decimalresult + + lda decimalresult+1 + cmp zero + bne decimalend + lda space + sta decimalresult+1 + + lda decimalresult+2 + cmp zero + bne DecimalEnd + lda space + sta decimalresult+2 + +DecimalEnd + ; displaying + mwa displayposition modify + ldy #3 +displayloop + lda decimalresult,y + sta (modify),y + dey + bpl displayloop + + rts + + +;-------------------------------------------------- +displaybyte ;decimal (byte), displayposition (word) +;-------------------------------------------------- +; displays decimal number as in parameters (in text mode) +; leading zeores are removed +; the range is (00..99 - one byte) + + ldy #1 ; there will be 2 digits +NextDigit2 + ldx #8 ; 8-bit dividee so Rotate 8 times + lda #$00 +Rotate001 + asl decimal + rol ; scroll dividee + ; (as highest byte - additional - byte is A) + cmp #10 ; divider + bcc TooLittle001 ; if A is smaller than divider + ; there is nothing to substract + sbc #10 ; divider + inc decimal ; because it is 0 and this is the fastest way +TooLittle001 dex + bne Rotate001 ; and Rotate 8 times, Result will be in decimal + tax ; and the rest in A + ; (and it goes to X because + ; it is our decimal digit) + lda digits,x + sta decimalresult,y + dey + bpl NextDigit2 ; Result again /10 and we have next digit + +; now cut leading zeroes (02 goes 2) + lda decimalresult + cmp zero + bne decimalend1 + lda space + sta decimalresult + +decimalend1 + ; displaying + mwa displayposition modify + ldy #1 +displayloop1 + lda decimalresult,y + sta (modify),y + dey + bpl displayloop1 + + rts +;-------decimal constans +digits dta d"0123456789" +zero dta d"0" +nineplus ;.sbyte ('9+1) + dta d"9"+1 +space dta d" " + +;-------------------------------------------------------- +DisplayOffensiveTextNr ; + ;This routine displays texts using PutChar4x4 + ;pretty cool, eh + ;parameters are: + ;Y - number of tank above which text is displayed + ;TextNumber - number of offensive text to display + + ;lets calculate position of the text first! + ;that's easy because we have number of tank + ;and xtankstableL and H keep X position of a given tank + + lda xtankstableL,y + sta temp + lda xtankstableH,y + sta temp+1 + ;now we should substract length of the text + ldx TextNumberOff + lda talk.OffensiveTextLengths,x + asl + sta temp2 + mva #0 temp2+1 + ;here we assume max length of text + ;to display is 127 chars! + + ;now we have HALF length in pixels + ;stored in temp2 + sbw temp temp2 ; here begin of the text is in TEMP !!!! + ;now we should check overflows + lda temp+1 + bpl DOTNnotLessThanZero + ;less than zero, so should be zero + mwa #0 temp + beq DOTNnoOverflow + +DOTNnotLessThanZero + ;so check if end larger than screenwidth + + + lda talk.OffensiveTextLengths,x + asl + asl + ;length in pixels - + ;text length max 63 chars !!!!!!!! + + + clc + adc temp + sta temp2 + lda #0 + adc temp+1 + sta temp2+1 + ;now in temp2 is end of the text in pixels + ;so check if not greater than screenwitdth + cpw temp2 #screenwidth + bcc DOTNnoOverflow + ;if end is greater than screenwidth + ;then screenwidth - length is fine + + + lda talk.OffensiveTextLengths,x + asl + asl + sta temp + + sec + lda #<(screenwidth-1) + sbc temp + sta temp + lda #>(screenwidth-1) + sbc temp+1 + sta temp+1 +DOTNnoOverflow + ;here in temp we have really good x position of text + + mwa temp TextPositionX + + ;now let's get y position + ;we will try to put text as low as possible + ;just above mountains (so mountaintable will be checked) + lda talk.OffensiveTextLengths,x + asl + asl + tay + ;in temp there still is X position of text + ;if we add temp and Y we will get end of the text + ;so, lets go through mountaintable and look for + ;the lowest value within + ;Mountaitable+temp and Mountaitable+temp+Y + + adw temp #MountainTable + + mva #screenheight temp2 ;initialisation of the lowest value + +DOTLowestMountainValueLoop + lda (temp),y + cmp temp2 + bcs DOTOldLowestValue ;old lowest value + ;new lowest value + sta temp2 +DOTOldLowestValue + dey + cpy #$ff + bne DOTLowestMountainValueLoop + + + + sec + lda temp2 + sbc #(4+9) ;9 pixels above ground (and tanks...) + sta TextPositionY + + + lda talk.OffensiveTextTableL,x + sta TextAddress + lda talk.OffensiveTextTableH,x + sta TextAddress+1 + mva #0 TextCounter +DOTNcharloop + mwa TextAddress temp + ldy TextCounter + + lda (temp),y + SEC + sbc #32 ;conversion from ASCII to .sbyte + + sta CharCode4x4 + lda TextCounter + asl + asl + clc + adc TextPositionX + sta Xdraw + lda #0 + adc TextPositionX+1 + sta Xdraw+1 + lda TextPositionY + sta ydraw + jsr PutChar4x4 + + inc TextCounter + ldx TextNumberOff + lda talk.OffensiveTextLengths,x + cmp TextCounter + bne DOTNcharloop + + rts + +;------------------------------- +TypeLine4x4 ; +;------------------------------- + ;this routine prints line ending with $ff + ;address in LineAddress4x4 + ;starting from LineXdraw, LineYdraw + + ldy #0 + sty LineCharNr + + +TypeLine4x4Loop + ldy LineCharNr + + + mwa LineAddress4x4 temp + lda (temp),y + cmp #$ff + beq EndOfTypeLine4x4 + + sta CharCode4x4 + mwa LineXdraw Xdraw + mva LineYdraw Ydraw + jsr PutChar4x4FULL ;type empty pixels as well! + adw LineXdraw #4 + inc LineCharNr + jmp TypeLine4x4Loop + +EndOfTypeLine4x4 + rts + +;-------------------------------- +DisplayResults ; +;displays results of the round +;using 4x4 font + + ;centering the result screen + mwa #((ScreenWidth/2)-(7*4)) ResultX + mva #((ScreenHeight/2)-(8*4)) ResultY + + + ;upper frame + mwa #LineTop LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + adw ResultY #4 ;next line + + ;Header1 + ;Displays round number + lda CurrentRoundNr + sta decimal + mwa #RoundNrDisplay displayposition + jsr displaybyte ;decimal (byte), displayposition (word) + + mwa #LineHeader1 LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + adw ResultY #4 ;next line + + ;Empty line + mwa #LineEmpty LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + adw ResultY #2 ;next line + + + ;Header2 + mwa #LineHeader2 LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + adw ResultY #4 ;next line + + ;Empty line + mwa #LineEmpty LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + sbw ResultY #2 ;next line (was empty) + + ldx NumberOfPlayers ;we start from the highest (best) tank + dex ;and it is the last one + stx ResultOfTankNr ;in TankSequence table + + mwa #TanksNames tempXROLLER + +ResultOfTheNextPlayer + ldx ResultOfTankNr ;we are after a round, so we can use TankNr + lda TankSequence,x ;and we keep here real number if the tank + sta TankNr ;for which we are displaying results + + + + + adw ResultY #4 ;next line + + ;there are at least 2 players, so we can safely + ;start displaying the result + + ldx #0 + lda #3 ;it means | + sta ResultLineBuffer,x + + + lda TankNr + asl + asl ; times 8, because it is lengtgh + asl ; of the names of the tanks + tay + +TankNameCopyLoop + lda (tempXROLLER),y ;XROLLER is not working now + and #$3f ;always CAPITAL letters + inx + sta ResultLineBuffer,x + iny + cpx #8 ; end of name + bne TankNameCopyLoop + + inx + lda #26 ;it means ":" + sta ResultLineBuffer,x + + ldy TankNr + lda ResultsTable,y + sta decimal + mwa #(ResultLineBuffer+10) displayposition + jsr displaybyte ;decimal (byte), displayposition (word) + + ldx #12 ;justafter the digits + lda #3 ;it means | + sta ResultLineBuffer,x + + inx + lda #$ff ;it means end of line + sta ResultLineBuffer,x + + + + ;result line display + mwa #ResultLineBuffer LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + adw ResultY #4 ;next line + + ;Empty line + mwa #LineEmpty LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + + + + dec ResultOfTankNr + + bmi FinishResultDisplay + + sbw ResultY #2 ;distance between lines is smaller + + jmp ResultOfTheNextPlayer + +FinishResultDisplay + + ;bottom of the frame + mwa #LineBottom LineAddress4x4 + mwa ResultX LineXdraw + mva ResultY LineYdraw + mva #1 plot4x4color + jsr TypeLine4x4 + rts + + +;------------------------------------------------- +DisplayingSymbols +;------------------------------------------------- + + ;--------------------- + ;displaying symbol of the weapon + ;--------------------- + ;display name and symbol of the weapon + ;textbuffer+18 - symbol (1 char) + ;textbuffer+20 - quantity left + ;textbuffer+23 - name + + + + ;ldx TankNr + ldy ActiveWeapon,x + lda WeaponSymbols,y + sta TextBuffer+18 + + ;--------------------- + ;displaying the energy of a tank + ;--------------------- + + lda Energy,x + + sta decimal + mwa #textbuffer+40 displayposition + jsr displaybyte + ;--------------------- + ;displaying quantity of the given weapon + ;--------------------- + ldx TankNr + lda ActiveWeapon,x + jsr HowManyBullets + sta decimal + mwa #textbuffer+20 displayposition + jsr displaybyte + + ;--------------------- + ;displaying name of the weapon + ;--------------------- + ldx TankNr + lda ActiveWeapon,x + sta temp ;get back number of the weapon + mva #0 temp+1 + ; times 16 (because this is length of weapon name) + ldy #3 ; rotate 4 times +RotateDISP02 + aslw temp + dey + bpl RotateDISP02 + adw temp #NamesOfWeapons + ldy #6 ; from 6th character + + ldy #15 +loop06 + lda (temp),y + sta textbuffer+23,y + dey + bpl loop06 + + ;========================= + ;display Force + ;========================= + ldx TankNr + lda EnergyTableL,x + sta decimal + lda EnergyTableH,x + sta decimal+1 + mwa #textbuffer+63 displayposition + jsr displaydec + + ;========================= + ;display Angle + ;========================= + ; additionally we are getting charcode of the tank + ; (for future display) + ldx TankNr + lda AngleTable,x + bmi AngleToLeft + lda #$7f ; (tab) character + sta textbuffer+52 + lda #0 ;space + sta textbuffer+49 + lda #90 + sec + sbc AngleTable,x + sta decimal + tay + lda BarrelTableR,y + sta CharCode + jmp AngleDisplay ;like jp, because code always <>0 +AngleToLeft + sec + sbc #(255-90) + sta decimal + tay + lda BarrelTableL,y + sta CharCode + lda #$7e ;(del) char + sta textbuffer+49 + lda #0 ;space + sta textbuffer+52 + +AngleDisplay + mwa #textbuffer+50 displayposition + jsr displaybyte + + + ;========================= + ;display Wind + ;========================= + lda WindOrientation + bne DisplayLeftWind + lda #$7f ; (tab) char + sta textbuffer+79 + lda #0 ;space + sta textbuffer+76 + beq DisplayWindValue +DisplayLeftWind + lda #$7e ;(del) char + sta textbuffer+76 + lda #0 ;space + sta textbuffer+79 +DisplayWindValue + mwa Wind temp + lsrw temp ;divide by 16 to have + lsrw temp ;a nice view on a screen + lsrw temp + lsrw temp + lda temp + sta decimal + mwa #textbuffer+77 displayposition + jsr displaybyte + rts +;------------------------------------------------- +PutTankNameOnScreen +; puts name of the tan on the screen + ldy #$00 + lda tanknr + asl + asl + asl ; 8 chars per name + tax +NextChar02 + lda tanksnames,x + sta textbuffer+7,y + inx + iny + cpy #$08 + bne NextChar02 + rts +;------------------------------------------------- + +.endif \ No newline at end of file diff --git a/variables.asm b/variables.asm new file mode 100644 index 0000000..4e72ecc --- /dev/null +++ b/variables.asm @@ -0,0 +1,898 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm + + .IF *>0 ;this is a trick that prevents compiling this file alone + +;===================================================== +; most important non-zero page variables +; zero page variables are declared in program.s65 module +;===================================================== +NumberOfPlayers .byte 0 ;current number of players (counted from 1) +TankSequence :MaxPlayers .by 0 ;sequence of shooting during the Round +;----------------------------------- +skilltable ; computer controlled players' skills (1-8), 0 - human + :MaxPlayers .by 0 +;----------------------------------- +moneyH ;we place zero at the end of prices and money + ;and have range from 0 to 99990 (not too much) + ;money players have (maybe one more byte is needed?) + :MaxPlayers .by 0 +moneyL + :MaxPlayers .by 0 +;----------------------------------- +gainH ;how much money player gets after the round + ;it is gathered during the round basing on energy + ;opponents loose after player's shoots + :MaxPlayers .by 0 +gainL + :MaxPlayers .by 0 +;----------------------------------- +looseH ;how much player looses after the round + ;calculated from REAL energy loss + ;(not only to zero energy) + :MaxPlayers .by 0 +looseL + :MaxPlayers .by 0 +;----------------------------------- +Energy + :MaxPlayers .by 0 +EnergyDecrease .by 0 +eXistenZ + :MaxPlayers .by 0 +LASTeXistenZ ; eXistenZ before shoot + :MaxPlayers .by 0 + +ResultsTable ;the results in the gameeeeee + :MaxPlayers .by 0 +TempResults + :MaxPlayers .by 0 +CurrentResult + .byte 0 +;----------------------------------- +EnergyTableL ;shooting Force of the tank during the round + :MaxPlayers .by 0 +EnergyTableH + :MaxPlayers .by 0 ;maxplayers=6 +MaxEnergyTableL ;Energy of the tank during the round + ;(limes superior force of the Shoot) + :MaxPlayers .by 0 ;1000 is the default +MaxEnergyTableH + :MaxPlayers .by 0 +;----------------------------------- + +AngleTable ;Angle of the barrel of each tank during the round + .by (255-90),(255-90),(255-90),(255-90),(255-90),(255-90) +NewAngle + .by 0 +;----------------------------------- + +ActiveWeapon ;number of the selected weapon + :MaxPlayers .by 0 +;----------------------------------- + +;format of the static point number used in the game +; 20203.5 = 128 : <20203 : >20203 +;----------------------------------- + +L1 .by 0 ; variable used in multiplications (by 10:) +gravity .by 25 ;only the decimal part (1/10 = 25) +;----------------------------------- + +Wind .wo $0080 ;walue displayed on the screen + ;multiplied by 16 (decimal part only) +;----------------------------------- +MaxWind .byte $40 ; +WindOrientation .byte 0 ;(0-right,1-left) +;----------------------------------- +Counter .byte 0 ;temporary Counter for outside loops +HitFlag .byte 0 ;1 when missile hit anything +;----------------------------------- +xtankstableL ;X positions of tanks (lower left point) + :MaxPlayers .by 0 +xtankstableH + :MaxPlayers .by 0 +ytankstable ;Y positions of tanks (lower left point) + :MaxPlayers .by 0 +LowResDistances ; coarse stank positions divided by 4 (to be in just one byte) + :MaxPlayers .by 0 +;----------------------------------- +keycodes ;tables for calculating KeyCode to Screen Code (38 characters) + .byte $3f,$15,$12,$3a,$2a,$38,$3d,$39 + .byte $0d,$01,$05,$00,$25,$23,$08,$0a + .byte $2f,$28,$3e,$2d,$0b,$10,$2e,$16 + .byte $2b,$17,$1f,$1e,$1a,$18,$1d,$1b + .byte $33,$35,$30,$32,$22,$0e +scrcodes + dta d"abcdefgh" + dta d"ijklmnop" + dta d"qrstuvwx" + dta d"yz123456" + dta d"7890.-" +;----------------------------------- +Erase .byte 0 ; if 1 only mask of the character is printed + ; on the graphics screen. if 0 character is printed normally + +;----------------------------------- +RangeLeft .wo 0 ;range of the soil to be fallen down + ;it is being set by all Explosions +RangeRight .wo 0 +;----------------------------------- +WeaponRangeLeft .wo 0 ;Range of the Explosion of the given weapon +WeaponRangeRight .wo 0 +;-------------------------------------------------- +;-------------------------------------------------- +;Variables used by the given subroutines +;moved to one place for easier +;compilation to e.g. cartridge +;-------------------------------------------------- +;xroller +HowMuchToFall .byte $FF +HeightRol .byte 0 +;digger +digstartx .word 0 +digstarty .word 0 +diggery .byte 0 +DigLong .byte 0 +digtabxL :8 .by 0 +digtabxH :8 .by 0 +digtabyL :8 .by 0 +digtabyH :8 .by 0 +;sandhog +sandhogflag .byte 0 ; (0 digger, 8 sandhog) +;ofdirt +magic .word 0 ; was tempor2, but it was not compiling!!! (bug in OMC65) +;draw +DrawJumpAddr .word 0 +HowToDraw .byte 0 + ; bits here mean + ; 0 - negative X (go up) + ; 1 - negative Y (left) + ; 2 - directional value > 1 (more than 45 degrees) + ; if all 0 then standart routine +XHit .word 0 +YHit .word 0 +LineLength .word 0 +;circle +radius .byte 0 +xcircle .word 0 +ycircle .byte 0 +tempcir .word 0 +;TankFalls +IfFallDown .byte 0 +PreviousFall .byte 0 +EndOfTheFallFlag .byte 0 ; in case of the infinite fall +Parachute .byte 0 ; are you insured with parachute? +; ------------------------------------------------- +;Flight +;variables for 5 missiles (used for mirv) +xtraj00 :5 .by 0 +xtraj01 :5 .by 0 +xtraj02 :5 .by 0 +vx00 :5 .by 0 +vx01 :5 .by 0 +vx02 :5 .by 0 +vx03 :5 .by 0 +MirvDown :5 .by 0 ; is given missile down? +MirvMissileCounter .byte 0 ; missile Counter (mainly for X) +SmokeTracerFlag .byte 0 ; if Smoketracer +; ------------------------------------------------- +;CheckCollisionWithTank +vx .byte 0,0,0,0 ;two decimal bytes, two whole bytes (DC.BA) +vy .byte 0,0,0,0 +xtraj .byte 0,0,0 +ytraj .byte 0,0,0 +xtrajold .byte 0,0,0 +ytrajold .byte 0,0,0 +Angle .byte 0 +Force .byte 0,0,0 +Multiplier .byte 0,0,0 +Multiplee .byte 0,0 +Result .byte 0,0,0 +goleft .byte 0 ;if 1 then flights left +;-------------------------------------------------- +;SoilDown2 +IsEndOfTheFallFlag .byte 0 +; ------------------------------------------------- +;unPlot +WhichUnPlot .byte 0 + ; max 5 concurrent unPlots +oldplotH :5 .by 0 +oldplotL :5 .by 0 +oldora :5 .by 0 +oldply :5 .by 0 +OldOraTemp .byte 0 +FunkyBombCounter .byte 0 +xtrajfb .word 0 +ytrajfb .word 0 +; +tracerflag .byte 0 +; ------------------------------------------------- +;TypeChar +mask1 :8 .by 0 +mask2 :8 .by 0 + +char1 :8 .by 0 +char2 :8 .by 0 +color .byte 1 +ybit .byte 0 +tempbyte01 .byte 0 +delta .word 0 +yfloat .word 0 +deltaX .byte 0 +UpNdown .byte 0 + + +temptankX .word 0 +temptankNr .byte 0 + +; ------------------------------------------------- +;Variables from textproc.s65 + ; tables with numbers of weapons on the right lists + ; to be honest - I do not know at the moment what the above + ; comment was supposed to mean... +NubersOfWeaponsL1 + :(8*5) .by $ff +NubersOfWeaponsL2 + :(8*2) .by $ff +; ------------------------------------------------- + +; variables storing amount of weapons on the first and second +; list and pointer position + +HowManyOnTheList1 + .byte 0 +HowManyOnTheList2 + .byte 0 +PositionOnTheList ; pointer position on the list being displayed + .byte 0 +LastWeapon ; number of the last previously purchased weapon + ; it is necessary when after purchase some weapon + ; is removed from the list (because too expensive) + ; and the cursor must be placed elsewhere + + .byte $ff +WhichList ; list currently on the screen + ; (0-offensive, 1-defensive) + .byte 0 +OffsetDL1 ; offset of the list screen (how many lines).... + .byte 0 + +; ------------------------------------------------- +;Options +OptionsTable .byte 0,0,2,2 +OptionsY .byte 0 ;vertical position of cursor on Options screen +maxoptions = 4 ;number of all options (4 in 0.01) +CashOptionH ;(one zero less than on the screen) + .byte 0,>200,>500,>800,>1000 +CashOptionL + .byte 0,<200,<500,<800,<1000 +GravityTable .byte 10,20,25,30,40 +MaxWindTable .byte 5,20,40,60,80 +;------------------------------------------------ + +;mark the level +PositionInName ; cursor position in name of the player when name input + .byte 0 +DifficultyLevel ; Difficulty Level (human/cpu) + .byte 0 +LevelNameBeginL ; begins of level names + .byte NamesOfLevels,>(NamesOfLevels+10),>(NamesOfLevels+20) + .byte >(NamesOfLevels+32),>(NamesOfLevels+42),>(NamesOfLevels+52) + .byte >(NamesOfLevels+64),>(NamesOfLevels+74),>(NamesOfLevels+84) +;------------------------------------------------- +;displaydecimal +decimal .word 0 +displayposition .word 0 +decimalresult dta d"0000" + +;xmissile +ExplosionRadius .word 0 ;because when adding in xdraw it is double byte +;round +CurrentRoundNr .byte 0 +FallDown1 .byte 0 +FallDown2 .byte 0 +;leapfrog +LeapFrogAngle .byte 0 +;laser +LaserCoordinate .word 0,0,0,0 +TanksNames + dta d"1st Tank" + dta d"2nd Tank" + dta d"3rd Tank" + dta d"4th Tank" + dta d"5th Tank" + dta d"6th Tank" +; ------------------------------------------------- +; Here go tables with weapons possesed by a given tank +; Index in the table means weapon type +; number entered means ammo for given weapon possessed (max 99) +; Let 0 be "baby missile" +; from $30 the defensive weapons begin +TanksWeapons +TanksWeapon1 + .by 99 + :63 .by 0 +TanksWeapon2 + .by 99 + :63 .by 0 +TanksWeapon3 + .by 99 + :63 .by 0 +TanksWeapon4 + .by 99 + :63 .by 0 +TanksWeapon5 + .by 99 + :63 .by 0 +TanksWeapon6 + .by 99 + :63 .by 0 +TanksWeaponsTableL + .by TanksWeapon1,>TanksWeapon2,>TanksWeapon3,>TanksWeapon4,>TanksWeapon5,>TanksWeapon6 + +mountaintable ;table of mountains (size=screenwidth) + :screenwidth .by 0 + .by 0 ; additional byte for fallout (sometimes 1 pixel) +mountaintable2 ;table of mountains (size=screenwidth) + :screenwidth .by 0 + .by 0 ; additional byte for fallout (sometimes 1 pixel) +mountaintable3 + :screenwidth .by 0 + .by 0 ; additional byte for fallout (sometimes 1 pixel) +MountaintableEnd ;good for table clearing +;---------------------------------------------- +TextPositionX .word 0 +TextPositionY .byte 0 +TextAddress .word 0 +TextCounter .byte 0 +TextNumberOff .byte 0 +;-------------- +TankTempY + .byte 0 +;---------------------------------------------- +LineAddress4x4 + .word 0 +LineCharNr + .byte 0 +LineXdraw + .word 0 +LineYdraw + .byte 0 +LineTop + dta d"(%%%%%%%%%%%)" + .byte $ff +;# - pion, () * +, % - poziom +LineBottom + dta d"*%%%%%%%%%%%+" + .byte $ff +LineEmpty + dta d"# #" + .byte $ff +LineHeader1 + dta d"# ROUND: " +RoundNrDisplay + dta d" #" + .byte $ff +LineHeader2 + dta d"# RESULTS #" + .byte $ff + + + +;----------- +ResultLineBuffer + dta d" " + .byte $ff +ResultX + .word 0 +ResultY + .byte 0 +ResultOfTankNr + .byte 0 + +;----------- +pmtableL ; addressess of the P/M memory for 5 tanks (6th is without P/M background) + .byte <(pmgraph+$400) + .byte <(pmgraph+$500) + .byte <(pmgraph+$600) + .byte <(pmgraph+$700) + .byte <(pmgraph+$300) ; this is a missile background +pmtableH + .byte >(pmgraph+$400) + .byte >(pmgraph+$500) + .byte >(pmgraph+$600) + .byte >(pmgraph+$700) + .byte >(pmgraph+$300) +;----------- +; this table changes Angle to the appropriate tank character +BarrelTableL + .byte $02,$02,$02,$02,$02,$02,$02,$02 + .byte $04,$04,$04,$04,$04,$04,$04,$04 + .byte $06,$06,$06,$06,$06,$06,$06,$06,$06 + .byte $08,$08,$08,$08,$08,$08,$08,$08 + .byte $0a,$0a,$0a,$0a,$0a,$0a,$0a,$0a + .byte $0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c,$0c + .byte $0e,$0e,$0e,$0e,$0e,$0e,$0e,$0e + .byte $10,$10,$10,$10,$10,$10,$10,$10 + .byte $12,$12,$12,$12,$12,$12,$12,$12,$12 + .byte $14,$14,$14,$14,$14,$14,$14,$14 + .byte $16,$16,$16,$16,$16,$16,$16,$16 +BarrelTableR + .byte $2c,$2c,$2c,$2c,$2c,$2c,$2c,$2c + .byte $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a + .byte $28,$28,$28,$28,$28,$28,$28,$28,$28 + .byte $26,$26,$26,$26,$26,$26,$26,$26 + .byte $24,$24,$24,$24,$24,$24,$24,$24 + .byte $22,$22,$22,$22,$22,$22,$22,$22,$22 + .byte $20,$20,$20,$20,$20,$20,$20,$20 + .byte $1e,$1e,$1e,$1e,$1e,$1e,$1e,$1e + .byte $1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c,$1c + .byte $1a,$1a,$1a,$1a,$1a,$1a,$1a,$1a + .byte $18,$18,$18,$18,$18,$18,$18,$18 + +sintable + .byte 0 + .byte 4 + .byte 8 + .byte 13 + .byte 17 + .byte 22 + .byte 26 + .byte 31 + .byte 35 + .byte 40 + .byte 44 + .byte 48 + .byte 53 + .byte 57 + .byte 61 + .byte 66 + .byte 70 + .byte 74 + .byte 79 + .byte 83 + .byte 87 + .byte 91 + .byte 95 + .byte 100 + .byte 104 + .byte 108 + .byte 112 + .byte 116 + .byte 120 + .byte 124 + .byte 128 + .byte 131 + .byte 135 + .byte 139 + .byte 143 + .byte 146 + .byte 150 + .byte 154 + .byte 157 + .byte 161 + .byte 164 + .byte 167 + .byte 171 + .byte 174 + .byte 177 + .byte 181 + .byte 184 + .byte 187 + .byte 190 + .byte 193 + .byte 196 + .byte 198 + .byte 201 + .byte 204 + .byte 207 + .byte 209 + .byte 212 + .byte 214 + .byte 217 + .byte 219 + .byte 221 + .byte 223 + .byte 226 + .byte 228 + .byte 230 + .byte 232 + .byte 233 + .byte 235 + .byte 237 + .byte 238 + .byte 240 + .byte 242 + .byte 243 + .byte 244 + .byte 246 + .byte 247 + .byte 248 + .byte 249 + .byte 250 + .byte 251 + .byte 252 + .byte 252 + .byte 253 + .byte 254 + .byte 254 + .byte 255 + .byte 255 + .byte 255 + .byte 255 + .byte 255 + .byte 255 ;anti self destruction byte + +costable + .byte 255 ;anti self destruction byte + .byte 255 + .byte 255 + .byte 255 + .byte 255 + .byte 255 + .byte 254 + .byte 254 + .byte 253 + .byte 252 + .byte 252 + .byte 251 + .byte 250 + .byte 249 + .byte 248 + .byte 247 + .byte 246 + .byte 244 + .byte 243 + .byte 242 + .byte 240 + .byte 238 + .byte 237 + .byte 235 + .byte 233 + .byte 232 + .byte 230 + .byte 228 + .byte 226 + .byte 223 + .byte 221 + .byte 219 + .byte 217 + .byte 214 + .byte 212 + .byte 209 + .byte 207 + .byte 204 + .byte 201 + .byte 198 + .byte 196 + .byte 193 + .byte 190 + .byte 187 + .byte 184 + .byte 181 + .byte 177 + .byte 174 + .byte 171 + .byte 167 + .byte 164 + .byte 161 + .byte 157 + .byte 154 + .byte 150 + .byte 146 + .byte 143 + .byte 139 + .byte 135 + .byte 131 + .byte 128 + .byte 124 + .byte 120 + .byte 116 + .byte 112 + .byte 108 + .byte 104 + .byte 100 + .byte 95 + .byte 91 + .byte 87 + .byte 83 + .byte 79 + .byte 74 + .byte 70 + .byte 66 + .byte 61 + .byte 57 + .byte 53 + .byte 48 + .byte 44 + .byte 40 + .byte 35 + .byte 31 + .byte 26 + .byte 22 + .byte 17 + .byte 13 + .byte 8 + .byte 4 + .byte 0 + +linetableL + :screenheight .by <(display+screenBytes*#) + ;:20 .by <(display+screenBytes*#) + .by (display+screenBytes*#) + ;:20 .by >(display+screenBytes*#) + .by >PlotLine +;---------------------------- +oldPlotPointerX + .wo 0 +;---------------------------- +;PutChar4x4 +LoopCounter4x4 .byte 0 +y4x4 .byte 0 +StoreA4x4 .byte 0 +Xcounter4x4 .byte 0 +nibbler4x4 .byte 0 +CharCode4x4 .byte 0 +plot4x4color .byte 0 ;1-white, 0-background + +bittable + .byte $80,$40,$20,$10,$08,$04,$02,$01 +bittable2 + .byte $7f,$bf,$df,$ef,$f7,$fb,$fd,$fe +;---------------------------- +disktance ;tanks distance + .byte 0,0 + .byte screenwidth/3 + .byte screenwidth/4 + .byte screenwidth/5 + .byte screenwidth/6 + .byte screenwidth/7 + ;max number of players=6 + +; this table is for deciding where a tank should slide +; accordingly to what is below the tank +; there are 3 bits used here +; bit 0 - go down +; bit 1 - go left +; bit 2 - go right +; position in the table equals to bit pattern of soil below tank + +WhereToSlideTable + ; we have 3 bits: 0 - go down, 1 - go right, 2 - go left + ;original table + ;.BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + .BYTE 1,5,4,4,4,4,4,4,0,0,0,0,0,0,0,0 ;16 + .BYTE 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;32 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;48 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;64 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;80 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;96 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;112 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;128 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +EndOfTheBarrelX + .byte 4,4,4,4,4,4,4,4,4,4,4 + .byte 5,5,5,5,5,5,5,5,5,5 + .byte 6,6,6,6,6,6,6,6,6 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7 + + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 + + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 1,1,1,1,1,1,1,1,1 + .byte 2,2,2,2,2,2,2,2,2,2 + .byte 3,3,3,3,3,3,3,3,3,3,3 + +EndOfTheBarrelY + .byte 7,7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + .byte 6,6,6,6,6,6,6,6,6 + .byte 5,5,5,5,5,5,5,5,5,5 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4 + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3 + + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0 + + .byte 3,3,3,3,3,3,3,3,3,3,3,3,3,3 + .byte 4,4,4,4,4,4,4,4,4,4,4,4,4 + .byte 5,5,5,5,5,5,5,5,5,5 + .byte 6,6,6,6,6,6,6,6,6 + .byte 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7 + .byte 7,7,7,7,7,7,7,7,7,7,7 +;------------------------------------------------- + +TanksNamesDefault + dta d"1st Tank" + dta d"2nd Tank" + dta d"3rd Tank" + dta d"4th Tank" + dta d"5th Tank" + dta d"6th Tank" + +WeaponPriceH ; weapons prices (tables with prices of weapons) + .byte $00,$00,$00,$00,$00,$01,$01,$01 + .byte $01,$01,$00,$01,$02,$02,$02,$01 + .byte $01,$01,$01,$01,$01,$00,$00,$00 + .byte $01,$00,$00,$00,$02,$02,$01,$01 + .byte $02,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,$04,0,0,0,0,0,0,0,0,0,0 +WeaponPriceL + .byte $00,$60,$6F,$90,$c0,$25,$c8,$51 + .byte $f0,$ff,$66,$23,$b1,$58,$50,$4A + .byte $55,$71,$42,$50,$14,$fd,$da,$bf + .byte $31,$68,$82,$ab,$12,$45,$ae,$12 + .byte $41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 0,0,0,0,0,$4c,0,0,0,0,0,0,0,0,0,0 +;------------------------------------------------- +; how many units (bulletd) of a given weapon we get for a given price +; This is a table of constans. +; If on a given position is 0 it means that this weapon +; is not present in the game. +; This is the slot for adding new weapons. +WeaponUnits + .byte 10,5,3,1,2,2,3,1,10,2,20,10,10,5,2,10 + .byte 5,5,2,10,5,2,10,5,2,10,5,2,2,10,10,5 + .byte 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + .byte 6,2,5,5,2,8,10,2,3,3,2,2,1,10,25,0 + +;------------------------------------------------- +; Screen codes of icons (chars) representing a given weapon +WeaponSymbols + .byte $40,$41,$42,$43,$44,$45,$46,$47 + .byte $48,$49,$4a,$4b,$4c,$4d,$4e,$4f + .byte $50,$51,$52,$53,$54,$55,$56,$57 + .byte $58,$59,$5a,$5b,$60,$7b,$7c,$7d + .byte $20,$00,$00,$00,$00,$00,$00,$00 + .byte $00,$00,$00,$00,$00,$00,$00,$00 + .byte $02,$03,$06,$1d,$0a,$1b,$1c,$1e + .byte $3b,$3c,$3d,$3e,$3f,$5e,$5f,$00 + +; Names of weapons (16 chars lon) +NamesOfWeapons ;the comment is an index in the tables + dta d"Baby Missile " ; 0 + dta d"Missile " ; 1 + dta d"Baby Nuke " ; 2 + dta d"Nuke " ; 3 + dta d"LeapFrog " ; 4 + dta d"Funky Bomb " ; 5 + dta d"MIRV " ; 6 + dta d"Death's Head " ; 7 + dta d"Napalm " ; 8 + dta d"Hot Napalm " ; 9 + dta d"Tracer " ; 10 + dta d"Smoke Tracer " ; 11 + dta d"Baby Roller " ; 12 + dta d"Roller " ; 13 + dta d"Heavy Roller " ; 14 + dta d"Riot Charge " ; 15 + dta d"Riot Blast " ; 16 + dta d"Riot Bomb " ; 17 + dta d"Heavy Riot Bomb " ; 18 + dta d"Baby Digger " ; 19 + dta d"Digger " ; 20 + dta d"Heavy Digger " ; 21 + dta d"Baby Sandhog " ; 22 + dta d"Sandhog " ; 23 + dta d"Heavy Sandhog " ; 24 + dta d"Dirt Clod " ; 25 + dta d"Dirt Ball " ; 26 + dta d"Ton of Dirt " ; 27 + dta d"Liquid Dirt " ; 28 + dta d"Dirt Charge " ; 29 + dta d"Earth Disrupter " ; 30 + dta d"Plasma Blast " ; 31 + dta d"Laser " ; 32 + dta d"----------------" ; 33 + dta d"----------------" ; 34 + dta d"----------------" ; 35 + dta d"----------------" ; 36 + dta d"----------------" ; 37 + dta d"----------------" ; 38 + dta d"----------------" ; 39 + dta d"----------------" ; 40 + dta d"----------------" ; 41 + dta d"----------------" ; 42 + dta d"----------------" ; 43 + dta d"----------------" ; 44 + dta d"----------------" ; 45 + dta d"----------------" ; 46 + dta d"----------------" ; 47 + + dta d"Heat Guidance " ; 48 ($30) + dta d"Bal Guidance " ; 49 + dta d"Horz Guidance " ; 50 + dta d"Vert Guidance " ; 51 + dta d"Lazy Boy " ; 52 + dta d"Parachute " ; 53 + dta d"Battery " ; 54 + dta d"Mag Deflector " ; 55 + dta d"Shield " ; 56 + dta d"Force Shield " ; 57 + dta d"Heavy Shield " ; 58 + dta d"Super Mag " ; 59 + dta d"Auto Defense " ; 60 + dta d"Fuel Tank " ; 61 + dta d"Contact Trigger " ; 62 + dta d"----------------" ; 63 +joyToKeyTable + ; .by 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15 + .by $ff,$ff,$ff,$ff,$ff,$ff,$ff,$07,$ff,$ff,$ff,$06,$ff,$0f,$0e,$ff +previousAngle + :MaxPlayers .by 0 +previousEnergyL + :MaxPlayers .by 0 +previousLeftRange + :MaxPlayers .by 0 +previousEnergyH + :MaxPlayers .by 0 +previousRightAngle + :MaxPlayers .by 0 +RandBoundaryLow + .wo 0 +RandBoundaryHigh + .wo 1024 +AngleTablePointer + .by 0 + + +clearEnd + +.endif + diff --git a/weapons.asm b/weapons.asm new file mode 100644 index 0000000..1101eb5 --- /dev/null +++ b/weapons.asm @@ -0,0 +1,2152 @@ +; @com.wudsn.ide.asm.mainsourcefile=program.asm + + .IF *>0 ;this is a trick that prevents compiling this file alone + +; ------------------------ +babymissile + inc FallDown2 + mva #11 ExplosionRadius + jsr CalculateExplosionRange + jmp xmissile +; ------------------------ +missile ; + inc FallDown2 + mva #17 ExplosionRadius + jsr CalculateExplosionRange + jmp xmissile +; ------------------------ +babynuke + inc FallDown2 + mva #25 ExplosionRadius + jsr CalculateExplosionRange + jmp xmissile +; ------------------------ +nuke + inc FallDown2 + mva #31 ExplosionRadius + jsr CalculateExplosionRange + jmp xmissile +; ------------------------ +leapfrog + inc FallDown2 + mva #17 ExplosionRadius + jsr CalculateExplosionRange + jsr xmissile + + ; soil must fall down now! there is no other way... + ; hide tanks or they fall down with soil + + lda TankNr + pha + mva #1 Erase + jsr drawtanks + mva #0 Erase + jsr SoilDown2 + jsr drawtanks + pla + sta TankNr + + ; it looks like force is divided by 4 here BUT" + ; in Flight routine force is multiplied by 2 and left + ; so, we have Force divided by 2 here (not accurately) + + lsr Force+1 + ror Force + ;lsr Force+1 + ;ror Force + lda LeapFrogAngle + sta Angle + jsr Flight + lda HitFlag + beq EndOfLeapping + mva #15 ExplosionRadius + jsr CalculateExplosionRange0 + jsr xmissile + + ; soil must fall down now! there is no other way... + ; hide tanks or they fall down with soil + lda TankNr + pha + mva #1 Erase + jsr drawtanks + mva #0 Erase + jsr SoilDown2 + jsr drawtanks + pla + sta TankNr + + ; it looks like force is divided by 4 here BUT" + ; in Flight routine force is multiplied by 2 and left + ; so, we have Force divided by 2 here (not accurately) + ;lsr Force+1 + ;ror Force + lsr Force+1 + ror Force + lda LeapFrogAngle + sta Angle + jsr Flight + lda HitFlag + beq EndOfLeapping + mva #13 ExplosionRadius + jsr CalculateExplosionRange0 + jmp xmissile +EndOfLeapping + rts +; ------------------------ +mirv ; the whole mirv is performed by Flight routine + inc FallDown2 + rts +; ------------------------ +funkybomb ; + mva #1 tracerflag + mwa xtraj+1 xtrajfb + mwa ytraj+1 ytrajfb + inc FallDown2 + ;central Explosion + mva #21 ExplosionRadius + jsr CalculateExplosionRange0 + jsr xmissile + + lda TankNr + pha + mva #1 Erase + jsr drawtanks + mva #0 Erase + + jsr SoilDown2 + ; + mva #1 Erase + jsr drawtanks + mva #0 Erase + pla + sta TankNr + + mva #5 FunkyBombCounter +FunkyBombLoop + ;force randomization (range: 256-511) + lda random + sta Force + lda #1 + sta Force+1 + ;Angle randomization Range: (-16..+16) + lda random + lsr + and #%00011111 + bcc DoNotEor + eor #$ff +DoNotEor + sta Angle + + lda #0 + sta xtraj + sta ytraj + mwa xtrajfb xtraj+1 + mwa ytrajfb ytraj+1 + jsr Flight + + lda HitFlag + beq NoExplosionInFunkyBomb + jsr CalculateExplosionRange + jsr xmissile +NoExplosionInFunkyBomb + dec FunkyBombCounter + bne FunkyBombLoop + mva #0 tracerflag + rts +; ------------------------ +deathshead + inc FallDown2 + mva #31 ExplosionRadius + jsr CalculateExplosionRange + jsr xmissile + sbw xdraw #35 + jsr CalculateExplosionRange + jsr xmissile + adw xdraw #70 + jsr CalculateExplosionRange + jsr xmissile + sbw xdraw #35 + ; + sbw ydraw #35 + ;jsr CalculateExplosionRange + cpw ydraw #screenHeight + bcs NoUpperCircle + jsr xmissile +NoUpperCircle + adw ydraw #70 + ;jsr CalculateExplosionRange + cpw ydraw #screenHeight + bcs NoLowerCircle + jsr xmissile +NoLowerCircle + rts +; ------------------------ +tracer + rts +; ------------------------ +babyroller + inc FallDown2 + mva #11 ExplosionRadius + jmp xroller +; ------------------------ +roller ; + inc FallDown2 + mva #21 ExplosionRadius + jmp xroller +; ------------------------ +heavyroller + inc FallDown2 + mva #31 ExplosionRadius + jmp xroller +; ------------------------ +riotbomb + inc FallDown2 + mva #17 ExplosionRadius + jsr CalculateExplosionRange + jmp xriotbomb +; ------------------------ +heavyriotbomb + inc FallDown2 + mva #29 ExplosionRadius + jsr CalculateExplosionRange + jmp xriotbomb +; ------------------------ +babydigger + mva #0 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #1 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +digger ; + mva #0 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #3 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +heavydigger + mva #0 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #7 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +xdigger + mwa xdraw digstartx + mwa ydraw digstarty + ldx diggery +WriteToBranches + lda xdraw + sta digtabxL,x + lda xdraw+1 + sta digtabxH,x + lda ydraw + sta digtabyL,x + lda ydraw+1 + sta digtabyH,x + dex + bpl WriteToBranches + jsr DiggerCharacter ; start character + + adw xdraw #4 + lda DigLong + ; looks strange, but it is (DigLong+2)*4 + clc + adc #$2 + asl + asl + sta ExplosionRadius + jsr CalculateExplosionRange +BranchNotFinished + ldx diggery +CalculateBranches + txa + and #$01 + bne DigRight +diglewy ; even branches go left + sec + lda digtabxL,x + sbc #$04 + sta digtabxL,x + lda digtabxH,x + sbc #$00 + sta digtabxH,x + jmp DigRandomize +DigRight ; odd go right (everytime 4 pixels) + clc + lda digtabxL,x + adc #$04 + sta digtabxL,x + lda digtabxH,x + adc #$00 + sta digtabxH,x +DigRandomize + lda random + and #$87 + bmi DigUp +digwdol + and #$07 + clc + adc digtabyL,x + sta digtabyL,x + lda digtabyH,x + adc #$00 + sta digtabyH,x + jmp DigCalculateNext +DigUp + and #$07 + sta temp + sec + lda digtabyL,x + sbc temp + sta digtabyL,x + lda digtabyH,x + sbc #$00 + sta digtabyH,x +DigCalculateNext + dex + bpl CalculateBranches + ; here we draw... + ldx diggery +DigDrawing + lda digtabxL,x + sta xdraw + lda digtabxH,x + sta xdraw+1 + lda digtabyL,x + sta ydraw + lda digtabyH,x + sta ydraw+1 + phx + jsr DiggerCharacter + plx + dex + bpl DigDrawing + dec:lda DigLong + jpl BranchNotFinished + rts +DiggerCharacter + lda random + and #$06 + clc + adc #$36 + adc sandhogflag + sta CharCode + cpw xdraw #(screenwidth-6) + bcs DoNotPutDig + jmp TypeChar +DoNotPutDig + rts +; ------------------------ +babysandhog + mva #8 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #1 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +sandhog + mva #8 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #3 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +heavysandhog + mva #8 sandhogflag + inc FallDown2 + mva #13 DigLong + mva #5 diggery ; how many branches (-1) + jmp xdigger +; ------------------------ +dirtclod + inc FallDown2 + mva #12 ExplosionRadius + jsr CalculateExplosionRange + jmp xdirt +; ------------------------ +dirtball + inc FallDown2 + mva #22 ExplosionRadius + jsr CalculateExplosionRange + jmp xdirt +; ------------------------ +tonofdirt + inc FallDown2 + mva #31 ExplosionRadius + jsr CalculateExplosionRange + jmp xdirt +; ------------------------ +dirtcharge + inc FallDown2 + mva #61 ExplosionRadius + jsr CalculateExplosionRange + jmp ofdirt +; ------------------------ +laser + ldx TankNr + lda AngleTable,x + tay + clc + lda xtankstableL,x + adc EndOfTheBarrelX,y ; correction of the end of the barrel point + sta xbyte + lda xtankstableH,x + adc #0 + sta xbyte+1 + sec + lda ytankstable,x + sbc EndOfTheBarrelY,y + sta ybyte + mva #0 ybyte+1 + mwa #Drawplot DrawJumpAddr + mwa xdraw LaserCoordinate + mwa ydraw LaserCoordinate+2 + mwa xbyte LaserCoordinate+4 + mwa ybyte LaserCoordinate+6 + + jsr draw + mva #0 color + mwa LaserCoordinate xdraw + mwa LaserCoordinate+2 ydraw + mwa LaserCoordinate+4 xbyte + mwa LaserCoordinate+6 ybyte + jsr draw + mva #1 color + mwa LaserCoordinate xdraw + mwa LaserCoordinate+2 ydraw + mwa LaserCoordinate+4 xbyte + mwa LaserCoordinate+6 ybyte + jsr draw + mva #0 color + mwa LaserCoordinate xdraw + mwa LaserCoordinate+2 ydraw + mwa LaserCoordinate+4 xbyte + mwa LaserCoordinate+6 ybyte + jsr draw + mva #1 color + mwa LaserCoordinate xdraw + mwa LaserCoordinate+2 ydraw + jsr plot + mva #0 HitFlag + jsr CheckCollisionWithTank + lda HitFlag + beq LaserMisses + ; here we hit a tank (X) + ldy #100 + jsr DecreaseEnergyX +LaserMisses + rts + +; ----------------- +xmissile ; +; ----------------- + lda #1 + sta radius + sta color + ;ora ExplosionRadius ;making sure the ExplosionRadius is odd + ;sta ExplosionRadius +ExplosionLoop + jsr circle + inc ydraw + jsr circle + dec ydraw + inc:inc radius + lda radius + cmp ExplosionRadius + bne ExplosionLoop + lda #0 + sta color +ExplosionLoop2 + jsr circle + inc ydraw + jsr circle + dec ydraw + dec radius + lda radius + bne ExplosionLoop2 + lda #1 + sta color + +;check tanks' distance from the centre of the explosion + + mwa #DrawLen DrawJumpAddr + ;the above switches Draw to measuring length + ;trick is easy - how many pixels does it take to draw + ;a line from one point to another + ;it must be somehow easier than regular Pitagoras + ;calculation + + ldx NumberOfPlayers +DistanceCheckLoop + dex + lda eXistenZ,x + beq EndOfDistanceCheckLoop + ;here the tank exist + lda XtankstableL,x + clc + adc #3 ;measure from middle of the tank + sta xbyte + lda XtankstableH,x + clc + adc #0 ;measure from middle of the tank + sta xbyte+1 + lda Ytankstable,x + sec + sbc #2 ;measure from middle of the tank + sta ybyte + lda #0 + sta ybyte+1 + phx + jsr draw + plx + ;if tank within range of the explosion? + lda LineLength+1 + bne TankIsNotWithinTheRange + lda LineLength + cmp ExplosionRadius + bcs TankIsNotWithinTheRange + lda ExplosionRadius + sec + sbc LineLength + ;multiply difference by 8 + clc + adc #1 + asl + asl + asl + tay + jsr DecreaseEnergyX + +TankIsNotWithinTheRange +EndOfDistanceCheckLoop + txa + bne DistanceCheckLoop + rts +; ----------------- +xdirt ; +; ----------------- + lda #1 + sta radius + sta color +dirtLoop + jsr circle + inc ydraw + jsr circle + dec ydraw + inc radius + lda radius + cmp ExplosionRadius + bne dirtLoop + rts +; ----------------- +xriotbomb ; +; ----------------- + lda #0 + sta radius + sta color +rbombLoop + jsr circle + inc radius + lda radius + cmp ExplosionRadius + bne rbombLoop + mva #1 color + rts + +; ---------------- + +xroller ; + ; now collisions are detected with modified draw routine + ; therefore YDRAW value must be taken from mountaintable + ldy #0 + mwa #mountaintable tempXROLLER + + adw tempXROLLER xdraw + lda (tempXROLLER),y + sta ydraw + + lda vx+3 + ; if horizontal velocity is negative then change the direction + bpl PositiveVelocity + lda goleft + ora #$01 + sta goleft +PositiveVelocity + ; first we look for the left slope + ; then righ slope and set the flag + ; $FF - we are in a hole (flighting in missile direction) + ; 1 - right, 2 - left + mva #$ff HowMuchToFall + mva ydraw HeightRol + mwa #mountaintable tempXROLLER + + adw tempXROLLER xdraw +SeekLeft + sbw tempXROLLER #1 + lda (tempXROLLER),y ;fukk! beware of Y value + cmp HeightRol + bne HowMuchToFallLeft + lda tempXROLLER + cmp #mountaintable + beq GoRightNow +HowMuchToFallLeft + bcs GoRightNow + mva #1 HowMuchToFall +GoRightNow + mwa #mountaintable tempXROLLER + adw tempXROLLER xdraw +SeekRight + adw tempXROLLER #1 + lda (tempXROLLER),y + cmp HeightRol + bne HowMuchToFallRight + lda tempXROLLER + cmp #<(mountaintable+screenwidth) + bne SeekRight + lda tempXROLLER+1 + cmp #>(mountaintable+screenwidth) + beq HowMuchToFallKnown +HowMuchToFallRight + ; check if up or down + bcs HowMuchToFallKnown + lda HowMuchToFall + bpl ItIsLeftAlready + mva #2 HowMuchToFall + bne HowMuchToFallKnown +ItIsLeftAlready + mva #$ff HowMuchToFall +HowMuchToFallKnown + lda HowMuchToFall + bpl Rollin + lda #1 + clc + adc goleft + sta HowMuchToFall +Rollin + adw xdraw #mountaintable tempXROLLER + ldy #0 + lda (tempXROLLER),y + sta HeightRol ; relative point + +RollinContinues + wait + wait + ; new point is set + adw xdraw #mountaintable tempXROLLER + ldy #0 + lda (tempXROLLER),y + sta ydraw + beq ExplodeNow + cmp HeightRol + beq UpNotYet + bcc ExplodeNow +UpNotYet + sec ;clc + sta HeightRol + sbc #1 + sta ydraw + ;check tank collision prior to PLOT + sty HitFlag + + mwa xdraw xtraj+1 + mwa ydraw ytraj+1 + jsr CheckCollisionWithTank + + lda HitFlag + bne ExplodeNow + jsr unPlot + ; let's go the right direction + lda HowMuchToFall + cmp #1 + beq HowMuchToFallRight2 + sbw xdraw #1 + lda xdraw + bne RollinContinues + lda xdraw+1 + jne RollinContinues + beq ExplodeNow +HowMuchToFallRight2 + adw xdraw #1 + cpw xdraw screenwidth + jne RollinContinues +ExplodeNow + mwa xdraw xcircle ; we must store somewhere (BAD) + mva ydraw ycircle ; xdraw and ydraw (BAD) + mwa #0 xdraw + mva #screenheight-1 ydraw + jsr unPlot + mwa xcircle xdraw ;(bad) + mva ycircle ydraw ;(bad) + + ; finally a little explosion + jsr CalculateExplosionRange + jmp xmissile + rts +; -------------------------------------------------- +ofdirt ; +; -------------------------------------------------- +; makes dirt on xdraw,ydraw position and of ExplosionRadius height + mwa xdraw xcircle + mva ydraw ycircle + lda #1 +; current dirt width + sta magic + sta color +NextRow + wait + ldy magic +NextLine + lda random + and #$01 + beq DoNotPlot + sty magic+1 + jsr plot + ldy magic+1 +DoNotPlot + adw xdraw #1 + dey + bne NextLine + dec ydraw ; 1 line up + lda ydraw + cmp #$ff + beq EndOfTheDirt ;if horizontal Counter wraps + inc magic ; width+2 + inc magic + lda magic + sta magic+1 ; just for a second + lsr magic+1 + sec + lda xcircle + sbc magic+1 + sta xdraw + lda xcircle+1 + sbc #0 + sta xdraw+1 ; new starting coordinate in a given row + dec ExplosionRadius + bne NextRow +EndOfTheDirt + mwa xcircle xdraw + mva ycircle ydraw + rts +;-------------------------------------------------- +BeforeFire .proc ;TankNr (byte) +;-------------------------------------------------- +;this nice routine makes the whole shooting +;preparation: aiming and displaying +;angle and shooting force values +; + +;first, get current parameters (angle+force) +;for an active tank and display them +;(these values are taken from the previous round) + + ldx TankNr + + ;Checking the maximal force + lda MaxEnergyTableH,x + cmp EnergyTableH,x + bne ContinueToCheckMaxForce2 + lda MaxEnergyTableL,x + cmp EnergyTableL,x +ContinueToCheckMaxForce2 + bcs skip15 + + lda MaxEnergyTableH,x + sta EnergyTableH,x + lda MaxEnergyTableL,x + sta EnergyTableL,x + +skip15 + jsr DisplayingSymbols ;all digital values like force, angle, wind, etc. + jsr PutTankNameOnScreen + + jsr DrawTankNr + + wait ; best after drawing a tank + ;wait + + +;keyboard reading +; KBCODE keeps code of last keybi +; SKSTAT $ff - nothing pressed +; $FB - any key +; $f7 - shift +; $f3 - shift+key + +notpressed + lda SKSTAT + cmp #$ff + beq checkJoy + cmp #$f7 + beq checkJoy + + lda kbcode + and #$Bf + cmp #$8e + jeq CTRLPressedUp + cmp #$8f + jeq CTRLPressedDown + cmp #$ac + jeq CTRLPressedTAB + + and #$3f ;CTRL and SHIFT ellimination +jumpFromStick + cmp #$e + jeq pressedUp + cmp #$f + jeq pressedDown + cmp #$6 + jeq pressedLeft + cmp #$7 + jeq pressedRight + cmp #$21 + jeq pressedSpace + cmp #$2c + jeq pressedTAB + jmp notpressed +checkJoy + ;------------JOY------------- + ;happy happy joy joy + ;check for joystick now + lda JSTICK0 + and #$0f + cmp #$0f + beq notpressedJoy + tay + lda joyToKeyTable,y + jmp jumpFromStick +notpressedJoy + ;fire + lda TRIG0 + bne JNotFire + lda #$21 + jmp jumpFromStick +JNotFire + jmp notpressed +; +pressedUp + ;force increaseeee! + ldx TankNr + inc EnergyTableL,x + bne CheckingMaxForce + inc EnergyTableH,x +CheckingMaxForce + lda MaxEnergyTableH,x + cmp EnergyTableH,x + bne FurtherCheckMaxForce + lda MaxEnergyTableL,x + cmp EnergyTableL,x +FurtherCheckMaxForce + jcs BeforeFire + + lda MaxEnergyTableH,x + sta EnergyTableH,x + lda MaxEnergyTableL,x + sta EnergyTableL,x + + jmp BeforeFire + +CTRLPressedUp + ldx TankNr + lda EnergyTableL,x + clc + adc #10 + sta EnergyTableL,x + bcc CheckingMaxForce + inc EnergyTableH,x + jmp CheckingMaxForce + + +pressedDown + ldx TankNr + dec EnergyTableL,x + lda EnergyTableL,x + cmp #$ff + bne skip04 + dec EnergyTableH,x + bpl skip04 +ForceGoesZero + lda #0 + sta EnergyTableH,x + sta EnergyTableL,x +skip04 + jmp BeforeFire + +CTRLPressedDown + ldx TankNr + sec + lda EnergyTableL,x + sbc #10 + sta EnergyTableL,x + jcs BeforeFire + dec EnergyTableH,x + bmi ForceGoesZero + jmp BeforeFire + +pressedLeft + ldx TankNr + dec AngleTable,x + lda AngleTable,x + cmp #$ff ; if angle goes through 0 we clear the barrel + bne NotThrough90DegreesLeft + mva #$2e CharCode + jsr drawtankNrX +NotThrough90DegreesLeft + cmp #(255-91) + jne BeforeFire + lda #90 + sta AngleTable,x + jmp BeforeFire + +pressedRight + ldx TankNr + INC AngleTable,x + lda AngleTable,x + bne NotThrough90DegreesRight + mva #$30 CharCode ; if angle goes through 0 we clear the barrel + jsr drawtankNrX +NotThrough90DegreesRight + cmp #91 + jne BeforeFire + lda #(255-90) + sta AngleTable,x + jmp BeforeFire + +pressedTAB + ldx TankNr + inc ActiveWeapon,x + lda ActiveWeapon,x + cmp #$30 ; number of offensive weapons + bne skip14 + lda #0 + sta ActiveWeapon,x +skip14 + lda ActiveWeapon,x + jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + beq pressedTAB + jsr WaitForKeyRelease + jmp BeforeFire + +CTRLpressedTAB + ldx TankNr + dec ActiveWeapon,x + bpl skip14CT + lda #$2f ; the last possible offensive weapon + sta ActiveWeapon,x +skip14CT + lda ActiveWeapon,x + jsr HowManyBullets ; and we have qty of owned shells. Ufff.... + beq CTRLpressedTAB + jsr WaitForKeyRelease + jmp BeforeFire + + +pressedSpace + ;================================= + ;we shoot here!!! + RTS +.endp + +;-------------------------------------------------- +Shoot .proc ;TankNr (byte) +;-------------------------------------------------- +;it looks like this routine is too big - +;- more and more functions were being added... +;good idea would be to rewrite it completely +;with much more separate blocks, but you know - +;- do not touch it if it works... + +;the latest addition to this routine is +;displaying offensive texts! + +RandomizeOffensiveText + lda random + cmp #talk.NumberOfOffensiveTexts + bcs RandomizeOffensiveText + + sta TextNumberOff + ldy TankNr + mva #1 plot4x4color + jsr DisplayOffensiveTextNr + + + ldx TankNr + lda ActiveWeapon,x + cmp #$20 ; laser + bne NotStrongShoot + mva #0 color + lda #7 + sta Force + sta Force+1 + bne AfterStrongShoot +NotStrongShoot + lda EnergyTableL,x + sta Force + lda EnergyTableH,x + sta Force+1 +AfterStrongShoot + lda #$0 + sta Force+2 + lda AngleTable,x + sta Angle + + lda #0 + sta xtraj + sta ytraj + + ; Shoots tank nr X !!! :) + ;ldx TankNr + lda xtankstableL,x + sta xtraj+1 + lda xtankstableH,x + sta xtraj+2 + lda ytankstable,x + sta ytraj+1 + lda #$00 + sta ytraj+2 + + ; correction of the starting coordinates of bullet + ; to start where the tank's barrel ends + ; (without it bullet would go from the left lower corner of the tank) + ldy Angle + clc + lda xtraj+1 + adc EndOfTheBarrelX,y ; correction of X + ;adc #4 + sta xtraj+1 + lda xtraj+2 + adc #0 + sta xtraj+2 + sec + lda ytraj+1 + sbc EndOfTheBarrelY,y ; correction of Y + ;sbc #7 + sta ytraj+1 + lda ytraj+2 + sbc #0 + sta ytraj+2 + + ldy #100 + + jsr Flight + mva #1 color + ;jsr WaitForKeyRelease + rts +.endp + + +;-------------------------------------------------- +TankFalls .proc; +;-------------------------------------------------- + lda #0 + sta PreviousFall + sta EndOfTheFallFlag + sta Parachute + + ; let's check if the given tank has got the parachute + lda #$35 ; parachute + jsr HowManyBullets + beq TankFallsX + inc Parachute +TankFallsX + ; coordinates of the first pixel under the tank + ldx TankNr + lda XtankstableL,x + sta xdraw + lda XtankstableH,x + sta xdraw+1 + lda Ytankstable,x + clc + adc #1 ; in this point the comment helped us! For the very first + ; time in our lives! Tada! It opens a new chapter!!! + sta ydraw + ; + lda #08 + sta mask2 ; Loop Counter +ByteBelowTank + jsr point + beq EmptyPoint2 + sec + bcs ROLPoint2 +EmptyPoint2 + clc +ROLPoint2 + rol mask1 + adw xdraw #1 + dec mask2 + bne ByteBelowTank + ldx mask1 + lda WhereToSlideTable,x + sta IfFallDown ; taking directions of falling down from the table + bne ItStillFalls + ; Tank falling down already finished, but it is not sure that + ; the horizontal coordinate is even. + ; If it is odd then it must be corrected because otherwise + ; P/M graphics background would not look OK + ldx TankNr + lda XtanksTableL,x + and #$01 + jeq EndOfFall ; if it is even then it is the end + ; and if not, we push it one pixel the way it was falling before + lda PreviousFall + sta IfFallDown + inc EndOfTheFallFlag ; because after this correction is shouldn't fall anymore + +; we have 3 bits: 0 - go down, 1 - go right, 2 - go left +;--- +ItStillFalls + lda Parachute + and #1 + bne ParachutePresent + ; decreasing energy - if the vertical fall, substract 2 + ; and if at an angle then substract 1 + ldy #1 ; how much energy to substract + lda IfFallDown + and #1 + beq NoFallingDown + ldx TankNr + jsr DecreaseEnergyX + lda IfFallDown + and #6 + bne FallDiagonally + ldx TankNr + jsr DecreaseEnergyX +FallDiagonally +NoFallingDown +ParachutePresent + ; we must set flag meaning that the tank was falling down + ; because later maybe the number of parachutes will decrease + ; (if there were parachutes and they were ON) + + lda Parachute + ora #2 ; we set bit nr 1 (nr 0 means that parachute is present) + sta Parachute + + ; storing last direction of falling + ; (it is not necessarily the direction from the previous + ; iteraction, so we must check directional bits before storing) + lda IfFallDown + and #$06 + beq FallStraightDown + sta PreviousFall +FallStraightDown + lda Parachute + and #01 + beq RapidFalling + wait +RapidFalling + ; we finish falling down if the tank reached the edge of the screen + ; but if it falls straight down or the other way than the edge, + ; then continue falling! + ldx TankNr + lda XtanksTableL,x + bne NotLeftEdge + lda XtanksTableH,x + bne NotLeftEdge + lda IfFallDown + and #$04 ; check if it does not fall left + jne EndOfFall ; if so then maybe we finish +NotLeftEdge + clc + lda XtanksTableL,x + adc #$08 ; we'll check right side of the char + sta temp + lda XtanksTableH,x + adc #0 + sta temp+1 + cpw temp #screenwidth + bne NotRightEdge + lda IfFallDown + and #$02 ; check if it does not fall right + jne EndOfFall ; if so then maybe we finish +NotRightEdge + ; clear previous position + mva #1 Erase + jsr DrawTankNr + ; and the parachute (if present) + lda Parachute + and #01 + beq DoNotClearParachute + ; here we clear the parachute + ldx TankNr + lda #$34 + sta CharCode + lda Ytankstable,x + sec + sbc #8 + sta ydraw + lda XtanksTableL,x + sta xdraw + lda XtanksTableH,x + sta xdraw+1 + jsr TypeChar +DoNotClearParachute + mva #0 Erase + ldx TankNr + lsr IfFallDown ; bit nr 0 (down) + bcc DoesNotFallDown + ; tank is falling down + lda Ytankstable,x + clc + adc #1 + sta Ytankstable,x +DoesNotFallDown + lsr IfFallDown ; bit nr 1 (right) + bcc DoesNotFallLeft + ; tank is falling left + clc + lda XtankstableL,x + adc #1 + sta XtankstableL,x + lda XtankstableH,x + adc #0 + sta XtankstableH,x +DoesNotFallLeft + lsr IfFallDown ; bit nr 2 (left) + bcc DoesNotFallRight + ; tank is falling right + sec + lda XtankstableL,x + sbc #1 + sta XtankstableL,x + lda XtankstableH,x + sbc #0 + sta XtankstableH,x +DoesNotFallRight + jsr DrawTankNr + + ; checking is parachute present and if so, draw it + lda Parachute + and #01 + beq DoNotDrawParachute + + ; here we draw parachute + ldx TankNr + lda #$34 + sta CharCode + lda Ytankstable,x + sec + sbc #8 + sta ydraw + lda XtanksTableL,x + sta xdraw + lda XtanksTableH,x + sta xdraw+1 + jsr TypeChar +DoNotDrawParachute + lda EndOfTheFallFlag + jeq TankFallsX + +EndOfFall + jsr DrawTankNr + + ; if tank was falling down having parachute, + ; we must deduct one parachute + lda Parachute + cmp #$03 ; was falling down and the parachute + bne ThereWasNoParachute + ; first we clear parachute on the screen + mva #1 Erase + ldx TankNr + lda #$34 + sta CharCode + lda Ytankstable,x + sec + sbc #8 + sta ydraw + lda XtanksTableL,x + sta xdraw + lda XtanksTableH,x + sta xdraw+1 + jsr TypeChar + mva #0 Erase + ; now we can deduct one parachute from the list of weapons + + lda #$35 ; parachute + jsr DecreaseWeapon +ThereWasNoParachute + rts +.endp +;-------------------------------------------------- +Flight .proc ;Force(byte.byte), Angle(byte), Wind(.byte) 128=0, 255=maxright, 0=maxleft +;-------------------------------------------------- + +;g=-0.1 +;vx=Force*sin(Angle) +;vy=Force*cos(Angle) +; +;:begin +;ytraj=ytray-vy +;vy=vy-g +;xtraj=xtraj+vx - without Wind +;vx=vx+Wind (Wind is a small fraction) +;plot xtraj,ytraj - there is clearing in plot +;goto begin + +; smoke tracer :) + ldy #0 + ldx TankNr + lda ActiveWeapon,x + cmp #11 ; Smoke tracer + bne noSmokeTracer + iny +noSmokeTracer + sty SmokeTracerFlag + +RepeatIfSmokeTracer + mwa ytraj+1 Ytrajold+1 + mwa xtraj+1 Xtrajold+1 + mwa #DrawCheck DrawJumpAddr + + lda #0 + sta Result + sta Result+1 + sta Result+2 + sta HitFlag + sta xdraw + sta xdraw+1 + sta ydraw + sta ydraw+1 + + ;vx calculation + aslw Force ;Force=Force*4 ... *2 + ;aslw Force + + ;sin(Angle) + ldx Angle + stx LeapFrogAngle ; we will need it later + + ;Angle works like this: + ;0 'degrees' is sraight up + ;90 'degrees' is horizontally right + ;255 is straight up (same as 0) + ;255-90 (165) horizontally left + + bpl FlightRight + + ;and if the highest bit is set then + ;Flight to LEFT + ;calculate Angle with this formula: + ;Angle=90-(Angle-165) + + sec + txa + sbc #165 ;(Angle-165) + sta temp ;dirty trick with selfmodifying code (REMOVED) + lda #90 ; + sbc temp ;90-(Angle-165) + ;and we have rady angle here ... and we go LEFT! + tax + sta Angle + mva #1 goleft + ; and now we contine as if nothing happened + ; (but we have goleft set to 1!!!) + bne dontzerogoleft + +FlightRight + mva #0 goleft + +dontzerogoleft + + lda sintable,x ;sin(Angle) + sta Multiplee ;sin(Angle)*Force + mwa Force Multiplier + lda #$0 + sta Multiplier+2 + ldx #8 +MultiplyLoop + ror Multiplee + bcc DoNotAdd + clc + lda Multiplier + adc Result + sta Result + lda Multiplier+1 + adc Result+1 + sta Result+1 + lda Multiplier+2 + adc Result+2 + sta Result+2 +DoNotAdd + ;clc ;carry always cleared here (anyway we hope so :) + rol Multiplier + rol Multiplier+1 + rol Multiplier+2 + dex + bne MultiplyLoop + ; here in Result there is a number xxxx.yyy = sin(Angle)*Force + + lda Result ;vx=sin(Angle)*Force + sta vx + lda Result+1 + sta vx+1 + lda Result+2 + sta vx+2 + mva #0 vx+3 + +;======vy + lda #0 ;cos(Angle) + sta Result + sta Result+1 + sta Result+2 +;-- + ldx Angle + lda costable,x + + sta Multiplee ;cos(Angle)*Force + mwa Force Multiplier + lda #$0 + sta Multiplier+2 + ldx #8 +MultiplyLoopY + ror Multiplee + bcc DoNotAddY + clc + lda Multiplier + adc Result + sta Result + lda Multiplier+1 + adc Result+1 + sta Result+1 + lda Multiplier+2 + adc Result+2 + sta Result+2 +DoNotAddY + ;clc ;carry always cleared here (anyway we hope so :) + rol Multiplier + rol Multiplier+1 + rol Multiplier+2 + dex + bne MultiplyLoopY + ; here in Result there is a number xxxx.yyy=cos(Angle)*Force + + lda Result ;vy=cos(Angle)*Force + sta vy + lda Result+1 + sta vy+1 + lda Result+2 + sta vy+2 + mva #0 vy+3 + +Loopi + ;ytraj=ytraj-vy (skipping least significant byte of vy) + sec + lda ytraj + sbc vy+1 + sta ytraj + lda ytraj+1 + sbc vy+2 + sta ytraj+1 + lda ytraj+2 + sbc vy+3 + sta ytraj+2 + + ;vy=vy-g (again without least significant byte of vy) + sec + lda vy+1 + sbc gravity + sta vy+1 + lda vy+2 + sbc #0 + sta vy+2 + lda vy+3 + sbc #0 + sta vy+3 + bpl StillUp + ; where we know that the bullet starts to fall down + ; we check if it is MIRV and if so, jump to MIRV routine + ldx TankNr + lda ActiveWeapon,x + cmp #6 ; MIRV + jeq MIRVdownLoop +StillUp + lda goleft + bne FlightLeft + + clc ;xtraj=xtraj+vx (skipping least significant byte of vx) + lda xtraj ;here of course Fight to right + adc vx+1 + sta xtraj + lda xtraj+1 + adc vx+2 + sta xtraj+1 + lda xtraj+2 + adc vx+3 + sta xtraj+2 + jmp skip07 ;skipping substracting for Flight to left + +FlightLeft + sec ;xtraj=xtraj-vx (skipping least significant byte of vx) + lda xtraj ;here of course Fight to left + sbc vx+1 + sta xtraj + lda xtraj+1 + sbc vx+2 + sta xtraj+1 + lda xtraj+2 + sbc vx+3 + sta xtraj+2 + +skip07 + ;vx=vx-Wind (also without least significan byte of vx) + lda goleft + bne FlightsLeft ;blow on bullet flighting left + lda WindOrientation + bne WindToLeft + beq LWindToLeft +FlightsLeft + lda WindOrientation + beq LWindToRight +LWindToLeft + + ; here Wind to right, bullet goes right as well, so vx=vx+Wind + ; here Wind to left, bullet goes left as well, so vx=vx+Wind + clc + lda vx + adc Wind + sta vx + lda vx+1 + adc Wind+1 + sta vx+1 + lda vx+2 + adc #0 + sta vx+2 + lda vx+3 + adc #0 + sta vx+3 + Jmp skip08 +WindToLeft +LWindToRight + + ;Wind to left, bullet right, so vx=vx-Wind + ;Wind to right, bullet left, so vx=vx-Wind + sec + lda vx + sbc Wind + sta vx + lda vx+1 + sbc Wind+1 + sta vx+1 + lda vx+2 + sbc #0 + sta vx+2 + lda vx+3 + sbc #0 + sta vx+3 +skip08 + mwa xtrajold+1 xdraw + mwa ytrajold+1 ydraw + mwa xtraj+1 xbyte + mwa ytraj+1 ybyte + jsr draw + ;key + mwa xtraj+1 XtrajOld+1 + mwa ytraj+1 YtrajOld+1 + + lda tracerflag + bne nowait + lda color + beq nowait + ;wait + ;this is where program slows down the flight of a missile + ;possibly it is too slow to wait till next frame... + ;we will see. + ;---2003-08-01 yes, it is too slow!!! shorter delay + ; must be here like few sta wsync's + ; half a frame would be the best... + ldx #FlyDelay +DelayLoop + sta wsync + dex + bne DelayLoop + +nowait + lda HitFlag + bne Hit + + cpw ytraj+1 #screenheight + bcc YTrayLowerThanScreenHeight + lda ytraj+2 + bpl EndOfFlight + +YTrayLowerThanScreenHeight ; it means it is still on screen and not above + +SkipCollisionCheck + + mwa xtraj+1 xdraw + mwa ytraj+1 ydraw + + lda tracerflag + bne NoUnPlot + + jsr UnPlot + +NoUnPlot + jsr PlotPointer + + jmp Loopi + +Hit + mwa XHit xdraw + mwa YHit ydraw + + jsr unPlot +EndOfFlight + mwa xdraw xcircle ; we must store for a little while + mva ydraw ycircle ; xdraw and ydraw + mwa #0 xdraw + mva #screenheight-1 ydraw + jsr unPlot + mwa xcircle xdraw + mva ycircle ydraw + + ldy SmokeTracerFlag + beq EndOfFlight2 + dey + sty SmokeTracerFlag + jmp SecondFlight +EndOfFlight2 + lda #0 ; nie wiem czemu + sta tracerflag ; + rts +.endp + +SecondFlight .proc +; ---------------- przekopiowany fragment sprzed odpalenie strzału malo kulturalne..... +; ---------------- ponownie wyznacza parametry strzału + ldx TankNr + lda EnergyTableL,x + sta Force + lda EnergyTableH,x + sta Force+1 + lda #$0 + sta Force+2 + lda AngleTable,x + sta Angle + + lda #0 + sta color + sta xtraj + sta ytraj + + lda xtankstableL,x + sta xtraj+1 + lda xtankstableH,x + sta xtraj+2 + lda ytankstable,x + sta ytraj+1 + lda #$00 + sta ytraj+2 + + ldy Angle + clc + lda xtraj+1 + adc EndOfTheBarrelX,y ; correction of X + sta xtraj+1 + lda xtraj+2 + adc #0 + sta xtraj+2 + sec + lda ytraj+1 + sbc EndOfTheBarrelY,y ; correction of Y + sta ytraj+1 + lda ytraj+2 + sbc #0 + sta ytraj+2 + + ldy #100 + lda #1 ; nie wiem (to znaczy wydaje mi sie ze wiem ;) ) + sta tracerflag ; ..... + jmp Flight.RepeatIfSmokeTracer +.endp + +; ------------------------------------------------- +MIRVdownLoop .proc +; MIRV loop - here mirv bullets fall down +; ------------------------------------------------- +; copy Flight parameters to the table + ldx #4 +MIRVcopyParameters + lda xtraj + sta xtraj00,x + lda xtraj+1 + sta xtraj01,x + lda xtraj+2 + sta xtraj02,x + lda vx + sta vx00,x + lda vx+1 + sta vx01,x + lda vx+2 + sta vx02,x + lda vx+3 + sta vx03,x + lda #0 + sta MirvDown,x + dex + bpl MIRVcopyParameters +; modification (to make bullets "split away" and go different directions) +; bullet indexed 0 is in the middle + +; bullet 1 + clc + lda vx+1 + adc #100 + sta vx01+1 + lda vx+2 + adc #0 + sta vx02+1 + lda vx+3 + adc #0 + sta vx03+1 +; bullet 2 + sec + lda vx+1 + sbc #100 + sta vx01+2 + lda vx+2 + sbc #0 + sta vx02+2 + lda vx+3 + sbc #0 + sta vx03+2 +; bullet 3 + clc + lda vx+1 + adc #200 + sta vx01+3 + lda vx+2 + adc #0 + sta vx02+3 + lda vx+3 + adc #0 + sta vx03+3 +; bullet 4 + sec + lda vx+1 + sbc #200 + sta vx01+4 + lda vx+2 + sbc #0 + sta vx02+4 + lda vx+3 + sbc #0 + sta vx03+4 + + ; clearing ranges of soil down registers + mwa #screenwidth RangeLeft + lda #0 + sta RangeRight + sta RangeRight+1 + + ldx #$FF ; it will turn 0 in a moment anyway + stx MirvMissileCounter +mrLoopi + inc MirvMissileCounter + lda MirvMissileCounter + cmp #5 + bne mrLoopix + mva #0 MirvMissileCounter +mrLoopix + ldx MirvMissileCounter + ; Y changes only for bullet number 0 + ; because rest of the bullets have the same Y (height) + + bne MIRVdoNotChangeY + ; Y is the same for all falling bullets + ;ytraj=ytraj-vy (skipping least significant byte of vy) + sec + lda ytraj + sbc vy+1 + sta ytraj + lda ytraj+1 + sbc vy+2 + sta ytraj+1 + lda ytraj+2 + sbc vy+3 + sta ytraj+2 + + ;vy=vy-g (also without least significan byte of vy) + sec + lda vy+1 + sbc gravity + sta vy+1 + lda vy+2 + sbc #0 + sta vy+2 + lda vy+3 + sbc #0 + sta vy+3 + + ; 3 waits for 5 bullets (will be faster) + wait + ;wait + wait + +MIRVdoNotChangeY + + lda MirvDown,x ; if bullet is already down we go with the next one + jne MIRVnextBullet + lda goleft + bne mrFlightLeft + + clc ;xtraj=xtraj+vx (skipping the least significant byte of vx) + lda xtraj00,x ;and here of course Flight to the right + adc vx01,x + sta xtraj00,x + lda xtraj01,x + adc vx02,x + sta xtraj01,x + lda xtraj02,x + adc vx03,x + sta xtraj02,x + jmp mrskip07 ;skip substracting for Flight to the left + +mrFlightLeft + sec ;xtraj=xtraj-vx (skipping the least significant byte of vx) + lda xtraj00,x ;here of course Flight to the left + sbc vx01,x + sta xtraj00,x + lda xtraj01,x + sbc vx02,x + sta xtraj01,x + lda xtraj02,x + sbc vx03,x + sta xtraj02,x + + +mrskip07 + ;vx=vx-Wind (also without least significan byte of vx) + + lda goleft + bne mrFlightsLeft ;blow on bullet flighting left + lda WindOrientation + bne mrWindToLeft + beq mrLWindToLeft +mrFlightsLeft + lda WindOrientation + beq mrLWindToRight +mrLWindToLeft + ; here Wind to right, bullet goes right as well, so vx=vx+Wind + ; here Wind to left, bullet goes left as well, so vx=vx+Wind + clc + lda vx00,x + adc Wind + sta vx00,x + lda vx01,x + adc Wind+1 + sta vx01,x + lda vx02,x + adc #0 + sta vx02,x + lda vx03,x + adc #0 + sta vx03,x + Jmp mrskip08 +mrWindToLeft +mrLWindToRight + ;Wind to left, bullet right, so vx=vx-Wind + ;Wind to right, bullet left, so vx=vx-Wind + sec + lda vx00,x + sbc Wind + sta vx00,x + lda vx01,x + sbc Wind+1 + sta vx01,x + lda vx02,x + sbc #0 + sta vx02,x + lda vx03,x + sbc #0 + sta vx03,x +mrskip08 + + ; isn't it over the screen???? + lda ytraj+2 ;attention! this checks getting out of the screen through bottom + bmi MIRVcheckX ;but not that accurately.... + lda ytraj+1 + cmp #screenheight + jcs mrEndOfFlight ; if smaller than screenheight then continue (and it will always fall down...) +MIRVcheckX + lda xtraj02,x + cmp #>screenwidth + beq MIRVcheckLowerX + bcc MIRVcheckCollision + ; it's over the screen horizontally (to the left or right) + mwa #0 xdraw + mva #screenheight-1 ydraw + jsr unPlot.unPlotAfterX + jmp mrLoopi +MIRVcheckLowerX + lda xtraj01,x + cmp #mountaintable + sta temp+1 + ; adw mountaintable --- it does not work!!!!!!!! and should! (OMC bug?) #temp + ldy #0 + lda ytraj+1 + cmp (temp),y + bcs mrHit + + + +mrSkipCollisionCheck + + ;mwa xtraj01 xdraw + lda xtraj01,x + sta xdraw + lda xtraj02,x + sta xdraw+1 + mwa ytraj+1 ydraw + + jsr unPlot.unPlotAfterX + ldx MirvMissileCounter + jne mrLoopi + jsr PlotPointer ; pointer only for bullet nr 0 + + jmp mrLoopi + +mrHit + ; we have to make unPlot over the screen (to initialise it) + ; before actual explosion + mwa #0 xdraw + mva #screenheight-1 ydraw + jsr unPlot.unPlotAfterX + ldx MirvMissileCounter + ldy #0 + ; concurrent moving xtraj+1 -> xdraw and calculating temp + clc + lda xtraj01,x + sta xdraw + adc #mountaintable + sta temp+1 + lda (temp),y + sta ydraw + sty ydraw+1 ;we know that y=0 + jsr missile ; explode .... +mrEndOfFlight + ldx MirvMissileCounter + mwa #0 xdraw + mva #screenheight-1 ydraw + jsr unPlot.unPlotAfterX + ldx MirvMissileCounter + lda #1 + sta MirvDown,x +MIRVnextBullet + ; checking if all bullets already fallen down + ldx #4 +MIRVcheckIfEnd + lda MirvDown,x + beq MIRVstillNotAll + dex + bpl MIRVcheckIfEnd + bmi MIRValreadyAll +MIRVstillNotAll + jmp mrLoopi +MIRValreadyAll + mwa xdraw xcircle ; we must store them (for a while) + mva ydraw ycircle ; xdraw and ydraw + mwa #0 xdraw + mva #screenheight-1 ydraw + ldx MirvMissileCounter + jsr unPlot.unPlotAfterX + mwa xcircle xdraw + mva ycircle ydraw + + ; we must do it manually because of the VOID pointer + + ; temporary removing tanks from the screen (otherwise they will fall down with soil) + mva TankNr tempor2 + mva #1 Erase + jsr drawtanks + mva tempor2 TankNr + mva #0 Erase + jsr SoilDown2 + mva #1 HitFlag + ;jsr drawtanks + rts +.endp + +; ------------------------------------------------- +CheckCollisionWithTank .proc +; ------------------------------------------------- + ldx #0 +CheckCollisionWithTankLoop + + lda xtankstableH,x + cmp xtraj+2 + bne Condition01 + lda xtankstableL,x + cmp xtraj+1 +Condition01 + bcs LeftFromTheTank ;add 8 double byte + clc + adc #8 + tay + lda xtankstableH,x + adc #0 + cmp xtraj+2 + bne Condition02 + cpy xtraj+1 +Condition02 + bcc RightFromTheTank + + lda ytankstable,x + cmp ytraj+1 ; check range + bcc BelowTheTank ;(ytankstable,ytankstable+3) + sbc #4 + cmp ytraj+1 + bcs OverTheTank + mva #1 HitFlag + mwa xtraj+1 XHit + mwa ytraj+1 YHit + rts ; in X there is an index of the hit tank +RightFromTheTank +LeftFromTheTank +OverTheTank +BelowTheTank + inx + cpx NumberOfPlayers + bne CheckCollisionWithTankLoop + rts +.endp +;-------------------------------------------------- +CalculateExplosionRange0 +;-------------------------------------------------- + + ;the same as below, but without summing up + ;(for the first or single explosion) + + ;zero soil fall out ranges + mwa #screenwidth RangeLeft + lda #0 + sta RangeRight + sta RangeRight+1 + mva #11 ExplosionRadius +;-------------------------------------------------- +CalculateExplosionRange .proc +;-------------------------------------------------- +;calculates total horizontal range of explosion by +;"summing up" ranges of all separate explosions + + adw xdraw ExplosionRadius WeaponRangeRight + cpw WeaponRangeRight #screenwidth-1 + bcc NotOutOfTheScreenRight + mwa #screenwidth-1 WeaponRangeRight + +NotOutOfTheScreenRight + sbw xdraw ExplosionRadius WeaponRangeLeft + lda WeaponRangeLeft+1 + bpl NotOutOfTheScreenLeft + lda #0 + sta WeaponRangeLeft + sta WeaponRangeLeft+1 +NotOutOfTheScreenLeft + + cpw RangeLeft WeaponRangeLeft + bcc CheckRangeRight + mwa WeaponRangeLeft RangeLeft +CheckRangeRight + cpw RangeRight WeaponRangeRight + bcs RangesChecked + mwa WeaponRangeRight RangeRight +RangesChecked + + rts +.endp + +;-------------------------------------------------- +DecreaseWeaponAfterShoot .proc +;-------------------------------------------------- + ldx TankNr + lda ActiveWeapon,x + jsr DecreaseWeapon + ; and here we have amount of possessed ammo for given weapon + + cmp #0 + bne AmmunitionDecreased + lda #0 ;if ammo for given weapon ends + sta ActiveWeapon,x ;then set to default weapon (baby missile) +AmmunitionDecreased + lda #99 + ldy #0 + sta (weaponPointer),y ;baby missile - always 99 pieces + + ;there is a good value in temp after jsr DecreaseWeapon + + rts +.endp + +;-------------------------------------------------- +DecreaseWeapon .proc +; in: A <-- Weapon number, TankNr +; decreases 1 bullet from a weapon(A) of tank(TankNr) +;-------------------------------------------------- + jsr HowManyBullets + sec + sbc #1 + sta (weaponPointer),y ; we have good values after HowManyBullets + rts +.endp + +;-------------------------------------------------- +HowManyBullets .proc +; in: A <-- Weapon number, TankNr +; out: A <-- How many bullets in the weapon +; how many bullets weapon of tank(TankNr) has, Result w A +;-------------------------------------------------- + tay + ldx TankNr + lda TanksWeaponsTableL,x + sta weaponPointer + lda TanksWeaponsTableH,x + sta weaponPointer+1 + + ;ldy #$35 ; parachute + lda (weaponPointer),y ; and we have number of bullets in A + rts +.endp + + + + .ENDIF + \ No newline at end of file