First commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Fri, 15 Oct 2021 01:44:29 +0000 (21:44 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Fri, 15 Oct 2021 01:44:29 +0000 (21:44 -0400)
28 files changed:
000X0.DAT [new file with mode: 0644]
167XX.DOC [new file with mode: 0644]
CNTC65.MAC [new file with mode: 0644]
TCANP.ROM [new file with mode: 0644]
TCDEF.MAC [new file with mode: 0644]
TCEXP.MAC [new file with mode: 0644]
TCHASE.COM [new file with mode: 0644]
TCINT.MAC [new file with mode: 0644]
TCMAC.MAC [new file with mode: 0644]
TCMAIN.LDA [new file with mode: 0644]
TCMAIN.LNK [new file with mode: 0644]
TCMAIN.MAC [new file with mode: 0644]
TCMESG.MAC [new file with mode: 0644]
TCMOT.MAC [new file with mode: 0644]
TCND.MAC [new file with mode: 0644]
TCOLR1.ROM [new file with mode: 0644]
TCOLR2.ROM [new file with mode: 0644]
TCPIC.MAC [new file with mode: 0644]
TCPIC3.MAC [new file with mode: 0644]
TCPIC4.MAC [new file with mode: 0644]
TCPIC5.MAC [new file with mode: 0644]
TCPRIO.ROM [new file with mode: 0644]
TCSOUN.MAC [new file with mode: 0644]
TCSW0.ROM [new file with mode: 0644]
TCSW1.ROM [new file with mode: 0644]
TCSYNC.ROM [new file with mode: 0644]
TCTEST.MAC [new file with mode: 0644]
TCTH.MAC [new file with mode: 0644]

diff --git a/000X0.DAT b/000X0.DAT
new file mode 100644 (file)
index 0000000..56bb3ad
Binary files /dev/null and b/000X0.DAT differ
diff --git a/167XX.DOC b/167XX.DOC
new file mode 100644 (file)
index 0000000..bf14b09
Binary files /dev/null and b/167XX.DOC differ
diff --git a/CNTC65.MAC b/CNTC65.MAC
new file mode 100644 (file)
index 0000000..b1344a2
--- /dev/null
@@ -0,0 +1,668 @@
+        .SBTTL COIN65 - 650X "UNIVERSAL" COIN ROUTINE\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\r
+\r
+        .SBTTL EXPLANATION\r
+       .RAD=10\r
+        .RADIX 16\r
+       .ENABL LC\r
+        .LIST MEB\r
+;THIS IS A MAJOR REVISION OF THE COIN ROUTINE DERIVED FROM PENNY.\r
+;ALL NEW PROGRAMS SHOULD USE THIS ROUTINE.  OLD PROGRAMS CAN CONTINUE\r
+;TO USE PENNY, BUT NO FURTHER OPTIONS WILL BE SUPPORTED IN PENNY.\r
+;REVISED 7/80 TO SUPPORT BONUS-ADDER\r
+        .SBTTL DEFAULT ASSIGNMENTS\r
+        .LIST CND\r
+       .IIF NDF,FTEST,FTEST=0          ;NOT FIELD TEST\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+                                       ;ALTERNATE IS MODES=0\r
+       .IIF NDF,MECHS,MECHS=3          ;# OF MECHS (1,2 OR 3)\r
+       .IIF NDF,INCLUDE,INCLUDE=0      ;NOT ".INCLUDE"'D\r
+;IF "INCLUDE=1",THE ".END" IS SUPPRESSED\r
+       .IIF NDF,RTS,RTS=1              ;EXIT VIA RTS\r
+;IF RTS=0,EXITS BY FALLING OUT\r
+       .IIF NDF,BONADD,BONADD=0        ;DO NOT BONUS-ADDER,BONADD=1 TO DO BONUS ADDER\r
+       .IF EQ,MECHS-3                  ;DEFAULTS FOR MECHS=3\r
+       .IIF NDF,MULTS,MULTS=1                  ;IMPLEMENT H.DELMAN STANDARD MULTIPLIERS\r
+                                               ;(SEE GHM,GDM BELOW)\r
+       .IIF NDF,EMCTRS,EMCTRS=3                ;3 ELECTRO-MECH COUNTERS\r
+       .IIF NDF,OFFSET,OFFSET=1                ;OFFSET BY 1\r
+       .ENDC                           ;EQ,MECHS-3\r
+       \r
+       .IF EQ,MECHS-2                  ;DEFAULTS FOR MECHS=2\r
+       .IIF NDF,MULTS,MULTS=0                  ;MULTIPLIERS DO NOT APPLY\r
+       .IIF NDF,EMCTRS,EMCTRS=0                ;NO E.M. COUNTERS\r
+        .IIF NDF,OFFSET,OFFSET=2               ;SWITCHES AND STATUS BYTES TWO-APART\r
+       .ENDC                           ;EQ, MECHS-2\r
+\r
+       .IF EQ,MECHS-1                  ;DEFAULTS FOR MECHS=1\r
+       .IIF NDF,MULTS,MULTS=1                  ;H. DELMAN STD. MULTS\r
+       .IIF NDF,EMCTRS,EMCTRS=1                ;1 COUNTER\r
+       .IIF NDF,OFFSET,OFFSET=1                ;OFFSET FOR COUNTERS\r
+       .ENDC                           ;EQ,MECHS-1\r
+\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+;USE SEPCCT=1 ONLY FOR WIERD,NON-STANDARD MECH-MULTIPLIERS\r
+        .IIF NDF,COIN,COIN=0            ;COIN IS LOW-TRUE\r
+        .IIF NDF,CNTINT,CNTINT=1        ;COUNT INTERRUPTS (IN $INTCT)\r
+        .IIF NDF,SLAM,SLAM=1            ;SLAM IS HIGH-TRUE\r
+        .IIF NDF,CMZP,CMZP=1            ;COIN MODE IS IN ZERO-PAGE\r
+;D0,D1=0,1,2,3 FOR FREE, 2 PLAY/COIN, 1 PLAY/COIN,2 COIN/PLAY\r
+;D2,D3=0,1,2,3 FOR 1,4,5,6 "UNITS"/RIGHT COIN\r
+;D4=0,1 FOR 1,2 "UNITS"/MIDDLE COIN\r
+;ONLY D2,3,4 USED IF MODES=0\r
+        .IIF NDF,COIN67,COIN67=0        ;COINS NOT IN D7,D6 OF SAME BYTE\r
+       .IIF NDF,COIN01,COIN01=0        ;COINS NOT IN D0,D1 EITHER\r
+        .IIF NDF,PRST,PRST=30.          ;PRE-COIN SLAM KILLS COINS FOR 30 FRAMES\r
+        .IIF NDF,POST,POST=30.          ;POST-COIN SLAM KILLS COINS WITHIN 30 FRAMES\r
+       .IF NE,<EMCTRS>*<EMCTRS-1>*<EMCTRS-3>*<EMCTRS-4>\r
+       .ERROR          ;NONE,ONE,THREE, OR FOUR E.M.CTRS ONLY\r
+       .ENDC\r
+       .IF NE,FTEST\r
+       CCTRS   =1                      ;FIELD TEST, 1 COIN COUNTER\r
+       .IFF\r
+       CCTRS   =EMCTRS                 ;NORMALLY\r
+       .ENDC\r
+        .IF NE,CMZP\r
+;IF YOU USE CMZP=0, DEFINE EQUIVALENT MACROS\r
+;(GCM NOT NEEDED IF MODES=0)\r
+        .MACRO GCM\r
+;ACC0,ACC1:=COIN OPTION ACC 2-7=0,Z-FLAG SET PER ACC  CARRY IS DON'T CARE.\r
+        LDA Z,$CMODE                   ;GET COIN MODE FROM ZERO-PAGE\r
+       .IF NE,MULTS\r
+       AND I,3                         ;ISOLATE COINS-CREDITS OPTION\r
+       .ENDC                           ;NE,MULTS\r
+        .ENDM\r
+\r
+;GHM, GDM NOT NEEDED IF MULTS=0\r
+       .MACRO GHM\r
+;ACC=0 FOR 1 "UNIT" ,<>0 FOR 2 "UNITS" PER MIDDLE-MECH COIN.\r
+;  Z FLAG SET PER ACC.  CARRY IS DON'T CARE\r
+       LDA Z,$CMODE                    ;GET COIN MODE FROM ZERO-PAGE\r
+       AND I,10                        ;ISOLATE HALF-MULTIPLIER\r
+       .ENDM\r
+\r
+       .MACRO GDM\r
+;ACC=0,1,2,3 FOR 1,4,5,6 "UNITS" PER RIGHT-MECH COIN.  CARRY CLEAR.  Z-FLAG SET PER ACC\r
+       LDA Z,$CMODE\r
+       AND I,0C\r
+       LSR\r
+       LSR\r
+       .ENDM\r
+        .ENDC                  ;NE,CMZP\r
+       .MACRO GBAM\r
+;ACC= 0,1,2,3,4,5,6,7 FOR BONUS-ADDER MODE\r
+       LDA Z,$CMODE\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;ISOLATE BONUS-ADDER MODE IN BITS 0-2\r
+       .ENDM\r
+        .NLIST CND\r
+       .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\r
+       .IF NE,BONADD\r
+       .GLOBL $BCCNT\r
+       .GLOBL $BC\r
+       .ENDC\r
+       .IF NE,MODES!MULTS\r
+       .IF NE,CMZP\r
+        .GLOBL $CMODE                   ;INPUT COIN MODE\r
+       .ENDC                           ;NE, CMZP\r
+       .ENDC                           ;NE,MODES!MULTS\r
+        .GLOBL $COINA,$LAM              ;SWITCH LOCATIONS (COIN & SLAM)\r
+        .GLOBL $LMBIT                   ;MASK WITH 1 IN BIT WHERE SLAM SW. IS\r
+        .GLOBL $CNSTT,$PSTSL           ;INTERNAL LOCATIONS\r
+       .GLOBL $INTCT                   ;INTERRUPT COUNTER\r
+        .GLOBL $LMTIM,$CNCT             ;SLAM-TIMER, COINCOUNT\r
+       .IF NE,MODES\r
+        .GLOBL $$CRDT                   ;RESULT OF ALL THIS\r
+       .ENDC                           ;NE,MODES\r
+       .IF NE,EMCTRS\r
+       .GLOBL $CCTIM                   ;COIN-COUNTER TIMER BYTE(S)\r
+       .ENDC                           ;NE,EMCTRS\r
+        .IF NE,MODES*<MODES-4>\r
+        .ERROR   ;2 FLAVORS-0 OR 4 MODES\r
+        .ENDC                          ;NE,MODES*<MODES-4>\r
+       .IF NE,<MECHS-2>*<MECHS-3>*<MECHS-1>    ;CHECK # OF MECHS SPEC'D\r
+       .ERROR ;1, 2 OR 3 MECHS ONLY, PLEASE\r
+       .ENDC                           ;NE,<MECHS-2>*<CMECHS-3>*<MECHS-1>\r
+       .IF EQ,RTS!INCLUDE\r
+       .ERROR ;NO RTS, NO INCLUDE???\r
+       .ENDC                   ;RTS!INCLUDE\r
+       .IF NE,MULTS*SEPCCT\r
+       .ERROR ;BOTH MULTS AND SEPCCT?!?\r
+       .ENDC                           ;NE,MULTS*SEPCCT\r
+       .IF NE,MODES*SEPCCT\r
+       .ERROR ;SEPCCT AND MODES TOO?!?\r
+       .ENDC                           ;NE,MODES*SEPCCT\r
+        .IIF GT,PRST-31.,PRST=31.\r
+        .IIF GT,POST-63.,POST=63.\r
+;        The coin routine assumes the presence of the following .GLOBL variables:\r
+       .IF NE,BONADD\r
+       .REPT 0\r
+$BCCNT:        ONE BASE PAGE BYTE USED TO COUNT COINS TOWARDS\r
+       BONUS COINS. IT MUST BE INITIALIZED TO ZERO ON\r
+       POWER-ON. IT MUST ALSO BE INITIALIZED TO ZERO\r
+       WHEN A START-BUTTON IA PUSHED.\r
+$BC:   ONE BASE-PAGE BYTE USED TO\r
+       HOLD ACTUAL BONUS COINS ACCRUED.\r
+       INITIALIZE TO ZERO AT POWER-ON\r
+       AND EACH TIME A START BUTTON IS\r
+       PUSED.***CLEAR $BCCNT, THEN & BC.\r
+       .ENDR\r
+       .ENDC\r
+       .IF NE,MODES\r
+       .REPT 0\r
+$$CRDT:   Base page byte initialized to 0 on restart.  This is where accrued  credit\r
+        is  kept.   Should  be  decremented  for each player-start.  Note that a DECREMENT\r
+        instruction must be used to insure  mutual  exclusion  between  the  main  program\r
+        accessing  $$CRDT  and  the  interrupt-driven coin routine accessing $$CRDT".  Not\r
+        used if MODES=0\r
+       .ENDR\r
+       .ENDC                   ;NE,MODES\r
+       .IF NE,CMZP\r
+       .REPT 0\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+$CMODE:   Base page byte that contains the coin option  switches  in  its  low-order\r
+        bits  (high true).  You must put them there.  This is not used if flag CMZP=0.\r
+       See bit definitions in DEFAULT ASSIGNMENTS, and Macro definitions GCM,GHM,GDM.\r
+       .ENDR\r
+       .ENDC                   ;NE,CMZP\r
+       .REPT 0\r
+$CNSTT:   "MECHS" base page bytes ($CNSTT, $CNSTT+OFFSET,$CNSTT+2*OFFSET) which should be\r
+       initialized to 00 (the timers for coin detection).\r
+$COINA:   "MECHS" locations containing coin switches in D7. Left mech is at  $COINA,  Right\r
+        mech is  at  $COINA+(2*OFFSET). If COIN67=1, Switches  are  all in $COINA, D7-Right,\r
+       D6-Mid, D5-Left. If Coin01=1, D0-Right, D1-MId, D2-Left.\r
+       .ENDR\r
+       .IF NE,SEPCCT\r
+       .REPT 0\r
+$CNCT:    "MECHS" base page bytes ($CNCT, $CNCT+OFFSET, $CNCT+(2*OFFSET)) which must be zeroed\r
+        on pwron - coin counters for program (As distinct from $CCTIM,Below). Only one is used\r
+       if SEPCCT=0.\r
+       .ENDR\r
+       .IFF\r
+       .REPT 0\r
+$CNCT:   Base page byte which must be initialized to zero on pwron. This is used to count\r
+       coins for program (As distinct from $CCTIM, below).\r
+       .ENDR\r
+       .ENDC                   ;NE,SEPCCT\r
+       .REPT 0\r
+$PSTSL:   "MECHS" base page bytes  ($PSTSL, $PSTSL+OFFSET,$PSTSL+(2*OFFSET)used to\r
+       time post-coin slam.\r
+$LAM:     Address of the SLAM switch.  The bit position inside $LAM is specified  by\r
+       $LMBIT (see below)\r
+$LMBIT:  Mask used to select which bit in the slam switch  byte  should  be  tested\r
+        (used as I,$LMBIT).  NOT A LOCATION, JUST A VALUE!!\r
+$LMTIM:   Base  page  byte  used  as  a  timer  for  pre-slam  protection.   May  be\r
+        initialized  to  0FF  at  pwron  to  disallow  coin input for 4 seconds.  Coins are\r
+        disallowed for two frames anyway.  This will be non-zero if SLAM was\r
+       true within PRST*4 frames.\r
+$INTCT:  Interrupt counter for  long  string-timer.   If  CNTINT=1,  this  will  be\r
+        incremented  (default  case).   If CNTINT=0, this should be equated to an existing\r
+        counter.\r
+$CCTIM:  Timers(s) for pulses output to electro-mechanical counters, if EMCTRS > 0.\r
+       Sign of $CCTIM(X) set if assoc. coin counter should be turned on, cleared\r
+       for off. If 3 used, they are Left @ $CCTIM, Mid @ $CCTIM+OFFSET,\r
+       Right @ $CCTIM+(2*OFFSET)\r
+Space requirements:\r
+                RAM: 3+CMZP+2*MECHS+EMCTRS (13. TYPICAL)\r
+                ROM: About 200. bytes\r
+The coin routine also assumes it will be called 4 times  a  frame,  where  one  frame=1/60\r
+second.   In  most  cases  this may be accomplished by making the coin routine part of the\r
+interrupt routine.\r
+       .ENDR\r
+       .IF EQ,OFFSET-2\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION:  (WHERE OFFSET=2,MECHS=3)\r
+       $BCCNT: .BLKB 1         ;COUNT TOWARDS BONUS COIN\r
+       $BC:    .BLKB 1         ;BONUS COINS\r
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF 1 USED)\r
+        $$CRDT: .BLKB 1                ;CREDIT TOTAL\r
+        $CNCT:  .BLKB 1                ;COIN COUNT\r
+       $LMTIM: .BLKB 1         ;PRE-COIN SLAM-TIMER\r
+       $CMODE: .BLKB 1         ;COIN MODE\r
+        $PSTSL: .BLKB 6                ;POST-COIN SLAM TIMERS (@ 0,2,4)\r
+        $CNSTT  =$PSTSL+1      ;COIN STATUS/TIMERS (@ 1,3,5)\r
+        .ENDR\r
+       .ENDC                   ;EQ,OFFSET-2\r
+       .IF EQ,OFFSET-1\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION: (WHERE OFFSET=1,MODES=4)\r
+       $BCCNT: .BLKB 1         ;COUNT TOWARDS BONUS COIN\r
+       $BC:    .BLKB 1         ;BONUS COINS\r
+       $CCTIM: .BLKB EMCTRS    ;E.M. COUNTER TIMERS (-FOR ON)\r
+       $$CRDT: .BLKB 1         ;CREDIT TOTAL\r
+       $CNCT:  .BLKB 1         ;"UNIT-COIN" COUNT\r
+       $PSTSL: .BLKB MECHS     ;POST-COIN SLAM TIMERS\r
+       $CNSTT: .BLKB MECHS     ;COIN-STATUS/TIMER\r
+       $LMTIM: .BLKB 1         ;PRE-COIN SLAM TIMER\r
+       $CMODE: .BLKB 1         ;COIN MODE\r
+       .ENDR\r
+       .ENDC                   ;EQ,OFFSET-1\r
+        .IF EQ,MODES-4\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    FREE PLAY- $CNCT is zeroed, $$CRDT is not changed\r
+  1:    2 PLAYS PER COIN\r
+  2:    1 PLAY PER COIN\r
+  3:    2 COINS PER PLAY\r
+        .ENDR\r
+        .ENDC                  ;EQ,MODES-4\r
+        .REPT 0\r
+                   *** COIN DETECTION ***\r
+Coin detection, courtesy of Mike Albaugh, uses two counters in one  byte  ($CNSTT).   This\r
+byte  is  used to remember the condition of the coin switch.  The upper counter (D7,D6,D5)\r
+runs when the coin is absent and is reset when the coin is  present.   The  lower  counter\r
+(D4-D0)  runs  when  the  coin is present and is reset when the coin is absent, unless the\r
+coin was present for 5 successive samples.  This "unless"  enables  $CNSTT  to  "remember"\r
+that a coin has been VALID-HIGH while waiting for VALID-LOW.\r
+Basically, a valid coin is defined as between 16 and 800 ms of coin present, preceded  and\r
+followed  by  33 ms of coin absent.  The 33 ms lows need not immediately precede or follow\r
+the high.  The lower five bits count  down  from  31  when  the  coin  is  present.   This\r
+countdown  is  fast  (once  per  interupt)  for the first five samples (31-26, about 16-20\r
+milliseconds) then slow (once per EIGHT interrupts) for the remaining counts (26-0,  about\r
+800  ms).   The  count  then  stops  at zero.  This counter is reset if the coin goes away\r
+during the first five counts, I.E., the coin must be present for at least  16  ms.   After\r
+that  the coin must go away for eight counts to reset it.  This is because after the first\r
+five counts a coin is VALID HIGH and must not be reset until VALID LOW occurs  to  prevent\r
+mid-coin glitches from making a valid coin into 0 or 2 (or more) coins.\r
+\r
+The upper three bits count up from zero when the coin is absent.  The count  is  reset  if\r
+coin  is  ever  found  present.   When  the  count  finally wraps (8 samples, 33 ms).  The\r
+coin-present counter is checked.  A count from 27-31 (less than 16-20 ms) is too short.  A\r
+count of 0 (more than 800 ms) is too long.  Both of these cases are simply reset to 31.  A\r
+count of 1-26 is a (tentatively) valid coin.  The counter is again set to 31, but  another\r
+counter ($PSTSL) is started.\r
+\r
+$PSTSL is the POST-COIN-SLAM timer.  Initially  set  to  120,  it  counts  down  once  per\r
+interrupt  (4  times per frame) to give a nominal 1/2 second delay.  If the slam switch is\r
+seen during this time, $PSTSL is cleared, invalidating the coin.  The length of the  delay\r
+(in  frames)  is  defined by POST which defaults to 30.  It may be set as high as 63 (1.05\r
+seconds) by definition E.G.\r
+\r
+        POST=50         ;POST-SLAM=50 FRAMES\r
+\r
+SIMILARY A SLAM IS "REMEMBERED" FOR PRST frames (default=30, max=31) and no  coin  can  be\r
+"seen" during this time.\r
+\r
+Note that the proper initial  state  of  all  these  counters  etc  is  0,  therefore  the\r
+traditional power-on clear does the trick.  Since coins "transit" from $CNSTT to $PSTSL to\r
+$CNCT to $$CRDT, locations should be cleared in that order, I.E.   $$CRDT  should  be  the\r
+last location cleared. ($$CRDT, of course, exists only if MODES=4)\r
+        .ENDR\r
+\f        .SBTTL DETECT COIN\r
+;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT\r
+;ACTUALLY ASSEMBLED.\r
+MOOLAH:\r
+       .IF EQ,MECHS-1\r
+       LDA A,$COINA\r
+       .IF EQ,COIN01           ;IF NOT IN D0\r
+       ASL                     ;SHIFT SWITCH (D7) INTO CARRY\r
+       .IFF\r
+       LSR                     ;SHIFT SWITCH (D0) INTO CARRY\r
+       .ENDC                   ;EQ, COIN01\r
+       LDA Z,$CNSTT\r
+       .IFF                    ;IF MECHS=2 OR 3\r
+        LDX I,OFFSET*<MECHS-1> ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67!COIN01\r
+$DETCT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+$DETCT:        LDA A,$COINA            ;GET COIN SWITCHES\r
+       CPX I,OFFSET            ;WHICH MECH ARE WE DOING\r
+       BEQ 11$                 ;MIDDLE (X=OFFSET) SHIFT TWICE\r
+       BCS 12$                 ;RIGHT (X=2*OFFSET) SHIFT ONCE\r
+       .IF NE,COIN01\r
+       LSR                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   LSR\r
+12$:   LSR\r
+       .IFF\r
+       ASL                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   ASL\r
+12$:   ASL\r
+        .ENDC                  ;NE,COIN01\r
+       .ENDC                   ;EQ,COIN67!COIN01\r
+        LDA ZX,$CNSTT\r
+       .IFTF                   ;ANY # OF MECHS\r
+        AND I,31.               ;SHARED INST. SEE BELOW IN BRACKETS []\r
+        .IF EQ,COIN\r
+        BCS 5$                  ;BRANCH IF INPUT HIGH (COIN ABSENT)\r
+        .IFF\r
+        BCC 5$                  ;BRANCH IF INPUT LOW (COIN ABSENT)\r
+        .ENDC                  ;EQ,COIN\r
+;       [AND I,31.]             ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR.\r
+        BEQ 1$                  ;STICK AT 0 (TERMINAL COUNT)\r
+        CMP I,27.               ;IN FIRST FIVE SAMPLES?\r
+        BCS 10$                 ;YES, RUN FAST\r
+        TAY                     ;ELSE SAVE STATUS\r
+        LDA Z,$INTCT            ;CHECK INTERUPT CTR\r
+        AND I,7                 ;ARE D0-D2 ALL ONES?\r
+        CMP I,7                        ;SET CARRY IF SO\r
+        TYA                     ;STATUS BACK INTO ACC\r
+        BCC 1$                  ;SKIP IF NOT ALL ONES\r
+10$:    SBC I,1                 ;CARRY SET\r
+       .IFT                    ;EQ, MECHS-1\r
+1$:    STA Z,$CNSTT\r
+       .IFF                    ;IF MECHS>1\r
+1$:     STA ZX,$CNSTT           ;SAVE UPDATED STATUS\r
+       .IFTF                   ;ANY # OF MECHS\r
+        LDA A,$LAM              ;CHECK SLAM SWITCH\r
+        AND I,$LMBIT\r
+        .IF NE,SLAM\r
+        BEQ 2$                  ;BRANCH IF BIT LO (SWITCH OFF)\r
+        .IFF\r
+        BNE 2$                  ;BRANCH IF BIT HI (SWITCH OFF)\r
+        .ENDC                  ;NE,SLAM\r
+        LDA I,PRST*8            ;ELSE SET PRE-COIN SLAM TIMER\r
+        STA Z,$LMTIM            ;DECR. 8 TIMES/FRAME=PRST FRAMES\r
+2$:     LDA Z,$LMTIM            ;CHECK PRE-COIN SLAM TIMER\r
+        BEQ 3$                  ;O.K.\r
+        DEC Z,$LMTIM            ;ELSE RUN TIMER\r
+        LDA I,0\r
+       .IFT                    ;MECHS=1\r
+       STA Z,$CNSTT            ;CLEAR COIN STATUS\r
+       STA Z,$PSTSL            ;CLEAR POST-COIN SLAM TIMER\r
+3$:    CLC                     ;DEFAULT "NO COIN DETECTED"\r
+       LDA Z,$PSTSL            ;CHECK POST-COIN SLAM TIMER\r
+       BEQ 8$                  ;EMPTY, PROCEED\r
+       DEC Z,$PSTSL            ;ELSE RUN TIMER\r
+       .IFF                    ;IF MECHS>1\r
+        STA ZX,$CNSTT           ;CLEAR COIN STATUS\r
+        STA ZX,$PSTSL           ;CLEAR POST-COIN SLAM-TIMER\r
+3$:     CLC                     ;DEFAULT "NO COIN DETECTED"\r
+        LDA ZX,$PSTSL           ;CHECK POST-COIN SLAM-TIMER\r
+        BEQ 8$                  ;EMPTY, PROCEED\r
+        DEC ZX,$PSTSL           ;RUN TIMER\r
+       .IFTF                   ;ANY # OF MECHS\r
+        BNE 8$                  ;NOT DONE, PROCEED\r
+        SEC                     ;WHEN IT BECOMES ZERO, INDICATE A COIN\r
+        BCS 8$                  ;(ALWAYS)\r
+       \r
+5$:;    [AND I,31.]             GET COIN-ON DOWN-CTR (ACTUALLY DONE BEFORE)\r
+        CMP I,27.               ;IS COIN VALID YET (ON FOR >4 SAMPLES)\r
+        BCS 6$                  ;NO, RESET IT\r
+       .IFT                    ;MECHS=1\r
+       LDA Z,$CNSTT            ;GET STATUS AGAIN\r
+       .IFF                    ;MECHS>1\r
+        LDA ZX,$CNSTT           ;GET STATUS AGAIN\r
+       .IFTF                   ;ANY # OF MECHS\r
+        ADC I,32.               ;BUMP COIN-OFF UP-CTR.\r
+        BCC 1$                  ;IF IT DIDN'T WRAP, JUST STORE STATUS\r
+        BEQ 6$                  ;IT WRAPPED BUT COIN WAS ON TOO LONG, JUST RESET\r
+        CLC                     ;SET "VALIDITY" AGAIN\r
+6$:     LDA I,31.               ;RESET DOWN-COUNTER\r
+        BCS 1$                  ;BRANCH IF COIN TOO LONG OR TOO SHORT\r
+       .IFT\r
+       STA Z,$CNSTT            ;SAVE RESET STATUS\r
+       LDA Z,$PSTSL            ;CHECK HOWIE'S ASSUMPTION\r
+       .IFF\r
+        STA ZX,$CNSTT           ;SAVE RESET STATUS\r
+;       [CLC]                   DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR)\r
+        LDA ZX,$PSTSL           ;CHECK HOWIES ASSUMPTION\r
+       .IFTF                   ;ANY # MECHS\r
+        BEQ 7$                  ;BRANCH IF $PSTSL VACANT\r
+        SEC                     ;ELSE GIVE CREDIT A LITTLE EARLY\r
+7$:     LDA I,POST*4            ;/(4 COUNTS/FRAME)="POST" FRAMES\r
+       .IFT                    ;MECHS=1\r
+       STA Z,$PSTSL\r
+       .IFF                    ;MECHS>1\r
+        STA ZX,$PSTSL           ;DELAY ACCEPTANCE FOR POST/60 SEC.\r
+       .ENDC                   ;EQ,MECHS-1\r
+        \r
+8$:                             ;CARRY=1 IF COIN FALLS OUT\r
+        BCC 9$\r
+       .IF NE,MULTS\r
+;FALL THROUGH TO "MECH-MULTIPLIERS"\r
+       .PAGE\r
+       .SBTTL MECH-MULTIPLIERS\r
+       .IF EQ,MECHS-2  \r
+       TXA                     ;WHICH MECH\r
+       BEQ 85$                 ;LEFT,ADD1\r
+       .ENDC                   ;EQ,MECHS-2\r
+       .IF EQ,MECHS-3\r
+       LDA I,0                 ;START WITH 0 (TO ADD 1)\r
+       CPX I,OFFSET            ;CHECK WHICH MECH\r
+       BCC 85$                 ;IF LEFT, ALWAYS ADD 1\r
+       BEQ 83$                 ;IF CENTER, CHECK HALF-MUL\r
+       .ENDC                   ;EQ,MECHS-3\r
+       GDM                     ;GET DOLLAR MUL\r
+       BEQ 85$                 ;00-ADD 1\r
+       ADC I,2                 ;ELSE MAP 1,2,3 TO 3,4,5\r
+       .IF EQ,MECHS-3\r
+       BNE 85$                 ;(ALWAYS)\r
+       \r
+83$:   GHM\r
+       BEQ 85$\r
+       LDA I,1\r
+       .ENDC                   ;EQ,MECHS-3\r
+85$:   SEC\r
+       .IF EQ,MECHS-1\r
+       .IF NE,BONADD\r
+       PHA\r
+       ADC Z,$BCCNT                    ;UPDATE BONUS-ADDER COUNTER\r
+       STA Z,$BCCNT\r
+       PLA\r
+       SEC\r
+       .ENDC                           ;NE.BONADD\r
+       ADC Z,$CNCT\r
+       STA Z,$CNCT             ;UPDATE CNCT\r
+       .IFF                    ;IF MORE THAN ONE MECH\r
+       .IF NE,SEPCCT\r
+       .PRINT                  ;I'M NOT SURE YOU WANT TO DO THIS, ARE YOU?\r
+       .IF NE,BONADD\r
+       .PRINT  ;ERROR:ERROR:!!!!\r
+       .PRINT  ;ERROR:YOU CANNOT HAVE\r
+       .PRINT  ;SEPARATE COIN-COUNTS(SEPCCT=1)\r
+       .PRINT  ;AND BONUS-ADDER(BONADD=1)AT\r
+       .PRINT  ;THE SAME TIME. SORRY.\r
+       .PRINT  ;********************\r
+       INC AY,$BCCNT                   ;ASSEMBLED IN TO CAUSE AN ERROR.\r
+       .ENDC\r
+       ADC X,$CNCT\r
+       STA X,$CNCT             ;UPDATE COIN COUNT FOR PROGRAM\r
+       .IFF                    ;NE,SEPCCT\r
+       .IF EQ,<MULTS-1>!<CCTRS-1>      ;IF MULTS REQUIRED, BUT ONLY ONE COUNTER\r
+\r
+;THE NORMAN AVELLAR MEMORIAL KLUGE\r
+\r
+;\r
+;###NOTE:  THIS CODE PROVIDED ONLY FOR OLD AMERICAN GAMES. USE WITH 5 DM\r
+;MECHS IS STRONGLY DISCOURAGED\r
+       TAY                     ;SAVE INCREMENT\r
+       .IFTF                   ;EQ,<MULTS-1>!<CCTRS-1>\r
+       .IF NE,BONADD\r
+       PHA\r
+       ADC Z,$BCCNT                    ;UPDATE BONUS-ADDER COUNTER\r
+       STA Z,$BCCNT\r
+       PLA\r
+       SEC\r
+       .ENDC                           ;NE, BONADD\r
+       ADC $CNCT\r
+       STA $CNCT\r
+       .IFT                    ;EQ,<MULTS-1>!<CCTRS-1>\r
+       INY\r
+       TYA\r
+       .IF EQ,MECHS-3\r
+       CMP I,3                 ;IS IT DOLLAR MULT\r
+       BCC 87$                 ;NO, SKIP       \r
+       LDA I,3                 ;ELSE FORCE 4 (3+CARRY)\r
+       .IFF                    ;EQ,MECHS-3\r
+       AND I,4\r
+       BNE 87$\r
+       SEC\r
+       .ENDC                   ;EQ,MECHS-3\r
+87$:   ADC $CCTIM\r
+       STA $CCTIM\r
+       .ENDC                   ;EQ,<MULTS-1>!<CCTRS-1>\r
+       .ENDC                   ;SEPCCT\r
+       .ENDC                   ;EQ,MECHS-1\r
+       .IFF                    ;NE, MULTS\r
+;FALL THROUGH TO BUMP $CNCT\r
+       .IF EQ,MECHS-1\r
+       INC Z,$CNCT             ;BUMP COIN COUNT\r
+       .IF NE,BONADD\r
+       INC Z,$BCCNT            ;UPDATE BONUS-ADDER COUNTER\r
+       .ENDC                   ;NE, BONADD\r
+       .IFF                    ;IF MECHS=2 OR 3\r
+       .IF NE,SEPCCT           ;IF ASKED FOR SEPARATE COUNT,\r
+       INC X,$CNCT             ;USE INDEXED INC\r
+       .IF NE,BONADD\r
+       .PRINT  ;ERROR:ERROR:!!!!\r
+       .PRINT  ;ERROR:YOU CANOT HAVE\r
+       .PRINT  ;SEPARATE COIN-COUNTS(SEPCCT=1)\r
+       .PRINT  ;AND BONUS-ADDER(BONADD=1)AT\r
+       .PRINT  ;THE SAME TIME.SORRY.\r
+       .PRINT  ;********************\r
+       INC AY,$BCCNT                   ;ASSEMBLED IN TO CAUSE AN ERROR.\r
+       .ENDC\r
+       .IFF                    ;ELSE USE COMMON COUNTER\r
+        INC $CNCT\r
+       .IF NE,BONADD\r
+       INC Z,$BCCNT            ;UPDATE BONUS-ADDER COUNTER\r
+       .ENDC                   ;NE,BONADD\r
+       .ENDC                   ;NE,SEPCCT\r
+       .ENDC                   ;EQ, MECHS-1\r
+       .ENDC                   ;NE,MULTS\r
+       .IF EQ,CCTRS-1          ;IF 1 COIN COUNTER USED\r
+       .IF EQ,MULTS*<MECHS-1>  ;AND NO MULTS, OR JUST 1 MECH\r
+       INC $CCTIM              ;INIT COIN PULSE TO E.M. COUNTER\r
+       .ENDC                   ;EQ,MULTS*<MECHS-1>\r
+       .ENDC                   ;EQ,CCTRS-1\r
+       .IF NE,MECHS-1          ;IF 2 OR 3 MECHS\r
+       .IF GE,CCTRS-3          ;IF 3 OR 4 COUNTERS USED\r
+       INC X,$CCTIM            ;"QUEUE" PULSE FOR E.M. COUNTER\r
+       .ENDC                   ;EQ,CCTRS-3\r
+       .IFTF                   ;ANY # OF MECHS\r
+9$:\r
+       .IFT                    ;ONLY FOR MORE THAN ONE MECH\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+       .IF GT,.-$DETCT-126.\r
+       BMI 120$\r
+       JMP $DETCT\r
+120$:\r
+       .IFF\r
+        BPL $DETCT\r
+       .ENDC                   ;GT,.-DETECT-126.\r
+       .ENDC                   ;NE,MECHS-1\r
+       .IF NE,BONADD\r
+       ;FALL THRU TO BONUS-ADDER\r
+       .PAGE\r
+       .SBTTL BONUS-ADDER\r
+$BONUS:        GBAM                    ;GET BONUS ADDER MODE\r
+       TAY\r
+       LDA Z,$BCCNT\r
+       SEC\r
+       SBC AY,$MODLO           ;SEE IF ENOUGH UNIT-COINS HAVE ACCUMULATED\r
+       BMI $EXTB               ;BRANCH IF NOT\r
+       STA Z,$BCCNT            ;ELSE UPDATE BONUS-ADDER AND...\r
+       INC Z,$BC               ;GIVE ONE OR TWO BONUS UNIT-COINS\r
+       CPY I,3\r
+       BNE $EXTB\r
+       LDA #1\r
+       BNE $EXTB               ;BRA\r
+$MODLO:                                ;THIS IS THE NUMBER OF UNIT-COINS REQUIRED TO RECEIVE BONUS\r
+       ;.BYTE 7F,2,4,4,5,3,7F,7F       ;7F IS USED TO GENERATE ZERO BONUS COINS\r
+       .BYTE 7F,2,4,5,7F,2,4,5         ;THIS IS A SPECIAL TABLE FOR \r
+                                       ;TUBECHASE/VERTIGO...MODIFIED 4/24/81\r
+                                       ; TUBECHASE NEEDED AN EXTRA INPUT SO ONE OF THE BONUS ADDER MODES WAS\r
+                                       ; SACRIFICED TO GET AN EXTRA BIT.\r
+$EXTB:\r
+       .ENDC\r
+        .IF EQ,MODES-4          ;ONLY IF MODES=4\r
+;FALL THROUGH TO CONVERT COINS TO CREDITS\r
+       .PAGE\r
+       .SBTTL COINS TO CREDITS\r
+$CNVRT:        GCM             ;GET COIN MODE IN 0,1\r
+       TAY                     ;SAVE IT\r
+       BEQ 2$                  ;IF FREE PLAY CMODE=0, DO NOTHING\r
+       LSR                     ;ELSE FORM PRICE (0,1,1,2)\r
+       ADC I,0\r
+       EOR I,0FF\r
+       SEC\r
+       ADC $CNCT               ;ACC <- COINCT-PRICE\r
+       .IIF EQ,BONADD,BCC $EXT\r
+       .IF NE,BONADD\r
+       BCS 33$                 ;BRANCH IF NO BORROW\r
+       ;[CLC]\r
+       ADC Z,$BC                       ;ADD IN BONUS COINS-SEE IF THEY HELP\r
+       BMI $EXT                ;BRANCH IF COINCT+BONUS COINS <PRICE\r
+       STA Z,$BC                       ;ELSE ACC=UNUSED BONUS COINS\r
+       LDA I,0                 ;ACC=NEW $CNCT\r
+       .ENDC\r
+33$:                           ;GENERATE CREDITS: 1 OR 2\r
+       CPY I,2                 ;Y=COIN MODE-COIN MODE 2 OR 3?\r
+       BCS 1$                  ;BRANCH IF MODE 2 OR 3-GIVE 1 CREDIT\r
+       INC $$CRDT              ;ELSE GIVE 2 FOR MODE 1\r
+1$:    INC $$CRDT\r
+2$:    STA $CNCT               ;UPDAT COINCT\r
+       .ENDC\r
+$EXT:\r
+       .IIF NE,CNTINT, INC Z,$INTCT    ;COUNT INTERUPTS WHEN REQUESTED\r
+       .IF NE,EMCTRS           ;INCLUDE PULSER FOR E.M. CTRS\r
+;FALL THROUGH TO HANDLE E.M. COUNTERS\r
+       .SBTTL ELECTRO-MECH. CTRS\r
+       LDA Z,$INTCT            ;GET $INTCT \r
+       LSR                     ;USE LSB FOR PULSE=4 FRAMES\r
+       BCS 99$\r
+       .ENDC                   ;NE,EMCTRS\r
+       .IF EQ,EMCTRS-1\r
+       LDA Z,$CCTIM            ;GET COIN-COUNTER TIMER\r
+       BEQ 99$                 ;BRANCH IF IDLE\r
+       CMP I,10                ;MSB'S CLEAR?\r
+       BCS 1$                  ;NO,SKIP\r
+       ADC I,-1                ;ELSE INIT PULSE, SET CARRY\r
+1$:    ADC I,0EF               ;(ONE LESS CUZ CARRY SET) DEC MSB'S OF TIMER\r
+       STA Z,$CCTIM            ;STORE UPDATED TIMER\r
+       .ENDC                   ;EQ,EMCTRS-1\r
+       .IF GE,EMCTRS-3         ;IF 3 OR 4 CTRS\r
+       LDY I,0                 ;START WITH FLAG OF 0\r
+       LDX I,OFFSET*<EMCTRS-1>\r
+1$:    LDA X,$CCTIM            ;CHECK TIMER(X)\r
+       BEQ 3$                  ;NEITHER RUNNING NOR PENDING\r
+       CMP I,10                ;IS IT RUNNING\r
+       BCC 3$                  ;NO, SKIP\r
+       ADC I,0EF               ;ELSE DEC 4 MSB\r
+       INY                     ;SET ON FLAG\r
+2$:    STA X,$CCTIM\r
+3$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 1$\r
+       TYA                     ;CHECK "ON" FLAG\r
+       BNE 99$                 ;SKIP IF ANY ON\r
+;IF NONE OF THE COUNTERS ARE CURRENTLY ON, WE CHECK TO SEE IF ANY CAN BE\r
+;STARTED.\r
+       LDX I,OFFSET*<EMCTRS-1> \r
+4$:    LDA X,$CCTIM            ;NEED WE START THIS ONE\r
+       BEQ 5$                  ;NO, NO COUNTS PENDING\r
+       CLC\r
+       ADC I,0EF               ;SET 4 MSB, DEC 4 LSB\r
+       STA X,$CCTIM            ;START TIMER\r
+       BMI 99$                 ;EXIT, SO WE DON'T START MORE\r
+5$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 4$\r
+       .ENDC                   ;GE, EMCTRS-3\r
+99$:\r
+       .IF NE,RTS              ;IF THIS IS A SUBROUTINE\r
+       RTS\r
+       .ENDC                   ;NE,RTS\r
+       .RADIX .RAD             ;RESTORE RADIX\r
+\r
+       .IIF EQ,INCLUDE,        .END    ;NO .END TO ".INCLUDE"'D FILES\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/TCANP.ROM b/TCANP.ROM
new file mode 100644 (file)
index 0000000..537caef
Binary files /dev/null and b/TCANP.ROM differ
diff --git a/TCDEF.MAC b/TCDEF.MAC
new file mode 100644 (file)
index 0000000..f49ecba
--- /dev/null
+++ b/TCDEF.MAC
@@ -0,0 +1,583 @@
+       .SBTTL TCDEF\r
+       .RADIX 16\r
+;FILE TCDEF - TUBE CHASE DEFINITIONS\r
+       .SBTTL  PAGE 0 ALLOCATION & GLOBLS\r
+SPLITS =0                      ;SET TO 1 TO INCLUDE SPLIT LOGIC\r
+NOOBJTS        =7                      ;# OF SQUARES ALLOWEDD\r
+;\r
+;PAGE 0:\r
+;\r
+\r
+       .ASECT\r
+       .=0\r
+       .BLKB 1                 ;DON'T USE 0\r
+READY: .BLKB 1                 ;80=INTERRUPT DATA OK\r
+STEER: .BLKB 1                 ;CURRENT STEERING VALUE\r
+UPD:   .BLKB 1                 ;UP/DOWN STEERING\r
+VELL:  .BLKB 1                 ;LSB VELOCITY\r
+VELH:  .BLKB 1                 ;MSB VELOCITY\r
+NUMB1: .BLKB 1                 ;ADJUSTED VELOCITY TO DECIMAL\r
+NUMB2: .BLKB 1\r
+NUMB3: .BLKB 1\r
+R0:    .BLKB 1                 ;SOME REGISTERS\r
+R1:    .BLKB 1\r
+R2:    .BLKB 1\r
+R3:    .BLKB 1\r
+R4:    .BLKB 1\r
+R5:    .BLKB 1\r
+R6:    .BLKB 1\r
+TRKADL:.BLKB 1                 ;ADDRESS OF TRACK TABLE\r
+TRKADH:.BLKB 1\r
+XSVE:  .BLKB 2                 ;HOLD REGISTER\r
+ZCNTRL:        .BLKB NOOBJTS           ;OBJECT CONTROL BYTE, LEFT BOUNDARY\r
+                               ;BIT 7=ACTIVE\r
+                               ;BIT 3=SPLIT SECTION START\r
+                               ;BIT 2=FIRST SPLIT\r
+                               ;BITS 0 & 1=BITS 16 & 17 OR H POSITION\r
+ZCNTRR:        .BLKB NOOBJTS           ;OBJECT CONTROL BYTE, RIGHT BOUNDARY\r
+                               ;BIT 7=ACTIVE\r
+                               ;BITS 0 & 1=BITS 16 & 17 OF H POSITION\r
+                               ;OBJECT OFF SCREEN IF EITHETR BIT 1 OR 0 IS NOT 0\r
+ZXAXLL:        .BLKB <NOOBJTS>*2       ;XAXIS POSITION LEFT SIDE (LSB)\r
+ZXAXLH =ZXAXLL+NOOBJTS         ;XAXIS POSITION LEFT (MSB)\r
+ZXAXRL:        .BLKB <NOOBJTS>*2       ;XAXIS POSITION RIGHT SIDE (LSB)\r
+ZXAXRH =ZXAXRL+NOOBJTS         ;XAXIS POSITIONS RIGHT (MSB)\r
+ZYAXL: .BLKB <NOOBJTS>*2       ;YAXIS POSITIONS, BOTH SIDES (LSB)\r
+ZYAXH  =ZYAXL+NOOBJTS          ;MSB\r
+       .IF NE,SPLITS\r
+;SPLIT SECTION POSITIONS\r
+SXAXLL:        .BLKB <NOOBJTS>*2\r
+SXAXLH =SXAXLL+NOOBJTS\r
+SXAXRL:        .BLKB <NOOBJTS>*2\r
+SXAXRH =SXAXRL+NOOBJTS\r
+       .ENDC\r
+TLIMIT:        .BLKB 1                 ;DYNAMIC SQUARE LIMITS\r
+BLIMIT:        .BLKB 1\r
+LLIMIT:        .BLKB 1\r
+RLIMIT:        .BLKB 1\r
+       .IF NE,SPLITS\r
+OVERL: .BLKB NOOBJTS\r
+OVERR: .BLKB NOOBJTS\r
+       .ENDC\r
+COLUR: .BLKB NOOBJTS           ;COLOR OF SQUARE\r
+UPDNL: .BLKB NOOBJTS           ;UP/DOWN\r
+UPDNH: .BLKB NOOBJTS           ;UP/DOWN MSB\r
+VCENT: .BLKB 2                 ;UP/DOWN ORGEN (SCREEN ON SIDE)\r
+VCS:   .BLKB 1                 ;COEFFICIENT OF SHARPNESS FOR UP/DOWN\r
+VCRNL: .BLKB 1                 ;UP/DOWN DISTANCE COVERED\r
+VCRNH: .BLKB 1         \r
+VDIST: .BLKB 1                 ;UP/DOWN DISTANCE REQUIRED\r
+VRVL:  .BLKB 1                 ;UP/DOWN TURN COEFFICIENT\r
+VRVH:  .BLKB 1 \r
+VSTCL: .BLKB 1\r
+VSTCH: .BLKB 1                 ;SPLIT SPEED CORRECTION \r
+PYA:   .BLKB 1                 ;ADJUSTED Y POSITION\r
+STCL:  .BLKB 1                 ;STEERING "CONSTANT" (VEL*STEER)\r
+STCH:  .BLKB 1                 ;MSB OF ABOVE\r
+PYAVL: .BLKB 1                 ;ADJUSTED POSITION *VELOCITY\r
+PYAVH: .BLKB 1                 ;MSB OF ABOVE\r
+VELKL: .BLKB 1                 ;VELOCITY ADJUSTED BY K (VEL*K)\r
+VELKH: .BLKB 1                 ;MSB OF ABOVE\r
+PRODL: .BLKB 1                 ;PROJECT TERMS USED BY MULTIPLY ROUTINE\r
+PRODH: .BLKB 1\r
+ORL:   .BLKB 1                 ;ORIGIN LSB\r
+ORH:   .BLKB 1                 ;ORIGIN MIDDLE\r
+ORVH:  .BLKB 1                 ;MSB OF ORIGIN\r
+TURNL: .BLKB 1                 ;TURN DISTANCE COVERED\r
+TURNH: .BLKB 1\r
+DIST:  .BLKB 1                 ;TURN DISTANCE REQUIRED BY TRACK\r
+SKILL: .BLKB 1                 ;INDEX USED TO GET DATA FROM TRACK TABLE (SKILL LEVEL)\r
+CS:    .BLKB 1                 ;COEFFICIENT OF SHARPNESS OF TURN\r
+OBJTML:        .BLKB 1                 ;DISTANCE DRIVEN BETWEEN PYLONS\r
+OBJTMH:        .BLKB 1\r
+CRVL:  .BLKB 1                 ;TURNING COEFFICIENT (CS*VELOCITY)\r
+CRVH:  .BLKB 1\r
+PYAVKL:        .BLKB 1                 ;PYA*KP*VELOCITY\r
+PYAVKH:        .BLKB 1\r
+OUTPTR:        .BLKB 2                 ;BAR GRAPH OUTPUT\r
+;MOTION OBJECT RAM CELLS\r
+SPTR:  .BLKB 2                 ;PICTURE SOURCE PTR\r
+DPTR:  .BLKB 2                 ;PIC OUTPUT PTR\r
+DPTR2: .BLKB 2                 ;SYMMETRICAL OUTPUT POINTER\r
+ULCT:  .BLKB 1                 ;LINE COUNT\r
+SCNT:  .BLKB 1                 ;SEGMENT COUNT\r
+RCNT:  .BLKB 1                 ;REPEAT COUNT\r
+OBSPDL:        .BLKB 1                 ;LOW BYTE OF OBJECT SPEED\r
+OBSPD: .BLKB 1                 ;OBJECT 'TRUE' SPEED\r
+DISTANCE:.BLKB 1               ;DISTANCE FROM YOU\r
+                               ;0=INFINITY,50=HORIZON,0F0=VIEN POINT\r
+OBJST: .BLKB 1                 ;MOTION OBJECT STATUS & PICTURE SEQUENCE #\r
+                               ;BIT:7=ACTIVE,6=EXPLODING,5=PERSUIT,4=ACCELERATING (ON)\r
+                               ;3=ALREADY PULLED AWAY. DON'T OVER ACCEL\r
+                               ;2=DON'T AFFECT SPEED\r
+                               ;1=NOT USED\r
+                               ;0=SHOT (FROM SHIP,NOT OVER HEAD)\r
+OBJPIC:        .BLKB 1                 ;PICTURE INDEX POINTER\r
+;OBJNUM:.BLBK 1                        ;NUMBER OF PIC\r
+;THE ABOVE IS IN PAGE 2\r
+OBJV:  .BLKB 1                 ;TARGET VERTICAL\r
+OBJH:  .BLKB 1                 ;TARGET HORIZ\r
+;EXTRA VARIABLES FOR THE MULTIPLY ROUTINE\r
+MLTPLR:        .BLKB 1\r
+MLTCDL:        .BLKB 1\r
+MLTCDH:        .BLKB 1\r
+RESULT:        .BLKB 2\r
+\r
+ZHI    =.-1                    ;CLEAR AREA FOR ATTRACT\r
+\r
+SYNC:  .BLKB 1                 ;INTERRUPT & SYNC CONTROL\r
+STATE: .BLKB 1                 ;80=ATTRACT\r
+                               ;40=100K BONUS REACHED\r
+                               ;08=EX PLAY SCORE REACHED\r
+                               ;02=HIT WALL\r
+                               ;10=EX PLAY ALREADY, 01=CRASH\r
+FRAME: .BLKB 1\r
+FRAMC: .BLKB 1                 ;TOTAL FRAME COUNT\r
+QUOT:  .BLKB 2\r
+INDEX: .BLKB 1\r
+LASTT: .BLKB 2                 ;STATUS\r
+LASERD:        .BLKB 2                 ;DISTANCE\r
+LASERH:        .BLKB 2                 ;X POSITION START,END (SCREEN ON SIDE)\r
+LASERV:        .BLKB 2                 ;Y POSITION START,END\r
+SCOREH:        .BLKB 1                 ;PLAYERS SCORE (BCD)\r
+SCOREM:        .BLKB 1\r
+SCOREL:        .BLKB 1                 ;VERY BIG SCORE!\r
+ZHI2   =.-1                    ;TOP OF AREA TO BE CLEARED\r
+$INTCT:        .BLKB 1\r
+$VBLANK:       .BLKB 1\r
+$$CRDT:        .BLKB 1                 ;ACCRUED CREDIT\r
+$CMODE:        .BLKB 1                 ;COIN MODE\r
+$CNSTT:        .BLKB 3                 ;STATUS TIMERS\r
+$CNCT: .BLKB 3                 ;COIN COUNTERS\r
+$PSTSL:        .BLKB 3                 ;POST SLAM TIMER\r
+$LMTIM:        .BLKB 1                 ;POST SLAM TIME\r
+$CCTIM:        .BLKB 3                 ;MECH COUNTERS\r
+$BCCNT:        .BLKB 1                 ;BONUS ADDER FLAG\r
+$BC:   .BLKB 1\r
+;\r
+;COIN ROUTINE EQUATES FOR CONDITIONAL ASSEMBLIES\r
+;\r
+INCLUDE        =1\r
+RTS    =0\r
+SLAM   =0\r
+BONADD =1\r
+POTVAL:        .BLKB 2                 ;LEFT/RIGHT VALUE\r
+                               ;UP/DOWN VALUE\r
+RANGE: .BLKB 2                 ;RANGE OF POT\r
+ACTIVE:        .BLKB 2                 ;ACTIVITY COUNTER\r
+LOW:   .BLKB 2                 ;LOW END\r
+PDATA: .BLKB 2                 ;DATA READ AT INTERRUPTS FROM POTS\r
+TOPS:  .BLKB 1                 ;TOP SPEED\r
+;BUFFERS FOR MOTION OBJECT OUTPUT PARAMETERS\r
+MOBSTB:        .BLKB 1                 ;START LINE\r
+MOBJVB:        .BLKB 1                 ;VERTICAL (NORMAL)\r
+MOBJHB:        .BLKB 1                 ;HORIZ (NORMAL)\r
+MOBVSB:        .BLKB 1                 ;V-STOP (NORMAL)\r
+;SHELL 0 BUFFERS\r
+SHLHB: .BLKB 1                 ;SHELL 0 H BUFFER\r
+SHL0VB:        .BLKB 1                 ;V START BUFFER\r
+SL0VSB:        .BLKB 1                 ;V STOP BUFFER\r
+SHTBACK:.BLKB 1                        ;SHOOT BACK FLAG\r
+ASCI:  .BLKB 6                 ;BCD TO ASCII OUTPUT REGISTERS\r
+SHLDHT:        .BLKB 1                 ;SHEILD HIT COUNTER\r
+SHICOL:        .BLKB 1                 ;SHITELD HI COLOR\r
+HITS:  .BLKB 2                 ;HITS!\r
+OPTION:        .BLKB 1                 ;OPTION SWITCHES FROM POKEY 0\r
+HULL:  .BLKB 2                 ;HULL TEMP\r
+INTTEM:        .BLKB 1                 ;TEMP INITIAL BUFFER\r
+SECIND:        .BLKB 2                 ;SECURITY INDIRECT PTR\r
+LANG:  .BLKB 2                 ;LANGUAGE\r
+TEMP1: .BLKB 2                 ;TEMP REGS\r
+TEMP4: .BLKB 2\r
+TEMP5: .BLKB 2\r
+       .ASECT\r
+       .=100\r
+       PAGE1=.\r
+SSTAT: .BLKB 1                 ;STATUS - IS SOUND ON\r
+SOUNDN:        .BLKB 1                 ;SOUND # IN PROGRESS\r
+POINT: .BLKB 6                 ;POINTER OF OFFSETS IN DATA.0=IDEL\r
+CURRENT:.BLKB 6                        ;OUTPUT VALUE\r
+FRAMES:        .BLKB 6                 ;FRAMES UNTIL NEXT CHANGE\r
+COUNT: .BLKB 6                 ;TOTAL # OF CHANGES\r
+LOCKOUT:       .BLKB 1         ;INTERRUPT LOCK\r
+       .SBTTL BUFFER SPACE\r
+       .=200\r
+PAGE2  =.                      ;PAGE 2\r
+;BUFFER FOR LINES - 32 LINES MAX FOR SQUARES (2 LINES PER SQUARE, 16 SQUARES)\r
+VSTR:  .BLKB 20                ;VSTART FOR LINES OF TUBE\r
+VSTOP: .BLKB 20                ;VSTOP FOR LINES OF TUBE\r
+HPOST: .BLKB 20                ;POSITION OF LINES, H.\r
+ECOLOR:        .BLKB 20                ;COLOR BUFFER\r
+LASTC: .BLKB 1                 ;LAST COLOR OUTPUT\r
+COLARY:        .BLKB 10                ;COLOR ARRAY, STORES TO COLRAM(D7-D4=SHADE,D3-D0=COLOR)\r
+                               ;ON VBLANK\r
+       .REPT 0\r
+COLOR RAM ASSIGNMENTS\r
+       \r
+LOCATION                       USE\r
+       0               BLANKING,BOROER,\r
+       1               MOT OBJ (10) (D), SHELL (01)\r
+       2               MOT OBJ (01) (G), SHELL (10)\r
+       3               MOT OBJ (00) (W)\r
+       4               ALPHA & SHELL (11)\r
+       5               HILIGHT 1\r
+       6               HILIGHT 2\r
+       8-E             LINES (AS NORMAL) BACKGROUND\r
+       F               HILIGHT 3\r
+       .ENDR\r
+SMALL: .BLKB 1                 ;SMALLS (LAST) ELLIPSE OUT\r
+MOVS0: .BLKB 1                 ;VSTRETCH HOLD FOR MOITIOB OBJECTS\r
+MOVS1: .BLKB 1\r
+       .IF NE,SPLITS\r
+SPCONT:        .BLKB 1                 ;SPLIT SECTION COUNT\r
+       .ENDC\r
+NOT:   .BLKB 1                 ;DISTANCE BETWEEN RINGS\r
+HOFF:  .BLKB 1\r
+VOFF:  .BLKB 1\r
+       .IF NE,SPLITS\r
+WHICH: .BLKB 1                 ;+=LEFT SPILT,-=RIGHT\r
+       .ENDC\r
+LASTP: .BLKB 1                 ;LAST PICTURE OUTPUT\r
+UPDOWN:        .BLKB 1                 ;FLIP BIT ON PICTURE\r
+DISDLY:        .BLKB 1                 ;OBJECT OFF IN THE DISTANCE TIMER\r
+                               ;IF -, TRY TO START A NEW OBJECT\r
+                               ;IF 0, NEVER HERE BEFORE\r
+                               ;IF +, HOLD AT DISTANCE FOR A WHILE\r
+VSREG: .BLKB 1                 ;VSTOP (????) REGISTER\r
+LASTIM:        .BLKB 1                 ;SHOTS/PER "SECOND"\r
+HOTDLY:        .BLKB 1                 ;OVER HEAT DELAY STATUS INDICATOR\r
+HFLOW: .BLKB 1                 ;OVERFLOW FOR MOTION OBJECT OUTPUT\r
+SCRTIM:        .BLKB 1                 ;DISPLAY SCORE TIME\r
+SCRREG:        .BLKB 3                 ;REGISTER HOLD FOR DISPLAY\r
+OUT202:        .BLKB 1                 ;OUTPUT REGISTER FOR 2800\r
+OBJHT: .BLKB 1                 ;H POSITION TO MOVE TOWARD\r
+OBJVT: .BLKB 1                 ;SAME FOR V\r
+CRSHC: .BLKB 1                 ;WALL CRASH COUNTER (FOR USE IN DECING TOP SPEED)\r
+PTWAIT:        .BLKB 1                 ;POT ROUTINE DEACTIVE\r
+DIR:   .BLKB 1         ;DIRECTION OF COLOR CHANGE (- IS DOWN)\r
+DIR2:  .BLKB 1         ;DIR CHANGE FOR COLOR OF SHIP AND 'TUBE CHASE'\r
+OKOUT: .BLKB 1         ;OK TO OUTPUT FLAG\r
+LSTCOL:        .BLKB 1         ;BACKROUND COLOR\r
+NXTPTR:        .BLKB 1                 ;POINTER INTO COLOR TABLE\r
+NXTCLR:        .BLKB 1                 ;NEXT COLOR OF CIRCLE\r
+NXTLAS:        .BLKB 1                 ;NEXT LASER TO SHOOT\r
+NEWONE:        .BLKB 1\r
+SMOKE: .BLKB 1                 ;WALL HIT SOUND TIMER\r
+SMOK2: .BLKB 1                 ;EXPLOSION TIMER\r
+ITEMP: .BLKB 2         ;TEMP SPACE FOR INTERRUPT\r
+HILIGHT:.BLKB 1                        ;OR'ED W/CHAR OUTPUT\r
+MOBJHZ:        .BLKB 1                 ;ATTRACT REGISTER\r
+FLAST: .BLKB 1                 ;FIRE SWITCH DEBOUNCE\r
+LIVES: .BLKB 1                 ;LIVES\r
+                               ;D7-ACTIVE\r
+                               ;D6-1=SHELL,0=SMALL SHIP (WHEN D7=1)\r
+TIMEE: .BLKB 1                 ;TIME ENEMY SHIP IS VISIBLE\r
+OVERHD:        .BLKB 1                 ;DELAY TIMER FOR SHOOTHING A SHELL OVERHEAD\r
+M1:    .BLKB 1                 ;TEMP USED BY 'MOTOUT' ROUTINE\r
+M2:    .BLKB 1                 ;TEMP USED BY 'MOTOUT' ROUTINE\r
+SHIELD:        .BLKB 1                 ;BUTTON REG\r
+SHIELE:        .BLKB 2                 ;ENERGY LEFT\r
+OBJNUM:        .BLKB 1                 ;WHICH PICTURE\r
+STDELAY:.BLKB 1                        ;DELAY AFTER BEING HIT\r
+LIFETM:        .BLKB 1                 ;LIFE TIME SINCE LAST COLLISION\r
+BONMUL:        .BLKB 1                 ;BONUS MULTIPLER\r
+SHTWT: .BLKB 1                 ;SHOT DELAY START OF GAME & SHOOT ALWAYS(80)\r
+BONSND:        .BLKB 1                 ;BONUS LIFE SOUND REG\r
+BONLVL:        .BLKB 1                 ;BONUS LIFE THOUSAND LEVEL\r
+CH4BUF:        .BLKB 2         ;CHANNEL 4 BUFFER\r
+       .=300\r
+       .SBTTL  HIGH SCORE & INITIALS AREA\r
+HSCORE:        .BLKB 3*5               ;HIGH SCORES, TOP 5\r
+UPDFLG:        .BLKB 1                 ;UPDATE FLAG\r
+UPDINT:        .BLKB 1                 ;INDEX POINTER\r
+INITL: .BLKB 3*5               ;3 INITIALS EACH ENTRY\r
+ATTIM: .BLKB 1         ;ATTRACT MESSAGE OUTPUT TIMER\r
+SHDB:  .BLKB 1                 ;CHANGE OF STATE REGISTER FOR INITIAL INPUT\r
+\r
+SECBIT:        .BLKB 10                ;SKIP SOME SPACE\r
+       .BLKB 1                 ;SECURITY FLAG FOR MESSAGE ROUTINE (80=WRITE)\r
+SECURE:        .BLKB 8                 ;SECURITY AREA\r
+       .PAGE\r
+       .SBTTL  GAME CONSTANTS\r
+;\r
+;CONSTANTS\r
+;\r
+;NOOBJTS       =7              ;# OF SQUARES ALLOWED (DEFINED AT 0 PAGE START)\r
+PYMIN  =50                     ;HORIZON\r
+XMIN   =18                     ;COMPUTATION LEFT LIMIT OF "SCREEN"\r
+CRLFT  =25                     ;COMPUTATION LEFT CRASH POINT\r
+XMAX   =0E8                    ;COMPUTATION RIGHT LIMIT\r
+CRRHT  =0E8                    ;CRASH POINT RIGHT\r
+BOTTOM =0F0                    ;BOTTOM OF PLAYFIELD (WHEN BIT 9 SET)\r
+DNLMT  =20                     ;TOP OF SCEEN LIMIT FOR UP/DOWN MOTION\r
+UPLMT  =0E0                    ;BOTTOM OF SCREEN LIMIT\r
+RLMT   =0E8                    ;RIGHT MOTION LIMIT\r
+LLMT   =25                     ;LEFT MOTION LIMIT\r
+VCENTER        =80                     ;UP DOWN CENTER (SCREEN ON SIDE, BOTTOM=LEFT)\r
+GTMPL  =ALPHA+0C1\r
+SCPL   =ALPHA+0D6\r
+HTPL   =0CE                    ;HITS OUTPUT LOCATION\r
+ORGIN  =8A                     ;CENTER LEFT/RIGHT (SCREEN ON SIDE)\r
+STKPTR =0FF                    ;SET TO TOP OF PAGE 1\r
+LASPIC =0                      ;FIRST (LARGEST) OF 4 LASER PICTURES\r
+HHITW  =10                     ;HORIZ HIT WINDOW\r
+VHITW  =10                     ;VERTICAL HIT WINDOW\r
+DHITW  =10                     ;DISTANCE HIT WINDOW\r
+GRPIC0 =21                     ;BAR GRAPH DISPLAY CHAR (FIRST OF 8)\r
+HULPL  =ALPHA+08B              ;HULL TEMP INDICATOR\r
+LASPL  =ALPHA+4B               ;LOCATION OF LASER TEMP INDICATOR\r
+SHIPL  =ALPHA+06B\r
+ATCON  =8                      ;ATTRACT/HIGH SCORE TABLE TIME CONSTANT\r
+HILTC  =0                      ;HILIGHT COLOR RAM LOCATION\r
+MOTW   =03                     ;MOTION OBJ COLOR RAM LOCATION FOR W\r
+MOTG   =02                     ;MOTION OBJ COLOR RAM LOCATION FOR G\r
+MOTD   =01                     ;MOTION OBJ COLOR RAM LOCATION FOR D\r
+MOTC   =00                     ;MOTION OJB COLOR RAM LOCATION FOR C\r
+BKLCOL =07                     ;BACKROUND COLOR RAM LOCATION\r
+ALPHC  =04                     ;ALPHA COLOR LOCATION\r
+SQUARC =8                      ;BASE OF COLOR RAM FOR LINES USED FOR SQUARES\r
+HLT1   =40                     ;CONSTANTS TO OR INTO CHAR\r
+HLT2   =80\r
+HLT3   =0C0\r
+HILT1  =05                     ;RAM LOCATION HILIGHT (01)\r
+HILT2  =06                     ;RAM LOCATION HILIGHT (10)\r
+HILT3  =0F                     ;RAM LOCATION HILIGHT (11)\r
+SHL11  =4\r
+WHITE  =0                      ;COLOR EQUATES\r
+PURPLE =1\r
+BLUE   =2\r
+LTBLUE =3\r
+GREEN  =4\r
+YELLOW =5\r
+RED    =6\r
+BLACK  =7\r
+ORANGE =8\r
+CYAN   =9\r
+YELGRN =0A\r
+WHTBLU =0B\r
+YELORN =0C\r
+BROWN  =0D\r
+RED1   =0E\r
+BLACK1 =0F\r
+REDYLC =RED ? YELLOW           ;RED/YELLOW CHANGE EOR CONSTANT\r
+LIMITC =2F                     ;LIMIT CHAR FOR BAR GRAPH\r
+CIRP   =2E                     ;CIRCLE P\r
+CIRC   =2D                     ;CIRCLE C\r
+AT19   =2B                     ;1981\r
+AT81   =2C\r
+SECOFF =5E                     ;OFFSET TO NOP,RTS IN SECURE AREA\r
+LVL1   =6                      ;# OF HIB WHERE GAME GETS HARDER (1=SHOOT BACK)\r
+LVL2   =12\r
+LVL3   =18\r
+LVL4   =24\r
+HALF   =02A                    ;1 HALF CHAR\r
+       .PAGE\r
+       .SBTTL HARDWARE ADDRESSES\r
+;64 LINES\r
+LINEV  =1403                   ;LINES VERT START (TO 163D)\r
+LINEVS =1483                   ;LINES VERT STOP\r
+                               ;VERTICAL (NORMAL SCREEN) V=0=BOTTOM\r
+                               ;(SCREEN ON SIDE) V=00=LEFT, 0FF=RIGHT\r
+LINEH  =1083                   ;LINES HORIZ START\r
+                               ;HORIZ (NORMAL SCREEN) 0=LEFT\r
+                               ;(SCREEN ON SIDE) 0=TOP, 0FF=BOTTOM\r
+LINEC  =1283                   ;LINE COLOR, 4 BITS D0-D3\r
+COLRAM =1600                   ;COLOR RAM, BITS ABOVE\r
+                               ;ARE INDEX TO THIS TABLE\r
+                               ;D7-D4 SHADE\r
+                               ;D3-D0 COLOR\r
+LINESH =1203                   ;LINES SLOPE4 BITS D0-D3 (D3 IS SIGN BIT)\r
+                               ;SLOPE IS A "TANGENT #, IE: 1=45 DEG.\r
+\r
+SHEL0H =1800                   ;SHELL H POSITION (NORMAL SCREEN)\r
+SHEL1H =1A00\r
+SHL0V  =1400                   ;SHELL V START (NORMAL SCREEN)\r
+SHL1V  =1401\r
+SHL0VS =1480                   ;SHELL VSTOP (NORMAL SCREEN)\r
+SHL1VS =1481\r
+SHL0ST =1200                   ;SHELL VSTRETCH (LIKE MST OBJ STRETCH)\r
+SHL1ST =1201\r
+SHL0PC =1280                   ;SHELL PICTURE CODE (D3-D0)\r
+SHL1PC =1281                   ;(PROM LIKE SPRINT)\r
+       .SBTTL MOTION OBJECT, EQUATES & CONSTANTS\r
+\r
+MOBJV  =1C00                   ;V POSITION (SCREEN ON SIDE)(TARGET H POSITION-SCREEN NORMAL)\r
+MOBVS  =1482                   ;V STOP FOR MOTION OBJ (NORMAL SCREEN)\r
+MOBJH  =1402                   ;H POSITION (SCREEN ON SIDE)(VSTART-NORMAL SCREEN)\r
+MOBST  =1082                   ;STARTING LINE FOR RAM SCAN ON MOBJ\r
+MOTT   =2C00                   ;MOTION OBJ RAM (00-0F NOT USED BYT CLEARED)\r
+VSTRLO =1202                   ;VERT (SCREEN ON SIDE) STRETCH MOJ OBJ\r
+;THE MOTION OBJECT IS SPECIFIED BY AN ARRAY, LOGICALLY 16 X 64. EACH\r
+;OF THE 16 BYTES IN A ROW SPECIFIES A COLOR (D7-D5) & A LENGTH\r
+;(D4-D0); UP TO 8 COLORS SELECTED OUT OF 1200-1207 (COLRAM).\r
+WRAM   =100                    ;100-300 WORKING RAM\r
+ALPHA  =1E00                   ;ALPHA NUMERICS (D7 & D6 ARE 2 BITS OF HILIGHT)\r
+LINEBASE=0                     ;FIRST AVAILABLE LINE FOR USE\r
+BACKROUND=LINEBASE             ;LINE (SET TO COLOR 02) FOR BACKROUND\r
+SQUARE =LINEBASE+1             ;LINES FOR SQUARES\r
+MOBSC0 =1080                   ;SCAN ROM START FOR MOBJ\r
+MOBSC1 =1081   \r
+       .PAGE\r
+       .SBTTL INPUTS\r
+;ALL LOW TRUE UNLESS INDICATED\r
+PROG   =5000\r
+STARTS =2006                   ;START SWITCH ,D7\r
+TEST   =2002                   ;TEST, D7\r
+FIRE   =2001                   ;FIRE, D7\r
+SHLD   =2005                   ;GAS PEDAL,D7\r
+$LAM   =2000                   ;SLAM, D7\r
+$LMBIT =80                     ;D7=SLAM\r
+$COINA =2002                   ;D7=COIN CENTER\r
+                               ;+1,D7=COIN RIGHT\r
+VBLANK =2007                   ;VBLANK (D7=1 IS VBLANK)\r
+       .SBTTL  OUTPUTS\r
+POKEY  =4000                   ;POKEY BASE ADDRESS\r
+POKEY1 =3000                   ;POKEY1 BASE ADDRESS\r
+STLED  =2800                   ;1=OFF, 0=ON (D6)\r
+COINCNT        =2800                   ;1=ACTIVE, 0=OFF\r
+;DO=RIGHT CNTR\r
+;D1=CENTER CNTR\r
+;D2=LEFT CNTR\r
+COVER0 =2800                   ;D4 0=DISABLE, 1=COVER SCREEN\r
+COVER1 =2800                   ;D3 0=DISABLE, 1=COVER SCREEN\r
+WTCHDG =2000                   ;WATCH DOG\r
+INTACK =2400                   ;ACKNOWLEDGE INTERRUPTS\r
+OPTN0  =2400                   ;4 BITS, TOP NIBBLE\r
+OPTN1  =ALLPT1                 ;8 OPTION BITS, MUST USE POKEY\r
+                               ;COIN MODE OPTION BITS\r
+OPTN2  =ALLPOT                 ;5 OPTIONS, BITS 3-7\r
+                               ;BITS 3 & 4 =# OF LIVES SELECT\r
+;OPTION MASKS\r
+BONLBT =18                     ;BONUS LEVEL BITS\r
+       .PAGE\r
+       .SBTTL  POKY\r
+;\r
+;EQUATES & ADDRESS OFFSETS FOR POKEY CONTROL\r
+;\r
+;\r
+;POKEY WRITE ADDRESSES - THESE ARE OFFSETS FROM THE BASE ADRESS\r
+;\r
+;POKEY 0\r
+AUDF1  =0+POKEY                ;AUDIO FREQUENCY, CH1\r
+AUDC1  =1+POKEY                ;AUDIO CONTROL, CH1\r
+AUDF2  =2+POKEY                ;SAME FOR 3 MORE CHANNELS\r
+AUDC2  =3+POKEY                ;CHAN 1-3 FOR SHOT & EXPLOSION\r
+AUDF3  =4+POKEY\r
+AUDC3  =5+POKEY\r
+AUDF4  =6+POKEY                ;SCRAPE SOUND\r
+AUDC4  =7+POKEY\r
+AUDCTL =8+POKEY                ;AUDIO CONTROL\r
+AUDF11 =0+POKEY1               ;FOR MOTOR SOUND\r
+AUDF21 =2+POKEY1               ;FOR MOTOR SOUND (TOGETHER FOR SHIELD)\r
+AUDF31 =4+POKEY1               ;FOR LASER WARNING SOUND\r
+AUDF41 =6+POKEY1               ;FOR BONUS SOUND & SHIELD OUT SOUND\r
+AUDC11 =1+POKEY1\r
+AUDC21 =3+POKEY1\r
+AUDC31 =5+POKEY1\r
+AUDC41 =7+POKEY1\r
+AUDCT1 =8+POKEY1\r
+;\r
+;AUDCTL (AUDIO CONTROL)\r
+;THIS ADDRESS WRITES DATA INTO THE AUDIO MODE CONTOL REG.\r
+;EACH BIT CONTROLS A FUNCTION\r
+;D7=   CHANGE 17 BIT POLY INTO A 9 BIT POLY.\r
+;D6=   CLOCK CH1 WITH 1.79 MHZ INSTEAD OF 64 KHZ (NOTE 3)\r
+;D5=   CLOCK CH3 WITH 1.79 MHZ INSTEAD OF 64 KHZ (NOTE 3)\r
+;D4=   CLOCK CH2 WITH CH1 INSTEAD OF 64 KHZ (16 BIT COUNTER) (NOTE 3)\r
+;D3=   CLOCK CH4 WITH CH3 INSTEAD OF 64 KHZ (16 BIT COUNTER) (NOTE 3)\r
+;D2=   INSERT HI PASS FILTER IN CH1, CLOCKED BY CH3\r
+;D1=   INSERT HI PASS FILTER IN CH2, CLOCKED BY CH4\r
+;00=   CHANGE NORMAL 64 KHZ FREQ INTO 15 KHZ (NOTE 3)\r
+;EXACT FREQUENCIES: 1.79 MHZ IS 1.78979 MHZ (USE MODIFED FORMULA FOR FOUT)\r
+;                  64 KHZ IS 63.9210 KHZ (NORMAL FORMULA FOR FOUT)\r
+;                  15 KHZ IS 15.6999 KHZ (NORMAL FORMULA FOR FOUT)\r
+;**SEE NOTE 3 **\r
+;THE NORMAL FORMULA FOR FOUT IS: FOUT=FIN/2N WHERE N=AUDF+1\r
+;THE MODIFED FORMULA FOR FOUT IS: FOUT=FIN/(2(AUDF+M))WHERE\r
+;                  M=4 IF 8 BIT COUNTER(AUDCTL D3 & D4 =0)\r
+;                  M=7 IF 16 BIT COUNTER(AUDCTL (D3 & D4=1)\r
+;FOUT= OUTPUT FREQUENCY\r
+;\r
+;AUDF1,AUDF2,AUDF3,AUDF4 (AUDIO FREQUENCY)\r
+;THESE ADDRESSES WRITE DATA INTO EACH OF THE 4 AUDIO FREQUENCY CONTROL\r
+;REGISTERS.  EACH REG. CONTROLS A DIVIDE BY 'N' COUNTER.\r
+;REGISTER=N-1, I.E. IF REGISTER=0, N=1.\r
+;\r
+;AUDC1,AUDC2,AUDC3,AUDC4 (AUDIO CHANNEL CONTROL)\r
+;THESE ADDRESSES WRITE DATA INTO EACH OF THE 4 AUDIO CONTROL REGISTERS.\r
+;EACH REGISTER CONTROLS THE NOISE CONTENT & VOLUME OF THE CORRESPONDING\r
+;AUDIO CHANNEL. (N CORRESPONDS TO N ABOVE)\r
+\r
+;D7    D6    D5    D4    D3    D2    D1    D0          FUNCTION\r
+;\r
+;0     0     0     0                           17 BIT POLY/5BIT POLY/N\r
+;0     0     1     0                           5 BIT POLY/N/2\r
+;0     1     0     0                           4 BIT POLY/5 BIT POLY/N\r
+;0     1     1     0                           5 BIT POLY/N/2\r
+;1     0     0     0                           17 BIT POLY/N\r
+;1     X     1     0                           PURE TONE/N/2\r
+;1     1     0     0                           4 BIT POLY/N\r
+;X     X     X     1                           FORCE OUTPUT-VOLUME ONLY\r
+;                 X     0     0     0     0    LOWEST VOLUME (OFF)\r
+;                                              THRU\r
+;                 X     1     1     1     1    HIGHEST VOLUME\r
+STIMER =09+POKEY               ;THIS ADDRESS RESETS ALL AUDIO FREQ\r
+STIMR =9+POKEY1\r
+;DIVIDERS TO THEIR 'AUDF' VALUE.  1 & 3 RESTART HIGH, 2 & 4 RESTART LOW\r
+\r
+POTGO  =0B+POKEY               ;THIS ADDRESS STARTS THE POT SCAN SEQUENCE\r
+POTGO1 =0B+POKEY1\r
+;THE POT VALUES SHOULD BE READ FIRST.  THIS WRITE STROBE IS THEN USED\r
+;CAUSING THE FOLLOWING SEQUENCE:\r
+;      1)  SCAN COUNTER 0; 2)  CAP DUMP XSTR TURNED OFF; 3)  SCAN COUNTER\r
+;      BEGINS COUNTING; 4)  COUNTER VALUE WILL BE CAPTURED IN EACH OF 8\r
+;      REGISTERS AS EACH POT LINE CROSSES TRIGGER VOLTAGE; 5)  COUNTER\r
+;      REACHES 228, CAP DUMP TRANSISTER TURNED ON.\r
+;      SEE NOTE 1, NOTE 2\r
+\r
+IRQEN  =0E+POKEY               ;WRITES TO THE IRQ INTERRUPTS ENABLE BITS. WRITE TO 0\r
+;TO TURN OFF MY TIMER INTERRUPTS\r
+\r
+SKCTL  =0F+POKEY               ;WRITES TO SERIAL OUTPUT PORT CONFIGURATION REGISTER\r
+SKCTL1 =0F+POKEY1\r
+;NOTE*** MUST STORE A 03 TO THIS REG. TO START CHIP RUNNING\r
+;\r
+;READ ADDRESSES\r
+;\r
+POT0   =0+POKEY                ;READ POT REG 0\r
+POT1   =1+POKEY\r
+ALLPOT =08+POKEY               ;READ 8 LINE POT PORT STATE\r
+ALLPT1 =8+POKEY1\r
+RANDOM =0A+POKEY               ;RANDOM NUMB GENERATOR\r
+RANDM1 =0A+POKEY1\r
+;******** SPECIAL MOTES *********\r
+;NOTE1:        THE ASSUMED CLOCK RATE FOR PHASE 2 (FOR POKEY) IS\r
+;1.79 MHZ. THIS MEANS THAT ON ANY SYSTEM WITH A SLOWER\r
+;CLOCK WILL HAVE A LONGER 'POT SCAN FRAME TIME' THAN THE\r
+;ACTUAL FRAME TIME.\r
+;EX: ON TUBE CHASE, CLOCK SPEED IS 1.5 MHZ. THEREFORE, A POT\r
+;SCAN "FRAME TIME" IS 17.2 MSEC, LONGER THAN 1 FRAME.\r
+;NOTE2:        POTGO WILL NOT RESTART THE POT SEQUENCE BEFORE\r
+;1 'POT SCAN FRAME TIME' HAS PASSED (IE=17.2 MSEC ON TUBE CHASE).\r
+;\r
+;NOTE3:        1.79 MHZ REFERS TO CONSUMERS PHASE 2 CLOCK FREQUENCY\r
+;YOU MUST SUBSTITUTE YOUR OWN PHASE 2 CLOCK FREQUENCY HERE.  ALSO, 64 KHZ\r
+;AND 15 KHZ ARE ACTUALLY JUST FRACTIONAL PARTS OF PHASE 2.  THEY WILL ALSO\r
+;CHANGE WITH DIFFERENT PHASE 2'S.  DERIVE THEM SIMILAR TO BELOW:\r
+;      64 KHZ = (PHASE 2)/2.8 (WHEN PHASE 2 = 1.79 MHZ)\r
+;      15 KHZ = (PHASE 2)/11.4(WHEN PHASE 2 = 1.79 MHZ)\r
+       .PAGE\r
+;\r
+;*****************************************************\r
+;******* GLOBL STATEMENTS ******************************\r
+;*******************************************************\r
+;\r
+       .GLOBL  SHPTBL,B.OFF,BRTTBL,TARTBL\r
+;\r
+;SOUND ROUTINE NEEDED GLOBLS\r
+;\r
+;ENTRY POINTS (ALL ARE SUBROUTINES)\r
+       .GLOBL STSOUND,CSOUND\r
+       .GLOBL SECTIONS\r
+       .CSECT\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/TCEXP.MAC b/TCEXP.MAC
new file mode 100644 (file)
index 0000000..ee5f22e
Binary files /dev/null and b/TCEXP.MAC differ
diff --git a/TCHASE.COM b/TCHASE.COM
new file mode 100644 (file)
index 0000000..94fab02
Binary files /dev/null and b/TCHASE.COM differ
diff --git a/TCINT.MAC b/TCINT.MAC
new file mode 100644 (file)
index 0000000..51cdde5
Binary files /dev/null and b/TCINT.MAC differ
diff --git a/TCMAC.MAC b/TCMAC.MAC
new file mode 100644 (file)
index 0000000..80e4dd0
Binary files /dev/null and b/TCMAC.MAC differ
diff --git a/TCMAIN.LDA b/TCMAIN.LDA
new file mode 100644 (file)
index 0000000..848bc66
Binary files /dev/null and b/TCMAIN.LDA differ
diff --git a/TCMAIN.LNK b/TCMAIN.LNK
new file mode 100644 (file)
index 0000000..b063071
Binary files /dev/null and b/TCMAIN.LNK differ
diff --git a/TCMAIN.MAC b/TCMAIN.MAC
new file mode 100644 (file)
index 0000000..994b7fa
--- /dev/null
@@ -0,0 +1,1974 @@
+               .TITLE TCMAIN -- TUBE CHASE MAINLINE\r
+;\r
+;TABLES\r
+       .GLOBL SKILL1\r
+;\r
+;AUX ROUTINES\r
+       .GLOBL MOTION,MULT,NEG,TARGET,ERASE,CENTER\r
+       .GLOBL SLOWDN,MOTOUT,COLCHG,MOTSET,OBJDAC\r
+       .GLOBL STSOUND,CSOUND\r
+;SOUND ROUTINE NEEDS THE FOLLOWING:\r
+;RAM CELLS (DOES NOT HAVE TO BE 0 PAGE):\r
+       .GLOBL SSTAT,SOUNDN,POINT,CURRENT\r
+       .GLOBL FRAMES,COUNT,STATE,LOCKOUT\r
+;EXTERNAL REFERENCES (SUCH AS POKEY)\r
+       .GLOBL AUDF1,AUDCTL\r
+;\r
+;OTHER LABELS OTHER PEOPLE NEED TO KNOW ABOUT\r
+;\r
+;SOUND NAMES (EQUATES)\r
+;\r
+       .GLOBL EXPLOS,PHASER\r
+;\r
+;A POINTER TO THE 'VERTIGO' PICTURE\r
+;\r
+       .GLOBL T.OFF\r
+;\r
+;TEST GLOBS\r
+;\r
+       .GLOBL MESS,INIT,POWRON,GAME,ASCAY\r
+;\r
+;A POINTER TO 'SED' FOR SOFTWARE SECURITY...USED BY TCINT\r
+;\r
+       .GLOBL SED1\r
+       .PAGE\r
+       .ASECT\r
+       .ENABL AMA\r
+       .RADIX 16\r
+       .SBTTL GAME DESCRIPTION & ALLOCATION\r
+       .REPT 0\r
+**********************************************\r
+*PROJECT #:    16703\r
+*\r
+*DISK #:       99 & B41\r
+*\r
+*HARDWARE:     DAVE SHERMAN "SPECIAL ELLIPSE"\r
+*\r
+*ASSEMBLY:     ...=DX1:TCMAIN\r
+*\r
+*LINK:         ... = DX1:TCMAIN,TCMESG,TCMOT,TCSOUN,TCPIC,TCINT,TCTEST\r
+*\r
+*DESCRIPTION:  THIS IS A 1 PLAYER GAME WHERE\r
+*              THE PLAYER TRIES TO "FLY"\r
+*              THROUGH A TUBE WHICH MOVES UP,\r
+*              DOWN, LEFT & RIGHT.  (MOTION\r
+*              IS NIGHT DRIVER STYLE)\r
+*\r
+***********************************************\r
+*\r
+*PROGRAMMER:   OWEN RUBIN\r
+*\r
+*ROUTINES BY:  ED LOGG, DAVE SHEPPERD\r
+*\r
+*CHECKER:\r
+*\r
+***********************************************\r
+       .ENDR\r
+       .INCLUDE TCDEF  ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r
+\f\f     .ASECT\r
+       .=PROG\r
+       .SBTTL GAME\r
+       .MACRO LAH LABEL\r
+       LDA I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD LABEL\r
+       .DSABL M68\r
+       .=.-1\r
+       .ENDM\r
+       .MACRO LAL LABEL\r
+       LDA I,0\r
+       .=.-1\r
+       .WORD LABEL\r
+       .=.-1\r
+       .ENDM\r
+;****************************************************\r
+;***                                             ***\r
+;***                   MAIN GAME                 ***\r
+;***                                             ***\r
+;****************************************************\r
+;\r
+; STATE        0 = CRASH\r
+;      1 =\r
+;      2 =\r
+;      3 = BONUS SCORE REACHED\r
+;      4 = BONUS TIME\r
+;      5 = ERR 1\r
+;      6 =\r
+;      7 = ATTRACT MODE\r
+;\r
+\r
+\r
+       .BYTE 8A                        ;CKSUM 1\r
+       .SBTTL  (CK1)\r
+       .SBTTL MAIN LOOP\r
+GAME:  JSR CLRALL              ;CLEAR ALL\r
+       JSR CRAMIT              ;INIT HI SCORES\r
+       LDY #SECOFF\r
+SED1:  LDA #0F8\r
+       STA NY,SECIND           ;PLACE SED\r
+       LDA I,0FF\r
+       STA LOW\r
+       STA LOW+1               ;INIT POT STUFF\r
+       STA UPDFLG              ;NO NEW HIGH SCORES ON POWER UP\r
+ATTRCT:\r
+       LDA I,80                ;SET ATTRACT MODE\r
+       STA Z,STATE\r
+       CLI\r
+       LDA I,0                 ;POINTER FOR NEXT AVAILABLE ELLIPSE\r
+       STA INDEX\r
+MAIN:  LDA I,0FF\r
+       STA OKOUT               ;TELL INTERRUPT IT'S OK TO OUTPUT\r
+19$:   LDA READY               ;WAIT FOR POKEY DATA\r
+       BNE 19$\r
+       LDA OPTION              ;GET OTHER MESG BIT\r
+       AND #4\r
+       LSR\r
+       LSR\r
+       LSR                     ;PUT INTO CARRY\r
+       LDA LANG+1              ;OTHER BIT LEFT IN D8\r
+       ROL                     ;8 TO C, C TO 0\r
+       ROL                     ;0 TO 2, C TO 0\r
+       STA LANG\r
+       BIT TEST\r
+       BMI 1$\r
+       JMP POWRON\r
+1$:    LSR SYNC\r
+       BCC 1$\r
+       INC FRAMC               ;NEXT FRAME\r
+       BNE 2$\r
+       INC ATTIM\r
+2$:    LDA FRAMC\r
+       AND I,1F\r
+       BNE 21$\r
+       INC LIFETM\r
+       BNE 21$                 ;DON'T WRAP TO 0\r
+       DEC LIFETM\r
+21$:   AND I,01                ;PLUSE RATE\r
+       EOR I,1                 ;ON OPPISITE FRAMES\r
+       BNE 11$\r
+       SEC\r
+       LDA COLARY+MOTG\r
+       SBC I,0F0               ;PULLSATE INTENSITY OF RED COLOR...\r
+       BNE 3$\r
+       LDA I,RED                       ;...IN MOTION OBJECT\r
+3$:    STA COLARY+MOTG\r
+       BIT RANDOM\r
+       BVC 32$\r
+       EOR I,REDYLC            ;RED/YELLOW CONSTANT\r
+       STA COLARY+MOTG         ;RED/YELLOW\r
+32$:   LDY DIR2                ;DIRECTION CHANGE REGISTER\r
+       LDA I,1                 ;SHELL HIT?\r
+       BIT OBJST\r
+       BEQ 31$\r
+       LDA COLARY+MOTG         ;EXPLOSION ALL RED\r
+       EOR I,REDYLC                    ;OPPISTIT COLOR OF RED\r
+       STA COLARY+MOTW\r
+       STA COLARY+MOTD\r
+       JMP 11$\r
+31$:   BVC 4$          ;EXPLODING (FROM BIT ABOVE)\r
+       JSR FLASH               ;FLASH MOTION OBJECT COLORS\r
+       JMP 11$\r
+4$:    BIT STATE\r
+       BPL 13$                 ;NO SKIP FLASH\r
+       LDA UPDFLG              ;INITIALS?\r
+       BPL 41$                 ;IF YES, KEEP COLORS MOVING\r
+       LDA I,ATCON             ;ATTRACT, IS IT SKIP?\r
+       BIT ATTIM\r
+       BEQ 11$\r
+41$:   LDA COLARY+MOTW\r
+5$:    JSR COLCHG              ;CHANGE COLOR\r
+       STA COLARY+MOTW\r
+       STY DIR2\r
+       AND I,0F                ;COLOR ONLY\r
+;      CMP I,0                 ;NO BLACK COLOR\r
+       BEQ 41$\r
+11$:\r
+       LDA $CMODE\r
+       AND I,03                ;FREE PLAY?\r
+       BNE 16$                 ;IF NOT, NO WORRY\r
+       LDA I,1\r
+       STA $$CRDT              ;ELSE STORE 1 CREDIT\r
+16$:   LDY I,0         ;NO SOUNDS ( AS A GUESS OF IN CASE WE BRANCH)\r
+       LDA STATE\r
+       BPL 13$\r
+       LDA $$CRDT\r
+       ORA $CNCT               ;NEED A MESSAGE?\r
+       BEQ 17$\r
+       JSR MESGD\r
+17$:   LDA I,HLT2\r
+       STA HILIGHT\r
+       LDA $$CRDT              ;ANY CREDIT?\r
+       BNE 20$\r
+       LDA UPDFLG\r
+       BPL 12$                 ;SKIP IF DOING INITIALS\r
+       LDX #5                  ;GAME OVER MESSAGE\r
+       LDA $CNCT               ;ANY COINS?\r
+       BEQ 6$                  ;OK\r
+       LDX #25.                ;IF COINS, NEED ANOTHER\r
+       LDY I,0A3               ;BEEP ON NEED A COIN\r
+6$:    LDA I,20\r
+       BIT FRAMC               ;ON/OFF?\r
+       BNE 15$\r
+       TXA\r
+       CLC\r
+       ADC #80                 ;ERASE MESSAGE\r
+       TAX\r
+       LDY #0                  ;NO SOUND\r
+15$:   TYA                     ;A SAVED BY MESS\r
+       JSR MESS                ;WRITE MESSAGE\r
+       TAY                     ;GET BACK Y\r
+12$:   LDA I,90                ;TONE FREQ\r
+       STA AUDF41              ;OUTPUT TO POKEY\r
+       STY AUDC41              ;OUTPUT CONTROL (ON/OFF)\r
+13$:   JMP WAIT                ; & AIT\r
+20$:   LDA I,0\r
+       STA AUDC41              ;(IN CASE 'INSERT COIN' LEFT SOUND ON)\r
+       LDX #15.                ;'PUSH START' MESSAGE PTR\r
+       LDA FRAMC               ;FLASH START LAMP\r
+       AND I,0F\r
+       BNE 28$                 ;NO CHANGE\r
+       LDA I,10\r
+       BIT FRAMC               ;ON OR OFF\r
+       BNE 27$                 ;ON\r
+       LDA I,40                ;OFF\r
+       ORA OUT202\r
+       STA OUT202\r
+       BIT UPDFLG              ;INITIALS?\r
+       BPL 28$                 ;SKIP IF YES\r
+       JSR MESS\r
+       BCS 28$                 ;WRITE 'PUSH START' ( CARRY SET FROM TYPE)\r
+27$:   LDA OUT202\r
+       AND I,0BF               ;LAMP OFF\r
+       STA OUT202\r
+       BIT UPDFLG              ;INITALS?\r
+       BPL 28$                 ;SKIP IF YES\r
+       LDX I,15.+80            ;ERASE MESSAGE\r
+       JSR MESS\r
+28$:   LDA STARTS              ;START PUSHED?\r
+       BMI WAIT                ;NOPE\r
+       DEC $$CRDT              ;JUST ONE CREDIT (FOR NOW)\r
+;\r
+;***START GAME***\r
+;\r
+       .SBTTL  START GAME\r
+GO:    LDA UPDFLG              ;WERE WE DOING INITIALS?\r
+       BMI 7$                  ;NO\r
+5$:    LDA UPDINT              ;YES.. WHICH INITIAL?\r
+       CMP I,2                 ;IF LAST, JUST LEAVE\r
+       BCS 6$\r
+       CLC\r
+       ADC UPDFLG              ;ELSE MUST BLANK ANY UNCHOSEN INITIAL\r
+       TAX\r
+       LDA I,0\r
+       STA X,INITL\r
+       INC UPDINT              ;NEXT INITIAL\r
+       BNE 5$                  ;******* ALWAYS **********\r
+6$:    LDA I,-1\r
+       STA UPDFLG              ;TURN OFF UPDATE FLAG\r
+7$:    JSR CLR2\r
+       LDA I,0C0\r
+       ORA OUT202\r
+       STA OUT202              ;SOUNDS ON, LAMP OFF\r
+       LDA I,08\r
+       STA TOPS                ;INIT TOP SPEED\r
+       LDA I,0\r
+       STA $BCCNT\r
+       STA $BC\r
+       STA SMOK2\r
+       STA SCOREL\r
+       STA SCOREH              ;0 SCORE\r
+       STA SCOREM\r
+       STA SKILL               ;SET 'TRACK' TO EASY\r
+       STA LIFETM\r
+       STA HITS\r
+       STA HITS+1\r
+       STA SHTBACK             ;CLEAR FLAG ON SPOT\r
+       LDA I,GREEN\r
+       STA COLARY+HILT3\r
+       JSR GTLIVES             ;GET # OF LIVES\r
+       LDA I,LVL1\r
+       STA SHTWT               ;6 SHIPS DON'T SHOOT\r
+       LDA I,7F\r
+       STA SHIELE+1            ;NEW SHIELDS\r
+       LDA I,20\r
+       STA STDELAY             ;WAIT A WHILE BEFORE FIRST TARGET\r
+STRT2: JSR MESGD               ;LIVES,SCORE,HITS\r
+       LAH SKILL1              ;1ST TRACK\r
+       STA TRKADH\r
+       LAL SKILL1\r
+       STA TRKADL\r
+       .SBTTL  ATTRACT LOOP\r
+WAIT:  LDA #HLT3\r
+       STA HILIGHT             ;RESTORE HILIGHT\r
+       BIT STATE\r
+       BMI WT\r
+WT2JMP:        JMP WAIT2               ;SKIP IT\r
+WT:    BIT UPDFLG              ;ARE WE CURRENTLY UPDATING INITIALS?\r
+       BMI 2$                  ;NO\r
+       JMP WAIT3               ;YES\r
+2$:\r
+       LDA ATTIM       \r
+       AND I,ATCON-1           ;ATTRACT CHANGE?\r
+       BNE CK2\r
+       JSR CLRZRO              ;CLEAR SCREEN\r
+1$:    LSR SYNC                ;WAIT FOR VBLANK\r
+       BCC 1$\r
+11$:   LSR SYNC                ;WAIT FOR OPTION\r
+       BCC 11$\r
+       INC FRAMC               ;DONT LEAVE 0\r
+       INC ATTIM               ;ONLY CLEAR ONCE\r
+       LDA I,ATCON             ;INITIALS?\r
+       BIT ATTIM\r
+       BNE 4$\r
+       JSR GTLIVES             ;SHOW # OF LIVES AT START\r
+       JSR MESGD               ;LIVES,SCORE, & HITS MESSAGES\r
+       LDA $CMODE\r
+       AND I,3\r
+       CLC\r
+       ADC #1                  ;BASE MESSAGE\r
+       TAX\r
+       JSR MESS                ;COIN MESSAGE\r
+                               ;EX PLAY MESSAGE\r
+                               ;"BONUS LIFE FOR"\r
+       LDA OPTION              ;READ OPTION ON LEVEL\r
+       AND I,BONLBT\r
+       BEQ 3$\r
+       LDX #6\r
+       JSR MESS                ;A IS SAVED\r
+       LSR\r
+       LSR\r
+       LSR\r
+       PHA                     ;SAVE COPY\r
+       CLC\r
+       ADC I,06                ;BASE OF MESSAGES (-1 SO 0=NO FREEPLAY)\r
+       TAX\r
+       JSR MESS\r
+       PLA\r
+                               ;GET BONUS LEVEL\r
+       TAX\r
+       DEX\r
+       LDA X,EXSCR\r
+       STA BONLVL\r
+3$:    JMP WAIT2\r
+4$:    JSR MESGD               ;MESSAGES LIVES, SCORE, (& HITS)\r
+       LDA I,0C0               ;POSITION NAME (START)\r
+       STA MOBJVB              ;SET OUTPUT PARAMETERS\r
+       LDA I,0\r
+       STA MOBVSB\r
+       STA MOBSTB\r
+       STA COLARY+MOTW\r
+       LDA I,0FF\r
+       STA MOBJHZ\r
+       STA MOBJHB\r
+       LDX I,T.OFF\r
+       JSR MOTOUT              ;OUTPUT 'TUBE CHASE'\r
+       LDA I,30\r
+       STA MOVS0               ;VERTICAL POSITION (SIDE SCREEN) OF WORDS\r
+CK2:   LDA I,ATCON\r
+       BIT ATTIM               ;WHAT ARE WE DOING?\r
+       BNE OUTINT\r
+       JMP WT2JMP              ;INITIALS IF BIT NE, ELSE NORMAL ATTRACT\r
+OUTINT:\r
+       .SBTTL  OUTPUT INITIALS\r
+;\r
+;OUTPUT INITIALS IN ATTRACT\r
+;\r
+       LDA I,WHITE\r
+       STA COLARY+ALPHC        ;CHARACTERS DURING INITIALS\r
+       LDA I,GREEN\r
+       STA COLARY+HILT3\r
+       LDA I,0\r
+       STA LIFETM              ;RESET DURING ATTRACT\r
+       LDX I,20\r
+5$:    STA X,LINEH             ;REMOVE SQUARES\r
+       DEX\r
+       BPL 5$\r
+       STA LASERH\r
+       STA LASERH+1            ;REMOVER LASRERS\r
+       LDA I,BLACK\r
+       STA COLARY+MOTC         ;BLACK BACKGROUND\r
+       LDA FRAMC\r
+       AND I,03\r
+       BNE 8$\r
+       LDA MOVS0\r
+       CMP I,1                 ;SLIDE THROUGH MAGS\r
+       BNE 6$\r
+       LDA #0E0                ;READ COMMENT BELOW\r
+;THIS VALUE IS 0E0 FOR 'TUNNEL HUNT', IS 0D8 FOR\r
+;'VERTIGO' AND IS 0D8 FOR 'TUBE CHASE'\r
+       STA MOBJHB\r
+       BNE 8$                  ;ALWAYS ******\r
+6$:    DEC MOVS0\r
+8$:    LDX #24.\r
+       JSR MESS                ;'HIGH SCORES'\r
+       LDX I,0CF               ;OUTPUT POINTER\r
+       LDY I,3*5-1             ;INPUT POINTER\r
+10$:   STY R1                  ;SAVE PTR\r
+       TXA\r
+       PHA                     ;SAVE X\r
+       LDX I,2\r
+15$:   LDA Y,HSCORE            ;FROM HIGH SCORE\r
+       STA X,NUMB1\r
+       DEY\r
+       DEX\r
+       BPL 15$\r
+       JSR ASCAY               ;CREATE ASCII\r
+       PLA\r
+       TAX                     ;RETRIEVE OUTPUT POINTER\r
+       LDA I,30\r
+       ORA HILIGHT\r
+       STA X,ALPHA             ;ADD EXTRA 0\r
+       LDA HILIGHT\r
+       STA X,ALPHA+1           ;EXTRA BLANK BOXES\r
+       STA X,ALPHA+2           ;BETWEEN #'S & LETTERS\r
+       DEX\r
+       LDY I,5                 ;6 OUTPUT DIGITS\r
+17$:   LDA Y,ASCI\r
+       ORA HILIGHT             ;OUTPUT TO SCREEN\r
+       STA X,ALPHA\r
+       DEX\r
+       DEY\r
+       BPL 17$\r
+30$:   LDY R1\r
+       TXA\r
+       SEC\r
+       SBC I,19                ;POINT UP ONE LINE\r
+       TAX\r
+       DEY\r
+       DEY                     ;NEXT INPUT\r
+       DEY\r
+       BPL 10$\r
+;NOW DO INITIALS\r
+       LDY I,3*5-3\r
+       LDX I,0D2\r
+40$:   LDA Y,INITL\r
+       ORA HILIGHT\r
+       STA X,ALPHA\r
+       LDA Y,INITL+1\r
+       ORA HILIGHT\r
+       STA X,ALPHA+1\r
+       LDA Y,INITL+2\r
+       ORA HILIGHT\r
+       STA X,ALPHA+2\r
+       TXA\r
+       SEC\r
+       SBC I,20\r
+       TAX\r
+       DEY\r
+       DEY\r
+       DEY\r
+       BPL 40$\r
+       BMI WAIT3               ;ALWAYS\r
+WAIT2: LDX I,0\r
+       STX INDEX               ;SET UP FOR ALL AVAILABLE\r
+       JSR MOTION              ;MOVE & SET UP FOR OUTPUT\r
+       JSR SECTIONS            ;DRAW CIRCLES\r
+       JSR TARGET              ;OUTPUT TARGET\r
+       JSR MOTSET              ;SET UP INTERRUPT VALUES\r
+       JSR LASER               ;DO LASER BLASTS\r
+WAIT3: JSR GETINT\r
+       LDA OUT202\r
+       STA STLED               ;OUTPUT LAST FRAMES INFO\r
+       BIT STATE               ;NO SOUND IN ATTRACT\r
+       BMI 10$\r
+       AND #08                 ;STRETCH ON?\r
+       BNE 5$\r
+       LDA #WHITE\r
+       STA COLARY+SHL11\r
+5$:    LDA CH4BUF              ;OUTPUT CH4 SOUNDS\r
+       STA AUDC41\r
+       LDA CH4BUF+1\r
+       STA AUDF41\r
+10$:   ;OUT\r
+       .PAGE\r
+       .SBTTL SHIELDS\r
+;FALL THROUGH FROM ABOVE\r
+SLD:   LDA HILIGHT             ;SAVE HILIGHT\r
+       STA R5\r
+       LDA I,HLT1\r
+       STA HILIGHT\r
+       LDA I,1                 ;EXPLOSION BIT\r
+       BIT STATE\r
+       BPL 1$                  ;NOT DURING ATTRACT\r
+       JMP 20$\r
+1$:    BEQ 2$                  ;NOT IF EXPLODING\r
+       JMP SHOUT\r
+2$:    LDX I,0                 ;GUESS NORMAL MESSAGE\r
+       LDA SHIELE+1            ;NOW MUCH ENERGY\r
+       BNE 5$\r
+       INX                     ;OUT\r
+       BNE 6$                  ;ALWAYS\r
+5$:    CMP I,30                ;LOW LEVEL\r
+       BCS 6$                  ;OK\r
+       LDX I,2\r
+6$:    LDA FRAMC\r
+       AND I,10                ;FLASH ALT MESSAGE RATE\r
+       BNE 7$\r
+       LDX I,0\r
+7$:    LDA X,SCOL\r
+       STA COLARY+HILT1\r
+       LDA X,SMSG\r
+       TAX\r
+       JSR MESS\r
+       LDY I,0                 ;NO SHIELD SOUND (GUESS)\r
+       LDX I,0                 ;GUESS OFF\r
+       BIT SHLD                ;SHIELDS ON? (READ BUTTON)\r
+       BMI 8$\r
+       LDA SHIELE+1            ;ANY ENERGY?\r
+       BNE 71$                 ;OK\r
+       LDA FRAMC               ;MAKE SOUND IF NO ENETGY & BUTTON PUSHED\r
+       AND I,8\r
+       BNE 8$                  ;NO SOUND HERE\r
+       LDA I,0AF\r
+       STA CH4BUF              ;VOLUME\r
+       LDA I,30                ;TONE\r
+       STA CH4BUF+1\r
+       BNE 8$                  ;***** ALWAYS *******\r
+71$:   LDX I,80                ;SHIELDS ON BIT\r
+       LDY I,10\r
+8$:    STX SHIELD              ;SAVE STATE MASK\r
+       STY AUDCT1\r
+       LAH SHIPL               ;BAR GRAPH LOCATION\r
+       STA OUTPTR+1\r
+       LAL SHIPL\r
+       STA OUTPTR\r
+10$:   LDA SHIELD\r
+       BMI 14$                 ;SHIELDS ON\r
+       LDA OUT202\r
+       AND I,0E7               ;TURN OFF COVER BITS (BOTH)\r
+       STA OUT202\r
+       LDA I,78                ;SHLHB VALUE\r
+       STA SHLHB\r
+       LDX I,80                ;SL0VSB VALUE\r
+       LDY I,90                ;GUESS AT SHL0VB VALUE\r
+       BIT STATE\r
+       BPL 15$                 ;OK IF GAME ON\r
+       LDY I,0                 ;ELSE 0 IT\r
+       BEQ 15$                 ;******ALWAYS*********\r
+14$:   LDA SHICOL              ;SHIELDS ON\r
+       STA COLARY+SHL11        ;SET COLOR\r
+       LDA OUT202\r
+       ORA #08                 ;TURN ON HSTRETCH BIT\r
+       STA OUT202\r
+       LDA SHIELE              ;USE SOME ENERGY\r
+       SEC\r
+       SBC I,20                ;USE AMOUNT OF ENERGY\r
+       STA SHIELE\r
+       BCS 16$\r
+       DEC SHIELE+1\r
+16$:   LDX #0                  ;VSTART C 0\r
+       LDY I,0FF               ;SHL0VB\r
+15$:   STX SL0VSB\r
+       STY SHL0VB\r
+       LDA SHIELE+1            ;GET ENERGY (JUST IN CASE YOU CAME FROM ABOVE)\r
+       JSR GRAPH               ;OUTPUT INDICATOR\r
+20$:   LDA SHIELE+1            ;GET ENERGY OF SHIELD\r
+       EOR I,0FF               ;CHANGE TO AN INCREASING NUMBER\r
+       AND I,0F0               ;USE TOP 4 BIT FOR INTENSITY\r
+       ORA I,BLUE              ;BLUE SHIELD ( A DIFFERENT TYPE OF INSURANCE)\r
+       TAX\r
+       LDA SHLDHT              ;SHIELD HIT?\r
+       BEQ 21$                 ;NO\r
+       DEC SHLDHT\r
+       BEQ SHOUT\r
+       LDX I,RED               ;COLOR OF OUTPUT\r
+21$:   STX SHICOL              ;EITHER 0 OR RED\r
+SHOUT: LDA R5\r
+       STA HILIGHT             ;RESTORE TO NORMAL HILIGHT\r
+;PLACE HOLDER\r
+       .PAGE\r
+       .SBTTL POT LEGISLATION\r
+;FALL THRU FROM ABOVE\r
+;\r
+;POT 0 IS LEFT/RIGHT\r
+9$:    LSR PTWAIT\r
+       BNE CRASH               ;SKIP IF WE RESET\r
+       LDX I,1                 ;UPDATE INFO ON BOTH POTS\r
+1$:    LDA AX,PDATA            ;GET DATA\r
+       SEC\r
+       SBC X,LOW               ;GET BOTTOM OF RANGE\r
+       BCS 10$                 ;IF POT-LOW <0?\r
+       LDA I,0                 ;IF YES, POT=LOW AND\r
+       DEC X,LOW               ;LOW=LOW-1\r
+10$:   CMP X,RANGE             ;IS POT > RANGE?\r
+       BCC 20$                 ;NO\r
+       INC X,RANGE             ;YES\r
+       LDA X,RANGE\r
+20$:   PHA                     ;SAVE NEW POT VALUE\r
+       SEC\r
+       SBC X,POTVAL\r
+       BCS 25$                 ;TAKE ABS OF POT-OLDPOT\r
+       EOR I,0FF\r
+       ADC I,1                 ;NEGATE\r
+25$:   CMP I,4                 ;IS POT ACTIVE\r
+       PLA\r
+       BCC 30$                 ;SEE IF CHANGE IS > 1\r
+       INC X,ACTIVE            ;INDICATE ACTIVE\r
+       STA X,POTVAL            ;STORE NEW VALUE\r
+30$:   LDA FRAMC\r
+       AND I,3F\r
+       BNE 40$\r
+       LDA X,ACTIVE\r
+       CMP I,30.               ;POT ACTIVE?\r
+       BCC 40$\r
+       BIT STATE               ;DON'T COLLAPSE IN ATTRACT\r
+       BMI 40$\r
+       INC X,LOW\r
+       DEC X,RANGE             ;MOVE ENDS\r
+       LDA I,0\r
+       STA X,ACTIVE            ;RESET COUNTER\r
+40$:   BIT UPDFLG              ;ARE WE DOING INITIALS?\r
+       BPL 41$                 ;IF YES, WE NEED POT DATA STILL\r
+       LDA I,0                 ;NO STEER ON ATTRACT\r
+       BIT STATE\r
+       BMI 45$\r
+41$:   LDA X,RANGE             ;CALCULATE LEFT/RIGHT\r
+       LSR\r
+       SEC\r
+       SBC X,POTVAL\r
+45$:   STA X,STEER\r
+;POKEY SLIP FIX\r
+       LDA X,RANGE\r
+       CMP I,60                ;RANGE TOO LARGE?\r
+       BCC 46$\r
+       DEC X,RANGE\r
+       INC X,LOW               ;MOVE ENDS IN IF YES\r
+46$:   DEX\r
+       BPL 1$\r
+       BIT UPDFLG              ;INITIALS?\r
+       BMI CRASH               ;IF NO, CONTINUE\r
+       JMP MAIN                ;ELSE DO NOTHING ELSE\r
+\r
+       .PAGE\r
+       .SBTTL COLLISIONS\r
+       .SBTTL  HIT WALL SEQUENCE\r
+CRASH: BIT STATE\r
+       BPL 99$\r
+       JMP BOOM\r
+99$:   LDA I,HLT3\r
+       STA HILIGHT             ;MAKE SURE NORMAL\r
+       LAH HULPL\r
+       STA OUTPTR+1            ;HULL TEMP OUTPUT LOCATION\r
+       LAL HULPL\r
+       STA OUTPTR\r
+       LDA HULL+1\r
+       JSR GRAPH               ;HULL TEMP GRAPH\r
+       LDA I,LIMITC+HLT3\r
+       STA HULPL+10\r
+       LDX #26.                ;"HULL TEMP" OR WARNING\r
+       LDA FRAMC               ;ALT MESSAGE FLASH\r
+       AND I,10\r
+       BNE 7$          \r
+       LDA HULL+1\r
+       CMP I,7F\r
+       BCC 6$\r
+       INC STATE               ;SET EXPLOS BIT\r
+6$:    CMP I,58\r
+       BCC 7$\r
+       LDX I,32.\r
+       JSR MESS                ;WARNING\r
+       LDA I,0AF               ;WARNING SOUND\r
+       STA CH4BUF\r
+       LDA I,50\r
+       STA CH4BUF+1\r
+       LDA I,RED\r
+       STA COLARY+HILT3                ;FLASH YELLOW\r
+       BNE 8$                  ;**ALWAYS **\r
+7$:    JSR MESS\r
+       LDA I,GREEN\r
+       STA COLARY+HILT3\r
+8$:    LDA SMOKE               ;SEQ IN PROGRESS?\r
+       BNE 12$                 ;WELL THEN DON'T STOP PROGRESS\r
+       LDA STATE               ;CAN WE START PROGRESS?\r
+       LSR                     ;BIT 2 HOLDS THE FUTURE (HITTING WALL)\r
+       LSR\r
+       BCC 70$                 \r
+;      SEC\r
+       LDA HULL+1\r
+       ADC I,07                ;CARRY SET, ADD 8\r
+       STA HULL+1\r
+5$:    INC CRSHC\r
+       LDA CRSHC\r
+       AND I,03                ;SLOW TOP SPEED?\r
+       BNE 11$                 ;NO\r
+       LDA TOPS\r
+       SEC\r
+       SBC I,1\r
+       CMP I,04                ;SLOW DOWN IF CRASHING\r
+       BCC 11$\r
+       STA  TOPS\r
+11$:   LDA I,10                ;SCAPE SOUND LENGTH\r
+       STA SMOKE               ;WHERE THERES SMOKE, THERES A PARTY!\r
+       LDA I,087               ;SCRAPE\r
+       STA AUDC4               ;SOUND\r
+       LDA I,40\r
+       STA AUDF4\r
+;THE ABOVE COMMENTS ARE FOR THOSES OF YOU WHO ONLY REVIEW A PROGRAM\r
+;BY READING THE COMMENTS !!!!\r
+;SLOW DOWN IN COLLISION WITH WALL\r
+12$:   DEC SMOKE\r
+       BNE 50$\r
+       LDA STATE               ;CLEAR SCRAPE BIT\r
+       AND I,0FD\r
+       STA STATE\r
+       LDA I,0                 ;SCRAPE SOUND OFF\r
+       STA AUDC4\r
+50$:   JMP BOOM\r
+70$:   LDA FRAMC\r
+       AND I,03\r
+       BNE 50$\r
+       LDA HULL+1              ;DON'T DEC PAST 0\r
+       BEQ 50$\r
+       LDA HULL\r
+       SEC\r
+       SBC I,50\r
+       STA HULL\r
+       BCS 50$                 ;NO CARRY\r
+       DEC HULL+1\r
+;      BNE 50$                 ;FALL THROUGH\r
+       .PAGE\r
+       .SBTTL  EXPLODING ROUTINE\r
+BOOM:  LDA SMOK2               ;ALREADY EXPLODING\r
+       BNE 12$\r
+       LDA STATE               ;EXPLODING?\r
+       LSR\r
+       BCC 50$                 ;NO\r
+       LDX I,7\r
+       LDA I,0\r
+10$:   STA X,ZCNTRL            ;REMOVE SQUARES\r
+       DEX\r
+       BPL 10$\r
+       LDA I,ORGIN\r
+       STA ORH\r
+       STA VCENT+1\r
+       LDX I,0\r
+       JSR STSOUND             ;EXPLOSION\r
+       LDA I,70\r
+       STA SMOK2\r
+       STA STDELAY             ;DELAY START OF NEXT SHIP\r
+       LDA I,07F               ;LONG STRAIGHT\r
+       STA VDIST               ;STRAIGHT TIME\r
+       STA DIST\r
+12$:   LDA I,0\r
+       STA SHTBACK             ;CLEAR SHELL FLAG\r
+       STA VELH\r
+       STA VELL                ;HOLD VELOCITY TO 0\r
+       STA CS                  ;NO CURVE\r
+       STA VCS\r
+       STA LIFETM              ;RESET LIFE COUNTER\r
+       STA TURNH\r
+       STA SKCTL1              ;TURN OFF TONES\r
+       STA LASTIM              ;NEW LASER IS COOL\r
+       STA OBJST\r
+       STA HULL\r
+       STA HULL+1\r
+       LDA COLARY+BKLCOL       ;FLASH SCREEN\r
+       CLC\r
+       ADC I,1\r
+       AND I,7\r
+       STA COLARY+BKLCOL\r
+       DEC SMOK2               ;EXPLOSION LENGTH\r
+       BNE 50$\r
+       LDA I,BLACK             ;IF EXPLOSON OVER...\r
+       STA COLARY+BKLCOL       ;RETURN TO BLACK\r
+       DEC LIVES               ;LOST A LIFE\r
+       BNE 14$\r
+       JMP GMOVR               ;THAT'S ALL FOLKS\r
+14$:   LDA STATE\r
+       AND I,0FE               ;REMOVE EXPLOSION BIT\r
+       STA STATE\r
+       LDA I,7F\r
+       STA SHIELE+1            ;NEW SHIELDS\r
+       LDA I,03\r
+       STA SKCTL1              ;POKEY 1 BACK ON\r
+       JSR MESGD               ;DISLAY STATS\r
+50$:\r
+       .SBTTL  HIT VALUE REMOVAL\r
+MVAL:  LDX I,14.+80            ;MESSAGE 'VALUE:'\r
+       LDA SCRTIM              ;STILL DISPALYING MESSAGE?\r
+       BEQ 30$                 ;IF 0, NO\r
+       DEC SCRTIM\r
+       BNE 30$                 ;NOT DONE YET\r
+       JSR MESS                ;REMOVE ALL THIS CAR\r
+       LDA #0\r
+       LDY I,05\r
+5$:    STA X,ALPHA             ;X=PTR FROM MESS\r
+       INX\r
+       DEY\r
+       BPL 5$\r
+       LDX I,10.+80\r
+       JSR MESS                ;REMOVE BONUS\r
+       .SBTTL  BONUS SOUND & ATTRACT OUTPUT\r
+30$:   LDX I,0         ;GUESS SOUND OFF\r
+       LDY I,0         ; AND THIS TURNS IT OFF ALWAYS (ALMOST)\r
+       LDA FRAMC\r
+       AND I,8                 ;ALWAYS OFF EVERY 8 FRAMES...\r
+       BNE 35$                 ;(IN CASE SHIELD OUT SOUND)\r
+       LDA BONSND              ;BONUS SOUND?\r
+       BEQ MVALOT              ;NO, DON'T OUTPUT ANYTHING\r
+       LDY I,0AF               ;DO BONUS SOUND\r
+       LDX I,10\r
+       DEC BONSND\r
+35$:   STX CH4BUF+1            ;PUT AWAY INTO BUFFER\r
+       STY CH4BUF\r
+MVALOT:;PLACE HOLDER\r
+       .PAGE\r
+       .SBTTL ADJUST VELOCITY\r
+ADJVEL:        BIT STATE\r
+       BMI 30$         ;NOT DURING ATTRACT\r
+\r
+;\r
+;VELOCITY CONTROL & SOUNDS HERE\r
+;\r
+;      LDA I,10                ;BREAK ON?\r
+;      BIT RETRO               ;STARNGE NAME FOR A BREAK!!!!\r
+;      BNE 1$                  ;IT'S NOT ON (WHAT EVER IT IS??)\r
+;      LDA FRAMC\r
+;      AND I,07\r
+;      BNE 1$\r
+;      JSR SLOWDN              ;SLOW DOWN AND THEN FALL THRU....\r
+                               ;                               ...\r
+                               ;                                 ....\r
+;1$:   LDY I,0\r
+;      LDX I,0FA               ;DECEL CONSTANT\r
+;      LDA GAS\r
+;      BMI 5$\r
+;      LDX I,8                 ;ACCEL CONSTANT\r
+;5$:   TXA\r
+;      BPL 10$\r
+;      DEY                     ;SIGN EXTEND\r
+       LDY I,0\r
+       LDA I,10                ;THESE 2 LINES FOR ACCEL ALWAYS\r
+       CLC\r
+       ADC VELL                ;ADD IN AMOUNT\r
+       STA VELL\r
+       TYA\r
+       ADC VELH\r
+       STA VELH\r
+       CMP I,2                 ;MINIMUM SPEED\r
+       BCS 20$                 ;CHECK TOO FAST\r
+       LDA I,2\r
+       STA VELL\r
+       STA VELH                ;DON'T LET IT GO TOO SLOW\r
+       BNE 29$                 ;*ALWAYS*\r
+20$:   CMP TOPS                        ;TOO FAST?\r
+       BCC 29$                 ;NO\r
+       LDA TOPS\r
+       STA VELH                ;LIMIT SPEED\r
+29$:\r
+       ASL                     ;SPEED X2\r
+       EOR I,0FF               ;NEGATE +1-1\r
+       STA AUDF11\r
+       SEC\r
+       SBC I,01\r
+       STA AUDF21\r
+       LDA I,0A3\r
+       STA AUDC11\r
+       STA AUDC21\r
+       LDA I,0\r
+       STA AUDCT1\r
+30$:   \r
+       .PAGE\r
+       .SBTTL TARGET POSITIONER\r
+;\r
+;THIS ROUTINE FINDS THE SQUARE CLOSEST TO THE TARGET\r
+;AND THEN SETS A 'GOAL POSITION' IN 'OBJVT' & 'OBJHT'.\r
+;THE ROUTINE THEN MOVES THE TARGET TOWARDS THIS 'GOAL'\r
+;\r
+XYZZY: LDA I,0                 ;P IF NOT ACTIVE\r
+       BIT OBJST\r
+       BPL 23$\r
+       LDA I,0FF\r
+       STA R0                  ;INIT DISTANCE TO MAX\r
+       LDX I,NOOBJTS-1         ;CHECK DISTANCE\r
+5$:    LDA X,ZCNTRL            ;IF IN ACTIVE, SKIP\r
+       BPL 20$\r
+       SEC\r
+       LDA DISTANCE\r
+       SBC X,ZYAXH\r
+       BCS 15$\r
+       EOR I,0FF\r
+       ADC I,1                 ;ABS VALUE OF DIFF\r
+15$:   CMP R0                  ;CLOSER?\r
+       BCS 20$\r
+       STA R0                  ;SAVE WHICH & DISTANCE\r
+       STX R1\r
+20$:   DEX\r
+       BPL 5$\r
+       LDX R1                  ;GET THIS ELLIPSE\r
+       JSR CENTER\r
+22$:   LDA R0\r
+       STA OBJHT               ;H POSITION\r
+       SEC\r
+       SBC OBJH                ;SCROLL TO NEW TARGET POSITION\r
+       CMP I,80                ;"ASR"\r
+       ROR                     ;  "\r
+       CMP I,80\r
+       ROR\r
+       CLC\r
+       ADC OBJH                ;SCROLL TO NEW POSITION AT 1/4 DISTANCE\r
+23$:   STA OBJH\r
+24$:   LDA X,UPDNH\r
+       SEC\r
+       STA OBJVT\r
+       SBC OBJV                ;SCROLL TO NEW V POSITION\r
+       CMP I,80                ;"ASR"\r
+       ROR\r
+       CMP I,80                ;  "\r
+       ROR\r
+       CMP I,80\r
+       ROR\r
+       CLC\r
+       ADC OBJV                ;MOVE IN ON TARGET\r
+       STA OBJV\r
+30$:   JMP MAIN\r
+       .SBTTL  CENTER OF SQUARE\r
+;\r
+;INPUT: X= SQUARE #\r
+;OUTPUT: R0\r
+;\r
+CENTER:        LDA X,ZXAXRH            ;GET MIDDLE OF IT\r
+       CLC\r
+       ADC X,ZXAXLH\r
+       ROR                     ;TAKE HALF\r
+       STA R0                  ;HOLD TEMP\r
+       LDA X,ZCNTRR            ;CHECK 9TH BIT\r
+       LSR\r
+       BCC 21$\r
+       LDA I,7F                ;ADD 80 (7F+CARRY)\r
+       ADC R0                  ;ADD TO HALF DISTANCE (RECALL 80 = 0FF/2)\r
+       STA R0\r
+21$:   LDA X,ZCNTRL            ;CHECK OTHER 9TH BIT\r
+       LSR\r
+       BCC 22$\r
+       LDA R0\r
+       SBC I,80                ;SUBTRACT 80 IN OTHER DIRECTION.\r
+       STA R0\r
+22$:   RTS\r
+       .PAGE\r
+       .SBTTL GAME OVER\r
+GMOVR:\r
+       LDA I,80                ;GAME OVER\r
+       STA Z,STATE\r
+       LDX I,0FF\r
+       TXS                     ;RESTORE STACK\r
+       JSR CLRZRO\r
+       JSR UPDATE              ;CHECK SCORES\r
+       LDA I,0C8\r
+       STA ATTIM               ;DISPLAY HIGH SCORES\r
+       JMP ATTRCT\r
+       .PAGE\r
+       .SBTTL  OUTPUT OF INFORMATION\r
+       .SBTTL  LIVES, SCORE, & HITS MESSAGES\r
+MESGD: LDA I,HLT3\r
+       STA R4                  ;DEFAULT HILIGHT\r
+       STA HILIGHT             ;DEFAULT (ALWAYS)\r
+       LDX #12.                        ;WRITE 'SCORE'\r
+       JSR MESS\r
+                               ;YES IF --\r
+       BIT UPDFLG              ;DOING INITIAL INPUT?\r
+       BPL 51$                 ;IF YES...SKIP NEXT\r
+       BIT STATE               ;GAME PLAY?\r
+       BPL 51$                 ;SKIP ATARI MESSAGE\r
+       LDX #80\r
+       STX SECBIT              ;SECURITY\r
+       LDX #31.                        ;DO ATARI MESSAGE\r
+       JSR MESS\r
+       LDX #30.\r
+       JSR MESS\r
+       LDX #0\r
+       STX SECBIT              ;TURN OFF SECURITY\r
+       .SBTTL  DISPLAY LIVES/CREDIT\r
+51$:   LDX #13.                ;GUESS LIVES\r
+       BIT STATE               ;GAME?\r
+       BPL 52$                 ;YES\r
+       LDA $$CRDT\r
+       ORA $CNCT               ;ANY COINS OR CREDITS?\r
+       BEQ 52$                 ;NO\r
+       LDA $$CRDT              ;GET CREDITS\r
+       STA LIVES               ;YES - SO XFR CREDIT TO LIVES FOR DISPLAY\r
+       LDA #HLT2\r
+       STA R4                  ;SAVE HILIGHT\r
+       STA HILIGHT             ;CHANGE HILIGHT\r
+       LDX #29.                        ;CHANGE TO CREDIT\r
+52$:\r
+       JSR MESS\r
+       LDA R4                  ;BLANK BOXES\r
+       STA GTMPL-1\r
+       STA GTMPL\r
+       STA GTMPL+1\r
+       STA GTMPL+4\r
+       STA GTMPL+5\r
+       BIT STATE               ;GAME PLAY?\r
+       BPL 61$                 ;IF YES, WE DON'T CARE ABOUT CREDITS!\r
+       LDX $$CRDT\r
+       BNE 7$\r
+61$:   STA GTMPL+3\r
+7$:    LDX #0\r
+       LDY LIVES\r
+       JSR DECIMAL\r
+       JSR ASCAY               ;CONVERT\r
+       LDY #0\r
+       LDX #0\r
+       STX R5                  ;0 BLANK FLAG\r
+53$:   LDA Y,ASCI+4\r
+       BIT R5\r
+       BMI 55$                 ;GO OUTPUT 0\r
+       CMP #30                 ;IS THIS A 0\r
+       BEQ 57$                 ;YES 50 SKIP\r
+55$:   ORA R4                  ;PUT IN HILIGHT\r
+       STA X,GTMPL+2\r
+       STA R5\r
+       INX                     ;NEXT OUTPUT LOCATION\r
+57$:   INY                     ;NEXT INPUT\r
+       LDA LIVES               ;NEED A SINGLE 0?\r
+       ORA $$CRDT\r
+       ORA $CNCT\r
+       BNE 59$\r
+       DEC R5                  ;YES (SPECIAL CASE)\r
+59$:   CPY #2                  ;DO 2 DIGITS\r
+       BNE 53$\r
+       BIT STATE               ;GAME?\r
+       BPL 65$\r
+       LDA $CNCT               ;ANY HALF CREDITS\r
+       BEQ 58$                 ;NO\r
+       LDA #HALF\r
+58$:   ORA R4\r
+       STA X,GTMPL+2\r
+60$:   LDA #ATCON              ;INITIALS\r
+       AND ATTIM\r
+       BNE DSPTM2              ;NOT DURING INITIALS\r
+65$:   LDA #HLT3\r
+       STA HILIGHT\r
+       LDX #11.\r
+       JSR MESS                ;HITS'\r
+                               ;FALL THROUGH\r
+                               ;USUALLY HILIGHT 3\r
+DSPTM2:        LDX I,2\r
+15$:   LDA X,SCOREH\r
+       STA X,NUMB1\r
+       DEX\r
+       BPL 15$                 ;MOVE INPUT FOR CONVERSION\r
+       JSR ASCAY\r
+       LDX I,5\r
+17$:   LDA X,ASCI\r
+       ORA I,HLT3              ;ALWAYS HILIGHT 3\r
+       STA X,SCPL\r
+       DEX\r
+       BPL 17$                 ;OUTPUT\r
+       LDA I,30\r
+       ORA I,HLT3              ;ALWAYS HILIGHT 3\r
+       STA SCPL+6              ;EXTRA 0\r
+       LDA #HLT3\r
+       STA SCPL+7              ;EXTRA BOX\r
+       STA SCPL-1\r
+       BIT STATE               ;GAME ON?\r
+       BPL 19$                 ;IF YES, OUTPUT\r
+       LDA I,ATCON\r
+       BIT ATTIM               ;IF ATTRACT, NOT DURING INITIALS\r
+       BNE 20$\r
+19$:   LDA I,0\r
+       STA NUMB1               ;MOVE\r
+       LDA HITS\r
+       STA NUMB2\r
+       LDA HITS+1\r
+       STA NUMB3\r
+       JSR ASCAY\r
+       LDX I,2                 ;3 DIGITS\r
+18$:   LDA X,ASCI+3\r
+       ORA I,HLT3              ;ALWAYS HILIGHT 3\r
+       STA X,HTPL+ALPHA\r
+       DEX\r
+       BPL 18$\r
+       LDA I,HLT3              ;ALWAYS USE HILIGHT 3\r
+       STA HTPL-1+ALPHA\r
+       STA HTPL-2+ALPHA\r
+       STA HTPL+3+ALPHA\r
+20$:   RTS\r
+       .SBTTL  GET LIVES\r
+GTLIVES:       LDA READY\r
+       BNE GTLIVES             ;WAIT FOR GOOD DATA\r
+       LDA OPTION\r
+       CLC\r
+       AND I,3\r
+       ADC I,2                 ;2 TO 5 LIVES\r
+       STA LIVES\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  SLOW DOWN ROUTINE\r
+SLOWDN:        LDA VELL\r
+       STA R1\r
+       LDA VELH                ;GET 2 BYTE VELOCITY\r
+       CMP I,80                ;1/2\r
+       ROR\r
+       ROR R1\r
+       CMP I,80\r
+       ROR\r
+       ROR R1                  ;1/4\r
+       CMP I,80\r
+       ROR\r
+       ROR R1                  ;1/8 OF VELOCITY\r
+       TAY                     ;SAVE MSB\r
+       SEC\r
+       LDA VELL\r
+       SEC\r
+       SBC R1                  ;DECREMENT VELOCITY BY 1/8\r
+       STA VELL\r
+       TYA                     ;VELH - Y (MSB'S)\r
+       EOR I,0FF               ;THE CARRY IS CORRECT FROM THE SUBTRACT\r
+       ADC VELH\r
+       STA VELH\r
+       RTS                     ;THAT'S ALL\r
+       .PAGE\r
+       .SBTTL CHECK FOR HIGH SCORE UPDATE\r
+UPDATE:        \r
+       LDA I,-1\r
+       STA UPDFLG              ;RESET FLAG\r
+       LDY I,0                 ;INDEX INTO HIGH SCORE TABLE\r
+20$:   LDA Y,HSCORE\r
+       CMP SCOREH\r
+       BCC 30$\r
+       BNE 25$                 ;NOT SAME\r
+       LDA Y,HSCORE+1\r
+       CMP SCOREM\r
+       BCC 30$                 ;NEW HIGH SCORE\r
+       BNE 25$                 ;NOT GOOD ENOUGH\r
+       LDA Y,HSCORE+2          ;IF MSB'S ARE THE SAME\r
+       CMP SCOREL              ;... CHECK LSB'S\r
+       BCC 30$                 ;GOT ONE\r
+25$:   INY\r
+       INY\r
+       INY\r
+       CPY I,3*5               ;CHECK AN 5 SCORES\r
+       BCC 20$\r
+90$:   RTS                     ;NO OTHER NEEDED NOW\r
+30$:   STY R6                  ;SAVE TARGET LOCATION\r
+       STY UPDFLG              ;POINT TO INITIALS LOCATION\r
+       LDX I,3*5-3             ;POINTER FOR MOVE\r
+       LDY I,3*5-6\r
+35$:   CPX R6\r
+       BEQ 45$                 ;END OF COPY\r
+       LDA Y,HSCORE\r
+       STA X,HSCORE\r
+       LDA Y,HSCORE+1\r
+       STA X,HSCORE+1          ;MOVE DOWN\r
+       LDA Y,HSCORE+2\r
+       STA X,HSCORE+2\r
+       LDA Y,INITL             ;MOVE INITIALS\r
+       STA X,INITL\r
+       LDA Y,INITL+1\r
+       STA X,INITL+1\r
+       LDA Y,INITL+2\r
+       STA X,INITL+2\r
+       DEY\r
+       DEY\r
+       DEY\r
+       DEX\r
+       DEX\r
+       DEX\r
+       BNE 35$                 ;LOOP UNTIL Y=0 OR DONE\r
+45$:   LDA I,01                ;START LETTERS AT A\r
+       STA X,INITL\r
+       LDA I,0\r
+       STA X,INITL+1\r
+       STA X,INITL+2\r
+       STA UPDINT\r
+       STA SHDB                ;INIT SWITCH TO ALREADY PUSHED\r
+       LDY R6\r
+       LDA SCOREH\r
+       STA Y,HSCORE\r
+       LDA SCOREM              ;MOVE IN NEW SCORES\r
+       STA Y,HSCORE+1\r
+       LDA SCOREL\r
+       STA Y,HSCORE+2\r
+;\r
+;GET INITIALS\r
+;\r
+       .SBTTL   GET INITIALS\r
+;CALLED 1 TIME A FRAME\r
+; UPDFLG IS A POINTER TO THE 1 OF 5 INITAL BLOCKS\r
+;TO BE UPDATED. UPDINT IS A 0 TO 2 COUNTER TO POINT\r
+;TO THE 1 OF 3 INITIALS BEING UPDATED IN THIS BLOCK.\r
+;SWSTAT IS USED TO DETECT THE POSITIVE GOING TRANSITION\r
+;ON THE FIRE SWITCH.\r
+;UPD IS THE CALCULATED UP/DOWN POT VALUE USED TO SELECT\r
+;THE CORRECT INITIAL.\r
+;\r
+GETINT:        LDA UPDFLG                      ;ARE WE UPDATING?\r
+       BPL 10$                 ;YES\r
+5$:    RTS\r
+10$:\r
+       LDA I,0                 ;REMOVE SHELL\r
+       STA SHL0VB\r
+       STA LASERH+1\r
+       STA LASERH\r
+       LDA I,HLT3\r
+       STA HILIGHT\r
+       LDA I,BLUE\r
+       STA COLARY+ALPHC        ;RED LETTERS FOR INITIALS\r
+       LDA I,ORANGE\r
+       STA COLARY+HILT3\r
+       LDA I,WHITE\r
+       STA COLARY+HILT1        ;WHITE SELECT\r
+                               ;MESSAGES\r
+       LDX #22.\r
+       JSR MESS\r
+       LDX #23.\r
+       JSR MESS\r
+       JSR MESGD               ;OUTPUT INFO\r
+       LDX I,0                 ;NO ADD\r
+       LDA FRAMC\r
+       BNE 11$\r
+       BIT ATTIM\r
+       BPL 30$                 ;DONE\r
+11$:   AND I,0F                ;LETTER UPDATE TIME\r
+       BNE 16$                 ;NOT TIME TO COUNT\r
+       LDX I,1                 ;GUESS A + COUNT\r
+       LDA STEER               ;+ OR - ?\r
+       BPL 15$\r
+       LDX I,-1\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,0                 ;ABS VALUE OF DIFFERENCE\r
+15$:   AND I,0F0               ;A PLACE WITH NO CHANGE\r
+       BEQ 20$                 ;NONE CLOSE TO CENTER\r
+16$:   CLC\r
+       LDA UPDINT\r
+       ADC UPDFLG              ;CREATE THE POINTER TO CURRENT INITIAL\r
+       TAY                     ;IN Y\r
+       CLC\r
+       TXA\r
+       ADC Y,INITL             ;ADD CHANGE TO CURRENT INITIAL\r
+       BPL 17$\r
+       LDA I,26.               ;IF UNDER 0, WRAP TO 26. (Z)\r
+17$:   CMP I,27.               ;DID WE PASS Z?\r
+       BCC 18$                 ;NOPE\r
+       LDA I,0                 ;IF YES WRAP TO 0. (BALNK) ... MOD 26 ...\r
+18$:   STA Y,INITL\r
+       LDX UPDINT\r
+       STA INTTEM              ;SAVE FOR LATER\r
+       ORA I,40                ;WHITE BACKROUND\r
+       STA X,ALPHA+0D          ;OUTPUT TO SCREEN\r
+20$:   LDA SHLD                ;ENTER INITIAL?\r
+       BPL 21$\r
+       STA SHDB\r
+       RTS                     ;INIT SWSTAT AND RETURN\r
+21$:   EOR SHDB                ;+ EDGE?\r
+       BPL 35$                 ;NO CHANGE\r
+       EOR SHDB                ;GET NEW STATUS\r
+       STA SHDB                ;SAVE\r
+       LDA INTTEM              ;CHANGE COLOR\r
+       ORA HILIGHT\r
+       STA X,ALPHA+0D\r
+       INC UPDINT              ;INITIAL OK. POINT TO NEXT\r
+       LDX UPDINT\r
+       CPX I,3                 ;DONE WITH ALL 3?\r
+       BEQ 30$                 ;YES\r
+       LDA I,0F0               ;1 MINUTES\r
+       STA ATTIM               ;RESET\r
+       LDA I,01                ;SET TO A TO START\r
+       STA Y,INITL+1           ;SET TO 'A'\r
+       BNE 35$                 ;********ALWAYS***********\r
+30$:   LDA I,-1                ;SET UPDFLG TO -1 TO SHOW DONE\r
+       STA UPDFLG\r
+       LDA I,ATCON\r
+       STA ATTIM\r
+       JSR CLRZRO\r
+35$:   RTS\r
+       .PAGE\r
+\f      .SBTTL HEX TO DECIMAL CONVERT\r
+;\r
+;      CONVERTS HEX INTO DECIMAL - 2 BYTE HEX IN X & Y\r
+;      RESULT IN NUMB3,NUMB2,NUMB1\r
+;\r
+;      ROUTINE FOR FAST 16-BIT BINARY TO 6 DIGIT CONVERSION\r
+;      INPUT:  X=MSB'S, Y=LSB'S\r
+;      OUTOUT: A=LSD'S, X=MIDDLE, Y=MSD'S\r
+;      774. CYCLES WORST (AND BEST) CASE FOR 16. BITS\r
+;\r
+DECIMAL:STY R0         ;R0+1,R0=BINARY WORD\r
+       LDY I,15.               ;BIT COUNT\r
+DECCNV:        STX R0+1\r
+       LDA I,0\r
+       STA NUMB1               ;CLR DECIMAL BYTES\r
+       STA NUMB2\r
+       STA NUMB3\r
+       SED                     ;SET DECIMAL MODE\r
+10$:   ASL R0\r
+       ROL R0+1                ;SHIFT A BIT OUT OF THE BINARY WORD\r
+       LDA NUMB3\r
+       ADC NUMB3\r
+       STA NUMB3               ;AND ADD INTO DECIMAL BYTES\r
+       LDA NUMB2\r
+       ADC NUMB2\r
+       STA NUMB2\r
+       LDA NUMB1\r
+       ADC NUMB1\r
+       STA NUMB1\r
+       DEY\r
+       BPL 10$\r
+       LDY NUMB1\r
+       LDX NUMB2\r
+       LDA NUMB3\r
+       CLD                     ;CLEAR DECIMAL FLAG\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  BCD TO ASCII LEADING 0 BALNKING (3 TO 6)\r
+;\r
+;INPUT: NUMB1,NUMB2,NUMB3 (MSB TO LSB)\r
+;OUTPUT: ASC1,ASC2,...,ASC6 (MSB TO LSB)\r
+;\r
+;CLOBBERS A,X,Y;  CHANGES 0 PAGE AS SHOWN;  NO STACK\r
+;\r
+ASCAY: LDA I,2\r
+       STA R2                  ;DIGIT COUNT\r
+       LDA I,0\r
+       LDX I,5\r
+10$:   STA X,ASCI              ;INIT TO NOTHING\r
+       DEX\r
+       BPL 10$\r
+       INX                     ;X=0\r
+       CLC                     ;INIT BLANK FLAG\r
+       LDY I,0                 ;OUTPUT POINTER\r
+14$:   LDA X,NUMB1\r
+       AND I,0F0               ;MSB NIBBLE\r
+       BNE 15$                 ;0?\r
+       BCC 20$                 ;IF 0, 0 BALNK?\r
+15$:   LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA I,30\r
+       STA Y,ASCI\r
+       SEC                     ;SET NO MORE BLANKING FLAG\r
+20$:   LDA X,NUMB1             ;GET INPUT AGAIN\r
+       AND I,0F                ;BOTTOM NIBBLE\r
+       BNE 25$                 ;NOT 0\r
+       BCC 30$                 ; IS 0, BLANKING?\r
+25$:   ORA I,30                ;ASCII\r
+       STA Y,ASCI+1\r
+       SEC                     ;SET FLAG\r
+30$:   INY\r
+       INY                     ;NEXT OUTPUT\r
+       INX\r
+       DEC R2                  ;ANOTHER DONE\r
+       BNE 35$                 ;LAST OCCURENCE?\r
+       SEC                     ;IF YES, MUST HAVE 2 0'S\r
+35$:   BPL 14$\r
+       RTS\r
+       .BYTE 07                ;CKSUM2\r
+       .SBTTL  (CK2)\r
+       .PAGE\r
+       .SBTTL LASER CONTROL ROUTINES\r
+       .SBTTL  MOTION & PICTURE CONTROL\r
+;\r
+;LASER CONTROL ROUTINE\r
+;2 LASERS AVAILABLE. ONE FIRES FROM THE LEFT SIDE, THE OTHER FROM\r
+;THE RIGHT.\r
+;LASTT:STATUS (80 ACTIVE); LASERV: VERTICAL POSITIONS, LASERH: HORIZ POSITIONS\r
+;LASERD=DISTANCE AWAY\r
+;LASER=IX=0 IS ON RIGHT (IN MIRROR)\r
+;\r
+;\r
+LASER: LDA HILIGHT             ;SAVE CURRENT HILIGHT\r
+       STA R5\r
+       LDA I,HLT2\r
+       STA HILIGHT\r
+       LDX I,0                 ;BEEP ON OVERHEAT\r
+       LDA HOTDLY              ;OVERHEATED?\r
+       BMI 6$                  ;YES-DO NORMAL OVERHEAT\r
+       LDA LASTIM              ;WARNING NECESSARY?\r
+       CMP I,48\r
+       BCC 5$                  ;NO WARNING NEEDED\r
+       LDX I,0AF               ;WARM SOUND\r
+       LDY I,20\r
+       CMP I,60\r
+       BCC 7$\r
+       LDY I,10\r
+       BNE 7$                  ;***ALWAYS***\r
+6$:    LDX I,0AF               ;SOUND OF OVERHEAT\r
+       LDY I,08                ;NORMAL BEEP FOR OVERHEAT\r
+7$:    LDA I,04\r
+       AND FRAMC\r
+       BNE 5$\r
+       TAX                     ;IF OFF, OK\r
+5$:    BIT STATE               ;ATTRACT?\r
+       BPL 8$\r
+       LDX I,0                 ;NO SOUND\r
+8$:    STX AUDC31\r
+       STY AUDF31\r
+       LDA FRAMC\r
+       AND I,3                 ;COOL DOWN RATE\r
+       BNE 1$\r
+       LDA LASTIM              ;'TEMPATURE'\r
+       BEQ 1$                  ; NOT PAST 0\r
+       DEC LASTIM\r
+1$:    BIT STATE\r
+       BMI 4$                  ;NO MESSAGE IN ATTRACT\r
+       LDA LASTIM\r
+       LDX I,0                 ;GUESS 'READY' MESSAGE\r
+       CMP I,48                ;WHAT TEMP?\r
+       BCS 2$                  ;ABOVE READY\r
+       LDA I,0                 ;ITS DOWN TO READY ...\r
+       STA HOTDLY              ;JUST IN CASE YOU WERE WAITING FOR IT TO COOL\r
+       BEQ 3$                  ;******** ALWAYS ***********\r
+2$:    INX                     ;GUESS 'WARNING' NOW\r
+       CMP I,78                ;TO HOT TEMP LEVEL\r
+       BCC 3$\r
+       LDA I,80                ;IT OVERHEATED SO ...\r
+       INX                     ;'OVERHEATED'\r
+       STA HOTDLY              ;TURN OFF FOR A WHILE\r
+       TXA\r
+       PHA                     ;SAVE INDEX TO MESSAGE\r
+       PLA\r
+       TAX                     ;RESTORE MESSAGE  POINTER\r
+3$:    LDA HOTDLY              ;TEMP STATUS\r
+       BPL 31$\r
+       LDX I,2                 ;STAY 'OVERHEATED' UNTILL 'READY'\r
+31$:   TXA\r
+       PHA                     ;SAVE STATUS FOR LATER\r
+       LDA FRAMC\r
+       AND I,10\r
+       BNE 32$\r
+       LDX I,0                 ;FLASH W/ ALT MESSAGE (IF ANY)\r
+32$:   LDA X,LMSG              ;GET PROPER MESSAGE NUMBER\r
+       TAX\r
+       JSR MESS\r
+       PLA     \r
+       TAX                     ;GET BACK STATUS\r
+       LDA X,HCOL              ;GET COLOR\r
+       STA COLARY+HILT2\r
+4$:    LDX I,1                 ;CHECK BOTH LASERS\r
+NEXTL: STX R3                  ;SAVE FOR LATER\r
+       LDA X,LASTT             ;ACTIVE\r
+       BMI 50$                 ;IF YES, MOVE IT ALONG\r
+       BIT SHIELD              ;SHIELD ON?\r
+       BMI 7$                  ;NO SHOT IF YES\r
+       LDA I,1                 ;EXPLODING\r
+       BIT STATE               ;GAME ACTIVE?\r
+       BMI 10$                 ;NO\r
+       BNE 10$\r
+       CPX NXTLAS              ;THIS ONES TURN\r
+       BNE 7$                  ;A 'LONG CUT' TO 90$\r
+       ROL FLAST               ;CARRY = LAST STATUS OF FIRE BUTTON\r
+       LDA FIRE\r
+       STA FLAST               ;READ SWITCH AND SAVE IN FLAST\r
+       BMI 5$                  ;NOT PUSHED\r
+       BCC 90$                 ;WAS PUSHED LAST TIME\r
+       BIT HOTDLY              ;TO HOT TO SHOOT?\r
+5$:    BMI 90$                 ;YES\r
+6$:\r
+       LDX I,1\r
+       JSR STSOUND             ;PHASER SOUND\r
+       LDX R3                  ;RESTORE IX\r
+       LDA LASTIM              ;HEAT\r
+       ADC I,0B\r
+       BMI 61$                 ;DON'T GO OVER 88\r
+       STA LASTIM              ;+10 (+?1)\r
+61$:   LDA I,80\r
+       STA X,LASTT\r
+       TXA\r
+       EOR I,1\r
+       STA NXTLAS              ;SWAP NEXT START\r
+       LDA I,08\r
+       STA X,LASERV            ;V STARTS AT 0\r
+       LDA I,0FF\r
+       STA X,LASERD            ;0FF IS AT YOUR NOSE\r
+       STA X,LASERH            ;GUESS LASER 1(STARTS AT 8,FF)(H,V)\r
+       TXA                     ;LASER 1?\r
+7$:    BNE 90$                 ;YES, SO POSITION OK\r
+       LDA I,1A\r
+       STA X,LASERH            ;ELSE STORE OUT (1A,8)(H,V)\r
+       BNE 90$                 ;***ALWAYS***\r
+;ATTRACT MODE SHOOT\r
+10$:   LDA OBJST               ;ACTIVE OBJECT?\r
+       BPL 90$                 ;NOPE!!\r
+       SEC\r
+       LDA OBSPD\r
+       SBC VELH                ;MOVING AWAY?\r
+       BCS 90$                 ;YES. DON'T SHOOT\r
+       LDA DISTANCE            ;GAME IN ATTRACT, MUST FIRE AUTO\r
+       CMP I,0B0               ;HOW FAR AWAY IS SHIP\r
+       BCS 6$\r
+       BCC 90$                 ;DO NEXT LASER ***ALWAYS***\r
+50$:   LDA X,LASERD            ;LASER ACTIVE SO MOVE ALONG\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;SPEED IS TOP NIBBLE\r
+       TAY                     ;SAVE A FOR LATER\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1                 ;NEGATE SPEED TO 'ADD' TO V POSIT\r
+       PHA                     ;SAVE FOR LATER\r
+       PHA\r
+       TYA\r
+       CLC\r
+       ADC X,LASERV            ;CARRY STILL CLEAR\r
+       STA X,LASERV\r
+       CPX I,1                 ;LASER 1\r
+       BEQ 55$\r
+       PLA                     ;DESTROY OLD PUSHED VALUE\r
+       TYA                     ;GET BACK + SPEEED FOR LASER # 0\r
+       PHA                     ;PUT BACK THIS ONE FOR BELOW\r
+55$:   PLA                     ;GET VALUE TO ADD\r
+       CLC\r
+       ADC X,LASERH\r
+       STA X,LASERH\r
+       PLA                     ;GET BACK + SPEED\r
+       CLC\r
+       ADC X,LASERD\r
+       STA X,LASERD            ;NEW DISTANCE\r
+       BMI COLT                        ;IF-, STILL MOVING\r
+       LDA I,0                 ;AT END, DEACTICATE IT.\r
+       STA X,LASERH\r
+       STA X,LASERV\r
+       STA X,LASERD\r
+       STA X,LASTT\r
+90$:\r
+ESCAPE:        LDX R3                  ;RECALL OLD X\r
+       DEX\r
+       BMI 99$\r
+       JMP NEXTL\r
+99$:                           ;FALL THROUGH\r
+       .SBTTL  BAR GRAPH OUTPUT LASER TEMP\r
+BARS:  BIT STATE               ;ATTRACT?\r
+       BMI 25$                 ;IF YES, SKIP\r
+       LAH LASPL\r
+       STA OUTPTR+1            ;OUTPUT LOCATION\r
+       LAL LASPL\r
+       STA OUTPTR\r
+       LDA LASTIM\r
+       JSR GRAPH\r
+       LDA I,LIMITC+HLT2\r
+       STA LASPL+10            ;LIMIT CHAR\r
+25$:   LDA R5\r
+       STA HILIGHT             ;NORMAL HILIGHT\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  COLLISION CHECK(MO)\r
+;\r
+;COLLISION CHECK\r
+;\r
+COLT:  BIT OBJST               ;STATUS OF OBJECT\r
+       BPL ESCAPE              ;NOT ACTIVE\r
+       BVS ESCAPE              ;ALREADY EXPLODING\r
+       CLC\r
+       LDA HOFF\r
+       ADC I,8                 ;A BIT MOR LIBERAL\r
+       STA R1\r
+       LDA X,LASERV            ;VERT OF LASER\r
+       EOR I,0FF               ;RUNS WRONG WAY\r
+       SEC\r
+       SBC OBJV                ;DIFFERENCE\r
+       BCS 10$\r
+       EOR I,0FF\r
+       ADC I,1                 ;ABS VALUE\r
+10$:   CMP VOFF\r
+       BEQ 11$\r
+       BCS ESCAPE              ;NOT WITHIN VERTICAL\r
+11$:   LDA X,LASERH\r
+       SEC\r
+       SBC OBJH                ;H DIFF\r
+       BCS 20$\r
+       EOR I,0FF\r
+       ADC I,1                 ;ABS VALUE\r
+20$:   CMP R1\r
+       BEQ 21$\r
+       BCS ESCAPE\r
+21$:   LDA X,LASERD            ;DISTANCE\r
+       CMP I,90\r
+       BCS ESCAPE\r
+;OBJECT HIT\r
+;\r
+       LDA I,40                ;SET HIT BIT\r
+       ORA OBJST\r
+       STA OBJST\r
+       LDA A,TARTBL+1          ;MOVE TO EXPLOSION SEQUENCE\r
+       STA OBJPIC\r
+       LDA I,0\r
+       STA X,LASTT             ;TURN OFF LASER\r
+       STA X,LASERH\r
+\r
+       .SBTTL UPDATE SCORE\r
+;POINTS BASED ON VELOCITY AT TIME OF HITS & SIZE OF OBJECT\r
+       STA R1\r
+       LDA DISTANCE\r
+       EOR I,0FF               ;NEGATE QUANTITY\r
+       LSR\r
+       LSR\r
+       ADC VELH                ;ADD IN VELOCITY\r
+       STA R0\r
+       STA R2\r
+       BCC 25$                 ;ANY CARRY?\r
+       INC R1                  ;TAKE CARE OF THAT!!\r
+25$:   LDX BONMUL              ;BONUS\r
+       BEQ 27$\r
+26$:   CLC\r
+       LDA R2\r
+       ADC R0\r
+       STA R0\r
+       BCC 22$\r
+       INC R1\r
+22$:   DEX\r
+       BNE 26$\r
+27$:   LDY R0\r
+       LDX R1                  ;RESTORE A & X\r
+       JSR DECIMAL\r
+       LDX I,20\r
+       LDA HITS                ;> 100?\r
+       BNE 23$\r
+       LDA HITS+1\r
+       CMP I,LVL4              ;> 35?\r
+       BCC 24$\r
+23$:   LDX I,1                 ;NO DELAY IF YES\r
+24$:   STX STDELAY\r
+       SED\r
+       BIT STATE               ;ATTRACT\r
+       BMI 30$\r
+       CLC\r
+       LDA HITS+1\r
+       ADC I,1\r
+       STA HITS+1\r
+       LDA HITS\r
+       ADC I,0\r
+       STA HITS\r
+       LDA HITS+1\r
+       LDY I,1                 ; SKILL 1\r
+       CMP I,LVL2              ;IF LESS THAN 15, STILL 0\r
+       BCC 29$\r
+       CMP I,LVL3              ;15-25 SKILL 1\r
+       BCC 28$\r
+       INY                     ;ABOVE 25 SKILL 2\r
+       LDA I,80\r
+       STA SHTWT               ;ALWAYS SHOOT\r
+28$:   STY SKILL\r
+29$:   CLC\r
+30$:   LDA NUMB1               ;SCORE AMOUNT=SPEED +....\r
+       STA SCRREG              ;PUT AT OUTPUT LOCATION & HOLD REG\r
+       LDA NUMB2               ;CARRY\r
+       STA SCRREG+1\r
+       LDA NUMB3\r
+       STA SCRREG+2\r
+       BIT STATE               ;NO SCOR DURING ATTRACT\r
+       BPL 31$\r
+       JMP 50$\r
+31$:   CLC\r
+       LDA SCRREG+2\r
+       ADC SCOREL\r
+       STA SCOREL\r
+       LDA SCRREG+1\r
+       ADC SCOREM\r
+       STA SCOREM\r
+       LDA SCRREG\r
+       ADC SCOREH\r
+       STA SCOREH\r
+       BEQ 40$                 ;NO 100 THOUSANDS\r
+       LDA OPTION              ;BONUS ALLOWED?\r
+       AND #BONLBT\r
+       BEQ 48$                 ;NO BONUS ALLOWD\r
+       BIT STATE               ;100K BONUS REACHED?\r
+       BVS 48$                 ;YES\r
+       LDA I,40                ;NO-GIVE BONUS\r
+       BNE 47$                 ;SET FLAG\r
+40$:   LDA BONLVL              ;GET LEVEL\r
+       BEQ 48$                 ;NO BONUS\r
+       CMP SCOREM              ;REACHED?\r
+       BEQ 44$                 ;JUST HIT IT\r
+       BCS 48$                 ;NOT YET\r
+44$:   LDA #08                 ;SET SCORE REACHED\r
+       BIT STATE               ;ALREADY SET?\r
+       BNE 48$                 ;YEP\r
+47$:   ORA STATE\r
+       STA STATE\r
+       INC LIVES               ;GOT ONE\r
+       LDX #10.                ;BONUS MESSAGE\r
+       JSR MESS\r
+       LDA I,30\r
+       STA BONSND              ;BONUS SOUND\r
+48$:   CLD\r
+       LDA TOPS                ;NEW TOP SPEED\r
+       CLC\r
+       ADC I,2\r
+       BMI 49$                 ;TOP SPEED=7E\r
+       STA TOPS\r
+49$:   LDX I,0\r
+       JSR STSOUND             ;EXPLOSION\r
+       .SBTTL  DISPLAY HIT VALUE\r
+       LDA I,90\r
+       STA SCRTIM              ;DISPLAY TIME\r
+       JSR MESGD               ;DISPLAY STATS\r
+       LDX #14.\r
+       JSR MESS                ;'VALUE'\r
+       TXA\r
+       PHA                     ;SAVE X\r
+       LDX I,2\r
+41$:   LDA X,SCRREG            ;GET #'S FOR OUTPUT CONVERSION\r
+       STA X,NUMB1\r
+       DEX\r
+       BPL 41$\r
+       JSR ASCAY               ;CONVERT TO ASCII\r
+       PLA                     ;RESTORE Y\r
+       TAY\r
+       LDX I,-6                ;5 DIGITS\r
+42$:   LDA X,ASCI+6    \r
+       BEQ 43$                 ;LEFT JUSTIFY VALUE\r
+       ORA HILIGHT\r
+       STA Y,ALPHA\r
+       INY\r
+43$:   INX\r
+       BMI 42$\r
+       LDA I,30\r
+       ORA HILIGHT\r
+       STA Y,ALPHA             ;EXTRA 0\r
+50$:   CLD                     ;TO BE SURE\r
+       JMP ESCAPE              ;GO DO NEXT LASER BOLT\r
+       .PAGE\r
+       .SBTTL COLOR CHANGE & UPDATE\r
+;\r
+;COLOR CHANGE SUBROUTINE\r
+;USED FOR BOTH NEXT COLOR OF TUBE AND\r
+;CHANGING COLOR OF WORD TUBE CHASE\r
+;\r
+;'A'=COLOR TO BE UPDATED\r
+;'A'=NEW COLOR/SHADE (ALSO IN R0)\r
+;\r
+;BLITZES A & Y UPDATED ZERO PAGE 'DIR' IF NECESSARY\r
+;\r
+;NO STACK USED\r
+;\r
+;\r
+COLCHG:        STY R2                  ;SAVE DIRECTION\r
+       SEC\r
+       BIT R2                  ;INTENSITY UP OR DONW\r
+       BPL 10$                 ;UP\r
+       ADC I,0F                ;DOWN ADD 10 (CARRY SET)\r
+       STA R1\r
+       CMP I,0C0               ;> F0 ?\r
+       BCC 20$\r
+       CLC\r
+       ADC I,1                 ;CHANCE COLOR\r
+       EOR R1                  ;IF THIS SEEMS WEIRD, ASK MIKE ALBAUGH\r
+       AND I,0F                \r
+       EOR R1\r
+       STA R1\r
+5$:    LDA I,0FF\r
+       EOR R2                  ;CHANGE DIRECTION OF CHANGE\r
+       STA R2\r
+       JMP 20$\r
+10$:   SBC I,10                ;SUBTRACT 10 (CARRY SET)\r
+       STA R1\r
+       CMP I,70                ;MAXIMUM BRITHTNESS?\r
+       BCC 5$                  ;CHANCE DIRECTIONS\r
+20$:   LDY R2\r
+       LDA R1                  ;NEW COLOR IN A\r
+       RTS\r
+       .SBTTL FLASH ON EXPLOSION\r
+;\r
+;FLASH COLOR OF MOTION OBJECT ON EXPLOSION\r
+;\r
+;BLITZES 'A' & CHANGES COLARY EXTRIES\r
+;\r
+;2 BYTE STACK USED\r
+;\r
+FLASH: LDA COLARY+MOTW\r
+       JSR CONLY\r
+       STA COLARY+MOTW\r
+       LDA COLARY+MOTD\r
+       JSR CONLY\r
+       STA COLARY+MOTD\r
+       LDA COLARY+MOTG\r
+       JSR CONLY\r
+       STA COLARY+MOTG\r
+       RTS\r
+;\r
+;SUBROUTINE USED ABOVE,CHANGES COLOR ONLY FOR FLASH EFFECT\r
+;\r
+CONLY: CLC\r
+       ADC I,01                ;+1 MOD 7 TO A\r
+       AND I,07\r
+       RTS\r
+       .PAGE\r
+       .SBTTL BAR GRAPH CALCULATION\r
+;\r
+;INPUT A # BETWEEN 0 & 80. THIS ROUTINE WILL RETURN\r
+;THE NUMBER OF WHOLE SEGMENTS & THE SIZE (0-7) OF A PARTIAL\r
+;SEGMENT\r
+;\r
+;INPUT =A. OUTPUT: Y=WHOLE SEGMENTS, X=PARTIAL\r
+;\r
+;BLITES A & Y & X, NO STACK\r
+;\r
+GRAPH: STA R6\r
+       AND I,07                ;REMINDER 0-7\r
+       TAX\r
+       LDA R6\r
+       LSR\r
+       LSR\r
+       LSR\r
+       TAY\r
+       .SBTTL  OUTPUT GRAPH ROUTINE\r
+       STY R6                  ;SAVE Y\r
+       BEQ 15$                 ;NO WHOLE SEGMENTS\r
+       LDA I,GRPIC0+7          ;WHOLE SEGMENTS\r
+       ORA HILIGHT\r
+10$:   STA NY,OUTPTR           ;OUTPUT SEGMENTS\r
+       DEY\r
+       BNE 10$\r
+15$:   LDY R6                  ;GET BACK LAST PLACE\r
+       TXA\r
+       CLC\r
+       ADC I,GRPIC0-1          ;BOTTOM OF PARTICAL PICTURE\r
+       INY\r
+       ORA HILIGHT\r
+       STA NY,OUTPTR\r
+       INY\r
+       LDA HILIGHT             ;FILL W/BLANK TO END OF BAR\r
+20$:   CPY I,19.               ;MAX # OF PLACES\r
+       BCS 25$                 ;QUIT IF=OR OVER\r
+       STA NY,OUTPTR\r
+       INY\r
+       BNE 20$                 ;*ALWAYS*\r
+25$:   RTS\r
+       .PAGE\r
+       .SBTTL INITIALIZATION\r
+\r
+CLR2:  LDX I,ZHI2\r
+       BNE CLR\r
+CLRZRO:        LDX I,ZHI               ;BYTE COUNT\r
+       BNE CLR\r
+CLRALL:        LDX I,0F8               ;CLEAR ALL (LEAVE STACK SPACE)\r
+CLR:   LDA I,0\r
+10$:   STA ZX,0                ;CLEAR PAGE ZERO\r
+       STA X,PAGE2             ;& PAGE 2\r
+       STA X,PAGE1\r
+       DEX\r
+       BNE 10$\r
+       STA ZX,0                ;LAST EXTRA PLACE\r
+\r
+       STA X,PAGE1\r
+       .SBTTL  TUBE INIT\r
+       LDA I,ORGIN\r
+       STA Z,ORH\r
+       .SBTTL  HARDWARE INIT\r
+INIT:\r
+;\r
+;INIT HARDWARE\r
+       LDX I,15.\r
+5$:    LDA X,COLINT            ;INIT COLOR ARRAY TO START COLORS\r
+       STA X,COLARY            ;PUT IN RAM\r
+       LDA I,0\r
+       STA X,POKEY             ;SOUND CHANNLES OFF\r
+       STA X,POKEY1\r
+       DEX\r
+       BPL 5$\r
+       LDX I,2A\r
+;      LDA I,0                 ;A=0 FROM ABOVE\r
+6$:    STA X,LINEV+SQUARE      ;ALL OTHER LINES OFF SCREEN\r
+       STA X,LINEH-2           ;0 LINES & "SHELL" HSTART\r
+       DEX\r
+       BPL 6$\r
+       STA Z,ORL               ;CENTER ORIGIN\r
+       STA Z,ORVH              ;VERT ORIGIN\r
+       STA MOBSTB              ;SET MOTION OBJ RAM POINTER TO 0\r
+       STA MOBSC0\r
+       STA MOBSC1\r
+       STA DIR                 ;DIRECTION OF COLOR CHANGE IS UP\r
+       STA SHIELD              ;SHIELDS OFF\r
+       TAX                     ;X=0\r
+7$:    STA X,ALPHA             ;CLEAR ALPHA\r
+       DEX\r
+       BNE 7$                  ;UNTIL X =0 AGAIN\r
+;INIT BACKROUND LINE\r
+;      LDA I,0                 ;A=0 FROM ABOVE\r
+       STA LINEVS+BACKROUND\r
+       STA LINESH+BACKROUND\r
+       STA SHL0VB              ;REMOVE SHELLS\r
+       STA SHL1V\r
+       STA MOBJVB              ;& MOTION OBJECT\r
+       STA SECBIT\r
+       LDA I,0FF\r
+       STA LINEV+BACKROUND     ;BACKROUND LINES\r
+       LDA I,1\r
+       STA LINEH+BACKROUND\r
+       LDA I,BKLCOL            ;BACKROUND LINE  COLOR \r
+       STA LINEC+BACKROUND\r
+;      LDA I,7                 ;BACKCOL=7\r
+       STA SKCTL1              ;FAST POTS\r
+;      LDA I,BLACK             ;BKLCOL IS BLACK\r
+       STA ECOLOR              ;INIT SQUARE 0 TO BLACK\r
+       STA LSTCOL              ;LAST COLOR WAS BLACK\r
+       LDA I,03\r
+       STA SKCTL               ;START POKEY\r
+       STA NXTCLR              ;INIT COLOR OF TUBE\r
+       STA POTGO               ;START POKEY RUNNING\r
+       LDA I,80                ;SPECIAL CASES FOR BACKROUND\r
+       STA PTWAIT              ;TURN OFF POT READING FOR SHORT TIME AFTER RESET\r
+       STA VCENT+1\r
+       LDA I,0C0               ;INIT HILIGHT\r
+       STA HILIGHT             ;INIT TO COLOR F\r
+       JSR ERASE               ;REMOVE MOTION OBJECT\r
+       LDA I,40\r
+       STA OUT202              ;LAMP OFF & ALL OTHER BITS TOO\r
+       STA DIST\r
+       STA VDIST               ;INIT DISTANCE\r
+       LDX I,0\r
+70$:   LDA I,0FF               ;SPECIAL CLEAR OF UNUSED LINES\r
+       STA AX,MOTT             ;IN MOTION OBJECT\r
+       STA AX,MOTT+100\r
+       STA AX,MOTT+200\r
+       STA AX,MOTT+300\r
+       INX\r
+       BNE 70$\r
+       LDA I,8\r
+       STA READY               ;DELAY ON POKEY DATA GOOD\r
+       STA VELH                ;ATTRACT SPEED\r
+       STA NOT                 ;INIT TIME TO NEXT SQUARE (NEW OBJECT TIME)\r
+       STA POTGO1              ;READ POT PORTS POKEY 1 FOR COIN OPTIONS\r
+       LDA OPTN1\r
+       PHA\r
+       AND #7F                 ;SPECIAL THROW AWAY\r
+       STA $CMODE\r
+       PLA\r
+       AND #80                 ;1 LANG BIT\r
+       STA LANG+1              ;TEMP\r
+       LDA #SECURE&0FF         ;SET UP SECURITY INDIRECT PTR\r
+       STA SECIND              ;LOW BYTE\r
+       LDA #<SECURE/100&0FF>\r
+       STA SECIND+1            ;HIGH BYTE\r
+       LDA 90$                 ;GET RTS\r
+       STA SECURE+SECOFF+1     ;PUT IN RTS\r
+90$:   RTS\r
+;\r
+\r
+;OTHER TABLES\r
+;\r
+;MESSAGE # FOR LASER STATUS & BACKGROUND COLOR\r
+HCOL:  .BYTE GREEN,YELLOW,RED  ;HILIGHT COLOR BASED ON LASER MESSAGE\r
+SCOL:  .BYTE GREEN,RED,YELLOW\r
+SMSG:  .BYTE 21.,17.,16.       ;SHIELD STATUS MESSAGE\r
+LMSG:  .BYTE 18.,20.,19.               ;LASER STATUS MESSAGE\r
+COLINT:        .BYTE BLACK,RED,BLACK,YELLOW\r
+       .BYTE RED,GREEN,ORANGE,BLACK,BLACK\r
+       .BYTE BLACK,BLACK,BLACK,BLACK,BLACK,BLACK,BLUE\r
+;ABOVE COLORS ARE INITIAL VALUES FOR BELOW\r
+;BLANKING,MOTOBJ(10)&SHELL(10),MOTOBJ(01)&SHELL(01),MOTOBJ(00)\r
+;ALPHA,HILIGHT(01)&SHELL(00),HILIGHT(10),BACKROUND\r
+;LINES(4-E),HILIGHT(11)\r
+       .PAGE\r
+       .SBTTL CRAMIT\r
+CRAMIT:        LDX I,3*5\r
+10$:   LDA X,INITIT\r
+       STA X,INITL             ;INIT INITIALS\r
+       LDA X,INITS\r
+       STA X,HSCORE\r
+       DEX\r
+       BPL 10$\r
+       RTS\r
+INITIT:        .BYTE 4F,52,52,44,4C,53,44,44,53,4F,44,44,4A,45,44\r
+INITS: .BYTE 0,5,0,0,4,0,0,3,0,0,2,0,0,1,0\r
+EXSCR: .BYTE 30,60,90,0                ;EX PLAY THOUSANDS LEVEL\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/TCMESG.MAC b/TCMESG.MAC
new file mode 100644 (file)
index 0000000..7a562a7
Binary files /dev/null and b/TCMESG.MAC differ
diff --git a/TCMOT.MAC b/TCMOT.MAC
new file mode 100644 (file)
index 0000000..849094b
--- /dev/null
+++ b/TCMOT.MAC
@@ -0,0 +1,1577 @@
+       .TITLE TCMOT -- TUBE CHASE MOTION ROUTINE\r
+       .ENABL AMA\r
+       .RADIX 16\r
+       .SBTTL GAME DESCRIPTION & ALLOCATION\r
+       .REPT 0\r
+**********************************************\r
+*PROJECT #:    16703\r
+*\r
+*DISK #:       99 & B41\r
+*\r
+*HARDWARE:             DAVE SHERMAN "SPECIAL" ELLIPSE \r
+*\r
+*ASSEMBLY:     ...=DX1:TCMOT\r
+*\r
+*LINK:         SEE TCMAIN FOR LATEST STUFF\r
+*\r
+*DESCRIPTION:  THIS IS A 1 PLAYER GAME WHERE\r
+*              THE PLAYER TRIES TO "FLY"\r
+*              THROUGH A TUBE WHICH MOVES UP,\r
+*              DOWN, LEFT & RIGHT.  (MOTION\r
+*              IS NIGHT DRIVER STYLE)\r
+*\r
+***********************************************\r
+*\r
+*PROGRAMMER:   OWEN RUBIN\r
+*\r
+*ROUTINES BY:  ED LOGG, DAVE SHEPPERD\r
+*\r
+*KEY GRIP:     MIKE ALBAUGH\r
+*\r
+*CHECKER:\r
+*\r
+***********************************************\r
+       .ENDR\r
+       .NLIST\r
+       .INCLUDE TCDEF\r
+       .LIST\r
+\f      .SBTTL  GLOBALS\r
+;\r
+;GLOBALS GO HERE\r
+;\r
+       .GLOBL MOTION,MULT,MULTS,NEG,SECTIONS,MOTOUT    ;ENTRY POINTS\r
+       .GLOBL TARGET,ERASE,MOTSET                      ;ENTRY POINTS\r
+       .GLOBL SLOWDN,COLCHG,OBJDAC                     ;EXTERNAL ROUTINES\r
+       .GLOBL TKADT,SKILL1,S.OFF,TI.OFF                        ;TRACK TABLES\r
+       .GLOBL EXPLOS\r
+       .GLOBL STSOUND\r
+\r
+\r
+;**********************************************************\r
+;***                                                   ***\r
+;***                                                   ***\r
+;***                   FORMULAS                        ***\r
+;***     VEL=VEL +GTBL(GEAR.GAS.VEL) - DTBL(.GEAR)      ***\r
+;***                VELK=(VEL)(KP)                     ***\r
+;***                STC=(STEER)(VEL)                   ***\r
+;***                PXO=PXO-(PYA)(VELK)+STC            ***\r
+;***                PXE=PXE+(PYA)(VELK)+STC            ***\r
+;***                PYA=PY-PYMIN-2.                    ***\r
+;***                PY=PY+(PYA)(VEL)                   ***\r
+;***                                                   ***\r
+;**********************************************************\r
+\f      .SBTTL MACROS FOR MISSING INSTRUCTIONS\r
+       .CSECT TCMOT\r
+\r
+       .RADIX 16\r
+       .MACRO LAH LABEL\r
+       LDA I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD LABEL\r
+       .DSABL M68\r
+       .=.-1\r
+       .ENDM\r
+       .MACRO LAL LABEL\r
+       LDA I,0\r
+       .=.-1\r
+       .WORD LABEL\r
+       .=.-1\r
+       .ENDM\r
+       .MACRO LYL LABEL\r
+       LDY I,0\r
+       .=.-1\r
+       .WORD LABEL\r
+       .=.-1\r
+       .ENDM\r
+       .MACRO DLOAD LABEL\r
+       LAH LABEL\r
+       LYL LABEL\r
+       .ENDM\r
+       .PAGE\r
+;TEMP LOCATION\r
+       .SBTTL TUBE (TRACK) INFO\r
+;\r
+;TRACK CURVENESS, DISTANCE AND CONTROL\r
+;CURVENESS IS A SIGNED 7 BIT NUMBER\r
+;DISTANCE IS A VLUE 0-3F\r
+;TOP 2 BITS OF DISTANCE=CONTROL INFO\r
+;00=CURVE AS NORMAL (LEFT/RIGHT)\r
+;01=UP/DOWN CURVE\r
+;10 OR 11=SPLIT TUBE, CURVE IS LEFT/RIGHT\r
+;\r
+TKADT: .WORD SKILL1,SKILL3,SKILL4\r
+SKILL1:        .BYTE 0,3F,0,3F,0,3F    ;START W/LONG STRAIGHT\r
+       .BYTE 8,60,88,7F,8,60   ;UP/DOWN HILL\r
+       .BYTE 0,3F              ;SMALL STRAIGHT\r
+       .BYTE 8,3F,88,3F        ;NOW TURN LEFT THEN STRAIGHT\r
+       .BYTE 8,0BF,88,0BF\r
+       .BYTE 0,0BF,80          ;SPLIT & END SKILL LEVEL\r
+SKILL3:        .BYTE 0,3F              ;SHORT STRAIGHT\r
+       .BYTE 8,3F,88,3F,8,10,90,20     ;LEFT/RIGHT TURN\r
+       .BYTE 8,3F,0,3F         ;FINISH TURN\r
+       .BYTE 10,60,90,7F,10,60 ;UP/DOWN HILL\r
+       .BYTE 0,3F,90,3F,90,3F,90,3F,10,3F\r
+       .IF EQ,SPLITS\r
+       .BYTE 8,0BF,88,0BF,88,0BF,0,3F\r
+       .ENDC\r
+       .BYTE 0,0BF,80          ;NOW SPLIT\r
+SKILL4:        .BYTE 90,3F,90,3F,0,90,10,3F    ;TURN RIGHT AWAY\r
+       .BYTE 0,20,88,10,8,10,90,3F     ;CONTINUE HARD TURNS\r
+       .BYTE 10,3F,10,3F,90,3F,10,3F,10,3F\r
+       .BYTE 10,60,90,7F,10,60,0,3F    ;HILL THEN STRAIGHT\r
+       .BYTE 10,60,90,3F,90,7F,10,3F\r
+       .IF EQ,SPLITS\r
+       .BYTE 10,0BF,90,0BF,90,0BF,0,20,10,0BF\r
+       .ENDC\r
+       .BYTE 0,0BF,80          ;SPLIT & END\r
+SHPCOL:        .BYTE CYAN,CYAN,BLUE,GREEN,YELLOW,WHITE,BLACK,BLACK\r
+       .BYTE 25                        ;CKSUM 3\r
+       .SBTTL  (CK3)\r
+\f      .SBTTL MAIN MOTION LOOP\r
+M08:   .BYTE 8                 ;USED FOR BIT TEST\r
+M04:   .BYTE 4\r
+MOTION:\r
+       .SBTTL  TUBE VELOCITY CALCULATIONS\r
+;COMPUTE STC=(VELL,VELH)*STEER\r
+;LIMIT STC TO +/- 300 (HEX)\r
+\r
+DNEVEL:        LDX I,VELL              ;SET ADDRESS OF MULTIPLICAND\r
+       LDY I,STCL              ;ADDRESS OF PRODUCT\r
+       LDA ORH                 ;MOTION LIMIT\r
+       CMP I,LLMT              ;TO FAR LEFT ?\r
+       BCS 10$                 ;NOPE\r
+       BIT STEER               ;IF YES, ONLY ALLOW STEER RIGHT\r
+       BMI NOSTR               ;NO STEERING\r
+       BPL 12$                 ;WELL, OK  (******* ALWAYS*********)\r
+10$:   CMP I,RLMT              ;TO FAR RIGHT\r
+       BCC 12$                 ;NOPE\r
+       BIT STEER               ;IF YES, ONLY ALLOW STEER LEFT\r
+       BPL NOSTR\r
+12$:   LDA Z,STEER             ;STEERING PLUS?\r
+       BPL STRPL               ;YES\r
+       EOR I,0FF               ;NO\r
+       CLC                     ;NEGATE STEERING\r
+       ADC I,1\r
+       JSR MULT                ;COMPUTE 'STC' (MINUS)\r
+       JSR STCLMT              ;TOO BIG?\r
+       JSR NEG\r
+       JMP VDNV\r
+STCLMT:        LDA I,4\r
+       CMP STCH                ;>4?\r
+       BPL 1$\r
+       LDA I,3\r
+       STA STCH\r
+1$:    RTS\r
+NOSTR: LDA I,0                 ;AND DON'T ALLOW STEERING\r
+STRPL: JSR MULT\r
+       JSR STCLMT              ;STC TOO BIG? ADJUST\r
+;VSTC  =(VELL,VELH)*SPLSPD\r
+;LIMIT VSTC TO +/- 300 HEX\r
+VDNV:  LDY I,VSTCL             ;ADDR OF PRODUCT\r
+       LDA UPD                 ;UP/DOWN SPEED\r
+       BPL VSTRPL              ;PLUS?\r
+       EOR I,0FF               ;NEGATE UP/DOWN STEERING\r
+       CLC\r
+       ADC I,1\r
+       JSR MULT                ;COMPUTE 'VSTC' (MINUS)\r
+       JSR VSTCLM\r
+       JSR NEG\r
+       JMP CMPCRV\r
+VSTCLM:        LDA I,4                 ;LIMIT SPEED\r
+       CMP VSTCH\r
+       BPL 1$\r
+       LDA I,3\r
+       STA VSTCH\r
+1$:    RTS\r
+VSTRPL:        JSR MULT\r
+       JSR VSTCLM\r
+\r
+;(CRVL,CRVH)=CS*(VELL,VELH)\r
+\r
+CMPCRV:        LDY I,CRVL              ;ADDRESS OF PRODUCT\r
+       LDA Z,CS                ;GET MULTIPLIER\r
+       BPL 1$                  ;POSITIVE RESULT\r
+       AND I,7F\r
+       JSR MULT\r
+       JSR NEG                         ;NEGATIVE RESULT\r
+       JMP 2$\r
+1$:    JSR MULT                ;COMPUTE CRV\r
+;(VRVL,VRVH)=VCS * (VELL,VELH)\r
+2$:    LDY I,VRVL              ;ADDR OF PRODCUT\r
+       LDA Z,VCS               ;GET MULTIPLIER\r
+       ;X POINTS TO MULTISPLICAN (VELL)\r
+       BPL 3$\r
+       AND I,7F\r
+       JSR MULT\r
+       JSR NEG                 ;NEGATE RESULTS\r
+       JMP 4$\r
+3$:    JSR MULT\r
+4$:    LDY I,VELKL\r
+       LDA I,60                ;SET ACC=KP (VELK)\r
+       JSR MULT                ;COMPUTE VEL*KP\r
+       .PAGE\r
+       .SBTTL  PYLON MOTION\r
+;BEGIN PYLON MOTION COMPUTATION\r
+       LDX I,20\r
+       LDA I,0\r
+5$:    STA X,HPOST\r
+       DEX\r
+       BPL 5$\r
+       LDX I,NOOBJTS-1         ;OBJECT INDEX\r
+MOVOBJ:        LDA I,0                 ;CLEAR OLD\r
+       LDA ZX,ZCNTRL           ;GET CONTROL BYTE. OBJECT ACTIVE?\r
+       STA R3\r
+       BMI DOBJ2               ;YES.\r
+DOBJ:  DEX\r
+       BPL MOVOBJ\r
+       JMP OBJDNE\r
+DOBJ2: STX R4\r
+11$:   LDA ZX,ZYAXH            ;GET PY Y-POSN.\r
+       SEC\r
+       SBC I,PYMIN-2.          ;NORMALIZE TO HORIZON\r
+       STA Z,PYA\r
+       LDX I,VELKL             ;ADDRESS OF MULTIPLICAND\r
+       LDY I,PYAVKL            ;ADDRESS OF PRODUCT\r
+       JSR MULT                ;COMPUTE PYAVK = PYA*VELK\r
+       LDX I,VELL\r
+       LDY I,PYAVL\r
+       LDA Z,PYA\r
+       JSR MULT                ;COMPUTE PYAV = PYA*VEL\r
+       LDX R4                  ;GET BACK OBJECT PTR\r
+15$:   CLC\r
+       LDA VSTCL\r
+       ADC X,UPDNL             ;ADD IN STEERING\r
+       STA X,UPDNL\r
+       LDA VSTCH\r
+       ADC X,UPDNH\r
+       CMP I,UPLMT             ;DID WE HIT THE TOP?\r
+       BCC 16$                 ;IF CC, NO. SO CHECK LOWER SIDE.\r
+       LDA I,UPLMT             ;... ELSE SET TO TOP LIMIT\r
+       BNE 17$                 ;***** ALWAYS **********\r
+16$:   CMP I,DNLMT             ;DID WE HIT THE BOTTOM?\r
+       BCS 17$                 ;IF CS, WE DID NOT. \r
+       LDA I,DNLMT             ;... ELSE SET TO BOTTOM LIMIT\r
+17$:   STA X,UPDNH\r
+       LDA PYAVKL\r
+       STA R1\r
+       LDA PYAVKH\r
+       STA R2\r
+       .IF NE,SPLITS\r
+       LDA I,4                 ;STATUS\r
+       BIT R3                  ;SPLIT START?\r
+       BEQ 18$\r
+       ASL R1                  ;IF SPLIT START, EDGES MOVE AT 2X\r
+       ROL R2                  ;SPEED X2\r
+       .ENDC\r
+18$:   LDA ZX,ZXAXLL           ;UPDATE X AXIS POSITION LEFT SIDE\r
+       SEC\r
+       SBC Z,R1\r
+       STA ZX,ZXAXLL\r
+       LDA ZX,ZXAXLH\r
+       SBC Z,R2\r
+       STA ZX,ZXAXLH           ;ZXAXLH(X)=ZXAXLH(X)-PYAVK\r
+;ZCNTRL(X-1)[1:0]:=ZCNTRL(X-1)[1:0]+(PYAVKH[7]*3)\r
+       LDA I,0FC               ;-3 (ONES-COMP)\r
+       BIT R2                  ;CHECK PYAVKH[7]\r
+       BMI 21$                 ;IF -, SUBTRACT 3\r
+       LDA I,0FF               ;ELSE    "      0\r
+21$:   ADC ZX,ZCNTRL           ;FROM ZCNTRL\r
+       EOR ZX,ZCNTRL           ;PRE-DISTORT\r
+       AND I,3                 ;CLEAR UPPER\r
+       EOR ZX,ZCNTRL           ;RE-INSERT UPPER, CORRECT LOWER\r
+       STA ZX,ZCNTRL           ;UPDATE THE MSB'S OF X POSN.(D0,D1 OF ZCNTRL-1)\r
+\r
+       CLC\r
+       LDA Z,STCL              ;ADD IN STEERING CONSTANTS LEFT SIDE\r
+       ADC ZX,ZXAXLL\r
+       STA ZX,ZXAXLL\r
+       LDA Z,STCH\r
+       ADC ZX,ZXAXLH\r
+       STA ZX,ZXAXLH\r
+       LDA I,3                 ;OVERFLWO TO TOP '2' BITS\r
+       BIT STCH\r
+       BMI 23$\r
+       LDA I,0\r
+23$:   ADC ZX,ZCNTRL                   ;UPDATE BITS 16 & 17\r
+       EOR ZX,ZCNTRL\r
+       AND I,3\r
+       EOR ZX,ZCNTRL\r
+       STA ZX,ZCNTRL\r
+CRLOK: LDA ZX,ZCNTRL\r
+       BIT A,M08               ;START OF SPLIT OR OLD SPLIT SECTION ?\r
+;\r
+;ABOVE SHOULD BE 'BIT A,M04'\r
+;IF INSIDE WALL IS TO MOVE ON SPLITS\r
+       BNE 22$                 ;IF YES, RIGHT EDGE DOES NOT MOVE\r
+       LDA ZX,ZXAXRL           ;GET X POSITION RIGHT SIDE\r
+       CLC\r
+       ADC Z,PYAVKL            ;UPDATE X POSITION RIGHT SIDE\r
+       STA ZX,ZXAXRL\r
+       LDA ZX,ZXAXRH\r
+       ADC Z,PYAVKH\r
+       STA ZX,ZXAXRH\r
+       LDA I,3\r
+       BIT PYAVKH\r
+       BMI 21$\r
+       LDA I,0\r
+21$:   ADC ZX,ZCNTRR\r
+       EOR ZX,ZCNTRR\r
+       AND I,3\r
+       EOR ZX,ZCNTRR\r
+       STA ZX,ZCNTRR\r
+22$:   LDA Z,STCL              ;ADD IN STEERING CONSTANTS\r
+       ADC ZX,ZXAXRL\r
+       STA ZX,ZXAXRL\r
+       LDA Z,STCH\r
+       ADC ZX,ZXAXRH\r
+       STA ZX,ZXAXRH\r
+       LDA I,3\r
+       BIT STCH\r
+       BMI 23$\r
+       LDA I,0\r
+23$:   ADC ZX,ZCNTRR           ;TAKE CARE OF BITS 16 & 17\r
+       EOR ZX,ZCNTRR\r
+       AND I,3\r
+       EOR ZX,ZCNTRR\r
+       STA ZX,ZCNTRR\r
+CRROK:\r
+       .PAGE\r
+       .IF NE,SPLITS\r
+;\r
+;IF SPLIT SECTION, MOVE SPLIT SIDE SAME AS REGULAR SIDE\r
+;\r
+       .SBTTL  SPLIT SECTION MOVE\r
+       LDA ZX,ZCNTRL           ;SPLIT SECTION?\r
+       BIT A,M08                       ;SPLIT OR OLD SPLIT SECTION?\r
+       BNE SPLT\r
+       JMP YMOV\r
+SPLT:\r
+       .IF NE,0\r
+;THIS SECTION IF INSIDE WALL OF SPLIT (RIGHT SIDE) TO MOVE\r
+       LDA I,4                 ;START SPLIT?\r
+       BIT R3                  ;STATUS IN R3\r
+       BNE 22$                 ;SKIP IF TRUE\r
+       LDA PYAVKL              ;RESTORE R1 & R2 TO NORMAL SPEED ...\r
+       STA R1                  ;... FOR USE ON RIGHT EDGE BELOW\r
+       LDA PYAVKH\r
+       STA R2\r
+       LDA X,SXAXLL            ;MOVE LEFT EDGE AS NORMAL\r
+       SEC\r
+       SBC PYAVKL              ;SPEED\r
+       STA X,SXAXLL\r
+       LDA X,SXAXLH            ;DO 'MIDDLE' 8 BITS\r
+       SBC PYAVKH\r
+       STA X,SXAXLH\r
+       LDA I,0FC               ;-3 (1'S COMP) INCASE OF UNDER-FLOW\r
+       BIT PYAVKH              ;UNDER FLOW?\r
+       BMI 21$                 ;YES ...\r
+       LDA I,0FF               ;ELSE SUBTRACT 0 (THERE IS THE CARRY!!!)\r
+21$:   ADC X,OVERL             ;BIT REPLACE TOP 2 BITS INTO BYTE\r
+       EOR X,OVERL             ;(ONE OF MIKE A.'S TRICKS)\r
+       AND I,3\r
+       EOR X,OVERL\r
+       .ENDC\r
+22$:   LDA Z,STCL              ;STEERING CONSTANTS, LEFT SIDE\r
+       ADC ZX,SXAXLL\r
+       STA ZX,SXAXLL\r
+       LDA Z,STCH\r
+       ADC ZX,SXAXLH\r
+       STA ZX,SXAXLH\r
+       LDA I,3                 ;CHECK TOP 3 BITS\r
+       BIT STCH\r
+       BMI 23$\r
+       LDA I,0\r
+23$:   ADC ZX,OVERL\r
+       EOR ZX,OVERL\r
+       AND I,3\r
+       EOR ZX,OVERL\r
+       STA ZX,OVERL\r
+SXLOK:                         ;DO SAME WITH RIGHT SIDE\r
+10$:   LDA ZX,SXAXRL\r
+       CLC\r
+       ADC Z,R1                ;USE R1 & R2\r
+       STA ZX,SXAXRL\r
+       LDA ZX,SXAXRH\r
+       ADC Z,R2                ;RECALL R1 & R2 ARE EITHER NORMAL OR X2\r
+       STA ZX,SXAXRH\r
+       LDA I,3\r
+       BIT R2\r
+       BMI 21$\r
+       LDA I,0\r
+21$:   ADC ZX,OVERR\r
+       EOR ZX,OVERR\r
+       AND I,3\r
+       EOR ZX,OVERR\r
+       STA ZX,OVERR\r
+       LDA Z,STCL              ;STEERING\r
+       ADC ZX,SXAXRL\r
+       STA ZX,SXAXRL\r
+       LDA Z,STCH\r
+       ADC ZX,SXAXRH\r
+       STA ZX,SXAXRH\r
+       LDA I,3                 ;TAKE CARE OF TOP 2 BITS\r
+       BIT STCH\r
+       BMI 23$\r
+       LDA I,0\r
+23$:   ADC ZX,OVERR\r
+       EOR ZX,OVERR\r
+       AND I,3\r
+       EOR ZX,OVERR\r
+       STA ZX,OVERR\r
+       .ENDC\r
+;\r
+                               ;WOULD CHECK CRASH HERE\r
+YMOV:\r
+;\r
+;NOW MOVE IN Y DIRECTION\r
+;\r
+10$:   LDA ZX,ZYAXL            ;UPDATE Y POSITION\r
+       CLC\r
+       ADC Z,PYAVL\r
+       STA ZX,ZYAXL            ;ZYAX(X):=PYAV+ZYAX(X)\r
+       LDA ZX,ZYAXH\r
+       ADC Z,PYAVH\r
+       BCS 20$\r
+       STA X,ZYAXH\r
+       CMP I,BOTTOM            ;AT BOTTOM OF SCREEN?\r
+       BCC YPOK\r
+       .PAGE\r
+       .SBTTL  COLLISION ACTION\r
+       .GLOBL CENTER\r
+20$:   JSR CENTER\r
+       LDA R0\r
+       CMP I,CRRHT             ;SEE IF CENTER IS TOO FAR OFF SIDE\r
+       BCS 25$                 ;YES\r
+       CMP I,CRLFT             ;OTHER SIDE\r
+       BCS DEACT\r
+25$:   BIT Z,STATE             ;ATTRACT MODE?\r
+       BMI DEACT               ;YES. IGNORE CRASH\r
+       JSR SLOWDN\r
+       LDA STATE\r
+       ORA I,2                 ;SET WALL COLLISION FLAG\r
+       STA STATE\r
+DEACT: LDA I,0                 ;CLEAR OBJECT CONTROL\r
+       STA ZX,ZCNTRL\r
+       STA ZX,ZCNTRR\r
+       TXA\r
+       PHA                     ;SAVE IX\r
+       LDA X,COLUR             ;GET COLOR OF OBJECT REMOVED\r
+       TAX\r
+       LDA X,COLARY+SQUARC     ;GET SHADE/COLOR VALUE\r
+       STA LSTCOL              ;PUT IT AWAY FOR LATER\r
+       STA COLARY+BKLCOL       ;SET TO BACKROUND SHADE/COLOR\r
+       PLA\r
+       TAX                     ;RESTORE IX\r
+;NO HARM IN JUST FALLING THUR, I WAS GOING TO YP ANYWAY\r
+YPOK:  LDA ZX,ZCNTRL\r
+       AND I,0BF               ;DROP CRASH BIT\r
+       STA ZX,ZCNTRL\r
+       LDA ZX,ZCNTRR\r
+       AND I,0BF               ;DROP CRASH BIT\r
+       STA ZX,ZCNTRR\r
+\r
+                               ;NEXT OBJECT\r
+YP:    JMP DOBJ                ;CONTINUE\r
+       .PAGE\r
+       .SBTTL FIND NEXT POSSIBLE SECTION FOR OUTPUT\r
+;CONVERTS NIGHT-DRIVE PYLONS TO SQUARES ON DAVE'S HARDWARE\r
+;\r
+;FIND THE LARGEST SECTION NOT YET OUTPUT & DO IT\r
+;      LIM:=255.\r
+;      FOR J=7 TO 0 DO\r
+;          BEGIN:  MAX:=0\r
+;                 I:=-1\r
+;                 FOR X=7 TO 0 DO\r
+;                    BEGIN:  IF Y(X)<LIM.AND.Y(X)>MAX\r
+;                        THEN MAX:=Y(X)\r
+;                            I:=X\r
+;                        END\r
+;                 IF I<>-1 THEN LIM=MAX\r
+;                            MAKESQ(X)\r
+;                 END\r
+;\r
+SECTIONS:\r
+       LDX I,20\r
+       LDA I,0\r
+5$:    STA X,HPOST\r
+       DEX\r\r
+       BPL 5$\r
+       LDX LSTCOL              ;REFRESH BACKROUND\r
+       LDA I,BKLCOL            ;BACKGROUND COLOR INDEX\r
+       STA LASTC               ;INIT BOTTOM LINE\r
+       LDA I,255.\r
+       STA R0                  ;R0=LIM\r
+       STA RLIMIT              ;SET OUTPUT LIMITS\r
+       STA BLIMIT\r
+       LDA I,NOOBJTS-1         ;7 SQUARES MAX\r
+       STA R1                  ;R1=J\r
+       LDY I,0\r
+       STY LLIMIT              ;SET OUTPUT LIMITS\r
+       STY TLIMIT\r
+10$:   LDY I,0\r
+       STY R2                  ;R2=MAX\r
+       DEY                     ;MAKE A "-1"\r
+       STY R5                  ;R5=I\r
+       LDX I,NOOBJTS-1         ;7 POSSIBLE ACTIVE OBJECTS\r
+20$:   LDA ZX,ZYAXH\r
+       CMP R0                  ;Y(X)<LIM\r
+       BCS 25$                 ;NO, SKIP\r
+       CMP R2                  ;Y(X)>MAX\r
+       BCC 25$                 ;NO, SKIP\r
+       STA R2                  ;MAX:=Y(X)\r
+       STX R5                  ;I:=X\r
+25$:   DEX                     ;NEXT\r
+       BPL 20$                 ;\r
+\r
+       LDX R5\r
+       BMI 30$\r
+       LDA R2                  ;LIM=MAX\r
+       STA R0\r
+       LDA ZX,ZCNTRL           ;OBJECT ACTIVE?\r
+       BPL 28$\r
+       JSR NMSQT               ;MAKE A SQUARE\r
+28$:   DEC R1\r
+       BPL 10$\r
+30$:   RTS\r
+\r
+       .PAGE\r
+       .SBTTL  MAKE A SQUARE\r
+;\r
+;CONVERTS NIGHT DRIVER PYLONS TO 2 BOUNDARY LINES\r
+;AND MAKE A SQUARE\r
+;RIGHT AND LEFT REFER TO MIRROR IMAGES ONLY\r
+NMEXIT:        RTS\r
+NMSQT: LDY INDEX               ;OUTPUT POINTER\r
+       LDA X,ZCNTRR            ;BOTH EDGES OFF?\r
+       AND X,ZCNTRL\r
+       AND I,3\r
+       BNE NMEXIT              ;IF YES, SKIP\r
+       LDA X,ZXAXRL\r
+       CMP Z,ZXAXLL            ;SET CARRY FOR SUBTRACT\r
+       LDA X,ZXAXRH\r
+       SBC X,ZXAXLH            ;GET SIZE\r
+       STA R3                  ;SAVE SIZE (HALF SIZE)\r
+       BEQ NMEXIT              ;IF 0 SIZE, SKIP IT\r
+       BCC 5$                  ;NOT LARGER THAT 100 SO SIZE IS 'CORRECT'\r
+       LDA X,ZCNTRR\r
+       ORA X,ZCNTRL            ;OFF SIDE SET\r
+       AND I,3\r
+       BEQ 5$                  ;NO\r
+       LDA I,0FF               ;IF SIZE IS > 100 SET TO MAX (FF)\r
+       STA R3\r
+5$:    LDA X,ZCNTRR            ;IS RIGHT SIDE OFF SCREEN\r
+       AND I,03\r
+       BNE 10$                 ;IF YES, SET AT RIGHT BOUNDARY\r
+       LDA X,ZXAXRH            ;RIGHT BOUNDARY\r
+       CMP RLIMIT              ;OUTSIDE LIMIT?\r
+       BCC 20$                 ;IF NO, USE RIGHT POSITION\r
+10$:   LDA RLIMIT\r
+20$:   STA RLIMIT              ;SET TO RIGHT LIMIT\r
+       CMP LLIMIT              ;IF RIGHT PAST LEFT LIMIT, SKIP\r
+       BCC NMEXIT\r
+       STA Y,VSTR              ;TOP LINE VSTART\r
+       STA Y,VSTR+1            ;BOTTOM LINE VSTART\r
+       LDA X,ZCNTRL            ;LEFT EDGE OFF SCREEN?\r
+       AND I,3\r
+       BNE 30$                 ;IF YES, SET AT LIMIT\r
+       LDA X,ZXAXLH\r
+       CMP LLIMIT              ;OUTSIDE LIMIT\r
+       BCS 40$\r
+30$:   LDA LLIMIT              ;GET LIMIT\r
+40$:   STA LLIMIT              ;RESTORE LIMIT\r
+       CMP RLIMIT              ;IS LEFT PAST RIGHT?\r
+       BCS NMEXIT              ;IF YES, SKIP THIS LINE\r
+       STA Y,VSTOP\r
+       STA Y,VSTOP+1           ;SET STOP BOUNDARIES\r
+       LDA R3                  ;SIZE\r
+       LSR                     ;HALF\r
+       CLC                     ;ADD TO POSITION.....\r
+       ADC X,UPDNH             ;UP/DOWN\r
+       BCS 41$                 ;DID WE WRAP OFF EDGE?\r
+       CMP BLIMIT              ;PAST BOTTOM EDGE?\r
+       BCC 50$                 ;OR AS IS\r
+41$:   DEC BLIMIT              ;CORRECT SO NO OVERLAPPING LINES\r
+       LDA BLIMIT\r
+50$:   STA BLIMIT              ;SET LIMIT\r
+       CMP TLIMIT              ;BOTTOM PAST TOP?\r
+       BCC REMOV\r
+       STA Y,HPOST             ;SET BOTTOM LINE\r
+       SEC\r
+       SBC R3                  ;'ADD' SIZE OF SQUARE\r
+       BCC 60$                 ;IF OVERFLOW, SET TO LIMIT\r
+       CMP TLIMIT              ;PAST TOP ?\r
+       BCS 70$                 ;IF NO, USE #\r
+60$:   INC TLIMIT              ;CORRECT SO NO OVERLAPPING LINES\r
+       LDA TLIMIT\r
+70$:   STA TLIMIT              ;NEW LIMIT\r
+       CMP BLIMIT              ;TOP PAST BOTTOM\r
+       BCS REMOV\r
+       STA Y,HPOST+1\r
+       LDA LASTC               ;COLOR OF LAST SQUARE OUT (INDEX)\r
+       STA Y,ECOLOR\r
+       LDA X,COLUR             ;COLOR OF TOP LINE (HPOST)\r
+       CLC\r
+       ADC I,SQUARC            ;POINT TO TOP 8 IN COLOR RAM\r
+       STA Y,ECOLOR+1          ;SET COLOR INTO OUTPUT BUFFER\r
+       STA LASTC               ;COLOR FOR BOTTOM OF NEXT SQUARE\r
+       INY\r
+       INY\r
+       STY INDEX\r
+       RTS\r
+;SET SQUARE TO 0 IF ITS REALLY OFF SCREEN\r
+REMOV: LDA I,0\r
+       STA Y,HPOST\r
+       STA Y,HPOST+1\r
+       RTS\r
+       .IF NE,SPLITS\r
+;\r
+;RIGHT SPLIT TAKEN SO MOVE ALL INFO DOWN TO BOTTOM\r
+;\r
+RCORR: LDX I,NOOBJTS-1\r
+10$:   LDA X,ZCNTRL\r
+       BPL 20$\r
+       LDA X,OVERL\r
+       ORA I,80                        ;SET ACTIVE BIT\r
+       STA X,ZCNTRL\r
+       LDA X,OVERR\r
+       STA X,ZCNTRR\r
+       LDA X,SXAXLL\r
+       STA X,ZXAXLL\r
+       LDA X,SXAXLH\r
+       STA X,ZXAXLH\r
+       LDA X,SXAXRL\r
+       STA X,ZXAXRL\r
+       LDA X,SXAXRH\r
+       STA X,ZXAXRH\r
+20$:   DEX\r
+       BPL 10$\r
+       RTS\r
+       .ENDC\r
+       .PAGE\r
+       .SBTTL MOVE ORIGINS\r
+OBJDNE:        STA WTCHDG\r
+       LDA ORH\r
+       CMP I,LLMT\r
+       BCS 4$\r
+3$:    LDA I,0\r
+       STA CRVL\r
+       STA CRVH\r
+       BEQ 5$                  ;ALWAYS\r
+4$:    CMP I,RLMT\r
+       BCS 3$\r
+5$:    CLC\r
+       LDA Z,STCL\r
+       ADC Z,CRVL              ;MOVE ORIGIN BY COMPUTING\r
+       STA Z,PRODL             ;STC+CRV\r
+       LDA Z,STCH\r
+       ADC Z,CRVH\r
+       STA Z,PRODH\r
+       CLC\r
+       LDA Z,ORL               ;ADD TO OLD ORIGIN POSITION\r
+       ADC Z,PRODL\r
+       STA Z,ORL\r
+       LDA Z,ORH\r
+       ADC Z,PRODH\r
+       STA Z,ORH\r
+10$:   LDA I,3\r
+       BIT Z,PRODH\r
+       BMI 11$\r
+       LDA I,0\r
+11$:   ADC Z,ORVH\r
+12$:   AND I,3\r
+       STA Z,ORVH\r
+;NOW MOVE UP/DOWN ORGIN\r
+13$:   CLC\r
+       LDA VSTCL               ;MOVE UP/DOWN ORGIN\r
+       ADC VRVL                ;VSTC+VRV\r
+       STA R0\r
+       LDA VSTCH\r
+       ADC VRVH\r
+       STA R1\r
+       CLC\r
+       LDA VCENT               ;ADD IN OLD V ORIGIN\r
+       ADC R0\r
+       STA VCENT\r
+       LDA VCENT+1\r
+       ADC R1\r
+       CMP I,UPLMT             ;MOVED TO HIGH OR LOW?\r
+       BCS STPOM               ;IF CS, YES .. SO DONT STORE NEW VALUE\r
+       CMP I,DNLMT\r
+       BCC STPOM               ;IF CC, AGAIN PAST A LIMIT SO DONT STORE\r
+       STA VCENT+1\r
+STPOM:\r
+50$:   LDA Z,VELH\r
+       LSR\r
+       STA Z,PRODH\r
+       LDA Z,VELL              ;DIVIDE VELOCITY BY 8\r
+       ROR\r
+       LSR Z,PRODH\r
+       ROR\r
+       LSR Z,PRODH\r
+       ROR\r
+       STA Z,PRODL\r
+       CLC\r
+       ADC Z,TURNL             ;ADD TO TURN TIME\r
+       STA Z,TURNL\r
+       LDA Z,TURNH\r
+       ADC Z,PRODH\r
+       STA Z,TURNH\r
+       CMP Z,DIST              ;TURN OVER?\r
+       BCC CNTRN               ;YES,GET NEW INFO\r
+       LDA I,0\r
+       STA Z,TURNL\r
+       STA Z,TURNH             ;ELSE ZERO TURN-TIME\r
+       BIT STATE\r
+       BMI CNTRN               ;NO TURN IN ATTRACT\r
+       LDY I,0                 ;PT TO NEXT CS\r
+       LDA NY,TRKADL\r
+       CMP I,80\r
+       BNE 15$\r
+       LDA SKILL               ;GET SKILL LEVEL\r
+       ASL\r
+       TAX\r
+       LDA AX,TKADT\r
+       STA TRKADL\r
+       LDA AX,TKADT+1\r
+       STA TRKADH\r
+15$:   LDA NY,TRKADL           ;GET CS\r
+       STA Z,R0                ;SAVE FOR NOW\r
+       INY\r
+       LDA NY,TRKADL           ;GET DIST & CONTROL BITS\r
+       STA R1\r
+       AND I,3F\r
+       ASL                     ;USE 2 TIMES DISTANCE\r
+       STA Z,DIST\r
+       STA VDIST               ;SET BOTH DISTANCES\r
+       BIT R1\r
+       .IF NE,SPLITS\r
+       BMI 30$                 ;SPLIT TIME\r
+       .ENDC\r
+       BVS 35$                 ;UP, DOWN\r
+14$:   LDA R0                  ;NORMAL CURVE\r
+       STA CS\r
+       .IF EQ,SPLITS\r
+       BIT R1                  ;BOTH UP/DOWN AND TURN?\r
+       BMI 35$                 ;YES\r
+       .ENDC\r
+       LDA I,0\r
+       STA VCS                 ;SET UP/DOWN 0\r
+       BEQ 40$                 ;DONE\r
+35$:   LDA R0\r
+       STA VCS                 ;SET UP/DOWN CURVE\r
+       .IF EQ,SPLITS\r
+       BIT R1\r
+       BMI 40$                 ;AS ABOVE BOTH UP/DOWN & TURN\r
+       .ENDC\r
+                               ;SET WALL COLLISION FLAG\r
+       LDA I,0\r
+       STA CS                  ;LEFT/RIGHT TO 0\r
+       BEQ 40$\r
+       .IF NE,SPLITS\r
+30$:   LDA I,08\r
+       STA SPCONT              ;8 SECTION SPLIT\r
+       BNE 14$                 ;CONTINUE AS NORMAL TURN\r
+       .ENDC\r
+40$:   TYA                     ;ACC=1\r
+       SEC\r
+       ADC TRKADL              ;TRKADL+2\r
+       STA TRKADL\r
+       BCC CNTRN\r
+       INC TRKADH\r
+CNTRN:\r
+;NOW COMPUTE V TURN INFO\r
+       CLC\r
+       LDA PRODL               ;LSB OF VELOCITY /8\r
+       ADC VCRNL\r
+       STA VCRNL               ;ADD TO TURN TIME\r
+       LDA VCRNH               ;PROPAGATE INTO MSB\r
+       ADC PRODH\r
+       STA VCRNH\r
+       CMP VDIST               ;UP/DOWN TURN OVER?\r
+       BCC 20$                 ;NO SO CONTINUE TURN\r
+       LDA I,0\r
+       STA VCRNL               ;ELSE ZERO TURN-TIME\r
+       STA VCRNH\r
+20$:\r
+       LDA Z,PRODL             ;TRACK DISTANCE COVERED\r
+       CLC                     ;  DETERMINES WHEN NEW OBJECT MUST\r
+       ADC Z,OBJTML            ;  BE PLACED AT ORIGIN\r
+       STA Z,OBJTML\r
+       LDA Z,PRODH\r
+       ADC Z,OBJTMH\r
+       STA Z,OBJTMH\r
+       CMP NOT         ;NEW OBJECT TIME?\r
+       BCC FI0                 ;NO\r
+       LDA I,0D                ;RESET WAIT TIME\r
+       STA NOT\r
+;      JMP NEWOBJ              ;(FALL THRU)\r
+       .PAGE\r
+       .SBTTL  START NEW OBJECT\r
+\r
+;NEED A NEW OBJECT, SCAN FOR FREE SLOT\r
+\r
+NEWOBJ:        LDA SMOK2               ;COLLISION IN PROCESS?\r
+       BNE FI0                 ;IF YES, DON'T START\r
+       LDX I,NOOBJTS-1         ;7 OBJECTS POSSIBLE\r
+30$:   LDA ZX,ZCNTRL           ;OBJECT ACTIVE?\r
+       BPL FIOBJ               ;NO\r
+       DEX\r
+       BPL 30$\r
+FI0:   RTS                     ;ALL OBJECTS ACTIVE\r
+FIOBJ: STX R0                  ;SAVE X JUST IN CASE!\r
+;\r
+;SPLIT START LOGIC (HA,HA!!!)\r
+;\r
+       LDA I,80                ;GUESS NORMAL TUBE\r
+       .IF NE,SPLITS\r
+       LDY SPCONT              ;IS IT NORMAL?\r
+       BEQ 9$                  ;YES, CONTINUE\r
+       CPY I,6                 ;WHERE IN SPLIT SEQUENCE\r
+       BNE 8$\r
+       JMP NXTCNT              ;IF 6 IN COUNT, SKIP START SEQUENCE\r
+8$:    BCS 9$                  ;IF G.T. 6, NOT YET 'TIME' TO SPLIT\r
+       ORA I,8                 ;SET SPLIT FLAG\r
+       CPY I,5                 ;5 IS FIRST SPLIT SECTION\r
+       BNE 9$                  ;NOT FIRST\r
+       ORA I,4                 ;SET FIRST SECTION FLAG\r
+       .ENDC\r
+9$:    ORA Z,ORVH              ;WITH 2 MSB = ORVH\r
+       STA ZX,ZCNTRL\r
+;CHANGE COLOR/SHADE D7-D4 D3-D0=COLOR. STORED INTO COLARY\r
+       INC NXTPTR              ;NEXT COLOR\r
+       LDA NXTPTR\r
+       AND I,07\r
+       CMP I,7\r
+       BNE 50$\r
+       LDA I,0\r
+50$:   STA NXTPTR\r
+       LDA NXTCLR              ;GET CURRENT COLOR\r
+       LDY DIR                 ;GET DIRECTION CHANGE REG FOR 'COLCHG'\r
+       JSR COLCHG              ;GET NEXT COLOR/INTENSITY\r
+       STY DIR                 ;RESTORE DIR CHANGE REG\r
+       STA NXTCLR\r
+       AND I,0F\r
+       CMP I,7\r
+       BNE 51$\r
+       INC NXTCLR\r
+51$:   CMP I,0F\r
+       BNE CLRS\r
+       LDA R1                  ;R1 HAS COLOR FROM ROUTINE 'COLCHG'\r
+       AND I,0F0               ;LEAVE SHADE AND 0 COLOR (WHITE)\r
+       STA NXTCLR              ;RESTORE\r
+CLRS:  LDA I,0\r
+       .IF NE,SPLITS\r
+       STA ZX,SXAXRL\r
+       STA ZX,SXAXLL\r
+       .ENDC\r
+       STA ZX,ZXAXLL\r
+       STA ZX,ZXAXRL\r
+       STA X,ZCNTRR            ;CLEAR ANY OVERFLOW\r
+       .IF NE,SPLITS\r
+       STA X,OVERR\r
+       STA X,OVERL             ;CLEAR ANY OVERFLOW\r
+       LDA ZX,ZCNTRL\r
+       LDX SMALL               ;POINT TO LAST OUTPUT CIRCLE\r
+       BIT A,M08               ;SPLIT?\r
+       BEQ 10$                 ;NO\r
+       BIT A,M04               ;FIRST SPLIT?\r
+       BEQ 25$                 ;NO-REGULAR SPLIT\r
+;SPLIT STARTS-SET BOTH SIDES TO END OF TUBE\r
+       LDA X,ZXAXRH            ;X POINTS TO LAST ELLIPSE OUTPUT\r
+       LDX R0                  ;RESTORE OLD X\r
+       STA X,SXAXLH            ;SET RIGHT SIDE OF SPLIT\r
+       STA X,SXAXRH\r
+       BNE 30$                 ;REST IS BELOW (*ALWAYS*)\r
+10$:\r
+;NOT A SPLIT SECTION--CHECK ACTION\r
+       LDA WHICH               ;DID SPLIT PORTION JUST END?\r
+       BEQ 20$                 ;NO, THIS IS A REGULAR TUBE\r
+       BPL 12$                 ;YES, & + MEANS RIGHT SIDE ENTERED\r
+       LDA X,ZXAXLH            ;MUST HAVE ENTERED LEFT SIDE\r
+       STA ORH                 ;SET ORGIN TO END OF TUBE\r
+       LDA X,ZXAXLL\r
+       STA ORL\r
+       LDX I,NOOBJTS-1         ;AND REMOVE RIGHT SPLIT SIDE\r
+11$:   LDA X,ZCNTRL\r
+       AND I,83                ;TURN OFF ALL BUT ACTIVE & POSITION BITS\r
+       STA X,ZCNTRL\r
+       DEX\r
+       BPL 11$\r
+       BMI 13$                 ;**ALWAYS\r
+12$:   LDA X,SXAXRH            ;SET ORGIN TO END OF TUBE (RIGHT SIDE)\r
+       STA ORH\r
+       LDA X,SXAXRL\r
+       STA ORL\r
+       JSR RCORR               ;MOVE ALL ACTIVE PIECES BACK TO LOWER RAM\r
+13$:   LDA I,0\r
+       STA WHICH               ;RESET SPLIT INDICATOR\r
+       .ENDC\r
+20$:   LDX R0                  ;RECALL X POINTING TO NEW TUBE SECTION\r
+       LDA ORL\r
+       STA X,ZXAXLL            ;SET TUBLE\r
+       STA X,ZXAXRL\r
+       LDA ORH\r
+       .IF NE,SPLITS\r
+       BNE 30$                 ;REST IS DOWN BELOW\r
+25$:   \r
+;CONTINUING SPLIT TUBE - NEW SECTION NEEDED-BOTH SIDES\r
+       LDA X,ZXAXLH    \r
+       SEC                     ;LEFT SPLIT SECTON STARTS 8 OVER FROM LAST\r
+       SBC I,8\r
+       PHA                     ;SAVE IT\r
+       LDA X,SXAXRH\r
+       CLC\r
+       ADC I,8                 ;RIGHT SPLIT SECTION STARTS 8 OVER FROM LAST\r
+       LDX R0                  ;RESTORE OLD X POINTING TO AVAIBLE SPACE\r
+       STA X,SXAXLH\r
+       STA X,SXAXRH            ;START RIGHT HALF\r
+       PLA\r
+       .ENDC\r
+30$:   STA X,ZXAXLH            ;START LEFT (OR NORMAL)SECTION\r
+       STA X,ZXAXRH\r
+       STX SMALL               ;SAVE THIS AS LAST STARTED SQUARE\r
+       LDA NXTPTR              ;STORE COLOR IX\r
+       STA ZX,COLUR\r
+NXTCNT:\r
+       .IF NE,SPLITS\r
+       LDA SPCONT\r
+       BEQ 37$\r
+       DEC SPCONT\r
+       BNE 37$\r
+;SET ORGIN AT SPLIT END CLOSEST TO CENTER\r
+       SEC\r
+       LDA X,ZXAXRH            ;DETERMIN CLOSEST TO MIDDLE\r
+       SBC I,ORGIN             ;LEFT SPLIT\r
+       BCS 10$                 ;NEGATIVE?\r
+       EOR I,0FF\r
+       ADC I,1                 ;GET A POSITIVE #\r
+10$:   STA R3                  ;HOLD DISTANCE FOR COMPARE\r
+12$:   SEC\r
+       LDA X,SXAXLH            ;NOW RIGHT SPLIT\r
+       SBC I,ORGIN\r
+       BCS 20$\r
+       EOR I,0FF               ;NEGATE\r
+       ADC I,1\r
+20$:   CMP R3                  ;WHICH IS GREATER?\r
+       BCS 25$                 ;IF NO CARRY LEFT IS CLOSER\r
+       LDA I,10\r
+       STA CS                  ;OUT OF SPLIT INTO A CURVE\r
+       BNE 36$                 ;ALWAYS *****\r
+25$:   LDA I,90                ;OUT OF SPLIT INTO A CURVE\r
+       STA CS\r
+36$:   STA WHICH               ;+=RIGHT SPLIT,-=LEFT SPLIT\r
+       LDA I,0\r
+       STA TURNL\r
+       STA TURNH               ;RESET TURN DISTANCE\r
+       LDA I,10                ;LONGER WAIT UNTIL NEXT CIRCLE\r
+       STA NOT\r
+       .ENDC\r
+37$:   LDA I,PYMIN\r
+       STA ZX,ZYAXH            ;INITIALIZE YAXIS ORIGIN\r
+       LDA I,0\r
+       STA ZX,ZYAXL\r
+       STA Z,OBJTMH            ;CLEAR NEW OBJECT TIME COUNTER\r
+       STA Z,OBJTML\r
+       LDA VCENT+1\r
+       STA ZX,UPDNH\r
+45$:   LDX NXTPTR\r
+       LDA NXTCLR\r
+       STA X,COLARY+SQUARC     ;STORE AWAY COLOR\r
+       LDX R0                  ;RESTORE COLOR\r
+       RTS\r
+       .PAGE\r
+       .SBTTL MATH ROUTINES\r
+       .SBTTL  MULTIPLY\r
+;MULTIPLICATION ROUTINE\r
+;(MEM(Y),MEM(Y+1))=(MEM(X),MEM(X+1))*(A)\r
+;ACCUM = MULTIPLIER (I.FFFFFFF)\r
+;Y = ADDRESS OF PRODUCT (LOW BYTE)\r
+;X = ADDRESS OF MULTIPLICAND (LOW BYTE)\r
+\r
+MULT:  STA Z,MLTPLR            ;SAVE MULTIPLIER\r
+       LDA I,0\r
+       STA AY,0                ;CLEAR PRODUCT\r
+       STA AY,1\r
+MULTS: LDA ZX,0                ;GET MULTIPLICAND\r
+       STA Z,MLTCDL\r
+       LDA ZX,1\r
+       STA Z,MLTCDH\r
+1$:    ASL Z,MLTPLR            ;LOOP UNTIL MLTPLR=0\r
+       BCS 2$\r
+       BNE 3$                  ;AND CARRY CLEAR\r
+       RTS\r
+2$:    CLC\r
+       LDA AY,0                ;ACCUMULATE PRODUCT\r
+       ADC Z,MLTCDL\r
+       STA AY,0\r
+       LDA AY,1\r
+       ADC Z,MLTCDH\r
+       STA AY,1\r
+3$:    LDA Z,MLTCDH\r
+       CMP I,80                ;SET C IF MINUS\r
+       ROR Z,MLTCDH            ;HALVE MULTIPLICAND\r
+       ROR Z,MLTCDL\r
+       JMP 1$\r
+       .SBTTL  NEGATE\r
+NEG:   LDA AY,0                ;NEGATE DOUBLE BYTE AT ADDRESS\r
+       EOR I,0FF               ;SPECIFIED IN Y REGISTER\r
+       CLC\r
+       ADC I,1\r
+       STA AY,0\r
+       LDA AY,1\r
+       EOR I,0FF\r
+       ADC I,0\r
+       STA AY,1\r
+       RTS\r
+\r
+       .SBTTL  DIVIDE ROUTINE\r
+;ALT ALL PURPOS DIVIDE ROUTINE\r
+;DIVIDE A BY Y -> 16 BITS\r
+;QUOTIENT RETURNED IN A (OR IN 'QUOT') & Y (OR QUOT+1)\r
+;\r
+;\r
+;BLITZES A & Y  (NOT X)\r
+;\r
+;PAGE 0: TEMP1,QUOT\r
+;\r
+;NO STACK\r
+;\r
+RDIVIDE:                       ;ENTRY FOR DIVIDE AS DESCRIBED ABOVE\r
+       STA Z,QUOT+1\r
+       STY Z,R6\r
+       LDA I,0\r
+       STA QUOT\r
+       LDY I,15.               ;15 BITS OF DIVIDE\r
+DLOP:  ROL Z,QUOT              ;SHIFT IN QUOTIENT\r
+       ROL QUOT+1              ;SHIFT OUT DIVIDEND\r
+       ROL\r
+       BCS 2$                  ;ON OVERFLOW, FORCE SUBTRACT\r
+       CMP Z,R6                ;TRIAL SUBTRACT\r
+       BCC 1$                  ;NOT YET\r
+       SBC Z,R6                ;NO NEED TO PRESET CARRY HERE (DO SUBTRACT)\r
+1$:    DEY\r
+       BPL DLOP                ;LOOP FOR 16 BITS\r
+       ROL Z,QUOT              ;SHIFT IN FINAL QUOT\r
+       LDY Z,QUOT\r
+       LDA QUOT+1\r
+       ROL\r
+       RTS\r
+2$:    SBC Z,R6                ;SPECIAL CASE SUBTRACT\r
+       SEC                     ;PHONY QUOT BIT\r
+       BCS 1$                  ;BRA\r
+       .PAGE\r
+       .SBTTL TARGET ROUTINES\r
+       .SBTTL  START TARGET ROUTINE\r
+;\r
+;THIS ROUTINE DECIDES WHEN & WHERE TO START A TARGET.\r
+;IF THE TARGET IS TO COME FROM DOWN THE TUBE,\r
+;IT WILL BE STARTED AS CLOSE TO AS POSSIBLE THE CENTER, END\r
+;OF THE TUBE.\r
+;IF THE TARGET COMES FROM BEHIND, IT WILL COME EITHER\r
+;OVERHEAD OR UNDERNEATH, DEPENDING ON YOUR UP/DOWN POSITION\r
+;IN THE TUBE.\r
+;WILL START A SHOT FROM BEHIND IF NEEDED\r
+;\r
+;\r
+TSTART:        BIT STATE               ;ATTRACT\r
+       BMI 2$                  ;YES\r
+       LDA SHTBACK             ;JUST HIT SHELL?\r
+       BMI 15$                 ;YES-START SHIP IMMEDIATLY\r
+       LDA FRAMC\r
+       AND I,3\r
+       BEQ 2$\r
+1$:    RTS\r
+2$:    LDA STDELAY\r
+       BEQ 5$                  ;OK TO START\r
+       DEC STDELAY\r
+       BNE 1$\r
+5$:    BIT OVERHD              ;WAS SHOT LAST OUT?\r
+       BVC 10$                 ;NO\r
+       LDA I,0                 ;YES, SO START SHIP\r
+       STA OVERHD              ;CLEAR FLAGS\r
+       BEQ BACKST              ;**ALWAYS**\r
+10$:\r
+       LDA RANDOM              ;START SOMETHING (MAYBE)\r
+       AND I,0F                ;SOME RANDOM START TIME\r
+       BNE BACKOUT\r
+       LDA RANDOM              ;WHAT TO START\r
+       BPL 20$                 ;BEHEIND START (MAYBE)\r
+15$:   LDA I,84                ;FRONT START\r
+       STA OBJST\r
+       LDA VELH                ;START FROM DOWN TUBE\r
+       SEC\r
+       SBC I,2                 ;START IT SLOWER SO IT WILL CLOSE IN\r
+       STA OBSPD\r
+       LDA VCENT+1\r
+       STA OBJV                ;START @ END OF TUBE VERT (CENTER)\r
+       LDA I,PYMIN-20          ;DISTANCE JUST OUT OF SIGHT\r
+       STA DISTANCE\r
+       BNE BACK1               ;**** ALWAYS ******\r
+20$:   BIT RANDOM              ;DO WE WANT TO SHOOT A SHOT PAST FIRST?\r
+       BVC BACKST              ;NOT IF V CLEAR\r
+       LDA I,80                ;SET SHOT FLAG & START A SHOT\r
+       STA OVERHD\r
+       LDA I,RED               ;SHOT IS RED\r
+       STA COLARY+MOTG\r
+;\r
+;START FROM BEHIND (FINALLY)\r
+BACKST:        LDA I,0A0\r
+       STA OBJST\r
+       LDA VELH                ;YOUR SPEED\r
+       CLC\r
+       ADC I,7                 ;BEHIND YOU IS +6 TO MOVE...\r
+       BIT OVERHD              ;SHELL\r
+       BPL 25$\r
+       ADC I,4                 ;IT MOVES FASTER\r
+25$:   STA OBSPD               ;...DOWN THE TUBE\r
+       LDA I,PYMIN+94          ;JUST BEHIND YOU\r
+       STA DISTANCE\r
+       JSR STPOS               ;GET VERT START POSITION\r
+       STA OBJV\r
+BACK1: LDA I,0\r
+       STA OBSPDL              ;LOW BYTE ALWAYS 0\r
+       STA DISDLY              ;DISTANCE HOLD TIME ALWAYS 0\r
+       LDA ORH\r
+       STA OBJH                ;H CENTER OF TUBE FOR OBJECT ALWAYS\r
+       LDA RANDOM\r
+       AND I,80                ;MINUS IS TI-FIGHTER\r
+       STA OBJNUM              ;OBJECT PICTURE NUMBER\r
+BACKOUT:LDA LIFETM             ;HOW LONG ALIVE\r
+       ROL\r
+       ROL\r
+       ROL\r
+       ROL\r
+       AND I,07\r
+       TAX\r
+       CPX I,6                 ;#'S 0-5\r
+       BCC 10$\r
+       DEX\r
+10$:   STX BONMUL\r
+       LDA X,SHPCOL\r
+       STA COLARY+MOTW\r
+       LDA I,RED\r
+       STA COLARY+MOTG\r
+BACK2: LDA I,0\r
+       STA SHTBACK\r
+       RTS\r
+;\r
+;SUBROUTINE TO DETERMIN START POSITION OF SHIP AND SHELLS FROM BEHIND\r
+;\r
+STPOS: LDA VCENT+1             ;VERT POSITION\r
+       BMI 5$\r
+       LDA I,0F0               ;IF  LOW START HIGH\r
+       BNE 6$\r
+5$:    LDA I,10                ;IF HIGH, START LOW\r
+6$:    RTS\r
+       .PAGE\r
+       .SBTTL   TARGET MOTION CONTROL\r
+;\r
+;THIS ROUTINE CONTROLS SPEED & ACTION\r
+;OF THE MAIN TARGET & SELECTS PICTURE\r
+;\r
+;BLITZED A,X   ;2 BYTES STACK FOR JSR CALL\r
+;\r
+TARGET:        LDA I,20\r
+       BIT OBJST               ;GET STATUS OF OBJECT\r
+       BVC 20$\r
+       JMP 60$                 ;EXPLODING\r
+20$:   BMI 30$                 ;ACTIVE\r
+       JMP TSTART              ;NO ACTIVE, GO START SOMETHING\r
+30$:   BNE 35$                 ;ALREADY IN PERSUIT\r
+       LDA DISTANCE                    ;OBJECT IS MOVING IN INITIALLY\r
+       CMP I,PYMIN+30          ;CLOSE ENOUGH TO PERSUIT?\r
+       BCS 31$                 ;NO\r
+98$:   JMP 43$                 ;PATH FOR OUT OF RANGE BRANCHES\r
+31$:   LDA I,30\r
+       ORA OBJST               ;SET PERSUIT & ACCEL BIT\r
+       AND I,0FB               ;CLEAR NO ACTION BIT\r
+       STA OBJST\r
+35$:   LDA I,5                 ;DON'T CHANGE BIT (OR SHOT)?\r
+       BIT OBJST\r
+       BNE 98$                 ;LEAVE ALONE (SHORT(?) CUT)\r
+       LDA RANDOM              ;SOME RANDOM SPEED UP AND SLOW DOWN\r
+       AND I,03F\r
+       STA R0                  ;SAVE ACCELERATION\r
+       LDA I,10\r
+       BIT OBJST               ;ACCEL OR DECL?\r
+       BNE 36$                 ;ACCEL\r
+       SEC                     ;DECELL\r
+       LDA OBSPDL                      ;DECEL AFTER PULLING AWAY\r
+       SBC R0\r
+       STA OBSPDL\r
+       LDA OBSPD\r
+       SBC I,0                 ;PROP CARRY\r
+       STA OBSPD\r
+       CMP VELH                ;OUR SPEED REACHED?\r
+       BCS 43$                 ;OK AS IS\r
+       LDA 97$                 ;SET ALREADY PULLED AWAY BIT & ACCEL BIT\r
+       SEC\r
+SBC #8\r
+       ORA OBJST               ;REACCEL TO JUST BELOW OUR SPEED\r
+       STA OBJST\r
+       LDA SHTWT               ;WAIT AWHILE DURING GAME START\r
+       BEQ 33$                 ;NO\r
+       BMI 34$                 ;ALWAYS\r
+       DEC SHTWT\r
+       BNE 43$\r
+33$:   LDA RANDOM\r
+       AND I,01                ;FIRE SHOT?\r
+       BNE 43$                 ;EXIT\r
+34$:   LDA OBJPIC              ;SHOOT WHEN AT END OF TUBE\r
+       AND I,018\r
+       BNE 43$                 ;LONG SHOTS ONLY\r
+       LDA I,80\r
+       STA SHTBACK             ;SET SHOOT BACK\r
+       BIT STATE               ;NOT DURING ATTACT\r
+       BMI 99$\r
+97$:   JSR SECURE+SECOFF       ;SED? FOR SECURITY\r
+99$:   LDA VELH\r
+       SEC\r
+       SBC I,3\r
+       STA R0                  ;SPEED UP\r
+       LDA I,RED\r
+       STA COLARY+MOTG\r
+       LDA I,1\r
+       ORA OBJST\r
+       STA OBJST\r
+       BNE 37$                 ;*ALWAYS**\r
+36$:   LDA OBSPDL              ;ACCEL\r
+       CLC\r
+       ADC R0\r
+       STA OBSPDL\r
+       LDA OBSPD\r
+       ADC I,0\r
+       CMP VELH\r
+       BCC 39$                 ;NOT FAST ENOUGH YET\r
+       STA R0                  ;HOLD\r
+       LDA I,8                 ;ALREADY PULLED AWAY?\r
+       BIT OBJST                       ;TEST FOR FINIAL ACCEL OR PULL AWAY ACCEL\r
+       BNE 43$                 ;DONT CHANGE SPEED.\r
+       LDA R0          ;ELSE ACCEL TO PULL AWAY SPEED\r
+       SEC                     ;SUBTRACT HIS SPEED FROM OURS\r
+       SBC VELH                ;HOW MUCH OVER TOP SPEED\r
+       CMP I,4                 ;PULL AWAY=TOP +4\r
+       BCC 37$\r
+       LDA I,0E0               ;WE HAVE REACHED PULL AWAY SPEED\r
+       AND OBJST\r
+       STA OBJST\r
+37$:   LDA R0                  ;STORE SPEED AWAY\r
+39$:   STA OBSPD\r
+43$:   SEC\r
+       LDA VELH\r
+       SBC OBSPD               ;SPEED DIFFERENCE\r
+       CLC\r
+       ADC DISTANCE            ;ADD TO NEW POSITION\r
+       STA DISTANCE            ;AND SAVE\r
+       CMP I,10\r
+       BCC 40$\r
+42$:   CMP I,0F8               ;CRASH?\r
+       BCS OBJCRSH\r
+44$:   CMP I,30                ;TO FAR AWAY?\r
+       BCS 50$                 ;NO WERE OK\r
+       BIT OVERHD              ;WAS THIS A SHOT?\r
+       BMI 40$\r
+       LDA DISDLY              ;HOW LONG HAVE WE BEEN HOLDING AT A DIST?\r
+       BMI 40$                 ;TIME TO TRY A RESTART?\r
+       BNE 47$                 ;KEEP WAITING\r
+       LDA I,7F                ;IT WAS 0 SO THIS IS THE FIRST TIME IN\r
+       STA DISDLY              ;SO SET DELAY FOR LATER ENTRY\r
+47$:   DEC DISDLY              ;KEEP COUNTING\r
+       BEQ 47$                 ;IF 0, MAKE - SO WE CAN TRY A RESTART\r
+49$:   RTS                     ;RETURN\r
+40$:   JMP OBJDAC              ;SHORT CUT\r
+50$:   AND I,0F0               ;LOOK AT TOP BITS ONLY\r
+       SBC I,30                ;SUBTRACT HORIZON TO GET PIC NUMBER\r
+       BCS 5$\r
+       JMP REMOVE\r
+5$:    LSR\r
+       LSR                     ;GET A NUMBER 00-C0 TO 0-C THEN...\r
+       LSR                     ;OBJECT PIC # X2 ([0:A]*2)\r
+       STA OBJPIC              ;SAVE FOR LATER USE\r
+       CMP LASTP               ;SAME AS LAST PICTURE?\r
+       BEQ 49$                 ;IF SAME, NO OUTPUT THIS TIME\r
+       STA LASTP               ;ELSE SAVE NEW PIC\r
+       TAX                     ;SAVE X REG FOR POSSIBLE RECALL\r
+       BIT SHTBACK             ;SHOT PICTURE?\r
+       BMI 52$\r
+       BIT OBJNUM              ;ALT SHIP?\r
+       BPL 51$                 ;NO\r
+       CLC\r
+       ADC I,TI.OFF            ;MOVE TO ALT PICTURE\r
+51$:   BIT OVERHD              ;IS A SHELL GOING BY?\r
+       BPL 54$                 ;NO\r
+       TXA                     ;IF YES, GET BACK OLD PICTURE NUMBER\r
+52$:   CLC\r
+       ADC #S.OFF              ;MOVE TO SHELL PIC\r
+54$:   TAX                     ;PUT IX INTO X REG\r
+55$:   JMP MOTOUT              ;OUTPUT PICTURE (=JSR:MOTOUT WIN RETURN)\r
+;HERE IF HIT & EXPLODING\r
+60$:   LDA FRAMC\r
+       AND I,07\r
+       BNE 49$                 ;EXPLOSION SEQUENCE TIME\r
+       STA LASTP               ;SO IT WILL REMOVE CORRECTLY LATER\r
+       INC OBJPIC\r
+       INC OBJPIC              ;POINT TO NEXT PICTURE\r
+       LDX OBJPIC              ;POINT AGAIN\r
+       BNE 55$                 ;OUTPUT IT\r
+OBJCRSH:BIT STATE\r
+       BMI OBJDAC\r
+       LDA SHIELD              ;SHIELDS?\r
+       BPL 10$                 ;NO SHIELDS\r
+       LDA I,0D0               ;SET BACK A BIT\r
+       STA DISTANCE\r
+       LDA TARTBL+1            ;START EXPLOSION\r
+       STA OBJPIC\r
+       LDA SHIELE+1\r
+       SBC I,18                ;SUBTRACT 10 FROM SHIELDS\r
+       BCS 4$\r
+       LDA I,0                 ;SET TO 0\r
+4$:    STA SHIELE+1\r
+       LDX I,0\r
+       JSR STSOUND             ;EXPLOSION\r
+       LDA I,40\r
+       STA SHLDHT              ;RED COLOR IF HIT\r
+       ORA OBJST               ;SET EXPLOSION BIT (40)\r
+       STA OBJST\r
+       LDX OBJPIC              ;RECALL 1ST EXPLODING PIC\r
+       BNE MOTOUT              ;**ALWAYS**\r
+10$:   LDA I,1\r
+       ORA STATE\r
+       STA STATE\r
+       LDA TOPS\r
+       LSR                     ;OLD TOP/2 = NEW\r
+       CMP #04                 ;4 MINIMUM\r
+       BCS 12$\r
+       LDA #4\r
+12$:   STA TOPS\r
+                               ;RESET TOP SPEED\r
+OBJDAC:        LDA I,0                 ;DEACTIVATE\r
+       STA OBJST               ;CLEAR OBJECT\r
+       BIT OVERHD              ;DID A SHELL JUST END?\r
+       BPL REMOVE              ;NO\r
+       LDA I,40                ;YES. SO START A SHIP\r
+       STA OVERHD\r
+REMOVE:        LDA I,0\r
+       STA MOBJVB              ;MOVE OFF\r
+       LDA I,0FF\r
+       CMP LASTP\r
+       BNE 10$                 ;ALREADY REMOVED?\r
+       RTS\r
+10$:   STA LASTP\r
+       .SBTTL  ERASE MOTION OBJECT\r
+ERASE:\r
+       DLOAD MOTT              ;START OF TO LINE OF MOTION OBJECT\r
+       STY DPTR                ;OUTPUT POINTER\r
+       STA DPTR+1\r
+       STY DPTR2\r
+       STA DPTR2+1\r
+       LDA I,0\r
+       STA RCNT                ;NO REPEAT (FOR SURE)\r
+       STA ULCT                ;NO UNIQUE LINES\r
+       STA R3                  ;NOT SYMMETRICAL\r
+       TAX\r
+       TAY                     ;0 BOTH\r
+       JMP FILL\r
+\f      .SBTTL MOTION OBJ OUTPUT\r
+;\r
+;PASS POINTER INTO 'SHPTBL' IN X.  CARRY CLEAR=0 OBJ, SET=1\r
+;\r
+MOTOUT:        LDA AX,SHPTBL\r
+       STA SPTR\r
+       LDA AX,SHPTBL+1         ;GET SOURCE POINTER\r
+       BEQ OBJDAC              ;IF NO MORE PICTURES, SKIP IT\r
+       STA R0                  ;SAVE FOR X2 BIT\r
+       AND I,7F                ;REMOVE POSSIBLE X2 BIT (A15)\r
+       STA SPTR+1\r
+       DLOAD MOTT\r
+       STY DPTR\r
+       STA DPTR+1              ;SAVE OUTPUT POINTER\r
+       STY DPTR2               ;INIT SYMMETRICAL POINTER ALSO\r
+       STA DPTR2+1\r
+       LDY I,0\r
+       LDA NY,SPTR             ;GET UNIQUE LINE COUNT\r
+       STA R3                  ;SAVE COUNT FOR POSSIBLE SYMM. BIT\r
+       AND I,7F                ;STRIP OFF POSSIBL SYMM BIT\r
+       STA ULCT\r
+       STA HOFF\r
+       BIT R0                  ;CHECK SIZE\r
+       BPL 6$                  ;X2, LEAVE IT\r
+       LSR\r
+       ADC HOFF                ;HOFF IS FUDGE FACTOR TO CENTER IN SQUARE\r
+       STA HOFF                ;ELSE HOFF=1.5 ULCT\r
+6$:    INY\r
+       LDA NY,SPTR             ;GET VERT SIZE\r
+       STA VOFF\r
+       BIT R0                  ;X3\r
+       BPL 7$                  ;NO, X2\r
+       LSR\r
+       ADC VOFF\r
+       STA VOFF                ;ELSE VOFF=1.5 VSIZE\r
+7$:    DEC ULCT                ;ADJUST ULCT\r
+       TYA                     ;ACC:=1\r
+       SEC                     ;+1\r
+       ADC SPTR                ;BUMP SRC PTR\r
+       STA SPTR\r
+       BCC 8$                  ;DOUBLE PREC.\r
+       INC SPTR+1\r
+8$:    BIT R3                  ;SYMN?\r
+       BPL MOT1                ;IF NO, LEAVE ALONE\r
+       LDA I,0\r
+       STA R6\r
+       LDA ULCT                ;LINE COUNT\r
+       ASL                     ;ALL PICS X2\r
+       ROL R6\r
+       ASL\r
+       ROL R6\r
+       ASL\r
+       ROL R6\r
+       ASL\r
+       ROL R6\r
+       CLC                     ;POINTER * 16\r
+       ADC DPTR2\r
+       STA DPTR2\r
+       LDA DPTR2+1             ;POINT TO TOP OF OBJECT OUTPUT POINTER\r
+       ADC R6\r
+       STA DPTR2+1\r
+9$:    LDA DPTR2               ;NOW SAVE THIS LOCATION FOR FILL\r
+       CLC\r
+       ADC I,16.\r
+       STA M1\r
+       LDA DPTR2+1\r
+       ADC I,0\r
+       STA M2\r
+\r\r
+MOT1:  LDY I,0\r
+       LDA NY,SPTR\r
+       STA R1                  ;GET HEADER BYTE\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       STA RCNT                ;SAVE REPEAT COUNT\r
+       INC SPTR\r
+       BNE MOT2\r
+       INC SPTR+1\r
+MOT2:  LDY I,0\r
+       LDA R1\r
+       AND I,0F\r
+       STA SCNT                ;SEGMENT COUNT\r
+30$:   LDA NY,SPTR\r
+       STA R2                  ;SEGMENT STAMP\r
+       AND I,0F                ;X2 ALWAYS\r
+       SEC\r
+       ADC R2\r
+35$:   BIT R0                  ;X3?\r
+       BPL 36$\r
+       AND I,1F                ;DOUBLE IT\r
+       SEC\r
+       ADC R2\r
+36$:   STA NY,DPTR             ;OUTPUT\r
+       STA NY,DPTR2            ;SYMM. OUTPUT\r
+       INY\r
+       DEC SCNT                ;COUNT DOWN\r
+       BPL 30$\r
+FILL:\r
+       STA WTCHDG\r
+       LDA I,0FF               ;FILLER CODE\r
+       CPY I,16.               ;NO EMPTY LEFT?\r
+       BCS 46$\r
+       STA NY,DPTR\r
+       STA NY,DPTR2\r
+46$:   CLC\r
+       LDA DPTR\r
+       ADC I,16.               ;\r
+       STA DPTR\r
+       BCC 50$\r
+       INC DPTR+1\r
+       LDA DPTR+1\r
+       AND I,4                 ;CHECK FOR E.O.B.\r
+       BEQ 70$\r
+50$:   LDA DPTR2\r
+       BIT R3                  ;SYMM?\r
+       BPL 51$\r
+       DEC ULCT                ;IF SMYMERIAL, 2 LINES WENT OUT\r
+       SEC\r
+       SBC I,16.               ;MOVE DOWN FROM TOP\r
+       STA DPTR2\r
+       BCS 52$\r
+       DEC DPTR2+1\r
+       BNE 52$\r
+51$:   CLC                     ;NOT A SYMM. OBJECT SO JUST ...\r
+       ADC I,16.               ;... MOVE WITH BOTTOM OBJECT\r
+       STA DPTR2\r
+       BCC 52$\r
+       INC DPTR2+1\r
+52$:   DEC ULCT\r
+       DEC RCNT                ;SHOULD WE REPEAT\r
+       BPL MOT2\r
+       TYA\r
+       CLC                     ;BUMP TO NEXT HEADER\r
+       ADC SPTR                ;UPDATE RAM SOURCE POINTER\r
+       STA SPTR\r
+       BCC 55$\r
+       INC SPTR+1\r
+55$:   BIT ULCT                ;ANY LINES LEFT?\r
+       BMI 61$\r
+       JMP MOT1\r
+61$:   BIT R3                  ;IF SYMN, MOVE OUTPUT POINTER\r
+       BPL 60$                 ;ELSE SKIP IT\r
+       LDY M2\r
+       LDA M1\r
+       STA DPTR\r
+       STA DPTR2\r
+       STY DPTR2+1\r
+       STY DPTR+1              ;SET FILL TO TOP OF PICTURE\r
+       LDA I,0\r
+       STA R3                  ;TURN OFF SYMM BIT\r
+60$:   LDY I,0\r
+       BEQ FILL                ;FILL ALWAYS\r
+70$:   LDA I,2                 ;NORMAL VSTRETCH\r
+       BIT R0                  ;X2\r
+       BPL 71$\r
+       LDA I,1                 ;X2\r
+71$:   STA MOVS0               ;SAVE VSTRETCH\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  MOTION OBJ OUTPUT CALCULATIONS\r
+;\r
+;PRE-INTERRUPT CALCULATIONS ON MOTION OBJEC PARAMETERS\r
+;\r
+MOTSET:        LDA I,0                 ;GUESS NO OVERFLOW\r
+       STA HFLOW\r
+       STA MOBSTB              ;0 TO MOTION OBJECT START LINE\r
+       BIT OBJST               ;ACTIVE?\r
+       BPL 1$                  ;IF NO, SET AT 0\r
+       LDA VOFF                ;V POSITION (SIDE)....\r
+       SEC                     ;IS OBJECT VERTICAL OFFSET BY SIZE\r
+       SBC OBJV                ;TO CENTER OBJECT\r
+       BCC 2$\r
+       LDA I,0FF               ;DON'T WRAP\r
+2$:    STA MOBJVB              ;PUT TO BUFFER\r
+       LDA OBJH                ;H POSIT (SIDE)...\r
+       CLC                     ;IS OBJECT HORIZ OFFSET BY SIZE\r
+       ADC HOFF                ;TO CENTER OBJECT\r
+       BCC 1$                  ;IS IT OFF EDGE OF SCREEN?\r
+       STA HFLOW               ;IF YES, REMOVE PARTIAL PICTURE\r
+       LDA I,0FF               ;SET POSITION TO MAX\r
+1$:    STA MOBJHB              ;PUT IN BUFFER\r
+       LDX HFLOW\r
+       STX MOBSTB\r
+       SBC I,7F                ;VSTOP=MOBJH-80\r
+       BCS 5$                  ;NO UNDER FLOW\r
+4$:    LDA I,0                 ;IF UNDER,SET AT 0\r
+       BEQ 6$                  ;***ALWAYS***\r
+5$:    LDY MOVS0\r
+       CPY I,2                 ;OBJECT *2?\r
+       BEQ 6$                  ;IF NOT 2, THEN 1\r
+       SBC I,7F                ;SUBTRACT 80(CARRY CLEAR)FOR LARGER OBJECT\r
+       BCC 4$                  ;CHECK FOR UNDERFLOW\r
+6$:    CLC\r
+       ADC HFLOW\r
+       STA MOBVSB\r
+       RTS\r
+       .BYTE 065                       ;CKSUM 4\r
+       .SBTTL  (CK4)\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/TCND.MAC b/TCND.MAC
new file mode 100644 (file)
index 0000000..7f2325e
Binary files /dev/null and b/TCND.MAC differ
diff --git a/TCOLR1.ROM b/TCOLR1.ROM
new file mode 100644 (file)
index 0000000..7985ed4
Binary files /dev/null and b/TCOLR1.ROM differ
diff --git a/TCOLR2.ROM b/TCOLR2.ROM
new file mode 100644 (file)
index 0000000..8171c19
Binary files /dev/null and b/TCOLR2.ROM differ
diff --git a/TCPIC.MAC b/TCPIC.MAC
new file mode 100644 (file)
index 0000000..2e6986f
Binary files /dev/null and b/TCPIC.MAC differ
diff --git a/TCPIC3.MAC b/TCPIC3.MAC
new file mode 100644 (file)
index 0000000..ae7ab3d
Binary files /dev/null and b/TCPIC3.MAC differ
diff --git a/TCPIC4.MAC b/TCPIC4.MAC
new file mode 100644 (file)
index 0000000..76e5c9c
Binary files /dev/null and b/TCPIC4.MAC differ
diff --git a/TCPIC5.MAC b/TCPIC5.MAC
new file mode 100644 (file)
index 0000000..9ed58ba
Binary files /dev/null and b/TCPIC5.MAC differ
diff --git a/TCPRIO.ROM b/TCPRIO.ROM
new file mode 100644 (file)
index 0000000..df2f1b8
Binary files /dev/null and b/TCPRIO.ROM differ
diff --git a/TCSOUN.MAC b/TCSOUN.MAC
new file mode 100644 (file)
index 0000000..83eec8f
--- /dev/null
@@ -0,0 +1,346 @@
+       .TITLE TCSOUN\r
+       .RADIX 16\r
+       .CSECT TCSOUN\r
+       .ENABLE AMA\r
+       .REPT 0\r
+*****************************************\r
+*\r
+*POKEY SOUND SYSTEM CONTROL\r
+*\r
+*PROJECT #: 16703 (TUBE CHASE)\r
+*HARDWARE: A CORECTLY INSTALLED POKEY\r
+*\r
+*DESCRIPTION:  THIS CONTAINS 2 ROUTINES:\r
+*               1) THE FIRST ROUTINE STARTS A SOUND.\r
+*                  IT MAY BE CALLED ANYTIME, BUT CERTAIN\r
+*                  PRIORITY RULES ON SOUNDS APPLY (SEE ROUTINE)\r
+*               2) THE SECOND MUST BE CALLED ONCE EVERY 16 MSEC\r
+*                  (OR 1 FRAME). THIS ROUTINE CONTINUES A SOUND.\r
+*                  IT ALSO SHUTS THINGS UP WHEN DONE.\r
+*\r
+******************************************\r
+*\r
+*PROGRAMMER:   OWEN RUBIN\r
+*\r
+******************************************\r
+       .ENDR\r
+       .PAGE\r
+       .SBTTL GLOBLS\r
+;ENTRY POINTS (AS SUBROUTINES)\r
+       .GLOBL STSOUND,CSOUND\r
+;RAM CELLS (DOES NOT HAVE TO BE 0 PAGE)\r
+       .GLOBL SSTAT,SOUNDN,POINT,CURRENT,FRAMES,COUNT,STATE,LOCKOUT\r
+;EXTERNAL REFERENCES (SUCH AS POKEY)\r
+       .GLOBL AUDF1,AUDCTL\r
+;SOUND NAMES\r
+       .GLOBL EXPLOS,PHASER\r
+       .SBTTL USPAGE\r
+       .REPT 0\r
+HOW TO USE THIS PROGRAM:\r
+I) RAM MUST BE ALLOCATED AND DEFINED 'GLOBL' AS DESCRIBED\r
+   UNDER 'RAM & ROM ALLOCATION'.\r
+II) EACH SOUND IS DESCRIBED BY A TABLE.\r
+       A) THE TABLE IS A GROUP OF CHANNEL SEQUENCE\r
+          1) A CHANNEL SEQUENCE IS A SET OF 4 BYTES (POSSIBLE 2)\r
+             AS DESCRIBED UNDER 'RAM & ROM ALLOCATION'.\r
+       B) THIS ROUTINE WILL HANDLE 6 CHANNELS (WHICH IS 3 POKEY\r
+          SOUND CHANNELS) AS EACH POKEY CHANNEL CONSISTS OF A\r
+          FREQUENCY CONTROL CHANNEL AND AN AUDIO CONTROL CHANNEL.\r
+          1) BOTH POKEY CHANNELS ARE HANDLED EXACTLY THE SAME\r
+             BY THIS ROUTINE AS BOTH USUALLY REQUIRE SOME SEQUENCE\r
+             TO BE OUTPUTED.\r
+       C) EACH CHANNEL WITHIN A SOUND IS DESCRIBED BY A NAME\r
+          (UP TO 5 CHARS) PLUS A NUMBER (WHICH DESCRIBES WHICH\r
+          CHANNEL IT IS).\r
+III) MAKING NOISE\r
+       A) DEFINE THE SEQUENCE OF NUMBERS WHICH WILL GO OUT TO EACH\r
+          CHANNEL.  IF A CHANNEL IS NOT GOING TO BE USED, OR IS\r
+          NOT GOING TO CHANGE, DECIDE WHAT VALUE YOU WANT OUTPUT \r
+          TO THIS CHANNEL WHILE THE SOUND IS RUNNING.\r
+          IF NOT DESCRIBED, 0 WILL BE OUTPUT\r
+          A CHANGE CAN HAPPEN EVER INTERRUPT\r
+       B) TAME THE SEQUENCE AND CONVERT IT INTO THE 4 BYTE\r
+          SEQUENCE AS PREVIOUSLY DESCRIBED (SEE UNDER 'RAM &\r
+          ROM ALLOCATION'). PUT THE PROPER LABEL IN FRONT OF\r
+          EACH GROUP OF 4 BYTE SEQUENCES.\r
+          *NOTE: THE LONGEST SEQUENCE IS ALWAYS DEFINED AS \r
+           CHANNEL 1.\r
+       C) END EACH SEQUENCE WITH .BYTE 0,0 & ADD LABLES\r
+       D) PLACE AN ENTRY INTO THE 'PNTRS' AREA USING THE \r
+          'OFFSET' MACRO. THE HIGHER IN THIS TABLE, THE\r
+          HIGHER THE PRIORITY OF THE SOUND.\r
+       F) THE DATA TABLES FOR SOUNDS MAY FOLLOW 'SOUND':\r
+          .BYTE 0' ANYWHERE WITHIN 255 BYTES TOTAL\r
+       \r
+EXAMPLE:\r\r
+A) SEQUENCES\r
+   1) 1ST SEQUNCE FREQUENCY:(43,83,0C3,03) REPEATED 124 TIMES,\r
+      CHANGING ONCE A FRAME.\r
+   2) CORRESPONDING CONTROL REGISTER IS ALWAYS 0\r
+   3) 2ND SEQUENCE, FREQUENCEY: 1,2,3,4,5 UP TO 45 CHANGING EVERY\r
+      4 FRAMES.\r
+   4) CORRESPONDING CONTROL SEQUENCE: 0AF ANF 7 FRAMES\r
+                                     8F FOR 90 FRAMES\r
+                                     8E DOWN TO 80 CHANNEL EVERY FRAME\r
+B) CONVERSION: (INTERREPT 4 TIMES A FRAME)\r
+   1) 1ST SEQUENCE             .BYTE 43,4,40,124.\r
+   2) CONTROL CHANNEL          .BYTE 0,0\r\r
+   3) 2ND SEQUENCE             .BYTE 1,16.,1,45.\r
+   4) CONTROL CHANNEL          .BYTE 0AF,28,0,1\r
+                               .BYTE 8F,4,0,90. ;NOTE* BOTH WAYS OF DONG THIS\r
+                               .BYTE 8E,4,-1,15.\r
+C) ENDING:\r
+       CH1:    .BYTE 43,4,40,124.\r
+               .BYTE 0,0\r
+       CH2:    .BYTE 0,0\r
+       CH3:    .BYTE 1,16.,1,45.\r
+               .BYTE 0,0\r
+       CH4:    .BYTE 0AF,28,0,1\r
+               .BYTE 8F,4,0,90.\r
+               .BYTE 8E,4,-1,15.\r
+               .BYTE 0,0\r
+D) POINTERS:\r
+       PNTRS: OFFSET CH\r
+F) PLACE SECTION C UNDER:\r
+       SOUND: .BYTE 0\r
+       .ENDR\r
+       .PAGE\r
+       .SBTTL RAM & ROM ALLOCATION\r
+       .REPT 0\r
+*THE FOLLOWING MUST BE DEFINED SOME WHERE IN YOUR RAM ALLOCATION\r
+*SOUND ROUTINE VARIABLES\r
+       \r
+SSTAT: .BLKB 1                 ;SOUND STATUS POINTER. - IS ACTIVE\r
+SOUNDN:        .BLKB 1                 ;SOUND # IN PROGRESS\r
+POINT: .BLKB 6                 ;POINTER OFFSET INTO DATA TABLES(IF 0, CHANNEL NOT ACTIVE)\r
+CURRENT:.BLKB 6                        ;OUTPUT VALUE\r
+FRAMES:        .BLKB 6                 ;FRAMES UNTIL NEXT CHANGE\r
+COUNT: .BLKB 6                 ;COUNT OF TOTAL CHANGES\r
+       .ENDR\r
+;***DATA TABLES DESCRIPTION***\r
+;EACH TABLE ENTRY IS 4 BYTES DESCRIBING A SEQUENCE, CONSISTING OF:\r
+STVAL  =0                      ;VALUE TO START SEQUENCE\r
+FRCNT  =1                      ;# OF FRAMES BEFORE ANY CHANGE\r
+CHANGE =2                      ;AMOUNT OF CHANGE\r
+NUMBER =3                      ;TOTAL NUMBER OF CHANGES IN THIS SEQUENCE\r
+;EX1: 0FF,1,-1,6 DESCRIBES THE FOLLOWING SEQUENCE\r
+;      0FF,0FE,0FD,0FC,0FB,0FA,0F9\r
+;EX2: 0,45,0,1 WILL OUTPUT 0 FOR 46 FRAMES\r
+;\r
+;IF A 0 IS PUT INTO 'FRCNT', THE VALUE OF 'STVAL' WILL BE OUTPUT\r
+;CONTINIOUSLY. UNTIL CH1 IS ENDED (THIS FEATURE MAY NOT BE USED ON CH1\r
+;IF THIS FEATURE IS USED, ONLY THE FIRST 2 BYTES (STVAL & FRCNT)\r
+;NEED BE DEFINED FOR THAT ENTRY\r
+;WHEN A 0 IS PUT IN 'FRCNT' FOR CH1, THE TOTAL SOUND\r
+;(ALL 6 CHANNELS) ENDS & ALL CHANNELS RETURN TO WHATEVER IS IN 'IDLEV'\r
+       .PAGE\r
+       .SBTTL OFFSET MACROS FOR SOUND ROUTINES\r
+       .MACRO OFFSET,LABEL\r
+       .IRPC X,<123456>\r
+       .IF DF,LABEL''X\r
+       .BYTE LABEL''X-SOUND\r
+       .IFF\r
+       .BYTE 0\r
+       .ENDC\r
+       .ENDR\r
+       .ENDM\r
+;\r
+;THE ABOVE MACRO GENERATES THE OFFSETS FROM THE 'SOUND' BASE ADDRESS\r
+;FOR A CHANNEL OF DATA.\r
+;IF LESS THAN 6 CHANNELS ARE USED, THE REMAINING POINTERS ARE SET TO 0\r
+;A 0 VALUE POINTER INDICATES AN IDLE CHANNEL.\r
+;\r
+;EX: SOUND: .BYTE 0\r
+;\r
+;    CH1:   .BYTE 0,45,0,1\r
+;    CH2:   .BYTE 0,45,0,2,3,7,9,1\r
+;\r
+;BY CALLING 'OFFSET CH' , THE FOLLOWING WILL BE PLACED IN LINE\r
+;          .BYTE CH1-SOUND\r
+;          .BYTE CH2-SOUND\r
+;          .BYTE 0,0,0,0\r
+;\r
+       .PAGE\r
+       .SBTTL SOUND TABLES\r
+;TABLES OF OFFSET POINTER FOR SOUNDS. (6 BYTES PER SOUND NUMBER)\r
+PNTRS: OFFSET EX\r
+       OFFSET PH\r
+PTLEN  =.-PNTRS\r
+EXPLOS =0\r
+PHASER =1\r
+       \r
+;SOUND TABLES\r
+SOUND: .BYTE 0                 ;THIS 0 IS SO NO OFFSET POINTER WILL BE 0\r
+                               ;A GOOD PLACE FOR THE CHECKSUM\r
+;DATA STRUCTUREJ:\r
+;A CHANNEL CONSISTS OF A SERIES OF 4 BYTE SEQUENCES:\r
+;      BYTE            FUNCTION\r
+;       1               STARTING VALUE OF SEQUENCE\r
+;       2               # OF INTERRUPS BEFORE NEXT CHANGE\r
+;       3               AMOUNT OF CHANGE\r
+;       4               TOTAL NUMBER OF CHANGES (# OF DIFFERENT VALUES)\r
+;TO STOP A CHANNEL & RETURN TO ITS IDLE STATE, PUT IN AS A\r
+;2 BYTE SEQUENCE X,0 WHERE X WILL BE USED AS THE NEW IDLE VALUE.\r
+;NOTE: ALL SOUNDS END WHEN CHANNEL 1 GOES IDLE, SO IT SHOULD BE THE\r
+;LONGEST\r
+;\r
+;EXPLOSION SOUND\r
+;\r
+EX1:   .BYTE 43,4,40,104.\r
+       .BYTE 0,0\r
+EX3:   .BYTE 1,16.,1,26.\r
+       .BYTE 1F,0\r
+EX4:   .BYTE 0AF,28.,0,1\r
+       .BYTE 8F,4,0,90.\r
+       .BYTE 8E,4,-1,2\r
+       .BYTE 8D,8,0,1\r
+       .BYTE 8D,4,-1,4\r
+       .BYTE 8A,12.,0,1\r
+       .BYTE 89,4,-1,3\r
+       .BYTE 87,12.,0,1\r
+       .BYTE 86,4,-1,3\r
+       .BYTE 84,12.,0,1\r
+       .BYTE 83,4,-1,4\r
+       .BYTE 80,0\r
+EX5:   .BYTE 4,0\r
+EX6:   .BYTE 88,4,0,90.\r
+       .BYTE 87,8,-1,3\r
+       .BYTE 85,4,-1,6\r
+       .BYTE 80,0\r
+;\r
+;PHASER SOUND\r
+;\r
+PH1:   .BYTE 0FF,4,-1,7\r
+       .BYTE 1,4,-1,39.\r
+       .BYTE 0C0,0\r
+PH3:   .BYTE 2,4,1,7\r
+       .BYTE 3,4,1,2\r
+       .BYTE 4,4,1,37.\r
+       .BYTE 1F,0\r
+PH4:   .BYTE 0A0,28.,0,1\r
+       .BYTE 0AF,40.,0,1\r
+       .BYTE 0AE,8,-1,14.\r
+       .BYTE 80,0\r
+PH5:   .BYTE 0,4,4,2\r
+       .BYTE 4,1,3,2\r
+       .BYTE 1,4,3,2\r
+       .BYTE 0,4,0,40.\r
+       .BYTE 0FE,0\r
+PH6:   .BYTE 83,4,2,7\r
+       .BYTE 8A,20.,0,1\r
+       .BYTE 89,8,-1,9.\r
+       .BYTE 80,48.,0,1\r
+       .BYTE 80,0\r
+       .PAGE\r
+       .SBTTL START SOUND ROUTINE\r
+;\r
+;PASS SOUND NUMBER IN 'X'.\r
+;IF NO SOUND IS ACTIVE, THE NEW SOUND WILL START\r
+;IF THE SOUND ACTIVE IS THE SAME SOUND THAT IS TO BE STARTED, IT WILL RESTART\r
+;IF A SOUND IS ACTIVE, THE NEW SOUND WILL START ONLY IF IT HAS A HIGHER\r
+; PRIORITY THAN THE CURRENT SOUND (A SOUND # LESS THAN THE CURRENT SOUND)\r
+;\r
+STSOUND:BIT STATE              ;NO SOUNT IF ATTRACT\r
+       BMI 40$ \r
+       BIT SSTAT               ;SOUND ACTIVE?\r
+       BPL 20$                 ;NO IF +\r
+       CPX SOUNDN              ;CHECK PRIORITY LEVEL\r
+       BEQ 20$                 ;IF SAME, RESTART\r
+       BCC 20$                 ;IF HIGHER PRIORITY, RESTART\r
+       LDA I,0\r
+       LDY I,5\r
+10$:   ORA Y,POINT\r
+       DEY\r
+       BPL 10$\r
+       TAY                     ;ALL POINTERS 0?\r
+       BEQ 20$                 ;IF YES, START SOUND\r
+       RTS                     ;ELSE SKIP SOUND\r
+20$:   STX SOUNDN              ;SAVE SOUND NUMBER\r
+       LSR SSTAT                       ;MAKE SSTAT PLUS\r
+       LDA I,80\r
+       STA LOCKOUT             ;LOCKOUT INTERRUPTS\r
+       LDX I,5                 ;TURN OFF OLD SOUND\r
+       LDA I,0                 ;QUIET OLD SOUNDS\r
+25$:   STA X,CURRENT           ;SET CURRENT & IDLE VALUE\r
+       STA X,AUDF1             ;OUTPUT TO POKEY\r
+       DEX                     ;6 'CHANNELS'\r
+       BPL 25$\r
+       LDA SOUNDN              ;SOUND X1\r
+       ASL                     ;X2 & CLC\r
+       ADC SOUNDN              ;X3\r
+       ASL                     ;X6, CLC\r
+       ADC I,5                 ;BECAUSE IT COUNTS DOWN, NOT UP\r
+       TAY                     ;POINTER TO INITIAL POINTER\r
+       CPY I,PTLEN+5           ;NO SUCH SOUND NUMBER\r
+       BCS 40$\r
+       LDX I,5\r
+30$:   LDA Y,PNTRS\r
+       STA X,POINT\r
+       LDA I,1\r
+       STA X,FRAMES            ;SET UP FOR INIT OF SOUND\r
+       STA X,COUNT\r
+       DEY\r
+       DEX\r
+       BPL 30$\r
+       STX SSTAT               ;SET ACTIVE\r
+       STA LOCKOUT             ;RELEASE INTERRUPT LOCK\r
+40$:   RTS\r
+       .PAGE\r
+       .SBTTL SOUND ROUTINE\r
+;\r
+;CONTINUES A PREVIOUSLY STARTED SOUND\r
+;WHEN CHANNEL 1 GOES IDLE, ALL SOUND ENDS\r
+;\r
+CSOUND:        LDX I,5                 ;6 CHANNELS\r
+       BIT SSTAT\r
+       BMI 10$                 ;OK TO OUTPUT\r
+       BIT LOCKOUT\r
+       BMI 16$                 ;LEAVE ALONE\r
+       BPL 15$                 ;ELES SHUT-UP\r
+10$:   DEC X,FRAMES            ;CHANGE THIS FRAME\r
+       BNE 30$\r
+       LDY X,POINT             ;GET DATA POINTER\r
+       BEQ 30$                 ;NOT ACTIVE CHANNEL\r
+       DEC X,COUNT             ;DATA CHANGES LEFT?\r
+       BNE 20$                 ;NO -- NONE\r
+       LDA Y,SOUND+STVAL       ;GET CURRENT VALUE\r
+       STA X,CURRENT           ;SAVE\r
+       LDA Y,SOUND+FRCNT       ;GET FRAMES OF THIS LEVEL\r
+       STA X,FRAMES            ;UPDATE FRAME NUMBER\r
+       BNE 17$                 ;IF 0, THIS CHANNEL JUST ENDED\r
+       STA X,POINT             ;SET POINTER TO 0 TO IDLE CHANNEL\r
+       TXA                     ;A CHEAP WAY TO TEST IF THIS IS CH 1\r
+       BNE 30$                 ;IF NOT CH 1, JUST IDLE CHANNEL\r
+       LDX I,5\r
+15$:   LDA I,0                 ;ALL SOUND CHANNELS TO 0 VALUE WHEN OFF\r
+14$:   STA X,CURRENT\r
+       STA X,AUDF1\r
+       STA X,POINT             ;ALL POINTER TO 0\r
+       DEX\r
+       BPL 14$\r
+       STA SSTAT                       ;TURN OFF STATUS TOO\r
+16$:   RTS\r
+17$:   LDA Y,SOUND+NUMBER\r
+       STA X,COUNT             ;# OF CHANGES\r
+       LDA X,POINT\r
+       CLC\r
+       ADC I,4                 ;POINT TO NEXT SEQUENCE\r
+       STA X,POINT\r
+       BNE 30$                 ;BETTER BE ALWAYS****\r
+20$:   LDA Y,SOUND+FRCNT-4     ;FRAME RATE\r
+                               ;THE -4 TO CORRECT FOR THE POINTER BEING ALREADY\r
+                               ;INCREMENTED TO POINT TO THE NEXT BLOCK.\r
+       STA X,FRAMES\r
+       LDA X,CURRENT\r
+       CLC\r
+       ADC Y,SOUND+CHANGE-4    ;STEP THRU SEQUENCE\r
+       STA X,CURRENT\r
+30$:   LDA X,CURRENT           ;MORE THAN 1 PATH HERE SO LOAD CURRENT\r
+       STA X,AUDF1             ;OUTPUT\r
+       LDA I,50\r
+       STA AUDCTL\r
+       DEX\r
+       BPL 10$\r
+       RTS\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/TCSW0.ROM b/TCSW0.ROM
new file mode 100644 (file)
index 0000000..95281ec
Binary files /dev/null and b/TCSW0.ROM differ
diff --git a/TCSW1.ROM b/TCSW1.ROM
new file mode 100644 (file)
index 0000000..c2de77a
Binary files /dev/null and b/TCSW1.ROM differ
diff --git a/TCSYNC.ROM b/TCSYNC.ROM
new file mode 100644 (file)
index 0000000..96caa4a
Binary files /dev/null and b/TCSYNC.ROM differ
diff --git a/TCTEST.MAC b/TCTEST.MAC
new file mode 100644 (file)
index 0000000..cb6aa53
Binary files /dev/null and b/TCTEST.MAC differ
diff --git a/TCTH.MAC b/TCTH.MAC
new file mode 100644 (file)
index 0000000..0f4f9b3
Binary files /dev/null and b/TCTH.MAC differ