Lorenz Wiest did a tremendous must see job with a complete commented Star Raiders source code at the highest level possible! Highly recommended!!!
Every assembly source code should look like this. The reader can take his work as a template on how to do it the right way!
- StarRaiders.source.txt ; size: 840 KB ; incredible source code listing with assembled hex bytes!!! A must see!!!
- StarRaiders.source.asm.txt ; size: 644 KB ; incredible source code listing without assembled hex bytes, ready to use in an assembler!!! A must see!!!
Read Me from Lorenz Wiest#
Reverse engineered and fully documented STAR RAIDERS source code
STAR RAIDERS is a seminal computer game, published by Atari Inc. in 1979 as one of the first titles for the original Atari 8-bit Home Computer System (Atari 400 and 800).
During the last years, as a hobby afterhours project, I reverse engineered a complete, extensively documented assembly language source code of STAR RAIDERS. I reverse engineered the source code directly from the binary file of the ROM cartridge, finishing it in September 2015.
This repo contains both the reverse enginered assembly source code input
StarRaiders.source.asm.txt and output
StarRaiders.source.txt.
You may find this useful if you are curious about the internals of STAR RAIDERS or if you are planning to make your own, modified version.
After very positive reader feedback on the initial release of my reverse engineered source code I reviewed it again, resulting in a minor update.
Enjoy -- Lorenz
P.S. I was absolutely thrilled to learn that in October 2015
scans of the original STAR RAIDERS source code re-surfaced.
To my delight, inspection of the original source code confirmed the findings of my reverse engineered version and caused only a few trivial corrections.
Even more, the documentation of my reverse engineered version adds a substantial amount of information - from overall theory of operation down to some tricky details - to the understanding of the often sparsely commented original (quite expected for source code never meant for publication). So, if you are interested in learning how STAR RAIDERS works, my reverse engineered source code could be of help to you.
Genome Sequence#
The picture below shows the 'genome sequence' of the reverse engineered STAR RAIDERS 8 KB ROM (which I prepared for a
publication. I stacked the 8192 bytes vertically, with each byte represented by a tiny, solid horizontal line of 8 pixels. Then, I split the stack into strips of 192 bytes, arranged side-by-side. The segments of the stack are color-coded:
- Code (main game loop and subroutines) is in alternating shades of blue.
- Data (lookup tables, texts, etc.) is in alternating shades of green.
- Bitmap data (Player-Missile shapes and character set) is in alternating shades of purple and the solid line of a byte is replaced by its actual bit pattern.
STAR RAIDERS 8KB ROM Genome Sequence ; thank you so much Lorenz, that is totally incredible! :-)
ColorSheets#
DisplayListSheets#
References#
Source Code Listing#
00001 ;*******************************************************************************
00002 ;* *
00003 ;* S T A R R A I D E R S *
00004 ;* *
00005 ;* for the Atari 8-bit Home Computer System *
00006 ;* *
00007 ;* Reverse-engineered and documented assembly language source code *
00008 ;* *
00009 ;* by *
00010 ;* *
00011 ;* Lorenz Wiest *
00012 ;* *
00013 ;* (lo.wiest(at)web.de) *
00014 ;* *
00015 ;* First Release *
00016 ;* 22-SEP-2015 *
00017 ;* *
00018 ;* Last Update *
00019 ;* 15-MAR-2016 *
00020 ;* *
00021 ;* STAR RAIDERS was created by Douglas Neubauer *
00022 ;* STAR RAIDERS was published by Atari Inc. *
00023 ;* *
00024 ;*******************************************************************************
00025
00026 ; I wrote this document out of my own curiosity. When STAR RAIDERS was released
00027 ; in 1979 it became the killer app for the Atari 8-bit Home Computer System.
00028 ; Since then I have always been wondering what made it tick and how its (at that
00029 ; time) spectacular 3D graphics worked, especially the rotating star field.
00030 ; Impressed by "The Atari BASIC Source Book" I decided to reverse-engineer the
00031 ; STAR RAIDERS 8KB ROM cartridge to recreate a fully documented assembly
00032 ; language source code file. I had no access to the original source code, so the
00033 ; only way to succeed was a combination of educated guesses, trial-and-error,
00034 ; and patience. Eventually, I made it.
00035 ;
00036 ; Essential in preparing this document were three programs I wrote:
00037 ;
00038 ; (1) A 6502-cross-assembler based on the syntax of the MAC/65 assembler for the
00039 ; Atari 8-bit Home Computer System to create the binary file that I verified
00040 ; against the binary of the original ROM cartridge.
00041 ;
00042 ; (2) A text formatter to layout the source code file with its copious comment
00043 ; sections. This was a big time saver, because as the documentation grew the
00044 ; source code had to be reformatted over and over again.
00045 ;
00046 ; (3) A symbol checker to verify that the ubiquitous symbol-value pairs in the
00047 ; documentation match the corresponding symbol values produced by the
00048 ; assembler.
00049 ;
00050 ; This assembly language source code file is compatible with the MAC/65
00051 ; assembler for the Atari 8-bit Home Computer System. I was able to assemble it
00052 ; on an emulated Atari running MAC/65, producing the identical binary of the ROM
00053 ; cartridge.
00054 ;
00055 ; Your feedback is welcome! Send feedback to lo.wiest(at)web.de.
00056 ;
00057 ; Enjoy! -- Lorenz
00058
00059 ;*******************************************************************************
00060 ;* *
00061 ;* N O T A T I O N *
00062 ;* *
00063 ;*******************************************************************************
00064
00065 ; BITS AND BYTES
00066 ;
00067 ; o A "byte" consists of 8 bits. They are numbered B7..0. Bit B0 is the least
00068 ; significant bit.
00069 ;
00070 ; o A "word" consists of 16 bits. They are numbered B15..B0. Bit B0 is the
00071 ; least significant bit. A word is stored in low-order then high-order byte
00072 ; order.
00073 ;
00074 ; o The high-order byte ("high byte") of a word consists of bits B15..8 of the
00075 ; word.
00076 ;
00077 ; o The low-order byte ("low byte") of a word consists of bits B7..0 of the
00078 ; word.
00079 ;
00080 ; NUMBERS
00081 ;
00082 ; o The dollar sign ($) prefixes hexadecimal numbers.
00083 ; Example: $101 is the decimal number 257.
00084 ;
00085 ; o The percent sign (%) prefixes binary numbers.
00086 ; Example: %101 is the decimal number 5.
00087 ;
00088 ; o The asterisk (*) is a wildcard character for a single hexadecimal or
00089 ; binary digit.
00090 ; Example: $0*00 is a placeholder for the numbers $0000, $0100, ..., $0F00.
00091 ;
00092 ; o The lowercase R (r) is a wildcard character for a single random
00093 ; hexadecimal or binary digit. The random digit r is chosen by a random
00094 ; number generator.
00095 ; Example: %00r0 is a placeholder for the numbers %0000 or %0010.
00096 ;
00097 ; OPERATORS
00098 ;
00099 ; o The exclamation mark (!) is the binary OR operator.
00100 ; Example: $01!$02 is $03.
00101 ;
00102 ; o The less-than sign (<) indicates bits B7..0 of a word.
00103 ; Example: <$1234 is $34.
00104 ;
00105 ; o The greater-than sign (>) indicates bits B15..8 of a word.
00106 ; Example: >$1234 is $12.
00107 ;
00108 ; o A pair of brackets ([]) groups mathematical expressions.
00109 ; Example: [3-1]*4 is 8.
00110 ;
00111 ; ASSEMBLY LANGUAGE
00112 ;
00113 ; o The uppercase A (A) indicates the accumulator register of the 6502 CPU.
00114 ;
00115 ; o The uppercase X (X) indicates the X register of the 6502 CPU.
00116 ;
00117 ; o The uppercase Y (Y) indicates the Y register of the 6502 CPU.
00118 ;
00119 ; o The prefix uppercase L and dot (L.) indicates a local variable, a memory
00120 ; location used temporarily in a subroutine.
00121 ;
00122 ; PSEUDO-FUNCTIONS
00123 ;
00124 ; o The function ABS(<num>) returns the absolute value of <num>.
00125 ; Example: ABS(3) returns 3.
00126 ; Example: ABS(-3) returns 3.
00127 ;
00128 ; o The function RND(<num1>..<num2>) returns a random integer in
00129 ; <num1>..<num2>.
00130 ; Example: RND(3..5) returns a random number out of 3, 4, or 5.
00131 ;
00132 ; o The function MAX(<num1>,<num2>) returns the larger number of <num1> and
00133 ; <num2>.
00134 ; Example: MAX(2,4) returns 4.
00135 ;
00136 ; VECTORS
00137 ;
00138 ; o The lowercase X (x) indicates the x-axis of the 3D coordinate system.
00139 ;
00140 ; o The lowercase Y (y) indicates the y-axis of the 3D coordinate system.
00141 ;
00142 ; o The lowercase Z (z) indicates the z-axis of the 3D coordinate system.
00143 ;
00144 ; o Components of a position vector (called "coordinates") have the arbitrary
00145 ; unit <KM> ("kilometers").
00146 ;
00147 ; o Components of a velocity vector have the arbitrary unit <KM/H>
00148 ; ("kilometers per hour").
00149 ;
00150 ; o A positive component of a position vector (coordinate) in hexadecimal
00151 ; notation is written in the form +$<hexNum> <KM>. <hexNum> is an unsigned
00152 ; integer value.
00153 ; Example: The starbase is +$1000 (or 4096) <KM> ahead of our starship.
00154 ;
00155 ; o A negative component of a position vector (coordinate) in hexadecimal
00156 ; notation is written in the form -($<hexNum>) <KM>. <hexNum> is an unsigned
00157 ; integer value. To calculate the actual bit pattern of this coordinate
00158 ; value compute the two's-complement of <hexNum>. See also "ON POSITION
00159 ; VECTORS".
00160 ; Example: The starbase is -($1000) (or -4096) <KM> behind our starship.
00161 ;
00162 ; o An absolute component of a position vector (coordinate) in hexadecimal
00163 ; notation is written in the form $<hexNum> <KM>. <hexNum> is an unsigned
00164 ; integer value.
00165 ; Example: The Zylon fighter fires when it is closer than $1000 (or 4096)
00166 ; <KM>.
00167 ;
00168 ; DISPLAY LIST
00169 ;
00170 ; o The following notation is used for Display List instructions:
00171 ;
00172 ; BLK<n> = Display <n> blank video lines (<n> in 1..8)
00173 ; GR1 = Display one GRAPHICS 1 row of 20 text characters
00174 ; GR2 = Display one GRAPHICS 2 row of 20 text characters
00175 ; GR7 = Display one GRAPHICS 7 row of 160 pixels
00176 ; DLI = Trigger a Display List Interrupt
00177 ; ... @ <addr> = Point to screen memory at address <addr>
00178 ; JMP @ <addr> = Jump to next Display List instruction at address <addr>
00179 ; WAITJMP @ <addr> = Wait for vertical blank phase, then jump to next
00180 ; Display List instruction at address <addr>
00181 ;
00182 ; MISCELLANEOUS
00183 ;
00184 ; o Probabilities are written in the form <percentage>% (<number of values out
00185 ; of the possible values>:<number of possible values>).
00186 ; Example: The probability to throw the number 3 with a die is 16% (1:6).
00187 ;
00188 ; o A "game loop iteration" (or "game loop") is a single execution of the game
00189 ; loop, the main program of the game.
00190 ;
00191 ; o A "TICK" is the time span it takes to update the TV screen (1/60 s on an
00192 ; NTSC TV system, 1/50 s on a PAL TV system).
00193 ;
00194 ; o A pair of braces ({}) encloses color names.
00195 ; Example: {BLACK}
00196 ;
00197 ; o A pair of parentheses enclosing a question mark ((?)) indicates code that
00198 ; is not well understood.
00199 ;
00200 ; o A pair of parentheses enclosing an exclamation mark ((!)) indicates a
00201 ; potential bug.
00202
00203 ;*******************************************************************************
00204 ;* *
00205 ;* O V E R V I E W *
00206 ;* *
00207 ;*******************************************************************************
00208
00209 ; ON POSITION VECTORS
00210 ;
00211 ; The program uses a 3D coordinate system with the position of our starship at
00212 ; its center and the following coordinate axes:
00213 ;
00214 ; o The x-axis points to the right.
00215 ; o The y-axis points up.
00216 ; o The z-axis points in flight direction.
00217 ;
00218 ; By the way, this is called a "left-handed" coordinate system.
00219 ;
00220 ; The locations of all space objects (Zylon ships, meteors, photon torpedoes,
00221 ; starbase, transfer vessel, Hyperwarp Target Marker, stars, and explosion
00222 ; fragments) are described by a "position vector".
00223 ;
00224 ; A "position vector" is composed of an x, y, and z component. The values of the
00225 ; position vector components are called the x, y, and z "coordinates". They have
00226 ; the arbitrary unit <KM>.
00227 ;
00228 ; Each coordinate is a signed 17-bit integer number, which fits into 3 bytes:
00229 ;
00230 ; Sign Mantissa
00231 ; B16 B15...B8 B7....B0
00232 ; | | | | |
00233 ; 0000000* ******** ********
00234 ;
00235 ; o B16 contains the sign bit. Used values are:
00236 ; 1 -> Positive sign
00237 ; 0 -> Negative sign
00238 ; o B15..0 contain the coordinate value (or "mantissa") as a two's-complement
00239 ; integer number.
00240 ;
00241 ; The range of a position vector component is -65536..+65535 <KM>.
00242 ;
00243 ; Examples:
00244 ;
00245 ; 00000001 11111111 11111111 = +65535 <KM>
00246 ; 00000001 00010000 00000000 = +4096 <KM>
00247 ; 00000001 00001111 11111111 = +4095 <KM>
00248 ; 00000001 00000001 00000000 = +256 <KM>
00249 ; 00000001 00000000 11111111 = +255 <KM>
00250 ; 00000001 00000000 00010000 = +16 <KM>
00251 ; 00000001 00000000 00001111 = +15 <KM>
00252 ; 00000001 00000000 00000001 = +1 <KM>
00253 ; 00000001 00000000 00000000 = +0 <KM>
00254 ;
00255 ; 00000000 11111111 11111111 = -1 <KM>
00256 ; 00000000 11111111 11111110 = -2 <KM>
00257 ; 00000000 11111111 11110001 = -15 <KM>
00258 ; 00000000 11111111 11110000 = -16 <KM>
00259 ; 00000000 11111111 00000001 = -255 <KM>
00260 ; 00000000 11111111 00000000 = -256 <KM>
00261 ; 00000000 11110000 00000001 = -4095 <KM>
00262 ; 00000000 11110000 00000000 = -4096 <KM>
00263 ; 00000000 00000000 00000000 = -65536 <KM>
00264 ;
00265 ; The position vector for each space object is stored in 9 tables:
00266 ;
00267 ; o XPOSSIGN ($09DE..$0A0E), XPOSHI ($0A71..$0AA1), and XPOSLO ($0B04..$0B34)
00268 ; o YPOSSIGN ($0A0F..$0A3F), YPOSHI ($0AA2..$0AD2), and YPOSLO ($0B35..$0B65)
00269 ; o ZPOSSIGN ($09AD..$09DD), ZPOSHI ($0A40..$0A70), and ZPOSLO ($0AD3..$0B03)
00270 ;
00271 ; There are up to 49 space objects used in the program simultaneously, thus each
00272 ; table is 49 bytes long.
00273 ;
00274 ; o Position vectors 0..4 belong to space objects represented by PLAYERs
00275 ; (Zylon ships, meteors, photon torpedoes, starbase, transfer vessel, and
00276 ; Hyperwarp Target Marker).
00277 ; o Position vectors 5..48 belong to space objects represented by PLAYFIELD
00278 ; pixels. Position vectors 5..16 (stars, explosion fragments) are used for
00279 ; stars, position vectors 17..48 are used for explosion fragments and star
00280 ; trails.
00281 ;
00282 ; INFO: The x and y coordinates of space objects are converted and displayed by
00283 ; the THETA and PHI readouts of the Control Panel Display in "gradons". The
00284 ; z-coordinate is converted and displayed by the RANGE readout in "centrons".
00285 ; The conversion takes place in subroutine SHOWDIGITS ($B8CD) where the high
00286 ; byte of a coordinate (with values $00..$FF) is transformed with lookup table
00287 ; MAPTOBCD99 ($0EE9) into a BCD value of 00..99 in "gradons" or "centrons".
00288 ;
00289 ;
00290 ; ON VELOCITY VECTORS
00291 ;
00292 ; The velocities of all space objects are described by a "velocity vector". The
00293 ; velocity vector is relative to our starship.
00294 ;
00295 ; A "velocity vector" is composed of an x, y, and z component. The values of the
00296 ; velocity vector components are called the x, y, and z "velocities". They have
00297 ; the arbitrary unit <KM/H>.
00298 ;
00299 ; Each velocity vector component is an 8-bit integer number, which fits into 1
00300 ; byte:
00301 ;
00302 ; B7 Sign
00303 ; |
00304 ; |B6...B0 Mantissa
00305 ; || |
00306 ; ********
00307 ;
00308 ; o B7 contains the sign bit. Used values are:
00309 ; 0 -> Positive sign, movement along the positive coordinate axis
00310 ; (x-velocity: right, y-velocity: up, z-velocity: in flight direction)
00311 ; 1 -> Negative sign, movement along the negative coordinate axis
00312 ; (x-velocity: left, y-velocity: down, z-velocity: in reverse flight
00313 ; direction)
00314 ; o B6..B0 contain the velocity value (or "mantissa"). It is an unsigned
00315 ; number.
00316 ;
00317 ; The range of a velocity vector component is -127..+127 <KM/H>.
00318 ;
00319 ; Examples:
00320 ;
00321 ; 01111111 = +127 <KM/H>
00322 ; 00010000 = +16 <KM/H>
00323 ; 00001111 = +15 <KM/H>
00324 ; 00000001 = +1 <KM/H>
00325 ; 00000000 = +0 <KM/H>
00326 ;
00327 ; 10000000 = -0 <KM/H>
00328 ; 10000001 = -1 <KM/H>
00329 ; 10001111 = +15 <KM/H>
00330 ; 10010000 = +16 <KM/H>
00331 ; 11111111 = -127 <KM/H>
00332 ;
00333 ; The velocity vector for each space object stored in 3 tables:
00334 ;
00335 ; o XVEL ($0B97..$0BC7)
00336 ; o YVEL ($0BC8..$0BF8)
00337 ; o ZVEL ($0B66..$0B96)
00338 ;
00339 ; There are up to 49 space objects used in the program simultaneously, thus each
00340 ; table is 49 bytes long.
00341 ;
00342 ; o Velocity vectors 0..4 belong to space objects represented by PLAYERs
00343 ; (Zylon ships, meteors, photon torpedoes, starbase, transfer vessel, and
00344 ; Hyperwarp Target Marker).
00345 ; o Velocity vectors 5..48 belong to space objects represented by PLAYFIELD
00346 ; pixels. Velocity vectors 5..16 are used for stars, velocity vectors 17..48
00347 ; are used for explosion fragments and star trails.
00348 ;
00349 ; INFO: The velocity of our starship is converted and displayed by the VELOCITY
00350 ; readout of the Control Panel Display in "metrons per second" units. The
00351 ; conversion takes place in subroutine SHOWDIGITS ($B8CD) where our starship's
00352 ; velocity VELOCITYL ($70) (with values $00..$FF) is transformed with lookup
00353 ; table MAPTOBCD99 ($0EE9) into a BCD value of 00..99 in "metrons per second".
00354
00355 ;*******************************************************************************
00356 ;* *
00357 ;* M E M O R Y M A P *
00358 ;* *
00359 ;*******************************************************************************
00360 ;
00361 ; The following variables are not changed by a SYSTEM RESET:
00362 ;
00363 ; $62 MISSIONLEVEL
00364 ;
00365 ; Mission level. Used values are:
00366 ; $00 -> NOVICE mission
00367 ; $01 -> PILOT mission
00368 ; $02 -> WARRIOR mission
00369 ; $03 -> COMMANDER mission
00370 ;
00371 ; $63 FKEYCODE
00372 ;
00373 ; Function key code. Used values are:
00374 ; $00 -> No function key pressed
00375 ; $01 -> START function key pressed
00376 ; $02 -> SELECT function key pressed
00377 ;
00378 ; $64 ISDEMOMODE
00379 ;
00380 ; Indicates whether the program is in game or demo mode. Used values
00381 ; are:
00382 ; $00 -> Game mode
00383 ; $FF -> Demo mode
00384 ;
00385 ; $65 NEWTITLEPHR
00386 ;
00387 ; New title phrase offset for the text in the title line. The new title
00388 ; phrase is not immediately displayed in the title line but only after
00389 ; the display time of the currently displayed title phrase has expired.
00390 ; Thus, setting a value to NEWTITLEPHR ($65) "enqueues" the display of
00391 ; new title phrase. Used values are:
00392 ; $00..$7B -> Title phrase offset into PHRASETAB ($BBAA)
00393 ; $FF -> Hide title line
00394 ;
00395 ; See also TITLEPHR ($D1).
00396 ;
00397 ; $66 IDLECNTHI
00398 ;
00399 ; Idle counter (high byte). Forms a 16-bit counter together with
00400 ; IDLECNTLO ($77), which is incremented during the execution of the
00401 ; Vertical Blank Interrupt handler VBIHNDLR ($A6D1). IDLECNTHI ($66) is
00402 ; reset to 0 when the joystick trigger or a keyboard key has been
00403 ; pressed, or to 1..3 when a function key has been pressed. When
00404 ; IDLECNTHI ($66) reaches a value of 128 (after about 10 min idle time)
00405 ; the program enters demo mode.
00406 ;
00407 ; The following variables are set to 0 after a SYSTEM RESET:
00408 ;
00409 ; $67 ISVBISYNC
00410 ;
00411 ; Indicates whether the Vertical Blank Interrupt handler VBIHNDLR
00412 ; ($A6D1) is executed. Used to synchronize the execution of a new game
00413 ; loop iteration in GAMELOOP ($A1F3) with the vertical blank phase.
00414 ; Used values are:
00415 ; $00 -> Halt execution at start of game loop and wait for VBI
00416 ; $FF -> Continue execution of game loop
00417 ;
00418 ; $68..$69 MEMPTR
00419 ;
00420 ; A 16-bit memory pointer.
00421 ;
00422 ; Also used as a local variable.
00423 ;
00424 ; $6A..$6B DIVIDEND
00425 ;
00426 ; A 16-bit dividend value passed in GAMELOOP ($A1F3) to subroutine
00427 ; PROJECTION ($AA21) to calculate a division.
00428 ;
00429 ; Also used as a local variable.
00430 ;
00431 ; $6C Used as a local variable.
00432 ;
00433 ; $6D JOYSTICKDELTA
00434 ;
00435 ; Used to pass joystick directions from GAMELOOP ($A1F3) to subroutine
00436 ; ROTATE ($B69B). Used values are:
00437 ; $01 -> Joystick pressed right or up
00438 ; $00 -> Joystick centered
00439 ; $FF -> Joystick pressed left or down
00440 ;
00441 ; Also used as a local variable.
00442 ;
00443 ; $6E Used as a local variable.
00444 ;
00445 ; $70 VELOCITYLO
00446 ;
00447 ; Our starship's current velocity (low byte) in <KM/H>. Forms a 16-bit
00448 ; value together with VELOCITYHI ($C1). In subroutine UPDPANEL ($B804),
00449 ; VELOCITYLO ($70) is mapped to a BCD-value in 00..99 and displayed by
00450 ; the VELOCITY readout of the Control Panel Display. See also
00451 ; NEWVELOCITY ($71).
00452 ;
00453 ; $71 NEWVELOCITY
00454 ;
00455 ; Our starship's new velocity (low byte) in <KM/H>. It is set by
00456 ; pressing one of the speed keys '0'..'9'. A pressed speed key is
00457 ; mapped to the new velocity value with VELOCITYTAB ($BAB4).
00458 ;
00459 ; $72 COUNT8
00460 ;
00461 ; Wrap-around counter. Counts from 0..7, then starts over at 0. It is
00462 ; incremented every game loop iteration. It is used to change the
00463 ; brightness of stars and explosion fragments more randomly in GAMELOOP
00464 ; ($A1F3) and to slow down the movement of the hyperwarp markers of the
00465 ; Galactic Chart in subroutine SELECTWARP ($B162).
00466 ;
00467 ; $73 EXPLLIFE
00468 ;
00469 ; Explosion lifetime. It is decremented every game loop iteration. Used
00470 ; values are:
00471 ; $00 -> Explosion is over
00472 ; < $18 -> Number of explosion fragment space objects is decremented
00473 ; < $70 -> HITBADNESS ($8A) is reset
00474 ; $80 -> Initial value at start of explosion
00475 ;
00476 ; $74 CLOCKTIM
00477 ;
00478 ; Star date clock delay timer. Counts down from 40 to 0. It is
00479 ; decremented every game loop iteration. When the timer falls below 0
00480 ; the last digit of the star date of the Galactic Chart Panel Display
00481 ; is increased and the timer is reset to a value of 40.
00482 ;
00483 ; $75 DOCKSTATE
00484 ;
00485 ; State of docking operation. Used values are:
00486 ; $00 -> NOT DOCKED
00487 ; $01 -> TRANSFER COMPLETE
00488 ; $81 -> RETURN TRANSFER VESSEL
00489 ; $FF -> ORBIT ESTABLISHED
00490 ;
00491 ; $76 COUNT256
00492 ;
00493 ; Wrap-around counter. Counts from 0..255, then starts over at 0. It is
00494 ; incremented every game loop iteration. It is used to make the
00495 ; starbase pulsate in brightness in GAMELOOP ($A1F3) and to decide on
00496 ; the creation of a meteor in subroutine MANEUVER ($AA79).
00497 ;
00498 ; $77 IDLECNTLO
00499 ;
00500 ; Idle counter (low byte). Forms a 16-bit counter together with
00501 ; IDLECNTHI ($66), which is incremented during the execution of the
00502 ; Vertical Blank Interrupt handler VBIHNDLR ($A6D1).
00503 ;
00504 ; NOTE: This variable is never properly initialized except at initial
00505 ; cartridge startup (cold start).
00506 ;
00507 ; $78 ZYLONUNITTIM
00508 ;
00509 ; Zylon unit movement timer. This delay timer triggers movement of
00510 ; Zylon units on the Galactic Chart. At the start of the game, the
00511 ; timer is initialized to a value of 100. It is decremented every 40
00512 ; game loop iterations. When the timer falls below 0 the Zylon units
00513 ; move on the Galactic Chart and the timer value is reset to 49. If a
00514 ; starbase is surrounded the timer is reset to 99 to buy you some extra
00515 ; time to destroy one of the surrounding Zylon units.
00516 ;
00517 ; $79 MAXSPCOBJIND
00518 ;
00519 ; Maximum index of used space objects in the current game loop
00520 ; iteration. Frequently used values are:
00521 ; $10 -> During regular cruise (5 PLAYER space objects + 12 PLAYFIELD
00522 ; space objects (stars))
00523 ; $30 -> During explosion or hyperwarp (5 PLAYER space objects + 12
00524 ; PLAYFIELD space objects (stars) + 32 PLAYFIELD space objects
00525 ; (explosion fragments or stars of star trails))
00526 ;
00527 ; $7A OLDMAXSPCOBJIND
00528 ;
00529 ; Maximum index of used space objects in the previous game loop
00530 ; iteration. Frequently used values are:
00531 ; $10 -> During regular cruise (5 PLAYER space objects + 12 PLAYFIELD
00532 ; space objects (stars))
00533 ; $30 -> During explosion or hyperwarp (5 PLAYER space objects + 12
00534 ; PLAYFIELD space objects (stars) + 32 PLAYFIELD space objects
00535 ; (explosion fragments or stars of star trails))
00536 ;
00537 ; $7B ISSTARBASESECT
00538 ;
00539 ; Indicates whether a starbase is in this sector. Used values are:
00540 ; $00 -> Sector contains no starbase
00541 ; $FF -> Sector contains starbase
00542 ;
00543 ; $7C ISTRACKCOMPON
00544 ;
00545 ; Indicates whether the Tracking Computer is on or off. Used values
00546 ; are:
00547 ; $00 -> Tracking Computer is off
00548 ; $FF -> Tracking Computer is on
00549 ;
00550 ; $7D DRAINSHIELDS
00551 ;
00552 ; Energy drain rate of the Shields per game loop iteration in energy
00553 ; subunits. See also subroutine UPDPANEL ($B804). Used values are:
00554 ; $00 -> Shields are off
00555 ; $08 -> Shields are on
00556 ;
00557 ; $7E DRAINATTCOMP
00558 ;
00559 ; Energy drain rate of the Attack Computer per game loop iteration in
00560 ; energy subunits. See also subroutine UPDPANEL ($B804). Used values
00561 ; are:
00562 ; $00 -> Attack Computer off
00563 ; $02 -> Attack Computer on
00564 ;
00565 ; $7F ENERGYCNT
00566 ;
00567 ; Running counter of consumed energy subunits (256 energy subunits = 1
00568 ; energy unit displayed by the 4-digit ENERGY readout of the Control
00569 ; Panel Display). Forms an invisible fractional or "decimals" part of
00570 ; the 4-digit ENERGY readout of the Control Panel Display. See also
00571 ; subroutine UPDPANEL ($B804).
00572 ;
00573 ; $80 DRAINENGINES
00574 ;
00575 ; Energy drain rate of our starship's Engines per game loop iteration
00576 ; in energy subunits (256 energy subunits = 1 energy unit displayed by
00577 ; the 4-digit ENERGY readout of the Control Panel Display). Values are
00578 ; picked from table DRAINRATETAB ($BAD3). See also subroutine UPDPANEL
00579 ; ($B804).
00580 ;
00581 ; $81 SHIELDSCOLOR
00582 ;
00583 ; Shields color. Used values are:
00584 ; $00 -> {BLACK} (Shields are off)
00585 ; $A0 -> {DARK GREEN} (Shields are on)
00586 ;
00587 ; $82 PL3HIT
00588 ;
00589 ; Collision register of PLAYER3 (usually our starship's photon torpedo
00590 ; 0) with other PLAYERs. Used values are:
00591 ; $00 -> No collision
00592 ; > $00 -> PLAYER3 has collided with another PLAYER space object. See
00593 ; subroutine COLLISION ($AF3D) for details which PLAYER has
00594 ; been hit by PLAYER3.
00595 ;
00596 ; $83 PL4HIT
00597 ;
00598 ; Collision register of PLAYER4 (usually our starship's photon torpedo
00599 ; 1) with other PLAYERs. Used values are:
00600 ; $00 -> No collision
00601 ; > $00 -> PLAYER4 has collided with another PLAYER space object. See
00602 ; subroutine COLLISION ($AF3D) for details which PLAYER has
00603 ; been hit by PLAYER4.
00604 ;
00605 ; $84 OLDTRIG0
00606 ;
00607 ; Joystick trigger state. Used values are:
00608 ; $00 -> Joystick trigger was pressed
00609 ; $01 -> Joystick trigger was not pressed
00610 ; $AA -> Joystick trigger was "virtually" pressed (will launch
00611 ; another of our starship's photon torpedoes, see subroutine
00612 ; TRIGGER ($AE29).
00613 ;
00614 ; $86 ISTRACKING
00615 ;
00616 ; Indicates whether one of our starship's photon torpedoes is currently
00617 ; tracking (homing in on) the target space object. Used values are:
00618 ; $00 -> No target space object tracked. Our starship's photon
00619 ; torpedoes will fly just straight ahead.
00620 ; > $00 -> Tracking a target space object. Our starship's photon
00621 ; torpedoes will home in on the tracked space object.
00622 ;
00623 ; $87 BARRELNR
00624 ;
00625 ; Barrel from which our starship's next photon torpedo will be
00626 ; launched. Used values are:
00627 ; $00 -> Left barrel
00628 ; $01 -> Right barrel
00629 ;
00630 ; $88 LOCKONLIFE
00631 ;
00632 ; Lifetime of target lock-on. A target remains in lock-on while
00633 ; LOCKONLIFE ($88) counts down from 12 to 0. It is decremented every
00634 ; game loop iteration.
00635 ;
00636 ; $89 PLTRACKED
00637 ;
00638 ; Index of currently tracked PLAYER. It is copied in subroutine TRIGGER
00639 ; ($AE29) from TRACKDIGIT ($095C). Used values are:
00640 ; $00 -> Track Zylon ship 0
00641 ; $01 -> Track Zylon ship 1
00642 ; $02 -> Track starbase during docking operations
00643 ; $03 -> Track Hyperwarp Target Marker during hyperwarp
00644 ;
00645 ; $8A HITBADNESS
00646 ;
00647 ; Severeness of a Zylon photon torpedo hit. Used values are:
00648 ; $00 -> NO HIT
00649 ; $7F -> SHIELDS HIT
00650 ; $FF -> STARSHIP DESTROYED
00651 ;
00652 ; $8B REDALERTLIFE
00653 ;
00654 ; Lifetime of red alert. It decreases from 255 to 0. It is decremented
00655 ; every game loop iteration.
00656 ;
00657 ; $8C WARPDEPRROW
00658 ;
00659 ; Departure hyperwarp marker row number on the Galactic Chart. It is
00660 ; given in Player/Missile pixels relative to the top Galactic Chart
00661 ; border. It is initialized to a value of $47 (vertical center of
00662 ; Galactic Chart). Divide this value by 16 to get the departure sector
00663 ; row number. Used values are: $00..$7F.
00664 ;
00665 ; $8D WARPDEPRCOLUMN
00666 ;
00667 ; Departure hyperwarp marker column number on the Galactic Chart. It is
00668 ; given in Player/Missile pixels relative to the left Galactic Chart
00669 ; border and initialized to a value of $43 (horizontal center of
00670 ; Galactic Chart). Divide this value by 8 to get the departure sector
00671 ; column number. Used values are: $00..$7F.
00672 ;
00673 ; $8E WARPARRVROW
00674 ;
00675 ; Arrival hyperwarp marker row number on the Galactic Chart in
00676 ; Player/Missile pixels relative to top Galactic Chart border. It is
00677 ; initialized to a value of $47 (vertical center of Galactic Chart).
00678 ; Divide this value by 16 to get the arrival sector row number. Used
00679 ; values are: $00..$7F.
00680 ;
00681 ; $8F WARPARRVCOLUMN
00682 ;
00683 ; Arrival hyperwarp marker column number on the Galactic Chart in
00684 ; Player/Missile pixels relative to left Galactic Chart border. It is
00685 ; initialized to a value of $43 (horizontal center of Galactic Chart).
00686 ; Divide this value by 8 to get the arrival sector column number. Used
00687 ; values are: $00..$7F.
00688 ;
00689 ; $90 CURRSECTOR
00690 ;
00691 ; Galactic Chart sector of the current location of our starship. At the
00692 ; start of the game it is initialized to a value of $48. Used values
00693 ; are: $00..$7F with, for example,
00694 ; $00 -> NORTHWEST corner sector
00695 ; $0F -> NORTHEAST corner sector
00696 ; $70 -> SOUTHWEST corner sector
00697 ; $7F -> SOUTHWEST corner sector
00698 ;
00699 ; See also ARRVSECTOR ($92).
00700 ;
00701 ; $91 WARPENERGY
00702 ;
00703 ; Energy required to hyperwarp between the departure and arrival
00704 ; hyperwarp marker locations on the Galactic Chart divided by 10.
00705 ; Values are picked from table WARPENERGYTAB ($BADD). Multiply this
00706 ; value by 10 to get the actual value in energy units displayed by the
00707 ; Galactic Chart Panel Display.
00708 ;
00709 ; $92 ARRVSECTOR
00710 ;
00711 ; Galactic Chart arrival sector of our starship after hyperwarp. Used
00712 ; values are: $00..$7F with, for example,
00713 ; $00 -> NORTHWEST corner sector
00714 ; $0F -> NORTHEAST corner sector
00715 ; $70 -> SOUTHWEST corner sector
00716 ; $7F -> SOUTHWEST corner sector
00717 ;
00718 ; See also CURRSECTOR ($90).
00719 ;
00720 ; $93 HUNTSECTOR
00721 ;
00722 ; Galactic Chart sector of the starbase toward which the Zylon units
00723 ; are currently moving. Used values are: $00..$7F with, for example,
00724 ; $00 -> NORTHWEST corner sector
00725 ; $0F -> NORTHEAST corner sector
00726 ; $70 -> SOUTHWEST corner sector
00727 ; $7F -> SOUTHWEST corner sector
00728 ;
00729 ; $94 HUNTSECTCOLUMN
00730 ;
00731 ; Galactic Chart sector column number of the starbase toward which the
00732 ; Zylon units are currently moving. Used values are: 0..15.
00733 ;
00734 ; $95 HUNTSECTROW
00735 ;
00736 ; Galactic Chart sector row number of the starbase toward which the
00737 ; Zylon units are currently moving. Used values are: 0..7.
00738 ;
00739 ; $96..$9E NEWZYLONDIST
00740 ;
00741 ; Table of distances between a Zylon unit and the hunted starbase when
00742 ; the Zylon unit is tentatively moved in one of the 9 possible
00743 ; directions NORTH, NORTHWEST, WEST, SOUTHWEST, SOUTH, SOUTHEAST, EAST,
00744 ; NORTHEAST, CENTER. Used to decide into which sector the Zylon unit
00745 ; should move.
00746 ;
00747 ; $9E OLDZYLONDIST
00748 ;
00749 ; Current distance between the Zylon unit and the hunted starbase.
00750 ;
00751 ; $9F HUNTTIM
00752 ;
00753 ; Delay timer for Zylon units to decide on which starbase to hunt. It
00754 ; counts down from 7. It is decremented every game loop iteration. When
00755 ; the timer falls below 0 the Zylon units re-decide toward which
00756 ; starbase to move.
00757 ;
00758 ; $A0 BLIPCOLUMN
00759 ;
00760 ; Top-left screen pixel column number of blip shape displayed in the
00761 ; Attack Computer Display. Used in subroutine UPDATTCOMP ($A7BF). Used
00762 ; values are: 120..142.
00763 ;
00764 ; $A1 BLIPROW
00765 ;
00766 ; Top-left screen pixel row number of blip shape displayed in the
00767 ; Attack Computer Display. Used in subroutine UPDATTCOMP ($A7BF). Used
00768 ; values are: 71..81.
00769 ;
00770 ; $A2 BLIPCYCLECNT
00771 ;
00772 ; Blip cycle counter. It controls drawing the blip shape in the Attack
00773 ; Computer Display. Its value is incremented every game loop iteration.
00774 ; Used in subroutine UPDATTCOMP ($A7BF). Used values are:
00775 ; $00..$04 -> Draw 0..4th row of blip shape
00776 ; $05..$09 -> Do not draw blip shape (delay)
00777 ; $0A -> Recalculate blip shape position, erase Attack Computer
00778 ; Display
00779 ;
00780 ; $A3 ISINLOCKON
00781 ;
00782 ; Indicates whether the tracked space object is currently in full
00783 ; lock-on (horizontally and vertically centered as well as in range) in
00784 ; the Attack Computer Display. If so, all lock-on markers show up on
00785 ; the Attack Computer Display and our starship's launched photon
00786 ; torpedoes will home in on the tracked space object. Used values are:
00787 ; $00 -> Not in lock-on
00788 ; $A0 -> In lock-on
00789 ;
00790 ; $A4 DIRLEN
00791 ;
00792 ; Used to pass the direction and length of a single line to be drawn in
00793 ; the PLAYFIELD. Used in subroutines DRAWLINES ($A76F), DRAWLINE
00794 ; ($A782), and UPDATTCOMP ($A7BF). Used values are:
00795 ; Bit B7 = 0 -> Draw right
00796 ; Bit B7 = 1 -> Draw down
00797 ; Bits B6..0 -> Length of line in pixels.
00798 ;
00799 ; See also PENROW ($A5) and PENCOLUMN ($A6).
00800 ;
00801 ; $A5 PENROW
00802 ;
00803 ; Used to pass the start screen pixel row number of the line to be
00804 ; drawn in the PLAYFIELD. Used in subroutines DRAWLINES ($A76F),
00805 ; DRAWLINE ($A782), and UPDATTCOMP ($A7BF).
00806 ;
00807 ; $A6 PENCOLUMN
00808 ;
00809 ; Used to pass the start screen pixel column number of the line to be
00810 ; drawn in the PLAYFIELD. Used in subroutines DRAWLINES ($A76F),
00811 ; DRAWLINE ($A782), and UPDATTCOMP ($A7BF).
00812 ;
00813 ; $A7 CTRLDZYLON
00814 ;
00815 ; Index of Zylon ship currently controlled by the program. Used in
00816 ; subroutine MANEUVER ($AA79). The value is toggled every other game
00817 ; loop iteration. Used values are:
00818 ; $00 -> Control Zylon ship 0.
00819 ; $01 -> Control Zylon ship 1.
00820 ;
00821 ; $A8 ZYLONFLPAT0
00822 ;
00823 ; Flight pattern of Zylon ship 0. Used in subroutine MANEUVER ($AA79).
00824 ; Used values are:
00825 ; $00 -> Attack flight pattern "0"
00826 ; $01 -> Flight pattern "1"
00827 ; $04 -> Flight pattern "4"
00828 ;
00829 ; $A9 ZYLONFLPAT1
00830 ;
00831 ; Flight pattern of Zylon ship 1. Compare ZYLONFLPAT0 ($A8).
00832 ;
00833 ; $AA MILESTTIM0
00834 ;
00835 ; Delay timer of the milestone velocity indices of Zylon ship 0. Used
00836 ; in subroutine MANEUVER ($AA79).
00837 ;
00838 ; When Zylon ship 0 is active, this value is decremented every game
00839 ; loop iteration. If it falls below 0 then the milestone velocity
00840 ; indices of Zylon ship 0 are recalculated. When Zylon ship 0 is
00841 ; controlled by the computer for the first time, the timer is set to an
00842 ; initial value of 1, later to an initial value of 120.
00843 ;
00844 ; $AB MILESTTIM1
00845 ;
00846 ; Delay timer of the milestone velocity index vector of Zylon ship 1.
00847 ; Compare MILESTTIM0 ($AA).
00848 ;
00849 ; $AC MILESTVELINDZ0
00850 ;
00851 ; Milestone z-velocity index of Zylon ship 0. Used in subroutine
00852 ; MANEUVER ($AA79). The current z-velocity index of Zylon ship 0
00853 ; ZYLONVELINDZ0 ($B2) is compared with this index and gradually
00854 ; adjusted to it. Used values are: 0..15.
00855 ;
00856 ; $AD MILESTVELINDZ1
00857 ;
00858 ; Milestone z-velocity index of Zylon ship 1. Compare MILESTVELINDZ0
00859 ; ($AC).
00860 ;
00861 ; $AE MILESTVELINDX0
00862 ;
00863 ; Milestone x-velocity index of Zylon ship 0. Used in subroutine
00864 ; MANEUVER ($AA79). The current x-velocity index of Zylon ship 0
00865 ; ZYLONVELINDX0 ($B4) is compared with this index and gradually
00866 ; adjusted to it. Used values are: 0..15.
00867 ;
00868 ; $AF MILESTVELINDX1
00869 ;
00870 ; Milestone x-velocity index of Zylon ship 1. Compare MILESTVELINDX0
00871 ; ($AE).
00872 ;
00873 ; $B0 MILESTVELINDY0
00874 ;
00875 ; Milestone y-velocity index of Zylon ship 0. Used in subroutine
00876 ; MANEUVER ($AA79). The current y-velocity index of Zylon ship 0
00877 ; ZYLONVELINDY0 ($B6) is compared with this index and gradually
00878 ; adjusted to it. Used values are: 0..15.
00879 ;
00880 ; $B1 MILESTVELINDY1
00881 ;
00882 ; Milestone y-velocity index of Zylon ship 1. Compare MILESTVELINDY0
00883 ; ($B0).
00884 ;
00885 ; $B2 ZYLONVELINDZ0
00886 ;
00887 ; Current z-velocity index of Zylon ship 0. Used in subroutine MANEUVER
00888 ; ($AA79). It indexes velocity values in ZYLONVELTAB ($BF99). Used
00889 ; values are: 0..15.
00890 ;
00891 ; $B3 ZYLONVELINDZ1
00892 ;
00893 ; Current z-velocity index of Zylon ship 1. Compare ZYLONVELINDZ0
00894 ; ($B2).
00895 ;
00896 ; $B4 ZYLONVELINDX0
00897 ;
00898 ; Current x-velocity index of Zylon ship 0. Compare ZYLONVELINDZ0
00899 ; ($B2).
00900 ;
00901 ; $B5 ZYLONVELINDX1
00902 ;
00903 ; Current x-velocity index of Zylon ship 1. Compare ZYLONVELINDZ0
00904 ; ($B2).
00905 ;
00906 ; $B6 ZYLONVELINDY0
00907 ;
00908 ; Current y-velocity index of Zylon ship 0. Compare ZYLONVELINDZ0
00909 ; ($B2).
00910 ;
00911 ; $B7 ZYLONVELINDY1
00912 ;
00913 ; Current y-velocity index of Zylon ship 1. Compare ZYLONVELINDZ0
00914 ; ($B2).
00915 ;
00916 ; $B8 ISBACKATTACK0
00917 ;
00918 ; Indicates whether Zylon ship 0 will attack our starship from the
00919 ; back. Used in subroutine MANEUVER ($AA79). Used values are:
00920 ; $00 -> Zylon ship 0 attacks from the front of our starship
00921 ; $01 -> Zylon ship 0 attacks from the front and back of our starship
00922 ;
00923 ; $B9 ISBACKATTACK1
00924 ;
00925 ; Indicates whether Zylon ship 1 will attack our starship from the
00926 ; back. Compare ISBACKATTACK0 ($B8).
00927 ;
00928 ; $BA ZYLONTIMX0
00929 ;
00930 ; Delay timer of the x-velocity index of Zylon ship 0. Used in
00931 ; subroutine MANEUVER ($AA79). It is decremented every game loop
00932 ; iteration. When the timer value falls below 0 the current velocity
00933 ; index ZYLONVELINDX0 ($B4) is adjusted depending on the current
00934 ; joystick position. The new timer value is set depending on the
00935 ; resulting new x-velocity index. Used values are: 0, 2, 4, ..., 14.
00936 ;
00937 ; $BB ZYLONTIMX1
00938 ;
00939 ; Delay timer of x-velocity index of Zylon ship 1. Compare ZYLONTIMX0
00940 ; ($BA).
00941 ;
00942 ; $BC ZYLONTIMY0
00943 ;
00944 ; Delay timer of y-velocity index of Zylon ship 0. Compare ZYLONTIMX0
00945 ; ($BA).
00946 ;
00947 ; $BD ZYLONTIMY1
00948 ;
00949 ; Delay timer of y-velocity index of Zylon ship 1. Compare ZYLONTIMX0
00950 ; ($BA).
00951 ;
00952 ; $BE TORPEDODELAY
00953 ;
00954 ; After a Zylon photon torpedo has hit our starship this delay timer is
00955 ; initialized to a value of 2. It is decremented every game loop
00956 ; iteration and so delays the launch of the next Zylon photon torpedo
00957 ; for 2 game loop iterations.
00958 ;
00959 ; $BF ZYLONATTACKER
00960 ;
00961 ; Index of the Zylon ship that launched the Zylon photon torpedo. It is
00962 ; used in GAMELOOP ($A1F3) to override the current tracking computer
00963 ; settings in order to track this Zylon ship first. Used values are:
00964 ; $00 -> Zylon photon torpedo was launched by Zylon ship 0
00965 ; $01 -> Zylon photon torpedo was launched by Zylon ship 1
00966 ;
00967 ; $C0 WARPSTATE
00968 ;
00969 ; Hyperwarp state. Used values are:
00970 ; $00 -> Hyperwarp not engaged
00971 ; $7F -> Hyperwarp engaged
00972 ; $FF -> In hyperspace
00973 ;
00974 ; $C1 VELOCITYHI
00975 ;
00976 ; Our starship's velocity (high byte) in <KM/H>. Used values are:
00977 ; $00 -> Not in hyperspace (regular cruise or accelerating to
00978 ; hyperspace velocity)
00979 ; $01 -> Hyperspace velocity
00980 ;
00981 ; See also VELOCITYLO ($70).
00982 ;
00983 ; $C2 TRAILDELAY
00984 ;
00985 ; Delay timer to create the next star trail. Its value is decremented
00986 ; from 3 to 0 every game loop iteration during the hyperwarp STAR TRAIL
00987 ; PHASE in subroutine INITTRAIL ($A9B4).
00988 ;
00989 ; $C3 TRAILIND
00990 ;
00991 ; Position vector index of the star trail's first star. Used in
00992 ; subroutine INITTRAIL ($A9B4) to initialize a star trail, which is
00993 ; then displayed during the hyperwarp STAR TRAIL PHASE. Used values
00994 ; are: 17..48 in wrap-around fashion.
00995 ;
00996 ; $C4 WARPTEMPCOLUMN
00997 ;
00998 ; Temporary arrival column number of our starship on the Galactic Chart
00999 ; at the begin of hyperspace. It is given in Player/Missile pixels
01000 ; relative to the left Galactic Chart border. Divide this value by 8 to
01001 ; get the sector column number. Used values are: $00..$7F. See also
01002 ; WARPARRVCOLUMN ($8F).
01003 ;
01004 ; $C5 WARPTEMPROW
01005 ;
01006 ; Temporary arrival row number of our starship on the Galactic Chart at
01007 ; the begin of hyperspace. It is given in Player/Missile pixels
01008 ; relative to top Galactic Chart border. Divide this value by 16 to get
01009 ; the sector row number. Used values are: $00..$7F. See also
01010 ; WARPARRVROW ($8E).
01011 ;
01012 ; $C6 VEERMASK
01013 ;
01014 ; Limits the veer-off velocity of the Hyperwarp Target Marker during
01015 ; the hyperwarp ACCELERATION PHASE in subroutine HYPERWARP ($A89B).
01016 ; Values are picked from table VEERMASKTAB ($BED7).
01017 ;
01018 ; Also used as a local variable.
01019 ;
01020 ; $C7 VICINITYMASK
01021 ;
01022 ; Mask to confine space objects' position vector components
01023 ; (coordinates) in a sector into a certain interval around our starship
01024 ; after its arrival from hyperspace. Values are picked from table
01025 ; VICINITYMASKTAB ($BFB3).
01026 ;
01027 ; $C8 JOYSTICKX
01028 ;
01029 ; Horizontal joystick direction. Values are picked from table
01030 ; STICKINCTAB ($BAF5). Used values are:
01031 ; $01 -> Right
01032 ; $00 -> Centered
01033 ; $FF -> Left
01034 ;
01035 ; $C9 JOYSTICKY
01036 ;
01037 ; Vertical joystick direction. Values are picked from table STICKINCTAB
01038 ; ($BAF5). Used values are:
01039 ; $01 -> Up
01040 ; $00 -> Centered
01041 ; $FF -> Down
01042 ;
01043 ; $CA KEYCODE
01044 ;
01045 ; Hardware keyboard code of the pressed key on the keyboard. Shift and
01046 ; Control key bits B7..6 are always set.
01047 ;
01048 ; $CB..$CC SCORE
01049 ;
01050 ; Internal 16-bit score of the game in low byte-high byte order
01051 ;
01052 ; $CD SCOREDRANKIND
01053 ;
01054 ; Scored Rank Index. It is translated with table RANKTAB ($BEE9) to a
01055 ; title phrase offset pointing to the rank string. Used values are:
01056 ; $00 -> GALACTIC COOK
01057 ; $01 -> GARBAGE SCOW CAPTAIN
01058 ; $02 -> GARBAGE SCOW CAPTAIN
01059 ; $03 -> ROOKIE
01060 ; $04 -> ROOKIE
01061 ; $05 -> NOVICE
01062 ; $06 -> NOVICE
01063 ; $07 -> ENSIGN
01064 ; $08 -> ENSIGN
01065 ; $09 -> PILOT
01066 ; $0A -> PILOT
01067 ; $0B -> ACE
01068 ; $0C -> LIEUTENANT
01069 ; $0D -> WARRIOR
01070 ; $0E -> CAPTAIN
01071 ; $0F -> COMMANDER
01072 ; $10 -> COMMANDER
01073 ; $11 -> STAR COMMANDER
01074 ; $12 -> STAR COMMANDER
01075 ;
01076 ; $CE SCOREDCLASSIND
01077 ;
01078 ; Scored Class Index. It is translated into a class number with table
01079 ; CLASSTAB ($BEFC). Used values are:
01080 ; $00 -> Class 5
01081 ; $01 -> Class 5
01082 ; $02 -> Class 5
01083 ; $03 -> Class 4
01084 ; $04 -> Class 4
01085 ; $05 -> Class 4
01086 ; $06 -> Class 4
01087 ; $07 -> Class 3
01088 ; $08 -> Class 3
01089 ; $09 -> Class 3
01090 ; $0A -> Class 2
01091 ; $0B -> Class 2
01092 ; $0C -> Class 2
01093 ; $0D -> Class 1
01094 ; $0E -> Class 1
01095 ; $0F -> Class 1
01096 ;
01097 ; $CF TITLELIFE
01098 ;
01099 ; Lifetime of title line. It is decremented every game loop iteration.
01100 ; Used initial values are:
01101 ; $3C -> When displaying regular title phrases
01102 ; $FE -> When displaying "STARBASE SURROUNDED", "STARBASE DESTOYED",
01103 ; and "RED ALERT" messages
01104 ; $FF -> Hide title line
01105 ;
01106 ; $D0 SHIPVIEW
01107 ;
01108 ; Current view of our starship. Values are picked from table
01109 ; VIEWMODETAB ($BE22). Used values are:
01110 ; $00 -> Front view
01111 ; $01 -> Aft view
01112 ; $40 -> Long-Range Scan view
01113 ; $80 -> Galactic Chart view
01114 ;
01115 ; $D1 TITLEPHR
01116 ;
01117 ; Title phrase offset for text phrase in title line. Used values are:
01118 ; $00..$7B -> Title phrase offset into PHRASETAB ($BBAA)
01119 ; $FF -> Hide title line
01120 ;
01121 ; See also NEWTITLEPHR ($65).
01122 ;
01123 ; $D2 BEEPFRQIND
01124 ;
01125 ; Beeper sound pattern: Running index into frequency table BEEPFRQTAB
01126 ; ($BF5C). See also BEEPFRQSTART ($D7). See also subroutines BEEP
01127 ; ($B3A6) and SOUND ($B2AB).
01128 ;
01129 ; $D3 BEEPREPEAT
01130 ;
01131 ; Beeper sound pattern: Number of times the beeper sound pattern is
01132 ; repeated - 1. See also subroutines BEEP ($B3A6) and SOUND ($B2AB).
01133 ;
01134 ; $D4 BEEPTONELIFE
01135 ;
01136 ; Beeper sound pattern: Lifetime of tone in TICKs - 1. See also
01137 ; subroutines BEEP ($B3A6) and SOUND ($B2AB).
01138 ;
01139 ; $D5 BEEPPAUSELIFE
01140 ;
01141 ; Beeper sound pattern: Lifetime of pause in TICKs - 1. Used values
01142 ; are:
01143 ; < $FF -> Number of TICKs - 1 to play
01144 ; $FF -> Skip playing pause
01145 ;
01146 ; See also subroutines BEEP ($B3A6) and SOUND ($B2AB).
01147 ;
01148 ; $D6 BEEPPRIORITY
01149 ;
01150 ; Beeper sound pattern: Pattern priority. Each beeper sound pattern has
01151 ; a priority. When a pattern of higher priority is about to be played
01152 ; the pattern that is currently playing is stopped. Used values are:
01153 ; $00 -> No pattern playing at the moment
01154 ; > $00 -> Pattern priority
01155 ;
01156 ; See also subroutines BEEP ($B3A6) and SOUND ($B2AB).
01157 ;
01158 ; $D7 BEEPFRQSTART
01159 ;
01160 ; Beeper sound pattern: Index to first byte of the pattern frequency in
01161 ; table BEEPFRQTAB ($BF5C). See also BEEPFRQIND ($D2). See also
01162 ; subroutines BEEP ($B3A6) and SOUND ($B2AB).
01163 ;
01164 ; $D8 BEEPLIFE
01165 ;
01166 ; Beeper sound pattern: Lifetime of the current tone or pause in TICKs.
01167 ; It is decremented every TICK. See also subroutines BEEP ($B3A6) and
01168 ; SOUND ($B2AB).
01169 ;
01170 ; $D9 BEEPTOGGLE
01171 ;
01172 ; Beeper sound pattern: Indicates that either a tone or a pause is
01173 ; currently played. Used values are:
01174 ; $00 -> Tone
01175 ; $01 -> Pause
01176 ;
01177 ; See also subroutines BEEP ($B3A6) and SOUND ($B2AB).
01178 ;
01179 ; $DA NOISETORPTIM
01180 ;
01181 ; Noise sound pattern: Delay timer for PHOTON TORPEDO LAUNCHED noise
01182 ; sound pattern. It is decremented every TICK. See also subroutines
01183 ; NOISE ($AEA8) and SOUND ($B2AB).
01184 ;
01185 ; $DB NOISEEXPLTIM
01186 ;
01187 ; Noise sound pattern: Delay timer for SHIELD EXPLOSION and ZYLON
01188 ; EXPLOSION noise sound pattern. It is decremented every TICK. See also
01189 ; subroutines NOISE ($AEA8) and SOUND ($B2AB).
01190 ;
01191 ; $DC NOISEAUDC2
01192 ;
01193 ; Noise sound pattern: Audio channel 1/2 control shadow register. See
01194 ; also subroutines NOISE ($AEA8) and SOUND ($B2AB).
01195 ;
01196 ; $DD NOISEAUDC3
01197 ;
01198 ; Noise sound pattern: Audio channel 3 control shadow register. See
01199 ; also subroutines NOISE ($AEA8) and SOUND ($B2AB).
01200 ;
01201 ; $DE NOISEAUDF1
01202 ;
01203 ; Noise sound pattern: Audio channel 1 frequency shadow register. See
01204 ; also subroutines NOISE ($AEA8) and SOUND ($B2AB).
01205 ;
01206 ; $DF NOISEAUDF2
01207 ;
01208 ; Noise sound pattern: Audio channel 2 frequency shadow register. See
01209 ; also subroutines NOISE ($AEA8) and SOUND ($B2AB).
01210 ;
01211 ; $E0 NOISEFRQINC
01212 ;
01213 ; Noise sound pattern: Audio channel 1/2 frequency increment. See also
01214 ; subroutines NOISE ($AEA8) and SOUND ($B2AB).
01215 ;
01216 ; $E1 NOISELIFE
01217 ;
01218 ; Noise sound pattern: Noise sound pattern lifetime. It is decremented
01219 ; every TICK. See also subroutines NOISE ($AEA8) and SOUND ($B2AB).
01220 ;
01221 ; $E2 NOISEZYLONTIM
01222 ;
01223 ; Delay timer to trigger the ZYLON EXPLOSION noise sound pattern. It is
01224 ; set in subroutine COLLISION ($AF3D) when an impact of one of our
01225 ; starship's photon torpedoes into a target is imminent. The timer is
01226 ; decremented every TICK during the execution of the Vertical Blank
01227 ; Interrupt handler VBIHNDLR ($A6D1). When the timer value reaches 0
01228 ; the ZYLON EXPLOSION noise sound pattern is played in subroutine SOUND
01229 ; ($B2AB).
01230 ;
01231 ; $E3 NOISEHITLIFE
01232 ;
01233 ; Lifetime of STARSHIP EXPLOSION noise when our starship was destroyed
01234 ; by a Zylon photon torpedo. It is set in routine GAMELOOP ($A1F3) to a
01235 ; value of 64 TICKs. It is decremented every TICK during the execution
01236 ; of the Vertical Blank Interrupt handler VBIHNDLR ($A6D1).
01237 ;
01238 ; $E4 PL0SHAPOFF
01239 ;
01240 ; PLAYER0 offset into shape table PLSHAP2TAB ($B9B1)
01241 ;
01242 ; $E5 PL1SHAPOFF
01243 ;
01244 ; PLAYER1 offset into shape table PLSHAP2TAB ($B9B1)
01245 ;
01246 ; $E6 PL2SHAPOFF
01247 ;
01248 ; PLAYER2 offset into shape table PLSHAP1TAB ($B8E4)
01249 ;
01250 ; $E7 PL3SHAPOFF
01251 ;
01252 ; PLAYER3 offset into shape table PLSHAP1TAB ($B8E4)
01253 ;
01254 ; $E8 PL4SHAPOFF
01255 ;
01256 ; PLAYER4 offset into shape table PLSHAP1TAB ($B8E4)
01257 ;
01258 ; $E9 PL0LIFE
01259 ;
01260 ; Lifetime of the space object represented by PLAYER0 (usually Zylon
01261 ; ship 0). Any value other than $FF is decremented with every game loop
01262 ; iteration. Used values are:
01263 ; $00 -> Space object not alive (= not in use)
01264 ; $01..$FE -> Values during lifetime countdown
01265 ; $FF -> Infinite lifetime (not counted down)
01266 ;
01267 ; $EA PL1LIFE
01268 ;
01269 ; Lifetime of a space object represented by PLAYER1 (usually Zylon ship
01270 ; 1). Compare PL0LIFE ($E9).
01271 ;
01272 ; $EB PL2LIFE
01273 ;
01274 ; Lifetime of a space object represented by PLAYER2 (usually the Zylon
01275 ; photon torpedo). Compare PL0LIFE ($E9).
01276 ;
01277 ; If this PLAYER represents a photon torpedo, its lifetime is
01278 ; decremented from an initial value of $FF.
01279 ;
01280 ; $EC PL3LIFE
01281 ;
01282 ; Lifetime of a space object represented by PLAYER3 (usually our
01283 ; starship's photon torpedo 0). Compare PL2LIFE ($EB).
01284 ;
01285 ; If this PLAYER represents a photon torpedo, its lifetime is
01286 ; decremented from an initial value of $FF.
01287 ;
01288 ; $ED PL4LIFE
01289 ;
01290 ; Lifetime of a space object represented by PLAYER4 (usually our
01291 ; starship's photon torpedo 1). Compare PL2LIFE ($EB).
01292 ;
01293 ; If this PLAYER represents a photon torpedo, its lifetime is
01294 ; decremented from an initial value of $FF.
01295 ;
01296 ; $EE PL0COLOR
01297 ;
01298 ; Color of PLAYER0
01299 ;
01300 ; $EF PL1COLOR
01301 ;
01302 ; Color of PLAYER1
01303 ;
01304 ; $F0 PL2COLOR
01305 ;
01306 ; Color of PLAYER2
01307 ;
01308 ; $F1 PL3COLOR
01309 ;
01310 ; Color of PLAYER3
01311 ;
01312 ; $F2 PF0COLOR
01313 ;
01314 ; Color of PLAYFIELD0
01315 ;
01316 ; $F3 PF1COLOR
01317 ;
01318 ; Color of PLAYFIELD1
01319 ;
01320 ; $F4 PF2COLOR
01321 ;
01322 ; Color of PLAYFIELD2
01323 ;
01324 ; $F5 PF3COLOR
01325 ;
01326 ; Color of PLAYFIELD3
01327 ;
01328 ; $F6 BGRCOLOR
01329 ;
01330 ; Color of BACKGROUND
01331 ;
01332 ; $F7 PF0COLORDLI
01333 ;
01334 ; Color of PLAYFIELD0 after DLI
01335 ;
01336 ; $F8 PF1COLORDLI
01337 ;
01338 ; Color of PLAYFIELD1 after DLI
01339 ;
01340 ; $F9 PF2COLORDLI
01341 ;
01342 ; Color of PLAYFIELD2 after DLI
01343 ;
01344 ; $FA PF3COLORDLI
01345 ;
01346 ; Color of PLAYFIELD3 after DLI
01347 ;
01348 ; $FB BGRCOLORDLI
01349 ;
01350 ; Color of BACKGROUND after DLI
01351 ;
01352 ; $0280..$02E9 DSPLST
01353 ;
01354 ; Display List
01355 ;
01356 ; $0300..$03FF PL4DATA
01357 ;
01358 ; PLAYER4 data area
01359 ;
01360 ; $0400..$04FF PL0DATA
01361 ;
01362 ; PLAYER0 data area
01363 ;
01364 ; $0500..$05FF PL1DATA
01365 ;
01366 ; PLAYER1 data area
01367 ;
01368 ; $0600..$06FF PL2DATA
01369 ;
01370 ; PLAYER2 data area
01371 ;
01372 ; $0700..$07FF PL3DATA
01373 ;
01374 ; PLAYER3 data area
01375 ;
01376 ; $0800..$0863 PFMEMROWLO
01377 ;
01378 ; Lookup table of start addresses (low byte) for each row of
01379 ; PLAYFIELD memory, which is located at PFMEM ($1000). The table
01380 ; contains 100 bytes for 100 rows (of which only 99 are shown by
01381 ; the Display List, the PLAYFIELD is 160 x 99 pixels). The
01382 ; addresses grow in increments of 40 (40 bytes = 160 pixels in
01383 ; GRAPHICS7 mode = 1 PLAYFIELD row of pixels). See also PFMEMROWHI
01384 ; ($0864).
01385 ;
01386 ; $0864..$08C7 PFMEMROWHI
01387 ;
01388 ; Lookup table of start addresses (high byte) of each row of
01389 ; PLAYFIELD memory. See also PFMEMROWLO ($0800).
01390 ;
01391 ; $08C9..$0948 GCMEMMAP
01392 ;
01393 ; Galactic Chart memory map (16 columns x 8 rows = 128 bytes)
01394 ;
01395 ; $0949..$0970 PANELTXT
01396 ;
01397 ; Memory of Control Panel Display (bottom text window) in Front
01398 ; view, Aft view, and Long-Range Scan view (20 characters x 2 rows
01399 ; = 40 bytes).
01400 ;
01401 ; $094A VELOCD1
01402 ;
01403 ; First digit (of 2) of the VELOCITY readout in Control Panel
01404 ; Display memory.
01405 ;
01406 ; $0950 KILLCNTD1
01407 ;
01408 ; First digit (of 2) of the KILL COUNTER readout in Control Panel
01409 ; Display memory.
01410 ;
01411 ; $0955 ENERGYD1
01412 ;
01413 ; First digit (of 4) of the ENERGY readout in Control Panel Display
01414 ; memory.
01415 ;
01416 ; $095A TRACKC1
01417 ;
01418 ; Character of the TRACKING readout 'T' or 'C' in Control Panel
01419 ; Display memory.
01420 ;
01421 ; $095C TRACKDIGIT
01422 ;
01423 ; Digit of the TRACKING readout in Control Panel Display memory. It
01424 ; is used to store the index of the currently tracked space object.
01425 ; Used values are:
01426 ; $00 -> Track Zylon ship 0
01427 ; $01 -> Track Zylon ship 1
01428 ; $02 -> Track starbase
01429 ; $03 -> Track Hyperwarp Target Marker
01430 ;
01431 ; $0960 THETAC1
01432 ;
01433 ; First character of the THETA readout in Control Panel Display
01434 ; memory.
01435 ;
01436 ; $0966 PHIC1
01437 ;
01438 ; First character of the PHI readout in Control Panel Display
01439 ; memory.
01440 ;
01441 ; $096C RANGEC1
01442 ;
01443 ; First character of the RANGE readout in Control Panel Display
01444 ; memory.
01445 ;
01446 ; $0971..$09AC GCTXT
01447 ;
01448 ; Memory of Galactic Chart Panel Display (bottom text window) of
01449 ; Galactic Chart view (20 characters x 3 rows = 60 bytes).
01450 ;
01451 ; $097D GCWARPD1
01452 ;
01453 ; First digit (of 4) of the HYPERWARP ENERGY readout in Galactic
01454 ; Chart Panel Display memory.
01455 ;
01456 ; $098D GCTRGCNT
01457 ;
01458 ; First target counter digit (of 2) in Galactic Chart Panel Display
01459 ; memory.
01460 ;
01461 ; $0992 GCSTATPHO
01462 ;
01463 ; Photon Torpedo status letter in Galactic Chart Panel Display
01464 ; memory. Used values are:
01465 ; %00****** -> OK
01466 ; %10****** -> Destroyed
01467 ; %11****** -> Damaged
01468 ;
01469 ; $0993 GCSTATENG
01470 ;
01471 ; Engines status letter in Galactic Chart Panel Display memory.
01472 ; Used values are:
01473 ; %00****** -> OK
01474 ; %10****** -> Destroyed
01475 ; %11****** -> Damaged
01476 ;
01477 ; $0994 GCSTATSHL
01478 ;
01479 ; Shields status letter in Galactic Chart Panel Display memory.
01480 ; Used values are:
01481 ; %00****** -> OK
01482 ; %10****** -> Destroyed
01483 ; %11****** -> Damaged
01484 ;
01485 ; $0995 GCSTATCOM
01486 ;
01487 ; Attack Computer status letter in Galactic Chart Panel Display
01488 ; memory. Used values are:
01489 ; %00****** -> OK
01490 ; %10****** -> Destroyed
01491 ; %11****** -> Damaged
01492 ;
01493 ; $0996 GCSTATLRS
01494 ;
01495 ; Long-Range Scan status letter in Galactic Chart Panel Display
01496 ; memory. Used values are:
01497 ; %00****** -> OK
01498 ; %10****** -> Destroyed
01499 ; %11****** -> Damaged
01500 ;
01501 ; $0997 GCSTATRAD
01502 ;
01503 ; Subspace Radio status letter in Galactic Chart Panel Display
01504 ; memory. Used values are:
01505 ; %00****** -> OK
01506 ; %10****** -> Destroyed
01507 ; %11****** -> Damaged
01508 ;
01509 ; $09A3 GCSTARDAT
01510 ;
01511 ; First (of 5) digits of the star date clock in the Galactic Chart
01512 ; Panel Display memory.
01513 ;
01514 ; $09AD..$09DD ZPOSSIGN
01515 ;
01516 ; Table containing the sign bit (B16) of position vector
01517 ; z-components (z-coordinate) (49 bytes). Bytes 0..4 belong to
01518 ; position vectors of PLAYER space objects (Zylon ships, photon
01519 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01520 ; PLAYFIELD space objects (stars, explosion fragments). Used values
01521 ; are:
01522 ; $00 -> Negative sign (behind our starship)
01523 ; $01 -> Positive sign (in front of our starship)
01524 ;
01525 ; See also "ON POSITION VECTORS".
01526 ;
01527 ; $09AD PL0ZPOSSIGN
01528 ;
01529 ; Sign bit (B16) of position vector z-component (z-coordinate) of
01530 ; PLAYER0. Compare ZPOSSIGN ($09AD). See also "ON POSITION
01531 ; VECTORS".
01532 ;
01533 ; $09AE PL1ZPOSSIGN
01534 ;
01535 ; Sign bit (B16) of position vector z-component (z-coordinate) of
01536 ; PLAYER1. Compare ZPOSSIGN ($09AD). See also "ON POSITION
01537 ; VECTORS".
01538 ;
01539 ; $09AF PL2ZPOSSIGN
01540 ;
01541 ; Sign bit (B16) of position vector z-component (z-coordinate) of
01542 ; PLAYER2. Compare ZPOSSIGN ($09AD). See also "ON POSITION
01543 ; VECTORS".
01544 ;
01545 ; $09B0 PL3ZPOSSIGN
01546 ;
01547 ; Sign bit (B16) of position vector z-component (z-coordinate) of
01548 ; PLAYER3. Compare ZPOSSIGN ($09AD). See also "ON POSITION
01549 ; VECTORS".
01550 ;
01551 ; $09B1 PL4ZPOSSIGN
01552 ;
01553 ; Sign bit (B16) of position vector z-component (z-coordinate) of
01554 ; PLAYER4. Compare ZPOSSIGN ($09AD). See also "ON POSITION
01555 ; VECTORS".
01556 ;
01557 ; $09DE..$0A0E XPOSSIGN
01558 ;
01559 ; Table containing the sign bit (B16) of position vector
01560 ; x-components (x-coordinate) (49 bytes). Bytes 0..4 belong to
01561 ; position vectors of PLAYER space objects (Zylon ships, photon
01562 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01563 ; PLAYFIELD space objects (stars, explosion fragments). Used values
01564 ; are:
01565 ; $00 -> Negative sign (left)
01566 ; $01 -> Positive sign (right)
01567 ;
01568 ; See also "ON POSITION VECTORS".
01569 ;
01570 ; $09DE PL0XPOSSIGN
01571 ;
01572 ; Sign bit (B16) of position vector x-component (x-coordinate) of
01573 ; PLAYER0. Compare XPOSSIGN ($09DE). See also "ON POSITION
01574 ; VECTORS".
01575 ;
01576 ; $09DF PL1XPOSSIGN
01577 ;
01578 ; Sign bit (B16) of position vector x-component (x-coordinate) of
01579 ; PLAYER1. Compare XPOSSIGN ($09DE). See also "ON POSITION
01580 ; VECTORS".
01581 ;
01582 ; $09E0 PL2XPOSSIGN
01583 ;
01584 ; Sign bit (B16) of position vector x-component (x-coordinate) of
01585 ; PLAYER2. Compare XPOSSIGN ($09DE). See also "ON POSITION
01586 ; VECTORS".
01587 ;
01588 ; $09E1 PL3XPOSSIGN
01589 ;
01590 ; Sign bit (B16) of position vector x-component (x-coordinate) of
01591 ; PLAYER3. Compare XPOSSIGN ($09DE). See also "ON POSITION
01592 ; VECTORS".
01593 ;
01594 ; $09E2 PL4XPOSSIGN
01595 ;
01596 ; Sign bit (B16) of position vector x-component (x-coordinate) of
01597 ; PLAYER4. Compare XPOSSIGN ($09DE). See also "ON POSITION
01598 ; VECTORS".
01599 ;
01600 ; $0A0F..$0A3F YPOSSIGN
01601 ;
01602 ; Table containing the sign bit (B16) of position vector
01603 ; y-components (y-coordinate) (49 bytes). Bytes 0..4 belong to
01604 ; position vectors of PLAYER space objects (Zylon ships, photon
01605 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01606 ; PLAYFIELD space objects (stars, explosion fragments). Used values
01607 ; are:
01608 ; $00 -> Negative sign (down)
01609 ; $01 -> Positive sign (up)
01610 ;
01611 ; See also "ON POSITION VECTORS".
01612 ;
01613 ; $0A0F PL0YPOSSIGN
01614 ;
01615 ; Sign bit (B16) of position vector y-component (y-coordinate) of
01616 ; PLAYER0. Compare YPOSSIGN ($0A0F). See also "ON POSITION
01617 ; VECTORS".
01618 ;
01619 ; $0A10 PL1YPOSSIGN
01620 ;
01621 ; Sign bit (B16) of position vector y-component (y-coordinate) of
01622 ; PLAYER1. Compare YPOSSIGN ($0A0F). See also "ON POSITION
01623 ; VECTORS".
01624 ;
01625 ; $0A11 PL2YPOSSIGN
01626 ;
01627 ; Sign bit (B16) of position vector y-component (y-coordinate) of
01628 ; PLAYER2. Compare YPOSSIGN ($0A0F). See also "ON POSITION
01629 ; VECTORS".
01630 ;
01631 ; $0A12 PL3YPOSSIGN
01632 ;
01633 ; Sign bit (B16) of position vector y-component (y-coordinate) of
01634 ; PLAYER3. Compare YPOSSIGN ($0A0F). See also "ON POSITION
01635 ; VECTORS".
01636 ;
01637 ; $0A13 PL4YPOSSIGN
01638 ;
01639 ; Sign bit (B16) of position vector y-component (y-coordinate) of
01640 ; PLAYER4. Compare YPOSSIGN ($0A0F). See also "ON POSITION
01641 ; VECTORS".
01642 ;
01643 ; $0A40..$0A70 ZPOSHI
01644 ;
01645 ; Table containing the high byte (B15..8) of position vector
01646 ; y-components (y-coordinate) (49 bytes). Bytes 0..4 belong to
01647 ; position vectors of PLAYER space objects (Zylon ships, photon
01648 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01649 ; PLAYFIELD space objects (stars, explosion fragments). See also
01650 ; "ON POSITION VECTORS".
01651 ;
01652 ; $0A40 PL0ZPOSHI
01653 ;
01654 ; High byte (B15..8) of position vector z-component (z-coordinate)
01655 ; of PLAYER0. Compare ZPOSHI ($0A40). See also "ON POSITION
01656 ; VECTORS".
01657 ;
01658 ; $0A41 PL1ZPOSHI
01659 ;
01660 ; High byte (B15..8) of position vector z-component (z-coordinate)
01661 ; of PLAYER1. Compare ZPOSHI ($0A40). See also "ON POSITION
01662 ; VECTORS".
01663 ;
01664 ; $0A42 PL2ZPOSHI
01665 ;
01666 ; High byte (B15..8) of position vector z-component (z-coordinate)
01667 ; of PLAYER2. Compare ZPOSHI ($0A40). See also "ON POSITION
01668 ; VECTORS".
01669 ;
01670 ; $0A43 PL3ZPOSHI
01671 ;
01672 ; High byte (B15..8) of position vector z-component (z-coordinate)
01673 ; of PLAYER3. Compare ZPOSHI ($0A40). See also "ON POSITION
01674 ; VECTORS".
01675 ;
01676 ; $0A44 PL4ZPOSHI
01677 ;
01678 ; High byte (B15..8) of position vector z-component (z-coordinate)
01679 ; of PLAYER4. Compare ZPOSHI ($0A40). See also "ON POSITION
01680 ; VECTORS".
01681 ;
01682 ; $0A71..$0AA1 XPOSHI
01683 ;
01684 ; Table containing the high byte (B15..8) of position vector
01685 ; x-components (x-coordinate) (49 bytes). Bytes 0..4 belong to
01686 ; position vectors of PLAYER space objects (Zylon ships, photon
01687 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01688 ; PLAYFIELD space objects (stars, explosion fragments). See also
01689 ; "ON POSITION VECTORS".
01690 ;
01691 ; $0A71 PL0XPOSHI
01692 ;
01693 ; High byte (B15..8) of position vector x-component (x-coordinate)
01694 ; of PLAYER0. Compare XPOSHI ($0A71). See also "ON POSITION
01695 ; VECTORS".
01696 ;
01697 ; $0A72 PL1XPOSHI
01698 ;
01699 ; High byte (B15..8) of position vector x-component (x-coordinate)
01700 ; of PLAYER1. Compare XPOSHI ($0A71). See also "ON POSITION
01701 ; VECTORS".
01702 ;
01703 ; $0A73 PL2XPOSHI
01704 ;
01705 ; High byte (B15..8) of position vector x-component (x-coordinate)
01706 ; of PLAYER2. Compare XPOSHI ($0A71). See also "ON POSITION
01707 ; VECTORS".
01708 ;
01709 ; $0A74 PL3XPOSHI
01710 ;
01711 ; High byte (B15..8) of position vector x-component (x-coordinate)
01712 ; of PLAYER3. Compare XPOSHI ($0A71). See also "ON POSITION
01713 ; VECTORS".
01714 ;
01715 ; $0A75 PL4XPOSHI
01716 ;
01717 ; High byte (B15..8) of position vector x-component (x-coordinate)
01718 ; of PLAYER4. Compare XPOSHI ($0A71). See also "ON POSITION
01719 ; VECTORS".
01720 ;
01721 ; $0AA2..$0AD2 YPOSHI
01722 ;
01723 ; Table containing the high byte (B15..8) of position vector
01724 ; y-components (y-coordinate) (49 bytes). Bytes 0..4 belong to
01725 ; position vectors of PLAYER space objects (Zylon ships, photon
01726 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01727 ; PLAYFIELD space objects (stars, explosion fragments). See also
01728 ; "ON POSITION VECTORS".
01729 ;
01730 ; $0AA2 PL0YPOSHI
01731 ;
01732 ; High byte (B15..8) of position vector y-component (y-coordinate)
01733 ; of PLAYER0. Compare YPOSHI ($0AA2). See also "ON POSITION
01734 ; VECTORS".
01735 ;
01736 ; $0AA3 PL1YPOSHI
01737 ;
01738 ; High byte (B15..8) of position vector y-component (y-coordinate)
01739 ; of PLAYER1. Compare YPOSHI ($0AA2). See also "ON POSITION
01740 ; VECTORS".
01741 ;
01742 ; $0AA4 PL2YPOSHI
01743 ;
01744 ; High byte (B15..8) of position vector y-component (y-coordinate)
01745 ; of PLAYER2. Compare YPOSHI ($0AA2). See also "ON POSITION
01746 ; VECTORS".
01747 ;
01748 ; $0AA5 PL3YPOSHI
01749 ;
01750 ; High byte (B15..8) of position vector y-component (y-coordinate)
01751 ; of PLAYER3. Compare YPOSHI ($0AA2). See also "ON POSITION
01752 ; VECTORS".
01753 ;
01754 ; $0AA6 PL4YPOSHI
01755 ;
01756 ; High byte (B15..8) of position vector y-component (y-coordinate)
01757 ; of PLAYER4. Compare YPOSHI ($0AA2). See also "ON POSITION
01758 ; VECTORS".
01759 ;
01760 ; $0AD3..$0B03 ZPOSLO
01761 ;
01762 ; Table containing the low byte (B7..0) of position vector
01763 ; z-components (z-coordinate) (49 bytes). Bytes 0..4 belong to
01764 ; position vectors of PLAYER space objects (Zylon ships, photon
01765 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01766 ; PLAYFIELD space objects (stars, explosion fragments). See also
01767 ; "ON POSITION VECTORS".
01768 ;
01769 ; $0AD3 PL0ZPOSLO
01770 ;
01771 ; Low byte (B7..0) of position vector z-component (z-coordinate) of
01772 ; PLAYER0. Compare ZPOSLO ($0AD3). See also "ON POSITION VECTORS".
01773 ;
01774 ; $0AD4 PL1ZPOSLO
01775 ;
01776 ; Low byte (B7..0) of position vector z-component (z-coordinate) of
01777 ; PLAYER1. Compare ZPOSLO ($0AD3). See also "ON POSITION VECTORS".
01778 ;
01779 ; $0AD5 PL2ZPOSLO
01780 ;
01781 ; Low byte (B7..0) of position vector z-component (z-coordinate) of
01782 ; PLAYER2. Compare ZPOSLO ($0AD3). See also "ON POSITION VECTORS".
01783 ;
01784 ; $0AD6 PL3ZPOSLO
01785 ;
01786 ; Low byte (B7..0) of position vector z-component (z-coordinate) of
01787 ; PLAYER3. Compare ZPOSLO ($0AD3). See also "ON POSITION VECTORS".
01788 ;
01789 ; $0AD7 PL4ZPOSLO
01790 ;
01791 ; Low byte (B7..0) of position vector z-component (z-coordinate) of
01792 ; PLAYER4. Compare ZPOSLO ($0AD3). See also "ON POSITION VECTORS".
01793 ;
01794 ; $0B04..$0B34 XPOSLO
01795 ;
01796 ; Table containing the low byte (B7..0) of position vector
01797 ; x-components (x-coordinate) (49 bytes). Bytes 0..4 belong to
01798 ; position vectors of PLAYER space objects (Zylon ships, photon
01799 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01800 ; PLAYFIELD space objects (stars, explosion fragments). See also
01801 ; "ON POSITION VECTORS".
01802 ;
01803 ; $0B04 PL0XPOSLO
01804 ;
01805 ; Low byte (B7..0) of position vector x-component (x-coordinate) of
01806 ; PLAYER0. Compare XPOSLO ($0B04). See also "ON POSITION VECTORS".
01807 ;
01808 ; $0B05 PL1XPOSLO
01809 ;
01810 ; Low byte (B7..0) of position vector x-component (x-coordinate) of
01811 ; PLAYER1. Compare XPOSLO ($0B04). See also "ON POSITION VECTORS".
01812 ;
01813 ; $0B06 PL2XPOSLO
01814 ;
01815 ; Low byte (B7..0) of position vector x-component (x-coordinate) of
01816 ; PLAYER2. Compare XPOSLO ($0B04). See also "ON POSITION VECTORS".
01817 ;
01818 ; $0B07 PL3XPOSLO
01819 ;
01820 ; Low byte (B7..0) of position vector x-component (x-coordinate) of
01821 ; PLAYER3. Compare XPOSLO ($0B04). See also "ON POSITION VECTORS".
01822 ;
01823 ; $0B08 PL4XPOSLO
01824 ;
01825 ; Low byte (B7..0) of position vector x-component (x-coordinate) of
01826 ; PLAYER4. Compare XPOSLO ($0B04). See also "ON POSITION VECTORS".
01827 ;
01828 ; $0B35..$0B65 YPOSLO
01829 ;
01830 ; Table containing the low byte (B7..0) of position vector
01831 ; y-components (y-coordinate) (49 bytes). Bytes 0..4 belong to
01832 ; position vectors of PLAYER space objects (Zylon ships, photon
01833 ; torpedoes, etc.). Bytes 5..48 belong to position vectors of
01834 ; PLAYFIELD space objects (stars, explosion fragments). See also
01835 ; "ON POSITION VECTORS".
01836 ;
01837 ; $0B35 PL0YPOSLO
01838 ;
01839 ; Low byte (B7..0) of position vector y-component (y-coordinate) of
01840 ; PLAYER0. Compare YPOSLO ($0B35). See also "ON POSITION VECTORS".
01841 ;
01842 ; $0B36 PL1YPOSLO
01843 ;
01844 ; Low byte (B7..0) of position vector y-component (y-coordinate) of
01845 ; PLAYER1. Compare YPOSLO ($0B35). See also "ON POSITION VECTORS".
01846 ;
01847 ; $0B37 PL2YPOSLO
01848 ;
01849 ; Low byte (B7..0) of position vector y-component (y-coordinate) of
01850 ; PLAYER2. Compare YPOSLO ($0B35). See also "ON POSITION VECTORS".
01851 ;
01852 ; $0B38 PL3YPOSLO
01853 ;
01854 ; Low byte (B7..0) of position vector y-component (y-coordinate) of
01855 ; PLAYER3. Compare YPOSLO ($0B35). See also "ON POSITION VECTORS".
01856 ;
01857 ; $0B39 PL4YPOSLO
01858 ;
01859 ; Low byte (B7..0) of position vector y-component (y-coordinate) of
01860 ; PLAYER4. Compare YPOSLO ($0B35). See also "ON POSITION VECTORS".
01861 ;
01862 ; $0B66..$0B96 ZVEL
01863 ;
01864 ; Table containing velocity vector z-components (z-velocities) (49
01865 ; bytes). Bytes 0..4 belong to velocity vectors of PLAYER space
01866 ; objects (Zylon ships, photon torpedoes, etc.). Bytes 5..48 belong
01867 ; to velocity vectors of PLAYFIELD space objects (stars, explosion
01868 ; fragments). Each z-velocity is stored in the binary format
01869 ; %sxxxxxxx where
01870 ; %s = 0 -> Positive sign (moving in flight direction)
01871 ; %s = 1 -> Negative sign (moving in reverse flight direction)
01872 ; %xxxxxxx -> Unsigned 7-bit velocity value in <KM/H>
01873 ;
01874 ; See also "ON VELOCITY VECTORS".
01875 ;
01876 ; $0B66 PL0ZVEL
01877 ;
01878 ; Velocity vector z-component (z-velocity) of PLAYER0. Compare ZVEL
01879 ; ($0B66). See also "ON VELOCITY VECTORS".
01880 ;
01881 ; $0B67 PL1ZVEL
01882 ;
01883 ; Velocity vector z-component (z-velocity) of PLAYER1. Compare ZVEL
01884 ; ($0B66). See also "ON VELOCITY VECTORS".
01885 ;
01886 ; $0B68 PL2ZVEL
01887 ;
01888 ; Velocity vector z-component (z-velocity) of PLAYER2. Compare ZVEL
01889 ; ($0B66). See also "ON VELOCITY VECTORS".
01890 ;
01891 ; $0B69 PL3ZVEL
01892 ;
01893 ; Velocity vector z-component (z-velocity) of PLAYER3. Compare ZVEL
01894 ; ($0B66). See also "ON VELOCITY VECTORS".
01895 ;
01896 ; $0B6A PL4ZVEL
01897 ;
01898 ; Velocity vector z-component (z-velocity) of PLAYER4. Compare ZVEL
01899 ; ($0B66). See also "ON VELOCITY VECTORS".
01900 ;
01901 ; $0B97..$0BC7 XVEL
01902 ;
01903 ; Table containing velocity vector x-components (x-velocities) (49
01904 ; bytes). Bytes 0..4 belong to velocity vectors of PLAYER space
01905 ; objects (Zylon ships, photon torpedoes, etc.). Bytes 5..48 belong
01906 ; to velocity vectors of PLAYFIELD space objects (stars, explosion
01907 ; fragments). Each x-velocity is stored in the binary format
01908 ; %sxxxxxxx where
01909 ; %s = 0 -> Positive sign (moving to the right)
01910 ; %s = 1 -> Negative sign (moving to the left)
01911 ; %xxxxxxx -> Unsigned 7-bit velocity value in <KM/H>
01912 ;
01913 ; See also "ON VELOCITY VECTORS".
01914 ;
01915 ; $0B97 PL0XVEL
01916 ;
01917 ; Velocity vector x-component (x-velocity) of PLAYER0. Compare XVEL
01918 ; ($0B97). See also "ON VELOCITY VECTORS".
01919 ;
01920 ; $0B98 PL1XVEL
01921 ;
01922 ; Velocity vector x-component (x-velocity) of PLAYER1. Compare XVEL
01923 ; ($0B97). See also "ON VELOCITY VECTORS".
01924 ;
01925 ; $0B99 PL2XVEL
01926 ;
01927 ; Velocity vector x-component (x-velocity) of PLAYER2. Compare XVEL
01928 ; ($0B97). See also "ON VELOCITY VECTORS".
01929 ;
01930 ; $0B9A PL3XVEL
01931 ;
01932 ; Velocity vector x-component (x-velocity) of PLAYER3. Compare XVEL
01933 ; ($0B97). See also "ON VELOCITY VECTORS".
01934 ;
01935 ; $0B9B PL4XVEL
01936 ;
01937 ; Velocity vector x-component (x-velocity) of PLAYER4. Compare XVEL
01938 ; ($0B97). See also "ON VELOCITY VECTORS".
01939 ;
01940 ; $0BC8..$0BF8 YVEL
01941 ;
01942 ; Table containing velocity vector y-components (y-velocities) (49
01943 ; bytes). Bytes 0..4 belong to velocity vectors of PLAYER space
01944 ; objects (Zylon ships, photon torpedoes, etc.). Bytes 5..48 belong
01945 ; to velocity vectors of PLAYFIELD space objects (stars, explosion
01946 ; fragments). Each y-velocity is stored in the binary format
01947 ; %sxxxxxxx where
01948 ; %s = 0 -> Positive sign (moving up)
01949 ; %s = 1 -> Negative sign (moving down)
01950 ; %xxxxxxx -> Unsigned 7-bit velocity value in <KM/H>
01951 ;
01952 ; See also "ON VELOCITY VECTORS".
01953 ;
01954 ; $0BC8 PL0YVEL
01955 ;
01956 ; Velocity vector y-component (y-velocity) of PLAYER0. Compare YVEL
01957 ; ($0BC8). See also "ON VELOCITY VECTORS".
01958 ;
01959 ; $0BC9 PL1YVEL
01960 ;
01961 ; Velocity vector y-component (y-velocity) of PLAYER1. Compare YVEL
01962 ; ($0BC8). See also "ON VELOCITY VECTORS".
01963 ;
01964 ; $0BCA PL2YVEL
01965 ;
01966 ; Velocity vector y-component (y-velocity) of PLAYER2. Compare YVEL
01967 ; ($0BC8). See also "ON VELOCITY VECTORS".
01968 ;
01969 ; $0BCB PL3YVEL
01970 ;
01971 ; Velocity vector y-component (y-velocity) of PLAYER3. Compare YVEL
01972 ; ($0BC8). See also "ON VELOCITY VECTORS".
01973 ;
01974 ; $0BCC PL4YVEL
01975 ;
01976 ; Velocity vector y-component (y-velocity) of PLAYER4. Compare YVEL
01977 ; ($0BC8). See also "ON VELOCITY VECTORS".
01978 ;
01979 ; $0BF9..$0C29 PIXELROWNEW
01980 ;
01981 ; Table containing the new pixel row number of space objects (49
01982 ; bytes). Bytes 0..4 belong to PLAYER space objects and contain
01983 ; Player/Missile (PM) pixel row numbers. They are counted from
01984 ; vertical PM position 0, which is offscreen. Bytes 5..48 belong to
01985 ; PLAYFIELD space objects (stars, explosion fragments) and contain
01986 ; PLAYFIELD pixel row numbers. They are counted from the top border
01987 ; of the PLAYFIELD and have values of 0..99. See also PIXELROW
01988 ; ($0C5B).
01989 ;
01990 ; $0BF9 PL0ROWNEW
01991 ;
01992 ; New pixel row number of PLAYER0 in Player/Missile pixels. See
01993 ; also PIXELROWNEW ($0BF9).
01994 ;
01995 ; $0BFA PL1ROWNEW
01996 ;
01997 ; New pixel row number of PLAYER1 in Player/Missile pixels. See
01998 ; also PIXELROWNEW ($0BF9).
01999 ;
02000 ; $0BFB PL2ROWNEW
02001 ;
02002 ; New pixel row number of PLAYER2 in Player/Missile pixels. See
02003 ; also PIXELROWNEW ($0BF9).
02004 ;
02005 ; $0BFC PL3ROWNEW
02006 ;
02007 ; New pixel row number of PLAYER3 in Player/Missile pixels. See
02008 ; also PIXELROWNEW ($0BF9).
02009 ;
02010 ; $0BFD PL4ROWNEW
02011 ;
02012 ; New pixel row number of PLAYER4 in Player/Missile pixels. See
02013 ; also PIXELROWNEW ($0BF9).
02014 ;
02015 ; $0C2A..$0C5A PIXELCOLUMN
02016 ;
02017 ; Table containing the pixel column number of space objects (49
02018 ; bytes). Bytes 0..4 belong to PLAYER space objects and contain
02019 ; Player/Missile (PM) pixel column numbers. They are counted from
02020 ; horizontal PM position 0, which is offscreen. Bytes 5..48 belong
02021 ; to PLAYFIELD space objects (stars, explosion fragments) and
02022 ; contain PLAYFIELD pixel column numbers. They are counted from the
02023 ; left border of the PLAYFIELD and have values of 0..159.
02024 ;
02025 ; $0C2A PL0COLUMN
02026 ;
02027 ; Pixel column number of PLAYER0 in Player/Missile pixels. See also
02028 ; PIXELCOLUMN ($0C2A).
02029 ;
02030 ; $0C2B PL1COLUMN
02031 ;
02032 ; Pixel column number of PLAYER1 in Player/Missile pixels. See also
02033 ; PIXELCOLUMN ($0C2A).
02034 ;
02035 ; $0C2C PL2COLUMN
02036 ;
02037 ; Pixel column number of PLAYER2 in Player/Missile pixels. See also
02038 ; PIXELCOLUMN ($0C2A).
02039 ;
02040 ; $0C2D PL3COLUMN
02041 ;
02042 ; Pixel column number of PLAYER3 in Player/Missile pixels. See also
02043 ; PIXELCOLUMN ($0C2A).
02044 ;
02045 ; $0C2E PL4COLUMN
02046 ;
02047 ; Pixel column number of PLAYER4 in Player/Missile pixels. See also
02048 ; PIXELCOLUMN ($0C2A).
02049 ;
02050 ; $0C5B..$0C8B PIXELROW
02051 ;
02052 ; Table containing the pixel row number of space objects (49
02053 ; bytes). Bytes 0..4 belong to PLAYER space objects and contain
02054 ; Player/Missile (PM) pixel row numbers. They are counted from
02055 ; vertical PM position 0, which is offscreen. Bytes 5..48 belong to
02056 ; PLAYFIELD space objects (stars, explosion fragments) and contain
02057 ; PLAYFIELD pixel row numbers. They are counted from the top border
02058 ; of the PLAYFIELD and have values of 0..99. See also PIXELROWNEW
02059 ; ($0BF9).
02060 ;
02061 ; $0C5B PL0ROW
02062 ;
02063 ; Pixel row number of PLAYER0 in Player/Missile pixels. See also
02064 ; PIXELROW ($0C5B).
02065 ;
02066 ; $0C5C PL1ROW
02067 ;
02068 ; Pixel row number of PLAYER1 in Player/Missile pixels. See also
02069 ; PIXELROW ($0C5B).
02070 ;
02071 ; $0C5D PL2ROW
02072 ;
02073 ; Pixel row number of PLAYER2 in Player/Missile pixels. See also
02074 ; PIXELROW ($0C5B).
02075 ;
02076 ; $0C5E PL3ROW
02077 ;
02078 ; Pixel row number of PLAYER3 in Player/Missile pixels. See also
02079 ; PIXELROW ($0C5B).
02080 ;
02081 ; $0C5F PL4ROW
02082 ;
02083 ; Pixel row number of PLAYER4 in Player/Missile pixels. See also
02084 ; PIXELROW ($0C5B).
02085 ;
02086 ; $0C8C..$0CBC PIXELBYTEOFF
02087 ;
02088 ; Table containing a byte offset into PLAYFIELD memory for each
02089 ; PLAYFIELD space object (stars, explosion fragments) (49 bytes):
02090 ; the number of bytes from the start of the PLAYFIELD row to the
02091 ; byte containing the space object pixel in the same PLAYFIELD row.
02092 ; In other words, the pixel column modulo 4 (1 byte = 4 GRAPHICS7
02093 ; pixels).
02094 ;
02095 ; NOTE: Only bytes 5..48 are used for PLAYFIELD space objects in
02096 ; this way. Bytes 0..4 are used differently. See PL0SHAPTYPE
02097 ; ($0C8C)..PL4SHAPTYPE ($0C90).
02098 ;
02099 ; $0C8C PL0SHAPTYPE
02100 ;
02101 ; Shape type of PLAYER0. Used to index the PLAYER's set of shape
02102 ; cells in tables PLSHAPOFFTAB ($BE2F) and PLSHPHEIGHTTAB ($BE7F).
02103 ; Used values are:
02104 ; $00 -> PHOTON TORPEDO
02105 ; $10 -> ZYLON FIGHTER
02106 ; $20 -> STARBASE RIGHT
02107 ; $30 -> STARBASE CENTER
02108 ; $40 -> STARBASE LEFT
02109 ; $50 -> TRANSFER VESSEL
02110 ; $60 -> METEOR
02111 ; $70 -> ZYLON CRUISER
02112 ; $80 -> ZYLON BASESTAR
02113 ; $90 -> HYPERWARP TARGET MARKER
02114 ;
02115 ; $0C8D PL1SHAPTYPE
02116 ;
02117 ; Shape type of PLAYER1. Compare PL0SHAPTYPE ($0C8C).
02118 ;
02119 ; $0C8E PL2SHAPTYPE
02120 ;
02121 ; Shape type of PLAYER2. Compare PL0SHAPTYPE ($0C8C).
02122 ;
02123 ; $0C8F PL3SHAPTYPE
02124 ;
02125 ; Shape type of PLAYER3. Compare PL0SHAPTYPE ($0C8C).
02126 ;
02127 ; $0C90 PL4SHAPTYPE
02128 ;
02129 ; Shape type of PLAYER4. Compare PL0SHAPTYPE ($0C8C).
02130 ;
02131 ; $0CBD..$0CED PIXELSAVE
02132 ;
02133 ; Table containing the byte of PLAYFIELD memory before drawing the
02134 ; PLAYFIELD space object pixel into it (star, explosion fragments),
02135 ; for each PLAYFIELD space object (49 bytes).
02136 ;
02137 ; NOTE: Only bytes 5..48 are used for PLAYFIELD space objects in
02138 ; this way. Bytes 0..4 are used differently. See PL0HEIGHT
02139 ; ($0CBD)..PL4HEIGHT ($0CC1).
02140 ;
02141 ; $0CBD PL0HEIGHT
02142 ;
02143 ; Shape height of PLAYER0
02144 ;
02145 ; $0CBE PL1HEIGHT
02146 ;
02147 ; Shape height of PLAYER1
02148 ;
02149 ; $0CBF PL2HEIGHT
02150 ;
02151 ; Shape height of PLAYER2
02152 ;
02153 ; $0CC0 PL3HEIGHT
02154 ;
02155 ; Shape height of PLAYER3
02156 ;
02157 ; $0CC1 PL4HEIGHT
02158 ;
02159 ; Shape height of PLAYER4
02160 ;
02161 ; $0CEE..$0D1E PIXELBYTE
02162 ;
02163 ; Table containing a 1-byte bit pattern for 4 pixels in the color
02164 ; of the space object's pixel, for each PLAYFIELD space object (49
02165 ; bytes).
02166 ;
02167 ; NOTE: Only bytes 5..48 are used for PLAYFIELD space objects in
02168 ; this way. Bytes 0..4 are used differently. See PL0HEIGHTNEW
02169 ; ($0CEE)..PL4HEIGHTNEW ($0CF2).
02170 ;
02171 ; $0CEE PL0HEIGHTNEW
02172 ;
02173 ; New shape height of PLAYER0
02174 ;
02175 ; $0CEF PL1HEIGHTNEW
02176 ;
02177 ; New shape height of PLAYER1
02178 ;
02179 ; $0CF0 PL2HEIGHTNEW
02180 ;
02181 ; New shape height of PLAYER2
02182 ;
02183 ; $0CF1 PL3HEIGHTNEW
02184 ;
02185 ; New shape height of PLAYER3
02186 ;
02187 ; $0CF2 PL4HEIGHTNEW
02188 ;
02189 ; New shape height of PLAYER4
02190 ;
02191 ; $0D1F..$0D32 TITLETXT
02192 ;
02193 ; Title text line, contains ATASCII-coded characters (20 bytes)
02194 ;
02195 ; $0D35..$0DE8 GCPFMEM
02196 ;
02197 ; Galactic Chart PLAYFIELD memory (20 characters x 9 rows = 180
02198 ; bytes)
02199 ;
02200 ; $0DE9..$0EE8 MAPTO80
02201 ;
02202 ; Lookup table to convert values in $00..$FF to values of 0..80
02203 ; (255 bytes). Used to map position vector components (coordinates)
02204 ; to pixel row or column numbers relative to the PLAYFIELD center.
02205 ;
02206 ; $0EE9..$0FE8 MAPTOBCD99
02207 ;
02208 ; Lookup table to convert values in $00..$FF to BCD-values of
02209 ; 00..99 (255 bytes). Used in subroutines UPDPANEL ($B804) and
02210 ; SHOWDIGITS ($B8CD) to convert values to a 2-digit decimal readout
02211 ; value of the Control Panel Display.
02212 ;
02213 ; $1000..$1F77 PFMEM
02214 ;
02215 ; PLAYFIELD graphics memory (40 bytes x 100 rows = 4000 bytes, 1
02216 ; byte stores 4 pixels, 40 bytes = 160 pixels in GRAPHICS7 mode = 1
02217 ; PLAYFIELD row of pixels).
02218 ;
02219 ; NOTE: The Display List displays only PLAYFIELD rows 0..98.
02220
02221 ;*******************************************************************************
02222 ;* *
02223 ;* S Y S T E M S Y M B O L S *
02224 ;* *
02225 ;*******************************************************************************
02226
=0200 02227 VDSLST = $0200 ; Display List Interrupt (DLI) vector
=0216 02228 VIMIRQ = $0216 ; Interrupt request (IRQ) immediate vector
=0222 02229 VVBLKI = $0222 ; Vertical blank immediate vector
=D000 02230 HPOSP0 = $D000 ; Horizontal position of PLAYER0
=D001 02231 HPOSP1 = $D001 ; Horizontal position of PLAYER1
=D002 02232 HPOSP2 = $D002 ; Horizontal position of PLAYER2
=D003 02233 HPOSP3 = $D003 ; Horizontal position of PLAYER3
=D004 02234 HPOSM0 = $D004 ; Horizontal position of MISSILE0
=D005 02235 HPOSM1 = $D005 ; Horizontal position of MISSILE1
=D006 02236 HPOSM2 = $D006 ; Horizontal position of MISSILE2
=D007 02237 HPOSM3 = $D007 ; Horizontal position of MISSILE3
=D008 02238 M0PL = $D008 ; MISSILE0 to PLAYER collisions
=D009 02239 M1PL = $D009 ; MISSILE1 to PLAYER collisions
=D00A 02240 M2PL = $D00A ; MISSILE2 to PLAYER collisions
=D00B 02241 M3PL = $D00B ; MISSILE3 to PLAYER collisions
=D00F 02242 P3PL = $D00F ; PLAYER3 to PLAYER collisions
=D010 02243 TRIG0 = $D010 ; Joystick 0 trigger
=D012 02244 COLPM0 = $D012 ; Color and brightness of PLAYER0
=D016 02245 COLPF0 = $D016 ; Color and brightness of PLAYFIELD0
=D01B 02246 PRIOR = $D01B ; Priority selection register
=D01D 02247 GRACTL = $D01D ; Graphics control register
=D01E 02248 HITCLR = $D01E ; Clear collision register
=D01F 02249 CONSOL = $D01F ; Function keys register
=D200 02250 AUDF1 = $D200 ; Audio channel 1 frequency
=D202 02251 AUDF2 = $D202 ; Audio channel 2 frequency
=D203 02252 AUDC2 = $D203 ; Audio channel 2 control
=D204 02253 AUDF3 = $D204 ; Audio channel 3 frequency
=D205 02254 AUDC3 = $D205 ; Audio channel 3 control
=D206 02255 AUDF4 = $D206 ; Audio channel 4 frequency
=D207 02256 AUDC4 = $D207 ; Audio channel 4 control
=D208 02257 AUDCTL = $D208 ; Audio control
=D209 02258 KBCODE = $D209 ; Keyboard code
=D209 02259 STIMER = $D209 ; Start POKEY timers
=D20A 02260 RANDOM = $D20A ; Random number generator
=D20E 02261 IRQEN = $D20E ; Interrupt request (IRQ) enable
=D20F 02262 SKCTL = $D20F ; Serial port control
=D300 02263 PORTA = $D300 ; Port A
=D302 02264 PACTL = $D302 ; Port A control
=D400 02265 DMACTL = $D400 ; Direct Memory Access (DMA) control
=D402 02266 DLIST = $D402 ; Display List pointer
=D407 02267 PMBASE = $D407 ; Player/Missile base address (high byte)
=D409 02268 CHBASE = $D409 ; Character set base address (high byte)
=D40A 02269 WSYNC = $D40A ; Wait for horizontal synchronization
=D40B 02270 VCOUNT = $D40B ; Vertical line counter
=D40E 02271 NMIEN = $D40E ; Non-maskable interrupt (NMI) enable
=E000 02272 ROMCHARSET = $E000 ; ROM character set
02273
02274 ;*******************************************************************************
02275 ;* *
02276 ;* G A M E S Y M B O L S *
02277 ;* *
02278 ;*******************************************************************************
02279
=0062 02280 MISSIONLEVEL = $62
=0063 02281 FKEYCODE = $63
=0064 02282 ISDEMOMODE = $64
=0065 02283 NEWTITLEPHR = $65
=0066 02284 IDLECNTHI = $66
=0067 02285 ISVBISYNC = $67
=0068 02286 MEMPTR = $68
02287
=006A 02288 DIVIDEND = $6A
=006D 02289 JOYSTICKDELTA = $6D
02290
02291
=0070 02292 VELOCITYLO = $70
=0071 02293 NEWVELOCITY = $71
=0072 02294 COUNT8 = $72
=0073 02295 EXPLLIFE = $73
=0074 02296 CLOCKTIM = $74
=0075 02297 DOCKSTATE = $75
=0076 02298 COUNT256 = $76
=0077 02299 IDLECNTLO = $77
=0078 02300 ZYLONUNITTIM = $78
=0079 02301 MAXSPCOBJIND = $79
=007A 02302 OLDMAXSPCOBJIND = $7A
=007B 02303 ISSTARBASESECT = $7B
=007C 02304 ISTRACKCOMPON = $7C
=007D 02305 DRAINSHIELDS = $7D
=007E 02306 DRAINATTCOMP = $7E
=007F 02307 ENERGYCNT = $7F
=0080 02308 DRAINENGINES = $80
=0081 02309 SHIELDSCOLOR = $81
=0082 02310 PL3HIT = $82
=0083 02311 PL4HIT = $83
=0084 02312 OLDTRIG0 = $84
02313
=0086 02314 ISTRACKING = $86
=0087 02315 BARRELNR = $87
=0088 02316 LOCKONLIFE = $88
=0089 02317 PLTRACKED = $89
=008A 02318 HITBADNESS = $8A
=008B 02319 REDALERTLIFE = $8B
=008C 02320 WARPDEPRROW = $8C
=008D 02321 WARPDEPRCOLUMN = $8D
=008E 02322 WARPARRVROW = $8E
=008F 02323 WARPARRVCOLUMN = $8F
=0090 02324 CURRSECTOR = $90
=0091 02325 WARPENERGY = $91
=0092 02326 ARRVSECTOR = $92
=0093 02327 HUNTSECTOR = $93
=0094 02328 HUNTSECTCOLUMN = $94
=0095 02329 HUNTSECTROW = $95
=0096 02330 NEWZYLONDIST = $96
=009E 02331 OLDZYLONDIST = $9E
=009F 02332 HUNTTIM = $9F
=00A0 02333 BLIPCOLUMN = $A0
=00A1 02334 BLIPROW = $A1
=00A2 02335 BLIPCYCLECNT = $A2
=00A3 02336 ISINLOCKON = $A3
=00A4 02337 DIRLEN = $A4
=00A5 02338 PENROW = $A5
=00A6 02339 PENCOLUMN = $A6
=00A7 02340 CTRLDZYLON = $A7
=00A8 02341 ZYLONFLPAT0 = $A8
=00A9 02342 ZYLONFLPAT1 = $A9
=00AA 02343 MILESTTIM0 = $AA
=00AB 02344 MILESTTIM1 = $AB
=00AC 02345 MILESTVELINDZ0 = $AC
=00AD 02346 MILESTVELINDZ1 = $AD
=00AE 02347 MILESTVELINDX0 = $AE
=00AF 02348 MILESTVELINDX1 = $AF
=00B0 02349 MILESTVELINDY0 = $B0
=00B1 02350 MILESTVELINDY1 = $B1
=00B2 02351 ZYLONVELINDZ0 = $B2
=00B3 02352 ZYLONVELINDZ1 = $B3
=00B4 02353 ZYLONVELINDX0 = $B4
=00B5 02354 ZYLONVELINDX1 = $B5
=00B6 02355 ZYLONVELINDY0 = $B6
=00B7 02356 ZYLONVELINDY1 = $B7
=00B8 02357 ISBACKATTACK0 = $B8
=00B9 02358 ISBACKATTACK1 = $B9
=00BA 02359 ZYLONTIMX0 = $BA
=00BB 02360 ZYLONTIMX1 = $BB
=00BC 02361 ZYLONTIMY0 = $BC
=00BD 02362 ZYLONTIMY1 = $BD
=00BE 02363 TORPEDODELAY = $BE
=00BF 02364 ZYLONATTACKER = $BF
=00C0 02365 WARPSTATE = $C0
=00C1 02366 VELOCITYHI = $C1
=00C2 02367 TRAILDELAY = $C2
=00C3 02368 TRAILIND = $C3
=00C4 02369 WARPTEMPCOLUMN = $C4
=00C5 02370 WARPTEMPROW = $C5
=00C6 02371 VEERMASK = $C6
=00C7 02372 VICINITYMASK = $C7
=00C8 02373 JOYSTICKX = $C8
=00C9 02374 JOYSTICKY = $C9
=00CA 02375 KEYCODE = $CA
=00CB 02376 SCORE = $CB
=00CD 02377 SCOREDRANKIND = $CD
=00CE 02378 SCOREDCLASSIND = $CE
=00CF 02379 TITLELIFE = $CF
=00D0 02380 SHIPVIEW = $D0
=00D1 02381 TITLEPHR = $D1
=00D2 02382 BEEPFRQIND = $D2
=00D3 02383 BEEPREPEAT = $D3
=00D4 02384 BEEPTONELIFE = $D4
=00D5 02385 BEEPPAUSELIFE = $D5
=00D6 02386 BEEPPRIORITY = $D6
=00D7 02387 BEEPFRQSTART = $D7
=00D8 02388 BEEPLIFE = $D8
=00D9 02389 BEEPTOGGLE = $D9
=00DA 02390 NOISETORPTIM = $DA
=00DB 02391 NOISEEXPLTIM = $DB
=00DC 02392 NOISEAUDC2 = $DC
=00DD 02393 NOISEAUDC3 = $DD
=00DE 02394 NOISEAUDF1 = $DE
=00DF 02395 NOISEAUDF2 = $DF
=00E0 02396 NOISEFRQINC = $E0
=00E1 02397 NOISELIFE = $E1
=00E2 02398 NOISEZYLONTIM = $E2
=00E3 02399 NOISEHITLIFE = $E3
=00E4 02400 PL0SHAPOFF = $E4
=00E5 02401 PL1SHAPOFF = $E5
=00E6 02402 PL2SHAPOFF = $E6
=00E7 02403 PL3SHAPOFF = $E7
=00E8 02404 PL4SHAPOFF = $E8
=00E9 02405 PL0LIFE = $E9
=00EA 02406 PL1LIFE = $EA
=00EB 02407 PL2LIFE = $EB
=00EC 02408 PL3LIFE = $EC
=00ED 02409 PL4LIFE = $ED
=00EE 02410 PL0COLOR = $EE
=00EF 02411 PL1COLOR = $EF
=00F0 02412 PL2COLOR = $F0
=00F1 02413 PL3COLOR = $F1
=00F2 02414 PF0COLOR = $F2
=00F3 02415 PF1COLOR = $F3
=00F4 02416 PF2COLOR = $F4
=00F5 02417 PF3COLOR = $F5
=00F6 02418 BGRCOLOR = $F6
=00F7 02419 PF0COLORDLI = $F7
=00F8 02420 PF1COLORDLI = $F8
=00F9 02421 PF2COLORDLI = $F9
=00FA 02422 PF3COLORDLI = $FA
=00FB 02423 BGRCOLORDLI = $FB
=0280 02424 DSPLST = $0280
=0300 02425 PL4DATA = $0300
=0400 02426 PL0DATA = $0400
=0500 02427 PL1DATA = $0500
=0600 02428 PL2DATA = $0600
=0700 02429 PL3DATA = $0700
=0800 02430 PFMEMROWLO = $0800
=0864 02431 PFMEMROWHI = $0864
=08C9 02432 GCMEMMAP = $08C9
=0949 02433 PANELTXT = $0949
=094B 02434 VELOCD1 = $094B
=0950 02435 KILLCNTD1 = $0950
=0955 02436 ENERGYD1 = $0955
=095A 02437 TRACKC1 = $095A
=095C 02438 TRACKDIGIT = $095C
=0960 02439 THETAC1 = $0960
=0966 02440 PHIC1 = $0966
=096C 02441 RANGEC1 = $096C
=0971 02442 GCTXT = $0971
=097D 02443 GCWARPD1 = $097D
=098D 02444 GCTRGCNT = $098D
=0992 02445 GCSTATPHO = $0992
=0993 02446 GCSTATENG = $0993
=0994 02447 GCSTATSHL = $0994
=0995 02448 GCSTATCOM = $0995
=0996 02449 GCSTATLRS = $0996
=0997 02450 GCSTATRAD = $0997
=09A3 02451 GCSTARDAT = $09A3
=09AD 02452 ZPOSSIGN = $09AD
=09AF 02453 PL2ZPOSSIGN = $09AF
=09B0 02454 PL3ZPOSSIGN = $09B0
=09B1 02455 PL4ZPOSSIGN = $09B1
=09DE 02456 XPOSSIGN = $09DE
=09E0 02457 PL2XPOSSIGN = $09E0
=09E1 02458 PL3XPOSSIGN = $09E1
=09E2 02459 PL4XPOSSIGN = $09E2
=0A0F 02460 YPOSSIGN = $0A0F
=0A11 02461 PL2YPOSSIGN = $0A11
=0A12 02462 PL3YPOSSIGN = $0A12
=0A13 02463 PL4YPOSSIGN = $0A13
=0A40 02464 ZPOSHI = $0A40
=0A40 02465 PL0ZPOSHI = $0A40
=0A42 02466 PL2ZPOSHI = $0A42
=0A43 02467 PL3ZPOSHI = $0A43
=0A44 02468 PL4ZPOSHI = $0A44
=0A71 02469 XPOSHI = $0A71
=0A73 02470 PL2XPOSHI = $0A73
=0A74 02471 PL3XPOSHI = $0A74
=0A75 02472 PL4XPOSHI = $0A75
=0AA2 02473 YPOSHI = $0AA2
=0AA4 02474 PL2YPOSHI = $0AA4
=0AA5 02475 PL3YPOSHI = $0AA5
=0AA6 02476 PL4YPOSHI = $0AA6
=0AD3 02477 ZPOSLO = $0AD3
=0AD5 02478 PL2ZPOSLO = $0AD5
=0AD6 02479 PL3ZPOSLO = $0AD6
=0AD7 02480 PL4ZPOSLO = $0AD7
=0B04 02481 XPOSLO = $0B04
=0B06 02482 PL2XPOSLO = $0B06
=0B07 02483 PL3XPOSLO = $0B07
=0B08 02484 PL4XPOSLO = $0B08
=0B35 02485 YPOSLO = $0B35
=0B37 02486 PL2YPOSLO = $0B37
=0B38 02487 PL3YPOSLO = $0B38
=0B39 02488 PL4YPOSLO = $0B39
=0B66 02489 ZVEL = $0B66
=0B66 02490 PL0ZVEL = $0B66
=0B67 02491 PL1ZVEL = $0B67
=0B68 02492 PL2ZVEL = $0B68
=0B69 02493 PL3ZVEL = $0B69
=0B6A 02494 PL4ZVEL = $0B6A
=0B97 02495 XVEL = $0B97
=0B97 02496 PL0XVEL = $0B97
=0B98 02497 PL1XVEL = $0B98
=0B99 02498 PL2XVEL = $0B99
=0B9A 02499 PL3XVEL = $0B9A
=0B9B 02500 PL4XVEL = $0B9B
=0BC8 02501 YVEL = $0BC8
=0BC8 02502 PL0YVEL = $0BC8
=0BC9 02503 PL1YVEL = $0BC9
=0BCA 02504 PL2YVEL = $0BCA
=0BCB 02505 PL3YVEL = $0BCB
=0BCC 02506 PL4YVEL = $0BCC
=0BF9 02507 PIXELROWNEW = $0BF9
=0BF9 02508 PL0ROWNEW = $0BF9
=0BFA 02509 PL1ROWNEW = $0BFA
=0BFB 02510 PL2ROWNEW = $0BFB
=0BFC 02511 PL3ROWNEW = $0BFC
=0BFD 02512 PL4ROWNEW = $0BFD
=0C2A 02513 PIXELCOLUMN = $0C2A
=0C2A 02514 PL0COLUMN = $0C2A
=0C2B 02515 PL1COLUMN = $0C2B
=0C2C 02516 PL2COLUMN = $0C2C
=0C2D 02517 PL3COLUMN = $0C2D
=0C2E 02518 PL4COLUMN = $0C2E
=0C5B 02519 PIXELROW = $0C5B
=0C5B 02520 PL0ROW = $0C5B
=0C5C 02521 PL1ROW = $0C5C
=0C5D 02522 PL2ROW = $0C5D
=0C5E 02523 PL3ROW = $0C5E
=0C5F 02524 PL4ROW = $0C5F
=0C8C 02525 PIXELBYTEOFF = $0C8C
=0C8C 02526 PL0SHAPTYPE = $0C8C
=0C8D 02527 PL1SHAPTYPE = $0C8D
=0C8E 02528 PL2SHAPTYPE = $0C8E
=0C8F 02529 PL3SHAPTYPE = $0C8F
=0C90 02530 PL4SHAPTYPE = $0C90
=0CBD 02531 PIXELSAVE = $0CBD
=0CBD 02532 PL0HEIGHT = $0CBD
=0CBE 02533 PL1HEIGHT = $0CBE
=0CBF 02534 PL2HEIGHT = $0CBF
=0CC0 02535 PL3HEIGHT = $0CC0
=0CC1 02536 PL4HEIGHT = $0CC1
=0CEE 02537 PIXELBYTE = $0CEE
=0CEE 02538 PL0HEIGHTNEW = $0CEE
=0CEF 02539 PL1HEIGHTNEW = $0CEF
=0CF0 02540 PL2HEIGHTNEW = $0CF0
=0CF1 02541 PL3HEIGHTNEW = $0CF1
=0CF2 02542 PL4HEIGHTNEW = $0CF2
=0D1F 02543 TITLETXT = $0D1F
=0D35 02544 GCPFMEM = $0D35
=0DE9 02545 MAPTO80 = $0DE9
=0EE9 02546 MAPTOBCD99 = $0EE9
=1000 02547 PFMEM = $1000
02548
02549 *= $A000
02550
02551 ;*******************************************************************************
02552 ;* *
02553 ;* G A M E D A T A ( P A R T 1 O F 2 ) *
02554 ;* *
02555 ;*******************************************************************************
02556
02557 ;*** Number of space objects ***************************************************
02558
=0005 02559 NUMSPCOBJ.PL = 5 ; Number of PLAYER space objects
=000C 02560 NUMSPCOBJ.STARS = 12 ; Number of PLAYFIELD space objects (stars only)
=0011 02561 NUMSPCOBJ.NORM = NUMSPCOBJ.PL+NUMSPCOBJ.STARS ; Normal number of space objects
=0031 02562 NUMSPCOBJ.ALL = 49 ; Maximum number of space objects
02563
02564 ;*** PLAYER shape data offsets *************************************************
02565
=0000 02566 SHAP.TORPEDO = $00 ; Photon torpedo
=0010 02567 SHAP.ZFIGHTER = $10 ; Zylon fighter
=0020 02568 SHAP.STARBASEL = $20 ; Starbase (left part)
=0030 02569 SHAP.STARBASEC = $30 ; Starbase (center part)
=0040 02570 SHAP.STARBASER = $40 ; Starbase (right part)
=0050 02571 SHAP.TRANSVSSL = $50 ; Transfer vessel
=0060 02572 SHAP.METEOR = $60 ; Meteor
=0070 02573 SHAP.ZCRUISER = $70 ; Zylon cruiser
=0080 02574 SHAP.ZBASESTAR = $80 ; Zylon basestar
=0090 02575 SHAP.HYPERWARP = $90 ; Hyperwarp Target Marker
02576
02577 ;*** ROM character set constants ***********************************************
=0000 02578 ROM.SPC = $00 ; ROM character ' '
=000E 02579 ROM.DOT = $0E ; ROM character '.'
=0010 02580 ROM.0 = $10 ; ROM character '0'
=0011 02581 ROM.1 = $11 ; ROM character '1'
=0012 02582 ROM.2 = $12 ; ROM character '2'
=0013 02583 ROM.3 = $13 ; ROM character '3'
=0014 02584 ROM.4 = $14 ; ROM character '4'
=0015 02585 ROM.5 = $15 ; ROM character '5'
=0019 02586 ROM.9 = $19 ; ROM character '9'
=001A 02587 ROM.COLON = $1A ; ROM character ':'
=0021 02588 ROM.A = $21 ; ROM character 'A'
=0023 02589 ROM.C = $23 ; ROM character 'C'
=0024 02590 ROM.D = $24 ; ROM character 'D'
=0025 02591 ROM.E = $25 ; ROM character 'E'
=0027 02592 ROM.G = $27 ; ROM character 'G'
=002C 02593 ROM.L = $2C ; ROM character 'L'
=002E 02594 ROM.N = $2E ; ROM character 'N'
=0030 02595 ROM.P = $30 ; ROM character 'P'
=0032 02596 ROM.R = $32 ; ROM character 'R'
=0033 02597 ROM.S = $33 ; ROM character 'S'
=0034 02598 ROM.T = $34 ; ROM character 'T'
=0037 02599 ROM.W = $37 ; ROM character 'W'
=0039 02600 ROM.Y = $39 ; ROM character 'Y'
02601
02602 ;*** Custom character set constants ********************************************
=0040 02603 CCS.COL1 = $40 ; COLOR1 bits for text in GR1/2 text mode
=0080 02604 CCS.COL2 = $80 ; COLOR2 bits for text in GR1/2 text mode
=00C0 02605 CCS.COL3 = $C0 ; COLOR3 bits for text in GR1/2 text mode
02606
=0000 02607 CCS.0 = 0 ; Custom character '0'
=0001 02608 CCS.1 = 1 ; Custom character '1'
=0002 02609 CCS.2 = 2 ; Custom character '2'
=0003 02610 CCS.3 = 3 ; Custom character '3'
=0004 02611 CCS.4 = 4 ; Custom character '4'
=0005 02612 CCS.5 = 5 ; Custom character '5'
=0006 02613 CCS.6 = 6 ; Custom character '6'
=0007 02614 CCS.7 = 7 ; Custom character '7'
=0008 02615 CCS.8 = 8 ; Custom character '8'
=0009 02616 CCS.9 = 9 ; Custom character '9'
=000A 02617 CCS.SPC = 10 ; Custom character ' '
=000B 02618 CCS.COLON = 11 ; Custom character ':'
=000C 02619 CCS.BORDERSW = 12 ; Custom character 'BORDER SOUTHWEST'
=000D 02620 CCS.E = 13 ; Custom character 'E'
=000E 02621 CCS.INF = 14 ; Custom character 'INFINITY'
=000F 02622 CCS.MINUS = 15 ; Custom character '-'
=0010 02623 CCS.PLUS = 16 ; Custom character '+'
=0011 02624 CCS.PHI = 17 ; Custom character 'PHI'
=0012 02625 CCS.V = 18 ; Custom character 'V'
=0013 02626 CCS.R = 19 ; Custom character 'R'
=0014 02627 CCS.THETA = 20 ; Custom character 'THETA'
=0015 02628 CCS.K = 21 ; Custom character 'K'
=0016 02629 CCS.T = 22 ; Custom character 'T'
=0017 02630 CCS.C = 23 ; Custom character 'C'
=0018 02631 CCS.BORDERS = 24 ; Custom character 'BORDER SOUTH'
=0019 02632 CCS.BORDERW = 25 ; Custom character 'BORDER WEST'
=001A 02633 CCS.CORNERSW = 26 ; Custom character 'CORNER SOUTHWEST'
=001B 02634 CCS.STARBASE = 27 ; Custom character 'STARBASE SECTOR'
=001C 02635 CCS.4ZYLONS = 28 ; Custom character '4-ZYLON SECTOR'
=001D 02636 CCS.3ZYLONS = 29 ; Custom character '3-ZYLON SECTOR'
=001E 02637 CCS.2ZYLONS = 30 ; Custom character '2-ZYLON SECTOR'
02638
02639 ;*** Custom character set ******************************************************
02640 ;
02641 ; 0 1 2 3 4 5 6 7
02642 ; ........ ........ ........ ........ ........ ........ ........ ........
02643 ; .####### ..##.... .####... .####... .##..... .####... .####... .#####..
02644 ; .#...### ...#.... ....#... ....#... .##..... .#...... .#..#... .#...#..
02645 ; .#...### ...#.... ....#... ....#... .##..... .#...... .#...... .....#..
02646 ; .#...### ...#.... .####... .#####.. .##.##.. .####... .#...... ...###..
02647 ; .#...### ..###... .#...... ....##.. .#####.. ....#... .######. ...#....
02648 ; .#...### ..###... .#...... ....##.. ....##.. ....#... .#....#. ...#....
02649 ; .####### ..###... .####... .#####.. ....##.. .####... .######. ...#....
02650 ;
02651 ; 8 9 10 11 12 13 14 15
02652 ; ........ ........ ........ ..###... #....... ........ ........ ........
02653 ; ..###... .#####.. ........ ..###... #....... ..####.. .##..##. ........
02654 ; ..#.#... .#...#.. ........ ..###... #....... ..#..... #..##..# ........
02655 ; ..#.#... .#...#.. ........ ........ #....... ..#..... #..##..# .######.
02656 ; .#####.. .#####.. ........ ........ #....... .####... #..##..# ........
02657 ; .##.##.. ....##.. ........ ..###... #....... .##..... .##..##. ........
02658 ; .##.##.. ....##.. ........ ..###... #....... .##..... ........ ........
02659 ; .#####.. ....##.. ........ ..###... ######## .#####.. ........ ........
02660 ;
02661 ; 16 17 18 19 20 21 22 23
02662 ; ........ ........ .##..##. ........ ........ ........ #######. ######..
02663 ; ...##... ...##... .##..##. .#####.. ...###.. .#...##. #..#..#. #...##..
02664 ; ...##... .######. .##..##. .#...#.. ..#####. .#...##. ...#.... #...##..
02665 ; ...##... ##.##.## .##..##. .#...#.. .##...## .#...#.. ...##... #.......
02666 ; .######. #..##..# .##..##. .#####.. .#.###.# .#####.. ...##... #.......
02667 ; ...##... ##.##.## ..#.##.. .##.#... .##...## .##..#.. ...##... #.......
02668 ; ...##... .######. ..###... .##.##.. ..#####. .##..##. ...##... #....#..
02669 ; ...##... ...##... ..##.... .##.##.. ...###.. .##..##. ...##... ######..
02670 ;
02671 ; 24 25 26 27 28 29 30
02672 ; ........ #....... ........ #....... #....... #....... #.......
02673 ; ........ #....... ........ #.#.#.#. #..##... #...###. #.##....
02674 ; ........ #....... ........ #..###.. #....... #....... #..##...
02675 ; ........ #....... ........ #.#####. #.##.##. #.###... #.#####.
02676 ; ........ #....... ........ #..###.. #....... #....... #..##...
02677 ; ........ #....... ........ #.#.#.#. #...##.. #..###.. #.##....
02678 ; ........ #....... ........ #....... #....... #....... #.......
02679 ; ######## #....... #....... ######## ######## ######## ########
02680
A000 007F4747 02681 CHARSET .BYTE $00,$7F,$47,$47,$47,$47,$47,$7F ; Custom character '0'
A004 4747477F
A008 00301010 02682 .BYTE $00,$30,$10,$10,$10,$38,$38,$38 ; Custom character '1'
A00C 10383838
A010 00780808 02683 .BYTE $00,$78,$08,$08,$78,$40,$40,$78 ; Custom character '2'
A014 78404078
A018 00780808 02684 .BYTE $00,$78,$08,$08,$7C,$0C,$0C,$7C ; Custom character '3'
A01C 7C0C0C7C
A020 00606060 02685 .BYTE $00,$60,$60,$60,$6C,$7C,$0C,$0C ; Custom character '4'
A024 6C7C0C0C
A028 00784040 02686 .BYTE $00,$78,$40,$40,$78,$08,$08,$78 ; Custom character '5'
A02C 78080878
A030 00784840 02687 .BYTE $00,$78,$48,$40,$40,$7E,$42,$7E ; Custom character '6'
A034 407E427E
A038 007C4404 02688 .BYTE $00,$7C,$44,$04,$1C,$10,$10,$10 ; Custom character '7'
A03C 1C101010
A040 00382828 02689 .BYTE $00,$38,$28,$28,$7C,$6C,$6C,$7C ; Custom character '8'
A044 7C6C6C7C
A048 007C4444 02690 .BYTE $00,$7C,$44,$44,$7C,$0C,$0C,$0C ; Custom character '9'
A04C 7C0C0C0C
A050 00000000 02691 .BYTE $00,$00,$00,$00,$00,$00,$00,$00 ; Custom character ' '
A054 00000000
A058 38383800 02692 .BYTE $38,$38,$38,$00,$00,$38,$38,$38 ; Custom character ':'
A05C 00383838
A060 80808080 02693 .BYTE $80,$80,$80,$80,$80,$80,$80,$FF ; Custom character 'BORDER SOUTHWEST'
A064 808080FF
A068 003C2020 02694 .BYTE $00,$3C,$20,$20,$78,$60,$60,$7C ; Custom character 'E'
A06C 7860607C
A070 00669999 02695 .BYTE $00,$66,$99,$99,$99,$66,$00,$00 ; Custom character 'INFINITY'
A074 99660000
A078 0000007E 02696 .BYTE $00,$00,$00,$7E,$00,$00,$00,$00 ; Custom character '-'
A07C 00000000
A080 00181818 02697 .BYTE $00,$18,$18,$18,$7E,$18,$18,$18 ; Custom character '+'
A084 7E181818
A088 00187EDB 02698 .BYTE $00,$18,$7E,$DB,$99,$DB,$7E,$18 ; Custom character 'PHI'
A08C 99DB7E18
A090 66666666 02699 .BYTE $66,$66,$66,$66,$66,$2C,$38,$30 ; Custom character 'V'
A094 662C3830
A098 007C4444 02700 .BYTE $00,$7C,$44,$44,$7C,$68,$6C,$6C ; Custom character 'R'
A09C 7C686C6C
A0A0 001C3E63 02701 .BYTE $00,$1C,$3E,$63,$5D,$63,$3E,$1C ; Custom character 'THETA'
A0A4 5D633E1C
A0A8 00464644 02702 .BYTE $00,$46,$46,$44,$7C,$64,$66,$66 ; Custom character 'K'
A0AC 7C646666
A0B0 FE921018 02703 .BYTE $FE,$92,$10,$18,$18,$18,$18,$18 ; Custom character 'T'
A0B4 18181818
A0B8 FC8C8C80 02704 .BYTE $FC,$8C,$8C,$80,$80,$80,$84,$FC ; Custom character 'C'
A0BC 808084FC
A0C0 00000000 02705 .BYTE $00,$00,$00,$00,$00,$00,$00,$FF ; Custom character 'BORDER SOUTH'
A0C4 000000FF
A0C8 80808080 02706 .BYTE $80,$80,$80,$80,$80,$80,$80,$80 ; Custom character 'BORDER WEST'
A0CC 80808080
A0D0 00000000 02707 .BYTE $00,$00,$00,$00,$00,$00,$00,$80 ; Custom character 'CORNER SOUTHWEST'
A0D4 00000080
A0D8 80AA9CBE 02708 .BYTE $80,$AA,$9C,$BE,$9C,$AA,$80,$FF ; Custom character 'STARBASE SECTOR'
A0DC 9CAA80FF
A0E0 809880B6 02709 .BYTE $80,$98,$80,$B6,$80,$8C,$80,$FF ; Custom character '4-ZYLON SECTOR'
A0E4 808C80FF
A0E8 808E80B8 02710 .BYTE $80,$8E,$80,$B8,$80,$9C,$80,$FF ; Custom character '3-CYCLON SECTOR'
A0EC 809C80FF
A0F0 80B098BE 02711 .BYTE $80,$B0,$98,$BE,$98,$B0,$80,$FF ; Custom character '2-ZYLON SECTOR'
A0F4 98B080FF
02712
02713 ;*** Header text of Long-Range Scan view (shares spaces with following header) *
A0F8 00006C6F 02714 LRSHEADER .BYTE $00,$00,$6C,$6F,$6E,$67,$00,$72 ; " LONG RANGE SCAN"
A0FC 6E670072
A100 616E6765 02715 .BYTE $61,$6E,$67,$65,$00,$73,$63,$61
A104 00736361
A108 6E 02716 .BYTE $6E
02717
02718 ;*** Header text of Aft view (shares spaces with following header) *************
A109 00000000 02719 AFTHEADER .BYTE $00,$00,$00,$00,$00,$00,$61,$66 ; " AFT VIEW "
A10D 00006166
A111 74007669 02720 .BYTE $74,$00,$76,$69,$65,$77,$00,$00
A115 65770000
A119 00 02721 .BYTE $00
02722
02723 ;*** Header text of Galactic Chart view ****************************************
A11A 00000067 02724 GCHEADER .BYTE $00,$00,$00,$67,$61,$6C,$61,$63 ; " GALACTIC CHART "
A11E 616C6163
A122 74696300 02725 .BYTE $74,$69,$63,$00,$63,$68,$61,$72
A126 63686172
A12A 74000000 02726 .BYTE $74,$00,$00,$00
02727
02728 ;*** Display List of Galactic Chart view ***************************************
A12E 60 02729 DLSTGC .BYTE $60 ; BLK7
A12F 461AA1 02730 .BYTE $46,<GCHEADER,>GCHEADER ; GR2 @ GCHEADER
A132 F0 02731 .BYTE $F0 ; BLK8 + DLI
A133 47350D 02732 .BYTE $47,<GCPFMEM,>GCPFMEM ; GR1 @ GCPFMEM
A136 07 02733 .BYTE $07 ; GR1
A137 07 02734 .BYTE $07 ; GR1
A138 07 02735 .BYTE $07 ; GR1
A139 07 02736 .BYTE $07 ; GR1
A13A 07 02737 .BYTE $07 ; GR1
A13B 07 02738 .BYTE $07 ; GR1
A13C 07 02739 .BYTE $07 ; GR1
A13D 07 02740 .BYTE $07 ; GR1
A13E 80 02741 .BYTE $80 ; BLK1 + DLI
A13F 461F0D 02742 .BYTE $46,<TITLETXT,>TITLETXT ; GR2 @ TITLETXT
A142 467109 02743 .BYTE $46,<GCTXT,>GCTXT ; GR2 @ GCTXT
A145 06 02744 .BYTE $06 ; GR2
A146 06 02745 .BYTE $06 ; GR2
A147 418002 02746 .BYTE $41,<DSPLST,>DSPLST ; JMP @ DSPLST
02747
02748 ;*******************************************************************************
02749 ;* *
02750 ;* G A M E C O D E *
02751 ;* *
02752 ;*******************************************************************************
02753
02754 ;*******************************************************************************
02755 ;* *
02756 ;* INITCOLD *
02757 ;* *
02758 ;* Initialize program (Cold start) *
02759 ;* *
02760 ;*******************************************************************************
02761
02762 ; DESCRIPTION
02763 ;
02764 ; Initializes the program, then continues into the game loop at GAMELOOP
02765 ; ($A1F3).
02766 ;
02767 ; There are four entry points to initialization:
02768 ;
02769 ; (1) INITCOLD ($A14A) is entered at initial cartridge startup (cold start).
02770 ; This initializes POKEY, resets the idle counter, sets the mission level
02771 ; to NOVICE mission, and clears the function key code. POKEY is enabled to
02772 ; receive keyboard input. Code execution continues into INITSELECT ($A15A)
02773 ; below.
02774 ;
02775 ; (2) INITSELECT ($A15A) is entered from GAMELOOP ($A1F3) after the SELECT
02776 ; function key has been pressed. This loads the title phrase offset for the
02777 ; copyright notice. Code execution continues into INITDEMO ($A15C) below.
02778 ;
02779 ; (3) INITDEMO ($A15C) is entered when the program switches into demo mode.
02780 ; This loads the demo mode flag. Code execution continues into INITSTART
02781 ; ($A15E) below.
02782 ;
02783 ; (4) INITSTART ($A15E) is entered from GAMELOOP ($A1F3) after the START
02784 ; function key has been pressed. This enqueues the new title phrase and
02785 ; enables or disables demo mode, depending on the preloaded value.
02786 ;
02787 ; Initialization continues with the following steps:
02788 ;
02789 ; (1) Clear the custom chip registers and zero-page program variables from
02790 ; ISVBISYNC ($0067) on.
02791 ;
02792 ; NOTE: Because of loop jamming there is a loop index overshoot. Instead of
02793 ; clearing memory at addresses $0067..$00FB, the memory at addresses
02794 ; $0067..$0166 is cleared. This does no harm because $0100..$0166 is a yet
02795 ; unused part of the 6502 CPU stack.
02796 ;
02797 ; NOTE: At address $A175 a hack is necessary in the source code to fake a
02798 ; STA ISVBISYNC,X instruction with a 16-bit address. ISVBISYNC ($0067) is a
02799 ; zero-page address and regular assemblers would translate STA ISVBISYNC,X
02800 ; into the byte sequence $95 $67, not $9D $67 $00. This indicates that the
02801 ; original ROM was maybe created using a special assembler, perhaps a
02802 ; cross-assembler.
02803 ;
02804 ; (2) Initialize the 6502 CPU (reset the stack pointer, disable decimal mode).
02805 ;
02806 ; (3) Clear program memory from $0200..$1FFF in subroutine CLRMEM ($AE0F).
02807 ;
02808 ; (4) Set the address vectors of the IRQ, VBI, and DLI handlers.
02809 ;
02810 ; (5) Enable input from Joystick 0.
02811 ;
02812 ; (6) Enable Player/Missile graphics, providing a fifth PLAYER.
02813 ;
02814 ; BUG (at $A1A6): The set PLAYER-PLAYFIELD priority arranges PLAYERs in
02815 ; front of the PLAYFIELD. This makes sense as space objects represented by
02816 ; PLAYERs (for example, Zylon ships, photon torpedoes, and meteors) move in
02817 ; front of the stars, which are part of the PLAYFIELD. However, PLAYERs
02818 ; also move in front of the cross hairs, which are also part of the
02819 ; PLAYFIELD. Suggested fix: None, technically not possible.
02820 ;
02821 ; (7) Do more initialization in subroutine INITIALIZE ($B3BA).
02822 ;
02823 ; (8) Set display to Front view.
02824 ;
02825 ; (9) Show or hide the Control Panel Display (bottom text window) in subroutine
02826 ; MODDLST ($ADF1), depending on the demo mode flag.
02827 ;
02828 ; (10) Initialize our starship's velocity equivalent to speed key '6'.
02829 ;
02830 ; (11) Enable the Display List.
02831 ;
02832 ; (12) Initialize the number of space objects to 16 (5 PLAYER space objects + 12
02833 ; PLAYFIELD space objects (stars)).
02834 ;
02835 ; (13) Set the title phrase to the selected mission level in subroutine SETTITLE
02836 ; ($B223).
02837 ;
02838 ; (14) Enable the IRQ, DLI, and VBI interrupts.
02839 ;
02840 ; Code execution continues into the game loop at GAMELOOP ($A1F3).
02841
A14A A900 02842 INITCOLD LDA #0 ;
A14C 8D0FD2 02843 STA SKCTL ; POKEY: Initialization
A14F 8566 02844 STA IDLECNTHI ; Reset idle counter
A151 8562 02845 STA MISSIONLEVEL ; Mission level := NOVICE mission
A153 8563 02846 STA FKEYCODE ; Clear function key code
A155 A903 02847 LDA #$03 ; POKEY: Enable keyboard scan and debounce
A157 8D0FD2 02848 STA SKCTL ;
02849
02850 ;*** Entry point when SELECT function key was pressed **************************
A15A A02F 02851 INITSELECT LDY #$2F ; Prep title phrase "COPYRIGHT ATARI 1979"
02852
02853 ;*** Entry point when program switches into demo mode **************************
A15C A9FF 02854 INITDEMO LDA #$FF ; Prep demo mode flag
02855
02856 ;*** Entry point when START function key was pressed ***************************
A15E 8465 02857 INITSTART STY NEWTITLEPHR ; Enqueue new title phrase
A160 8564 02858 STA ISDEMOMODE ; Store demo mode flag
02859
02860 ;*** More initialization *******************************************************
A162 A900 02861 LDA #0 ; Clear custom chip registers, zero-page variables
A164 AA 02862 TAX ;
A165 9D00D0 02863 LOOP001 STA HPOSP0,X ; Clear $D000..$D0FF (GTIA registers)
A168 9D00D4 02864 STA DMACTL,X ; Clear $D400..$D4FF (ANTIC registers)
A16B E00F 02865 CPX #$0F ;
A16D B003 02866 BCS SKIP001 ;
A16F 9D00D2 02867 STA AUDF1,X ; Clear $D200..$D20E (POKEY registers)
02868
A172 9D00D3 02869 SKIP001 STA PORTA,X ; Clear $D300..$D3FF (PIA registers)
02870 ; Clear $0067..$0166 (zero-page program variables)
A175 9D 02871 .BYTE $9D ; HACK: Fake STA ISVBISYNC,X with 16-bit address
A176 6700 02872 .WORD ISVBISYNC ;
A178 E8 02873 INX ;
A179 D0EA 02874 BNE LOOP001 ;
02875
A17B CA 02876 DEX ; Reset 6502 CPU stack pointer
A17C 9A 02877 TXS ;
02878
A17D D8 02879 CLD ; Clear 6502 CPU decimal mode
02880
A17E A902 02881 LDA #$02 ; Clear $0200..$1FFF (program memory)
A180 200FAE 02882 JSR CLRMEM ;
02883
A183 A951 02884 LDA #<IRQHNDLR ; Set IRQ handler (VIMIRQ)
A185 8D1602 02885 STA VIMIRQ ;
A188 A9A7 02886 LDA #>IRQHNDLR ;
A18A 8D1702 02887 STA VIMIRQ+1 ;
02888
A18D A9D1 02889 LDA #<VBIHNDLR ; Set VBI and DLI handler (VVBLKI and VDSLST)
A18F 8D2202 02890 STA VVBLKI ;
A192 A918 02891 LDA #<DLSTHNDLR ;
A194 8D0002 02892 STA VDSLST ;
A197 A9A6 02893 LDA #>VBIHNDLR ;
A199 8D2302 02894 STA VVBLKI+1 ;
A19C A9A7 02895 LDA #>DLSTHNDLR ;
A19E 8D0102 02896 STA VDSLST+1 ;
02897
A1A1 A904 02898 LDA #$04 ; PIA: Enable PORTA (Joystick 0)
A1A3 8D02D3 02899 STA PACTL ;
A1A6 A911 02900 LDA #$11 ; GTIA: Enable PLAYER4, prio: PLs > PFs > BGR (!)
A1A8 8D1BD0 02901 STA PRIOR ; (PLAYERs appear behind cross hairs)
A1AB A903 02902 LDA #$03 ; GTIA: Enable DMA for PLAYERs and MISSILEs
A1AD 8D1DD0 02903 STA GRACTL ;
02904
A1B0 20BAB3 02905 JSR INITIALIZE ; Init Display List, tables, Galactic Chart, etc.
02906
A1B3 A20A 02907 LDX #$0A ; Set Front view
A1B5 2045B0 02908 JSR SETVIEW ;
02909
A1B8 A564 02910 LDA ISDEMOMODE ; If in/not in demo mode hide/show...
A1BA 2980 02911 AND #$80 ; ...Control Panel Display (bottom text window)
A1BC A8 02912 TAY ;
A1BD A25F 02913 LDX #$5F ;
A1BF A908 02914 LDA #$08 ;
A1C1 20F1AD 02915 JSR MODDLST ;
02916
A1C4 A920 02917 LDA #32 ; Init our starship's velocity (= speed key '6')
A1C6 8571 02918 STA NEWVELOCITY ;
02919
A1C8 A980 02920 LDA #<DSPLST ; ANTIC: Set Display List
A1CA 8D02D4 02921 STA DLIST ;
A1CD A902 02922 LDA #>DSPLST ;
A1CF 8D03D4 02923 STA DLIST+1 ;
02924
A1D2 A93E 02925 LDA #$3E ; ANTIC: Enable Display List DMA, single-line PM
A1D4 8D00D4 02926 STA DMACTL ; resolution, PM DMA, normal-width PLAYFIELD
02927
A1D7 A900 02928 LDA #0 ; ANTIC: Set PM memory base address
A1D9 8D07D4 02929 STA PMBASE ;
02930
A1DC A910 02931 LDA #NUMSPCOBJ.NORM-1 ; Set normal number of space objects
A1DE 8579 02932 STA MAXSPCOBJIND ; (5 PLAYER spc objs + 12 PLAYFIELD spc objs (stars))
02933
A1E0 A662 02934 LDX MISSIONLEVEL ; Set title phrase
A1E2 BC0CBF 02935 LDY MISSIONPHRTAB,X ; NOVICE, PILOT, WARRIOR, or COMMANDER MISSION
A1E5 2023B2 02936 JSR SETTITLE ;
02937
A1E8 A940 02938 LDA #$40 ; POKEY: Enable keyboard interrupt (IRQ)
A1EA 8D0ED2 02939 STA IRQEN ;
02940
A1ED 58 02941 CLI ; Enable all IRQs
02942
A1EE A9C0 02943 LDA #$C0 ; ANTIC: Enable DLI and VBI
A1F0 8D0ED4 02944 STA NMIEN ;
02945
02946 ;*******************************************************************************
02947 ;* *
02948 ;* GAMELOOP *
02949 ;* *
02950 ;*******************************************************************************
02951
02952 ; DESCRIPTION
02953 ;
02954 ; The game loop is the main part of the program. It is basically an infinite
02955 ; loop that collects input, computes the game state, and updates the display. It
02956 ; executes the following steps:
02957 ;
02958 ; (1) Synchronize the start of the game loop with the vertical blank phase of
02959 ; the TV beam, which flagged by the Vertical Blank Interrupt handler
02960 ; VBIHNDLR ($A6D1). This prevents screen flicker while the PLAYFIELD is
02961 ; redrawn at the begin of the game loop, because during the vertical blank
02962 ; phase the TV beam is turned off and nothing is rendered on the TV
02963 ; display.
02964 ;
02965 ; (2) Erase all PLAYFIELD space objects (stars, explosion fragments) from the
02966 ; PLAYFIELD that were drawn in the previous game loop iteration.
02967 ;
02968 ; (3) Draw the updated PLAYFIELD space objects (stars, explosion fragments)
02969 ; into the PLAYFIELD (skip this if in hyperspace).
02970 ;
02971 ; (4) If the idle counter has reached its trigger value then clear the center
02972 ; of the PLAYFIELD, an 8 x 2 pixel rectangle with a top-left position at
02973 ; pixel column number 76 and pixel row number 49 (?).
02974 ;
02975 ; (5) Clear all PLAYER shapes.
02976 ;
02977 ; (6) Update the vertical position of all PLAYERs and update all PLAYER shapes.
02978 ;
02979 ; (7) Update the horizontal position of all PLAYERs.
02980 ;
02981 ; (8) Rotate the position vector of all space objects horizontally and
02982 ; vertically, according to the saved joystick position (skip this if in
02983 ; Galactic Chart view) using subroutine ROTATE ($B69B).
02984 ;
02985 ; (9) Move our starship forward in space. Our starship is always located at the
02986 ; center of the program's 3D coordinate system, so all space objects are
02987 ; moved along the z-axis toward our starship by subtracting a displacement
02988 ; from their z-coordinate. The amount of the displacement depends on our
02989 ; starship's velocity.
02990 ;
02991 ; BUG (at $A3C1): This operation is not applied to Photon torpedoes (?).
02992 ; Suggested fix: Remove LDA PL0SHAPTYPE,X and BEQ SKIP011.
02993 ;
02994 ; (10) Add the proper velocity vector of all space objects to their position
02995 ; vector (except for stars, which do not have any proper motion).
02996 ;
02997 ; BUG (at $A419): The correct maximum loop index is NUMSPCOBJ.ALL*3 = 147
02998 ; instead of 144. Suggested fix: Replace CMP #144 with CMP #147.
02999 ;
03000 ; (11) Correct the position vector components (coordinates) of all PLAYER space
03001 ; objects if they have over- or underflowed during the calculations of the
03002 ; previous steps.
03003 ;
03004 ; (12) Calculate the perspective projection of the position vectors of all space
03005 ; objects and from that their pixel row and column number (applies to Front
03006 ; and Aft view) using subroutines PROJECTION ($AA21), SCREENCOLUMN ($B6FB),
03007 ; and SCREENROW ($B71E). If a space object (star, explosion fragment) moved
03008 ; offscreen then a new space object is automatically created in subroutine
03009 ; SCREENCOLUMN ($B6FB).
03010 ;
03011 ; (13) Handle hyperwarp marker selection in the Galactic Chart view in
03012 ; subroutine SELECTWARP ($B162).
03013 ;
03014 ; (14) If in Long-Range Scan view, compute the pixel column number and the pixel
03015 ; row number of all PLAYFIELD space objects (stars, explosion fragments) on
03016 ; the plane established by the z and x axis of the 3D coordinate system
03017 ; using subroutines SCREENCOLUMN ($B6FB) and SCREENROW ($B71E). Our
03018 ; starship's shape is drawn using subroutine DRAWLINES ($A76F). If the
03019 ; Long-Range Scan is OK then PLAYFIELD space object pixel numbers are
03020 ; computed and drawn. This is skipped if the Long-Range Scan is destroyed.
03021 ;
03022 ; (15) Update all PLAYER shapes, heights, and colors (see detailed description
03023 ; below).
03024 ;
03025 ; (16) Flash a red alert when leaving hyperspace into a sector containing Zylon
03026 ; ships by setting appropriate colors to PLAYFIELD2 and BACKGROUND.
03027 ;
03028 ; (17) Update the color of all PLAYFIELD space objects (stars, explosion
03029 ; fragments). The color calculation is similar to that of the PLAYER color
03030 ; calculation in (15). It also computes a range index and uses the same
03031 ; color lookup table FOURCOLORPIXEL ($BA90). If a star in the Aft view
03032 ; became too distant (z-coordinate < -$F000 (-4096) <KM>) its position is
03033 ; re-initialized in subroutine INITPOSVEC ($B764).
03034 ;
03035 ; (18) If in demo mode skip input handling and jump directly to function key
03036 ; handling (28).
03037 ;
03038 ; (19) Handle keyboard input in subroutine KEYBOARD ($AFFE).
03039 ;
03040 ; (20) Handle joystick input. Store the current joystick directions in JOYSTICKX
03041 ; ($C8) and JOYSTICKY ($C9).
03042 ;
03043 ; (21) Check if our starship's photon torpedoes have hit a target in subroutine
03044 ; COLLISION ($AF3D). This subroutine triggers a game over if all Zylon
03045 ; ships have been destroyed.
03046 ;
03047 ; (22) Handle the joystick trigger in subroutine TRIGGER ($AE29).
03048 ;
03049 ; (23) Handle the Attack Computer and Tracking Computer. If the Attack Computer
03050 ; is neither destroyed nor switched off then execute the following steps:
03051 ;
03052 ; o Update the Attack Computer Display's blip and lock-on markers in
03053 ; subroutine UPDATTCOMP ($A7BF) (if in Front view).
03054 ;
03055 ; o Update the tracking index of the currently tracked PLAYER space
03056 ; object. If a Zylon ship is tracked, then make sure to always track
03057 ; the Zylon ship that launched the last Zylon photon torpedo. If this
03058 ; Zylon ship is not alive then track the other Zylon ship - if alive.
03059 ;
03060 ; o If the Tracking Computer is on then switch to the view that shows the
03061 ; tracked PLAYER space object by emulating pressing the 'F' (Front
03062 ; view) or 'A' (Aft view) key (only if in Front or Aft view).
03063 ;
03064 ; (24) Handle docking at a starbase in subroutine DOCKING ($ACE6).
03065 ;
03066 ; (25) Handle maneuvering both of our starship's photon torpedoes, the single
03067 ; Zylon photon torpedo, and the attacking Zylon ships in subroutine
03068 ; MANEUVER ($AA79). This subroutine also automatically creates meteors and
03069 ; new Zylon ships.
03070 ;
03071 ; (26) Check if our starship was hit by a Zylon photon torpedo (skip this if in
03072 ; a starbase sector): Its x, y, and z coordinates must be within a range of
03073 ; -($0100)..+$00FF (-256..+255) <KM> of our starship.
03074 ;
03075 ; (27) If our starship was hit then execute the following steps:
03076 ;
03077 ; o Damage or destroy one of our starship's subsystems in subroutine
03078 ; DAMAGE ($AEE1).
03079 ;
03080 ; o Trigger an explosion in subroutine INITEXPL ($AC6B),
03081 ;
03082 ; o Store the severity of the hit.
03083 ;
03084 ; o End the lifetime of the Zylon photon torpedo.
03085 ;
03086 ; o Subtract 100 energy units for being hit by the Zylon photon torpedo
03087 ; in subroutine DECENERGY ($B86F).
03088 ;
03089 ; o Trigger the noise sound pattern SHIELD EXPLOSION in subroutine NOISE
03090 ; ($AEA8).
03091 ;
03092 ; If the Shields were down during the hit, our starship is destroyed.
03093 ; Execute the following steps:
03094 ;
03095 ; o Switch to Front view.
03096 ;
03097 ; o Flash the title phrase "SHIP DESTROYED BY ZYLON FIRE".
03098 ;
03099 ; o Add the mission bonus to the internal game score in subroutine
03100 ; GAMEOVER ($B10A).
03101 ;
03102 ; o Hide the Control Panel Display (bottom text window) in subroutine
03103 ; MODDLST ($ADF1).
03104 ;
03105 ; o Clear the PLAYFIELD in subroutine CLRPLAYFIELD ($AE0D).
03106 ;
03107 ; o Enable the STARSHIP EXPLOSION noise.
03108 ;
03109 ; (28) Handle the function keys START and SELECT. If SELECT has been pressed
03110 ; cycle through the next of the 4 mission levels. If either START or SELECT
03111 ; have been pressed, reset the idle counter, then jump to the corresponding
03112 ; program initialization subroutines INITSTART ($A15E) or INITSELECT
03113 ; ($A15A), respectively.
03114 ;
03115 ; (29) Update the Control Panel Display in subroutine UPDPANEL ($B804).
03116 ;
03117 ; (30) Handle hyperwarp in subroutine HYPERWARP ($A89B).
03118 ;
03119 ; (31) Update the text in the title line in subroutine UPDTITLE ($B216).
03120 ;
03121 ; (32) Move Zylon units, decrease lifetime of photon torpedoes, elapse game
03122 ; time, etc. in subroutine FLUSHGAMELOOP ($B4E4). This subroutine also
03123 ; triggers a game over if our starship's energy is zero.
03124 ;
03125 ; (33) Jump back to the start of the game loop for the next game loop iteration.
03126
=006A 03127 L.HEIGHTCNT = $6A ; Height counter during copying a PLAYER shape
=006E 03128 L.ZPOSOFF = $6E ; Offset to z-coordinate
=006B 03129 L.VELOCITYHI = $6B ; Velocity vector component (high byte)
=006A 03130 L.VECCOMPIND = $6A ; Position vector component index. Used values are:
03131 ; 0 -> z-component
03132 ; 1 -> x-component
03133 ; 2 -> y-component
=006A 03134 L.RANGEINDEX = $6A ; Range index for space object, computed from the
03135 ; distance to our starship. Used to pick the shape
03136 ; cell index of the PLAYERs shape data and shape
03137 ; height. Used values are: 0..15.
=006A 03138 L.FOURCOLORPIX = $6A ; 1-byte bit pattern for 4 pixels of same color
=006B 03139 L.COLORMASK = $6B ; Color/brightness to modify PLAYER color
03140
03141 ;*** (1) Synchronize game loop with execution of VBI ***************************
A1F3 A567 03142 GAMELOOP LDA ISVBISYNC ; Wait for execution of VBI
A1F5 F0FC 03143 BEQ GAMELOOP ;
03144
A1F7 A900 03145 LDA #0 ; VBI is executed, clear VBI sync flag
A1F9 8567 03146 STA ISVBISYNC ;
03147
03148 ;*** (2) Erase PLAYFIELD space objects (stars, explosion fragments) ************
A1FB A57A 03149 LDA OLDMAXSPCOBJIND ; Skip if no space objects in use
A1FD F020 03150 BEQ SKIP002 ;
03151
A1FF A204 03152 LDX #NUMSPCOBJ.PL-1 ; Loop over all PLAYFIELD space objs (X index > 4)
A201 E8 03153 LOOP002 INX ;
A202 BC5B0C 03154 LDY PIXELROW,X ; Load pixel row number of PLAYFIELD space object
03155
A205 B90008 03156 LDA PFMEMROWLO,Y ; Point MEMPTR to start of pixel's row...
A208 8568 03157 STA MEMPTR ; ...in PLAYFIELD memory
A20A B96408 03158 LDA PFMEMROWHI,Y ;
A20D 8569 03159 STA MEMPTR+1 ;
03160
A20F BC8C0C 03161 LDY PIXELBYTEOFF,X ; Get within-row-offset to byte with space obj pixel
A212 BDBD0C 03162 LDA PIXELSAVE,X ; Load saved byte
A215 9168 03163 STA (MEMPTR),Y ; Restore byte of PLAYFIELD memory
03164
A217 E47A 03165 CPX OLDMAXSPCOBJIND ;
A219 90E6 03166 BCC LOOP002 ; Next PLAYFIELD space object
03167
A21B A900 03168 LDA #0 ; Clear number of space objects
A21D 857A 03169 STA OLDMAXSPCOBJIND ;
03170
03171 ;*** (3) Draw PLAYFIELD space objects (stars, explosion fragments) *************
A21F A5C0 03172 SKIP002 LDA WARPSTATE ; Skip during hyperspace
A221 302D 03173 BMI SKIP003 ;
03174
A223 A679 03175 LDX MAXSPCOBJIND ; Update number of space objects
A225 867A 03176 STX OLDMAXSPCOBJIND ;
03177
A227 BDF90B 03178 LOOP003 LDA PIXELROWNEW,X ; Loop over all PLAYFIELD space objs (X index > 4)
A22A 9D5B0C 03179 STA PIXELROW,X ; Update pixel row number of PLAYFIELD space object
03180
A22D A8 03181 TAY ;
A22E B90008 03182 LDA PFMEMROWLO,Y ; Point MEMPTR to start of pixel's row...
A231 8568 03183 STA MEMPTR ; ...in PLAYFIELD memory
A233 B96408 03184 LDA PFMEMROWHI,Y ;
A236 8569 03185 STA MEMPTR+1 ;
03186
A238 BD2A0C 03187 LDA PIXELCOLUMN,X ; Convert pixel column number to within-row-offset
A23B 4A 03188 LSR A ; ...of byte with space obj pixel (4 pixels = 1 byte)
A23C 4A 03189 LSR A ;
A23D 9D8C0C 03190 STA PIXELBYTEOFF,X ; Store within-row-offset
03191
A240 A8 03192 TAY ;
A241 B168 03193 LDA (MEMPTR),Y ; Load pixel's byte from PLAYFIELD memory
A243 9DBD0C 03194 STA PIXELSAVE,X ; Save it (for restoring it in next game loop)
A246 1DEE0C 03195 ORA PIXELBYTE,X ; Blend with pixel's color bit-pattern
A249 9168 03196 STA (MEMPTR),Y ; Store byte in PLAYFIELD memory
03197
A24B CA 03198 DEX ;
A24C E004 03199 CPX #NUMSPCOBJ.PL-1 ;
A24E D0D7 03200 BNE LOOP003 ; Next PLAYFIELD space object
03201
03202 ;*** (4) Clear PLAYFIELD center if idle counter is up (?) **********************
03203 ; PLAYFIELD addresses of...
=17BB 03204 PFMEM.C76R49 = PFMEM+49*40+76/4 ; ...pixel column number 76, row number 49
=17BC 03205 PFMEM.C80R49 = PFMEM+49*40+80/4 ; ...pixel column number 80, row number 49
=17E3 03206 PFMEM.C76R50 = PFMEM+50*40+76/4 ; ...pixel column number 76, row number 50
=17E4 03207 PFMEM.C80R50 = PFMEM+50*40+80/4 ; ...pixel column number 80, row number 50
03208
A250 A566 03209 SKIP003 LDA IDLECNTHI ; Skip if idle counter not negative
A252 100E 03210 BPL SKIP004 ;
03211
A254 A900 03212 LDA #0 ; Clear pixels of 8 x 2 pixel rectangle...
A256 8DE317 03213 STA PFMEM.C76R50 ; ...@ column number 76, row number 49 (?)
A259 8DE417 03214 STA PFMEM.C80R50 ;
A25C 8DBC17 03215 STA PFMEM.C80R49 ;
A25F 8DBB17 03216 STA PFMEM.C76R49 ;
03217
03218 ;*** (5) Clear all PLAYER shapes ***********************************************
A262 A900 03219 SKIP004 LDA #0 ; Clear shape of PLAYER4
A264 AC5F0C 03220 LDY PL4ROW ;
A267 AEC10C 03221 LDX PL4HEIGHT ;
A26A 990003 03222 LOOP004 STA PL4DATA,Y ;
A26D C8 03223 INY ;
A26E CA 03224 DEX ;
A26F 10F9 03225 BPL LOOP004 ;
03226
A271 AC5E0C 03227 LDY PL3ROW ; Clear shape of PLAYER3
A274 AEC00C 03228 LDX PL3HEIGHT ;
A277 990007 03229 LOOP005 STA PL3DATA,Y ;
A27A C8 03230 INY ;
A27B CA 03231 DEX ;
A27C 10F9 03232 BPL LOOP005 ;
03233
A27E AC5D0C 03234 LDY PL2ROW ; Clear shape of PLAYER2
A281 AEBF0C 03235 LDX PL2HEIGHT ;
A284 990006 03236 LOOP006 STA PL2DATA,Y ;
A287 C8 03237 INY ;
A288 CA 03238 DEX ;
A289 10F9 03239 BPL LOOP006 ;
03240
A28B AC5C0C 03241 LDY PL1ROW ; Clear shape of PLAYER1
A28E AEBE0C 03242 LDX PL1HEIGHT ;
A291 990005 03243 LOOP007 STA PL1DATA,Y ;
A294 C8 03244 INY ;
A295 CA 03245 DEX ;
A296 10F9 03246 BPL LOOP007 ;
03247
A298 AC5B0C 03248 LDY PL0ROW ; Clear shape of PLAYER0
A29B AEBD0C 03249 LDX PL0HEIGHT ;
A29E 990004 03250 LOOP008 STA PL0DATA,Y ;
A2A1 C8 03251 INY ;
A2A2 CA 03252 DEX ;
A2A3 10F9 03253 BPL LOOP008 ;
03254
03255 ;*** (6) Update PLAYER vertical positions and update PLAYER shapes *************
A2A5 AD900C 03256 LDA PL4SHAPTYPE ; CARRY := PLAYER4 a PHOTON TORPEDO (shape type 0)?
A2A8 C901 03257 CMP #1 ;
A2AA A4E8 03258 LDY PL4SHAPOFF ; Load PLAYER4 shape data offset
03259
A2AC AEFD0B 03260 LDX PL4ROWNEW ; Update vertical position of PLAYER4
A2AF 8E5F0C 03261 STX PL4ROW ;
03262
A2B2 ADF20C 03263 LDA PL4HEIGHTNEW ; Update PLAYER4 shape height
A2B5 856A 03264 STA L.HEIGHTCNT ;
A2B7 8DC10C 03265 STA PL4HEIGHT ;
03266
A2BA B9E4B8 03267 LOOP009 LDA PLSHAP1TAB,Y ; Load PLAYER4 shape byte from shape data table
A2BD B003 03268 BCS SKIP005 ; Skip if PLAYER4 not PHOTON TORPEDO (shape type 0)
A2BF 2D0AD2 03269 AND RANDOM ; AND random bits to shape byte
A2C2 9D0003 03270 SKIP005 STA PL4DATA,X ; Store shape byte in PLAYER4 data area
A2C5 C8 03271 INY ;
A2C6 E8 03272 INX ;
A2C7 C66A 03273 DEC L.HEIGHTCNT ;
A2C9 10EF 03274 BPL LOOP009 ; Next row of PLAYER4 shape
03275
A2CB AD8F0C 03276 LDA PL3SHAPTYPE ; Repeat above with PLAYER3
A2CE C901 03277 CMP #1 ;
A2D0 A4E7 03278 LDY PL3SHAPOFF ;
A2D2 AEFC0B 03279 LDX PL3ROWNEW ;
A2D5 8E5E0C 03280 STX PL3ROW ;
A2D8 ADF10C 03281 LDA PL3HEIGHTNEW ;
A2DB 856A 03282 STA L.HEIGHTCNT ;
A2DD 8DC00C 03283 STA PL3HEIGHT ;
A2E0 B9E4B8 03284 LOOP010 LDA PLSHAP1TAB,Y ;
A2E3 B003 03285 BCS SKIP006 ;
A2E5 2D0AD2 03286 AND RANDOM ;
A2E8 9D0007 03287 SKIP006 STA PL3DATA,X ;
A2EB E8 03288 INX ;
A2EC C8 03289 INY ;
A2ED C66A 03290 DEC L.HEIGHTCNT ;
A2EF 10EF 03291 BPL LOOP010 ;
03292
A2F1 AD8E0C 03293 LDA PL2SHAPTYPE ; Repeat above with PLAYER2
A2F4 C901 03294 CMP #1 ;
A2F6 A4E6 03295 LDY PL2SHAPOFF ;
A2F8 AEFB0B 03296 LDX PL2ROWNEW ;
A2FB 8E5D0C 03297 STX PL2ROW ;
A2FE ADF00C 03298 LDA PL2HEIGHTNEW ;
A301 856A 03299 STA L.HEIGHTCNT ;
A303 8DBF0C 03300 STA PL2HEIGHT ;
A306 B9E4B8 03301 LOOP011 LDA PLSHAP1TAB,Y ;
A309 B003 03302 BCS SKIP007 ;
A30B 2D0AD2 03303 AND RANDOM ;
A30E 9D0006 03304 SKIP007 STA PL2DATA,X ;
A311 E8 03305 INX ;
A312 C8 03306 INY ;
A313 C66A 03307 DEC L.HEIGHTCNT ;
A315 10EF 03308 BPL LOOP011 ;
03309
A317 A4E5 03310 LDY PL1SHAPOFF ; Repeat above with PLAYER1 (without torpedo part)
A319 AEFA0B 03311 LDX PL1ROWNEW ;
A31C 8E5C0C 03312 STX PL1ROW ;
A31F ADEF0C 03313 LDA PL1HEIGHTNEW ;
A322 856A 03314 STA L.HEIGHTCNT ;
A324 8DBE0C 03315 STA PL1HEIGHT ;
A327 B9B1B9 03316 LOOP012 LDA PLSHAP2TAB,Y ;
A32A 9D0005 03317 STA PL1DATA,X ;
A32D E8 03318 INX ;
A32E C8 03319 INY ;
A32F C66A 03320 DEC L.HEIGHTCNT ;
A331 10F4 03321 BPL LOOP012 ;
03322
A333 A4E4 03323 LDY PL0SHAPOFF ; Repeat above with PLAYER0 (without torpedo part)
A335 AEF90B 03324 LDX PL0ROWNEW ;
A338 8E5B0C 03325 STX PL0ROW ;
A33B ADEE0C 03326 LDA PL0HEIGHTNEW ;
A33E 856A 03327 STA L.HEIGHTCNT ;
A340 8DBD0C 03328 STA PL0HEIGHT ;
A343 B9B1B9 03329 LOOP013 LDA PLSHAP2TAB,Y ;
A346 9D0004 03330 STA PL0DATA,X ;
A349 E8 03331 INX ;
A34A C8 03332 INY ;
A34B C66A 03333 DEC L.HEIGHTCNT ;
A34D 10F4 03334 BPL LOOP013 ;
03335
03336 ;*** (7) Update PLAYER horizontal positions ************************************
A34F AD2A0C 03337 LDA PL0COLUMN ; Update horizontal position of PLAYER0
A352 8D00D0 03338 STA HPOSP0 ;
A355 AD2B0C 03339 LDA PL1COLUMN ; Update horizontal position of PLAYER1
A358 8D01D0 03340 STA HPOSP1 ;
A35B AD2C0C 03341 LDA PL2COLUMN ; Update horizontal position of PLAYER2
A35E 8D02D0 03342 STA HPOSP2 ;
A361 AD2D0C 03343 LDA PL3COLUMN ; Update horizontal position of PLAYER3
A364 8D03D0 03344 STA HPOSP3 ;
A367 AD2E0C 03345 LDA PL4COLUMN ; Update horizontal position of PLAYER4
A36A 8D07D0 03346 STA HPOSM3 ;
A36D 18 03347 CLC ;
A36E 6902 03348 ADC #2 ;
A370 8D06D0 03349 STA HPOSM2 ;
A373 6902 03350 ADC #2 ;
A375 8D05D0 03351 STA HPOSM1 ;
A378 6902 03352 ADC #2 ;
A37A 8D04D0 03353 STA HPOSM0 ;
03354
03355 ;*** (8) Rotate space objects horizontally and vertically **********************
A37D 24D0 03356 BIT SHIPVIEW ; Skip if in Galactic Chart view
A37F 303A 03357 BMI SKIP009 ;
03358
03359 ;*** Rotate horizontally *******************************************************
A381 A5C8 03360 LDA JOYSTICKX ; Skip if joystick centered horizontally
A383 F019 03361 BEQ SKIP008 ;
03362
A385 856D 03363 STA JOYSTICKDELTA ; Save JOYSTICKX (used in subroutine ROTATE)
A387 A479 03364 LDY MAXSPCOBJIND ; Loop over all space objects in use
A389 846E 03365 LOOP014 STY L.ZPOSOFF ; Save offset to z-coordinate
A38B 18 03366 CLC ;
03367
A38C 98 03368 TYA ;
A38D AA 03369 TAX ; X := offset to z-coordinate
A38E 6931 03370 ADC #NUMSPCOBJ.ALL ;
A390 A8 03371 TAY ; Y := offset to x-coordinate
A391 209BB6 03372 JSR ROTATE ; Calc new x-coordinate (horizontal rot @ y-axis)
03373
A394 98 03374 TYA ;
A395 AA 03375 TAX ; X := offset to x-coordinate
A396 A46E 03376 LDY L.ZPOSOFF ; Y := offset to z-coordinate
A398 209BB6 03377 JSR ROTATE ; Calc new z-coordinate (horizontal rot @ y-axis)
A39B 88 03378 DEY ;
A39C 10EB 03379 BPL LOOP014 ; Next space object
03380
03381 ;*** Rotate vertically *********************************************************
A39E A5C9 03382 SKIP008 LDA JOYSTICKY ; Skip if joystick centered vertically
A3A0 F019 03383 BEQ SKIP009 ;
03384
A3A2 856D 03385 STA JOYSTICKDELTA ; Save JOYSTICKY (used in subroutine ROTATE)
A3A4 A479 03386 LDY MAXSPCOBJIND ; Loop over all space objects in use
A3A6 846E 03387 LOOP015 STY L.ZPOSOFF ; Save offset to z-coordinate
A3A8 18 03388 CLC ;
03389
A3A9 98 03390 TYA ;
A3AA AA 03391 TAX ; X := offset to z-coordinate
A3AB 6962 03392 ADC #NUMSPCOBJ.ALL*2 ;
A3AD A8 03393 TAY ; Y := offset to y-coordinate
A3AE 209BB6 03394 JSR ROTATE ; Calc new y-coordinate (vertical rot @ x-axis)
03395
A3B1 98 03396 TYA ;
A3B2 AA 03397 TAX ; X := offset to y-coordinate
A3B3 A46E 03398 LDY L.ZPOSOFF ; Y := offset to z-coordinate
A3B5 209BB6 03399 JSR ROTATE ; Calc new z-coordinate (vertical rot @ x-axis)
A3B8 88 03400 DEY ;
A3B9 10EB 03401 BPL LOOP015 ; Next space object
03402
03403 ;*** (9) Move all space objects along z-axis (toward our starship) *************
A3BB A679 03404 SKIP009 LDX MAXSPCOBJIND ; Loop over all space objects in use
A3BD E005 03405 LOOP016 CPX #NUMSPCOBJ.PL ; Skip if PLAYFIELD space object (X index > 4)
A3BF B005 03406 BCS SKIP010 ;
03407
A3C1 BD8C0C 03408 LDA PL0SHAPTYPE,X ; Skip if next PLAYER space obj is PHOTON TORPEDO (!)
A3C4 F019 03409 BEQ SKIP011 ;
03410
A3C6 38 03411 SKIP010 SEC ; New z-coordinate := old z-coordinate -
A3C7 BDD30A 03412 LDA ZPOSLO,X ; ...our starship's velocity
A3CA E570 03413 SBC VELOCITYLO ; (signed 24-bit subtraction)
A3CC 9DD30A 03414 STA ZPOSLO,X ;
A3CF BD400A 03415 LDA ZPOSHI,X ;
A3D2 E5C1 03416 SBC VELOCITYHI ;
A3D4 9D400A 03417 STA ZPOSHI,X ;
A3D7 BDAD09 03418 LDA ZPOSSIGN,X ;
A3DA E900 03419 SBC #0 ;
A3DC 9DAD09 03420 STA ZPOSSIGN,X ;
03421
A3DF CA 03422 SKIP011 DEX ;
A3E0 10DB 03423 BPL LOOP016 ; Next space object
03424
03425 ;*** (10) Add space object's velocity vector to space object's position vector *
A3E2 A679 03426 LDX MAXSPCOBJIND ; Loop over all space objects in use
A3E4 E010 03427 LOOP017 CPX #NUMSPCOBJ.NORM-1 ; Skip if space object is star (X index 5..16)...
A3E6 D002 03428 BNE SKIP012 ; ...because stars don't move by themselves
A3E8 A204 03429 LDX #4 ;
03430
A3EA 8A 03431 SKIP012 TXA ;
A3EB A8 03432 LOOP018 TAY ; Loop over all 3 coordinates
03433
A3EC A900 03434 LDA #0 ; Expand 8-bit velocity vector component to 16-bit:
A3EE 856B 03435 STA L.VELOCITYHI ; ...16-bit velocity (high byte) = L.VELOCITYHI := 0
A3F0 B9660B 03436 LDA ZVEL,Y ; ...16-bit velocity (low byte) = A := ZVEL,Y
A3F3 1009 03437 BPL SKIP013 ; Skip if 16-bit velocity >= 0 (positive)
03438
A3F5 497F 03439 EOR #$7F ; 16-bit velocity < 0 (negative)...
A3F7 18 03440 CLC ; ...calculate two's-complement of 16-bit velocity
A3F8 6901 03441 ADC #1 ;
A3FA B002 03442 BCS SKIP013 ;
A3FC C66B 03443 DEC L.VELOCITYHI ;
03444
A3FE 18 03445 SKIP013 CLC ; New coordinate := old coordinate + 16-bit velocity
A3FF 79D30A 03446 ADC ZPOSLO,Y ; (signed 24-bit addition)
A402 99D30A 03447 STA ZPOSLO,Y ;
A405 B9400A 03448 LDA ZPOSHI,Y ;
A408 656B 03449 ADC L.VELOCITYHI ;
A40A 99400A 03450 STA ZPOSHI,Y ;
A40D B9AD09 03451 LDA ZPOSSIGN,Y ;
A410 656B 03452 ADC L.VELOCITYHI ;
A412 99AD09 03453 STA ZPOSSIGN,Y ;
03454
A415 98 03455 TYA ;
A416 18 03456 CLC ;
A417 6931 03457 ADC #NUMSPCOBJ.ALL ;
A419 C990 03458 CMP #144 ; (!)
A41B 90CE 03459 BCC LOOP018 ; Next coordinate
03460
A41D CA 03461 DEX ;
A41E 10C4 03462 BPL LOOP017 ; Next space object
03463
03464 ;*** (11) Correct over/underflow of PLAYER space objects' position vector ******
A420 A004 03465 LDY #NUMSPCOBJ.PL-1 ;
A422 98 03466 LOOP019 TYA ; Loop over all PLAYER space objects (X index < 5)
A423 AA 03467 TAX ;
03468
A424 A902 03469 LDA #2 ; Loop over all 3 coordinates
A426 856A 03470 STA L.VECCOMPIND ;
03471
A428 BDAD09 03472 LOOP020 LDA ZPOSSIGN,X ; Load sign of coordinate
A42B C902 03473 CMP #2 ;
A42D 9010 03474 BCC SKIP015 ; Skip if sign = 0 (negative) or 1 (positive)
03475
A42F 0A 03476 ASL A ; SUMMARY: Space object out-of-bounds correction
A430 A900 03477 LDA #0 ; If new coordinate > +65535 <KM> subtract 256 <KM>
A432 9DAD09 03478 STA ZPOSSIGN,X ; ...until new coordinate <= +65535 <KM>
A435 B005 03479 BCS SKIP014 ; If new coordinate < -65536 <KM> add 256 <KM>
A437 FEAD09 03480 INC ZPOSSIGN,X ; ...until new coordinate >= -65536 <KM>
A43A 49FF 03481 EOR #$FF ;
A43C 9D400A 03482 SKIP014 STA ZPOSHI,X ;
03483
A43F 8A 03484 SKIP015 TXA ;
A440 18 03485 CLC ;
A441 6931 03486 ADC #NUMSPCOBJ.ALL ;
A443 AA 03487 TAX ;
A444 C66A 03488 DEC L.VECCOMPIND ;
A446 10E0 03489 BPL LOOP020 ; Next coordinate
03490
A448 88 03491 DEY ;
A449 10D7 03492 BPL LOOP019 ; Next space object
03493
03494 ;*** (12) Calc perspective projection of space objects *************************
A44B A5D0 03495 LDA SHIPVIEW ; Skip if in Long-Range Scan or Galactic Chart view
A44D C902 03496 CMP #$02 ;
A44F B05C 03497 BCS SKIP019 ;
03498
A451 A679 03499 LDX MAXSPCOBJIND ; Loop over all space objects in use
A453 A9FF 03500 LOOP021 LDA #255 ; Prep magic offscreen pixel number value
A455 BCAD09 03501 LDY ZPOSSIGN,X ; Compare sign of z-coordinate with view mode
A458 C4D0 03502 CPY SHIPVIEW ;
A45A F04B 03503 BEQ SKIP018 ; Equal? Space object is offscreen -> New space obj!
03504
A45C BD0F0A 03505 LDA YPOSSIGN,X ; Prepare projection division...
A45F D012 03506 BNE SKIP016 ; DIVIDEND (16-bit value) := ABS(y-coordinate)
A461 38 03507 SEC ; (used in subroutine PROJECTION)
A462 A900 03508 LDA #0 ;
A464 FD350B 03509 SBC YPOSLO,X ;
A467 856A 03510 STA DIVIDEND ;
A469 A900 03511 LDA #0 ;
A46B FDA20A 03512 SBC YPOSHI,X ;
A46E 856B 03513 STA DIVIDEND+1 ;
A470 4C7DA4 03514 JMP JUMP001 ;
A473 BD350B 03515 SKIP016 LDA YPOSLO,X ;
A476 856A 03516 STA DIVIDEND ;
A478 BDA20A 03517 LDA YPOSHI,X ;
A47B 856B 03518 STA DIVIDEND+1 ;
03519
A47D 2021AA 03520 JUMP001 JSR PROJECTION ; Calc pixel row number rel. to screen center
A480 201EB7 03521 JSR SCREENROW ; Calc pixel row number rel. to top-left of screen
03522
A483 BDDE09 03523 LDA XPOSSIGN,X ; Prepare projection division...
A486 D012 03524 BNE SKIP017 ; DIVIDEND (16-bit value) := ABS(x-coordinate)
A488 38 03525 SEC ; (used in subroutine PROJECTION)
A489 A900 03526 LDA #0 ;
A48B FD040B 03527 SBC XPOSLO,X ;
A48E 856A 03528 STA DIVIDEND ;
A490 A900 03529 LDA #0 ;
A492 FD710A 03530 SBC XPOSHI,X ;
A495 856B 03531 STA DIVIDEND+1 ;
A497 4CA4A4 03532 JMP JUMP002 ;
A49A BD040B 03533 SKIP017 LDA XPOSLO,X ;
A49D 856A 03534 STA DIVIDEND ;
A49F BD710A 03535 LDA XPOSHI,X ;
A4A2 856B 03536 STA DIVIDEND+1 ;
03537
A4A4 2021AA 03538 JUMP002 JSR PROJECTION ; Calc pixel column number rel. to screen center
A4A7 20FBB6 03539 SKIP018 JSR SCREENCOLUMN ; Calc pixel column number rel. to top-left of screen
A4AA CA 03540 DEX ;
A4AB 10A6 03541 BPL LOOP021 ; Next space object
03542
03543 ;*** (13) Handle hyperwarp marker selection in Galactic Chart view *************
A4AD 2062B1 03544 SKIP019 JSR SELECTWARP ; Handle hyperwarp marker in Galactic Chart view
03545
03546 ;*** (14) Compute and draw Long-Range Scan view star field on z-x plane ********
A4B0 24D0 03547 BIT SHIPVIEW ; Skip if not in Long-Range Scan view
A4B2 5031 03548 BVC SKIP022 ;
03549
A4B4 A231 03550 LDX #$31 ; Draw our starship's shape
A4B6 206FA7 03551 JSR DRAWLINES ;
03552
A4B9 2C9609 03553 BIT GCSTATLRS ; Skip if Long-Range Scan destroyed
A4BC 7027 03554 BVS SKIP022 ;
03555
A4BE A679 03556 LDX MAXSPCOBJIND ; Loop over all space objects in use
A4C0 BD400A 03557 LOOP022 LDA ZPOSHI,X ; Load z-coordinate (high byte)
A4C3 BCAD09 03558 LDY ZPOSSIGN,X ; Load sign of z-coordinate
A4C6 D002 03559 BNE SKIP020 ;
A4C8 49FF 03560 EOR #$FF ; A := ABS(z-coordinate (high byte))
A4CA A8 03561 SKIP020 TAY ;
A4CB B9E90D 03562 LDA MAPTO80,Y ; Calc pixel row number rel. to screen center
A4CE 201EB7 03563 JSR SCREENROW ; Calc pixel row number rel. to top-left of screen
03564
A4D1 BD710A 03565 LDA XPOSHI,X ; Load x-coordinate (high byte)
A4D4 BCDE09 03566 LDY XPOSSIGN,X ; Load sign of x-coordinate
A4D7 D002 03567 BNE SKIP021 ;
A4D9 49FF 03568 EOR #$FF ; A := ABS(x-coordinate (high byte))
A4DB A8 03569 SKIP021 TAY ;
A4DC B9E90D 03570 LDA MAPTO80,Y ; Calc pixel column number rel. to screen center
A4DF 20FBB6 03571 JSR SCREENCOLUMN ; Calc pixel column number rel. to top-left of screen
03572
A4E2 CA 03573 DEX ;
A4E3 10DB 03574 BPL LOOP022 ; Next space object
03575
03576 ;*** (15) Update PLAYER shapes, heights, and colors ****************************
03577
03578 ; DESCRIPTION
03579 ;
03580 ; In a loop over all PLAYERs, the following steps are executed:
03581 ;
03582 ; o Clear the PLAYER shape offset and height.
03583 ;
03584 ; o If in Galactic Chart view or in Long-Range Scan view, preload a random
03585 ; color and a magic z-coordinate (distance value) for PLAYER3..4
03586 ; (representing hyperwarp markers in Galactic Chart view and blips in the
03587 ; Long-Range Scan view, like, for example, Zylon ships, meteors - or even
03588 ; the Hyperwarp Target Marker during hyperwarp!).
03589 ;
03590 ; o If in Front or Aft view, execute the following steps:
03591 ;
03592 ; o Skip dead PLAYERs.
03593 ;
03594 ; o Preload the distance value for the remaining live PLAYERs.
03595 ;
03596 ; o If we are in a starbase sector, combine PLAYER0..2 into a three-part
03597 ; starbase shape. Compute the pixel column numbers and pixel row
03598 ; numbers of PLAYER0..1 such that they are arranged left (PLAYER0) and
03599 ; right (PLAYER1) of PLAYER2. In addition, preload a color mask, a
03600 ; counter actually, that will make the starbase pulsate in brightness.
03601 ;
03602 ; BUG (at $A512): The code at $A512 that skips the combination operation for
03603 ; PLAYER2..4 jumps for PLAYER3..4 to SKIP025 at $A52A instead of SKIP026 at
03604 ; $A52E. Thus it stores a color mask which does not only make the starbase
03605 ; PLAYER0..2 pulsate in brightness but also PLAYER3..4 in a starbase sector,
03606 ; for example the transfer vessel, photon torpedoes, etc. - or even the
03607 ; Hyperwarp Target Marker when hyperwarping out of such a sector! Suggested
03608 ; fix: None, code hard to untwist.
03609 ;
03610 ; o After storing the color mask, check if the PLAYER shape is still above the
03611 ; bottom edge of the PLAYFIELD.
03612 ;
03613 ; BUG (at $A534): The test checks the vertical position of the top edge of
03614 ; the PLAYER against the bottom edge of the PLAYFIELD above the Console
03615 ; Panel Display (= Player/Missile pixel row number 204). This is not
03616 ; completely accurate as the Console Panel Display starts at PM pixel row
03617 ; number 208. For example, if you carefully navigate a starbase to the
03618 ; bottom edge of the PLAYFIELD, at a certain point the center of the
03619 ; starbase shape bleeds over the bottom edge of the PLAYFIELD (while
03620 ; sometimes even losing its left and right wings!). Suggested fix: None, as
03621 ; a more elaborate test may consume too many bytes of the cartridge ROM
03622 ; memory in order to fix a rarely noticed visual glitch.
03623 ;
03624 ; o Convert the preloaded distance value of a PLAYER space object closer than
03625 ; $2000 (8192) <KM> into a range index of 0..15. PLAYER space objects more
03626 ; distant than $2000 (8192) <KM> are skipped and not displayed.
03627 ;
03628 ; Later, this range index will pick not only the correct brightness for the
03629 ; PLAYER (the closer the space object the brighter its PLAYER) but also the
03630 ; correct PLAYER shape cell and height (the closer the space object the
03631 ; larger the PLAYER shape and height).
03632 ;
03633 ; o Update the PLAYER's shape offset and height. On the way to the shape
03634 ; offset and height add the PLAYER's shape type to the range index and
03635 ; divide it by 2 to arrive at the shape offset index and height index (the
03636 ; same value). Use this index to pick the correct shape data and shape
03637 ; heights from a set of shape cells and their corresponding heights, stored
03638 ; in tables PLSHAPOFFTAB ($BE2F) and PLSHPHEIGHTTAB ($BE7F), respectively.
03639 ;
03640 ; Remember that magic distance value used in the Galactic Chart and
03641 ; Long-Range Scan view? Its value of $F2 is actually part of a negative
03642 ; z-coordinate which is inverted to $0D00, leading to a range index of 13,
03643 ; which, after the division by 2, picks shape cell 6. Shape cell 6 (the
03644 ; seventh shape cell) of all space objects (except the starbase) is the
03645 ; Long-Range Scan blip's dot (see PLSHAPOFFTAB ($BE2F) and PLSHPHEIGHTTAB
03646 ; ($BE7F)).
03647 ;
03648 ; o Update the PLAYER's color/brightness by picking the appropriate values
03649 ; with the range index from lookup tables PLSHAPCOLORTAB ($BFD1) and
03650 ; PLSHAPBRITTAB ($BFDB). Apply some special effects to the color/brightness
03651 ; of certain PLAYERs, such as using random colors for Zylon basestars, or
03652 ; using the precomputed pulsating brightness value for a starbase.
03653
A4E5 A205 03654 SKIP022 LDX #NUMSPCOBJ.PL ; Loop over all PLAYER space objects (X index < 5)
A4E7 CA 03655 LOOP023 DEX ;
A4E8 1003 03656 BPL SKIP023 ; Jump into loop body below
A4EA 4C79A5 03657 JMP JUMP003 ; Loop is finished, skip loop body
03658
03659 ;*** Clear PLAYER shape offsets and heights ************************************
A4ED A900 03660 SKIP023 LDA #0 ;
A4EF 95E4 03661 STA PL0SHAPOFF,X ; Clear PLAYER shape offset
A4F1 9DEE0C 03662 STA PL0HEIGHTNEW,X ; Clear new PLAYER shape height
03663
03664 ;*** Preload stuff for hyperwarp markers and Long-Range Scan blips *************
A4F4 24D0 03665 BIT SHIPVIEW ; Skip if not in Galactic Chart view
A4F6 100B 03666 BPL SKIP024 ;
03667
A4F8 E003 03668 CPX #3 ; Next PLAYER space object if PLAYER0..2
A4FA 90EB 03669 BCC LOOP023 ;
03670
A4FC AD0AD2 03671 LOOP024 LDA RANDOM ; Prep random color mask for warp markers/LRS blips
A4FF A0F2 03672 LDY #$F2 ; Prep magic z-coordinate for warp markers/LRS blips
A501 302B 03673 BMI SKIP026 ; Unconditional jump
03674
A503 D5E9 03675 SKIP024 CMP PL0LIFE,X ; Next PLAYER space object if this PLAYER not alive
A505 F0E0 03676 BEQ LOOP023 ;
03677
A507 70F3 03678 BVS LOOP024 ; Skip back if in Long-Range Scan view
03679
03680 ;*** Preload stuff for other views *********************************************
03681
A509 BC400A 03682 LDY PL0ZPOSHI,X ; Prep z-coordinate (high byte)
03683
03684 ;*** Combine PLAYER0..2 to starbase shape **************************************
A50C 247B 03685 BIT ISSTARBASESECT ; Skip if no starbase in this sector
A50E 501E 03686 BVC SKIP026 ;
03687
A510 E002 03688 CPX #2 ; Skip if PLAYER2..4
A512 B016 03689 BCS SKIP025 ; (!)
03690
A514 AD2C0C 03691 LDA PL2COLUMN ; Calc new PM pixel column number for PLAYER0..1:
A517 18 03692 CLC ; Load PLAYER2 (starbase center) pixel column number
A518 7DDBBE 03693 ADC PLSTARBAOFFTAB,X ; ...add PLAYER left/right offset (starbase wings)
A51B 9D2A0C 03694 STA PL0COLUMN,X ; Store new PM pixel column number of starbase wing
03695
A51E ADFB0B 03696 LDA PL2ROWNEW ; Calc new PM pixel row number for PLAYER0..1:
A521 18 03697 CLC ; Add vertical offset (= 4 PM pixels) to PLAYER2's
A522 6904 03698 ADC #4 ;
A524 9DF90B 03699 STA PL0ROWNEW,X ; Store new PM pixel row number of starbase wing
03700
A527 AC420A 03701 LDY PL2ZPOSHI ; Prep Y with z-coordinate (high byte) of starbase
03702
A52A A576 03703 SKIP025 LDA COUNT256 ; Prep color mask with B3..0 of counter
A52C 290F 03704 AND #$0F ; ...(= brightness bits cause pulsating brightness)
03705
A52E 856B 03706 SKIP026 STA L.COLORMASK ; Store color mask
03707
03708 ;*** Check if PLAYER is below PLAYFIELD bottom edge ****************************
A530 98 03709 TYA ; A := z-coordinate (high byte)
03710
A531 BCF90B 03711 LDY PL0ROWNEW,X ; Next PLAYER space object if top of PM shape...
A534 C0CC 03712 CPY #204 ; ...is below PLAYFIELD bottom... (!)
A536 B0AF 03713 BCS LOOP023 ; ...(PM pixel row number >= 204)
03714
03715 ;*** Convert PLAYER z-coordinate to range index in 0..15 ***********************
A538 A4D0 03716 LDY SHIPVIEW ; Skip if in Front view...
A53A F002 03717 BEQ SKIP027 ;
A53C 49FF 03718 EOR #$FF ; ...else invert z-coordinate (high byte)
03719
A53E C920 03720 SKIP027 CMP #$20 ; Next PLAYER space object if this one too far away
A540 B0A5 03721 BCS LOOP023 ; ...(z-coordinate >= $20** (8192) <KM>)
03722
A542 C910 03723 CMP #16 ; Load z-coordinate (high byte) and...
A544 9002 03724 BCC SKIP028 ;
A546 A90F 03725 LDA #15 ;
A548 856A 03726 SKIP028 STA L.RANGEINDEX ; ...trim to range index in 0..15
03727
03728 ;*** Update PLAYER shape offset and height *************************************
A54A 1D8C0C 03729 ORA PL0SHAPTYPE,X ; Calc offset to shape table (shape type+range index)
A54D 4A 03730 LSR A ;
A54E A8 03731 TAY ; Divide by 2 to get offset in 0..7 into shape data
A54F B92FBE 03732 LDA PLSHAPOFFTAB,Y ; Update new PLAYER shape offset
A552 95E4 03733 STA PL0SHAPOFF,X ;
A554 B97FBE 03734 LDA PLSHPHEIGHTTAB,Y ; Update new PLAYER shape height
A557 9DEE0C 03735 STA PL0HEIGHTNEW,X ;
03736
03737 ;*** Calculate PLAYER color/brightness value ***********************************
A55A 98 03738 TYA ; Pick color (B7..4) using PLAYER shape type
A55B 4A 03739 LSR A ;
A55C 4A 03740 LSR A ;
A55D 4A 03741 LSR A ;
A55E A8 03742 TAY ;
A55F B9D1BF 03743 LDA PLSHAPCOLORTAB,Y ;
A562 C008 03744 CPY #8 ; Pick random color if ZYLON BASESTAR (shape type 8)
A564 D003 03745 BNE SKIP029 ;
A566 4D0AD2 03746 EOR RANDOM ;
A569 A46A 03747 SKIP029 LDY L.RANGEINDEX ;
A56B 59DBBF 03748 EOR PLSHAPBRITTAB,Y ; Pick brightness (B3..0) using range index and merge
03749
A56E 456B 03750 EOR L.COLORMASK ; Modify color/brightness of PLAYER
03751
A570 BCDFB8 03752 LDY PLCOLOROFFTAB,X ; Get PLAYER color offset
A573 99EE00 03753 STA PL0COLOR,Y ; Store color in PLAYER color register
A576 4CE7A4 03754 JMP LOOP023 ; Next PLAYER space object
03755
03756 ;*** (16) Flash red alert ******************************************************
A579 A0AF 03757 JUMP003 LDY #$AF ; Prep PLAYFIELD2 color {BRIGHT BLUE-GREEN}
A57B A681 03758 LDX SHIELDSCOLOR ; Prep Shields color {DARK GREEN} or {BLACK}
03759
A57D A58B 03760 LDA REDALERTLIFE ; Skip if red alert is over
A57F F00C 03761 BEQ SKIP030 ;
03762
A581 C68B 03763 DEC REDALERTLIFE ; Decrement lifetime of red alert
A583 A04F 03764 LDY #$4F ; Prep PLAYFIELD2 color {BRIGHT ORANGE}
03765
A585 2920 03766 AND #$20 ; Switch colors every 64 game loops
A587 F004 03767 BEQ SKIP030 ;
03768
A589 A242 03769 LDX #$42 ; Load BACKGROUND color {DARK ORANGE}
A58B A060 03770 LDY #$60 ; Load PLAYFIELD2 color {DARK PURPLE BLUE}
03771
A58D 84F4 03772 SKIP030 STY PF2COLOR ; Store PLAYFIELD2 color
A58F 86F6 03773 STX BGRCOLOR ; Store BACKGROUND color
03774
03775 ;*** (17) Update color of PLAYFIELD space objects (stars, explosion fragments) *
A591 A679 03776 LDX MAXSPCOBJIND ; Loop over all PLAYFIELD space objs (X index > 4)
A593 BD400A 03777 LOOP025 LDA ZPOSHI,X ; Prep z-coordinate (high byte)
A596 A4D0 03778 LDY SHIPVIEW ;
A598 C001 03779 CPY #1 ; Skip if not in Aft view
A59A D009 03780 BNE SKIP032 ;
03781
A59C C9F0 03782 CMP #$F0 ; Skip if star not too far (z < $F0** (-4096) <KM>)
A59E B003 03783 BCS SKIP031 ;
A5A0 2064B7 03784 JSR INITPOSVEC ; Re-init position vector
A5A3 49FF 03785 SKIP031 EOR #$FF ; Invert z-coordinate (high byte)
03786
A5A5 C910 03787 SKIP032 CMP #16 ; Convert z-coordinate (high byte)
A5A7 9002 03788 BCC SKIP033 ; ...into range index 0..15
A5A9 A90F 03789 LDA #15 ;
03790
A5AB 0A 03791 SKIP033 ASL A ; Compute index to pixel color table:
A5AC 291C 03792 AND #$1C ; Use bits B3..1 from range index as B4..2.
A5AE 0572 03793 ORA COUNT8 ; Combine with random bits B3..0 from counter
03794
A5B0 A8 03795 TAY ;
A5B1 B990BA 03796 LDA FOURCOLORPIXEL,Y ; Load 1-byte bit pattern for 4 pixels of same color
A5B4 856A 03797 STA L.FOURCOLORPIX ; ...and temporarily save it
03798
A5B6 BD2A0C 03799 LDA PIXELCOLUMN,X ; Load pixel mask to mask 1 pixel out of 4 pixels:
A5B9 2903 03800 AND #$03 ; Use B1..0 from pixel column number...
A5BB A8 03801 TAY ;
A5BC B9B0BA 03802 LDA PIXELMASKTAB,Y ; ...to pick mask to filter pixel in byte
A5BF 256A 03803 AND L.FOURCOLORPIX ; ...AND with 1-byte bit pattern for 4 pixels
A5C1 9DEE0C 03804 STA PIXELBYTE,X ; ...store byte (used in repaint step of game loop)
03805
A5C4 CA 03806 DEX ;
A5C5 E005 03807 CPX #NUMSPCOBJ.PL ;
A5C7 B0CA 03808 BCS LOOP025 ; Next PLAYFIELD space object
03809
03810 ;*** (18) Skip input handling if in demo mode **********************************
A5C9 2464 03811 BIT ISDEMOMODE ; If in demo mode skip to function keys
A5CB 5003 03812 BVC SKIP034 ;
A5CD 4C9BA6 03813 JMP SKIP040 ;
03814
03815 ;*** (19) Handle keyboard input ************************************************
A5D0 20FEAF 03816 SKIP034 JSR KEYBOARD ; Handle keyboard input
03817
03818 ;*** (20) Handle joystick input ************************************************
A5D3 AD00D3 03819 LDA PORTA ; Load Joystick 0 directions
A5D6 A8 03820 TAY ; ...Bits B0..3 -> Right, left, down, up.
A5D7 2903 03821 AND #$03 ; ...Bit = 0/1 -> Stick pressed/not pressed
A5D9 AA 03822 TAX ; JOYSTICKY := +1 -> Up
A5DA BDF5BA 03823 LDA STICKINCTAB,X ; JOYSTICKY := 0 -> Centered
A5DD 85C9 03824 STA JOYSTICKY ; JOYSTICKY := -1 -> Down
A5DF 98 03825 TYA ;
A5E0 4A 03826 LSR A ;
A5E1 4A 03827 LSR A ;
A5E2 2903 03828 AND #$03 ;
A5E4 AA 03829 TAX ; JOYSTICKX := -1 -> Left
A5E5 BDF5BA 03830 LDA STICKINCTAB,X ; JOYSTICKX := 0 -> Centered
A5E8 85C8 03831 STA JOYSTICKX ; JOYSTICKX := +1 -> Right
03832
03833 ;*** (21) Check if our starship's photon torpedoes have hit a target ***********
A5EA 203DAF 03834 JSR COLLISION ; Check if our starship's photon torpedoes have hit
03835
03836 ;*** (22) Handle joystick trigger **********************************************
A5ED 2029AE 03837 JSR TRIGGER ; Handle joystick trigger
03838
03839 ;*** (23) Handle Attack Computer and Tracking Computer *************************
A5F0 2C9509 03840 BIT GCSTATCOM ; Skip if Attack Computer destroyed
A5F3 7040 03841 BVS SKIP038 ;
03842
A5F5 A57E 03843 LDA DRAINATTCOMP ; Skip if Attack Computer off
A5F7 F03C 03844 BEQ SKIP038 ;
03845
A5F9 A5D0 03846 LDA SHIPVIEW ; Skip if not in Front view
A5FB D003 03847 BNE SKIP035 ;
03848
A5FD 20BFA7 03849 JSR UPDATTCOMP ; Update Attack Computer Display
03850
A600 AE5C09 03851 SKIP035 LDX TRACKDIGIT ; Load index of tracked space object
03852
A603 A5BF 03853 LDA ZYLONATTACKER ; Skip if ship of current Zylon torpedo is tracked
A605 3005 03854 BMI SKIP036 ;
A607 AA 03855 TAX ; ...else override Tracking Computer...
A608 0980 03856 ORA #$80 ;
A60A 85BF 03857 STA ZYLONATTACKER ; ...and mark Zylon torpedo's ship as being tracked
03858
A60C B5E9 03859 SKIP036 LDA PL0LIFE,X ; Skip if tracked space object still alive
A60E D00B 03860 BNE SKIP037 ;
03861
A610 8A 03862 TXA ;
A611 4901 03863 EOR #$01 ;
A613 AA 03864 TAX ;
A614 B5E9 03865 LDA PL0LIFE,X ; Check if other Zylon ship still alive
A616 D003 03866 BNE SKIP037 ; ...yes -> Keep new index
A618 AE5C09 03867 LDX TRACKDIGIT ; ...no -> Revert to old index of tracked space obj
03868
A61B 8E5C09 03869 SKIP037 STX TRACKDIGIT ; Store index of tracked space object
03870
A61E A57C 03871 LDA ISTRACKCOMPON ; Skip if tracking computer is turned off
A620 F013 03872 BEQ SKIP038 ;
03873
A622 A5D0 03874 LDA SHIPVIEW ; Skip if in Long-Range Scan or Galactic Chart view
A624 C902 03875 CMP #2 ;
A626 B00D 03876 BCS SKIP038 ;
03877
A628 4901 03878 EOR #$01 ;
A62A DDAD09 03879 CMP ZPOSSIGN,X ; Skip if tracked space object in our starship's...
A62D F006 03880 BEQ SKIP038 ; ...view direction
03881
A62F AA 03882 TAX ;
A630 BDCFBE 03883 LDA TRACKKEYSTAB,X ; Pick 'F' or 'A' (Front or Aft view) keyboard code
A633 85CA 03884 STA KEYCODE ; ...and store it (= emulate pressing 'F' or 'A' key)
03885
03886 ;*** (24) Handle docking to starbase *******************************************
A635 20E6AC 03887 SKIP038 JSR DOCKING ; Handle docking to starbase
03888
03889 ;*** (25) Handle maneuvering ***************************************************
A638 2079AA 03890 JSR MANEUVER ; Handle maneuvering photon torpedoes and Zylon ships
03891
03892 ;*** (26) Was our starship hit by Zylon photon torpedo? ************************
A63B A57B 03893 LDA ISSTARBASESECT ; Skip hit check if in starbase sector
A63D D05C 03894 BNE SKIP040 ;
03895
A63F A5EB 03896 LDA PL2LIFE ; Skip hit check if PLAYER2 (Zylon photon torpedo)...
A641 F058 03897 BEQ SKIP040 ; ...not alive
03898
A643 AC420A 03899 LDY PL2ZPOSHI ; Our starship was not hit if Zylon photon torpedo's
A646 C8 03900 INY ; ...z-coordinate is not in -256..255 <KM> or...
A647 C002 03901 CPY #$02 ;
A649 B050 03902 BCS SKIP040 ;
03903
A64B AC730A 03904 LDY PL2XPOSHI ; ...x-coordinate is not in -256..255 <KM> or...
A64E C8 03905 INY ;
A64F C002 03906 CPY #$02 ;
A651 B048 03907 BCS SKIP040 ;
03908
A653 ACA40A 03909 LDY PL2YPOSHI ; ...y-coordinate is not in -256..255 <KM>.
A656 C8 03910 INY ;
A657 C002 03911 CPY #$02 ;
A659 B040 03912 BCS SKIP040 ;
03913
03914 ;*** (27) Our starship was hit! ************************************************
A65B 20E1AE 03915 JSR DAMAGE ; Damage or destroy some subsystem
03916
A65E A002 03917 LDY #2 ; Trigger explosion at PLAYER2 (Zylon photon torpedo)
A660 206BAC 03918 JSR INITEXPL ;
03919
A663 A27F 03920 LDX #$7F ; Prep HITBADNESS := SHIELDS HIT
A665 A581 03921 LDA SHIELDSCOLOR ; Skip if Shields are up (SHIELDSCOLOR not {BLACK}).
A667 D01E 03922 BNE SKIP039 ;
03923
A669 A20A 03924 LDX #$0A ; Set Front view
A66B 2045B0 03925 JSR SETVIEW ;
03926
A66E A023 03927 LDY #$23 ; Set title phrase "SHIP DESTROYED BY ZYLON FIRE"
A670 A208 03928 LDX #8 ; Set mission bonus offset
A672 200AB1 03929 JSR GAMEOVER ; Game over
03930
A675 A25F 03931 LDX #$5F ; Hide Control Panel Display (bottom text window)
A677 A080 03932 LDY #$80 ;
A679 A908 03933 LDA #$08 ;
A67B 20F1AD 03934 JSR MODDLST ;
03935
A67E 200DAE 03936 JSR CLRPLAYFIELD ; Clear PLAYFIELD
03937
A681 A240 03938 LDX #64 ; Enable STARSHIP EXPLOSION noise (see SOUND)
A683 86E3 03939 STX NOISEHITLIFE ;
03940
A685 A2FF 03941 LDX #$FF ; Prep HITBADNESS := STARSHIP DESTROYED
03942
A687 868A 03943 SKIP039 STX HITBADNESS ; Store HITBADNESS
A689 A900 03944 LDA #0 ; Zylon photon torpedo lifetime := 0 game loops
A68B 85EB 03945 STA PL2LIFE ;
A68D A902 03946 LDA #2 ; Init Zylon photon torpedo trigger
A68F 85BE 03947 STA TORPEDODELAY ;
03948
A691 A201 03949 LDX #1 ; ENERGY := ENERGY - 100 after photon torpedo hit
A693 206FB8 03950 JSR DECENERGY ;
03951
A696 A20A 03952 LDX #$0A ; Play noise sound pattern SHIELD EXPLOSION
A698 20A8AE 03953 JSR NOISE ;
03954
03955 ;*** (28) Handle function keys *************************************************
A69B A463 03956 SKIP040 LDY FKEYCODE ; Prep old function key code
A69D AD1FD0 03957 LDA CONSOL ; POKEY: Load function key code
03958
A6A0 49FF 03959 EOR #$FF ; Store inverted and masked function key code
A6A2 2903 03960 AND #$03 ;
A6A4 8563 03961 STA FKEYCODE ;
A6A6 F01A 03962 BEQ SKIP042 ; Skip if no function key pressed
03963
A6A8 88 03964 DEY ;
A6A9 1017 03965 BPL SKIP042 ; Skip if SELECT or START still pressed
A6AB 8566 03966 STA IDLECNTHI ; Reset idle counter to a value in 1..3 (?)
A6AD C902 03967 CMP #2 ; Skip if SELECT function key pressed
A6AF B006 03968 BCS SKIP041 ;
03969
A6B1 A900 03970 LDA #0 ; START function key pressed:
A6B3 A8 03971 TAY ; Prep empty title phrase offset
A6B4 4C5EA1 03972 JMP INITSTART ; Reenter game loop via INITSTART
03973
A6B7 E662 03974 SKIP041 INC MISSIONLEVEL ; SELECT function key pressed:
A6B9 A562 03975 LDA MISSIONLEVEL ; Cycle through next of 4 mission levels
A6BB 2903 03976 AND #$03 ;
A6BD 8562 03977 STA MISSIONLEVEL ;
A6BF 4C5AA1 03978 JMP INITSELECT ; Reenter game loop via INITSELECT
03979
03980 ;*** (29) Update Control Panel Display *****************************************
A6C2 2004B8 03981 SKIP042 JSR UPDPANEL ; Update Control Panel Display
03982
03983 ;*** (30) Handle hyperwarp *****************************************************
A6C5 209BA8 03984 JSR HYPERWARP ; Handle hyperwarp
03985
03986 ;*** (31) Update title line ****************************************************
A6C8 2016B2 03987 JSR UPDTITLE ; Update title line
03988
03989 ;*** (32) Flush game loop iteration ********************************************
A6CB 20E4B4 03990 JSR FLUSHGAMELOOP ; Move Zylon units, age torpedoes, elapse time
03991
03992 ;*** (33) Jump back to begin of game loop **************************************
A6CE 4CF3A1 03993 JMP GAMELOOP ; Next game loop iteration
03994
03995 ;*******************************************************************************
03996 ;* *
03997 ;* VBIHNDLR *
03998 ;* *
03999 ;* Vertical Blank Interrupt Handler *
04000 ;* *
04001 ;*******************************************************************************
04002
04003 ; DESCRIPTION
04004 ;
04005 ; This subroutine is executed during the Vertical Blank Interrupt (VBI) when the
04006 ; TV beam has reached the bottom-right corner of the TV screen and is switched
04007 ; off to return to the top-left position. This situation is called the "vertical
04008 ; blank phase".
04009 ;
04010 ; This subroutine signals its execution with flag ISVBISYNC ($67) (which is
04011 ; examined by GAMELOOP ($A1F3) to synchronize the execution of the game loop
04012 ; with the start of this subroutine). Then it switches the character set to the
04013 ; ROM character set, sets the BACKGROUND color depending on the severity of a
04014 ; Zylon photon torpedo hit and view mode, copies PLAYER and PLAYFIELD color
04015 ; registers to their corresponding hardware registers, clears the Player/Missile
04016 ; collision registers, calls the sound effects code in subroutine SOUND ($B2AB),
04017 ; and increments the idle counter. If the idle counter reaches the value $8000
04018 ; the title phrase is cleared and the program is switched to demo mode.
04019 ;
04020 ; BUG (at $A6EC): Because the values of SHIPVIEW ($D0) are $00, $01, $40, and
04021 ; $80, a value of 3 overspecifies the comparison. Suggested fix: Replace CMP #3
04022 ; with CMP #2, which may make the code clearer.
04023 ;
04024 ; BUG (at $A712): Demo mode is entered via a JMP instruction, which proceeds
04025 ; directly into GAMELOOP ($A1F3). Thus code execution never returns to pop the
04026 ; registers pushed on the stack during entry of this subroutine. Suggested fix:
04027 ; None.
04028
A6D1 A9FF 04029 VBIHNDLR LDA #$FF ; Signals entering Vertical Blank Interrupt
A6D3 8567 04030 STA ISVBISYNC ;
04031
A6D5 A9E0 04032 LDA #>ROMCHARSET ; Switch character set to ROM character set
A6D7 8D09D4 04033 STA CHBASE ;
04034
A6DA A6F6 04035 LDX BGRCOLOR ; Preload BACKGROUND color
A6DC AD0AD2 04036 LDA RANDOM ; Preload random number
A6DF 248A 04037 BIT HITBADNESS ; Check if our starship was hit
A6E1 5007 04038 BVC SKIP044 ; If HITBADNESS has a value of...
A6E3 3004 04039 BMI SKIP043 ; $00 -> NO HIT (BGR color := unchanged)
A6E5 2972 04040 AND #$72 ; $7F -> SHIELDS HIT (BGR color := %01rr00r0)
A6E7 0940 04041 ORA #$40 ; $FF -> STARSHIP DESTROYED (BGR color := %01rr00r0)
A6E9 AA 04042 SKIP043 TAX ;
A6EA A5D0 04043 SKIP044 LDA SHIPVIEW ; Skip if in Front or Aft view
A6EC C903 04044 CMP #3 ; (!)
A6EE 9002 04045 BCC SKIP045 ;
A6F0 A2A0 04046 LDX #$A0 ; Preload BACKGROUND color {DARK BLUE GREEN}...
A6F2 86F6 04047 SKIP045 STX BGRCOLOR ; Store BACKGROUND color
04048
A6F4 A208 04049 LDX #8 ; Copy all color registers to hardware registers
A6F6 B5EE 04050 LOOP026 LDA PL0COLOR,X ;
A6F8 9D12D0 04051 STA COLPM0,X ;
A6FB CA 04052 DEX ;
A6FC 10F8 04053 BPL LOOP026 ;
04054
A6FE 8D1ED0 04055 STA HITCLR ; Clear Player/Missile collision registers
04056
A701 20ABB2 04057 JSR SOUND ; Call sound effects
04058
A704 E677 04059 INC IDLECNTLO ; Increment 16-bit idle counter
A706 D00D 04060 BNE SKIP046 ;
A708 A566 04061 LDA IDLECNTHI ;
A70A 3009 04062 BMI SKIP046 ;
A70C E666 04063 INC IDLECNTHI ;
A70E 1005 04064 BPL SKIP046 ; Skip if idle counter value of $8000 not reached yet
04065
A710 A000 04066 LDY #$00 ; Prep empty title phrase offset
A712 4C5CA1 04067 JMP INITDEMO ; Enter demo mode (!)
04068
A715 4C4BA7 04069 SKIP046 JMP JUMP004 ; Return via DLI return code
04070
04071 ;*******************************************************************************
04072 ;* *
04073 ;* DLSTHNDLR *
04074 ;* *
04075 ;* Display List Interrupt Handler *
04076 ;* *
04077 ;*******************************************************************************
04078
04079 ; DESCRIPTION
04080 ;
04081 ; This subroutine is executed during the Display List Interrupt (DLI). It
04082 ; switches the character set to the ROM character set if the DLI occurs at ANTIC
04083 ; line 96 (video line 192), otherwise to the custom character set. The former
04084 ; happens in the Galactic Chart view where the ROM character set is used in the
04085 ; Galactic Chart Panel Display.
04086 ;
04087 ; Then, the DLI PLAYFIELD colors are copied to the corresponding hardware
04088 ; registers and the values of the collision hardware registers for PLAYER3..4
04089 ; (our starship's photon torpedoes) are copied to the corresponding zero-page
04090 ; variables PL3HIT ($82) and PL4HIT ($83).
04091
A718 48 04092 DLSTHNDLR PHA ; Push A
A719 8A 04093 TXA ;
A71A 48 04094 PHA ; Push X
A71B 98 04095 TYA ;
A71C 48 04096 PHA ; Push Y
04097
A71D A9E0 04098 LDA #>ROMCHARSET ; Switch to ROM charset if ANTIC line counter = 96
A71F AC0BD4 04099 LDY VCOUNT ; ...else switch to custom character set
A722 C060 04100 CPY #96 ;
A724 F002 04101 BEQ SKIP047 ;
A726 A9A0 04102 LDA #>CHARSET ;
A728 8D09D4 04103 SKIP047 STA CHBASE ;
04104
A72B A204 04105 LDX #4 ; Loop over all PLAYFIELD colors
A72D 8D0AD4 04106 STA WSYNC ; Stop and wait for horizontal TV beam sync
A730 B5F7 04107 LOOP027 LDA PF0COLORDLI,X ; Copy DLI PLAYFIELD colors to hardware registers
A732 9D16D0 04108 STA COLPF0,X ;
A735 CA 04109 DEX ;
A736 10F8 04110 BPL LOOP027 ; Next PLAYFIELD color
04111
A738 AD08D0 04112 LDA M0PL ; Merge MISSILE-to-PLAYER collision registers...
A73B 0D09D0 04113 ORA M1PL ;
A73E 0D0AD0 04114 ORA M2PL ;
A741 0D0BD0 04115 ORA M3PL ;
A744 8583 04116 STA PL4HIT ; ...and store them in PL4HIT
A746 AD0FD0 04117 LDA P3PL ; Copy PLAYER3-to-PLAYER coll. register to PL3HIT
A749 8582 04118 STA PL3HIT ;
04119
A74B 68 04120 JUMP004 PLA ; Pop Y
A74C A8 04121 TAY ;
A74D 68 04122 PLA ; Pop X
A74E AA 04123 TAX ;
A74F 68 04124 PLA ; Pop A
A750 40 04125 RTI ; Return from interrupt
04126
04127 ;*******************************************************************************
04128 ;* *
04129 ;* IRQHNDLR *
04130 ;* *
04131 ;* Interrupt Request (IRQ) Handler *
04132 ;* *
04133 ;*******************************************************************************
04134
04135 ; DESCRIPTION
04136 ;
04137 ; This subroutine is executed during immediate interrupt requests (IRQs), such
04138 ; as after pressing a key on the keyboard. It clears and disables all IRQs
04139 ; except the interrupt raised by a pressed key. If a key has been pressed, its
04140 ; hardware code is collected and the bits of the SHIFT and CONTROL keys are
04141 ; added. The resulting keyboard code is stored in KEYCODE ($CA).
04142
A751 48 04143 IRQHNDLR PHA ; Push A
A752 A900 04144 LDA #0 ; POKEY: Disable all IRQs
A754 8D0ED2 04145 STA IRQEN ;
A757 A940 04146 LDA #$40 ; POKEY: Enable keyboard interrupt (IRQ)
A759 8D0ED2 04147 STA IRQEN ;
A75C AD09D2 04148 LDA KBCODE ; POKEY: Load keyboard key code
A75F 09C0 04149 ORA #$C0 ; Combine with SHIFT and CONTROL key bits
A761 85CA 04150 STA KEYCODE ; Store keyboard code
A763 68 04151 PLA ; Pop A
A764 40 04152 RTI ; Return from interrupt
04153
04154 ;*******************************************************************************
04155 ;* *
04156 ;* DRAWLINES *
04157 ;* *
04158 ;* Draw horizontal and vertical lines *
04159 ;* *
04160 ;*******************************************************************************
04161
04162 ; DESCRIPTION
04163 ;
04164 ; Draws the Attack Computer Display (in Front view), cross hairs (in Front and
04165 ; Aft view), and our starship's shape (in Long-Range Scan view) on the PLAYFIELD
04166 ; (if the Attack Computer is not destroyed) by being passed an offset to table
04167 ; DRAWLINESTAB ($BAF9). This table consists of a list of 3-byte elements,
04168 ; terminated by an end marker byte ($FE). Each such element defines a single
04169 ; horizontal or vertical line, and is passed via memory addresses DIRLEN ($A4),
04170 ; PENROW ($A5), and PENCOLUMN ($A6) to subroutine DRAWLINE ($A782), which
04171 ; executes the actual drawing. See subroutine DRAWLINE ($A782) and table
04172 ; DRAWLINESTAB ($BAF9) for a description of the 3-byte elements.
04173 ;
04174 ; With every call of this subroutine the blip cycle counter is initialized to
04175 ; the start of the DELAY phase (see subroutine UPDATTCOMP ($A7BF)).
04176 ;
04177 ; NOTE: The entry to this subroutine is in mid-code, not at the beginning.
04178 ;
04179 ; INPUT
04180 ;
04181 ; X = Offset into DRAWLINESTAB ($BAF9). Used values are:
04182 ; $00 -> Draw Attack Computer Display and cross hairs (Front view)
04183 ; $2A -> Draw Aft view cross hairs (Aft view)
04184 ; $31 -> Draw our starship's shape (Long-Range Scan view)
04185
A765 99A400 04186 LOOP028 STA DIRLEN,Y ; Store byte of 3-byte element
A768 E8 04187 INX ;
A769 88 04188 DEY ;
A76A 100E 04189 BPL SKIP048 ; Next byte of 3-byte element until 3 bytes copied
A76C 2082A7 04190 JSR DRAWLINE ; Draw line on PLAYFIELD
04191
A76F A905 04192 DRAWLINES LDA #5 ; Init blip cycle to DELAY phase...
A771 85A2 04193 STA BLIPCYCLECNT ; ...delays drawing each row
04194
A773 2C9509 04195 BIT GCSTATCOM ; Return if Attack Computer destroyed
A776 7009 04196 BVS SKIP049 ;
04197
A778 A002 04198 LDY #2 ;
A77A BDF9BA 04199 SKIP048 LDA DRAWLINESTAB,X ; Load byte of 3-byte element
A77D C9FE 04200 CMP #$FE ; Loop until end marker byte ($FE) encountered
A77F D0E4 04201 BNE LOOP028 ;
A781 60 04202 SKIP049 RTS ; Return
04203
04204 ;*******************************************************************************
04205 ;* *
04206 ;* DRAWLINE *
04207 ;* *
04208 ;* Draw a single horizontal or vertical line *
04209 ;* *
04210 ;*******************************************************************************
04211
04212 ; DESCRIPTION
04213 ;
04214 ; Draws a single horizontal or vertical transparent line.
04215 ;
04216 ; There are two entries to this subroutine:
04217 ;
04218 ; (1) DRAWLINE ($A782) is entered from subroutine DRAWLINES ($A76F) to draw a
04219 ; line in COLOR1.
04220 ;
04221 ; (2) DRAWLINE2 ($A784) is entered from subroutine UPDATTCOMP ($A7BF) to draw
04222 ; the blip in COLOR2 in the Attack Computer Display.
04223 ;
04224 ; The position, direction, and length of the line is defined by three bytes
04225 ; passed in memory addresses DIRLEN ($A4), PENROW ($A5), and PENCOLUMN ($A6).
04226 ;
04227 ; A drawing operation draws one transparent line. It uses both the color
04228 ; register number of the overwritten (old) and the overwriting (new) pixel to
04229 ; decide on the new pixel color register number. This results in a transparent
04230 ; drawing effect. See the table below for all resulting combinations of color
04231 ; registers.
04232 ;
04233 ; +-----------+---------------+
04234 ; | | Old Color |
04235 ; | | Register |
04236 ; | New Color +---------------+
04237 ; | Register | 0 | 1 | 2 | 3 |
04238 ; +-----------+---+---+---+---+
04239 ; | 0 | 0 | 1 | 2 | 3 |
04240 ; +-----------+---+---+---+---+
04241 ; | 1 | 1 | 1 | 3 | 3 |
04242 ; +-----------+---+---+---+---+
04243 ; | 2 | 2 | 3 | 2 | 3 |
04244 ; +-----------+---+---+---+---+
04245 ; | 3 | 3 | 3 | 3 | 3 |
04246 ; +-----------+---+---+---+---+
04247 ;
04248 ; For example, COLOR1 overwritten by COLOR2 yields COLOR3. If you look closely
04249 ; at the blip (in COLOR2) on the Attack Computer Display (in COLOR1) the lines
04250 ; of the Attack Computer Display shine through (in COLOR3) where they overlap.
04251 ;
04252 ; INPUT
04253 ;
04254 ; DIRLEN ($A4) = B7 = 0 -> Draw line to the right
04255 ; B7 = 1 -> Draw line downward
04256 ; B6..0 -> Length of line in pixels
04257 ; PENROW ($A5) = Start pixel row number of line
04258 ; PENCOLUMN ($A6) = Start pixel column number of line
04259
=006A 04260 L.PIXELBYTEOFF = $6A ; Within-row-offset to byte with pixel in PLAYFIELD
=006B 04261 L.BITPAT = $6B ; 1-byte bit pattern for 4 pixels of same color
=006E 04262 L.DIRSAV = $6E ; Saves DIRLEN
04263
A782 A955 04264 DRAWLINE LDA #$55 ; Copy 1-byte bit pattern for 4 pixels of COLOR1
A784 856B 04265 DRAWLINE2 STA L.BITPAT ;
A786 A5A4 04266 LDA DIRLEN ; Copy direction (and length) of line
A788 856E 04267 STA L.DIRSAV ;
A78A 297F 04268 AND #$7F ; Strip direction bit
A78C 85A4 04269 STA DIRLEN ; Store length of line
04270
A78E A4A5 04271 LOOP029 LDY PENROW ; Loop over length of line to be drawn
A790 B90008 04272 LDA PFMEMROWLO,Y ; Point MEMPTR to start of pen's pixel row...
A793 8568 04273 STA MEMPTR ; ...in PLAYFIELD memory
A795 B96408 04274 LDA PFMEMROWHI,Y ;
A798 8569 04275 STA MEMPTR+1 ;
04276
A79A A5A6 04277 LDA PENCOLUMN ; Calc and store pen's byte-within-row offset
A79C 4A 04278 LSR A ;
A79D 4A 04279 LSR A ;
A79E 856A 04280 STA L.PIXELBYTEOFF ;
04281
A7A0 A5A6 04282 LDA PENCOLUMN ; Calc pixel-within-byte index
A7A2 2903 04283 AND #$03 ;
A7A4 A8 04284 TAY ;
04285
A7A5 B9B0BA 04286 LDA PIXELMASKTAB,Y ; Pick mask to filter pixel in byte
A7A8 256B 04287 AND L.BITPAT ; ...AND with bit pattern for 4 pixels of same color
A7AA A46A 04288 LDY L.PIXELBYTEOFF ;
A7AC 1168 04289 ORA (MEMPTR),Y ; Blend byte with new pixel and PLAYFIELD byte
A7AE 9168 04290 STA (MEMPTR),Y ; ...and store it back in PLAYFIELD memory
04291
A7B0 246E 04292 BIT L.DIRSAV ; Check direction bit B7
A7B2 1004 04293 BPL SKIP050 ;
A7B4 E6A5 04294 INC PENROW ; If B7 = 1 -> Increment pen's pixel row number
A7B6 D002 04295 BNE SKIP051 ;
A7B8 E6A6 04296 SKIP050 INC PENCOLUMN ; If B7 = 0 -> Increment pen's pixel column number
04297
A7BA C6A4 04298 SKIP051 DEC DIRLEN ;
A7BC D0D0 04299 BNE LOOP029 ; Next pixel of line
A7BE 60 04300 RTS ; Return
04301
04302 ;*******************************************************************************
04303 ;* *
04304 ;* UPDATTCOMP *
04305 ;* *
04306 ;* Update Attack Computer Display *
04307 ;* *
04308 ;*******************************************************************************
04309
04310 ; DESCRIPTION
04311 ;
04312 ; Draws the blip of the tracked space object and the lock-on markers into the
04313 ; Attack Computer Display. The actual drawing follows a cycle of 11 game loop
04314 ; iterations (numbered by this subroutine as "blip cycles" 0..10), which can be
04315 ; divided into three phases:
04316 ;
04317 ; (1) Blip cycle 0..4: Draw blip shape row-by-row
04318 ;
04319 ; Draw the blip's shape into the Attack Computer Display, one row each blip
04320 ; cycle. After 5 blip cycles the blip shape is complete and completely
04321 ; visible because between blip cycles, that is, game loop iterations, the
04322 ; PLAYFIELD is not erased (only the PLAYFIELD space objects are). Drawing
04323 ; is executed by branching to entry DRAWLINE2 ($A784) of subroutine
04324 ; DRAWLINE ($A782). The blip shape is retrieved from table BLIPSHAPTAB
04325 ; ($BF6E).
04326 ;
04327 ; (2) Blip cycle 5..9: Delay
04328 ;
04329 ; Delay the execution of blip cycle 10.
04330 ;
04331 ; (3) Blip cycle 10: Update Attack Computer Display
04332 ;
04333 ; After verifying that the tracked space object is alive, calculate the
04334 ; blip's relative top-left pixel column and row number. Resulting values
04335 ; are in -11..11 and -6..4, relative to the blip's top-left reference
04336 ; position at pixel column number 131 and pixel row number 77,
04337 ; respectively.
04338 ;
04339 ; Filter the Attack Computer Display area: Only pixels of COLOR1 within the
04340 ; inner frame area (a 28 pixel wide x 15 pixel high rectangle with its
04341 ; top-left corner at pixel column number 120 and pixel row number 71) pass
04342 ; the filter operation. This effectively erases the blip.
04343 ;
04344 ; If the blip is within -2..+2 pixels off its horizontal reference position
04345 ; (pixel column numbers 129..132) then the tracked space object is in x
04346 ; lock-on. Draw the x lock-on marker.
04347 ;
04348 ; If the tracked space object is in x lock-on and the blip is within -2..+1
04349 ; pixels off its vertical reference position (pixel column numbers 75..78)
04350 ; then the tracked space object is in x and y lock-on. Draw also the y
04351 ; lock-on marker.
04352 ;
04353 ; If the tracked space object is in x and y lock-on and the tracked space
04354 ; object's z-coordinate < +3072 (+$0C**) <KM> then the tracked space object
04355 ; is in x, y and z lock-on. Draw also the z lock-on marker.
04356 ;
04357 ; If the tracked space object is in x, y, and z lock-on (and thus in
04358 ; optimal firing range) set the ISINLOCKON ($A3) flag.
04359 ;
04360 ; The following sketches show the Attack Computer Display area overlaid
04361 ; with the Attack Computer Display frame:
04362 ;
04363 ; 119 119
04364 ; 70 ############################## 70 ##############################
04365 ; # ....#.... # # # #
04366 ; # ....#.... # # # #
04367 ; # ....#.... # # # #
04368 ; # ....#.... # # # #
04369 ; # ############### # #......###############.......#
04370 ; #XXXX # ......... # XXXX# #......#.............#.......#
04371 ; # # ..$...... # # #......#....$........#.......#
04372 ; ######## ......... ######### ########.............#########
04373 ; # # ......... # # #......#.............#.......#
04374 ; # # ......... # # #YYYY..#.............#...YYYY#
04375 ; # ############### # #......###############.......#
04376 ; # ....#.... # #.............#..............#
04377 ; # ....#.... # # # #
04378 ; # ....#.... # # # #
04379 ; # ....#.... # # # #
04380 ; ############################## ##############################
04381 ;
04382 ; X = x lock-on marker Y = y lock-on marker
04383 ; . = x lock-on blip zone . = y lock-on blip zone
04384 ; $ = Blip's top-left reference $ = Blip's top-left reference
04385 ; position position
04386 ;
04387 ; 119
04388 ; 70 ##############################
04389 ; # # #
04390 ; # # #
04391 ; # # #
04392 ; # # #
04393 ; # ############### #
04394 ; # # # #
04395 ; # # $ # #
04396 ; ######## #########
04397 ; # # # #
04398 ; # # # #
04399 ; # ############### #
04400 ; # # #
04401 ; # # #
04402 ; # ZZ # ZZ #
04403 ; # ZZ # ZZ #
04404 ; ##############################
04405 ;
04406 ; Z = z lock-on marker
04407 ; $ = Blip's top-left reference
04408 ; position
04409
=006C 04410 L.SHIFTSHAPE = $6C ; Saves shifted byte of blip shape bit pattern
04411
A7BF AE5C09 04412 UPDATTCOMP LDX TRACKDIGIT ; Load index of tracked space object
A7C2 A4A2 04413 LDY BLIPCYCLECNT ; Load blip cycle counter
A7C4 C005 04414 CPY #5 ;
A7C6 B024 04415 BCS SKIP054 ; Skip drawing blip if blip cycle > 5
04416
04417 ;*** Blip cycle 0..4: Draw blip shape one row each cycle ***********************
A7C8 A5A0 04418 LDA BLIPCOLUMN ; Init pen's pixel column number...
A7CA 85A6 04419 STA PENCOLUMN ; ...with top position of blip shape
A7CC B96EBF 04420 LDA BLIPSHAPTAB,Y ; Load bit pattern of one row of blip shape
A7CF 0A 04421 LOOP030 ASL A ; Shift bit pattern one position to the left
A7D0 856C 04422 STA L.SHIFTSHAPE ; Temporarily save shifted shape byte
A7D2 900D 04423 BCC SKIP052 ; Skip if shifted-out bit = 0
04424
A7D4 A981 04425 LDA #$81 ; Store "draw a line of 1 pixel length downward"
A7D6 85A4 04426 STA DIRLEN ; ...for call to DRAWLINE2
04427
A7D8 A5A1 04428 LDA BLIPROW ; Init pen's pixel row number...
A7DA 85A5 04429 STA PENROW ; ...with leftmost position of blip shape
A7DC A9AA 04430 LDA #$AA ; Load 1-byte bit pattern for 4 pixels of COLOR2
A7DE 2084A7 04431 JSR DRAWLINE2 ; Draw pixel on PLAYFIELD
04432
A7E1 E6A6 04433 SKIP052 INC PENCOLUMN ; Move pen one pixel to the right
A7E3 A56C 04434 LDA L.SHIFTSHAPE ; Reload shifted shape byte
A7E5 D0E8 04435 BNE LOOP030 ; Next horizontal pixel of blip shape
04436
A7E7 E6A1 04437 INC BLIPROW ; Move pen one pixel downward
A7E9 E6A2 04438 SKIP053 INC BLIPCYCLECNT ; Increment blip cycle counter
A7EB 60 04439 RTS ; Return
04440
04441 ;*** Blip cycle 5..9: Delay ****************************************************
A7EC C00A 04442 SKIP054 CPY #10 ; Return if blip cycle < 10
A7EE 90F9 04443 BCC SKIP053 ;
04444
04445 ;*** Blip cycle 10: Calculate new blip pixel row and column numbers ************
A7F0 B5E9 04446 LDA PL0LIFE,X ; Skip if tracked object not alive
A7F2 F03C 04447 BEQ SKIP059 ;
04448
A7F4 BD710A 04449 LDA XPOSHI,X ; Map x-coordinate of tracked space obj to -11..11:
A7F7 BCDE09 04450 LDY XPOSSIGN,X ; Skip if tracked object on left screen half (x >= 0)
A7FA F008 04451 BEQ SKIP055 ;
04452
A7FC C90C 04453 CMP #12 ; Skip if x of tracked obj < +$0C** (< 3327) <KM>
A7FE 900A 04454 BCC SKIP056 ;
A800 A90B 04455 LDA #11 ; Prep relative pixel column number of 11, skip
A802 1006 04456 BPL SKIP056 ;
04457
A804 C9F5 04458 SKIP055 CMP #-11 ; Skip if x of tracked obj >= -($0B**) (>=-2816) <KM>
A806 B002 04459 BCS SKIP056 ;
A808 A9F5 04460 LDA #-11 ; Prep relative pixel column number of -11
04461
A80A 18 04462 SKIP056 CLC ; Add 131 (= blip's top-left reference pixel column)
A80B 6983 04463 ADC #131 ;
A80D 85A0 04464 STA BLIPCOLUMN ; BLIPCOLUMN := 131 + -11..11
04465
A80F BDA20A 04466 LDA YPOSHI,X ; Map y-coordinate of tracked space obj to -6..4:
A812 49FF 04467 EOR #$FF ; Mirror y-coordinate on y-axis (displacement of +1)
A814 BC0F0A 04468 LDY YPOSSIGN,X ; Skip if tracked obj on lower screen half (y < 0)
A817 D008 04469 BNE SKIP057 ;
04470
A819 C905 04471 CMP #5 ; Skip if mirrored y of tracked obj < +$05** <KM>
A81B 900A 04472 BCC SKIP058 ;
A81D A904 04473 LDA #4 ; Prep relative pixel row number of 4, skip
A81F 1006 04474 BPL SKIP058 ;
04475
A821 C9FA 04476 SKIP057 CMP #-6 ; Skip if mirrored y of tracked obj >= -($06**) <KM>
A823 B002 04477 BCS SKIP058 ;
A825 A9FA 04478 LDA #-6 ; Prep relative pixel row number of -6
04479
A827 18 04480 SKIP058 CLC ; Add 77 (= blip's top-left ref. pixel row number)
A828 694D 04481 ADC #77 ;
A82A 85A1 04482 STA BLIPROW ; BLIPROW := 77 + -6..4
04483
A82C A900 04484 LDA #0 ; Reset blip cycle
A82E 85A2 04485 STA BLIPCYCLECNT ;
04486
04487 ;*** Filter Attack Computer Display frame area *********************************
04488 ; PLAYFIELD address of top-left of Attack Computer
=1B36 04489 PFMEM.C120R71 = PFMEM+71*40+120/4 ; Display's inner frame @ pixel column 120, row 71
04490
A830 A936 04491 SKIP059 LDA #<PFMEM.C120R71 ; Point MEMPTR to start of frame's...
A832 8568 04492 STA MEMPTR ; ...inner top-left corner at column 120, row 71...
A834 A91B 04493 LDA #>PFMEM.C120R71 ; ...in PLAYFIELD memory
A836 8569 04494 STA MEMPTR+1 ;
04495
A838 A20E 04496 LDX #14 ; Traverse a 28 x 15 pixel rect of PLAYFIELD memory
A83A A006 04497 LOOP031 LDY #6 ;
A83C B168 04498 LOOP032 LDA (MEMPTR),Y ; Load byte (4 pixels) from PLAYFIELD memory
A83E 2955 04499 AND #$55 ; Filter COLOR1 pixels
A840 9168 04500 STA (MEMPTR),Y ; Store byte (4 pixels) back to PLAYFIELD memory
A842 88 04501 DEY ;
A843 10F7 04502 BPL LOOP032 ; Next 4 pixels in x-direction
04503
A845 18 04504 CLC ; Add 40 to MEMPTR
A846 A568 04505 LDA MEMPTR ; (40 bytes = 160 pixels = 1 PLAYFIELD row of pixels)
A848 6928 04506 ADC #40 ;
A84A 8568 04507 STA MEMPTR ;
A84C 9002 04508 BCC SKIP060 ;
A84E E669 04509 INC MEMPTR+1 ;
04510
A850 CA 04511 SKIP060 DEX ;
A851 10E7 04512 BPL LOOP031 ; Next row of pixels in y-direction
04513
04514 ;*** Prepare lock-on marker checks *********************************************
A853 AE5C09 04515 LDX TRACKDIGIT ; Preload index of tracked space obj to check z-range
A856 C8 04516 INY ; Y := 0, preloaded value of ISINLOCKON
04517
04518 ;*** Draw lock-on markers ******************************************************
04519 ; PLAYFIELD addresses of
=1BFE 04520 PFMEM.C120R76 = PFMEM+76*40+120/4 ; ...x lock-on marker @ pixel column 120, row 76
=1C04 04521 PFMEM.C144R76 = PFMEM+76*40+144/4 ; ...x lock-on marker @ pixel column 144, row 76
=1C9E 04522 PFMEM.C120R80 = PFMEM+80*40+120/4 ; ...y lock-on marker @ pixel column 120, row 80
=1CA4 04523 PFMEM.C144R80 = PFMEM+80*40+144/4 ; ...y lock-on marker @ pixel column 144, row 80
=1D40 04524 PFMEM.C128R84 = PFMEM+84*40+128/4 ; ...z lock-on marker @ pixel column 128, row 84
=1D68 04525 PFMEM.C128R85 = PFMEM+85*40+128/4 ; ...z lock-on marker @ pixel column 128, row 85
=1D42 04526 PFMEM.C136R84 = PFMEM+84*40+136/4 ; ...z lock-on marker @ pixel column 136, row 84
=1D6A 04527 PFMEM.C136R85 = PFMEM+85*40+136/4 ; ...z lock-on marker @ pixel column 136, row 85
04528
A857 A588 04529 LDA LOCKONLIFE ; If lock-on lifetime expired redraw lock-on markers
A859 F004 04530 BEQ SKIP061 ;
04531
A85B C688 04532 DEC LOCKONLIFE ; else decr lock-on lifetime, skip drawing markers
A85D D039 04533 BNE SKIP062 ;
04534
A85F A5A0 04535 SKIP061 LDA BLIPCOLUMN ; Skip x, y, and z lock-on marker if blip's...
A861 C981 04536 CMP #129 ; ...top-left pixel column number not in 129..132
A863 9033 04537 BCC SKIP062 ;
A865 C985 04538 CMP #133 ;
A867 B02F 04539 BCS SKIP062 ;
04540
A869 A9AA 04541 LDA #$AA ; Draw x lock-on marker (4 horiz. pixels of COLOR2)
A86B 8DFE1B 04542 STA PFMEM.C120R76 ; ...at pixel column 120, row 76
A86E 8D041C 04543 STA PFMEM.C144R76 ; ...at pixel column 144, row 76
04544
A871 A5A1 04545 LDA BLIPROW ; Skip y and z lock-on marker if blip's...
A873 C94B 04546 CMP #75 ; ...top-left pixel row number not in 75...78
A875 9021 04547 BCC SKIP062 ;
A877 C94F 04548 CMP #79 ;
A879 B01D 04549 BCS SKIP062 ;
04550
A87B A9AA 04551 LDA #$AA ; Draw y lock-on marker (4 horiz. pixels of COLOR2)
A87D 8D9E1C 04552 STA PFMEM.C120R80 ; ...at pixel column 120, row 80
A880 8DA41C 04553 STA PFMEM.C144R80 ; ...at pixel column 144, row 80
04554
A883 BD400A 04555 LDA ZPOSHI,X ; Skip z lock-on marker if z >= +$0C** (>= 3072) <KM>
A886 C90C 04556 CMP #12 ;
A888 B00E 04557 BCS SKIP062 ;
04558
A88A A0A0 04559 LDY #$A0 ; Draw z lock-on marker (2 horiz. pixels of COLOR2)
A88C 8C401D 04560 STY PFMEM.C128R84 ; ...at pixel column 128, row 84 (prep lock-on flag)
A88F 8C681D 04561 STY PFMEM.C128R85 ; ...at pixel column 128, row 85
A892 8C421D 04562 STY PFMEM.C136R84 ; ...at pixel column 136, row 84
A895 8C6A1D 04563 STY PFMEM.C136R85 ; ...at pixel column 136, row 85
04564
A898 84A3 04565 SKIP062 STY ISINLOCKON ; Store lock-on flag (> 0 -> Tracked obj locked on)
A89A 60 04566 RTS ; Return
04567
04568 ;*******************************************************************************
04569 ;* *
04570 ;* HYPERWARP *
04571 ;* *
04572 ;* Handle hyperwarp *
04573 ;* *
04574 ;*******************************************************************************
04575
04576 ; DESCRIPTION
04577 ;
04578 ; Handles the hyperwarp sequence, which transports our starship from one sector
04579 ; to another. It can be divided into four phases:
04580 ;
04581 ; (1) ACCELERATION PHASE
04582 ;
04583 ; The ACCELERATION PHASE is entered after the hyperwarp sequence has been
04584 ; engaged in subroutine KEYBOARD ($AFFE) by pressing the 'H' key. The
04585 ; Hyperwarp Target Marker appears and our starship begins to accelerate.
04586 ; When our starship's velocity reaches 128 <KM/H> (the VELOCITY readout of
04587 ; the Control Panel Display displays "50"), the STAR TRAIL phase is
04588 ; entered.
04589 ;
04590 ; The Hyperwarp Target Marker is represented by a space object some fixed
04591 ; distance away in front of our starship as PLAYER3. It has a lifetime of
04592 ; 144 game loop iterations and is tracked. Thus, tracking handling in
04593 ; subroutine UPDATTCOMP ($A7BF) provides drawing the x and y lock-on
04594 ; markers in the Attack Computer Display when the Hyperwarp Target Marker
04595 ; is centered.
04596 ;
04597 ; A temporary arrival location on the Galactic Chart was saved when the
04598 ; hyperwarp was engaged in subroutine KEYBOARD ($AFFE). During the
04599 ; ACCELERATION PHASE (and the subsequent STAR TRAIL PHASE) this location is
04600 ; constantly updated depending on how much the Hyperwarp Target Marker
04601 ; veers off its center position.
04602 ;
04603 ; The actual arrival hyperwarp marker row and column numbers on the
04604 ; Galactic Chart are the sum of the temporary arrival hyperwarp marker row
04605 ; and column numbers stored when engaging the hyperwarp in subroutine
04606 ; KEYBOARD ($AFFE) and the number of Player/Missile (PM) pixels which the
04607 ; Hyperwarp Target Marker is off-center vertically and horizontally,
04608 ; respectively, at the end of the STAR TRAIL PHASE.
04609 ;
04610 ; NOTE: The used vertical center value of 119 PM pixels is the PM pixel row
04611 ; number of the top edge of the centered Hyperwarp Target Marker (from top
04612 ; to bottom: 8 PM pixels to the start of Display List + 16 PM pixels blank
04613 ; lines + 100 PM pixels to the vertical PLAYFIELD center - 5 PM pixels
04614 ; relative offset of the Hyperwarp Target Marker's shape center to the
04615 ; shape's top edge = 119 PM pixels). Recall also that PLAYERs at
04616 ; single-line resolution have PM pixels that are half as high as they are
04617 ; wide.
04618 ;
04619 ; NOTE: The used horizontal center value of 125 PM pixels is the PM pixel
04620 ; row number of the left edge of the centered Hyperwarp Target Marker (from
04621 ; left to right: 127 PM pixels to the PLAYFIELD center - 3 PM pixels
04622 ; relative offset of the Hyperwarp Target Marker's shape center to the
04623 ; shape's left edge = 125 PM pixels).
04624 ;
04625 ; If during the ACCELERATION PHASE (and the subsequent STAR TRAIL PHASE)
04626 ; you switch the Front view to another view, the Hyperwarp Target Marker
04627 ; changes to a random position which results in arriving at a random
04628 ; destination sector.
04629 ;
04630 ; During the ACCELERATION PHASE (and the subsequent STAR TRAIL PHASE) in
04631 ; all but NOVICE missions, the Hyperwarp Target Marker veers off with
04632 ; random velocity in x and y direction, which is changed during 6% of game
04633 ; loop iterations. Table VEERMASKTAB ($BED7) limits the maximum veer-off
04634 ; velocity depending on the mission level:
04635 ;
04636 ; +-----------+-----------------------------+
04637 ; | Mission | Veer-Off Velocity |
04638 ; +-----------+-----------------------------+
04639 ; | NOVICE | 0 <KM/H> |
04640 ; | PILOT | -63..-16, +16..+63 <KM/H> |
04641 ; | WARRIOR | -95..-16, +16..+95 <KM/H> |
04642 ; | COMMANDER | -127..-16, +16..+127 <KM/H> |
04643 ; +-----------+-----------------------------+
04644 ;
04645 ; (2) STAR TRAIL PHASE
04646 ;
04647 ; When our starship's velocity reaches a velocity of 128 <KM/H> (the
04648 ; VELOCITY readout of the Control Panel Display displays "50"), in addition
04649 ; to all effects of the ACCELERATION PHASE, multiple star trails begin to
04650 ; appear while our starship continues to accelerate. Each star trail is
04651 ; initialized in subroutine INITTRAIL ($A9B4).
04652 ;
04653 ; (3) HYPERSPACE PHASE
04654 ;
04655 ; When our starship's velocity reaches a velocity of 254 <KM/H> (the
04656 ; VELOCITY readout of the Control Panel Display displays "99") our starship
04657 ; enters the HYPERSPACE PHASE (the VELOCITY readout of the Control Panel
04658 ; Display displays the infinity symbol).
04659 ;
04660 ; During the first pass of the HYPERSPACE PHASE the hyperwarp state is set
04661 ; to HYPERSPACE. This makes the stars and the Hyperwarp Target Marker
04662 ; disappear in GAMELOOP ($A1F3). Then, the beeper sound pattern HYPERWARP
04663 ; TRANSIT is played in subroutine BEEP ($B3A6), the hyperwarp distance and
04664 ; required hyperwarp energy is calculated in subroutine CALCWARP ($B1A7),
04665 ; and the title line is preloaded with "HYPERSPACE". Code execution returns
04666 ; via calling subroutine CLEANUPWARP ($A98D) where program variables are
04667 ; already initialized to their post-hyperwarp values.
04668 ;
04669 ; During subsequent passes of the HYPERSPACE PHASE, the calculated
04670 ; hyperwarp energy is decremented in chunks of 10 energy units. Code
04671 ; execution returns via calling subroutine DECENERGY ($B86F), which
04672 ; decrements our starship's energy. After the calculated hyperwarp energy
04673 ; is spent the DECELERATION PHASE is entered.
04674 ;
04675 ; (4) DECELERATION PHASE
04676 ;
04677 ; The title line flashes "HYPERWARP COMPLETE", the star field reappears and
04678 ; our starship decelerates to a stop. The Engines and the hyperwarp are
04679 ; disengaged and stopped in subroutine ENDWARP ($A987), the arrival
04680 ; coordinates on the Galactic Chart are initialized, as well as the
04681 ; vicinity mask.
04682 ;
04683 ; The vicinity mask limits the position vector components (coordinates) of
04684 ; space objects in the arrival sector relative to our starship. The
04685 ; vicinity mask is picked from table VICINITYMASKTAB ($BFB3) by an index
04686 ; calculated by the arrival y-coordinate modulo 8: The more you have placed
04687 ; the arrival hyperwarp marker in the vertical center of a sector on the
04688 ; Galactic Chart, the closer space objects in this sector will be to our
04689 ; starship. For example, if you placed the arrival hyperwarp marker exactly
04690 ; in the vertical middle of the sector the index will be 3, thus the space
04691 ; objects inside the arrival sector will be in the vicinity of <= 4095 <KM>
04692 ; of our starship. The following table lists the possible coordinates
04693 ; depending on the calculated index:
04694 ;
04695 ; +-------+-----------------------+
04696 ; | Index | ABS(Coordinate) |
04697 ; +-------+-----------------------+
04698 ; | 0 | <= 65535 ($FF**) <KM> |
04699 ; | 1 | <= 65535 ($FF**) <KM> |
04700 ; | 2 | <= 16383 ($3F**) <KM> |
04701 ; | 3 | <= 4095 ($0F**) <KM> |
04702 ; | 4 | <= 16383 ($3F**) <KM> |
04703 ; | 5 | <= 32767 ($7F**) <KM> |
04704 ; | 6 | <= 65535 ($FF**) <KM> |
04705 ; | 7 | <= 65535 ($FF**) <KM> |
04706 ; +-------+-----------------------+
04707 ;
04708 ; If there is a starbase in the arrival sector, its x and y coordinates are
04709 ; initialized to random values within the interval defined by the vicinity
04710 ; mask by using subroutine RNDINVXY ($B7BE). Its z-coordinate is forced to
04711 ; a value >= +$71** (+28928) <KM>. Its velocity vector components are set
04712 ; to 0 <KM/H>.
04713 ;
04714 ; If there are Zylon ships in the arrival sector then a red alert is
04715 ; initialized by setting the red alert lifetime to 255 game loop
04716 ; iterations, playing the beeper sound pattern RED ALERT in subroutine BEEP
04717 ; ($B3A6) and setting the title phrase to "RED ALERT".
04718
A89B A4C0 04719 HYPERWARP LDY WARPSTATE ; Return if hyperwarp not engaged
A89D F061 04720 BEQ SKIP066 ;
04721
A89F A570 04722 LDA VELOCITYLO ; If velocity >= 254 <KM/H> skip to HYPERSPACE PHASE
A8A1 C9FE 04723 CMP #254 ;
A8A3 B05C 04724 BCS SKIP067 ;
04725
A8A5 C980 04726 CMP #128 ; If velocity < 128 <KM/H> skip to ACCELERATION PHASE
A8A7 9003 04727 BCC SKIP063 ;
04728
04729 ;*** STAR TRAIL PHASE **********************************************************
A8A9 20B4A9 04730 JSR INITTRAIL ; Init star trail
04731
04732 ;*** ACCELERATION PHASE ********************************************************
A8AC A903 04733 SKIP063 LDA #3 ; Track Hyperwarp Target Marker (PLAYER3)
A8AE 8D5C09 04734 STA TRACKDIGIT ;
04735
A8B1 A990 04736 LDA #SHAP.HYPERWARP ; PLAYER3 is HYPERWARP TARGET MARKER (shape type 9)
A8B3 8D8F0C 04737 STA PL3SHAPTYPE ;
A8B6 85EC 04738 STA PL3LIFE ; PLAYER3 lifetime := 144 game loops
04739
A8B8 A91F 04740 LDA #$1F ; PLAYER3 z-coordinate := $1F** (7936..8191) <KM>
A8BA 8D430A 04741 STA PL3ZPOSHI ;
04742
A8BD 38 04743 SEC ; New arrival hyperwarp marker row number is...
A8BE ADFC0B 04744 LDA PL3ROWNEW ; WARPARRVROW := WARPTEMPROW + PL3ROWNEW...
A8C1 E977 04745 SBC #119 ; ... - 119 PM pixels (top edge of centered...
A8C3 18 04746 CLC ; ...Hyperwarp Target Marker)
A8C4 65C5 04747 ADC WARPTEMPROW ;
A8C6 297F 04748 AND #$7F ; Limit WARPARRVROW to 0..127
A8C8 858E 04749 STA WARPARRVROW ;
04750
A8CA 38 04751 SEC ; New arrival hyperwarp marker column number is...
A8CB AD2D0C 04752 LDA PL3COLUMN ; WARPARRVCOLUMN := WARPTEMPCOLUMN + PL3COLUMN...
A8CE E97D 04753 SBC #125 ; ... - 125 PM pixels (left edge of centered...
A8D0 18 04754 CLC ; ...Hyperwarp Target Marker)
A8D1 65C4 04755 ADC WARPTEMPCOLUMN ;
A8D3 297F 04756 AND #$7F ; Limit WARPARRVCOLUMN to 0..127
A8D5 858F 04757 STA WARPARRVCOLUMN ;
04758
A8D7 A562 04759 LDA MISSIONLEVEL ; Skip if NOVICE mission
A8D9 F011 04760 BEQ SKIP065 ;
04761
A8DB AD0AD2 04762 LDA RANDOM ; Prep random number
A8DE A4D0 04763 LDY SHIPVIEW ; Skip if in Front view
A8E0 F006 04764 BEQ SKIP064 ;
04765
A8E2 8D2D0C 04766 STA PL3COLUMN ; Randomize PM pixel row and column number...
A8E5 8DFC0B 04767 STA PL3ROWNEW ; ...of Hyperwarp Target Marker
04768
A8E8 C910 04769 SKIP064 CMP #16 ; Return in 94% (240:256) of game loops
A8EA B014 04770 BCS SKIP066 ;
04771
04772 ;*** Veer off Hyperwarp Target Marker and return *******************************
A8EC AD0AD2 04773 SKIP065 LDA RANDOM ; Prep random x-velocity of Hyperwarp Target Marker
A8EF 0910 04774 ORA #$10 ; Velocity value >= 16 <KM/H>
A8F1 25C6 04775 AND VEERMASK ; Limit velocity value by mission level
A8F3 8D9A0B 04776 STA PL3XVEL ; PLAYER3 x-velocity := velocity value
04777
A8F6 AD0AD2 04778 LDA RANDOM ; Prep random y-velocity of Hyperwarp Target Marker
A8F9 0910 04779 ORA #$10 ; Velocity value >= 16 <KM/H>
A8FB 25C6 04780 AND VEERMASK ; Limit velocity value by mission level
A8FD 8DCB0B 04781 STA PL3YVEL ; PLAYER3 y-velocity := velocity value
A900 60 04782 SKIP066 RTS ; Return
04783
04784 ;*** HYPERSPACE PHASE **********************************************************
A901 98 04785 SKIP067 TYA ; Skip if already in HYPERSPACE PHASE
A902 3011 04786 BMI SKIP068 ;
04787
04788 ;*** HYPERSPACE PHASE (First pass) *********************************************
A904 A9FF 04789 LDA #$FF ; Set hyperwarp state to HYPERSPACE PHASE
A906 85C0 04790 STA WARPSTATE ;
04791
A908 A200 04792 LDX #$00 ; Play beeper sound pattern HYPERWARP TRANSIT
A90A 20A6B3 04793 JSR BEEP ;
04794
A90D 20A7B1 04795 JSR CALCWARP ; Calc hyperwarp energy
04796
A910 A01B 04797 LDY #$1B ; Prep title phrase "HYPERSPACE"
A912 4C8DA9 04798 JMP CLEANUPWARP ; Return via CLEANUPWARP
04799
04800 ;*** HYPERSPACE PHASE (Second and later passes) ********************************
A915 C691 04801 SKIP068 DEC WARPENERGY ; Decrement energy in chunks of 10 energy units
A917 F005 04802 BEQ SKIP069 ; Skip to DECELERATION PHASE if hyperwarp energy zero
04803
A919 A202 04804 LDX #2 ; ENERGY := ENERGY - 10 and return
A91B 4C6FB8 04805 JMP DECENERGY ;
04806
04807 ;*** DECELERATION PHASE ********************************************************
A91E A019 04808 SKIP069 LDY #$19 ; Prep title phrase "HYPERWARP COMPLETE"
A920 2087A9 04809 JSR ENDWARP ; Stop our starship
04810
A923 A58F 04811 LDA WARPARRVCOLUMN ; Make the arrival hyperwarp marker column number...
A925 858D 04812 STA WARPDEPRCOLUMN ; ...the departure hyperwarp marker column number
A927 A58E 04813 LDA WARPARRVROW ; Make the arrival hyperwarp marker row number...
A929 858C 04814 STA WARPDEPRROW ; ...the departure hyperwarp marker row number
04815
A92B 4A 04816 LSR A ; B3..1 of arrival hyperwarp marker row number...
A92C 2907 04817 AND #$07 ; ...pick vicinity mask
A92E AA 04818 TAX ;
A92F BDB3BF 04819 LDA VICINITYMASKTAB,X ;
A932 85C7 04820 STA VICINITYMASK ; Store vicinity mask (limits space obj coordinates)
04821
A934 A492 04822 LDY ARRVSECTOR ; Make the arrival sector the current sector
A936 8490 04823 STY CURRSECTOR ;
04824
04825 ;*** Init starbase in arrival sector *******************************************
A938 A900 04826 LDA #0 ; Clear starbase-in-sector flag
A93A 857B 04827 STA ISSTARBASESECT ;
04828
A93C BEC908 04829 LDX GCMEMMAP,Y ; Skip if no starbase in arrival sector
A93F 102E 04830 BPL SKIP070 ;
04831
A941 A9FF 04832 LDA #$FF ; Set starbase-in-sector flag
A943 857B 04833 STA ISSTARBASESECT ;
04834
04835 ;*** Set position vector and velocity vector of starbase ***********************
A945 A000 04836 LDY #0 ;
A947 A900 04837 LOOP033 LDA #0 ; Loop over all coordinates of starbase
A949 99680B 04838 STA PL2ZVEL,Y ; Starbase velocity vector component := 0 <KM/H>
A94C A901 04839 LDA #1 ;
A94E 99AF09 04840 STA PL2ZPOSSIGN,Y ; Starbase coordinate sign := + (positive)
A951 AD0AD2 04841 LDA RANDOM ; Prep random number...
A954 25C7 04842 AND VICINITYMASK ; ...limit number range by vicinity mask, then...
A956 99420A 04843 STA PL2ZPOSHI,Y ; ...store in starbase coordinate (high byte)
04844
A959 98 04845 TYA ;
A95A 18 04846 CLC ;
A95B 6931 04847 ADC #NUMSPCOBJ.ALL ;
A95D A8 04848 TAY ;
A95E C993 04849 CMP #NUMSPCOBJ.ALL*3 ;
A960 90E5 04850 BCC LOOP033 ; Next starbase coordinate
04851
A962 AD420A 04852 LDA PL2ZPOSHI ; Force starbase z-coordinate >= +$71** <KM>
A965 0971 04853 ORA #$71 ;
A967 8D420A 04854 STA PL2ZPOSHI ;
A96A A202 04855 LDX #2 ; Randomly invert starbase x and y coordinates...
A96C 4CBEB7 04856 JMP RNDINVXY ; ...and return
04857
04858 ;*** Flash red alert if Zylon sector entered ***********************************
A96F F00E 04859 SKIP070 BEQ SKIP071 ; Skip if no Zylon ships in sector
04860
A971 A9FF 04861 LDA #255 ; Red alert lifetime := 255 game loops
A973 858B 04862 STA REDALERTLIFE ;
04863
A975 A206 04864 LDX #$06 ; Play beeper sound pattern RED ALERT
A977 20A6B3 04865 JSR BEEP ;
04866
A97A A075 04867 LDY #$75 ; Set title phrase "RED ALERT"
A97C 2023B2 04868 JSR SETTITLE ;
04869
A97F 60 04870 SKIP071 RTS ; Return
04871
04872 ;*******************************************************************************
04873 ;* *
04874 ;* ABORTWARP *
04875 ;* *
04876 ;* Abort hyperwarp *
04877 ;* *
04878 ;*******************************************************************************
04879
04880 ; DESCRIPTION
04881 ;
04882 ; Aborts hyperwarp.
04883 ;
04884 ; This subroutine is entered from subroutine KEYBOARD ($AFFE). It subtracts 100
04885 ; energy units for aborting the hyperwarp and preloads the title phrase with
04886 ; "HYPERWARP ABORTED". Code execution continues into subroutine ENDWARP
04887 ; ($A987).
04888
A980 A201 04889 ABORTWARP LDX #1 ; ENERGY := ENERGY - 100 after hyperwarp abort
A982 206FB8 04890 JSR DECENERGY ;
04891
A985 A017 04892 LDY #$17 ; Prep title phrase "HYPERWARP ABORTED"
04893
04894 ;*******************************************************************************
04895 ;* *
04896 ;* ENDWARP *
04897 ;* *
04898 ;* End hyperwarp *
04899 ;* *
04900 ;*******************************************************************************
04901
04902 ; DESCRIPTION
04903 ;
04904 ; Ends hyperwarp.
04905 ;
04906 ; This subroutine stops our starship's Engines and resets the hyperwarp state.
04907 ; Code execution continues into subroutine CLEANUPWARP ($A98D).
04908
A987 A900 04909 ENDWARP LDA #0 ; Stop Engines
A989 8571 04910 STA NEWVELOCITY ;
A98B 85C0 04911 STA WARPSTATE ; Disengage hyperwarp
04912
04913 ;*******************************************************************************
04914 ;* *
04915 ;* CLEANUPWARP *
04916 ;* *
04917 ;* Clean up hyperwarp variables *
04918 ;* *
04919 ;*******************************************************************************
04920
04921 ; DESCRIPTION
04922 ;
04923 ; Cleans up after a hyperwarp.
04924 ;
04925 ; This subroutine restores many hyperwarp related variables to their
04926 ; post-hyperwarp values: The number of used space objects is set to the regular
04927 ; value of 16 (5 PLAYER space objects + 12 PLAYFIELD space objects (stars)), our
04928 ; starship's velocity (high byte) is cleared as well as the explosion lifetime,
04929 ; the hit badness, the PLAYER3 shape type (Hyperwarp Target Marker), the Engines
04930 ; energy drain rate, and the lifetimes of the PLAYERs. The docking state is
04931 ; reset as well as the tracking digit. The title phrase is updated with either
04932 ; "HYPERSPACE" or "HYPERWARP ABORTED".
04933 ;
04934 ; INPUT
04935 ;
04936 ; Y = Title phrase offset. Used values are:
04937 ; $17 -> "HYPERWARP ABORTED"
04938 ; $1B -> "HYPERSPACE"
04939
A98D A910 04940 CLEANUPWARP LDA #NUMSPCOBJ.NORM-1 ; Set normal number of space objects
A98F 8579 04941 STA MAXSPCOBJIND ; (5 PLAYER spc objs + 12 PLAYFIELD spc objs (stars))
04942
A991 A900 04943 LDA #0 ;
A993 85C1 04944 STA VELOCITYHI ; Turn off hyperwarp velocity
A995 8573 04945 STA EXPLLIFE ; Explosion lifetime := 0 game loops
A997 858A 04946 STA HITBADNESS ; HITBADNESS := NO HIT
A999 8D8F0C 04947 STA PL3SHAPTYPE ; Clear PLAYER3 shape type
A99C 8580 04948 STA DRAINENGINES ; Clear Engines energy drain rate
A99E C017 04949 CPY #$17 ; Skip if hyperwarp was aborted
A9A0 F004 04950 BEQ SKIP072 ;
04951
A9A2 85E9 04952 STA PL0LIFE ; Zylon ship 0 lifetime := 0 game loops
A9A4 85EA 04953 STA PL1LIFE ; Zylon ship 1 lifetime := 0 game loops
04954
A9A6 85EB 04955 SKIP072 STA PL2LIFE ; Zylon photon torpedo lifetime := 0 game loops
A9A8 85EC 04956 STA PL3LIFE ; Hyperwarp Target Marker lifetime := 0 game loops
A9AA 85ED 04957 STA PL4LIFE ; Photon torpedo 1 lifetime := 0 game loops
A9AC 8575 04958 STA DOCKSTATE ; DOCKSTATE := NO DOCKING
A9AE 8D5C09 04959 STA TRACKDIGIT ; Clear index of tracked space object
A9B1 4C23B2 04960 JMP SETTITLE ; Set title phrase and return
04961
04962 ;*******************************************************************************
04963 ;* *
04964 ;* INITTRAIL *
04965 ;* *
04966 ;* Initialize star trail during STAR TRAIL PHASE of hyperwarp *
04967 ;* *
04968 ;*******************************************************************************
04969
04970 ; DESCRIPTION
04971 ;
04972 ; BACKGROUND
04973 ;
04974 ; Star trails are displayed during the STAR TRAIL PHASE, that is, after the
04975 ; ACCELERATION PHASE and before the HYPERSPACE PHASE of the hyperwarp.
04976 ;
04977 ; A star trail is formed by 6 stars represented by 6 PLAYFIELD space objects
04978 ; with continuous position vector indices in 17..48 (indices are wrapped around
04979 ; when greater than 48). Between the creation of two star trails there is delay
04980 ; of 4 game loop iterations.
04981 ;
04982 ; DETAILS
04983 ;
04984 ; This subroutine first decrements this star trail creation delay, returning if
04985 ; the delay is still counting down. If the delay falls below 0 then it continues
04986 ; accelerating our starship's velocity toward hyperwarp speed and then creates a
04987 ; new star trail:
04988 ;
04989 ; First, it raises the maximum index of used space objects to 48 (increasing the
04990 ; number of displayed space objects to 49), resets the star trail creation delay
04991 ; to 4 game loop iterations, then forms a new star trail of 6 stars represented
04992 ; by 6 PLAYFIELD space objects. The x and y coordinates for all 6 stars are the
04993 ; same, picked randomly from tables WARPSTARXTAB ($BB3A) and WARPSTARYTAB
04994 ; ($BB3E), respectively, with their signs changed randomly. Their z-coordinates
04995 ; are computed in increasing depth from at least +4608 (+$12**) <KM> in
04996 ; intervals of +80 (+$0050) <KM>. Their velocity vector components are set to 0
04997 ; <KM/H>.
04998
=0068 04999 L.RANGE = $68 ; z-coordinate of star in star trail (16-bit value)
=006E 05000 L.TRAILCNT = $6E ; Star's index in star trail. Used values are: 0..5.
05001
A9B4 C6C2 05002 INITTRAIL DEC TRAILDELAY ; Decrement star trail delay
A9B6 1068 05003 BPL SKIP074 ; Return if delay still counting
05004
A9B8 A901 05005 LDA #1 ; Turn on hyperwarp velocity
A9BA 85C1 05006 STA VELOCITYHI ;
05007
A9BC A930 05008 LDA #NUMSPCOBJ.ALL-1 ; Max index of space objects (for star trail stars)
A9BE 8579 05009 STA MAXSPCOBJIND ;
05010
A9C0 A903 05011 LDA #3 ; Star trail delay := 3(+1) game loops
A9C2 85C2 05012 STA TRAILDELAY ;
05013
A9C4 A6C3 05014 LDX TRAILIND ; Next avail. space obj index for star of star trail
05015
A9C6 A912 05016 LDA #$12 ; Star z-coordinate := >= +$12** (+4608) <KM>
A9C8 8569 05017 STA L.RANGE+1 ;
05018
A9CA AD0AD2 05019 LDA RANDOM ; Calc random index to pick initial star coordinates
A9CD 2903 05020 AND #$03 ;
A9CF A8 05021 TAY ;
A9D0 B93ABB 05022 LDA WARPSTARXTAB,Y ; Pick x-coordinate (high byte) of star from table
A9D3 9D710A 05023 STA XPOSHI,X ;
A9D6 B93EBB 05024 LDA WARPSTARYTAB,Y ;
A9D9 9DA20A 05025 STA YPOSHI,X ; Pick y-coordinate (high byte) of star from table
A9DC 20BEB7 05026 JSR RNDINVXY ; Randomize signs of x and y coordinates of star
05027
A9DF 8A 05028 TXA ; Save space object index
A9E0 A8 05029 TAY ;
A9E1 A905 05030 LDA #5 ; Loop over 5(+1) stars that form the star trail
A9E3 856E 05031 STA L.TRAILCNT ; Store star counter of star trail
05032
A9E5 18 05033 LOOP034 CLC ; Place stars in z-coordinate intervals of +80 <KM>
A9E6 A568 05034 LDA L.RANGE ;
A9E8 6950 05035 ADC #80 ;
A9EA 8568 05036 STA L.RANGE ;
A9EC 9DD30A 05037 STA ZPOSLO,X ;
A9EF A569 05038 LDA L.RANGE+1 ;
A9F1 6900 05039 ADC #0 ;
A9F3 8569 05040 STA L.RANGE+1 ;
A9F5 9D400A 05041 STA ZPOSHI,X ;
05042
A9F8 A900 05043 LDA #0 ; Star's velocity vector components := 0 <KM/H>
A9FA 9D660B 05044 STA ZVEL,X ;
A9FD 9D970B 05045 STA XVEL,X ;
AA00 9DC80B 05046 STA YVEL,X ;
AA03 A901 05047 LDA #1 ; Star's z-coordinate sign := + (= ahead of starship)
AA05 9DAD09 05048 STA ZPOSSIGN,X ;
05049
AA08 A963 05050 LDA #99 ; Init pixel row and column numbers to magic...
AA0A 9DF90B 05051 STA PIXELROWNEW,X ; ...offscreen value (triggers automatic recalc in...
AA0D 9D2A0C 05052 STA PIXELCOLUMN,X ; ...GAMELOOP's calls to SCREENCOLUMN and SCREENROW)
05053
AA10 20C1AC 05054 JSR COPYPOSXY ; Copy x and y coordinate from previous star in trail
05055
AA13 CA 05056 DEX ; Decrement space object index to next star
AA14 E011 05057 CPX #NUMSPCOBJ.NORM ; If index reaches minimum value...
AA16 B002 05058 BCS SKIP073 ;
AA18 A230 05059 LDX #NUMSPCOBJ.ALL-1 ; ...wrap-around to maximum space object index
AA1A C66E 05060 SKIP073 DEC L.TRAILCNT ;
AA1C 10C7 05061 BPL LOOP034 ; Next star of star trail
05062
AA1E 86C3 05063 STX TRAILIND ; Save space object index of star trail's last star
AA20 60 05064 SKIP074 RTS ; Return
05065
05066 ;*******************************************************************************
05067 ;* *
05068 ;* PROJECTION *
05069 ;* *
05070 ;* Calculate pixel column (or row) number from position vector *
05071 ;* *
05072 ;*******************************************************************************
05073
05074 ; Calculates the pixel column (or row) number of a position vector x (or y)
05075 ; component relative to the PLAYFIELD center by computing the perspective
05076 ; projection quotient
05077 ;
05078 ; QUOTIENT := DIVIDEND / DIVISOR * 128
05079 ;
05080 ; with
05081 ;
05082 ; DIVIDEND := ABS(x-coordinate (or y-coordinate)) / 2
05083 ; DIVISOR := ABS(z-coordinate) / 2
05084 ;
05085 ; If the QUOTIENT is in 0..255, it is used as an index to pick the pixel column
05086 ; (or row) number from table MAPTO80 ($0DE9), returning values in 0..80.
05087 ;
05088 ; If the QUOTIENT is larger than 255 ("dividend overflow") or if the
05089 ; z-coordinate = 0 ("division by zero") then the error value 255 is returned.
05090 ;
05091 ; INPUT
05092 ;
05093 ; X = Position vector index. Used values are: 0..48.
05094 ; DIVIDEND ($6A..$6B) = Dividend (positive 16-bit value), contains the
05095 ; absolute value of the x (or y) coordinate.
05096 ;
05097 ; OUTPUT
05098 ;
05099 ; A = Pixel column (or row) number relative to PLAYFIELD center. Used values
05100 ; are:
05101 ; 0..80 -> Pixel number
05102 ; 255 -> Error value indicating "dividend overflow" or "division by zero"
05103
=0068 05104 L.DIVISOR = $68 ; Divisor (16-bit value)
=006D 05105 L.QUOTIENT = $6D ; Division result (unsigned 8-bit value)
=006E 05106 L.LOOPCNT = $6E ; Division loop counter. Used values are: 7..0.
05107
AA21 A900 05108 PROJECTION LDA #0 ; Init quotient result
AA23 856D 05109 STA L.QUOTIENT ;
05110
AA25 A907 05111 LDA #7 ; Init division loop counter
AA27 856E 05112 STA L.LOOPCNT ;
05113
AA29 466B 05114 LSR DIVIDEND+1 ; DIVIDEND := x-coordinate (or y-coordinate) / 2
AA2B 666A 05115 ROR DIVIDEND ; (division by 2 to make B15 = 0?) (?)
05116
AA2D A5D0 05117 LDA SHIPVIEW ; Skip if in Aft view
AA2F D00F 05118 BNE SKIP075 ;
05119
AA31 BD400A 05120 LDA ZPOSHI,X ; If in Front view -> DIVISOR := z-coordinate / 2
AA34 4A 05121 LSR A ; (division by 2 to make B15 = 0?) (?)
AA35 8569 05122 STA L.DIVISOR+1 ;
AA37 BDD30A 05123 LDA ZPOSLO,X ;
AA3A 6A 05124 ROR A ;
AA3B 8568 05125 STA L.DIVISOR ;
AA3D 4C52AA 05126 JMP LOOP035 ;
05127
AA40 38 05128 SKIP075 SEC ; If in Aft view -> DIVISOR := - z-coordinate / 2
AA41 A900 05129 LDA #0 ; (division by 2 to make B15 = 0?) (?)
AA43 FDD30A 05130 SBC ZPOSLO,X ;
AA46 8568 05131 STA L.DIVISOR ;
AA48 A900 05132 LDA #0 ;
AA4A FD400A 05133 SBC ZPOSHI,X ;
AA4D 4A 05134 LSR A ;
AA4E 8569 05135 STA L.DIVISOR+1 ;
AA50 6668 05136 ROR L.DIVISOR ;
05137
AA52 066D 05138 LOOP035 ASL L.QUOTIENT ; QUOTIENT := DIVIDEND / DIVISOR * 128
AA54 38 05139 SEC ;
AA55 A56A 05140 LDA DIVIDEND ;
AA57 E568 05141 SBC L.DIVISOR ;
AA59 A8 05142 TAY ;
AA5A A56B 05143 LDA DIVIDEND+1 ;
AA5C E569 05144 SBC L.DIVISOR+1 ;
AA5E 9006 05145 BCC SKIP076 ;
05146
AA60 856B 05147 STA DIVIDEND+1 ;
AA62 846A 05148 STY DIVIDEND ;
AA64 E66D 05149 INC L.QUOTIENT ;
05150
AA66 066A 05151 SKIP076 ASL DIVIDEND ;
AA68 266B 05152 ROL DIVIDEND+1 ;
AA6A 9003 05153 BCC SKIP077 ;
05154
AA6C A9FF 05155 LDA #255 ; Return 255 if division by zero or dividend overflow
AA6E 60 05156 RTS ;
05157
AA6F C66E 05158 SKIP077 DEC L.LOOPCNT ;
AA71 10DF 05159 BPL LOOP035 ; Next division loop iteration
05160
AA73 A46D 05161 LDY L.QUOTIENT ; Prep with quotient
AA75 B9E90D 05162 LDA MAPTO80,Y ; Pick and return pixel column (or row) number...
AA78 60 05163 SKIP078 RTS ; ...relative to PLAYFIELD center
05164
05165 ;*******************************************************************************
05166 ;* *
05167 ;* MANEUVER *
05168 ;* *
05169 ;* Maneuver our starship's and Zylon photon torpedoes and Zylon ships *
05170 ;* *
05171 ;*******************************************************************************
05172
05173 ; DESCRIPTION
05174 ;
05175 ; This subroutine maneuvers both of our starship's photon torpedoes, the single
05176 ; Zylon photon torpedo, and the one or two Zylon ships that are simultaneously
05177 ; displayed on the screen. It also creates meteors and new Zylon ships. This
05178 ; subroutine is executed only if our starship is not in a starbase sector and
05179 ; hyperwarp is not engaged.
05180 ;
05181 ; BACKGROUND
05182 ;
05183 ; When a Zylon ship is initialized, a "flight pattern" is assigned to it. There
05184 ; are 3 flight patterns (0, 1, and 4) which are picked from table ZYLONFLPATTAB
05185 ; ($BF91).
05186 ;
05187 ; The flight pattern determines the maximum velocity with which a Zylon ship can
05188 ; move along each axis of the 3D coordinate system, that is the maximum value of
05189 ; a velocity vector component. Velocity vector components for Zylon ships are
05190 ; picked from the Zylon velocity table ZYLONVELTAB ($BF99):
05191 ;
05192 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05193 ; | Velocity Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
05194 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05195 ; | Velocity <KM/H> | +62 | +30 | +16 | +8 | +4 | +2 | +1 | 0 |
05196 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05197 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05198 ; | Velocity Index | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
05199 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05200 ; | Velocity <KM/H> | 0 | -1 | -2 | -4 | -8 | -16 | -30 | -62 |
05201 ; +-----------------+-----+-----+-----+-----+-----+-----+-----+-----+
05202 ;
05203 ; The index into the Zylon velocity table ZYLONVELTAB ($BF99) corresponding to
05204 ; the maximum velocity is called the "maximum velocity index". The following
05205 ; table shows the flight patterns, their maximum velocity indices, and their
05206 ; corresponding velocities:
05207 ;
05208 ; +----------------+------------------+------------------+
05209 ; | Flight Pattern | Maximum Velocity | Maximum Velocity |
05210 ; | | Index | |
05211 ; +----------------+------------------+------------------+
05212 ; | 0 | 0 | +62 <KM/H> |
05213 ; | 0 | 15 | -62 <KM/H> |
05214 ; | 1 | 1 | +30 <KM/H> |
05215 ; | 1 | 14 | -30 <KM/H> |
05216 ; | 4 | 4 | +4 <KM/H> |
05217 ; | 4 | 11 | -4 <KM/H> |
05218 ; +----------------+------------------+------------------+
05219 ;
05220 ; Because flight pattern 0 produces the fastest-moving Zylon ships, which
05221 ; maneuver aggressively, it is called the "attack flight pattern".
05222 ;
05223 ; Each Zylon ship has a set of 3 maximum velocity indices, one for each of its
05224 ; velocity vector components.
05225 ;
05226 ; Each Zylon ship has also one more set of 3 velocity indices, called "Zylon
05227 ; velocity indices", one for each of its velocity vector components. They are
05228 ; used to pick the current values of the velocity vector components from the
05229 ; Zylon velocity table ZYLONVELTAB ($BF99).
05230 ;
05231 ; In order to maneuver Zylon ships this subroutine uses the concept of
05232 ; "milestone velocity indices". By using delay timers, called "Zylon timers",
05233 ; this subroutine gradually increases or decreases the Zylon velocity indices
05234 ; with every game loop iteration to eventually match the corresponding milestone
05235 ; velocity indices. By incrementing a Zylon velocity index a Zylon ship
05236 ; accelerates toward the negative direction of a coordinate axis. By
05237 ; decrementing a Zylon velocity index a Zylon ship accelerates toward the
05238 ; positive direction of a coordinate axis. If one milestone velocity index is
05239 ; matched or a "milestone timer" has counted down to 0, a new milestone velocity
05240 ; index is calculated and the matching of the current Zylon velocity indices
05241 ; with the new milestone velocity indices repeats.
05242 ;
05243 ; DETAILS
05244 ;
05245 ; For quick lookup, the following table lists the PLAYERs and what space objects
05246 ; they represent in this subroutine:
05247 ;
05248 ; +--------+---------------------------------+
05249 ; | PLAYER | Represents |
05250 ; +--------+---------------------------------+
05251 ; | 0 | Zylon Ship 0 |
05252 ; | 1 | Zylon Ship 1 |
05253 ; | 2 | Zylon Photon Torpedo, Meteor |
05254 ; | 3 | Our starship's Photon Torpedo 0 |
05255 ; | 4 | Our starship's Photon Torpedo 1 |
05256 ; +--------+---------------------------------+
05257 ;
05258 ; This subroutine executes the following steps:
05259 ;
05260 ; (1) Update the x and y velocity vector components of both of our starship's
05261 ; photon torpedoes 0 and 1.
05262 ;
05263 ; The x and y velocity vector components of both of our starship's photon
05264 ; torpedoes 0 and 1 are only updated if they are tracking (homing in on) a
05265 ; target.
05266 ;
05267 ; To update the y-velocity vector components of both of our starship's
05268 ; photon torpedoes 0 and 1 the PLAYER row number difference between the
05269 ; PLAYER of tracked target space object and the current location of the
05270 ; PLAYER of our starship's photon torpedo 0 is passed to subroutine
05271 ; HOMINGVEL ($AECA). It returns the new y-velocity vector component value
05272 ; for both of our starship's photon torpedoes in <KM/H>. If the target is
05273 ; located below our starship's photon torpedo 0 a value of 0 <KM/H> is
05274 ; used.
05275 ;
05276 ; NOTE: The new y-velocity vector components depend only on the PLAYER row
05277 ; number of our starship's photon torpedo 0.
05278 ;
05279 ; To update the x-velocity vector components of both of our starship's
05280 ; photon torpedoes, the above calculation is repeated for the PLAYER column
05281 ; numbers of each of our starship's photon torpedoes 0 and 1.
05282 ;
05283 ; (2) Make the Zylon ships follow the rotation of our starship.
05284 ;
05285 ; If you rotate our starship away from Zylon ships they adjust their course
05286 ; such that they reappear in our starship's view.
05287 ;
05288 ; This is achieved by 4 Zylon timers, one for each of both Zylon ships'
05289 ; current x and y Zylon velocity indices. The Zylon timers are decremented
05290 ; every game loop iteration. If any of them reach a value of 0, the
05291 ; corresponding Zylon velocity index is incremented or decremented
05292 ; depending on the current joystick position.
05293 ;
05294 ; For example, if the Zylon timer for the x-velocity of Zylon ship 0
05295 ; reaches 0 and at the same time the joystick is pushed left then the
05296 ; x-Zylon velocity index of this Zylon ship is incremented. This
05297 ; accelerates the Zylon ship toward negative x-direction ("left"): The
05298 ; Zylon ship follows our starship's rotation. This works in Aft view, too,
05299 ; where the direction of change of the Zylon velocity index is reversed.
05300 ; After setting the new Zylon velocity index, it is used to pick a new
05301 ; Zylon timer value for this Zylon velocity index:
05302 ;
05303 ; +--------------------------------+----+----+----+----+----+----+----+----+
05304 ; | Velocity Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
05305 ; +--------------------------------+----+----+----+----+----+----+----+----+
05306 ; | Zylon Timer Value (Game Loops) | 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 |
05307 ; +--------------------------------+----+----+----+----+----+----+----+----+
05308 ; +--------------------------------+----+----+----+----+----+----+----+----+
05309 ; | Velocity Index | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
05310 ; +--------------------------------+----+----+----+----+----+----+----+----+
05311 ; | Zylon Timer Value (Game Loops) | 14 | 12 | 10 | 8 | 6 | 4 | 2 | 0 |
05312 ; +--------------------------------+----+----+----+----+----+----+----+----+
05313 ;
05314 ; (3) Update the x and y velocity vector components of the single Zylon photon
05315 ; torpedo.
05316 ;
05317 ; If a Zylon photon torpedo is moving toward our starship then update its x
05318 ; and y velocity vector components. They are picked from table
05319 ; ZYLONHOMVELTAB ($BF85) and depend on the mission level. The signs of the
05320 ; velocity vector components are always set such that the Zylon photon
05321 ; torpedo is guided toward our starship.
05322 ;
05323 ; (4) Create a meteor?
05324 ;
05325 ; If PLAYER2, the PLAYER to represent a meteor, is either initial or not
05326 ; alive, then attempt in 7 out of 8 game loop iterations to create a new
05327 ; meteor.
05328 ;
05329 ; With a probability of 2% (4:256) a new meteor is created: Its shape type
05330 ; is set to METEOR, its position vector components to random coordinates in
05331 ; subroutine INITPOSVEC ($B764), its lifetime to 60 game loop iterations,
05332 ; and its velocity vector components (velocities) to x-velocity: 0 <KM/H>,
05333 ; y-velocity: 0 <KM/H>, z-velocity: -8 <KM/H>. Then code execution returns.
05334 ;
05335 ; (5) Toggle Zylon ship control.
05336 ;
05337 ; Every other game loop iteration, the program takes control of and
05338 ; maneuvers the other Zylon ship.
05339 ;
05340 ; (6) Create new Zylon ship?
05341 ;
05342 ; If the program-controlled Zylon ship is not alive, check if both Zylon
05343 ; ships are not alive and this is an empty sector. If so, then attempt to
05344 ; create a meteor. Otherwise create a new Zylon ship with infinite
05345 ; lifetime. Randomly pick its shape type from table ZYLONSHAPTAB ($BF89)
05346 ; (BASESTAR, ZYLON CRUISER, or ZYLON FIGHTER) and its flight pattern from
05347 ; table ZYLONFLPATTAB ($BF91) (attack flight pattern 0 is always picked in
05348 ; a NOVICE mission). Then set the milestone timer to 1 game loop iteration
05349 ; and the position vector of the Zylon ship to a position of at least
05350 ; +28928 (+$71**) <KM> in front of our starship. The y-coordinate depends
05351 ; on the value of VICINITYMASK ($C7). The x-coordinate is the sum of the
05352 ; y-coordinate plus at least 4864..5119 ($13**) <KM>. Randomly choose the
05353 ; signs of the x and y coordinates.
05354 ;
05355 ; (7) Set the current flight pattern to attack flight pattern?
05356 ;
05357 ; The current flight pattern of the Zylon ship will change to attack flight
05358 ; pattern if it is close enough (z-coordinate < +8192 (+$20**) <KM>) and
05359 ; one of the following conditions is met:
05360 ;
05361 ; o The Zylon ship is located behind our starship.
05362 ;
05363 ; o The shape of the Zylon ship is not initial and does not currently
05364 ; appear as a blip in the Long-Range Scan view.
05365 ;
05366 ; (8) Update the back-attack flag and the milestone velocity indices.
05367 ;
05368 ; The milestone timer is decremented for the program-controlled Zylon ship.
05369 ; If this timer reaches a value of 0 the following steps are executed:
05370 ;
05371 ; o The milestone timer is reset to a value of 120 game loop iterations.
05372 ;
05373 ; o The back-attack flag is updated. It determines if the
05374 ; program-controlled Zylon ship not only attacks from the front of our
05375 ; starship but also from the back. A back-attack takes place with a
05376 ; probability of 19% (48:256) in WARRIOR or COMMANDER missions.
05377 ;
05378 ; o Course corrections are prepared for the program-controlled Zylon ship
05379 ; by computing the new milestone vector indices, resulting in new
05380 ; velocity vector components for this Zylon ship. The new milestone
05381 ; velocity indices for each velocity vector component are randomly
05382 ; chosen depending of the flight pattern. Recall that the Zylon
05383 ; velocity index is changed gradually to match the milestone velocity
05384 ; index. It corresponds to a maximum velocity vector component when
05385 ; using this index to pick a velocity vector component from Zylon
05386 ; velocity table ZYLONVELTAB ($BF99):
05387 ;
05388 ; +----------------+----------------+------------------+
05389 ; | Flight Pattern | New Milestone | Maximum Velocity |
05390 ; | | Velocity Index | Vector Component |
05391 ; +----------------+----------------+------------------+
05392 ; | 0 | 0 | +62 <KM/H> |
05393 ; | 0 | 15 | -62 <KM/H> |
05394 ; | 1 | 1 | +30 <KM/H> |
05395 ; | 1 | 14 | -30 <KM/H> |
05396 ; | 4 | 4 | +4 <KM/H> |
05397 ; | 4 | 11 | -4 <KM/H> |
05398 ; +----------------+----------------+------------------+
05399 ;
05400 ; (9) Update milestone velocity indices in attack flight pattern.
05401 ;
05402 ; If a Zylon ship executes the attack flight pattern, its milestone
05403 ; velocity indices are changed depending on the current location of the
05404 ; Zylon ship as follows:
05405 ;
05406 ; +--------------+-------------+----------------+------------+----------------+
05407 ; | x-Coordinate | Where on | Milestone | Velocity | Zylon Ship |
05408 ; | | Screen | Velocity Index | | Accelerates... |
05409 ; +--------------+-------------+----------------+------------+----------------+
05410 ; | x < 0 <KM> | left half | 0 | +62 <KM/H> | to the right |
05411 ; | x >= 0 <KM> | right half | 15 | -62 <KM/H> | to the left |
05412 ; +--------------+-------------+----------------+------------+----------------+
05413 ; +--------------+-------------+----------------+------------+----------------+
05414 ; | y-Coordinate | Where on | Milestone | Velocity | Zylon Ship |
05415 ; | | Screen | Velocity Index | | Accelerates... |
05416 ; +--------------+-------------+----------------+------------+----------------+
05417 ; | y < 0 <KM> | bottom half | 0 | +62 <KM/H> | up |
05418 ; | y >= 0 <KM> | top half | 15 | -62 <KM/H> | down |
05419 ; +--------------+-------------+----------------+------------+----------------+
05420 ;
05421 ; Thus, with respect to its x and y coordinates, the Zylon ship oscillates
05422 ; around the center of the Front or Aft view.
05423 ;
05424 ; This is the behavior of the Zylon ship along the z-axis:
05425 ;
05426 ; If the Zylon ship attacks from the front:
05427 ;
05428 ; +--------------------------+----------------+------------+----------------+
05429 ; | z-Coordinate | Milestone | Velocity | Zylon Ship |
05430 ; | | Velocity Index | | Accelerates... |
05431 ; +--------------------------+----------------+------------+----------------+
05432 ; | z < +2560 (+$0A00) <KM> | 0 | +62 <KM/H> | outbound |
05433 ; | z >= +2560 (+$0A00) <KM> | 15 | -62 <KM/H> | inbound |
05434 ; +--------------------------+----------------+------------+----------------+
05435 ;
05436 ; In other words, the Zylon ship accelerates into positive z-direction
05437 ; (outbound) up to a distance of +2560 (+$0A00) <KM>, then reverses its
05438 ; course and returns back to our starship (inbound).
05439 ;
05440 ; If the Zylon ship attacks from the back:
05441 ;
05442 ; +--------------------------+----------------+------------+----------------+
05443 ; | z-Coordinate | Milestone | Velocity | Zylon Ship |
05444 ; | | Velocity Index | | Accelerates... |
05445 ; +--------------------------+----------------+------------+----------------+
05446 ; | z < -2816 (-$F500) <KM> | 0 | +62 <KM/H> | inbound |
05447 ; | z >= -2816 (-$F500) <KM> | 15 | -62 <KM/H> | outbound |
05448 ; +--------------------------+----------------+------------+----------------+
05449 ;
05450 ; In other words, the Zylon ship accelerates into negative z-direction
05451 ; (outbound) up to a distance of -2816 (-$(0B00)) <KM>, then reverses its
05452 ; course and returns back to our starship (inbound).
05453 ;
05454 ; (10) Change Zylon velocity index toward milestone velocity index.
05455 ;
05456 ; Compare all 3 Zylon velocity indices of the program-controlled Zylon ship
05457 ; with their corresponding milestone velocity indices. Increment or
05458 ; decrement the former to better match the latter. Use the new Zylon
05459 ; velocity indices to pick the current velocity values from Zylon velocity
05460 ; table ZYLONVELTAB ($BF99).
05461 ;
05462 ; (11) Launch a Zylon photon torpedo?
05463 ;
05464 ; Prepare launching a Zylon photon torpedo if either of the following
05465 ; conditions are met:
05466 ;
05467 ; o PLAYER2 is not used as a photon torpedo
05468 ;
05469 ; o The y-coordinate of the Zylon ship is in the range of -768..+767
05470 ; (-$0300..+$2FF) <KM>.
05471 ;
05472 ; or if
05473 ;
05474 ; o The Zylon photon torpedo is not alive
05475 ;
05476 ; o The corresponding Zylon photon torpedo delay timer has reached a
05477 ; value of 0
05478 ;
05479 ; o The y-coordinate of the Zylon ship is in the range of -768..+767
05480 ; (-$0300..+$2FF) <KM>.
05481 ;
05482 ; At this point the z-velocity vector component of the Zylon photon torpedo
05483 ; is preloaded with a value of -80 or +80 <KM/H> depending on the Zylon
05484 ; ship being in front or behind of our starship, respectively.
05485 ;
05486 ; Launch a Zylon photon torpedo if both of the following conditions are
05487 ; met:
05488 ;
05489 ; o The Zylon ship is in front or behind of our starship, with the
05490 ; exception of a Zylon ship behind our starship in a NOVICE mission
05491 ; (our starship will never be shot in the back in a NOVICE mission).
05492 ;
05493 ; o The z-coordinate of the Zylon ship (no matter if in front or behind
05494 ; our starship) is closer than 8192 ($20**) <KM>.
05495 ;
05496 ; Finally, the Zylon photon torpedo is launched with a lifetime of 62 game
05497 ; loop iterations. Its position vector is copied from the launching Zylon
05498 ; ship in subroutine COPYPOSVEC ($ACAF). In addition, the Zylon ship is
05499 ; earmarked for the tracking computer.
05500
=006A 05501 L.CTRLDZYLON = $6A ; Index of currently program-controlled Zylon ship.
05502 ; Used values are:
05503 ; 0 -> Control Zylon ship 0
05504 ; 1 -> Control Zylon ship 1
=0080 05505 NEG = $80 ; Negative sign bit for velocity vector component
05506
AA79 A5C0 05507 MANEUVER LDA WARPSTATE ; Return if in starbase sector or hyperwarp engaged
AA7B 057B 05508 ORA ISSTARBASESECT ;
AA7D D0F9 05509 BNE SKIP078 ;
05510
05511 ;*** Update x and y velocity of both our starship's photon torpedoes 0 and 1 ***
AA7F A586 05512 LDA ISTRACKING ; Skip this if ship's torpedoes not tracking a target
AA81 F030 05513 BEQ SKIP080 ;
05514
AA83 A689 05515 LDX PLTRACKED ; Load PLAYER index of tracked target space object
05516
AA85 38 05517 SEC ; Prep A := PLAYER row number of target...
AA86 BDF90B 05518 LDA PL0ROWNEW,X ; ...- PLAYER row number photon torpedo 0
AA89 EDFC0B 05519 SBC PL3ROWNEW ;
AA8C 9002 05520 BCC SKIP079 ; Skip if target above our starship's photon torpedo
AA8E A900 05521 LDA #0 ; Prep A := 0
AA90 20CAAE 05522 SKIP079 JSR HOMINGVEL ; Get y-velocity for homing photon torpedo 0 and 1
AA93 8DCB0B 05523 STA PL3YVEL ; Store y-velocity photon torpedo 0
AA96 8DCC0B 05524 STA PL4YVEL ; Store y-velocity photon torpedo 1
05525
AA99 38 05526 SEC ; Prep A := PLAYER column number of target...
AA9A AD2D0C 05527 LDA PL3COLUMN ; ...- PLAYER column number of photon torpedo 0
AA9D FD2A0C 05528 SBC PL0COLUMN,X ;
AAA0 20CAAE 05529 JSR HOMINGVEL ; Get x-velocity for homing photon torpedo 0
AAA3 8D9A0B 05530 STA PL3XVEL ; Store x-velocity of photon torpedo 0
05531
AAA6 38 05532 SEC ; Prep A := PLAYER column number of target...
AAA7 AD2E0C 05533 LDA PL4COLUMN ; ...- PLAYER column number of photon torpedo 1
AAAA FD2A0C 05534 SBC PL0COLUMN,X ;
AAAD 20CAAE 05535 JSR HOMINGVEL ; Get x-velocity for homing photon torpedo 1
AAB0 8D9B0B 05536 STA PL4XVEL ; Store x-velocity of photon torpedo 1
05537
05538 ;*** Make Zylon ships follow rotation of our starship **************************
AAB3 A203 05539 SKIP080 LDX #3 ; Loop over x and y velocity indices of both Zylons
AAB5 D6BA 05540 LOOP036 DEC ZYLONTIMX0,X ; Decrement Zylon timer
AAB7 1027 05541 BPL SKIP085 ; Next timer if this one still counting down
05542
AAB9 8A 05543 TXA ; Prep joystick (x or y) value in -1, 0, +1
AABA 4A 05544 LSR A ;
AABB A8 05545 TAY ;
AABC B9C800 05546 LDA JOYSTICKX,Y ;
05547
AABF A4D0 05548 LDY SHIPVIEW ; Skip if in Front view
AAC1 F005 05549 BEQ SKIP081 ;
05550
AAC3 49FF 05551 EOR #$FF ; Invert joystick value (when in Aft view)
AAC5 18 05552 CLC ; (two's-complement)
AAC6 6901 05553 ADC #1 ;
05554
AAC8 18 05555 SKIP081 CLC ; Add joystick value to Zylon velocity index
AAC9 75B4 05556 ADC ZYLONVELINDX0,X ;
AACB 1002 05557 BPL SKIP082 ;
AACD A900 05558 LDA #0 ;
AACF C910 05559 SKIP082 CMP #16 ; Limit new Zylon velocity index to 0..15 ...
AAD1 9002 05560 BCC SKIP083 ;
AAD3 A90F 05561 LDA #15 ;
AAD5 95B4 05562 SKIP083 STA ZYLONVELINDX0,X ; ...and store new Zylon velocity index
05563
AAD7 C908 05564 CMP #8 ; Calc new Zylon timer value in 0, 2, ..., 14
AAD9 9002 05565 BCC SKIP084 ;
AADB 490F 05566 EOR #$0F ;
AADD 0A 05567 SKIP084 ASL A ;
AADE 95BA 05568 STA ZYLONTIMX0,X ; ...and store new Zylon timer value
05569
AAE0 CA 05570 SKIP085 DEX ;
AAE1 10D2 05571 BPL LOOP036 ; Next Zylon timer
05572
05573 ;*** Update x and y velocity of single Zylon photon torpedo ********************
AAE3 AD8E0C 05574 LDA PL2SHAPTYPE ; Skip if PLAYER2 not PHOTON TORPEDO (shape type 0)
AAE6 D01B 05575 BNE SKIP088 ;
05576
AAE8 A462 05577 LDY MISSIONLEVEL ; Depending on mission level...
AAEA B985BF 05578 LDA ZYLONHOMVELTAB,Y ; ...pick (initially negative) Zylon torpedo velocity
05579
AAED AEA40A 05580 LDX PL2YPOSHI ; If photon torpedo in upper screen half (y >= 0)...
AAF0 1002 05581 BPL SKIP086 ; ...don't toggle velocity sign -> torpedo goes down
AAF2 297F 05582 AND #$7F ; ...toggle velocity sign -> torpedo goes up
AAF4 8DCA0B 05583 SKIP086 STA PL2YVEL ; Store new y-velocity of Zylon photon torpedo
05584
AAF7 0980 05585 ORA #NEG ; Restore negative sign bit of velocity
05586
AAF9 AE730A 05587 LDX PL2XPOSHI ; If photon torpedo in right screen half (x >= 0)...
AAFC 1002 05588 BPL SKIP087 ; ...don't toggle velocity sign -> torpedo goes left
AAFE 297F 05589 AND #$7F ; ...toggle velocity sign -> torpedo goes right
AB00 8D990B 05590 SKIP087 STA PL2XVEL ; Store new x-velocity of Zylon photon torpedo
05591
05592 ;*** Create new meteor? ********************************************************
AB03 A576 05593 SKIP088 LDA COUNT256 ; Attempt meteor creation in 7 out of 8 game loops
AB05 2903 05594 AND #$03 ;
AB07 F02E 05595 BEQ SKIP092 ;
05596
AB09 A5E6 05597 SKIP089 LDA PL2SHAPOFF ; If PLAYER2 shape is initial try to create a meteor
AB0B F004 05598 BEQ SKIP090 ;
05599
AB0D A5EB 05600 LDA PL2LIFE ; Return if PLAYER2 alive
AB0F D025 05601 BNE SKIP091 ;
05602
AB11 AD0AD2 05603 SKIP090 LDA RANDOM ; Return in 98% (252:256) (do not create meteor)
AB14 C904 05604 CMP #4 ;
AB16 B01E 05605 BCS SKIP091 ;
05606
05607 ;*** Create new meteor! ********************************************************
AB18 A960 05608 LDA #SHAP.METEOR ; PLAYER2 is METEOR (shape type 6)
AB1A 8D8E0C 05609 STA PL2SHAPTYPE ;
AB1D A202 05610 LDX #2 ; Randomize position vector of meteor
AB1F 2064B7 05611 JSR INITPOSVEC ;
AB22 A93C 05612 LDA #60 ; Meteor lifetime := 60 game loops
AB24 85EB 05613 STA PL2LIFE ;
AB26 A988 05614 LDA #NEG!8 ; SUMMARY:
AB28 8D680B 05615 STA PL2ZVEL ; x-velocity := 0 <KM/H>
AB2B A900 05616 LDA #0 ; y-velocity := 0 <KM/H>
AB2D 8D2C0C 05617 STA PL2COLUMN ; z-velocity := -8 <KM/H>
AB30 8D990B 05618 STA PL2XVEL ;
AB33 8DCA0B 05619 STA PL2YVEL ; PLAYER2 column number := 0 (offscreen)
AB36 60 05620 SKIP091 RTS ; Return
05621
05622 ;*** Toggle Zylon ship control *************************************************
AB37 A5A7 05623 SKIP092 LDA CTRLDZYLON ; Toggle control to the other Zylon ship
AB39 4901 05624 EOR #$01 ;
AB3B 85A7 05625 STA CTRLDZYLON ;
05626
05627 ;*** Create a new Zylon ship? **************************************************
AB3D AA 05628 TAX ; Save index of controlled Zylon ship
AB3E B5E9 05629 LDA PL0LIFE,X ; Skip creating Zylon ship if its PLAYER still alive
AB40 D042 05630 BNE SKIP094 ;
05631
AB42 A5E9 05632 LDA PL0LIFE ; If both Zylon ships are not alive...
AB44 05EA 05633 ORA PL1LIFE ;
AB46 2901 05634 AND #$01 ;
AB48 A490 05635 LDY CURRSECTOR ; ...and this an empty sector...
AB4A D9C908 05636 CMP GCMEMMAP,Y ;
AB4D B0BA 05637 BCS SKIP089 ; ...attempt to create meteor and return
05638
05639 ;*** Create a new Zylon ship! **************************************************
AB4F A9FF 05640 LDA #255 ; Zylon ship lifetime := 255 game loops (infinite)
AB51 95E9 05641 STA PL0LIFE,X ;
05642
AB53 AD0AD2 05643 LDA RANDOM ; Pick a Zylon ship shape type (1 out of 8)
AB56 2907 05644 AND #$07 ;
AB58 A8 05645 TAY ;
AB59 B989BF 05646 LDA ZYLONSHAPTAB,Y ;
AB5C 9D8C0C 05647 STA PL0SHAPTYPE,X ;
05648
AB5F A562 05649 LDA MISSIONLEVEL ; Init Zylon's flight pattern (0 if NOVICE mission)
AB61 F003 05650 BEQ SKIP093 ;
AB63 B991BF 05651 LDA ZYLONFLPATTAB,Y ;
AB66 95A8 05652 SKIP093 STA ZYLONFLPAT0,X ;
05653
AB68 A901 05654 LDA #1 ; Zylon ship's milestone timer := 1 game loop
AB6A 95AA 05655 STA MILESTTIM0,X ;
05656
AB6C 9DAD09 05657 STA ZPOSSIGN,X ; Put Zylon ship in front of our starship
AB6F AD0AD2 05658 LDA RANDOM ;
AB72 25C7 05659 AND VICINITYMASK ; y-coordinate (high byte) := RND(0..VICINITYMASK)
AB74 9DA20A 05660 STA YPOSHI,X ;
AB77 6913 05661 ADC #19 ; x-coordinate (high byte) := y (high byte) + 19
AB79 9D710A 05662 STA XPOSHI,X ;
AB7C 0971 05663 ORA #$71 ; z-coordinate (high byte) := >= +28928 (+$71**) <KM>
AB7E 9D400A 05664 STA ZPOSHI,X ;
AB81 20BEB7 05665 JSR RNDINVXY ; Randomly invert x and y coordinate of pos vector
05666
05667 ;*** Set current flight pattern to attack flight pattern? **********************
AB84 BD400A 05668 SKIP094 LDA ZPOSHI,X ; Skip if Zylon too distant (z >= +$20** <KM>)
AB87 C920 05669 CMP #$20 ;
AB89 B011 05670 BCS SKIP096 ;
05671
AB8B BDAD09 05672 LDA ZPOSSIGN,X ; Set attack flight pattern if Zylon is behind
AB8E F008 05673 BEQ SKIP095 ;
05674
AB90 B5E4 05675 LDA PL0SHAPOFF,X ; Skip if Zylon shape initial
AB92 F008 05676 BEQ SKIP096 ;
05677
AB94 C929 05678 CMP #$29 ; Skip if Zylon shape is Long-Range Scan blip
AB96 F004 05679 BEQ SKIP096 ;
05680
AB98 A900 05681 SKIP095 LDA #0 ; Set attack flight pattern
AB9A 95A8 05682 STA ZYLONFLPAT0,X ;
05683
05684 ;*** Update back-attack flag and milestone velocity indices ********************
AB9C D6AA 05685 SKIP096 DEC MILESTTIM0,X ; Skip if milestone timer still counting down
AB9E 1024 05686 BPL SKIP099 ;
05687
ABA0 A978 05688 LDA #120 ; Milestone timer := 120 game loops
ABA2 95AA 05689 STA MILESTTIM0,X ;
05690
ABA4 A562 05691 LDA MISSIONLEVEL ; Back-attack flag := 1 in 19% (48:256) of...
ABA6 AC0AD2 05692 LDY RANDOM ; ...WARRIOR or COMMANDER missions
ABA9 C030 05693 CPY #48 ; ... := 0 otherwise
ABAB 9001 05694 BCC SKIP097 ;
ABAD 4A 05695 LSR A ;
ABAE 4A 05696 SKIP097 LSR A ;
ABAF 95B8 05697 STA ISBACKATTACK0,X ;
05698
05699 ; Loop over all 3 milestone velocity indices
ABB1 B5A8 05700 LDA ZYLONFLPAT0,X ; Set new milestone velocity index:
ABB3 2C0AD2 05701 LOOP037 BIT RANDOM ; If Zylon flight pattern is...
ABB6 1002 05702 BPL SKIP098 ; ...0 -> milestone velocity index := either 0 or 15
ABB8 490F 05703 EOR #$0F ; ...1 -> milestone velocity index := either 1 or 14
ABBA 95AC 05704 SKIP098 STA MILESTVELINDZ0,X ; ...4 -> milestone velocity index := either 4 or 11
ABBC E8 05705 INX ;
ABBD E8 05706 INX ;
ABBE E006 05707 CPX #6 ;
ABC0 90F1 05708 BCC LOOP037 ; Next Zylon milestone velocity index
05709
05710 ;*** Update milestone velocity indices in attack flight pattern ****************
ABC2 A6A7 05711 LDX CTRLDZYLON ; Reload index of controlled Zylon ship
05712
ABC4 B5A8 05713 SKIP099 LDA ZYLONFLPAT0,X ; Skip if not in attack flight pattern
ABC6 D032 05714 BNE SKIP105 ;
05715
ABC8 A4A7 05716 LDY CTRLDZYLON ; Reload index of controlled Zylon ship
05717
05718 ; Loop over all 3 milestone velocity indices
ABCA C031 05719 LOOP038 CPY #$31 ; Skip to handle x and y velocity index
ABCC B013 05720 BCS SKIP101 ;
05721 ; SUMMARY:
ABCE B9B800 05722 LDA ISBACKATTACK0,Y ; Handle z-velocity index:
ABD1 4A 05723 LSR A ;
ABD2 B9400A 05724 LDA ZPOSHI,Y ; If Zylon attacks from front...
ABD5 B006 05725 BCS SKIP100 ; z < $0A00 <KM> -> mil vel index := 0 (+62 <KM/H>)
ABD7 C90A 05726 CMP #$0A ; z >= $0A00 <KM> -> mil vel index := 15 (-62 <KM/H>)
ABD9 900E 05727 BCC SKIP103 ;
ABDB B004 05728 BCS SKIP101 ; If Zylon attacks from back...
ABDD C9F5 05729 SKIP100 CMP #$F5 ; z >= $F500 <KM> -> mil vel index := 15 (-62 <KM/H>)
ABDF B004 05730 BCS SKIP102 ; z < $F500 <KM> -> mil vel index := 0 (+62 <KM/H>)
05731
ABE1 B9AD09 05732 SKIP101 LDA ZPOSSIGN,Y ; Handle x and y velocity index:
ABE4 4A 05733 LSR A ;
ABE5 A90F 05734 SKIP102 LDA #15 ; x >= 0 <KM> -> mil vel index := 15 (-62 <KM/H>)
ABE7 B002 05735 BCS SKIP104 ; x < 0 <KM> -> mil vel index := 0 (+62 <KM/H>)
ABE9 A900 05736 SKIP103 LDA #0 ; y >= 0 <KM> -> mil vel index := 15 (-62 <KM/H>)
ABEB 95AC 05737 SKIP104 STA MILESTVELINDZ0,X ; y < 0 <KM> -> mil vel index := 0 (+62 <KM/H>)
05738
ABED 18 05739 CLC ; Adjust position vector component index
ABEE 98 05740 TYA ;
ABEF 6931 05741 ADC #NUMSPCOBJ.ALL ;
ABF1 A8 05742 TAY ;
05743
ABF2 E8 05744 INX ;
ABF3 E8 05745 INX ;
ABF4 E006 05746 CPX #6 ;
ABF6 90D2 05747 BCC LOOP038 ; Next milestone velocity index
05748
05749 ;*** Acceleration: Change Zylon velocity index toward milestone velocity index *
ABF8 A6A7 05750 LDX CTRLDZYLON ; Reload index of controlled Zylon ship
ABFA A4A7 05751 SKIP105 LDY CTRLDZYLON ; Reload index of controlled Zylon ship
05752
05753 ; Loop over all 3 milestone velocity indices
ABFC B5B2 05754 LOOP039 LDA ZYLONVELINDZ0,X ; Compare Zylon velocity index with milestone index
ABFE D5AC 05755 CMP MILESTVELINDZ0,X ;
AC00 F008 05756 BEQ SKIP107 ; Skip if equal
AC02 B004 05757 BCS SKIP106 ;
AC04 F6B2 05758 INC ZYLONVELINDZ0,X ; Increm. Zylon velocity index if < milestone index
AC06 9002 05759 BCC SKIP107 ;
AC08 D6B2 05760 SKIP106 DEC ZYLONVELINDZ0,X ; Decrem. Zylon velocity index if >= milestone index
05761
AC0A 866A 05762 SKIP107 STX L.CTRLDZYLON ; Save index of controlled Zylon ship
AC0C AA 05763 TAX ;
AC0D BD99BF 05764 LDA ZYLONVELTAB,X ; Pick new velocity value by Zylon velocity index
AC10 A66A 05765 LDX L.CTRLDZYLON ; Reload index of controlled Zylon ship
AC12 99660B 05766 STA ZVEL,Y ; Store new velocity vector component of Zylon ship
05767
AC15 98 05768 TYA ; Next velocity vector component
AC16 18 05769 CLC ;
AC17 6931 05770 ADC #NUMSPCOBJ.ALL ;
AC19 A8 05771 TAY ;
05772
AC1A E8 05773 INX ;
AC1B E8 05774 INX ;
AC1C E006 05775 CPX #6 ;
AC1E 90DC 05776 BCC LOOP039 ; Next milestone velocity index
05777
05778 ;*** Launch Zylon photon torpedo? **********************************************
05779
05780 ;*** Check PLAYER2 shape and lifetime ******************************************
AC20 A6A7 05781 LDX CTRLDZYLON ; Reload index of controlled Zylon ship
05782
AC22 AD8E0C 05783 LDA PL2SHAPTYPE ; Skip if PLAYER2 not PHOTON TORPEDO (shape type 0)
AC25 D00B 05784 BNE SKIP109 ;
05785
AC27 A5EB 05786 LDA PL2LIFE ; Return if Zylon photon torpedo still alive
AC29 D006 05787 BNE SKIP108 ;
05788
AC2B A5BE 05789 LDA TORPEDODELAY ; Count down Zylon photon torpedo delay timer...
AC2D F003 05790 BEQ SKIP109 ; ...before launching next Zylon photon torpedo
AC2F C6BE 05791 DEC TORPEDODELAY ;
AC31 60 05792 SKIP108 RTS ; Return
05793
05794 ;*** Check y-coordinate of Zylon ship ******************************************
AC32 18 05795 SKIP109 CLC ; Return if Zylon ship's y-coordinate not...
AC33 BDA20A 05796 LDA YPOSHI,X ; ...in -768..+767 (-$(0300)..+$2FF) <KM>.
AC36 6902 05797 ADC #2 ;
AC38 C905 05798 CMP #5 ;
AC3A B0F5 05799 BCS SKIP108 ;
05800
05801 ;*** Set Zylon photon torpedo's z-velocity *************************************
AC3C A0D0 05802 LDY #NEG!80 ; Prep Zylon torpedo's z-velocity := -80 <KM/H>
05803
AC3E BDAD09 05804 LDA ZPOSSIGN,X ; Prep Zylon ship's sign of z-coordinate
AC41 4A 05805 LSR A ;
AC42 BD400A 05806 LDA ZPOSHI,X ; Prep Zylon ship's z-coordinate
AC45 B008 05807 BCS SKIP110 ; Skip if Zylon ship in front...
AC47 49FF 05808 EOR #$FF ; ...else invert loaded Zylon ship's z-coordinate
05809
AC49 A462 05810 LDY MISSIONLEVEL ; Return (no torpedo from back) if NOVICE mission
AC4B F0E4 05811 BEQ SKIP108 ;
05812
AC4D A050 05813 LDY #80 ; Preload Zylon torpedo's z-velocity := +80 <KM/H>
05814
05815 ;*** Is Zylon ship in range? ***************************************************
AC4F C920 05816 SKIP110 CMP #$20 ; Return if Zylon ship too far...
AC51 B0DE 05817 BCS SKIP108 ; ... (ABS(z-coordinate) > 8192 ($20**) <KM>)
05818
AC53 8C680B 05819 STY PL2ZVEL ; Store Zylon photon torpedo's z-velocity
05820
05821 ;*** Launch Zylon photon torpedo! **********************************************
05822
AC56 A900 05823 LDA #0 ; PLAYER2 is PHOTON TORPEDO (shape type 0)
AC58 8D8E0C 05824 STA PL2SHAPTYPE ;
AC5B 8D2C0C 05825 STA PL2COLUMN ; Zylon torpedo PLAYER column number := 0 (offscreen)
AC5E A93E 05826 LDA #62 ;
AC60 85EB 05827 STA PL2LIFE ; Zylon torpedo lifetime := 62 game loops
05828
AC62 A202 05829 LDX #2 ; Prep source index for position vector copy
AC64 A4A7 05830 LDY CTRLDZYLON ; Prep destination index for position vector copy
AC66 84BF 05831 STY ZYLONATTACKER ; Save Zylon ship index for tracking computer
AC68 4CAFAC 05832 JMP COPYPOSVEC ; Copy position vector from Zylon ship to its torpedo
05833
05834 ;*******************************************************************************
05835 ;* *
05836 ;* INITEXPL *
05837 ;* *
05838 ;* Initialize explosion *
05839 ;* *
05840 ;*******************************************************************************
05841
05842 ; DESCRIPTION
05843 ;
05844 ; Initializes the explosion's lifetime, the explosion fragments' position and
05845 ; velocity vectors as well as their pixel row and column numbers.
05846 ;
05847 ; An explosion has a lifetime of 128 game loop iterations. It consists of 32
05848 ; explosion fragment space objects with indices 17..48. The position vector of
05849 ; each explosion fragment is copied from the exploding PLAYER space object.
05850 ;
05851 ; The pixel column number of each explosion fragment is initialized to
05852 ;
05853 ; PIXEL COLUMN NUMBER := PLAYER column number - 48 + RND(0..15)
05854 ;
05855 ; To convert PLAYER column numbers (in Player/Missile (PM) pixels) into pixel
05856 ; column numbers, the PLAYER column number of the left PLAYFIELD border (= 48)
05857 ; is subtracted and a random number is added.
05858 ;
05859 ; BUG (at $AC76): The added random number should not be in 0..15 but in 0..7
05860 ; because the exploding PLAYER is 8 pixels wide. The PLAYER column number
05861 ; represents the left edge of the PLAYER shape. When using a random number in
05862 ; 0..15, half of the pixels are located off to the right of the PLAYER, outside
05863 ; the PLAYER area. Suggested fix: Replace instruction AND #$0F with AND #$07.
05864 ;
05865 ; The pixel row number of each explosion fragment is initialized to
05866 ;
05867 ; PIXEL ROW NUMBER := (PLAYER row number - RND(0..15)) / 2 - 16
05868 ;
05869 ; BUG (at $AC88): To convert PLAYER row numbers (in PM pixels) into pixel row
05870 ; numbers, the PLAYER row number to the top PLAYFIELD border (= 16) should be
05871 ; subtracted first, then the division by 2 (instruction LRS A) should be applied
05872 ; to reduce the double-line PM resolution to the single-line PLAYFIELD
05873 ; resolution. Suggested fix: Swap instruction LRS A with SBC #16 which leads to
05874 ; the following formula for the pixel row number:
05875 ;
05876 ; PIXEL ROW NUMBER := (PLAYER row number - 16 + RND(0..15)) / 2
05877 ;
05878 ; Incidentally, adding a random number in 0..15 is correct. PLAYER row number
05879 ; represents the top edge of the PLAYER shape, which is typically 16 PM pixels
05880 ; tall when representing a close space object.
05881 ;
05882 ; The velocity vector of explosion fragments is set to random x, y, and z
05883 ; velocity vector components in -7..+7 <KM/H>.
05884 ;
05885 ; INPUT
05886 ;
05887 ; Y = PLAYER index from which the explosion originates. Used values are:
05888 ; 0 -> Explosion of PLAYER0 (Zylon ship 0)
05889 ; 1 -> Explosion of PLAYER1 (Zylon ship 1)
05890 ; 2 -> Explosion of PLAYER2 (Zylon photon torpedo, starbase, or meteor)
05891
AC6B A980 05892 INITEXPL LDA #128 ; Explosion lifetime := 128 game loops
AC6D 8573 05893 STA EXPLLIFE ;
05894
AC6F A230 05895 LDX #NUMSPCOBJ.ALL-1 ; Max index of space objects (for explosion frags)
AC71 8679 05896 STX MAXSPCOBJIND ;
05897
05898 ; Loop over all explosion fragment position vectors
05899 ; (index 48..17)
AC73 AD0AD2 05900 LOOP040 LDA RANDOM ; PIXEL COLUMN NUM := PLAYER column - 48 + RND(0..15)
AC76 290F 05901 AND #$0F ; (!)
AC78 792A0C 05902 ADC PL0COLUMN,Y ;
AC7B E930 05903 SBC #48 ;
AC7D 9D2A0C 05904 STA PIXELCOLUMN,X ;
05905
AC80 AD0AD2 05906 LDA RANDOM ; PIXEL ROW NUM := (PLAYER row + RND(0..15)) / 2 - 16
AC83 290F 05907 AND #$0F ;
AC85 79F90B 05908 ADC PL0ROWNEW,Y ;
AC88 4A 05909 LSR A ; (!)
AC89 E910 05910 SBC #16 ;
AC8B 9DF90B 05911 STA PIXELROWNEW,X ;
05912
AC8E 20AFAC 05913 JSR COPYPOSVEC ; Copy position vector of PLAYER to explosion frag
05914
AC91 AD0AD2 05915 LDA RANDOM ; z-velocity := RND(-7..+7) <KM/H>
AC94 2987 05916 AND #NEG!7 ;
AC96 9D660B 05917 STA ZVEL,X ;
AC99 AD0AD2 05918 LDA RANDOM ; x-velocity := RND(-7..+7) <KM/H>
AC9C 2987 05919 AND #NEG!7 ;
AC9E 9D970B 05920 STA XVEL,X ;
ACA1 AD0AD2 05921 LDA RANDOM ; y-velocity := RND(-7..+7) <KM/H>
ACA4 2987 05922 AND #NEG!7 ;
ACA6 9DC80B 05923 STA YVEL,X ;
05924
ACA9 CA 05925 DEX ; Next explosion fragment position vector
ACAA E010 05926 CPX #16 ;
ACAC D0C5 05927 BNE LOOP040 ;
ACAE 60 05928 RTS ; Return
05929
05930 ;*******************************************************************************
05931 ;* *
05932 ;* COPYPOSVEC *
05933 ;* *
05934 ;* Copy a position vector *
05935 ;* *
05936 ;*******************************************************************************
05937
05938 ; DESCRIPTION
05939 ;
05940 ; Copies a position vector.
05941 ;
05942 ; Actually, this subroutine copies the z-coordinate only, then code execution
05943 ; continues into subroutine COPYPOSXY ($ACC1) to copy the x and y coordinate.
05944 ;
05945 ; INPUT
05946 ;
05947 ; X = Destination position vector index. Used values are: 0..48.
05948 ; Y = Source position vector index. Used values are: 0..48.
05949
ACAF B9AD09 05950 COPYPOSVEC LDA ZPOSSIGN,Y ;
ACB2 9DAD09 05951 STA ZPOSSIGN,X ;
ACB5 B9400A 05952 LDA ZPOSHI,Y ;
ACB8 9D400A 05953 STA ZPOSHI,X ;
ACBB B9D30A 05954 LDA ZPOSLO,Y ;
ACBE 9DD30A 05955 STA ZPOSLO,X ;
05956
05957 ;*******************************************************************************
05958 ;* *
05959 ;* COPYPOSXY *
05960 ;* *
05961 ;* Copy x and y components (coordinates) of position vector *
05962 ;* *
05963 ;*******************************************************************************
05964
05965 ; DESCRIPTION
05966 ;
05967 ; Copies the x and y components (coordinates) of a position vector.
05968 ;
05969 ; INPUT
05970 ;
05971 ; X = Destination position vector index. Used values are: 0..48.
05972 ; Y = Source position vector index. Used values are: 0..48.
05973
ACC1 B9DE09 05974 COPYPOSXY LDA XPOSSIGN,Y ;
ACC4 9DDE09 05975 STA XPOSSIGN,X ;
ACC7 B9710A 05976 LDA XPOSHI,Y ;
ACCA 9D710A 05977 STA XPOSHI,X ;
ACCD B90F0A 05978 LDA YPOSSIGN,Y ;
ACD0 9D0F0A 05979 STA YPOSSIGN,X ;
ACD3 B9A20A 05980 LDA YPOSHI,Y ;
ACD6 9DA20A 05981 STA YPOSHI,X ;
ACD9 B9040B 05982 LDA XPOSLO,Y ;
ACDC 9D040B 05983 STA XPOSLO,X ;
ACDF B9350B 05984 LDA YPOSLO,Y ;
ACE2 9D350B 05985 STA YPOSLO,X ;
ACE5 60 05986 SKIP111 RTS ; Return
05987
05988 ;*******************************************************************************
05989 ;* *
05990 ;* DOCKING *
05991 ;* *
05992 ;* Handle docking at starbase, launch and return of transfer vessel *
05993 ;* *
05994 ;*******************************************************************************
05995
05996 ; DESCRIPTION
05997 ;
05998 ; Handles docking at a starbase, launching and returning the transfer vessel,
05999 ; and repairing our starship's subsystems.
06000 ;
06001 ; This subroutine changes, if in Front view, the PLAYER-PLAYFIELD priority such
06002 ; that PLAYERs like the starbase appear behind the cross hairs, which are part
06003 ; of the PLAYFIELD.
06004 ;
06005 ; BUG (at $ACEE): The starbase also appears behind the stars, which are also
06006 ; part of the PLAYFIELD - a rarely noticed glitch. In Aft view, the arrangement
06007 ; is reversed: PLAYERs are arranged in front of the PLAYFIELD. Then the starbase
06008 ; (and the transfer vessel) appear in front of the cross hairs! Suggested fix:
06009 ; None, technically not possible.
06010 ;
06011 ; The starbase is tracked and the PLAYER0..2 shape types are set to STARBASE
06012 ; RIGHT, STARBASE LEFT, and STARBASE CENTER, respectively, combining them into a
06013 ; 3-part starbase shape.
06014 ;
06015 ; If this sector is still marked as a starbase sector but no more so on the
06016 ; Galactic Chart (if in the meantime either Zylon units have surrounded this
06017 ; sector and destroyed the starbase or you have destroyed the starbase with a
06018 ; photon torpedo) then the noise sound pattern SHIELD EXPLOSION is played in
06019 ; subroutine NOISE ($AEA8) and code execution returns.
06020 ;
06021 ; Otherwise a minimum distance to the starbase of +32 (+$0020) <KM> is enforced
06022 ; and the conditions for a successful docking are checked:
06023 ;
06024 ; DOCKING CONDITIONS
06025 ;
06026 ; A docking is successful if all of the following conditions are met:
06027 ;
06028 ; (1) The PLAYER2 (STARBASE CENTER) column number is in 120..135.
06029 ;
06030 ; BUG (at $AD39): At first glance, the PLAYER column interval of 120..135
06031 ; corresponds to an almost symmetric interval of -8..+7 PM pixels relative
06032 ; to the horizontal center of the PLAYFIELD, at PLAYER column number 128
06033 ; (48 PM pixels offset to left PLAYFIELD border + 80 PM pixels to the
06034 ; PLAYFIELD center). This is correct only if the PLAYER column number were
06035 ; to designate the horizontal center of the PLAYER. However it designates
06036 ; its left edge! Thus the used pixel column number range 120..135 creates
06037 ; an asymmetric horizontal docking position: A docking is successful if the
06038 ; horizontal position of the starbase shape's center is roughly -5..+10 PM
06039 ; pixels relative to the horizontal center of the PLAYFIELD. Suggested fix:
06040 ; Replace SBC #120 with SBC #117. This leads to an interval of -8..+7
06041 ; pixels relative to the horizontal center of the PLAYFIELD and better
06042 ; symmetry in the horizontal docking position.
06043 ;
06044 ; (2) The PLAYER2 (STARBASE CENTER) row number is in 104..119.
06045 ;
06046 ; BUG (at $AD43): The PLAYER row interval of 104..119 corresponds to an
06047 ; asymmetric interval of -20..-5 PM pixels relative to the vertical center
06048 ; of the PLAYFIELD, at pixel row number 80 or PLAYER row number 124. It
06049 ; lets you dock at a starbase that "sits" on top of the horizontal cross
06050 ; hairs but not at one that "hangs" from them. Suggested fix: Replace SBC
06051 ; #104 with SBC #108. This leads to an interval of -8..+7 pixels relative
06052 ; to the vertical center of the PLAYFIELD (assuming a PLAYER2 shape of 16
06053 ; pixel height, which is typical during docking) and better symmetry in the
06054 ; vertical docking position.
06055 ;
06056 ; (3) The starbase is in correct distance in front of our starship: The
06057 ; starbase's z-coordinate must be < +512 (+$02**) <KM>.
06058 ;
06059 ; (4) Our starship is horizontally level with the starbase: The starbase's
06060 ; y-coordinate must be < +256 (+$01**) <KM>.
06061 ;
06062 ; (5) Our starship is at a complete halt.
06063 ;
06064 ; DOCKING SUCCESSFUL
06065 ;
06066 ; If the conditions for a successful docking are met, the subsequent docking and
06067 ; transfer operation can be divided in the following states, starting with state
06068 ; NOT DOCKED:
06069 ;
06070 ; (1) NOT DOCKED
06071 ;
06072 ; The docking state is set to ORBIT ESTABLISHED and the title line is
06073 ; updated with "ORBIT ESTABLISHED".
06074 ;
06075 ; (2) ORBIT ESTABLISHED
06076 ;
06077 ; After waiting until the title line "ORBIT ESTABLISHED" has disappeared,
06078 ; the transfer vessel is initialized and launched: The PLAYER4 shape type
06079 ; is set to TRANSFER VESSEL. Its position vector is set to a position above
06080 ; and in front of our starship, but behind the starbase:
06081 ;
06082 ; x-coordinate := +0..+255 (+$00**) <KM>
06083 ; y-coordinate := +256..+511 (+$01**) <KM>
06084 ; z-coordinate := +4096..+4351 (+$10**) <KM>
06085 ;
06086 ; Its velocity vector is set to
06087 ;
06088 ; x-velocity := +1 <KM/H>
06089 ; y-velocity := -1 <KM/H>
06090 ; z-velocity := -7 <KM/H>
06091 ;
06092 ; This will move the transfer vessel from behind the starbase into a
06093 ; direction toward and a little to the lower right of our starship. The
06094 ; lifetime of the transfer vessel (and its return journey) is set to 129
06095 ; game loop iterations. Finally, the docking state is set to RETURN
06096 ; TRANSFER VESSEL.
06097 ;
06098 ; (3) RETURN TRANSFER VESSEL
06099 ;
06100 ; After checking if the transfer vessel has passed behind our starship, the
06101 ; beeper sound pattern ACKNOWLEDGE is played in subroutine BEEP ($B3A6),
06102 ; the title line is updated with "TRANSFER COMPLETE", our starship's
06103 ; subsystems are repaired, and our starship's ENERGY readout is restored to
06104 ; 9999 energy units. by inverting the z-velocity the velocity vector of the
06105 ; transfer vessel is changed to
06106 ;
06107 ; x-velocity := +1 <KM/H>
06108 ; y-velocity := -1 <KM/H>
06109 ; z-velocity := +7 <KM/H>
06110 ;
06111 ; thus launching the transfer vessel on its return journey to the starbase.
06112 ; The docking state is set to TRANSFER COMPLETE. Finally, the screen is
06113 ; updated in subroutine UPDSCREEN ($B07B).
06114 ;
06115 ; (4) TRANSFER COMPLETE
06116 ;
06117 ; This docking state marks the end of a successful docking and transfer
06118 ; operation.
06119 ;
06120 ; DOCKING ABORTED
06121 ;
06122 ; If the docking conditions above are not met and the docking state is already
06123 ; ORBIT ESTABLISHED or RETURN TRANSFER VESSEL then the message "DOCKING ABORTED"
06124 ; is displayed and the docking state is set to NOT DOCKED.
06125
ACE6 A57B 06126 DOCKING LDA ISSTARBASESECT ; Return if not in starbase sector
ACE8 F0FB 06127 BEQ SKIP111 ;
06128
ACEA A5D0 06129 LDA SHIPVIEW ; Skip if not in Front view
ACEC D005 06130 BNE SKIP112 ;
ACEE A914 06131 LDA #$14 ; GTIA: enable PLAYER4, prio: PFs > PLs > BGR (!)
ACF0 8D1BD0 06132 STA PRIOR ; (Cross hairs appear behind PLAYERs)
06133
ACF3 A902 06134 SKIP112 LDA #2 ; Track starbase (PLAYER2)
ACF5 8D5C09 06135 STA TRACKDIGIT ;
06136
06137 ;** Initialize starbase shape **************************************************
ACF8 A930 06138 LDA #SHAP.STARBASEC ; PLAYER2 is STARBASE CENTER (shape type 3)
ACFA 8D8E0C 06139 STA PL2SHAPTYPE ;
ACFD A920 06140 LDA #SHAP.STARBASEL ; PLAYER1 is STARBASE LEFT (shape type 2)
ACFF 8D8D0C 06141 STA PL1SHAPTYPE ;
AD02 A940 06142 LDA #SHAP.STARBASER ; PLAYER0 is STARBASE RIGHT (shape type 4)
AD04 8D8C0C 06143 STA PL0SHAPTYPE ;
06144
AD07 A9FF 06145 LDA #255 ; Prep starbase lifetime := 255 game loops (infinite)
06146
AD09 A690 06147 LDX CURRSECTOR ; Skip if starbase in current sector
AD0B BCC908 06148 LDY GCMEMMAP,X ;
AD0E 3002 06149 BMI SKIP113 ;
06150
AD10 A900 06151 LDA #0 ; Prep starbase lifetime := 0 game loops (fast death)
06152
AD12 85E9 06153 SKIP113 STA PL0LIFE ; PLAYER0 lifetime := either 0 or 255 game loops
AD14 85EA 06154 STA PL1LIFE ; PLAYER1 lifetime := either 0 or 255 game loops
AD16 85EB 06155 STA PL2LIFE ; PLAYER2 lifetime := either 0 or 255 game loops
AD18 857B 06156 STA ISSTARBASESECT ; Store starbase-in-sector flag
AD1A 300A 06157 BMI SKIP114 ; Skip if starbase in current sector
06158
AD1C A002 06159 LDY #2 ; Init explosion at PLAYER2 (STARBASE CENTER)
AD1E 206BAC 06160 JSR INITEXPL ;
06161
AD21 A20A 06162 LDX #$0A ; Play noise sound pattern SHIELD EXPLOSION and return
AD23 4CA8AE 06163 JMP NOISE ;
06164
06165 ;*** Keep minimum distance to starbase *****************************************
AD26 AD420A 06166 SKIP114 LDA PL2ZPOSHI ; Skip if starbase z-coordinate > +255 (+$00**) <KM>
AD29 D00A 06167 BNE SKIP115 ;
06168
AD2B ADD50A 06169 LDA PL2ZPOSLO ; Approach starbase not closer than +32 (+$0020) <KM>
AD2E C920 06170 CMP #32 ;
AD30 B003 06171 BCS SKIP115 ;
AD32 EED50A 06172 INC PL2ZPOSLO ; ...else push starbase back
06173
06174 ;*** Check if in docking range *************************************************
AD35 AD2C0C 06175 SKIP115 LDA PL2COLUMN ; Abort docking if PLAYER column number of...
AD38 38 06176 SEC ; ...PLAYER2 (STARBASE CENTER) not in 120..135.
AD39 E978 06177 SBC #120 ; (!)
AD3B C910 06178 CMP #16 ;
AD3D B022 06179 BCS SKIP116 ;
06180
AD3F ADFB0B 06181 LDA PL2ROWNEW ; Abort docking if PLAYER row number of...
AD42 38 06182 SEC ; ...PLAYER2 (STARBASE CENTER) not in 104..119.
AD43 E968 06183 SBC #104 ; (!)
AD45 C910 06184 CMP #16 ;
AD47 B018 06185 BCS SKIP116 ;
06186
AD49 AD420A 06187 LDA PL2ZPOSHI ; Abort docking if...
AD4C C902 06188 CMP #2 ; ... z-coordinate of starbase >= +512 (+$02**) <KM>
AD4E B011 06189 BCS SKIP116 ;
06190
AD50 ADAF09 06191 LDA PL2ZPOSSIGN ; Abort docking...
AD53 2D110A 06192 AND PL2YPOSSIGN ; ...if starbase not in front and upper screen half
AD56 4901 06193 EOR #$01 ;
AD58 0570 06194 ORA VELOCITYLO ; ...if our starship's velocity not zero
AD5A 0DA40A 06195 ORA PL2YPOSHI ; ...if starbase not roughly vertically centered
AD5D 0571 06196 ORA NEWVELOCITY ; ...if our starship's new velocity not zero
AD5F F010 06197 BEQ SKIP119 ; Else skip and handle docking
06198
06199 ;*** Docking aborted ***********************************************************
AD61 A575 06200 SKIP116 LDA DOCKSTATE ; Skip if DOCKSTATE is NOT DOCKED, TRANSFER COMPLETE
AD63 C902 06201 CMP #2 ;
AD65 9005 06202 BCC SKIP117 ;
06203
AD67 A01F 06204 LDY #$1F ; Set title phrase "DOCKING ABORTED"
AD69 2023B2 06205 JSR SETTITLE ;
06206
AD6C A900 06207 SKIP117 LDA #0 ; DOCKSTATE := NOT DOCKED
AD6E 8575 06208 STA DOCKSTATE ;
AD70 60 06209 SKIP118 RTS ; Return
06210
06211 ;*** Docking successful, check docking state ***********************************
AD71 2475 06212 SKIP119 BIT DOCKSTATE ; Check DOCKSTATE
AD73 700D 06213 BVS SKIP120 ; If DOCKSTATE = ORBIT ESTABLISHED hide title line
AD75 3042 06214 BMI SKIP122 ; If DOCKSTATE = RETURN TRANSFER VESSEL return it
AD77 A575 06215 LDA DOCKSTATE ;
AD79 D0F5 06216 BNE SKIP118 ; Return if DOCKSTATE not NOT DOCKED
AD7B C675 06217 DEC DOCKSTATE ; DOCKSTATE := ORBIT ESTABLISHED
06218
AD7D A01C 06219 LDY #$1C ; Set title phrase "ORBIT ESTABLISHED" and return
AD7F 4C23B2 06220 JMP SETTITLE ;
06221
06222 ;*** Orbit established *********************************************************
AD82 A200 06223 SKIP120 LDX #0 ; Enqueue new, empty title phrase
AD84 8665 06224 STX NEWTITLEPHR ;
06225
AD86 A4D1 06226 LDY TITLEPHR ; Return if "ORBIT ESTABLISHED" still displayed
AD88 D0E6 06227 BNE SKIP118 ;
06228
06229 ;*** Launch transfer vessel ****************************************************
AD8A A950 06230 LDA #SHAP.TRANSVSSL ; PLAYER4 is TRANSFER VESSEL (shape 5)
AD8C 8D900C 06231 STA PL4SHAPTYPE ;
06232
AD8F A901 06233 LDA #1 ; Place transfer vessel behind starbase:
AD91 8DB109 06234 STA PL4ZPOSSIGN ; x-coordinate := +0..+255 (+$00**) <KM>
AD94 8DE209 06235 STA PL4XPOSSIGN ; y-coordinate := +256..+511 (+$01**) <KM>
AD97 8D130A 06236 STA PL4YPOSSIGN ; z-coordinate := +4096..+4351 (+$10**) <KM>
AD9A 8DA60A 06237 STA PL4YPOSHI ;
AD9D 8D9B0B 06238 STA PL4XVEL ; Move transfer vessel toward our starship:
ADA0 A910 06239 LDA #$10 ; x-velocity := +1 <KM/H>
ADA2 8D440A 06240 STA PL4ZPOSHI ; y-velocity := -1 <KM/H>
ADA5 A900 06241 LDA #$00 ; z-velocity := -7 <KM/H>
ADA7 8D750A 06242 STA PL4XPOSHI ;
ADAA A987 06243 LDA #NEG!7 ;
ADAC 8D6A0B 06244 STA PL4ZVEL ;
ADAF A981 06245 LDA #NEG!1 ; DOCKSTATE := RETURN TRANSFER VESSEL
ADB1 8575 06246 STA DOCKSTATE ;
ADB3 8DCC0B 06247 STA PL4YVEL ;
ADB6 85ED 06248 STA PL4LIFE ; Transfer vessel lifetime := 129 game loops
ADB8 60 06249 SKIP121 RTS ; Return
06250
06251 ;*** Return transfer vessel ****************************************************
ADB9 ADB109 06252 SKIP122 LDA PL4ZPOSSIGN ; Return if transfer vessel in front of our starship
ADBC D0FA 06253 BNE SKIP121 ;
06254
ADBE A20C 06255 LDX #$0C ; Play beeper sound pattern ACKNOWLEGDE
ADC0 20A6B3 06256 JSR BEEP ;
06257
ADC3 A021 06258 LDY #$21 ; Set title phrase "TRANSFER COMPLETE"
ADC5 2023B2 06259 JSR SETTITLE ;
06260
ADC8 A205 06261 LDX #5 ; Repair all 6 subsystems
ADCA BD8BBB 06262 LOOP041 LDA PANELTXTTAB+73,X ;
ADCD 9D9209 06263 STA GCSTATPHO,X ;
ADD0 CA 06264 DEX ;
ADD1 10F7 06265 BPL LOOP041 ;
06266
ADD3 A989 06267 LDA #CCS.COL2!CCS.9 ; Set starship's ENERGY readout to "9999" in COLOR2
ADD5 A203 06268 LDX #3 ;
ADD7 9D5509 06269 LOOP042 STA ENERGYD1,X ;
ADDA CA 06270 DEX ;
ADDB 10FA 06271 BPL LOOP042 ;
06272
ADDD A907 06273 LDA #7 ; Move transfer vessel back toward starbase:
ADDF 8D6A0B 06274 STA PL4ZVEL ; x-velocity := -1 <KM/H>
ADE2 A981 06275 LDA #NEG!1 ; y-velocity := +1 <KM/H>
ADE4 8D9B0B 06276 STA PL4XVEL ; z-velocity := +7 <KM/H>
ADE7 A901 06277 LDA #1 ;
ADE9 8DCC0B 06278 STA PL4YVEL ;
06279
ADEC 8575 06280 STA DOCKSTATE ; DOCKSTATE := TRANSFER COMPLETE
ADEE 4C7BB0 06281 JMP UPDSCREEN ; Update screen and return
06282
06283 ;*******************************************************************************
06284 ;* *
06285 ;* MODDLST *
06286 ;* *
06287 ;* Modify Display List *
06288 ;* *
06289 ;*******************************************************************************
06290
06291 ; DESCRIPTION
06292 ;
06293 ; Modifies the Display List to show and hide title, headers, and the Control
06294 ; Panel Display.
06295 ;
06296 ; INPUT
06297 ;
06298 ; A = Number of bytes to copy into the Display List
06299 ; X = Offset into Display List DSPLST ($0280)
06300 ; Y = Offset into Display List fragment table DLSTFRAG ($BA62). If Y = $80
06301 ; then no bytes are copied but the specified locations of the Display List
06302 ; are overwritten with Display List instruction $0D (one row of
06303 ; GRAPHICS7).
06304 ;
06305 ; Used values are:
06306 ;
06307 ; A X Y
06308 ; $08 $5F $00 -> Show Control Panel Display (bottom text window)
06309 ; $08 $5F $80 -> Hide Control Panel Display (bottom text window)
06310 ; $07 $0F $23 -> Show title line
06311 ; $07 $0F $80 -> Hide title line
06312 ; $08 $02 $1B -> Show Display List header line of Front view
06313 ; $08 $02 $13 -> Show Display List header line of Aft view
06314 ; $08 $02 $0B -> Show Display List header line of Long-Range Scan view
06315 ; $08 $02 $08 -> Show Display List header line of Galactic Chart view
06316
=006A 06317 L.NUMBYTES = $6A ; Number of bytes to copy
06318
ADF1 78 06319 MODDLST SEI ; Disable IRQ
ADF2 856A 06320 STA L.NUMBYTES ; Save number of bytes to copy
06321
ADF4 AD0BD4 06322 LOOP043 LDA VCOUNT ; Wait for ANTIC line counter >= 124 (PLAYFIELD...
ADF7 C97C 06323 CMP #124 ; ...bottom) before changing the Display List
ADF9 90F9 06324 BCC LOOP043 ;
06325
ADFB B962BA 06326 LOOP044 LDA DLSTFRAG,Y ; Load byte from Display List fragment table
ADFE C8 06327 INY ;
ADFF 1002 06328 BPL SKIP123 ; Skip if fragment table index < $80
AE01 A90D 06329 LDA #$0D ; Prep Display List instruction $0D (GRAPHICS7)
AE03 9D8002 06330 SKIP123 STA DSPLST,X ; Store byte in Display List
AE06 E8 06331 INX ;
AE07 C66A 06332 DEC L.NUMBYTES ;
AE09 D0F0 06333 BNE LOOP044 ; Copy next byte
06334
AE0B 58 06335 CLI ; Enable IRQ
AE0C 60 06336 RTS ; Return
06337
06338 ;*******************************************************************************
06339 ;* *
06340 ;* CLRPLAYFIELD *
06341 ;* *
06342 ;* Clear PLAYFIELD memory *
06343 ;* *
06344 ;*******************************************************************************
06345
06346 ; DESCRIPTION
06347 ;
06348 ; Clears PLAYFIELD memory from $1000 to $1FFF.
06349 ;
06350 ; This subroutine sets the start address of the memory to be cleared then code
06351 ; execution continues into subroutine CLRMEM ($AE0F) where the memory is
06352 ; actually cleared.
06353
AE0D A910 06354 CLRPLAYFIELD LDA #$10
06355
06356 ;*******************************************************************************
06357 ;* *
06358 ;* CLRMEM *
06359 ;* *
06360 ;* Clear memory *
06361 ;* *
06362 ;*******************************************************************************
06363
06364 ; DESCRIPTION
06365 ;
06366 ; Clears memory from a given start address to memory address $1FFF. This
06367 ; subroutine is called in the following situations:
06368 ;
06369 ; (1) In routine INITCOLD ($A14A) at the beginning of the program to initialize
06370 ; the program's variables
06371 ;
06372 ; (2) In subroutine CLRPLAYFIELD ($AE0D) to clear PLAYFIELD memory.
06373 ;
06374 ; As a side effect this subroutine also clears the saved number of space objects
06375 ; and the lock-on flag.
06376 ;
06377 ; INPUT
06378 ;
06379 ; A = Start address (high byte) of memory to be cleared. Used values are:
06380 ; $02 -> Clear memory $0200..$1FFF during program initialization
06381 ; $10 -> Clear PLAYFIELD memory $1000..$1FFF
06382
AE0F 8569 06383 CLRMEM STA MEMPTR+1 ; Store start address (high byte) to be cleared
AE11 A900 06384 LDA #0 ; Store start address (low byte) to be cleared
AE13 A8 06385 TAY ;
AE14 8568 06386 STA MEMPTR ;
06387
AE16 85A3 06388 STA ISINLOCKON ; Clear lock-on flag
AE18 857A 06389 STA OLDMAXSPCOBJIND ; Clear saved number of space objects
06390
AE1A 9168 06391 LOOP045 STA (MEMPTR),Y ; Clear memory location
AE1C C8 06392 INY ;
AE1D D0FB 06393 BNE LOOP045 ;
06394
AE1F E669 06395 INC MEMPTR+1 ; Next page (= 256-byte block)
AE21 A469 06396 LDY MEMPTR+1 ;
AE23 C020 06397 CPY #$20 ;
AE25 A8 06398 TAY ;
AE26 90F2 06399 BCC LOOP045 ; Loop until memory address $2000 reached
AE28 60 06400 RTS ; Return
06401
06402 ;*******************************************************************************
06403 ;* *
06404 ;* TRIGGER *
06405 ;* *
06406 ;* Handle joystick trigger *
06407 ;* *
06408 ;*******************************************************************************
06409
06410 ; DESCRIPTION
06411 ;
06412 ; This subroutine handles the joystick trigger and launches one of our
06413 ; starship's photon torpedo. If a target is in full lock-on then a second photon
06414 ; torpedo is prepared for automatic launch in the next game loop iteration.
06415 ;
06416 ; DETAILS
06417 ;
06418 ; If the trigger is pressed then reset the idle counter and, if not in
06419 ; hyperwarp, launch a photon torpedo with the following steps:
06420 ;
06421 ; (1) If the trigger was pressed in this game loop iteration, a photon torpedo
06422 ; will be launched if a previously launched photon torpedo is already under
06423 ; way for at least 255 - 232 = 23 game loop iterations. This avoids firing
06424 ; photon torpedoes too rapidly.
06425 ;
06426 ; (2) Start tracking a space object. If it is in full lock-on, set up the
06427 ; lock-on timer, activate photon torpedo tracking, and tweak the last saved
06428 ; trigger state such that our other photon torpedo (if available) is
06429 ; launched automatically in the next game loop iteration.
06430 ;
06431 ; (3) If the Photon Torpedoes are destroyed, do nothing.
06432 ;
06433 ; (4) If the Photon Torpedoes are damaged, launch a photon torpedo from the
06434 ; same barrel than the previous one.
06435 ;
06436 ; (5) If the Photon Torpedoes are not damaged, launch a photon torpedo from the
06437 ; other barrel.
06438 ;
06439 ; (6) Set the lifetime of our starship's photon torpedo to infinite, set the
06440 ; PLAYER shape to PHOTON TORPEDO.
06441 ;
06442 ; (7) Initialize the position vector of our starship's photon torpedo to:
06443 ;
06444 ; x-coordinate := +256 (+$0100) <KM> (Right barrel)
06445 ; -256 (-$FF00) <KM> (Left barrel)
06446 ; y-coordinate := -256 (-$FF00) <KM>
06447 ; z-coordinate := +1 (+$0001) <KM>
06448 ;
06449 ; (8) Initialize the velocity vector of our starship's photon torpedo to:
06450 ;
06451 ; x-velocity := +0 <KM/H>
06452 ; y-velocity := +0 <KM/H>
06453 ; z-velocity := +102 <KM/H> (All views but Aft view)
06454 ; -102 <KM/H> (Aft view)
06455 ;
06456 ; (9) Subtract 10 energy units for launching our starship's photon torpedo.
06457 ;
06458 ; (10) Play the noise sound pattern PHOTON TORPEDO LAUNCHED by continuing code
06459 ; execution into subroutine NOISE ($AEA8).
06460
AE29 A584 06461 TRIGGER LDA OLDTRIG0 ; Prep last trigger state
06462
AE2B AC10D0 06463 LDY TRIG0 ; Copy current trigger state
AE2E 8484 06464 STY OLDTRIG0 ;
AE30 D00E 06465 BNE SKIP124 ; Return if trigger currently not pressed
06466
AE32 8466 06467 STY IDLECNTHI ; Reset idle counter
06468
AE34 A6C0 06469 LDX WARPSTATE ; Return if hyperwarp engaged
AE36 D008 06470 BNE SKIP124 ;
06471
AE38 A687 06472 LDX BARRELNR ; Prep barrel number (0 -> left, 1 -> right)
06473
AE3A C901 06474 CMP #1 ; If trigger is newly pressed -> handle tracking...
AE3C F003 06475 BEQ SKIP125 ; ...and launch our starship's photon torpedo...
AE3E B018 06476 BCS SKIP127 ; ...else launch our starship's photon torpedo only
AE40 60 06477 SKIP124 RTS ; Return
06478
06479 ;*** Set up our starship's photon torpedo tracking *****************************
AE41 B5EC 06480 SKIP125 LDA PL3LIFE,X ; Return if torpedo's lifetime >= 232 game loops
AE43 C9E8 06481 CMP #232 ;
AE45 B0F9 06482 BCS SKIP124 ;
06483
AE47 AC5C09 06484 LDY TRACKDIGIT ; Store index of tracked space object
AE4A 8489 06485 STY PLTRACKED ;
06486
AE4C A90C 06487 LDA #12 ; Prep lock-on lifetime := 12 game loops
AE4E A4A3 06488 LDY ISINLOCKON ; If target is in full lock-on...
AE50 8486 06489 STY ISTRACKING ; ...activate photon torpedo tracking
06490
AE52 F002 06491 BEQ SKIP126 ; Skip if target not in full lock-on
AE54 A900 06492 LDA #0 ; Prep lock-on lifetime := 0 game loops
AE56 8588 06493 SKIP126 STA LOCKONLIFE ; Store lock-on lifetime (either 0 or 12 game loops)
06494
06495 ;*** Launch our starship's photon torpedo **************************************
AE58 8484 06496 SKIP127 STY OLDTRIG0 ; Update last trigger state
AE5A 2C9209 06497 BIT GCSTATPHO ; Return if Photon Torpedoes are destroyed
AE5D 70E1 06498 BVS SKIP124 ;
06499
AE5F 3005 06500 BMI SKIP128 ; If Photon Torpedoes damaged launch from same barrel
AE61 8A 06501 TXA ; ...else switch barrel from which to launch torpedo
AE62 4901 06502 EOR #$01 ;
AE64 8587 06503 STA BARRELNR ;
06504
AE66 8A 06505 SKIP128 TXA ; SUMMARY: Our starship's photon torpedo's...
AE67 9DE109 06506 STA PL3XPOSSIGN,X ; x-coordinate := +256 (+$0100) <KM> (right barrel)
AE6A BD73BF 06507 LDA BARRELXTAB,X ; x-coordinate := -256 (-$FF00) <KM> (left barrel)
AE6D 9D740A 06508 STA PL3XPOSHI,X ; y-coordinate := -256 (-$FF00) <KM>
AE70 A9FF 06509 LDA #255 ; z-coordinate := +1 (+$0001) <KM>
AE72 95EC 06510 STA PL3LIFE,X ; ...lifetime := 255 game loops
AE74 9DA50A 06511 STA PL3YPOSHI,X ;
AE77 A900 06512 LDA #0 ;
AE79 9D8F0C 06513 STA PL3SHAPTYPE,X ; PLAYER3 or PLAYER4 is PHOTON TORPEDO (shape type 0)
AE7C 9D430A 06514 STA PL3ZPOSHI,X ;
AE7F 9D070B 06515 STA PL3XPOSLO,X ;
AE82 9D120A 06516 STA PL3YPOSSIGN,X ;
AE85 9D380B 06517 STA PL3YPOSLO,X ;
AE88 A901 06518 LDA #1 ;
AE8A 9DB009 06519 STA PL3ZPOSSIGN,X ;
AE8D 9DD60A 06520 STA PL3ZPOSLO,X ;
06521
AE90 A5D0 06522 LDA SHIPVIEW ; SUMMARY: Our starship's photon torpedo's...
AE92 4A 06523 LSR A ; x-velocity := +0 <KM/H>
AE93 6A 06524 ROR A ; y-velocity := +0 <KM/H>
AE94 0966 06525 ORA #102 ; z-velocity := +102 <KM/H> (Other views)
AE96 9D690B 06526 STA PL3ZVEL,X ; z-velocity := -102 <KM/H> (Aft view)
AE99 A900 06527 LDA #0 ;
AE9B 9D9A0B 06528 STA PL3XVEL,X ;
AE9E 9DCB0B 06529 STA PL3YVEL,X ;
06530
AEA1 A202 06531 LDX #2 ; ENERGY := ENERGY - 10 for launching photon torpedo
AEA3 206FB8 06532 JSR DECENERGY ;
06533
AEA6 A200 06534 LDX #$00 ; Play noise sound pattern PHOTON TORPEDO LAUNCHED
06535
06536 ;*******************************************************************************
06537 ;* *
06538 ;* NOISE *
06539 ;* *
06540 ;* Copy noise sound pattern *
06541 ;* *
06542 ;*******************************************************************************
06543
06544 ; DESCRIPTION
06545 ;
06546 ; Copies a 10-byte noise sound pattern from table NOISEPATTAB ($BF20). The first
06547 ; 8 bytes are copied to the noise sound pattern area NOISETORPTIM
06548 ; ($DA)..NOISELIFE ($E1), the remaining 2 bytes are copied to audio registers
06549 ; AUDCTL ($D208) and AUDF3 ($D204). The noise sound pattern is automatically
06550 ; played in subroutine SOUND ($B2AB).
06551 ;
06552 ; NOTE: the first 8 bytes of each pattern in table NOISEPATTAB ($BF20) are
06553 ; copied in reverse order from memory. See subroutine SOUND ($B2AB) for details
06554 ; on the noise sound patterns stored in NOISEPATTAB ($BF20).
06555 ;
06556 ; Playing a SHIELD EXPLOSION or ZYLON EXPLOSION noise sound pattern overrides a
06557 ; currently playing PHOTON TORPEDO LAUNCHED noise sound pattern.
06558 ;
06559 ; Playing a PHOTON TORPEDO LAUNCHED noise sound pattern overrides a currently
06560 ; playing PHOTON TORPEDO LAUNCHED noise sound pattern if the latter has < 24
06561 ; TICKs to play.
06562 ;
06563 ; INPUT
06564 ;
06565 ; X = Offset into table NOISEPATTAB ($BF20) to index noise sound patterns.
06566 ; Used values are:
06567 ; $00 -> PHOTON TORPEDO LAUNCHED
06568 ; $0A -> SHIELD EXPLOSION (either our starship or a starbase explodes)
06569 ; $14 -> ZYLON EXPLOSION
06570
AEA8 8A 06571 NOISE TXA ; Skip if SHIELD EXPLOSION or ZYLON EXPLOSION playing
AEA9 D006 06572 BNE SKIP129 ;
06573
AEAB A5E1 06574 LDA NOISELIFE ; Return if PHOTON TORPEDO LAUNCHED noise sound pat.
AEAD C918 06575 CMP #24 ; ...playing for yet more than 24 TICKs
AEAF B018 06576 BCS SKIP130 ;
06577
AEB1 A007 06578 SKIP129 LDY #7 ; Copy noise sound pattern (in reverse order)
AEB3 BD20BF 06579 LOOP046 LDA NOISEPATTAB,X ;
AEB6 99DA00 06580 STA NOISETORPTIM,Y ;
AEB9 E8 06581 INX ;
AEBA 88 06582 DEY ;
AEBB 10F6 06583 BPL LOOP046 ;
06584
AEBD BD20BF 06585 LDA NOISEPATTAB,X ; Copy AUDCTL from noise sound pattern table
AEC0 8D08D2 06586 STA AUDCTL ;
AEC3 BD21BF 06587 LDA NOISEPATTAB+1,X ; Copy AUDF3 from noise sound pattern table
AEC6 8D04D2 06588 STA AUDF3 ;
06589
AEC9 60 06590 SKIP130 RTS ; Return
06591
06592 ;*******************************************************************************
06593 ;* *
06594 ;* HOMINGVEL *
06595 ;* *
06596 ;* Calculate homing velocity of our starship's photon torpedo 0 or 1 *
06597 ;* *
06598 ;*******************************************************************************
06599
06600 ; DESCRIPTION
06601 ;
06602 ; Calculates the x (or y) velocity vector component of our starship's photon
06603 ; torpedo 0 or 1 when it is tracking (homing in on) a target space object.
06604 ;
06605 ; Our starship's photon torpedo's x (or y) velocity vector component depends on
06606 ; the PLAYER column (or row) number difference between the target PLAYER and our
06607 ; starship's photon torpedo PLAYER in Player/Missile (PM) pixels. This
06608 ; difference is used as an index to pick the new x (or y) velocity vector
06609 ; component of out starship's photon torpedo from table HOMVELTAB ($BFC9):
06610 ;
06611 ; +---------------+--------------+
06612 ; | Difference in | New Velocity |
06613 ; | PM Pixels | Component |
06614 ; +---------------+--------------+
06615 ; | >= +7 | -64 <KM/H> |
06616 ; | +6 | -56 <KM/H> |
06617 ; | +5 | -48 <KM/H> |
06618 ; | +4 | -40 <KM/H> |
06619 ; | +3 | -24 <KM/H> |
06620 ; | +2 | -16 <KM/H> |
06621 ; | +1 | -8 <KM/H> |
06622 ; | 0 | 0 <KM/H> |
06623 ; | -1 | +8 <KM/H> |
06624 ; | -2 | +16 <KM/H> |
06625 ; | -3 | +24 <KM/H> |
06626 ; | -4 | +40 <KM/H> |
06627 ; | -5 | +48 <KM/H> |
06628 ; | -6 | +56 <KM/H> |
06629 ; | <= -7 | +64 <KM/H> |
06630 ; +---------------+--------------+
06631 ;
06632 ; INPUT
06633 ;
06634 ; A = PLAYER column (or row) number difference between the target PLAYER
06635 ; and our starship's photon torpedo PLAYER in Player/Missile pixels
06636 ;
06637 ; CARRY = Sign of the PLAYER column (or row) number difference. Used values
06638 ; are:
06639 ; 0 -> Negative difference (target PLAYER column (or row) number < our
06640 ; starship's photon torpedo PLAYER column (or row) number
06641 ; 1 -> Positive difference (target PLAYER column (or row) number >= our
06642 ; starship's photon torpedo PLAYER column (or row) number
06643 ;
06644 ; OUTPUT
06645 ;
06646 ; A = New velocity vector component of our starship's photon torpedo in <KM/H>
06647
=006A 06648 L.VELSIGN = $6A ; Saves velocity sign
06649
AECA A080 06650 HOMINGVEL LDY #NEG ; Preload negative velocity sign
AECC B004 06651 BCS SKIP131 ; Skip if difference is positive
06652
AECE 49FF 06653 EOR #$FF ; Invert to get absolute value of difference
AED0 A000 06654 LDY #0 ; Preload positive velocity sign
06655
AED2 846A 06656 SKIP131 STY L.VELSIGN ; Save velocity sign
AED4 C908 06657 CMP #8 ;
AED6 9002 06658 BCC SKIP132 ;
AED8 A907 06659 LDA #7 ; Limit difference to 0..7
AEDA A8 06660 SKIP132 TAY ;
AEDB A56A 06661 LDA L.VELSIGN ; Reload velocity sign
AEDD 19C9BF 06662 ORA HOMVELTAB,Y ; Combine with homing velocity from table
AEE0 60 06663 RTS ; Return
06664
06665 ;*******************************************************************************
06666 ;* *
06667 ;* DAMAGE *
06668 ;* *
06669 ;* Damage or destroy one of our starship's subsystems *
06670 ;* *
06671 ;*******************************************************************************
06672
06673 ; DESCRIPTION
06674 ;
06675 ; Damages or destroys one of our starship's subsystems. There are 6 subsystems:
06676 ;
06677 ; (1) Photon Torpedoes
06678 ; (2) Engines
06679 ; (3) Shields
06680 ; (4) Attack Computer
06681 ; (5) Long-Range Scan
06682 ; (6) Subspace Radio
06683 ;
06684 ; Their status is stored and displayed in the Galactic Chart Panel Display by
06685 ; the colored letters PESCLR. The color of each letter represents the
06686 ; subsystem's status:
06687 ;
06688 ; +---------------+------------------+
06689 ; | Letter Color | Subsystem Status |
06690 ; +---------------+------------------+
06691 ; | {LIGHT GREEN} | OK |
06692 ; | {CORN YELLOW} | Damaged |
06693 ; | {PINK} | Destroyed |
06694 ; +---------------+------------------+
06695 ;
06696 ; This subroutine first makes sure that we are not in demo mode. Then it picks a
06697 ; random value in 0..255 and the damage probability value. The latter value
06698 ; depends on the mission level and is picked from table DAMAGEPROBTAB ($BF10):
06699 ;
06700 ; +-----------+-------------------+---------------+
06701 ; | Mission | Damage | Damage |
06702 ; | Level | Probability Value | Probability |
06703 ; +-----------+-------------------+---------------+
06704 ; | NOVICE | 0 | 0% ( 0:256) |
06705 ; | PILOT | 80 | 31% ( 80:256) |
06706 ; | WARRIOR | 180 | 70% (180:256) |
06707 ; | COMMANDER | 254 | 99% (254:256) |
06708 ; +-----------+-------------------+---------------+
06709 ;
06710 ; If the random number is lower than the damage probability value, a randomly
06711 ; picked subsystem is about to get damaged (or destroyed). There is a built-in
06712 ; upfront probability of 25% (2:8) that no subsystem gets harmed.
06713 ;
06714 ; If the picked subsystem is already destroyed then another subsystem is picked.
06715 ;
06716 ; Then the title phrase offset is picked from table DAMAGEPHRTAB ($BF14) to
06717 ; display the damaged subsystem in the title line. Next, color bits are picked
06718 ; that indicate a damaged system.
06719 ;
06720 ; If the Zylon photon torpedo's lifetime >= 30 game loop iterations the
06721 ; subsystem will not only be damaged but destroyed.
06722 ;
06723 ; NOTE: The Zylon photon torpedo lifetime decreases from 62 to 0 game loop
06724 ; iterations. With a remaining lifetime >= 30 game loop iterations it is
06725 ; considered strong enough to destroy one of our starship's subsystems. There
06726 ; are two exceptions to this rule: If the Attack Computer was picked to be
06727 ; destroyed it will be damaged only - not destroyed - if the Long-Range Scan has
06728 ; been already destroyed, and vice versa.
06729 ;
06730 ; Then the title phrase offset from table DESTROYPHRTAB ($BF1A) is picked to
06731 ; display the destroyed subsystem in the title line. Next, color bits are picked
06732 ; that indicate a destroyed system.
06733 ;
06734 ; The color of the subsystem's status letter is adjusted in the Galactic Chart
06735 ; Panel Display. Next, the title phrase describing the subsystem's status is
06736 ; enqueued for display in the title line. If the Attack Computer has been
06737 ; destroyed it is switched off and the PLAYFIELD is cleared. The title line is
06738 ; updated with the "DAMAGE CONTROL" message. Finally, the beeper sound pattern
06739 ; DAMAGE REPORT is played in subroutine BEEP ($B3A6).
06740
AEE1 2464 06741 DAMAGE BIT ISDEMOMODE ; Return if in demo mode
AEE3 3057 06742 BMI SKIP137 ;
06743
06744 ;*** Damage some subsystem *****************************************************
AEE5 A662 06745 LDX MISSIONLEVEL ; Prep mission level
AEE7 AD0AD2 06746 LOOP047 LDA RANDOM ; Return if random number >= damage probability
AEEA DD10BF 06747 CMP DAMAGEPROBTAB,X ; ...(the latter depends on mission level)
AEED B04D 06748 BCS SKIP137 ;
06749
AEEF 2907 06750 AND #$07 ; Randomly pick 1 of 6 subsystems
AEF1 C906 06751 CMP #6 ; Return if no subsystem picked
AEF3 B047 06752 BCS SKIP137 ;
06753
AEF5 AA 06754 TAX ;
AEF6 BD9209 06755 LDA GCSTATPHO,X ; Get picked subsystem status letter
AEF9 0A 06756 ASL A ; Check bit B6 (= destroyed) of letter code
AEFA 30EB 06757 BMI LOOP047 ; Try again if subsystem already destroyed
06758
AEFC A5EB 06759 LDA PL2LIFE ; Load Zylon photon torpedo lifetime...
AEFE C91E 06760 CMP #30 ; ...and compare it to 30 game loops
06761
AF00 A980 06762 LDA #CCS.COL2 ; Preload COLOR2 text color bits (= damaged status)
AF02 BC14BF 06763 LDY DAMAGEPHRTAB,X ; Preload title phrase offset of damaged subsystem
06764
AF05 9017 06765 BCC SKIP135 ; Skip if Zylon torpedo lifetime < 30 game loops
06766
AF07 E003 06767 CPX #3 ; Skip if selected subsystem not Attack Computer
AF09 D005 06768 BNE SKIP133 ;
AF0B 2C9609 06769 BIT GCSTATLRS ; Skip if Long-Range Scan already destroyed
AF0E 700E 06770 BVS SKIP135 ;
AF10 E004 06771 SKIP133 CPX #4 ; Skip if selected subsystem is not Long-Range Scan
AF12 D005 06772 BNE SKIP134 ;
AF14 2C9509 06773 BIT GCSTATCOM ; Skip if Attack Computer already destroyed
AF17 7005 06774 BVS SKIP135 ;
06775
AF19 A9C0 06776 SKIP134 LDA #CCS.COL3 ; Preload COLOR3 text color bits (= destroyed status)
AF1B BC1ABF 06777 LDY DESTROYPHRTAB,X ; Preload title phrase offset of destroyed subsystem
06778
AF1E 1D9209 06779 SKIP135 ORA GCSTATPHO,X ; Combine status letter with new color
AF21 9D9209 06780 STA GCSTATPHO,X ;
AF24 8465 06781 STY NEWTITLEPHR ; Enqueue damage status title phrase
AF26 2C9509 06782 BIT GCSTATCOM ; Skip if Attack Computer OK or damaged
AF29 5007 06783 BVC SKIP136 ;
06784
AF2B A900 06785 LDA #0 ; Switch Attack Computer off
AF2D 857E 06786 STA DRAINATTCOMP ;
AF2F 200DAE 06787 JSR CLRPLAYFIELD ; Clear PLAYFIELD
06788
AF32 A052 06789 SKIP136 LDY #$52 ; Set title phrase "DAMAGE CONTROL..."
AF34 2023B2 06790 JSR SETTITLE ;
06791
AF37 A212 06792 LDX #$12 ; Play beeper sound pattern DAMAGE REPORT
AF39 20A6B3 06793 JSR BEEP ;
06794
AF3C 60 06795 SKIP137 RTS ; Return
06796
06797 ;*******************************************************************************
06798 ;* *
06799 ;* COLLISION *
06800 ;* *
06801 ;* Detect a collision of our starship's photon torpedoes *
06802 ;* *
06803 ;*******************************************************************************
06804
06805 ; DESCRIPTION
06806 ;
06807 ; Both of our starship's photon torpedoes are checked if they have collided with
06808 ; a space object represented by PLAYER0..2, such as a Zylon ship, a Zylon photon
06809 ; torpedo, a starbase, or a meteor.
06810 ;
06811 ; For quick lookup, the following table lists the PLAYERs and what space objects
06812 ; they represent:
06813 ;
06814 ; +--------+--------------------------------------------------+
06815 ; | PLAYER | Represents |
06816 ; +--------+--------------------------------------------------+
06817 ; | 0 | Zylon ship 0, Starbase Left |
06818 ; | 1 | Zylon ship 1, Starbase Right |
06819 ; | 2 | Zylon photon torpedo, Starbase Center, Meteor |
06820 ; | 3 | Our starship's photon torpedo 0 |
06821 ; | 4 | Our starship's photon torpedo 1, Transfer Vessel |
06822 ; +--------+--------------------------------------------------+
06823 ;
06824 ; NOTE: Only space objects represented by PLAYER0..2 are checked for collisions.
06825 ; The transfer vessel of the starbase, represented by PLAYER4, is not checked
06826 ; and therefore cannot be destroyed by one of our starship's photon torpedoes.
06827 ;
06828 ; This subroutine first checks if our starship's photon torpedoes are
06829 ; represented by alive PLAYERs with PHOTON TORPEDO shape.
06830 ;
06831 ; In order to detect a collision with a space object, our starship's photon
06832 ; torpedo must compare its x, y, and z coordinates with the ones of the space
06833 ; object.
06834 ;
06835 ; Instead of comparing the x and y coordinates, however, this subroutines uses a
06836 ; much more efficient method by inspecting the Player/Missile collision
06837 ; registers, as the x and y axis of the 3D coordinate system establish the plane
06838 ; in which the TV screen lies. Each of our starship's photon torpedoes has its
06839 ; own Player/Missile collision register: PL3HIT ($82) for our starship's photon
06840 ; torpedo 0 and PL4HIT ($83) for our starship's photon torpedo 1. By inspecting
06841 ; these registers the hit space object is determined:
06842 ;
06843 ; +---------------------------------------------------+-------------------------+
06844 ; | Bits B2..0 of Collision Register | Hit PLAYER |
06845 ; | (0 -> Not Hit, 1 -> Hit) | |
06846 ; +-----------------+----------------+----------------+ |
06847 ; | PLAYER2 | PLAYER1 | PLAYER0 | |
06848 ; | (Zylon torpedo) | (Zylon ship 1) | (Zylon ship 0) | |
06849 ; +-----------------+----------------+----------------+-------------------------+
06850 ; | 0 | 0 | 0 | None |
06851 ; | 0 | 0 | 1 | PLAYER0 (Zylon ship 0) |
06852 ; | 0 | 1 | 0 | PLAYER1 (Zylon ship 1) |
06853 ; | 0 | 1 | 1 | PLAYER1 (Zylon ship 1) |
06854 ; | 1 | 0 | 0 | PLAYER2 (Zylon torpedo) |
06855 ; | 1 | 0 | 1 | PLAYER2 (Zylon torpedo) |
06856 ; | 1 | 1 | 0 | PLAYER1 (Zylon ship 1) |
06857 ; | 1 | 1 | 1 | PLAYER1 (Zylon ship 1) |
06858 ; +-----------------+----------------+----------------+-------------------------+
06859 ;
06860 ; If the lifetime of the hit space object has already expired, then the hit is
06861 ; ignored.
06862 ;
06863 ; A collision along the z-axis happens if the z-coordinate of our starship's
06864 ; photon torpedo is close enough to the z-coordinate of the space object:
06865 ;
06866 ; The absolute value of the z-coordinate of the space object is converted into a
06867 ; range index in 0..7. This index picks a minimum and a maximum z-coordinate
06868 ; from tables HITMINZTAB ($BF7D) and HITMAXZTAB ($BF75). If the absolute value
06869 ; of the z-coordinate of our starship's photon torpedo is inside this interval,
06870 ; then our starship's photon torpedo has hit the space object. The following
06871 ; table lists the relevant values:
06872 ;
06873 ; +-----------------------+-------+--------------------------+--------------------------+
06874 ; | ABS(z-Coordinate) | Range | Min ABS(z-Coordinate) | Max ABS(z-Coordinate) |
06875 ; | of Space Object | Index | of Photon Torpedo to Hit | of Photon Torpedo to Hit |
06876 ; +-----------------------+-------+--------------------------+--------------------------+
06877 ; | <= 511 ($01**) <KM> | 0 | 0 ($00**) <KM> | < 3328 ($0C**) <KM> |
06878 ; | <= 1023 ($03**) <KM> | 1 | 0 ($00**) <KM> | < 3328 ($0C**) <KM> |
06879 ; | <= 1535 ($05**) <KM> | 2 | 0 ($00**) <KM> | < 3328 ($0C**) <KM> |
06880 ; | <= 2047 ($07**) <KM> | 3 | 512 ($02**) <KM> | < 3328 ($0C**) <KM> |
06881 ; | <= 2559 ($09**) <KM> | 4 | 1024 ($04**) <KM> | < 3840 ($0E**) <KM> |
06882 ; | <= 3071 ($0B**) <KM> | 5 | 1536 ($06**) <KM> | < 3840 ($0E**) <KM> |
06883 ; | <= 3583 ($0D**) <KM> | 6 | 2048 ($08**) <KM> | < 3840 ($0E**) <KM> |
06884 ; | <= 65535 ($FF**) <KM> | 7 | 3072 ($0C**) <KM> | < 8448 ($20**) <KM> |
06885 ; +-----------------------+-------+--------------------------+--------------------------+
06886 ;
06887 ; if a collision has been detected, the "age" (= initial lifetime - remaining
06888 ; lifetime) of our starship's photon torpedo is calculated. This age is used to
06889 ; delay playing the ZYLON EXPLOSION noise sound pattern but also to determine
06890 ; the strength of our starship's photon torpedo. Only photon torpedoes of an age
06891 ; < 15 game loop iterations can destroy a Zylon basestar.
06892 ;
06893 ; Some clean-up work is done before the actual explosion: The lock-on timer, our
06894 ; starship's photon torpedo lifetime, and the hit space object's PLAYER lifetime
06895 ; is set to 0.
06896 ;
06897 ; If a meteor or a Zylon photon torpedo have been hit, then the score is not
06898 ; changed, skipping right to the explosion part. Otherwise, our starship's
06899 ; photon torpedo tracking flag is cleared and the Galactic Chart Map is updated.
06900 ; If a starbase was destroyed, then 3 points are added to the score. If a Zylon
06901 ; ship was destroyed, then 6 points are added to the score and the Zylon KILL
06902 ; COUNTER readout of the Control Panel Display is incremented. Next, the
06903 ; explosion is initialized in subroutine INITEXPL ($AC6B).
06904 ;
06905 ; NOTE: This subroutine lacks proper explosion initialization if the starbase
06906 ; was hit. The actual explosion initialization is done in subroutine DOCKING
06907 ; ($ACE6) when the code finds out that the starbase sector is no more marked as
06908 ; such in the Galactic Chart.
06909 ;
06910 ; Finally, the Galactic Chart Map is searched for a remaining Zylon unit. If
06911 ; none is found then the mission is complete and code execution continues into
06912 ; subroutine GAMEOVER2 ($B121), ending the game.
06913
=006B 06914 L.PLHIT = $6B ; Saves PLAYER (and space object) index of hit PLAYER
=006C 06915 L.VIEWDIR = $6C ; Saves view direction. Used values are:
06916 ; $00 -> Front view
06917 ; $FF -> Aft view
06918
AF3D A202 06919 COLLISION LDX #2 ; Loop over our starship's two photon torpedoes
AF3F CA 06920 LOOP048 DEX ;
AF40 1001 06921 BPL SKIP138 ; Branch into loop body below
AF42 60 06922 RTS ; Return
06923
06924 ;*** Photon torpedo sanity checks **********************************************
AF43 BD8F0C 06925 SKIP138 LDA PL3SHAPTYPE,X ; Next photon torpedo if PLAYER not a PHOTON TORPEDO
AF46 D0F7 06926 BNE LOOP048 ;
06927
AF48 B5EC 06928 LDA PL3LIFE,X ; Next photon torpedo if PLAYER not alive
AF4A F0F3 06929 BEQ LOOP048 ;
06930
06931 ;*** Check if our starship's photon torpedo has hit in x-y plane ***************
AF4C B582 06932 LDA PL3HIT,X ; Check Player/Missile collision register
AF4E 2907 06933 AND #$07 ; Next torpedo if no torpedo-to-PLAYER collision
AF50 F0ED 06934 BEQ LOOP048 ;
06935
AF52 4A 06936 LSR A ; Find out which of PLAYER0..2 was hit in PLAYFIELD
AF53 C903 06937 CMP #3 ;
AF55 D001 06938 BNE SKIP139 ;
AF57 4A 06939 LSR A ;
AF58 A8 06940 SKIP139 TAY ; Save resulting index of hit PLAYER
06941
AF59 B9E900 06942 LDA PL0LIFE,Y ; Next torpedo if PLAYER0..2 (= targets) not alive
AF5C F0E1 06943 BEQ LOOP048 ;
06944
06945 ;*** Has our starship's photon torpedo hit within valid z-coordinate interval? *
AF5E A5D0 06946 LDA SHIPVIEW ; Skip if in Front view
AF60 F002 06947 BEQ SKIP140 ;
AF62 A9FF 06948 LDA #$FF ; Calculate range index...
AF64 856C 06949 SKIP140 STA L.VIEWDIR ; Saves view direction
AF66 59400A 06950 EOR ZPOSHI,Y ; Calc ABS(z-coordinate (high byte)) of hit object
AF69 C910 06951 CMP #16 ; Limit range index to 0..7
AF6B 9002 06952 BCC SKIP141 ;
AF6D A90F 06953 LDA #15 ;
AF6F 4A 06954 SKIP141 LSR A ;
AF70 846B 06955 STY L.PLHIT ; Save index of hit PLAYER
06956
AF72 A8 06957 TAY ;
AF73 A56C 06958 LDA L.VIEWDIR ; Reload view direction
AF75 5D430A 06959 EOR PL3ZPOSHI,X ; Calc ABS(z-coordinate (high byte)) of torpedo
06960
AF78 D975BF 06961 CMP HITMAXZTAB,Y ; Next torpedo if torpedo >= max hit z-coordinate
AF7B B0C2 06962 BCS LOOP048 ;
06963
AF7D D97DBF 06964 CMP HITMINZTAB,Y ; Next torpedo if torpedo < min hit z-coordinate
AF80 90BD 06965 BCC LOOP048 ;
06966
06967 ;*** Our starship's photon torpedo has hit within valid z-coordinate interval! *
AF82 A46B 06968 LDY L.PLHIT ; Reload index of hit PLAYER
AF84 38 06969 SEC ; Calc "age" of photon torpedo in game loops to...
AF85 A9FF 06970 LDA #255 ; delay playing ZYLON EXPLOSION noise sound pattern
AF87 F5EC 06971 SBC PL3LIFE,X ;
AF89 85E2 06972 STA NOISEZYLONTIM ;
06973
AF8B C90F 06974 CMP #15 ; Skip if photon torpedo "age" < 15
AF8D 9005 06975 BCC SKIP142 ;
AF8F B98C0C 06976 LDA PL0SHAPTYPE,Y ; CARRY := PLAYER is ZYLON BASESTAR (shape type 8)
AF92 C980 06977 CMP #SHAP.ZBASESTAR ; (and torpedo "age" good to destroy ZYLON BASESTAR)
06978
06979 ;*** Clean up our starship's photon torpedo and hit PLAYER *********************
AF94 A900 06980 SKIP142 LDA #0 ; Lock-on lifetime := 0 game loops
AF96 8588 06981 STA LOCKONLIFE ;
AF98 95EC 06982 STA PL3LIFE,X ; Photon torpedo's lifetime := 0 game loops
AF9A B04B 06983 BCS SKIP144 ; If CARRY set do not score, just do explosion
06984
AF9C 99E900 06985 STA PL0LIFE,Y ; Hit PLAYER lifetime := 0 game loops
06986
AF9F B98C0C 06987 LDA PL0SHAPTYPE,Y ; If hit PLAYER is...
AFA2 F043 06988 BEQ SKIP144 ; ...a PHOTON TORPEDO (shape type 0)...
AFA4 C960 06989 CMP #SHAP.METEOR ; ...or a METEOR (shape type 6)...
AFA6 F03F 06990 BEQ SKIP144 ; ...do not score, just do explosion
06991
AFA8 A900 06992 LDA #0 ; Clear photon torpedo tracking flag
AFAA 8586 06993 STA ISTRACKING ;
06994
06995 ;*** Zylon ship (or starbase) destroyed! ***************************************
AFAC A690 06996 LDX CURRSECTOR ; Decrement Zylon count on Galactic Chart
AFAE DEC908 06997 DEC GCMEMMAP,X ;
AFB1 1013 06998 BPL SKIP143 ; Skip if destroyed space object was Zylon ship
06999
07000 ;*** Starbase destroyed! *******************************************************
AFB3 A900 07001 LDA #0 ; Remove destroyed starbase from Galactic Chart
AFB5 9DC908 07002 STA GCMEMMAP,X ;
AFB8 38 07003 SEC ; SCORE := SCORE - 3 for destroying starbase
AFB9 A5CB 07004 LDA SCORE ;
AFBB E903 07005 SBC #3 ;
AFBD 85CB 07006 STA SCORE ;
AFBF A5CC 07007 LDA SCORE+1 ;
AFC1 E900 07008 SBC #0 ;
AFC3 85CC 07009 STA SCORE+1 ;
AFC5 60 07010 RTS ; Return
07011
07012 ;*** Zylon ship destroyed! *****************************************************
AFC6 18 07013 SKIP143 CLC ; SCORE := SCORE + 6 for destroying Zylon ship
AFC7 A5CB 07014 LDA SCORE ;
AFC9 6906 07015 ADC #6 ;
AFCB 85CB 07016 STA SCORE ;
AFCD A5CC 07017 LDA SCORE+1 ;
AFCF 6900 07018 ADC #0 ;
AFD1 85CC 07019 STA SCORE+1 ;
07020
AFD3 A201 07021 LDX #1 ; Increment Zylon KILL COUNTER readout...
AFD5 FE5009 07022 LOOP049 INC KILLCNTD1,X ; ...of Control Panel Display
AFD8 BD5009 07023 LDA KILLCNTD1,X ;
AFDB C94A 07024 CMP #[CCS.COL1!CCS.9]+1 ;
AFDD 9008 07025 BCC SKIP144 ;
AFDF A940 07026 LDA #[CCS.COL1!CCS.0] ;
AFE1 9D5009 07027 STA KILLCNTD1,X ;
AFE4 CA 07028 DEX ;
AFE5 10EE 07029 BPL LOOP049 ;
07030
AFE7 206BAC 07031 SKIP144 JSR INITEXPL ; Init explosion at hit PLAYER
07032
07033 ;*** Any Zylon ships left? *****************************************************
AFEA A27F 07034 LDX #127 ; Scan all sectors of Galactic Chart
AFEC BDC908 07035 LOOP050 LDA GCMEMMAP,X ;
AFEF 3002 07036 BMI SKIP145 ;
AFF1 D00A 07037 BNE SKIP146 ; Return if Zylon sector found
AFF3 CA 07038 SKIP145 DEX ;
AFF4 10F6 07039 BPL LOOP050 ;
07040
07041 ;*** Game over (Mission Complete) **********************************************
AFF6 A03F 07042 LDY #$3F ; Set title phrase "MISSION COMPLETE"
AFF8 A200 07043 LDX #0 ; Set mission bonus offset
AFFA 2021B1 07044 JSR GAMEOVER2 ; Game over
AFFD 60 07045 SKIP146 RTS ; Return
07046
07047 ;*******************************************************************************
07048 ;* *
07049 ;* KEYBOARD *
07050 ;* *
07051 ;* Handle Keyboard Input *
07052 ;* *
07053 ;*******************************************************************************
07054
07055 ; DESCRIPTION
07056 ;
07057 ; If a keyboard code has been collected during a keyboard IRQ in the Immediate
07058 ; Interrupt Request handler IRQHNDLR ($A751), the idle counter is reset and the
07059 ; PLAYER-PLAYFIELD priority arranges the PLAYERs in front of the PLAYFIELD.
07060 ; Then, the keyboard code is compared with keyboard codes of table KEYTAB
07061 ; ($BABE). If no match is found the "WHAT'S WRONG" message is displayed in the
07062 ; title line and code execution returns.
07063 ;
07064 ; If one of the speed keys '0'..'9' has been pressed, a pending hyperwarp is
07065 ; aborted in subroutine ABORTWARP ($A980) and code execution returns. Otherwise
07066 ; the Engines drain rate is adjusted as well as the new velocity of our
07067 ; starship. If the Engines are damaged, a maximum speed is possible equivalent
07068 ; to speed key '5'.
07069 ;
07070 ; If one of our starship's view keys 'F' (Front), 'A' (Aft), 'G' (Galactic
07071 ; Chart), or 'L' (Long-Range Scan) have been pressed, the Display List is
07072 ; modified accordingly in subroutine MODDLST ($ADF1) and a new star field of 12
07073 ; stars is created with the help of subroutine INITPOSVEC ($B764). Code
07074 ; execution returns via subroutine UPDSCREEN ($B07B).
07075 ;
07076 ; If one of the 'T' (Tracking Computer), 'S' (Shields) or 'C' (Attack Computer)
07077 ; keys have been pressed, the corresponding status bits are toggled and the
07078 ; title line is updated with the corresponding title phrase. The beeper sound
07079 ; pattern ACKNOWLEDGE is played in subroutine BEEP ($B3A6). The tracking letter
07080 ; of the Control Panel Display is updated and the PLAYFIELD is cleared in
07081 ; subroutine CLRPLAYFIELD ($AE0D). If the Attack Computer is on, the Front or
07082 ; Aft view cross hairs are drawn, depending on the current view of our starship,
07083 ; via subroutine DRAWLINES ($A76F).
07084 ;
07085 ; If the 'H' (Hyperwarp) key has been pressed then the hyperwarp is engaged. Our
07086 ; starship's velocity is set to the maximum value, the Engines drain rate is
07087 ; increased to the equivalent of speed key '7'. Star trails are prepared. The
07088 ; position vector of the Hyperwarp Target Marker (PLAYER3) is set to the
07089 ; following values:
07090 ;
07091 ; x-coordinate := +0 (+$0000) <KM>
07092 ; y-coordinate := +256 (+$0100) <KM>
07093 ; z-coordinate := + (+$****) <KM> (sign only)
07094 ;
07095 ; The velocity vector is set to the following values:
07096 ;
07097 ; x-velocity := (not initialized)
07098 ; y-velocity := (not initialized)
07099 ; z-velocity := +0 <KM/H>
07100 ;
07101 ; The temporary arrival hyperwarp marker column and row numbers are saved. If
07102 ; not in a NOVICE mission, the maximum veer-off velocity of the Hyperwarp Target
07103 ; Marker during hyperwarp is picked from table VEERMASKTAB ($BED7). This value
07104 ; depends on the selected hyperwarp energy (and thus on the distance to
07105 ; hyperwarp). Finally, the title line displays the "HYPERWARP ENGAGED" message.
07106 ;
07107 ; If the 'M' (Manual target selector) key has been pressed, the tracked target
07108 ; space object is swapped and the corresponding digit of the Control Panel
07109 ; Display is toggled between 0 and 1.
07110 ;
07111 ; If the 'P' (Pause) key has been pressed, an endless loop waits until the
07112 ; joystick is pushed.
07113 ;
07114 ; BUG (at $B103): The endless loop branches back one instruction too far.
07115 ; Suggested fix: Branch to instruction LDA PORTA at $B0FE.
07116 ;
07117 ; If the 'INV' (Abort mission) key has been pressed, the mission is aborted by
07118 ; setting the mission bonus offset, then displaying the "MISSION ABORTED"
07119 ; message in the title line. Code execution continues into subroutine GAMEOVER
07120 ; ($B10A).
07121 ;
07122 ; NOTE: This subroutine has two additional entry points:
07123 ;
07124 ; (1) SETVIEW ($B045), which is used to enforce the Front view. It is entered
07125 ; from the game loop GAMELOOP ($A1F3) and subroutines INITSTART ($A15E) and
07126 ; DECENERGY ($B86F).
07127 ;
07128 ; (2) UPDSCREEN ($B07B), which draws the cross hairs, the Attack Computer
07129 ; Display and sets the tracking letter of the Control Panel Display. It is
07130 ; entered from subroutine DOCKING ($ACE6).
07131
=006A 07132 L.KEYCODE = $6A ; Saves pressed keyboard code
07133
AFFE A5CA 07134 KEYBOARD LDA KEYCODE ; Return if no keyboard code collected
B000 F03E 07135 BEQ SKIP150 ;
07136
B002 A214 07137 LDX #20 ; Prep keyboard code table loop index
B004 856A 07138 STA L.KEYCODE ; Save keyboard code
07139
B006 A900 07140 LDA #0 ; Reset idle counter
B008 8566 07141 STA IDLECNTHI ;
B00A 85CA 07142 STA KEYCODE ; Clear keyboard code
07143
B00C A911 07144 LDA #$11 ; GTIA: enable PLAYER4, prio: PLs > PFs > BGR
B00E 8D1BD0 07145 STA PRIOR ; (PLAYERs appear behind cross hairs)
07146
07147 ;*** Search keyboard code in lookup table **************************************
07148
B011 BDBEBA 07149 LOOP051 LDA KEYTAB,X ; Loop over all valid keyboard codes
B014 C56A 07150 CMP L.KEYCODE ;
B016 F008 07151 BEQ SKIP147 ; Branch if matching entry found
B018 CA 07152 DEX ;
B019 10F6 07153 BPL LOOP051 ; Next keyboard code
07154
B01B A010 07155 LDY #$10 ; No match found...
B01D 4C23B2 07156 JMP SETTITLE ; ...set title phrase "WHATS WRONG?" and return
07157
07158 ;*** Handle '0'..'9' keyboard keys (speed) *************************************
B020 E00A 07159 SKIP147 CPX #10 ; Skip section if keyboard code does not match
B022 B01D 07160 BCS SKIP151 ;
07161
B024 A5C0 07162 LDA WARPSTATE ; Skip if hyperwarp disengaged...
B026 F003 07163 BEQ SKIP148 ;
B028 4C80A9 07164 JMP ABORTWARP ; ...else abort hyperwarp
07165
B02B 2C9309 07166 SKIP148 BIT GCSTATENG ; Skip if Engines are OK or destroyed
B02E 5006 07167 BVC SKIP149 ;
B030 E006 07168 CPX #6 ; Allow max velocity equivalent to speed key '5'
B032 9002 07169 BCC SKIP149 ;
B034 A205 07170 LDX #5 ;
07171
B036 BDD3BA 07172 SKIP149 LDA DRAINRATETAB,X ; Set Engines energy drain rate
B039 8580 07173 STA DRAINENGINES ;
B03B BDB4BA 07174 LDA VELOCITYTAB,X ; Set new velocity
B03E 8571 07175 STA NEWVELOCITY ;
B040 60 07176 SKIP150 RTS ; Return
07177
07178 ;*** Handle 'F', 'A', 'L', 'G' keyboard keys (our starship's views) ************
B041 E00E 07179 SKIP151 CPX #14 ; Skip section if keyboard code does not match
B043 B01B 07180 BCS SKIP152 ;
07181
07182 ;*** Entry to force Front view after program init and failed missions **********
B045 BD18BE 07183 SETVIEW LDA VIEWMODETAB-10,X ; Store our starship's view type
B048 85D0 07184 STA SHIPVIEW ;
07185
B04A BC82BA 07186 LDY DLSTFRAGOFFTAB-10,X ; Get DL fragment offset (Front, Aft, LRS, GC)
B04D A202 07187 LDX #$02 ; Switch to corresponding view
B04F A908 07188 LDA #$08 ;
B051 20F1AD 07189 JSR MODDLST ;
07190
B054 A210 07191 LDX #NUMSPCOBJ.NORM-1 ; Create new star field of 12 stars
B056 2064B7 07192 LOOP052 JSR INITPOSVEC ;
B059 CA 07193 DEX ;
B05A E005 07194 CPX #NUMSPCOBJ.PL ;
B05C B0F8 07195 BCS LOOP052 ;
07196
B05E 901B 07197 BCC UPDSCREEN ; Return via updating screen (below)
07198
07199 ;*** Handle 'T', 'S', 'C' keyboard keys (Tracking, Shields, Attack Computer) ***
B060 E011 07200 SKIP152 CPX #17 ; Skip section if keyboard code does not match
B062 B035 07201 BCS SKIP156 ;
07202
B064 BC18BE 07203 LDY MSGOFFTAB-14,X ; Prep title phrase offset "... OFF"
B067 B56E 07204 LDA ISTRACKCOMPON-14,X ; Toggle status bits (also energy consumption values)
B069 5D1BBE 07205 EOR MSGBITTAB-14,X ;
B06C 956E 07206 STA ISTRACKCOMPON-14,X ;
B06E F003 07207 BEQ SKIP153 ;
B070 BC1EBE 07208 LDY MSGONTAB-14,X ; Prep title phrase offset "... ON"
B073 2023B2 07209 SKIP153 JSR SETTITLE ; Set title phrase to "... ON" or "... OFF" version
07210
B076 A20C 07211 LDX #$0C ; Play beeper sound pattern ACKNOWLEDGE
B078 20A6B3 07212 JSR BEEP ;
07213
07214 ;*** Update PLAYFIELD (Cross hairs, Attack Computer, set tracking letter) ******
B07B A216 07215 UPDSCREEN LDX #CCS.T ; Get custom char 'T' (entry point TRANSFER COMPLETE)
B07D A47C 07216 LDY ISTRACKCOMPON ;
B07F F001 07217 BEQ SKIP154 ; Skip if Tracking Computer is on
07218
B081 E8 07219 INX ; Get custom char 'C'
07220
B082 8E5A09 07221 SKIP154 STX TRACKC1 ; Store tracking character in Control Panel Display
B085 200DAE 07222 JSR CLRPLAYFIELD ; Clear PLAYFIELD
B088 A57E 07223 LDA DRAINATTCOMP ; Return if Attack Computer off
B08A F0B4 07224 BEQ SKIP150 ;
07225
B08C A6D0 07226 LDX SHIPVIEW ; If Aft view -> Draw Aft cross hairs and return
B08E F006 07227 BEQ SKIP155 ; If Front view -> Draw Front cross hairs and ...
B090 E001 07228 CPX #$01 ; ...Attack Computer and return
B092 D0AC 07229 BNE SKIP150 ;
B094 A22A 07230 LDX #$2A ;
B096 4C6FA7 07231 SKIP155 JMP DRAWLINES ;
07232
07233 ;*** Handle 'H' keyboard key (Hyperwarp) ***************************************
B099 E011 07234 SKIP156 CPX #17 ; Skip if keyboard code does not match
B09B D050 07235 BNE SKIP158 ;
07236
07237 ;*** Engage Hyperwarp **********************************************************
B09D A5C0 07238 LDA WARPSTATE ; Return if hyperwarp engaged
B09F D05A 07239 BNE SKIP159 ;
07240
B0A1 A97F 07241 LDA #$7F ; Engage hyperwarp
B0A3 85C0 07242 STA WARPSTATE ;
B0A5 A9FF 07243 LDA #255 ; Set new velocity
B0A7 8571 07244 STA NEWVELOCITY ;
B0A9 A91E 07245 LDA #30 ; Set Engines energy drain rate (= speed key '7')
B0AB 8580 07246 STA DRAINENGINES ;
07247
B0AD A930 07248 LDA #NUMSPCOBJ.ALL-1 ; Set space obj index of first star of star trail
B0AF 85C3 07249 STA TRAILIND ;
B0B1 A900 07250 LDA #0 ; Clear star trail delay
B0B3 85C2 07251 STA TRAILDELAY ;
07252
B0B5 8D740A 07253 STA PL3XPOSHI ; Init position vector and velocity vector of...
B0B8 8D070B 07254 STA PL3XPOSLO ; ... Hyperwarp Target Marker (PLAYER3):
B0BB 8D380B 07255 STA PL3YPOSLO ; x-coordinate := +0 (+$0000) <KM>
B0BE 8D690B 07256 STA PL3ZVEL ; y-coordinate := +256 (+$0100) <KM>
B0C1 A901 07257 LDA #1 ; z-coordinate := + (+$****) <KM> (sign only)
B0C3 8DB009 07258 STA PL3ZPOSSIGN ; z-velocity := +0 <KM/H>
B0C6 8DE109 07259 STA PL3XPOSSIGN ;
B0C9 8D120A 07260 STA PL3YPOSSIGN ;
B0CC 8DA50A 07261 STA PL3YPOSHI ;
07262
B0CF A58F 07263 LDA WARPARRVCOLUMN ; Store temp arrival hyperwarp marker column number
B0D1 85C4 07264 STA WARPTEMPCOLUMN ;
B0D3 A58E 07265 LDA WARPARRVROW ; Store temp arrival hyperwarp marker row number
B0D5 85C5 07266 STA WARPTEMPROW ;
07267
B0D7 A562 07268 LDA MISSIONLEVEL ; Skip if NOVICE mission
B0D9 F00B 07269 BEQ SKIP157 ;
07270
B0DB A591 07271 LDA WARPENERGY ; Bits B0..1 of hyperwarp energy index a table...
B0DD 2A 07272 ROL A ; ...containing the maximum value of how much the...
B0DE 2A 07273 ROL A ; ...Hyperwarp Target Marker will veer off during...
B0DF 2A 07274 ROL A ; ...hyperwarp
B0E0 2903 07275 AND #$03 ;
B0E2 A8 07276 TAY ;
B0E3 B9D7BE 07277 LDA VEERMASKTAB,Y ;
07278
B0E6 85C6 07279 SKIP157 STA VEERMASK ; Store veer-off velocity limitation mask
07280
B0E8 A011 07281 LDY #$11 ; Set title phrase "HYPERWARP ENGAGED" and return
B0EA 4C23B2 07282 JMP SETTITLE ;
07283
07284 ;*** Handle 'M' keyboard key (Manual Target Selector) key **********************
B0ED E013 07285 SKIP158 CPX #19 ; Skip if keyboard code does not match
B0EF B00B 07286 BCS SKIP160 ;
07287
B0F1 AD5C09 07288 LDA TRACKDIGIT ; Toggle digit of tracked space object of...
B0F4 4901 07289 EOR #$01 ; ... Control Panel Display
B0F6 2901 07290 AND #$01 ;
B0F8 8D5C09 07291 STA TRACKDIGIT ;
B0FB 60 07292 SKIP159 RTS ; Return
07293
07294 ;*** Handle 'P' keyboard key (Pause) *******************************************
B0FC D008 07295 SKIP160 BNE SKIP161 ; Skip if keyboard code does not match
07296
B0FE AD00D3 07297 LDA PORTA ; Push joystick to resume action
B101 C9FF 07298 CMP #$FF ;
B103 F0F7 07299 BEQ SKIP160 ; (!)
B105 60 07300 RTS ; Return
07301
07302 ;*** Handle 'INV' keyboard key (Abort Mission) *********************************
B106 A076 07303 SKIP161 LDY #$76 ; Preload title phrase "MISSION ABORTED..."
B108 A204 07304 LDX #$04 ; Set mission bonus offset
07305
07306 ;*******************************************************************************
07307 ;* *
07308 ;* GAMEOVER *
07309 ;* *
07310 ;* Handle game over *
07311 ;* *
07312 ;*******************************************************************************
07313
07314 ; DESCRIPTION
07315 ;
07316 ; Handles game over, including calculating the scored rank and class.
07317 ;
07318 ; This subroutine has two entry points:
07319 ;
07320 ; (1) GAMEOVER ($B10A) is entered at the end of a failed mission (mission
07321 ; aborted, zero energy, or starship destroyed by Zylon fire). Essentially,
07322 ; our starship is shut down. Code execution continues into GAMEOVER2
07323 ; ($B121) below.
07324 ;
07325 ; (2) GAMEOVER2 ($B121) is entered at the end of a successful mission (all
07326 ; Zylon ships destroyed). It puts the program in demo mode, enqueues the
07327 ; corresponding game over message, and calculates the scored rank and
07328 ; class.
07329 ;
07330 ; The scored rank and class are based on the total score: the score
07331 ; accumulated during the game plus a mission bonus, which depends on the
07332 ; mission level and how the mission ended (mission complete, mission
07333 ; aborted, or starship destroyed by Zylon fire). The mission bonus is
07334 ; picked from table BONUSTAB ($BEDD).
07335 ;
07336 ; The scored rank index is taken from bits B8..4 of the total score and
07337 ; limited to values of 0..18. It indexes table RANKTAB ($BEE9) for the rank
07338 ; string. The rank string is displayed in subroutine SETTITLE ($B223).
07339 ;
07340 ; The scored class index is taken from bits B3..0 (for rank indices 0,
07341 ; 11..14) and computed from bits B4..1 (for rank indices 1..10 and 15..18).
07342 ; It takes values of 0..15. It indexes table CLASSTAB ($BEFC) for the class
07343 ; digit. The class digit is displayed in subroutine SETTITLE ($B223).
07344 ;
07345 ; For quick lookup, the following table lists rank and class from the total
07346 ; score. Pick the cell with the closest value <= your score then read the
07347 ; rank and class off the left and the top of the table, respectively.
07348 ;
07349 ; For example, a score of 90 results in a ranking of "Novice Class 4", a
07350 ; score of 161 results in a ranking of "Pilot Class 3".
07351 ;
07352 ; +------------------------------+---------------------------------------------------------------+
07353 ; | Minimum Total Score | Class Index |
07354 ; | | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15|
07355 ; +-------+----------------------+---------------------------------------------------------------+
07356 ; | Rank | | Class |
07357 ; | Index | Rank | 5 5 5 4 4 4 4 3 3 3 2 2 2 1 1 1|
07358 ; +-------+----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
07359 ; | 0 | Galactic Cook | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| 11| 12| 13| 14| 15|
07360 ; | 1 | Garbage Scow Captain | 16| 18| 20| 22| 24| 26| 28| 30| | | | | | | | |
07361 ; | 2 | Garbage Scow Captain | | | | | | | | | 32| 34| 36| 38| 40| 42| 44| 46|
07362 ; | 3 | Rookie | 48| 50| 52| 54| 56| 58| 60| 62| | | | | | | | |
07363 ; | 4 | Rookie | | | | | | | | | 64| 66| 68| 70| 72| 74| 76| 78|
07364 ; | 5 | Novice | 80| 82| 84| 86| 88| 90| 92| 94| | | | | | | | |
07365 ; | 6 | Novice | | | | | | | | | 96| 98|100|102|104|106|108|110|
07366 ; | 7 | Ensign |112|114|116|118|120|122|124|126| | | | | | | | |
07367 ; | 8 | Ensign | | | | | | | | |128|130|132|134|136|138|140|142|
07368 ; | 9 | Pilot |144|146|148|150|152|154|156|158| | | | | | | | |
07369 ; | 10 | Pilot | | | | | | | | |160|162|164|166|168|170|172|174|
07370 ; | 11 | Ace |176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|
07371 ; | 12 | Lieutenant |192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|
07372 ; | 13 | Warrior |208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|
07373 ; | 14 | Captain |224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|
07374 ; | 15 | Commander |240|242|244|246|248|250|252|254| | | | | | | | |
07375 ; | 16 | Commander | | | | | | | | |256|258|260|262|264|266|268|270|
07376 ; | 17 | Star Commander |272|274|276|278|280|282|284|286| | | | | | | | |
07377 ; | 18 | Star Commander | | | | | | | | |288|290|292|294|296|298|300|302|
07378 ; +-------+----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
07379 ;
07380 ; NOTE: This subroutine also clears the vertical and horizontal joystick
07381 ; directions.
07382 ;
07383 ; INPUT
07384 ;
07385 ; X = Offset to index table BONUSTAB ($BEDD) of mission bonus values. Used
07386 ; values are:
07387 ; $00 -> Mission complete
07388 ; $04 -> Mission was aborted due to zero energy
07389 ; $08 -> Our starship was destroyed by Zylon fire
07390 ;
07391 ; Y = Title phrase offset. Used values are:
07392 ; $3F -> "MISSION COMPLETE"
07393 ; $31 -> "MISSION ABORTED ZERO ENERGY"
07394 ; $23 -> "SHIP DESTROYED BY ZYLON FIRE"
07395
07396 ;*** Game over (Mission failed) ************************************************
B10A A900 07397 GAMEOVER LDA #0 ;
B10C 85EC 07398 STA PL3LIFE ; PLAYER3 lifetime := 0 game loops
B10E 85D6 07399 STA BEEPPRIORITY ; Mute beeper
B110 85D1 07400 STA TITLEPHR ; Clear title line
B112 858B 07401 STA REDALERTLIFE ; Red alert flash lifetime := 0 game loops
B114 8D07D2 07402 STA AUDC4 ; Mute audio channel 4
B117 8571 07403 STA NEWVELOCITY ; Shut down Engines
B119 8581 07404 STA SHIELDSCOLOR ; Set Shields color to {BLACK}
B11B 857D 07405 STA DRAINSHIELDS ; Switch off Shields
B11D 85C0 07406 STA WARPSTATE ; Disengage hyperwarp
B11F 85C1 07407 STA VELOCITYHI ; Turn off hyperwarp velocity
07408
07409 ;*** Game over (Mission successful) ********************************************
B121 A9FF 07410 GAMEOVER2 LDA #$FF ; Enter demo mode
B123 8564 07411 STA ISDEMOMODE ;
07412
B125 8465 07413 STY NEWTITLEPHR ; Enqueue title phrase
07414
07415 ;*** Calculate total score *****************************************************
B127 8A 07416 TXA ;
B128 0562 07417 ORA MISSIONLEVEL ;
B12A AA 07418 TAX ;
B12B BDDDBE 07419 LDA BONUSTAB,X ; Retrieve mission bonus
B12E 18 07420 CLC ; Add mission bonus and game score
B12F 65CB 07421 ADC SCORE ;
B131 AA 07422 TAX ;
B132 A900 07423 LDA #0 ;
07424
B134 85C9 07425 STA JOYSTICKY ; Clear vertical joystick delta
B136 85C8 07426 STA JOYSTICKX ; Clear horizontal joystick delta
07427
B138 65CC 07428 ADC SCORE+1 ;
B13A 3025 07429 BMI SKIP165 ; Return if total score < 0 (= total score of 0)
07430
07431 ;*** Calculate scored rank *****************************************************
B13C 4A 07432 LSR A ;
B13D 8A 07433 TXA ;
B13E 6A 07434 ROR A ;
B13F 4A 07435 LSR A ;
B140 4A 07436 LSR A ;
B141 4A 07437 LSR A ; Use bits B8..4 of total score as rank index
B142 C913 07438 CMP #19 ; Limit scored rank index to 0..18
B144 9004 07439 BCC SKIP162 ;
B146 A912 07440 LDA #18 ;
B148 A20F 07441 LDX #15 ; Prep class index of 15
B14A 85CD 07442 SKIP162 STA SCOREDRANKIND ; Store scored rank index
07443
07444 ;*** Calculate scored class ****************************************************
B14C A8 07445 TAY ;
B14D 8A 07446 TXA ;
B14E C000 07447 CPY #0 ;
B150 F00B 07448 BEQ SKIP164 ;
B152 C00B 07449 CPY #11 ;
B154 9004 07450 BCC SKIP163 ;
B156 C00F 07451 CPY #15 ;
B158 9003 07452 BCC SKIP164 ;
B15A 4A 07453 SKIP163 LSR A ;
B15B 4908 07454 EOR #$08 ;
B15D 290F 07455 SKIP164 AND #$0F ;
B15F 85CE 07456 STA SCOREDCLASSIND ; Store scored class index, is 0..15
07457
B161 60 07458 SKIP165 RTS ; Return
07459
07460 ;*******************************************************************************
07461 ;* *
07462 ;* SELECTWARP *
07463 ;* *
07464 ;* Select hyperwarp arrival location on Galactic Chart *
07465 ;* *
07466 ;*******************************************************************************
07467
07468 ; DESCRIPTION
07469 ;
07470 ; This subroutine executes the following steps:
07471 ;
07472 ; (1) Check if we are in Galactic Chart view and not in hyperwarp.
07473 ;
07474 ; (2) Update the Galactic Chart in subroutine DRAWGC ($B4B9) if the Subspace
07475 ; Radio is not damaged.
07476 ;
07477 ; (3) Move the arrival hyperwarp marker (PLAYER4) across the Galactic Chart
07478 ; every other game loop iteration. The current location of our starship is
07479 ; indicated by the departure hyperwarp marker (PLAYER3).
07480 ;
07481 ; Code execution continues into subroutine CALCWARP ($B1A7) to calculate the
07482 ; required hyperwarp energy.
07483 ;
07484 ; NOTE: To calculate the horizontal position of PLAYER3..4 an offset of 61 is
07485 ; added (from left to right: 48 Player/Missile (PM) pixels to the left edge of
07486 ; the screen + 16 PM pixels to the left border of the Galactic Chart - 3 PM
07487 ; pixels relative offset of the PLAYER shape's horizontal center to its left
07488 ; edge = 61 PM pixels).
07489 ;
07490 ; NOTE: To calculate the vertical position of PLAYER3..4 an offset of 63 is
07491 ; added (from top to bottom: 8 Player/Missile (PM) pixels to the start of the
07492 ; Display List + 56 PM pixels to the first row of sectors - 1 PM pixel relative
07493 ; offset of the PLAYER shape's vertical center to its top edge (?) = 63 PM
07494 ; pixels).
07495
B162 A5C0 07496 SELECTWARP LDA WARPSTATE ; Return if hyperwarp engaged
B164 D004 07497 BNE SKIP166 ;
07498
B166 A5D0 07499 LDA SHIPVIEW ; Return if not in Galactic Chart view
B168 3001 07500 BMI SKIP167 ;
B16A 60 07501 SKIP166 RTS ; Return
07502
B16B 2C9709 07503 SKIP167 BIT GCSTATRAD ; Skip if Subspace Radio is damaged or destroyed
B16E 3003 07504 BMI SKIP168 ;
07505
B170 20B9B4 07506 JSR DRAWGC ; Redraw Galactic Chart
07507
B173 A572 07508 SKIP168 LDA COUNT8 ; Move hyperwarp markers only every other game loop
B175 2901 07509 AND #$01 ; (slowing down movement of hyperwarp markers)
B177 D02E 07510 BNE CALCWARP ;
07511
07512 ;*** Calc arrival hyperwarp marker column and row numbers, update PLAYER4 pos **
B179 18 07513 CLC ;
B17A A58F 07514 LDA WARPARRVCOLUMN ; Load arrival hyperwarp marker column number
B17C 65C8 07515 ADC JOYSTICKX ; Add joystick x-delta
B17E 297F 07516 AND #$7F ; Limit value to 0..127
B180 858F 07517 STA WARPARRVCOLUMN ; Save new arrival hyperwarp marker column number
B182 18 07518 CLC ;
B183 693D 07519 ADC #61 ; Add offset of 61
B185 8D2E0C 07520 STA PL4COLUMN ; Store as PLAYER4 column number
07521
B188 18 07522 CLC ;
B189 A58E 07523 LDA WARPARRVROW ; Load arrival hyperwarp marker row number
B18B 65C9 07524 ADC JOYSTICKY ; Add joystick y-delta
B18D 297F 07525 AND #$7F ; Limit value to 0..127
B18F 858E 07526 STA WARPARRVROW ; Save new arrival hyperwarp marker row number
B191 18 07527 CLC ;
B192 693F 07528 ADC #63 ; Add offset of 63
B194 8DFD0B 07529 STA PL4ROWNEW ; Store as PLAYER4 row number
07530
07531 ;*** Calc departure hyperwarp marker column and row numbers, update PLAYER3 pos
B197 A58C 07532 LDA WARPDEPRROW ; Load departure hyperwarp marker row number
B199 18 07533 CLC ;
B19A 693F 07534 ADC #63 ; Add offset of 63
B19C 8DFC0B 07535 STA PL3ROWNEW ; Store as PLAYER3 row number
07536
B19F A58D 07537 LDA WARPDEPRCOLUMN ; Load departure hyperwarp marker column number
B1A1 18 07538 CLC ;
B1A2 693D 07539 ADC #61 ; Add offset of 61
B1A4 8D2D0C 07540 STA PL3COLUMN ; Store as PLAYER3 column number
07541
07542 ;*******************************************************************************
07543 ;* *
07544 ;* CALCWARP *
07545 ;* *
07546 ;* Calculate and display hyperwarp energy *
07547 ;* *
07548 ;*******************************************************************************
07549
07550 ; DESCRIPTION
07551 ;
07552 ; Calculates and displays the hyperwarp energy in the Galactic Chart view.
07553 ;
07554 ; This subroutine executes the following steps:
07555 ;
07556 ; (1) Determine the arrival sector from the arrival hyperwarp marker position.
07557 ;
07558 ; (2) If the Subspace Radio is not destroyed, update the target number digit of
07559 ; the Galactic Chart Panel Display.
07560 ;
07561 ; (3) Calculate the hyperwarp energy that is required to hyperwarp from the
07562 ; departure hyperwarp marker to the arrival hyperwarp marker based on the
07563 ; "block-distance":
07564 ;
07565 ; DISTANCE := DELTAC + DELTAR / 2
07566 ;
07567 ; where
07568 ;
07569 ; DELTAC := ABS(WARPARRVCOLUMN - WARPDEPRCOLUMN)
07570 ; DELTAR := ABS(WARPARRVROW - WARPDEPRROW)
07571 ;
07572 ; NOTE: Dividing DELTAR by 2 is because PLAYERs at single-line resolution
07573 ; have Player/Missile pixels that are half as high as they are wide.
07574 ;
07575 ; The hyperwarp energy, divided by 10, is the sum of a value picked from
07576 ; the hyperwarp energy table WARPENERGYTAB ($BADD) indexed by DISTANCE / 8)
07577 ; plus a remainder computed from Bits B1..0 of DISTANCE.
07578 ;
07579 ; (4) Store the hyperwarp energy value in WARPENERGY ($91).
07580 ;
07581 ; (5) Update the HYPERWARP ENERGY readout of the Galactic Chart Panel Display.
07582
=006A 07583 L.WARPARRVCOL = $6A ; Saves arrival sector column number
=006A 07584 L.DIFFC = $6A ; Saves diff column value
07585
07586 ;*** Calculate arrival sector **************************************************
B1A7 A58F 07587 CALCWARP LDA WARPARRVCOLUMN ;
B1A9 4A 07588 LSR A ;
B1AA 4A 07589 LSR A ;
B1AB 4A 07590 LSR A ;
B1AC 856A 07591 STA L.WARPARRVCOL ; A := arrival sector column 0..15
B1AE A58E 07592 LDA WARPARRVROW ;
B1B0 2970 07593 AND #$70 ; A := arrival sector row (0..7) * 16
B1B2 056A 07594 ORA L.WARPARRVCOL ;
B1B4 8592 07595 STA ARRVSECTOR ; Save arrival sector (format %0rrrcccc)
07596
07597 ;*** Update target number digit of Galactic Chart Panel Display ****************
B1B6 AA 07598 TAX ;
B1B7 BDC908 07599 LDA GCMEMMAP,X ; Get number of Zylon ships in arrival sector
B1BA 1002 07600 BPL SKIP169 ; Skip if no starbase in arrival sector
B1BC A900 07601 LDA #0 ; Clear number of Zylon ships
B1BE 0990 07602 SKIP169 ORA #CCS.COL2!ROM.0 ; Merge COLOR2 bits with number of Zylon ships
B1C0 2C9709 07603 BIT GCSTATRAD ; Skip if Subspace Radio destroyed
B1C3 7003 07604 BVS SKIP170 ;
07605
B1C5 8D8D09 07606 STA GCTRGCNT ; Set target number digit of Galactic Chart Panel
07607
07608 ;*** Calculate energy to hyperwarp between hyperwarp markers *******************
B1C8 38 07609 SKIP170 SEC ; A := DIFFC := ABS(WARPARRVCOLUMN - WARPDEPRCOLUMN)
B1C9 A58F 07610 LDA WARPARRVCOLUMN ; (Column value difference)
B1CB E58D 07611 SBC WARPDEPRCOLUMN ;
B1CD B004 07612 BCS SKIP171 ;
B1CF 49FF 07613 EOR #$FF ;
B1D1 6901 07614 ADC #1 ;
B1D3 856A 07615 SKIP171 STA L.DIFFC ;
07616
B1D5 38 07617 SEC ; A := DIFFR := ABS(WARPARRVROW - WARPDEPRROW)
B1D6 A58E 07618 LDA WARPARRVROW ; (Row value difference)
B1D8 E58C 07619 SBC WARPDEPRROW ;
B1DA B004 07620 BCS SKIP172 ;
B1DC 49FF 07621 EOR #$FF ;
B1DE 6901 07622 ADC #1 ;
07623
B1E0 4A 07624 SKIP172 LSR A ; A := DISTANCE := DIFFR / 2 + DIFFC
B1E1 18 07625 CLC ;
B1E2 656A 07626 ADC L.DIFFC ;
07627
B1E4 A8 07628 TAY ; Save DISTANCE
B1E5 4A 07629 LSR A ; Calc index into hyperwarp energy table
B1E6 4A 07630 LSR A ;
B1E7 4A 07631 LSR A ;
B1E8 AA 07632 TAX ;
07633
B1E9 98 07634 TYA ; Load DISTANCE value
B1EA 2903 07635 AND #$03 ; Get DISTANCE bits B1..0
B1EC 18 07636 CLC ;
B1ED 7DDDBA 07637 ADC WARPENERGYTAB,X ; Add hyperwarp energy from table
B1F0 8591 07638 STA WARPENERGY ; Save hyperwarp energy
07639
07640 ;*** Update HYPERWARP ENERGY readout of Galactic Chart Panel Display ***********
B1F2 A8 07641 TAY ; Prep with hyperwarp energy value
07642
B1F3 A910 07643 LDA #ROM.0 ; Set HYPERWARP ENERGY readout digit1..3 to '0'
B1F5 8D7D09 07644 STA GCWARPD1 ;
B1F8 8D7E09 07645 STA GCWARPD1+1 ;
B1FB 8D7F09 07646 STA GCWARPD1+2 ;
07647
B1FE A202 07648 LOOP053 LDX #2 ; Loop over HYPERWARP ENERGY readout digit3..1
B200 FE7D09 07649 LOOP054 INC GCWARPD1,X ; Increment digit value
B203 BD7D09 07650 LDA GCWARPD1,X ;
B206 C91A 07651 CMP #ROM.9+1 ;
B208 9008 07652 BCC SKIP173 ; Skip if energy digit <= '9'
07653
B20A A910 07654 LDA #ROM.0 ; Replace energy digit with '0'
B20C 9D7D09 07655 STA GCWARPD1,X ;
B20F CA 07656 DEX ;
B210 10EE 07657 BPL LOOP054 ; Next energy digit
07658
B212 88 07659 SKIP173 DEY ; Decrement HYPERWARP ENERGY readout value
B213 D0E9 07660 BNE LOOP053 ;
B215 60 07661 RTS ; Return
07662
07663 ;*******************************************************************************
07664 ;* *
07665 ;* UPDTITLE *
07666 ;* *
07667 ;* Update title line *
07668 ;* *
07669 ;*******************************************************************************
07670
07671 ; DESCRIPTION
07672 ;
07673 ; Updates the title phrase displayed in the title line.
07674 ;
07675 ; If no title phrase has been set then fetch the offset of the next ("enqueued")
07676 ; title phrase to be displayed. If one has been set then code execution
07677 ; continues into subroutine SETTITLE ($B223), otherwise code execution returns.
07678 ;
07679 ; If a title phrase has been set then decrement the lifetime of the currently
07680 ; displayed title phrase segment. If its lifetime has reached a value of 0 then
07681 ; branch to subroutine SETTITLE ($B223) to display the next segment.
07682
B216 A5D1 07683 UPDTITLE LDA TITLEPHR ; Skip if no title phrase set
B218 F005 07684 BEQ SKIP175 ;
07685
B21A C6CF 07686 DEC TITLELIFE ; Decrement title phrase segment lifetime
B21C F010 07687 BEQ SKIP176 ; If lifetime expired show next title segment
07688
B21E 60 07689 SKIP174 RTS ; Return
07690
B21F A465 07691 SKIP175 LDY NEWTITLEPHR ; Prep enqueued new title phrase
B221 F0FB 07692 BEQ SKIP174 ; Return if not set
07693
07694 ;*******************************************************************************
07695 ;* *
07696 ;* SETTITLE *
07697 ;* *
07698 ;* Set title phrase in title line *
07699 ;* *
07700 ;*******************************************************************************
07701
07702 ; DESCRIPTION
07703 ;
07704 ; Displays a title phrase in the title line.
07705 ;
07706 ; INTRODUCTION
07707 ;
07708 ; Title phrases are picked from the title phrase table PHRASETAB ($BBAA). They
07709 ; consist of one or more phrase tokens. Each token is a byte representing a word
07710 ; in word table WORDTAB ($BC2B). Two special tokens are placeholders for the
07711 ; scored class ($FC) and scored rank ($FD) strings.
07712 ;
07713 ; A title phrase is split up into one or more title phrase segments, each
07714 ; fitting into the title line. One title phrase segment is displayed after the
07715 ; other after a delay called the "title segment lifetime".
07716 ;
07717 ; Phrase tokens, except the tokens for the scored class ($FC) and for the scored
07718 ; rank ($FD), contain the number of a word in word table WORDTAB ($BC2B) and may
07719 ; contain an end-of-segment or end-of-phrase marker bit.
07720 ;
07721 ; DETAILS
07722 ;
07723 ; The Display List is modified by subroutine MODDLST ($ADF1) to display the
07724 ; title line. Then, the title line is cleared and the words of the title phrase
07725 ; are copied into it using the passed offset into title phrase table PHRASETAB
07726 ; ($BBAA). If the offset has a value of $FF the title line is hidden in
07727 ; subroutine MODDLST ($ADF1).
07728 ;
07729 ; INPUT
07730 ;
07731 ; Y = Offset into title phrase table PHRASETAB ($BBAA). Used values are:
07732 ; $FF -> Hide title line
07733 ; else -> Offset into title phrase table PHRASETAB ($BBAA), with explicitly
07734 ; used values:
07735 ;
07736 ; $01 -> "COMPUTER ON"
07737 ; $04 -> "COMPUTER OFF"
07738 ; $07 -> "SHIELDS ON"
07739 ; $09 -> "SHIELDS OFF"
07740 ; $0B -> "COMPUTER TRACKING ON"
07741 ; $0E -> "TRACKING OFF"
07742 ; $13 -> "STARBASE SURROUNDED"
07743 ; $15 -> "STARBASE DESTROYED"
07744 ; $1F -> "DOCKING ABORTED"
07745 ; $21 -> "TRANSFER COMPLETE"
07746 ; $4A -> "NOVICE MISSION"
07747 ; $4C -> "PILOT MISSION"
07748 ; $4E -> "WARRIOR MISSION"
07749 ; $50 -> "COMMANDER MISSION"
07750 ; $52 -> "DAMAGE CONTROL..."
07751 ; $75 -> "RED ALERT"
07752
=006A 07753 L.WORD = $6A ; Saves word number of WORDTAB ($BC2A). Used values
07754 ; are $00..$3F.
=006B 07755 L.COLUMNPOS = $6B ; Saves cursor column position during copying text
07756 ; into title line
=006C 07757 L.TOKEN = $6C ; Saves title phrase token from PHRASETAB ($BBAA),
07758 ; contains bit-encoded information about one word in
07759 ; the title phrase:
07760 ; B7..6 = %00 -> Copy next word to title line
07761 ; B7..6 = %01 -> End-of-phrase reached, apply short
07762 ; delay, then hide title line. Title
07763 ; segment lifetime = 60 game loops.
07764 ; B7..6 = %10 -> End-of-segment reached. Title
07765 ; segment lifetime = 60 game loops
07766 ; B7..6 = %11 -> End-of-phrase reached, apply long
07767 ; delay, then hide title line. Title
07768 ; segment lifetime = 254 game loops.
07769 ; Used with title phrases
07770 ; "STARBASE SURROUNDED"
07771 ; "STARBASE DESTROYED"
07772 ; "HYPERSPACE"
07773 ; "RED ALERT"
07774 ; B5..0 -> Word number of WORDTAB ($BC2A)
07775
B223 84D1 07776 SETTITLE STY TITLEPHR ; Save title phrase offset
07777
B225 A023 07778 LDY #$23 ; Show title line
B227 A20F 07779 LDX #$0F ;
B229 A907 07780 LDA #$07 ;
B22B 20F1AD 07781 JSR MODDLST ;
07782
07783 ;*** Init cursor column position and clear title line **************************
B22E A213 07784 SKIP176 LDX #19 ; There are 19(+1) characters to clear
B230 A900 07785 LDA #0 ;
B232 856B 07786 STA L.COLUMNPOS ; Init cursor column position
07787
B234 9D1F0D 07788 LOOP055 STA TITLETXT,X ; Clear character in title line
B237 CA 07789 DEX ;
B238 10FA 07790 BPL LOOP055 ;
07791
07792 ;*** If title phrase offset = $FF then hide title line *************************
B23A A6D1 07793 SKIP177 LDX TITLEPHR ; Load title phrase offset
B23C E6D1 07794 INC TITLEPHR ; Prepare title phrase offset for next word
B23E D009 07795 BNE SKIP178 ; ...skip if it turned 0
07796
B240 A20F 07797 LDX #$0F ; Remove title line and return
B242 A080 07798 LDY #$80 ;
B244 A907 07799 LDA #$07 ;
B246 4CF1AD 07800 JMP MODDLST ;
07801
B249 BDAABB 07802 SKIP178 LDA PHRASETAB,X ; Get phrase token
07803
07804 ;*** Display scored class? *****************************************************
B24C C9FC 07805 CMP #$FC ; Skip if not "scored class" token
B24E D00F 07806 BNE SKIP179 ;
07807
B250 A4CE 07808 LDY SCOREDCLASSIND ; Get scored class index, is in 0..15
B252 B9FCBE 07809 LDA CLASSTAB,Y ; Load scored class number digit
B255 A66B 07810 LDX L.COLUMNPOS ; Load cursor position
B257 9D1F0D 07811 STA TITLETXT,X ; Store class in title line
B25A A93C 07812 LDA #60 ; Title segment lifetime := 60 game loops
B25C 85CF 07813 STA TITLELIFE ;
B25E 60 07814 RTS ; Return
07815
07816 ;*** Display scored rank? ******************************************************
B25F C9FD 07817 SKIP179 CMP #$FD ; Skip if not "scored rank" token
B261 D005 07818 BNE SKIP180 ;
07819
B263 A4CD 07820 LDY SCOREDRANKIND ; Get scored rank index, is in 0..18
B265 B9E9BE 07821 LDA RANKTAB,Y ; Load rank word number
07822
07823 ;*** Search word of token in word table ****************************************
B268 856C 07824 SKIP180 STA L.TOKEN ; Save phrase token
B26A 293F 07825 AND #$3F ; Strip bits B6..7 from phrase token
B26C 856A 07826 STA L.WORD ; Store word number (bits B5..0)
07827
B26E A92A 07828 LDA #<[WORDTAB-1] ; Point MEMPTR to WORDTAB-1
B270 8568 07829 STA MEMPTR ;
B272 A9BC 07830 LDA #>[WORDTAB-1] ;
B274 8569 07831 STA MEMPTR+1 ;
07832
B276 E668 07833 LOOP056 INC MEMPTR ; Increment MEMPTR
B278 D002 07834 BNE SKIP181 ;
B27A E669 07835 INC MEMPTR+1 ;
07836
B27C A000 07837 SKIP181 LDY #0 ;
B27E B168 07838 LDA (MEMPTR),Y ; Load character of word
B280 10F4 07839 BPL LOOP056 ; Loop until end-of-word marker (bit B7) found
B282 C66A 07840 DEC L.WORD ;
B284 D0F0 07841 BNE LOOP056 ; Loop until word found
07842
07843 ;*** Copy word to title line, add space ****************************************
B286 293F 07844 LOOP057 AND #$3F ; Strip color bits B6..7 from character
B288 49A0 07845 EOR #CCS.COL2!$20 ; Merge COLOR2 bits and convert to ATASCII
B28A A66B 07846 LDX L.COLUMNPOS ; Copy character to title line
B28C E66B 07847 INC L.COLUMNPOS ; Increment cursor column position
B28E 9D1F0D 07848 STA TITLETXT,X ;
B291 C8 07849 INY ;
B292 B168 07850 LDA (MEMPTR),Y ; Load next character of word
B294 10F0 07851 BPL LOOP057 ; Next character of word if no end-of-word marker
B296 E66B 07852 INC L.COLUMNPOS ; Word was copied. Add space after word.
07853
07854 ;*** Decide to copy another word, etc. *****************************************
B298 A93C 07855 LDA #60 ; SUMMARY:
B29A 246C 07856 BIT L.TOKEN ; If bits B7..6 of phrase token...
B29C 1004 07857 BPL SKIP182 ; %00 -> Copy next word to title line
B29E 5008 07858 BVC SKIP183 ; %01 -> End-of-phrase, short delay, hide title line
B2A0 A9FE 07859 LDA #254 ; Title segment lifetime := 60 game loops
B2A2 5096 07860 SKIP182 BVC SKIP177 ; %10 -> End-of-segment.
B2A4 A0FF 07861 LDY #$FF ; Title segment lifetime := 60 game loops
B2A6 84D1 07862 STY TITLEPHR ; %11 -> End-of-phrase, long delay, hide title line
B2A8 85CF 07863 SKIP183 STA TITLELIFE ; Title segment lifetime := 254 game loops
B2AA 60 07864 RTS ; Return
07865
07866 ;*******************************************************************************
07867 ;* *
07868 ;* SOUND *
07869 ;* *
07870 ;* Handles sound effects *
07871 ;* *
07872 ;*******************************************************************************
07873
07874 ; DESCRIPTION
07875 ;
07876 ; This subroutine handles the sound effects. It is called every vertical blank
07877 ; phase, that is, every TICK (1/60 s on an NTSC ATARI Home Computer system, 1/50
07878 ; s on a PAL ATARI Home Computer system) from the Vertical Blank Interrupt
07879 ; handler VBIHNDLR ($A6D1).
07880 ;
07881 ; The program uses all of the available 4 audio channels: Audio channels 1, 2,
07882 ; and 3 are shared among the Engines sound effects and the "noise sound
07883 ; patterns" (explosion and photon torpedo sound effects), while audio channel 4
07884 ; is used for "beeper sound patterns" (status report sound effects). The
07885 ; following sections explain the beeper sound patterns and the noise sound
07886 ; patterns:
07887 ;
07888 ; o BEEPER SOUND PATTERNS
07889 ;
07890 ; There are the following beeper sound patterns:
07891 ;
07892 ; (1) HYPERWARP TRANSIT
07893 ; (2) RED ALERT
07894 ; (3) ACKNOWLEDGE
07895 ; (4) DAMAGE REPORT
07896 ; (5) MESSAGE FROM STARBASE
07897 ;
07898 ; They are encoded in table BEEPPATTAB ($BF3E) in 6-byte long "beeper sound
07899 ; patterns".
07900 ;
07901 ; Another table, BEEPFRQTAB ($BF5C), stores the frequencies for the tones
07902 ; of each beeper sound pattern, terminated by a marker byte ($FF).
07903 ;
07904 ; BUG (at $BF5C): The pattern frequencies in table BEEPFRQTAB ($BF5C) at
07905 ; offset $00 are unused. Suggested Fix: Remove from code.
07906 ;
07907 ; Whenever the program calls subroutine BEEP ($B3A6), that subroutine sets
07908 ; up a beeper sound pattern for playing by copying 6 bytes from the pattern
07909 ; table BEEPPATTAB ($BF3E) to BEEPFRQIND ($D2)..BEEPFRQSTART ($D7).
07910 ; Subroutine SOUND ($B2AB) detects the copied beeper sound pattern and plays
07911 ; the encoded tones and pauses.
07912 ;
07913 ; The relevant variables for playing a beeper sound pattern are the
07914 ; following (see also figures at BEEPPATTAB ($BF3E)):
07915 ;
07916 ; BEEPFRQIND ($D2) = Running index into table BEEPFRQTAB ($BF5C)
07917 ; BEEPREPEAT ($D3) = Number of times that the beeper sound pattern is
07918 ; repeated - 1
07919 ; BEEPTONELIFE ($D4) = Lifetime of tone in TICKs - 1
07920 ; BEEPPAUSELIFE ($D5) = Lifetime of pause in TICKs - 1 ($FF -> No pause)
07921 ; BEEPPRIORITY ($D6) = Beeper sound pattern priority. A playing beeper
07922 ; sound pattern is stopped if a beeper sound pattern
07923 ; of higher priority is about to be played. A value
07924 ; of 0 indicates that no beeper sound pattern is
07925 ; playing at the moment.
07926 ; BEEPFRQSTART ($D7) = Index to first byte of the beeper sound pattern in
07927 ; table BEEPFRQTAB ($BF5C)
07928 ;
07929 ; BEEPLIFE ($D8) = Lifetime of the current tone or pause in TICKs
07930 ; BEEPTOGGLE ($D9) = Indicates that either a tone (0) or a pause (not
07931 ; 0) is currently playing.
07932 ;
07933 ; o NOISE SOUND PATTERNS
07934 ;
07935 ; There are the following noise sound patterns:
07936 ;
07937 ; (1) PHOTON TORPEDO LAUNCHED
07938 ; (2) SHIELD EXPLOSION
07939 ; (3) ZYLON EXPLOSION
07940 ;
07941 ; They are encoded in table NOISEPATTAB ($BF20) in 10-byte long "noise sound
07942 ; patterns".
07943 ;
07944 ; Whenever the program calls subroutine NOISE ($AEA8), that subroutine sets
07945 ; up a noise sound pattern for being played by copying 10 bytes from the
07946 ; pattern table NOISEPATTAB ($BF20) to NOISETORPTIM ($DA)..NOISELIFE ($E1)
07947 ; and hardware sound registers AUDCTL ($D208) and AUDF3 ($D204).
07948 ;
07949 ; The relevant variables for playing a noise sound pattern are the
07950 ; following:
07951 ;
07952 ; NOISETORPTIM ($DA) = Delay timer for PHOTON TORPEDO LAUNCHED noise
07953 ; sound pattern
07954 ; NOISEEXPLTIM ($DB) = Delay timer for SHIELD EXPLOSION and ZYLON
07955 ; EXPLOSION noise sound patterns
07956 ; NOISEAUDC2 ($DC) = Audio channel 1/2 control shadow register
07957 ; NOISEAUDC3 ($DD) = Audio channel 3 control shadow register
07958 ; NOISEAUDF1 ($DE) = Audio channel 1 frequency shadow register
07959 ; NOISEAUDF2 ($DF) = Audio channel 2 frequency shadow register
07960 ; NOISEFRQINC ($E0) = Audio channel 1/2 frequency increment
07961 ; NOISELIFE ($E1) = Noise sound pattern lifetime
07962 ;
07963 ; AUDCTL ($D208) = POKEY: Audio control
07964 ; AUDF3 ($D204) = POKEY: Audio channel 3 frequency audio register
07965 ;
07966 ; There are two more variables that trigger noise effects. They are not part
07967 ; of the noise sound pattern table:
07968 ;
07969 ; NOISEZYLONTIM ($E2) = Delay timer to trigger the ZYLON EXPLOSION noise
07970 ; sound pattern. It is set in subroutine COLLISION
07971 ; ($AF3D) when the impact of one of our starship's
07972 ; photon torpedoes with a target is imminent. The
07973 ; timer is decremented every TICK. When it reaches a
07974 ; value of 0 the ZYLON EXPLOSION noise sound pattern
07975 ; is played in subroutine SOUND ($B2AB).
07976 ; NOISEHITLIFE ($E3) = Lifetime of the STARSHIP EXPLOSION noise when our
07977 ; starship was destroyed by a Zylon photon torpedo.
07978 ; It is set in GAMELOOP ($A1F3) to a value of 64
07979 ; TICKs. When it reaches a value of 0 the STARSHIP
07980 ; EXPLOSION noise is played in subroutine SOUND
07981 ; ($B2AB).
07982 ;
07983 ; SUBROUTINE DETAILS
07984 ;
07985 ; This subroutine executes the following steps:
07986 ;
07987 ; (1) Play beeper sound pattern
07988 ;
07989 ; The playing of a beeper sound pattern is started, continued, or stopped.
07990 ;
07991 ; (2) Play ZYLON EXPLOSION noise sound pattern
07992 ;
07993 ; If the explosion of a target space object is imminent (subroutine
07994 ; COLLISION ($AF3D) has set NOISEZYLONTIM ($E2) to the number of game loop
07995 ; iterations that will pass until our starship's photon torpedo will hit
07996 ; the target), the timer NOISEZYLONTIM ($E2) is decremented every TICK. If
07997 ; it reaches a value of 0, then the noise sound pattern ZYLON EXPLOSION is
07998 ; played.
07999 ;
08000 ; (3) Play starship's Engines sound
08001 ;
08002 ; If the Engines are louder than the current noise sound pattern then the
08003 ; noise sound pattern is terminated and the values for the audio channels
08004 ; 1..3 are updated:
08005 ;
08006 ; The velocity of our starship determines the pitch and the volume of the
08007 ; Engines: the higher the velocity, the higher the pitch and the volume of
08008 ; the Engines. The incremented value of VELOCITYLO ($70) is used as a "base
08009 ; value" %abcdefgh.
08010 ;
08011 ; Audio channels 1 and 2 are combined to a 16-bit audio channel 1/2,
08012 ; clocked at 1.79 MHz. The inverted bits (represented by an overscore)
08013 ; B7..0 of the base value form bits B12..5 of the 16-bit frequency value of
08014 ; audio channel 1/2. Bits B7..4 of the base value form bits B3..0 of the
08015 ; volume of audio channel 1/2, with noise distortion bit B7 set:
08016 ; ________
08017 ; AUDF1/2 ($D202..3) := %000abcdefgh00000
08018 ; AUDC2 ($D203) := %1000abcd
08019 ;
08020 ; Audio channel 3 is also clocked at 1.79 MHz. The inverted bits B7..0 of
08021 ; the base value form bits B7..0 of the frequency value of audio channel 3.
08022 ; Bits B6..4 of the base value form bits B3..0 of the volume of audio
08023 ; channel 3, with noise distortion bit B7 set:
08024 ; ________
08025 ; AUDF3 ($D204) := %abcdefgh
08026 ; AUDC3 ($D205) := %10000bcd
08027 ;
08028 ; Code execution returns at this point.
08029 ;
08030 ; (4) Play ZYLON EXPLOSION or SHIELD EXPLOSION noise sound pattern
08031 ;
08032 ; If the ZYLON EXPLOSION or SHIELD EXPLOSION noise sound pattern was set
08033 ; up, the explosion noise timer NOISEEXPLTIM ($DB) is decremented every
08034 ; TICK. It starts either with a value of 4 TICKs with a ZYLON EXPLOSION
08035 ; noise sound pattern or with a value of 8 TICKs with a SHIELD EXPLOSION
08036 ; noise sound pattern, set up in subroutine NOISE ($AEA8). If it reaches a
08037 ; value of 0, then the shadow control register of audio channel 1/2
08038 ; switches to "noise distortion" at maximum volume.
08039 ;
08040 ; (5) Play PHOTON TORPEDO LAUNCHED noise sound pattern
08041 ;
08042 ; If the PHOTON TORPEDO LAUNCHED noise sound pattern was set up, the photon
08043 ; torpedo noise timer NOISETORPTIM ($DA) is decremented every TICK. It
08044 ; starts with a value of 8 TICKs, set in subroutine TRIGGER ($AE29). The
08045 ; noise distortion and volume for the shadow control register of audio
08046 ; channel 3 is picked from table NOISETORPVOLTAB ($BFEB), the noise
08047 ; frequency for audio channel 3 is picked from table NOISETORPFRQTAB
08048 ; ($BFF3). If the photon torpedo noise timer reaches a value of 0, then the
08049 ; shadow control registers of audio channel 1/2 switch to "tone distortion"
08050 ; at maximum volume and a frequency of $0202.
08051 ;
08052 ; NOTE: Using a real-time volume envelope stored in table NOISETORPVOLTAB
08053 ; ($BFEB) for a launched photon torpedo results in the distinctive
08054 ; "whooshing" photon torpedo sound.
08055 ;
08056 ; (6) Play STARSHIP EXPLOSION noise
08057 ;
08058 ; If our starship was hit by a Zylon photon torpedo then NOISEHITLIFE ($E3)
08059 ; was set to 64 TICKs in routine GAMELOOP ($A1F3). While this value is
08060 ; decremented every TICK, a random frequency value is stored to audio
08061 ; channel 3 and the distortion bit of the shadow control register of audio
08062 ; channel 3 is randomly toggled.
08063 ;
08064 ; (7) Increase audio channels 1/2 frequency
08065 ;
08066 ; The 16-bit frequency value of audio channels 1/2 (both shadow registers
08067 ; and audio registers) is increased every TICK by an increment picked from
08068 ; the currently playing noise sound pattern.
08069 ;
08070 ; (8) Mute audio channels gradually
08071 ;
08072 ; Toward the end of a noise sound pattern's lifetime all audio channels
08073 ; gradually mute their volume every other TICK until completely silent.
08074
08075 ;*** Play beeper sound pattern *************************************************
B2AB A5D6 08076 SOUND LDA BEEPPRIORITY ; Skip if beeper sound pattern not in use
B2AD F037 08077 BEQ SKIP185 ;
08078
B2AF C6D8 08079 DEC BEEPLIFE ; Decrement beeper lifetime
B2B1 1033 08080 BPL SKIP185 ; Skip if beeper lifetime still counting down
08081
B2B3 A5D9 08082 LDA BEEPTOGGLE ; Load tone/pause toggle
B2B5 F00A 08083 BEQ LOOP058 ; Skip if a tone is playing or is to be played
08084
B2B7 A5D5 08085 LDA BEEPPAUSELIFE ; Load pause lifetime
B2B9 3006 08086 BMI LOOP058 ; Skip if duration = $FF (no pause)
B2BB 85D8 08087 STA BEEPLIFE ; Store pause lifetime as beeper lifetime
B2BD A000 08088 LDY #0 ; Prep AUDC4 (zero volume)
B2BF F020 08089 BEQ SKIP184 ; Skip unconditionally
08090
B2C1 A5D4 08091 LOOP058 LDA BEEPTONELIFE ; Load tone lifetime
B2C3 85D8 08092 STA BEEPLIFE ; Store tone lifetime as beeper lifetime
B2C5 A6D2 08093 LDX BEEPFRQIND ; Load frequency index
B2C7 E6D2 08094 INC BEEPFRQIND ; Increment frequency index
B2C9 BD5CBF 08095 LDA BEEPFRQTAB,X ; Store tone frequency from frequency table in AUDF4
B2CC 8D06D2 08096 STA AUDF4 ;
B2CF A0A8 08097 LDY #$A8 ; Prep AUDC4 (tone distortion + medium volume)
B2D1 C9FF 08098 CMP #$FF ; Skip if frequency not $FF (there are more tones)
B2D3 D00C 08099 BNE SKIP184 ;
08100
B2D5 A5D7 08101 LDA BEEPFRQSTART ; Rewind pattern frequency pointer
B2D7 85D2 08102 STA BEEPFRQIND ;
B2D9 C6D3 08103 DEC BEEPREPEAT ; Decrement sequence counter
B2DB 10E4 08104 BPL LOOP058 ; Keep playing until sequence counter < 0
08105
B2DD A000 08106 LDY #0 ; Prep AUDC4 with zero volume
B2DF 84D6 08107 STY BEEPPRIORITY ; Stop playing beeper sound pattern
08108
B2E1 8C07D2 08109 SKIP184 STY AUDC4 ; Store in AUDC4
B2E4 84D9 08110 STY BEEPTOGGLE ; Store in BEEPTOGGLE
08111
08112 ;*** Play ZYLON EXPLOSION noise sound pattern **********************************
B2E6 A5E2 08113 SKIP185 LDA NOISEZYLONTIM ; Skip if ZYLON EXPLOSION timer not in use
B2E8 F009 08114 BEQ SKIP186 ;
08115
B2EA C6E2 08116 DEC NOISEZYLONTIM ; Decrement ZYLON EXPLOSION timer
B2EC D005 08117 BNE SKIP186 ; Skip if ZYLON EXPLOSION timer still counting down
08118
B2EE A214 08119 LDX #$14 ; Play noise sound pattern ZYLON EXPLOSION
B2F0 20A8AE 08120 JSR NOISE ;
08121
08122 ;*** Play our starship's Engines sound *****************************************
B2F3 A670 08123 SKIP186 LDX VELOCITYLO ; Skip if Engines softer than noise sound pattern
B2F5 8A 08124 TXA ;
B2F6 4A 08125 LSR A ;
B2F7 4A 08126 LSR A ;
B2F8 4A 08127 LSR A ;
B2F9 4A 08128 LSR A ;
B2FA 4A 08129 LSR A ;
B2FB C5E1 08130 CMP NOISELIFE ;
B2FD 902C 08131 BCC SKIP187 ;
08132
B2FF A900 08133 LDA #0 ; Terminate noise sound pattern
B301 85E1 08134 STA NOISELIFE ;
08135
B303 E8 08136 INX ;
B304 8A 08137 TXA ; A := %abcdefgh = VELOCITYLO + 1
B305 49FF 08138 EOR #$FF ; ________
B307 8D04D2 08139 STA AUDF3 ; AUDF3 := %abcdefgh
08140
B30A AA 08141 TAX ; ________
B30B 0A 08142 ASL A ; AUDF2/1 := %000abcdefgh00000
B30C 0A 08143 ASL A ;
B30D 0A 08144 ASL A ;
B30E 0A 08145 ASL A ;
B30F 0A 08146 ASL A ;
B310 8D00D2 08147 STA AUDF1 ;
B313 8A 08148 TXA ;
B314 4A 08149 LSR A ;
B315 4A 08150 LSR A ;
B316 4A 08151 LSR A ;
B317 8D02D2 08152 STA AUDF2 ;
08153
B31A 4A 08154 LSR A ; AUDC2 := %1000abcd
B31B 498F 08155 EOR #$8F ; (noise distortion + B7..B4 bits for volume)
B31D 8D03D2 08156 STA AUDC2 ;
08157
B320 2987 08158 AND #$87 ; AUDC3 := %10000bcd
B322 8D05D2 08159 STA AUDC3 ; (noise distortion + B6..B4 bits for volume)
08160
B325 A970 08161 LDA #$70 ; Clock audio channel 1 and 3 @ 1.79 MHz and...
B327 8D08D2 08162 STA AUDCTL ; ...combine audio channel 1/2 to 16-bit channel
08163
B32A 60 08164 RTS ; Return
08165
08166 ;*** Play ZYLON EXPLOSION or SHIELD EXPLOSION noise ****************************
B32B A5DB 08167 SKIP187 LDA NOISEEXPLTIM ; Skip if explosion noise timer not in use
B32D F008 08168 BEQ SKIP188 ;
08169
B32F C6DB 08170 DEC NOISEEXPLTIM ; Decrement explosion noise timer (4 or 8 TICKs long)
B331 D004 08171 BNE SKIP188 ; Skip if explosion noise timer still counting down
08172
B333 A98F 08173 LDA #$8F ; Shadow register AUDC2 := (noise dist. + max volume)
B335 85DC 08174 STA NOISEAUDC2 ;
08175
08176 ;*** Play PHOTON TORPEDO LAUNCHED noise sound **********************************
B337 A6DA 08177 SKIP188 LDX NOISETORPTIM ; Skip if photon torpedo noise timer not in use
B339 F01C 08178 BEQ SKIP190 ;
08179
B33B C6DA 08180 DEC NOISETORPTIM ; Decrement photon torpedo noise timer (8 TICKs long)
B33D D00A 08181 BNE SKIP189 ; Skip if torpedo noise timer still counting down
08182
B33F A9AF 08183 LDA #$AF ; Shadow register AUDC2 := (tone dist. + max volume)
B341 85DC 08184 STA NOISEAUDC2 ;
B343 A902 08185 LDA #$02 ; Set frequency $0202 to AUDF1/2's shadow...
B345 85DE 08186 STA NOISEAUDF1 ; ...registers
B347 85DF 08187 STA NOISEAUDF2 ;
08188
B349 BDEABF 08189 SKIP189 LDA NOISETORPVOLTAB-1,X ; Pick torpedo noise + volume shape (X in 1..8)...
B34C 85DD 08190 STA NOISEAUDC3 ; ...and store it in AUDC3's shadow register
B34E BDF2BF 08191 LDA NOISETORPFRQTAB-1,X ; Pick photon torpedo noise frequency (X in 1..8)...
B351 8D04D2 08192 STA AUDF3 ; ...and store it in AUDF3
B354 8D09D2 08193 STA STIMER ; Reset POKEY audio timers
08194
08195 ;*** Play STARSHIP EXPLOSION noise when our starship is hit ********************
B357 A5E3 08196 SKIP190 LDA NOISEHITLIFE ; Skip if STARSHIP EXPLOSION noise not in use
B359 F00E 08197 BEQ SKIP191 ;
08198
B35B C6E3 08199 DEC NOISEHITLIFE ; Decrement STARSHIP EXPLOSION noise lifetime
B35D AD0AD2 08200 LDA RANDOM ; Set random frequency to AUDF3
B360 8D04D2 08201 STA AUDF3 ;
B363 2920 08202 AND #$20 ; Toggle noise/tone dist. of AUDC3's shadow register
B365 45DD 08203 EOR NOISEAUDC3 ; ...randomly
B367 85DD 08204 STA NOISEAUDC3 ;
08205
08206 ;*** Increase 16-bit frequency of audio channels 1/2 (shadow registers also) ***
B369 18 08207 SKIP191 CLC ; Increase 16-bit frequency value of AUDF1/2...
B36A A5DE 08208 LDA NOISEAUDF1 ; ...and its shadow register by...
B36C 65E0 08209 ADC NOISEFRQINC ; ...noise sound pattern frequency increment
B36E 85DE 08210 STA NOISEAUDF1 ; AUDF1/2 := NOISEAUDF1/2 := ...
B370 8D00D2 08211 STA AUDF1 ; ...NOISEAUDF1/2 + NOISEFRQINC
B373 A5DF 08212 LDA NOISEAUDF2 ;
B375 6900 08213 ADC #0 ;
B377 85DF 08214 STA NOISEAUDF2 ;
B379 8D02D2 08215 STA AUDF2 ;
08216
08217 ;*** Gradually mute audio channels while noise sound pattern expires ***********
B37C A6DC 08218 LDX NOISEAUDC2 ; Prep AUDC2's shadow register value
B37E A4DD 08219 LDY NOISEAUDC3 ; Prep AUDC3's shadow register value
08220
B380 A572 08221 LDA COUNT8 ; Decrement volumes every other TICK
B382 4A 08222 LSR A ;
B383 901A 08223 BCC SKIP193 ;
08224
B385 A5E1 08225 LDA NOISELIFE ; Skip if noise sound pattern not in use
B387 F016 08226 BEQ SKIP193 ;
08227
B389 C6E1 08228 DEC NOISELIFE ; Decrement noise sound pattern lifetime
08229
B38B C911 08230 CMP #17 ; Mute noise sound pattern only in...
B38D B010 08231 BCS SKIP193 ; ...the last 16 TICKs of its lifetime
08232
B38F 8A 08233 TXA ; Decrement volume of AUDC2's shadow register
B390 290F 08234 AND #$0F ;
B392 F003 08235 BEQ SKIP192 ;
B394 CA 08236 DEX ;
B395 86DC 08237 STX NOISEAUDC2 ;
08238
B397 98 08239 SKIP192 TYA ; Decrement volume of AUDC3's shadow register
B398 290F 08240 AND #$0F ;
B39A F003 08241 BEQ SKIP193 ;
B39C 88 08242 DEY ;
B39D 84DD 08243 STY NOISEAUDC3 ;
08244
B39F 8E03D2 08245 SKIP193 STX AUDC2 ; Store shadow register values to audio registers
B3A2 8C05D2 08246 STY AUDC3 ;
08247
B3A5 60 08248 RTS ; Return
08249
08250 ;*******************************************************************************
08251 ;* *
08252 ;* BEEP *
08253 ;* *
08254 ;* Copy beeper sound pattern *
08255 ;* *
08256 ;*******************************************************************************
08257
08258 ; DESCRIPTION
08259 ;
08260 ; Copies a 6-byte beeper sound pattern from beeper sound pattern table
08261 ; BEEPPATTAB ($BF3E) to BEEPFRQIND ($D2)..BEEPFRQSTART ($D7), provided that no
08262 ; beeper sound pattern with higher priority is currently playing. The beeper
08263 ; sound pattern will then be automatically played in subroutine SOUND ($B2AB).
08264 ; See subroutine SOUND ($B2AB) for more information on beeper sound patterns.
08265 ;
08266 ; NOTE: The bytes from table BEEPPATTAB ($BF3E) are copied in reverse order.
08267 ;
08268 ; INPUT
08269 ;
08270 ; X = Offset to beeper sound pattern in table BEEPPATTAB ($BF3E). Used values
08271 ; are:
08272 ; $00 -> HYPERWARP TRANSIT
08273 ; $06 -> RED ALERT
08274 ; $0C -> ACKNOWLEDGE
08275 ; $12 -> DAMAGE REPORT
08276 ; $18 -> MESSAGE FROM STARBASE
08277
B3A6 BD3EBF 08278 BEEP LDA BEEPPATTAB,X ; Return if beeper sound pattern of...
B3A9 C5D6 08279 CMP BEEPPRIORITY ; ...higher priority is playing
B3AB 900C 08280 BCC SKIP194 ;
08281
B3AD A005 08282 LDY #5 ; Copy 6-byte beeper sound pattern (in reverse order)
B3AF BD3EBF 08283 LOOP059 LDA BEEPPATTAB,X ;
B3B2 99D200 08284 STA BEEPFRQIND,Y ;
B3B5 E8 08285 INX ;
B3B6 88 08286 DEY ;
B3B7 10F6 08287 BPL LOOP059 ;
08288
B3B9 60 08289 SKIP194 RTS ; Return
08290
08291 ;*******************************************************************************
08292 ;* *
08293 ;* INITIALIZE *
08294 ;* *
08295 ;* More game initialization *
08296 ;* *
08297 ;*******************************************************************************
08298
08299 ; DESCRIPTION
08300 ;
08301 ; This subroutine executes the following initialization steps:
08302 ;
08303 ; (1) Set up Display List
08304 ;
08305 ; A Display List is created at DSPLST ($0280). It starts with 2 x 8 = 16
08306 ; blank video lines, followed by 90 GRAPHICS7 rows. After a deliberate gap
08307 ; in Display List instructions, which will be filled dynamically during the
08308 ; game by calls to subroutine MODDLST ($ADF1), it ends with a Display List
08309 ; wait-and-jump-back instruction to the start of the Display List at DSPLST
08310 ; ($0280).
08311 ;
08312 ; NOTE: The PLAYFIELD color table PFCOLORTAB ($BFA9) is copied to zero-page
08313 ; table PF0COLOR ($F2) by loop jamming.
08314 ;
08315 ; (2) Create lookup tables
08316 ;
08317 ; The first lookup table MAPTO80 ($0DE9) maps a byte value of 0..255 to
08318 ; 0..80. This table is used to map unsigned (absolute) position vector
08319 ; components (coordinates) to pixel (or PLAYER) row and column numbers.
08320 ;
08321 ; NOTE: The PLAYFIELD is 160 pixels wide. Pixel column numbers relative the
08322 ; horizontal PLAYFIELD center are in -80..79, hence the range of this
08323 ; lookup table. Pixel row numbers relative the vertical PLAYFIELD center
08324 ; are in -50..49, thus they also fit in the range of this lookup table.
08325 ;
08326 ; The second lookup table MAPTOBCD99 ($0EE9) maps a byte value of 0..255 to
08327 ; a BCD-encoded value in 00..99. This table is used to convert byte values
08328 ; into decimal 2-digit values displayed by the THETA (in "gradons"), PHI
08329 ; (in "gradons"), RANGE (in "centrons"), and VELOCITY (in "metrons per
08330 ; second") readouts of the Console Panel Display.
08331 ;
08332 ; The third and fourth lookup tables accelerate drawing of PLAYFIELD space
08333 ; objects: In combination they contain the 16-bit start addresses of each
08334 ; of the 100 rows of PLAYFIELD memory. The low bytes of the 16-bit
08335 ; addresses are stored in table PFMEMROWLO ($0800). The high bytes are
08336 ; stored in table PFMEMROWHI ($0864).
08337 ;
08338 ; NOTE: The address increment is 40 (40 bytes = 160 pixels in GRAPHICS7
08339 ; mode = 1 PLAYFIELD row of pixels).
08340 ;
08341 ; NOTE: The PLAYFIELD consists of 90 GRAPHICS7 rows when the Control Panel
08342 ; Display is displayed at the bottom. When the Control Panel Display is not
08343 ; displayed, for example in demo mode, the PLAYFIELD contains additional
08344 ; GRAPHICS7 rows.
08345 ;
08346 ; (3) Copy Control Panel Display and Galactic Chart Panel Display texts
08347 ;
08348 ; The texts of the Control Panel Display and the Galactic Chart Panel
08349 ; Display are copied to their respective locations in memory by loop
08350 ; jamming.
08351 ;
08352 ; (4) Initialize Zylon unit movement timer
08353 ;
08354 ; The timer that triggers the movement of Zylon units in the Galactic Chart
08355 ; is initialized to a value of 99. See subroutine FLUSHGAMELOOP ($B4E4) for
08356 ; more information on Zylon unit movement.
08357 ;
08358 ; (5) Create Galactic Chart
08359 ;
08360 ; The Galactic Chart memory map GCMEMMAP ($08C9) is initialized. It
08361 ; represents 16 columns x 8 rows of sectors. Each sector contains one of
08362 ; the 4 sector types stored in table SECTORTYPETAB ($BBA6) (starbase, 4
08363 ; Zylon ships, 3 Zylon ships, and 2 or 1 Zylon ships), and empty sectors.
08364 ; Before distributing the sector types, the initial position of our
08365 ; starship is blocked on the Galactic Chart at sector row 4, sector column
08366 ; 8, so that it will not be inadvertently occupied while other sector types
08367 ; are distributed. The number of each of the sector types to be distributed
08368 ; is the mission level plus 2. While Zylon units can be placed anywhere,
08369 ; starbases are placed neither at the borders of the Galactic Chart nor in
08370 ; a sector adjacent to an occupied sector.
08371 ;
08372 ; After having initialized the Galactic Chart memory map, the top border of
08373 ; the Galactic Chart is drawn with characters from the custom character
08374 ; set.
08375 ;
08376 ; Finally, the sector in which our starship is located and the arrival and
08377 ; departure hyperwarp marker column and row numbers are initialized.
08378 ;
08379 ; (6) Apply a final tweak
08380 ;
08381 ; The last entry of lookup table MAPTOBCD99 ($0EE9) is tweaked to a value
08382 ; of CCS.INF * 16 + CCS.SPC. It is used to display an infinity symbol by
08383 ; the RANGE readout of the Control Panel Display in subroutine SHOWCOORD
08384 ; ($B8A7).
08385 ;
08386 ; Code execution continues into subroutine DRAWGC ($B4B9), which draws the
08387 ; content of the Galactic Chart with characters from the custom character set.
08388
=0068 08389 L.MEMPTR1 = $68 ; 16-bit memory pointer
=006A 08390 L.MEMPTR2 = $6A ; 16-bit memory pointer
=006A 08391 L.SECTORTYPE = $6A ; Saves sector type. Used values are:
08392 ; $CF -> Sector contains starbase
08393 ; $04 -> Sector contains 4 Zylon ships
08394 ; $03 -> Sector contains 3 Zylon ships
08395 ; $02 -> Sector contains 2 or 1 Zylon ships
=006B 08396 L.SECTORCNT = $6B ; Saves number of sectors of the current sector type
08397
08398 ;*** Initialize Display List and copy color table ******************************
B3BA A259 08399 INITIALIZE LDX #89 ; Set 89(+1) GRAPHICS7 rows from DSPLST+5 on
B3BC A90D 08400 LOOP060 LDA #$0D ; Prep DL instruction $0D (one row of GRAPHICS7)
B3BE 9D8502 08401 STA DSPLST+5,X ; DSPLST+5,X := one row of GRAPHICS7
B3C1 E00A 08402 CPX #10 ;
B3C3 B005 08403 BCS SKIP195 ;
B3C5 BDA9BF 08404 LDA PFCOLORTAB,X ; Copy PLAYFIELD color table to zero-page table
B3C8 95F2 08405 STA PF0COLOR,X ; (loop jamming)
B3CA CA 08406 SKIP195 DEX ;
B3CB 10EF 08407 BPL LOOP060 ;
08408
B3CD A970 08409 LDA #$70 ; DSPLST := BLK8
B3CF 8D8002 08410 STA DSPLST ; DSPLST+1 := BLK8
B3D2 8D8102 08411 STA DSPLST+1 ;
B3D5 A941 08412 LDA #$41 ; DSPLST+103 := WAITJMP @ DSPLST
B3D7 8DE702 08413 STA DSPLST+103 ;
B3DA A980 08414 LDA #<DSPLST ;
B3DC 8DE802 08415 STA DSPLST+104 ;
B3DF A902 08416 LDA #>DSPLST ;
B3E1 8DE902 08417 STA DSPLST+105 ;
08418
08419 ;*** Calculate lookup tables ***************************************************
B3E4 A200 08420 LDX #0 ; Clear both 16-bit memory pointers
B3E6 8668 08421 STX L.MEMPTR1 ;
B3E8 8669 08422 STX L.MEMPTR1+1 ;
B3EA 866A 08423 STX L.MEMPTR2 ;
B3EC 866B 08424 STX L.MEMPTR2+1 ;
08425
08426 ;*** Calc MAPTO80 map (converts value of $00..$FF to value in 0..80) ***********
B3EE 18 08427 LOOP061 CLC ;
B3EF A568 08428 LDA L.MEMPTR1 ;
B3F1 6951 08429 ADC #81 ;
B3F3 8568 08430 STA L.MEMPTR1 ;
B3F5 A569 08431 LDA L.MEMPTR1+1 ;
B3F7 9DE90D 08432 STA MAPTO80,X ;
B3FA 6900 08433 ADC #0 ;
B3FC 8569 08434 STA L.MEMPTR1+1 ;
08435
08436 ;*** Calc MAPTOBCD99 map (converts value of $00..$FF to BCD-value in 00..99) ***
B3FE 18 08437 CLC ;
B3FF A56A 08438 LDA L.MEMPTR2 ;
B401 6964 08439 ADC #100 ;
B403 856A 08440 STA L.MEMPTR2 ;
B405 A56B 08441 LDA L.MEMPTR2+1 ;
B407 9DE90E 08442 STA MAPTOBCD99,X ;
B40A F8 08443 SED ;
B40B 6900 08444 ADC #0 ;
B40D D8 08445 CLD ;
B40E 856B 08446 STA L.MEMPTR2+1 ;
B410 E8 08447 INX ;
B411 D0DB 08448 BNE LOOP061 ;
08449
08450 ;*** Calculate PLAYFIELD memory row addresses, copy Panel Display texts ********
B413 A200 08451 LDX #<PFMEM ; Point L.MEMPTR1 to start of PLAYFIELD memory
B415 8668 08452 STX L.MEMPTR1 ; (X = 0, because PFMEM is at $1000)
B417 A910 08453 LDA #>PFMEM ;
B419 8569 08454 STA L.MEMPTR1+1 ;
08455
B41B 18 08456 LOOP062 CLC ;
B41C A568 08457 LDA L.MEMPTR1 ;
B41E 9D0008 08458 STA PFMEMROWLO,X ; Store 16-bit value of L.MEMPTR1 in PFMEMROWHI/LO
B421 6928 08459 ADC #40 ; Add 40 to L.MEMPTR
B423 8568 08460 STA L.MEMPTR1 ; (40 bytes = 160 pixels = 1 PLAYFIELD row)
B425 A569 08461 LDA L.MEMPTR1+1 ;
B427 9D6408 08462 STA PFMEMROWHI,X ;
B42A 6900 08463 ADC #0 ;
B42C 8569 08464 STA L.MEMPTR1+1 ;
08465
B42E BD42BB 08466 LDA PANELTXTTAB,X ; Copy Control and Galactic Chart Panel Display texts
B431 9D4909 08467 STA PANELTXT,X ; (loop jamming)
08468
B434 E8 08469 INX ;
B435 E064 08470 CPX #100 ;
B437 90E2 08471 BCC LOOP062 ; Loop 100 times
08472
08473 ;*** Set Zylon unit movement timer *********************************************
B439 CA 08474 DEX ;
B43A 8678 08475 STX ZYLONUNITTIM ; Init Zylon unit movement timer to 99 game loops
08476
08477 ;*** Create memory map of the Galactic Chart ***********************************
B43C A203 08478 LDX #3 ; Loop over all 3(+1) sector types
B43E 8E1109 08479 STX GCMEMMAP+4*16+8 ; Block our starship's initial position at center of
08480 ; ...Galactic Chart (sector row 4, sector column 8)
08481
B441 BDA6BB 08482 LOOP063 LDA SECTORTYPETAB,X ; Prep sector type
B444 856A 08483 STA L.SECTORTYPE ;
08484
B446 A462 08485 LDY MISSIONLEVEL ; Number sectors of current type := mission level + 2
B448 C8 08486 INY ;
B449 C8 08487 INY ;
B44A 846B 08488 STY L.SECTORCNT ;
08489
B44C AD0AD2 08490 LOOP064 LDA RANDOM ; Load random sector 0..127 from GC memory map
B44F 297F 08491 AND #$7F ;
B451 A8 08492 TAY ;
B452 B9C908 08493 LDA GCMEMMAP,Y ;
B455 D0F5 08494 BNE LOOP064 ; If sector already occupied, pick another
08495
B457 A56A 08496 LDA L.SECTORTYPE ; Reload sector type
B459 1021 08497 BPL SKIP196 ; Skip if sector not to be occupied by starbase
08498
B45B C010 08499 CPY #$10 ; Place starbase...
B45D 90ED 08500 BCC LOOP064 ; ...not in first sector row of Galactic Chart
B45F C070 08501 CPY #$70 ;
B461 B0E9 08502 BCS LOOP064 ; ...not in last sector row of Galactic Chart
B463 98 08503 TYA ;
B464 290F 08504 AND #$0F ;
B466 F0E4 08505 BEQ LOOP064 ; ...not in first sector column of Galactic Chart
B468 C90F 08506 CMP #15 ;
B46A F0E0 08507 BEQ LOOP064 ; ...not in last sector column of Galactic Chart
B46C B9C808 08508 LDA GCMEMMAP-1,Y ; ...not east of an occupied sector
B46F 19CA08 08509 ORA GCMEMMAP+1,Y ; ...not west of an occupied sector
B472 19D908 08510 ORA GCMEMMAP+16,Y ; ...not south of an occupied sector
B475 19B908 08511 ORA GCMEMMAP-16,Y ; ...not north of an occupied sector
B478 D0D2 08512 BNE LOOP064 ;
08513
B47A A56A 08514 LDA L.SECTORTYPE ; Reload sector type
08515
B47C 99C908 08516 SKIP196 STA GCMEMMAP,Y ; Store sector type in Galactic Chart memory map
B47F C66B 08517 DEC L.SECTORCNT ;
B481 10C9 08518 BPL LOOP064 ; Next sector
B483 CA 08519 DEX ;
B484 10BB 08520 BPL LOOP063 ; Next sector type
08521
08522 ;*** Clear Galactic Chart and draw top border **********************************
B486 A2B4 08523 LDX #180 ; Clear Galactic Chart PLAYFIELD
B488 A90A 08524 LOOP065 LDA #CCS.SPC ;
B48A 9D340D 08525 STA GCPFMEM-1,X ;
B48D CA 08526 DEX ;
B48E D0F8 08527 BNE LOOP065 ;
08528
B490 A20F 08529 LDX #15 ; Draw top border (15(+1) characters)
B492 A918 08530 LOOP066 LDA #CCS.BORDERS ;
B494 9D370D 08531 STA GCPFMEM+2,X ;
B497 CA 08532 DEX ;
B498 10F8 08533 BPL LOOP066 ;
08534
B49A A91A 08535 LDA #CCS.CORNERSW ; Draw NORTHEAST corner (1 character)
B49C 8D470D 08536 STA GCPFMEM+18 ;
08537
B49F A900 08538 LDA #0 ; Release starship's position at center of Galactic
B4A1 8D1109 08539 STA GCMEMMAP+4*16+8 ; ...Chart (sector row 4, sector column 8)
08540
08541 ;*** Initialize current sector and hyperwarp marker column and row numbers *****
B4A4 A948 08542 LDA #$48 ; Place our starship's current sector at
B4A6 8590 08543 STA CURRSECTOR ; ...sector row 4, sector column 8
B4A8 A943 08544 LDA #$43 ; Init departure & arrival hyperwarp marker column
B4AA 858D 08545 STA WARPDEPRCOLUMN ;
B4AC 858F 08546 STA WARPARRVCOLUMN ;
B4AE A947 08547 LDA #$47 ; Init departure & arrival hyperwarp marker row
B4B0 858E 08548 STA WARPARRVROW ;
B4B2 858C 08549 STA WARPDEPRROW ;
08550
08551 ;*** Tweak last entry of MAPTOBCD99 ********************************************
B4B4 A9EA 08552 LDA #CCS.INF*16+CCS.SPC ; Last entry of MAPTOBCD99: 'INFINITY'+'SPACE' char
B4B6 8DE80F 08553 STA MAPTOBCD99+255 ;
08554
08555 ;*******************************************************************************
08556 ;* *
08557 ;* DRAWGC *
08558 ;* *
08559 ;* Draw Galactic Chart *
08560 ;* *
08561 ;*******************************************************************************
08562
08563 ; DESCRIPTION
08564 ;
08565 ; Draws the content of the Galactic Chart memory map in GCMEMMAP ($08C9) to the
08566 ; Galactic Chart PLAYFIELD memory at GCPFMEM ($0D35).
08567 ;
08568 ; NOTE: CPU register X indexes the Galactic Chart memory map GCMEMMAP ($08C9)
08569 ; (16 x 8 bytes). CPU register Y indexes the Galactic Chart PLAYFIELD memory
08570 ; GCPFMEM ($0D35) (20 x 9 bytes).
08571 ;
08572 ; NOTE: Sectors with 1 or 2 Zylon ships display the same symbol in the Galactic
08573 ; Chart.
08574
=006A 08575 L.GCMEMMAPIND = $6A ; Saves Galactic Chart memory map index
08576
B4B9 A000 08577 DRAWGC LDY #0 ; Clear Galactic Chart PLAYFIELD memory index
B4BB 846A 08578 STY L.GCMEMMAPIND ; Clear Galactic Chart memory map index
08579
B4BD A66A 08580 LOOP067 LDX L.GCMEMMAPIND ; Load sector of Galactic Chart memory map
B4BF BDC908 08581 LDA GCMEMMAP,X ;
B4C2 1002 08582 BPL SKIP197 ; Skip if not a starbase sector
B4C4 A905 08583 LDA #5 ; Prep sector character index for starbase
08584
B4C6 AA 08585 SKIP197 TAX ; Load sector character index
B4C7 BDD1BE 08586 LDA SECTORCHARTAB,X ; Load custom character set code from table...
B4CA 994B0D 08587 STA GCPFMEM+22,Y ; ...and store it in Galactic Chart PLAYFIELD memory
B4CD C8 08588 INY ; Increment Galactic Chart PLAYFIELD memory index
B4CE E66A 08589 INC L.GCMEMMAPIND ; Increment Galactic Chart memory map index
B4D0 A56A 08590 LDA L.GCMEMMAPIND ;
B4D2 290F 08591 AND #$0F ;
B4D4 D0E7 08592 BNE LOOP067 ; Next sector column until right border reached
08593
B4D6 A919 08594 LDA #CCS.BORDERW ; Draw right border
B4D8 994B0D 08595 STA GCPFMEM+22,Y ;
08596
B4DB C8 08597 INY ; Adjust Galactic Chart PLAYFIELD memory index
B4DC C8 08598 INY ;
B4DD C8 08599 INY ;
B4DE C8 08600 INY ;
B4DF C0A0 08601 CPY #$A0 ;
B4E1 90DA 08602 BCC LOOP067 ; Next sector until bottom-right sector reached
08603
B4E3 60 08604 RTS ; Return
08605
08606 ;*******************************************************************************
08607 ;* *
08608 ;* FLUSHGAMELOOP *
08609 ;* *
08610 ;* Handle remaining tasks at the end of a game loop iteration *
08611 ;* *
08612 ;*******************************************************************************
08613
08614 ; DESCRIPTION
08615 ;
08616 ; This subroutine handles at the end of a game loop iteration the following
08617 ; tasks:
08618 ;
08619 ; (1) Increment counters COUNT256 ($76) and COUNT8 ($72).
08620 ;
08621 ; (2) If our starship's energy has dropped below 1000 units then flash a {PINK}
08622 ; alert that changes to {DARK GREY BLUE} and back to {PINK} every 128 game
08623 ; loop iterations.
08624 ;
08625 ; (3) Set the Shields color and the Control Panel background color every 8 game
08626 ; loop iterations:
08627 ;
08628 ; o If the Shields are up and OK then set the Shields color to {DARK
08629 ; GREEN} and the Control Panel background color to {DARK BLUE}.
08630 ;
08631 ; o If the Shields are up and damaged there is a probability of 78%
08632 ; (200:256) that the Shield color is not changed.
08633 ;
08634 ; o If the Shields are down, damaged, or destroyed then set the Shields
08635 ; color to {BLACK}.
08636 ;
08637 ; o If the Shields are destroyed then set the Control Panel background
08638 ; color to {ORANGE}.
08639 ;
08640 ; (4) Decrement the lifetime of our starship's and Zylon photon torpedoes.
08641 ;
08642 ; (5) Decrement the lifetime of an explosion. If the explosion lifetime is less
08643 ; than 112 game loop iterations, clear HITBADNESS ($8A) (thus the explosion
08644 ; cannot destroy our starship). If the explosion lifetime is less than 24
08645 ; (?) game loops decrement the number of explosion fragments. This makes
08646 ; explosion fragments disappear gradually toward the end of an explosion.
08647 ;
08648 ; (6) Increment every 40 game loop iterations the stardate clock of the
08649 ; Galactic Chart Panel Display.
08650 ;
08651 ; (7) Move Zylon units in the Galactic Chart.
08652 ;
08653 ; Every 50 game loop iterations (or 100 game loop iterations when a
08654 ; starbase is surrounded by Zylon units) decrement the score.
08655 ;
08656 ; Code execution continues if the program is not in demo mode with the following
08657 ; steps:
08658 ;
08659 ; (1) Search the Galactic Chart for starbases surrounded by Zylon units.
08660 ; Destroy any such starbase: Replace it with a 2-Zylon sector and subtract
08661 ; 18 points from the score. If the Subspace Radio was not destroyed, then
08662 ; flash the title phrase "STARBASE DESTROYED" and play the beeper sound
08663 ; pattern MESSAGE FROM STARBASE in subroutine BEEP ($B3A6).
08664 ;
08665 ; (2) Every 8 game loop iterations the Zylon units decide, which starbase to
08666 ; hunt: First, 128 randomly picked sectors are searched for a starbase. If
08667 ; no starbase was found in this way, the sectors of the Galactic Chart are
08668 ; scanned systematically left-to-right, top-to-bottom. If a starbase was
08669 ; found then its sector, sector column, and sector row are saved, otherwise
08670 ; code execution returns.
08671 ;
08672 ; (3) Now the Zylon units converge toward the sector of the hunted starbase:
08673 ; All sectors of the Galactic Chart are scanned. For any sector with a
08674 ; Zylon unit that was not moved yet (its sector does not have the temporary
08675 ; "already-moved" bit B5 set) its movement probability value is picked from
08676 ; table MOVEPROBTAB ($BFBB):
08677 ;
08678 ; +---------------+-------------+----------------+
08679 ; | Sector Type | Movement | Movement |
08680 ; | | Probability | Probability |
08681 ; | | Value | |
08682 ; +---------------+-------------+----------------+
08683 ; | Empty sector | 0 | 0% ( 0:256) |
08684 ; | 1 Zylon ship | 255 | 100% (255:256) |
08685 ; | 2 Zylon ships | 255 | 100% (255:256) |
08686 ; | 3 Zylon ships | 192 | 75% (192:256) |
08687 ; | 4 Zylon ships | 32 | 13% ( 32:256) |
08688 ; +---------------+-------------+----------------+
08689 ;
08690 ; If this value is less or equal than a random number in 0..255 then the
08691 ; Zylon unit is moved to another sector. A Zylon unit that currently
08692 ; occupies the sector of our starship is not moved.
08693 ;
08694 ; BUG (at $B620): The instruction to check the marker bit B5 of the sector
08695 ; is CPY #$0A. This works, as sectors containing Zylon units that need to
08696 ; be moved have values of 2..4, see table SECTORTYPETAB ($BBA6). Suggested
08697 ; fix: Replace CPY #$0A with CPY #$20, which may make the code clearer.
08698 ;
08699 ; (4) For every Zylon unit that is about to be moved, 9 distances ("block
08700 ; distances") between the Zylon unit and the starbase are calculated by
08701 ; tentatively moving the Zylon unit into each of its 8 adjacent sectors -
08702 ; and by moving it not at all. The sector offsets are taken from table
08703 ; COMPASSOFFTAB ($BFC0) which stores direction offsets in the following
08704 ; order: NORTH, NORTHWEST, WEST, SOUTHWEST, SOUTH, SOUTHEAST, EAST,
08705 ; NORTHEAST, CENTER. All 9 distances are stored in 9 consecutive bytes at
08706 ; NEWZYLONDIST ($96).
08707 ;
08708 ; NOTE: The last calculated distance is the current distance between Zylon
08709 ; unit and starbase.
08710 ;
08711 ; The Zylon unit moves to the first of the 8 adjacent sectors that matches
08712 ; the following conditions:
08713 ;
08714 ; (1) It is closer to the starbase than the Zylon unit's current sector.
08715 ;
08716 ; (2) It is located inside the Galactic Chart.
08717 ;
08718 ; (3) It is empty.
08719 ;
08720 ; (4) It is not the sector containing our starship.
08721 ;
08722 ; If a suitable new sector was found then the Zylon unit is moved to this
08723 ; sector, which is marked with the "already-moved" marker bit B5 in the
08724 ; Galactic Chart memory map. This marker bit prevents a Zylon unit that has
08725 ; been already moved from being moved again. The old Zylon unit sector is
08726 ; cleared.
08727 ;
08728 ; If no suitable new sector was found then the above distance calculations
08729 ; are repeated once again by adding 1 to the current distance between the
08730 ; Zylon unit and the starbase. This may provoke a Zylon unit to move that
08731 ; would not have moved in the previous set of distance calculations.
08732 ;
08733 ; After having moved all Zylon units the sectors are stripped of the
08734 ; "already-moved" marker bit B5.
08735 ;
08736 ; (5) If a starbase has been surrounded then the Zylon unit movement timer is
08737 ; reset to 99, buying our starship some time to destroy one of the
08738 ; surrounding Zylon units. If the Subspace Radio is not destroyed, then the
08739 ; message "STARBASE SURROUNDED" is flashed in the title line and the beeper
08740 ; sound pattern MESSAGE FROM STARBASE is played in subroutine BEEP ($B3A6).
08741
=006A 08742 L.ISDESTROYED = $6A ; Flags the destruction of a starbase.
08743 ; Used values are:
08744 ; $00 -> Starbase not destroyed
08745 ; $02 -> Starbase has been destroyed
=006A 08746 L.NEWSECTOR = $6A ; Sector to which the Zylon unit is tentatively moved
=006B 08747 L.ABSDIFFCOL = $6B ; Absolute difference between new Zylon and starbase
08748 ; column on Galactic Chart in PM pixels
=006B 08749 L.LOOPCNT2 = $6B ; Loop counter. Used values are: 0..1.
=006A 08750 L.DIRECTIONIND = $6A ; Compass rose direction index.
08751 ; Used values are: 0..7.
08752
08753 ;*** Increment counters and flash low-energy alert *****************************
B4E4 E676 08754 FLUSHGAMELOOP INC COUNT256 ; Increment COUNT256 counter
08755
B4E6 A290 08756 LDX #$90 ; Prep DLI background color {DARK GREY BLUE}
B4E8 A576 08757 LDA COUNT256 ;
B4EA 1009 08758 BPL SKIP198 ; Skip if counter < 128.
08759
B4EC AC5509 08760 LDY ENERGYD1 ; When energy drops below 1000 units...
B4EF C080 08761 CPY #CCS.COL2!CCS.0 ;
B4F1 D002 08762 BNE SKIP198 ;
B4F3 A244 08763 LDX #$44 ; ...prep new DLI background color {PINK}
08764
B4F5 2903 08765 SKIP198 AND #$03 ; Increment COUNT8
B4F7 8572 08766 STA COUNT8 ;
B4F9 D01F 08767 BNE SKIP202 ; Skip setting colors but every 8 game loops
08768
08769 ;*** Set Shields and Control Panel background color ****************************
B4FB A47D 08770 LDY DRAINSHIELDS ; Skip if Shields are off
B4FD F017 08771 BEQ SKIP201 ;
08772
B4FF A0A0 08773 LDY #$A0 ; Prep Shields color {DARK GREEN}
B501 2C9409 08774 BIT GCSTATSHL ; Skip if Shields are OK
B504 100B 08775 BPL SKIP200 ;
B506 7007 08776 BVS SKIP199 ; Skip if Shields are destroyed
B508 AD0AD2 08777 LDA RANDOM ; If Shields are damaged, Shields colors are...
B50B C9C8 08778 CMP #200 ; ...unchanged with probability of 78% (200:256)
B50D 9007 08779 BCC SKIP201 ;
08780
B50F A000 08781 SKIP199 LDY #$00 ; Prep Shields color {BLACK}
B511 98 08782 SKIP200 TYA ;
B512 D002 08783 BNE SKIP201 ;
08784
B514 A226 08785 LDX #$26 ; Prep Control Panel background color {ORANGE}
08786
B516 8481 08787 SKIP201 STY SHIELDSCOLOR ; Store Shields color
B518 86FB 08788 STX BGRCOLORDLI ; Store Control Panel background color
08789
08790 ;*** Decrement lifetime of our starship's and Zylon photon torpedoes ***********
B51A A202 08791 SKIP202 LDX #2 ; Loop over PLAYER2..4
08792
B51C BD8E0C 08793 LOOP068 LDA PL2SHAPTYPE,X ; Next PLAYER if not PHOTON TORPEDO (shape type 0)
B51F D006 08794 BNE SKIP203 ;
08795
B521 B5EB 08796 LDA PL2LIFE,X ; Next PLAYER if this PLAYER not alive
B523 F002 08797 BEQ SKIP203 ;
08798
B525 D6EB 08799 DEC PL2LIFE,X ; Decrement photon torpedo PLAYER lifetime
08800
B527 CA 08801 SKIP203 DEX ;
B528 10F2 08802 BPL LOOP068 ; Next PLAYER
08803
08804 ;*** Decrement lifetime of explosion *******************************************
B52A A573 08805 LDA EXPLLIFE ; Skip if explosion lifetime expired
B52C F016 08806 BEQ SKIP206 ;
08807
B52E C673 08808 DEC EXPLLIFE ; Decrement explosion lifetime
B530 D004 08809 BNE SKIP204 ; Skip if explosion lifetime still counting
08810
B532 A211 08811 LDX #NUMSPCOBJ.NORM ; Explosion finished,...
B534 8679 08812 STX MAXSPCOBJIND ; ...restore normal number of space objects
08813
B536 C970 08814 SKIP204 CMP #112 ; Skip if explosion lifetime >= 112 game loops
B538 B004 08815 BCS SKIP205 ;
08816
B53A A200 08817 LDX #0 ; HITBADNESS := NO HIT
B53C 868A 08818 STX HITBADNESS ;
08819
B53E C918 08820 SKIP205 CMP #24 ; Skip if explosion lifetime >= 24 game loops (?)
B540 B002 08821 BCS SKIP206 ;
08822
B542 C679 08823 DEC MAXSPCOBJIND ; Decrement number of explosion fragment space objs
08824
08825 ;*** Increment stardate clock **************************************************
B544 C674 08826 SKIP206 DEC CLOCKTIM ; Decrement stardate clock timer
B546 1021 08827 BPL SKIP209 ; Return if timer is still counting
08828
B548 A928 08829 LDA #40 ; Reset stardate clock timer to 40 game loops
B54A 8574 08830 STA CLOCKTIM ;
08831
B54C A204 08832 LDX #4 ; Increment stardate clock of Galactic Chart Panel
B54E FEA309 08833 LOOP069 INC GCSTARDAT,X ;
B551 BDA309 08834 LDA GCSTARDAT,X ;
B554 C9DA 08835 CMP #[CCS.COL3!ROM.9]+1 ;
B556 900D 08836 BCC SKIP208 ;
B558 A9D0 08837 LDA #[CCS.COL3!ROM.0] ;
B55A 9DA309 08838 STA GCSTARDAT,X ;
B55D E003 08839 CPX #3 ;
B55F D001 08840 BNE SKIP207 ;
B561 CA 08841 DEX ;
B562 CA 08842 SKIP207 DEX ;
B563 10E9 08843 BPL LOOP069 ;
08844
08845 ;*** Decrement Zylon unit movement timer ***************************************
B565 C678 08846 SKIP208 DEC ZYLONUNITTIM ; Decrement Zylon unit movement timer
B567 3001 08847 BMI SKIP210 ; If timer < 0 move Zylon units
08848
B569 60 08849 SKIP209 RTS ; Return
08850
08851 ;*** Restore Zylon unit movement timer and decrement score *********************
B56A A931 08852 SKIP210 LDA #49 ; Reset Zylon unit movement timer to 49
B56C 8578 08853 STA ZYLONUNITTIM ;
08854
B56E A5CB 08855 LDA SCORE ; SCORE := SCORE - 1
B570 D002 08856 BNE SKIP211 ;
B572 C6CC 08857 DEC SCORE+1 ;
B574 C6CB 08858 SKIP211 DEC SCORE ;
08859
B576 A664 08860 LDX ISDEMOMODE ; Return if in demo mode
B578 D0EF 08861 BNE SKIP209 ;
08862
08863 ;*** Is starbase surrounded? ***************************************************
B57A 866A 08864 STX L.ISDESTROYED ; Init L.ISDESTROYED with 0 (starbase not destroyed)
B57C BDC908 08865 LOOP070 LDA GCMEMMAP,X ; Loop over all sectors, load sector type
B57F 1019 08866 BPL SKIP212 ; Skip if not a starbase sector
08867
B581 20F1B7 08868 JSR ISSURROUNDED ; Skip if starbase sector not completely surrounded
B584 F014 08869 BEQ SKIP212 ;
08870
08871 ;*** Starbase is surrounded, destroy starbase **********************************
B586 A902 08872 LDA #2 ; Replace starbase sector with 2-Zylon sector
B588 9DC908 08873 STA GCMEMMAP,X ;
B58B 856A 08874 STA L.ISDESTROYED ; Flag destruction of starbase
08875
B58D 38 08876 SEC ; SCORE := SCORE - 18
B58E A5CB 08877 LDA SCORE ;
B590 E912 08878 SBC #18 ;
B592 85CB 08879 STA SCORE ;
B594 A5CC 08880 LDA SCORE+1 ;
B596 E900 08881 SBC #0 ;
B598 85CC 08882 STA SCORE+1 ;
08883
B59A E8 08884 SKIP212 INX ;
B59B 10DF 08885 BPL LOOP070 ; Next sector
08886
08887 ;*** Report starbase destruction ***********************************************
B59D A56A 08888 LDA L.ISDESTROYED ; Skip if no starbase has been destroyed
B59F F00F 08889 BEQ SKIP213 ;
08890
B5A1 2C9709 08891 BIT GCSTATRAD ; Skip notification if Subspace Radio destroyed
B5A4 700A 08892 BVS SKIP213 ;
08893
B5A6 A015 08894 LDY #$15 ; Set title phrase "STARBASE DESTROYED"
B5A8 2023B2 08895 JSR SETTITLE ;
08896
B5AB A218 08897 LDX #$18 ; Play beeper sound pattern MESSAGE FROM STARBASE
B5AD 20A6B3 08898 JSR BEEP ;
08899
08900 ;*** Pick new starbase to be hunted by Zylon units *****************************
B5B0 C69F 08901 SKIP213 DEC HUNTTIM ; Decrement hunting timer
B5B2 3007 08902 BMI SKIP214 ; If timer < 0 decide which starbase to hunt
08903
B5B4 A693 08904 LDX HUNTSECTOR ; Skip if Zylon units already picked starbase to hunt
B5B6 BDC908 08905 LDA GCMEMMAP,X ;
B5B9 301F 08906 BMI SKIP215 ;
08907
B5BB A907 08908 SKIP214 LDA #7 ; Reset hunting timer
B5BD 859F 08909 STA HUNTTIM ;
08910
B5BF A07F 08911 LDY #127 ; Loop over 127(+1) randomly picked sectors
B5C1 AD0AD2 08912 LOOP071 LDA RANDOM ;
B5C4 297F 08913 AND #$7F ;
B5C6 AA 08914 TAX ;
B5C7 BDC908 08915 LDA GCMEMMAP,X ; Skip if starbase sector found
B5CA 300E 08916 BMI SKIP215 ;
B5CC 88 08917 DEY ;
B5CD 10F2 08918 BPL LOOP071 ; Next sector
08919
B5CF A27F 08920 LDX #127 ; Loop over all sectors of the Galactic Chart
B5D1 BDC908 08921 LOOP072 LDA GCMEMMAP,X ;
B5D4 3004 08922 BMI SKIP215 ; Skip if starbase sector found
B5D6 CA 08923 DEX ;
B5D7 10F8 08924 BPL LOOP072 ; Next sector
08925
B5D9 60 08926 RTS ; Return (no starbase sector found)
08927
08928 ;*** Store coordinates of starbase to be hunted ********************************
B5DA 8693 08929 SKIP215 STX HUNTSECTOR ; Store hunted starbase sector column and row
B5DC 8A 08930 TXA ;
B5DD 290F 08931 AND #$0F ;
B5DF 8594 08932 STA HUNTSECTCOLUMN ;
B5E1 8A 08933 TXA ;
B5E2 4A 08934 LSR A ;
B5E3 4A 08935 LSR A ;
B5E4 4A 08936 LSR A ;
B5E5 4A 08937 LSR A ;
B5E6 8595 08938 STA HUNTSECTROW ;
08939
08940 ;*** Move all Zylon units toward hunted starbase *******************************
B5E8 A2FF 08941 LDX #$FF ;
B5EA E8 08942 LOOP073 INX ; Loop over all sectors to move Zylon units
B5EB 1030 08943 BPL SKIP218 ; Jump into loop body below
08944
08945 ;*** Strip marker bits from moved Zylon units **********************************
B5ED A200 08946 LDX #0 ;
B5EF BDC908 08947 LOOP074 LDA GCMEMMAP,X ; Loop over all sectors
B5F2 29DF 08948 AND #$DF ;
B5F4 9DC908 08949 STA GCMEMMAP,X ; Strip marker bit B5 from moved Zylon units
B5F7 E8 08950 INX ;
B5F8 10F5 08951 BPL LOOP074 ; Next sector
08952
08953 ;*** Handle surrounded starbase ************************************************
B5FA 2C9709 08954 BIT GCSTATRAD ; Return if Subspace Radio is destroyed
B5FD 701D 08955 BVS SKIP217 ;
08956
B5FF A200 08957 LDX #0 ; Loop over all sectors
B601 BDC908 08958 LOOP075 LDA GCMEMMAP,X ;
B604 1013 08959 BPL SKIP216 ; Skip if not a starbase sector
B606 20F1B7 08960 JSR ISSURROUNDED ; Skip if starbase not surrounded
B609 F00E 08961 BEQ SKIP216 ;
08962
B60B A963 08963 LDA #99 ; Yes, starbase surrounded...
B60D 8578 08964 STA ZYLONUNITTIM ; ...set Zylon unit movement timer to 99
08965
B60F A013 08966 LDY #$13 ; Set title phrase "STARBASE SURROUNDED"
B611 2023B2 08967 JSR SETTITLE ;
08968
B614 A218 08969 LDX #$18 ; Play beeper sound pattern MESSAGE FROM STARBASE...
B616 4CA6B3 08970 JMP BEEP ; ...and return
08971
B619 E8 08972 SKIP216 INX ;
B61A 10E5 08973 BPL LOOP075 ; Next sector
08974
B61C 60 08975 SKIP217 RTS ; Return
08976
08977 ;*** Move single Zylon unit ****************************************************
B61D BCC908 08978 SKIP218 LDY GCMEMMAP,X ; X contains current sector
B620 C00A 08979 CPY #$0A ; Next sector if it has marker bit B5 set (!)
B622 B0C6 08980 BCS LOOP073 ;
08981
B624 AD0AD2 08982 LDA RANDOM ; Get random number
B627 D9BBBF 08983 CMP MOVEPROBTAB,Y ; Get movement probability
B62A B0BE 08984 BCS LOOP073 ; Next sector if movement probability < random number
08985
B62C E490 08986 CPX CURRSECTOR ; Next sector if this is our starship's sector
B62E F0BA 08987 BEQ LOOP073 ;
08988
08989 ;*** Compute distance to starbase by moving Zylon unit into 9 directions *******
B630 A008 08990 LDY #8 ; Loop over 8(+1) possible directions
B632 18 08991 LOOP076 CLC ;
B633 8A 08992 TXA ;
B634 79C0BF 08993 ADC COMPASSOFFTAB,Y ; Add direction offset to current sector
B637 856A 08994 STA L.NEWSECTOR ; Store new sector
08995
B639 290F 08996 AND #$0F ; Calc distance ("block distance") between...
B63B 38 08997 SEC ; ...starbase sector and tentative new Zylon sector
B63C E594 08998 SBC HUNTSECTCOLUMN ;
B63E B004 08999 BCS SKIP219 ;
B640 49FF 09000 EOR #$FF ;
B642 6901 09001 ADC #1 ;
B644 856B 09002 SKIP219 STA L.ABSDIFFCOL ;
B646 A56A 09003 LDA L.NEWSECTOR ;
B648 4A 09004 LSR A ;
B649 4A 09005 LSR A ;
B64A 4A 09006 LSR A ;
B64B 4A 09007 LSR A ;
B64C 38 09008 SEC ;
B64D E595 09009 SBC HUNTSECTROW ;
B64F B004 09010 BCS SKIP220 ;
B651 49FF 09011 EOR #$FF ;
B653 6901 09012 ADC #1 ;
B655 18 09013 SKIP220 CLC ;
B656 656B 09014 ADC L.ABSDIFFCOL ;
09015
B658 999600 09016 STA NEWZYLONDIST,Y ; Store distance in distance array
B65B 88 09017 DEY ;
B65C 10D4 09018 BPL LOOP076 ; Next direction
09019
09020 ;*** Pick the shortest distance to starbase ************************************
B65E A901 09021 LDA #1 ; Loop over compass rose directions twice to...
B660 856B 09022 STA L.LOOPCNT2 ; ...provoke movement regardless of truncation errors
09023
B662 A007 09024 LOOP077 LDY #7 ;
B664 B99600 09025 LOOP078 LDA NEWZYLONDIST,Y ; Loop over all 7(+1) compass rose directions
B667 C59E 09026 CMP OLDZYLONDIST ;
B669 B024 09027 BCS SKIP222 ; Next direction if new distance > current distance
09028
B66B 18 09029 CLC ; Calc new Galactic Chart sector for Zylon unit
B66C 8A 09030 TXA ;
B66D 79C0BF 09031 ADC COMPASSOFFTAB,Y ;
B670 301D 09032 BMI SKIP222 ; Next direction if new sector outside Galactic Chart
09033
B672 846A 09034 STY L.DIRECTIONIND ; Save compass rose direction index
B674 A8 09035 TAY ;
B675 B9C908 09036 LDA GCMEMMAP,Y ;
B678 D013 09037 BNE SKIP221 ; Next direction if new sector not empty
09038
B67A BDC908 09039 LDA GCMEMMAP,X ; Preload Zylon sector type to be moved
B67D C490 09040 CPY CURRSECTOR ;
B67F F00C 09041 BEQ SKIP221 ; Next direction if sector is our starship's sector
09042
B681 0920 09043 ORA #$20 ; New sector for Zylon unit found!
B683 99C908 09044 STA GCMEMMAP,Y ; Temporarily mark that sector with marker bit B5
B686 A900 09045 LDA #0 ;
B688 9DC908 09046 STA GCMEMMAP,X ; Clear old Zylon unit sector
B68B F00B 09047 BEQ SKIP223 ; Next sector (unconditional branch)
09048
B68D A46A 09049 SKIP221 LDY L.DIRECTIONIND ; Restore compass rose direction index
B68F 88 09050 SKIP222 DEY ; Next compass rose direction
B690 10D2 09051 BPL LOOP078 ;
09052
B692 E69E 09053 INC OLDZYLONDIST ; Increment center distance
B694 C66B 09054 DEC L.LOOPCNT2 ;
B696 10CA 09055 BPL LOOP077 ; Loop over all compass rose directions one more time
09056
B698 4CEAB5 09057 SKIP223 JMP LOOP073 ; Next sector
09058
09059 ; *******************************************************************************
09060 ; * *
09061 ; * ROTATE *
09062 ; * *
09063 ; * Rotate position vector component (coordinate) by fixed angle *
09064 ; * *
09065 ; *******************************************************************************
09066
09067 ; DESCRIPTION
09068 ;
09069 ; This subroutine rotates a position vector component (coordinate) of a space
09070 ; object by a fixed angle around the center of the 3D coordinate system, the
09071 ; location of our starship. This is used in the Front, Aft, and Long-Range Scan
09072 ; views to rotate space objects in and out of the view. Although the code is
09073 ; deceptively short, there is some interesting math involved, so a more detailed
09074 ; discussion is in order.
09075 ;
09076 ; ROTATION MATHEMATICS
09077 ;
09078 ; The program uses a left-handed 3D coordinate system with the positive x-axis
09079 ; pointing to the right, the positive y-axis pointing up, and the positive
09080 ; z-axis pointing into flight direction.
09081 ;
09082 ; A rotation in this coordinate system around the y-axis (horizontal rotation)
09083 ; can be expressed as
09084 ;
09085 ; x' := cos(ry) * x + sin(ry) * z (1a)
09086 ; z' := - sin(ry) * x + cos(ry) * z (1b)
09087 ;
09088 ; where ry is the clockwise rotation angle around the y-axis, x and z are the
09089 ; coordinates before this rotation, and the primed coordinates x' and z' the
09090 ; coordinates after this rotation. The y-coordinate is not changed by this
09091 ; rotation.
09092 ;
09093 ; A rotation in this coordinate system around the x-axis (vertical rotation) can
09094 ; be expressed as
09095 ;
09096 ; z' := cos(rx) * z + sin(rx) * y (2a)
09097 ; y' := - sin(rx) * z + cos(rx) * y (2b)
09098 ;
09099 ; where rx is the clockwise rotation angle around the x-axis, z and y are the
09100 ; coordinates before this rotation, and the primed coordinates z' and y' the
09101 ; coordinates after this rotation. The x-coordinate is not changed by this
09102 ; rotation.
09103 ;
09104 ; SUBROUTINE IMPLEMENTATION OVERVIEW
09105 ;
09106 ; A single call of this subroutine is able to compute one of the four
09107 ; expressions (1a)-(2b). To compute all four expressions to get the new set of
09108 ; coordinates, this subroutine has to be called four times. This is done twice
09109 ; in pairs in GAMELOOP ($A1F3) at $A391 and $A398, and at $A3AE and $A3B5,
09110 ; respectively.
09111 ;
09112 ; The first pair of calls calculates the new x and z coordinates of a space
09113 ; object due to a horizontal (left/right) rotation of our starship around the
09114 ; y-axis following expressions (1a) and (1b).
09115 ;
09116 ; The second pair of calls calculates the new y and z coordinates of the same
09117 ; space object due to a vertical (up/down) rotation of our starship around the
09118 ; x-axis following expressions (2a) and (2b).
09119 ;
09120 ; If you look at the code, you may be wondering how this calculation is actually
09121 ; executed, as there is neither a sin() nor a cos() function call. What you'll
09122 ; actually find implemented are the following calculations:
09123 ;
09124 ; Joystick left Joystick right
09125 ; --------------------- ---------------------
09126 ; x := x + z / 64 (3a) x := x - z / 64 (4a)
09127 ; z := -x / 64 + z (3b) z := x / 64 + z (4b)
09128 ;
09129 ; Joystick down Joystick up
09130 ; --------------------- ---------------------
09131 ; y := y + z / 64 (5a) y := y - z / 64 (6a)
09132 ; z := -y / 64 + z (5b) z := y / 64 + z (6b)
09133 ;
09134 ; CORDIC ALGORITHM
09135 ;
09136 ; When you compare expressions (1a)-(2b) with (3a)-(6b), notice the similarity
09137 ; between the expressions if you substitute
09138 ;
09139 ; sin(ry) -> 1 / 64,
09140 ; cos(ry) -> 1,
09141 ; sin(rx) -> 1 / 64, and
09142 ; cos(rx) -> 1.
09143 ;
09144 ; From sin(ry) = 1 / 64 and sin(rx) = 1 / 64 you can derive that the rotation
09145 ; angles ry and rx by which the space object is rotated per game loop iteration
09146 ; have a constant value of 0.89 degrees, as arcsine(1 / 64) = 0.89 degrees.
09147 ;
09148 ; What about cos(ry) and cos(rx)? The substitution does not match our derived
09149 ; angle exactly, because cos(0.89 degrees) = 0.99988 and is not exactly 1.
09150 ; However, this value is so close to 1 that substituting cos(0.89 degrees) with
09151 ; 1 is a very good approximation, simplifying calculations significantly.
09152 ;
09153 ; Another significant simplification results from the division by 64, because
09154 ; the actual division operation can be replaced with a much faster bit shift
09155 ; operation.
09156 ;
09157 ; This calculation-friendly way of computing rotations is known as the "CORDIC
09158 ; (COordinate Rotation DIgital Computer)" algorithm.
09159 ;
09160 ; MINSKY ROTATION
09161 ;
09162 ; There is one more interesting mathematical subtlety: Did you notice that
09163 ; expressions (1a)-(2b) use a new (primed) pair of variables to store the
09164 ; resulting coordinates, whereas in the implemented expressions (3a)-(6b) the
09165 ; value of the first coordinate of a coordinate pair is overwritten with its new
09166 ; value and this value is used in the subsequent calculation of the second
09167 ; coordinate? For example, when the joystick is pushed left, the first call of
09168 ; this subroutine calculates the new value of x according to expression (3a),
09169 ; overwriting the old value of x. During the second call to calculate z
09170 ; according to expression (3b), the new value of x is used instead of the old
09171 ; one. Is this to save the memory needed to temporarily store the old value of
09172 ; x? But isn't this a bug? If so, why does the rotation calculation actually
09173 ; work?
09174 ;
09175 ; Have a look at the expression pair (3a) and (3b) (the other expression pairs
09176 ; (4a)-(6b) work in a similar fashion):
09177 ;
09178 ; x := x + z / 64
09179 ; z := -x / 64 + z
09180 ;
09181 ; With the substitution 1 / 64 -> e, we get
09182 ;
09183 ; x := x + e * z
09184 ; z := -e * x + z
09185 ;
09186 ; Note that x is calculated first and then used in the second expression. When
09187 ; using primed coordinates for the resulting coordinates after calculating the
09188 ; two expressions we get
09189 ;
09190 ; x' := x + e * z
09191 ; z' := -e * x' + z = -e * (x + e * z) + z = -e * x + (1 - e^2) * z
09192 ;
09193 ; or in matrix form
09194 ;
09195 ; |x'| := | 1 e | * |x|
09196 ; |z'| |-e (1 - e^2)| |z|
09197 ;
09198 ; Surprisingly, this turns out to be a rotation matrix, because its determinant
09199 ; is (1 * (1 - e^2) - (e * -e)) = 1.
09200 ;
09201 ; (Incidentally, the column vectors of this matrix do not form a orthogonal
09202 ; basis, as their scalar product is 1 * e + (-e * (1 - e^2)) = -e^2.
09203 ; Orthogonality holds for e = 0 only.
09204 ;
09205 ; This kind of rotation calculation is described by Marvin Minsky in ["AIM 239
09206 ; HAKMEM", Item 149, p. 73, MIT AI Lab, February 1972] and is called "Minsky
09207 ; Rotation".
09208 ;
09209 ; SUBROUTINE IMPLEMENTATION DETAILS
09210 ;
09211 ; To better understand how the implementation of this subroutine works, have
09212 ; again a look at expressions (3a)-(6b). If you rearrange the expressions a
09213 ; little their structure is always of the form
09214 ;
09215 ; TERM1 := TERM1 SIGN TERM2 / 64
09216 ;
09217 ; or shorter
09218 ;
09219 ; TERM1 := TERM1 SIGN TERM3
09220 ;
09221 ; where
09222 ;
09223 ; TERM3 := TERM2 / 64
09224 ; SIGN := + or -
09225 ;
09226 ; and where TERM1 and TERM2 are position vector components (coordinates). In
09227 ; fact, this is all this subroutine actually does: It simply adds (or subtracts)
09228 ; TERM2 divided by 64 to (from) TERM1.
09229 ;
09230 ; When calling this subroutine the correct indices for the appropriate position
09231 ; vector components (coordinates) TERM1 and TERM2 are passed in the Y and X
09232 ; registers, respectively.
09233 ;
09234 ; What about SIGN between TERM1 and TERM3? Have again a look at expressions
09235 ; (3a)-(6b). To compute the two new coordinates after a rotation, the SIGN
09236 ; toggles from plus to minus and vice versa. The SIGN is initialized by
09237 ; JOYSTICKDELTA ($6D) before actually calling subroutine ROTATE ($B69B) and is
09238 ; toggled in every subsequent call of this subroutine. The initial value of SIGN
09239 ; should be positive (+) if the rotation is clockwise (the joystick is pushed
09240 ; right or up) and negative if the rotation is counter-clockwise (the joystick
09241 ; is pushed left or down), respectively. Because SIGN is always toggled you have
09242 ; to pass the already toggled value with the first call.
09243 ;
09244 ; NOTE: Unclear still are three instructions starting at address $B6AD. They
09245 ; seem to set the two least significant bits of TERM3 in a random fashion. Could
09246 ; this be some quick hack to avoid messing with exact but potentially lengthy
09247 ; two-complement's arithmetic here?
09248 ;
09249 ; INPUT
09250 ;
09251 ; X = Position vector component index of TERM2. Used values are:
09252 ; $00..$30 -> z-component (z-coordinate) of position vector 0..48
09253 ; $31..$61 -> x-component (x-coordinate) of position vector 0..48
09254 ; $62..$92 -> y-component (y-coordinate) of position vector 0..48
09255 ;
09256 ; Y = Position vector component index of TERM1. Used values are:
09257 ; $00..$30 -> z-component (z-coordinate) of position vector 0..48
09258 ; $31..$61 -> x-component (x-coordinate) of position vector 0..48
09259 ; $62..$92 -> y-component (y-coordinate) of position vector 0..48
09260 ;
09261 ; JOYSTICKDELTA ($6D) = Initial value of SIGN. Used values are:
09262 ; $01 -> (= Positive) Rotate right or up
09263 ; $FF -> (= Negative) Rotate left or down
09264
09265 ; TERM3 is a 24-bit value, represented by 3 bytes as
09266 ; $(sign)(high byte)(low byte)
=006A 09267 L.TERM3LO = $6A ; TERM3 (high byte), where TERM3 := TERM2 / 64
=006B 09268 L.TERM3HI = $6B ; TERM3 (low byte), where TERM3 := TERM2 / 64
=006C 09269 L.TERM3SIGN = $6C ; TERM3 (sign), where TERM3 := TERM2 / 64
09270
B69B BDAD09 09271 ROTATE LDA ZPOSSIGN,X ;
B69E 4901 09272 EOR #$01 ;
B6A0 F002 09273 BEQ SKIP224 ; Skip if sign of TERM2 is positive
B6A2 A9FF 09274 LDA #$FF ;
09275
B6A4 856B 09276 SKIP224 STA L.TERM3HI ; If TERM2 pos. -> TERM3 := $0000xx (= TERM2 / 256)
B6A6 856C 09277 STA L.TERM3SIGN ; If TERM2 neg. -> TERM3 := $FFFFxx (= TERM2 / 256)
B6A8 BD400A 09278 LDA ZPOSHI,X ; where xx := TERM2 (high byte)
B6AB 856A 09279 STA L.TERM3LO ;
09280
B6AD AD0AD2 09281 LDA RANDOM ; (?) Hack to avoid messing with two-complement's
B6B0 09BF 09282 ORA #$BF ; (?) arithmetic? Provides two least significant
B6B2 5DD30A 09283 EOR ZPOSLO,X ; (?) bits B1..0 in TERM3.
09284
B6B5 0A 09285 ASL A ; TERM3 := TERM3 * 4 (= TERM2 / 256 * 4 = TERM2 / 64)
B6B6 266A 09286 ROL L.TERM3LO ;
B6B8 266B 09287 ROL L.TERM3HI ;
B6BA 0A 09288 ASL A ;
B6BB 266A 09289 ROL L.TERM3LO ;
B6BD 266B 09290 ROL L.TERM3HI ;
09291
B6BF A56D 09292 LDA JOYSTICKDELTA ; Toggle SIGN for next call of ROTATE
B6C1 49FF 09293 EOR #$FF ;
B6C3 856D 09294 STA JOYSTICKDELTA ;
B6C5 301A 09295 BMI SKIP225 ; If SIGN negative then subtract, else add TERM3
09296
09297 ;*** Addition ******************************************************************
B6C7 18 09298 CLC ; TERM1 := TERM1 + TERM3
B6C8 B9D30A 09299 LDA ZPOSLO,Y ; (24-bit addition)
B6CB 656A 09300 ADC L.TERM3LO ;
B6CD 99D30A 09301 STA ZPOSLO,Y ;
09302
B6D0 B9400A 09303 LDA ZPOSHI,Y ;
B6D3 656B 09304 ADC L.TERM3HI ;
B6D5 99400A 09305 STA ZPOSHI,Y ;
09306
B6D8 B9AD09 09307 LDA ZPOSSIGN,Y ;
B6DB 656C 09308 ADC L.TERM3SIGN ;
B6DD 99AD09 09309 STA ZPOSSIGN,Y ;
B6E0 60 09310 RTS ;
09311
09312 ;*** Subtraction ***************************************************************
B6E1 38 09313 SKIP225 SEC ; TERM1 := TERM1 - TERM3
B6E2 B9D30A 09314 LDA ZPOSLO,Y ; (24-bit subtraction)
B6E5 E56A 09315 SBC L.TERM3LO ;
B6E7 99D30A 09316 STA ZPOSLO,Y ;
09317
B6EA B9400A 09318 LDA ZPOSHI,Y ;
B6ED E56B 09319 SBC L.TERM3HI ;
B6EF 99400A 09320 STA ZPOSHI,Y ;
09321
B6F2 B9AD09 09322 LDA ZPOSSIGN,Y ;
B6F5 E56C 09323 SBC L.TERM3SIGN ;
B6F7 99AD09 09324 STA ZPOSSIGN,Y ;
B6FA 60 09325 RTS ;
09326
09327 ;*******************************************************************************
09328 ;* *
09329 ;* SCREENCOLUMN *
09330 ;* *
09331 ;* Calculate pixel column number from centered pixel column number *
09332 ;* *
09333 ;*******************************************************************************
09334
09335 ; DESCRIPTION
09336 ;
09337 ; Converts a pixel column number relative to the horizontal screen center to a
09338 ; pixel column number relative to the top-left corner of the screen and stores
09339 ; the result in table PIXELCOLUMN ($0C2A). The passed relative pixel column
09340 ; number is always positive. The sign is picked from the corresponding
09341 ; x-component of the position vector (x-coordinate).
09342 ;
09343 ; If the passed relative pixel column number is offscreen horizontally the
09344 ; calculation is skipped and code execution returns. If the position vector
09345 ; corresponding to this pixel represents a PLAYFIELD space object (star,
09346 ; explosion fragments) a new position vector is initialized before code
09347 ; execution returns. If it represents a PLAYER space object the PLAYER is pushed
09348 ; offscreen before code execution returns.
09349 ;
09350 ; NOTE: The horizontal screen center's pixel column number for PLAYFIELD space
09351 ; objects has a value of 80 = 160 PLAYFIELD pixels / 2. For PLAYER space objects
09352 ; it has a value of 125 Player/Missile (PM) pixels (from left to right: 128 PM
09353 ; pixels to the horizontal screen center - 3 PM pixels relative offset of the
09354 ; PLAYER shape's horizontal center to its left edge = 125 PM pixels).
09355 ;
09356 ; INPUT
09357 ;
09358 ; A = Pixel column number relative to the horizontal screen center, always
09359 ; positive. Used values are:
09360 ; 0..80 -> Regular values, pixel is onscreen
09361 ; $FF -> Pixel is offscreen
09362 ;
09363 ; X = Position vector index. Used values are:
09364 ; 0..4 -> Position vector of a PLAYER space object
09365 ; 5..48 -> Position vector of a PLAYFIELD space object
09366
=006D 09367 L.PIXELCOLUMN = $6D ; Saves relative pixel column number
09368
B6FB C950 09369 SCREENCOLUMN CMP #80 ; If pixel is offscreen (A > 79)...
B6FD B05B 09370 BCS SKIP233 ; ...return via initializing a new position vector
09371
B6FF 856D 09372 STA L.PIXELCOLUMN ; Save relative pixel column number
B701 A950 09373 LDA #80 ; If PLAYFIELD space object -> A := CENTERCOL = 80
B703 E005 09374 CPX #NUMSPCOBJ.PL ; If PLAYER space object -> A := CENTERCOL = 125
B705 B002 09375 BCS SKIP226 ;
B707 A97D 09376 LDA #125 ;
09377
B709 BCDE09 09378 SKIP226 LDY XPOSSIGN,X ; Skip if x-coordinate positive
B70C D009 09379 BNE SKIP227 ;
09380
B70E 38 09381 SEC ; Pixel in left screen half (x-coordinate negative)
B70F E66D 09382 INC L.PIXELCOLUMN ;
B711 E56D 09383 SBC L.PIXELCOLUMN ;
B713 9D2A0C 09384 STA PIXELCOLUMN,X ; Pixel column := CENTERCOL - (rel. pixel column + 1)
B716 60 09385 RTS ; Return
09386
B717 18 09387 SKIP227 CLC ; Pixel in right screen half (x-coordinate positive)
B718 656D 09388 ADC L.PIXELCOLUMN ;
B71A 9D2A0C 09389 STA PIXELCOLUMN,X ; Pixel column := CENTERCOL + relative pixel column
B71D 60 09390 RTS ; Return
09391
09392 ;*******************************************************************************
09393 ;* *
09394 ;* SCREENROW *
09395 ;* *
09396 ;* Calculate pixel row number from centered pixel row number *
09397 ;* *
09398 ;*******************************************************************************
09399
09400 ; Converts a pixel row number relative to the vertical screen center to a pixel
09401 ; row number relative to the top-left corner of the screen and stores the result
09402 ; in table PIXELROWNEW ($0BF9). The passed relative pixel row number is always
09403 ; positive. The sign is picked from the corresponding y-component of the
09404 ; position vector (y-coordinate).
09405 ;
09406 ; If the passed relative pixel row number is offscreen vertically the
09407 ; calculation is skipped and code execution returns. If the position vector
09408 ; corresponding to this pixel represents a PLAYFIELD space object (star,
09409 ; explosion fragments) a new position vector is initialized in subroutine
09410 ; INITPOSVEC ($B764) before code execution returns. If it represents a PLAYER
09411 ; space object the PLAYER is pushed offscreen before code execution returns.
09412 ;
09413 ; NOTE: The vertical screen center's pixel row number for PLAYFIELD space
09414 ; objects has a value of 50 = 100 PLAYFIELD pixels / 2. For PLAYER space objects
09415 ; it has a value of 122 Player/Missile (PM) pixels (from top to bottom: 8 PM
09416 ; pixels to start of Display List + 16 PM pixels to begin of PLAYFIELD + 100 PM
09417 ; pixels to vertical screen center - 2 PM pixels (?) = 122 PM pixels).
09418 ;
09419 ; NOTE: If the position vector corresponding to the pixel represents a PLAYER
09420 ; space object the passed pixel row number is doubled because 1 PLAYFIELD pixel
09421 ; has the same height as 2 PM pixels at single-line resolution.
09422 ;
09423 ; When in Long-Range Scan view the z-coordinate takes the place of the
09424 ; y-coordinate of the Front or Aft view. If the Long-Range Scan is damaged the
09425 ; passed pixel row number is treated randomly as a negative or positive value
09426 ; (mirror effect).
09427 ;
09428 ; INPUT
09429 ;
09430 ; A = Pixel row number relative to the vertical screen center, always
09431 ; positive. Used values are:
09432 ; 0..50 -> Regular values, pixel is onscreen
09433 ; $FF -> Pixel is offscreen
09434 ;
09435 ; X = Position vector index. Used values are:
09436 ; 0..4 -> Position vector of a PLAYER space object
09437 ; 5..48 -> Position vector of a PLAYFIELD space object
09438
=006D 09439 L.PIXELROW = $6D ; Saves relative pixel row number
09440
B71E C932 09441 SCREENROW CMP #50 ; If pixel is offscreen (A > 49)...
B720 B038 09442 BCS SKIP233 ; ...return via initializing a new position vector
09443
B722 856D 09444 STA L.PIXELROW ; Save relative pixel row number
B724 A932 09445 LDA #50 ; If PLAYFIELD space object -> A := CENTERROW = 50
B726 E005 09446 CPX #NUMSPCOBJ.PL ;
B728 B004 09447 BCS SKIP228 ;
B72A 066D 09448 ASL L.PIXELROW ; If PLAYER space object -> Double pixel row number
B72C A97A 09449 LDA #122 ; If PLAYER space object -> A := CENTERROW = 122
09450
B72E 24D0 09451 SKIP228 BIT SHIPVIEW ; Skip if not in Long-Range Scan view
B730 5013 09452 BVC SKIP230 ;
09453
B732 2C9609 09454 BIT GCSTATLRS ; Skip if Long-Range Scan OK
B735 1007 09455 BPL SKIP229 ;
09456
B737 2C0AD2 09457 BIT RANDOM ; Long-Range Scan damaged...
B73A 500E 09458 BVC SKIP231 ; ...branch randomly to pixel row number calculation
B73C 7015 09459 BVS SKIP232 ; ...(mirror effect)
09460
B73E BCAD09 09461 SKIP229 LDY ZPOSSIGN,X ;
B741 D007 09462 BNE SKIP231 ; Skip if z-coordinate pos. (Long-Range Scan view)
B743 F00E 09463 BEQ SKIP232 ; Skip if z-coordinate neg. (Long-Range Scan view)
09464
B745 BC0F0A 09465 SKIP230 LDY YPOSSIGN,X ;
B748 F009 09466 BEQ SKIP232 ; Skip if y-coordinate neg. (Front or Aft view)
09467
B74A 38 09468 SKIP231 SEC ; Pixel in upper screen half (z or y coordinate pos.)
B74B E66D 09469 INC L.PIXELROW ;
B74D E56D 09470 SBC L.PIXELROW ;
B74F 9DF90B 09471 STA PIXELROWNEW,X ; Pixel row := CENTERROW - (rel. pixel row + 1)
B752 60 09472 RTS ; Return
09473
B753 18 09474 SKIP232 CLC ; Pixel in lower screen half (y or z coordinate neg.)
B754 656D 09475 ADC L.PIXELROW ;
B756 9DF90B 09476 STA PIXELROWNEW,X ; Pixel row := CENTERROW + relative pixel row
B759 60 09477 RTS ; Return
09478
B75A E005 09479 SKIP233 CPX #NUMSPCOBJ.PL ; Space object is offscreen. If it is a...
B75C B006 09480 BCS INITPOSVEC ; ...PLAYFIELD space object -> New position vector
B75E A9FB 09481 LDA #251 ; ...PLAYER space object -> Push PLAYER offscreen
B760 9DF90B 09482 STA PIXELROWNEW,X ; Why a value of 251 (?)
B763 60 09483 SKIP234 RTS ; Return
09484
09485 ;*******************************************************************************
09486 ;* *
09487 ;* INITPOSVEC *
09488 ;* *
09489 ;* Initialize position vector of a space object *
09490 ;* *
09491 ;*******************************************************************************
09492
09493 ; DESCRIPTION
09494 ;
09495 ; Initializes the position vector of a space object.
09496 ;
09497 ; This subroutine executes the following steps:
09498 ;
09499 ; (1) Set the pixel row and column number to an offscreen value (= 99).
09500 ;
09501 ; (2) If the position vector represents an explosion fragment space object then
09502 ; return code execution immediately. This avoids generating new explosion
09503 ; fragment space objects. They are separately initialized in subroutine
09504 ; COPYPOSVEC ($ACAF), which is called from subroutine INITEXPL ($AC6B).
09505 ;
09506 ; (3) Assign default values (see below) to the position vector components
09507 ; (coordinates) depending on our starship's view.
09508 ;
09509 ; Code execution continues into subroutine RNDINVXY ($B7BE) where x and y
09510 ; coordinates are inverted randomly.
09511 ;
09512 ; After passing through this and the next subroutine RNDINVXY ($B7BE) the
09513 ; components of a position vector (coordinates) are assigned to one of the
09514 ; following values depending on our starship's view:
09515 ;
09516 ; o FRONT VIEW
09517 ;
09518 ; +------------+---------------------------------------+
09519 ; | Coordinate | Values |
09520 ; +------------+---------------------------------------+
09521 ; | x | -4095..+4095 (-($0***)..+$0***) <KM> |
09522 ; | y | -4095..+4095 (-($0***)..+$0***) <KM> |
09523 ; | z | +3840..+4095 ( +$0F**) <KM> |
09524 ; +------------+---------------------------------------+
09525 ;
09526 ; o AFT VIEW
09527 ;
09528 ; +------------+---------------------------------------+
09529 ; | Coordinate | Values |
09530 ; +------------+---------------------------------------+
09531 ; | x | -3840..+3840 (-($0*00)..+$0*00) <KM> |
09532 ; | y | -3840..+3840 (-($0*00)..+$0*00) <KM> |
09533 ; | z | -3968.. -128 (-($0*80) ) <KM> |
09534 ; +------------+---------------------------------------+
09535 ; Values of x, y, and z coordinates change in increments of 256.
09536 ; Second digit of z-coordinate is -MAX(RNDY,RNDX), where
09537 ; RNDY := RND($00..$0F), RNDX := RND($00..$0F).
09538 ;
09539 ; o LONG-RANGE SCAN VIEW
09540 ;
09541 ; +------------+---------------------------------------+
09542 ; | Coordinate | Values |
09543 ; +------------+---------------------------------------+
09544 ; | x | -65535..+65535 (-($****)..$****) <KM> |
09545 ; | y | -4095..+4095 (-($0***)..$0***) <KM> |
09546 ; | z | -65535..+65535 (-($****)..$****) <KM> |
09547 ; +------------+---------------------------------------+
09548 ;
09549 ; INPUT
09550 ;
09551 ; X = Position vector index. Used values are: 0..48.
09552
=006A 09553 L.MAXRNDXY = $6A ; Saves MAX(new y-coordinate (high byte), ...
09554 ; ...new x-coordinate (high byte))
09555
B764 A963 09556 INITPOSVEC LDA #99 ; Init to offscreen pixel row and column numbers
B766 9DF90B 09557 STA PIXELROWNEW,X ;
B769 9D2A0C 09558 STA PIXELCOLUMN,X ;
09559
B76C E011 09560 CPX #NUMSPCOBJ.NORM ; Return if pos vector is explosion frag space obj
B76E B0F3 09561 BCS SKIP234 ; This avoids creating new explosion frag space objs
09562
B770 AD0AD2 09563 LDA RANDOM ; RNDY := RND($00..$0F)
B773 290F 09564 AND #$0F ;
B775 856A 09565 STA L.MAXRNDXY ; Save RNDY
B777 9DA20A 09566 STA YPOSHI,X ; y-coordinate (high byte) := RNDY
09567
B77A AD0AD2 09568 LDA RANDOM ; RNDX := RND($00..$0F)
B77D 290F 09569 AND #$0F ;
B77F C56A 09570 CMP L.MAXRNDXY ;
B781 9002 09571 BCC SKIP235 ;
B783 856A 09572 STA L.MAXRNDXY ; Save MAX(RNDY,RNDX)
B785 9D710A 09573 SKIP235 STA XPOSHI,X ; x-coordinate (high byte) := RNDX
09574
B788 A90F 09575 LDA #$0F ; z-coordinate (high byte) := $0F
B78A 9D400A 09576 STA ZPOSHI,X ;
09577
B78D A5D0 09578 LDA SHIPVIEW ; z-coordinate (sign) := 1 or 0 (Front or Aft view)
B78F 4901 09579 EOR #$01 ;
B791 2901 09580 AND #$01 ;
B793 9DAD09 09581 STA ZPOSSIGN,X ;
B796 D011 09582 BNE SKIP236 ; Skip if in Front or Long-Range Scan view
09583
09584 ; Aft view only:
B798 9D040B 09585 STA XPOSLO,X ; x-coordinate (low byte) := 0
B79B 9D350B 09586 STA YPOSLO,X ; y-coordinate (low byte) := 0
B79E 38 09587 SEC ; z-coordinate (high byte) := -MAX(RNDY,RNDX)
B79F E56A 09588 SBC L.MAXRNDXY ;
B7A1 9D400A 09589 STA ZPOSHI,X ;
B7A4 A980 09590 LDA #$80 ; z-coordinate (low byte) := $80
B7A6 9DD30A 09591 STA ZPOSLO,X ;
09592
B7A9 24D0 09593 SKIP236 BIT SHIPVIEW ; If not in Long-Range Scan view skip to RNDINVXY
B7AB 5011 09594 BVC RNDINVXY ;
09595
09596 ; Long-Range Scan view only:
B7AD AD0AD2 09597 LDA RANDOM ; x-coordinate (high byte) := RND($00..$FF)
B7B0 9D710A 09598 STA XPOSHI,X ;
B7B3 AD0AD2 09599 LDA RANDOM ; z-coordinate (high byte) := RND($00..$FF)
B7B6 9D400A 09600 STA ZPOSHI,X ;
B7B9 2901 09601 AND #$01 ; Invert z-coordinate randomly
B7BB 9DAD09 09602 STA ZPOSSIGN,X ;
09603
09604 ;*******************************************************************************
09605 ;* *
09606 ;* RNDINVXY *
09607 ;* *
09608 ;* Randomly invert the x and y components of a position vector *
09609 ;* *
09610 ;*******************************************************************************
09611
09612 ; DESCRIPTION
09613 ;
09614 ; Randomly inverts the x and y components of a position vector (x and y
09615 ; coordinates). See also subroutine INITPOSVEC ($B764).
09616 ;
09617 ; INPUT
09618 ;
09619 ; X = Position vector index. Used values are: 0..48.
09620
B7BE AD0AD2 09621 RNDINVXY LDA RANDOM ; Set sign of y-coordinate randomly
B7C1 2901 09622 AND #$01 ;
B7C3 9D0F0A 09623 STA YPOSSIGN,X ;
B7C6 D00F 09624 BNE SKIP237 ; Skip if sign positive
09625
B7C8 38 09626 SEC ; Sign negative -> Calc negative y-coordinate
B7C9 FD350B 09627 SBC YPOSLO,X ; (calculate two's-complement of 16-bit value)
B7CC 9D350B 09628 STA YPOSLO,X ;
B7CF A900 09629 LDA #0 ;
B7D1 FDA20A 09630 SBC YPOSHI,X ;
B7D4 9DA20A 09631 STA YPOSHI,X ;
09632
B7D7 AD0AD2 09633 SKIP237 LDA RANDOM ; Set sign of x-coordinate randomly
B7DA 2901 09634 AND #$01 ;
B7DC 9DDE09 09635 STA XPOSSIGN,X ;
B7DF D00F 09636 BNE SKIP238 ; Skip if sign positive
09637
B7E1 38 09638 SEC ; Sign negative -> Calc negative x-coordinate
B7E2 FD040B 09639 SBC XPOSLO,X ; (calculate two's-complement of 16-bit value)
B7E5 9D040B 09640 STA XPOSLO,X ;
B7E8 A900 09641 LDA #0 ;
B7EA FD710A 09642 SBC XPOSHI,X ;
B7ED 9D710A 09643 STA XPOSHI,X ;
B7F0 60 09644 SKIP238 RTS ; Return
09645
09646 ;*******************************************************************************
09647 ;* *
09648 ;* ISSURROUNDED *
09649 ;* *
09650 ;* Check if a sector is surrounded by Zylon units *
09651 ;* *
09652 ;*******************************************************************************
09653
09654 ; DESCRIPTION
09655 ;
09656 ; Checks if a sector of the Galactic Chart is surrounded by Zylon units in the
09657 ; adjacent NORTH, EAST, SOUTH, and WEST sectors.
09658 ;
09659 ; INPUT
09660 ;
09661 ; X = Sector of Galactic Chart. Used values are: $00..$7F with, for example,
09662 ; $00 -> NORTHWEST corner sector
09663 ; $0F -> NORTHEAST corner sector
09664 ; $70 -> SOUTHWEST corner sector
09665 ; $7F -> SOUTHWEST corner sector
09666 ;
09667 ; OUTPUT
09668 ;
09669 ; A = Returns if the sector is surrounded by Zylon units in the adjacent
09670 ; NORTH, EAST, SOUTH, and WEST sectors.
09671 ; 0 -> Sector is not surrounded
09672 ; > 0 -> Sector is surrounded
09673
B7F1 BDC808 09674 ISSURROUNDED LDA GCMEMMAP-1,X ; Check WEST sector
B7F4 F00D 09675 BEQ SKIP239 ;
B7F6 BDCA08 09676 LDA GCMEMMAP+1,X ; Check EAST sector
B7F9 F008 09677 BEQ SKIP239 ;
B7FB BDB908 09678 LDA GCMEMMAP-16,X ; Check NORTH sector
B7FE F003 09679 BEQ SKIP239 ;
B800 BDD908 09680 LDA GCMEMMAP+16,X ; Check SOUTH sector
B803 60 09681 SKIP239 RTS ; Return
09682
09683 ;*******************************************************************************
09684 ;* *
09685 ;* UPDPANEL *
09686 ;* *
09687 ;* Update Control Panel Display *
09688 ;* *
09689 ;*******************************************************************************
09690
09691 ; DESCRIPTION
09692 ;
09693 ; This subroutine executes the following steps:
09694 ;
09695 ; (1) Accelerate or decelerate our starship, update the VELOCITY readout
09696 ;
09697 ; If the new velocity value is different from the current one either
09698 ; increment or decrement the current velocity value toward the new one.
09699 ;
09700 ; If the Engines are damaged or destroyed (and hyperwarp is not engaged)
09701 ; then store a random value (less or equal than the current velocity) as
09702 ; the current velocity.
09703 ;
09704 ; Display the updated velocity by the VELOCITY readout of the Control Panel
09705 ; Display.
09706 ;
09707 ; (2) Update THETA, PHI, and RANGE readouts
09708 ;
09709 ; If the Attack Computer is working then display the x, y, and z
09710 ; coordinates of the currently tracked space object as THETA, PHI, and
09711 ; RANGE readout values of the Control Panel Display.
09712 ;
09713 ; (3) Calculate overall energy consumption
09714 ;
09715 ; Add the overall energy consumption per game loop iteration to the energy
09716 ; counter. This value is given in energy subunits (256 energy subunits = 1
09717 ; energy unit displayed by the 4-digit ENERGY readout of the Console Panel
09718 ; Display). It is the total of the following items:
09719 ;
09720 ; (1) 8 energy subunits if the Shields are up
09721 ;
09722 ; (2) 2 energy subunits if the Attack Computer is on
09723 ;
09724 ; (3) 1 energy subunit of the life support system
09725 ;
09726 ; (4) Our starship's Engines energy drain rate (depending on its velocity)
09727 ;
09728 ; If there is a carryover of the energy counter then decrement the ENERGY
09729 ; readout of the Control Panel Display by one energy unit after code
09730 ; execution has continued into subroutine DECENERGY ($B86F).
09731
09732 ;*** Accelerate or decelerate our starship *************************************
B804 A670 09733 UPDPANEL LDX VELOCITYLO ; Skip if new velocity = current velocity
B806 E471 09734 CPX NEWVELOCITY ;
B808 F008 09735 BEQ SKIP241 ;
09736
B80A 9004 09737 BCC SKIP240 ; In/decrement current velocity toward new velocity
B80C C670 09738 DEC VELOCITYLO ;
B80E B012 09739 BCS SKIP242 ;
B810 E670 09740 SKIP240 INC VELOCITYLO ;
09741
B812 A5C0 09742 SKIP241 LDA WARPSTATE ; Skip if hyperwarp engaged
B814 D00C 09743 BNE SKIP242 ;
09744
B816 2C9309 09745 BIT GCSTATENG ; Skip if Engines are OK
B819 1007 09746 BPL SKIP242 ;
09747
B81B A571 09748 LDA NEWVELOCITY ; Store RND(0..current velocity) to current velocity
B81D 2D0AD2 09749 AND RANDOM ;
B820 8570 09750 STA VELOCITYLO ;
09751
B822 A001 09752 SKIP242 LDY #VELOCD1-PANELTXT-1 ; Update digits of VELOCITY readout
B824 20CDB8 09753 JSR SHOWDIGITS ;
09754
09755 ;*** Display coordinates of tracked space object of Control Panel Display ******
B827 2C9509 09756 BIT GCSTATCOM ; Skip if Attack Computer damaged or destroyed
B82A 3030 09757 BMI SKIP243 ;
09758
B82C A931 09759 LDA #$31 ; Update THETA readout (x-coordinate)
B82E A017 09760 LDY #THETAC1-PANELTXT ;
B830 20A7B8 09761 JSR SHOWCOORD ;
09762
B833 A962 09763 LDA #$62 ; Update PHI readout (y-coordinate)
B835 A01D 09764 LDY #PHIC1-PANELTXT ;
B837 20A7B8 09765 JSR SHOWCOORD ;
09766
B83A A900 09767 LDA #$00 ; Update RANGE readout (z-coordinate)
B83C A023 09768 LDY #RANGEC1-PANELTXT ;
B83E 20A7B8 09769 JSR SHOWCOORD ;
09770
B841 AD6E09 09771 LDA RANGEC1+2 ; Hack to clear RANGE digit 3 when in hyperwarp:
B844 8D6F09 09772 STA RANGEC1+3 ; Copy RANGE digit 2 to digit 3
B847 C90A 09773 CMP #CCS.9+1 ; Skip if digit character > '9' (= 'infinity' char)
B849 B011 09774 BCS SKIP243 ;
09775
B84B AE5C09 09776 LDX TRACKDIGIT ; Get z-coordinate (low byte) of tracked space object
B84E BDD30A 09777 LDA ZPOSLO,X ;
B851 4A 09778 LSR A ; ...divide it by 16...
B852 4A 09779 LSR A ;
B853 4A 09780 LSR A ;
B854 4A 09781 LSR A ;
B855 AA 09782 TAX ;
B856 BDE90E 09783 LDA MAPTOBCD99,X ; ...map value of $00..$0F to BCD value 0..9
B859 8D6F09 09784 STA RANGEC1+3 ; ...and store it to RANGE digit 3
09785
09786 ;*** Calculate overall energy consumption **************************************
B85C 18 09787 SKIP243 CLC ;
B85D A57F 09788 LDA ENERGYCNT ; Load energy counter
B85F 657D 09789 ADC DRAINSHIELDS ; Add energy drain rate of Shields
B861 6580 09790 ADC DRAINENGINES ; Add energy drain rate of our starship's Engines
B863 657E 09791 ADC DRAINATTCOMP ; Add energy drain rate of Attack Computer
B865 6901 09792 ADC #$01 ; Add 1 energy subunit of life support system
B867 C57F 09793 CMP ENERGYCNT ;
B869 857F 09794 STA ENERGYCNT ;
B86B B039 09795 BCS SKIP246 ; Return if no energy counter carryover
09796
B86D A203 09797 LDX #3 ; Will decrement third energy digit
09798
09799 ;*******************************************************************************
09800 ;* *
09801 ;* DECENERGY *
09802 ;* *
09803 ;* Decrease energy *
09804 ;* *
09805 ;*******************************************************************************
09806
09807 ; DESCRIPTION
09808 ;
09809 ; When not in demo mode, subtract energy from the 4-digit ENERGY readout of the
09810 ; Control Panel Display. If crossing a 100-energy-unit boundary during
09811 ; subtraction the score is decremented by one unit. If the energy is zero the
09812 ; game is over.
09813 ;
09814 ; INPUT
09815 ;
09816 ; X = ENERGY readout digit to be decremented. Used values are:
09817 ; 1 -> Subtract 100 units from ENERGY readout
09818 ; 2 -> Subtract 10 units from ENERGY readout
09819 ; 3 -> Subtract 1 unit from ENERGY readout
09820
09821 ;*** Display ENERGY readout ****************************************************
B86F 2464 09822 DECENERGY BIT ISDEMOMODE ; Return if in demo mode
B871 7033 09823 BVS SKIP246 ;
09824
B873 DE5509 09825 DEC ENERGYD1,X ; Decrement energy digit character
B876 BD5509 09826 LDA ENERGYD1,X ;
B879 C980 09827 CMP #CCS.COL2!CCS.0 ;
B87B B029 09828 BCS SKIP246 ; Return if digit character >= '0'
B87D A989 09829 LDA #CCS.COL2!CCS.9 ;
B87F 9D5509 09830 STA ENERGYD1,X ; Store digit character '9'
09831
09832 ;*** Decrement score when crossing a 100-energy-unit boundary while subtracting
B882 E002 09833 CPX #2 ; Skip if no crossing of 100-energy-unit boundary
B884 D008 09834 BNE SKIP245 ;
09835
B886 A5CB 09836 LDA SCORE ; SCORE := SCORE - 1
B888 D002 09837 BNE SKIP244 ;
B88A C6CC 09838 DEC SCORE+1 ;
B88C C6CB 09839 SKIP244 DEC SCORE ;
09840
B88E CA 09841 SKIP245 DEX ;
B88F 10DE 09842 BPL DECENERGY ; Next digit
09843
09844 ;*** Energy is zero, game over *************************************************
B891 A20A 09845 LDX #CCS.SPC ; Clear 4-digit ENERGY readout
B893 8A 09846 TXA ;
B894 A003 09847 LDY #3 ;
B896 995509 09848 LOOP079 STA ENERGYD1,Y ;
B899 88 09849 DEY ;
B89A 10FA 09850 BPL LOOP079 ;
09851
B89C 2045B0 09852 JSR SETVIEW ; Set Front view
09853
B89F A031 09854 LDY #$31 ; Set title phrase "MISSION ABORTED ZERO ENERGY"
B8A1 A204 09855 LDX #$04 ; Set mission bonus offset
B8A3 200AB1 09856 JSR GAMEOVER ; Game over
09857
B8A6 60 09858 SKIP246 RTS ; Return
09859
09860 ;*******************************************************************************
09861 ;* *
09862 ;* SHOWCOORD *
09863 ;* *
09864 ;* Display a position vector component (coordinate) in Control Panel Display *
09865 ;* *
09866 ;*******************************************************************************
09867
09868 ; DESCRIPTION
09869 ;
09870 ; Displays a position vector component (coordinate) by one of the THETA, PHI, or
09871 ; RANGE readouts of the Control Panel Display.
09872 ;
09873 ; Write the sign to the Control Panel Display, then map the high byte of the
09874 ; respective coordinate (x -> THETA, y -> PHI, z -> RANGE) to a BCD-value in
09875 ; 00..99. Code execution continues into subroutine SHOWDIGITS ($B8CD) where the
09876 ; digits are actually stored in the Control Panel Display.
09877 ;
09878 ; NOTE: If the digits of either the THETA or PHI readout are to be displayed and
09879 ; the x or y position vector component (high byte) is $FF then tweak the value
09880 ; to $FE. This avoids accessing table MAPTOBCD99 ($0EE9) with an index of $FF
09881 ; that would return the special value $EA. This value represents the CCS.INF
09882 ; ($0E) and CCS.SPC ($0A) characters (see comments in subroutine INITIALIZE
09883 ; ($B3BA)) that are displayed by the RANGE readout only.
09884 ;
09885 ; INPUT
09886 ;
09887 ; A = Position vector component (coordinate) offset. Used values are:
09888 ; $00 -> z-coordinate
09889 ; $31 -> x-coordinate
09890 ; $62 -> y-coordinate
09891 ;
09892 ; Y = Offset into the Control Panel Display memory map. Used values are:
09893 ; $17 -> First character (sign) of THETA readout (x-coordinate of tracked
09894 ; space object)
09895 ; $1D -> First character (sign) of PHI readout (y-coordinate of tracked
09896 ; space object)
09897 ; $23 -> First character (sign) of RANGE readout (z-coordinate of tracked
09898 ; space object)
09899
=006A 09900 L.SIGNCHAR = $6A ; Saves sign character
09901
B8A7 18 09902 SHOWCOORD CLC ; Add index of tracked space object...
B8A8 6D5C09 09903 ADC TRACKDIGIT ; ...to position vector component offset
B8AB AA 09904 TAX ; Save position vector component index
09905
09906 ;*** Display sign in Control Panel Display *************************************
B8AC A910 09907 LDA #CCS.PLUS ; Save '+' (CCS.PLUS) to sign character
B8AE 856A 09908 STA L.SIGNCHAR ;
09909
B8B0 BDAD09 09910 LDA ZPOSSIGN,X ; Prep sign of coordinate
B8B3 4A 09911 LSR A ;
B8B4 BD400A 09912 LDA ZPOSHI,X ; Prep coordinate (high byte)
B8B7 B004 09913 BCS SKIP247 ; Skip if sign is positive
09914
B8B9 49FF 09915 EOR #$FF ; Invert coordinate (high byte)
B8BB C66A 09916 DEC L.SIGNCHAR ; Change saved sign character to '-' (CCS.MINUS)
09917
B8BD AA 09918 SKIP247 TAX ; Save coordinate (high byte)
B8BE A56A 09919 LDA L.SIGNCHAR ; Store sign character in Control Panel Display
B8C0 994909 09920 STA PANELTXT,Y ;
09921
09922 ;*** Get RANGE digits **********************************************************
B8C3 98 09923 TYA ; Skip if RANGE is to be displayed
B8C4 2910 09924 AND #$10 ;
B8C6 F005 09925 BEQ SHOWDIGITS ;
09926
B8C8 E0FF 09927 CPX #$FF ; If coordinate (high byte) = $FF decrement value
B8CA D001 09928 BNE SHOWDIGITS ; This avoids output of CCS.INFINITY in...
B8CC CA 09929 DEX ; ...THETA and PHI readouts
09930
09931 ;*******************************************************************************
09932 ;* *
09933 ;* SHOWDIGITS *
09934 ;* *
09935 ;* Display a value by a readout of the Control Panel Display *
09936 ;* *
09937 ;*******************************************************************************
09938
09939 ; DESCRIPTION
09940 ;
09941 ; Converts a binary value in $00..$FF to a BCD-value in 0..99 and displays it as
09942 ; a 2-digit number in the Control Panel Display.
09943 ;
09944 ; INPUT
09945 ;
09946 ; X = Value to be displayed as a 2-digit BCD-value. Used values are: $00..$FF.
09947 ;
09948 ; Y = Offset into the Control Panel Display memory map relative to the first
09949 ; character of the Control Panel Display (the 'V' of the VELOCITY
09950 ; readout). Used values are:
09951 ; $01 -> Character before first digit of VELOCITY readout
09952 ; $17 -> First character (sign) of THETA readout (x-coordinate of tracked
09953 ; space object)
09954 ; $1D -> First character (sign) of PHI readout (y-coordinate of tracked
09955 ; space object)
09956 ; $23 -> First character (sign) of RANGE readout (z-coordinate of tracked
09957 ; space object)
09958
B8CD BDE90E 09959 SHOWDIGITS LDA MAPTOBCD99,X ; Map binary value to BCD-value
B8D0 AA 09960 TAX ;
B8D1 290F 09961 AND #$0F ;
B8D3 994B09 09962 STA PANELTXT+2,Y ; Store 'ones' digit in Control Panel Display
B8D6 8A 09963 TXA ;
B8D7 4A 09964 LSR A ;
B8D8 4A 09965 LSR A ;
B8D9 4A 09966 LSR A ;
B8DA 4A 09967 LSR A ;
B8DB 994A09 09968 STA PANELTXT+1,Y ; Store 'tens' digit in Control Panel Display
B8DE 60 09969 RTS ; Return
09970
09971 ;*******************************************************************************
09972 ;* *
09973 ;* G A M E D A T A ( P A R T 2 O F 2 ) *
09974 ;* *
09975 ;*******************************************************************************
09976
09977 ;*** Color register offsets of PLAYER0..4 **************************************
B8DF 00 09978 PLCOLOROFFTAB .BYTE 0 ; PLAYER0
B8E0 01 09979 .BYTE 1 ; PLAYER1
B8E1 02 09980 .BYTE 2 ; PLAYER2
B8E2 03 09981 .BYTE 3 ; PLAYER3
B8E3 07 09982 .BYTE 7 ; PLAYER4
09983
09984 ;*** Shape table 1 (PLAYER2..4) ************************************************
B8E4 00 09985 PLSHAP1TAB .BYTE $00 ; ........
B8E5 18 09986 .BYTE $18 ; ...##...
B8E6 3C 09987 .BYTE $3C ; ..####..
B8E7 7E 09988 .BYTE $7E ; .######.
B8E8 7E 09989 .BYTE $7E ; .######.
B8E9 76 09990 .BYTE $76 ; .###.##.
B8EA F7 09991 .BYTE $F7 ; ####.###
B8EB DF 09992 .BYTE $DF ; ##.#####
B8EC DF 09993 .BYTE $DF ; ##.#####
B8ED FF 09994 .BYTE $FF ; ########
B8EE FF 09995 .BYTE $FF ; ########
B8EF F7 09996 .BYTE $F7 ; ####.###
B8F0 76 09997 .BYTE $76 ; .###.##.
B8F1 7E 09998 .BYTE $7E ; .######.
B8F2 7E 09999 .BYTE $7E ; .######.
B8F3 3C 10000 .BYTE $3C ; ..####..
B8F4 18 10001 .BYTE $18 ; ...##...
B8F5 10 10002 .BYTE $10 ; ...#....
B8F6 38 10003 .BYTE $38 ; ..###...
B8F7 7C 10004 .BYTE $7C ; .#####..
B8F8 7C 10005 .BYTE $7C ; .#####..
B8F9 FE 10006 .BYTE $FE ; #######.
B8FA DE 10007 .BYTE $DE ; ##.####.
B8FB DA 10008 .BYTE $DA ; ##.##.#.
B8FC FA 10009 .BYTE $FA ; #####.#.
B8FD EE 10010 .BYTE $EE ; ###.###.
B8FE EE 10011 .BYTE $EE ; ###.###.
B8FF 7C 10012 .BYTE $7C ; .#####..
B900 7C 10013 .BYTE $7C ; .#####..
B901 38 10014 .BYTE $38 ; ..###...
B902 10 10015 .BYTE $10 ; ...#....
B903 18 10016 .BYTE $18 ; ...##...
B904 3C 10017 .BYTE $3C ; ..####..
B905 3C 10018 .BYTE $3C ; ..####..
B906 7E 10019 .BYTE $7E ; .######.
B907 6E 10020 .BYTE $6E ; .##.###.
B908 7A 10021 .BYTE $7A ; .####.#.
B909 7E 10022 .BYTE $7E ; .######.
B90A 76 10023 .BYTE $76 ; .###.##.
B90B 7E 10024 .BYTE $7E ; .######.
B90C 3C 10025 .BYTE $3C ; ..####..
B90D 3C 10026 .BYTE $3C ; ..####..
B90E 18 10027 .BYTE $18 ; ...##...
B90F 10 10028 .BYTE $10 ; ...#....
B910 38 10029 .BYTE $38 ; ..###...
B911 38 10030 .BYTE $38 ; ..###...
B912 7C 10031 .BYTE $7C ; .#####..
B913 74 10032 .BYTE $74 ; .###.#..
B914 7C 10033 .BYTE $7C ; .#####..
B915 6C 10034 .BYTE $6C ; .##.##..
B916 38 10035 .BYTE $38 ; ..###...
B917 38 10036 .BYTE $38 ; ..###...
B918 10 10037 .BYTE $10 ; ...#....
B919 10 10038 .BYTE $10 ; ...#....
B91A 18 10039 .BYTE $18 ; ...##...
B91B 3C 10040 .BYTE $3C ; ..####..
B91C 2C 10041 .BYTE $2C ; ..#.##..
B91D 3C 10042 .BYTE $3C ; ..####..
B91E 3C 10043 .BYTE $3C ; ..####..
B91F 18 10044 .BYTE $18 ; ...##...
B920 08 10045 .BYTE $08 ; ....#...
B921 10 10046 .BYTE $10 ; ...#....
B922 38 10047 .BYTE $38 ; ..###...
B923 38 10048 .BYTE $38 ; ..###...
B924 28 10049 .BYTE $28 ; ..#.#...
B925 38 10050 .BYTE $38 ; ..###...
B926 10 10051 .BYTE $10 ; ...#....
B927 3C 10052 .BYTE $3C ; ..####..
B928 3C 10053 .BYTE $3C ; ..####..
B929 24 10054 .BYTE $24 ; ..#..#..
B92A 3C 10055 .BYTE $3C ; ..####..
B92B 7E 10056 .BYTE $7E ; .######.
B92C 7E 10057 .BYTE $7E ; .######.
B92D 7E 10058 .BYTE $7E ; .######.
B92E 5A 10059 .BYTE $5A ; .#.##.#.
B92F FF 10060 .BYTE $FF ; ########
B930 FF 10061 .BYTE $FF ; ########
B931 42 10062 .BYTE $42 ; .#....#.
B932 42 10063 .BYTE $42 ; .#....#.
B933 42 10064 .BYTE $42 ; .#....#.
B934 42 10065 .BYTE $42 ; .#....#.
B935 42 10066 .BYTE $42 ; .#....#.
B936 42 10067 .BYTE $42 ; .#....#.
B937 1C 10068 .BYTE $1C ; ...###..
B938 1C 10069 .BYTE $1C ; ...###..
B939 14 10070 .BYTE $14 ; ...#.#..
B93A 3E 10071 .BYTE $3E ; ..#####.
B93B 3E 10072 .BYTE $3E ; ..#####.
B93C 3E 10073 .BYTE $3E ; ..#####.
B93D 2A 10074 .BYTE $2A ; ..#.#.#.
B93E 7F 10075 .BYTE $7F ; .#######
B93F 7F 10076 .BYTE $7F ; .#######
B940 22 10077 .BYTE $22 ; ..#...#.
B941 22 10078 .BYTE $22 ; ..#...#.
B942 22 10079 .BYTE $22 ; ..#...#.
B943 22 10080 .BYTE $22 ; ..#...#.
B944 22 10081 .BYTE $22 ; ..#...#.
B945 18 10082 .BYTE $18 ; ...##...
B946 18 10083 .BYTE $18 ; ...##...
B947 3C 10084 .BYTE $3C ; ..####..
B948 3C 10085 .BYTE $3C ; ..####..
B949 3C 10086 .BYTE $3C ; ..####..
B94A 3C 10087 .BYTE $3C ; ..####..
B94B 7E 10088 .BYTE $7E ; .######.
B94C 24 10089 .BYTE $24 ; ..#..#..
B94D 24 10090 .BYTE $24 ; ..#..#..
B94E 24 10091 .BYTE $24 ; ..#..#..
B94F 24 10092 .BYTE $24 ; ..#..#..
B950 10 10093 .BYTE $10 ; ...#....
B951 10 10094 .BYTE $10 ; ...#....
B952 38 10095 .BYTE $38 ; ..###...
B953 38 10096 .BYTE $38 ; ..###...
B954 38 10097 .BYTE $38 ; ..###...
B955 7C 10098 .BYTE $7C ; .#####..
B956 28 10099 .BYTE $28 ; ..#.#...
B957 28 10100 .BYTE $28 ; ..#.#...
B958 28 10101 .BYTE $28 ; ..#.#...
B959 18 10102 .BYTE $18 ; ...##...
B95A 18 10103 .BYTE $18 ; ...##...
B95B 3C 10104 .BYTE $3C ; ..####..
B95C 18 10105 .BYTE $18 ; ...##...
B95D 18 10106 .BYTE $18 ; ...##...
B95E 10 10107 .BYTE $10 ; ...#....
B95F 10 10108 .BYTE $10 ; ...#....
B960 38 10109 .BYTE $38 ; ..###...
B961 10 10110 .BYTE $10 ; ...#....
B962 18 10111 .BYTE $18 ; ...##...
B963 7E 10112 .BYTE $7E ; .######.
B964 FF 10113 .BYTE $FF ; ########
B965 FF 10114 .BYTE $FF ; ########
B966 FF 10115 .BYTE $FF ; ########
B967 FF 10116 .BYTE $FF ; ########
B968 FF 10117 .BYTE $FF ; ########
B969 E7 10118 .BYTE $E7 ; ###..###
B96A E7 10119 .BYTE $E7 ; ###..###
B96B FF 10120 .BYTE $FF ; ########
B96C FF 10121 .BYTE $FF ; ########
B96D FF 10122 .BYTE $FF ; ########
B96E FF 10123 .BYTE $FF ; ########
B96F FF 10124 .BYTE $FF ; ########
B970 7E 10125 .BYTE $7E ; .######.
B971 7E 10126 .BYTE $7E ; .######.
B972 00 10127 .BYTE $00 ; ........
B973 18 10128 .BYTE $18 ; ...##...
B974 3C 10129 .BYTE $3C ; ..####..
B975 7E 10130 .BYTE $7E ; .######.
B976 FF 10131 .BYTE $FF ; ########
B977 FF 10132 .BYTE $FF ; ########
B978 FF 10133 .BYTE $FF ; ########
B979 E7 10134 .BYTE $E7 ; ###..###
B97A 66 10135 .BYTE $66 ; .##..##.
B97B FF 10136 .BYTE $FF ; ########
B97C FF 10137 .BYTE $FF ; ########
B97D FF 10138 .BYTE $FF ; ########
B97E FF 10139 .BYTE $FF ; ########
B97F 7E 10140 .BYTE $7E ; .######.
B980 7E 10141 .BYTE $7E ; .######.
B981 00 10142 .BYTE $00 ; ........
B982 18 10143 .BYTE $18 ; ...##...
B983 3C 10144 .BYTE $3C ; ..####..
B984 7E 10145 .BYTE $7E ; .######.
B985 FF 10146 .BYTE $FF ; ########
B986 FF 10147 .BYTE $FF ; ########
B987 E7 10148 .BYTE $E7 ; ###..###
B988 66 10149 .BYTE $66 ; .##..##.
B989 FF 10150 .BYTE $FF ; ########
B98A FF 10151 .BYTE $FF ; ########
B98B FF 10152 .BYTE $FF ; ########
B98C FF 10153 .BYTE $FF ; ########
B98D 3C 10154 .BYTE $3C ; ..####..
B98E 18 10155 .BYTE $18 ; ...##...
B98F 3C 10156 .BYTE $3C ; ..####..
B990 FF 10157 .BYTE $FF ; ########
B991 FF 10158 .BYTE $FF ; ########
B992 E7 10159 .BYTE $E7 ; ###..###
B993 66 10160 .BYTE $66 ; .##..##.
B994 FF 10161 .BYTE $FF ; ########
B995 FF 10162 .BYTE $FF ; ########
B996 7E 10163 .BYTE $7E ; .######.
B997 3C 10164 .BYTE $3C ; ..####..
B998 00 10165 .BYTE $00 ; ........
B999 18 10166 .BYTE $18 ; ...##...
B99A 3C 10167 .BYTE $3C ; ..####..
B99B FF 10168 .BYTE $FF ; ########
B99C FF 10169 .BYTE $FF ; ########
B99D FF 10170 .BYTE $FF ; ########
B99E 3C 10171 .BYTE $3C ; ..####..
B99F 18 10172 .BYTE $18 ; ...##...
B9A0 18 10173 .BYTE $18 ; ...##...
B9A1 3C 10174 .BYTE $3C ; ..####..
B9A2 FF 10175 .BYTE $FF ; ########
B9A3 3C 10176 .BYTE $3C ; ..####..
B9A4 18 10177 .BYTE $18 ; ...##...
B9A5 28 10178 .BYTE $28 ; ..#.#...
B9A6 28 10179 .BYTE $28 ; ..#.#...
B9A7 28 10180 .BYTE $28 ; ..#.#...
B9A8 28 10181 .BYTE $28 ; ..#.#...
B9A9 EE 10182 .BYTE $EE ; ###.###.
B9AA 00 10183 .BYTE $00 ; ........
B9AB 00 10184 .BYTE $00 ; ........
B9AC EE 10185 .BYTE $EE ; ###.###.
B9AD 28 10186 .BYTE $28 ; ..#.#...
B9AE 28 10187 .BYTE $28 ; ..#.#...
B9AF 28 10188 .BYTE $28 ; ..#.#...
B9B0 28 10189 .BYTE $28 ; ..#.#...
10190
10191 ;*** Shape table 2 (PLAYER0..1) ************************************************
B9B1 00 10192 PLSHAP2TAB .BYTE $00 ; ........
B9B2 81 10193 .BYTE $81 ; #......#
B9B3 81 10194 .BYTE $81 ; #......#
B9B4 81 10195 .BYTE $81 ; #......#
B9B5 81 10196 .BYTE $81 ; #......#
B9B6 BD 10197 .BYTE $BD ; #.####.#
B9B7 FF 10198 .BYTE $FF ; ########
B9B8 FF 10199 .BYTE $FF ; ########
B9B9 BD 10200 .BYTE $BD ; #.####.#
B9BA 81 10201 .BYTE $81 ; #......#
B9BB 81 10202 .BYTE $81 ; #......#
B9BC 81 10203 .BYTE $81 ; #......#
B9BD 81 10204 .BYTE $81 ; #......#
B9BE 82 10205 .BYTE $82 ; #.....#.
B9BF 82 10206 .BYTE $82 ; #.....#.
B9C0 BA 10207 .BYTE $BA ; #.###.#.
B9C1 FE 10208 .BYTE $FE ; #######.
B9C2 FE 10209 .BYTE $FE ; #######.
B9C3 BA 10210 .BYTE $BA ; #.###.#.
B9C4 82 10211 .BYTE $82 ; #.....#.
B9C5 82 10212 .BYTE $82 ; #.....#.
B9C6 42 10213 .BYTE $42 ; .#....#.
B9C7 5A 10214 .BYTE $5A ; .#.##.#.
B9C8 7E 10215 .BYTE $7E ; .######.
B9C9 7E 10216 .BYTE $7E ; .######.
B9CA 5A 10217 .BYTE $5A ; .#.##.#.
B9CB 42 10218 .BYTE $42 ; .#....#.
B9CC 44 10219 .BYTE $44 ; .#...#..
B9CD 54 10220 .BYTE $54 ; .#.#.#..
B9CE 7C 10221 .BYTE $7C ; .#####..
B9CF 7C 10222 .BYTE $7C ; .#####..
B9D0 54 10223 .BYTE $54 ; .#.#.#..
B9D1 44 10224 .BYTE $44 ; .#...#..
B9D2 24 10225 .BYTE $24 ; ..#..#..
B9D3 3C 10226 .BYTE $3C ; ..####..
B9D4 3C 10227 .BYTE $3C ; ..####..
B9D5 24 10228 .BYTE $24 ; ..#..#..
B9D6 28 10229 .BYTE $28 ; ..#.#...
B9D7 38 10230 .BYTE $38 ; ..###...
B9D8 38 10231 .BYTE $38 ; ..###...
B9D9 28 10232 .BYTE $28 ; ..#.#...
B9DA 18 10233 .BYTE $18 ; ...##...
B9DB 18 10234 .BYTE $18 ; ...##...
B9DC 10 10235 .BYTE $10 ; ...#....
B9DD 10 10236 .BYTE $10 ; ...#....
B9DE E0 10237 .BYTE $E0 ; ###.....
B9DF F8 10238 .BYTE $F8 ; #####...
B9E0 F8 10239 .BYTE $F8 ; #####...
B9E1 FE 10240 .BYTE $FE ; #######.
B9E2 57 10241 .BYTE $57 ; .#.#.###
B9E3 FE 10242 .BYTE $FE ; #######.
B9E4 F8 10243 .BYTE $F8 ; #####...
B9E5 F8 10244 .BYTE $F8 ; #####...
B9E6 C0 10245 .BYTE $C0 ; ##......
B9E7 C0 10246 .BYTE $C0 ; ##......
B9E8 F0 10247 .BYTE $F0 ; ####....
B9E9 C0 10248 .BYTE $C0 ; ##......
B9EA F0 10249 .BYTE $F0 ; ####....
B9EB F0 10250 .BYTE $F0 ; ####....
B9EC FC 10251 .BYTE $FC ; ######..
B9ED BE 10252 .BYTE $BE ; #.#####.
B9EE FC 10253 .BYTE $FC ; ######..
B9EF F0 10254 .BYTE $F0 ; ####....
B9F0 80 10255 .BYTE $80 ; #.......
B9F1 80 10256 .BYTE $80 ; #.......
B9F2 C0 10257 .BYTE $C0 ; ##......
B9F3 C0 10258 .BYTE $C0 ; ##......
B9F4 F0 10259 .BYTE $F0 ; ####....
B9F5 BC 10260 .BYTE $BC ; #.####..
B9F6 F0 10261 .BYTE $F0 ; ####....
B9F7 C0 10262 .BYTE $C0 ; ##......
B9F8 07 10263 .BYTE $07 ; .....###
B9F9 1F 10264 .BYTE $1F ; ...#####
B9FA 1F 10265 .BYTE $1F ; ...#####
B9FB 7F 10266 .BYTE $7F ; .#######
B9FC EA 10267 .BYTE $EA ; ###.#.#.
B9FD 7F 10268 .BYTE $7F ; .#######
B9FE 1F 10269 .BYTE $1F ; ...#####
B9FF 1F 10270 .BYTE $1F ; ...#####
BA00 03 10271 .BYTE $03 ; ......##
BA01 03 10272 .BYTE $03 ; ......##
BA02 0F 10273 .BYTE $0F ; ....####
BA03 03 10274 .BYTE $03 ; ......##
BA04 0F 10275 .BYTE $0F ; ....####
BA05 0F 10276 .BYTE $0F ; ....####
BA06 3F 10277 .BYTE $3F ; ..######
BA07 7D 10278 .BYTE $7D ; .#####.#
BA08 3F 10279 .BYTE $3F ; ..######
BA09 0F 10280 .BYTE $0F ; ....####
BA0A 01 10281 .BYTE $01 ; .......#
BA0B 01 10282 .BYTE $01 ; .......#
BA0C 03 10283 .BYTE $03 ; ......##
BA0D 03 10284 .BYTE $03 ; ......##
BA0E 0F 10285 .BYTE $0F ; ....####
BA0F 3D 10286 .BYTE $3D ; ..####.#
BA10 0F 10287 .BYTE $0F ; ....####
BA11 03 10288 .BYTE $03 ; ......##
BA12 18 10289 .BYTE $18 ; ...##...
BA13 3C 10290 .BYTE $3C ; ..####..
BA14 7E 10291 .BYTE $7E ; .######.
BA15 7E 10292 .BYTE $7E ; .######.
BA16 DB 10293 .BYTE $DB ; ##.##.##
BA17 C3 10294 .BYTE $C3 ; ##....##
BA18 81 10295 .BYTE $81 ; #......#
BA19 81 10296 .BYTE $81 ; #......#
BA1A 81 10297 .BYTE $81 ; #......#
BA1B 10 10298 .BYTE $10 ; ...#....
BA1C 38 10299 .BYTE $38 ; ..###...
BA1D 7C 10300 .BYTE $7C ; .#####..
BA1E 7C 10301 .BYTE $7C ; .#####..
BA1F D6 10302 .BYTE $D6 ; ##.#.##.
BA20 C6 10303 .BYTE $C6 ; ##...##.
BA21 82 10304 .BYTE $82 ; #.....#.
BA22 82 10305 .BYTE $82 ; #.....#.
BA23 18 10306 .BYTE $18 ; ...##...
BA24 3C 10307 .BYTE $3C ; ..####..
BA25 3C 10308 .BYTE $3C ; ..####..
BA26 66 10309 .BYTE $66 ; .##..##.
BA27 66 10310 .BYTE $66 ; .##..##.
BA28 42 10311 .BYTE $42 ; .#....#.
BA29 42 10312 .BYTE $42 ; .#....#.
BA2A 10 10313 .BYTE $10 ; ...#....
BA2B 38 10314 .BYTE $38 ; ..###...
BA2C 38 10315 .BYTE $38 ; ..###...
BA2D 6C 10316 .BYTE $6C ; .##.##..
BA2E 44 10317 .BYTE $44 ; .#...#..
BA2F 44 10318 .BYTE $44 ; .#...#..
BA30 18 10319 .BYTE $18 ; ...##...
BA31 3C 10320 .BYTE $3C ; ..####..
BA32 24 10321 .BYTE $24 ; ..#..#..
BA33 24 10322 .BYTE $24 ; ..#..#..
BA34 10 10323 .BYTE $10 ; ...#....
BA35 38 10324 .BYTE $38 ; ..###...
BA36 28 10325 .BYTE $28 ; ..#.#...
BA37 18 10326 .BYTE $18 ; ...##...
BA38 3C 10327 .BYTE $3C ; ..####..
BA39 7E 10328 .BYTE $7E ; .######.
BA3A FF 10329 .BYTE $FF ; ########
BA3B 18 10330 .BYTE $18 ; ...##...
BA3C 18 10331 .BYTE $18 ; ...##...
BA3D FF 10332 .BYTE $FF ; ########
BA3E 7E 10333 .BYTE $7E ; .######.
BA3F 3C 10334 .BYTE $3C ; ..####..
BA40 18 10335 .BYTE $18 ; ...##...
BA41 10 10336 .BYTE $10 ; ...#....
BA42 38 10337 .BYTE $38 ; ..###...
BA43 7C 10338 .BYTE $7C ; .#####..
BA44 FE 10339 .BYTE $FE ; #######.
BA45 38 10340 .BYTE $38 ; ..###...
BA46 38 10341 .BYTE $38 ; ..###...
BA47 FE 10342 .BYTE $FE ; #######.
BA48 7C 10343 .BYTE $7C ; .#####..
BA49 38 10344 .BYTE $38 ; ..###...
BA4A 10 10345 .BYTE $10 ; ...#....
BA4B 18 10346 .BYTE $18 ; ...##...
BA4C 3C 10347 .BYTE $3C ; ..####..
BA4D 7E 10348 .BYTE $7E ; .######.
BA4E 18 10349 .BYTE $18 ; ...##...
BA4F 7E 10350 .BYTE $7E ; .######.
BA50 3C 10351 .BYTE $3C ; ..####..
BA51 18 10352 .BYTE $18 ; ...##...
BA52 10 10353 .BYTE $10 ; ...#....
BA53 38 10354 .BYTE $38 ; ..###...
BA54 7C 10355 .BYTE $7C ; .#####..
BA55 10 10356 .BYTE $10 ; ...#....
BA56 7C 10357 .BYTE $7C ; .#####..
BA57 38 10358 .BYTE $38 ; ..###...
BA58 10 10359 .BYTE $10 ; ...#....
BA59 18 10360 .BYTE $18 ; ...##...
BA5A 3C 10361 .BYTE $3C ; ..####..
BA5B 18 10362 .BYTE $18 ; ...##...
BA5C 3C 10363 .BYTE $3C ; ..####..
BA5D 18 10364 .BYTE $18 ; ...##...
BA5E 10 10365 .BYTE $10 ; ...#....
BA5F 38 10366 .BYTE $38 ; ..###...
BA60 38 10367 .BYTE $38 ; ..###...
BA61 10 10368 .BYTE $10 ; ...#....
10369
10370 ;*** Display List fragments ****************************************************
10371 ;
10372 ; LOCAL VARIABLES
=1000 10373 PFMEM.C0R0 = PFMEM+0*40 ; Start address of PLAYFIELD row 0
=10C8 10374 PFMEM.C0R5 = PFMEM+5*40 ; Start address of PLAYFIELD row 5
=12A8 10375 PFMEM.C0R17 = PFMEM+17*40 ; Start address of PLAYFIELD row 17
10376
10377 ;*** Display List fragment for Control Panel Display (bottom text window) ******
BA62 8D 10378 DLSTFRAG .BYTE $8D ; GR7 + DLI
BA63 00 10379 .BYTE $00 ; BLK1
BA64 464909 10380 .BYTE $46,<PANELTXT,>PANELTXT ; GR1 @ PANELTXT
BA67 20 10381 .BYTE $20 ; BLK3
BA68 06 10382 .BYTE $06 ; GR1
BA69 00 10383 .BYTE $00 ; BLK1
10384
10385 ;*** Display List fragment for Galactic Chart view *****************************
BA6A 012EA1 10386 DLSTFRAGGC .BYTE $01,<DLSTGC,>DLSTGC ; JMP @ DLSTGC
10387
10388 ;*** Display List fragment for Long-Range Scan view ****************************
BA6D 00 10389 DLSTFRAGLRS .BYTE $00 ; BLK1
BA6E 00 10390 .BYTE $00 ; BLK1
BA6F 46F8A0 10391 .BYTE $46,<LRSHEADER,>LRSHEADER ; GR1 @ LRSHEADER
BA72 4DC810 10392 .BYTE $4D,<PFMEM.C0R5,>PFMEM.C0R5 ; GR7 @ PFMEM.C0R5
10393
10394 ;*** Display List fragment for Aft view ****************************************
BA75 00 10395 DLSTFRAGAFT .BYTE $00 ; BLK1
BA76 00 10396 .BYTE $00 ; BLK1
BA77 4609A1 10397 .BYTE $46,<AFTHEADER,>AFTHEADER ; GR1 @ AFTHEADER
BA7A 4DC810 10398 .BYTE $4D,<PFMEM.C0R5,>PFMEM.C0R5 ; GR7 @ PFMEM.C0R5
10399
10400 ;*** Display List fragment for Front view and Title text line ******************
BA7D 4D0010 10401 DLSTFRAGFRONT .BYTE $4D,<PFMEM.C0R0,>PFMEM.C0R0 ; GR7 @ PFMEM.C0R0
BA80 0D 10402 .BYTE $0D ; GR7
BA81 0D 10403 .BYTE $0D ; GR7
BA82 0D 10404 .BYTE $0D ; GR7
BA83 0D 10405 .BYTE $0D ; GR7
BA84 0D 10406 .BYTE $0D ; GR7
BA85 30 10407 .BYTE $30 ; BLK4
BA86 461F0D 10408 .BYTE $46,<TITLETXT,>TITLETXT ; GR1 @ TITLETXT
BA89 4DA812 10409 .BYTE $4D,<PFMEM.C0R17,>PFMEM.C0R17 ; GR7 @ PFMEM.C0R17
10410
10411 ;*** Display List fragment offsets relative to DLSTFRAG ************************
BA8C 1B 10412 DLSTFRAGOFFTAB .BYTE DLSTFRAGFRONT-DLSTFRAG ; Front view
BA8D 13 10413 .BYTE DLSTFRAGAFT-DLSTFRAG ; Aft view
BA8E 0B 10414 .BYTE DLSTFRAGLRS-DLSTFRAG ; Long-Range Scan view
BA8F 08 10415 .BYTE DLSTFRAGGC-DLSTFRAG ; Galactic Chart view
10416
10417 ;*** 1-byte bit patterns for 4 pixels of same color for PLAYFIELD space objects
BA90 FF 10418 FOURCOLORPIXEL .BYTE $FF ; COLOR3
BA91 FF 10419 .BYTE $FF ; COLOR3
BA92 FF 10420 .BYTE $FF ; COLOR3
BA93 FF 10421 .BYTE $FF ; COLOR3
BA94 AA 10422 .BYTE $AA ; COLOR2
BA95 FF 10423 .BYTE $FF ; COLOR3
BA96 AA 10424 .BYTE $AA ; COLOR2
BA97 FF 10425 .BYTE $FF ; COLOR3
BA98 AA 10426 .BYTE $AA ; COLOR2
BA99 AA 10427 .BYTE $AA ; COLOR2
BA9A AA 10428 .BYTE $AA ; COLOR2
BA9B FF 10429 .BYTE $FF ; COLOR3
BA9C AA 10430 .BYTE $AA ; COLOR2
BA9D AA 10431 .BYTE $AA ; COLOR2
BA9E AA 10432 .BYTE $AA ; COLOR2
BA9F AA 10433 .BYTE $AA ; COLOR2
BAA0 AA 10434 .BYTE $AA ; COLOR2
BAA1 AA 10435 .BYTE $AA ; COLOR2
BAA2 AA 10436 .BYTE $AA ; COLOR2
BAA3 55 10437 .BYTE $55 ; COLOR1
BAA4 55 10438 .BYTE $55 ; COLOR1
BAA5 AA 10439 .BYTE $AA ; COLOR2
BAA6 55 10440 .BYTE $55 ; COLOR1
BAA7 AA 10441 .BYTE $AA ; COLOR2
BAA8 55 10442 .BYTE $55 ; COLOR1
BAA9 55 10443 .BYTE $55 ; COLOR1
BAAA 55 10444 .BYTE $55 ; COLOR1
BAAB AA 10445 .BYTE $AA ; COLOR2
BAAC 55 10446 .BYTE $55 ; COLOR1
BAAD 55 10447 .BYTE $55 ; COLOR1
BAAE 55 10448 .BYTE $55 ; COLOR1
BAAF 55 10449 .BYTE $55 ; COLOR1
10450
10451 ;*** Masks to filter 1 pixel (2 bits) from 4 pixels (1 byte of PLAYFIELD memory)
BAB0 C0 10452 PIXELMASKTAB .BYTE $C0 ; ##......
BAB1 30 10453 .BYTE $30 ; ..##....
BAB2 0C 10454 .BYTE $0C ; ....##..
BAB3 03 10455 .BYTE $03 ; ......##
10456
10457 ;*** Velocity table ************************************************************
BAB4 00 10458 VELOCITYTAB .BYTE 0 ; Speed 0 = 0 <KM/H>
BAB5 01 10459 .BYTE 1 ; Speed 1 = 1 <KM/H>
BAB6 02 10460 .BYTE 2 ; Speed 2 = 2 <KM/H>
BAB7 04 10461 .BYTE 4 ; Speed 3 = 4 <KM/H>
BAB8 08 10462 .BYTE 8 ; Speed 4 = 8 <KM/H>
BAB9 10 10463 .BYTE 16 ; Speed 5 = 16 <KM/H>
BABA 20 10464 .BYTE 32 ; Speed 6 = 32 <KM/H>
BABB 40 10465 .BYTE 64 ; Speed 7 = 64 <KM/H>
BABC 60 10466 .BYTE 96 ; Speed 8 = 96 <KM/H>
BABD 70 10467 .BYTE 112 ; Speed 9 = 112 <KM/H>
10468
10469 ;*** Keyboard code lookup table ************************************************
BABE F2 10470 KEYTAB .BYTE $F2 ; '0' - Speed 0
BABF DF 10471 .BYTE $DF ; '1' - Speed 1
BAC0 DE 10472 .BYTE $DE ; '2' - Speed 2
BAC1 DA 10473 .BYTE $DA ; '3' - Speed 3
BAC2 D8 10474 .BYTE $D8 ; '4' - Speed 4
BAC3 DD 10475 .BYTE $DD ; '5' - Speed 5
BAC4 DB 10476 .BYTE $DB ; '6' - Speed 6
BAC5 F3 10477 .BYTE $F3 ; '7' - Speed 7
BAC6 F5 10478 .BYTE $F5 ; '8' - Speed 8
BAC7 F0 10479 .BYTE $F0 ; '9' - Speed 9
BAC8 F8 10480 .BYTE $F8 ; 'F' - Front view
BAC9 FF 10481 .BYTE $FF ; 'A' - Aft view
BACA C0 10482 .BYTE $C0 ; 'L' - Long-Range Scan view
BACB FD 10483 .BYTE $FD ; 'G' - Galactic Chart view
BACC ED 10484 .BYTE $ED ; 'T' - Tracking on/off
BACD FE 10485 .BYTE $FE ; 'S' - Shields on/off
BACE D2 10486 .BYTE $D2 ; 'C' - Attack Computer on/off
BACF F9 10487 .BYTE $F9 ; 'H' - Hyperwarp
BAD0 E5 10488 .BYTE $E5 ; 'M' - Manual Target Selector
BAD1 CA 10489 .BYTE $CA ; 'P' - Pause
BAD2 E7 10490 .BYTE $E7 ; 'INV' - Abort Mission
10491
10492 ;*** Engines energy drain rates per game loop iteration in energy subunits *****
BAD3 00 10493 DRAINRATETAB .BYTE 0 ;
BAD4 04 10494 .BYTE 4 ;
BAD5 06 10495 .BYTE 6 ;
BAD6 08 10496 .BYTE 8 ;
BAD7 0A 10497 .BYTE 10 ;
BAD8 0C 10498 .BYTE 12 ;
BAD9 0E 10499 .BYTE 14 ;
BADA 1E 10500 .BYTE 30 ;
BADB 2D 10501 .BYTE 45 ;
BADC 3C 10502 .BYTE 60 ;
10503
10504 ;*** Hyperwarp energy depending on distance ************************************
BADD 0A 10505 WARPENERGYTAB .BYTE 10 ; = 100 energy units
BADE 0D 10506 .BYTE 13 ; = 130 energy units
BADF 10 10507 .BYTE 16 ; = 160 energy units
BAE0 14 10508 .BYTE 20 ; = 200 energy units
BAE1 17 10509 .BYTE 23 ; = 230 energy units
BAE2 32 10510 .BYTE 50 ; = 500 energy units
BAE3 46 10511 .BYTE 70 ; = 700 energy units
BAE4 50 10512 .BYTE 80 ; = 800 energy units
BAE5 5A 10513 .BYTE 90 ; = 900 energy units
BAE6 78 10514 .BYTE 120 ; = 1200 energy units
BAE7 7D 10515 .BYTE 125 ; = 1250 energy units
BAE8 82 10516 .BYTE 130 ; = 1300 energy units
BAE9 87 10517 .BYTE 135 ; = 1350 energy units
BAEA 8C 10518 .BYTE 140 ; = 1400 energy units
BAEB 9B 10519 .BYTE 155 ; = 1550 energy units
BAEC AA 10520 .BYTE 170 ; = 1700 energy units
BAED B8 10521 .BYTE 184 ; = 1840 energy units
BAEE C8 10522 .BYTE 200 ; = 2000 energy units
BAEF D0 10523 .BYTE 208 ; = 2080 energy units
BAF0 D8 10524 .BYTE 216 ; = 2160 energy units
BAF1 DF 10525 .BYTE 223 ; = 2230 energy units
BAF2 E8 10526 .BYTE 232 ; = 2320 energy units
BAF3 F1 10527 .BYTE 241 ; = 2410 energy units
BAF4 FA 10528 .BYTE 250 ; = 2500 energy units
10529
10530 ;*** Joystick increments *******************************************************
BAF5 00 10531 STICKINCTAB .BYTE 0 ; Centered
BAF6 01 10532 .BYTE 1 ; Right or up
BAF7 FF 10533 .BYTE -1 ; Left or down
BAF8 00 10534 .BYTE 0 ; Centered
10535
10536 ;*** 3-byte elements to draw cross hairs and Attack Computer Display ***********
10537 ; Byte 1 : Pixel column number of line start
10538 ; Byte 2 : Pixel row number of line start
10539 ; Byte 3 : B7 = 0 -> Draw line to the right
10540 ; B7 = 1 -> Draw line down
10541 ; B6..0 -> Length of line in pixels. Possible values are: 0..127.
10542 ;
10543 ; #
10544 ; # 4
10545 ; # ##############################
10546 ; #1 # # #
10547 ; # # #11 #
10548 ; # # # #
10549 ; # #5 # 8 #6
10550 ; # ############### #
10551 ; # # # #
10552 ; 15 16 # 7 # # 10 #
10553 ; ############### ############### ######## #########
10554 ; # #12 # #
10555 ; # # #13 #
10556 ; # ############### #
10557 ; # # 9 # #
10558 ; # # # #
10559 ; # # #14 #
10560 ; # # 3 # #
10561 ; #2 ##############################
10562 ; #
10563 ; #
10564 ;
10565 ; Front/Aft Cross Hairs Attack Computer Display
10566 ;
10567 ; LOCAL VARIABLES
=0080 10568 DOWN = $80
=0000 10569 RIGHT = $00
10570
BAF9 502887 10571 DRAWLINESTAB .BYTE 80,40,DOWN!7 ; Line 1
BAFC 503687 10572 .BYTE 80,54,DOWN!7 ; Line 2
10573
BAFF 77461E 10574 .BYTE 119,70,RIGHT!30 ; Line 3
BB02 77561E 10575 .BYTE 119,86,RIGHT!30 ; Line 4
BB05 774691 10576 .BYTE 119,70,DOWN!17 ; Line 5
BB08 944691 10577 .BYTE 148,70,DOWN!17 ; Line 6
BB0B 784E06 10578 .BYTE 120,78,RIGHT!6 ; Line 7
BB0E 7E4B0F 10579 .BYTE 126,75,RIGHT!15 ; Line 8
BB11 7E510F 10580 .BYTE 126,81,RIGHT!15 ; Line 9
BB14 8D4E07 10581 .BYTE 141,78,RIGHT!7 ; Line 10
BB17 854784 10582 .BYTE 133,71,DOWN!4 ; Line 11
BB1A 7E4C85 10583 .BYTE 126,76,DOWN!5 ; Line 12
BB1D 8C4C85 10584 .BYTE 140,76,DOWN!5 ; Line 13
BB20 855284 10585 .BYTE 133,82,DOWN!4 ; Line 14
10586
BB23 3E320F 10587 .BYTE 62,50,RIGHT!15 ; Line 15
BB26 54320F 10588 .BYTE 84,50,RIGHT!15 ; Line 16
BB29 FE 10589 .BYTE $FE ; End marker
10590
10591 ;*** 3-byte elements to draw our starship's shape in Long-Range Scan view ******
10592 ;
10593 ; Line 17 18 19 20 21
10594 ; ##
10595 ; ##
10596 ; ## ## ##
10597 ; ## ## ## ## ##
10598 ; ## ## ##
10599
BB2A 4E3582 10600 .BYTE 78,53,DOWN!2 ; Line 17
BB2D 4F3482 10601 .BYTE 79,52,DOWN!2 ; Line 18
BB30 503285 10602 .BYTE 80,50,DOWN!5 ; Line 19
BB33 513482 10603 .BYTE 81,52,DOWN!2 ; Line 20
BB36 523582 10604 .BYTE 82,53,DOWN!2 ; Line 21
BB39 FE 10605 .BYTE $FE ; End marker
10606
10607 ;*** Initial x and y coordinates of a star during hyperwarp ********************
10608 ; The following two tables are used to determine the initial x and y coordinates
10609 ; (high byte) of a star during hyperwarp. An index in 0..3 picks both the x and
10610 ; y coordinate, thus 4 pairs of coordinates are possible:
10611 ;
10612 ; Y +-------+----------------------------+----------------------------+
10613 ; ^ | Index | x-coordinate | y-coordinate |
10614 ; | +-------+----------------------------+----------------------------+
10615 ; |.32. | 0 | +1024..+1279 (+$04**) <KM> | +512..+767 (+$02**) <KM> |
10616 ; |...1 | 1 | +1024..+1279 (+$04**) <KM> | +768..+1023 (+$03**) <KM> |
10617 ; |...0 | 2 | +768..+1023 (+$03**) <KM> | +1024..+1279 (+$04**) <KM> |
10618 ; |.... | 3 | +512..+767 (+$02**) <KM> | +1024..+1279 (+$04**) <KM> |
10619 ; 0----->X +-------+----------------------------+----------------------------+
10620
10621 ;*** Initial x-coordinate (high byte) of star in hyperwarp *********************
BB3A 04 10622 WARPSTARXTAB .BYTE $04 ; +1024..+1279 (+$04**) <KM>
BB3B 04 10623 .BYTE $04 ; +1024..+1279 (+$04**) <KM>
BB3C 03 10624 .BYTE $03 ; +768..+1023 (+$03**) <KM>
BB3D 02 10625 .BYTE $02 ; +512..+767 (+$02**) <KM>
10626
10627 ;*** Initial y-coordinate (high byte) of star in hyperwarp *********************
BB3E 02 10628 WARPSTARYTAB .BYTE $02 ; +512..+767 (+$02**) <KM>
BB3F 03 10629 .BYTE $03 ; +768..+1023 (+$03**) <KM>
BB40 04 10630 .BYTE $04 ; +1024..+1279 (+$04**) <KM>
BB41 04 10631 .BYTE $04 ; +1024..+1279 (+$04**) <KM>
10632
10633 ;*** Text of Control Panel Display (encoded in custom character set) ***********
10634 ; Row 1: "V:00 K:00 E:9999 T:0"
10635 ; Row 2: " O:-00 O:-00 R:-000 "
10636
BB42 12 10637 PANELTXTTAB .BYTE CCS.V
BB43 0B 10638 .BYTE CCS.COLON
BB44 00 10639 .BYTE CCS.0
BB45 00 10640 .BYTE CCS.0
BB46 0A 10641 .BYTE CCS.SPC
BB47 55 10642 .BYTE CCS.COL1!CCS.K
BB48 4B 10643 .BYTE CCS.COL1!CCS.COLON
BB49 40 10644 .BYTE CCS.COL1!CCS.0
BB4A 40 10645 .BYTE CCS.COL1!CCS.0
BB4B 0A 10646 .BYTE CCS.SPC
BB4C 8D 10647 .BYTE CCS.COL2!CCS.E
BB4D 8B 10648 .BYTE CCS.COL2!CCS.COLON
BB4E 89 10649 .BYTE CCS.COL2!CCS.9
BB4F 89 10650 .BYTE CCS.COL2!CCS.9
BB50 89 10651 .BYTE CCS.COL2!CCS.9
BB51 89 10652 .BYTE CCS.COL2!CCS.9
BB52 0A 10653 .BYTE CCS.SPC
BB53 16 10654 .BYTE CCS.T
BB54 0B 10655 .BYTE CCS.COLON
BB55 00 10656 .BYTE CCS.0
10657
BB56 0A 10658 .BYTE CCS.SPC
BB57 14 10659 .BYTE CCS.THETA
BB58 0B 10660 .BYTE CCS.COLON
BB59 0F 10661 .BYTE CCS.MINUS
BB5A 00 10662 .BYTE CCS.0
BB5B 00 10663 .BYTE CCS.0
BB5C 0A 10664 .BYTE CCS.SPC
BB5D 51 10665 .BYTE CCS.COL1!CCS.PHI
BB5E 4B 10666 .BYTE CCS.COL1!CCS.COLON
BB5F 0F 10667 .BYTE CCS.MINUS
BB60 00 10668 .BYTE CCS.0
BB61 00 10669 .BYTE CCS.0
BB62 0A 10670 .BYTE CCS.SPC
BB63 93 10671 .BYTE CCS.COL2!CCS.R
BB64 8B 10672 .BYTE CCS.COL2!CCS.COLON
BB65 0F 10673 .BYTE CCS.MINUS
BB66 00 10674 .BYTE CCS.0
BB67 00 10675 .BYTE CCS.0
BB68 00 10676 .BYTE CCS.0
BB69 0A 10677 .BYTE CCS.SPC
10678
10679 ;*** Text of Galactic Chart Panel Display **************************************
10680 ; Row 1: "WARP ENERGY: 0 "
10681 ; Row 2: "TARGETS: DC:PESCLR "
10682 ; Row 3: "STAR DATE:00.00 "
10683
BB6A 37 10684 .BYTE ROM.W
BB6B 21 10685 .BYTE ROM.A
BB6C 32 10686 .BYTE ROM.R
BB6D 30 10687 .BYTE ROM.P
BB6E 00 10688 .BYTE ROM.SPC
BB6F 25 10689 .BYTE ROM.E
BB70 2E 10690 .BYTE ROM.N
BB71 25 10691 .BYTE ROM.E
BB72 32 10692 .BYTE ROM.R
BB73 27 10693 .BYTE ROM.G
BB74 39 10694 .BYTE ROM.Y
BB75 1A 10695 .BYTE ROM.COLON
BB76 00 10696 .BYTE ROM.SPC
BB77 00 10697 .BYTE ROM.SPC
BB78 00 10698 .BYTE ROM.SPC
BB79 10 10699 .BYTE ROM.0
BB7A 00 10700 .BYTE ROM.SPC
BB7B 00 10701 .BYTE ROM.SPC
BB7C 00 10702 .BYTE ROM.SPC
BB7D 00 10703 .BYTE ROM.SPC
10704
BB7E B4 10705 .BYTE CCS.COL2!ROM.T
BB7F A1 10706 .BYTE CCS.COL2!ROM.A
BB80 B2 10707 .BYTE CCS.COL2!ROM.R
BB81 A7 10708 .BYTE CCS.COL2!ROM.G
BB82 A5 10709 .BYTE CCS.COL2!ROM.E
BB83 B4 10710 .BYTE CCS.COL2!ROM.T
BB84 B3 10711 .BYTE CCS.COL2!ROM.S
BB85 9A 10712 .BYTE CCS.COL2!ROM.COLON
BB86 00 10713 .BYTE ROM.SPC
BB87 00 10714 .BYTE ROM.SPC
BB88 24 10715 .BYTE ROM.D
BB89 23 10716 .BYTE ROM.C
BB8A 1A 10717 .BYTE ROM.COLON
BB8B 30 10718 .BYTE ROM.P
BB8C 25 10719 .BYTE ROM.E
BB8D 33 10720 .BYTE ROM.S
BB8E 23 10721 .BYTE ROM.C
BB8F 2C 10722 .BYTE ROM.L
BB90 32 10723 .BYTE ROM.R
BB91 00 10724 .BYTE ROM.SPC
10725
BB92 F3 10726 .BYTE CCS.COL3!ROM.S
BB93 F4 10727 .BYTE CCS.COL3!ROM.T
BB94 E1 10728 .BYTE CCS.COL3!ROM.A
BB95 F2 10729 .BYTE CCS.COL3!ROM.R
BB96 00 10730 .BYTE ROM.SPC
BB97 E4 10731 .BYTE CCS.COL3!ROM.D
BB98 E1 10732 .BYTE CCS.COL3!ROM.A
BB99 F4 10733 .BYTE CCS.COL3!ROM.T
BB9A E5 10734 .BYTE CCS.COL3!ROM.E
BB9B DA 10735 .BYTE CCS.COL3!ROM.COLON
BB9C D0 10736 .BYTE CCS.COL3!ROM.0
BB9D D0 10737 .BYTE CCS.COL3!ROM.0
BB9E CE 10738 .BYTE CCS.COL3!ROM.DOT
BB9F D0 10739 .BYTE CCS.COL3!ROM.0
BBA0 D0 10740 .BYTE CCS.COL3!ROM.0
BBA1 00 10741 .BYTE ROM.SPC
BBA2 00 10742 .BYTE ROM.SPC
BBA3 00 10743 .BYTE ROM.SPC
BBA4 00 10744 .BYTE ROM.SPC
BBA5 00 10745 .BYTE ROM.SPC
10746
10747 ;*** Galactic Chart sector type table ******************************************
BBA6 CF 10748 SECTORTYPETAB .BYTE $CF ; Starbase
BBA7 04 10749 .BYTE $04 ; 4 Zylon ships
BBA8 03 10750 .BYTE $03 ; 3 Zylon ships
BBA9 02 10751 .BYTE $02 ; 1 or 2 Zylon ships
10752
10753 ;*** Phrase table **************************************************************
10754 ; Phrases consist of phrase tokens. These are bytes that encode words, segments
10755 ; (multiple words that fit into a single line of text), and how they are displayed.
10756 ;
10757 ; LOCAL VARIABLES
=0040 10758 EOP = $40 ; End of phrase
=0080 10759 EOS = $80 ; End of segment
=00C0 10760 LONG = $C0 ; Display title phrase for a long time
10761
10762 ; Title Phrase Offset, Text
BBAA 00 10763 PHRASETAB .BYTE $00 ; (unused)
BBAB 050642 10764 .BYTE $05,$06,$02!EOP ; $01 "ATTACK COMPUTER ON"
BBAE 050643 10765 .BYTE $05,$06,$03!EOP ; $04 "ATTACK COMPUTER OFF"
BBB1 0442 10766 .BYTE $04,$02!EOP ; $07 "SHIELDS ON"
BBB3 0443 10767 .BYTE $04,$03!EOP ; $09 "SHIELDS OFF"
BBB5 060742 10768 .BYTE $06,$07,$02!EOP ; $0B "COMPUTER TRACKING ON"
BBB8 0743 10769 .BYTE $07,$03!EOP ; $0E "TRACKING OFF"
BBBA 48 10770 .BYTE $08!EOP ; $10 "WHATS WRONG?"
BBBB 094A 10771 .BYTE $09,$0A!EOP ; $11 "HYPERWARP ENGAGED"
BBBD 0BCD 10772 .BYTE $0B,$0D!LONG ; $13 "STARBASE SURROUNDED"
BBBF 0BCC 10773 .BYTE $0B,$0C!LONG ; $15 "STARBASE DESTROYED"
BBC1 094E 10774 .BYTE $09,$0E!EOP ; $17 "HYPERWARP ABORTED"
BBC3 094F 10775 .BYTE $09,$0F!EOP ; $19 "HYPERWARP COMPLETE"
BBC5 D0 10776 .BYTE $10!LONG ; $1B "HYPERSPACE"
BBC6 1192 10777 .BYTE $11,$12!EOS ; $1C "ORBIT ESTABLISHED"
BBC8 56 10778 .BYTE $16!EOP ; $1E "STANDBY"
BBC9 134E 10779 .BYTE $13,$0E!EOP ; $1F "DOCKING ABORTED"
BBCB 154F 10780 .BYTE $15,$0F!EOP ; $21 "TRANSFER COMPLETE"
BBCD B8 10781 .BYTE $38!EOS ; $23 " "
BBCE 97 10782 .BYTE $17!EOS ; $24 "STAR FLEET TO"
BBCF 99 10783 .BYTE $19!EOS ; $25 "ALL UNITS"
BBD0 98 10784 .BYTE $18!EOS ; $26 "STAR CRUISER 7"
BBD1 8C 10785 .BYTE $0C!EOS ; $27 "DESTROYED"
BBD2 9D 10786 .BYTE $1D!EOS ; $28 "BY ZYLON FIRE"
BBD3 1E9F 10787 .BYTE $1E,$1F!EOS ; $29 "POSTHUMOUS RANK IS:"
BBD5 FD 10788 .BYTE $FD ; $2B "<PLACEHOLDER FOR RANK>"
BBD6 25FC 10789 .BYTE $25,$FC ; $2C "CLASS <PLACEHOLDER FOR CLASS>"
BBD8 78 10790 .BYTE $38!EOP ; $2E " "
BBD9 9B 10791 .BYTE $1B!EOS ; $2F "STAR RAIDERS"
BBDA 60 10792 .BYTE $20!EOP ; $30 "COPYRIGHT ATARI 1979"
BBDB B8 10793 .BYTE $38!EOS ; $31 " "
BBDC 97 10794 .BYTE $17!EOS ; $32 "STAR FLEET TO"
BBDD 98 10795 .BYTE $18!EOS ; $33 "STAR CRUISER 7"
BBDE 1A8E 10796 .BYTE $1A,$0E!EOS ; $34 "MISSION ABORTED"
BBE0 1C94 10797 .BYTE $1C,$14!EOS ; $36 "ZERO ENERGY"
BBE2 249F 10798 .BYTE $24,$1F!EOS ; $38 "NEW RANK IS"
BBE4 FD 10799 .BYTE $FD ; $3A "<PLACEHOLDER FOR RANK>"
BBE5 25FC 10800 .BYTE $25,$FC ; $3B "CLASS <PLACEHOLDER FOR CLASS>"
BBE7 A7 10801 .BYTE $27!EOS ; $3D "REPORT TO BASE"
BBE8 68 10802 .BYTE $28!EOP ; $3E "FOR TRAINING"
BBE9 B8 10803 .BYTE $38!EOS ; $3F " "
BBEA 97 10804 .BYTE $17!EOS ; $40 "STAR FLEET TO"
BBEB 98 10805 .BYTE $18!EOS ; $41 "STAR CRUISER 7"
BBEC 1A8F 10806 .BYTE $1A,$0F!EOS ; $42 "MISSION COMPLETE"
BBEE 249F 10807 .BYTE $24,$1F!EOS ; $44 "NEW RANK IS:"
BBF0 FD 10808 .BYTE $FD ; $46 "<PLACEHOLDER FOR RANK>"
BBF1 25FC 10809 .BYTE $25,$FC ; $47 "CLASS <PLACEHOLDER FOR CLASS>"
BBF3 66 10810 .BYTE $26!EOP ; $49 "CONGRATULATIONS"
BBF4 2C5A 10811 .BYTE $2C,$1A!EOP ; $4A "NOVICE MISSION"
BBF6 2E5A 10812 .BYTE $2E,$1A!EOP ; $4C "PILOT MISSION"
BBF8 315A 10813 .BYTE $31,$1A!EOP ; $4E "WARRIOR MISSION"
BBFA 335A 10814 .BYTE $33,$1A!EOP ; $50 "COMMANDER MISSION"
BBFC B8 10815 .BYTE $38!EOS ; $52 " "
BBFD 3476 10816 .BYTE $34,$36!EOP ; $53 "DAMAGE CONTROL"
BBFF 37B5 10817 .BYTE $37,$35!EOS ; $55 "PHOTONS DAMAGED"
BC01 78 10818 .BYTE $38!EOP ; $57 " "
BC02 378C 10819 .BYTE $37,$0C!EOS ; $58 "PHOTONS DESTROYED"
BC04 78 10820 .BYTE $38!EOP ; $5A " "
BC05 23B5 10821 .BYTE $23,$35!EOS ; $5B "ENGINES DAMAGED"
BC07 78 10822 .BYTE $38!EOP ; $5D " "
BC08 238C 10823 .BYTE $23,$0C!EOS ; $5E "ENGINES DESTROYED"
BC0A 78 10824 .BYTE $38!EOP ; $60 " "
BC0B 04B5 10825 .BYTE $04,$35!EOS ; $61 "SHIELDS DAMAGED"
BC0D 78 10826 .BYTE $38!EOP ; $63 " "
BC0E 048C 10827 .BYTE $04,$0C!EOS ; $64 "SHIELDS DESTROYED"
BC10 78 10828 .BYTE $38!EOP ; $66 " "
BC11 06B5 10829 .BYTE $06,$35!EOS ; $67 "COMPUTER DAMAGED"
BC13 78 10830 .BYTE $38!EOP ; $69 " "
BC14 068C 10831 .BYTE $06,$0C!EOS ; $6A "COMPUTER DESTROYED"
BC16 78 10832 .BYTE $38!EOP ; $6C " "
BC17 A2 10833 .BYTE $22!EOS ; $6D "SECTOR SCAN"
BC18 75 10834 .BYTE $35!EOP ; $6E "DAMAGED"
BC19 A2 10835 .BYTE $22!EOS ; $6F "SECTOR SCAN"
BC1A 4C 10836 .BYTE $0C!EOP ; $70 "DESTROYED"
BC1B A1 10837 .BYTE $21!EOS ; $71 "SUB-SPACE RADIO"
BC1C 75 10838 .BYTE $35!EOP ; $72 "DAMAGED"
BC1D A1 10839 .BYTE $21!EOS ; $73 "SUB-SPACE RADIO"
BC1E 4C 10840 .BYTE $0C!EOP ; $74 "DESTROYED"
BC1F C1 10841 .BYTE $01!LONG ; $75 "RED ALERT"
BC20 B8 10842 .BYTE $38!EOS ; $76 " "
BC21 97 10843 .BYTE $17!EOS ; $77 "STAR FLEET TO"
BC22 98 10844 .BYTE $18!EOS ; $78 "STAR CRUISER 7"
BC23 1A8E 10845 .BYTE $1A,$0E!EOS ; $79 "MISSION ABORTED"
BC25 249F 10846 .BYTE $24,$1F!EOS ; $7B "NEW RANK IS:"
BC27 FD 10847 .BYTE $FD ; $7D "<PLACEHOLDER FOR RANK>"
BC28 25FC 10848 .BYTE $25,$FC ; $7E "CLASS <PLACEHOLDER FOR CLASS>"
BC2A 66 10849 .BYTE $26!EOP ; $80 "CONGRATULATIONS"
10850
10851 ;*** Word table ****************************************************************
10852 ; Bit B7 of the first byte of a word is the end-of-word marker of the preceding
10853 ; word
10854 ;
10855 ; LOCAL VARIABLES
=0080 10856 EOW = $80 ; End of word
10857
BC2B A0202020 10858 WORDTAB .BYTE EOW!$20," RED ALERT" ; Word $01
BC2F 20524544
BC33 20414C45
BC37 5254
BC39 CF4E 10859 .BYTE EOW!'O,"N" ; Word $02
BC3B CF4646 10860 .BYTE EOW!'O,"FF" ; Word $03
BC3E D3484945 10861 .BYTE EOW!'S,"HIELDS" ; Word $04
BC42 4C4453
BC45 C1545441 10862 .BYTE EOW!'A,"TTACK" ; Word $05
BC49 434B
BC4B C34F4D50 10863 .BYTE EOW!'C,"OMPUTER" ; Word $06
BC4F 55544552
BC53 D4524143 10864 .BYTE EOW!'T,"RACKING" ; Word $07
BC57 4B494E47
BC5B D7484154 10865 .BYTE EOW!'W,"HATS WRONG?" ; Word $08
BC5F 53205752
BC63 4F4E473F
BC67 C8595045 10866 .BYTE EOW!'H,"YPERWARP" ; Word $09
BC6B 52574152
BC6F 50
BC70 C54E4741 10867 .BYTE EOW!'E,"NGAGED" ; Word $0A
BC74 474544
BC77 D3544152 10868 .BYTE EOW!'S,"TARBASE" ; Word $0B
BC7B 42415345
BC7F C4455354 10869 .BYTE EOW!'D,"ESTROYED" ; Word $0C
BC83 524F5945
BC87 44
BC88 D3555252 10870 .BYTE EOW!'S,"URROUNDED" ; Word $0D
BC8C 4F554E44
BC90 4544
BC92 C1424F52 10871 .BYTE EOW!'A,"BORTED" ; Word $0E
BC96 544544
BC99 C34F4D50 10872 .BYTE EOW!'C,"OMPLETE" ; Word $0F
BC9D 4C455445
BCA1 C8595045 10873 .BYTE EOW!'H,"YPERSPACE" ; Word $10
BCA5 52535041
BCA9 4345
BCAB CF524249 10874 .BYTE EOW!'O,"RBIT" ; Word $11
BCAF 54
BCB0 C5535441 10875 .BYTE EOW!'E,"STABLISHED" ; Word $12
BCB4 424C4953
BCB8 484544
BCBB C44F434B 10876 .BYTE EOW!'D,"OCKING" ; Word $13
BCBF 494E47
BCC2 C54E4552 10877 .BYTE EOW!'E,"NERGY" ; Word $14
BCC6 4759
BCC8 D452414E 10878 .BYTE EOW!'T,"RANSFER" ; Word $15
BCCC 53464552
BCD0 D354414E 10879 .BYTE EOW!'S,"TANDBY" ; Word $16
BCD4 444259
BCD7 D3544152 10880 .BYTE EOW!'S,"TAR FLEET TO" ; Word $17
BCDB 20464C45
BCDF 45542054
BCE3 4F
BCE4 D3544152 10881 .BYTE EOW!'S,"TAR CRUISER 7" ; Word $18
BCE8 20435255
BCEC 49534552
BCF0 2037
BCF2 C14C4C20 10882 .BYTE EOW!'A,"LL UNITS" ; Word $19
BCF6 554E4954
BCFA 53
BCFB CD495353 10883 .BYTE EOW!'M,"ISSION" ; Word $1A
BCFF 494F4E
BD02 A0202020 10884 .BYTE EOW!$20," STAR RAIDERS" ; Word $1B
BD06 53544152
BD0A 20524149
BD0E 44455253
BD12 DA45524F 10885 .BYTE EOW!'Z,"ERO" ; Word $1C
BD16 C259205A 10886 .BYTE EOW!'B,"Y ZYLON FIRE" ; Word $1D
BD1A 594C4F4E
BD1E 20464952
BD22 45
BD23 D04F5354 10887 .BYTE EOW!'P,"OSTHUMOUS" ; Word $1E
BD27 48554D4F
BD2B 5553
BD2D D2414E4B 10888 .BYTE EOW!'R,"ANK IS:" ; Word $1F
BD31 2049533A
BD35 C34F5059 10889 .BYTE EOW!'C,"OPYRIGHT ATARI 1979" ; Word $20
BD39 52494748
BD3D 54204154
BD41 41524920
BD45 31393739
BD49 D355422D 10890 .BYTE EOW!'S,"UB-SPACE RADIO" ; Word $21
BD4D 53504143
BD51 45205241
BD55 44494F
BD58 D3454354 10891 .BYTE EOW!'S,"ECTOR SCAN" ; Word $22
BD5C 4F522053
BD60 43414E
BD63 C54E4749 10892 .BYTE EOW!'E,"NGINES" ; Word $23
BD67 4E4553
BD6A CE4557 10893 .BYTE EOW!'N,"EW" ; Word $24
BD6D C34C4153 10894 .BYTE EOW!'C,"LASS" ; Word $25
BD71 53
BD72 C34F4E47 10895 .BYTE EOW!'C,"ONGRATULATIONS" ; Word $26
BD76 52415455
BD7A 4C415449
BD7E 4F4E53
BD81 D245504F 10896 .BYTE EOW!'R,"EPORT TO BASE" ; Word $27
BD85 52542054
BD89 4F204241
BD8D 5345
BD8F C64F5220 10897 .BYTE EOW!'F,"OR TRAINING" ; Word $28
BD93 54524149
BD97 4E494E47
BD9B C7414C41 10898 .BYTE EOW!'G,"ALACTIC COOK" ; Word $29
BD9F 43544943
BDA3 20434F4F
BDA7 4B
BDA8 C7415242 10899 .BYTE EOW!'G,"ARBAGE SCOW CAPTAIN" ; Word $2A
BDAC 41474520
BDB0 53434F57
BDB4 20434150
BDB8 5441494E
BDBC D24F4F4B 10900 .BYTE EOW!'R,"OOKIE" ; Word $2B
BDC0 4945
BDC2 CE4F5649 10901 .BYTE EOW!'N,"OVICE" ; Word $2C
BDC6 4345
BDC8 C54E5349 10902 .BYTE EOW!'E,"NSIGN" ; Word $2D
BDCC 474E
BDCE D0494C4F 10903 .BYTE EOW!'P,"ILOT" ; Word $2E
BDD2 54
BDD3 C14345 10904 .BYTE EOW!'A,"CE" ; Word $2F
BDD6 CC494555 10905 .BYTE EOW!'L,"IEUTENANT" ; Word $30
BDDA 54454E41
BDDE 4E54
BDE0 D7415252 10906 .BYTE EOW!'W,"ARRIOR" ; Word $31
BDE4 494F52
BDE7 C3415054 10907 .BYTE EOW!'C,"APTAIN" ; Word $32
BDEB 41494E
BDEE C34F4D4D 10908 .BYTE EOW!'C,"OMMANDER" ; Word $33
BDF2 414E4445
BDF6 52
BDF7 C4414D41 10909 .BYTE EOW!'D,"AMAGE" ; Word $34
BDFB 4745
BDFD C4414D41 10910 .BYTE EOW!'D,"AMAGED" ; Word $35
BE01 474544
BE04 C34F4E54 10911 .BYTE EOW!'C,"ONTROL" ; Word $36
BE08 524F4C
BE0B D0484F54 10912 .BYTE EOW!'P,"HOTONS" ; Word $37
BE0F 4F4E53
BE12 A0 10913 .BYTE EOW!$20 ; Word $38
BE13 D3544152 10914 .BYTE EOW!'S,"TAR COMMANDER" ; Word $39
BE17 20434F4D
BE1B 4D414E44
BE1F 4552
BE21 80 10915 .BYTE EOW!$00 ;
10916
10917 ;*** View modes ****************************************************************
BE22 00 10918 VIEWMODETAB .BYTE $00 ; Front view
BE23 01 10919 .BYTE $01 ; Aft view
BE24 40 10920 .BYTE $40 ; Long-Range Scan view
BE25 80 10921 .BYTE $80 ; Galactic Chart view
10922
10923 ;*** Title phrase offsets of "TRACKING OFF", "SHIELDS OFF", "COMPUTER OFF" *****
BE26 0E 10924 MSGOFFTAB .BYTE $0E ; "TRACKING OFF"
BE27 09 10925 .BYTE $09 ; "SHIELDS OFF"
BE28 04 10926 .BYTE $04 ; "COMPUTER OFF"
10927
10928 ;*** Masks to test if Tracking Computer, Shields, or Attack Computer are on ****
BE29 FF 10929 MSGBITTAB .BYTE $FF ; Mask Tracking Computer
BE2A 08 10930 .BYTE $08 ; Mask Shields
BE2B 02 10931 .BYTE $02 ; Mask Attack Computer
10932
10933 ;*** Title phrase offsets of "COMPUTER TRACKING ON", "SHIELDS ON", "COMPUTER ON"
BE2C 0B 10934 MSGONTAB .BYTE $0B ; "COMPUTER TRACKING ON"
BE2D 07 10935 .BYTE $07 ; "SHIELDS ON"
BE2E 01 10936 .BYTE $01 ; "COMPUTER ON"
10937
10938 ;*** The following two tables encode the PLAYER shapes *************************
10939 ;
10940 ; PHOTON TORPEDO (shape type 0, data in shape table PLSHAP1TAB)
10941 ; Numbers at top indicate the shape table offset of the first and last shape row
10942 ;
10943 ; $01..$10 $11..$1E $1F..$2A $2B..$34 $35..$3C $3D..$42 $75..$76 $7A..$7B
10944 ; ...##... ...#.... ...##... ...#.... ...#.... ...#.... ...##... ...#....
10945 ; ..####.. ..###... ..####.. ..###... ...##... ..###... ...##... ...#....
10946 ; .######. .#####.. ..####.. ..###... ..####.. ..###...
10947 ; .######. .#####.. .######. .#####.. ..#.##.. ..#.#...
10948 ; .###.##. #######. .##.###. .###.#.. ..####.. ..###...
10949 ; ####.### ##.####. .####.#. .#####.. ..####.. ...#....
10950 ; ##.##### ##.##.#. .######. .##.##.. ...##...
10951 ; ##.##### #####.#. .###.##. ..###... ....#...
10952 ; ######## ###.###. .######. ..###...
10953 ; ######## ###.###. ..####.. ...#....
10954 ; ####.### .#####.. ..####..
10955 ; .###.##. .#####.. ...##...
10956 ; .######. ..###...
10957 ; .######. ...#....
10958 ; ..####..
10959 ; ...##...
10960 ;
10961 ; ZYLON FIGHTER (shape type 1, data in shape table PLSHAP2TAB)
10962 ; Numbers at top indicate the shape table offset of the first and last shape row
10963 ;
10964 ; $01..$0C $0D..$14 $15..$1A $1B..$20 $21..$24 $25..$28 $29..$2A $2B..$2C
10965 ; #......# #.....#. .#....#. .#...#.. ..#..#.. ..#.#... ...##... ...#....
10966 ; #......# #.....#. .#.##.#. .#.#.#.. ..####.. ..###... ...##... ...#....
10967 ; #......# #.###.#. .######. .#####.. ..####.. ..###...
10968 ; #......# #######. .######. .#####.. ..#..#.. ..#.#...
10969 ; #.####.# #######. .#.##.#. .#.#.#..
10970 ; ######## #.###.#. .#....#. .#...#..
10971 ; ######## #.....#.
10972 ; #.####.# #.....#.
10973 ; #......#
10974 ; #......#
10975 ; #......#
10976 ; #......#
10977 ;
10978 ; STARBASE RIGHT (shape type 2, data in shape table PLSHAP2TAB)
10979 ; Numbers at top indicate the shape table offset of the first and last shape row
10980 ;
10981 ; $2D..$36 $38..$40 $41..$46 $36..$38 $36 $00 $00 $00
10982 ; ###..... ##...... ##...... ##...... ##...... ........ ........ ........
10983 ; #####... ####.... ##...... ####....
10984 ; #####... ####.... ####.... ##......
10985 ; #######. ######.. #.####..
10986 ; #.#.### #.#####. ####....
10987 ; #######. ######.. ##......
10988 ; #####... ####....
10989 ; #####... #.......
10990 ; ##...... #.......
10991 ; ##......
10992 ;
10993 ; STARBASE CENTER (shape type 3, data in shape table PLSHAP1TAB)
10994 ; Numbers at top indicate the shape table offset of the first and last shape row
10995 ;
10996 ; $7E..$8D $8E..$9C $9D..$A9 $AA..$B3 $B4..$BB $BC..$C0 $7B..$7D $7A..$7B
10997 ; ...##... ........ ........ ...##... ........ ...##... ...#.... ...#....
10998 ; .######. ...##... ...##... ..####.. ...##... ..####.. ..###... ...#....
10999 ; ######## ..####.. ..####.. ######## ..####.. ######## ...#....
11000 ; ######## .######. .######. ######## ######## ..####..
11001 ; ######## ######## ######## ###..### ######## ...##...
11002 ; ######## ######## ######## .##..##. ########
11003 ; ######## ######## ###..### ######## ..####..
11004 ; ###..### ###..### .##..##. ######## ...##...
11005 ; ###..### .##..##. ######## .######.
11006 ; ######## ######## ######## ..####..
11007 ; ######## ######## ########
11008 ; ######## ######## ########
11009 ; ######## ######## ..####..
11010 ; ######## .######.
11011 ; .######. .######.
11012 ; .######.
11013 ;
11014 ; STARBASE LEFT (shape type 4, data in shape table PLSHAP2TAB)
11015 ; Numbers at top indicate the shape table offset of the first and last shape row
11016 ;
11017 ; $47..$50 $52..$5A $5B..$60 $50..$52 $50 $00 $00 $00
11018 ; .....### ......## ......## ......## ......## ........ ........ ........
11019 ; ...##### ....#### ......## ....####
11020 ; ...##### ....#### ....#### ......##
11021 ; .####### ..###### ..####.#
11022 ; ###.#.#. .#####.# ....####
11023 ; .####### ..###### ......##
11024 ; ...##### ....####
11025 ; ...##### .......#
11026 ; ......## .......#
11027 ; ......##
11028 ;
11029 ; TRANSFER VESSEL (shape type 5, data in shape table PLSHAP1TAB)
11030 ; Numbers at top indicate the shape table offset of the first and last shape row
11031 ;
11032 ; $43..$52 $53..$60 $61..$6B $6C..$74 $75..$79 $7A..$7D $75..$76 $7A..$7B
11033 ; ..####.. ...###.. ...##... ...#.... ...##... ...#.... ...##... ...#....
11034 ; ..####.. ...###.. ...##... ...#.... ...##... ...#.... ...##... ...#....
11035 ; ..#..#.. ...#.#.. ..####.. ..###... ..####.. ..###...
11036 ; ..####.. ..#####. ..####.. ..###... ...##... ...#....
11037 ; .######. ..#####. ..####.. ..###... ...##...
11038 ; .######. ..#####. ..####.. .#####..
11039 ; .######. ..#.#.#. .######. ..#.#...
11040 ; .#.##.#. .####### ..#..#.. ..#.#...
11041 ; ######## .####### ..#..#.. ..#.#...
11042 ; ######## ..#...#. ..#..#..
11043 ; .#....#. ..#...#. ..#..#..
11044 ; .#....#. ..#...#.
11045 ; .#....#. ..#...#.
11046 ; .#....#. ..#...#.
11047 ; .#....#.
11048 ; .#....#.
11049 ;
11050 ; METEOR (shape type 6, data in shape table PLSHAP1TAB)
11051 ; Numbers at top indicate the shape table offset of the first and last shape row
11052 ;
11053 ; $01..$10 $11..$1E $1F..$2A $2B..$34 $35..$3C $3D..$42 $75..$76 $7A..$7B
11054 ; ...##... ...#.... ...##... ...#.... ...#.... ...#.... ...##... ...#....
11055 ; ..####.. ..###... ..####.. ..###... ...##... ..###... ...##... ...#....
11056 ; .######. .#####.. ..####.. ..###... ..####.. ..###...
11057 ; .######. .#####.. .######. .#####.. ..#.##.. ..#.#...
11058 ; .###.##. #######. .##.###. .###.#.. ..####.. ..###...
11059 ; ####.### ##.####. .####.#. .#####.. ..####.. ...#....
11060 ; ##.##### ##.##.#. .######. .##.##.. ...##...
11061 ; ##.##### #####.#. .###.##. ..###... ....#...
11062 ; ######## ###.###. .######. ..###...
11063 ; ######## ###.###. ..####.. ...#....
11064 ; ####.### .#####.. ..####..
11065 ; .###.##. .#####.. ...##...
11066 ; .######. ..###...
11067 ; .######. ...#....
11068 ; ..####..
11069 ; ...##...
11070 ;
11071 ; ZYLON CRUISER (shape type 7, data in shape table PLSHAP2TAB)
11072 ; Numbers at top indicate the shape table offset of the first and last shape row
11073 ;
11074 ; $61..$69 $6A..$71 $72..$78 $79..$7E $7F..$82 $83..$85 $29..$2A $2B..$2C
11075 ; ...##... ...#.... ...##... ...#.... ...##... ...#.... ...##... ...#....
11076 ; ..####.. ..###... ..####.. ..###... ..####.. ..###... ...##... ...#....
11077 ; .######. .#####.. ..####.. ..###... ..#..#.. ..#.#...
11078 ; .######. .#####.. .##..##. .##.##.. ..#..#..
11079 ; ##.##.## ##.#.##. .##..##. .#...#..
11080 ; ##....## ##...##. .#....#. .#...#..
11081 ; #......# #.....#. .#....#.
11082 ; #......# #.....#.
11083 ; #......#
11084 ;
11085 ; ZYLON BASESTAR (shape type 8, data in shape table PLSHAP2TAB)
11086 ; Numbers at top indicate the shape table offset of the first and last shape row
11087 ;
11088 ; $86..$8F $90..$99 $9A..$A0 $A1..$A7 $A8..$AC $AD..$B0 $29..$2A $2B..$2C
11089 ; ...##... ...#.... ...##... ...#.... ...##... ...#.... ...##... ...#....
11090 ; ..####.. ..###... ..####.. ..###... ..####.. ..###... ...##... ...#....
11091 ; .######. .#####.. .######. .#####.. ...##... ..###...
11092 ; ######## #######. ...##... ...#.... ..####.. ...#....
11093 ; ...##... ..###... .######. .#####.. ...##...
11094 ; ...##... ..###... ..####.. ..###...
11095 ; ######## #######. ...##... ...#....
11096 ; .######. .#####..
11097 ; ..####.. ..###...
11098 ; ...##... ...#....
11099 ;
11100 ; HYPERWARP TARGET MARKER (shape type 9, data in shape table PLSHAP1TAB)
11101 ; Numbers at top indicate the shape table offset of the first and last shape row
11102 ;
11103 ; $C1..$CC $C1..$CC $C1..$CC $C1..$CC $C1..$CC $C1..$CC $75..$76 $C1..$CC
11104 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ...##... ..#.#...
11105 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ...##... ..#.#...
11106 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11107 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11108 ; ###.###. ###.###. ###.###. ###.###. ###.###. ###.###. ###.###.
11109 ; ........ ........ ........ ........ ........ ........ ........
11110 ; ........ ........ ........ ........ ........ ........ ........
11111 ; ###.###. ###.###. ###.###. ###.###. ###.###. ###.###. ###.###.
11112 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11113 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11114 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11115 ; ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#... ..#.#...
11116
11117 ;*** Shape type 0..9 offset table (10 shape cell offsets of shape type...) *****
BE2F 01111F2B 11118 PLSHAPOFFTAB .BYTE $01,$11,$1F,$2B,$35,$3D,$75,$7A ; ...0 into PLSHAP1TAB
BE33 353D757A
BE37 010D151B 11119 .BYTE $01,$0D,$15,$1B,$21,$25,$29,$2B ; ...1 into PLSHAP2TAB
BE3B 2125292B
BE3F 2D384136 11120 .BYTE $2D,$38,$41,$36,$36,$00,$00,$00 ; ...2 into PLSHAP2TAB
BE43 36000000
BE47 7E8E9DAA 11121 .BYTE $7E,$8E,$9D,$AA,$B4,$BC,$7B,$7A ; ...3 into PLSHAP1TAB
BE4B B4BC7B7A
BE4F 47525B50 11122 .BYTE $47,$52,$5B,$50,$50,$00,$00,$00 ; ...4 into PLSHAP2TAB
BE53 50000000
BE57 4353616C 11123 .BYTE $43,$53,$61,$6C,$75,$7A,$75,$7A ; ...5 into PLSHAP1TAB
BE5B 757A757A
BE5F 01111F2B 11124 .BYTE $01,$11,$1F,$2B,$35,$3D,$75,$7A ; ...6 into PLSHAP1TAB
BE63 353D757A
BE67 616A7279 11125 .BYTE $61,$6A,$72,$79,$7F,$83,$29,$2B ; ...7 into PLSHAP2TAB
BE6B 7F83292B
BE6F 86909AA1 11126 .BYTE $86,$90,$9A,$A1,$A8,$AD,$29,$2B ; ...8 into PLSHAP2TAB
BE73 A8AD292B
BE77 C1C1C1C1 11127 .BYTE $C1,$C1,$C1,$C1,$C1,$C1,$75,$C1 ; ...9 into PLSHAP1TAB
BE7B C1C175C1
11128
11129 ;*** Shape type 0..9 height table (10 shape cell heights of shape type...) *****
BE7F 0F0D0B09 11130 PLSHPHEIGHTTAB .BYTE $0F,$0D,$0B,$09,$07,$05,$01,$01 ; ...0
BE83 07050101
BE87 0B070505 11131 .BYTE $0B,$07,$05,$05,$03,$03,$01,$01 ; ...1
BE8B 03030101
BE8F 09080502 11132 .BYTE $09,$08,$05,$02,$00,$00,$00,$00 ; ...2
BE93 00000000
BE97 0F0E0C09 11133 .BYTE $0F,$0E,$0C,$09,$07,$04,$02,$01 ; ...3
BE9B 07040201
BE9F 09080502 11134 .BYTE $09,$08,$05,$02,$00,$00,$00,$00 ; ...4
BEA3 00000000
BEA7 0F0D0A08 11135 .BYTE $0F,$0D,$0A,$08,$04,$03,$01,$01 ; ...5
BEAB 04030101
BEAF 0F0D0B09 11136 .BYTE $0F,$0D,$0B,$09,$07,$05,$01,$01 ; ...6
BEB3 07050101
BEB7 08070605 11137 .BYTE $08,$07,$06,$05,$03,$02,$01,$01 ; ...7
BEBB 03020101
BEBF 09090606 11138 .BYTE $09,$09,$06,$06,$04,$03,$01,$01 ; ...8
BEC3 04030101
BEC7 0B0B0B0B 11139 .BYTE $0B,$0B,$0B,$0B,$0B,$0B,$01,$0B ; ...9
BECB 0B0B010B
11140
11141 ;*** Keyboard codes to switch to Front or Aft view when Tracking Computer is on
BECF F8 11142 TRACKKEYSTAB .BYTE $F8 ; 'F' - Front view
BED0 FF 11143 .BYTE $FF ; 'A' - Aft view
11144
11145 ;*** Galactic Chart sector character codes (encoded in custom character set) ***
BED1 0C 11146 SECTORCHARTAB .BYTE CCS.BORDERSW ; Empty sector
BED2 1E 11147 .BYTE CCS.2ZYLONS ; Sector contains 1 Zylon ship
BED3 1E 11148 .BYTE CCS.2ZYLONS ; Sector contains 2 Zylon ships
BED4 1D 11149 .BYTE CCS.3ZYLONS ; Sector contains 3 Zylon ships
BED5 1C 11150 .BYTE CCS.4ZYLONS ; Sector contains 4 Zylon ships
BED6 1B 11151 .BYTE CCS.STARBASE ; Sector contains starbase
11152
11153 ;*** Mask to limit veer-off velocity of Hyperwarp Target Marker in hyperwarp ***
BED7 9F 11154 VEERMASKTAB .BYTE NEG!31 ; -31..+31 <KM/H> (unused)
BED8 BF 11155 .BYTE NEG!63 ; -63..+63 <KM/H> PILOT mission
BED9 DF 11156 .BYTE NEG!95 ; -95..+95 <KM/H> WARRIOR mission
BEDA FF 11157 .BYTE NEG!127 ; -127..+127 <KM/H> COMMANDER mission
11158
11159 ;*** Horizontal PLAYER offsets for PLAYER0..1 (STARBASE LEFT, STARBASE RIGHT) **
BEDB F8 11160 PLSTARBAOFFTAB .BYTE -8 ; -8 Player/Missile pixels
BEDC 08 11161 .BYTE 8 ; +8 Player/Missile pixels
11162
11163 ;*** Mission bonus table *******************************************************
BEDD 50 11164 BONUSTAB .BYTE 80 ; Mission complete NOVICE mission
BEDE 4C 11165 .BYTE 76 ; Mission complete PILOT mission
BEDF 3C 11166 .BYTE 60 ; Mission complete WARRIOR mission
BEE0 6F 11167 .BYTE 111 ; Mission complete COMMANDER mission
11168
BEE1 3C 11169 .BYTE 60 ; Mission aborted NOVICE mission
BEE2 3C 11170 .BYTE 60 ; Mission aborted PILOT mission
BEE3 32 11171 .BYTE 50 ; Mission aborted WARRIOR mission
BEE4 64 11172 .BYTE 100 ; Mission aborted COMMANDER mission
11173
BEE5 28 11174 .BYTE 40 ; Starship destroyed NOVICE mission
BEE6 32 11175 .BYTE 50 ; Starship destroyed PILOT mission
BEE7 28 11176 .BYTE 40 ; Starship destroyed WARRIOR mission
BEE8 5A 11177 .BYTE 90 ; Starship destroyed COMMANDER mission
11178
11179 ;*** Title phrase offsets of scored class rank *********************************
BEE9 A9 11180 RANKTAB .BYTE $29!EOS ; "GALACTIC COOK"
BEEA AA 11181 .BYTE $2A!EOS ; "GARBAGE SCOW CAPTAIN"
BEEB AA 11182 .BYTE $2A!EOS ; "GARBAGE SCOW CAPTAIN"
BEEC AB 11183 .BYTE $2B!EOS ; "ROOKIE"
BEED AB 11184 .BYTE $2B!EOS ; "ROOKIE"
BEEE AC 11185 .BYTE $2C!EOS ; "NOVICE"
BEEF AC 11186 .BYTE $2C!EOS ; "NOVICE"
BEF0 AD 11187 .BYTE $2D!EOS ; "ENSIGN"
BEF1 AD 11188 .BYTE $2D!EOS ; "ENSIGN"
BEF2 AE 11189 .BYTE $2E!EOS ; "PILOT"
BEF3 AE 11190 .BYTE $2E!EOS ; "PILOT"
BEF4 AF 11191 .BYTE $2F!EOS ; "ACE"
BEF5 B0 11192 .BYTE $30!EOS ; "LIEUTENANT"
BEF6 B1 11193 .BYTE $31!EOS ; "WARRIOR"
BEF7 B2 11194 .BYTE $32!EOS ; "CAPTAIN"
BEF8 B3 11195 .BYTE $33!EOS ; "COMMANDER"
BEF9 B3 11196 .BYTE $33!EOS ; "COMMANDER"
BEFA B9 11197 .BYTE $39!EOS ; "STAR COMMANDER"
BEFB B9 11198 .BYTE $39!EOS ; "STAR COMMANDER"
11199
11200 ;*** Scored class number table *************************************************
BEFC 95 11201 CLASSTAB .BYTE CCS.COL2!ROM.5 ; Class 5
BEFD 95 11202 .BYTE CCS.COL2!ROM.5 ; Class 5
BEFE 95 11203 .BYTE CCS.COL2!ROM.5 ; Class 5
BEFF 94 11204 .BYTE CCS.COL2!ROM.4 ; Class 4
BF00 94 11205 .BYTE CCS.COL2!ROM.4 ; Class 4
BF01 94 11206 .BYTE CCS.COL2!ROM.4 ; Class 4
BF02 94 11207 .BYTE CCS.COL2!ROM.4 ; Class 4
BF03 93 11208 .BYTE CCS.COL2!ROM.3 ; Class 3
BF04 93 11209 .BYTE CCS.COL2!ROM.3 ; Class 3
BF05 93 11210 .BYTE CCS.COL2!ROM.3 ; Class 3
BF06 92 11211 .BYTE CCS.COL2!ROM.2 ; Class 2
BF07 92 11212 .BYTE CCS.COL2!ROM.2 ; Class 2
BF08 92 11213 .BYTE CCS.COL2!ROM.2 ; Class 2
BF09 91 11214 .BYTE CCS.COL2!ROM.1 ; Class 1
BF0A 91 11215 .BYTE CCS.COL2!ROM.1 ; Class 1
BF0B 91 11216 .BYTE CCS.COL2!ROM.1 ; Class 1
11217
11218 ;*** Title phrase offsets of mission level *************************************
BF0C 4A 11219 MISSIONPHRTAB .BYTE $4A ; "NOVICE MISSION"
BF0D 4C 11220 .BYTE $4C ; "PILOT MISSION"
BF0E 4E 11221 .BYTE $4E ; "WARRIOR MISSION"
BF0F 50 11222 .BYTE $50 ; "COMMANDER MISSION"
11223
11224 ;*** Damage probability of subsystems depending on mission level ***************
BF10 00 11225 DAMAGEPROBTAB .BYTE 0 ; 0% ( 0:256) NOVICE mission
BF11 50 11226 .BYTE 80 ; 31% ( 80:256) PILOT mission
BF12 B4 11227 .BYTE 180 ; 70% (180:256) WARRIOR mission
BF13 FE 11228 .BYTE 254 ; 99% (254:256) COMMANDER mission
11229
11230 ;*** Title phrase offsets of damaged subsystems ********************************
BF14 55 11231 DAMAGEPHRTAB .BYTE $55 ; "PHOTON TORPEDOS DAMAGED"
BF15 5B 11232 .BYTE $5B ; "ENGINES DAMAGED"
BF16 61 11233 .BYTE $61 ; "SHIELDS DAMAGED"
BF17 67 11234 .BYTE $67 ; "COMPUTER DAMAGED"
BF18 6D 11235 .BYTE $6D ; "LONG RANGE SCAN DAMAGED"
BF19 71 11236 .BYTE $71 ; "SUB-SPACE RADIO DAMAGED"
11237
11238 ;*** Title phrase offsets of destroyed subsystems ******************************
BF1A 58 11239 DESTROYPHRTAB .BYTE $58 ; "PHOTON TORPEDOS DESTROYED"
BF1B 5E 11240 .BYTE $5E ; "ENGINES DESTROYED"
BF1C 64 11241 .BYTE $64 ; "SHIELDS DESTROYED"
BF1D 6A 11242 .BYTE $6A ; "COMPUTER DESTROYED"
BF1E 6F 11243 .BYTE $6F ; "LONG RANGE SCAN DESTROYED"
BF1F 73 11244 .BYTE $73 ; "SUB-SPACE RADIO DESTROYED"
11245
11246 ;*** 3 x 10-byte noise sound patterns (bytes 0..7 stored in reverse order) *****
11247 ;
11248 ; (9) AUDCTL ($D208) POKEY: Audio control
11249 ; (8) AUDF3 ($D204) POKEY: Audio channel 3 frequency
11250 ; (7) NOISETORPTIM ($DA) Timer for PHOTON TORPEDO LAUNCHED noise sound patterns
11251 ; (6) NOISEEXPLTIM ($DB) Timer for SHIELD and ZYLON EXPLOSION noise sound patterns
11252 ; (5) NOISEAUDC2 ($DC) Audio channel 1/2 control shadow register
11253 ; (4) NOISEAUDC3 ($DD) Audio channel 3 control shadow register
11254 ; (3) NOISEAUDF1 ($DE) Audio channel 1 frequency shadow register
11255 ; (2) NOISEAUDF2 ($DF) Audio channel 2 frequency shadow register
11256 ; (1) NOISEFRQINC ($E0) Audio channel 1/2 frequency increment
11257 ; (0) NOISELIFE ($E1) Noise sound pattern lifetime
11258 ;
11259 ; (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
BF20 18FF0200 11260 NOISEPATTAB .BYTE $18,$FF,$02,$00,$8A,$A0,$00,$08,$50,$00; PHOTON TORPEDO LAUNCHED
BF24 8AA00008
BF28 5000
BF2A 40400103 11261 .BYTE $40,$40,$01,$03,$88,$AF,$08,$00,$50,$04; SHIELD EXPLOSION
BF2E 88AF0800
BF32 5004
BF34 30400103 11262 .BYTE $30,$40,$01,$03,$84,$A8,$04,$00,$50,$04; ZYLON EXPLOSION
BF38 84A80400
BF3C 5004
11263
11264 ;*** 5 x 6-byte beeper sound patterns (bytes 0..5 stored in reverse order) *****
11265 ;
11266 ; (5) BEEPFRQIND ($D2) Running index into frequency table BEEPFRQTAB ($BF5C)
11267 ; (4) BEEPREPEAT ($D3) Number of times the beeper sound pattern sequence is repeated - 1
11268 ; (3) BEEPTONELIFE ($D4) Lifetime of tone in TICKs - 1
11269 ; (2) BEEPPAUSELIFE ($D5) Lifetime of pause in TICKs - 1 ($FF -> No pause)
11270 ; (1) BEEPPRIORITY ($D6) Beeper sound pattern priority. A playing beeper sound pattern is
11271 ; stopped if a beeper sound pattern of higher priority is about to be
11272 ; played. A value of 0 indicates that no beeper sound pattern is
11273 ; playing at the moment.
11274 ; (0) BEEPFRQSTART ($D7) Index to first byte of the beeper sound pattern frequency in table
11275 ; BEEPFRQTAB ($BF5C)
11276 ;
11277 ; Frequency-over-TICKs diagrams for all beeper sound patterns:
11278 ;
11279 ; HYPERWARP TRANSIT
11280 ;
11281 ; FRQ
11282 ; |
11283 ; $18 |-4--
11284 ; |
11285 ; $00 | -3-
11286 ; +-------> TICKS
11287 ; <13 x >
11288 ;
11289 ; RED ALERT
11290 ;
11291 ; FRQ
11292 ; |
11293 ; $60 | --------17-------
11294 ; |
11295 ; $40 |--------17-------
11296 ; |
11297 ; +----------------------------------> TICKS
11298 ; <-------------- 8 x ------------->
11299 ;
11300 ; ACKNOWLEDGE
11301 ;
11302 ; FRQ
11303 ; |
11304 ; $10 |-3- -3- -3-
11305 ; |
11306 ; $00 | -3- -3- -3-
11307 ; +------------------> TICKS
11308 ; <------ 1 x ----->
11309 ;
11310 ; DAMAGE REPORT (not to scale)
11311 ;
11312 ; FRQ
11313 ; |
11314 ; $40 |------------33-------------
11315 ; |
11316 ; $20 | ------------33-------------
11317 ; |
11318 ; +------------------------------------------------------> TICKS
11319 ; <------------------------ 3 x ----------------------->
11320 ;
11321 ; MESSAGE FROM STARBASE (not to scale)
11322 ;
11323 ; FRQ
11324 ; |
11325 ; $51 | -----33-----
11326 ; $48 |-----33-----
11327 ; $40 | -----33-----
11328 ; |
11329 ; $00 | --9-- --9-- --9--
11330 ; +----------------------------------------------------> TICKS
11331 ; <---------------------- 1 x ---------------------->
11332 ;
11333 ; (0),(1),(2),(3),(4),(5)
BF3E 02020203 11334 BEEPPATTAB .BYTE $02,$02,$02,$03,$0C,$02 ; HYPERWARP TRANSIT
BF42 0C02
BF44 0403FF10 11335 .BYTE $04,$03,$FF,$10,$07,$04 ; RED ALERT
BF48 0704
BF4A 07040202 11336 .BYTE $07,$04,$02,$02,$00,$07 ; ACKNOWLEDGE
BF4E 0007
BF50 0B05FF20 11337 .BYTE $0B,$05,$FF,$20,$02,$0B ; DAMAGE REPORT
BF54 020B
BF56 0E060820 11338 .BYTE $0E,$06,$08,$20,$00,$0E ; MESSAGE FROM STARBASE
BF5A 000E
11339
11340 ;*** Beeper sound pattern frequency table **************************************
BF5C 10FF 11341 BEEPFRQTAB .BYTE $10,$FF ; (unused) (!)
BF5E 18FF 11342 .BYTE $18,$FF ; HYPERWARP TRANSIT
BF60 4060FF 11343 .BYTE $40,$60,$FF ; RED ALERT
BF63 101010FF 11344 .BYTE $10,$10,$10,$FF ; ACKNOWLEDGE
BF67 4020FF 11345 .BYTE $40,$20,$FF ; DAMAGE REPORT
BF6A 484051FF 11346 .BYTE $48,$40,$51,$FF ; MESSAGE FROM STARBASE
11347
11348 ;*** Shape of blip in Attack Computer Display **********************************
BF6E 84 11349 BLIPSHAPTAB .BYTE $84 ; #....#..
BF6F B4 11350 .BYTE $B4 ; #.##.#..
BF70 FC 11351 .BYTE $FC ; ######..
BF71 B4 11352 .BYTE $B4 ; #.##.#..
BF72 84 11353 .BYTE $84 ; #....#..
11354
11355 ;*** Initial x-coordinate (high byte) of our starship's photon torpedo *********
BF73 FF 11356 BARRELXTAB .BYTE $FF ; Left barrel = -256 (-$FF00) <KM>
BF74 01 11357 .BYTE $01 ; Right barrel = +256 (+$0100) <KM>
11358
11359 ;*** Maximum photon torpedo hit z-coordinate (high byte) ***********************
BF75 0C 11360 HITMAXZTAB .BYTE $0C ; < 3328 ($0C**) <KM>
BF76 0C 11361 .BYTE $0C ; < 3328 ($0C**) <KM>
BF77 0C 11362 .BYTE $0C ; < 3328 ($0C**) <KM>
BF78 0C 11363 .BYTE $0C ; < 3328 ($0C**) <KM>
BF79 0E 11364 .BYTE $0E ; < 3840 ($0E**) <KM>
BF7A 0E 11365 .BYTE $0E ; < 3840 ($0E**) <KM>
BF7B 0E 11366 .BYTE $0E ; < 3840 ($0E**) <KM>
BF7C 20 11367 .BYTE $20 ; < 8448 ($20**) <KM>
11368
11369 ;*** Minimum photon torpedo hit z-coordinate (high byte) ***********************
BF7D 00 11370 HITMINZTAB .BYTE $00 ; >= 0 ($00**) <KM>
BF7E 00 11371 .BYTE $00 ; >= 0 ($00**) <KM>
BF7F 00 11372 .BYTE $00 ; >= 0 ($00**) <KM>
BF80 02 11373 .BYTE $02 ; >= 512 ($02**) <KM>
BF81 04 11374 .BYTE $04 ; >= 1024 ($04**) <KM>
BF82 06 11375 .BYTE $06 ; >= 1536 ($06**) <KM>
BF83 08 11376 .BYTE $08 ; >= 2048 ($08**) <KM>
BF84 0C 11377 .BYTE $0C ; >= 3072 ($0C**) <KM>
11378
11379 ;*** Velocity of homing Zylon photon torpedo ***********************************
BF85 81 11380 ZYLONHOMVELTAB .BYTE NEG!1 ; -1 <KM/H> NOVICE mission
BF86 84 11381 .BYTE NEG!4 ; -4 <KM/H> PILOT mission
BF87 88 11382 .BYTE NEG!8 ; -8 <KM/H> WARRIOR mission
BF88 94 11383 .BYTE NEG!20 ; -20 <KM/H> COMMANDER mission
11384
11385 ;*** Zylon shape type table ****************************************************
BF89 80 11386 ZYLONSHAPTAB .BYTE SHAP.ZBASESTAR ; ZYLON BASESTAR
BF8A 10 11387 .BYTE SHAP.ZFIGHTER ; ZYLON FIGHTER
BF8B 10 11388 .BYTE SHAP.ZFIGHTER ; ZYLON FIGHTER
BF8C 10 11389 .BYTE SHAP.ZFIGHTER ; ZYLON FIGHTER
BF8D 70 11390 .BYTE SHAP.ZCRUISER ; ZYLON CRUISER
BF8E 70 11391 .BYTE SHAP.ZCRUISER ; ZYLON CRUISER
BF8F 70 11392 .BYTE SHAP.ZCRUISER ; ZYLON CRUISER
BF90 10 11393 .BYTE SHAP.ZFIGHTER ; ZYLON FIGHTER
11394
11395 ;*** Zylon flight pattern table ************************************************
BF91 04 11396 ZYLONFLPATTAB .BYTE 4 ; Flight pattern 4
BF92 04 11397 .BYTE 4 ; Flight pattern 4
BF93 00 11398 .BYTE 0 ; Attack Flight Pattern 0
BF94 00 11399 .BYTE 0 ; Attack Flight Pattern 0
BF95 00 11400 .BYTE 0 ; Attack Flight Pattern 0
BF96 01 11401 .BYTE 1 ; Flight pattern 1
BF97 00 11402 .BYTE 0 ; Attack Flight Pattern 0
BF98 00 11403 .BYTE 0 ; Attack Flight Pattern 0
11404
11405 ;*** Zylon velocity table ******************************************************
BF99 3E 11406 ZYLONVELTAB .BYTE 62 ; +62 <KM/H>
BF9A 1E 11407 .BYTE 30 ; +30 <KM/H>
BF9B 10 11408 .BYTE 16 ; +16 <KM/H>
BF9C 08 11409 .BYTE 8 ; +8 <KM/H>
BF9D 04 11410 .BYTE 4 ; +4 <KM/H>
BF9E 02 11411 .BYTE 2 ; +2 <KM/H>
BF9F 01 11412 .BYTE 1 ; +1 <KM/H>
BFA0 00 11413 .BYTE 0 ; 0 <KM/H>
BFA1 00 11414 .BYTE 0 ; 0 <KM/H>
BFA2 81 11415 .BYTE NEG!1 ; -1 <KM/H>
BFA3 82 11416 .BYTE NEG!2 ; -2 <KM/H>
BFA4 84 11417 .BYTE NEG!4 ; -4 <KM/H>
BFA5 88 11418 .BYTE NEG!8 ; -8 <KM/H>
BFA6 90 11419 .BYTE NEG!16 ; -16 <KM/H>
BFA7 9E 11420 .BYTE NEG!30 ; -30 <KM/H>
BFA8 BE 11421 .BYTE NEG!62 ; -62 <KM/H>
11422
11423 ;*** PLAYFIELD colors (including PLAYFIELD colors during DLI) ******************
BFA9 A6 11424 PFCOLORTAB .BYTE $A6 ; PF0COLOR = {GREEN}
BFAA AA 11425 .BYTE $AA ; PF1COLOR = {LIGHT GREEN}
BFAB AF 11426 .BYTE $AF ; PF2COLOR = {VERY LIGHT GREEN}
BFAC 00 11427 .BYTE $00 ; PF3COLOR = {BLACK}
BFAD 00 11428 .BYTE $00 ; BGRCOLOR = {BLACK}
BFAE B8 11429 .BYTE $B8 ; PF0COLORDLI = {LIGHT MINT}
BFAF 5A 11430 .BYTE $5A ; PF1COLORDLI = {MEDIUM PINK}
BFB0 FC 11431 .BYTE $FC ; PF2COLORDLI = {LIGHT ORANGE}
BFB1 5E 11432 .BYTE $5E ; PF3COLORDLI = {LIGHT PINK}
BFB2 90 11433 .BYTE $90 ; BGRCOLORDLI = {DARK BLUE}
11434
11435 ;*** Vicinity mask table. Confines coordinates of space objects in sector ******
BFB3 FF 11436 VICINITYMASKTAB .BYTE $FF ; <= 65535 ($FF**) <KM>
BFB4 FF 11437 .BYTE $FF ; <= 65535 ($FF**) <KM>
BFB5 3F 11438 .BYTE $3F ; <= 16383 ($3F**) <KM>
BFB6 0F 11439 .BYTE $0F ; <= 4095 ($0F**) <KM>
BFB7 3F 11440 .BYTE $3F ; <= 16383 ($3F**) <KM>
BFB8 7F 11441 .BYTE $7F ; <= 32767 ($7F**) <KM>
BFB9 FF 11442 .BYTE $FF ; <= 65535 ($FF**) <KM>
BFBA FF 11443 .BYTE $FF ; <= 65535 ($FF**) <KM>
11444
11445 ;*** Movement probability of sector types in Galactic Chart ********************
BFBB 00 11446 MOVEPROBTAB .BYTE 0 ; Empty sector 0% ( 0:256)
BFBC FF 11447 .BYTE 255 ; 1 Zylon ship 100% (255:256)
BFBD FF 11448 .BYTE 255 ; 2 Zylon ships 100% (255:256)
BFBE C0 11449 .BYTE 192 ; 3 Zylon ships 75% (192:256)
BFBF 20 11450 .BYTE 32 ; 4 Zylon ships 13% ( 32:256)
11451
11452 ;*** Galactic Chart sector offset to adjacent sector ***************************
BFC0 F0 11453 COMPASSOFFTAB .BYTE -16 ; NORTH
BFC1 EF 11454 .BYTE -17 ; NORTHWEST
BFC2 FF 11455 .BYTE -1 ; WEST
BFC3 0F 11456 .BYTE 15 ; SOUTHWEST
BFC4 10 11457 .BYTE 16 ; SOUTH
BFC5 11 11458 .BYTE 17 ; SOUTHEAST
BFC6 01 11459 .BYTE 1 ; EAST
BFC7 F1 11460 .BYTE -15 ; NORTHEAST
BFC8 00 11461 .BYTE 0 ; CENTER
11462
11463 ;*** Homing velocities of photon torpedoes 0..1 depending on distance to target
BFC9 00 11464 HOMVELTAB .BYTE 0 ; +0 <KM/H>
BFCA 08 11465 .BYTE 8 ; +8 <KM/H>
BFCB 10 11466 .BYTE 16 ; +16 <KM/H>
BFCC 18 11467 .BYTE 24 ; +24 <KM/H>
BFCD 28 11468 .BYTE 40 ; +40 <KM/H>
BFCE 30 11469 .BYTE 48 ; +48 <KM/H>
BFCF 38 11470 .BYTE 56 ; +56 <KM/H>
BFD0 40 11471 .BYTE 64 ; +64 <KM/H>
11472
11473 ;*** PLAYER shape color table (bits B7..4 of color/brightness) *****************
BFD1 50 11474 PLSHAPCOLORTAB .BYTE $50 ; PHOTON TORPEDO = {PURPLE}
BFD2 00 11475 .BYTE $00 ; ZYLON FIGHTER = {GRAY}
BFD3 20 11476 .BYTE $20 ; STARBASE RIGHT = {ORANGE}
BFD4 20 11477 .BYTE $20 ; STARBASE CENTER = {ORANGE}
BFD5 20 11478 .BYTE $20 ; STARBASE LEFT = {ORANGE}
BFD6 00 11479 .BYTE $00 ; TRANSFER VESSEL = {GRAY}
BFD7 A0 11480 .BYTE $A0 ; METEOR = {GREEN}
BFD8 00 11481 .BYTE $00 ; ZYLON CRUISER = {GRAY}
BFD9 00 11482 .BYTE $00 ; ZYLON BASESTAR = {GRAY}
BFDA 9F 11483 .BYTE $9F ; HYPERWARP TARGET MARKER = {SKY BLUE}
11484
11485 ;*** PLAYER shape brightness table (bits B3..0 of color/brightness) ************
BFDB 0E 11486 PLSHAPBRITTAB .BYTE $0E ; ##############..
BFDC 0E 11487 .BYTE $0E ; ##############..
BFDD 0E 11488 .BYTE $0E ; ##############..
BFDE 0C 11489 .BYTE $0C ; ############....
BFDF 0C 11490 .BYTE $0C ; ############....
BFE0 0C 11491 .BYTE $0C ; ############....
BFE1 0A 11492 .BYTE $0A ; ##########......
BFE2 0A 11493 .BYTE $0A ; ##########......
BFE3 0A 11494 .BYTE $0A ; ##########......
BFE4 08 11495 .BYTE $08 ; ########........
BFE5 08 11496 .BYTE $08 ; ########........
BFE6 08 11497 .BYTE $08 ; ########........
BFE7 06 11498 .BYTE $06 ; ######..........
BFE8 06 11499 .BYTE $06 ; ######..........
BFE9 04 11500 .BYTE $04 ; ####............
BFEA 04 11501 .BYTE $04 ; ####............
11502
11503 ;*** PHOTON TORPEDO LAUNCHED noise bit and volume (stored in reverse order) ****
BFEB 8A 11504 NOISETORPVOLTAB .BYTE $8A ; ##########.....
BFEC 8F 11505 .BYTE $8F ; ###############
BFED 8D 11506 .BYTE $8D ; #############..
BFEE 8B 11507 .BYTE $8B ; ###########....
BFEF 89 11508 .BYTE $89 ; #########......
BFF0 87 11509 .BYTE $87 ; #######........
BFF1 85 11510 .BYTE $85 ; ######.........
BFF2 83 11511 .BYTE $83 ; ###............
11512
11513 ;*** PHOTON TORPEDO LAUNCHED noise frequency table (stored in reverse order) ***
BFF3 00 11514 NOISETORPFRQTAB .BYTE $00 ;
BFF4 04 11515 .BYTE $04 ;
BFF5 01 11516 .BYTE $01 ;
BFF6 04 11517 .BYTE $04 ;
BFF7 01 11518 .BYTE $01 ;
BFF8 04 11519 .BYTE $04 ;
BFF9 01 11520 .BYTE $01 ;
BFFA 04 11521 .BYTE $04 ;
11522
BFFB 07 11523 .BYTE $07 ; (unused)
11524
BFFC 00 11525 .BYTE $00 ; Always 0 for cartridges
BFFD 80 11526 .BYTE $80 ; On SYSTEM RESET jump to INITCOLD via
BFFE 4AA1 11527 .WORD INITCOLD ; Cartridge Initialization Address
SYMBOLS (SORTED BY NAME): 898
A980 ABORTWARP
A109 AFTHEADER
=0092 ARRVSECTOR
=D203 AUDC2
=D205 AUDC3
=D207 AUDC4
=D208 AUDCTL
=D200 AUDF1
=D202 AUDF2
=D204 AUDF3
=D206 AUDF4
=0087 BARRELNR
BF73 BARRELXTAB
B3A6 BEEP
=00D2 BEEPFRQIND
=00D7 BEEPFRQSTART
BF5C BEEPFRQTAB
=00D8 BEEPLIFE
BF3E BEEPPATTAB
=00D5 BEEPPAUSELIFE
=00D6 BEEPPRIORITY
=00D3 BEEPREPEAT
=00D9 BEEPTOGGLE
=00D4 BEEPTONELIFE
=00F6 BGRCOLOR
=00FB BGRCOLORDLI
=00A0 BLIPCOLUMN
=00A2 BLIPCYCLECNT
=00A1 BLIPROW
BF6E BLIPSHAPTAB
BEDD BONUSTAB
B1A7 CALCWARP
=0000 CCS.0
=0001 ?CCS.1
=0002 ?CCS.2
=001E CCS.2ZYLONS
=0003 ?CCS.3
=001D CCS.3ZYLONS
=0004 ?CCS.4
=001C CCS.4ZYLONS
=0005 ?CCS.5
=0006 ?CCS.6
=0007 ?CCS.7
=0008 ?CCS.8
=0009 CCS.9
=0018 CCS.BORDERS
=000C CCS.BORDERSW
=0019 CCS.BORDERW
=0017 ?CCS.C
=0040 CCS.COL1
=0080 CCS.COL2
=00C0 CCS.COL3
=000B CCS.COLON
=001A CCS.CORNERSW
=000D CCS.E
=000E CCS.INF
=0015 CCS.K
=000F CCS.MINUS
=0011 CCS.PHI
=0010 CCS.PLUS
=0013 CCS.R
=000A CCS.SPC
=001B CCS.STARBASE
=0016 CCS.T
=0014 CCS.THETA
=0012 CCS.V
A000 CHARSET
=D409 CHBASE
BEFC CLASSTAB
A98D CLEANUPWARP
=0074 CLOCKTIM
AE0F CLRMEM
AE0D CLRPLAYFIELD
AF3D COLLISION
=D016 COLPF0
=D012 COLPM0
BFC0 COMPASSOFFTAB
=D01F CONSOL
ACAF COPYPOSVEC
ACC1 COPYPOSXY
=0076 COUNT256
=0072 COUNT8
=00A7 CTRLDZYLON
=0090 CURRSECTOR
AEE1 DAMAGE
BF14 DAMAGEPHRTAB
BF10 DAMAGEPROBTAB
B86F DECENERGY
BF1A DESTROYPHRTAB
=00A4 DIRLEN
=006A DIVIDEND
=D402 DLIST
BA62 DLSTFRAG
BA75 DLSTFRAGAFT
BA7D DLSTFRAGFRONT
BA6A DLSTFRAGGC
BA6D DLSTFRAGLRS
BA8C DLSTFRAGOFFTAB
A12E DLSTGC
A718 DLSTHNDLR
=D400 DMACTL
ACE6 DOCKING
=0075 DOCKSTATE
=0080 DOWN
=007E DRAINATTCOMP
=0080 DRAINENGINES
BAD3 DRAINRATETAB
=007D DRAINSHIELDS
B4B9 DRAWGC
A782 DRAWLINE
A784 DRAWLINE2
A76F DRAWLINES
BAF9 DRAWLINESTAB
=0280 DSPLST
A987 ENDWARP
=007F ENERGYCNT
=0955 ENERGYD1
=0040 EOP
=0080 EOS
=0080 EOW
=0073 EXPLLIFE
=0063 FKEYCODE
B4E4 FLUSHGAMELOOP
BA90 FOURCOLORPIXEL
A1F3 GAMELOOP
B10A GAMEOVER
B121 GAMEOVER2
A11A GCHEADER
=08C9 GCMEMMAP
=0D35 GCPFMEM
=09A3 GCSTARDAT
=0995 GCSTATCOM
=0993 GCSTATENG
=0996 GCSTATLRS
=0992 GCSTATPHO
=0997 GCSTATRAD
=0994 GCSTATSHL
=098D GCTRGCNT
=0971 GCTXT
=097D GCWARPD1
=D01D GRACTL
=008A HITBADNESS
=D01E HITCLR
BF75 HITMAXZTAB
BF7D HITMINZTAB
AECA HOMINGVEL
BFC9 HOMVELTAB
=D004 HPOSM0
=D005 HPOSM1
=D006 HPOSM2
=D007 HPOSM3
=D000 HPOSP0
=D001 HPOSP1
=D002 HPOSP2
=D003 HPOSP3
=0094 HUNTSECTCOLUMN
=0093 HUNTSECTOR
=0095 HUNTSECTROW
=009F HUNTTIM
A89B HYPERWARP
=0066 IDLECNTHI
=0077 IDLECNTLO
A14A INITCOLD
A15C INITDEMO
AC6B INITEXPL
B3BA INITIALIZE
B764 INITPOSVEC
A15A INITSELECT
A15E INITSTART
A9B4 INITTRAIL
=D20E IRQEN
A751 IRQHNDLR
=00B8 ISBACKATTACK0
=00B9 ?ISBACKATTACK1
=0064 ISDEMOMODE
=00A3 ISINLOCKON
=007B ISSTARBASESECT
B7F1 ISSURROUNDED
=007C ISTRACKCOMPON
=0086 ISTRACKING
=0067 ISVBISYNC
=006D JOYSTICKDELTA
=00C8 JOYSTICKX
=00C9 JOYSTICKY
A47D JUMP001
A4A4 JUMP002
A579 JUMP003
A74B JUMP004
=D209 KBCODE
AFFE KEYBOARD
=00CA KEYCODE
BABE KEYTAB
=0950 KILLCNTD1
=006B L.ABSDIFFCOL
=006B L.BITPAT
=006B L.COLORMASK
=006B L.COLUMNPOS
=006A L.CTRLDZYLON
=006A L.DIFFC
=006A L.DIRECTIONIND
=006E L.DIRSAV
=0068 L.DIVISOR
=006A L.FOURCOLORPIX
=006A L.GCMEMMAPIND
=006A L.HEIGHTCNT
=006A L.ISDESTROYED
=006A L.KEYCODE
=006E L.LOOPCNT
=006B L.LOOPCNT2
=006A L.MAXRNDXY
=0068 L.MEMPTR1
=006A L.MEMPTR2
=006A L.NEWSECTOR
=006A L.NUMBYTES
=006A L.PIXELBYTEOFF
=006D L.PIXELCOLUMN
=006D L.PIXELROW
=006B L.PLHIT
=006D L.QUOTIENT
=0068 L.RANGE
=006A L.RANGEINDEX
=006B L.SECTORCNT
=006A L.SECTORTYPE
=006C L.SHIFTSHAPE
=006A L.SIGNCHAR
=006B L.TERM3HI
=006A L.TERM3LO
=006C L.TERM3SIGN
=006C L.TOKEN
=006E L.TRAILCNT
=006A L.VECCOMPIND
=006B L.VELOCITYHI
=006A L.VELSIGN
=006C L.VIEWDIR
=006A L.WARPARRVCOL
=006A L.WORD
=006E L.ZPOSOFF
=0088 LOCKONLIFE
=00C0 LONG
A165 LOOP001
A201 LOOP002
A227 LOOP003
A26A LOOP004
A277 LOOP005
A284 LOOP006
A291 LOOP007
A29E LOOP008
A2BA LOOP009
A2E0 LOOP010
A306 LOOP011
A327 LOOP012
A343 LOOP013
A389 LOOP014
A3A6 LOOP015
A3BD LOOP016
A3E4 LOOP017
A3EB LOOP018
A422 LOOP019
A428 LOOP020
A453 LOOP021
A4C0 LOOP022
A4E7 LOOP023
A4FC LOOP024
A593 LOOP025
A6F6 LOOP026
A730 LOOP027
A765 LOOP028
A78E LOOP029
A7CF LOOP030
A83A LOOP031
A83C LOOP032
A947 LOOP033
A9E5 LOOP034
AA52 LOOP035
AAB5 LOOP036
ABB3 LOOP037
ABCA LOOP038
ABFC LOOP039
AC73 LOOP040
ADCA LOOP041
ADD7 LOOP042
ADF4 LOOP043
ADFB LOOP044
AE1A LOOP045
AEB3 LOOP046
AEE7 LOOP047
AF3F LOOP048
AFD5 LOOP049
AFEC LOOP050
B011 LOOP051
B056 LOOP052
B1FE LOOP053
B200 LOOP054
B234 LOOP055
B276 LOOP056
B286 LOOP057
B2C1 LOOP058
B3AF LOOP059
B3BC LOOP060
B3EE LOOP061
B41B LOOP062
B441 LOOP063
B44C LOOP064
B488 LOOP065
B492 LOOP066
B4BD LOOP067
B51C LOOP068
B54E LOOP069
B57C LOOP070
B5C1 LOOP071
B5D1 LOOP072
B5EA LOOP073
B5EF LOOP074
B601 LOOP075
B632 LOOP076
B662 LOOP077
B664 LOOP078
B896 LOOP079
A0F8 LRSHEADER
=D008 M0PL
=D009 M1PL
=D00A M2PL
=D00B M3PL
AA79 MANEUVER
=0DE9 MAPTO80
=0EE9 MAPTOBCD99
=0079 MAXSPCOBJIND
=0068 MEMPTR
=00AA MILESTTIM0
=00AB ?MILESTTIM1
=00AE ?MILESTVELINDX0
=00AF ?MILESTVELINDX1
=00B0 ?MILESTVELINDY0
=00B1 ?MILESTVELINDY1
=00AC MILESTVELINDZ0
=00AD ?MILESTVELINDZ1
=0062 MISSIONLEVEL
BF0C MISSIONPHRTAB
ADF1 MODDLST
BFBB MOVEPROBTAB
BE29 MSGBITTAB
BE26 MSGOFFTAB
BE2C MSGONTAB
=0080 NEG
=0065 NEWTITLEPHR
=0071 NEWVELOCITY
=0096 NEWZYLONDIST
=D40E NMIEN
AEA8 NOISE
=00DC NOISEAUDC2
=00DD NOISEAUDC3
=00DE NOISEAUDF1
=00DF NOISEAUDF2
=00DB NOISEEXPLTIM
=00E0 NOISEFRQINC
=00E3 NOISEHITLIFE
=00E1 NOISELIFE
BF20 NOISEPATTAB
BFF3 NOISETORPFRQTAB
=00DA NOISETORPTIM
BFEB NOISETORPVOLTAB
=00E2 NOISEZYLONTIM
=0031 NUMSPCOBJ.ALL
=0011 NUMSPCOBJ.NORM
=0005 NUMSPCOBJ.PL
=000C NUMSPCOBJ.STARS
=007A OLDMAXSPCOBJIND
=0084 OLDTRIG0
=009E OLDZYLONDIST
=D00F P3PL
=D302 PACTL
=0949 PANELTXT
BB42 PANELTXTTAB
=00A6 PENCOLUMN
=00A5 PENROW
=00F2 PF0COLOR
=00F7 PF0COLORDLI
=00F3 ?PF1COLOR
=00F8 ?PF1COLORDLI
=00F4 PF2COLOR
=00F9 ?PF2COLORDLI
=00F5 ?PF3COLOR
=00FA ?PF3COLORDLI
BFA9 PFCOLORTAB
=1000 PFMEM
=1000 PFMEM.C0R0
=12A8 PFMEM.C0R17
=10C8 PFMEM.C0R5
=1B36 PFMEM.C120R71
=1BFE PFMEM.C120R76
=1C9E PFMEM.C120R80
=1D40 PFMEM.C128R84
=1D68 PFMEM.C128R85
=1D42 PFMEM.C136R84
=1D6A PFMEM.C136R85
=1C04 PFMEM.C144R76
=1CA4 PFMEM.C144R80
=17BB PFMEM.C76R49
=17E3 PFMEM.C76R50
=17BC PFMEM.C80R49
=17E4 PFMEM.C80R50
=0864 PFMEMROWHI
=0800 PFMEMROWLO
=0966 PHIC1
BBAA PHRASETAB
=0CEE PIXELBYTE
=0C8C PIXELBYTEOFF
=0C2A PIXELCOLUMN
BAB0 PIXELMASKTAB
=0C5B PIXELROW
=0BF9 PIXELROWNEW
=0CBD PIXELSAVE
=00EE PL0COLOR
=0C2A PL0COLUMN
=0400 PL0DATA
=0CBD PL0HEIGHT
=0CEE PL0HEIGHTNEW
=00E9 PL0LIFE
=0C5B PL0ROW
=0BF9 PL0ROWNEW
=00E4 PL0SHAPOFF
=0C8C PL0SHAPTYPE
=0B97 ?PL0XVEL
=0BC8 ?PL0YVEL
=0A40 PL0ZPOSHI
=0B66 ?PL0ZVEL
=00EF ?PL1COLOR
=0C2B PL1COLUMN
=0500 PL1DATA
=0CBE PL1HEIGHT
=0CEF PL1HEIGHTNEW
=00EA PL1LIFE
=0C5C PL1ROW
=0BFA PL1ROWNEW
=00E5 PL1SHAPOFF
=0C8D PL1SHAPTYPE
=0B98 ?PL1XVEL
=0BC9 ?PL1YVEL
=0B67 ?PL1ZVEL
=00F0 ?PL2COLOR
=0C2C PL2COLUMN
=0600 PL2DATA
=0CBF PL2HEIGHT
=0CF0 PL2HEIGHTNEW
=00EB PL2LIFE
=0C5D PL2ROW
=0BFB PL2ROWNEW
=00E6 PL2SHAPOFF
=0C8E PL2SHAPTYPE
=0A73 PL2XPOSHI
=0B06 ?PL2XPOSLO
=09E0 ?PL2XPOSSIGN
=0B99 PL2XVEL
=0AA4 PL2YPOSHI
=0B37 ?PL2YPOSLO
=0A11 PL2YPOSSIGN
=0BCA PL2YVEL
=0A42 PL2ZPOSHI
=0AD5 PL2ZPOSLO
=09AF PL2ZPOSSIGN
=0B68 PL2ZVEL
=00F1 ?PL3COLOR
=0C2D PL3COLUMN
=0700 PL3DATA
=0CC0 PL3HEIGHT
=0CF1 PL3HEIGHTNEW
=0082 PL3HIT
=00EC PL3LIFE
=0C5E PL3ROW
=0BFC PL3ROWNEW
=00E7 PL3SHAPOFF
=0C8F PL3SHAPTYPE
=0A74 PL3XPOSHI
=0B07 PL3XPOSLO
=09E1 PL3XPOSSIGN
=0B9A PL3XVEL
=0AA5 PL3YPOSHI
=0B38 PL3YPOSLO
=0A12 PL3YPOSSIGN
=0BCB PL3YVEL
=0A43 PL3ZPOSHI
=0AD6 PL3ZPOSLO
=09B0 PL3ZPOSSIGN
=0B69 PL3ZVEL
=0C2E PL4COLUMN
=0300 PL4DATA
=0CC1 PL4HEIGHT
=0CF2 PL4HEIGHTNEW
=0083 PL4HIT
=00ED PL4LIFE
=0C5F PL4ROW
=0BFD PL4ROWNEW
=00E8 PL4SHAPOFF
=0C90 PL4SHAPTYPE
=0A75 PL4XPOSHI
=0B08 ?PL4XPOSLO
=09E2 PL4XPOSSIGN
=0B9B PL4XVEL
=0AA6 PL4YPOSHI
=0B39 ?PL4YPOSLO
=0A13 PL4YPOSSIGN
=0BCC PL4YVEL
=0A44 PL4ZPOSHI
=0AD7 ?PL4ZPOSLO
=09B1 PL4ZPOSSIGN
=0B6A PL4ZVEL
B8DF PLCOLOROFFTAB
B8E4 PLSHAP1TAB
B9B1 PLSHAP2TAB
BFDB PLSHAPBRITTAB
BFD1 PLSHAPCOLORTAB
BE2F PLSHAPOFFTAB
BE7F PLSHPHEIGHTTAB
BEDB PLSTARBAOFFTAB
=0089 PLTRACKED
=D407 PMBASE
=D300 PORTA
=D01B PRIOR
AA21 PROJECTION
=D20A RANDOM
=096C RANGEC1
BEE9 RANKTAB
=008B REDALERTLIFE
=0000 RIGHT
B7BE RNDINVXY
=0010 ROM.0
=0011 ROM.1
=0012 ROM.2
=0013 ROM.3
=0014 ROM.4
=0015 ROM.5
=0019 ROM.9
=0021 ROM.A
=0023 ROM.C
=001A ROM.COLON
=0024 ROM.D
=000E ROM.DOT
=0025 ROM.E
=0027 ROM.G
=002C ROM.L
=002E ROM.N
=0030 ROM.P
=0032 ROM.R
=0033 ROM.S
=0000 ROM.SPC
=0034 ROM.T
=0037 ROM.W
=0039 ROM.Y
=E000 ROMCHARSET
B69B ROTATE
=00CB SCORE
=00CE SCOREDCLASSIND
=00CD SCOREDRANKIND
B6FB SCREENCOLUMN
B71E SCREENROW
BED1 SECTORCHARTAB
BBA6 SECTORTYPETAB
B162 SELECTWARP
B223 SETTITLE
B045 SETVIEW
=0090 SHAP.HYPERWARP
=0060 SHAP.METEOR
=0030 SHAP.STARBASEC
=0020 SHAP.STARBASEL
=0040 SHAP.STARBASER
=0000 ?SHAP.TORPEDO
=0050 SHAP.TRANSVSSL
=0080 SHAP.ZBASESTAR
=0070 SHAP.ZCRUISER
=0010 SHAP.ZFIGHTER
=0081 SHIELDSCOLOR
=00D0 SHIPVIEW
B8A7 SHOWCOORD
B8CD SHOWDIGITS
=D20F SKCTL
A172 SKIP001
A21F SKIP002
A250 SKIP003
A262 SKIP004
A2C2 SKIP005
A2E8 SKIP006
A30E SKIP007
A39E SKIP008
A3BB SKIP009
A3C6 SKIP010
A3DF SKIP011
A3EA SKIP012
A3FE SKIP013
A43C SKIP014
A43F SKIP015
A473 SKIP016
A49A SKIP017
A4A7 SKIP018
A4AD SKIP019
A4CA SKIP020
A4DB SKIP021
A4E5 SKIP022
A4ED SKIP023
A503 SKIP024
A52A SKIP025
A52E SKIP026
A53E SKIP027
A548 SKIP028
A569 SKIP029
A58D SKIP030
A5A3 SKIP031
A5A5 SKIP032
A5AB SKIP033
A5D0 SKIP034
A600 SKIP035
A60C SKIP036
A61B SKIP037
A635 SKIP038
A687 SKIP039
A69B SKIP040
A6B7 SKIP041
A6C2 SKIP042
A6E9 SKIP043
A6EA SKIP044
A6F2 SKIP045
A715 SKIP046
A728 SKIP047
A77A SKIP048
A781 SKIP049
A7B8 SKIP050
A7BA SKIP051
A7E1 SKIP052
A7E9 SKIP053
A7EC SKIP054
A804 SKIP055
A80A SKIP056
A821 SKIP057
A827 SKIP058
A830 SKIP059
A850 SKIP060
A85F SKIP061
A898 SKIP062
A8AC SKIP063
A8E8 SKIP064
A8EC SKIP065
A900 SKIP066
A901 SKIP067
A915 SKIP068
A91E SKIP069
A96F SKIP070
A97F SKIP071
A9A6 SKIP072
AA1A SKIP073
AA20 SKIP074
AA40 SKIP075
AA66 SKIP076
AA6F SKIP077
AA78 SKIP078
AA90 SKIP079
AAB3 SKIP080
AAC8 SKIP081
AACF SKIP082
AAD5 SKIP083
AADD SKIP084
AAE0 SKIP085
AAF4 SKIP086
AB00 SKIP087
AB03 SKIP088
AB09 SKIP089
AB11 SKIP090
AB36 SKIP091
AB37 SKIP092
AB66 SKIP093
AB84 SKIP094
AB98 SKIP095
AB9C SKIP096
ABAE SKIP097
ABBA SKIP098
ABC4 SKIP099
ABDD SKIP100
ABE1 SKIP101
ABE5 SKIP102
ABE9 SKIP103
ABEB SKIP104
ABFA SKIP105
AC08 SKIP106
AC0A SKIP107
AC31 SKIP108
AC32 SKIP109
AC4F SKIP110
ACE5 SKIP111
ACF3 SKIP112
AD12 SKIP113
AD26 SKIP114
AD35 SKIP115
AD61 SKIP116
AD6C SKIP117
AD70 SKIP118
AD71 SKIP119
AD82 SKIP120
ADB8 SKIP121
ADB9 SKIP122
AE03 SKIP123
AE40 SKIP124
AE41 SKIP125
AE56 SKIP126
AE58 SKIP127
AE66 SKIP128
AEB1 SKIP129
AEC9 SKIP130
AED2 SKIP131
AEDA SKIP132
AF10 SKIP133
AF19 SKIP134
AF1E SKIP135
AF32 SKIP136
AF3C SKIP137
AF43 SKIP138
AF58 SKIP139
AF64 SKIP140
AF6F SKIP141
AF94 SKIP142
AFC6 SKIP143
AFE7 SKIP144
AFF3 SKIP145
AFFD SKIP146
B020 SKIP147
B02B SKIP148
B036 SKIP149
B040 SKIP150
B041 SKIP151
B060 SKIP152
B073 SKIP153
B082 SKIP154
B096 SKIP155
B099 SKIP156
B0E6 SKIP157
B0ED SKIP158
B0FB SKIP159
B0FC SKIP160
B106 SKIP161
B14A SKIP162
B15A SKIP163
B15D SKIP164
B161 SKIP165
B16A SKIP166
B16B SKIP167
B173 SKIP168
B1BE SKIP169
B1C8 SKIP170
B1D3 SKIP171
B1E0 SKIP172
B212 SKIP173
B21E SKIP174
B21F SKIP175
B22E SKIP176
B23A SKIP177
B249 SKIP178
B25F SKIP179
B268 SKIP180
B27C SKIP181
B2A2 SKIP182
B2A8 SKIP183
B2E1 SKIP184
B2E6 SKIP185
B2F3 SKIP186
B32B SKIP187
B337 SKIP188
B349 SKIP189
B357 SKIP190
B369 SKIP191
B397 SKIP192
B39F SKIP193
B3B9 SKIP194
B3CA SKIP195
B47C SKIP196
B4C6 SKIP197
B4F5 SKIP198
B50F SKIP199
B511 SKIP200
B516 SKIP201
B51A SKIP202
B527 SKIP203
B536 SKIP204
B53E SKIP205
B544 SKIP206
B562 SKIP207
B565 SKIP208
B569 SKIP209
B56A SKIP210
B574 SKIP211
B59A SKIP212
B5B0 SKIP213
B5BB SKIP214
B5DA SKIP215
B619 SKIP216
B61C SKIP217
B61D SKIP218
B644 SKIP219
B655 SKIP220
B68D SKIP221
B68F SKIP222
B698 SKIP223
B6A4 SKIP224
B6E1 SKIP225
B709 SKIP226
B717 SKIP227
B72E SKIP228
B73E SKIP229
B745 SKIP230
B74A SKIP231
B753 SKIP232
B75A SKIP233
B763 SKIP234
B785 SKIP235
B7A9 SKIP236
B7D7 SKIP237
B7F0 SKIP238
B803 SKIP239
B810 SKIP240
B812 SKIP241
B822 SKIP242
B85C SKIP243
B88C SKIP244
B88E SKIP245
B8A6 SKIP246
B8BD SKIP247
B2AB SOUND
BAF5 STICKINCTAB
=D209 STIMER
=0960 THETAC1
=00CF TITLELIFE
=00D1 TITLEPHR
=0D1F TITLETXT
=00BE TORPEDODELAY
=095A TRACKC1
=095C TRACKDIGIT
BECF TRACKKEYSTAB
=00C2 TRAILDELAY
=00C3 TRAILIND
=D010 TRIG0
AE29 TRIGGER
A7BF UPDATTCOMP
B804 UPDPANEL
B07B UPDSCREEN
B216 UPDTITLE
A6D1 VBIHNDLR
=D40B VCOUNT
=0200 VDSLST
=00C6 VEERMASK
BED7 VEERMASKTAB
=094B VELOCD1
=00C1 VELOCITYHI
=0070 VELOCITYLO
BAB4 VELOCITYTAB
=00C7 VICINITYMASK
BFB3 VICINITYMASKTAB
BE22 VIEWMODETAB
=0216 VIMIRQ
=0222 VVBLKI
=008F WARPARRVCOLUMN
=008E WARPARRVROW
=008D WARPDEPRCOLUMN
=008C WARPDEPRROW
=0091 WARPENERGY
BADD WARPENERGYTAB
BB3A WARPSTARXTAB
BB3E WARPSTARYTAB
=00C0 WARPSTATE
=00C4 WARPTEMPCOLUMN
=00C5 WARPTEMPROW
BC2B WORDTAB
=D40A WSYNC
=0A71 XPOSHI
=0B04 XPOSLO
=09DE XPOSSIGN
=0B97 XVEL
=0AA2 YPOSHI
=0B35 YPOSLO
=0A0F YPOSSIGN
=0BC8 YVEL
=0A40 ZPOSHI
=0AD3 ZPOSLO
=09AD ZPOSSIGN
=0B66 ZVEL
=00BF ZYLONATTACKER
=00A8 ZYLONFLPAT0
=00A9 ?ZYLONFLPAT1
BF91 ZYLONFLPATTAB
BF85 ZYLONHOMVELTAB
BF89 ZYLONSHAPTAB
=00BA ZYLONTIMX0
=00BB ?ZYLONTIMX1
=00BC ?ZYLONTIMY0
=00BD ?ZYLONTIMY1
=0078 ZYLONUNITTIM
=00B4 ZYLONVELINDX0
=00B5 ?ZYLONVELINDX1
=00B6 ?ZYLONVELINDY0
=00B7 ?ZYLONVELINDY1
=00B2 ZYLONVELINDZ0
=00B3 ?ZYLONVELINDZ1
BF99 ZYLONVELTAB
SYMBOLS (SORTED BY VALUE): 898
=0000 CCS.0
=0000 RIGHT
=0000 ROM.SPC
=0000 ?SHAP.TORPEDO
=0001 ?CCS.1
=0002 ?CCS.2
=0003 ?CCS.3
=0004 ?CCS.4
=0005 ?CCS.5
=0005 NUMSPCOBJ.PL
=0006 ?CCS.6
=0007 ?CCS.7
=0008 ?CCS.8
=0009 CCS.9
=000A CCS.SPC
=000B CCS.COLON
=000C CCS.BORDERSW
=000C NUMSPCOBJ.STARS
=000D CCS.E
=000E CCS.INF
=000E ROM.DOT
=000F CCS.MINUS
=0010 CCS.PLUS
=0010 ROM.0
=0010 SHAP.ZFIGHTER
=0011 CCS.PHI
=0011 NUMSPCOBJ.NORM
=0011 ROM.1
=0012 CCS.V
=0012 ROM.2
=0013 CCS.R
=0013 ROM.3
=0014 CCS.THETA
=0014 ROM.4
=0015 CCS.K
=0015 ROM.5
=0016 CCS.T
=0017 ?CCS.C
=0018 CCS.BORDERS
=0019 CCS.BORDERW
=0019 ROM.9
=001A CCS.CORNERSW
=001A ROM.COLON
=001B CCS.STARBASE
=001C CCS.4ZYLONS
=001D CCS.3ZYLONS
=001E CCS.2ZYLONS
=0020 SHAP.STARBASEL
=0021 ROM.A
=0023 ROM.C
=0024 ROM.D
=0025 ROM.E
=0027 ROM.G
=002C ROM.L
=002E ROM.N
=0030 ROM.P
=0030 SHAP.STARBASEC
=0031 NUMSPCOBJ.ALL
=0032 ROM.R
=0033 ROM.S
=0034 ROM.T
=0037 ROM.W
=0039 ROM.Y
=0040 CCS.COL1
=0040 EOP
=0040 SHAP.STARBASER
=0050 SHAP.TRANSVSSL
=0060 SHAP.METEOR
=0062 MISSIONLEVEL
=0063 FKEYCODE
=0064 ISDEMOMODE
=0065 NEWTITLEPHR
=0066 IDLECNTHI
=0067 ISVBISYNC
=0068 L.DIVISOR
=0068 L.MEMPTR1
=0068 L.RANGE
=0068 MEMPTR
=006A DIVIDEND
=006A L.CTRLDZYLON
=006A L.DIFFC
=006A L.DIRECTIONIND
=006A L.FOURCOLORPIX
=006A L.GCMEMMAPIND
=006A L.HEIGHTCNT
=006A L.ISDESTROYED
=006A L.KEYCODE
=006A L.MAXRNDXY
=006A L.MEMPTR2
=006A L.NEWSECTOR
=006A L.NUMBYTES
=006A L.PIXELBYTEOFF
=006A L.RANGEINDEX
=006A L.SECTORTYPE
=006A L.SIGNCHAR
=006A L.TERM3LO
=006A L.VECCOMPIND
=006A L.VELSIGN
=006A L.WARPARRVCOL
=006A L.WORD
=006B L.ABSDIFFCOL
=006B L.BITPAT
=006B L.COLORMASK
=006B L.COLUMNPOS
=006B L.LOOPCNT2
=006B L.PLHIT
=006B L.SECTORCNT
=006B L.TERM3HI
=006B L.VELOCITYHI
=006C L.SHIFTSHAPE
=006C L.TERM3SIGN
=006C L.TOKEN
=006C L.VIEWDIR
=006D JOYSTICKDELTA
=006D L.PIXELCOLUMN
=006D L.PIXELROW
=006D L.QUOTIENT
=006E L.DIRSAV
=006E L.LOOPCNT
=006E L.TRAILCNT
=006E L.ZPOSOFF
=0070 SHAP.ZCRUISER
=0070 VELOCITYLO
=0071 NEWVELOCITY
=0072 COUNT8
=0073 EXPLLIFE
=0074 CLOCKTIM
=0075 DOCKSTATE
=0076 COUNT256
=0077 IDLECNTLO
=0078 ZYLONUNITTIM
=0079 MAXSPCOBJIND
=007A OLDMAXSPCOBJIND
=007B ISSTARBASESECT
=007C ISTRACKCOMPON
=007D DRAINSHIELDS
=007E DRAINATTCOMP
=007F ENERGYCNT
=0080 CCS.COL2
=0080 DOWN
=0080 DRAINENGINES
=0080 EOS
=0080 EOW
=0080 NEG
=0080 SHAP.ZBASESTAR
=0081 SHIELDSCOLOR
=0082 PL3HIT
=0083 PL4HIT
=0084 OLDTRIG0
=0086 ISTRACKING
=0087 BARRELNR
=0088 LOCKONLIFE
=0089 PLTRACKED
=008A HITBADNESS
=008B REDALERTLIFE
=008C WARPDEPRROW
=008D WARPDEPRCOLUMN
=008E WARPARRVROW
=008F WARPARRVCOLUMN
=0090 CURRSECTOR
=0090 SHAP.HYPERWARP
=0091 WARPENERGY
=0092 ARRVSECTOR
=0093 HUNTSECTOR
=0094 HUNTSECTCOLUMN
=0095 HUNTSECTROW
=0096 NEWZYLONDIST
=009E OLDZYLONDIST
=009F HUNTTIM
=00A0 BLIPCOLUMN
=00A1 BLIPROW
=00A2 BLIPCYCLECNT
=00A3 ISINLOCKON
=00A4 DIRLEN
=00A5 PENROW
=00A6 PENCOLUMN
=00A7 CTRLDZYLON
=00A8 ZYLONFLPAT0
=00A9 ?ZYLONFLPAT1
=00AA MILESTTIM0
=00AB ?MILESTTIM1
=00AC MILESTVELINDZ0
=00AD ?MILESTVELINDZ1
=00AE ?MILESTVELINDX0
=00AF ?MILESTVELINDX1
=00B0 ?MILESTVELINDY0
=00B1 ?MILESTVELINDY1
=00B2 ZYLONVELINDZ0
=00B3 ?ZYLONVELINDZ1
=00B4 ZYLONVELINDX0
=00B5 ?ZYLONVELINDX1
=00B6 ?ZYLONVELINDY0
=00B7 ?ZYLONVELINDY1
=00B8 ISBACKATTACK0
=00B9 ?ISBACKATTACK1
=00BA ZYLONTIMX0
=00BB ?ZYLONTIMX1
=00BC ?ZYLONTIMY0
=00BD ?ZYLONTIMY1
=00BE TORPEDODELAY
=00BF ZYLONATTACKER
=00C0 CCS.COL3
=00C0 LONG
=00C0 WARPSTATE
=00C1 VELOCITYHI
=00C2 TRAILDELAY
=00C3 TRAILIND
=00C4 WARPTEMPCOLUMN
=00C5 WARPTEMPROW
=00C6 VEERMASK
=00C7 VICINITYMASK
=00C8 JOYSTICKX
=00C9 JOYSTICKY
=00CA KEYCODE
=00CB SCORE
=00CD SCOREDRANKIND
=00CE SCOREDCLASSIND
=00CF TITLELIFE
=00D0 SHIPVIEW
=00D1 TITLEPHR
=00D2 BEEPFRQIND
=00D3 BEEPREPEAT
=00D4 BEEPTONELIFE
=00D5 BEEPPAUSELIFE
=00D6 BEEPPRIORITY
=00D7 BEEPFRQSTART
=00D8 BEEPLIFE
=00D9 BEEPTOGGLE
=00DA NOISETORPTIM
=00DB NOISEEXPLTIM
=00DC NOISEAUDC2
=00DD NOISEAUDC3
=00DE NOISEAUDF1
=00DF NOISEAUDF2
=00E0 NOISEFRQINC
=00E1 NOISELIFE
=00E2 NOISEZYLONTIM
=00E3 NOISEHITLIFE
=00E4 PL0SHAPOFF
=00E5 PL1SHAPOFF
=00E6 PL2SHAPOFF
=00E7 PL3SHAPOFF
=00E8 PL4SHAPOFF
=00E9 PL0LIFE
=00EA PL1LIFE
=00EB PL2LIFE
=00EC PL3LIFE
=00ED PL4LIFE
=00EE PL0COLOR
=00EF ?PL1COLOR
=00F0 ?PL2COLOR
=00F1 ?PL3COLOR
=00F2 PF0COLOR
=00F3 ?PF1COLOR
=00F4 PF2COLOR
=00F5 ?PF3COLOR
=00F6 BGRCOLOR
=00F7 PF0COLORDLI
=00F8 ?PF1COLORDLI
=00F9 ?PF2COLORDLI
=00FA ?PF3COLORDLI
=00FB BGRCOLORDLI
=0200 VDSLST
=0216 VIMIRQ
=0222 VVBLKI
=0280 DSPLST
=0300 PL4DATA
=0400 PL0DATA
=0500 PL1DATA
=0600 PL2DATA
=0700 PL3DATA
=0800 PFMEMROWLO
=0864 PFMEMROWHI
=08C9 GCMEMMAP
=0949 PANELTXT
=094B VELOCD1
=0950 KILLCNTD1
=0955 ENERGYD1
=095A TRACKC1
=095C TRACKDIGIT
=0960 THETAC1
=0966 PHIC1
=096C RANGEC1
=0971 GCTXT
=097D GCWARPD1
=098D GCTRGCNT
=0992 GCSTATPHO
=0993 GCSTATENG
=0994 GCSTATSHL
=0995 GCSTATCOM
=0996 GCSTATLRS
=0997 GCSTATRAD
=09A3 GCSTARDAT
=09AD ZPOSSIGN
=09AF PL2ZPOSSIGN
=09B0 PL3ZPOSSIGN
=09B1 PL4ZPOSSIGN
=09DE XPOSSIGN
=09E0 ?PL2XPOSSIGN
=09E1 PL3XPOSSIGN
=09E2 PL4XPOSSIGN
=0A0F YPOSSIGN
=0A11 PL2YPOSSIGN
=0A12 PL3YPOSSIGN
=0A13 PL4YPOSSIGN
=0A40 PL0ZPOSHI
=0A40 ZPOSHI
=0A42 PL2ZPOSHI
=0A43 PL3ZPOSHI
=0A44 PL4ZPOSHI
=0A71 XPOSHI
=0A73 PL2XPOSHI
=0A74 PL3XPOSHI
=0A75 PL4XPOSHI
=0AA2 YPOSHI
=0AA4 PL2YPOSHI
=0AA5 PL3YPOSHI
=0AA6 PL4YPOSHI
=0AD3 ZPOSLO
=0AD5 PL2ZPOSLO
=0AD6 PL3ZPOSLO
=0AD7 ?PL4ZPOSLO
=0B04 XPOSLO
=0B06 ?PL2XPOSLO
=0B07 PL3XPOSLO
=0B08 ?PL4XPOSLO
=0B35 YPOSLO
=0B37 ?PL2YPOSLO
=0B38 PL3YPOSLO
=0B39 ?PL4YPOSLO
=0B66 ?PL0ZVEL
=0B66 ZVEL
=0B67 ?PL1ZVEL
=0B68 PL2ZVEL
=0B69 PL3ZVEL
=0B6A PL4ZVEL
=0B97 ?PL0XVEL
=0B97 XVEL
=0B98 ?PL1XVEL
=0B99 PL2XVEL
=0B9A PL3XVEL
=0B9B PL4XVEL
=0BC8 ?PL0YVEL
=0BC8 YVEL
=0BC9 ?PL1YVEL
=0BCA PL2YVEL
=0BCB PL3YVEL
=0BCC PL4YVEL
=0BF9 PIXELROWNEW
=0BF9 PL0ROWNEW
=0BFA PL1ROWNEW
=0BFB PL2ROWNEW
=0BFC PL3ROWNEW
=0BFD PL4ROWNEW
=0C2A PIXELCOLUMN
=0C2A PL0COLUMN
=0C2B PL1COLUMN
=0C2C PL2COLUMN
=0C2D PL3COLUMN
=0C2E PL4COLUMN
=0C5B PIXELROW
=0C5B PL0ROW
=0C5C PL1ROW
=0C5D PL2ROW
=0C5E PL3ROW
=0C5F PL4ROW
=0C8C PIXELBYTEOFF
=0C8C PL0SHAPTYPE
=0C8D PL1SHAPTYPE
=0C8E PL2SHAPTYPE
=0C8F PL3SHAPTYPE
=0C90 PL4SHAPTYPE
=0CBD PIXELSAVE
=0CBD PL0HEIGHT
=0CBE PL1HEIGHT
=0CBF PL2HEIGHT
=0CC0 PL3HEIGHT
=0CC1 PL4HEIGHT
=0CEE PIXELBYTE
=0CEE PL0HEIGHTNEW
=0CEF PL1HEIGHTNEW
=0CF0 PL2HEIGHTNEW
=0CF1 PL3HEIGHTNEW
=0CF2 PL4HEIGHTNEW
=0D1F TITLETXT
=0D35 GCPFMEM
=0DE9 MAPTO80
=0EE9 MAPTOBCD99
=1000 PFMEM
=1000 PFMEM.C0R0
=10C8 PFMEM.C0R5
=12A8 PFMEM.C0R17
=17BB PFMEM.C76R49
=17BC PFMEM.C80R49
=17E3 PFMEM.C76R50
=17E4 PFMEM.C80R50
=1B36 PFMEM.C120R71
=1BFE PFMEM.C120R76
=1C04 PFMEM.C144R76
=1C9E PFMEM.C120R80
=1CA4 PFMEM.C144R80
=1D40 PFMEM.C128R84
=1D42 PFMEM.C136R84
=1D68 PFMEM.C128R85
=1D6A PFMEM.C136R85
A000 CHARSET
A0F8 LRSHEADER
A109 AFTHEADER
A11A GCHEADER
A12E DLSTGC
A14A INITCOLD
A15A INITSELECT
A15C INITDEMO
A15E INITSTART
A165 LOOP001
A172 SKIP001
A1F3 GAMELOOP
A201 LOOP002
A21F SKIP002
A227 LOOP003
A250 SKIP003
A262 SKIP004
A26A LOOP004
A277 LOOP005
A284 LOOP006
A291 LOOP007
A29E LOOP008
A2BA LOOP009
A2C2 SKIP005
A2E0 LOOP010
A2E8 SKIP006
A306 LOOP011
A30E SKIP007
A327 LOOP012
A343 LOOP013
A389 LOOP014
A39E SKIP008
A3A6 LOOP015
A3BB SKIP009
A3BD LOOP016
A3C6 SKIP010
A3DF SKIP011
A3E4 LOOP017
A3EA SKIP012
A3EB LOOP018
A3FE SKIP013
A422 LOOP019
A428 LOOP020
A43C SKIP014
A43F SKIP015
A453 LOOP021
A473 SKIP016
A47D JUMP001
A49A SKIP017
A4A4 JUMP002
A4A7 SKIP018
A4AD SKIP019
A4C0 LOOP022
A4CA SKIP020
A4DB SKIP021
A4E5 SKIP022
A4E7 LOOP023
A4ED SKIP023
A4FC LOOP024
A503 SKIP024
A52A SKIP025
A52E SKIP026
A53E SKIP027
A548 SKIP028
A569 SKIP029
A579 JUMP003
A58D SKIP030
A593 LOOP025
A5A3 SKIP031
A5A5 SKIP032
A5AB SKIP033
A5D0 SKIP034
A600 SKIP035
A60C SKIP036
A61B SKIP037
A635 SKIP038
A687 SKIP039
A69B SKIP040
A6B7 SKIP041
A6C2 SKIP042
A6D1 VBIHNDLR
A6E9 SKIP043
A6EA SKIP044
A6F2 SKIP045
A6F6 LOOP026
A715 SKIP046
A718 DLSTHNDLR
A728 SKIP047
A730 LOOP027
A74B JUMP004
A751 IRQHNDLR
A765 LOOP028
A76F DRAWLINES
A77A SKIP048
A781 SKIP049
A782 DRAWLINE
A784 DRAWLINE2
A78E LOOP029
A7B8 SKIP050
A7BA SKIP051
A7BF UPDATTCOMP
A7CF LOOP030
A7E1 SKIP052
A7E9 SKIP053
A7EC SKIP054
A804 SKIP055
A80A SKIP056
A821 SKIP057
A827 SKIP058
A830 SKIP059
A83A LOOP031
A83C LOOP032
A850 SKIP060
A85F SKIP061
A898 SKIP062
A89B HYPERWARP
A8AC SKIP063
A8E8 SKIP064
A8EC SKIP065
A900 SKIP066
A901 SKIP067
A915 SKIP068
A91E SKIP069
A947 LOOP033
A96F SKIP070
A97F SKIP071
A980 ABORTWARP
A987 ENDWARP
A98D CLEANUPWARP
A9A6 SKIP072
A9B4 INITTRAIL
A9E5 LOOP034
AA1A SKIP073
AA20 SKIP074
AA21 PROJECTION
AA40 SKIP075
AA52 LOOP035
AA66 SKIP076
AA6F SKIP077
AA78 SKIP078
AA79 MANEUVER
AA90 SKIP079
AAB3 SKIP080
AAB5 LOOP036
AAC8 SKIP081
AACF SKIP082
AAD5 SKIP083
AADD SKIP084
AAE0 SKIP085
AAF4 SKIP086
AB00 SKIP087
AB03 SKIP088
AB09 SKIP089
AB11 SKIP090
AB36 SKIP091
AB37 SKIP092
AB66 SKIP093
AB84 SKIP094
AB98 SKIP095
AB9C SKIP096
ABAE SKIP097
ABB3 LOOP037
ABBA SKIP098
ABC4 SKIP099
ABCA LOOP038
ABDD SKIP100
ABE1 SKIP101
ABE5 SKIP102
ABE9 SKIP103
ABEB SKIP104
ABFA SKIP105
ABFC LOOP039
AC08 SKIP106
AC0A SKIP107
AC31 SKIP108
AC32 SKIP109
AC4F SKIP110
AC6B INITEXPL
AC73 LOOP040
ACAF COPYPOSVEC
ACC1 COPYPOSXY
ACE5 SKIP111
ACE6 DOCKING
ACF3 SKIP112
AD12 SKIP113
AD26 SKIP114
AD35 SKIP115
AD61 SKIP116
AD6C SKIP117
AD70 SKIP118
AD71 SKIP119
AD82 SKIP120
ADB8 SKIP121
ADB9 SKIP122
ADCA LOOP041
ADD7 LOOP042
ADF1 MODDLST
ADF4 LOOP043
ADFB LOOP044
AE03 SKIP123
AE0D CLRPLAYFIELD
AE0F CLRMEM
AE1A LOOP045
AE29 TRIGGER
AE40 SKIP124
AE41 SKIP125
AE56 SKIP126
AE58 SKIP127
AE66 SKIP128
AEA8 NOISE
AEB1 SKIP129
AEB3 LOOP046
AEC9 SKIP130
AECA HOMINGVEL
AED2 SKIP131
AEDA SKIP132
AEE1 DAMAGE
AEE7 LOOP047
AF10 SKIP133
AF19 SKIP134
AF1E SKIP135
AF32 SKIP136
AF3C SKIP137
AF3D COLLISION
AF3F LOOP048
AF43 SKIP138
AF58 SKIP139
AF64 SKIP140
AF6F SKIP141
AF94 SKIP142
AFC6 SKIP143
AFD5 LOOP049
AFE7 SKIP144
AFEC LOOP050
AFF3 SKIP145
AFFD SKIP146
AFFE KEYBOARD
B011 LOOP051
B020 SKIP147
B02B SKIP148
B036 SKIP149
B040 SKIP150
B041 SKIP151
B045 SETVIEW
B056 LOOP052
B060 SKIP152
B073 SKIP153
B07B UPDSCREEN
B082 SKIP154
B096 SKIP155
B099 SKIP156
B0E6 SKIP157
B0ED SKIP158
B0FB SKIP159
B0FC SKIP160
B106 SKIP161
B10A GAMEOVER
B121 GAMEOVER2
B14A SKIP162
B15A SKIP163
B15D SKIP164
B161 SKIP165
B162 SELECTWARP
B16A SKIP166
B16B SKIP167
B173 SKIP168
B1A7 CALCWARP
B1BE SKIP169
B1C8 SKIP170
B1D3 SKIP171
B1E0 SKIP172
B1FE LOOP053
B200 LOOP054
B212 SKIP173
B216 UPDTITLE
B21E SKIP174
B21F SKIP175
B223 SETTITLE
B22E SKIP176
B234 LOOP055
B23A SKIP177
B249 SKIP178
B25F SKIP179
B268 SKIP180
B276 LOOP056
B27C SKIP181
B286 LOOP057
B2A2 SKIP182
B2A8 SKIP183
B2AB SOUND
B2C1 LOOP058
B2E1 SKIP184
B2E6 SKIP185
B2F3 SKIP186
B32B SKIP187
B337 SKIP188
B349 SKIP189
B357 SKIP190
B369 SKIP191
B397 SKIP192
B39F SKIP193
B3A6 BEEP
B3AF LOOP059
B3B9 SKIP194
B3BA INITIALIZE
B3BC LOOP060
B3CA SKIP195
B3EE LOOP061
B41B LOOP062
B441 LOOP063
B44C LOOP064
B47C SKIP196
B488 LOOP065
B492 LOOP066
B4B9 DRAWGC
B4BD LOOP067
B4C6 SKIP197
B4E4 FLUSHGAMELOOP
B4F5 SKIP198
B50F SKIP199
B511 SKIP200
B516 SKIP201
B51A SKIP202
B51C LOOP068
B527 SKIP203
B536 SKIP204
B53E SKIP205
B544 SKIP206
B54E LOOP069
B562 SKIP207
B565 SKIP208
B569 SKIP209
B56A SKIP210
B574 SKIP211
B57C LOOP070
B59A SKIP212
B5B0 SKIP213
B5BB SKIP214
B5C1 LOOP071
B5D1 LOOP072
B5DA SKIP215
B5EA LOOP073
B5EF LOOP074
B601 LOOP075
B619 SKIP216
B61C SKIP217
B61D SKIP218
B632 LOOP076
B644 SKIP219
B655 SKIP220
B662 LOOP077
B664 LOOP078
B68D SKIP221
B68F SKIP222
B698 SKIP223
B69B ROTATE
B6A4 SKIP224
B6E1 SKIP225
B6FB SCREENCOLUMN
B709 SKIP226
B717 SKIP227
B71E SCREENROW
B72E SKIP228
B73E SKIP229
B745 SKIP230
B74A SKIP231
B753 SKIP232
B75A SKIP233
B763 SKIP234
B764 INITPOSVEC
B785 SKIP235
B7A9 SKIP236
B7BE RNDINVXY
B7D7 SKIP237
B7F0 SKIP238
B7F1 ISSURROUNDED
B803 SKIP239
B804 UPDPANEL
B810 SKIP240
B812 SKIP241
B822 SKIP242
B85C SKIP243
B86F DECENERGY
B88C SKIP244
B88E SKIP245
B896 LOOP079
B8A6 SKIP246
B8A7 SHOWCOORD
B8BD SKIP247
B8CD SHOWDIGITS
B8DF PLCOLOROFFTAB
B8E4 PLSHAP1TAB
B9B1 PLSHAP2TAB
BA62 DLSTFRAG
BA6A DLSTFRAGGC
BA6D DLSTFRAGLRS
BA75 DLSTFRAGAFT
BA7D DLSTFRAGFRONT
BA8C DLSTFRAGOFFTAB
BA90 FOURCOLORPIXEL
BAB0 PIXELMASKTAB
BAB4 VELOCITYTAB
BABE KEYTAB
BAD3 DRAINRATETAB
BADD WARPENERGYTAB
BAF5 STICKINCTAB
BAF9 DRAWLINESTAB
BB3A WARPSTARXTAB
BB3E WARPSTARYTAB
BB42 PANELTXTTAB
BBA6 SECTORTYPETAB
BBAA PHRASETAB
BC2B WORDTAB
BE22 VIEWMODETAB
BE26 MSGOFFTAB
BE29 MSGBITTAB
BE2C MSGONTAB
BE2F PLSHAPOFFTAB
BE7F PLSHPHEIGHTTAB
BECF TRACKKEYSTAB
BED1 SECTORCHARTAB
BED7 VEERMASKTAB
BEDB PLSTARBAOFFTAB
BEDD BONUSTAB
BEE9 RANKTAB
BEFC CLASSTAB
BF0C MISSIONPHRTAB
BF10 DAMAGEPROBTAB
BF14 DAMAGEPHRTAB
BF1A DESTROYPHRTAB
BF20 NOISEPATTAB
BF3E BEEPPATTAB
BF5C BEEPFRQTAB
BF6E BLIPSHAPTAB
BF73 BARRELXTAB
BF75 HITMAXZTAB
BF7D HITMINZTAB
BF85 ZYLONHOMVELTAB
BF89 ZYLONSHAPTAB
BF91 ZYLONFLPATTAB
BF99 ZYLONVELTAB
BFA9 PFCOLORTAB
BFB3 VICINITYMASKTAB
BFBB MOVEPROBTAB
BFC0 COMPASSOFFTAB
BFC9 HOMVELTAB
BFD1 PLSHAPCOLORTAB
BFDB PLSHAPBRITTAB
BFEB NOISETORPVOLTAB
BFF3 NOISETORPFRQTAB
=D000 HPOSP0
=D001 HPOSP1
=D002 HPOSP2
=D003 HPOSP3
=D004 HPOSM0
=D005 HPOSM1
=D006 HPOSM2
=D007 HPOSM3
=D008 M0PL
=D009 M1PL
=D00A M2PL
=D00B M3PL
=D00F P3PL
=D010 TRIG0
=D012 COLPM0
=D016 COLPF0
=D01B PRIOR
=D01D GRACTL
=D01E HITCLR
=D01F CONSOL
=D200 AUDF1
=D202 AUDF2
=D203 AUDC2
=D204 AUDF3
=D205 AUDC3
=D206 AUDF4
=D207 AUDC4
=D208 AUDCTL
=D209 KBCODE
=D209 STIMER
=D20A RANDOM
=D20E IRQEN
=D20F SKCTL
=D300 PORTA
=D302 PACTL
=D400 DMACTL
=D402 DLIST
=D407 PMBASE
=D409 CHBASE
=D40A WSYNC
=D40B VCOUNT
=D40E NMIEN
=E000 ROMCHARSET