]> github.com/historicalsource and other repositories - football-ii-retrofit.git/commitdiff
First Commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:50:10 +0000 (18:50 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 22:50:10 +0000 (18:50 -0400)
A35340.1A [new file with mode: 0644]
A35340.1B [new file with mode: 0644]
A35340.1C [new file with mode: 0644]
A35340.1D [new file with mode: 0644]
COIN65.XX [new file with mode: 0644]
FOOTII.DOC [new file with mode: 0644]
FOOTII.MAP [new file with mode: 0644]
NFCOMN.XX [new file with mode: 0644]

diff --git a/A35340.1A b/A35340.1A
new file mode 100644 (file)
index 0000000..ee80aa6
--- /dev/null
+++ b/A35340.1A
@@ -0,0 +1,2729 @@
+       .TITLE NFUTBL\r
+       .RADIX 16\r
+       .IIF NDF,NTB,NTB=1\r
+       .ASECT\r
+       .ENABLE AMA\r
+       .SBTTL ******************************\r
+       .SBTTL * PROGRAMER: NORM AVELLAR    *\r
+       .SBTTL *            (MIKE ALBAUGH)  *\r
+       .SBTTL * CHECKER:                   *\r
+       .SBTTL *                            *\r
+       .SBTTL ******************************\r
+       .REPT 0\r
+\r
+DATE INITIATED: 22-MAR-78\r
+PROJECT CHARGE #: 5P221\r
+DISK #:        48 AND BACKUP B32\r
+HARDWARE REQUIREMENTS: MONSTER-MAN PCB, CONSISTING OF BASIC MOC16\r
+                       WITH ADDITIONS  1) HORIZONTAL SCROLLING FOR PLAYFIELD\r
+                                       2) 4 ANODE MULTIPLEXED LED DISPLAYS\r
+                                       3) ALPHANUMERICS ON EDGES OF PLAYFIELD,\r
+                                          3 USABLE ROWS PER EDGE.\r
+\r
+MEMORY REQUIREMENTS:   768 BYTES WORKING RAM\r
+                       256 BYTES ALPHANUMERICS RAM\r
+                       960 BYTES SCROLL-FIELD RAM\r
+                        64 BYTES MOTION-OBJECT PARAMETERS\r
+\r
+                        6K BYTES PROGRAM ROM\r
+\r
+INTERRUPT REQUIREMENTS:        FOUR IRQ'S PER FRAME. THESE ARE IN GENERAL ON THE\r
+                       FALLING EDGE OF 32V, WITH THE EXCEPTION OF THE LAST,\r
+                       WHICH OCCURS AT LINE 240, RATHER THAN LINE 256, TO ALLOW\r
+                       MAXIMUM USE OF VERTICAL RETRACE TIME.TIMING OF THESE\r
+                       IRQ'S IS IMPORTANT, BECAUSE THE ANODE DRIVERS OF THE\r
+                       MULTIPLEXED LED DISPLAY ARE DRIVEN DIRECTLY BY\r
+                       V-FUNCTIONS, AND THE CATHODES ARE HELD OFF BY THE IRQ\r
+                       SIGNAL. IN PARTICULAR: A) THE IRQ MUST BE ACKNOWLEDGED\r
+                       (BY A STORE TO INTACK, LOCATION 3000 HEX) BEFORE NEW\r
+                       INFORMATION FOR THE CATHODES IS WRITTEN. B) THE IRQ MUST\r
+                       NOT (!) BE ACKNOWLEDGED BETWEEN LINES 240 AND 256, AS IT\r
+                       WILL BE RE-ASSERTED AT LINE 256 IN THAT CASE. FOR THIS\r
+                       REASON THE INPUT "VBLANK" (D7, LOCATION 4001) IS REALLY\r
+                       THE SIGNAL "ENDSCREEN" WHICH IS ASSERTED ONLY IN LINES\r
+                       240 THRU 256.\r
+\r
+ASSEMBLY COMMAND STRING:*NFUTBL,NFUTBL=NFUTBL/C\r
+\r
+LINK COMMAND STRING:*PP:/L,RK1:NFMAP.LST=NFUTBL,NFCHOR,NFCOIN,NFINT\r
+\r
+PROGRAM DESCRIPTION: MAIN PROGRAM FOR "MONSTER-MAN FOOTBALL". USES TABLES\r
+                       IN FBCHOR TO DIRECT PLAYS. USES STANDARD COIN ROUTINE,\r
+                       (CUSTOMIZED BY FBCONF) ON FILE FBCOIN.OBJ FOR HANDLING\r
+                       COINS.  FBINT IS INTERRUPT, TEST, AND VECTORS.  FBCOMN (INCLUDED)\r
+                       DEFINES STORAGE. GAME IS ON "EACH COIN ADDS TIME" BASIS\r
+       .ENDR\r
+NPLAYS=4\r
+       .GLOBL $CNCT,$CMODE\r
+       .INCLUDE NFCOMN\r
+\r
+\f      .IIF NDF,AIM,AIM=1      ;DEFAULT TO AIM\r
+       .IF NE,AIM\r
+       .SBTTL AIM,DEBUG STUFF\r
+       .=PROG-200              ;HANG THIS UNDERNEATH\r
+AIMENT:        SEI\r
+       LDA I,0\r
+       .=.-1\r
+       .WORD IRQ               ;FORM "LDA I,IRQ&0FF"\r
+       .=.-1                   ;BACKSPACE OVER HIGH BYTE\r
+       STA A,0F7C8             ;STORE IN AIM'S "VECTOR"\r
+       LDA I,0\r
+       .=.-1\r
+       .ENABL M68              ;SWAB FOLLOWING WORD\r
+       .WORD IRQ               ;FORM "LDA I,IRQ/100"\r
+       .DSABL M68              ;BACK TO L,H\r
+       .=.-1                   ;BACKSPACE OVER LOW BYTE\r
+       STA A,0F7C9\r
+       LDA I,0\r
+       STA A,100\r
+       STA A,101               ;CORK TRACE LIST\r
+       STA A,APAT1             ;BREAK @ APAT1\r
+       LDA I,TRACE&0FF         ;PATCH "JSR FANS"\r
+       STA A,APAT0+1           ;TO BE "JSR TRACE"\r
+       LDA I,TRACE/100\r
+       STA A,APAT0+2\r
+       LDA I,AIMENT/100        ;PATCH IRQ TO\r
+       STA A,IRQ+14            ;INGNORE THIS\r
+       JMP RESET\r
+       .SBTTL TRACE UTILITY\r
+;BEGIN INTEGER J, WORD ARRAY TSRC, BYTE ARRAY TDST\r
+;J:=0\r
+;WHILE (TSRC(J).NE.0) DO\r
+;SCREEN (TDST(J))=MEMORY (TSRC(J))\r
+;J:=J+1\r
+;END\r
+TRACE: LDY I,0\r
+       STY J\r
+1$:    LDY J\r
+       LDA AY,TSRC\r
+       STA ADL\r
+       LDA AY,TSRC+1\r
+       STA ADH                 ;BUILD PTR TO BYTE\r
+       ORA ADL\r
+       BEQ 2$                  ;TRCING 0000=END\r
+       LDX I,0\r
+       LDA NX,ADL              ;GET BYTE\r
+       JSR ASCAX               ;CONVERT TO ASCII IN A,X\r
+       PHA\r
+       LDA AY,TDST\r
+       INY\r
+       INY\r
+       INY\r
+       STY J                   ;SAVE LIST PTR\r
+       TAY                     ;POINT TO SCREEN\r
+       PLA                     ;GET HIGH NYBBLE\r
+       JSR WRTAN               ;WRITE ALPHANUMERICS\r
+       TXA                     ;LOW NYBBLE\r
+       JSR WRTAN\r
+       JMP 1$\r
+2$:    JMP FANS                ;DO WHAT HE WANTED\r
+       .ENDC\r
+       .PAGE\r
+       .SBTTL INITIALIZE\r
+       .=PROG\r
+START: CLI\r
+       LDA INTCNT              ;"RANDOM " #\r
+       AND I,2\r
+       STA OFFENS\r
+       JSR STRTGM              ;"START GAME"\r
+       .SBTTL "MAIN-LOOP"\r
+WAIT:\r
+       \r
+1$:    LSR SYNC\r
+       BCC 1$          ;WAIT FOR V-BLANK\r
+       STA A,WTCHDG\r
+       JSR GAME\r
+APAT0: JSR FANS                ;AIM PATCHES HERE\r
+       BIT TEST\r
+       BVS WAIT                ;BRANCH IF TEST OFF\r
+APAT1: JMP RESET               ;FAKE RESET\r
+CKS0:  .BYTE 37\r
+\r
+       .SBTTL GAME MASTER CONTROL\r
+\r
+GAME:  JSR TRACK\r
+       LDA $CNCT               ;ANY MONEY?\r
+       BEQ DSPTCH              ;NO, JUST DO WHATEVER\r
+       DEC $CNCT               ;ELSE TAKE THEIR MONEY\r
+       JSR UPTIME              ;AND GIVE THEM SOME (MORE) TIME\r
+       JSR DTIME               ;SHOW IT\r
+       LDA I,0\r
+       STA W30TIM              ;ENABLE 30 SEC. WARNING TIMER\r
+       LDA ATRACT              ;ARE WE IN ATTRACT?\r
+       BMI DSPTCH              ;NO, PROCEED\r
+       LDA I,-1                ;PUT IN GAME\r
+       STA ATRACT\r
+STRTGM:        LDA I,EC.SG             ;END PLAY, START GAME\r
+       STA WHYEND\r
+       LDA I,30.\r
+       STA STPCLK              ;KEEP CLOCK OFF FOR 30 SECONDS\r
+       JSR WECASE\r
+       LDA I,0\r
+       STA WHISTL              ;KILL LEFT-OVER SOUNDS\r
+       STA THUD\r
+       LDX I,3\r
+21$:   STA ZX,SCORE            ;CLEAR SCORES\r
+       DEX\r
+       BPL 21$\r
+       JSR CAN\r
+       JSR RSF\r
+       LDA I,M.BAN1\r
+       JSR WRITEB\r
+       LDA I,M.BAN2\r
+       JSR WRITEB\r
+       JSR DTIME\r
+       JSR DSTAT\r
+\r
+DSPTCH:        BIT STATE               ;WHAT STATE ARE WE IN\r
+       BMI PAUSE               ;S.PAUS=80\r
+       BVC SELECT              ;S.SEL=0\r
+       JMP PLAY                ;MUST BE PLAY (S.PLAY=40)\r
+\r
+PAUSE: LDY PAUST               ;CHECK PAUSE TIMER\r
+       BEQ 20$                 ;TIMED OUT\r
+       DEC PAUST               ;RUN IT\r
+       BNE 45$                 ;STILL RUNNING, RETURN\r
+\r
+;WE ONLY COME HERE ON A 1->0 TRANSITION OF PAUST\r
+\r
+       LDA MINUTE\r
+       BNE 15$                 ;PLENTY OF TIME\r
+       LDA SECOND\r
+       BEQ 5$                  ;NONE AT ALL, GO TO ATTRACT\r
+       CMP I,31                ;CHECK FOR 30 SEC MARK\r
+       BCS 15$                 ;NOT YET\r
+       LDA W30TIM              ;CHECK WARNING TIMER\r
+       BNE 15$                 ;NOT TO BOTHER\r
+       LDA I,60.               ;ELSE START IT\r
+       STA W30TIM\r
+       LDA I,M.GAO             ;"GAME ALMOST OVER"\r
+       BNE 10$                 ;ALWAYS\r
+\r
+5$:    STA ATRACT              ;TIME'S UP, INTO ATTRACT\r
+       LDA I,M.GO              ;"GAME OVER"\r
+10$:   JSR WRITEB              ;TELL BOTH PLAYERS\r
+15$:   JSR HUDDLE              ;IN ANY CASE, PUT PLAYERS IN HUDDLE\r
+\r
+;BELOW IS DONE WHENEVER PAUST = 0\r
+\r
+20$:   LDA OLDOFF              ;SEE IF OFFENSE HAS CHANGED\r
+       CMP OFFENS\r
+       BEQ 30$                 ;THEY'RE OK, SKIP IT\r
+       JSR CHANGE              ;ELSE CHANGE TEAMS\r
+       LDA I,30.\r
+       STA STPCLK              ;STOP CLOCK WHILE THEY GET IN PLACE\r
+       RTS\r
+\r
+;BELOW IS DONE WHEN PAUST = 0 AND TEAMS ARE OK\r
+\r
+30$:   LDA W30TIM              ;CHECK 30 SEC WARNING TIMER\r
+       LSR                     ;0 OR 1?\r
+       BNE 32$                 ;NO, RUN IT\r
+       STA BEEP                ;ELSE KEEP IRRITATING SOUND OFF\r
+       BEQ 40$                 ;GO TO SELECT STATE\r
+32$:   DEC W30TIM              ;ELSE RUN TIMER\r
+       AND I,2                 ;USE MIDDLE BIT\r
+       BEQ 35$                 ;TO TURN OFF\r
+       LDA I,1                 ;AND ON\r
+35$:   STA BEEP                ;BEEPER\r
+       LDA W30TIM              ;GET TIMER AGAIN\r
+       CMP I,30.               ;1/2 WAY?\r
+       BNE 45$                 ;NO, RETURN\r
+       LDA I,M.ICTP            ;"INSERT COINS TO KEEP PLAYING"\r
+       JMP WRITEB              ;WRITE AND RTS\r
+\r
+;IF ALL THIS STUFF HAS BEEN TAKEN CARE OF, ENTER SELECT STATE\r
+\r
+40$:   LDA I,S.SEL\r
+       STA STATE               ;STATE=SELECT\r
+45$:   RTS\r
+\r
+SELECT:        JSR PSEL                ;CHECK BUTTONS\r
+       LDA I,0\r
+10$:   STA INPLCE              ;CLR INPLCE\r
+       LDX I,28.\r
+11$:   JSR EXEC\r
+       LDA AX,FLAGS            ;HAS BEEN(!) IN PLACE!\r
+       BPL 12$                 ;NO, SKIP\r
+       AND I,7F                ;CLEAR FOR NEXT TIME\r
+       STA AX,FLAGS\r
+       INC INPLCE              ;ELSE COUNT\r
+12$:   DEX\r
+       DEX\r
+       BPL 11$\r
+       LDA PSTIM\r
+       ORA PSTIM+2             ;"OR" OF INDIV TIMERS\r
+       BNE 20$                 ;BRANCH IF STILL WAITING\r
+       LDA WFLAG\r
+       AND I,20\r
+       BNE 13$\r
+       JSR SETPOS\r
+13$:   LDA A,HVPOS+28.         ;IS BALL BLANKED?\r
+       BNE 14$                 ;NO SKIP\r
+       JSR TRACK               ;ELSE DOUBLE TRACKING\r
+       DEC INPLCE\r
+14$:   LDA INPLCE\r
+       CMP I,15.               ;ALL IN PLACE?\r
+       BEQ 15$\r
+       JMP 30$                 ;NO, SKIP\r
+15$:   LDA WFLAG\r
+       AND I,20\r
+       BNE 16$                 ;START PRE-\r
+       LDA WFLAG               ;HIKE MOTION\r
+       ORA I,20\r
+       STA WFLAG\r
+       LDA I,M.RDY!80          ;QUICKEST CLEAR OF MESSAGE\r
+       JMP WRITEB\r
+\r
+16$:   LDA I,S.PLAY            ;ELSE ENTER PLAY\r
+       STA STATE\r
+       LDA I,0\r
+       STA MPSTIM              ;RESET MPSTIM\r
+       STA STPCLK              ;AND CLOCK-STOPPER\r
+       LDA I,0CC               ;SOMEWHAT OF A THUMP\r
+       STA THUD                ;FOR "HIKE" SOUND\r
+       RTS\r
+20$:                           ;IF PSTIM IS NON-ZERO THEN EITHER WE ARE WAITING\r
+                               ;FOR A PLAYER TO MAKE AN INITIAL SELECTION, OR\r
+                               ;TO CHANGE SELECTION.\r
+                               ;\r
+       LDY MPSTIM              ;MASTER-PLAY-SELECT: COUNTS DOWN FROM 11.5 SECS.\r
+                               ;AFTER ONE PLAYER MAKES A SELECTION.\r
+       BEQ 22$                 ;0 MEANS NEITHER PLAYER HAS SELECTED YET.\r
+       DEY                     ;DECREMENT IT\r
+       BEQ 21$                 ;BUT NOT PAST ONE\r
+       STY MPSTIM\r
+       BNE 22$                 ;GO DO MESSAGES\r
+21$:   LDX I,2                 ;11.5 SEC. TIMER IS ZERO: SEE IF ANYONE\r
+       LDY PSTIM+2             ;GETS A PENALTY\r
+       BMI 27$                 ;GO HANDLE PENALTY\r
+       LDX I,0\r
+       LDY PSTIM\r
+       BMI 27$                 ;GO HANDLE PENALTY\r
+22$:   LDA I,M.IC              ;OUTPUT VARIOUS MESSAGES IN ATTRACT: "INSERT COINS"\r
+       LDY ATRACT\r
+       BPL 26$                 ;BRANCH IF ATTRACT\r
+24$:\r
+                               ;NOW OUTPUT "SELECT PLAY" OR "READY" MOST OF\r
+                               ;THE TIME SAY "SELECT PLAY", BUT IF BOTH PLAYERS\r
+                               ;HAVE SELECTED AND LOCKED IN (PSTIM=0), OR IF\r
+                               ;MPSTIM IS LESS THAN 30, I.E. LESS THAN 1.5\r
+                               ;SECONDS, THEN OUTPUT "READY".\r
+       LDY MPSTIM\r
+       BEQ 29$\r
+       CPY I,30.\r
+       BCC 25$\r
+       LDA PSTIM\r
+       ORA PSTIM+2\r
+       BNE 29$                 ;GO OUTPUT "SELECT PLAY"\r
+25$:   LDA I,M.RDY\r
+26$:   JSR WRITEB\r
+       JMP 30$\r
+27$:                           ;PENALTY!!\r
+28$:   STX TARDY\r
+       LDA I,EC.DOG\r
+       STA WHYEND\r
+       LDA I,30.\r
+       STA STPCLK              ;HOLD CLOCK FOR 30 SECONDS\r
+       JMP WECASE              ;LEAVE AND NEVER RETURN (ON THIS PASS)\r
+29$:\r
+       JSR TELLEM              ;FLASH "SELECT PLAY" AND "YOU ARE DEF./OFF."\r
+\r
+30$:   JSR TIMER               ;RUN GAME TIMER IF RUNTIM=1\r
+       BCC 40$                 ;NO CHANGE\r
+       JSR DTIME               ;DISPLAY IT\r
+       LDA MINUTE\r
+       ORA SECOND\r
+       BNE 40$\r
+       LDA ATRACT              ;IN ATTRACT?\r
+       BPL 40$                 ;YES, SKIP FLOGGING OF DEAD HORSE\r
+35$:   JMP EP.ABT              ;SET ATTRACT\r
+40$:   RTS\r
+\r
+PLAY:  LDA ATRACT              ;ATTRACT?\r
+       BMI 2$                  ;NO, GAME\r
+       LDA I,M.ECAT            ;EACH COIN ADDS TIME\r
+       JSR WRITEB              ;ALTERNATE MESSAGES\r
+2$:    LDX I,28.\r
+3$:    JSR EXEC                ;EXECUTE "PROGRAM" FOR THIS OBJECT\r
+       LDA AX,FLAGS            ;RESET COLLISION FLAGS\r
+       AND I,0FA               ;TO PREPARE FOR COLCHK\r
+       STA AX,FLAGS\r
+       DEX\r
+       DEX                     ;DOWN TO NEXT OBJECT\r
+       BPL 3$\r
+       LDX I,28.\r
+37$:   JSR COLCHK              ;COLLISION CHECK\r
+       LDA WHYEND              ;ABORT?\r
+       BNE 38$                 ;YES\r
+       DEX\r
+       DEX\r
+       BNE 37$\r
+38$:\r
+35$:   LDA WFLAG\r
+       AND I,1                 ;IF BALL HIKED\r
+       BNE 39$                 ;SKIP\r
+       LDA I,1                 ;ELSE\r
+       STA WFLAG               ;HIKE BALL AND\r
+       LDA OFFENS              ;CHECK OFFSIDES ONCE\r
+       EOR I,2\r
+       TAX\r
+       LDY ZX,CTLPTR           ;POINT TO MONSTER-MAN\r
+       BMI 39$\r
+       JSR PSCRIM              ;PAST SCRIMMAGE?\r
+       BNE 39$                 ;NO,SKIP\r
+       LDA I,EC.OS             ;OFF SIDES\r
+       STA WHYEND\r
+       BNE WECASE              ;ALWAYS\r
+\r
+39$:   JSR PASSQ               ;CHECK FOR PASS SWITCH\r
+       LDY HASBAL              ;WHO HAS THE BALL?\r
+       BMI WECASE              ;NOBODY, BRANCH TO CASE STMT.\r
+       SEI\r
+       LDA Y,HPOSL\r
+       STA HPOSL+28.           ;BALL IS OBJECT 14. (PLAYERS ARE 0-13)\r
+       LDA Y,HPOSH\r
+       STA HPOSH+28.\r
+       LDA Y,VPOS\r
+       STA VPOS+28.            ;SET BALL POSN FOR BEING "CARRIED"\r
+       CLI\r
+       JSR CKGOAL              ;CHECK BALL CARRIER AGAINST GOAL'S\r
+;IMPLEMENT CASE (WHYEND) OF WETAB\r
+WECASE:        LDA WHYEND\r
+       CMP I,NCASES\r
+       BCC 1$\r
+       BRK\r
+1$:    ASL\r
+       TAX\r
+       LDA AX,WETAB+1\r
+       PHA\r
+       LDA AX,WETAB\r
+       PHA\r
+CASRET:        RTS\r
+WETAB: .WORD EP.NUL-1,EP.SG-1,EP.TKL-1,EP.INC-1,EP.INT-1,EP.OOB-1\r
+       .WORD EP.TDD-1,EP.TDO-1,EP.SAF-1,EP.TB-1,EP.OS-1,EP.DOG-1\r
+       .WORD EP.BLK-1,EP.KIC-1\r
+NCASES  =.-WETAB/2\r
+EP.NUL:        JSR TIMER               ;PLAY NOT OVER, JUST DO TIMER\r
+       BCC CASRET              ;SKIP IF NO CHANGE\r
+       JMP DTIME               ;ELSE DISPLAY IT AND RETURN\r
+\r
+       .SBTTL END OF PLAY\r
+EP.DOG:        LDX TARDY\r
+       BPL EP.PEN              ;ALWAYS\r
+EP.OS: LDA OFFENS\r
+       EOR I,2\r
+EP.OSC:        TAX                     ;PT TO DEFENSE\r
+EP.PEN:        DEC DOWN                ;COMPENSATE FOR AUTO-INC\r
+       JSR PENAL5              ;5 YD PENALTY\r
+EP.INC:        LDA I,30.\r
+       STA STPCLK              ;STOP CLOCK\r
+       BNE EP.C1\r
+\r
+EP.SG: LDA FRAME               ;"RANDOM" #\r
+       AND I,2                 ;PICK A PLAYER\r
+       STA OFFENS              ;MAKE HIM OFFENSE\r
+       LDA I,-1                ;CAN'T MATCH\r
+       STA OLDOFF              ;SO FORCES RE-WRITE\r
+                               ;GAME START IS PHONY TO\r
+EP.TDD:        JSR FLIP                ;TD BY DEFENSE, FLIP SIDES, THEN DO TD STUFF\r
+EP.TB:                         ;AS IS TOUCHBACK\r
+EP.SAF:                                ;SAFETY TREATED LIKE TD\r
+EP.TDO:        JSR KIKOFF              ;RESET ON 20\r
+       JMP EP.COM              ;RE-ENTER COMMON CODE\r
+EP.OOB: LDA I,30.              ;OUT-OF-BOUNDS, STOP CLOCK\r
+       STA STPCLK\r
+EP.TKL:        JSR SETBAL              ;SET LINE OF SCRIMMAGE\r
+EP.C1: LDA SCRIMH\r
+       CMP FDHPOS              ;FIRST DOWN LINE\r
+       LDA SCRIMH+1            ;GET WHOLE YDS OF SCRIMMAGE LINE\r
+       SBC FDHPOS+1            ;"COMPARE" DISTANCE FROM SCRIM. TO FIRST DOWN\r
+       LDX OFFENS              ;CHECK PLAYER #\r
+       LDA AX,FDDIR\r
+       ADC I,0                 ;BC(C/S)\r
+       BNE 6$                  ;DIDN'T MAKE IT\r
+3$:    JSR CFD                 ;COMPUTE FIRST DOWN\r
+       JMP EP.COM              ;& RE-ENTER COMMON CODE\r
+6$:    INC DOWN                ;BUMP DOWN.\r
+       LDA DOWN                ;AND CHECK IT\r
+       CMP I,5\r
+       BCC EP.COM              ;BRANCH IF DOWN<5\r
+       BCS EP.C2               ;ELSE FLIP SIDES\r
+EP.KIC:        LDA I,30                ;KICKED OUT OF BOUNDS, STOP CLOCK\r
+       STA STPCLK\r
+EP.BLK:\r
+EP.INT:        JSR SETBAL\r
+EP.C2: JSR FLIP\r
+EP.COM: LDX WHYEND             ;FIND OUT WHY PLAY ENDED\r
+       LDA AX,CHTAB-1\r
+       CMP CHEER\r
+       BCC 10$\r
+       STA CHEER\r
+10$:   LDA AX,ENDMES-1         ;PICK AN APROPRIATE MESSAGE\r
+       JSR WRITEB              ;TELL THE PLAYERS\r
+       JSR STATS               ;UPDATE STATS\r
+EP.ABT:        LDA I,-1                ;ABORT ENTRY POINT, FOR TIME-OUT IN SELECT\r
+                               ;RESET PLAY-SELECT TIMERS,\r
+       LDX I,6                 ;BALL POSSESSION, RECEIVER\r
+10$:   STA X,CTLPTR            ;CONTROLLED MEN, PAST\r
+       DEX                     ;SCRIMMAGE LINE FLAG\r
+       BPL 10$\r
+       LDA I,0                 ;RESET GLOBAL FLAGS,\r
+       LDX I,5                 ;MASTER P.S. TIMER,\r
+11$:   STA X,WHYEND            ;AND LEDS\r
+       DEX\r
+       BPL 11$\r
+       LDX I,28.               ;RESET OP-CODES\r
+1$:    STA ZX,OP\r
+       DEX\r
+       DEX\r
+       BPL 1$\r
+       LDX I,2\r
+2$:    TXA\r
+       EOR FRAME\r
+       ADC ZX,PLAYNO           ;START AT RANDOM PLAY\r
+       AND I,3\r
+       STA ZX,PLAYNO\r
+3$:    DEX\r
+       DEX\r
+       BPL 2$\r
+       LDA I,60\r
+       STA WHISTL              ;BLOW REF'S WHISTLE\r
+       LDY I,20.               ;1 SEC. PAUSE\r
+8$:    STY PAUST               ;SET PAUSE TIMER\r
+       LDA I,S.PAUS\r
+       STA STATE               ;STATE= PAUSE\r
+       RTS\r
+\r
+ENDMES: .BYTE M.BAN1,M.TKL,M.INC,M.INT,M.OOB,M.TD,M.TD,M.SAF,M.TB,M.OS,M.DOG,M.BLK,M.OOB\r
+CHTAB: .BYTE 0,20,20,40,10,240.,240.,120.,40,0,0,120.,40\r
+FDDIR: .BYTE -1                ;-1+ CARRY= 0 (BCS FOR #0)\r
+FDINC: .BYTE 10.,0,-10.        ;MOVE 0 RIGHT; BCC FOR #2; MOVE 2 LEFT\r
+\r
+KIKOFF:        LDA I,30.               ;20 YD LINE IS 30 FROM END\r
+       LDY I,20\r
+       LDX OFFENS              ;CHECK WHO WILL BE DEFENSE\r
+       BNE 1$                  ;#2 WILL BE, LEAVE ON HIS 80\r
+       LDY I,0E0\r
+       LDA I,FL-30.            ;ELSE MOVE TO END OF FIELD\r
+1$:    STA SCRIMH+1\r
+       STY SCRIMH              ;LOW BYTE\r
+       LDA I,132.              ;CENTER OF FIELD, VERTICALLY\r
+       STA SCRIMV\r
+\r
+;NOW FALL THROUGH TO FLIP OFFENSE/DEFENSE\r
+\r
+\r
+FLIP:  LDA OFFENS              ;GET POINTER TO OFFENSE\r
+       EOR I,2                 ;FLIP IT\r
+       STA OFFENS\r
+\r
+;FALL THROUGH TO COMPUTE FIRST DOWN & RTS\r
+\r
+CFD:   LDA I,1\r
+       STA DOWN                ;RESET DOWN\r
+       LDX OFFENS              ;POINT TO OFFENSE\r
+       LDA SCRIMH\r
+       STA FDHPOS\r
+       LDA SCRIMH+1\r
+       CLC\r
+       ADC AX,FDINC            ;OFFSET TOWARDS CORRECT GOAL\r
+       STA FDHPOS+1\r
+       LDA FDHPOS              ;CHECK FOR\r
+       CMP AX,GOALIN           ;PAST GOAL\r
+       LDA FDHPOS+1\r
+       SBC AX,GOALIN+1\r
+       LDA AX,FDDIR\r
+       ADC I,0\r
+       BNE 1$                  ;NOT, PAST, OK\r
+       LDA AX,GOALIN           ;ELSE SET\r
+       STA FDHPOS\r
+       LDA AX,GOALIN+1\r
+       STA FDHPOS+1\r
+1$:    LDA AX,FDINC\r
+       AND I,40\r
+       EOR I,11                ;MAKE 11 FOR #0,51 (FLIPPED) FOR PLAYER #2\r
+       STA A,BHPICT+2          ;FIRST DOWN MARKER\r
+       LDA I,30                ;SMALL CHEER\r
+       STA CHEER               ;FOR FIRST, IF NOTHING ELSE\r
+       RTS\r
+\r
+       .SBTTL CHECK GOAL\r
+;Y=BALL CARRIER, BLITZ A,X SET WHYEND=2 IF GOAL 5 IF SAFETY\r
+\r
+CKGOAL: LDX I,2                        ;CHECK BOTH GOALS\r
+1$:    LDA AY,HPICT\r
+       STA K                   ;SAVE FOR OFFENSE/DEFENSE CHECK\r
+       LDA AY,HPOSL\r
+       CMP AX,GOALIN           ;COMPARE POSN TO CORRECT GOAL\r
+       LDA AY,HPOSH\r
+       SBC AX,GOALIN+1\r
+       LDA AX,FDDIR\r
+       ADC I,0\r
+       BNE 20$                 ;OUTSIDE GOAL\r
+       TXA\r
+       EOR HASBAL\r
+       BMI 3$                  ;HASBAL=1? YES. SKIP CHECK\r
+       AND I,2                 ;IS BALL CARRIER ON TEAM(X)\r
+       BEQ 11$                 ;IF SO SAY TOUCHDOWN\r
+3$:    LSR K                   ;C SET IF OFFENSE\r
+       BCS 5$\r
+       LDA WHYEND\r
+       CMP I,EC.KIC\r
+       BEQ 4$                  ;KICKED INTO END ZONE\r
+       CMP I,EC.INT            ;INTERCEPTION?\r
+       BNE 20$                 ;NO, SKIP\r
+4$:    LDA I,EC.TB             ;TOUCHBACK\r
+       BNE 15$                 ;ALWAYS\r
+\r
+5$:    LDA WHYEND\r
+       CMP I,EC.TKL                    ;TACKLE?\r
+       BEQ 6$\r
+       CMP I,EC.OOB            ;OUT-OF-BOUNDS\r
+       BNE 20$                 ;NO, SKIP\r
+6$:    LDA I,2\r
+       STA POINTS\r
+       LDA I,EC.SAF            ;SAFETY\r
+       BNE 15$                 ;ALWAYS***      \r
+\r
+11$:   LDA I,EC.TDD            ;END-OF-PLAY, TOUCHDOWN\r
+       LSR K\r
+       ADC I,0                 ;MAKE EC.TDO IF OFFENSE\r
+       STA WHYEND\r
+       LSR                     ;C=0 IF DEF\r
+       TYA\r
+       AND I,1C\r
+       EOR I,14                ;QB?\r
+       BEQ 12$                 ;YES 7 POINTS\r
+       CLC                     ;ELSE 6 POINTS\r
+12$:   LDA I,43\r
+       ROL                     ;6 OR 7 (WITH D7 SET FOR "OFFENSE")\r
+       STA POINTS\r
+       RTS\r
+\r
+15$:   STA WHYEND\r
+20$:   DEX\r
+       DEX\r
+       BPL 1$\r
+       RTS\r
+GOALIN:        .WORD 110.*256.+20,10.*256.+0E0 ;GOALS FOR 0,2\r
+PSCRIT:        .WORD -6*32.\r
+       .WORD 5*32.\r
+;Y=PLAYER TO CHECK, RETURNS Z=1 IF PAST SCRIMMAGE LINE\r
+PSCRIM: TYA\r
+       AND I,2\r
+       TAX\r
+       LDA SCRIMH\r
+       STA TSCRIM\r
+       LDA SCRIMH+1\r
+       CPX OFFENS\r
+       BEQ 10$\r
+       LDA SCRIMH              ;ADJUST FOR DEFENSE\r
+       CLC\r
+       ADC X,PSCRIT\r
+       STA TSCRIM\r
+       LDA SCRIMH+1\r
+       ADC X,PSCRIT+1\r
+10$:   STA TSCRIM+1\r
+       LDA AY,HPOSL\r
+       CMP TSCRIM\r
+       LDA AY,HPOSH\r
+       SBC TSCRIM+1\r
+       LDA AX,FDDIR\r
+       ADC I,0\r
+       RTS\r
+\r
+       .SBTTL PASS?\r
+;\r
+;DECIDES WHETHER OR NOT TO PASS, BY LOOKING AT PLAY-SELECT BUTTON IN GAME\r
+;PLAY, OR FAKING IT IN ATTRACT. TO PASS, IT SETS GLOBAL FLAG 10 (D4 IN\r
+;WFLAG) WHICH IS CHECKED BY EXEC WHILE BALL-OPCODE=PASS. NOTE THAT SINCE\r
+;PLAY-SELECT IS USED TO START PASS, THERE MAY BE A CONFLICT\r
+;WITH USE OF OSSTAT. THIS SHOULD BE CAREFULLY CHECKED IF\r
+;CHANGES ARE MADE\r
+;\r
+PASSQ: LDA WFLAG               ;GET GLOBAL FLAGS\r
+       AND I,2                 ;BALL SNAPPED YET?\r
+       BEQ 10$                 ;NO, RETURN\r
+       LDA ATRACT              ;IN ATTRACT\r
+       BPL 10$                 ;YES, LET EXEC FAKE IT\r
+       LDX OFFENS              ;POINT TO OFFENSE\r
+       LDY ZX,CTLPTR\r
+       BMI 10$                 ;NO JOYSTICK PLAYER, SKIP\r
+       JSR PSCRIM\r
+       BNE 4$\r
+       STA PSFLAG\r
+       RTS\r
+4$:    LDY ZX,SWSTAT\r
+       TYA\r
+       EOR ZX,OSSTAT\r
+       AND ZX,OSSTAT\r
+       STY ZX,OSSTAT           ;CATCH EDGES ON PLAYER CTLS\r
+       AND I,10                ;PLAY SELECT BUTTON\r
+       BEQ 10$                 ;NOT YET\r
+5$:    LDA WFLAG\r
+       ORA I,10                ;ELSE SET GLOBAL FLAG 10\r
+       STA WFLAG\r
+10$:   RTS\r
+\r
+       .SBTTL  SET POSITION\r
+SETPOS:        TXA\r
+       PHA\r
+       LDX I,28.\r
+10$:   LDA ZX,OP               ;CHECK OP-CODE\r
+       BEQ 20$                 ;THIS MAN STILL ON END\r
+       CMP I,16.               ;MOVE?\r
+       BCS 15$                 ;YES, DO IT\r
+       CMP I,2                 ;WAIT?\r
+       BNE 20$                 ;NO, SKIP IT\r
+15$:   LDA X,HGOAL             ;SET POSITION=GOAL\r
+       STA X,HPOSL\r
+       LDA X,HGOAL+1\r
+       STA X,HPOSH\r
+       LDA X,VGOAL\r
+       STA X,VPOS\r
+       LDA I,0\r
+       STA X,VPOSL\r
+20$:   DEX\r
+       DEX\r
+       BPL 10$\r
+30$:   PLA\r
+       TAX\r
+       RTS\r
+STATS:  LDA SCRIMH\r
+       CMP FDHPOS\r
+       LDA SCRIMH+1\r
+       SEC\r
+       SBC FDHPOS+1            ;GET DIST TO GO FOR FIRST\r
+       BPL 1$                  ;CAN NOT BE TRUELY NEGATIVE HERE\r
+       EOR I,-1                ;SO INVERSION IS DUE TO THIS BEING\r
+       CLC                     ;PLAYER ZERO, AND CAN BE CORRECTED\r
+       ADC I,1                 ;WITHOUT LOSING INFORMATION\r
+1$:    BNE 15$\r
+       LDA I,1                 ;1 YD IS MINIMUM\r
+15$:   LDY I,0\r
+       CMP I,100.\r
+       BCC 2$\r
+       INY                     ;HUNDREDS DIG. IN Y\r
+       SBC I,100.              ;OUT OF ACC\r
+2$:    STY DTG+1               ;SAVE HUNDREDS\r
+       LDY I,-1                ;PRE-CLEAR "TENS"\r
+       SEC\r
+3$:    INY                     ;INC 10'S\r
+       SBC I,10.               ;RESTORATIVE, ITERATIVE DIVIDE (YECCH!!)\r
+       BCS 3$                  ;LOOP TILL WE GET A BORROW\r
+\r
+4$:    ADC I,10.               ;PUT BACK THAT LAST 10\r
+       STA J\r
+       TYA\r
+       ASL\r
+       ASL\r
+       ASL\r
+       ASL                     ;SHIFT UP TENS\r
+       ORA J                   ;PUT UNITS IN\r
+       STA DTG                 ;SAVE AS DECIMAL TO GO\r
+       LDX OFFENS              ;POINT TO PRESENT OFFENSE\r
+       LDY I,0\r
+       LDA POINTS              ;GET POINTS FOR THIS ENDING\r
+       STY POINTS              ;CLEAR IT\r
+       BPL 5$                  ;IF D7=1, GIVE TO THIS PLAYER\r
+       TAY                     ;ELSE SAVE PTS\r
+       TXA\r
+       EOR I,2                 ;FLIP PLAYER\r
+       TAX\r
+       TYA\r
+       AND I,7F                ;CLEAR FLAG\r
+5$:    BEQ 6$                  ;NO POINTS\r
+       LDY I,30                ;ELSE STOP\r
+       STY STPCLK              ;CLOCK\r
+       BIT ATRACT              ;ATTRACT?\r
+       BPL 6$                  ;YES, DON'T UPDATE SCORE\r
+       SED\r
+       CLC\r
+       ADC ZX,SCORE            ;ADD INTO APPROPRIATE SCORE\r
+       STA ZX,SCORE\r
+       LDA I,0\r
+       ADC ZX,SCORE+1\r
+       STA ZX,SCORE+1\r
+       CLD\r
+6$:    JMP DSTAT               ;DISPLAY STATISTICS & RTS\r
+       .SBTTL PENALTY\r
+;USES ALL REGS, J; SETS SCRIMH (2 BYTES)\r
+PENAL5:        TXA                     ;PTR TO PLAYER TO PENALIZE\r
+       EOR I,2\r
+       TAX                     ;PTR TO HIS OPPONENT\r
+       LDA AX,GOALIN\r
+       SEC\r
+       SBC SCRIMH\r
+       STA J\r
+       LDA AX,GOALIN+1\r
+       SBC SCRIMH+1\r
+       TAY\r
+       BPL 10$\r
+       LDA J                   ;ELSE TAKE ABS.\r
+       EOR I,-1\r
+       CLC\r
+       ADC I,20\r
+       TYA\r
+       EOR I,-1\r
+       ADC I,0\r
+10$:   CMP I,10.               ;!DIST FROM GOAL!<10?\r
+       BCC 12$                 ;YES, USE HALF OF IT\r
+       LDA I,0\r
+       STA J                   ;SET LSB'S=0\r
+       CPY I,80                ;C<-SIGN OF MSBS\r
+       LDY I,10.               ;ASSUME POSITIVE\r
+       BCC 12$                 ;BRANCH IF SO\r
+       LDY I,-10.              ;ELSE SET NEG\r
+12$:   TYA\r
+       CMP I,80                ;ASR (Y,J)\r
+       ROR\r
+       TAY\r
+       LDA J\r
+       ROR\r
+       CLC\r
+       ADC SCRIMH\r
+       STA SCRIMH\r
+       TYA\r
+       ADC SCRIMH+1\r
+       STA SCRIMH+1\r
+       JSR INITL               ;MOVE ALREADY SET-UP PLAYERS\r
+       TXA\r
+       EOR I,2                 ;BACK TO CULPRIT\r
+       TAX\r
+       LDA ZX,PSTIM            ;DID HE SELECT AT ALL YET\r
+       BMI 2$                  ;NOPE, SKIP IT\r
+       JSR INITL               ;ELSE SET HIM UP IN LAST FORMATION\r
+2$:    JSR HUDDLE              ;SET HUDDLE ANYWAY (CAN'T HURT)\r
+       JSR SETPOS\r
+       RTS\r
+FANS:\r
+10$:   LDA CHEER+1             ;GET PRESENT CHEER\r
+       CMP CHEER               ;COMPARE TO DESIRED\r
+       BCS 12$                 ;IF PRESENT GREATER, DEC \r
+       ADC I,20                ;ELSE RUN QUICKLY UP\r
+       BCC 18$                 ;BRANCH NO WRAP\r
+       LDA I,0FF               ;ELSE SET MAX AND FALL THROUGH TO RESET\r
+12$:   LDY I,0\r
+       STY CHEER               ;RESET DESIRED\r
+       SBC I,3                 ;DECREASE SLOWLY\r
+       BCS 18$                 ;BRANCH NO WRAP\r
+       LDA I,0                 ;ELSE SET MIN\r
+18$:   STA CHEER+1             ;SAVE PRESENT\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       BNE 21$\r
+       LDA I,1                 ;KEEP SOME SOUND\r
+21$:   STA CROWD\r
+       RTS\r
+\f\r
+       .SBTTL PLAYER-CONTROLS\r
+;*************************\r
+;*\r
+;*PLAY SELECTION\r
+;*\r
+;***************************\r
+;\r
+;DESCRIPTION:\r
+;      IN GAME:\r
+;              -ONCE PER PUSH OF "PLAY-SELECT" BUTTON, ROUTINE\r
+;              1) SETS PSTIM=10.\r
+;              2) SETS CHGFLG & MPSTIM, IF NOT ALREADY RUNNING\r
+;              3) INCREMENTS PLAYNO(X)\r
+;              4) REDUCES PLAYNO(X),MODULO NPLAYS\r
+;              5) SETS LED WD(X) TO LIGHT LAMPS\r
+;              6) CALLS INITL TO SET-UP MEN\r
+;              -REGARDLESS OF BUTTON; DECREMENT PSTIM(X) IF >0\r
+;    IN ATTRACT:\r
+;              -FAKES BUTTON-PRESSING WITH PAUST AS "RANDOM" #,\r
+;              THEN DOES ALL ABOVE STUFF.\r
+;REGISTERS:\r
+;      IN:     DON'T CARE\r
+;      OUT:    X=-2, A&Y-BLITZED\r
+;\r
+;\r
+;STACK USE:    2 BYTES FOR RTN ADDR. OF CALLER\r
+;              +6 BYTES USED BY INITL IF CALLED\r
+;              =8 TOTAL\r
+;\r
+;\r
+;BASE PAGE USE:        READ: SWSTAT\r
+;              MODIFY: OSSTAT, PLAYNO,CHGFLG,MPSTIM,PSTIM\r
+;              WRITE: LEDWD\r
+;              TEMP: -NONE-\r
+PSEL:  LDX I,2\r
+       LDA I,0\r
+       STA LEDTMP\r
+1$:    LDA ATRACT              ;IN ATTRACT?\r
+       BMI 5$                  ;NO, GAME\r
+       LDA ZX,PSTIM            ;TIMER STARTED?\r
+       BPL 14$                 ;YES, RUN IT\r
+       BMI 15$                 ;ELSE, SELECT IMMEDIATELY\r
+;IN GAME BLINK LICONS, LOOK AT BUTTONS\r
+5$:    LDA Z,FRAME             ;FLASH LICON LEDS\r
+       LSR\r
+       LSR\r
+7$:    LDY ZX,PSTIM\r
+       BNE 11$\r
+       CLC\r
+11$:   ROL LEDTMP\r
+\r
+       LDY ZX,SWSTAT           ;GET NEW\r
+       TYA                     ;SWITCH STATUS\r
+       EOR ZX,OSSTAT           ;CMP TO OLD\r
+       AND ZX,OSSTAT           ;CHG TO 0?\r
+       STY ZX,OSSTAT\r
+       AND I,10                ;SELECT SWITCH\r
+       BNE 15$                 ;PRESSED, SELECT PLAY\r
+12$:   LDA ZX,PSTIM            ;CHECK TIMER\r
+       BMI 50$                 ;NOT STARTED, SKIP IT\r
+14$:   BEQ 50$                 ;TIMED OUT, SKIP\r
+       DEC ZX,PSTIM            ;RUN IT\r
+       BPL 50$                 ;ALWAYS\r
+15$:   LDA MPSTIM              ;MASTER TIMER RUNNING?\r
+       BNE 17$                 ;YES, SKIP IT\r
+       LDA I,230.              ;ELSE SET TO 230\r
+       STA MPSTIM              ;FOR 11.5 SECOND INTERVAL\r
+17$:   CMP I,30.               ;NEAR END?\r
+       BCS 19$                 ;NO, ALLOW SELECTION\r
+       LDA ZX,PSTIM            ;HAS HE SELECTED?\r
+       BEQ 50$                 ;YES, LOCK IT IN\r
+19$:   LDA I,30.\r
+       STA ZX,PSTIM            ;PSTIM:=30. (FOR 1.5 SECOND)\r
+\r
+;PLAYNO(X):=MOD(PLAYNO+1,NPLAYS)\r
+\r
+20$:   INC ZX,PLAYNO           ;BUMP PLAYNO\r
+       LDA ZX,PLAYNO\r
+       AND I,3                 ;MODULO 4\r
+       BIT ATRACT\r
+       BVS 30$                 ;IF NOT ATTRACT, SKIP\r
+       PHA\r
+       LDA DOWN\r
+       CMP I,4                 ;FOURTH DOWN?\r
+       BNE 25$                 ;NO\r
+       PLA\r
+       LDA I,3                 ;YES, KICK\r
+       BNE 30$                 ;ALWAYS\r
+25$:   PLA\r
+       CMP I,3                 ;KICK?\r
+       BNE 30$                 ;NO\r
+       LDA I,0                 ;NO KICK ALLOWED\r
+30$:   STA ZX,PLAYNO\r
+       TAY\r
+       SEC\r
+       LDA I,0\r
+31$:   ROL\r
+       DEY\r
+       BPL 31$\r
+33$:   STA ZX,LEDWD            ;LEDWD(X)-2**(PLAYNO(X)-1)\r
+       LDA ZX,PSTIM\r
+       BMI 50$\r
+       JSR INITL               ;INIT. MEN\r
+       JSR SETPOS\r
+50$:   DEX\r
+       DEX\r
+       BPL 1$\r
+       LDA LEDTMP\r
+       STA LEDWD+1\r
+       RTS\r
+\f      .SBTTL UTILITIES\r
+       .SBTTL CLEAR ALPHANUMERICS\r
+CAN:   LDX I,128.\r
+       LDA I,0\r
+1$:    STA AX,ALPHR\r
+       STA AX,ALPHL\r
+       DEX\r
+       BPL 1$\r
+       RTS\r
+;DISPLAY TIME ON BOTH ENDS\r
+DTIME: LDY I,53                ;POSITION FOR TIME\r
+1$:    LDA MINUTE\r
+       JSR ASCAX\r
+       CMP I,'0                ;LEADING ZERO SUPRESSION\r
+       BNE 2$\r
+       LDA I,0\r
+2$:    JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       LDA I,':\r
+       JSR WRTAN\r
+       LDA SECOND\r
+       JSR ASCAX\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       CPY I,58\r
+       BNE 3$\r
+       LDY I,0CA\r
+       BNE 1$\r
+3$:    RTS\r
+ASCAX: PHA\r
+       AND I,0F                ;ISOLATE LOW NYBBLE\r
+       CMP I,10.               ;A-F?\r
+       BCC 1$                  ;NO, SKIP\r
+       ADC I,6.                ;ELSE ADD 7 (6+CARRY)\r
+1$:    ADC I,'0                ;MAKE ASCII\r
+       TAX                     ;X:=LOW NYBBLE\r
+       PLA\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CMP I,10.\r
+       BCC 2$\r
+       ADC I,6\r
+2$:    ADC I,'0\r
+       RTS\r
+       .SBTTL IDENTIFY OFFENSE\r
+TELLEM:        LDX I,2                 ;FOR PLAYER=2,0\r
+10$:   LDA I,M.OFF             ;ASSUME OFFENSE\r
+       CPX OFFENS              ;IS THAT SO?\r
+       BEQ 20$                 ;YES, SAY SO\r
+       LDA I,M.DEF             ;ELSE SAY DEFENSE\r
+20$:   LDY ZX,PSTIM            ;HAS HE SELECTED ONCE(AT LEAST)\r
+       BPL 30$                 ;YES LEAVE IT AT THAT\r
+       BIT INTCNT              ;ELSE FLASH\r
+       BMI 30$                 ;AT ABOUT 1 HZ\r
+       LDA I,M.SP              ;"SELECT PLAY"\r
+30$:   JSR REPLAC              ;REPLACE CURRENT WITH NEW\r
+       DEX\r
+       DEX                     ;NEXT PLAYER\r
+       BPL 10$                 ;IF HE EXISTS\r
+       RTS\r
+\r
+       .SBTTL DISPLAY STATISTICS\r
+DSTAT: LDX I,3                 ;START ON RIGHT\r
+1$:    STX K\r
+       LDY AX,SCRPTR           ;GET PTR TO DST\r
+       TXA\r
+       LSR                     ;SET C IF DOING "TO GO"\r
+       LDA ZX,SCORE+1          ;HIGH BYTE OF SCORE\r
+       BCC 15$\r
+       LDA DTG+1\r
+15$:   BEQ 3$                  ;0, SKIP IT\r
+       JSR ASCAX               ;CONVERT TO ASCII\r
+       CMP I,'0                ;HIGH NYBBLE "0"\r
+       BEQ 2$                  ;YES, DON'T WRITE IT\r
+       JSR WRTAN\r
+2$:    TXA                     ;LOW NYBBLE\r
+       JSR WRTAN               ;WRITE LOW\r
+3$:    LDX K                   ;GET BACK PTR\r
+4$:    TXA\r
+       LSR\r
+       TYA\r
+       EOR AX,SCRPTR           ;HAS POINTER MOVED\r
+       BEQ 5$                  ;NO, SUPPRESS 0'S\r
+       LDA ZX,SCORE\r
+       BCC 45$\r
+       LDA DTG\r
+45$:   JSR ASCAX\r
+       JSR WRTAN               ;ELSE PRINT BOTH\r
+       JMP 6$\r
+\r
+5$:    LDA ZX,SCORE\r
+       BCC 55$\r
+       LDA DTG\r
+55$:   JSR ASCAX\r
+       CMP I,'0                ;HIGH NYBBLE=0, SKIP IT\r
+       BEQ 6$\r
+       JSR WRTAN\r
+6$:    TXA\r
+       JSR WRTAN\r
+       LDX K                   ;GET BACK PTR\r
+7$:    TYA                     ;GET PTR TO A/N\r
+       CMP AX,SCREND           ;END OF FLD\r
+       BEQ 8$                  ;YES, DONE\r
+       LDA I,0                 ;ELSE BLANK\r
+       JSR WRTAN\r
+       JMP 7$                  ;LOOP\r
+8$:    DEX\r
+       BPL 1$                  ;AND REPEAT\r
+       LDA DOWN                ;GET DOWN #\r
+       ORA I,'0                ;MAKE IT ASCII\r
+       LDY I,41\r
+       JSR WRTAN\r
+       LDY I,0DC\r
+       JMP WRTAN\r
+SCRPTR:        .BYTE 5A,46,0C3,0D7\r
+SCREND:        .BYTE 5E,49,0BF,0D4\r
+\r
+       .SBTTL MESSAGES\r
+WRITEB: LDX I,2                        ;POINT TO RIGHT PLAYER\r
+       JSR REPLAC              ;REPLACE HIS LAST MSG\r
+       LDX I,0                 ;POINT TO LEFT\r
+;FALL THROUGH TO DO THE SAME FOR LEFT\r
+REPLAC:        CMP ZX,OMESL            ;SAME MESSAGE?\r
+       BEQ WRTMES              ;YES, JUST REFRESH IT\r
+       PHA                     ;SAVE NEW MSG#\r
+       LDA ZX,OMESL\r
+       AND I,7F                ;STRIP POSSIBLE ERASE BIT\r
+       CMP I,M.GO              ;M.GO IS FIRST REPLACEABLE MSG\r
+       BCC 1$                  ;BRANCH IF NO CONFLICT\r
+       ORA I,80                ;SET ERASE BIT\r
+       JSR WRTMES              ;TO CLEAR OLD MSG\r
+1$:    PLA                     ;GET BACK NEW MSG\r
+;FALL THROUGH TO WRITE NEW MSG.\r
+;*************************\r
+;*\r
+;*MESSAGES\r
+;*\r
+;***************************\r
+;\r
+;DESCRIPTION:  IF (ACC>=0) OUTPUT MESSAGE (ACC) ELSE\r
+;              CLEAR MESSAGE (ACC&7F). STOPS WHEN CHAR. HAS\r
+;              D7 SET.\r
+;\r
+;\r
+;REGISTERS:\r
+;      IN:     ACC=MESSAGE #;X=PLAYER # (0-LEFT,2-RIGHT),Y-DON'T CARE\r
+;      OUT:    ACC,X-RESTORED, Y-> NEXT DST POSN\r
+;              OMES(L OR R) =MSG#\r
+;              CARRY SET\r
+;\r
+;\r
+;STACK USE:    2 BYTES FOR RTN ADDR.\r
+;\r
+;\r
+;\r
+;\r
+;BASE PAGE USE:        WRITE: ANMSK,OMESL,OMESR\r
+;\r
+;\r
+;\r
+;\r
+WRTMES:        STX WPLAYR\r
+       STA ZX,OMESL            ;GETS OMESR IF X=2\r
+       ASL                     ;MSG # *2,CARRY=1 IF CLEAR, 0 IF WRITE\r
+       TAY                     ;POINT INTO MSG TABLE\r
+       LDA I,3F                ;MASK TO USE FOR WRITING\r
+       BCC 10$                 ;BRANCH IF WRITING\r
+       LDA I,0                 ;ELSE SET MASK=0 TO ERASE\r
+10$:   STA ANMSK\r
+       LDA AY,MTBL+1           ;GET SRC PTR\r
+       CPX I,2                 ;SET CARRY IF X=2 (RIGHT)\r
+       TAX                     ;X<-SRC\r
+       LDA AY,MTBL             ;GET DST PTR\r
+       BCC 20$                 ;BRANCH IF LEFT\r
+       EOR I,1F                ;COMPLEMENT CHAR #\r
+       ADC I,9D                ;ACC<-1D-DST+80\r
+       TAY                     ;Y<- DST PTR\r
+       BMI 30$                 ;ALWAYS\r
+\r
+20$:   EOR I,60                ;COMPLEMENT ROW #\r
+       TAY\r
+\r
+30$:   LDA AX,MESLST           ;GET MSG CHAR\r
+       CMP I,80                ;SET C=D7\r
+       AND ANMSK               ;STRIP D7,D6 (OR BLANK WHOLE CHAR.)\r
+       JSR WRTAN               ;WRT CHAR, BUMP DST PTR\r
+\r
+       INX                     ;BUMP SRC PTR\r
+       BCC 30$\r
+       LDX WPLAYR\r
+       LDA ZX,OMESL            ;RESTORE MSG# TO ACC\r
+       RTS\r
+\r
+WRTAN: AND I,3F                ;CLEAR REFLECT BITS\r
+       DEY\r
+       INY                     ;TST Y WITHOUT BLITZING CARRY\r
+       BPL 1$                  ;IF PLUS, PUT ON LEFT\r
+       STA AY,ALPHR-0A0        ;-20 FOR POSITIONING, -80 TO\r
+       DEY                     ;COMPENSATE FOR FLAG\r
+       RTS\r
+1$:    ORA I,40                ;REFLECT CHAR\r
+       STA AY,ALPHL\r
+       INY\r
+       RTS\r
+\r
+MTBL:  .BYTE 0,MES45-MES1,14,MES46-MES1\r
+       .BYTE 4B,MES6-MES1,4C,MES7-MES1,4C,MES8-MES1\r
+       .BYTE 4C,MES9-MES1,4B,MES10-MES1,4A,MES11-MES1,4A,MES12-MES1\r
+       .BYTE 4A,MES13-MES1,4C,MES14-MES1,49,MES15-MES1,4A,MES16-MES1\r
+       .BYTE 49,MES5-MES1,4D,MES17-MES1,49,0,45,MES2-MES1,49,MES3-MES1\r
+       .BYTE 47,MES18-MES1,49,MES19-MES1,4C,MES20-MES1\r
+MESLST =.\r
+MES19:\r
+MES1:  .ASCIN /INSERT COINS/\r
+MES2:  .ASCIN /EACH COIN ADDS TIME/\r
+MES3:  .ASCIN /SELECT PLAY/\r
+MES45: .ASCIN /DOWN TO GO/\r
+MES46: .ASCIN /TIME SCORE/\r
+MES5:  .ASCIN /DELAY OF GAME/\r
+MES6:  .ASCIN /GAME OVER/\r
+MES7:  .ASCIN /OFFENSE/\r
+MES8:  .ASCIN /DEFENSE/\r
+MES9:  .ASCIN  /TACKLED/\r
+MES10: .ASCIN  /TOUCHDOWN/\r
+MES11: .ASCIN  /INCOMPLETE/\r
+MES12: .ASCIN  /INTERCEPTED/\r
+MES13: .ASCIN  /TOUCHBACK/\r
+MES14: .ASCIN  /SAFETY/\r
+MES15: .ASCIN  /OUT OF BOUNDS/\r
+MES16: .ASCIN /OFF SIDES/\r
+MES17: .ASCIN  /READY/\r
+MES18: .ASCIN /GAME ALMOST OVER/\r
+MES20: .ASCIN /BLOCKED/\r
+       .SBTTL TIMER\r
+;***********************\r
+;*\r
+;*TIMER\r
+;*\r
+;*************************\r
+;\r
+;DESCRIPTION:  CALLED ONCE PER FRAME, MAINTAINS TIMER\r
+;              IN MINUTE, SECOND, & FRAME. IF STPCLK NOT 0, ONLY FRAME\r
+;              RUN, IF STPCLK=0, ALL COUNTERS RUN.  RETURNS WITH\r
+;              CARRY SET ONCE PER SECOND. STICKS AT 0:00\r
+;              Z SET IF TIMER=0:00\r
+;              (DECREMENTS STPCLK IF NON-ZERO)\r
+;\r
+;REGISTERS:\r
+;      IN:     DON'T CARE\r
+;      OUT:    ACC=MINUTE!SECOND; X,Y NOT CHANGED\r
+;              Z SET PER ACC. C SET ONCE PER SECOND. D CLEARED\r
+;\r
+;\r
+;STACK USE:    2 BYTES FOR RET. ADDR.\r
+;\r
+;\r
+;\r
+;\r
+;BASE PAGE USE:        MODIFY: FRAME,MINUTE, SECOND, STPCLK\r
+;              READ:   \r
+;\r
+;\r
+;\r
+;\r
+;\r
+TIMER: CLC                     ;CLEAR "ONCE PER SECOND" FLAG\r
+       LDA MINUTE\r
+       DEC FRAME               ;COUNT FRAMES\r
+       BPL 2$\r
+       LDA I,19.               ;RESET FOR 20 FRAME COUNT\r
+       STA FRAME\r
+       CLC                     ;SET BORROW\r
+       LDA STPCLK              ;STOP CLOCK?\r
+       BEQ 10$                 ;NO, RUN\r
+       DEC STPCLK              ;RUN STOPPER\r
+       SEC                     ;CLR BORROW\r
+10$:   LDA SECOND\r
+       SED\r
+       SBC I,0                 ;SUBTRACT 1 OR 0\r
+       BCS 1$                  ;BRANCH NO BORROW\r
+       LDA I,59                ;IF BORROW SET 59 SECONDS\r
+1$:    STA SECOND\r
+       LDA MINUTE\r
+       SBC I,0\r
+       CLD\r
+       BCS 2$                  ;BRANCH NO BORROW\r
+;IF WRAP, STICK AT 0\r
+       LDA I,0\r
+       STA SECOND\r
+       SEC                     ;ONCE PER SECOND FLAG\r
+2$:    STA MINUTE\r
+       ORA SECOND\r
+       RTS\r
+\r
+;*************************\r
+;*\r
+;*INCREASE TIMER\r
+;*\r
+;***************************\r
+;\r
+;DESCRIPTION:  ADDS 1:00,1:20, 1:40 OR 2:00 TO TIMER EACH TIME\r
+;              IT IS CALLED, STICKS AT 99:59. CARRY SET IF\r
+;              ATTEMPTED WRAP\r
+;\r
+;\r
+;REGISTERS:\r
+;      IN:     DON'T CARE\r
+;      OUT:    ACC=MINUTE;X NOT CHANGED; Y="COIN MODE"; C SET IF ATTEMPTED WRAP\r
+;\r
+;\r
+;\r
+;STACK USE:    2 BYTES, RTN ADDR.\r
+;\r
+;\r
+;\r
+;\r
+;BASE PAGE USE:        MODIFY:SECOND, MINUTE\r
+;\r
+;\r
+;\r
+;\r
+UPTIME: SED\r
+       LDA OPTION              ;GET OPTION SWITCHES\r
+       AND I,3                 ;ISOLATE SW 1,2\r
+       TAY\r
+       LDA AY,TIMTBL\r
+       CLC\r
+       TAY\r
+       AND I,0F0               ;ISOLATE 0X OR 3X\r
+       ADC SECOND\r
+       CMP I,60\r
+       BCC 1$\r
+       SBC I,60\r
+1$:    STA SECOND\r
+       TYA\r
+       AND I,0F                ;ISOLATE X1,X2,X3\r
+       ADC MINUTE\r
+       BCC 2$\r
+       LDA I,59\r
+       STA SECOND\r
+       LDA I,99\r
+2$:    STA MINUTE\r
+       CLD\r
+       RTS\r
+TIMTBL:        .BYTE 01,21,41,02       ;REVERSED MIDDLE DIGITS\r
+\f      .SBTTL SETUP STUFF\r
+SETBAL:        LDA BHPOSH\r
+15$:   LDY BHPOSL\r
+       STY SCRIMH              ;SET SCRIMMAGE LINE\r
+       STA SCRIMH+1\r
+       LDA BVPOS\r
+       CMP I,70                ;BELOW HASH MARKS?\r
+       BCS 2$\r
+       LDA I,70                ;SET ON BOTTOM HASH MARK\r
+2$:    CMP I,98                ;ABOVE?\r
+       BCC 3$\r
+       LDA I,98                ;SET ON TOP HASH-MARKS\r
+3$:    STA SCRIMV\r
+       LDA I,18\r
+       STA A,BHPICT            ;SET PICTURE\r
+       RTS\r
+CKS1:  .BYTE 98\r
+       .SBTTL INIT. "PROGRAM" FOR MEN\r
+;STACK USE\r
+;SETS UP MCC FOR ALL MEN ON TEAM (POINTED TO BY X) AND FETCHES FIRST INSTRUCTION\r
+INITL: LDA I,18\r
+       STA A,BHPICT            ;OBJECT 14 IS BALL\r
+       LDA I,248.\r
+       STA FDVPOS+1            ;FIRST-DOWN MARKER\r
+       STX PLAYER              ;SAVE PLAYER #\r
+M3F    =.-1\r
+       TXA\r
+       ORA I,18\r
+       TAX\r
+3$:    TXA\r
+       EOR OFFENS\r
+M3E    =.-1\r
+       TAY                     ;SAVE PERMUTED PTR\r
+       AND I,2                 ;GET PLAYER EOR OFFENSE\r
+       LSR                     ;IN DO\r
+       EOR I,15                ;IF PLAYER=0FF, THEN 15 (0), ELSE 14(X)\r
+       STA AX,HPICT            ;SET PICTURE\r
+       TYA                     ;GET PTR BACK\r
+       ADC I,0\r
+       .=.-1\r
+       .WORD FTAB-1            ;ADC I,<FTAB-1>&0FF\r
+       .=.-1\r
+       STA ZX,MCC\r
+       LDA I,0\r
+       STA AX,FLAGS            ;RESET FLAGS WITH HANDY 0\r
+       ADC I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD FTAB-1            ;ADC I,<FTAB-1>&0FF00/100\r
+       .DSABL M68\r
+       .=.-1\r
+       STA ZX,MCC+1\r
+       JSR DECODE              ;PROCESS H&V GOALS\r
+       DEX\r
+       DEX\r
+       DEX\r
+       DEX                     ;DOWN TO NEXT PLAYER\r
+       BPL 3$\r
+       LDX PLAYER\r
+1$:    LDA ZX,PLAYNO           ;GET PLAY #\r
+       AND I,3                 ;MAKE SURE ITS VALID\r
+       STA X,PLAYNO\r
+2$:    LDA I,-1\r
+       STA ZX,CTLPTR           ;RESET CONTROL (JOYSTICK) POINTER\r
+       STA HASBAL              ;AND BALL-POSSESION\r
+       LDA ZX,PLAYNO   \r
+       ASL                     ;PLAY #*2\r
+       ASL                     ;PLAY #*4\r
+       ORA OFFENS              ;SET D1 IF RIGHT IS OFFENSE\r
+       EOR PLAYER              ;COMPLEMENT D1 IF TEAM IS RIGHT\r
+       TAY                     ;POINT TO PLAY PTR\r
+       LDA AY,PTBL             ;GET ADL OF PLAY\r
+       STA ZX,MCC\r
+       LDA AY,PTBL+1           ;ADH OF PLAY\r
+       STA ZX,MCC+1\r
+4$:    STX OBJECT\r
+       JSR DECODE              ;BUMP PC & DECODE OP\r
+       TXA\r
+       AND I,1C\r
+       CMP I,18                ;LAST MAN?\r
+       BEQ 7$                  ;YES, FINISHED\r
+       LDA ZX,MCC\r
+       STA ZX,MCC+4\r
+       LDA ZX,MCC+1\r
+       STA ZX,MCC+5            ;COPY PC UP ONE SLOT (FOR THIS PLAYER)\r
+       INX\r
+       INX\r
+       INX\r
+       INX\r
+       JSR SCANIT\r
+       JMP 4$\r
+7$:    LDA I,0\r
+       STA WFLAG               ;CLEAR WAIT-FLAGS\r
+       TXA\r
+       AND I,2                 ;ISOLATE PLAYER #\r
+       CMP OFFENS              ;AM I OFFENSE?\r
+       BNE 8$                  ;NO, SKIP\r
+\r
+;SET UP MCC FOR BALL, AND FETCH FIRST BALL INST.\r
+       LDA ZX,MCC\r
+       STA MCC+<BALLNO*2>\r
+       LDA ZX,MCC+1\r
+       STA MCC+1+<BALLNO*2>\r
+       LDX I,BALLNO*2\r
+       JSR SCANIT              ;PASS LAST PLAYER'S STUFF\r
+       JSR DECODE              ;DECODE FIRST INST.\r
+       LDA I,0\r
+       STA A,FLAGS+<BALLNO*2>\r
+8$:    LDX PLAYER\r
+       RTS\r
+SCANIT:        JSR INCMCC              ;SCAN LIST\r
+       LDA NX,MCC              ;CHECKING OPCODES (END=0)\r
+       BNE 1$\r
+       RTS                     ;IF END, SET-UP THIS MAN\r
+1$:    JSR INCMCC              ;SKIP BYTE\r
+       JMP SCANIT                      ;AND SCAN\r
+\r
+       .SBTTL FETCH & DECODE\r
+;FETCH NEXT MAN-CONTROL INSTRUCTION FROM (MCC(X)) BUMP MCC(X), BLITZ A,Y\r
+DECODE:        JSR INCMCC              ;PRE-INC MCC\r
+       LDA I,0\r
+       STA ZX,PARAM            ;***INSURANCE\r
+       LDA NX,MCC              ;FETCH OP-CODE\r
+D.STOP:        STA ZX,OP               ;SAVE IT\r
+       BEQ 1$                  ;0 (END) IS SINGLE BYTE\r
+       JSR INCMCC\r
+       LDA NX,MCC              ;ELSE FETCH SECOND BYTE\r
+       STA ZX,PARAM            ;MAKE IT PARAMETER\r
+1$:    SEC\r
+\r
+       .SBTTL  OP-DECODE\r
+;ENTERED WITH CARRY SET FROM "DECODE", CARRY CLEAR\r
+;FROM EXEC PICKS UP OP(X) AND JUMPS TO APPROPRIATE\r
+;ROUTINE\r
+\r
+OPDEC: TXA\r
+       AND I,2                 ;ISOLATE PLAYER\r
+       STA PLAYER              ;SAVE FOR USE IN VARIOUS DECODES\r
+       LDA ZX,OP               ;GET OP\r
+       BEQ D.NULL              ;END RETURNS FOR EITHER\r
+       BIT A,MF0               ;MOVE 1FF > 15.\r
+       BEQ 1$                  ;IF NOT, PROCEED\r
+       LDA I,0                 ;ELSE SUBSTITUTE 0\r
+1$:    ROL                     ;INSERT DECODE/EXEC BIT\r
+       CMP I,16.               ;VALID OPS ARE 0-6 (*2)\r
+       BCS D.ERR               ;OP INVALID, ABORT\r
+       ASL\r
+       TAY\r
+       LDA AY,ODTAB+1\r
+       PHA\r
+       LDA AY,ODTAB\r
+       PHA\r
+D.NULL:        RTS\r
+MF0:   .BYTE 0F0\r
+ODTAB: .WORD X.MOV-1,D.MOV-1,X.JOY-1,D.JOY-1\r
+       .WORD X.WAI-1,D.NULL-1,X.ERR-1,D.SET-1\r
+       .WORD X.TRK-1,D.NULL-1,X.TRK-1,D.BLK-1\r
+       .WORD X.PAS-1,D.PAS-1,X.KICK-1,D.KICK-1\r
+X.ERR: BRK                     ;"EXECUTE" OF SET IS NO-NO\r
+D.ERR: LDA I,0\r
+       BEQ D.STOP              ;STOP PLAYER\r
+D.BLK: LDA ZX,PARAM            ;"BLOCK" HAS ALLY # IN "ENDS"\r
+       CMP I,80\r
+       ROL                     ;ROL ACC W/O CARRY\r
+       CMP I,80\r
+       ROL\r
+       ASL\r
+       ASL\r
+       AND I,3C                ;CLEAN UP OBJECT #\r
+       BNE 13$                 ;BRANCH IF MAN\r
+       LDA I,BALLNO*2          ;ELSE POINT TO BALL\r
+       BNE 15$                 ;***ALWAYS\r
+\r
+13$:   ORA PLAYER              ;INSERT PLAYER #\r
+       BIT A,M20               ;CHECK FRIEND/FOE\r
+       BEQ 14$                 ;LEAVE FRIEND ALONE\r
+       EOR I,22                ;ELSE CLEAR BIT & TOGGLE PLAYER\r
+14$:   SEC\r
+       SBC I,4\r
+15$:   STA ZX,PARAM\r
+       RTS\r
+       \r
+       \r
+D.JOY: STX OBJECT\r
+       CPX I,BALLNO*2\r
+       BNE 21$\r
+       LDX OFFENS\r
+       BPL 22$                 ;ALWAYS\r
+21$:   TXA                     ;GET OBJECT #\r
+       AND I,2                 ;ISOLATE PLAYER #\r
+       TAX\r
+22$:   LDY ZX,CTLPTR           ;GET OLD CONTROL PTR\r
+       CPY I,28.\r
+       BCS 25$                 ;BRANCH IF NO OLD OR OLD IS BALL\r
+       LDA AY,HPICT            ;GET OLD MAN'S PICT\r
+       AND I,0FD               ;CLEAR D1\r
+       STA AY,HPICT            ;TO MAKE SMALL\r
+25$:   LDY OBJECT\r
+       CPY I,28.               ;BALL\r
+       BNE 26$\r
+       LDX OFFENS              ;PT TO OFFENSE\r
+       BPL 27$                 ;***ALWAYS\r
+\r
+26$:   LDA AY,HPICT            ;GET PICT\r
+       ORA I,2                 ;SET D1\r
+       STA AY,HPICT            ;TO MAKE LARGE\r
+27$:   STY ZX,CTLPTR           ;POINT TO NEW MAN\r
+       LDA I,0\r
+       STA ZX,TBHD             ;INITIALIZE TRACK-BALL\r
+       STA ZX,TBVD             ;COUNTERS\r
+       LDX OBJECT\r
+       LDA ATRACT              ;IN GAME?\r
+       BMI 30$                 ;YES, DRIVE\r
+       LDA ZX,PARAM\r
+       CLC\r
+       ADC ZX,MCC\r
+       STA ZX,MCC\r
+       BCC 29$\r
+       INC ZX,MCC+1\r
+29$:   JMP DECODE              ;REL. "BRANCH" TO ATTRACT ROUTINE\r
+30$:   RTS\r
+       \r
+D.MOV: LDA ZX,OP               ;OP CONTAINS VERT. GOAL\r
+       EOR I,128.              ;REMOVE BIAS FROM OP-CODE (V-GOAL)\r
+       LDY PLAYER              ;PLAYER?\r
+       BEQ 9$                  ;0, SKIP\r
+       EOR I,0FF               ;ELSE\r
+       CLC                     ;FLIP\r
+       ADC I,1\r
+9$:    CMP I,-80.              ;MAX NEGATIVE DISPLACEMENT?\r
+       BEQ 15$                 ;SET BOTTOM SIDLINE IF SO\r
+       CMP I,80.               ;MAX POSITIVE DISPLACEMENT?\r
+       BEQ 10$                 ;SET TOP SIDELINE IF SO\r
+       CLC\r
+       ADC SCRIMV              ;OP IS VERT DISP.FROM SCRIMV\r
+       BNE 36$                 ;*** ALWAYS (UNLESS FBCHOR SCREWS UP)\r
+10$:   LDA I,247.              ;ONE LINE SHY OF TOP OF SCREEN\r
+       BNE 36$                 ;REALLY ALWAYS\r
+\r
+15$:   LDA I,17.               ;ONE LINE SHY OF BOTTOM OF SCREEN\r
+36$:   STA AX,VGOAL\r
+       LDA I,0\r
+       STA K\r
+       TXA                     ;WHAT OBJECT IS THIS\r
+       CMP I,BALLNO*2\r
+       BNE 37$                 ;IF MAN, CHECK SIDE\r
+       LDA OFFENS              ;ELSE IS BALL, ASSOCIATE WITH OFFENSE\r
+37$:   LSR\r
+       LSR                     ;SET C IF RIGHT IS OFFENSE\r
+       LDA ZX,PARAM            ;PARAM IS HORIZ GOAL (RELATIVE TO SCRIMH)\r
+       BCC 4$                  ;BRANCH IF LEFT\r
+       EOR I,0FF\r
+       ADC I,0                 ;ELSE NEGATE\r
+4$:    CMP I,127.              ;MAX POSITIVE VALUE?\r
+       BEQ 51$                 ;YES, SET TO RIGHT GOAL\r
+       CMP I,-127.             ;MAX NEGATIVE VALUE?\r
+       BEQ 47$                 ;YES, SET TO LEFT GOAL\r
+       CMP I,80\r
+       ROR                     ;ASR\r
+       ROR K\r
+       CMP I,80\r
+       ROR\r
+       ROR K\r
+       CMP I,80\r
+       ROR\r
+       ROR K\r
+       PHA\r
+       LDA K\r
+       CLC\r
+       ADC SCRIMH\r
+       STA AX,HGOAL            ;STASH LSB'S\r
+       PLA\r
+       ADC SCRIMH+1\r
+       BPL 5$\r
+47$:   LDA I,2                 ;SET TO JUST RIGHT OF LEFT END\r
+5$:    CMP I,FL-2              ;PAST RIGHT END OF FIELD?\r
+       BCC 6$                  ;NOPE\r
+51$:   LDA I,FL-2              ;SET TO JUST LEFT OF RIGHT END\r
+6$:    STA AX,HGOAL+1\r
+;SINCE HGOAL (LSB'S) IS UNTOUCHED WHEN HGOAL+1 IS SET TO ITS LIMITS,\r
+;THERE WILL BE SOME VARIANCE IN THE GOAL SOUGHT IN THIS CASE. I DON'T\r
+;THINK THIS WILL BE A PROBLEM\r
+       LDA AX,FLAGS            ;GET INDIV. FLAGS\r
+       AND I,7F                ;RESET D7\r
+       STA AX,FLAGS            ;TO SAY "NOT IN PLACE"\r
+       RTS\r
+\r
+D.KICK:                                ;KICK AND PASS\r
+D.PAS: LDA ZX,PARAM\r
+       ASL\r
+       ASL\r
+       ORA OFFENS\r
+       SEC\r
+       SBC I,4\r
+       STA REC1\r
+       LDA ZX,PARAM\r
+       ASL\r
+       ROL\r
+       AND I,1                 ;ISOLATE LENGTH CODE\r
+       TAY\r
+       LDA AY,PLTAB            ;LOOK UP LENGTH\r
+       STA ZX,PARAM            ;STASH IT\r
+       LDA AX,FLAGS\r
+       AND I,0FD               ;CANCEL "IN PASS"\r
+       STA AX,FLAGS\r
+       LDA WFLAG               ;CANCEL "PASS" COMMAND\r
+       AND I,0EF\r
+       STA WFLAG\r
+       RTS\r
+       \r
+       \r
+D.SET: LDA ZX,PARAM\r
+       ORA WFLAG\r
+       STA WFLAG\r
+       JMP DECODE\r
+M20:   .BYTE 20\r
+INCMCC:        INC ZX,MCC\r
+       BNE 1$\r
+       INC ZX,MCC+1\r
+1$:    RTS\r
+HUDDLE:TXA\r
+       PHA             ;SAVE X IN CASE IT POINTS TO PLAYER\r
+       LDX I,28.               ;START WITH BALL\r
+       LDY OFFENS              ;AND HIS OWNER\r
+       BPL 11$                 ;ALWAYS\r
+       \r
+10$:   TXA\r
+       AND I,2\r
+       TAY                     ;PT TO PLAYER\r
+11$:   LDA AY,PSTIM            ;SELECTED?\r
+       BPL 15$                 ;YES, SKIP\r
+       TXA\r
+       LSR                     ;DE-INTERLEAVE\r
+       AND I,1E                ;CLEAR PLAYER BIT\r
+       ADC I,0\r
+       .=.-1\r
+       .WORD HTAB-1            ;ADC I,HTAB-1&0FF\r
+       .=.-1\r
+       STA ZX,MCC              ;BUILD PTR TO HTAB\r
+       LDA I,0\r
+       STA AX,FLAGS            ;CLEAR FLAGS WHILE WE HAVE A "0"\r
+       ADC I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD HTAB-1            ;ADC I,HTAB-1&0FF00/100\r
+       .DSABL M68\r
+       .=.-1\r
+       STA ZX,MCC+1\r
+       JSR DECODE              ;DECODE PHONEY "MOVES"\r
+       LDA I,2\r
+       STA ZX,OP               ;"WAIT"\r
+       LDA I,0\r
+       STA ZX,PARAM            ;FOREVER\r
+       LDA AX,HPICT\r
+       AND I,0FD\r
+       STA AX,HPICT\r
+15$:   DEX\r
+       DEX                     ;DOWN TO NEXT MAN\r
+       BPL 10$                 ;IF THERE IS ONE\r
+       PLA\r
+       TAX                     ;RESTORE X\r
+       RTS\r
+       .SBTTL CHANGE TEAMS\r
+CHANGE:        LDA I,14.               ;14 PLAYERS TO CHANGE\r
+       STA INPLCE              ;SELECT WON'T MIND IF WE USE HIS COUNTER\r
+       LDX I,26.\r
+10$:   TXA\r
+       EOR OFFENS              ;SEE IF THIS PLAYER IS O OR D\r
+       LSR\r
+       AND I,1\r
+       EOR I,15                ;GET CORRECT PICTURE\r
+       TAY                     ;SAVE IT\r
+       EOR AX,HPICT            ;"COMPARE" TO PRESENT\r
+       AND I,0FD               ;WITH SIZE A "DON'T CARE"\r
+       BNE 20$                 ;NOT RIGHT YET\r
+       DEC INPLCE              ;COUNT THE RIGHT ONES\r
+       JSR EXEC                ;AND LET THEM MOVE TOWARD HUDDLE\r
+       JMP 40$                 ;CONTINUE\r
+\r
+20$:   LDA X,VPOS              ;CHECK HIS POSITION\r
+       BPL 25$\r
+       EOR I,0FC\r
+25$:   AND I,0FC\r
+       BNE 30$                 ;STILL ON FIELD, KEEP MOVING\r
+       LDA X,HGOAL             ;ELSE SET TO DESIRED GOAL\r
+       STA X,HPOSL\r
+       LDA X,HGOAL+1\r
+       STA X,HPOSH\r
+       TYA                     ;GET PICT BACK\r
+       STA AX,HPICT            ;AND SET HIM RIGHT\r
+       BNE 40$                 ;(ALWAYS) CONTINUE\r
+\r
+30$:   TXA\r
+       AND I,2                 ;GET PLAYER #\r
+       LSR                     ;MAKE IT 0 OR 1, CLEAR CARRY\r
+       TAY\r
+       LDA X,VPOS\r
+       CLC\r
+       ADC AY,CHDTAB           ;MOVE PLAYER\r
+       STA X,VPOS\r
+40$:   DEX\r
+       DEX\r
+       BPL 10$\r
+       LDA INPLCE              ;HOW MANY TO GO?\r
+       BNE 50$                 ;STILL SOME\r
+       LDA OFFENS\r
+       STA OLDOFF              ;ELSE SET OLDOFF=OFFENS\r
+50$:   RTS\r
+\r
+CHDTAB:        .BYTE -4,4              ;MOVE 0'S MEN DOWN, 2'S UP\r
+\r
+\f      .SBTTL EXECUTE CHOREOGRAPHY\r
+EXEC:  STX OBJECT\r
+\r
+       .REPT 0\r
+;**********\r
+;THIS SECTION FOR DEBUG\r
+       LDA WFLAG\r
+       AND I,2\r
+       BEQ 1$\r
+       LDA OPTION\r
+       AND I,4         ;SW 3\r
+       BNE 1$\r
+       TXA\r
+       LSR\r
+       TAY\r
+       LDA AY,EFLAG            ;***DEBUG\r
+       BNE 1$\r
+       RTS\r
+;**********\r
+\r
+       .ENDR\r
+1$:    TXA\r
+       AND I,2                 ;ISOLATE PLAYER #\r
+       STA PLAYER              ;AND SAVE IT\r
+       CLC\r
+       JMP OPDEC               ;DECODE OP\r
+X.FNI: JMP DECODE\r
+\r
+X.MOV: JSR EXECM               ;DO MOVE, SET CARRY IF DONE\r
+       BCS X.FNI                       ;IF DONE, FETCH NEXT INSTRUCTION\r
+X.EXIT:        RTS\r
+       \r
+X.JOY: LDA ATRACT              ;IN ATTRACT?\r
+       BPL X.FNI               ;YES, JOY IS A NOP (INSURANCE)\r
+                               ;CONVERT OBJECT #*4 + PLAYER #\r
+       LDX PLAYER              ;GET PLAYER #\r
+2$:    LDY ZX,CTLPTR           ;CHECK PLAYER'S POINTER TO CONTROLLED MAN\r
+       CPY OBJECT              ;IS IT STILL POINTING TO THIS PLAYER?\r
+       BEQ 3$                  ;YES, DO IT\r
+       LDX OBJECT              ;ELSE POINT BACK TO OBJECT\r
+       BPL X.FNI               ;(**ALWAYS**) RELEASE AND FETCH NEXT INSTRUCTION\r
+       \r
+                               ;PT TO OBJECT CONTROLLED\r
+3$:    LDA AY,FLAGS            ;GET CONTROLLED OBJECT FLAGS\r
+       ORA I,80                ;SET "IN PLACE" FLAG\r
+       STA AY,FLAGS\r
+       JMP X.TBAL\r
+X.WAI: LDA ZX,PARAM\r
+       BIT WFLAG               ;IS WAIT OVER?\r
+       BNE X.FNI                       ;YES, BUMP TO NEXT INST\r
+       JMP NUXCMV\r
+\r
+X.TRK: LDA AX,HPICT\r
+       LSR\r
+       BCS 5$                  ;BRANCH ON OFFENSE\r
+       LDA PSFLAG              ;Q.B. PAST?\r
+       BEQ 10$                 ;YES, CHASE HIM\r
+5$:    LDA NX,MCC              ;GET OBJ # TO TRACK\r
+       AND I,3C                ;CLEAN UP #\r
+       BNE 13$\r
+10$:   LDA I,BALLNO*2\r
+       BNE 15$                 ;***ALWAYS\r
+       \r
+13$:   ORA PLAYER              ;LEFT/RIGHT\r
+       BIT A,M20               ;CHECK FRIEND/FOE BIT\r
+       BEQ 14$                 ;LEAVE FRIEND ALONE\r
+       EOR I,22                ;ELSE CLEAR BIT & CHANGE PLAYER.\r
+14$:   SEC\r
+       SBC I,4\r
+15$:   TAY\r
+X.TRKB:        LDA AY,HPOSH            ;BALL ENTER HERE FOR AUTO-PASS\r
+       STA AX,HGOAL+1\r
+       LDA AY,HPOSL\r
+       STA AX,HGOAL\r
+       LDA AY,VPOS\r
+       STA X,VGOAL\r
+       LDA ZX,OP\r
+       CMP I,5                 ;BLOCK?\r
+       BNE EXECM               ;NO,JUST TRACK\r
+X.BLKE:        LDY ZX,PARAM            ;EXTRAS FOR BLOCK\r
+       LDA AY,HPOSL\r
+       SEC\r
+       SBC AX,HGOAL\r
+       STA THINC\r
+       LDA AY,HPOSH\r
+       SBC AX,HGOAL+1\r
+       STA THINC+1\r
+       LDA AY,VPOS\r
+       SEC\r
+       SBC X,VGOAL\r
+       STA TVINC+1\r
+       LDA I,0\r
+       STA TVINC\r
+       LDA I,30\r
+       JSR SPDLIM\r
+       LDA AX,HGOAL\r
+       CLC\r
+       ADC THINC\r
+       STA AX,HGOAL\r
+       LDA AX,HGOAL+1\r
+       ADC THINC+1\r
+       STA AX,HGOAL+1\r
+       LDA X,VGOAL\r
+       CLC\r
+       ADC TVINC+1\r
+       STA X,VGOAL\r
+EXECM: JMP NUXCMV\r
+X.PAS: LDA AX,FLAGS            ;CHECK BALL'S PRIVATE FLAGS\r
+       AND I,2                 ;D1=IN PASS\r
+       BEQ 2$                  ;NOT STARTED YET, CHECK FLAG\r
+       LDA HASBAL              ;COMPLETE?\r
+       BMI 10$                 ;NO, TIME IT\r
+       JMP DECODE              ;ELSE PROCEED\r
+10$:   LDA ZX,PARAM            ;GET LENGTH TIMER\r
+       BEQ 1$                  ;INSURANCE\r
+       DEC ZX,PARAM            ;RUN TIMER\r
+       BEQ 1$                  ;RAN OUT, INCOMPLETE\r
+       LDY REC1                ;AUTO-DRIVE TOWARD RECEIVER\r
+       JMP X.TRKB\r
+1$:    LDA I,EC.INC            ;"PASS INCOMPLETE" CODE\r
+       STA WHYEND              ;SET FOR END OF PLAY\r
+       RTS\r
+2$:    LDA WFLAG               ;GET GLOBAL FLAGS\r
+       AND I,10                ;FLAG 10 (D4) IS PASS-START\r
+       BEQ 4$                  ;NOT YET, SKIP\r
+       LDX OFFENS              ;POINT TO OFFENSE\r
+       LDY ZX,CTLPTR           ;POINT TO PASSER\r
+       LDA AY,HPICT\r
+       AND I,0FD               ;SHRINK PASSER\r
+       STA AY,HPICT\r
+3$:    LDA I,-1                ;RESET HASBAL\r
+       STA ZX,CTLPTR\r
+       STA HASBAL              ;TO DECLARE FREE BALL\r
+       LDA A,FLAGS+<BALLNO*2>\r
+       ORA I,2                 ;SET "IN PASS" FLAG\r
+       STA A,FLAGS+<BALLNO*2>\r
+4$:    LDX OBJECT              ;RESTORE X\r
+       RTS\r
+X.KICK:        LDA AX,FLAGS\r
+       AND I,2                 ;D1=IN PASS\r
+       BEQ 2$\r
+       JMP 50$                 ;ALREADY STARTED\r
+2$:\r
+       LDA WFLAG\r
+       AND I,10\r
+       BNE 1$                  ;TIME TO KICK\r
+       RTS\r
+1$:    LDA I,0CC               ;START THE KICK\r
+       STA THUD                ;KICKING NOISE\r
+9$:    LDY OFFENS              ;COMPUTE KICK YARDAGE\r
+       LDA Y,TBHD              ;TBALL/2=+-24. YARDS\r
+       LDY ATRACT              ;IGNORE\r
+       BNE 15$                 ;CONTINUE\r
+       LDA FRAME               ;DURING\r
+       AND I,1                 ;ATTRACT\r
+15$:\r
+       CMP I,80\r
+       ROR                     ;LOW BIT SELECTS TOP OR BOTTOM OF FIELD\r
+       STA J\r
+       LDA I,16.\r
+       BCC 10$\r
+       LDA I,248.\r
+10$:\r
+       STA X,VGOAL\r
+       LDA $INTCT              ;RANDOMLY\r
+       AND I,7*4               ;0 TO 8\r
+       ADC J\r
+       CMP I,80                ;REDUCE TO -15.,+24.\r
+       ROR\r
+       CMP I,80\r
+       ROR\r
+       ADC BHPOSH              ;ADD CURRENT POSITION\r
+       LDY OFFENS\r
+       ADC AY,K.LEN            ;45. YARDS (+-19. YARDS)\r
+       BEQ 11$                 ;UNDERFLOW\r
+       BPL 30$                 ;NO OVERFLOW OR UNDERFLOW\r
+11$:   CMP I,-56\r
+       LDA I,01                ;LEFT END ZONE CORNER\r
+       BCS 30$\r
+25$:   LDA I,119.              ;RIGHT END ZONE CORNER\r
+30$:   CMP I,120.\r
+       BCS 25$                 ;TOO MUCH\r
+       STA AX,HGOAL+1          ;H DESTINATION\r
+40$:   LDA I,-1\r
+       STA HASBAL              ;BAL IN FLIGHT\r
+       STA REC1                ;SET NO RECEIVER\r
+       LDA I,0\r
+       STA PARAM+28.           ;ALLOW A BLOCK\r
+       LDA A,FLAGS+28.\r
+       ORA I,02\r
+       STA A,FLAGS+28.         ;SET "IN PASS" FLAG\r
+50$:   INC PARAM+28.           ;ALLOW BLOCKS IN 4 FRAMES\r
+       BNE 52$\r
+       DEC PARAM+28.\r
+52$:   JSR EXECM               ;MOVE TOWARD GOAL\r
+       LDX OBJECT              ;RESTORE X\r
+       BCC 70$                 ;NOT AT DESTINATION\r
+60$:   LDA I,EC.KIC            ;END OF KICK\r
+65$:   STA WHYEND\r
+       LDY I,28.               ;Y=BALL POSITION\r
+       JSR CKGOAL              ;CHECK GOAL\r
+70$:   RTS\r
+K.LEN: .BYTE 40.\r
+;ENTERED WITH X->PLAYER, A=TBVD(X), THINC=TBHD(X)\r
+X.LIM: .BYTE 30,-50.\r
+X.TBLIM:TAY                    ;SAVE V\r
+       BPL 1$                  ;TAKE ABS VAL\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+1$:    CMP A,X.LIM             ;!V! < X.LIM?\r
+       BCC 2$                  ;YES, LEAVE IT\r
+       LDA A,X.LIM             ;ELSE USE X.LIM\r
+2$:    CPY I,80                ;CHECK IF ORIG WAS +\r
+       BCC 3$                  ;BRANCH IF SO\r
+       EOR I,0FF               ;ELSE MAKE - X.LIM\r
+       ADC I,0                 ;CARRY SET, ADDS 1\r
+3$:    STA TVINC\r
+       LDA THINC               ;GET THINC AND REPEAT\r
+       TAY                     ;THE PROCESS\r
+       BPL 4$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+4$:    CMP A,X.LIM\r
+       BCC 5$\r
+       LDA A,X.LIM\r
+5$:    CPY I,80\r
+       BCC 6$\r
+       EOR I,0FF\r
+       ADC I,0\r
+6$:    STA THINC               ;SAVE H\r
+       LDA TVINC               ;GET BACK V\r
+       RTS                     ;AND REJOIN MAIN\r
+X.TBAL: LDY I,0\r
+       LDA ZX,TBHD             ;WE HAVE A 4 CYCLE HAZARD HERE\r
+       STY ZX,TBHD             ;WHICH I THINK WE WILL HAVE TO LIVE WITH\r
+       BPL 10$\r
+       DEY                     ;SIGN EXTEND\r
+10$:   STA THINC               ;SAVE LSB'S OF TBHP(X)\r
+       STY THINC+1             ;SAVE MSB'S OF TBHP(X)\r
+       LDY I,0\r
+       LDA ZX,TBVD\r
+       STY ZX,TBVD             ;SAME HAZARD HERE\r
+       JSR X.TBLIM\r
+       LDX OBJECT\r
+       ASL\r
+       ROL\r
+       ROL                     ;(TBVD(X))*8 IN ACC,C\r
+       TAY                     ;SAVE 5 LSB FOR LS BYTE\r
+       AND I,0F8               ;ISOLATE 5 LSB IN MSB'S OF LS BYTE\r
+       STA TVINC\r
+       TYA\r
+       ROL                     ;FINISH "*8" FOR MS BYTE\r
+       AND I,7                 ;ISOLATE 3 MSB IN LSB'S OF MS BYTE\r
+       CMP I,4\r
+       BCC 30$\r
+       ORA I,0F8               ;SIGN EXTENDED\r
+30$:   STA TVINC+1\r
+       LDA AX,FLAGS            ;CHECK FLAGS FOR THIS OBJECT\r
+       LSR                     ;D0=IN COLLISION\r
+       BCS 70$                 ;MOVE SLOW IF SO\r
+       TXA\r
+       AND I,2                 ;ISOLATE PLAYER #\r
+       CMP OFFENS              ;IS HE OFFENSE\r
+       BEQ 70$                 ;YES, MOVE SLOW H,FAST V\r
+       LDA THINC+1\r
+       CMP I,80\r
+       ROR\r
+       TAY\r
+       LDA THINC               ;FOR NET 3*(THINC)\r
+       ROR\r
+       CLC\r
+       ADC THINC\r
+       STA THINC\r
+       TYA\r
+       ADC THINC+1\r
+       STA THINC+1\r
+70$:\r
+MOVER: LDA I,0\r
+       STA J\r
+       LDA THINC               ;MOVE TEMP HINC\r
+       CLC\r
+       ADC X,HPOSL\r
+       TAY\r
+       LDA THINC+1\r
+       ADC X,HPOSH     ;ADD TO H-POSN\r
+       BNE 2$\r
+       LDY I,0E0       ;IF 0, MAKE 0.E0\r
+       STY J\r
+2$:    CMP I,120.\r
+       BCC 3$\r
+       LDA I,120.\r
+       STA J\r
+       LDY I,0\r
+3$:    STA X,HPOSH\r
+       TYA\r
+       STA X,HPOSL\r
+       LDA TVINC\r
+       CLC\r
+       ADC X,VPOSL\r
+       TAY\r
+       LDA TVINC+1\r
+       ADC X,VPOS\r
+       CMP I,16.\r
+       BCS 4$\r
+       LDA I,16.\r
+       STA J\r
+       LDY I,0E0\r
+4$:    CMP I,248.\r
+       BCC 5$\r
+       LDA I,248.\r
+       STA J\r
+       LDY I,0\r
+5$:    STA X,VPOS\r
+       TYA\r
+       STA X,VPOSL\r
+       LDA J\r
+       BEQ 7$\r
+       CPX HASBAL\r
+       BNE 7$\r
+6$:    LDA I,EC.OOB            ;"OUT OF BOUNDS"\r
+       STA WHYEND              ;SET END OF PLAY\r
+7$:    RTS\r
+\r
+       .SBTTL NEW EXEC MOVE\r
+;USES DIRECT & SPDLIM TO SET UP THINC & TVINC\r
+NUXCMV:        JSR DIRECT              ;SET THINC & TVINC TO DESIRED VECT.\r
+       LDA THINC\r
+       ORA THINC+1\r
+       ORA TVINC\r
+       ORA TVINC+1\r
+       BNE 10$\r
+       LDA X,FLAGS\r
+       ORA I,80\r
+       STA X,FLAGS\r
+       RTS\r
+10$:   LDA AX,HPICT\r
+       LSR                     ;DEFENSE?\r
+       LDA AX,FLAGS\r
+       AND I,4                 ;IN COLLISION WITH OPPONENT?\r
+       BEQ 45$                 ;NO, SKIP\r
+       BCC 44$                 ;YES, AND DEFENSE\r
+       ;OFFENSE IN COLLISION\r
+       LDA X,OP                ;FULL SPEED IF NOT BLOCKING\r
+       CMP I,5\r
+       BNE 45$\r
+       LDY PLAYER              ;GET OFFENSIVE PLAY #\r
+       LDA AY,PLAYNO\r
+       BNE 43$                 ;IF NOT PLAY 0 (SHORT YARDAGE)\r
+       LDA PSFLAG              ;IF NOT PAST SCRIMMAGE\r
+       BNE 45$                 ;GO FULL SPEED\r
+43$:   LDA FRAME               ;SLOW DOWN SOME\r
+       AND I,3\r
+       BEQ 45$\r
+40$:   RTS\r
+44$:                           ;DEFENSE IN COLLISION\r
+       LDA X,OP                ;FULL SPEED IF NOT RUSHING (TRACK)\r
+       CMP I,4\r
+       BNE 45$\r
+       LDA PLAYER\r
+       EOR I,2                 ;GET OFFENSE'S PLAY\r
+       TAY\r
+       LDA AY,PLAYNO\r
+       BNE 50$                 ;IF NOT SHORT YARDAGE (PLAY #0), DON'T WORRY\r
+       LDA PSFLAG              ;ELSE, CHECK FOR PAST SCRIMMAGE LINE\r
+       BNE 40$                 ;NO, BAD DEFENSE\r
+                               ;YES, NORMAL "IN COLLISION" MOVING\r
+50$:   BIT INTCNT\r
+       BMI 45$\r
+       LDA X,VPOS              ;ADD SIDE SHUFFLE\r
+       ASL                     \r
+       LDA I,1                 ;ONE DOT MOTION\r
+       BCS 42$                 ;MOVE UP IF SET\r
+       LDA I,-1\r
+42$:   STA TVINC+1             ;SET IN TEMP VERT INC\r
+       LDA I,0\r
+       STA TVINC\r
+       BEQ 5$                  ;ALWAYS, NO NEED TO SET SPEED\r
+\r
+45$:                           ;SET SPEED\r
+       LDA ATRACT              ;ATTRACT\r
+       BMI 47$                 ;NO, GAME\r
+       BIT STATE               ;CHECK FOR "PLAY" STATE\r
+       BVC 49$                 ;NOPE, MOVE EVERYBODY FAST\r
+       LDA AX,HPICT            ;IN ATTRACT\r
+       LSR                     ;CHECK FOR DEF.\r
+       LDA I,10\r
+       BCC 48$                 ;BRANCH IF DEFENSE\r
+47$:   LDA I,0\r
+48$:   CPX I,BALLNO*2          ;BALL\r
+       BNE 5$                  ;NO, 2 DOTS MAX\r
+49$:   LDA I,20                ;BALL 5 DOTS MAX\r
+5$:\r
+       JSR SPDLIM\r
+       JMP MOVER\r
+       .SBTTL DIRECTION\r
+;SETS HINC & VINC TO DISPLACEMENT FROM (H/V) POS TO (H/V) GOAL\r
+DIRECT:        LDA X,VGOAL\r
+       SEC\r
+       SBC X,VPOS\r
+                               ;---\r
+       STA TVINC+1             ;WE WANT SIGNED DIFFERNCE OF TWO COMPERSATE\r
+                               ;FOR OVERLOW\r
+                               ;UNSIGNED NUMBERS.\r
+                               ;C=1,D7=1==>POSITIVE OVERFLOW\r
+                               ;C=0,D7=0==>NEGATIVE OVERFLOW\r
+       BCC 1$\r
+       EOR I,80                ;D7=D7?C\r
+1$:    BMI 3$                  ;D7<>C==>VALUE OKAY\r
+       LDA I,7F                ;C=1==>SET TO 7F (POSITIVE OVERFLOW)\r
+       BCS 2$\r
+       LDA I,80                ;C=0==>SET TO 80 (NEGATIVE OVERFLOW)\r
+2$:    STA TVINC+1\r
+3$:                            ;---\r
+       LDA I,0\r
+       STA TVINC               ;KEEP LSB'S 0\r
+       LDA AX,HGOAL\r
+       SEC\r
+       SBC X,HPOSL\r
+       STA THINC\r
+       LDA AX,HGOAL+1\r
+       SBC X,HPOSH\r
+       STA THINC+1\r
+       RTS\r
+       .SBTTL SPEED-LIMIT\r
+;SPDLIM - SPEED LIMIT\r
+;\r
+;ENTRY (THINC,THINC+1) = HPOS DIFFERENCE (SIGNED)\r
+;      (TVINC,TVINC+1) = VPOS DIFFERENCE (SIGNED)\r
+;      (A) = INDEX FOR WHICH SPEED (MULTIPLES OF 10)\r
+;EXIT  (THINC,THINC+1) = HPOS DIFFERENCE IN RANGE\r
+;      (TVINC,TVINC+1) = VPOS DIFFERENCE IN RANGE\r
+SPDLIM:        STX K                   ;SAVE PLAYER NUMBER\r
+       STA L                   ;SAVE SPEED LIMIT TABLE INDEX\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       STA DIVSOR              ;SAVE INDEX INTO SPDLM2\r
+       LDA THINC+1\r
+       STA J\r
+       AND I,0F0\r
+       BPL 10$                 ;IF POSITIVE NUMBER\r
+       EOR I,0F0               ;MAKE SURE SIGN EXTENSION IS CORRECT\r
+10$:   BEQ 15$                 ;SIGN EXTENSION IS O.K.\r
+       LDA I,7F                ;MAX\r
+       LDY J\r
+       BPL 20$                 ;IF POSITIVE\r
+       LDA I,81\r
+       BMI 20$                 ;ALWAYS\r
+\r
+15$:   LDA THINC\r
+       ROL\r
+       ROL J\r
+       ROL\r
+       ROL J\r
+       ROL\r
+       LDA J\r
+       ROL\r
+20$:   BPL 25$                 ;HABS=ABS (THINC)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,01\r
+25$:   STA J\r
+       LDA TVINC+1\r
+       BPL 30$                 ;VABS=ABS (TVINC)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,01\r
+30$:   LDX I,0         ;X POINTS TO MAX\r
+       LDY J\r
+       CMP J\r
+       BEQ 90$                 ;IF AT 45 DEGREE ANGLE\r
+       BCC 35$                 ;PICK MAX (HABS,VABS)\r
+       LDX I,2                 ;HABS IS MAX\r
+       TAY\r
+       LDA J\r
+35$:   ASL\r
+       STA QUOT+1              ;QUOTIENT=MIN*2\r
+       STY DIVSOR+1            ;DIVISOR=MAX\r
+       LDY DIVSOR\r
+       LDA AY,SPDLM2\r
+       CMP DIVSOR+1\r
+       BCS 80$                 ;VALUES ARE GOOD ALREADY\r
+       LDY I,3                 ;3 DIGITS OF ACCURACY FOR MIN/MAX\r
+40$:   LDA QUOT+1\r
+       SEC\r
+       SBC DIVSOR+1\r
+       BCC 45$                 ;NO SUBTRACT\r
+       STA QUOT+1\r
+45$:   ROL QUOT\r
+       ROL QUOT+1\r
+       DEY\r
+       BNE 40$                 ;LOOP 3 TIMES\r
+       LDA QUOT\r
+       AND I,07\r
+       ASL                     ;*2 FOR 2 WORD ENTRIES\r
+       ORA L\r
+       TAY\r
+       LDA AY,SPDLM1           ;GET MAX VALUES\r
+       STA ZX,QUOT             ;SAVE MAX SPEED LIMIT (ASSUMES DIVISOR FOLLOWS QUOT)\r
+       TXA\r
+       EOR I,02                ;SWITCH TO MINIMUM\r
+       TAX\r
+       LDA AY,SPDLM1+1\r
+       STA ZX,QUOT             ;SAVE MIN\r
+60$:   LDA I,0\r
+       STA QUOT+1              ;SET MSB OF VABS AND HABS\r
+       ASL QUOT+2              ;MAKE VABS INTO THE PROPER FORMAT\r
+       ROL\r
+       ASL QUOT+2\r
+       ROL\r
+       ASL QUOT+2\r
+       ROL\r
+       STA QUOT+3              ;ASSUMED TO BE DIVSOR-A SCRATCH CELL\r
+       LDX I,2\r
+65$:   LDA ZX,THINC+1\r
+       ASL\r
+       LDY ZX,QUOT\r
+       LDA ZX,QUOT+1\r
+       BCC 70$                 ;WAS POSITIVE\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;COMPLEMENT VABS OR QUOT\r
+       TAY\r
+       LDA ZX,QUOT+1\r
+       EOR I,0FF\r
+       ADC I,0\r
+70$:   STA ZX,THINC+1\r
+       STY ZX,THINC\r
+       DEX\r
+       DEX\r
+       BPL 65$\r
+80$:   LDX K                   ;RESTORE X=PLAYER NUMBER\r
+       RTS\r
+\r
+90$:   LDY DIVSOR\r
+       LDA AY,SPDLM2\r
+       CMP J\r
+       BCS 80$                 ;LESS THAN SPEED LIMIT RETURN\r
+       LDA Y,SPDLM3\r
+       STA QUOT\r
+       STA QUOT+2\r
+       BNE 60$                 ;ALWAYS\r
+\r
+SPDLM1:                                        ;EACH ENTRY REPRESENTS LLL.FFFFF LINES\r
+       .BYTE 30,0,30,06,30,0B,30,12    ;LIMIT=0 FOR SLOW PLAYERS\r
+       .BYTE 30,18,30,1E,30,24,30,2A\r
+       .BYTE 40,0,40,08,40,10,40,18\r
+       .BYTE 40,20,3C,24,38,28,34,2C   ;LIMIT 10 FOR FAST PLAYERS\r
+       .BYTE 0A0,0,0A0,14,0A0,28,0A0,3C        ;LIMIT=20 FOR BALL\r
+       .BYTE 0A0,50,96,5C,8C,64,82,6E  \r
+       .BYTE 0FF,0,0FF,20,0FF,40,0FF,60        ;LIMIT=30 FOR POSITIONING PLAYERS\r
+       .BYTE 0FF,80,0FF,0A0,0FF,0C0,0FF,0E0\r
+SPDLM2:        .BYTE 1,1,5,8                   ;MIN DISTANCE BEFORE SPEED LIMIT IS USED\r
+SPDLM3:        .BYTE 30,30,78,0FF              ;45 DEGREE SPEED LLL.FFFFF\r
+\f      .SBTTL COLLISIONS\r
+       .SBTTL  COLL. LOOP\r
+COLCHK: TXA\r
+       STX OBJECT              ;SAVE OBJECT #\r
+       TAY\r
+1$:    DEY\r
+       DEY                     ;COMPARE TO NEXT DOWN\r
+       BMI 5$\r
+       JSR COLLIS\r
+       BCS 1$\r
+       JSR COLMOV\r
+       JMP 1$\r
+5$:    RTS\r
+\r
+       .SBTTL  COLL.CHECK\r
+COLLIS:        LDA X,VPOS\r
+       SEC\r
+       SBC AY,VPOS\r
+       STA VDISP\r
+       BCS 2$\r
+       EOR I,0FF\r
+       ADC I,1                 ;TAKE !DELTA V!\r
+2$:    CMP I,8                 ;<8?\r
+       BCS 1$                  ;NO, SKIP\r
+       STA AVVD                ;ABS VALUE OF VERT. DIFFERENCE\r
+       LDA X,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA AVHDL\r
+       STA HDISP\r
+       LDA X,HPOSH\r
+       SBC AY,HPOSH\r
+       STA AVHDH\r
+       STA HDISP+1\r
+       BCS 25$                 ;BRANCH IF DIFFERENCE IS POSITIVE\r
+       EOR I,0FF               ;ELSE DO D.P. NEGATE\r
+       STA AVHDH\r
+       LDA AVHDL\r
+       EOR I,0FF\r
+       ADC I,20\r
+       STA AVHDL\r
+       LDA AVHDH\r
+       ADC I,0\r
+       STA AVHDH\r
+25$:   BEQ 26$\r
+1$:    SEC\r
+       RTS\r
+26$:   LDA AVHDL\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;MATCH V-SCALE\r
+       CLC\r
+       ADC AVVD                ;DO OCTAGON\r
+       CMP I,12.\r
+       BCS 1$                  ;NO COLLISION\r
+       CPX I,BALLNO*2          ;BALL?\r
+       BNE 3$                  ;NOT BALL\r
+       JSR BALCOL              ;CHK BALL COLLIS & RETURN\r
+       LDA WHYEND              ;END OF PLAY\r
+       BEQ 1$                  ;NO, CONT.\r
+27$:   PLA                     ;ESLE KILL\r
+       PLA                     ;RTN ADDR\r
+       RTS                     ;RTN TO CALLER OF COLLIS\r
+3$:    LDA AY,HPICT\r
+       EOR AX,HPICT\r
+       LSR\r
+       LDA AY,FLAGS            ;SET INDIV. COLLISION FLAGS\r
+       ORA I,1\r
+       BCC 35$\r
+       ORA I,4\r
+35$:   STA AY,FLAGS\r
+       LDA AX,FLAGS\r
+       ORA I,1\r
+       BCC 37$\r
+       ORA I,4\r
+37$:   STA AX,FLAGS\r
+       CPY HASBAL              ;DOES Y -> BALL CARRIER\r
+       BNE 56$                 ;NO, CHECK X\r
+       LDA AX,HPICT            ;IS X DEFENSE\r
+       LSR\r
+       BCC 58$                 ;YES, TACKLE\r
+56$:   CPX HASBAL              ;DOES X -> BALL CARRIER\r
+       BNE 6$                  ;NO, RETURN\r
+       LDA AY,HPICT            ;IS Y DEFENSE\r
+       LSR\r
+       BCS 6$                  ;NO, SKIP\r
+58$:   LDA I,EC.TKL            ;"TACKLE"\r
+       STA WHYEND              ;IS END CONDITION\r
+       JMP 27$                 ;ABORT CHECK\r
+6$:    CLC                     ;FLAG COLLISION\r
+       RTS                     ;RETURN\r
+       .SBTTL  COLLISION MOVE\r
+;MOVE PLAYER(X) & PLAYER(Y) OUT OF COLLISION\r
+COLMOV:        CLC                     ;BE PREPARED\r
+       LDA VDISP               ;GET VERT DISP (V(X)-V(Y))\r
+       BPL 1$                  ;IF PLUS, SUBTRACT 8\r
+       ADC I,8                 ;ELSE ADD 8\r
+       JMP 2$                  ;*** THIS COULD BE A BPL(?)\r
+1$:    ADC I,-8\r
+2$:    CMP I,80                ;MERGE HERE WITH ACC=VDISP+/-8\r
+       ROR                     ;"ASR" TO TAKE HALF\r
+       STA VDISP               ;SAVE (VDISP+/-8)/2\r
+       CLC\r
+       LDA HDISP+1             ;REPEAT FOR HDISP\r
+       BPL 3$\r
+       ADC I,1                 ;8 DOTS IS 1 IN MS BYTE\r
+       JMP 4$\r
+3$:    ADC I,-1\r
+4$:    CMP I,80\r
+       ROR\r
+       STA HDISP+1             ;SAVE MS BYTE\r
+       LDA HDISP               ;FINISH DIVIDE BY 2\r
+       ROR\r
+       STA HDISP\r
+       LDA AVHDL               ;PRE-SHIFTED\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       CMP AVVD                ;WHO'S IN MOST\r
+       BEQ 6$                  ;SAME, DO BOTH\r
+       LDA I,0\r
+       BCS 5$                  ;H LEAST, KILL V\r
+       STA HDISP+1             ;ELSE KILL H\r
+       STA HDISP\r
+       BEQ 6$\r
+5$:    STA VDISP\r
+6$:    LDA VDISP\r
+       CLC\r
+       ADC AY,VPOS             ;ADD TO V(Y) CUZ IT'S NEG\r
+       STA AY,VPOS             ;OF WHAT IT SHOULD BE\r
+       SEC\r
+       LDA X,VPOS              ;SIMILARLY, SUB FROM V(X)\r
+       SBC VDISP\r
+       STA X,VPOS\r
+       LDA HDISP\r
+       CLC\r
+       ADC AY,HPOSL            ;AGAIN ADD TO (Y)\r
+       STA AY,HPOSL\r
+       LDA HDISP+1\r
+       ADC AY,HPOSH\r
+       STA AY,HPOSH\r
+       LDA X,HPOSL             ;THEN SUB FROM (X)\r
+       SEC\r
+       SBC HDISP\r
+       STA X,HPOSL\r
+       LDA X,HPOSH\r
+       SBC HDISP+1\r
+       STA X,HPOSH\r
+       RTS\r
+       .SBTTL  BALL-COLLISION\r
+BALCOL:        LDA WFLAG\r
+       AND I,6                 ;HAS BALL GOTTEN TO QB?\r
+       BEQ 15$                 ;NO, SKIP\r
+       LDA A,FLAGS+28.         ;CHECK BALLS FLAGS\r
+       AND I,2                 ;PASS?\r
+       BEQ 10$                 ;NO\r
+       LDA AY,HPICT\r
+       LSR                     ;OFFENSE?\r
+       BCS C.PASR              ;YES, CHECK RECVR'S\r
+       JMP C.INTC              ;ELSE CHECK INTERCEPT\r
+\r
+10$:   LDA AY,HPICT\r
+       LSR\r
+       BCS 20$                 ;OFFENSE, CHECK FOR QB\r
+       LDX I,EC.TKL            ;SET "TACKLE"\r
+       STX WHYEND              ;TO END PLAY\r
+       LDX I,28.               ;INSURANCE\r
+15$:   RTS\r
+20$:   LDA HASBAL              ;FREE BALL\r
+       BPL 30$         ;NO, SKIP\r
+       TYA                     ;GET MAN #\r
+       AND I,1C                ;IGNORE TEAM #\r
+       CMP I,14                ;QB?\r
+       BNE 30$                 ;NO, SKIP\r
+       STY HASBAL              ;ELSE MARK BALL AS HIS\r
+30$:   RTS\r
+C.PASR:        LDA HASBAL              ;DOES SOMEONE ALREADY HAVE IT\r
+       BPL 20$                 ;IF SO, SKIP\r
+       CPY REC1                ;DID REC CATCH IT\r
+       BNE 20$                 ;NOPE\r
+10$:   LDX REC1                ;THEN GET RIGHT ONE\r
+11$:   JSR SCANJ               ;SCAN UP TO "JOY"\r
+       JSR D.JOY               ;FINISH DECODE\r
+       STX HASBAL\r
+       LDA I,-1\r
+       STA REC1                ;RESET RECEIVER\r
+       LDA I,0\r
+       STA A,FLAGS+<BALLNO*2>  ;RESET BALL'S FLAGS\r
+       LDX I,28.               ;RESTORE X\r
+       JSR DECODE              ;BUMP BALL\r
+       LDY HASBAL              ;RESTORE Y AND PICK UP COLCHK\r
+20$:   RTS                     ;WHERE WE LEFT OFF\r
+C.PRER:        BRK                     ;BLOW UP\r
+SCANJ: JSR INCMCC\r
+       LDA NX,MCC\r
+       STA ZX,OP               ;FETCH OP\r
+       BEQ C.PRER              ;"END" HERE IS ERROR\r
+       JSR INCMCC\r
+       LDA NX,MCC\r
+       STA ZX,PARAM            ;DO FIRST PART OF DECODE\r
+       LDA ZX,OP\r
+       CMP I,1                 ;"JOYSTICK"?\r
+       BNE SCANJ               ;NO, KEEP SCANNING\r
+       RTS\r
+CKS2:  .BYTE 5D\r
+;CHECK FOR WITHIN RANGE OF ELIGIBLE RECEIVER\r
+C.INTC:        LDA HASBAL              ;FREE BALL?\r
+       BPL 20$                 ;NO, SKIP\r
+       LDA PARAM+28.           ;CHECK PASS TIMER\r
+       CMP I,4                 ;NEAR END\r
+       BCS 6$                  ;NO, CHECK REC.\r
+4$:    ADC I,4                 ;DO NOT LET PASS\r
+       STA PARAM+28.           ;FALL ON DEFENDER\r
+       LDA OP+28.\r
+       CMP I,7                 ;PUNT?\r
+       BNE 6$                  ;NO\r
+       STY HASBAL              ;YES\r
+       LDA I,EC.BLK            ;ELSE SET CODE\r
+       STA WHYEND              ;FOR INTER.\r
+       BNE 20$                 ;ALWAYS\r
+6$:    LDX REC1                ;CHECK RECEIVER\r
+       BMI 20$                 ;BRANCH IF NONE\r
+       JSR C.INRG              ;IN RANGE?\r
+20$:   LDX I,28.               ;RESET X(Y NOT DISTURBED)\r
+       RTS\r
+C.INRG:        LDA X,VPOS              ;REC. VERT POS\r
+       SEC\r
+       SBC AY,VPOS             ;DEF. VERT POS\r
+       BCS 10$\r
+       EOR I,0FF\r
+       ADC I,1                 ;ABS VAL\r
+10$:   CMP I,20.\r
+       BCS 30$                 ;TOO FAR\r
+       LDA X,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA K\r
+       LDA X,HPOSH\r
+       SBC AY,HPOSH            ;D.P. SUBTRACT\r
+       BCS 20$                 ;BRANCH IF "POSITIVE"\r
+       EOR I,0FF\r
+       PHA\r
+       LDA K\r
+       EOR I,0FF\r
+       ADC I,20\r
+       STA K\r
+       PLA\r
+       ADC I,0                 ;D.P. NEGATE\r
+20$:   ASL K\r
+       ROL\r
+       BCS 30$                 ;DEFINITELY TOO FAR\r
+       CMP I,5\r
+       BCS 30$                 ;TOO FAR\r
+       LDA DOWN\r
+       CMP I,4\r
+       LDA I,EC.INC\r
+       BCS 25$\r
+       BIT INTCNT\r
+       BMI 25$\r
+       BVS 25$\r
+       LDA I,EC.INT            ;INTERCEPTION\r
+       STY HASBAL\r
+25$:   STA WHYEND\r
+30$:   RTS\r
+\f      .SBTTL SCROLL-FIELD STUFF\r
+       .SBTTL  RESET SCROLL-FIELD\r
+RSF:   LDA I,14.               ;START AT 4 YD LINE (14 YDS FROM END)\r
+       STA SFDH\r
+       LDA I,20\r
+       STA SFDL\r
+       STA SCRDIR              ;D7 CLEAR\r
+1$:    LDY I,1                 ;SET SPEED 1-1/2 DOTS/FRAME\r
+       JSR SCROLL              ;WRITE A PAIR OF COLUMNS\r
+       LDA SFDH\r
+       CMP I,45.               ;STOP 30 YDS LATER\r
+       BCC 1$\r
+       RTS\r
+       \r
+       .SBTTL BALL-TRACKER\r
+;THIS CODE ATTEMPTS TO KEEP THE BALL CENTERED ON SCREEN\r
+TRACK: LDA OFFENS              ;0 OR 2\r
+       ASL                     ;0, 4\r
+       ASL                     ;0, 8\r
+       ADC I,11.               ;11, 19\r
+       ADC SFDH                ;OFFSET "CENTER" OF SCREEN\r
+       PHA\r
+       LDA SFDL\r
+       SEC\r
+       SBC BHPOSL              ;FIRST HALF OF D.P. COMPARE\r
+       TAY\r
+       PLA\r
+       SBC BHPOSH              ;COMPARE TO BALL POSN\r
+       BCS 1$\r
+       EOR I,0FF               ;TAKE ABS. VAL.\r
+       PHA\r
+       TYA\r
+       ADC I,20\r
+       PLA\r
+       ADC I,0\r
+       CLC                     ;KEEP CARRY CLEAR\r
+1$:    ROR SCRDIR              ;SET D7 OF SCRDIR FOR DIRECTION\r
+       LDY I,3\r
+2$:    CMP AY,TMTAB-1  ;!DIST!-3,6,9\r
+       BCS SCROLL      ;BRANCH IF!DIST!LARGER\r
+       DEY\r
+       BNE 2$\r
+25$:   RTS\r
+TMTAB: .BYTE 3,6,9\r
+       \r
+       .SBTTL  SCROLLING\r
+SCROLL:        STY SCRSPD              ;SAVE SPEED\r
+       INC SLOCK               ;INTERLOCK FOR UPDATE\r
+       LDA FRAME\r
+       LSR\r
+       BCS 5$\r
+10$:   LDA SCRDIR\r
+       ASL                     ;GET DIRECTION INTO CARRY\r
+       LDA SFDL\r
+       LDY SFDH\r
+       BCS 2$          ;IF CARRY SET, SUBTRACT TO MOVE RIGHT\r
+       CPY I,FL-30.    ;ELSE CHECK FOR END OF FIELD\r
+       BCS 6$          ;ALREADY THERE, SKIP THE ADD\r
+1$:    ADC I,20        ;BUMP BY ONE DOT\r
+       BCC 4$\r
+       INC SFDH\r
+       BNE 4$          ;*** ALWAYS\r
+\r
+2$:    BNE 3$          ;"Y" NON-ZERO, OK\r
+       AND I,0E0       ;CLEAR ANY TRASH AND TEST ACC\r
+       BEQ 6$          ;POSN 0, DON'T DECREMENT\r
+3$:    SBC I,20        ;BUMP RIGHT ONE DOT\r
+       BCS 4$          ;CARRY IS NOT-BORROW\r
+       DEC SFDH        ;ELSE BORROW FROM HIGH BYTE\r
+\r
+4$:    STA SFDL\r
+       AND I,0E0\r
+       BNE 5$\r
+       JSR REWRT       ;ON BOUNDARY, RE-WRITE BOTH ENDS\r
+5$:    DEC SCRSPD\r
+       BPL 10$\r
+6$:    LSR SLOCK       ;RELEASE INTERLOCK\r
+       RTS\r
+\r
+       .SBTTL  RE-WRITE SCROLL FIELD\r
+;REWRITE BOTH END OF SCROLL-FIELD\r
+REWRT: LDA SFDH                ;GET UPPER 8 BITS OF SFD\r
+       CLC\r
+       ADC I,30.               ;OFFSET TO RIGHT OF SCREEN\r
+       JSR WCOL                ;WRITE THAT COLUMN\r
+       LDA SFDH                ;GET YARDS BACK\r
+       SEC\r
+       SBC I,1                 ;OFFSET ONE COL TO LEFT\r
+       BCS WCOL                ;IF THERE IS ONE, WRITE IT & RETURN\r
+       RTS                     ;ELSE SKIP IT\r
+WCOL:  STA SCRYDS              ;SAVE YARD #\r
+       AND I,1F                ;MODULO 32\r
+       STA ADL                 ;POINT TO INVISIBLE COLUMN\r
+       LDA I,SCRFLD/100        ;BUILD POINTER TO SCROLL FIELD\r
+       STA ADH\r
+       LDA SCRYDS              ;GET YARDS BACK\r
+       CLC\r
+       ADC I,1                 ;OFFSET BECAUSE 0 IS THE FIRST YARD\r
+       CMP I,11.               ;IN LEFT END ZONE?\r
+       BCC 1$                  ;YES, FLAG IT\r
+       CMP I,111.              ;RIGHT END ZONE?\r
+       BCC 2$                  ;NO, SKIP\r
+1$:    INC EZFLG\r
+2$:    LDX I,0\r
+3$:    CMP I,5                 ;DIVIDE BY 5\r
+       BCC 4$\r
+       INX\r
+       SBC I,5                 ;WITH REPEATED SUB.\r
+       BCS 3$                  ;***ALWAYS\r
+4$:    TAY                     ;SAVE REM.\r
+       TXA                     ;GET QUOT TO ACC.\r
+       LSR                     ;(YARDS/5)/2=YARDS/10\r
+       STA Y10                 ;STORE "YARDS OVER 10"\r
+SIDES: TYA                     ;GET REM BACK\r
+       CMP I,2                 ;CHECK FOR 2,3,4\r
+       BCS 3$                  ;YES, LEAVE BLANK\r
+       LDA AX,YLTBL            ;GET CHAR, WITH ARROW BITS IN TOP\r
+       STA ARDIR               ;SAVE IT, FOR ARROW BITS\r
+       AND I,3F                ;STRIP ARROW BITS\r
+       TAX                     ;STASH PICT IN X\r
+       TYA                     ;GET REM BACK\r
+       LSR                     ;FIRST OR SECOND HALF OF PICT?\r
+       TXA                     ;(PICT -> ACC)\r
+       BCS 2$                  ;BRANCH IF SECOND HALF\r
+       CMP I,6                 ;FIRST LINE, IS IT A NUMBER?\r
+       BCC 5$                  ;NO, LEAVE IT BE\r
+       LDA I,4                 ;ELSE PUT "0" ON TOP\r
+       ASL ARDIR               ;SHIFT CORECT ARROW BIT INTO SIGN\r
+       BNE 25$                 ;OUTPUT ACC ON TOP, X ON BOTTOM\r
+2$:    ORA I,40                ;SECOND LINE, FLIP PICT\r
+       TAX                     ;COPY TO X\r
+       CMP I,46                ;NUMBER?\r
+       BCC 5$                  ;NO,JUST OUTPUT\r
+       LDX I,44                ;ELSE SET X TO FLIPPED "0"\r
+25$:   ASL ARDIR               ;SHOULD WE ADD AN ARROW?\r
+       BCC 5$                  ;NO, SKIP\r
+       ORA I,1                 ;ELSE ADD IT\r
+       INX                     ;BOTH TOP AND BOTTOM\r
+       BNE 5$                  ;***ALWAYS\r
+\r
+3$:    LDA I,SIDELN            ;MAKE IT A SIDE-LINE ONLY\r
+       TAX                     ;TOP & BOTTOM\r
+5$:    ORA I,80                ;FLIP VERT. FOR TOP OF SCREEN\r
+       LDY I,0\r
+       STA NY,ADL              ;STORE PICT FROM ACC\r
+       LDA I,SCRFLD/100+3\r
+       STA ADH                 ;POINT TO BOTTOM OF SCREEN\r
+       LDY I,0A0\r
+       TXA\r
+       STA NY,ADL              ;STORE PICT FROM X\r
+\r
+;NOW, FILL CENTER OF SCREEN WITH BLANKS OR YARDLINES\r
+FILLIN:        EOR I,SIDELN            ;IS PIC. SIDELINE?\r
+       BEQ 1$                  ;YES, MAKE BLANK\r
+       CMP I,40                ;"FLIPPED" SIDELINE\r
+       BEQ 1$                  ;YES, BLANK IT\r
+       EOR I,SIDELN            ;RESTORE PIC\r
+       BIT A,M3E               ;END-ZONE CORNER?\r
+       BEQ 10$                 ;YES, MAKE IT FAT\r
+       AND I,0C0               ;ELSE LEAVE ONLY REFLECT BITS\r
+10$:   ORA I,10                ;AND MAKE IT A YARD LINE/END-ZONE LINE\r
+1$:    STA J                   ;SAVE CHAR\r
+       LDX I,27.               ;28 LINES TO FILL\r
+       LDA I,SCRFLD/100        ;SET TOP OF PTR\r
+       STA ADH\r
+       LDY I,20                ;OFFSET ONE LINE\r
+2$:    LDA J                   ;GET CHAR\r
+       STA NY,ADL              ;STASH IT\r
+       TYA                     ;USE OFFSET\r
+       CLC\r
+       ADC ADL                 ;TO BUMP LOW PTR\r
+       STA ADL\r
+       BCC 3$\r
+       INC ADH                 ;BUMP HIGH PTR\r
+3$:    DEX                     ;COUNT LINES\r
+       BPL 2$                  ;TILL DONE\r
+       LSR EZFLG               ;ARE WE IN ENDZONE\r
+       BCS EDLOGO              ;YES, SKIP HASH-MARKS\r
+       LDA I,SCRFLD/100+1\r
+       STA ADH                 ;POINT TO X(80+(0-1F)\r
+       LDY I,0\r
+       LDA J                   ;CHECK CHAR\r
+       BIT A,M3F               ;BLANK? (6 LSB'S=0) [BIT I,3F]SEE PAGE 8\r
+       BNE 4$                  ;NO SKIP\r
+       ORA I,0F                ;ELSE MAKE HASH MARK-3\r
+4$:    CLC\r
+       ADC I,3                 ;ADD HASH MARK TO YARD LINE\r
+       STA NY,ADL\r
+       LDY I,0A0               ;POINT TO X220+(0-1F)\r
+       STA NY,ADL\r
+       .SBTTL  DRAW LOGO\r
+DOLOGO:        LDA SCRYDS              ;GET YARDLINE WE'RE DOING\r
+       SEC\r
+       SBC I,FL/2-2            ;IN CENTER OF FIELD\r
+       BCC EDLOGO              ;NO, OFF TO LEFT\r
+       CMP I,4                 ;FOUR STAMPS WIDE\r
+       BCS EDLOGO              ;OFF TO RIGHT\r
+       ORA I,30                ;LOGO IS LAST 16 STAMPS\r
+       TAX                     ;SAVE INX\r
+       LDY I,20                ;POINT TO X1A0 + (0-1F)\r
+1$:    TXA                     ;GET PROPER STAMP\r
+       STA NY,ADL              ;STORE IN SCROLL FIELD\r
+       ADC I,4                 ;BUMP TO NEXT STAMP\r
+       TAX                     ;SAVE STAMP\r
+       TYA\r
+       ADC I,20                ;BUMP TO NEXT ROW\r
+       TAY\r
+       CPX I,40                ;LAST STAMP?\r
+       BCC 1$                  ;NO, LOOP\r
+EDLOGO:        RTS                     ;DONE\r
+YLTBL: .BYTE 1,3,4,2,46,2,48,2,4A,2,4C,2,0CE,2,8C,2,8A,2,88,2,86,2,4,3,1\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
\ No newline at end of file
diff --git a/A35340.1B b/A35340.1B
new file mode 100644 (file)
index 0000000..8755317
Binary files /dev/null and b/A35340.1B differ
diff --git a/A35340.1C b/A35340.1C
new file mode 100644 (file)
index 0000000..2d1598d
Binary files /dev/null and b/A35340.1C differ
diff --git a/A35340.1D b/A35340.1D
new file mode 100644 (file)
index 0000000..5e22e1e
--- /dev/null
+++ b/A35340.1D
@@ -0,0 +1,514 @@
+       .TITLE NFINT\r
+       .RADIX 16\r
+       .ASECT\r
+       .IIF NDF,NTB,NTB=1\r
+       .GLOBL EOZP,$COINA,$LAM,$LMBIT,$CNSTT,$PSTSL\r
+       .GLOBL $CCTIM,$LMTIM,$INTCT\r
+       .GLOBL EOPROG\r
+       .INCLUDE NFCOMN\r
+       .PAGE\r
+       .SBTTL INTERRUPT\r
+       .CSECT\r
+;ENTERED 4 TIMES/FRAME, AT LINES 64, 128, 192, & 240.\r
+IRQ:   PHA                     ;SAVE REGS\r
+       TXA\r
+       PHA\r
+       TYA\r
+       PHA\r
+       CLD                     ;SET HEX\r
+       .SBTTL  SOFTWARE WATCHDOG\r
+;BELOW CODE CHECKS S.P., P.C. & PSW FOOR VALIDITY\r
+       TSX                     ;X <- SP\r
+       BPL 86$                 ;STACK TOO DEEP, ABORT\r
+       LDA AX,104              ;GET OLD PSW\r
+       AND I,10                ;BREAK?\r
+       BNE 86$                 ;YES, ABORT\r
+       LDA AX,106              ;PCH\r
+       CMP I,PROG/100          ;CHECK LOW LIMIT\r
+       BCC 86$\r
+       LDA AX,105\r
+       CMP I,0\r
+       .=.-1\r
+       .WORD FTAB\r
+       .=.-1\r
+       LDA AX,106\r
+       SBC I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD FTAB\r
+       .DSABL M68\r
+       .=.-1\r
+\r
+;ABOVE 12 LINES DOES A D.P. COMPARE OF PC:FTAB\r
+\r
+       BCC 5$                  ;IF BORROW, P.C. IS IN BOUNDS\r
+86$:   JMP RESET               ;ABORT ENTRY, DO POWER-ON\r
+\r
+5$:    LDA SYNC                ;CHECK SYNC WORD\r
+       CMP I,6\r
+       BCS 86$\r
+\r
+;IF SYNC >= 6, PROCESSOR IS IN "PHANTOM-LOOP"\r
+\r
+       STA A,WTCHDG            ;ALL O.K., HIT DOG\r
+                               ;\r
+       JSR TBREAD              ;READ SWITCHES + COUNTERS\r
+                               ;\r
+       INC INTCNT              ;COUNT INTERRUPTS\r
+       BIT VBLANK              ;VERT. BLANKING?\r
+\r
+;138 CYCLES (MIN) FROM FALL OF IRQ\r
+\r
+       BVC 2$                  ;NO\r
+       LDA INTCNT              ;YES\r
+       AND I,0FC               ;PHASE LOCK FOR LED'S\r
+       STA INTCNT\r
+       DEC FIELD               ;COUNT FIELDS\r
+\r
+;+14 ON VBLANK\r
+\r
+       BPL 10$\r
+       LDA I,2                 ;3 FIELD'S PER FRAME\r
+       STA FIELD               ;(2,1,0)\r
+       INC SYNC                ;SYNC UP MAINLINE\r
+       JSR MOTUP               ;UPDATE MOTION OBJECT POSITIONS\r
+10$:   LDA A,HVPOS+30.\r
+       BEQ 11$\r
+       LDA I,248.\r
+       STA A,HVPOS+30.\r
+\r
+;+13 MINIMUM\r
+\r
+11$:   JSR DEBNCE              ;KILL TIME WITH SWITCH DEBOUNCE\r
+       LSR MOTDON              ;WAS MOTUP DONE?\r
+       BCS 2$                  ;YES, WE'RE PAST LINE 255\r
+;IF MOTUP WAS NOT EXECUTED, WE ARE POSSIBLY ONLY 280 CYCLES INTO V-BLANKING\r
+;(ABOUT 1/2 THROUGH LINE 245) IF WE WERE TO "STA A,INTACK" NOW, BEFORE\r
+;LINE 256, WE WOULD BE INTERRUPTED AGAIN BY THE FALLING EDGE OF 32V @ LINE\r
+;256.  WE NEED TO BURN 16*48-280 CYCLES (488) TO BE SAFE. SINCE A DEX, BNE\r
+;LOOP BURNS 5 CYCLES PER ITERATION A COUNT OF 98 WILL SUFFICE.\r
+;5*98+2 (LDX I,98..) = 492\r
+       LDX I,107.\r
+12$:   DEX\r
+       BNE 12$\r
+;WASTE TIME\r
+2$:    STA A,INTACK            ;ACKNOWLEDGE INTERRUPTS\r
+\r
+       .SBTTL  MULTIPLEX LED CATHODES\r
+MUXLED:        LDA INTCNT              ;GET INTERUPT CTR\r
+       AND I,3                 ;LSB'S GIVE QUARTER OF SCRN\r
+       TAX                     ;PICK UP BIT TO LIGHT\r
+       LDA ZX,LEDWD-1          ;ANODE "A" NOT USED, SO RAM IS DON'T-CARE\r
+       STA A,OUT3              ;STORE OUT TO CATHODES\r
+\r
+       TXA                     ;WAS THIS V-BLANK?\r
+       BEQ SOUND               ;YES, DEBOUNCE ALREADY DONE\r
+       CMP I,2                 ;MID-FRAME INTERRUPT?\r
+       BNE 25$                 ;NO, SKIP\r
+       LDA A,HVPOS+30.         ;DOWN MARKER VISIBLE?\r
+       BEQ 25$                 ;INVISIBLE, LEAVE IT\r
+       LDA I,16.\r
+       STA A,HVPOS+30.         ;SET ON BOTTOM OF SCREEN\r
+25$:   JSR DEBNCE              ;IF NOT ALREADY\r
+\r
+       .SBTTL  HANDLE SOUNDS\r
+SOUND: LDA ATRACT\r
+       BMI 10$\r
+       LDA I,0\r
+       STA BEEP\r
+       STA WHISTL\r
+10$:   LDA WHISTL      ;WHISTLE\r
+       BEQ 1$\r
+       DEC WHISTL      ;TIME IT\r
+       LDA INTCNT      ;WARBLE\r
+1$:    LSR\r
+       LSR\r
+       AND I,1\r
+       ORA BEEP                ;STEADY TONE\r
+       ORA I,4\r
+12$:   LSR THUD        ;HIT SOUND\r
+       BCC 2$\r
+15$:   ORA I,2\r
+2$:    STA TOUT1\r
+       LDA CROWD\r
+       BIT ATRACT\r
+       BPL 3$\r
+       ORA I,20        ;TURN SOUNDS ON\r
+3$:    LDY $CCTIM      ;COIN-COUNTER\r
+       BPL 4$\r
+       ORA I,10        ;TURN IT ON\r
+4$:    STA A,OUT2\r
+\r
+       .SBTTL  HANDLE QUADRATURE TRACKBALL\r
+       JSR TBALL\r
+       JSR MOOLAH              ;COIN ROUTINE\r
+       PLA\r
+       TAY\r
+       PLA\r
+       TAX\r
+       PLA\r
+M40:   RTI             ;RTI=40 HEX, USED TO TEST TEST SW.\r
+\r
+       .SBTTL  DE-BOUNCE SWITCHES\r
+;NOTE-SWITCHES ARE LOW-TRUE (107 CYCLES, INCL JSR)\r
+DEBNCE:        LDX I,2\r
+1$:    LDY ZX,INPUT            ;READ SWITCHES\r
+       LDA ZX,DBSW             ;SAVE OLD SWITCHES\r
+       STY ZX,DBSW             ;REPLACE WITH NEW\r
+       TAY                     ;COPY OLD\r
+       AND ZX,DBSW             ;MAKE ONES WHERE BOTH OFF\r
+       ORA ZX,SWSTAT\r
+       STA ZX,SWSTAT           ;TURN OFF IN STATUS\r
+       TYA                     ;GET BACK OLD\r
+       ORA ZX,DBSW             ;MAKE ZEROES WHERE BOTH ON\r
+       AND ZX,SWSTAT           ;TURN ON IN STATUS\r
+       STA ZX,SWSTAT           ;SAVE NEW STATUS\r
+       DEX\r
+       DEX\r
+       BPL 1$\r
+       RTS\r
+\r
+\r
+       .SBTTL  MOVE MOTION OBJECT PARAMS\r
+;-13.-18 SCAN LINES\r
+MOTUP: LDA SLOCK\r
+       BNE 4$\r
+       INC MOTDON\r
+       LDX I,30.               ;OBJ. 0-15, 2 BYTES @\r
+1$:    LDA ZX,HPOSL\r
+       SEC\r
+       SBC SFDL\r
+       AND I,0E0               ;SAVE TOP 3 BITS\r
+       STA IJ                  ;SAVE IN INTERRUPT'S BUCKET\r
+       LDA ZX,HPOSH\r
+       SBC SFDH                ;FINISH D.P. SUBTRACT\r
+       BCC 2$                  ;BRANCH IF OBJECT OFF TO LEFT\r
+       CMP I,31.\r
+       BCS 2$                  ;BRANCH IF OBJECT OFF TO RIGHT\r
+       LSR                     ;MAKE GAP FOR CARRY\r
+       ORA IJ                  ;"OR" LOW BITS INTO HIGH BITS\r
+;ACC IS NOW D2,D1,D0,0,D7,D6,D5,D4  CARRY CONTAINS D3\r
+\r
+       ROL                     ;D1,D0,0,D7,D6,D5,D4,D3  D2\r
+       ROL                     ;D0,0,D7,D6,D5,D4,D3,D2  D1\r
+       ROL                     ;0,D7,D6,D5,D4,D3,D2,D1  D0\r
+       ROL                     ;GOT IT RIGHT, AND CARRY CLEAR\r
+       STA AX,HHPOS            ;OUT TO HARDWARE\r
+       LDA ZX,VPOS             ;THIS ONE'S PRE-ADJUSTED\r
+       BCC 3$                  ;ALWAYS***\r
+2$:    LDA I,0\r
+3$:    STA AX,HVPOS            ;CORRECT OR BLANKED, OUT TO HDW.\r
+       DEX\r
+       DEX\r
+       BPL 1$                  ;WHILE OBJ # >= 0\r
+       LDA SFDL\r
+       AND I,0E0               ;SAVE TOP 3 OF BOTTOM 8\r
+       STA IJ\r
+       LDA SFDH\r
+       AND I,1F\r
+       LSR\r
+       ORA IJ\r
+       ROL\r
+       ROL\r
+       ROL\r
+       ROL                     ;REPEAT STUNT ABOVE\r
+       STA A,SFHPOS            ;STORE TO SCROLLFIELD DISPLACEMENT\r
+       LDA INTCNT\r
+       AND I,30                ;4 HZ, 75% ON\r
+       BNE 4$\r
+       LDX CTLPTR              ;POINTS TO LEFT JOYSTICK MAN\r
+       BMI 35$                 ;NO SUCH FELLA\r
+       STA AX,HVPOS            ;ELSE BLINK MAN\r
+35$:   LDX CTLPTR+2            ;RIGHT JOYSTICK MAN\r
+       BMI 4$\r
+       STA AX,HVPOS\r
+4$:    RTS\r
+\r
+\f      .SBTTL POWER-ON-RESET\r
+RESET: LDX I,0FF\r
+       TXS                     ;SET UP STACK\r
+;NOW FALL THROUGH TO CLEAR RAM, FOR BOTH GAME AND TEST\r
+       .SBTTL SELF-TEST\r
+STEST: CLD\r
+       LDX I,0\r
+       TXA\r
+1$:    STA ZX,0\r
+       STA AX,ALPHL\r
+       STA AX,ALPHR\r
+       STA AX,SCRFLD\r
+       DEX\r
+       BNE 1$\r
+       STA A,OUT1              ;HIT KICKER, ENABLE SWITCH READ\r
+       BIT A,INPORT+2          ;CHECK TEST SW.\r
+       BVC TREPT               ;BRANCH IF ON\r
+       JMP START               ;ELSE GO TO GAME MODE\r
+\r
+       .SBTTL  ZERO-PAGE TEST\r
+TREPT: LDX I,11                ;BEGINNING PATTERN\r
+       TXS                     ;S HOLDS PATTERN\r
+       TXA\r
+       STA Z,0                 ;TEST CELL START @ 0\r
+       LDY I,0\r
+2$:    LDX I,1                 ;ONE LESS COUNT BEFORE IT WRAPS\r
+3$:    INY                     ;SCAN FORWARD\r
+       LDA AY,0                ;ZERO?\r
+       BNE 5$                  ;NO, ERROR\r
+       INX                     ;HOW FAR HAVE WE SCANNED\r
+       BNE 3$                  ;KEEP MOVING\r
+       TSX\r
+       TXA                     ;ACC <- PATTERN\r
+       STA A,WTCHDG\r
+       INY                     ;POINT TO TEST CELL\r
+       CMP AY,0                ;DOES IT HAVE PATTERN\r
+       BNE 5$                  ;IF NOT, IS ERROR\r
+       LDX I,0                 ;ELSE CLEAR CELL\r
+       STX ZY,0\r
+       INY                     ;POINT TO NEXT TEST CELL\r
+       BNE 4$                  ;IF PASS NOT COMPLETE\r
+       ASL                     ;ELSE SHIFT PATTERN\r
+       LDX I,19.               ;FOR MSG. IF DONE\r
+       BCS 6$                  ;BRANCH IF DONE\r
+4$:    TAX                     ;PATTERN -> ACC\r
+       TXS                     ;    "   -> STORAGE\r
+       STX ZY,0                ;    "   -> NEW TEST CELL\r
+       BNE 2$                  ;***ALWAYS, REPEAT SCAN\r
+\r
+5$:    LDX I,16.\r
+6$:    LDY I,16.\r
+       .SBTTL  REPORT MEMORY STATUS\r
+MEMREP:        LDA AX,ERMSG\r
+       STA AY,ALPHL+28\r
+       AND I,3F                ;CLEAR REFLECT BITS\r
+       BEQ 1$\r
+       CLC\r
+       ADC I,58\r
+1$:    STA AY,SCRFLD+4         ;GET A LITTLE AWAY FROM THE EDGE\r
+       DEX\r
+       DEY\r
+       BMI PATSCN\r
+       CPY I,9\r
+       BNE MEMREP\r
+\r
+       .SBTTL  ROM TEST\r
+ROMTST:        LDY I,0                 ;PROG STARTS ON EVEN PG.\r
+       STY ADL                 ;LOW ADDRESS PTR\r
+       TYA                     ;CLRA\r
+       PHA                     ;CLR (SP)-\r
+       LDA I,PROG&0FF00/100    ;HIGH BYTE OF PROG ADDR\r
+       STA ADH                 ;HIGH ADDRESS PTR\r
+       LDX I,23.               ;24 PAGES OF ROM\r
+       TXA                     ;SEED FOR L.R.C.\r
+       LSR                     ;GET SOMETHING IN EACH NYBBLE(34,38,3C)\r
+10$:   LDY I,0\r
+       STX A,WTCHDG            ;MUZZLE DOG\r
+1$:    EOR NY,ADL              ;LONGITUDINAL PARITY\r
+       INY\r
+       BNE 1$                  ;LOOP FOR 1 PAGE\r
+       TAY                     ;SAVE LRC\r
+       TXA\r
+       AND I,7                 ;3 LSB=PAGE IN ROM\r
+       CMP I,1                 ;CLEAR CARRY IF END OF ROM\r
+       TYA                     ;PUT LRC BACK\r
+       BCS 3$                  ;SKIP IF IN ROM\r
+       BEQ 2$                  ;SKIP IF OK\r
+       PHA                     ;ELSE SNAP FOR ANALYZER\r
+2$:    TXA                     ;RE-SEED FOR NEW ROM\r
+3$:    INC ADH                 ;BUMP PTR\r
+       DEX                     ;COUNT PAGES\r
+       BPL 10$\r
+       LDX I,9                 ;DEFAULT TO "ROM OK"\r
+       PLA                     ;ANY PUSHES?\r
+       BEQ 4$                  ;NO, OK\r
+       LDX I,6                 ;ELSE POINT TO "BAD ROM"\r
+4$:    LDY I,6                 ;6 CHAR MSG\r
+       BNE MEMREP              ;(ALWAYS)\r
+;53 BYTES DOWN THE TUBES!!!\r
+       .SBTTL  PATTERN SCREEN\r
+PATSCN:        LDX I,0\r
+1$:    TXA\r
+       STA AX,ALPHR\r
+       STA AX,ALPHL+40\r
+       STA AX,SCRFLD+100\r
+       STA AX,SCRFLD+200\r
+       STA AX,SCRFLD+300\r
+       INX\r
+       BNE 1$\r
+       STX A,SFHPOS\r
+       TXS                     ;SET UP FOR INLINE CODE CHECKS\r
+       LDX I,30.\r
+       LDA I,15\r
+2$:    STA AX,HPICT\r
+       EOR I,1\r
+       DEX\r
+       DEX\r
+       BPL 2$\r
+\r
+       .SBTTL  SWITCH TEST\r
+SWTEST:\r
+;FIRST, READ THE SWITCHES AND TB COUNTERS\r
+TBREAD:        LDA A,INPORT            ;TRACK BALL COUNTERS FOR 0\r
+       STA TBCTR\r
+       LDA A,INPORT+2          ;COUNTER FOR 2\r
+       STA TBCTR+2\r
+       LDA TOUT1               ;GET WHATS SUPPOSED TO BE IN "OUT1"\r
+       TAX                     ;SAVE IT\r
+       ORA I,20                ;HAVE IT READY WITH CTRLD=1\r
+       STX A,OUT1              ;OUTPUT WITH CTRLD=0 TO READ SWITCHES\r
+       LDX A,INPORT            ;READ SWITCHES\r
+       LDY A,INPORT+2          ;BOTH SETS\r
+       STA A,OUT1              ;OUTPUT WITH CTRLD=1 TO FREE-UP COUNTERS\r
+       STX INPUT               ;SAVE INPUTS\r
+       STY INPUT+2\r
+;REVERSE COIN SWITCHES\r
+       STX $COINA+2\r
+       STY $COINA\r
+       LDA A,INPORT            ;INSURANCE READ OF COUNTERS\r
+       LDY A,INPORT+2\r
+       STY NEWTB+2\r
+       STA NEWTB\r
+       STX TBDIRN\r
+       TSX                     ;TEST FOR SUBROUTINE\r
+       BPL 100$                ;NO, INLINE CODE\r
+       RTS                     ;YES, RETURN\r
+100$:\r
+;NOW COUNT SWITCHES CLOSED\r
+       LDX I,0                 ;CLR X\r
+       LDA INPUT\r
+       ORA I,4F                ;SWITCHES IN TOP,MAKE LSB & VBLANK DON'T CARES\r
+1$:    BMI 2$\r
+       INX                     ;COUNT 0'S\r
+2$:    ASL                     ;SHIFT TO NEXT SW\r
+       BNE 1$                  ;IF THERE IS ONE\r
+       LDA INPUT+2\r
+       BIT A,M40               ;TEST SW?\r
+       BEQ 25$                 ;STILL ON, CONTINUE\r
+       JMP RESET               ;ELSE RESET TO GAME\r
+25$:   ORA I,2F                ;REPEAT ABOVE\r
+3$:    BMI 4$\r
+       INX\r
+4$:    ASL\r
+       BNE 3$\r
+;AT THIS POINT, X CONTAINS THE # OF SWITCHES CLOSED\r
+       TXA                     ;SAVE X\r
+       CPX K\r
+       CLC\r
+       BEQ 8$                  ;NO CHANGE IN # OF SWITCHES\r
+7$:    SEC                     ;COME HERE TO BEEP\r
+8$:    STA K                   ;SAVE SWITCHES FOR NEXT\r
+       LDA I,2                 ;KICKER (SHIFTED RIGHT)\r
+       ROL                     ;LINE IT UP AND PUT IN WHISTLE\r
+       STA TOUT1               ;SET CTRLD=1, AND WHISTLE\r
+       LDX I,0                 ;MAKE X=0 (OR AT MOST 5)\r
+9$:    CMP NX,0                ;WASTE 6 CYCLES\r
+       INX                     ;+2 MORE\r
+       BNE 9$                  ;+ AT LEAST 3 (*256=3.7 MS.)\r
+       LSR                     ;SET C IF ANY SWITCHES CHANGED\r
+       LDA CROWD\r
+       ORA I,20                ;SET ATRACT BAR\r
+       STA A,OUT2              ;MAKE SURE SOUNDS ON\r
+       STA A,WTCHDG            ;KEEP DOG QUIET\r
+;IF A SWITCH CHANGED, BUMP THE MOTION OBJECT PTR FOR BELOW TEST\r
+       LDA J\r
+       BCC 10$                 ;SKIP IF NO CHANGE\r
+       ADC I,3                 ;ADDS 4, CUZ CARRY IS SET\r
+10$:   AND I,1C                ;KEEP IT A VALID OBJECT PTR\r
+       STA J\r
+\r
+       .SBTTL  TRACK-BALL TEST\r
+TBALL: LDX I,3                 ;FOR BOTH PLAYERS\r
+10$:   LDA ZX,TBCTR-1          ;GET TRACK-BALL COUNTER\r
+       SEC\r
+       SBC ZX,OTB-1            ;GET CHANGE FROM OLD\r
+       AND I,0F                ;ISOLATE\r
+       PHA\r
+       LDA ZX,TBCTR-1\r
+       ORA I,0F                ;MAKE LSB'S DON'T-CARE\r
+       SEC\r
+       SBC ZX,OTB-1            ;GET CHANGE FROM OLD\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;SHIFT DOWN\r
+       LDY ZX,NEWTB-1          ;GET NEW VALUE\r
+       STY ZX,OTB-1            ;SAVE AS OLD FOR NEXT TIME\r
+20$:   LSR TBDIR               ;GET DIRECTION\r
+       ORA I,0                 ;TEST MAG\r
+       BEQ 30$                 ;KEEP ZERO ZERO\r
+       BCC 30$                 ;BRANCH IF FORWARD\r
+       EOR I,0F0               ;ELSE FLIP "SIGN"\r
+30$:   CLC\r
+       ADC ZX,TBHD\r
+       BVC 35$\r
+       EOR I,80                ;COMPLEMENT BAD SIGN\r
+       ASL                     ;SAVE IT\r
+       LDA I,7F                ;SET MAX PLUS\r
+       ADC I,0                 ;MAKE MINUS IF NEED BE\r
+35$:   STA ZX,TBHD\r
+       TXA                     ;WHAT DID WE JUST DO\r
+       LSR                     ;GET EVEN/ODD INTO CARRY\r
+       DEX                     ;BUMP TO NEXT\r
+       BCC 40$                 ;IF JUST DID EVEN, CHECK DONE\r
+       PLA                     ;ELSE GET H-VALUE\r
+       BCS 20$                 ;DO BOTTOM-LOOP (ALWAYS)\r
+       \r
+40$:   BPL 10$                 ;DO OTHER PLAYER\r
+       LDA TBDIRN\r
+       STA TBDIR\r
+       TSX\r
+       BPL 50$\r
+       RTS\r
+50$:\r
+;NOW USE TBVD,TBHD TO MOVE OBJ(J),OBJ(J+2)\r
+       LDY J\r
+       INY\r
+       INY\r
+       LDX I,2\r
+60$:   LDA X,TBHD\r
+       CLC\r
+       ADC Y,HHPOS\r
+       STA Y,HHPOS\r
+       LDA X,TBVD\r
+       CLC\r
+       ADC Y,HVPOS\r
+       STA Y,HVPOS\r
+       LDA I,0\r
+       STA X,TBHD\r
+       STA X,TBVD\r
+       DEY\r
+       DEY\r
+       DEX\r
+       DEX\r
+       BPL 60$\r
+       .SBTTL  SCROLL-FIELD TEST\r
+SCFTST:        LDA INPUT\r
+       AND I,10                ;SELECT SW 0\r
+       BNE 1$                  ;SKIP IF OFF\r
+       INC SFDL                ;ELSE MOVE TOWARD #0 (LEFT)\r
+1$:    LDA INPUT+2\r
+       AND I,10\r
+       BNE 2$\r
+       DEC SFDL\r
+2$:    LDA SFDL\r
+       STA A,SFHPOS            ;OUT TO HARDWARE\r
+;SET CROWD VOLUME PROPORTIONAL TO # OF SWITCHES CLOSED\r
+                               ;GET #OF CLOSED SWITCHES(1-6)\r
+       LDA K\r
+       ASL\r
+       ADC K                   ;*3=3,6,9,12,15,18\r
+       ADC I,-3                ;0-15 (0,3,6,9,12,15)\r
+       STA CROWD               ;USE TO TEST CROWD SOUND\r
+;NOW DISPLAY CODE IN OPTION SWITCHES\r
+       LDA INPUT+2             ;GET OPTION SW WD\r
+       AND I,0F                ;ISOLATE COIN MODE\r
+       CLC\r
+       ADC I,59                ;MAKE A CODE FROM A-P\r
+       STA A,SCRFLD+28         ;DISPLAY ON SCROLLFIELD\r
+       JMP SWTEST              ;LOOP WHILE TEST SW IS ON\r
+ERMSG: .ASCII /BAD@ROM@OK/\r
+       .ASCII /BAD@RAM@OK/\r
+EOPROG:        .REPT 11.\r
+       .BYTE 0\r
+       .ENDR\r
+       .VCTRS 7FFA,RESET,RESET,IRQ\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/COIN65.XX b/COIN65.XX
new file mode 100644 (file)
index 0000000..0751d38
--- /dev/null
+++ b/COIN65.XX
@@ -0,0 +1,497 @@
+;        .TITLE COIN65 - 650X "UNIVERSAL" COIN ROUTINE\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\r
+        .SBTTL EXPLANATION\r
+       .RAD=10\r
+        .RADIX 16\r
+       .ENABL LC\r
+        .LIST MEB\r
+;THIS IS A MAJOR REVISION OF THE COIN ROUTINE DERIVED FROM PENNY.\r
+;ALL NEW PROGRAMS SHOULD USE THIS ROUTINE.  OLD PROGRAMS CAN CONTINUE\r
+;TO USE PENNY, BUT NO FURTHER OPTIONS WILL BE SUPPORTED IN PENNY.\r
+        .SBTTL DEFAULT ASSIGNMENTS\r
+        .LIST CND\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+                                       ;ALTERNATE IS MODES=0\r
+       .IIF NDF,MECHS,MECHS=3          ;# OF MECHS (2 OR 3)\r
+       .IIF NDF,INCLUDE,INCLUDE=0      ;NOT ".INCLUDE"'D\r
+;IF "INCLUDE=1",THE ".END" IS SUPPRESSED\r
+       .IIF NDF,RTS,RTS=1              ;EXIT VIA RTS\r
+;IF RTS=0,EXITS BY FALLING OUT\r
+       .IF EQ,MECHS-3                  ;DEFAULTS FOR MECHS=3\r
+       .IIF NDF,MULTS,MULTS=1                  ;IMPLEMENT H.DELMAN STANDARD MULTIPLIERS\r
+                                               ;(SEE GHM,GDM BELOW)\r
+       .IIF NDF,EMCTRS,EMCTRS=3                ;3 ELECTRO-MECH COUNTERS\r
+       .IIF NDF,OFFSET,OFFSET=1                ;OFFSET BY 1\r
+       \r
+       .IFF                            ;DEFAULTS FOR MECHS=2\r
+       .IIF NDF,MULTS,MULTS=0                  ;MULTIPLIERS DO NOT APPLY\r
+       .IIF NDF,EMCTRS,EMCTRS=0                ;NO E.M. COUNTERS\r
+        .IIF NDF,OFFSET,OFFSET=2               ;SWITCHES AND STATUS BYTES TWO-APART\r
+       .ENDC                           ;EQ, MECHS-3\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+;USE SEPCCT=1 ONLY FOR WIERD,NON-STANDARD MECH-MULTIPLIERS\r
+        .IIF NDF,COIN,COIN=0            ;COIN IS LOW-TRUE\r
+        .IIF NDF,CNTINT,CNTINT=1        ;COUNT INTERRUPTS (IN $INTCT)\r
+        .IIF NDF,SLAM,SLAM=1            ;SLAM IS HIGH-TRUE\r
+        .IIF NDF,CMZP,CMZP=1            ;COIN MODE IS IN ZERO-PAGE\r
+;D0,D1=0,1,2,3 FOR FREE, 2 PLAY/COIN, 1 PLAY/COIN,2 COIN/PLAY\r
+;D2,D3=0,1,2,3 FOR 1,4,5,6 "UNITS"/RIGHT COIN\r
+;D4=0,1 FOR 1,2 "UNITS"/MIDDLE COIN\r
+;ONLY D2,3,4 USED IF MODES=0\r
+        .IIF NDF,COIN67,COIN67=0        ;COINS NOT IN D7,D6 OF SAME BYTE\r
+       .IIF NDF,COIN01,COIN01=0        ;COINS NOT IN D0,D1 EITHER\r
+        .IIF NDF,PRST,PRST=30.          ;PRE-COIN SLAM KILLS COINS FOR 30 FRAMES\r
+        .IIF NDF,POST,POST=30.          ;POST-COIN SLAM KILLS COINS WITHIN 30 FRAMES\r
+       .IF NE,<EMCTRS>*<EMCTRS-1>*<EMCTRS-3>\r
+       .ERROR          ;NONE,ONE, OR THREE E.M.CTRS ONLY\r
+       .ENDC\r
+        .IF NE,CMZP\r
+;IF YOU USE CMZP=0, DEFINE EQUIVALENT MACROS\r
+;(GCM NOT NEEDED IF MODES=0)\r
+        .MACRO GCM\r
+;ACC0,ACC1:=COIN OPTION ACC 2-7=0,Z-FLAG SET PER ACC  CARRY IS DON'T CARE.\r
+        LDA Z,$CMODE                   ;GET COIN MODE FROM ZERO-PAGE\r
+       .IF NE,MULTS\r
+       AND I,3                         ;ISOLATE COINS-CREDITS OPTION\r
+       .ENDC                           ;NE,MULTS\r
+        .ENDM\r
+\r
+       .MACRO GHM\r
+;ACC=0 FOR 1 "UNIT" ,<>0 FOR 2 "UNITS" PER MIDDLE-MECH COIN.\r
+;  Z FLAG SET PER ACC.  CARRY IS DON'T CARE\r
+       LDA Z,$CMODE                    ;GET COIN MODE FROM ZERO-PAGE\r
+       AND I,10                        ;ISOLATE HALF-MULTIPLIER\r
+       .ENDM\r
+\r
+       .MACRO GDM\r
+;ACC=0,1,2,3 FOR 1,4,5,6 "UNITS" PER RIGHT-MECH COIN.  CARRY CLEAR.  Z-FLAG SET PER ACC\r
+       LDA Z,$CMODE\r
+       AND I,0C\r
+       LSR\r
+       LSR\r
+       .ENDM\r
+        .ENDC                  ;NE,CMZP\r
+        .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\r
+       .IF NE,MODES!MULTS\r
+       .IF NE,CMZP\r
+        .GLOBL $CMODE                   ;INPUT COIN MODE\r
+       .ENDC                           ;NE, CMZP\r
+       .ENDC                           ;NE,MODES!MULTS\r
+        .GLOBL $COINA,$LAM              ;SWITCH LOCATIONS (COIN & SLAM)\r
+        .GLOBL $LMBIT                   ;MASK WITH 1 IN BIT WHERE SLAM SW. IS\r
+        .GLOBL $CNSTT,$PSTSL           ;INTERNAL LOCATIONS\r
+       .GLOBL $INTCT                   ;INTERRUPT COUNTER\r
+        .GLOBL $LMTIM,$CNCT             ;SLAM-TIMER, COINCOUNT\r
+       .IF NE,MODES\r
+        .GLOBL $$CRDT                   ;RESULT OF ALL THIS\r
+       .ENDC                           ;NE,MODES\r
+       .IF NE,EMCTRS\r
+       .GLOBL $CCTIM                   ;COIN-COUNTER TIMER BYTE(S)\r
+       .ENDC                           ;NE,EMCTRS\r
+        .IF NE,MODES*<MODES-4>\r
+        .ERROR   ;2 FLAVORS-0 OR 4 MODES\r
+        .ENDC                          ;NE,MODES*<MODES-4>\r
+       .IF NE,<MECHS-2>*<MECHS-3>      ;CHECK # OF MECHS SPEC'D\r
+       .ERROR ;2 OR 3 MECHS ONLY, PLEASE\r
+       .ENDC                           ;NE,<MECHS-2>*CMECHS-3>\r
+       .IF EQ,RTS!INCLUDE\r
+       .ERROR ;NO RTS, NO INCLUDE???\r
+       .ENDC                   ;RTS!INCLUDE\r
+       .IF NE,MULTS*SEPCCT\r
+       .ERROR ;BOTH MULTS AND SEPCCT?!?\r
+       .ENDC                           ;NE,MULTS*SEPCCT\r
+       .IF NE,MODES*SEPCCT\r
+       .ERROR ;SEPCCT AND MODES TOO?!?\r
+       .ENDC                           ;NE,MODES*SEPCCT\r
+        .IIF GT,PRST-31.,PRST=31.\r
+        .IIF GT,POST-63.,POST=63.\r
+;        The coin routine assumes the presence of the following .GLOBL variables:\r
+       .IF NE,MODES\r
+       .REPT 0\r
+$$CRDT:   Base page byte initialized to 0 on restart.  This is where accrued  credit\r
+        is  kept.   Should  be  decremented  for each player-start.  Note that a DECREMENT\r
+        instruction must be used to insure  mutual  exclusion  between  the  main  program\r
+        accessing  $$CRDT  and  the  interrupt-driven coin routine accessing $$CRDT".  Not\r
+        used if MODES=0\r
+       .ENDR\r
+       .ENDC                   ;NE,MODES\r
+       .IF NE,CMZP\r
+       .REPT 0\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DO NOT IMPLEMENT SEPARATE $CNCT'S\r
+$CMODE:   Base page byte that contains the coin option  switches  in  its  low-order\r
+        bits  (high true).  You must put them there.  This is not used if flag CMZP=0.\r
+       See bit definitions in DEFAULT ASSIGNMENTS, and Macro definitions GCM,GHM,GDM.\r
+       .ENDR\r
+       .ENDC                   ;NE,CMZP\r
+       .REPT 0\r
+$CNSTT:   Three base page bytes ($CNSTT, $CNSTT+OFFSET,$CNSTT+2*OFFSET) which should be\r
+       initialized to 00 (the timers for coin detection).\r
+$COINA:   Three locations containing coin switches in D7.   Left mech is  at  $COINA,  Right\r
+        mech is  at  $COINA+(2*OFFSET).   If  COIN67=1,  Switches  are  all in $COINA, D7-Right,\r
+       D1-MId, D2-Left.\r
+       D6-Mid, D5-Left. If Coin01=1, D0-Right\r
+       .ENDR\r
+       .IF NE,SEPCCT\r
+       .REPT 0\r
+$CNCT:    Three base page bytes ($CNCT, $CNCT+OFFSET, $CNCT+(2*OFFSET)) which must be zeroed\r
+        on pwron - coin counters for program (As distinct from $CCTIM,Below). Only one is used SEPCCT=0.\r
+       .ENDR\r
+       .IFF\r
+       .REPT 0\r
+$CNCT:   Base page byte which must be initialized to zero on pwron. This is used to count\r
+       coins for program (As distinct from $CCTIM, below).\r
+       .ENDR\r
+       .ENDC                   ;NE,SEPCCT\r
+       .REPT 0\r
+$PSTSL:   Three (or 2,if Mechs=2) base page bytes  ($PSTSL, $PSTSL+OFFSET,$PSTSL+(2*OFFSET)used to\r
+       time post-coin slam.\r
+$LAM:     Address of the SLAM switch.  The bit position inside $LAM is specified  by\r
+       $LMBIT (see below)\r
+$LMBIT:  Mask used to select which bit in the slam switch  byte  should  be  tested\r
+        (used as I,$LMBIT).  NOT A LOCATION, JUST A VALUE!!\r
+$LMTIM:   Base  page  byte  used  as  a  timer  for  pre-slam  protection.   May  be\r
+        initialized  to  0FF  at  pwron  to  disallow  coin input for 4 seconds.  Coins are\r
+        disallowed for two frames anyway.\r
+$INTCT:  Interrupt counter for  long  string-timer.   If  CNTINT=1,  this  will  be\r
+        incremented  (default  case).   If CNTINT=0, this should be equated to an existing\r
+        counter.\r
+$CCTIM:  Timers(s) for pulses output to electro-mechanical counters, if EMCTRS > 0.\r
+       Sign of $CCTIM(X) set if assoc. coin counter should be turned on, cleared\r
+       for off. If 3 used, they are Left @ $CCTIM, Mid @ $CCTIM+OFFSET, Right @ $CCTIM+(2*OFFSET)\r
+Space requirements:\r
+                RAM: 3+CMZP+2*MECHS+EMCTRS (13. TYPICAL)\r
+                ROM: About 200. bytes\r
+The coin routine also assumes it will be called 4 times  a  frame,  where  one  frame=1/60\r
+second.   In  most  cases  this may be accomplished by making the coin routine part of the\r
+interrupt routine.\r
+       .ENDR\r
+       .IF EQ,OFFSET-2\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION:  (WHERE OFFSET=2,MECHS=3)\r
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF 1 USED)\r
+        $$CRDT: .BLKB 1                ;CREDIT TOTAL\r
+        $CNCT:  .BLKB 6                ;COIN COUNTS\r
+       $LMTIM  =$CNCT+1        ;PRE-COIN SLAM-TIMER\r
+       $CMODE  =$CNCT+3        ;COIN MODE\r
+        $PSTSL: .BLKB 6                ;POST-COIN SLAM TIMERS (@ 1,3,5)\r
+        $CNSTT  =$CNCT+1\r
+        .ENDR\r
+       .ENDC                   ;EQ,OFFSET-2\r
+       .IF EQ,OFFSET-1\r
+       .REPT 0\r
+SAMPLE BASE PAGE ALLOCATION: (WHERE OFFSET=1,MODES=4)\r
+       $CCTIM: .BLKB EMCTRS    ;E.M. COUNTER TIMERS (-FOR ON)\r
+       $$CRDT: .BLKB 1         ;CREDIT TOTAL\r
+       $CNCT:  .BLKB 1         ;"UNIT-COIN" COUNT\r
+       $PSTSL: .BLKB MECHS     ;POST-COIN SLAM TIMERS\r
+       $CNSTT: .BLKB MECHS     ;COIN-STATUS/TIMER\r
+       $LMTIM: .BLKB 1         ;PRE-COIN SLAM TIMER\r
+       $CMODE: .BLKB 1         ;COIN MODE\r
+       .ENDR\r
+       .ENDC                   ;EQ,OFFSET-1\r
+        .IF EQ,MODES-4\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    FREE PLAY- $CNCT is zeroed, $$CRDT is not changed\r
+  1:    2 PLAYS PER COIN\r
+  2:    1 PLAY PER COIN\r
+  3:    2 COINS PER PLAY\r
+        .ENDR\r
+        .ENDC                  ;EQ,MODES-4\r
+        .REPT 0\r
+                   *** COIN DETECTION ***\r
+Coin detection, courtesy of Mike Albaugh, uses two counters in one  byte  ($CNSTT).   This\r
+byte  is  used to remember the condition of the coin switch.  The upper counter (D7,D6,D5)\r
+runs when the coin is absent and is reset when the coin is  present.   The  lower  counter\r
+(D4-D0)  runs  when  the  coin is present and is reset when the coin is absent, unless the\r
+coin was present for 5 successive samples.  This "unless"  enables  $CNSTT  to  "remember"\r
+that a coin has been VALID-HIGH while waiting for VALID-LOW.\r
+Basically, a valid coin is defined as between 16 and 800 ms of coin present, preceded  and\r
+followed  by  33 ms of coin absent.  The 33 ms lows need not immediately precede or follow\r
+the high.  The lower five bits count  down  from  31  when  the  coin  is  present.   This\r
+countdown  is  fast  (once  per  interupt)  for the first five samples (31-26, about 16-20\r
+milliseconds) then slow (once per EIGHT interrupts) for the remaining counts (26-0,  about\r
+800  ms).   The  count  then  stops  at zero.  This counter is reset if the coin goes away\r
+during the first five counts, I.E., the coin must be present for at least  16  ms.   After\r
+that  the coin must go away for eight counts to reset it.  This is because after the first\r
+five counts a coin is VALID HIGH and must not be reset until VALID LOW occurs  to  prevent\r
+mid-coin glitches from making a valid coin into 0 or 2 (or more) coins.\r
+\r
+The upper three bits count up from zero when the coin is absent.  The count  is  reset  if\r
+coin  is  ever  found  present.   When  the  count  finally wraps (8 samples, 33 ms).  The\r
+coin-present counter is checked.  A count from 27-31 (less than 16-20 ms) is too short.  A\r
+count of 0 (more than 800 ms) is too long.  Both of these cases are simply reset to 31.  A\r
+count of 1-26 is a (tentatively) valid coin.  The counter is again set to 31, but  another\r
+counter ($PSTSL) is started.\r
+\r
+$PSTSL is the POST-COIN-SLAM timer.  Initially  set  to  120,  it  counts  down  once  per\r
+interrupt  (4  times per frame) to give a nominal 1/2 second delay.  If the slam switch is\r
+seen during this time, $PSTSL is cleared, invalidating the coin.  The length of the  delay\r
+(in  frames)  is  defined by POST which defaults to 30.  It may be set as high as 63 (1.05\r
+seconds) by definition E.G.\r
+\r
+        POST=50         ;POST-SLAM=50 FRAMES\r
+\r
+SIMILARY A SLAM IS "REMEMBERED" FOR PRST frames (default=30, max=31) and no  coin  can  be\r
+"seen" during this time.\r
+\r
+Note that the proper initial  state  of  all  these  counters  etc  is  0,  therefore  the\r
+traditional power-on clear does the trick.  Since coins "transit" from $CNSTT to $PSTSL to\r
+$CNCT to $$CRDT, locations should be cleared in that order, I.E.   $$CRDT  should  be  the\r
+last location cleared. ($$CRDT, of course, exists only if MODES=4)\r
+        .ENDR\r
+\f        .SBTTL DETECT COIN\r
+;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT\r
+;ACTUALLY ASSEMBLED.\r
+MOOLAH:\r
+        LDX I,OFFSET*<MECHS-1> ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67!COIN01\r
+DETECT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+DETECT:        LDA A,$COINA            ;GET COIN SWITCHES\r
+       CPX I,OFFSET            ;WHICH MECH ARE WE DOING\r
+       BEQ 11$                 ;MIDDLE (X=OFFSET) SHIFT TWICE\r
+       BCS 12$                 ;RIGHT (X=2*OFFSET) SHIFT ONCE\r
+       .IF NE,COIN01\r
+       LSR                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   LSR\r
+12$:   LSR\r
+       .IFF\r
+       ASL                     ;ELSE LEFT, SHIFT THRICE\r
+11$:   ASL\r
+12$:   ASL\r
+        .ENDC                  ;NE,COIN01\r
+       .ENDC                   ;EQ,COIN67!COIN01\r
+        LDA ZX,$CNSTT\r
+        AND I,31.               ;SHARED INST. SEE BELOW IN BRACKETS []\r
+        .IF EQ,COIN\r
+        BCS 5$                  ;BRANCH IF INPUT HIGH (COIN ABSENT)\r
+        .IFF\r
+        BCC 5$                  ;BRANCH IF INPUT LOW (COIN ABSENT)\r
+        .ENDC                  ;EQ,COIN\r
+;       [AND I,31.]             ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR.\r
+        BEQ 1$                  ;STICK AT 0 (TERMINAL COUNT)\r
+        CMP I,27.               ;IN FIRST FIVE SAMPLES\r
+        BCS 10$                 ;YES, RUN FAST\r
+        TAY                     ;ELSE SAVE STATUS\r
+        LDA Z,$INTCT            ;CHECK INTERUPT CTR\r
+        AND I,7                 ;ARE D0-D2 ALL ONES?\r
+        CMP I,7\r
+        TYA                     ;STATUS BACK INTO ACC\r
+        BCC 1$                  ;SKIP IF NOT BOTH ONES\r
+10$:    SBC I,1                 ;CARRY SET\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, PROCEED\r
+        DEC ZX,$PSTSL           ;RUN TIMER\r
+        BNE 8$                  ;NOT DONE, PROCEED\r
+        SEC                     ;WHEN IT BECOMES ZERO, INDICATE A COIN\r
+        BCS 8$                  ;(ALWAYS)\r
+       \r
+5$:;    [AND I,31.]             GET COIN-ON DOWN-CTR (ACTUALLY DONE BEFORE)\r
+        CMP I,27.               ;IS COIN VALID YET (ON FOR >4 SAMPLES)\r
+        BCS 6$                  ;NO, RESET IT\r
+        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
+        BCC 9$\r
+       .IF NE,MULTS\r
+;FALL THROUGH TO "MECH-MULTIPLIERS"\r
+       .PAGE\r
+       .SBTTL MECH-MULTIPLIERS\r
+       .IF EQ,MECHS-2  \r
+       TXA                     ;WHICH MECH\r
+       BEQ 85$                 ;LEFT,ADD1\r
+       .IFF                    ;I.E., MECHS=3\r
+       LDA I,0                 ;START WITH 0 (TO ADD 1)\r
+       CPX I,OFFSET            ;CHECK WHICH MECH\r
+       BCC 85$                 ;IF LEFT, ALWAYS ADD 1\r
+       BEQ 83$                 ;IF CENTER, CHECK HALF-MUL\r
+       .IFTF                   ;MECHS=2 OR 3\r
+       GDM                     ;ELSE GET DOLLAR MUL\r
+       BEQ 85$                 ;00-ADD 1\r
+       ADC I,2                 ;ELSE MAP 1,2,3 TO 3,4,5\r
+       .IFF                    ;EQ,MECHS-2\r
+       BNE 85$                 ;(ALWAYS)\r
+       \r
+83$:   GHM\r
+       BEQ 85$\r
+       LDA I,1\r
+       .ENDC                   ;EQ,MECHS-2\r
+85$:   SEC\r
+       .IF NE,SEPCCT\r
+       .PRINT                  ;I'M NOT SURE YOU WANT TO DO THIS, ARE YOU?\r
+       ADC X,$CNCT\r
+       STA X,$CNCT             ;UPDATE COIN COUNT FOR PROGRAM\r
+       .IFF                    ;NE,SEPCCT\r
+       .IF EQ,<MULTS-1>!<EMCTRS-1>\r
+\r
+;THE NORMAN AVELLAR MEMORIAL KLUGE\r
+\r
+       TAY                     ;SAVE INCREMENT\r
+       .IFTF                   ;EQ,<MULTS-1>!<EMCTRS-1>\r
+       ADC $CNCT\r
+       STA $CNCT\r
+       .IFT                    ;EQ,<MULTS-1>!<EMCTRS-1>\r
+       INY\r
+       TYA\r
+       .IF EQ,MECHS-3\r
+       CMP I,3                 ;IS IT DOLLAR MULT\r
+       BCC 87$                 ;NO, SKIP       \r
+       LDA I,3                 ;ELSE FORCE 4 (3+CARRY)\r
+;\r
+;###NOTE:  THIS CODE PROVIDED ONLY FOR OLD AMERICAN GAMES. USE WITH 5 DM\r
+;MECHS IS STRONGLY DISCOURAGED\r
+       .IFF                    ;EQ,MECHS-3\r
+       AND I,4\r
+       BNE 87$\r
+       SEC\r
+       .ENDC                   ;EQ,MECHS-3\r
+87$:   ADC $CCTIM\r
+       STA $CCTIM\r
+       .ENDC                   ;EQ,<MULTS-1>!<EMCTRS-1>\r
+       .ENDC                   ;SEPCCT\r
+       .IFF                    ;NE, MULTS\r
+;FALL THROUGH TO BUMP $CNCT\r
+       .IF NE,SEPCCT           ;IF ASKED FOR SEPARATE COUNT,\r
+       INC X,$CNCT             ;USE INDEXED INC\r
+       .IFF                    ;ELSE USE COMMON COUNTER\r
+        INC $CNCT\r
+       .ENDC                   ;NE,SEPCCT\r
+       .ENDC                   ;NE,MULTS\r
+       .IF EQ,EMCTRS-1         ;IF 1 COIN COUNTER USED\r
+       .IF NE,MECHS-2!<MULTS-1>\r
+       INC $CCTIM              ;INIT COIN PULSE TO E.M. COUNTER\r
+       .ENDC                   ;NE,MECHS-2!<MULTS-1>\r
+       .ENDC                   ;EQ,EMCTRS-1\r
+       .IF EQ,EMCTRS-3         ;IF 3 COUNTERS USED\r
+       INC X,$CCTIM            ;"QUEUE" PULSE FOR E.M. COUNTER\r
+       .ENDC                   ;EQ,EMCTRS-3\r
+9$:\r
+100$:\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+       .IF GT,.-DETECT-126.\r
+       BMI 120$\r
+       JMP DETECT\r
+120$:\r
+       .IFF\r
+        BPL DETECT\r
+       .ENDC                   ;GT,.-DETECT-126.\r
+        .IF EQ,MODES-4          ;ONLY IF MODES=4\r
+;FALL THROUGH TO CONVERT COINS TO CREDITS\r
+       .PAGE\r
+       .SBTTL COINS TO CREDITS\r
+CONVRT: GCM                     ;GET COIN MODE IN ACC 0,1\r
+        TAY                     ;SAVE IT & TEST IT\r
+        BEQ 2$                  ;IF FREE PLAY, KEEP COIN COUNT CLEAR, LEAVE CREDIT\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$:    INC $$CRDT\r
+2$:     STA $CNCT               ;STORE REDUCED (OR CLEARED) COINCT\r
+        .ENDC\r
+EXIT:\r
+       .IIF NE,CNTINT, INC Z,$INTCT    ;COUNT INTERUPTS WHEN REQUESTED\r
+       .IF EQ,EMCTRS-1*<EMCTRS-3>      ;INCLUDE PULSER FOR E.M. CTRS\r
+;FALL THROUGH TO HANDLE E.M. COUNTERS\r
+       .SBTTL ELECTRO-MECH. CTRS\r
+       LDA Z,$INTCT            ;GET $INTCT \r
+       LSR                     ;USE LSB FOR PULSE=4 FRAMES\r
+       BCS 99$\r
+       .ENDC                   ;EQ,EMCTRS-1*<EMCTRS-3>\r
+       .IF EQ,EMCTRS-1\r
+       LDA Z,$CCTIM            ;GET COIN-COUNTER TIMER\r
+       BEQ 99$                 ;BRANCH IF IDLE\r
+       CMP I,10                ;MSB'S CLEAR?\r
+       BCS 1$                  ;NO,SKIP\r
+       ADC I,-1                ;ELSE INIT PULSE, SET CARRY\r
+1$:    ADC I,0EF               ;(ONE LESS CUZ CARRY SET) DEC MSB'S OF TIMER\r
+       STA Z,$CCTIM            ;STORE UPDATED TIMER\r
+       .ENDC                   ;EQ,EMCTRS-1\r
+       .IF EQ,EMCTRS-3         ;IF 3 CTRS\r
+       LDY I,0                 ;START WITH FLAG OF 0\r
+       LDX I,OFFSET*<EMCTRS-1>\r
+1$:    LDA X,$CCTIM            ;CHECK TIMER(X)\r
+       BEQ 3$                  ;NEITHER RUNNING NOR PENDING\r
+       CMP I,10                ;IS IT RUNNING\r
+       BCC 3$                  ;NO, SKIP\r
+       ADC I,0EF               ;ELSE DEC 4 MSB\r
+       INY                     ;SET ON FLAG\r
+2$:    STA X,$CCTIM\r
+3$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 1$\r
+       TYA                     ;CHECK "ON" FLAG\r
+       BNE 99$                 ;SKIP IF ANY ON\r
+;IF NONE OF THE COUNTERS ARE CURRENTLY ON, WE CHECK TO SEE IF ANY CAN BE\r
+;STARTED.\r
+       LDX I,OFFSET*<EMCTRS-1> \r
+4$:    LDA X,$CCTIM            ;NEED WE START THIS ONE\r
+       BEQ 5$                  ;NO, NO COUNTS PENDING\r
+       CLC\r
+       ADC I,0EF               ;SET 4 MSB, DEC 4 LSB\r
+       STA X,$CCTIM            ;START TIMER\r
+       BMI 99$                 ;EXIT, SO WE DON'T START MORE\r
+5$:\r
+       .REPT OFFSET\r
+       DEX\r
+       .ENDR\r
+       BPL 4$\r
+       .ENDC                   ;EQ, EMCTRS-3\r
+99$:\r
+       .IF NE,RTS              ;IF THIS IS A SUBROUTINE\r
+       RTS\r
+       .ENDC                   ;NE,RTS\r
+       .RADIX .RAD             ;RESTORE RADIX\r
+\r
+       .IIF EQ,INCLUDE,        .END    ;NO .END TO ".INCLUDE"'D FILES\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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/FOOTII.DOC b/FOOTII.DOC
new file mode 100644 (file)
index 0000000..4fba59c
Binary files /dev/null and b/FOOTII.DOC differ
diff --git a/FOOTII.MAP b/FOOTII.MAP
new file mode 100644 (file)
index 0000000..fa458bd
Binary files /dev/null and b/FOOTII.MAP differ
diff --git a/NFCOMN.XX b/NFCOMN.XX
new file mode 100644 (file)
index 0000000..0a24f67
--- /dev/null
+++ b/NFCOMN.XX
@@ -0,0 +1,262 @@
+       .SBTTL EQUATES\r
+       .GLOBL  PTBL,PLTAB,FTAB,HTAB\r
+       .GLOBL  MOOLAH,IRQ,RESET,START\r
+RAM    =0              ;0-FFF, 1K QUAD MAPPED\r
+ALPHR  =200            ;30 CHARS/ROW 200-27D\r
+ALPHL  =380            ;4 ROWS, 3 USEABLE\r
+SCRFLD =1000           ;30 "COLUMNS" X 30 CHARS\r
+MOBJ   =13C0           ;DMA LOC FOR MOTION OBJ\r
+HPICT  =MOBJ\r
+HVPOS  =MOBJ+1\r
+HHPOS  =MOBJ+32.\r
+BHPICT =HPICT+28.      ;BALL\r
+SFHPOS =2000           ;SCROLL FIELD H-OFFSET\r
+OUT1   =2001           ;D7-D3 SPARE, D2-KICKER,D1-HIT,D0-WHISTLE\r
+OUT2   =2002           ;D7,D6-UNUSED,D5-ATTRACT (BAR),D4-COIN CTR,D3-0-CROWD\r
+OUT3   =2003           ;D7,D6-UNUSED,D5,D4-SPARE,D3-0 LED CATHODES\r
+INTACK =3000           ;INTERUPT ACKNOWLEDGE\r
+INPORT =4000           ;INPUT PORT FOR SWITCHES & COUNTERS\r
+WTCHDG =5000           ;WATCHDOG TIMER RESET\r
+PROG   =6800           ;6K OF PROGRAM, ENDING AT 7FFF\r
+SIDELN =3              ;SIDELINE AT BOTTOM\r
+YARDNO =4              ;YARDLINE WITH "0" ON LEFT, NO ARROW\r
+YARDAR =5              ;YARDLINE WITH "0" ON LEFT, ARROW TO LEFT\r
+;6,7 ARE "1", 8,9 ARE "2", ETC. DOWN TO E,F ARE "5"\r
+YARDSD =2              ;YARDLINE WITH SIDELINE\r
+PTRT   =40             ;"OR" IN 40 TO POINT RIGHT\r
+ONTOP  =80             ;"OR" IN 80 FOR TOP OF SCREEN\r
+BLANK  =0\r
+YARDLN =10             ;YARDLINE, NO SIDELINE, IN RIGHT OF STAMP\r
+FL     =120.           ;FIELD LENGTH IN YARDS, INCLUDING ENDZONES\r
+BALLNO =14.            ;BALL IS OBJECT #14.\r
+PSPAUS =10.            ;PAUSE BETWEEN BUTTON PUSHES (SECONDS)\r
+S.SEL  =0              ;STATE OF ZERO IS "SELECT"\r
+S.PLAY =40             ;STATE OF 40 IS "PLAY"\r
+S.PAUS =80             ;STATE OF 80 IS "PAUSE" BETWEEN PLAYS\r
+M.BAN1 =0              ;FIRST BANNER\r
+M.BAN2 =M.BAN1+1       ;SECOND BANNER\r
+M.GO   =M.BAN2+1       ;MESSAGE "GAME OVER"\r
+M.OFF  =M.GO+1         ;  "    "YOU ARE OFFENSE"\r
+M.DEF  =M.OFF+1        ;  "    "YOU ARE DEFENSE"\r
+M.TKL  =M.DEF+1        ;  "     "TACKLED"\r
+M.TD   =M.TKL+1        ;  "     "TOUCHDOWN"\r
+M.INC  =M.TD+1         ;  "     "INCOMPLETE"\r
+M.INT  =M.INC+1        ;  "     "INTERCEPTED"\r
+M.TB   =M.INT+1        ;  "     "TOUCHBACK"\r
+M.SAF  =M.TB+1         ;  "     "SAFETY"\r
+M.OOB  =M.SAF+1        ;  "    "OUT OF BOUNDS"\r
+M.OS   =M.OOB+1        ;  "    "OFF SIDES"\r
+M.DOG  =M.OS+1         ;  "    "DELAY OF GAME"\r
+M.RDY  =M.DOG+1        ;  "    "READY"\r
+M.IC   =M.RDY+1        ;  "    "INSERT COINS"\r
+M.ECAT =M.IC+1         ;  "    "EACH COIN ADDS TIME"\r
+M.SP   =M.ECAT+1       ;  "    "SELECT PLAY"\r
+M.GAO  =M.SP+1         ;  "    "GAME ALMOST OVER"\r
+M.ICTP =M.GAO+1        ;  "    "INSERT COINS"\r
+M.BLK  =M.ICTP+1       ;  "    "BLOCKED"\r
+\f      .SBTTL ZERO PAGE\r
+;************************************************\r
+;OFFENS AND PLAYER MUST\r
+;REMAIN AT LOCATIONS 3E,3F\r
+;FOR M3E AND M3F\r
+;************************************************\r
+INTCNT:        .BLKB 1         ;COUNT OF INTERRUPTS\r
+SYNC:  .BLKB 1         ;SET TO 1 ONCE PER FRAME (3 FIELDS)\r
+MOTDON:        .BLKB 1         ;FLAG FOR IRQ 0=MOTUP SKIPPED, 1=MOTUP DONE\r
+TOUT1:  .BLKB 1                ;HOLDING CELL FOR OUT1 (SEE SOUND,TBALL)\r
+INPUT: .BLKB 4         ;SWITCHES 0, COUNTERS 0, SWITCHES 2, COUNTERS 2\r
+OTB:   .BLKB 1         ;OLD VALUE OF TRACK-BALL COUNTERS\r
+NEWTB: .BLKB 1         ;NEW VALUE OF TRACK-BALL CTR\r
+       .BLKB 2         ;OTB, NEWTB FOR #2\r
+TBDIR: .BLKB 1         ;DIRECTION H0,V0,H2,V2 (D3-D0)\r
+TBCTR  =INPUT+1        ;TRACK BALL COUNTERS @ 1,3\r
+;D7-D4 = VERTICAL COUNTER, D3-D0 = HORIZ COUNTER\r
+;$COINA AT END OF ZERO PAGE\r
+$LAM   =INPUT          ;SLAM @ SAME WORD\r
+$LMBIT =20             ;IN BIT D5\r
+OPTION =INPUT+2        ;OPTIONS IN 4 LSB\r
+;FOR DEBUG:  SW.   BIT  MEANING\r
+;@OPTION      4    D3  COIN MECH MULTIPLY\r
+;            3    D2   COIN MECH MULTIPLY\r
+;            2    D1   COINS:  ON - 1 MINUTE, 2 MINUTES\r
+;            1    D0   COINS:  ON - NO SECONDS, OFF - 30 SECONDS\r
+;ALL SWITCHES ASSERTED LOW\r
+TEST   =INPUT+2        ;ON D6\r
+VBLANK =INPUT          ;ON D6\r
+SFDL:  .BLKB 1         ;LOW BYTE OF SCROLL FIELD DISPLACEMENT (YARDS/8)\r
+SFDH:  .BLKB 1         ;HIGH BYTE OF SCROLL FIELD DISPLACEMENT (YARDS)\r
+ADL:   .BLKB 1         ;ADDRESS PTR (TO SCROLL FIELD)\r
+ADH:   .BLKB 1\r
+WHISTL:        .BLKB 1         ;WHISTLE SOUND TIMER (WARBLED BEEP)\r
+THUD:  .BLKB 1         ;HIT SOUND TIMER\r
+CROWD: .BLKB 1         ;CROWD   "   VOLUME\r
+BEEP:  .BLKB 1         ;STEADY BEEP FOR 30-SEC WARNING\r
+CHEER: .BLKB 2         ;USED IN CROWD-SOUND GENERATION\r
+\r
+;FOLLOWING LOCATIONS USED BY COIN ROUTINE\r
+$CMODE =OPTION\r
+$CCTIM:        .BLKB 1         ;COIN CTR PULSE TIMER\r
+                       ;LEFT MECH\r
+$CNCT: .BLKB 1         ;COIN COUNT\r
+$PSTSL:        .BLKB 1         ;POST-COIN SLAM TIMER\r
+$CNSTT:        .BLKB 1         ;COIN SW STATUS\r
+       .BLKB 2         ;$PSTSL,$CNSTT FOR RIGHT MECH.\r
+$LMTIM:        .BLKB 1         ;PRE-COIN SLAM TIMER\r
+$INTCT =INTCNT         ;USE EXISTING INTERRUPT COUNTER\r
+SLOCK: .BLKB 1         ;SET TO LOCK OUT MOTION UPDATE IN VBLANK\r
+FIELD:  .BLKB 1                ;COUNTS FIELD IN A FRAME\r
+DBSW:  .BLKB 1         ;DE-BOUNCE SAVE WORD\r
+SWSTAT:        .BLKB 1         ;SWITCH STATUS PLAYER1\r
+       .BLKB 2         ;DBSW,SWSTAT FOR PLAYER2\r
+;THE NEXT 5 LABELS MUST STAY TOGETHER\r
+CTLPTR:        .BLKB 1         ;POINT TO CONTROLLED MAN (- IF NONE)\r
+PSTIM: .BLKB 1         ;PLAY-SELECT TIMER\r
+       .BLKB 2         ;CTLPTR, PSTIM FOR #2\r
+       \r
+HASBAL:        .BLKB 1         ;POINTS TO PLAYER WHO HAS BALL (- IF NONE)\r
+REC1:  .BLKB 1         ;ELIGIBLE RECEIVER (-=NONE)\r
+PSFLAG:        .BLKB 1         ;0=QB PAST SCRIMMAGE\r
+;<<<<<<<<<<<<<<<<<<<<<<...\r
+TBHD:  .BLKB 1         ;TRACK-BALL H. DISPLACEMENT (1)\r
+TBVD:  .BLKB 1         ;TRACK-BALL V. DISPLACEMENT (1)\r
+       .BLKB 2         ;TBHP, TBVP FOR 2\r
+IJ:    .BLKB 1         ;BUCKET FOR INT.\r
+J:     .BLKB 1         ;BUCKET FOR MAINLINE\r
+K:     .BLKB 1         ;  "\r
+STPCLK:        .BLKB 1         ;IF NON-ZERO, KEEP CLOCK STOPPED IN HUDDLE\r
+ANMSK: .BLKB 1         ;3F OR 0, USED IN MESSAGE ROUTINE\r
+ARDIR: .BLKB 1         ;ARROW DIRECTION BITS\r
+Y10:   .BLKB 1         ;YARDS/10\r
+EZFLG: .BLKB 1         ;FLAG FOR ENDZONE\r
+SCRSPD:        .BLKB 1         ;SCROLL SPEED\r
+SCRDIR:        .BLKB 1         ;SCROLL DIRECTION\r
+SCRYDS:        .BLKB 1         ;YD LINE BEING DRAWN, USED BY REWRT\r
+ATRACT:        .BLKB 1         ;+=ATTRACT, -= PLAY\r
+STATE: .BLKB 1         ;STATE OF GAME; SELECT, PLAY, OR PAUSE\r
+PAUST: .BLKB 1         ;PAUSE TIMER, 1 OR 6.4 SECONDS\r
+INPLCE:        .BLKB 1         ;# OF PLAYERS IN PLACE\r
+;OFFENS AND PLAYER MUST\r
+;REMAIN AT LOCATIONS 3E,3F\r
+;FOR M3E AND M3F\r
+OFFENS:        .BLKB 1         ;POINTS TO BASE OF OFFENSE PLAYER\r
+PLAYER:        .BLKB 1         ;SAVE X -> PLAYER\r
+OBJECT:        .BLKB 1         ;SAVE X -> OBJECT\r
+WPLAYR:        .BLKB 1         ;"PLAYER" FOR WRTMES\r
+SCRIMH:        .BLKB 2         ;SCRIMMAGE LINE HORIZ POSN\r
+SCRIMV:        .BLKB 1         ;"VERT" POSN\r
+DOWN:  .BLKB 1         ;DOWN #\r
+DTG:   .BLKB 2         ;DECIMAL # OF YARDS "TO GO"\r
+;THE 6 BYTES BELOW MUST STAY TOGETHER\r
+WHYEND:        .BLKB 1         ;CODE FOR END OF PLAY\r
+;CODE                  SET BY          MEANING\r
+EC.NUL  =0             ;EP.COM         REST STATE, NOT ENDED\r
+EC.SG  =EC.NUL+1       ;GAME           END ATT RACT, START GAME\r
+EC.TKL =EC.SG+1        ;COLCHK         BALL CARRIER TACKLED\r
+EC.INC =EC.TKL+1       ;EXEC (BALL)    PASS INCOMPLETE\r
+EC.INT =EC.INC+1       ;COLCHK         PASS INTERCEPTED\r
+EC.OOB =EC.INT+1       ;EXEC           BALL CARRIER OUT OF BOUNDS\r
+EC.TDD =EC.OOB+1       ;CKGOAL         TOUCH DOWN BY DEFENSE\r
+EC.TDO =EC.TDD+1       ;  "            TOUCHDOWN BY OFFENSE\r
+EC.SAF =EC.TDO+1       ;  "            SAFETY\r
+EC.TB  =EC.SAF+1       ;  "            TOUCHBACK\r
+EC.OS  =EC.TB+1        ;GAME           OFF SIDES\r
+EC.DOG =EC.OS+1        ;SELECT         DELAY OF GAME\r
+EC.BLK =EC.DOG+1       ;BALCOC         BLOCKED KICK\r
+EC.KIC =EC.BLK+1       ;X.KICK         KICKED OUT OF BOUNDS\r
+LEDWD: .BLKB 3         ;LED'S FOR PLAYER1,BUTTONS,PLAYER2\r
+MPSTIM:        .BLKB 1         ;MASTER PLAY-SELECT TIMER, 10 SECONDS\r
+WFLAG: .BLKB 1         ;GLOBAL FLAGS FOR "WAIT"\r
+       .REPT 0\r
+BIT    SET BY          MEANING\r
+---    ------          -------\r
+\r
+D5     SELECT          PLAYS SELECTED, START PREHIKE MOVES\r
+D4     PASSQ*          START PASS (*ALSO EXEC, IN ATTRACT)\r
+D3     BALCOL          PASS COMPLETE\r
+D2\r
+D1     EXEC(BALL)      BALL SNAPPED,ENABLE DEFENSE,ALSO OFFENSE QB\r
+D0     GAME            SNAP BALL,ENABLE OFFENSE (EXCEPT QB)\r
+       .ENDR\r
+;<<<<<<<<<<<<<<<<<<<<<...\r
+TARDY: .BLKB 1         ;PLAYER WHO LAST CAUSED "DELAY OF GAME"\r
+POINTS: .BLKB 1                ;POINTS FOR THIS RESULTS, SET BY CKGOAL\r
+\r
+FRAME: .BLKB 1         ;COUNT FRAMES (20 HZ)\r
+SECOND:        .BLKB 1\r
+MINUTE:        .BLKB 1\r
+SFTIM: .BLKB 1         ;SKIP-FRAME TIME, FOR DEBUG\r
+AVVD:  .BLKB 1         ;!VERT. DIFF!\r
+AVHDL: .BLKB 1         ;!HORIZ. DIFF! LOW\r
+AVHDH: .BLKB 1         ;!  "      " ! HI\r
+       \r
+;PLAYER CONTROL BLOCKS\r
+       \r
+       \r
+PLAYNO:        .BLKB 1         ;PLAY # FOR PLAYER1\r
+L:     .BLKB 1         ;BUCKET FOR MAINLINE\r
+       .BLKB 1         ;PLAYNO FOR 2\r
+\r
+OMESL:  .BLKB 1                ;OLD MESSAGE, LEFT\r
+OSSTAT:        .BLKB 1         ;OLD SWITCH STATUS, FOR PLAY-SELECT\r
+OMESR:  .BLKB 1                ;OLD MESSAGE, RIGHT\r
+       .BLKB 1         ;OSSTAT FOR #2\r
+       \r
+\r
+SCORE: .BLKB 4         ;2 BYTES EACH\r
+\r
+;BELOW ARE OBJECT CONTROL BLOCKS\r
+MCC:   .BLKB 2         ;MAN-CONTROL-COUNTER (PSUEDO-PC)\r
+       .BLKB 28.       ;OTHER 13 MEN, + BALL\r
+OP:    .BLKB 1         ;PRESENT OP-CODE IF < 16.\r
+PARAM: .BLKB 1         ;PRESENT PARAMETER\r
+       .BLKB 28.       ;OBJECT CONTROLS FOR OTHERS\r
+THPOS: .BLKB 2         ;TEMP HPOS\r
+TVPOS: .BLKB 1\r
+THGOAL:        .BLKB 1\r
+TVGOAL:        .BLKB 2\r
+THINC: .BLKB 2\r
+TVINC: .BLKB 2\r
+VDISP: .BLKB 1\r
+HDISP: .BLKB 2\r
+W30TIM:        .BLKB 1         ;0=NO WARNING,1=WARNING GIVEN,OTHERWISE IS TIMER\r
+OLDOFF:        .BLKB 1         ;OLD OFFENSE, USED BY PAUSE,CHANGE\r
+LEDTMP:        .BLKB 1         ;USED BY PSEL\r
+QUOT:  .BLKB 3         ;"M.Q." REGISTER\r
+DIVSOR:        .BLKB 2         ;"L" REGISTER\r
+HPOSL: .BLKB 1         ;FRACTIONAL YDS OF H-POSN\r
+HPOSH: .BLKB 1         ;INTEGRAL YDS OF H-POSN\r
+       .BLKB 28.\r
+BHPOSL =HPOSL+<BALLNO*2>\r
+BHPOSH =HPOSH+<BALLNO*2>\r
+FDHPOS: .BLKB 2                ;FIRST-DOWN MARKER H-POS\r
+\r
+VPOSL: .BLKB 1         ;VPOS LOW BITS (< 1/8 YD)\r
+VPOS:  .BLKB 1         ;VPOS IN YDS/8\r
+       .BLKB 28.       ;OTHER MEN\r
+BVPOSL =VPOSL+<BALLNO*2>\r
+BVPOS  =VPOS+<BALLNO*2>\r
+FDVPOS: .BLKB 2                ;FIRST-DOWN MARKER V-POS\r
+TBDIRN:        .BLKB 1         ;TRACKBALL DIRECTION NEW\r
+TSCRIM:        .BLKB 2         ;TEMP CELLS FOR PSCRIM\r
+;DUE TO HARNESS DIFFERENCES\r
+$COINA:        .BLKB 3\r
+EOZP:                  ;END-OF-ZERO-PAGE\r
+       .SBTTL TRACE POINTERS\r
+;BELOW ARE INPUT TO TRACE ROUTINE\r
+       .=100\r
+TSRC:  .BLKB 2         ;POINTS TO WORD TO BE TRACED\r
+TDST:  .BLKB 1         ;POINT TO SCREEN LOCATION\r
+       .PAGE\r
+       .SBTTL MISC.(NON-ZERO-PAGE) RAM\r
+       .=280\r
+\r
+HGOAL: .BLKB 2         ;HORIZONTAL GOAL POSN\r
+       .BLKB 28.\r
+VGOAL: .BLKB 1         ;VERTICAL GOAL POSITION\r
+FLAGS: .BLKB 1         ;D7=HAS BEEN AT HGOAL, VGOAL, D1 (ON BALL) IN PASS\r
+;D0=IN COLLISION, D2=IN COLLISION WITH OPPONENT\r
+       .BLKB 28.\r
+\r
+\r
+EFLAG: .BLKB 15.       ;ENABLE FLAGS FOR MOTION DEBUG\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
\ No newline at end of file