First Commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:23:27 +0000 (18:23 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:23:27 +0000 (18:23 -0400)
A34183.1A [new file with mode: 0644]
A34183.1B [new file with mode: 0644]
A34183.1C [new file with mode: 0644]
A34211.XX [new file with mode: 0644]
A34216.XX [new file with mode: 0644]
SUBCN1.XX [new file with mode: 0644]
SUBS.DOC [new file with mode: 0644]
SUBS.MAP [new file with mode: 0644]

diff --git a/A34183.1A b/A34183.1A
new file mode 100644 (file)
index 0000000..e2f5441
--- /dev/null
+++ b/A34183.1A
@@ -0,0 +1,3803 @@
+       .TITLE  SUBGAM - SUBS GAME PROGRAM\r
+       .SBTTL  **************************\r
+       .SBTTL  *\r
+       .SBTTL  *PROGRAMMER:  JOHN RAY\r
+       .SBTTL  *\r
+       .SBTTL  *CHECKER:\r
+       .SBTTL  *\r
+       .SBTTL  **************************\r
+;\r
+;DATE INITIATED:       6/29/78\r
+;PROJECT CHARGE #:     5J121\r
+;DISK #: 6\r
+;HARDWARE REQUIREMENTS:\r
+;                      MOTION - 4 OBJECTS\r
+;                      PLAYFIELD - 32X28 - BIT7 = SCREEN 2, BIT6 = SCREEN 0\r
+;\r
+;MEMORY REQUIREMENTS:\r
+;                      PROGRAM - 6KX8\r
+;\r
+;INTERRUPT REQUIREMENTS:\r
+;\r
+;      NMI=32V\r
+;\r
+;LINK COMMAND STRING:\r
+;                      PP:/L=SUBGAM,SUBSNR,SUBCN2\r
+;\r
+;PROGRAM DESCRIPTION:\r
+;\r
+;      TWO PLAYER COMPETITIVE GAME.  EACH PLAYER HAS HIS OWN MONITOR\r
+;      TO SEARCH AND DESTROY HIS COMPETITOR'S SUB.  EACH PLAYER HAS\r
+;      A SONAR SCREEN TO AID HIM IN FINDING HIS COMPETITOR.\r
+;\r
+       .ASECT\r
+       .RADIX  16\r
+;\r
+;\r
+       .SBTTL  CHECKSUM EQUATES\r
+;\r
+;\r
+CKSM1  =6F             ;2000-23FF      ;ACTUALLY 2000-20FF\r
+CKSM2  =0              ;2400-27FF      ;NOT USED\r
+CKSM3  =0A4            ;2800-2BFF\r
+CKSM4  =0B4            ;2C00-2FFF\r
+CKSM5  =0BD            ;3000-33FF\r
+CKSM6  =1B             ;3400-37FF\r
+CKSM7  =0D             ;3800-3BFF\r
+CKSM8  =0AA            ;3C00-3FFF\r
+       .PAGE\r
+       .SBTTL  PROGRAM MEMORY ALLOCATION\r
+       .REPT   0\r
+\r
+THE PROGRAM ITSELF RESIDES IN 6K BYTES.  THE FRENCH AND SPANISH MESSAGES DID NOT\r
+FIT IN THE 6K, SO THEY ARE IN A SEPARATE 256 BYTE PROM.  THE GAME WILL WORK JUST\r
+FINE WITHOUT THE FRENCH/SPANISH PROM, BUT ENGLISH LANGUAGE MESSAGES WILL APPEAR\r
+IF THE OPTION SWITCHES ARE SET FOR FRENCH OR SPANISH.  (THERE WILL BE A CHECKSUM\r
+ERROR IN SELF-TEST FOR THE MISSING PROM, THOUGH.)\r
+\r
+       2000-20FF       FRENCH, SPANISH MESSAGES (SUBGAM)\r
+       2800-2A4F       SONAR ROUTINE (SUBSNR)\r
+       2A50-2ACF       "STANDARD" COIN ROUTINE (SUBCN2)\r
+       2AD0-3FFF       MAIN PROGRAM (SUBGAM)\r
+\r
+THE SELF-TEST AND DIAGNOSTIC ROUTINES ARE CONTAINED IN THE LAST 1K, SO ONLY ONE\r
+ROM OR ONE PAIR OF PROMS ARE NEEDED TO DEBUG THE BOARD.\r
+       .ENDR\r
+\r
+\r
+       .SBTTL  STATUS BYTE DESCRIPTION\r
+       .REPT   0\r
+\r
+GSTAT -- GAME STATUS BYTE\r
+\r
+       D7=0    ATTRACT MODE\r
+       D7=1    GAME MODE\r
+       D6=1    FLAG TO START THE GAME\r
+       D0=1    A CRASH IS IN PROGRESS\r
+\r
+EXPLANATION:\r
+\r
+D7 AND D6 ARE BOTH 0 IN THE ATTRACT MODE.  WHEN A PLAYER HITS HIS "START" BUTTON,\r
+D7 AND D6 ARE SET TO 1.  D7 SAYS GAME MODE, D6 SAYS TO START THE GAME.  D6 IS RESET\r
+TO 0 AFTER EVERYTHING HAS BEEN INITIALIZED, INCLUDING THE COUNTDOWN TIMER.  D7\r
+STAYS HIGH UNTIL THE GAME IS OVER.\r
+\r
+D0 IS LOOKED AT BY THE AUDIO ROUTINE TO OUTPUT THE "CRASH" SOUND.  IT IS SET BY ANY\r
+ROUTINE THAT SENSES A CRASH.\r
+\r
+\r
+STAT -- STATUS WORD FOR EACH MOTION OBJECT (INCLUDING POSSIBLE INVISIBLE TORPEDOES.\r
+       THE TORPEDOES ARE MULTIPLEXED TWO TO A MOTION OBJECT)\r
+\r
+       SUB -- IF STAT IS FOR A SUBMARINE\r
+\r
+       D7=0    DRONE\r
+       D7=1    PLAYER\r
+       D6=1    IF STEERING WAS SENSED\r
+       D5=1    IF STEERING WAS CW, ELSE CCW\r
+       D4      "FIRE" DEBOUNCE BIT\r
+       D3=1    IF PLAYFIELD COLLISION IN PRORESS\r
+       D2=1    IF TORP COLLISION IN PROGRESS\r
+       D1=1    IF SUB COLLISION IN PROGRESS\r
+\r
+       TORP -- IF STAT IS FOR A TORPEDO\r
+\r
+       D7=0    TORPEDO HAS NOT BEEN FIRED (INVISIBLE)\r
+       D7=1    TORPEDO HAS BEEN FIRED (VISIBLE)\r
+       D6      "FIRE" DEBOUNCE BIT\r
+       D3=1    IF PLAYFIELD COLLISION IS IN PROGRESS\r
+       D2=1    IF TORPEDO COLLISION IS IN PROGRESS\r
+       D1=1    IF SUB COLLISION IS IN PROGRESS\r
+       .ENDR\r
+       .PAGE\r
+;\r
+;\r
+       .SBTTL  BASE PAGE ALLOCATION - RAM\r
+;\r
+;\r
+       .=80\r
+FRAME: .BLKB 1                 ;FRAME COUNTER\r
+GTIME: .BLKB 3                 ;GAME TIMER\r
+BLPNTR:        .BLKB 4                 ;BLIP POINTER\r
+BLPCNT =BLPNTR+1               ;BLIP COUNTER\r
+QUAD:  .BLKB 1                 ;SONAR SCREEN QUADRANT NUMBER\r
+CRSRN: .BLKB 1                 ;SONAR SCREEN CURSOR NUMBER\r
+TEST1: .BLKB 1                 ;TWO BYTES TO VERIFY THAT\r
+TEST2: .BLKB 1                 ;GAME HAS BEEN INITIALIZED\r
+TEMP1: .BLKB 2                 ;TEMPORARY STORAGE LOCATIONS\r
+TEMP2: .BLKB 2\r
+       .=90\r
+HPOS:  .BLKB 8                 ;DMA-HIGH HPOS BYTE\r
+SBENABL        =HPOS+1                 ;DMA-D7=VISIBILTY\r
+SOUNDS =SBENABL+4              ;D7-D4=EXPLOSION, D3-D0=LAUNCH VOLUME\r
+$CNCT  =SOUNDS+2               ;COIN COUNT\r
+VPOS:  .BLKB 8                 ;DMA-HIGH VPOS BYTE\r
+ROTATE =VPOS+1                 ;DAM-PICTURE ROTATION\r
+STAT:  .BLKB 12.               ;STATUS BYTE FOR EACH MOTION OBJECT\r
+TIM    =STAT+1                 ;TIMER FOR EACH MOTION OBJECT\r
+HPOSL: .BLKB 12.               ;LOW ORDER HPOS BYTE\r
+VPOSL  =HPOSL+1                ;LOW ORDER VPOS BYTE\r
+HPOST: .BLKB 12.               ;TEMP LOCATIONS FOR\r
+VPOST  =HPOST+1                ;V & H POSITIONS\r
+ROTEMP:        .BLKB 12.               ;ROTATE TIME BYTE\r
+SCORED =ROTEMP+1               ;FOR EACH PLAYER'S SCORE\r
+BLPNUM =SCORED+4               ;BLIP NUMBER\r
+$INTCT =BLPNUM+4               ;INTERRUPT COUNTER\r
+GSTAT  =$INTCT+2               ;GAME STATUS\r
+TEMP3: .BLKB 2                 ;TEMPORARY STORAGE\r
+TEMP4: .BLKB 3 \r
+HPOSLST:       .BLKB 4\r
+VPOSLST        =HPOSLST+1\r
+NTEMP1:        .BLKB 1                 ;NMI TEMP LOCATIONS\r
+NTEMP2:        .BLKB 1\r
+NTEMP3:        .BLKB 2\r
+NTEMP4:        .BLKB 1\r
+$PSTSL:        .BLKB 4                 ;POST SLAM (2 BYTES)\r
+$CNSTT =$PSTSL+1               ;COIN DETECTION (2 BYTES)\r
+$LMTIM:        .BLKB 1                 ;PRE-SLAM TIMER (1 BYTE)\r
+$CCTIM:        .BLKB 1                 ;COIN COUNTER TIMER (1 BYTE)\r
+CNTDWN:        .BLKB 1                 ;GAME COUNTDOWN\r
+       .PAGE\r
+       .SBTTL  BASE PAGE ALLOCATION - INPUTS\r
+;\r
+;\r
+DIAGSTP        =00                     ;DIAGNOSTIC STEP SWITCH (LOW)\r
+DIAGHLD        =01                     ;DIAGNOSTIC HOLD SWITCH (LOW)\r
+SLAM   =02                     ;SLAM SWITCH (LOW)\r
+SPARIN =03                     ;SPARE INPUT\r
+STRDIR =04                     ;STEERING DIRECTION\r
+STRFLG =05                     ;STEERING FLAG\r
+COIN   =20                     ;COIN SWITCH (HIGH)\r
+STRTSW =21                     ;START SWITCH (LOW)\r
+FIRE   =25                     ;FIRE BUTTON (LOW)\r
+VBLANK =24                     ;VBLANK (LOW)\r
+SLFTST =26                     ;SELF TEST SWITCH (LOW)\r
+;\r
+;\r
+       .SBTTL  OPTION SWITCHES\r
+;\r
+;0=SWITCH ON, 1=SWITCH OFF\r
+;\r
+OPTSW1 =60                     ;8,7 - COIN MODE\r
+OPTSW2 =61                     ;6,5 - 61 BIT 0=1=FREE PLAY\r
+                               ;61 BIT 0=0=NO FREE PLAY\r
+                               ;60 BIT 1 = MSB OF COIN MODE\r
+                               ;60 BIT 0 = MIDDLE BIT OF COIN MODE\r
+                               ;61 BIT 1 = LSB OF COIN MODE\r
+OPTSW3 =62                     ;LANGUAGE - 4,3\r
+                               ;00=ENGLISH\r
+                               ;01=FRENCH\r
+                               ;10=SPANISH\r
+                               ;11=GERMAN\r
+OPTSW4 =63                     ;D0=1=NO PING IN ATTRACT\r
+                               ;D0=0=PING IN ATTRACT\r
+                               ;D1=0=TIME MODE\r
+                               ;D1=1=CREDIT MODE\r
+;\r
+;\r
+       .SBTTL  BASE PAGE ALLOCATION - OUTPUTS\r
+;\r
+;\r
+NOIZRST        =00                     ;RANDOM NOISE RESET\r
+LMPON  =60\r
+LMPOFF =61\r
+SNROFF =64                     ;SONAR PING SOUND\r
+SNRON  =65\r
+CRSHOFF        =68                     ;CRASH SOUND\r
+CRSHON =69\r
+XPLDOFF        =6A                     ;EXPLOSION SOUND\r
+XPLDON =6B\r
+INVTON =6C                     ;INVERT VIDEO\r
+INVTOFF        =6D\r
+STRRST =20\r
+WDOG   =40\r
+       .PAGE\r
+       .SBTTL  EQUATES\r
+;\r
+;\r
+PF     =0800                   ;START OF PLAYFIELD RAM\r
+SCRAD1  =PF+35.                        ;SCORE ADDRESS 1\r
+SCRAD2 =SCRAD1+22.             ;SCORE ADDRESS 2\r
+TIMADR  =PF+<27.*32.>+4                ;TIME ADDRESS\r
+BLANK  =0F9                    ;BLANK MOTION PICTURE\r
+SBXPL1 =0C0                    ;SUB EPLOSION PICTURE 1\r
+SBXPL2 =SBXPL1+8\r
+TPXPL1 =SBXPL1+1               ;TORP EXPOSION PICTURE 1\r
+TPXPL2 =TPXPL1+8\r
+; THESE COUNTERS MUST BE LESS THEN\r
+; OR EQUAL TO 3F SO THEY DON'T\r
+; BECOME VISIBLE.\r
+FIRETIM        =0840                   ;DRONE MAX. FIRE DELAY\r
+SHOTTIM        =0841                   ;DRONE MIN. FIRE DELAY\r
+                               ;2 BYTE INTERSPERSED PRAM\r
+SNRCNTR        =0860                   ;PFLD RAM USED AS SONAR PING COUNTERS\r
+POSTIM =0861                   ;VALID POSITION TIMERS\r
+XPLCNTR        =0880                   ;XPLOSION COUNTER\r
+MISSCNTR=0881                  ;MISS COUNTER\r
+RSTCNTR        =0882                   ;GAME RESET COUNTER\r
+LNGINDX        =0883                   ;LANGUAGE INDEX FOR MESSAGES\r
+MISSMAX        =3F                     ;VALUE TO START THE MISS COUNTER AT\r
+       .PAGE\r
+       .SBTTL  ENTRY POINTS\r
+;\r
+       .GLOBL  SONAR,MOOLAH\r
+;\r
+       .SBTTL  EXTERNAL REFERENCES\r
+;\r
+       .GLOBL  VBLANK,FRAME,CRSRN,QUAD,BLPNTR,BLPCNT,BLPNUM\r
+       .GLOBL  TEMP1,TEMP2,HPOS,VPOS,SNRON,SNROFF,SNRCNTR,CNTDWN\r
+       .GLOBL  OPTSW4,GSTAT,$CNSTT,$PSTSL,$INTCT,$LMTIM,$CNCT,$CCTIM\r
+;\r
+;\r
+       .SBTTL  PROGRAM ASSEMBLY OPTIONS\r
+;\r
+;\r
+;DESCRIPTION:\r
+;\r
+;      THE PROGRAM WILL BE ASSEMBLED DIFFERENT WAYS DEPENDING ON THE\r
+;      OPTION EQUATE BELOW.\r
+;\r
+;      OPTION 0 - DEVELOPMENT SYSTEM\r
+;\r
+;      OPTION 1 - PROM\r
+;\r
+OPTION =1\r
+       .PAGE\r
+       .SBTTL  MAIN PROGRAM LOOP\r
+;\r
+       .=2000\r
+       JMP     PWRON           ;IN DEV. SYS.\r
+       .SBTTL  CKECKSUM 1\r
+       .BYTE CKSM1\r
+.TEMP1 =.\r
+       .=2AD0\r
+       .SBTTL  CHECKSUM 3\r
+       .BYTE   CKSM3\r
+       .BYTE   0,0,0,0,0       ;SPARE\r
+;\r
+;\r
+       .SBTTL  START PLAY SUBROUTINE\r
+;\r
+;REGISTERS:\r
+;\r
+;USED:         A,X,Y   RESTORED:\r
+;\r
+;STACK USE:\r
+;\r
+;3 LEVEL SUBROUTINES\r
+;\r
+;BASE PAGE USE:\r
+;USED:\r
+;ALTERED:      SOUND,FRAME,VEL,STAT,TIM\r
+;\r
+;SUBROUTINES CALLED:\r
+;INITIL,TRANS,UPDATE,SONAR,SUBCOL,PFOUT,SCROUT\r
+;\r
+START: BIT     Z,GSTAT         ;GSTAT BIT 6=1=INITIALIZE\r
+       BVC     PLAY\r
+       LDA     Z,GSTAT\r
+       AND     I,0BF\r
+       STA     Z,GSTAT\r
+       LDA     I,0FF\r
+       STA     Z,CNTDWN\r
+       LDA     Z,OPTSW4        ;CREDIT MODE?\r
+       AND     I,2\r
+       BEQ     START2          ;NO\r
+       LDA     Z,OPTSW2        ;FREE PLAY?\r
+       ROR\r
+       BCS     START2          ;YES\r
+       JSR     A,ADDTIME       ;GIVE TIME\r
+START2:        JSR     A,INITIL        ;SET UP MOTION OBJECTS\r
+       LDA     I,0             ;ZERO SCORES\r
+       STA     Z,SCORED\r
+       STA     Z,SCORED+2\r
+       STA     Z,NOIZRST       ;START RANDOM NOISE GENERATOR\r
+       JSR     A,PFOUT         ;OUTPUT PLAYFIELD\r
+PLAY:  JSR     A,TRANS         ;XFER TEMP TO SCREEN\r
+       INC     Z,FRAME\r
+       JSR     A,SCROUT        ;OUTPUT SCORE\r
+       LDA     Z,CNTDWN\r
+       BEQ     SBLP\r
+       DEC     Z,CNTDWN\r
+       .PAGE\r
+       .SBTTL  SUB LOOP\r
+;\r
+;HANDLE THE SUBS NOW\r
+;\r
+SBLP:  LDX     I,2\r
+SUBLP: ROL     ZX,SBENABL      ;DISABLE SUB ON OTHER SCREEN\r
+       CLC\r
+       ROR     ZX,SBENABL\r
+       STA     ZX,INVTOFF\r
+       LDA     ZX,TIM          ;COLLISION TIMER=0?\r
+       BNE     10$             ;NO-BLOWING UP\r
+       JMP     A,SL1           ;YES - NOT BLOWING UP\r
+10$:   DEC     ZX,TIM          ;NO-DECREMENT IT\r
+       BEQ     20$             ;NOW IT IS!\r
+       ROL     ZX,SBENABL      ;NOT 0 YET\r
+       SEC                     ;STILL BLOWING UP\r
+       ROR     ZX,SBENABL      ;ENABLE ON OTHER SCREEN\r
+       LDY     I,SBXPL1        ;ALTERNATE EXPLOSION PICTURES\r
+       LDA     Z,FRAME\r
+       AND     I,2\r
+       BEQ     30$\r
+       LDY     ZX,ROTEMP\r
+       STA     ZX,INVTON\r
+30$:   STY     ZX,ROTATE\r
+       JMP     A,SLNEXT\r
+;DONE EXPLODING -- RESET INTO RANDOM POSITION\r
+20$:   JSR     A,RANDOM\r
+       JMP     A,SLNEXT\r
+;COME HERE IF NOT BLOWING UP\r
+SL1:\r
+       LDA     ZX,STAT         ;SUB-SUB OR SUB-PFLD COLLISION?\r
+       AND     I,0A\r
+       BEQ     10$             ;NO\r
+       LDA     Z,FRAME         ;YES--BLINK ON AND OFF\r
+       AND     I,4\r
+       BEQ     10$             ;OFF THIS FRAME\r
+       LDA     Z,GSTAT         ;DON'T BLINK IN ATTRACT\r
+       BEQ     10$\r
+       ROL     ZX,SBENABL      ;ON THIS FRAME\r
+       SEC\r
+       ROR     ZX,SBENABL\r
+10$:   LDA     ZX,ROTEMP       ;OUTPUT CURRENT PICTURE\r
+       STA     ZX,ROTATE\r
+       LDA     Z,CNTDWN        ;DON'T UPDATE IN "FREEZE"\r
+       BNE     SLNEXT\r
+       JSR     A,UPDATE\r
+SLNEXT:                                ;DO NEXT SUB\r
+       DEX\r
+       DEX\r
+       BMI     20$\r
+       JMP     A,SUBLP\r
+20$:   JSR     A,SONAR\r
+       JSR     A,MESSOUT       ;MESSAGES, START BUTTONS\r
+       JSR     A,SUBCOL        ;CHECK MOTION COLLISIONS\r
+       JSR     A,BAKLIT        ;BACKLIGHT "SONAR"\r
+       .PAGE\r
+       .SBTTL  TORPEDO LOOP\r
+;\r
+;HANDLE THE TORPEDOES NOW\r
+;\r
+       LDX     I,0A            ;X=TORP#\r
+TORPLP:        LDY     I,0             ;GET CORRESPONDING SUB #\r
+       TXA                     ;AND PUT IN Y\r
+       ROR\r
+       ROR\r
+       BCC     10$\r
+       LDY     I,2\r
+10$:   LDA     AY,FIRE         ;SEE IF FIRE BUTTON\r
+       BPL     20$             ;YES\r
+       LDA     AY,STAT         ;NO-CLEAR BIT 4 IN SUB STAT\r
+       AND     I,0EF\r
+       STA     AY,STAT\r
+20$:   LDA     ZX,STAT         ;TORP ALREADY OUT?\r
+       BMI     30$             ;YES\r
+       JMP     TL2             ;NO\r
+30$:   LDA     ZX,TIM          ;EXPLODING?\r
+       BNE     40$             ;YES\r
+       JSR     A,UPDATE        ;NO\r
+       JMP     A,TL1\r
+40$:   DEC     ZX,TIM          ;EXPLODING -- DONE EXPLODING?\r
+       BEQ     60$             ;YES\r
+       LDY     I,TPXPL1        ;NO-ALTERNATE EXPLOSION PICTURES\r
+       LDA     Z,FRAME\r
+       AND     I,2\r
+       BEQ     50$\r
+       LDY     I,TPXPL2\r
+50$:   STY     ZX,ROTEMP\r
+       JMP     A,TL1\r
+60$:   LDA     ZX,STAT         ;DONE EXPLODING\r
+       AND     I,7F            ;RESET STATUS\r
+       STA     ZX,STAT\r
+       JMP     A,TL3           ;OUTPUT BLANK PICTURE\r
+TL2:\r
+       LDA     AY,TIM          ;IF EITHER SUB IS COLLIDING,\r
+       BNE     TL3             ;DON'T ALLOW FIRING TORP\r
+       CPY     I,0\r
+       BEQ     10$\r
+       LDA     Z,TIM\r
+       BPL     20$             ;BRA\r
+10$:   LDA     Z,TIM+2\r
+20$:   BNE     TL3\r
+       LDA     Z,CNTDWN        ;NO COLLISIONS--FREEZE MODE?\r
+       BNE     TL3             ;YES--NO FIRING\r
+       LDA     AY,STAT         ;NO--DRONE?\r
+       BPL     TL4             ;YES\r
+       LDA     AY,FIRE         ;NO--FIRE BUTTON?\r
+       BMI     TL3             ;NO\r
+       LDA     AY,STAT         ;YES-DEBOUNCED?\r
+       AND     I,10\r
+       BEQ     TL5             ;YES START TORP\r
+TL3:                           ;DON'T START TORP-PUT OUT BLANK\r
+       LDA     I,BLANK\r
+       STA     ZX,ROTEMP\r
+       JMP     A,TL1\r
+TL5:                           ;START TORP\r
+       LDA     AY,STAT         ;SET DEBOUNCE BIT\r
+       ORA     I,10\r
+       STA     AY,STAT\r
+       LDA     AY,ROTATE       ;GIVE TORP SAME MOTION AS\r
+       ORA     I,1             ;SUB THAT FIRED IT (BIT 0=1=TORP)\r
+       STA     ZX,ROTEMP\r
+       LDA     AY,HPOST\r
+       STA     ZX,HPOST\r
+       STA     AY,HPOSLST      ;STORE SUBS CURRENT POSITION\r
+       LDA     AY,VPOST\r
+       STA     ZX,VPOST\r
+       STA     AY,VPOSLST\r
+       LDA     I,3F            ;SET VALID POSITION TIMER\r
+       STA     AY,POSTIM\r
+       LDA     Z,GSTAT         ;DON'T DO LAUNCH SOUND\r
+       BPL     10$             ;IN ATTRACT\r
+       LDA     Z,SOUNDS\r
+       ORA     I,0F\r
+       STA     Z,SOUNDS\r
+10$:   LDA     I,80            ;UPDATE TORP STATUS WORD\r
+       STA     ZX,STAT\r
+       LDA     I,0             ;CLEAR COLLISION TIMER\r
+       STA     ZX,TIM\r
+       JMP     A,TL1\r
+TL4:   LDA     AY,FIRETIM      ;DRONE FIRING\r
+       BEQ     10$             ;MUST FIRE\r
+       LDA     AY,SHOTTIM      ;TOO SOON TO FIRE?\r
+       BNE     TL3             ;YES\r
+       JSR     A,DISTANCE      ;NO-CLOSE ENOUGH?\r
+       BCC     TL3             ;NO(CARRY CLEAR)\r
+10$:   STX     Z,TEMP1         ;YES-FIRE! (CARRY SET)\r
+       JSR     A,DLTASCRE      ;GET SCORE DIFFERENCE CODE IN X\r
+       LDA     AX,MAXFIRE      ;GET NEW MAX+MIN TIMES\r
+       STA     AY,FIRETIM\r
+       LDA     AX,MINFIRE\r
+       STA     AY,SHOTTIM\r
+       LDX     Z,TEMP1         ;RESTORE X\r
+       JMP     A,TL5           ;START TORP\r
+TL1:   DEX                     ;NEXT TORP\r
+       DEX\r
+       CPX     I,2\r
+       BEQ     4$\r
+       JMP     TORPLP\r
+       .SBTTL  CHECKSUM 4\r
+       .BYTE CKSM4\r
+       .BYTE   0,0,0,0,0,0     ;SPARE\r
+       .PAGE\r
+       .SBTTL  GAME TIMER\r
+;\r
+;CHECK FOR COINS DETECTED\r
+;\r
+4$:    LDA     Z,$CNCT\r
+       BEQ     5$              ;NO COINS\r
+       LDA     Z,OPTSW2        ;IN FREE PLAY?\r
+       ROR                     ;GET D0\r
+       BCS     6$              ;YES\r
+       LDA     Z,OPTSW4        ;IN CREDIT MODE?\r
+       AND     I,2             ;GET D1\r
+       BNE     5$              ;YES, DON'T ADD TIME\r
+6$:    DEC     Z,$CNCT         ;COINS!\r
+       JSR     A,ADDTIME\r
+;\r
+;UPDATE GAME TIMER\r
+;\r
+5$:    BIT     Z,GSTAT\r
+       BPL     51$\r
+       BVS     70$\r
+       LDA     Z,CNTDWN\r
+       BNE     70$\r
+       SED\r
+       LDA     Z,GTIME         ;ANY PARTS OF SECONDS LEFT?\r
+       BNE     30$             ;YES\r
+       LDA     Z,GTIME+1       ;NO - ANY SECONDS LEFT?\r
+       BNE     10$             ;YES\r
+       LDA     Z,GTIME+2       ;NO - ANY MINUTES LEFT?\r
+       BEQ     49$             ;NO - STOP GAME\r
+       LDA     I,59            ;YES - DECREMENT MINUTES AND\r
+       STA     Z,GTIME+1       ;GIVE 59 SECONDS\r
+       LDA     Z,GTIME+2\r
+       SEC\r
+       SBC     I,1\r
+       STA     Z,GTIME+2\r
+       BPL     20$             ;BRA\r
+10$:   LDA     Z,GTIME+1       ;DECREMENT SECONDS\r
+       SEC\r
+       SBC     I,1\r
+       STA     Z,GTIME+1\r
+20$:   LDA     I,59            ;GIVE 59 PARTS OF SECONDS\r
+       STA     Z,GTIME\r
+       BPL     40$             ;BRA\r
+30$:   LDA     Z,GTIME         ;DECREMENT PARTS OF SECONDS\r
+       SEC\r
+       SBC     I,1\r
+       STA     Z,GTIME\r
+40$:                           ;GAME MODE\r
+       LDA     Z,GSTAT\r
+       ORA     I,80\r
+       BMI     60$             ;BRA\r
+49$:   LDA     I,0FF           ;FREEZE\r
+       STA     Z,CNTDWN\r
+       LDA     I,3\r
+       STA     A,RSTCNTR       ;REWRITE SCREEN SOON\r
+51$:   LDA     Z,OPTSW2        ;FREE PLAY?\r
+       ROR\r
+       BCC     50$             ;NO\r
+       LDA     Z,CNTDWN        ;FREEZE MODE?\r
+       BNE     50$             ;YES\r
+       JSR     A,GTCNMD        ;NO - PUT UP FREE TIME\r
+       LDA     AX,COINMODE     ;GET LSD\r
+       STA     Z,GTIME+1       ;PUT IN SECONDS COUNTER\r
+       LDA     AX,COINMODE+1   ;GET MSD\r
+       STA     Z,GTIME+2       ;PUT IN MINUTES COUNTER\r
+50$:                           ;ATTRACT MODE - GAME\r
+       LDA     Z,SLFTST        ;LOOK AT SELF-TEST SWITCH\r
+       BMI     55$             ;ONLY IN ATTRACT\r
+       JMP     A,PWRON\r
+55$:   LDA     Z,STAT\r
+       AND     I,7F\r
+       STA     Z,STAT\r
+       LDA     Z,STAT+2\r
+       AND     I,7F\r
+       STA     Z,STAT+2\r
+       LDA     Z,GSTAT\r
+       AND     I,7F\r
+60$:   STA     Z,GSTAT\r
+70$:   CLD\r
+       LDA     Z,GTIME+2       ;RESET IF MORE THAN\r
+       CMP     I,0A0           ;99 MINUTES\r
+       BCC     80$\r
+       JMP     A,PWRON\r
+80$:   JSR     A,NOISES        ;UPDATE NOISES, DRONE COUNTERS\r
+                               ;WAIT FOR VBLANK\r
+       JMP     A,START\r
+       .PAGE\r
+       .SBTTL  NMI ROUTINE\r
+;*NMI ROUTINE\r
+;\r
+;DESCRIPTION:\r
+;      THIS ROUTINE (ENTERED AT 32U) VERIFIED THAT THE PROGRAM HAS BEEN\r
+;      INITIALIZED, HANDLES THE STEERING AND ACCELERATION, AND CHECKS FOR\r
+;      COINS.\r
+;\r
+NMI:   PHA                     ;SAVE REGS ON STACK\r
+       TXA\r
+       PHA\r
+       TYA\r
+       PHA\r
+       CLD\r
+       LDA     Z,TEST1         ;TEST IF FIRST TIME IN\r
+       CMP     I,55\r
+       BNE     RSTART          ;YES\r
+       LDA     Z,TEST2         ;NO-2ND TEST\r
+       CMP     I,0AA\r
+       BNE     RSTART          ;YES\r
+       TSX                     ;NO-TEST PROGRAM COUNTER\r
+       LDA     AX,106          ;GET PCH\r
+       CMP     I,40\r
+       BCC     STEER           ;PROGRAM IS IN 2000-3FFF\r
+RSTART:        JMP     PWRON\r
+       .PAGE\r
+       .SBTTL  STEERING ROUTINE\r
+;\r
+;EXTRACT STEERING INFORMATION\r
+;\r
+STEER: LDX     I,2             ;SET INDEX FOR 2 PLAYERS\r
+STRLP: LDA     Z,CNTDWN        ;NO STEERING DURING FREEZE\r
+       BNE     NEXT\r
+       LDA     ZX,STAT         ;DRONE?\r
+       BMI     10$             ;NO\r
+       JMP     A,AUTOSTR       ;YES\r
+10$:   LDA     ZX,STRFLG       ;SEE IF CHANGE SINCE LAST CHECK\r
+       BPL     STR             ;NO\r
+       LDA     ZX,STRDIR       ;YES, FIND DIRECTION\r
+       BPL     CCW             ;1=CW, 0=CCW\r
+;TURNING CLOCKWISE\r
+CW:    LDA     I,60\r
+       ORA     ZX,STAT         ;SET FLAG & DIRECTION IN STATUS WORD\r
+       STA     ZX,STAT\r
+       BNE     STR             ;BRA\r
+;TURNING COUNTER-CLOCKWISE\r
+CCW:   LDA     I,40\r
+       ORA     ZX,STAT         ;SET FLAG\r
+       AND     I,0DF           ;CLEAR DIRECTION\r
+       STA     ZX,STAT\r
+;\r
+;DO THE STEERING\r
+;\r
+STR:   BIT     A,VBLANK        ;DO STEERING ONLY\r
+       BMI     NEXT            ;DURING VBLANK\r
+       LDA     ZX,STAT         ;SEE IF STEERING\r
+       ASL                     ;WAS SENSED\r
+       BPL     NEXT            ;NO\r
+       ASL                     ;SEE IF CW OR CCW\r
+       BMI     10$             ;CW\r
+       LDA     I,-2            ;CCW\r
+       CLC\r
+       ADC     ZX,ROTEMP\r
+       STA     ZX,ROTEMP\r
+       AND     I,0F8           ;ROTATION SHOULD BE 00-C0\r
+       CMP     I,0F8           ;SEE IF VALID\r
+       BNE     20$             ;YES\r
+       LDA     I,0B8           ;NO, MAKE IT VALID\r
+       BMI     30$             ;BRA\r
+10$:   LDA     I,2             ;CW\r
+       CLC\r
+       ADC     ZX,ROTEMP\r
+       CMP     I,0C0           ;SEE IF VALID\r
+       BCC     30$             ;ROTATE IS LESS THAN C1 (VALID)\r
+       LDA     I,0             ;GREATER THAN C0-RESET TO 0\r
+30$:   STA     ZX,ROTEMP       ;UPDATE ROTATION\r
+20$:   LDA     I,0BF\r
+       AND     ZX,STAT         ;RESET SOFTWARE FLAG\r
+       STA     ZX,STAT\r
+;REPEAT FOR OTHER PLAYER\r
+NEXT:  DEX\r
+       DEX\r
+       BMI     10$\r
+       JMP     STRLP\r
+;BOTH PLAYERS DONE - RETURN FROM INTERRUPT\r
+10$:   STA     Z,STRRST        ;RESET HARDWARE STEER FLAGS\r
+       JSR     A,MOOLAH        ;DETECT COINS\r
+30$:   PLA                     ;RESTORE REGISTERS\r
+       TAY\r
+       PLA\r
+       TAX\r
+       PLA\r
+       RTI\r
+       .PAGE\r
+       .SBTTL  ADD TIME ROUTINE\r
+;\r
+;*ADD TIME SUBROUTINE\r
+;\r
+;      THIS ROUTINE ADDS THE TIME PER\r
+;      COIN (STORED IN THE COINMODE TABLE)\r
+;      (BASED ON TH OPTION SWITCHES) TO\r
+;      THE GAME TIMER.\r
+;\r
+ADDTIME:\r
+       SED\r
+       JSR     A,GTCNMD        ;GET INDEX (INX) OF COIN MODE\r
+       LDA     AX,COINMODE     ;GET SECONDS\r
+       CLC\r
+       ADC     Z,GTIME+1       ;ADD TO CURRENT SECONDS\r
+       CMP     I,60            ;OVERFLOW?\r
+       BCC     10$             ;NO\r
+       SBC     I,60            ;YES - SUBTRACT 60 AND SET CARRY\r
+10$:   STA     Z,GTIME+1\r
+       LDA     AX,COINMODE+1   ;GET MINUTES\r
+       ADC     Z,GTIME+2       ;ADD TO CURRENT MINUTES\r
+       BCS     20$\r
+       STA     Z,GTIME+2\r
+20$:   CLD\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  DRONE STEERING ROUTINE\r
+;\r
+;*AUTOMATIC STEERING ROUTINE\r
+;\r
+;THIS ROUTINE SIMULATES THE STEERING WHEEL OF A DRONE.  FIRST, BASED ON THE\r
+;DELTA SCORE THE ROUTINE IS EITHER CONTINUED OR EXITED TO EFFECT A VARIABLE\r
+;UPDATE RATE.  IF THE ROUTINE IS CONTINUED, THE DRONE AIMS TOWARDS THE PLAYER'S\r
+;LAST KNOWN POSITION (IF RECENT ENOUGH) OR RELIES ON 6 BITS OF INFO USED IN THE\r
+;SONAR ROUTINE.  THE STATUS WORD IS UPDATED ACCORDINGLY:\r
+;\r
+;      BIT 6   - STEERING IS REQUIRED\r
+;      BIT 5   - 0=CCW\r
+;              - 1=CW\r
+;\r
+AUTOSTR:\r
+       LDA     ZX,STAT         ;PFLD COLLISION?\r
+       AND     I,8\r
+       BEQ     4$              ;NO\r
+       LDA     Z,FRAME         ;YES-SEMI-RANDOM CW OR CCW\r
+       BPL     2$\r
+       JMP     A,CCW\r
+2$:    JMP     A,CW\r
+4$:    BIT     A,VBLANK\r
+       BPL     5$\r
+       JMP     A,STR\r
+5$:    STX     Z,NTEMP1        ;SAVE X\r
+       TXA                     ;GET DRONE # IN Y\r
+       TAY\r
+       JSR     A,DLTASCORE     ;GET SCORE CODE IN X\r
+       STX     Z,NTEMP2        ;SAVE CODE IN NTEMP2\r
+       LDA     AX,DRNMSK       ;GET RATE-OF-TURNING MASK\r
+       LDX     Z,NTEMP1        ;RESTORE X\r
+       AND     Z,FRAME         ;UPDATE THIS FRAME?\r
+       BEQ     ASYES           ;YES\r
+       JMP     A,STR           ;NO\r
+ASYES: LDY     I,0             ;GET PLAYER # IN Y\r
+       CPX     I,0\r
+       BNE     5$\r
+       LDY     I,2\r
+5$:    LDA     Z,NTEMP2        ;GET DELTA SCORE CODE\r
+       CMP     I,5             ;GREATER THAN 4?\r
+       BCC     10$             ;NO - PROCEED NORMALLY\r
+       LDA     AY,VPOS         ;YES - MAKE HIM "PEEK"\r
+       STA     AY,VPOSLST\r
+       LDA     AY,HPOS\r
+       STA     AY,HPOSLST\r
+       JMP     A,ASPNT1\r
+10$:   LDA     AY,POSTIM       ;ARE HPOSLST AND VPOSLST VALID?\r
+       BNE     ASPNT1          ;YES\r
+       LDA     AY,BLPCNT       ;NO, CAN I SEE SONAR?\r
+       BEQ     20$             ;YES\r
+       JMP     A,STR           ;NO\r
+20$:   LDA     AY,BLPNUM       ;USE SONAR\r
+       PHA\r
+       ASL                     ;BIT 3-5=VPOS\r
+       ASL\r
+       AND     I,0E0\r
+       STA     AY,VPOSLST\r
+       PLA\r
+       ROR                     ;BIT 0-2=HPOS\r
+       ROR\r
+       ROR\r
+       ROR\r
+       AND     I,0E0\r
+       STA     AY,HPOSLST\r
+ASPNT1:\r
+       LDA     I,0\r
+       STA     Z,NTEMP1        ;SIGN WORD\r
+       LDA     ZX,HPOST\r
+       SEC\r
+       SBC     AY,HPOSLST      ;SOURCE-DESTINATION\r
+       STA     Z,NTEMP2        ;DELTA H\r
+       ROL     Z,NTEMP1        ;SAVE SIGN(CARRY) IN SIGN WORD\r
+       LDA     Z,NTEMP1\r
+       LSR\r
+       BCS     10$             ;IF CARRY CLEAR, BORROW, NEGATE DELTA H\r
+       LDA     I,0\r
+       SEC\r
+       SBC     Z,NTEMP2\r
+       STA     Z,NTEMP2        ;DELTA H\r
+10$:   LDA     ZX,VPOST\r
+       SEC\r
+       SBC     AY,VPOSLST      ;SOURCE-DESTINATION\r
+       STA     Z,NTEMP3        ;DELTA V\r
+       ROL     Z,NTEMP1        ;CARRY TO SIGN WORD\r
+       LDA     Z,NTEMP1\r
+       LSR\r
+       BCS     ASPNT2          ;CARRY SET-OK\r
+       LDA     I,0             ;CARRY CLEAR-COMPLEMENT DELTA V\r
+       SEC\r
+       SBC     Z,NTEMP3\r
+       STA     Z,NTEMP3        ;DELTA V\r
+ASPNT2:\r
+;TANGENT THETA = V/H\r
+       LDA     Z,NTEMP3        ;DON'T DIVIDE INTO 0\r
+       STA     Z,NTEMP3+1      ;IF V=0, THEN V/H=0\r
+       BEQ     ASPNT3\r
+       LDA     I,0FF           ;IF H=0, V/H=FF\r
+       STA     Z,NTEMP3+1\r
+       LDY     Z,NTEMP2\r
+       BEQ     ASPNT3          ;H=0\r
+;DIVIDE DELTA V (NTEMP3) BY DELTA H (NTEMP2).\r
+;LEAVES QUOTIENT IN NTEMP3+1 AND REMAINDER IN A\r
+;\r
+DIVIDE:\r
+       LDA     I,0\r
+       STA     Z,NTEMP3+1\r
+       LDY     I,12.           ;12 BIT MULTI-WORD DIVIDE\r
+10$:   ASL     Z,NTEMP3+1\r
+       ROL     Z,NTEMP2        ;DOUBLE PRECISION DIVIDE\r
+       ROL\r
+       BCS     1$\r
+       CMP     Z,NTEMP3        ;TRIAL SUBTRACT\r
+       BCC     20$             ;IF DIVISOR LARGER, JUST SHIFT\r
+1$:    SBC     Z,NTEMP3        ;READ SUBTRACT\r
+       INC     Z,NTEMP3+1      ;PUT IT INTO QUOTIENT\r
+20$:   DEY\r
+       BNE     10$             ;DO NEXT BIT\r
+;\r
+;INTERPOLATE WITH THE TANGENT TABLE AT 15 DEGREE INCREMENTS (24 ROTATIONS)\r
+;\r
+ASPNT3:\r
+       LDY     I,6             ;SEVEN ENTRIES\r
+       LDA     Z,NTEMP2\r
+       BNE     ASPNT5\r
+ASPNT4:\r
+       DEY                     ;NEXT TABLE ENTRY\r
+       BEQ     ASPNT5          ;USE ZERO ENTRY\r
+       LDA     AY,TANGENTS     ;GET TABLE ENTRY\r
+       CMP     Z,NTEMP3+1\r
+       BCC     ASPNT4          ;TANGENT .LT. RESULT\r
+       SEC\r
+       SBC     Z,NTEMP3+1      ;HOW CLOSE TO TABLE ENTRY\r
+       STA     Z,NTEMP4\r
+       LDA     AY,TANGENTS+1   ;NEXT BIGGER ENTRY\r
+       SEC\r
+       SBC     Z,NTEMP3+1      ;HOW CLOSE TO THIS ENTRY?\r
+       CMP     Z,NTEMP4        ;COMPARE DIFFERENCE\r
+       BCS     ASPNT5\r
+       INY                     ;BIGGER ONE WAS CLOSER\r
+;\r
+;NOW WE HAVE (IN Y) THE ROTATION (BETWEEN 0 AND 6) WITHIN A QUADRANT.\r
+;THE QUADRANT IS IN NTEMP1.  WE NEED TO CONVERT THESE TWO NUMBERS TO\r
+;AN ACTUAL ROTATION, COMPARE TO CURRENT ROTATION, AND TURN EITHER\r
+;CW OR CCW (OR DON'T TURN)\r
+;\r
+ASPNT5:\r
+       STY     Z,NTEMP2        ;SAVE ROTATION\r
+       LDY     Z,NTEMP1        ;GET QUADRANT\r
+       LDA     AY,ROTOFST      ;GET THAT QUADRANT'S OFFSET\r
+       CLC\r
+       ADC     Z,NTEMP2        ;ADD IN ROTATION\r
+       STA     Z,NTEMP2        ;NTEMP2=DESIRED ROTATION\r
+       LDA     ZX,ROTATE       ;GET ACTUAL ROTATION\r
+       LSR                     ;NORMALIZE IT\r
+       LSR\r
+       LSR\r
+       CMP     I,18            ;EXPLOSION PICTURE\r
+       BCS     PNTNO           ;YES-BAIL OUT!!!!!\r
+       SEC                     ;NO\r
+       SBC     Z,NTEMP2        ;FIND DIFFERENCE\r
+       BNE     ASPNT9\r
+PNTNO: JMP     A,STR           ;ALREADY HEADED CORRECTLY\r
+                               ;BORROW?\r
+ASPNT9:        BCC     ASPNT6          ;YES-CURRENT .LT. DESIRED\r
+       CMP     I,0C            ;NO-CURRENT .GT. DESIRED\r
+                               ;OVER HALF WAY?\r
+       BCC     PNTCCW          ;NO-POINT CCW\r
+       BCS     PNTCW           ;YES-POINT CW\r
+ASPNT6:                                ;CURRENT .LT. DESIRED\r
+       CMP     I,-12.          ;OVER HALF WAY?\r
+       BCS     PNTCW           ;YES-POINT CW\r
+PNTCCW:        JMP     A,CCW           ;YES-POINT CCW\r
+PNTCW: JMP     A,CW            ;POINT CW\r
+;*TANGENT TABLE\r
+;\r
+;THIS TABLE IS USED IN THE AUTO STEERING\r
+;ROUTINE.  IT GIVES 16*TAN(THETA).\r
+;\r
+TANGENTS:\r
+       .BYTE   255.            ;90 DEG\r
+       .BYTE   60.             ;75 DEG\r
+       .BYTE   28.             ;60 DEG\r
+       .BYTE   16.             ;45 DEG\r
+       .BYTE   9.              ;30 DEG\r
+       .BYTE   4.              ;15 DEG\r
+       .BYTE   0.              ;0 DEG\r
+;*ROTATION OFFSETS\r
+;\r
+;THIS TABLE GIVES THE ROTATION OFFSET FOR EACH QUADRANT.\r
+ROTOFST:\r
+       .BYTE   6,0,12.,18.     ;QUAD 0,1,2,3\r
+\f      .SBTTL  POSITION UPDATE ROUTINE\r
+;\r
+;*POSITION UPDATE ROUTINE\r
+;\r
+;REGISTERS:\r
+;\r
+;USED:         A,X,Y   RESTORED: X\r
+;\r
+;STACK USE:\r
+;\r
+;ONE SUBROUTINE\r
+;\r
+;BASE PAGE USED:\r
+;      VEL,DIRECT,TEMP4,TEMP4+1\r
+;\r
+;BASE PAGE ALTERED:\r
+;      TEMP1,TEMP2,TEMP3,HPOSL,HPOST,VPOSL,VPOST\r
+;\r
+;SUBROUTINES CALLED:\r
+;      MULT\r
+;\r
+;DESCRIPTION:\r
+;      THE DIRECTION IS USED TO INDEX TO A SINE-COSINE TABLE TO GET A\r
+;      NORMALIZED H AND V OFFSET.  THESE NUMBERS ARE MULTIPLIED BY THE\r
+;      VELOCITY TO GIVE ACTUAL V AND H OFFSETS.  THE OFFSETS ARE ADDED\r
+;      TO THE OLD POSITION TO GET THE NEW POSITION.\r
+;\r
+;FIND NEW HORIZONTAL POSITION\r
+;\r
+UPDATE: LDA    ZX,STAT         ;CLEAR PLAYFIELD STATUS\r
+       AND     I,0F7\r
+       STA     ZX,STAT\r
+       STX     Z,TEMP1         ;SAVE X IN TEMP1\r
+       LDA     I,0C            ;SUB SPEED\r
+       CPX     I,3\r
+       BCC     30$\r
+       CLC\r
+       ADC     I,10            ;TORP SPEED\r
+30$:\r
+       STA     Z,TEMP2         ;VEL TO TEMP2\r
+       LDA     ZX,ROTEMP\r
+       LSR\r
+       LSR\r
+       LSR\r
+       STA     Z,TEMP1+1       ;ROTATION INDEX TO TEMP1+1\r
+       TAX\r
+       CLC\r
+       LDA     AX,HOFST        ;RAW H.OFFSET=F[ROTATION]\r
+       BEQ     U2              ;NO HORIZ CHANGE\r
+       TAX                     ;OFFSET TO X\r
+       JSR     A,MULT          ;HOFST*VEL DIVIDE BY 8\r
+       LDX     Z,TEMP1         ;RESTORE X\r
+       LDA     Z,TEMP4         ;GET LOW BYTE OF HORIZ. OFFSET (ACTUAL)\r
+       CLC\r
+       ADC     ZX,HPOSL        ;UPDATE LOW BYTE H. POSITION\r
+       STA     ZX,HPOSL\r
+       LDA     Z,TEMP4+1       ;UPDATE HIGH BYTE\r
+U2:    LDX     Z,TEMP1         ;RESTORE X\r
+       ADC     ZX,HPOST\r
+       STA     Z,TEMP3\r
+;\r
+;\r
+;FIND NEW VERTICAL POSITION\r
+;\r
+       LDX     Z,TEMP1+1       ;GET SAVED ROTATION INDEX\r
+       CLC\r
+       LDA     AX,VOFST        ;GET RAW V. OFFSET\r
+       BEQ     U3              ;NO VERTICAL CHANGE\r
+       TAX\r
+       JSR     A,MULT          ;RAW V. OFFSET*VEL DIVIDE BY 8\r
+       LDX     Z,TEMP1         ;RESTORE X\r
+       LDA     Z,TEMP4         ;GET LOW BYTE OF V. OFFSET\r
+       CLC\r
+       ADC     ZX,VPOSL        ;UPDATE LOW BYTE VPOS\r
+       STA     ZX,VPOSL\r
+       LDA     Z,TEMP4+1       ;UPDATE HI BYTE VPOS\r
+U3:    LDX     Z,TEMP1         ;RESTORE X\r
+       ADC     ZX,VPOST\r
+       STA     Z,TEMP3+1\r
+;\r
+;FIND FRONT POINT OF SUB\r
+;\r
+       LDX     Z,TEMP1+1       ;GET SAVED ROTATION INDEX\r
+       LDY     Z,TEMP1\r
+       CPY     I,3             ;TORP OR SUB?\r
+       BCC     4$              ;SUB\r
+       LDA     AX,TPHOFST      ;TORP\r
+       JMP     5$\r
+4$:    LDA     AX,HDSPLC       ;GET HORIZONTAL DISPLACEMENT\r
+5$:    CLC\r
+       ADC     Z,TEMP3         ;NEW HPOS\r
+       STA     Z,TEMP2         ;HPOS FOR FRONT TO TEMP2\r
+       CPY     I,3\r
+       BCC     6$\r
+       LDA     AX,TPVOFST\r
+       JMP     7$\r
+6$:    LDA     AX,VDSPLC       ;GET VERTICAL DISPLACEMENT\r
+7$:    CLC\r
+       ADC     Z,TEMP3+1       ;NEW VPOS\r
+       STA     Z,TEMP2+1       ;VPOS FOR FRONT TO TEMP2+1\r
+       JSR     A,CHECK         ;CHECK FOR COLLISION\r
+       BCS     10$             ;YES\r
+       LDA     Z,TEMP3         ;NO-UPDATE HPOS & VPOS\r
+       STA     AY,HPOST\r
+       LDA     Z,TEMP3+1\r
+       STA     AY,VPOST\r
+       JMP     A,REAR          ;CHECK REAR\r
+10$:   CPY     I,3             ;IS IT A SUB OR TORP\r
+       BCS     15$             ;TORP\r
+       LDA     Z,GSTAT         ;SUB - START CRASH SOUND\r
+       ORA     I,1\r
+       STA     Z,GSTAT         ;GSTAT BIT 0=CRASH FLAG\r
+       JMP     17$\r
+15$:   LDA     I,MISSMAX       ;TORP - START MISS SOUND\r
+       STA     A,MISSCNTR\r
+       LDA     I,20            ;START COL. TIMER\r
+       STA     AY,TIM\r
+17$:   LDA     AY,STAT         ;UPDATE STATUS\r
+       ORA     I,8\r
+       STA     AY,STAT\r
+18$:   LDX     Z,TEMP1+1       ;TRY AGAIN, BUT THIS TIME\r
+       LDA     AX,HDSPLC       ;USE NEW HPOS & OLD VPOS\r
+       CLC\r
+       ADC     Z,TEMP3\r
+       STA     Z,TEMP2\r
+       LDA     AX,VDSPLC\r
+       CLC\r
+       ADC     AY,VPOST\r
+       STA     Z,TEMP2+1\r
+       JSR     A,CHECK\r
+       BCS     20$             ;COLLISION\r
+       LDA     Z,TEMP3         ;NO COLLISION-UPDATE ONLY HPOS\r
+       STA     AY,HPOST\r
+       JMP     A,REAR\r
+20$:   LDX     Z,TEMP1+1       ;COLLISION-TRY AGAIN\r
+       LDA     AX,HDSPLC       ;BUT THIS TIME USE\r
+       CLC                     ;OLD HPOS AND NEW VPOS\r
+       ADC     AY,HPOST\r
+       STA     Z,TEMP2\r
+       LDA     AX,VDSPLC\r
+       CLC\r
+       ADC     Z,TEMP3+1\r
+       STA     Z,TEMP2+1\r
+       JSR     A,CHECK\r
+       BCS     REAR            ;COLLISION-USE OLD V & HPOS\r
+       LDA     Z,TEMP3+1       ;NO COLLISION-UPDATE ONLY\r
+       STA     AY,VPOST        ;VPOS\r
+;\r
+;DO SAME FOR REAR POINT OF SUB\r
+;\r
+REAR:  LDX     Z,TEMP1+1       ;GET SAVED ROTATION INDEX\r
+       CPY     I,3             ;TORP OR SUB?\r
+       BCC     4$              ;SUB\r
+       LDA     AX,TPHOFST      ;TORP\r
+       JMP     5$\r
+4$:    LDA     AX,HDSPLC       ;GET HORIZONTAL DISPLACEMENT\r
+5$:    EOR     I,0FF           ;GET TWO'S COMPLEMENT\r
+       SEC\r
+       ADC     AY,HPOST\r
+       STA     Z,TEMP2         ;HPOS FOR REAR 10 TEMP2\r
+       CPY     I,3\r
+       BCC     6$\r
+       LDA     AX,TPVOFST\r
+       JMP     7$\r
+6$:    LDA     AX,VDSPLC       ;GET VERTICAL DISPLACEMENT\r
+7$:    EOR     I,0FF           ;GET TWO'S COMPLEMENT\r
+       SEC\r
+       ADC     AY,VPOST\r
+       STA     Z,TEMP2+1       ;VPOS FOR REAR TO TEMP2+1\r
+       JSR     A,CHECK         ;CHECK FOR COLLISION\r
+       BCC     20$             ;NO COLLISION\r
+10$:   CPY     I,3             ;IS IT A SUB OR TORP?\r
+       BCS     15$             ;TORP\r
+       LDA     Z,GSTAT         ;SUB - START CRASH SOUND\r
+       ORA     I,1\r
+       STA     Z,GSTAT         ;GSTAT BIT 0=CRASH FLAG\r
+       BNE     17$             ;BRA\r
+15$:   LDA     I,MISSMAX       ;TORP - START MISS SOUND\r
+       STA     A,MISSCNTR\r
+       LDA     I,20            ;START TIMER\r
+       STA     AY,TIM\r
+17$:   LDA     AY,STAT         ;UPDATE STATUS\r
+       ORA     I,8\r
+       STA     AY,STAT\r
+20$:   LDX     Z,TEMP1         ;RESTORE X\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  MULTIPLY ROUTINE\r
+;*MULTIPLY ROUTINE\r
+;\r
+;REGISTERS:\r
+;\r
+;USED:         A,X     RESTORED:\r
+;\r
+;STACK USE:\r
+;      NONE\r
+;\r
+;BASE PAGE USED:\r
+;      TEMP2\r
+;\r
+;BASE PAGE ALTERED:\r
+;      TEMP2+1,TEMP4,TEMP4+1\r
+;\r
+;SUBROUTINES CALLED:\r
+;      NONE\r
+;\r
+;DESCRIPTION:\r
+;      ENTERED WITH INTEGER RAW OFFSET IN X, VELOCITY IN TEMP2.\r
+;      THESE TWO ARE SIGNED MULTIPLIED WITH THE RESULT PUT IN\r
+;      TEMP4 AND TEMP4+1.\r
+;\r
+MULT:  STX     Z,TEMP2+1       ;PUT RAW OFFSET IN TEMP2+1\r
+       TXA\r
+       BPL     M3              ;IF POSITIVE OFFSET, DON'T ALTER\r
+       EOR     I,0FF           ;IF NEGATIVE OFFSET, NEGATE IT\r
+       TAX\r
+       INX                     ;TWO'S COMPLEMENT\r
+M3:    LDA     I,0\r
+       STA     Z,TEMP4         ;CLEAR SPACE FOR RESULT\r
+       STA     Z,TEMP4+1\r
+M2:    LDA     Z,TEMP4\r
+       CLC\r
+       ADC     Z,TEMP2         ;ADD VELOCITY\r
+       STA     Z,TEMP4         ;PUT IN RESULT\r
+       BCC     10$\r
+       INC     Z,TEMP4+1       ;CARRY\r
+10$:   DEX                     ;DO IT UNTIL X(OFFSET)=0\r
+       BNE     M2\r
+       LDA     Z,TEMP2+1       ;SEE IF OFFSET + OR -\r
+       BPL     M1              ;PLUS-DONE\r
+       LDA     I,0             ;MINUS-NEGATE OFFSET\r
+       SEC\r
+       SBC     Z,TEMP4\r
+       STA     Z,TEMP4\r
+       LDA     I,0\r
+       SBC     Z,TEMP4+1\r
+       STA     Z,TEMP4+1\r
+M1:    RTS\r
+       .PAGE\r
+       .SBTTL  CHECKSUM 5\r
+       .BYTE   CKSM5           ;*RESERVED FOR CHECKSUMS 5*\r
+       .BYTE   0,0             ;SPARE\r
+       .PAGE\r
+       .SBTTL  PLAYFIELD COLLISION DETECTION\r
+;\r
+;*CHECK SUBROUTINE\r
+;\r
+;THIS SUBROUTINE TAKE THE HPOS (TEMP2) AND THE\r
+;VPOS (TEMP2+1), FIGURES OUT WHAT PLAYFIELD\r
+;POSITION THEY CORRESPOND TO, AND SETS THE\r
+;CARRY IF THAT POSITION IS IN COLLISION        \r
+;WITH AN ISLAND OR THE BOUNDARY.\r
+;\r
+;\r
+CHECK:\r
+;\r
+;CONVERT HPOS,VPOS TO STAMP NUMBER\r
+;\r
+;THIS ROUTIE TAKES THE HPOS (TEMP2)\r
+;AND THE VPOS, (TEMP2+1) AND PUTS THE\r
+;ADDRESS OF THE CORRESPONDING STAMP IN\r
+;TEMP4 (LO BYTE) AND TEMP4+1 (HI BYTE).\r
+;THE OFFSET WITHIN THE STAMP IS PUT IN\r
+;TEMP2 (H) AND TEMP2+1 (V).\r
+;\r
+;A=800+[(VPOS-8) DIV. 8]*20+)HPOS-8) DIV 8 (HEX)\r
+;\r
+       LDA     I,0     \r
+       STA     Z,TEMP4+1       ;CLEAR HI BYTE OF ANSWER\r
+       LDA     Z,TEMP2+1       ;GET VPOS\r
+       SEC\r
+       SBC     I,7             ;SUBTRACT PLAYFIELD-MOTIION OFFSET*\r
+       TAX\r
+       AND     I,07            ;V OFFSET WITHIN STAMP TO TEMP2+1\r
+       STA     Z,TEMP2+1\r
+       TXA\r
+       AND     I,0F8           ;DIVIDE BY 8, MULTIPLY BY 8\r
+       ASL                     ;MULLIPLY BY 2\r
+       ROL     Z,TEMP4+1       ;CARRY TO HI BYTE\r
+       ASL                     ;MULTIPLY BY 2\r
+       ROL     Z,TEMP4+1       ;CARRY TO HI BYTE\r
+       STA     Z,TEMP4         ;RESULT IN LO BYTE\r
+       LDA     Z,TEMP2         ;GET HPOS\r
+       SEC\r
+       SBC     I,6             ;SUBTRACT PLAYFIELD-MOTION OFFSET **\r
+       TAX\r
+       AND     I,07            ;H OFFSET WITHIN STAMP TO TEMP2\r
+       STA     Z,TEMP2\r
+       TXA\r
+       LSR                     ;DIVIDE BY 8\r
+       LSR\r
+       LSR\r
+       CLC\r
+       ADC     Z,TEMP4         ;ADD TO LO BYTE\r
+       STA     Z,TEMP4\r
+       LDA     I,8\r
+       ADC     Z,TEMP4+1       ;800+CARRY FROM LO BYTE + PREVIOUS\r
+       STA     Z,TEMP4+1\r
+       LDY     Z,TEMP1         ;USE Y FOR SUB #\r
+       LDX     I,0\r
+       LDA     NX,TEMP4        ;GET PLAYFIELD STAMP\r
+       AND     I,3F            ;STRIP OFF SCREEN BITS\r
+       CMP     I,1B            ;IF BLANK OR LETTER,\r
+       BCC     CKOK            ;NO COLLISIONS\r
+                               ;NORMALIZE PICTURE NUMBER\r
+       SBC     I,1B\r
+       TAX                     ;PICTURE NUMBER INDEX TO X\r
+       LDA     AX,HBOUND       ;GET HORIZ BOUNDARIES\r
+       LSR\r
+       LSR                     ;GET TOP BOUNDARY\r
+       LSR\r
+       LSR\r
+       CMP     Z,TEMP2+1       ;COMPARE TO VERT DISPLACEMENT\r
+       BEQ     10$\r
+       BCS     CKOK            ;NO COLLISION\r
+10$:   LDA     AX,HBOUND       ;TRY BOTTOM BOUNDARY\r
+       AND     I,0F\r
+       CMP     Z,TEMP2+1\r
+       BCC     CKOK            ;NO COLLISION\r
+       LDA     AX,VBOUND       ;TRY LEFT BOUNDARY\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CMP     Z,TEMP2\r
+       BEQ     20$\r
+       BCS     CKOK            ;NO COLLISION\r
+20$:   LDA     AX,VBOUND       ;TRY RIGHT BOUNDARY\r
+       AND     I,0F\r
+       CMP     Z,TEMP2\r
+       BCC     CKOK            ;NO COLLISION\r
+       SEC                     ;COLLISION-SET CARRY FLAG\r
+       RTS\r
+CKOK:  CLC                     ;NO COLLISION-CLEAR CARRY FLAG\r
+       RTS\r
+\f      .SBTTL  RANDOM POSITION ROUTINE\r
+;\r
+;*RANDOM POSITION ROUTINE\r
+;\r
+;      THIS ROUTINE GENERATES A RANDOM HPOST,VPOST,\r
+;      AND ROTATION FOR ONE SUB (SUB # IN X REG.)\r
+;\r
+RANDOM:        LDA     Z,FRAME         ;GET RANDOM ROTATION\r
+       AND     I,0F8\r
+       CMP     I,0C0           ;MAX IS C0\r
+       BCC     10$             ;ALREADY LESS THAN C0\r
+       AND     I,78            ;MAKE IT LESS THAN C0\r
+10$:   STA     ZX,ROTATE\r
+       STA     ZX,ROTEMP\r
+       LDA     Z,FRAME         ;GET RANDOM HPOS\r
+       CMP     I,0D8           ;SEE IF WITHIN BOUNDARIES\r
+       BCC     11$\r
+       SEC                     ;IF NOT, MAKE IT WITHIN BOUNDARY\r
+       SBC     I,28\r
+11$:   CMP     I,38\r
+       BCS     12$\r
+       CLC\r
+       ADC     I,38\r
+12$:   STA     ZX,HPOST\r
+       ROL                     ;DO SAME FOR VPOST\r
+       ROL\r
+       ROL\r
+       ROL\r
+       CMP     I,0C8\r
+       BCC     13$\r
+       SEC\r
+       SBC     I,38\r
+13$:   CMP     I,28\r
+       BCS     14$\r
+       CLC\r
+       ADC     I,28\r
+14$:   STA     ZX,VPOST\r
+       CMP     I,70            ;CHECK 1ST ISLAND BOUNDARIES\r
+       BCS     ROK\r
+       CMP     I,28\r
+       BCC     ROK\r
+       LDA     ZX,HPOST\r
+       CMP     I,7A\r
+       BCS     ROK\r
+       CMP     I,43\r
+       BCC     ROK\r
+       ADC     I,50\r
+       STA     ZX,HPOST\r
+ROK:   LDA     ZX,VPOST        ;CHECK 2ND ISLAND BOUNDARIES\r
+       CMP     I,0BC\r
+       BCS     RDONE\r
+       CMP     I,79\r
+       BCC     RDONE\r
+       LDA     ZX,HPOST\r
+       CMP     I,0C4\r
+       BCS     RDONE\r
+       CMP     I,8B\r
+       BCC     RDONE\r
+       SBC     I,50\r
+       STA     ZX,HPOST\r
+RDONE: STX     Z,TEMP4         ;SAVE X\r
+       JSR     A,SUBCOL        ;MAKE SURE NO MOTION COLLISIONS\r
+       LDX     Z,TEMP4\r
+       LDA     ZX,STAT\r
+       AND     I,0F7           ;CLEAR PFLD COLLISION FLAG\r
+       STA     ZX,STAT\r
+       AND     I,6\r
+       BEQ     30$\r
+       LDA     Z,FRAME\r
+       CLC\r
+       ADC     I,10\r
+       STA     Z,FRAME\r
+       JMP     A,RANDOM\r
+30$:   RTS\r
+       .PAGE\r
+       .SBTTL  MOTION OBJECT OUTPUT ROUTINE\r
+;*MOTION OBJECT OUTPUT ROUTINE\r
+;\r
+;OUTPUT ONE MOTION OBJECT\r
+;\r
+TRAN1:  LDA    AY,HPOST\r
+       STA     ZX,HPOS\r
+       LDA     AY,VPOST\r
+       STA     ZX,VPOS\r
+       RTS\r
+;\r
+;OUTPUT ALL MOTION OBJECTS\r
+;\r
+TRANS: LDY     I,0A            ;A AND 6 ARE MUXED ON 6\r
+       LDA     Z,FRAME         ;8 AND 4 ARE MUXED ON 4\r
+       ROR\r
+       BCC     10$\r
+       LDY     I,6\r
+10$:   LDX     I,6\r
+       JSR     TRAN1\r
+       LDA     AY,ROTEMP\r
+       STA     ZX,ROTATE\r
+       DEY\r
+       DEY\r
+       LDX     I,4\r
+       JSR     TRAN1\r
+       LDA     AY,ROTEMP\r
+       STA     ZX,ROTATE\r
+       LDX     I,2             ;DO SUBS NOW\r
+       LDY     I,2\r
+       JSR     TRAN1\r
+       LDX     I,0\r
+       LDY     I,0\r
+       JSR     TRAN1\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  INITIALIZATION ROUTINE\r
+;\r
+;*INITIALIZE SUBS TO STARTING POINT\r
+;\r
+INITIL:        LDX     I,10.\r
+30$:   LDA     I,BLANK         ;BLANK TORPS\r
+       STA     ZX,ROTEMP\r
+       LDA     I,0\r
+       STA     ZX,STAT         ;CLEAR TORP STAT\r
+       DEX\r
+       DEX\r
+       CPX     I,2\r
+       BNE     30$\r
+       LDX     I,2\r
+10$:   JSR     A,RANDOM        ;GET RANDOM POSITION\r
+       LDA     Z,FRAME\r
+       CLC\r
+       ADC     I,20\r
+       STA     Z,FRAME\r
+       LDA     ZX,STAT         ;CLEAR COLLISION STATUS\r
+       AND     I,0F1\r
+       STA     ZX,STAT\r
+       DEX\r
+       DEX\r
+       BPL     10$\r
+       LDA     I,0             ;INITIALIZE SOUNDS\r
+       STA     Z,SOUNDS\r
+       STA     A,XPLCNTR\r
+       STA     A,MISSCNTR\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  PLAYFIELD OUTPUT ROUTINES\r
+;\r
+;*PLAYFIELD OUTPUT ROUTINE (ISLANDS, ALPHAS)\r
+;\r
+PFOUT: LDA     A,RSTCNTR\r
+       PHA\r
+       JSR     A,CLRSCRN\r
+       PLA\r
+       STA     A,RSTCNTR\r
+;OUTPUT "YOUR SCORE" AND "ENEMY SCORE" IN CORRECT LANGUAGE\r
+       JSR     A,GTLNGX        ;GET LANG. INDEX IN X\r
+       LDA     AX,YRSCR\r
+       STA     Z,TEMP2\r
+       LDA     AX,YRSCR+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,31.           ;32 BYTES LONG\r
+20$:   LDA     NY,TEMP2\r
+       ORA     I,0C0           ;MAKE VISIBLE\r
+       STA     AY,PF\r
+       DEY\r
+       BPL     20$\r
+;OUTPUT ISLANDS, PART OF BOUNDARY AND "TIME"\r
+PO1:\r
+       LDX     I,117.          ;COUNTER FOR ADDRESS TABLE\r
+10$:   TXA\r
+       LSR\r
+       TAY                     ;COUNTER FOR DATA TABLE\r
+       LDA     AX,PFADR\r
+       STA     Z,TEMP1+1\r
+       DEX\r
+       LDA     AX,PFADR\r
+       STA     Z,TEMP1\r
+       LDA     AY,PFTABL\r
+                               ;***\r
+                               ;*ORA I,0C0 -- 09 C0\r
+                               ;* FOR DEBUGGING\r
+                               ;***\r
+       LDY     I,0\r
+       STA     NY,TEMP1\r
+       DEX\r
+       BPL     10$\r
+;OUTPUT THE REST OF THE BOUNDARY\r
+       LDY     I,29.           ;30 BLOCKS PER AREA\r
+       LDA     I,1B            ;* CHANGE TO DB FOR VISIBLE\r
+20$:   LDX     AY,PF1          ;GET ADDRESS IN FIRST AREA\r
+       STA     AX,PF           ;PUT THE BLOCK THERE\r
+       LDX     AY,PF2          ;ETC. FOR REST OF AREAS\r
+       STA     AX,PF+80\r
+       LDX     AY,PF3\r
+       STA     AX,PF+200\r
+       LDX     AY,PF4\r
+       STA     AX,PF+300\r
+       DEY\r
+       BPL     20$\r
+       RTS\r
+;*SCORE OUTPUT ROUTINE\r
+;\r
+;BIT 7=SCREEN 1        BIT 6=SCREEN 2\r
+;\r
+SCROUT:\r
+       LDA     Z,SCORED        ;GET HIGH BYTE OF PLAYER 0 SCORE\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA     I,70            ;MAKE IT VISIBLE ON HIS SCREEN\r
+       STA     A,SCRAD1        ;STORE IT IN FIRST SPOT\r
+       AND     I,3F            ;MAKE IT VISIBLE ON OTHER SCREEN\r
+       ORA     I,80\r
+       STA     A,SCRAD2+2      ;STORE IT IN 4TH SPOT\r
+       LDA     A,SCORED        ;GET LOW BYTE & REPEAT\r
+       AND     I,0F\r
+       ORA     I,70\r
+       STA     A,SCRAD1+1\r
+       AND     I,3F\r
+       ORA     I,80\r
+       STA     A,SCRAD2+3\r
+       LDA     Z,SCORED+2      ;NOW DO IT FOR PLAYER 2\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA     I,70\r
+       STA     A,SCRAD2        ;3RD SPOT\r
+       AND     I,3F\r
+       ORA     I,80\r
+       STA     A,SCRAD1+2      ;2ND SPOT\r
+       LDA     Z,SCORED+2\r
+       AND     I,0F\r
+       ORA     I,70\r
+       STA     A,SCRAD2+1\r
+       AND     I,3F\r
+       ORA     I,80\r
+       STA     A,SCRAD1+3\r
+;TIME OUTPUT\r
+       LDA     Z,GTIME+1\r
+       JSR     A,UNPACK\r
+       STX     A,TIMADR+4\r
+       STA     A,TIMADR+3\r
+       LDA     Z,GTIME+2\r
+       JSR     A,UNPACK\r
+       STX     A,TIMADR+1\r
+       CMP     I,0F0           ;SUPRESS LEADING ZERO\r
+       BNE     10$\r
+       LDA     I,0\r
+10$:   STA     A,TIMADR\r
+       LDA     I,0EC           ;COLON\r
+       STA     A,TIMADR+2\r
+       LDX     I,4\r
+       LDA     Z,GTIME+2       ;15 SECONDS LEFT?\r
+       BNE     20$             ;NO\r
+       LDA     Z,GTIME+1\r
+       BEQ     20$             ;NO\r
+       CMP     I,16\r
+       BCS     20$             ;NO\r
+       LDA     Z,OPTSW2        ;FREE PLAY?\r
+       ROR\r
+       BCS     20$             ;YES\r
+       LDA     Z,OPTSW4        ;NO\r
+       AND     I,2             ;TIME MODE?\r
+       BNE     20$             ;NO\r
+       LDA     Z,FRAME         ;YES-FLASH "TIME"\r
+       AND     I,10\r
+       BEQ     20$\r
+15$:   LDA     AX,0B44         ;OFF THIS FRAME\r
+       AND     I,3F\r
+       STA     AX,0B44\r
+       LDA     AX,0B64\r
+       AND     I,3F\r
+       STA     AX,0B64\r
+       DEX\r
+       BPL     15$\r
+       BMI     30$\r
+20$:   LDA     AX,0B44         ;ON THIS FRAME\r
+       ORA     I,0C0\r
+       STA     AX,0B44\r
+       LDA     AX,0B64\r
+       ORA     I,0C0\r
+       STA     AX,0B64\r
+       DEX\r
+       BPL     20$\r
+30$:   RTS\r
+;\r
+;*UNPACK ROUTINE\r
+;\r
+;      THIS ROUTINE BREAKS A BYTE (IN ACC) INTO\r
+;      TWO NIBBLES, MAKES IT VISIBLE ON BOTH SCREENS,\r
+;      AND MAKES IT AN ASCII NUMBER. THE HIGH NIBBLE\r
+;      IS RETURNED IN THE ACC AND THE LOW NIBBLE IN X.\r
+;\r
+UNPACK:\r
+       TAY                     ;SAVE A\r
+       ORA     I,0F0           ;BIT 7,6=SCREEN\r
+                               ;BIT 5,4=ASCII\r
+       TAX                     ;LOW NIBBLE IN X\r
+       TYA                     ;RESTORE A\r
+       LSR                     ;GET HIGH NIBBLE\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA     I,0F0           ;MAKE VISIBLE\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  BACKLIGHT "SONAR" ROUTINE\r
+;\r
+;*HIGHLIGHT THE WORD "SONAR" ON THE OVERLAY. (LIGHT IT IN THE CORRECT\r
+; PLACE ON THE CORRECT SCREEN)\r
+;\r
+BAKLIT:\r
+       LDX     I,4\r
+       LDA     Z,FRAME         ;ON THIS FRAME?\r
+       AND     I,18\r
+       BEQ     20$             ;NO\r
+10$:   LDA     I,9B            ;YES-BIT 7=PLAYER 2\r
+       STA     AX,0AC0\r
+       LDA     I,5B            ;BIT 6=PLAYER 0\r
+       STA     AX,0ADB\r
+       LDA     I,5B            ;*6B FOR SMALLER BLOCK WON'T WORK!\r
+       STA     AX,0ABB\r
+       LDA     I,9B            ;*AB WON'T WORK!\r
+       STA     AX,0AA0\r
+       DEX\r
+       BPL     10$\r
+       BMI     40$\r
+20$:   LDA     I,1B            ;OFF THIS FRAME\r
+30$:   STA     AX,0AC0\r
+       STA     AX,0ADB\r
+       STA     AX,0AA0\r
+       STA     AX,0ABB\r
+       DEX\r
+       BPL     30$\r
+40$:   RTS\r
+\f      .SBTTL  MOTION COLLISION DETECTION\r
+;*MOTION OBJECT COLLISON ROUTINE\r
+;\r
+;REGISTERS:\r
+;\r
+;USED:         A,X,Y   RESTORED:       X\r
+;\r
+;STACK USE:    NONE\r
+;\r
+;BASE PAGE USED:\r
+;              HPOST,VPOST\r
+;\r
+;BASE PAGE ALTERED:\r
+;              STAT,TEMP1\r
+;\r
+;SUBROUTINES CALLED:\r
+;              NONE\r
+;\r
+;DESCRIPTION:\r
+;              THIS ROUTINE CHECKS FOR A COLLISION BETWEEN ALL MOTION\r
+;              OBJECT.\r
+;              STATUS BIT 1 IS SET IF COLLIDING WITH A SUB, BIT 2 IF\r
+;              COLLIDING WITH A TORPEDO.\r
+;\r
+SUBCOL:        LDX     I,0A            ;CLEAR COLLISION STATUS\r
+10$:   LDA     ZX,STAT\r
+       AND     I,0F9\r
+       STA     ZX,STAT\r
+       DEX\r
+       DEX\r
+       BPL     10$\r
+;\r
+;TEST SUB-SUB COLLISION\r
+;\r
+SS1:   LDX     I,2\r
+       LDY     I,0\r
+;TEST HORIZONTAL\r
+       LDA     ZX,HPOST        ;COMPARE\r
+       SEC\r
+       SBC     AY,HPOST\r
+       BPL     10$\r
+       CMP     I,-8\r
+       BCS     SS2             ;X CLOSE, CHECK Y\r
+       BCC     ST1             ;NO COLLISION\r
+10$:   CMP     I,9\r
+       BCS     ST1             ;NO COLLISION\r
+;TEST VERTICAL\r
+SS2:   LDA     ZX,VPOST        ;COMPARE\r
+       SEC\r
+       SBC     AY,VPOST\r
+       BPL     20$\r
+       CMP     I,-8\r
+       BCS     SS3             ;COLLISION\r
+       BCC     ST1             ;NO COLLISION\r
+20$:   CMP     I,9\r
+       BCS     ST1             ;NO COLLISION\r
+;COLLISION-SET FLAGS\r
+SS3:   LDA     ZX,STAT\r
+       ORA     I,2             ;BIT 1=SUB COLLISION\r
+       STA     ZX,STAT\r
+       LDA     AY,STAT\r
+       ORA     I,2\r
+       STA     AY,STAT\r
+       LDA     Z,GSTAT         ;START CRASH SOUND\r
+       ORA     I,1\r
+       STA     Z,GSTAT\r
+;\r
+;TEST SUB-TORP COLLISIONS\r
+;\r
+ST1:\r
+       LDX     I,0A            ;Y=0\r
+       JSR     A,SBTPCOL\r
+       LDX     I,6             ;Y=0\r
+       JSR     A,SBTPCOL\r
+       LDY     I,2\r
+       LDX     I,4\r
+       JSR     A,SBTPCOL\r
+       LDX     I,8             ;Y=2\r
+       JSR     A,SBTPCOL\r
+;\r
+;TEST TORP-TORP COLLISIONS\r
+;\r
+TT1:\r
+       LDY     I,6             ;X=8\r
+       JSR     A,TPTPCOL\r
+       LDY     I,0A            ;X=8\r
+       JSR     A,TPTPCOL\r
+       LDX     I,4             ;Y=A\r
+       JSR     A,TPTPCOL\r
+       LDY     I,6             ;X=4\r
+       JSR     A,TPTPCOL\r
+       RTS\r
+;\r
+;*SUB-TORP COLLISIONS\r
+;\r
+;THIS ROUTINE (ENTERED WITH SUB # IN Y AND TORP # IN X) DETERMINES IF THERE\r
+;IS A COLLISION, SETS THE STATUS FLAGS, STARTS THE EXPLOSION SOUND, STARTS\r
+;THE COLLISION TIMERS AND ADDS TO THE SCORE.  (X AND Y MUST BE RESTORED)\r
+;\r
+;GET FRONT POINT OF TORP\r
+;\r
+SBTPCOL:\r
+       STX     Z,TEMP1+1       ;SAVE X\r
+       STY     Z,TEMP1         ;SAVE Y\r
+       LDA     ZX,ROTEMP       ;IS TORP BLANK OR EXPLODED?\r
+       CMP     I,TPXPL1\r
+       BCC     10$             ;NO\r
+       RTS                     ;YES-IGNORE IT\r
+10$:   LSR                     ;NO-FIND FRONT POINT OF TORP\r
+       LSR\r
+       LSR\r
+       TAY                     ;ROTATION INDEX TO Y\r
+       LDA     AY,TPVOFST\r
+       CLC\r
+       ADC     ZX,VPOST\r
+       STA     Z,TEMP2         ;VPOS OF FRONT POINT OF TORP\r
+       LDA     AY,TPHOFST\r
+       CLC\r
+       ADC     ZX,HPOST\r
+       STA     Z,TEMP2+1       ;HPOS OF FRONT POINT OF TORP\r
+       JSR     A,STCK          ;CHECK FOR COLLISION WITH FRONT\r
+       BCC     STYES           ;CARRY CLEAR-COLLISION!!\r
+       LDX     Z,TEMP1+1       ;CARRY SET-NO COLLISION\r
+       LDA     ZX,ROTEMP       ;TRY FOR BACK POINT NOW\r
+       LSR\r
+       LSR\r
+       LSR\r
+       TAY\r
+       SEC                     ;NEGATE THE OFFSET\r
+       LDA     I,0\r
+       SBC     AY,TPVOFST\r
+       CLC\r
+       ADC     ZX,VPOST\r
+       STA     Z,TEMP2\r
+       SEC\r
+       LDA     I,0\r
+       SBC     AY,TPHOFST\r
+       CLC\r
+       ADC     ZX,HPOST\r
+       STA     Z,TEMP2+1\r
+       JSR     A,STCK\r
+       BCC     STYES           ;CARRY CLEAR-COLLISIONS!!\r
+STNO:  LDX     Z,TEMP1+1       ;NO COLLISIN--RESTORE X\r
+       LDY     Z,TEMP1         ;RESTORE Y\r
+       RTS\r
+STYES:                         ;COLLISION!\r
+       LDX     Z,TEMP1+1       ;RESTORE X AND Y\r
+       LDY     Z,TEMP1\r
+       LDA     ZX,STAT         ;SET SUB FLAG IN TORP STAT\r
+       ORA     I,2\r
+       STA     ZX,STAT\r
+       LDA     AY,STAT         ;SET TORP FLAG IN SUB STAT\r
+       ORA     I,4\r
+       STA     AY,STAT\r
+       LDA     I,3F            ;START EXPLOSION SOUND\r
+       STA     A,XPLCNTR\r
+       LDA     Z,CNTDWN        ;FREEZE--SCORE!\r
+       BNE     STSCR\r
+       LDA     Z,GSTAT\r
+       BPL     STNSCR          ;ATTRACT--NO SCORE (AHHHHHHH) - CUTE, REAL CUTE JOHN\r
+STSCR: SED                     ;ADD 1 TO OTHER SUB'S SCORE\r
+       LDA     I,1\r
+       CPY     I,2             ;IS THIS SUB 2?\r
+       CLC\r
+       BEQ     10$             ;YA SURE - ADD TO SUB 0\r
+       ADC     Z,SCORED+2      ;NO ADD TO SUB 2\r
+       STA     Z,SCORED+2\r
+       BNE     20$             ;BRA\r
+10$:   ADC     Z,SCORED        ;ADD 1 TO SUB 0\r
+       STA     Z,SCORED\r
+20$:   CLD\r
+STNSCR:        LDA     I,20            ;SET COLLISION TIMERS\r
+       STA     AY,TIM\r
+       STA     ZX,TIM\r
+       RTS\r
+;\r
+;*SUB-TORP COLLISION CHECK\r
+;\r
+;THIS ROUTINE TAKES THE POINT OF THE TORP IN TEMP2 AND TEMP2+1 AND\r
+;CLEARS THE CARRY IF IT IS IN COLLISION WITH THE SUB.  CARRY IS SET\r
+;IF NO COLLISION.\r
+;\r
+STCK:  LDX     Z,TEMP1         ;PUT SUB # IN X\r
+       LDA     ZX,ROTEMP\r
+       LSR\r
+       LSR\r
+       LSR\r
+       TAY                     ;ROTATION INDEX TO Y\r
+STCOL1:\r
+       LDA     ZX,HPOST        ;SUB HPOS\r
+       SEC\r
+       SBC     Z,TEMP2+1       ;MINUS TORP HPOS\r
+       BCS     20$             ;NO-BORROW\r
+       EOR     I,0FF           ;BORROW-NEGATE IT\r
+       ADC     I,1\r
+20$:   CMP     AY,SBHOFST      ;POSITIVE-CLOSE ENOUGH?\r
+       BCS     STEXIT          ;NO\r
+       LDA     ZX,VPOST        ;YES-TRY VERT\r
+       SEC\r
+       SBC     Z,TEMP2\r
+       BCS     30$\r
+       EOR     I,0FF\r
+       ADC     I,1\r
+30$:   CMP     AY,SBVOFST\r
+STEXIT:        RTS                     ;COLLISION!!!!!!!!\r
+;\r
+;*TORP-TORP COLLISIONS\r
+;\r
+;THIS ROUTINE (ENTERED WITH THE TORP NUMBERS IN X AND Y) DETERMINES IF THERE\r
+;IS A COLLISION, SETS THE STATUS FLAGS, STARTS THE "MISS" SOUND AND STARTS\r
+;THE TIMERS.  (X AND Y MUST BE RESTORED).\r
+;\r
+TPTPCOL:\r
+       LDA     I,TPXPL1-1      ;IS EITHER TORP BLANK OR EXPLODED?\r
+       CMP     ZX,ROTEMP\r
+       BCC     10$             ;YES\r
+       CMP     AY,ROTEMP\r
+       BCS     20$             ;NO\r
+10$:   RTS                     ;YES\r
+20$:   LDA     ZX,HPOST        ;NO--COMPARE H\r
+       SEC\r
+       SBC     AY,HPOST\r
+       BPL     25$\r
+       CMP     I,-4\r
+       BCS     30$             ;H CLOSE, CHECK V\r
+       BCC     10$             ;NO COLLISION\r
+25$:   CMP     I,5\r
+       BCS     10$             ;NO COLLISION\r
+30$:   LDA     ZX,VPOST        ;COMPARE\r
+       SEC\r
+       SBC     AY,VPOST\r
+       BPL     40$\r
+       CMP     I,-4\r
+       BCS     TTCOL1          ;COLLISION!\r
+       BCC     10$             ;NO COLLISION\r
+40$:   CMP     I,5\r
+       BCS     10$             ;NO COLLISION\r
+;COLLISION--SET FLAGS, ETC.\r
+TTCOL1:\r
+       LDA     ZX,STAT         ;SET TORP FLAG IN BOTH\r
+       ORA     I,4             ;STATUS WORDS\r
+       STA     ZX,STAT\r
+       LDA     AY,STAT\r
+       ORA     I,4\r
+       STA     AY,STAT\r
+       LDA     I,MISSMAX       ;START "MISS" SOUND\r
+       STA     A,MISSCNTR\r
+       LDA     I,20            ;START TIMERS\r
+       STA     AY,TIM\r
+       STA     ZX,TIM\r
+       RTS\r
+;\r
+;*TORP OFFSET TABLES\r
+;\r
+;THESE TABLES GIVE THE VERTICAL AND HORIZONTAL OFFSETS FROM THE CENTER OF\r
+;THE TORP TO THE FRONT END.\r
+;\r
+TPVOFST:                       ;VERTICAL\r
+       .BYTE   -2,-2,-2,-2,-1,-1\r
+       .BYTE   0,1,1,2,2,2\r
+       .BYTE   2,2,2,2,1,1\r
+       .BYTE   0,-1,-1,-2,-2,-2\r
+TPHOFST:                       ;HORIZONTAL\r
+       .BYTE   0,1,1,2,2,2\r
+       .BYTE   2,2,2,2,1,1\r
+       .BYTE   0,-1,-1,-2,-2,-2\r
+       .BYTE   -2,-2,-2,-2,-1,-1\r
+;\r
+;*SUB OFFSET TABLES\r
+;\r
+;THESE TABLES GIVE THE VERTICAL AND HORIZONTAL OFFSETS TO A RECTANGLE\r
+;CONSTRUCTED AROUND THE SUB.\r
+;\r
+SBVOFST:                       ;VERTICAL\r
+       .BYTE   8,8,8,7,5,5\r
+       .BYTE   3,5,6,6,7,8\r
+       .BYTE   8,8,7,6,6,5\r
+       .BYTE   3,4,5,7,8,8\r
+SBHOFST:                       ;HORIZONTAL\r
+       .BYTE   3,4,5,7,8,8\r
+       .BYTE   8,8,8,7,5,4\r
+       .BYTE   3,5,6,6,7,8\r
+       .BYTE   8,8,7,6,6,5\r
+       .SBTTL  CHECKSUM 6\r
+       .BYTE CKSM6\r
+       .BYTE   0,0,0,0,0,0     ;SPARE\r
+       .PAGE\r
+       .SBTTL  SOUND, COUNTER UPDATE ROUTINES\r
+;\r
+;*SOUND UPDATE ROUTINE\r
+;\r
+;THIS ROUTINE IS ACCESSED FROM BOTH THE\r
+;ATTRACT MODE AND THE PLAY MODE.\r
+;\r
+NOISES:\r
+       STA     Z,WDOG\r
+       LDA     Z,CNTDWN        ;SOUNDS DURING FREEZE\r
+       BNE     5$\r
+       LDA     Z,GSTAT         ;NO SOUNDS DURING ATTRACT\r
+       BMI     5$\r
+       JMP     DC1\r
+5$:    LDA     Z,FRAME         ;UPDATE LAUNCH SND\r
+       AND     I,03\r
+       BNE     10$\r
+       LDA     Z,SOUNDS\r
+       AND     I,0F\r
+       BEQ     10$\r
+       DEC     Z,SOUNDS\r
+10$:   LDA     A,XPLCNTR       ;UPDATE EXPLOSION COUNTER\r
+       BEQ     40$\r
+       LDA     Z,FRAME\r
+       AND     I,1\r
+       BNE     40$\r
+       DEC     A,XPLCNTR\r
+40$:   LDA     A,MISSCNTR      ;UPDATE MISS COUNTER\r
+       BEQ     N1\r
+       LDA     Z,FRAME\r
+       AND     I,0\r
+       BNE     N1\r
+       DEC     A,MISSCNTR\r
+;\r
+;SET PRIORITIES\r
+;\r
+N1:    LDA     A,XPLCNTR       ;EXPLOSION HAS PRIORITY\r
+       CMP     I,10            ;IF GREATER THAN N\r
+       BCS     40$             ;GREATER - OUTPUT\r
+       LDY     I,0             ;LESS - CHECK OTHERS\r
+       LDA     Z,GSTAT\r
+       BPL     10$\r
+       LDA     Z,CNTDWN\r
+       BNE     10$\r
+       LDA     Z,GSTAT         ;CHECK CRASH FLAG\r
+       ROR\r
+       BCC     10$             ;OFF - Y=0\r
+       LDA     Z,HPOSL         ;GET RANDOM NUMBER TO MAKE\r
+       EOR     Z,VPOSL         ;CRASH SOUND\r
+       EOR     Z,HPOSL+2\r
+       EOR     Z,VPOSL+2\r
+       EOR     Z,FRAME\r
+       EOR     Z,BLPNTR\r
+       EOR     Z,BLPCNT\r
+       EOR     Z,BLPNTR+2\r
+       EOR     Z,BLPCNT+2\r
+       EOR     Z,BLPNUM\r
+       EOR     Z,BLPNUM+2\r
+       ROL                     ;GET LSN IN MSN\r
+       ROL\r
+       ROL\r
+       ROL\r
+       CMP     I,60            ;SEE IF LOUD ENOUGH\r
+       BCS     5$              ;YES\r
+       ADC     I,60            ;NO - INCREASE IT\r
+5$:    TAY                     ;PUT RANDOM IN Y\r
+10$:   LDA     A,MISSCNTR      ;GET MISS SOUND\r
+       ASL\r
+       ASL\r
+       STY     Z,TEMP1         ;SUM WITH CRASH SOUND\r
+       CLC\r
+       ADC     Z,TEMP1\r
+       BCC     20$             ;DON'T OVERFLOW\r
+       LDA     I,0F0\r
+20$:   TAY                     ;CRASH + MISS IN Y\r
+       CMP     I,10            ;IF LOW VOLLUME, ALLOW EXPLOSION\r
+       BCS     30$             ;IS THER IS ONE\r
+       LDA     A,XPLCNTR\r
+       BNE     40$             ;DO EXPLOSION\r
+;OUTPUT MISS AND CRASH\r
+30$:   LDA     I,0             ;KILL QUIET EXPLOSIONS\r
+       STA     A,XPLCNTR\r
+       STA     Z,XPLDOFF       ;EXPLODE OFF\r
+       STA     Z,CRSHON        ;CRASH ON\r
+       TYA                     ;GET CRASH + MISS\r
+       JMP     60$\r
+;\r
+;OUTPUT EXPLOSION\r
+;\r
+40$:   STA     Z,XPLDON        ;EXPLODE ON\r
+       STA     Z,CRSHOFF       ;CRASH OFF\r
+       LDA     A,XPLCNTR\r
+       ASL\r
+       ASL\r
+60$:   AND     I,0F0           ;EXPLODE/CRASH BITS 4-7\r
+       STA     Z,TEMP1\r
+       LDA     Z,SOUNDS\r
+       AND     I,0F\r
+       ORA     Z,TEMP1\r
+       STA     Z,SOUNDS\r
+       LDA     Z,GSTAT         ;CLEAR CRASH FLAG\r
+       AND     I,0FE\r
+       STA     Z,GSTAT\r
+;UPDATE DRONE COUNTERS\r
+DC1:\r
+       LDX     I,2\r
+1$:    LDA     Z,FRAME         ;START WITH MAX. COUNTER\r
+       AND     I,0F            ;UPDATE EVERY N FRAMES\r
+       BNE     10$             ;NOT THIS ONE\r
+       LDA     AX,FIRETIM      ;THIS ONE\r
+       BEQ     10$             ;BUT NOT IF ZERO\r
+       DEC     AX,FIRETIM      ;ELSE DO IT\r
+10$:   LDA     Z,FRAME         ;REPEAT FOR MIN. TIMER\r
+       AND     I,07\r
+       BNE     15$\r
+       LDA     AX,SHOTTIM\r
+       BEQ     15$\r
+       DEC     AX,SHOTTIM\r
+15$:   LDA     Z,FRAME         ;REPEAT FOR\r
+       AND     I,1             ;VALID POSITION TIMERS\r
+       BNE     16$\r
+       LDA     AX,POSTIM\r
+       BEQ     16$\r
+       DEC     AX,POSTIM\r
+16$:   LDA     ZX,STAT         ;ANY COLLISIONS?\r
+       AND     I,0E\r
+       BEQ     17$             ;NO\r
+       LDA     ZX,HPOS         ;YES-KEEP POSITION\r
+       STA     ZX,HPOSLST\r
+       LDA     ZX,VPOS\r
+       STA     ZX,VPOSLST\r
+       LDA     I,3F\r
+       STA     AX,POSTIM       ;SET VALID POS. TIMER\r
+17$:   DEX                     ;DO OTHER DRONE\r
+       DEX\r
+       BPL     1$\r
+;UPDATE RESET COUNTER\r
+       LDA     Z,GSTAT         ;ATTRACT?\r
+       BMI     50$             ;NO-GAME\r
+       LDA     Z,FRAME         ;YES-4 SEC UP?\r
+       BNE     50$             ;NO\r
+       DEC     A,RSTCNTR       ;YES-DEC COUNTER\r
+       BPL     50$             ;2 MIN UP?-NO\r
+       LDA     I,1F            ;YES-RESET COUNTER\r
+       STA     A,RSTCNTR\r
+       JSR     A,INITIL        ;START SUBS\r
+       JSR     A,PFOUT         ;RE-WRITE PFLD\r
+;WAIT FOR VBLANK\r
+50$:   LDA Z,VBLANK\r
+       BMI 50$\r
+       RTS\r
+\f\r
+       .SBTTL  DRONE DIFFICULTY DETERMINATION\r
+;\r
+;*DELTA SCORE ROUTINE\r
+;\r
+;      THIS ROUTINE RETURNS (IN X) A CODE REPRESENTING THE DIFFERENCE IN\r
+;      SCORE BETWEEN A DRONE AND A PLAYER.  (A CONSTANT IS RETURNED FOR\r
+;      2 DRONES. I.E. THE ATTRACT MODE).\r
+;\r
+;      0 - DRONE IS WINNING\r
+;      1 - PLAYER IS 0 OR 1 AHEAD\r
+;      2 - PLAYER IS 2 OR 3 AHEAD\r
+;      3 - PLAYER IS 4 OR 5 AHEAD\r
+;      4 - PLAYER IS 6 OR MORE AHEAD\r
+;      5 - IS 8 OR MORE AHEAD\r
+;\r
+;      ENTERED WITH DRONE # IN Y\r
+;\r
+DLTASCRE:\r
+10$:   LDX     I,0\r
+       LDA     Z,GSTAT         ;ATTRACT MODE?\r
+       BPL     40$             ;YES-RETURN CONSTANT\r
+       LDA     Z,SCORED        ;GAME MODE\r
+       CPY     I,2             ;IS DRONE #2?\r
+       BEQ     20$             ;YES-PLAYER IS #0\r
+       LDA     Z,SCORED+2      ;NO-PLAYER IS #2\r
+20$:   SEC\r
+       SED\r
+       SBC     AY,SCORED       ;PLAYER-DRONE\r
+       CLD\r
+       BCC     60$             ;CARRY CLEAR=BORROW. DRONE IS AHEAD.\r
+       CMP     I,2\r
+       BCC     50$             ;PLAYER IS 0 OR 1 AHEAD\r
+       CMP     I,4\r
+       BCC     40$             ;PLAYER IS 2 OR 3 AHEAD\r
+       CMP     I,6\r
+       BCC     30$             ;PLAYER IS 4 OR 5 AHEAD\r
+       CMP     I,8\r
+       BCC     25$             ;PLAYER IS 6 OR 7 AHEAD\r
+       INX                     ;PLAYER IS 8 OR MORE AHEAD\r
+25$:   INX\r
+30$:   INX\r
+40$:   INX\r
+50$:   INX\r
+60$:   RTS\r
+       .PAGE\r
+       .SBTTL  DISTANCE-TO-DRONE ROUTINE\r
+;\r
+;*DISTANCE SUBROUTINE\r
+;\r
+;      THIS ROUTINE USES HPOS AND VPOS TO GET THE DISTANCE BETWEEN THE SUBS.\r
+;      IT THEN CHECKS DELTASCORE TO DETERMINE IF A SHOT SHOULD BE FIRED.\r
+;      THE CARRY IS SET IF A SHOT SHOULD BE FIRED, CLEARED OTHERWISE.\r
+;\r
+DISTANCE:\r
+       STX     Z,TEMP1         ;SAVE X\r
+       LDA     Z,HPOS          ;GET DELTA H\r
+       SEC\r
+       SBC     Z,HPOS+2\r
+       BCS     10$             ;NO BORROW\r
+       EOR     I,0FF           ;BORROW-COMPLEMENT RESULT\r
+       ADC     I,1             ;TWO'S COMPLEMENT\r
+10$:   CMP     I,80            ;OUT OF RANGE?\r
+       BCS     DDNO            ;YES-DON'T FIRE\r
+       STA     Z,TEMP3+1\r
+       LDA     Z,VPOS          ;NOW REPEAT FOR DELTA V\r
+       SEC\r
+       SBC     Z,VPOS+2\r
+       BCS     20$\r
+       EOR     I,0FF\r
+       ADC     I,1\r
+20$:   CMP     I,80\r
+DDNO:  BCS     DNO             ;OUT OF RANGE - DON'T FIRE\r
+       CLC\r
+       ADC     Z,TEMP3+1       ;NOW WE HAVE (H+V) DIVIDE 2\r
+                               ;(MOST SIGNIFICANT BYTE)\r
+       ROR\r
+       STA     Z,TEMP3\r
+       JSR     A,DLTASCRE      ;GET DELTA SCORE CODE IN X\r
+       LDA     Z,TEMP3\r
+       CMP     I,10            ;IS IT VERY CLOSE?\r
+       BCC     DYES            ;YES-FIRE!!\r
+       CMP     I,18            ;NO-IS IT SORTA CLOSE?\r
+       BCC     30$             ;YES-CHECK SCORE CODE\r
+       CMP     I,20\r
+       BCC     35$\r
+       CMP     I,30            ;ETC.\r
+       BCC     40$\r
+       CMP     I,40\r
+       BCC     50$\r
+       CPX     I,0             ;REALLY FAR AWAY\r
+       BEQ     DYES            ;ONLY IF DRONE IS AHEAD\r
+       BNE     DNO             ;OTHERWISE - DON'T FIRE\r
+30$:   CPX     I,5             ;SORTA CLOSE-CHECK CODE\r
+       BCC     DYES            ;ETC.\r
+       BCS     DNO\r
+35$:   CPX     I,4\r
+       BCC     DYES\r
+       BCS     DNO\r
+40$:   CPX     I,3\r
+       BCC     DYES\r
+       BCS     DNO\r
+50$:   CPX     I,2\r
+       BCC     DYES\r
+DNO:   CLC                     ;DON'T FIRE-CLC\r
+       BCC     DDONE\r
+DYES:  SEC                     ;FIRE!!! - SEC\r
+DDONE: LDX     Z,TEMP1         ;RESTORE X\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  MESSAGE ROUTINE\r
+;\r
+;*MESSAGE OUTPUT AND START BUTTON ROUTINE\r
+;\r
+;      THIS ROUTINE CHECKS FOR START BUTTONS, OUTPUTS\r
+;      MESSAGES, AND HANDLES THE START LAMPS.\r
+;\r
+;\r
+MESSOUT:\r
+       ;CHECK START BUTTONS\r
+       LDX     I,2\r
+10$:   LDA     ZX,STRTSW       ;DOES THIS PLAYER WANT TO START?\r
+       BMI     50$             ;NO\r
+       LDA     Z,CNTDWN        ;YES-IS IT MID-GAME?\r
+       BNE     20$             ;NO\r
+       LDA     Z,GSTAT\r
+       BMI     50$             ;YES-IGNORE\r
+20$:   LDA     Z,OPTSW4        ;NO-CREDIT MODE OR TIME MODE?\r
+       AND     I,2             ;GET D1\r
+       BNE     60$             ;CREDIT MODE\r
+       LDA     Z,GTIME+2       ;TIME MODE-IS THERE TIME?\r
+       BNE     30$             ;YES\r
+       LDA     Z,GTIME+1\r
+       BNE     30$             ;YES\r
+       BEQ     50$             ;NO, BRA--WHAT?? NO BRA?!!! (SHAME ON YOU)\r
+60$:   LDA     ZX,STAT         ;CREDIT MODE-IS HE STARTED?\r
+       BMI     50$             ;YES-IGNORE HIM\r
+       LDA     Z,OPTSW2\r
+       ROR\r
+       BCS     30$\r
+       LDA     Z,$CNCT         ;NO-DOES HE HAVE GOOD CREDIT?\r
+       BEQ     50$             ;NO IGNORE HIM\r
+25$:   DEC     Z,$CNCT         ;YES-TAKE HIS MONEY\r
+30$:   LDA     Z,GSTAT         ;GAME STARTED?\r
+       BMI     40$             ;YES\r
+       ORA     I,0C0           ;NO-START IT\r
+       STA     Z,GSTAT\r
+40$:   LDA     ZX,STAT         ;NO - START HIM\r
+       ORA     I,80\r
+       STA     ZX,STAT\r
+50$:   DEX                     ;DO NEXT PLAYER\r
+       DEX\r
+       BPL     10$\r
+       LDA     Z,STAT          ;BOTH PLAYER IN?\r
+       BPL     MESSMASK        ;NO\r
+       LDA     Z,STAT+2\r
+       BPL     MESSMASK        ;NO\r
+       LDA     I,0             ;YES - KILL COUNTDOWN\r
+       STA     Z,CNTDWN\r
+       .PAGE\r
+;\r
+;NOW GENERATE THE MASK USED TO OUTPUT\r
+;THE MESSAGE. THE MASK WILL BE FROMED IN\r
+;TEMP1 AS FOLLOWS:\r
+;\r
+;      D7 - COIN MESSAGE - PLAYER 2\r
+;      D6 -              - PLAYER 0\r
+;      D5 - PRESS START  - PLAYER 2\r
+;      D4 -              - PLAYER 0\r
+;      D3 - BATTLE STATIONS - PLAYER 2\r
+;      D2 -                 - PLAYER 0\r
+;      D1 - INSERT COIN - PLAYER 2\r
+;      D0 -             - PLAYER 0\r
+;\r
+MESSMASK:\r
+       LDA     Z,FRAME         ;TO SAVE TIME\r
+       AND     I,0F\r
+       BEQ     2$\r
+       RTS\r
+2$:    STA     Z,LMPOFF        ;START LAMPS OFF\r
+       STA     Z,LMPOFF+2\r
+       LDA     I,0\r
+       STA     Z,TEMP1         ;CLEAR MASK\r
+1$:    BIT     Z,GSTAT         ;ATTRACT MODE?\r
+       BPL     5$              ;YES\r
+       LDA     Z,CNTDWN        ;NO-FREEZE MODE?\r
+       BEQ     MM1             ;NO-NO MESSAGES\r
+5$:    LDA     Z,OPTSW2        ;FREE PLAY MODE?\r
+       ROR                     ;GET BIT 0\r
+       BCS     MM2             ;YES-TREAT MESSAGES LIKE TIME\r
+       LDA     Z,OPTSW4        ;TIME MODE OR CREDIT MODE?\r
+       AND     I,2             ;GET D1\r
+       BNE     MM3             ;CREDIT MODE\r
+MM2:                           ;ATTRACT OR FREEZE MODE\r
+       LDA     Z,TEMP1\r
+       ORA     I,0C0           ;ENABLE COIN MESSAGE ON BOTH SCREENS\r
+       STA     Z,TEMP1\r
+       LDA     Z,FRAME         ;IS FALSH ON THIS FRAME?\r
+       AND     I,10\r
+       BEQ     60$             ;NO\r
+       LDA     Z,GTIME+2       ;YES - IS THERE TIME?\r
+       BNE     10$             ;YES\r
+       LDA     Z,GTIME+1\r
+       BEQ     MM1             ;NO\r
+10$:   LDA     Z,TEMP1         ;YES\r
+       BIT     Z,STAT          ;IS #0 A PLAYER?\r
+       BPL     20$             ;NO\r
+       ORA     I,4             ;YES - SAY "BATTLE STATIONS"\r
+       BNE     30$             ;BRA\r
+20$:   ORA     I,10            ;SAY "PRESS START"\r
+30$:   BIT     Z,STAT+2        ;SAME FOR #2\r
+       BPL     40$\r
+       ORA     I,8\r
+       BNE     50$\r
+40$:   ORA     I,20\r
+50$:   STA     Z,TEMP1\r
+60$:   LDA     Z,OPTSW2        ;IS IT FREE PLAY?\r
+       ROR\r
+       BCC     MM4             ;NO\r
+MM1:   JMP     MESSGEN         ;YES\r
+MM4:   LDA     Z,TEMP1         ;NO-PUT UP "INSERT COINS"\r
+       ORA     I,3\r
+       STA     Z,TEMP1\r
+       BNE     MESSGEN         ;BRA\r
+MM3:                           ;CREDIT MODE\r
+       LDA     Z,$CNCT         ;DOES HE HAVE CREDIT?\r
+       BNE     5$              ;YES, PUT OUT MESSAGE\r
+       LDA     Z,GSTAT         ;NO, IN FREEZE?\r
+       BPL     10$             ;NO, DON'T PUT IT OUT\r
+5$:    LDA     Z,TEMP1         ;YES, PROMPT NON-PLAYER\r
+       BIT     Z,STAT          ;IS HE A PLAYER YET?\r
+       BMI     20$             ;YES-DON'T BOTHER HIM\r
+       ORA     I,40            ;NO-BUG HIM\r
+20$:   BIT     Z,STAT+2        ;SAME FOR PLAYER #2\r
+       BMI     30$\r
+       ORA     I,80\r
+30$:   STA     Z,TEMP1\r
+10$:   LDA     Z,$CNCT         ;2 OR MORE CREDITS?\r
+       CMP     I,2\r
+       BCS     40$             ;YES-DON'T PUT "INSERT COINS"\r
+       CMP     I,1             ;1 CREDIT?\r
+       BNE     15$             ;NO\r
+       LDA     Z,GSTAT         ;YES, GAME STARTED?\r
+       BMI     40$             ;YES, DON'T SAY "INSERT"\r
+15$:   LDA     Z,TEMP1         ;NO-PUT "INSERT COINS"\r
+       BIT     Z,STAT          ;DON'T BUG IF HE IS A PLAYER\r
+       BMI     50$\r
+       ORA     I,1\r
+50$:   BIT     Z,STAT+2        ;SAME FOR #2\r
+       BMI     60$\r
+       ORA     I,2\r
+60$:   STA     Z,TEMP1\r
+40$:   LDA     Z,FRAME         ;FLASH REST\r
+       AND     I,10\r
+       BEQ     MESSGEN\r
+       LDA     Z,TEMP1         ;YES-IS HE A PLAYER?\r
+       BIT     Z,STAT\r
+       BPL     70$             ;NO\r
+       ORA     I,4             ;YES-PUT UP "BATTLE STATIONS"\r
+70$:   BIT     Z,STAT+2        ;SAME FOR #2\r
+       BPL     80$\r
+       ORA     I,8\r
+80$:   STA     Z,TEMP1\r
+       LDA     Z,$CNCT         ;NOW "PRESS START" -- IS THERE CREDIT?\r
+       BEQ     MESSGEN         ;NO-DON'T PUT IT OUT\r
+       LDA     Z,TEMP1         ;YES-BUT ONLY PUT OUT IF NOT A PLAYER\r
+       BIT     Z,STAT\r
+       BMI     90$\r
+       ORA     I,10\r
+90$:   BIT     Z,STAT+2\r
+       BMI     100$\r
+       ORA     I,20\r
+100$:  STA     Z,TEMP1\r
+       .PAGE\r
+;\r
+;NOW GENERATE THE MESSAGE USING THE MESSAGE MASK\r
+;(TEMPS1). PUT IT OUT IN THE CORRECT LANGUAGE.\r
+;HANDLE THE START LAMPS TOO.\r
+;\r
+MESSGEN:                       ;FIRST DO THE COIN MODE\r
+1$:    LDA     Z,TEMP1         ;GET COIN MODE MESSAGE MASK\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1       ;STORE IN TEMP1+1\r
+       JSR     A,GTLNGX        ;GET LANG. INDEX IN X\r
+       LDA     Z,OPTSW2        ;IS IT FREE PLAY MODE?\r
+       ROR\r
+       BCC     2$              ;NO\r
+       JMP     A,MG2           ;YES\r
+2$:    LDA     Z,OPTSW4\r
+       AND     I,2\r
+       BNE     MG4             ;CREDIT MODE\r
+       JSR     A,GTCNMD        ;NO - GET COIN MODE INDEX (IN X)\r
+       LDA     AX,COINMODE     ;GET COIN MODE LS DIGIT\r
+       AND     I,0F\r
+       ORA     I,30\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09CC\r
+       LDA     AX,COINMODE     ;GET COIN MODE MIDDLE DIGIT\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA     I,30\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09CB\r
+       LDA     I,2C            ;PUT OUT COLON\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09CA\r
+       LDA     AX,COINMODE+1   ;GET COIN MODE MS DIGIT\r
+       ORA     I,30\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09C9\r
+       LDA     I,0\r
+       STA     A,09CD\r
+;PUT OUT "PER COIN" IN CORRECT LANGUAGE\r
+       JSR     A,GTLNGX        ;GET LAN. INDEX IN X\r
+       LDA     AX,PRCOIN       ;GET LOW ADDRESS\r
+       STA     Z,TEMP2         ;PUT IN TEMP 2\r
+       LDA     AX,PRCOIN+1     ;HIGH ADDRESS\r
+       STA     Z,TEMP2+1       ;TO TEMP2 + 1\r
+       LDY     I,9             ;MESSAGE LENGTH = 10\r
+10$:   LDA     NY,TEMP2        ;GET ACTUAL LETTER\r
+       AND     I,3F            ;STRIP OFF SCREEN BITS\r
+       ORA     Z,TEMP1+1       ;PUT ON ACTUAL SCREEN BITS\r
+       STA     AY,09CE         ;PUT IT ON THE SCREEN\r
+       DEY\r
+       BPL     10$\r
+       BMI     MG2             ;BRA - SKIP OTHER MESSAGE\r
+MG4:\r
+       LDA     AX,YUHAV\r
+       STA     Z,TEMP2\r
+       LDA     AX,YUHAV+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,18.           ;MESSAGE LENGTH=19\r
+5$:    TYA                     ;IS THIS THE SPOT WHERE THE\r
+       CMP     AX,CRDADR       ;NUMBER OF CREDITS GOES?\r
+       BNE     6$              ;NO\r
+       DEY                     ;YES, DON'T OUTPUT A BLANK\r
+6$:    CMP     I,17.           ;NO, IS IT THE "S" IN CREDITS?\r
+       BNE     10$             ;NO\r
+       CPX     I,0             ;YES, ENGLISH?\r
+       BNE     10$             ;NO\r
+       LDA     Z,$CNCT         ;YES, 1 CREDIT?\r
+       CMP     I,1\r
+       BNE     10$             ;NO\r
+       STA     AY,09C7         ;YES, BLANK THE "S" IN CREDITS\r
+       DEY                     ;DON'T PUT THE "S" OUT\r
+10$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,09C7\r
+       DEY\r
+       BPL     5$\r
+       LDY     AX,CRDADR       ;GET OFFSET FOR CREDIT DIGIT\r
+       LDA     I,4             ;OVER 4 CREDITS, PUT OUT "4"\r
+       CMP     Z,$CNCT\r
+       BCC     20$\r
+       LDA     Z,$CNCT         ;UNDER 4, PUT OUT NUMBER\r
+20$:   ORA     I,30            ;MAKE VISIBLE\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,09C7\r
+;NOW DO THE "PRESS START" MESSAGE\r
+;(ALSO DO THE START LAMPS)\r
+;(PRESS START MASK IS IN BITS 5 AND 4 OF TEMP1)\r\r
+;\r
+MG2:\r
+       LDA     Z,TEMP1         ;GET "PRESS START" MASK IN\r
+       ASL                     ;BITS 7 AND 6 OF TEMP1+1\r
+       ASL\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       ;DO START LAMPS -- IF PRESS START IS ON, START\r
+       ;LAMP SHOULD ALSO BE ON\r
+       BPL     10$             ;PLAYER 2 OFF\r
+       STA     Z,LMPON+2       ;PLAYER 2 ON\r
+10$:   BIT     Z,TEMP1+1       ;CHECK PLAYER 0\r
+       BVC     20$             ;PLAYER 0 OFF\r
+       STA     Z,LMPON         ;PLAYER 0 ON\r
+20$:   LDA     Z,STAT          ;IF EITHER IS A PLAYER,\r
+       BPL     30$             ;TURN HIS LIGHT ON\r
+       STA     Z,LMPON\r
+30$:   LDA     Z,STAT+2\r
+       BPL     40$\r
+       STA     Z,LMPON+2\r
+       ;PUT OUT "PUSH" AND "START" NOW\r
+40$:   LDA     AX,PSH          ;(SIMILAR TO "PER COIN")\r
+       STA     Z,TEMP2\r
+       LDA     AX,PSH+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,20.           ;MESSAGE LENGTH=21\r
+50$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,0AA6\r
+       DEY\r
+       BPL     50$\r
+MG3:\r
+       ;PUT OUT "BATTLE STATIONS" NOW\r
+       ;MASK BITS ARE IN BITS 3 AND 2 OF TEMP1\r
+;THIS MESSAGE DOESN'T EXIST IN FRENCH OR SPANISH\r
+       CPX     I,2             ;FRENCH?\r
+       BEQ     MG5             ;YES-DON'T PUT MESSAGE OUT\r
+       CPX     I,4             ;SPANISH?\r
+       BEQ     MG5             ;YES-DON'T PUT MESSAGE OUT\r
+       LDA     Z,TEMP1\r
+       ASL\r
+       ASL\r
+       ASL\r
+       ASL\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       LDA     AX,PREPARE\r
+       STA     Z,TEMP2\r
+       LDA     AX,PREPARE+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,17.           ;MESSAGE LENGTH=18\r
+10$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,0AC7\r
+       DEY\r
+       BPL     10$\r
+MG5:\r
+;PUT OUT "INSERT COINS" NOW\r
+;MASK BITS ARE IN BITS 1 AND 0 OF TEMP1\r
+       LDA     Z,TEMP1\r
+       ROR\r
+       ROR\r
+       ROR\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       LDA     I,0FF\r
+       STA     Z,TEMP3\r
+       LDA     Z,OPTSW4        ;CREDIT MODE?\r
+       AND     I,2\r
+       BEQ     5$              ;NO\r
+       LDA     Z,FRAME         ;YES-FLASH "INSERT COIN"\r
+       AND     I,10\r
+       BNE     5$\r
+       LDA     I,0\r
+       STA     Z,TEMP3\r
+5$:    LDA     AX,INSRT\r
+       STA     Z,TEMP2\r
+       LDA     AX,INSRT+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,20.           ;MESSAGE LENGTH=21\r
+10$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       AND     Z,TEMP3\r
+       STA     AY,0986\r
+       DEY\r
+       BPL     10$\r
+;PUT OUT "1 COIN PER PLAYER" IF IT IS IN THE "CREDIT" MODE.\r
+;(MASK IS SAME AS "INSERT COINS")\r
+       LDA     Z,OPTSW4\r
+       AND     I,2\r
+       BEQ     40$\r
+       LDA     AX,ONECN\r
+       STA     Z,TEMP2\r
+       LDA     AX,ONECN+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,7             ;MESSAGE LENGTH=8\r
+20$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,08CF\r
+       DEY\r
+       BPL     20$\r
+       LDA     AX,PRPLYR\r
+       STA     Z,TEMP2\r
+       LDA     AX,PRPLYR+1\r
+       STA     Z,TEMP2+1\r
+       LDY     I,10.           ;MESSAGE LENGTH=11\r
+30$:   LDA     NY,TEMP2\r
+       AND     I,3F\r
+       ORA     Z,TEMP1+1\r
+       STA     AY,090E\r
+       DEY\r
+       BPL     30$\r
+40$:   RTS\r
+       .PAGE\r
+       .REPT 0\r
+       \r
+THE FOLLOWING ROUTINE IS FULLY DEBUGGED. IT WOULD \r
+REPLACE MESSGEN EXCEPT THAT IT TAKES\r
+42 MS INSTEAD OF 4 MS. IT COULD BE USED IF THE\r
+MESSAGE ROUTINE WAS ONLY CALLED WHEN STATES CHANGE.\r
+       \r
+;*MESSAGE WRITE ROUTINE\r
+; THIS ROUTINE USES THE MESSAGE MASK\r
+; (TEMP1) AND OUTPUTS MESSAGE IN THE\r
+; CORRECT LANGUAGE. IT ALSO HANDLES\r
+; THE START LAMPS.\r
+; THE MESSAGE ARE STORED IN RAD50\r
+; (3 BYTES STORED AS 2)\r
+;      TEMP1 MESSAGE MASK\r
+;      TEMP1+1 CURRENT MESSAGE MASK\r
+;      TEMP2,2+1 ADDRESS OF WHERE TO STORE TO\r
+;      TEMP3,3+1 ADDRESS OF RAD50 MESSAGE\r
+;      TEMP4,4+1,4+2 DECODED RAD50 WORD\r
+;      X OFFSET FROM START OF MESSAGE\r
+;      Y RAD50 TABLE OFFSET\r
+MESWRT:                        ;FIRST DO THE COIN MODE\r
+       LDA     Z,TEMP1\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1       ;STORE IN TEMP1+1\r
+       LDA     Z,OPTSW3        ;GET LANGUAGE INDEX\r
+       AND     I,3\r
+       ASL\r
+       STA     A,LNGINDX       ;STORE IN LANGUAGE INDEX\r
+       LDA     Z,OPTSW2        ;FREE PLAY MODE?\r
+       ROR\r
+       BCC     10$\r
+       JMP     MW2             ;YES-DONT PUT ;MESSAGE OUT\r
+10$:   LDA     Z,OPTSW4        ;NO-CREDIT MODE?\r
+       AND     I,2\r
+       BNE     MW1             ;YES\r
+                               ;NO TIME MODE\r
+       JSR     A,GTCNMD        ;GET COIN MODE INDEX (IN X)\r
+       LDA     AX,COINMODE     ;GET COIN MODE LS DIGIT\r
+       PHA                     ;SAVE FOR MIDDLE DIGIT\r
+       AND     I,0F            ;LS DIGIT\r
+       ORA     I,30            ;ASCII\r
+       ORA     Z,TEMP1+1       ;VISIBILITY\r
+       STA     A,09CC          ;PUT IN OUT\r
+       PLA                     ;GET MIDDLE DIGIT\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       ORA     I,30\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09CB          ;PUT IT OUT\r
+       LDA     I,2C            ;PUT OUT COLON\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09CA\r
+       LDA     AX,COINMODE+1   ;GET MS DIGIT\r
+       ORA     I,30\r
+       ORA     Z,TEMP1+1\r
+       STA     A,09C9\r
+;PUT OUT "PER COIN" IN CORRECT LANGUAGE\r
+       LDX     A,LNGINDX       ;GET LANGUAGE INDEX\r
+       LDA     AX,PRCN2        ;GET LOW ADDRESS OF MESS\r
+       STA     Z,TEMP3         ;PUT IN TEMP3\r
+       LDA     AX,PRCN2+1      ;GET HIGH ADDRESS\r
+       STA     Z,TEMP3+1       ;PUT IN TEMP3+1\r
+       LDA     I,0CE           ;GET LOW ADDRESS OF WHERE\r
+                               ;TO STORE IT TOO\r
+       STA     Z,TEMP2         ;PUT IN TEMP2\r
+       LDA     I,09            ;GET HIGH DESTINATION\r
+       STA     Z,TEMP2+1       ;PUT IN TEMP2+1\r
+       JSR     A,DECODE        ;CONVERT RAD50 TO\r
+                               ;ASCII AND OUTPUT \r
+                               ;CARRY SET-BRA\r
+       BCS     MW2             ;DONT DO OTHER MODE MESSAGE\r
+;PUT OUT "YOU HAVE X CREDITS" NOW\r
+MW1:   \r
+       LDX     A,LNGINDX       ;SAME AS "PER COIN"\r
+       LDA     AX,YUHAV2       ;FIRST DO "YOU HAVE"\r
+       STA     Z,TEMP3\r
+       LDA     AX,YUHAV2+1\r
+       STA     Z,TEMP3+1\r
+       LDA     I,0CF\r
+       STA     Z,TEMP2\r
+       LDA     I,08\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE        ;CARRY IS SET\r
+       TYA                     ;GET RAD50 TABLE OFFSET\r
+       ADC     Z,TEMP3         ;ADD TO TABLE ADDRESS +1 (CARRY)\r
+       STA     Z,TEMP3\r
+       BCC     10$\r
+       INC     Z,TEMP3+1\r
+10$:   LDA     I,11            ;NOW DO "CREDITS"\r
+       STA     Z,TEMP2\r
+       LDA     I,09\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+       LDA     A,LNGINDX       ;PUT OUT "S" IN ENGLISH "CREDITS"\r
+       BNE     20$             ;NOT ENGLISH\r
+       LDA     I,0             ;ENGLISH\r
+       LDX     Z,$CNCT         ;1 CREDIT?\r
+       CPX     I,1\r
+       BEQ     15$             ;YES-PUT OUT BLANK\r
+       LDA     I,13            ;NO-PUT OUT "S"\r
+       ORA     Z,TEMP1+1       ;MAKE VISIBLE\r
+15$:   STA     A,0917          ;PUT IT OUT\r
+20$:   LDA     I,4             ;NOW PUT OUT NUMBER OF CREDITS\r
+       CMP     Z,$CNCT\r
+       BCC     30$             ;MORE THAN 4, PUT OUT 4\r
+       LDA     Z,$CNCT         ;LESS THEN 4, PUT OUT 0-4\r
+30$:   ORA     I,30            ;MAKE ASCII\r
+       ORA     Z,TEMP1+1       ;MAKE VISIBLE\r
+       STA     A,090F\r
+;\r
+;NOW DO THE "PUSH START" MESSAGE\r
+;(ALSO DO THE START LAMPS)\r
+;(PRESS START MASK IS IN BITS 5 AND 4 OF TEMP1)\r
+;\r
+MW2:   \r
+       LDA     Z,TEMP1         ;GET "PRESS START" MASK IN\r
+       ASL                     ;BITS 7 AND 6 OF TEMP1+1\r
+       ASL\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+;DO START LAMPS--IF PRESS START IS IN,\r
+;START LAMP SHOULD ALSO BE ON.\r
+       BPL     10$             ;PLAYER 2 OFF\r
+       STA     Z,LMPON+2       ;PLAYER 2 ON\r
+10$:   BIT     Z,TEMP1+1\r
+       BVC     20$             ;PLAYER 0 OFF\r
+       STA     Z,LMPON         ;PLAYER 0ON\r
+20$:   LDA     Z,STAT          ;IF EITHER IS A PLAYER,\r
+       BPL     30$             ;TURN HIS LIGHT ON\r
+       STA     Z,LMPON\r
+30$:   LDA     Z,STAT+2\r
+       BPL     40$\r
+       STA     Z,LMPON+2\r
+;NOW PUT OUT "PUSH START"\r
+40$:   LDX     A,LNGINDX       ;SAME AS "PER COIN"\r
+       LDA     AX,PSH2\r
+       STA     Z,TEMP3\r
+       LDA     AX,PSH2+1\r
+       STA     Z,TEMP3+1\r
+       LDA     I,0A6\r
+       STA     Z,TEMP2\r
+       LDA     I,0A\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+;PUT OUT "PREPARE FOR BATTLE" NOW\r
+;MASK BITS ARE IN BITS 3 AND 2 OF TEMP1\r
+MW3:\r
+       LDA     Z,TEMP1         ;SAME AS "PER COIN"\r
+       ASL\r
+       ASL\r
+       ASL\r
+       ASL\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       LDX     A,LNGINDX\r
+       LDA     AX,PREPR2\r
+       STA     Z,TEMP3\r
+       LDA     AX,PREPR2+1\r
+       STA     Z,TEMP3+1\r
+       LDA     I,0C9\r
+       STA     Z,TEMP2\r
+       LDA     I,0A\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+       TYA                     ;SAME AS "YOU HAVE X CREDITS"\r
+       ADC     Z,TEMP3\r
+       STA     Z,TEMP3\r
+       BCC     10$\r
+       INC     Z,TEMP3+1\r
+10$:   LDA     I,09\r
+       STA     Z,TEMP2\r
+       LDA     I,0B\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+;PUT OUT "INSERT COINS" NOW\r
+;(MASK BITS ARE IN BITS 1 AND 0 OF TEMP1)\r
+MW4:\r
+       LDA     Z,TEMP1\r
+       ROR\r
+       ROR\r
+       ROR\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       LDA     Z,OPTSW4                ;CREDIT MODE?\r
+       AND     I,2\r
+       BEQ     10$                     ;NO\r
+       LDA     Z,FRAME                 ;YES--FLASH MESSAGE\r
+       AND     I,10\r
+       BNE     10$                     ;ON THIS FRAME\r
+       LDA     I,0                     ;OFF THIS FRAME\r
+       STA     Z,TEMP1+1\r
+10$:   LDX     A,LNGINDX               ;SAME AS "PER COIN"\r
+       LDA     AX,INSRT2\r
+       STA     Z,TEMP3\r
+       LDA     AX,INSRT2+1\r
+       STA     Z,TEMP3+1\r
+       LDA     I,86\r
+       STA     Z,TEMP2\r
+       LDA     I,09\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+;NOW DO "1 COIN PER PLAYER" IF IN CREDIT MODE\r
+;(MASK SAME AS "INSERT" COINS)\r
+       TYA                             ;(SAME AS "YOU HAVE X CREDITS)\r
+       ADC     Z,TEMP3\r
+       STA     Z,TEMP3\r
+       BCC     20$\r
+       INC     Z,TEMP3+1\r
+20$:   LDA     Z,OPTSW4                ;CREDIT MODE?\r
+       AND     I,2\r
+       BEQ     30$                     ;NO-DONT PUT IT OUT\r
+       LDA     Z,TEMP1                 ;YES-REBUILD MASK\r
+       ROR\r
+       ROR\r
+       ROR\r
+       AND     I,0C0\r
+       STA     Z,TEMP1+1\r
+       LDA     I,0C6\r
+       STA     Z,TEMP2\r
+       LDA     I,09\r
+       STA     Z,TEMP2+1\r
+       JSR     A,DECODE\r
+30$:   RTS                             ;DONE AT LAST!\r
+;*DECODE RAD50 TO ASCII\r
+;THIS ROUTINE TAKES A SOURE ADDRESS,\r
+;GETS A RAD50 WORD, CONVERTS IT TO\r
+;ASCII, TACKS ON THE VISIBLITY BITS,\r
+;AND OUTPUTS TO A DESTINATION.\r
+;THE FIRST BYTE OF EACH MESSAGE\r
+;GIVE THE OFFSET FROM THE START\r
+;OF THE SPACE FOR THE MESSAGE TO\r
+;THE ACTUAL START OF THE MESSAGE\r
+;\r
+;      TEMP2,2+1=ADDRESS OF WHERE TO STORE TO\r
+;      TEMP3,3+2=ADDRESS OF RAD50 MESSAGE\r
+;              X=OFFSET FROM START OF MESSAGE\r
+;              Y=RAD50 TABLE OFFSET\r
+;      (X AND Y ARE DETERMINED WITHIN THIS ROUTINE)\r
+;      TEMP1+1=VISIBLITY MASK FOR THIS MESSAGE\r
+;      TEMP4,4+1,4+2=USED TO GENERATE 3 ASCII\r
+;                      BYTES FOR 2 RAD50 BYTES\r
+;\r
+DECODE:\r
+       LDY     I,0                     ;RAD50 TABLE OFFSET IN Y\r
+       LDA     NY,TEMP3                ;FIRST BYTE IS OFFSET\r
+       TAX                             ;OFFSET OF STORED MESSAGE IN X\r
+10$:   INY                             ;NEXT RAD50 BYTE\r
+       LDA     NY,TEMP3                ;GET FIRST RAD50 BYTE\r
+       STA     Z,TEMP4                 ;PUT IT IN TEMP4\r
+       INY\r
+       LDA     NY,TEMP3                ;GET 2ND RAD50 BYTE\r
+       STA     Z,TEMP4+1               ;PUT IT IN TEMP4+1\r
+       TYA                             ;SAVE X AND Y\r
+       PHA\r
+       TXA\r
+       PHA\r
+;THIS ROUTINE (COURTESY MIKE ALBAUGH)\r
+;CONVERTS RAD50 IN TEMP4,4+1 TO\r
+;ASCII IN TEMP4,4+1,4+2\r
+;\r
+       LDX     I,2\r
+1$:    LDY     I,16.\r
+       LDA     I,0\r
+2$:    ASL     Z,TEMP4\r
+       ROL     Z,TEMP4+1\r
+       ROL\r
+       CMP     I,40.\r
+       BCC     3$\r
+       SBC     I,40.\r
+       INC     Z,TEMP4\r
+3$:    DEY\r
+       BNE     2$\r
+4$:    CLC\r
+;\r
+;NOTE: MIKE ALBAUGH'S ROUTINE HAS BEEN\r
+;MODIFIED HERE TO GIVE DATA\r
+;COMPATIBLE WITH SUBS PROMS. IT DOES\r
+;NOT GIVE TRUE ASCII. IT GIVES\r
+;DATA ACCORDING TO THE TABLE BELOW:\r
+;\r
+;CHARACTER     RAD50           DATA\r
+;\r
+; SPACE                 0               0\r
+; A-Z           1-1A            1-1A\r
+; $             1B              1B\r
+; PERIOD        1C              1C\r
+; 0-9           1E-27           30-39\r
+;\r
+       CMP     I,1E                    ;IS IT A NUMBER?\r
+       BCC     5$                      ;NO\r
+       ADC     I,11                    ;YES, ADD 12 HEX (CARRY SET)\r
+5$:    STA     ZX,TEMP4\r
+       DEX\r
+       BMI     6$\r
+       BNE     1$\r
+       LDA     Z,TEMP4\r
+       BCC     4$                      ;BRA\r
+6$:    PLA                             ;DONE CONVERTING. GET OLD X\r
+       TAY                             ;PUNT IN Y. (OFFSET ON SCREEN)\r
+       LDX     I,0                     ;COUNTER FOR 3 CONVERTED BYTES\r
+20$:   LDA     ZX,TEMP4                ;GET DATA\r
+       CMP     I,1C                    ;IS IT A PERIOD?\r
+       BEQ     30$                     ;YES, WE ARE DONE (CARRY SET)\r
+       ORA     Z,TEMP1+1               ;NO-TACK ON VISIBLITY\r
+       STA     NY,TEMP2                ;PUT IN OUT\r
+       INY                             ;BUMP PFLD POINTER\r
+       INX                             ;NEXT CHARACTER\r
+       CPX     I,3                     ;DONE WITH ALL 3?\r
+       BNE     20$                     ;NO\r
+       CLC                             ;YES, BUT NO PERIOD SENSED\r
+30$:   TYA                             ;RESTORE X AND Y\r
+       TAX                             ;TO THEIR CORRECT PLACE\r
+       PLA\r
+       TAY\r
+       BCC     10$                     ;MORE TO BE CONVERTED\r
+       RTS                             ;WHOLE MESSAGE DONE\r
+       .ENDR\r
+       .PAGE\r
+       .SBTTL  COIN MODE INDEX ROUTINE\r
+;*GET COIN MODE ROUTINE\r
+;\r
+;      THIS ROUTINE GENERATES THE COIN MODE\r
+;      INDEX AND PUTS IT IN X.\r
+;      TEMP4 IS USED.\r
+;      OPTSW1 HAS THE MSB'S\r
+;      OPTSW2 BIT 1 HAS THE LSB\r
+GTCNMD:\r
+       LDA     Z,OPTSW1\r
+       AND     I,3\r
+       ASL\r
+       STA     Z,TEMP4\r
+       LDA     Z,OPTSW2\r
+       AND     I,2\r
+       LSR\r
+       ORA     Z,TEMP4\r
+       ASL                     ;TIMES 2 CAUSE MODE ARE 2 BYTES\r
+       TAX\r
+       RTS\r
+;\r
+;\r
+       .SBTTL  LANGUAGE INDEX ROUTINE\r
+       \r
+;*GET LANGUAGE INDEX ROUTINE\r
+; THIS ROUTINE GENERATES THE\r
+; LANGUAGE INDEX AND PUTS IT IN X.\r
+;\r
+GTLNGX:\r
+       LDA     Z,OPTSW3                ;LANG. SWITCHES IN OPTSW3\r
+       AND     I,3                     ;BITS 1 AND 0\r
+       BEQ     10$                     ;ENGLISH IN MAIN ROM\r
+       CMP     I,3\r
+       BEQ     10$                     ;GERMAN IN MAIN ROM\r
+       LDX     A,2000                  ;SEE IF OPTIONAL PROM IS THERE\r
+       CPX     I,4C\r
+       BEQ     10$                     ;YES--EVERYTHING IS COOL\r
+       LDA     I,0                     ;NO--PUT IT IN ENGLISH\r
+10$:   ASL                             ;ADDRESSES ARE 2 BYTES\r
+       TAX                             ;PUT IT IN X\r
+       RTS\r
+       .SBTTL  CHECKSUM 7\r
+       .BYTE CKSM7\r
+\f\r
+       .SBTTL  TABLES\r
+;*MESSAGE ADDRESS TABLES\r
+PRCOIN:        .WORD PCENG,PCFRE       ;PER COIN\r
+       .WORD PCSPA,PCGER\r
+PSH:   \r
+       .WORD PSENG,PSFRE       ;PUSH START\r
+       .WORD PSSPA,PSGER\r
+PREPARE:       .WORD   PRENG,PRFRE     ;PREPARE FOR BATTLE\r
+       .WORD   PRSPA,PRGER\r
+INSRT: .WORD ICENG,ICFRE       ;INSERT COIN\r
+       .WORD ICSPA,ICGER\r
+YUHAV: .WORD YHENG,YHFRE       ;YOU HAVE X CREDITS\r
+       .WORD YHSPA,YHGER\r
+ONECN: .WORD CNENG,CNFRE       ;ONE COIN\r
+       .WORD CNSPA,CNGER\r
+PRPLYR:        .WORD PPENG,PPFRE       ;PER PLAYER\r
+       .WORD PPSPA,PPGER\r
+;\r
+;*MESSAGE TABLES\r
+;\r
+PCENG: .ASCII /PER@COIN@@/                     ;ENGLISH - 10\r
+.TEMP2 =.                              ;FRENCH AND SPANISH\r
+       .=.TEMP1\r
+PCFRE: .ASCII /PAR@PIECE@/                     ;FRENCH\r
+PCSPA: .ASCII /POR@FICHA@/                     ;SPANISH\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+PCGER: .ASCII /PRO@MUENZE/                     ;GERMAN\r
+\r
+\r
+PSENG: .ASCII  /@@@@@PUSH@START@@@@@@/ ;21\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+PSFRE: .ASCII  /@@APPUYER@SUR@START@@/\r
+PSSPA: .ASCII  /@@@@PULSAR@START@@@@@/\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+PSGER: .ASCII  /STARTKNOEPFE@DRUECKEN/\r
+\r
+\r
+PRENG: .ASCII /PREPARE@FOR@BATTLE/     ;18\r
+PRFRE:                         ;SORRY FRENCHIES, NO ROOM!!\r
+PRSPA:                         ;SORRY SPANIARDS, NO ROOM!!  (IS THAT WHAT YOU CALL THEM????)\r
+PRGER: .ASCII  /@BERETT@ZUM@KAMPF@/\r
+\r
+\r
+ICENG: .ASCII /@@@@INSERT@COINS@@@@@/  ;21\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+ICFRE: .ASCII /INTRODUIRE@LES@PIECES/\r
+ICSPA: .ASCII /@@@INSERTE@FICHAS@@@@/\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+ICGER: .ASCII /@@@GELD@AUSWERFEN@@@@/\r
+\r
+\r
+YHENG: .ASCII /YOU@HAVE@@@CREDITS@/    ;19\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+YHFRE: .ASCII /VOUS@AVEZ@@@CREDITS/\r
+YHSPA: .ASCII /@TIENE@@@CREDITOS@@/\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+YHGER: .ASCII /SIE@HABEN@@@KREDITE/\r
+\r
+;*THIS TABLE GIVES THE OFFSET FROM THE BEGINNING OF THE MESSAGE TO WHERE\r
+;THE NUMBER OF CREDITS GOES.  (THE LANGUAGE INDEX IS MULTIPLIED BY 2, SO\r
+;THE TABLES ARE REPLICATED.)\r
+\r
+CRDADR:        .WORD 0909,0A0A                 ;ENGLISH,FRENCH\r
+       .WORD 0707,0A0A                 ;SPANISH,GERMAN\r
+\r
+\r
+CNENG: .ASCII /@1@COIN@/               ;8\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+CNFRE: .ASCII /1@PIECE@/\r
+CNSPA: .ASCII /1@MONEDA/\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+CNGER: .ASCII /1@MUENZE/\r
+\r
+\r
+PPENG: .ASCII /PER@PLAYER@/            ;11\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+PPFRE: .ASCII /PAR@JOUEUR@/\r
+PPSPA: .ASCII /POR@JUGADOR/\r
+.TEMP1 =.\r
+       .=.TEMP2\r
+PPGER: .ASCII /PRO@SPIELER/\r
+       .REPT 0                         ;THESE MESSAGES NOT USED\r
+;*NEW MESSAGE ADDRESS TABLES\r
+;\r
+PRCN2: .WORD PCENG2,PCFRE2             ;PER COIN\r
+       .WORD PCSPA2,PCGER2\r
+PSH2:  .WORD PSENG2,PSFRE2             ;PUSH START\r
+       .WORD PSSPA2,PSGER2\r
+PREPR2:        .WORD PRENG2,PRFRE2             ;PREPARE FOR BATTLE\r
+       .WORD PRSPA2,PRGER2\r
+INSRT2:        .WORD ICENG2,ICFRE2             ;INSERT COINS AND\r
+       .WORD ICSPA2,ICGER2             ;ONE COIN PER PLAYER\r
+YUHAV2:        .WORD YHENG2,YHFRE2             ;YOU HAVE X CREDIT\r
+       .WORD YHSPA2,YHGER2\r
+;\r
+;*NEW MESSAGE TABLES\r
+;\r
+PCENG2:\r
+       .BYTE 0                         ;OFFSET FROM BEGINING\r
+       .RAD50  /PER COIN./\r
+PCFRE2:\r
+       .BYTE 0\r
+       .RAD50  /PAR PIECE./\r
+PCSPA2:\r
+       .BYTE 0\r
+       .RAD50  /POR FICHA./\r
+PCGER2:\r
+       .BYTE 0\r
+       .RAD50  /PRO MUENZE./\r
+       \r
+       \r
+PSENG2:\r
+       .BYTE 5\r
+       .RAD50  /PUSH START./\r
+PSFRE2:\r
+       .BYTE 2\r
+       .RAD50  /APPUYER SUR START./\r
+PSSPA2:\r
+       .BYTE 4\r
+       .RAD50  /PULSAR START./\r
+PSGER2:\r
+       .BYTE 0\r
+       .RAD50  /STARTKNOEPFE DRUECKEN./\r
+       \r
+       \r
+PRENG2:\r
+       .BYTE 3\r
+       .RAD50  /PREPARE./\r
+       .BYTE 2\r
+       .RAD50  /FOR BATTLE./\r
+PRFRE2:\r
+       .BYTE 0\r
+       .RAD50  /PREPAREZ VOUS./\r
+       .BYTE 0\r
+       .RAD50  /POUR LE COMBAT./\r
+PRSPA2:\r
+       .BYTE 0\r
+       .RAD50  /PREPARASE PARA./\r
+       .BYTE 2\r
+       .RAD50  /LA BATALLA./\r
+PRGER2:\r
+       .BYTE 4\r
+       .RAD50  /BEREIT./\r
+       .BYTE 3\r
+       .RAD50  /ZUM KAMPF./\r
+       \r
+       \r
+ICENG2:\r
+       .BYTE 4\r
+       .RAD50  /INSERT COINS./\r
+       .BYTE 1\r
+       .RAD50  /1 COIN PER PLAYER./\r
+ICFRE2:\r
+       .BYTE 0\r
+       .RAD50  /INTRODUIRE LES PIECES./\r
+       .BYTE 1\r
+       .RAD50  /1 PIECE PAR JOUEUR./\r
+ICSPA2:\r
+       .BYTE 3\r
+       .RAD50  /INSERTE FICHAS./\r
+       .BYTE 0\r
+       .RAD50  /1 MONEDA POR JUGADOR./\r
+ICGER2:\r
+       .BYTE 3\r
+       .RAD50  /GELD AUSWERFEN./\r
+       .BYTE 0\r
+       .RAD50  /1 MUENZE PRO SPIELER./\r
+       \r
+       \r
+YHENG2:\r
+       .BYTE 0\r
+       .RAD50  /YOU HAVE./\r
+       .BYTE 0\r
+       .RAD50  /CREDIT./\r
+YHFRE2:\r
+       .BYTE 0\r
+       .RAD50  /VOUS AVEZ./\r
+       .BYTE 0\r
+       .RAD50  /CREDITS./\r
+YHSPA2:\r
+       .BYTE 2\r
+       .RAD50  /TIENE./\r
+       .BYTE 0\r
+       .RAD50  /CREDITOS./\r
+YHGER2:\r
+       .BYTE 0\r
+       .RAD50  /SIE HABEN./\r
+       .BYTE 0\r
+       .RAD50  /KREDITE./\r
+       .ENDR\r
+;\r
+;*VERTICAL AND HORIZONTAL SINE-COSINE TABLES\r
+;\r
+VOFST:\r
+       .BYTE -10.,-10.,-9,-7,-5,-3\r
+HOFST: .BYTE 0,3,5,7,9,10.\r
+       .BYTE 10.,10.,9,7,5,3\r
+       .BYTE 0,-3,-5,-7,-9,-10.\r
+       .BYTE -10.,-10.,-9,-7,-5,-3\r
+;\r
+;*VERTICAL AND HORIZONTAL DISPLACEMENT TABLES\r
+;\r
+;THESE TABLES GIVE THE OFFSET FROM THE\r
+;CENTER OF THE SUB TO THE FRONT TIP\r
+;OF THE SUB\r
+;\r
+VDSPLC:\r
+       .BYTE   -7,-7,-6,-5,-5,-4\r
+       .BYTE   -1,3,5,6,7,8\r
+       .BYTE   8,8,7,6,5,4\r
+       .BYTE   1,-3,-5,-5,-6,-7\r
+HDSPLC:\r
+       .BYTE   0,2,4,5,6,7\r
+       .BYTE   7,7,6,5,4,2\r
+       .BYTE   -1,-3,-5,-6,-7,-8\r
+       .BYTE   -8,-8,-7,-6,-5,-3\r
+;\r
+; PLAYFIELD DATA TABLE\r
+;\r
+PFTABL:        .BYTE   0DC,0DD,0DE,0DB,0DF,0E0,0E1     ;ISLAND 1\r
+       .BYTE   0DE,0DB,0E2,0E3,0E1\r
+       .BYTE   0DC,0DC,0E4,0E5,0DE,0DB,0E1     ;ISLAND 2\r
+       .BYTE   0E3,0DB,0DD,0DE,0DB,0E2\r
+       .BYTE   0D4,0C9,0CD,0C5                 ;TIME\r
+       .BYTE   2A,28,28,28,28,28,28,28,28,2B,2B        ;BOUNDARY\r
+       .BYTE   29,29,29,29,29,29,29,29,29,29,2A\r
+       .BYTE   1B,1B,1B,1B,1B,1B,1B,1B\r
+;\r
+; PLAYFIELD ADDRESS TABLE\r
+;\r
+PFADR: .WORD 0A14,0A15,0A33,0A34,0A35                  ;ISLAND 1\r
+       .WORD 0A53,0A54,0A72,0A73,0A74,0A92,0A93\r
+       .WORD 8CC,8EA,8EB,8EC,909,90A,90B               ;ISLAND 2\r
+       .WORD 929,92A,92B,949,94A,94B\r
+       .WORD 0B45,0B46,0B47,0B48                       ;TIME\r
+       .WORD   856,899,8DA,8FB,93C,0A5C,0A9B,0ABA      ;BOUNDARY\r
+       .WORD   0AF9,0B17,0B36,0B4A,0B2A,0AE6,0AA5,0A84\r
+       .WORD   0A43,923,8E4,8C5,886,849\r
+       .WORD   982,9A2,9C2,9E2,99D,9BD,9DD,9FD\r
+       .REPT 2800-.\r
+       .BYTE 0\r
+       .ENDR\r
+;*PLAYFIELD BOUNDARY TABLE\r
+;GIVES LOCATION OF SOLID STAMPS (1B)\r
+;RELATIVE TO PAGE BOUNDARIES\r
+PF1:   .BYTE   28,29,2A,2B,2C,2D,2E,2F,30,31           ;800-87F\r
+       .BYTE   32,33,34,35,36,37,38,46,47,48\r
+       .BYTE   57,58,59,65,66,67,78,79,7A,7A\r
+PF2:   .BYTE   04,05,1A,1B,24,25,3A,3B,43,44           ;880-97F\r
+       .BYTE   5B,5C,62,63,7C,7D,82,83,9C,9D\r
+       .BYTE   0A2,0BD,0C2,0DD,0E2,0FD,4,4,4,4\r
+PF3:   .BYTE   02,1D,22,3D,42,5D,62,63,7C,7D           ;A00-AFF\r
+       .BYTE   82,83,9C,9D,0A3,0A4,0BB,0BC,0C4,0C5\r
+       .BYTE   0DA,0DB,0E4,0E5,0FA,0FB,2,2,2,2\r
+PF4:   .BYTE   05,06,07,18,19,1A,26,27,28,29           ;B00-B7F\r
+       .BYTE   37,38,39,49,55,56,57,69,6A,6B\r
+       .BYTE   6C,6D,6E,6F,70,71,72,73,74,75\r
+;*"YOUR SCORE", "ENEMY SCORE" TANBLES\r
+YRSCR: .WORD   YSENG,YSFRE\r
+       .WORD   YSSPA,YSGER\r
+YSENG: .ASCII  /YOUR@SCORE@@@@@@@@@@@ENEMY@SCORE/\r
+.TEMP2 =.\r
+       .=.TEMP1\r
+YSFRE: .ASCII  /VOS@POINTS@@@@@@@@@@@@@XENNEMI@@/      ;X=L'\r
+YSSPA: .ASCII  /SUS@PUNTOS@@@@@@@@@@@DEL@ENEMIGO/\r
+       .REPT   2100-.\r
+       .BYTE   0\r
+       .ENDR\r
+       .=.TEMP2\r
+YSGER: .ASCII  /EIGNE@TREFQ@@@@@@@@@@FEIND@TREFQ/      ;Q=F.\r
+;\r
+;*STAMP BOUNDARY TABLES\r
+;\r
+;THESE TABLES GIVE THE 4 BOUNDARIES\r
+;FOR EACH ISLAND STAMP AND EACH\r
+;BOUNDARY STAMP. DISTANCES ARE MEASURED\r
+;IN DOTS FROM THE UPPER-LEFT HAND CORNER\r
+;OF THE STAMP.\r
+;THE DISTANCES ARE PACKED 2 TO A BYTE\r
+;VBOUND:       MSN = LEFT BOUNDARY\r
+;              LSN = RIGHT BOUNDARY\r
+;HBOUND:       MSN = TOP BOUNDARY\r
+;              LSN = BOTTOM BOUNDARY\r
+VBOUND:                                ;VERTICAL BOUNDARIES-LR\r
+       .BYTE 08                ;STAMP 1B-SOLID\r
+       .BYTE 08,08,38,03       ;1C-1F  -ISLAND\r
+       .BYTE 08,08,08,48       ;20-23  -ISLAND\r
+       .BYTE 08,07,08,04       ;24-27  -ISLAND\r
+       .BYTE 48,04,08,08       ;28-2B  -BOUNDARY\r
+       .BYTE 80                ;2C     -COLON\r
+       .BYTE 07,48,08          ;2D-2F  -ISLAND\r
+       .BYTE 80,80,80,80,80    ;30-34  -NUMBERS\r
+       .BYTE 80,80,80,80,80    ;35-39  -NUMBERS\r
+       .BYTE 07,38,08          ;3A-3C  -ISLAND\r
+       .BYTE 01,80,80          ;3D-3F  -ISLAND\r
+HBOUND:                                ;HORIZ BOUNDARIES - TB\r
+       .BYTE 08                ;1B     -SOLID\r
+       .BYTE 18,08,08,06       ;1C-1F  -ISLAND\r
+       .BYTE 28,08,08,08       ;20-23  -ISLAND\r
+       .BYTE 08,08,04,03       ;24-27  -ISLAND\r
+       .BYTE 08,08,04,48       ;28-2B  -BOUNDARY\r
+       .BYTE 80                ;2C     -COLON\r
+       .BYTE 08,06,07          ;2D-2F  -ISLAND\r
+       .BYTE 80,80,80,80,80    ;30-34  -NUMBERS\r
+       .BYTE 80,80,80,80,80    ;35-39  -NUMBERS\r
+       .BYTE 03,05,68          ;3A-3C  -ISLAND\r
+       .BYTE 13,80,80          ;3D-3F  -ISLAND\r
+;\r
+;*MAXIMUM TIME BETWEEN DRONE FIRING\r
+;\r
+;      THIS TABLE GIVES A NUMBER INDICATING THE LENGTH OF TIME BEFORE A\r
+;      DRONE MUST FIRE.  THE FIRST ENTRY IS FOR A "DUMB" DRONE, THE LAST\r
+;      ENTRY IS FOR A "SMART" DRONE. (0 TO 3F)\r
+;\r
+MAXFIRE:\r
+       .BYTE   8,10,20,30,3F,3F\r
+       .REPT 3C00-.\r
+       .BYTE 0\r
+       .ENDR\r
+       .=3C00\r
+;\r
+;*MINIMUM TIME BETWEEN DRONE FIRING\r
+;\r
+;      THIS TABLE GIVES A NUMBER INDICATING THE LENGTH OF TIME THE DRONE\r
+;      MUST WAIT BEFORE SHOOTING A SECOND TORP.\r
+;\r
+MINFIRE:\r
+       .BYTE   20,10,8,4,2,2\r
+;\r
+;*DRONE MASK\r
+;\r
+;      THIS TABLE GIVES A MASK USED WITH THE\r
+;      FRAME NUMBER TO DETERMINE HOW OFTEN\r
+;      THE DRONE SHOULD BE UPDATED.\r
+;\r
+;\r
+DRNMSK:\r
+       .BYTE 0F,7,3,1,0,0\r
+COINMODE:\r
+       .WORD   0030            ;0 MIN. 30 SEC PER COIN\r
+       .WORD   0100            ;1 MIN. 00 SEC\r
+       .WORD   0130            ;1 MIN. 30 SEC\r
+       .WORD   0200            ;2 MIN. 00 SEC\r
+       .WORD   0230            ;2 MIN. 30 SEC\r
+       .WORD   0300            ;3 MIN. 00 SEC\r
+       .WORD   0330            ;3 MIN. 30 SEC\r
+       .WORD   0400            ;4 MIN. 00 SEC\r
+       .PAGE\r
+       .SBTTL  POWER-ON ROUTINE\r
+;\r
+;*POWER-ON RESET ROUTINE\r
+;\r
+;DESCRIPTION:\r
+;      THIS ROUTINE IS USED TO INITIALIZE THE GAME WHEN POWER IS\r
+;      TURNED ON AND WHENEVER AN INVALID STATE IS FOUND.\r
+;\r
+PWRON: SEI\r
+       CLD\r
+       LDX     I,0FF           ;SET SP=0FF\r
+       TXS\r
+       LDA     I,0\r
+       STA     Z,NOIZRST\r
+       STA     Z,INVTOFF\r
+       STA     Z,INVTOFF+2\r
+       BIT     Z,SLFTST        ;SELF-TEST ON?\r
+       BPL     SUBTST          ;YES\r
+10$:   STA     ZX,0            ;CLEAR WORKING RAM\r
+       DEX\r
+       BMI     10$\r
+       LDA     I,55\r
+       STA     Z,TEST1         ;INITIALIZE THE TWO\r
+       LDA     I,0AA           ;BYTES THAT VERIFY\r
+       STA     Z,TEST2         ;THAT THE GAME HAS BEEN INITIALIZED\r
+       JSR     A,CLRSCRN\r
+20$:   JMP     A,START2\r
+       .SBTTL  CLEAR SCREEN ROUTINE\r
+;\r
+;*CLEAR SCREEN ROUTINE\r
+;\r
+;THIS ROUTINE STORES ZERO FROM 0800 TO 0B7F (USES X AND A)\r
+;\r
+CLRSCRN:\r
+       LDA     I,0             ;CLEAR PLAYFIELD\r
+       LDX     I,00\r
+20$:   STA     AX,PF\r
+       STA     AX,PF+100\r
+       STA     AX,PF+200\r
+       CPX     I,80            ;DON'T CLEAR BASE PAGE AGAIN!\r
+       BCS     30$\r
+       STA     AX,PF+300\r
+30$:   DEX\r
+       BNE     20$\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  SELF-TEST\r
+;\r
+;*SELF-TEST ROUTINE\r
+;\r
+;THIS ROUTINE CHECKS RAM, ROM, AND I/O\r
+SUBTST:\r
+       LDY     I,1             ;OUTER LOOP COUNTER\r
+5$:    LDX     I,0             ;INNER LOOP INDEX\r
+10$:   TYA                     ;DATA PATTERN\r
+       STA     AX,PF\r
+       INY\r
+       TYA\r
+       STA     AX,PF+100\r
+       INY\r
+       TYA\r
+       STA     AX,PF+200\r
+       INY\r
+       TYA\r
+       STA     AX,PF+300\r
+       DEY\r
+       DEY                     ;NET EFFECT, Y=Y+1\r
+       INX\r
+       BNE     10$\r
+20$:   TYA\r
+       EOR     AX,PF\r
+       STA     AX,PF           ;SHOULD STORE BACK A ZERO\r
+       BNE     RAMERR\r
+       INY\r
+       TYA\r
+       EOR     AX,PF+100\r
+       STA     AX,PF+100\r
+       BNE     RAMERR\r
+       INY\r
+       TYA\r
+       EOR     AX,PF+200\r
+       STA     AX,PF+200\r
+       BNE     RAMERR\r
+       INY\r
+       TYA\r
+       EOR     AX,PF+300\r
+       STA     AX,PF+300\r
+       BNE     RAMERR\r
+       DEY\r
+       DEY                     ;Y=Y+1\r
+       INX\r
+       BNE     20$\r
+       TYA\r
+       ASL\r
+       TAY\r
+       BCC     5$\r
+       BCS     ROMTST\r
+;\r
+;OUTPUT NOISE FOR BAD BITS IN RAM.  OUTPUT PING FOR GOOD BIT, CRASH FOR BAD\r
+;BIT.  START WITH D7 AND STOP WHEN THERE ARE NO MORE BAD BITS.\r
+;\r
+RAMERR:\r
+       STA     Z,XPLDOFF\r
+       STA     Z,CRSHOFF\r
+       STA     Z,SNROFF\r
+       STA     Z,SNROFF+2\r
+       STA     Z,LMPOFF\r
+       STA     Z,LMPOFF+2\r
+       LDX     I,0F0\r
+       STX     Z,SOUNDS        ;LOAD CRASH LATCH\r
+1$:    LDX     I,0\r
+       LDY     I,0\r
+       CMP     I,0\r
+40$:   BEQ     40$             ;DONE, WAIT FOR NMI\r
+       ASL\r
+       BCC     30$             ;BRANCH IF BIT IS GOOD\r
+10$:   STX     Z,CRSHON        ;BIT IS BAD - CRASH ON\r
+       STX     Z,LMPON\r
+       DEY\r
+       BNE     10$             ;DELAY\r
+       DEX\r
+       BNE     10$\r
+       BEQ     34$\r
+30$:   STX     Z,SNRON         ;BIT IS GOOD - PING ON\r
+       STX     Z,SNRON+2\r
+       STX     Z,LMPON+2\r
+       DEY\r
+       BNE     30$             ;DELAY\r
+       DEX\r
+       BNE     30$\r
+34$:   STX     Z,CRSHOFF       ;DONE WITH THIS BIT\r
+       STX     Z,SNROFF        ;SHUT BOTH OFF\r
+       STX     Z,SNROFF+2\r
+       STX     Z,LMPOFF\r
+       STX     Z,LMPOFF+2\r
+       DEY\r
+       BNE     34$             ;DELAY\r
+       DEX\r
+       BNE     34$\r
+       BEQ     1$              ;DO NEXT BIT\r
+;\r
+;OUTPUT "RAM OK ROM OK"\r
+;\r
+ROMTST:\r
+       STA     Z,XPLDOFF\r
+       STA     Z,SNROFF\r
+       STA     Z,SNROFF+2\r
+       LDX     I,12.           ;13 LETTERS\r
+10$:   LDA     AX,RAMOK\r
+       ORA     I,0C0\r
+       STA     AX,0889\r
+       DEX\r
+       BPL     10$\r
+;PROM TEST\r
+;THIS TEST CHECK EACH 1K X 4 PROM.\r
+;PROM A BAD = 2000 LSB\r
+;PROM B BAD = 2000 MSB\r
+;PROM C BAD = 2400 LSB\r
+;PROM D BAD = 2400 MSB\r
+;PROM E BAD = 2800 LSB\r
+;PROM F BAD = 2800 MSB\r
+;PROM G BAD = 2C00 LSB\r
+;PROM H BAD = 2C00 MSB\r
+;PROM I BAD = 3000 LSB\r
+;PROM J BAD = 3000 MSB\r
+;PROM K BAD = 3400 LSB\r
+;PROM L BAD = 3400 MSB\r
+;PROM M BAD = 3800 LSB\r
+;PROM N BAD = 3800 MSB\r
+;PROM O BAD = 3C00 LSB\r
+;PROM P BAD = 3C00 MSB\r
+PRMTST:\r
+       LDA     I,3F\r
+       STA     Z,TEMP1+1               ;PAGE COUNTER\r
+10$:   LDY     I,3\r
+20$:   LDX     I,0\r
+       TXA\r
+       STA     Z,TEMP1\r
+40$:   EOR     NX,TEMP1\r
+       DEC     Z,TEMP1\r
+       BNE     40$\r
+       DEC     Z,TEMP1+1\r
+       DEY\r
+       BPL     40$\r
+       PHA                             ;SAVE RESULT\r
+       LDA     Z,TEMP1+1               ;GET CURRENT PAGE\r
+       SEC                             ;GET WITHIN RANGE\r
+       SBC I,1F\r
+       LSR                             ;GET CURRENT 1K\r
+       LSR\r
+       TAX                             ;PUT IN X\r
+       PLA                             ;RESTORE RESULT\r
+       EOR     AX,CKSMS                ;COMPARE TO CHECKSUM FOR THIS PROM\r
+       STA     Z,TEMP2\r
+       BNE     55$                     ;ERROR\r
+50$:   LDA     Z,TEMP1+1\r
+;THIS PROGRAM HAS BEEN WRITTEN TO CHECK\r
+;2000-20FF AND 2800-3FFF\r
+;IT CAN BE MODIFIED EASILY TO CHECK\r
+;OTHER ADDRESSES. CHANGE THE CMP\r
+;BELOW TO BE EQUAL TO THE LOWES\r
+;PAGE TO BE CHECKED. LEAVE OUT\r
+;THE INSTRUCTIONS WITH ASTERICKS.\r
+       \r
+       CMP     I,28                    ;DO IT FOR 2800-3FFF\r
+       BCS     10$\r
+;      BCC     SWTTST                  ;IF CONTIGUOUS CODE\r
+       CMP     I,1F                    ;*DONE?\r
+       BEQ     SWTTST                  ;*YES\r
+       LDA     I,20                    ;*NO--DO IT FOR 2000-20FF\r
+       STA     Z,TEMP1+1               ;*PAGE 20\r
+       LDY     I,0                     ;*ONLY 1 PAGE - NOT 4\r
+       BEQ     20$                     ;*BRA\r
+;BAD ROM\r
+55$:   LDX     I,0                     ;CLEAR "OK"\r
+       STX     A,0894\r
+       STX     A,0895\r
+       AND     I,0F                    ;FIRST OR LAST NYBBLE BAD?\r
+       BEQ     60$                     ;FIRST\r
+       LDA     Z,TEMP1+1               ;LAST\r
+       SEC\r
+       SBC     I,1D                    ;SUBTRACT 1F TO GET IN RANGE\r
+                                       ;ADD TWO TO GET A-P\r
+       LSR                             ;DON'T NEED 32, ONLY 16\r
+       ORA     I,1                     ;LAST BIT=1 FOR MSB'S\r
+       PHA                             ;SAVE BAD ROM #\r
+       LSR                             ;GET A POSITION TO STORE IT\r
+       TAX\r
+       PLA                             ;RESTORE BAD ROM #\r
+       ORA     I,0C0                   ;MAKE VISIBLE\r
+       STA     AX,0895                 ;STORE IT OUT\r
+       LDA     Z,TEMP2\r
+       AND     I,0F0\r
+       BEQ     50$\r
+60$:   LDA     Z,TEMP1+1               ;FIRST NYBBLE BAD\r
+       SEC                             ;SAME AS ABOVE\r
+       SBC     I,1B\r
+       LSR\r
+       AND     I,0FE                   ;LAST BIT =0 FOR LSB'S\r
+       PHA\r
+       LSR\r
+       TAX\r
+       DEX\r
+       PLA\r
+       ORA     I,0C0\r
+       STA     AX,08B5                 ;STORE BELOW MSB'S\r
+       BMI     50$\r
+;NOW DO SWITCH TEST\r
+SWTTST:\r
+       LDA     I,BLANK\r
+       STA     Z,ROTATE\r
+       STA     Z,ROTATE+2\r
+       STA     Z,ROTATE+4\r
+       STA     Z,ROTATE+6\r
+       STA     Z,CRSHON\r
+       LDX     I,19.\r
+10$:   LDA     AX,SWMES1       ;PUT OUT "FIRE", "START",\r
+       STA     AX,0986         ;ON BOTH SCREENS\r
+       DEX\r
+       BPL     10$\r
+       LDX     I,9\r
+20$:   LDA     AX,SWMES2       ;PUT OUT "RIGHT" AND\r
+       STA     AX,0A6B\r
+       DEX\r
+       BPL     20$\r
+SWT1:  LDX     I,2             ;CHECK ONE PLAYER AT A TIME\r
+       LDY     I,9B            ;"BLOCK" FOR SCREEN #2\r
+       LDA     I,0\r
+       STA     Z,SOUNDS\r
+10$:   STA     ZX,LMPOFF\r
+       LDA     ZX,FIRE         ;HANDLE FIRE BUTTON (LO TRUE)\r
+       JSR     A,SWTST1        ;HANDLE SOUND AND LAMP\r
+       STA     AX,09A6         ;STORE "BLOCK" UNDER "FIRE"\r
+       LDA     ZX,STRTSW       ;SAME FOR "START" (LO TRUE)\r
+       JSR     A,SWTST1\r
+       STA     AX,09AC\r
+       BIT     Z,SLAM          ;SAME FOR "SLAM" (LO TRUE)\r
+       JSR     A,SWTST1\r
+       STA     AX,09B1\r
+       LDA     ZX,COIN         ;SAME FOR "COIN" SWITCH\r
+       EOR     I,80            ;(HI TRUE)\r
+       JSR     A,SWTST1\r
+       STA     AX,09B6\r
+       TXA                     ;NOW CHECK STEERING\r
+       STA     AX,0A8B         ;CLEAR "BLOCKS"\r
+       STA     AX,0A91\r
+       LDA     ZX,STRFLG       ;STEERING SENSED?\r
+       BPL     60$             ;NO\r
+       JSR     A,SWTST2\r
+       LDA     ZX,STRDIR       ;WHICH DIRECTION?\r
+       BPL     55$             ;LEFT\r
+       TYA                     ;RIGHT\r
+       STA     AX,0A91\r
+       BNE     60$             ;BRA\r
+55$:   TYA\r
+       STA     AX,0A8B\r
+60$:   DEX                     ;NEXT PLAYER\r
+       DEX\r
+       BMI     90$\r
+       LDY     I,5B            ;BLOCK FOR PLAYER 0\r
+       BPL     10$             ;DO PLAYER 0\r
+90$:   STA     Z,STRRST\r
+;DISPLAY OPTION SWITCHES\r
+       LDX     I,3\r
+       LDY     I,0\r
+80$:   LDA     ZX,OPTSW1\r
+       EOR     I,3                     ;MAKE READABLE FOR JOE AVERAGE\r
+       PHA\r
+       AND     I,1                     ;GET BIT 0\r
+       ORA     I,0F0                   ;MAKE IT A 0 OR 1 AND VISIBLE\r
+       STA     AY,090B                 ;PUT IT OUT\r
+       PLA\r
+       AND     I,2                     ;NOW DO BIT 1 SAME WAY\r
+       LSR\r
+       ORA     I,0F0\r
+       INY\r
+       STA     AY,090B\r
+       INY\r
+       INY\r
+       DEX\r
+       BPL     80$\r
+91$:   BIT     Z,VBLANK\r
+       BPL     91$\r
+92$:   BIT     Z,VBLANK\r
+       BMI     92$\r
+       LDA     Z,DIAGSTP\r
+       BPL     DIAG\r
+       JMP     A,SWT1\r
+;\r
+;THIS SUBROUTINE TURNS ON THE APPROPRIATE START LAMP AND CRASH SOUND IF A\r
+;SWITCH WAS SENSED.  THE ACC IS LOADED WITH AN INVISIBLE NUMBER (X) IF NO\r
+;SWITCH CLOSURE.  IT IS LOADED WITH Y (A VISIBLE "BLOCK") IF THE SWITCH IS\r
+;CLOSED.  IT IS ENTERED WITH THE N FLAG CONTAINING THE SWITCH (MINUS=0FF,\r
+;PLUS=ON)\r
+SWTST1:\r
+       BMI     SWTST3          ;SWITCH OFF\r
+SWTST2:                                ;SWITCH ON\r
+       STA     ZX,LMPON        ;TURN START LAMP ON\r
+       LDA     I,0F0\r
+       STA     Z,SOUNDS        ;TURN CRASH SOUND ON\r
+       TYA                     ;GET VISIBLE "BLOCK" IN ACC\r
+       RTS\r
+SWTST3:\r
+       TXA                     ;INVISIBLE STAMP IN ACC\r
+       RTS\r
+       .PAGE\r
+       .SBTTL  DIAGNOSTIC ROUTINES\r
+;\r
+;*DIAGNOSTIC TEST ROUTINE\r
+;\r
+;      THIS ROUTINE IS A COMPREHENSIVE CHECK OF MOST OF THE\r
+;      CIRCUITS ON THE PCB. EVERYTHING IS SYNCHED TO VBLANK\r
+;      SO A TEST TECH CAN TRIGGER ON VSYNCH. IT IS ENTERED\r
+;      BY ENTERING SELF TEST, THEN PUSHING THE DIAGNOSTIC\r
+;      STEP SWITCH. THE TEST NUMBER WILL BE INCREMENTED EACH\r
+;      TIME THE STEP BUTTON IS PRESSED. THE DIAGNOSTIC HOLD\r
+;      BUTTON FREEZES THE SCREEN AND CONTINUALLY WRITES TO\r
+;      TO THE HARDWARE CURRENTLY BEING TESTED. ONLY ROM 3\r
+;      NEEDS TO BE IN THE BOARD FOR THE SELF TEST AND DIAGNOSTIC\r
+;      ROUTINES TO FUNCTION.\r
+;\r
+DIAG:  JSR     A,CLRSCRN               ;INITIALIZE EVERYTHING\r
+       STA     Z,CRSHOFF\r
+       STA     Z,XPLDOFF\r
+       STA     Z,LMPOFF\r
+       STA     Z,LMPOFF+2\r
+       LDA     I,0\r
+       STA     Z,SOUNDS\r
+       STA     Z,SBENABL               ;DISABLE SUBS ON OTHER SCREEN\r
+       STA     Z,SBENABL+2\r
+       LDX     I,1\r
+10$:   STA     ZX,TEMP1                ;TEMP (2 BYTES)\r
+       STA     ZX,TEMP2                ;PIPELINE FOR DEBOUNCING SWITCH\r
+                                       ;COUNTER USED IN TESTS\r
+       STA     ZX,TEMP3                ;TEST NUMBER COUNTER\r
+                                       ;COUNTER USED IN TESTS\r
+       DEX\r
+       BPL     10$\r
+       LDX     I,6\r
+20$:   LDA     I,BLANK\r
+       STA     ZX,ROTATE\r
+       LDA     I,0\r
+       STA     ZX,HPOS\r
+       STA     ZX,VPOS\r
+       DEX\r
+       DEX\r
+       BPL     20$\r
+;\r
+;THIS FORMAT IS COURTESY OF CHRIS DOWNEND\r
+;(TAKEN FROM TIMEBOMB DIAGNOSTIC ROUTINE)\r
+AGAIN: LDY     Z,TEMP3                 ;JUMP TO CORRECT TEST\r
+       LDA     AY,TESTAB               ;TABLE OF TEST ADDRESSES\r
+       STA     Z,TEMP1\r
+       LDA     AY,TESTAB+1\r
+       STA     Z,TEMP1+1\r
+       JMP     N,TEMP1\r
+RETX:  BIT     Z,VBLANK                ;WAIT FOR VBLANK\r
+       BPL     RETX\r
+10$:   BIT     Z,VBLANK\r
+       BMI     10$\r
+       LDA     Z,DIAGSTP               ;SAMPLE STEP SWITCH\r
+       ROL\r
+       ROR     Z,TEMP2\r
+       LDA     Z,TEMP2\r
+       CMP     I,7F                    ;OFF FOR 7 SAMPLES, ON FOR 1\r
+       BNE     AGAIN                   ;NOT PUSHED, KEEP SAME TEST #\r
+;TIME TO CHANGE TEST NUMBER\r
+       JSR     A,CLRSCRN\r
+       INC     Z,TEMP3\r
+       INC     Z,TEMP3\r
+       LDA     Z,TEMP3\r
+       CMP     I,17.                   ;9 TESTS\r
+       BCC     AGAIN\r
+       BCS     DIAG                    ;9 TESTS DONE, START OVER\r
+TESTAB:                                        ;TABLE OF TEST ADDRESSES\r
+       .WORD   TST1\r
+       .WORD   TST2\r
+       .WORD   TST3\r
+       .WORD   TST4\r
+       .WORD   TST5\r
+       .WORD   TST6\r
+       .WORD   TST7\r
+       .WORD   TST8\r
+       .WORD   TST9\r
+TST1:                                  ;CLEAR SCREEN\r
+       JSR     A,CLRSCRN\r
+       JMP     A,RETX\r
+TST2:                                  ;OUTPUT ALPHA-NUMERICS\r
+       LDX     I,0\r
+10$:   TXA\r
+       STA     AX,PF\r
+       INX\r
+       BNE     10$\r
+       JMP     A,RETX\r
+TST3:                                  ;MOVE OBJECTS HORIZONTALLY\r
+       LDA     I,0F3                   ;PUT OUT TEST NUMBER\r
+       STA     A,PF\r
+       LDA     I,0\r
+       STA     Z,ROTATE\r
+       STA     Z,ROTATE+2\r
+       STA     Z,ROTATE+4\r
+       STA     Z,ROTATE+6\r
+       LDA     I,20\r
+       STA     Z,VPOS\r
+       LDA     I,40\r
+       STA     Z,VPOS+2\r
+       LDA     I,60\r
+       STA     Z,VPOS+4\r
+       LDA     I,80\r
+       STA     Z,VPOS+6\r
+       LDA     Z,DIAGHLD               ;DON'T INCREMENT IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+       BNE     10$                     ;TOGGLE ENABLES EVERY "WRAP"\r
+       LDA     Z,SBENABL\r
+       EOR     I,80\r
+       STA     Z,SBENABL\r
+       STA     Z,SBENABL+2\r
+10$:   LDA     Z,TEMP2+1\r
+       STA     Z,HPOS\r
+       STA     Z,HPOS+2\r
+       STA     Z,HPOS+4\r
+       STA     Z,HPOS+6\r
+       JMP     A,RETX\r
+TST4:                                  ;MOVE OBJECTS VERTICALLY\r
+       LDA     I,0F4                   ;PUT UP TEST NUMBER\r
+       STA     A,PF\r
+       LDA     I,20                    ;STAGGER HORIZONTALLY\r
+       STA     Z,HPOS\r
+       LDA     I,40\r
+       STA     Z,HPOS+2\r
+       LDA     I,60\r
+       STA     Z,HPOS+4\r
+       LDA     I,80\r
+       STA     Z,HPOS+6\r
+       LDA     Z,DIAGHLD               ;DON'T INCREMENT IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+       BNE     10$\r
+       LDA     Z,SBENABL               ;TOGGLE ENABLE EVERY "WRAP"\r
+       EOR     I,80\r
+       STA     Z,SBENABL\r
+       STA     Z,SBENABL+2\r
+10$:   LDA     Z,TEMP2+1\r
+       STA     Z,VPOS\r
+       STA     Z,VPOS+2\r
+       STA     Z,VPOS+4\r
+       STA     Z,VPOS+6\r
+       JMP     A,RETX\r
+TST5:                                  ;ROTATIONS\r
+       LDA     I,0F5                   ;PUT UP TEST NUMBER\r
+       STA     A,PF\r
+       LDA     I,20                    ;STAGGER DIAGONALLY\r
+       STA     Z,HPOS\r
+       STA     Z,VPOS\r
+       LDA     I,50\r
+       STA     Z,HPOS+2\r
+       STA     Z,VPOS+2\r
+       LDA     I,80\r
+       STA     Z,HPOS+4\r
+       STA     Z,VPOS+4\r
+       STA     Z,SBENABL               ;ENABLE ON BOTH SCREENS\r
+       STA     Z,SBENABL+2\r
+       LDA     I,0B0\r
+       STA     Z,HPOS+6\r
+       STA     Z,VPOS+6\r
+       LDA     Z,DIAGHLD               ;DON'T INCREMENT IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1               ;DON'T UPDATE EVERY FRAME\r
+       BMI     10$                     ;(INNER COUNTER)\r
+       LDA     I,0E0                   ;TIME TO UPDATE\r
+       STA     Z,TEMP2+1\r
+       LDA     Z,TEMP3+1\r
+       EOR     I,1                     ;TOGGLE SUB - TORP BIT\r
+       CLC\r
+       ADC     I,04                    ;NEXT ROTATION EVERY OTHER TIME\r
+       STA     Z,TEMP3+1\r
+10$:   LDA     Z,TEMP3+1\r
+       STA     Z,ROTATE\r
+       STA     Z,ROTATE+2\r
+       STA     Z,ROTATE+4\r
+       STA     Z,ROTATE+6\r
+       JMP     A,RETX\r
+TST6:                                  ;TEST "PING"\r
+       LDA     I,0F6\r
+       STA     A,PF\r
+       LDA     I,BLANK                 ;BLANK MOTION OBJECTS\r
+       STA     Z,ROTATE\r
+       STA     Z,ROTATE+2\r
+       STA     Z,ROTATE+4\r
+       STA     Z,ROTATE+6\r
+       LDA     Z,DIAGHLD               ;DON'T UPDATE IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+10$:   BIT     Z,TEMP2+1\r
+       BPL     20$\r
+       STA     Z,SNRON                 ;0 ON, 2 OFF\r
+       STA     Z,SNROFF+2\r
+       JMP     A,RETX\r
+20$:   STA     Z,SNRON+2               ;2 ON, 0 OFF\r
+       STA     Z,SNROFF\r
+       JMP     A,RETX\r
+TST7:                                  ;TEST "LAUNCH" SOUND\r
+       LDA     I,0F7\r
+       STA     A,PF\r
+       STA     Z,SNROFF                ;TURN OFF "PING"\r
+       STA     Z,SNROFF+2\r
+       LDA     Z,DIAGHLD               ;DON'T UPDATE IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+10$:   LDA     Z,TEMP2+1\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       STA     Z,SOUNDS                ;BIT 0-3 = LAUNCH\r
+       JMP     A,RETX\r
+TST8:                                  ;TEST "CRASH" SOUND\r
+       LDA     I,0F8\r
+       STA     A,PF\r
+       STA     Z,CRSHON                ;ENABLE CRASH\r
+       LDA     Z,DIAGHLD               ;DON'T UPDATE IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+10$:   LDA     Z,TEMP2+1\r
+       AND     I,0F0\r
+       STA     Z,SOUNDS                ;D4-D7 = CRASH/EXPLODE\r
+       JMP     A,RETX\r
+TST9:                                  ;TEST "EXPLODE" SOUND\r
+       LDA     I,0F9\r
+       STA     A,PF\r
+       STA     Z,CRSHOFF               ;DISABLE CRASH\r
+       STA     Z,XPLDON                ;ENABLE EXPLODE\r
+       LDA     Z,DIAGHLD               ;DON'T UPDATE IF "HOLD"\r
+       BPL     10$\r
+       INC     Z,TEMP2+1\r
+10$:   LDA     Z,TEMP2+1\r
+       AND     I,0F0\r
+       STA     Z,SOUNDS                ;D4-D7 = CRASH/EXPLODE\r
+       JMP     A,RETX\r
+;THIS TABLE GIVESS THE CHECKSUM FOR\r
+;EACH 1K OF ROM/PROM\r
+CKSMS:\r
+       .BYTE 12,0F,34,56,78,9A,0BC,0DE\r
+RAMOK: .BYTE   0D2,0C1,0CD,0,0CF,0CB   ;RAM OK\r
+       .BYTE   0,0D2,0CF,0CD,0,0CF,0CB ;ROM OK\r
+SWMES1:        .BYTE   0C6,0C9,0D2,0C5,0,0D3,0D4,0C1,0D2,0D4,0 ;FIRE START\r
+       .BYTE   0D3,0CC,0C1,0CD,0,0C3,0CF,0C9,0CE       ;SLAM COIN\r
+SWMES2:        .BYTE   0CC,0C5,0C6,0D4,0,0D2,0C9,0C7,0C8,0D4   ;LEFT RIGHT\r
+       .REPT   3FF9-.\r
+       .BYTE   0\r
+       .ENDR\r
+       .PAGE\r
+       .SBTTL  VECTORS, CHECKSUM 8\r
+;\r
+       .=3FF9\r
+       .BYTE   CKSM8           ;*RESERVED FOR CHECKSUM 8*\r
+       .WORD   NMI             ;NMI RESET VECTOR\r
+       .WORD   PWRON           ;RESET VECTOR\r
+       .WORD   PWRON           ;IRQ VECTOR\r
+       .IF     EQ,OPTION       ;DEVELOPMENT SYSTEM\r
+       .=0F7C3\r
+       .WORD   NMI\r
+       .ENDC\r
+       .END\r
+\r
+\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
\ No newline at end of file
diff --git a/A34183.1B b/A34183.1B
new file mode 100644 (file)
index 0000000..d9612c3
--- /dev/null
+++ b/A34183.1B
@@ -0,0 +1,412 @@
+       .TITLE SUBSNR-SONAR SCREEN FOR SUBS\r
+       .SBTTL *************************\r
+       .SBTTL *\r
+       .SBTTL *PROGRAMMER: JOHN RAY\r
+       .SBTTL *\r
+       .SBTTL *CHECKER*\r
+       .SBTTL *\r
+       .SBTTL *************************\r
+;\r
+;DATE INITIATED: 6/1/78\r
+;PROJECT CHARGE #: 5J121\r
+;DISK #: 5 PURPLE\r
+;HARDWARE REQUIREMENTS:\r
+;\r
+;\r
+;\r
+;\r
+;MEMORY REQUIREMENTS:\r
+;\r
+;\r
+;\r
+;\r
+;INTERRUPT REQUIREMENTS:\r
+;\r
+;\r
+;\r
+;\r
+;ASSEMBY COMMAND STRING:\r
+;\r
+;\r
+;\r
+;\r
+;LINK COMMAND STRING:\r
+;\r
+;\r
+;\r
+;\r
+;PROGRAM DESCRIPTION:\r
+; THIS PROGRAM HANDLING THE "SONAR"\r
+; EFFECT ON SUBS.\r
+;\r
+;\r
+       .ASECT\r
+       .RADIX 16\r
+;\r
+;\r
+       .SBTTL EXTERNAL REFERENCES\r
+;\r
+       .GLOBL VBLANK,FRAME,CRSRN,QUAD,BLPNTR,BLPCNT,BLPNUM\r
+       .GLOBL TEMP1,TEMP2,SONAR,HPOS,VPOS,SNRON,SNROFF,SNRCNTR\r
+       .GLOBL OPTSW4,GSTAT,CNTDWN\r
+;\r
+;\r
+;\r
+;\r
+       .SBTTL EQUATES\r
+;\r
+;\r
+SCNLOC  =0B00                  ;STARTING ADDRESS OF SONAR SCREEN\r
+       .=2800\r
+;\r
+;\r
+       .SBTTL MAIN LOOP\r
+;\r
+; DESCRIPTION:\r
+;      A) ODD FRAME-CALCULATE AND OUTPUT\r
+;         ONLY THE BLIP\r
+;      B) EVEN FRAME-OUTPUT THE SONAR SCREEN\r
+;         WITH THE CURSOR. THE CURSOR MOVES\r
+;         EVERY NTH FRAME. THERE ARE 15\r
+;         CURSOR ROTATIONS PER QUADRANT\r
+;\r
+;\r
+SONAR:  JSR BLNKSCRN                   ;PUT OUT BLANK SONAR SCREEN\r
+       LDA Z,FRAME\r
+       ROR\r
+       BCC SCREEN                      ;EVEN FRAME-OUTPUT SCREEN\r
+       JMP BLIP                        ;ODD FRAME-OUTPUT BLIP\r
+       .REPT 0\r
+ON THE EVEN FRAME, THE SONAR SCREEN\r
+AND THE CURSOR ARE OUTPUTED. THE\r
+BLANK SCREEN IS FIRST PUT UP, THEN THE\r
+QUADRAND WHERE THE CURSOR CURRENTLY\r
+RESIDES IT RE-WRITTEN. THE CURSOR\r
+MOVES 15 TIMES IN EACH EQUADRANT.\r
+THE NUMBERING SYSTEM IS SUCH THAT\r
+ONLY A TABLE OF STAMP VALUES FOR\r
+QUADRANT 0 IS STORED. VALUES FOR\r
+OTHER QUADRANTS ARE OBTAINED BY\r
+ADDING 25(HEX) FOR EACH SUCCEEDING\r
+QUADRANT TO THE TABLE FOR QUADRANT 0\r
+(CRSRPIC).\r
+       \r
+THE LSB OF THE ADDRESS TO STORE\r
+THE DATA IS ALSO CONTAINED IN A \r
+TABLE (CRSRA).\r
+       .ENDR\r
+SCREEN:\r
+       LDA I,3E                        ;PUT ISLANDS ON SONAR\r
+       STA A,SCNLOC+20+1\r
+       STA A,SCNLOC+20+1D\r
+       LDA I,3F\r
+       STA A,SCNLOC+40+2\r
+       STA A,SCNLOC+40+1E\r
+       LDX Z,CRSRN                     ;UPDATE CURSOR\r
+       INX\r
+       STX Z,CRSRN                     ;AFTER 15 CURSORS, UPDATE\r
+       CPX I,0F                        ;TO NEW QUADRANT\r
+       BNE CONT\r
+       LDX I,00\r
+       STX Z,CRSRN                     ;RESET CURSOR TO 00\r
+       INC Z,QUAD\r
+       LDA Z,QUAD\r
+       CMP I,04                        ;ONLY 4 QUADRANTS\r
+       BNE CONT\r
+       LDA I,00                        ;RESET QUAD TO 00\r
+       STA Z,QUAD\r
+CONT:  JSR OUTPUT\r
+       RTS\r
+       .SBTTL SONAR SCREEN OUTPUT\r
+;DESCRIPTION:\r
+;      THIS SUBROUTINES TAKES THE CURSOR\r
+;      NUMBER (CRSRN) AND OUTPUTS THE\r
+;      APPROPRIATE STAMPS TO THE CORRECT\r
+;      QUADRANT (QUAD)\r
+;\r
+;\r
+;REGISTERS:\r
+;\r
+;      ACC,X,Y\r
+;\r
+;\r\r
+;STACK USE:\r
+;\r
+;      NONE\r
+;\r
+;\r
+;BASE PAGE USED:\r
+;\r
+;      TEMP1,TEMP2,QUAD,CRSRN\r
+;\r
+;\r
+OUTPUT:        LDA I,00                        ;COUNTER FOR THE FOUR STAMPS\r
+       STA Z,TEMP2                     ;IN THE QUADRANT THAT NEED\r
+                                       ;TO BE CHANGED\r
+NEXT:  LDY Z,QUAD                      ;Y=QUADRANT NUMBER\r
+       TYA                             ;FIND THE ADDRESS WHERE\r
+       ASL                             ;THIS CURSOR STAMP WILL BE STORED\r
+       ASL                             ;[4*QUAD+TEMP3+CRSRADR]\r
+       CLC\r
+       ADC Z,TEMP2\r
+       TAX\r
+       LDA AX,CRSRADR\r
+       STA Z,TEMP1                     ;PUT THE ADDRESS IN TEMP1\r
+       LDA I,0B                        ;AND TEMP2\r
+       STA Z,TEMP1+1\r
+       LDA Z,CRSRN                     ;FIND THE DATA WHICH\r
+       ASL                             ;DETERMINES THE STAMP\r
+       ASL                             ;[CRSN*4+TEMP3+CRSRPIC]\r
+       ADC Z,TEMP2                     ;+QUAD*25\r
+       TAX\r
+       LDA AX,CRSRPIC\r
+       CMP I,00                        ;00 IS BLANK, NO ROTATIONS\r
+       BEQ 20$                         ;FOR DIFFERENT QUADS\r
+30$:   DEY\r
+       BMI 20$\r
+       CLC\r
+       ADC I,25\r
+       BCC 30$                         ;BRA\r
+20$:   LDY I,00\r
+       STA NY,TEMP1                    ;ACC TO 1ST SCREEN\r
+       LDY I,28.\r
+       STA NY,TEMP1                    ;ACC TO 2ND SCREEN\r
+       INC Z,TEMP2                     ;REPEAT FOR NEXT CELL\r
+       LDA Z,TEMP2\r
+       CMP I,04\r
+       BNE NEXT\r
+       RTS                             ;DONE AFTER 4 CELLS\r
+       .PAGE\r
+       .SBTTL BLANK SONAR SCREEN\r
+;DESCRIPTION:\r
+;\r
+;      THIS SUBROUTINE PUTS UP A BLANK\r
+;      SONAR SCREEN FOR BOTH MONITORS\r
+;\r
+;REGISTERS:\r
+;\r
+;      ACC AND X USED\r
+;\r
+;STACK USE:\r
+;\r
+;      4 LOCATIONS\r
+;\r
+;BASE PAGE USE:\r
+;\r
+;      QUAD,CRSRN\r
+;\r
+;SUBROUTINES CALLED:\r
+;\r
+;      OUTPUT\r
+;\r
+;\r
+BLNKSCRN:LDA Z,QUAD                    ;STORE CURRENT CURSOR POSITION\r
+       PHA     \r
+       LDA Z,CRSRN\r
+       PHA\r
+       LDA I,0F                        ;CURSOR=15 (BLANK)\r
+       STA Z,CRSRN\r
+       LDX I,03\r
+       STX Z,QUAD\r
+10$:   JSR OUTPUT                      ;PUT UP THIS QUAD\r
+       DEC Z,QUAD\r
+       BPL 10$                         ;MUST WRITE OUT ALL 4 QUADS\r
+       PLA                             ;RETRIEVE CURRENT CURSOR POSITION\r
+       STA Z,CRSRN\r
+       PLA\r
+       STA Z,QUAD\r
+       RTS\r
+       .PAGE\r
+       .SBTTL SONAR BLIP\r
+;\r
+;DESCRIPTION:\r
+;      THIS ROUTINE PUTS A BLIP ON\r
+;      PLAYER A SONAR SCREEN BASED\r
+;      ON THE POSITION OF PLAYER B SUB.\r
+;\r
+;\r
+BLIP:  LDY I,28.               ;SCREENS ARE 28. APART\r
+10$:   TYA\r
+       LSR                     ;GET SUB #\r
+       AND I,2\r
+       TAX\r
+       LDA Z,GSTAT             ;GIVE RAPID "PINGS" IN FREEZE\r
+       BPL 12$\r
+       LDA Z,CNTDWN\r
+       BEQ 12$\r
+       LDA A,SNRCNTR\r
+       SEC\r
+       SBC I,4\r
+       BPL 60$\r
+       LDA I,3F                ;VISIBLE IF OVER 3F\r
+60$:   STA A,SNRCNTR\r
+       AND I,30\r
+       BEQ 50$\r
+       STA Z,SNRON             ;ON NOW\r
+       STA Z,SNRON+2\r
+       BNE 16$                 ;BRA\r
+50$:   STA Z,SNROFF            ;OFF NOW\r
+       STA Z,SNROFF+2\r
+       BEQ 16$                 ;BRA\r
+12$:   LDA AX,SNRCNTR          ;TIME TO SHUT OFF SONAR SOUND?\r
+       BNE 15$\r
+       STA ZX,SNROFF           ;YES\r
+       BEQ 16$                 ;BRA\r
+15$:   DEC AX,SNRCNTR          ;NO-UPDATE COUNTER\r
+       LDA Z,OPTSW4\r
+       ROR\r
+       BCC 17$\r
+       LDA Z,GSTAT\r
+       BPL 16$\r
+17$:   STA ZX,SNRON\r
+16$:   LDA ZX,VPOS             ;BIT 3-5 =VPOS\r
+       LSR\r
+       LSR\r
+       AND I,38\r
+       STA Z,TEMP1\r
+       LDA ZX,HPOS             ;BIT 0-2 =HPOS\r
+       ROL\r
+       ROL\r
+       ROL\r
+       ROL\r
+       AND I,07\r
+       ORA Z,TEMP1\r
+       TAX                     ;X=INDEX TO TABLES\r
+       STX     Z,TEMP2         ;SAVE X\r
+       LDA     Z,QUAD          ;GET QUAD + CURSRN\r
+       ASL                     ;IN ONE BYTE\r
+       ASL\r
+       ASL\r
+       ASL\r
+       ORA     Z,CRSRN\r
+       CMP     AX,BLPSTRT      ;SEE IF TIME TO OUTPUT BLIP\r
+       BEQ     20$             ;YES\r
+       TYA\r
+       LSR\r
+       AND     I,2\r
+       TAX\r
+       DEC     ZX,BLPCNT       ;NO-REFRESH?\r
+       BPL     30$             ;NO\r
+       INC     ZX,BLPNTR       ;YES-GET NEXT INCREMEMT\r
+       STY     Z,TEMP1         ;SAVE Y\r
+       LDY     ZX,BLPNTR\r
+       LDA     AY,BLPINC\r
+       STA     ZX,BLPCNT       ;PUT INCREMENT IN COUNTER\r
+       LDY     Z,TEMP1         ;GET Y\r
+       JMP     25$\r
+20$:   TYA                     ;START BLIP\r
+       LSR\r
+       AND     I,2\r
+       TAX\r
+       BIT     Z,GSTAT         ;DON'T START\r
+       BPL     21$             ;PING DURING FREEZE\r
+       LDA     Z,CNTDWN\r
+       BNE     22$\r
+21$:   LDA     I,30            ;START PING\r
+       STA     AX,SNRCNTR\r
+22$:   LDA     I,0             ;RESET COUNTERS\r
+       STA     ZX,BLPCNT\r
+       STA     ZX,BLPNTR\r
+       LDA     Z,TEMP2\r
+       STA     ZX,BLPNUM\r
+25$:   LDA     ZX,BLPNUM\r
+       TAX\r
+       LDA AX,BLPADR\r
+       STA Z,TEMP1             ;PUT BLIP ADDRESS\r
+       LDA I,0B                ;IN TEMP1\r
+       STA Z,TEMP1+1\r
+       LDA AX,BLPDATA\r
+       STA NY,TEMP1            ;Y=0 OR 28. FOR DIFFERENT SCREENS\r
+30$:   CPY     I,0             ;DONE BOTH SCREENS?\r
+       BEQ     40$             ;YES\r
+       LDY     I,0             ;NO- DO OTHER ONE\r
+       JMP     10$\r
+40$:   RTS\r
+       .PAGE\r
+       .SBTTL CURSOR ADDRESS TABLE\r
+;\r
+;THIS TABLE GIVE THE LSB OF THE 4 ADDRESS\r
+;USED TO CHANGE THE 4 STAMPS IN\r
+;EACH OF 4 QUADRANTS\r
+;\r
+CRSRADR:.BYTE 02,03,22,23              ;QUAD 0\r
+       .BYTE 43,63,42,62               ;QUAD 1\r
+       .BYTE 61,60,41,40               ;QUAD 2\r
+       .BYTE 20,00,21,01               ;QUAD 3\r
+       .SBTTL CURSOR PICTURE TABLE\r
+;\r
+;THIS TABLE GIVES THE 4 CURSOR PICTURES\r
+;FOR FOR EACH OF 15 ROTATIONS OF\r
+;THE CURSOR FOR QUAD 0. THE OTHER 45\r\r
+;ROTATIONS CAN BE OBTAINED BY ADDING\r
+;(QUAD*25) TO THE NUMBER IN THE\r
+;TABLE BELOW.\r
+;\r
+CRSRPIC:.BYTE 44,41,43,42              ;CURSOR 0\r
+       .BYTE 46,41,45,42\r
+       .BYTE 48,41,47,42\r
+       .BYTE 4A,41,49,42\r
+       .BYTE 4C,41,4B,42\r
+       .BYTE 4E,41,4D,42               ;CURSOR 5\r
+       .BYTE 50,51,4F,42\r
+       .BYTE 53,54,52,42\r
+       .BYTE 40,57,55,56\r
+       .BYTE 40,5A,58,59\r
+       .BYTE 40,41,5B,5C               ;CURSOR A\r
+       .BYTE 40,41,5D,5E\r
+       .BYTE 40,41,5F,60\r
+       .BYTE 40,41,61,62\r
+       .BYTE 40,41,63,64\r
+                                       ;CURSOR E\r
+       .BYTE 40,41,00,42               ;BLANK SCREEN\r
+       .PAGE\r
+       .SBTTL BLIP TABLES\r
+;\r
+;      THERE TABLES GIVE THE LOWER ADDRESS\r
+;      BYTE AND STAMP NUMBER FOR A BLIP\r
+;      BASED ON THE POSITION OF A SUB.\r
+;\r
+BLPADR:        .BYTE   0,0,1,1,2,2,3,3\r
+       .BYTE   0,0,1,1,2,2,3,3\r
+       .BYTE   20,20,20,21,22,22,23,23\r
+       .BYTE   20,20,21,21,22,22,23,23\r
+       .BYTE   40,40,41,41,42,42,43,43\r
+       .BYTE   40,40,41,41,42,42,43,43\r
+       .BYTE   60,60,61,61,62,62,63,63\r
+BLPDATA:\r
+       .BYTE   0EC,0EC,0ED,0EF,0D4,0D6,0D7,0D7\r
+       .BYTE   0EC,0EC,0ED,0EE,0D5,0D6,0D7,0D7\r
+       .BYTE   0EB,0EB,0EB,0F8,0F0,0F8,0D8,0D8\r
+       .BYTE   0EA,0EA,0F2,0FA,0F2,0FA,0D9,0DA\r
+       .BYTE   0E8,0E8,0F1,0F9,0F1,0F9,0DB,0DC\r
+       .BYTE   0E6,0E6,0F3,0FB,0F3,0FB,0DD,0DD\r
+       .BYTE   0E5,0E5,0E4,0E3,0E1,0DF,0DE,0DE\r
+       .PAGE\r
+       .SBTTL START BLIP TABLE\r
+;\r
+;THIS TABLE GIVES THE QUADRANT AND CURSOR NUMBER\r
+;WHERE EACH BLIP SHOULD BE STARTED\r
+;THE QUADRANT IS IN THE HIGH NIBBLE, CURSOR IN THE\r
+;LOW NYBBLE\r
+;\r
+BLPSTRT:\r
+       .BYTE 38,38,3A,3D,01,05,08,08\r
+       .BYTE 38,38,3A,3D,02,05,08,08\r
+       .BYTE 36,36,36,3A,01,06,0A,0A\r
+       .BYTE 31,31,33,37,01,0B,0D,0E\r
+       .BYTE 2E,2E,2A,24,1C,15,12,11\r
+       .BYTE 2A,2A,27,22,1E,19,15,15\r
+       .BYTE 28,28,26,21,1E,1A,18,18\r
+       .SBTTL BLIP INCREMENT TABLE\r
+;\r
+;THIS TABLE GIVES THE NUMBER OF\r
+;BLANK FRAMES BETWEEN EACH BLIP OUTPUT\r
+;\r
+BLPINC:\r
+       .BYTE 0,0,0,0\r
+       .BYTE 0,0,1,0\r
+       .BYTE 0,1,0,1\r
+       .BYTE 0,1,1,1\r
+       .BYTE 1,40\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
\ No newline at end of file
diff --git a/A34183.1C b/A34183.1C
new file mode 100644 (file)
index 0000000..30d9d9a
Binary files /dev/null and b/A34183.1C differ
diff --git a/A34211.XX b/A34211.XX
new file mode 100644 (file)
index 0000000..6412fc4
--- /dev/null
+++ b/A34211.XX
@@ -0,0 +1,322 @@
+       .TITLE SUBAN2 -A/N SET FOR 2716-REVISED\r
+       .SBTTL*************************\r
+       .SBTTL*\r
+       .SBTTL* PROGRAMMER: JOHN RAY\r
+       .SBTTL*\r
+       .SBTTL* CHECKER:\r
+       .SBTTL*\r
+       .SBTTL*************************\r
+;\r
+;DATE INITATED: 12/20/78\r
+;PROJECT CHARGE #: 5J121\r
+;DISK #: 18\r
+;HARDWARE REQUIREMENTS:\r
+;\r
+; MSB DISPLAYED FIRST\r
+;\r
+;\r
+;MEMORY REQUIREMENTS:\r
+;\r
+; 2K X 8\r
+;\r
+;\r
+;\r
+;INTERRUPT REQUIREMENTS:\r
+;\r
+;\r
+;\r
+;\r
+;ASSEMBLY COMMAND STRING:\r
+;\r
+;\r
+;\r
+;\r
+;LINK COMMAND STRING:\r
+;\r
+;\r
+;\r
+;\r
+;PROGRAM DESCRIPTION:\r
+;\r
+; ALPHA/NUMBERIC ROM FOR SUBS\r
+; CONTAINS ALPHABET,NUMBERALS,ISLANDS,\r
+; AND SONAR PICTURES\r
+; CONTAINS ISLANDS ON SONAR\r
+;\r
+       .ASECT\r
+       .RADIX  16\r
+       .ENABL M68\r
+       .LIST   MEB\r
+       .NLIST  BYT\r
+       .=1000\r
+       .MACRO  .LINE X\r
+       .IRP A,<'X'>\r
+       .BYTE   <A&16.*8>+<A&32.*2>+<A&64./2>+<A&128./8>+<A&1*8>+<A&2*2>+<A&4/2>+<A&8/8>\r
+       .ENDR\r
+       .ENDM\r
+       .MACRO P,Q\r
+       .IRP X,<Q>\r
+       .WORD 0'X\r
+       .ENDR\r
+       .ENDM\r
+       .NLIST  ME\r
+A000:  .LINE   <000,000,000,000,000,000,000,000>       ;SPACE (REALLY @)\r
+A010:  .LINE   <000,0C1,063,036,036,0F7,036,036>       ;A\r
+       .LIST   ME\r
+A020:  .LINE   <000,0F3,036,036,0F3,036,036,0F3>\r
+       .NLIST  ME\r
+A030:  .LINE   <000,0C3,066,030,030,030,066,0C3>\r
+A040:  .LINE   <000,0F1,033,036,036,036,033,0F1>\r
+A050:  .LINE   <000,0F3,030,030,0F1,030,030,0F7>\r
+A060:  .LINE   <000,0F7,030,030,0F3,030,030,030>\r
+A070:  .LINE   <000,0C7,060,030,037,036,066,0C7>\r
+A080:  .LINE   <000,036,036,036,0F7,036,036,036>\r
+A090:  .LINE   <000,0F3,0C0,0C0,0C0,0C0,0C0,0F3>\r
+A0A0:  .LINE   <000,006,006,006,006,006,036,0E3>\r
+A0B0:  .LINE   <000,036,033,0B1,0F0,0F1,0B3,037>\r
+A0C0:  .LINE   <000,030,030,030,030,030,030,0F7>\r
+A0D0:  .LINE   <000,036,077,0F7,0F7,0B6,036,036>\r
+A0E0:  .LINE   <000,036,076,0F6,0F7,0B7,037,036>\r
+A0F0:  .LINE   <000,0E3,036,036,036,036,036,0E3>\r
+A100:  .LINE   <000,0F3,036,036,036,0F3,030,030>\r
+A110:  P       <0FE,0C0C0,0FEC0,0C3C3> ;F.\r
+A120:  .LINE   <000,0F3,036,036,037,0F1,0B3,037>\r
+A130:  .LINE   <000,0E1,033,030,0E3,006,036,0E3>\r
+A140:  .LINE   <000,0F3,0C0,0C0,0C0,0C0,0C0,0C0>\r
+A150:  .LINE   <000,036,036,036,036,036,036,0E3>\r
+A160:  .LINE   <000,036,036,036,077,0E3,0C1,080>\r
+A170:  .LINE   <000,036,036,0B6,0F7,0F7,077,036>\r
+A180:  P       <0C4,0C4C0,0C0C0,0C0FE> ;L'\r
+A190:  .LINE   <000,033,033,033,0E1,0C0,0C0,0C0>\r
+A1A0:  .LINE   <000,0F7,007,083,0C1,0E0,070,0F7>       ;Z\r
+       .LINE   <0FF,0FF,0FF,0FF,0FF,0FF,0FF,0FF>       ;SOLID\r
+       P       <1,70E,0C1F,7FFF>                       ;1C ISLANDS\r
+       P       <0C186,1E,0FCF8,0F8F0>                  ;1D\r
+       P       <103,70F,1F1F,0F07>                     ;1E\r
+       P       <0E0E0,0C0C0,8080,0>                    ;1F\r
+       P       <303,707,0F1F,7FFF>                     ;20\r
+       P       <0FFFE,0FEFC,0FCF8,0F0E0>               ;21\r
+       P       <0F1FB,0FEFC,0F8F0,0C080>               ;22\r
+       P       <101,0,107,0F01>                        ;23\r
+       P       <107,1F7F,0FFFF,0FFFF>                  ;24\r
+       P       <0FEFC,0F8F8,0F0F0,0E080>               ;25\r
+       P       <0FFFF,0FFFF,0,0>                       ;26\r
+       P       <0F0E0,0C000,0,0>                       ;27\r
+       P       <0F0F,0F0F,0F0F,0F0F>                   ;28 BOUNDARIES\r
+       P       <0F0F0,0F0F0,0F0F0,0F0F0>               ;29\r
+       P       <0FFFF,0FFFF,0,0>                       ;2A\r
+       P       <0,0,0FFFF,0FFFF>                       ;2B\r
+       P       <018,1800,018,1800>                     ;2C COLON\r
+       P       <0FCFC,0FCFE,0FEFE,0FEFE>               ;2D -ISLAND 2\r
+       P       <0F0F,703,301,0>                        ;2E\r
+       P       <0FFFF,0FFFC,0F0E0,0C080>               ;2F\r
+A300:  .LINE   <000,0C1,023,036,036,036,062,0C1>       ;0 (ZERO)\r
+A310:  .LINE   <000,0C0,0E0,0C0,0C0,0C0,0C0,0F3>\r
+A320:  .LINE   <000,0E3,036,007,0C3,0E1,070,0F7>\r
+A330:  .LINE   <000,0E7,003,081,0C3,006,036,0E3>\r
+A340:  .LINE   <000,083,0C3,063,033,0F7,003,003>\r
+A350:  .LINE   <000,0F3,030,0F3,006,006,036,0E3>\r
+A360:  .LINE   <000,0C3,060,030,0F3,036,036,0E3>\r
+A370:  .LINE   <000,0F7,036,003,081,0C0,0C0,0C0>\r
+A380:  .LINE   <000,0E1,032,072,0E1,097,016,0E3>\r
+A390:  .LINE   <000,0E3,036,036,0E7,006,003,0E1>       ;9\r
+       P       <0FEFC,0F800,0,0>                       ;3A -ISLAND 2\r
+       P       <1,103,33F,7F3F>                        ;3B\r
+       P       <8000,0,80C0,0FCFF>                     ;3C\r
+       P       <80,8000,0,0>                           ;3D\r
+       P       <1030,6060,4000,0>                      ;3E -SONAR ISLAND 1\r
+       P       <0,2,604,0C08>                          ;3F -SONAR ISLAND 2\r
+       P       <F00E,100,0,0>          ;40\r
+       P       <0,8040,2010,0804>      ;41\r
+       P       <0402,0202,0101,0101>   ;42\r
+       P       <8080,8080,8080,8080>   ;43\r
+       P       <F08E,8180,8080,8080>   ;44\r
+       P       <8080,8080,8080,8080>   ;45\r
+       P       <F04E,4140,4040,8080>   ;46\r
+       P       <4040,4080,8080,8080>   ;47\r
+       P       <F01E,2120,2020,4040>   ;48\r
+       P       <2020,4040,4080,8080>   ;49\r
+       P       <F00E,0908,1010,1020>   ;4A\r
+       P       <1010,2020,4040,8080>   ;4B\r
+       P       <F00E,0304,0408,0810>   ;4C\r
+       P       <0810,1020,2040,8080>   ;4D\r
+       P       <F00E,0101,0202,0408>   ;4E\r
+       P       <0408,1010,2040,4080>   ;4F\r
+       P       <F00E,0100,0001,0204>   ;50\r
+       P       <0,8040,A010,0804>      ;51\r
+       P       <0204,0808,1020,4080>   ;52\r
+       P       <F00E,0100,0,0001>      ;53\r
+       P       <0,8040,2050,8804>      ;54\r
+       P       <0001,020C,1020,4080>   ;55\r
+       P       <8402,0202,0101,0101>   ;56\r
+       P       <0,8040,2010,2844>      ;57\r
+       P       <0,0102,0C10,6080>      ;58\r
+       P       <2442,8202,0101,0101>   ;59\r
+       P       <0,8040,2010,0814>      ;5A\r
+       P       <0,0001,0618,20C0>      ;5B\r
+       P       <0C32,4282,0101,0101>   ;5C\r
+       P       <0,0,030C,30C0>         ;5D\r
+       P       <0406,1A62,8101,0101>   ;5E\r
+       P       <0,0,0003,1CE0>         ;5F\r
+       P       <0402,020E,7181,0101>   ;60\r
+       P       <0,0,0,07F8>            ;61\r
+       P       <0402,0202,033D,C101>   ;62\r
+       P       <0,0,0,00FF>            ;63\r
+       P       <0402,0202,0101,3FC1>   ;64\r
+       P       <0101,0101,0202,0204>   ;65\r
+       P       <0408,1020,4080,0>      ;66\r
+       P       <0,0,0001,0EF0>         ;67\r
+       P       <FF00,2,604,0C08>       ;68\r
+       P       <FF01,0101,0202,0204>   ;69\r
+       P       <FF00,2,604,0C08>       ;6A\r
+       P       <C13F,0101,0202,0204>   ;6B\r
+       P       <F807,2,604,0C08>       ;6C\r
+       P       <01C1,3D03,0202,0204>   ;6D\r
+       P       <E01C,302,604,0C08>     ;6E\r
+       P       <0101,8171,0E02,0204>   ;6F\r
+       P       <C030,0C03,604,0C08>    ;70\r
+       P       <0101,0181,621A,0604>   ;71\r
+       P       <C020,1806,704,0C08>    ;72\r
+       P       <0101,0101,8242,320C>   ;73\r
+       P       <8060,100E,0605,0C08>   ;74\r
+       P       <0101,0101,0282,4224>   ;75\r
+       P       <1408,1020,4080,0>      ;76\r
+       P       <8040,2012,0E06,0D08>   ;77\r
+       P       <0101,0101,0202,0284>   ;78\r
+       P       <4428,1020,4080,0>      ;79\r
+       P       <8040,2012,0E0C,0C0A>   ;7A\r
+       P       <0100,0000,0001,0EF0>   ;7B\r
+       P       <0488,5020,4080,0>      ;7C\r
+       P       <8040,4022,1614,0C0C>   ;7D\r
+       P       <0402,0100,0001,0EF0>   ;7E\r
+       P       <0408,10A0,4080,0>      ;7F\r
+       P       <8080,4022,2614,1C08>   ;80\r
+       P       <0804,0202,0101,0EF0>   ;81\r
+       P       <8080,4042,2624,1C18>   ;82\r
+       P       <1008,0804,0403,0EF0>   ;83\r
+       P       <8080,8042,4644,2C28>   ;84\r
+       P       <2010,1010,0809,0EF0>   ;85\r
+       P       <8080,8082,8644,4C48>   ;86\r
+       P       <4040,2020,2021,1EF0>   ;87\r
+       P       <8080,8082,8684,8C88>   ;88\r
+       P       <8080,4040,4041,4EF0>   ;89\r
+       P       <0,0,0080,700F>                 ;8A\r
+       P       <2010,0804,0201,0>      ;8B\r
+       P       <8080,8080,4040,4020>   ;8C\r
+       P       <0101,0101,0101,0101>   ;8D\r
+       P       <0101,0101,0181,710F>   ;8E\r
+       P       <0101,0101,0101,0101>   ;8F\r
+       P       <0101,0202,0282,720F>   ;90\r
+       P       <0101,0101,0102,0202>   ;91\r
+       P       <0202,0404,0484,780F>   ;92\r
+       P       <0101,0102,0202,0404>   ;93\r
+       P       <0408,0808,1090,700F>   ;94\r
+       P       <0101,0202,0404,0808>   ;95\r
+       P       <0810,1020,20C0,700F>   ;96\r
+       P       <0101,0204,0408,0810>   ;97\r
+       P       <1020,4040,8080,700F>   ;98\r
+       P       <0102,0204,0808,1020>   ;99\r
+       P       <4040,8000,0080,700F>   ;9A\r
+       P       <2010,0805,0201,0>      ;9B\r
+       P       <0102,0408,1010,2040>   ;9C\r
+       P       <8000,0,0080,700F>      ;9D\r
+       P       <2011,0A04,0201,0>      ;9E\r
+       P       <0102,0408,3040,8000>   ;9F\r
+       P       <8080,8080,4040,4021>   ;A0\r
+       P       <2214,0804,0201,0>      ;A1\r
+       P       <0106,0830,4080,0>      ;A2\r
+       P       <8080,8080,4041,4224>   ;A3\r
+       P       <2810,0804,0201,0>      ;A4\r
+       P       <0304,1860,8000,0>      ;A5\r
+       P       <8080,8080,4142,4C30>   ;A6\r
+       P       <030C,30C0,0,0>         ;A7\r
+       P       <8080,8081,4658,6020>   ;A8\r
+       P       <0738,C000,0,0>         ;A9\r
+       P       <8080,818E,7040,4020>   ;AA\r
+       P       <1FE0,0,0,0>            ;AB\r
+       P       <8083,BCC0,4040,4020>   ;AC\r
+       P       <FF00,0,0,0>            ;AD\r
+       P       <837C,8080,4040,4020>   ;AE\r
+       P       <2040,4040,8080,8080>   ;AF\r
+       P       <0,0102,0408,1020>      ;B0\r
+       P       <0F70,8000,0,0>         ;B1\r
+       P       <1030,6060,4000,0FF>    ;B2\r
+       P       <2040,4040,8080,80FF>   ;B3\r
+       P       <1030,6060,4000,0FF>    ;B4\r
+       P       <2040,4040,8080,FC83>   ;B5\r
+       P       <1030,6060,4000,E01F>   ;B6\r
+       P       <2040,4040,C0BC,8380>   ;B7\r
+       P       <1030,6060,40C0,3807>   ;B8\r
+       P       <2040,4070,8E81,8080>   ;B9\r
+       P       <1030,6060,C030,0C03>   ;BA\r
+       P       <2060,5846,8180,8080>   ;BB\r
+       P       <1030,60E0,6018,0403>   ;BC\r
+       P       <304C,4241,8080,8080>   ;BD\r
+       P       <1030,E060,7008,601>    ;BE\r
+       P       <2442,4140,8080,8080>   ;BF\r
+       P       <0,0102,0408,1028>      ;C0\r
+       P       <10B0,6070,4804,201>    ;C1\r
+       P       <2140,4040,8080,8080>   ;C2\r
+       P       <0,0102,0408,1422>      ;C3\r
+       P       <5030,7070,4804,201>    ;C4\r
+       P       <0F70,8000,0,0080>      ;C5\r
+       P       <0,0102,040A,1120>      ;C6\r
+       P       <3030,6868,4402,201>    ;C7\r
+       P       <0F70,8000,0080,4020>   ;C8\r
+       P       <0,0102,0508,1020>      ;C9\r
+       P       <1038,6864,4402,101>    ;CA\r
+       P       <0F70,8080,4040,2010>   ;CB\r
+       P       <1838,6464,4202,101>    ;CC\r
+       P       <0F70,C020,2010,1008>   ;CD\r
+       P       <1434,6262,4201,101>    ;CE\r
+       P       <0F70,9010,0808,0804>   ;CF\r
+       P       <1232,6261,4101,101>    ;D0\r
+       P       <0F78,8404,0404,0202>   ;D1\r
+       P       <1131,6161,4101,101>    ;D2\r
+       P       <0F72,8202,0202,0101>   ;D3\r
+       P       <0F00E,6160,0,0>        ;D4\r
+       P       <0F00E,0100,0060,6000>  ;D5\r
+       P       <0F00E,0100,0606,0000>  ;D6\r
+       P       <0,8040,2010,0C8C4>     ;D7\r
+       P       <0462,6202,0101,0101>   ;D8\r
+       P       <0402,0202,0161,6101>   ;D9\r
+       P       <0402,0202,010D,0D01>   ;DA\r
+       P       <0161,6101,0202,0204>   ;DB\r
+       P       <010D,0D01,0202,0204>   ;DC\r
+       P       <0101,0101,0262,6204>   ;DD\r
+       P       <0C4C8,1020,4080,0>     ;DE\r
+       P       <0006,0600,0001,0EF0>   ;DF\r
+       P       <0060,6000,0001,0EF0>   ;E0\r
+       P       <0,0,6061,0EF0>         ;E1\r
+       P       <0006,0600,0080,700F>   ;E2\r
+       P       <0,0,0686,700F>         ;E3\r
+       P       <0060,6000,0080,700F>   ;E4\r
+       P       <2313,0804,0201,0>      ;E5\r
+       P       <8080,8080,4046,4620>   ;E6\r
+       P       <8086,8680,4040,4020>   ;E7\r
+       P       <80B0,0B080,4040,4020>  ;E8\r
+       P       <2040,4040,8086,8680>   ;E9\r
+       P       <2040,4040,80B0,0B080>  ;EA\r
+       P       <2046,4640,8080,8080>   ;EB\r
+       P       <0,0102,0408,1323>      ;EC\r
+       P       <0F70,8000,0060,6000>   ;ED\r
+       P       <0F70,8000,0006,0600>   ;EE\r
+       P       <0F70,8606,0,0>         ;EF\r
+       P       <C0C0,0,0,0>            ;BLIP 0-F0\r
+       P       <0,C0C0,0,0>            ;BLIP 1-F1\r
+       P       <0,0,C0C0,0>            ;BLIP 2-F2\r
+       P       <0,0,0,C0C0>            ;BLIP 3-F3\r
+       P       <3030,0,0,0>            ;BLIP 4-F4\r
+       P       <0,3030,0,0>            ;BLIP 5-F5\r
+       P       <0,0,3030,0>            ;BLIP 6-F6\r
+       P       <0,0,0,3030>            ;BLIP 7-F7\r
+       P       <0C0C,0,0,0>            ;BLIP 8-F8\r
+       P       <0,0C0C,0,0>            ;BLIP 9-F9\r
+       P       <0,0,0C0C,0>            ;BLIP A-FA\r
+       P       <0,0,0,0C0C>            ;BLIP B-FB\r
+       P       <0303,0,0,0>            ;BLIP C-FC\r
+       P       <0,0303,0,0>            ;BLIP D-FD\r
+       P       <0,0,0303,0>            ;BLIP E-FE\r
+       P       <0,0,0,0303>            ;BLIP F-FF\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
\ No newline at end of file
diff --git a/A34216.XX b/A34216.XX
new file mode 100644 (file)
index 0000000..05584b1
Binary files /dev/null and b/A34216.XX differ
diff --git a/SUBCN1.XX b/SUBCN1.XX
new file mode 100644 (file)
index 0000000..6a6f940
--- /dev/null
+++ b/SUBCN1.XX
@@ -0,0 +1,437 @@
+;        .TITLE SUBCN1- COIN & CREDIT ACCRUER\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\r
+        .SBTTL EXPLANATION\r
+        .RADIX 16\r
+       .ENABL LC\r
+        .LIST MEB\r
+;COIN ROUTINE FOR 16-OPTION STANDARD AS PER MEMO\r
+;FROM STEVE BRISTOW DATED 9.27.77 OR 4-OPTION STANDARD\r
+;PER MEMO FROM FRANK BALLOUZ 4/20/78\r
+;\r
+        .SBTTL DEFAULT ASSIGNMENTS\r
+;THESE DEFAULTS CONFIGURE FOR SPRINT4 HARDWARE\r
+        .LIST CND\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+        .IIF NDF,OFFSET,OFFSET=2        ;SWITCHES AND STATUS BYTES TWO-APART\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
+        .IIF NDF,SHRCMD,SHRCMD=1        ;SHARE A BYTE FOR CMODE, FIRST\r
+        .IIF NDF,LONGST,LONGST=1        ;USE LONG (1/2 SEC) STRINGTIMER\r
+        .IIF NDF,COIN67,COIN67=0        ;COINS NOT IN D7,D6 OF SAME BYTE\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
+       .IIF NDF,CTCOIN,CTCOIN=0        ;SET TO ONE TO COUNT TOTAL COINS\r
+       .IIF NDF,CTCRED,CTCRED=0        ;SET TO ONE TO COUNT TOTAL CREDITS\r
+       .IIF NDF,PULSE,PULSE=4          ;4 FRAME (66 MS.) PULSE FOR COIN-COUNTER\r
+        .IF NE,CMZP\r
+        .MACRO GCM\r
+        LDA Z,$CMODE            ;GET COIN MODE FROM ZERO-PAGE\r
+        .IIF NE,SHRCMD, AND I,MODES-1&0FF       ;STRIP "FIRST"\r
+        .ENDM\r
+        .ENDC\r
+        .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\r
+       .IF NE,MODES\r
+       .IF NE,CMZP\r
+        .GLOBL $CMODE                   ;INPUT COIN MODE\r
+       .ENDC\r
+       .ENDC\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
+       .IF NE,LONGST!PULSE-2           ;IF LONG STRING-TIMER OR PULSES, WE NEED\r
+       .GLOBL $INTCT                   ;INTERRUPT COUNTER\r
+       .ENDC\r
+       .IF EQ,MODES-16\r
+        .GLOBL $FIRST                   ;COULD SHARE BYTE WITH CMODE\r
+       .ENDC\r
+        .GLOBL $LMTIM,$CNCT             ;SLAM-TIMER, COINCOUNT\r
+       .IF NE,MODES\r
+        .GLOBL $$CRDT                   ;RESULT OF ALL THIS\r
+       .ENDC\r
+       .IF NE,CTCOIN!CTCRED\r
+       .GLOBL $CCTIM\r
+       .ENDC\r
+        .IF NE,MODES&<MODES-4>&<MODES-16.>\r
+        .ERROR                  ;3 FLAVORS-0,4, OR 16 MODES\r
+        .ENDC\r
+       .IF NE,<PULSE-2>&<PULSE-4>&<PULSE-8>    ;CHECK PULSE LENGTH SPEC'D\r
+       .ERROR                  ;2,4,OR 8 FRAME PULSES ONLY\r
+       .ENDC\r
+        .IIF GT,PRST-31.,PRST=31.\r
+        .IIF GT,POST-63.,POST=63.\r
+        .IF EQ,MODES-16\r
+        .REPT 0\r
+When a coin is detected, the coin-count ($CNCT) is incremented.  Then the  "price"  of  "x\r
+credits" is fetched from CPTAB.  If the coin-count.GE.price, then credit is incremented as\r
+indicated in CPTAB.\r
+An entry in CPTAB looks like:\r
+\r
+        (XXXXFAAA)=1 BYTE\r
+        XXXX = CREDIT, I.E., no. of plays\r
+        F    = 1 IF later coins count one more credit than first coin\r
+        AAA = PRICE, I.E., no. of coins for XXXX CREDITS\r
+\r
+Thus any variation from 1 PLAY/7 COINS to 16 PLAYS/1 COIN is possible\r
+\r
+The index into CPTAB is created as follows:\r
+        (XXXACCCC)=1 BYTE\r
+        X : ALWAYS ZERO\r
+        A : 0 = LEFT coin mech\r
+            1 = RIGHT coin mech\r
+        cccc:   coin mode (0000-1111)\r
+        .endr\r
+        .endc\r
+        .rept 0\r
+        The coin routine assumes the presence of the following .GLOBL variables:\r
+   1) $$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
+   2) $CMODE:   base page byte that contains the coin option  switches  in  its  low-order\r
+        nybble  (high true).  You must put it there.  this is not used if flag CMZP=0.  In\r
+        this case you must define a macro to get the coin mode in the lsb's  of  the  ACC,\r
+        clearing the msb's, not disturbing carry\r
+   3) $CNSTT:   Two base page bytes ($CNSTT, $CNSTT+OFFSET) which should be initialized to\r
+        00 (the timers for coin detection).\r
+   4) $COINA:   Two locations containing coin switches in D7 Left mech  at  $COINA,  Right\r
+        mech  at  $COINA+OFFSET.   If  COIN67=1,  Switches  are  both in $COINA, D7-Right,\r
+        D6-Left.\r
+   5) $FIRST:   Base page byte.  Flag indicating whether first  coin  has  been  accepted.\r
+        Must  be initialized to plus (or zero, if SHRCMD=0) and reset to plus (or zero) at\r
+        the end of a game.  All other bits are ignored/maintained if the  flag  SHRCMD  is\r
+        set non-zero.  Used only if MODES=16\r
+   6) $CNCT:    2 base page bytes ($CNCT, $CNCT+OFFSET) which must be initialized to  zero\r
+        on pwron - coin counters (only one is used if MODES = 0 or 4)\r
+   7) $PSTSL:   Pair of base page bytes  ($PSTSL,  $PSTSL+OFFSET)used  to  time  post-coin\r
+        slam.\r
+   8) $LAM:     Address of the SLAM switch.  the bit position inside $LAM is specified  by\r
+        $LMBIT (see below)\r
+   9) $LMTIM:   Base  page  byte  used  as  a  timer  for  pre-slam  protection.   May  be\r
+        initialized  to  FF  at  pwron  to  disallow  coin input for 4 seconds.  Coins are\r
+        disallowed for two frames anyway.\r
+   10) $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
+   11) $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
+   12) $CCTIM:  TIMER FOR PULSES OUTPUT TO ELECTRO-MECHANICAL COUNTER. IF CTCOIN\r
+       OR CTCRED IS NON-ZERO, ROUTINE WILL RETURN WITH CARRY SET IF COIN\r
+       COUNTER SHOULD BE TURNED ON, CLEARED FOR OFF.\r
+Space requirements:\r
+                RAM: 9 bytes (8 if CMZP=0 or SHRCMD=1)\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
+SAMPLE BASE PAGE ALLOCATION:  (WHERE OFFSET=2)\r
+        $FIRST: .BLKB 1\r
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF USED)\r
+        $$CRDT: .BLKB 1\r
+        $CMODE: .BLKB 1         ;OR CMODE=FIRST\r
+        $PSTSL: .BLKB 1\r
+        $LMTIM: .BLKB 1\r
+                .BLKB 1                ;$PSTSL FOR SECOND MECH\r
+        $CNCT:  .BLKB 4\r
+        $CNSTT  =$CNCT+1\r
+        .ENDR\r
+        .IF EQ,MODES-16\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    2 COINS/PLAY-LEFT AND RIGHT\r
+  1:    1 COIN/PLAY-LEFT AND RIGHT\r
+  2:    2 PLAYS/COIN-LEFT AND RIGHT\r
+  3:    3 PLAYS/COIN-LEFT AND RIGHT\r
+  4:    4 PLAYS/COIN-LEFT AND RIGHT\r
+  5:    FIRST COIN-1 PLAY; SECOND AND EXTRA COINS-2 PLAYS/COIN\r
+  6:    FIRST COIN-2 PLAYS; SECOND AND EXTRA COINS-3 PLAYS/COIN\r
+  7:    LEFT=2 COINS/PLAY\r
+        RIGHT=1 COIN/PLAY\r
+  8:    LEFT=1 COIN/PLAY\r
+        RIGHT=1 COIN/2 PLAYS\r
+  9:    LEFT=2 PLAYS/COIN\r
+        RIGHT=4 PLAYS/COIN\r
+  A:    LEFT=FIRST COIN-1 PLAY; SECOND AND EXTRA COINS-2 PLAYS/COIN\r
+        RIGHT=FIRST COIN-3 PLAYS; SECOND AND EXTRA COINS-4 PLAYS/COIN\r
+  B:    LEFT=FIRST COIN-2 PLAYS; SECOND AND EXTRA COINS-3 PLAYS/COIN\r
+        RIGHT=FIRST COIN-5 PLAYS; SECOND AND EXTRA COINS-6 PLAYS/COIN\r
+  C:    LEFT=FIRST COIN-3 PLAYS; SECOND AND EXTRA COINS-4 PLAYS/COIN\r
+        RIGHT=FIRST COIN-7 PLAYS; SECOND AND EXTRA COINS-8 PLAYS/COIN\r
+  D:    LEFT=3 COINS/PLAY\r
+        RIGHT=1 COIN/PLAY\r
+  E:    LEFT=1 COIN/PLAY\r
+        RIGHT=3 PLAYS/COIN\r
+  F:    LEFT=3 PLAYS/COIN\r
+        RIGHT=6 PLAYS/COIN\r
+        .ENDR\r
+        .ENDC\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\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.\r
+        .ENDR\r
+\f        .SBTTL MAINLOOP\r
+;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT\r
+;ACTUALLY ASSEMBLED.\r
+MOOLAH:\r
+        LDX I,OFFSET            ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67\r
+DETECT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+        LDA A,$COINA            ;GET COIN SWITCHES\r
+DETECT: ASL\r
+        .ENDC\r
+        LDA ZX,$CNSTT\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\r
+;       [AND I,31.]             ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR.\r
+        BEQ 1$                  ;STICK AT 0 (TERMINAL COUNT)\r
+        .IF NE,LONGST\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\r
+        TYA                     ;STATUS BACK INTO ACC\r
+        BCC 1$                  ;SKIP IF NOT BOTH ONES\r
+10$:    SBC I,1                 ;CARRY SET\r
+        .IFF\r
+        .IF EQ,COIN\r
+        SBC I,0                 ;CARRY CLEAR, THIS SUBTRACTS ONE\r
+        .IFF\r
+        SBC I,1                 ;CARRY SET OR WE WOULDN'T BE HERE\r
+        .ENDC                   ;COIN CONDITIONAL\r
+        .ENDC                   ;LONGST CONDITIONAL\r
+1$:     STA ZX,$CNSTT           ;SAVE UPDATED STATUS\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\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
+        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, RETURN\r
+        DEC ZX,$PSTSL           ;RUN TIMER\r
+        BNE 8$                  ;NOT DONE, RETURN\r
+        SEC                     ;WHEN IT BECOMES ZERO, INDICATE A COIN\r
+        BCS 8$                  ;*** ALWAYS\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
+        LDA ZX,$CNSTT           ;GET STATUS AGAIN\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
+        STA ZX,$CNSTT           ;SAVE RESET STATUS\r
+;       [CLC]                   DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR)\r
+        LDA ZX,$PSTSL           ;CHECK HOWIES ASSUMPTION\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
+        STA ZX,$PSTSL           ;DELAY ACCEPTANCE FOR POST 60 SEC.\r
+        \r
+8$:                             ;CARRY=1 IF COIN FALLS OUT\r
+        .IF EQ,MODES-4&MODES    ;IF MODES=0 OR 4\r
+        BCC 9$                  ;INC COIN CNT IF CARRY SET\r
+        INC $CNCT\r
+       .IF NE,CTCOIN           ;IF COIN COUNTER USED\r
+       INC $CCTIM              ;INIT COIN PULSE\r
+       .ENDC\r
+9$:\r
+        .IFF                    ;IF MODES=16\r
+CONVRT:                         ;CONVERT COINS TO CREDITS\r
+        GCM                     ;GET COIN MODE IN ACC 0-3\r
+        BCC 20$                 ;CARRY=1 IF COIN WAS DETECTED ELSE ZERO\r
+       .IF NE,CTCOIN           ;IF COIN COUNTER USED\r
+       INC $CCTIM              ;INIT COIN PULSE\r
+       .ENDC\r
+        CMP I,7                 ;MODES 0-6 ARE SPECIAL IN THAT BOTH MECHS COUNT\r
+                                ;THE SAME WAY SO USE ONLY ONE COIN COUNTER\r
+        BPL 10$\r
+        INC Z,$CNCT             ;INCREMENT COMMON COUNTER\r
+        JMP 20$\r
+10$:    INC ZX,$CNCT            ;ELSE INCREMENT APPROPRIATE COUNTER\r
+                                ;CREATE INDEX\r
+20$:\r
+        CPX I,0                 ;IS IT FIRST (LEFT) MECH\r
+        BEQ 40$\r
+        ORA I,10                ;PUT 0,1 AT BIT POITION "A"\r
+40$:    TAY                     ;ACC=INDEX INTO CPTAB\r
+        LDA AY,CPTAB            ;GET NO. OF COINS NEEDED FOR "X" CREDITS FROM CPTAB\r
+        AND I,07                ;  OF COINS IN 3 LSB\r
+        EOR I,0FF\r
+        SEC                     ;NEGATE\r
+        ADC ZX,$CNCT            ;ACC <- COINCT-CPTAP(Y)\r
+        BCC 100$                ;BRANCH ON BORROW\r
+        STA ZX,$CNCT            ;ELSE STORE REDUCED COINCT\r
+        LDA AY,CPTAB            ;GET BACK TABLE ENTRY\r
+        LSR\r
+        LSR\r
+        LSR\r
+        LSR                     ;GET   OF CREDITS IN ACC 0-3, "F" IN CARRY\r
+        LDY Z,$FIRST            ;CHECK FOR FIRST COIN\r
+        .IF NE,SHRCMD\r
+        BMI 50$\r
+        .IFF\r
+        BNE 50$\r
+        .ENDC                   ;SHRCMD CONDITIONAL\r
+        CLC                     ;IF FIRST COIN, CLEAR CARRY\r
+50$:    ADC Z,$$CRDT\r
+       .IF NE,CTCRED           ;IF COUNTING CREDITS\r
+       TAY                     ;SAVE NEW CREDIT\r
+       SEC\r
+       SBC $$CRDT              ;SUB OLD\r
+       CLC\r
+       ADC $CCTIM              ;ADD OFFSET\r
+       STA $CCTIM              ;TO COIN PULSE TIMER\r
+       STY $$CRDT              ;STORE NEW CREDIT\r
+       .IFF\r
+        STA Z,$$CRDT            ;CREDIT=CREDIT+CPTAB(Y)/16.+"F"&(NOT FIRST)\r
+       .ENDC                   ;CTCRED COND.\r
+       .IF NE,SHRCMD\r
+        LDA I,80\r
+        ORA Z,$FIRST\r
+        STA Z,$FIRST\r
+        .IFF\r
+        INC Z,$FIRST            ;A COIN IN EITHER COUNTS AS THE FIRST COIN\r
+        .ENDC                   ;SHRCMD CONDITIONAL\r
+100$:   .IFTF                   ;NO MATTER WHAT NMODES IS\r
+        .IF NE,COIN67\r
+        LDA A,$COINA            ;GET SWITCHES AGAIN\r
+        ASL                     ;D6 INTO SIGN\r
+        .ENDC\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+        .IFF                    ;ONLY FOR MODES=16\r
+        BMI EXIT\r
+        JMP DETECT              ;LOOP FOR SECOND MECH\r
+CPTAB:                                  ;TABLE OF CREDIT/PRICE VALUES\r
+;I.E. FIRST ENTRY (12) READS: 1 CREDIT FOR 2 COINS\r
+        .BYTE 12,11,21,31,41,19,29,12   ;LEFT MECH\r
+        .BYTE 11,21,19,29,39,13,11,31\r
+        .BYTE 12,11,21,31,41,19,29,11   ;RIGHT MECH\r
+        .BYTE 21,41,39,59,79,11,31,61\r
+        .IFT                   ;THAT IS, IF MODES=0 OR 4\r
+        BPL DETECT\r
+        .ENDC\r
+        .IF EQ,MODES-4          ;ONLY IF MODES=4\r
+CONVRT: GCM                     ;GET COIN MODE IN ACC 0,1\r
+        TAY                     ;SAVE IT & TEST IT\r
+        BEQ 2$                  ;IF FREE PLAY, KEEP CREDIT CLEAR\r
+        LSR\r
+        ADC I,0                 ;FORM PRICE (0,1,1,2)\r
+        EOR I,0FF\r
+        SEC                     ;NEGATE\r
+        ADC $CNCT               ;ACC <- COINCT - PRICE\r
+        BCC EXIT                ;BRANCH ON BORROW\r
+        CPY I,2                 ;COIN MODE 2 OR 3?\r
+        BCS 1$                  ;YES, JUST ONE CREDIT\r
+        INC $$CRDT              ;ELSE GIVE TWO FOR MODES 0,1\r
+1$:    .IF NE,CTCRED           ;IF COUNTING CREDITS\r
+       INC $CCTIM              ;INIT COIN PULSE\r
+       .IFTF\r
+       INC $$CRDT\r
+       .IFT\r
+       INC $CCTIM\r
+       .ENDC\r
+2$:     STA $CNCT               ;STORE REDUCED (OR CLEARED) COINCT\r
+        .ENDC\r
+EXIT:  .IF NE,LONGST!<PULSE-2>         ;IF LONG STRING TIMER, OR PULSE>2 FRAMES\r
+       .IIF NE,CNTINT, INC Z,$INTCT            ;COUNT INTERUPTS WHEN REQUESTED\r
+       .ENDC\r
+       .IF NE,CTCRED!CTCOIN            ;INCLUDE PULSER\r
+       .IIF NE,PULSE-2,        LDA Z,$INTCT            ;NEED $INTCT IF PULSE>2\r
+       .IIF EQ,PULSE-4,        LSR                     ;USE LSB IF PULSE=4\r
+       .IF EQ,PULSE-8.\r
+       AND I,3                         ;ISOLATE 2 LSB'S\r
+       CMP I,1                         ;CLEAR CARRY IF 00\r
+       .ENDC\r
+       LDA Z,$CCTIM                    ;GET COIN-COUNTER TIMER\r
+       .IIF NE,PULSE-2,        BCS 2$\r
+       BEQ 2$                          ;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
+2$:    ASL                             ;SET CARRY PER D7 OF TIMER\r
+       .ENDC\r
+       RTS\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
\ No newline at end of file
diff --git a/SUBS.DOC b/SUBS.DOC
new file mode 100644 (file)
index 0000000..2808f2c
Binary files /dev/null and b/SUBS.DOC differ
diff --git a/SUBS.MAP b/SUBS.MAP
new file mode 100644 (file)
index 0000000..f6c7595
Binary files /dev/null and b/SUBS.MAP differ