]> github.com/historicalsource and other repositories - football.git/commitdiff
First commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 21:53:16 +0000 (17:53 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Thu, 14 Oct 2021 21:53:16 +0000 (17:53 -0400)
13 files changed:
A33029.XX [new file with mode: 0644]
A33030.ROM [new file with mode: 0644]
A33721.1A [new file with mode: 0644]
A33721.1B [new file with mode: 0644]
A33721.1C [new file with mode: 0644]
A33721.1D [new file with mode: 0644]
A33721.2A [new file with mode: 0644]
A34006.ROM [new file with mode: 0644]
FBCOMN.XX [new file with mode: 0644]
FBCONF.2C [new file with mode: 0644]
FOOTBA.DOC [new file with mode: 0644]
FOOTBA.MAP [new file with mode: 0644]
PENNY.2C [new file with mode: 0644]

diff --git a/A33029.XX b/A33029.XX
new file mode 100644 (file)
index 0000000..4f6e8c1
Binary files /dev/null and b/A33029.XX differ
diff --git a/A33030.ROM b/A33030.ROM
new file mode 100644 (file)
index 0000000..91a8ab8
Binary files /dev/null and b/A33030.ROM differ
diff --git a/A33721.1A b/A33721.1A
new file mode 100644 (file)
index 0000000..27633a5
--- /dev/null
+++ b/A33721.1A
@@ -0,0 +1,2695 @@
+       .TITLE FUTBAL\r
+       .RADIX 16\r
+       .IIF NDF,NTB,NTB=1\r
+       .ASECT\r
+       .SBTTL ******************************\r
+       .SBTTL * PROGRAMER: MIKE ALBAUGH    *\r
+       .SBTTL *                            *\r
+       .SBTTL * CHECKER:                   *\r
+       .SBTTL *                            *\r
+       .SBTTL ******************************\r
+       .REPT 0\r
+\r
+DATE INITIATED: 22-MAR-78\r
+PROJECT CHARGE #: 5P221\r
+DISK #:        73\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
+                        8K 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:*FUTBAL,FUTBAL=FUTBAL/C\r
+\r
+LINK COMMAND STRING:*PP:/L,RK1:FBMAP.LST=FUTBAL,FBCHOR,FBCOIN,FBINT\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\r
+       .INCLUDE FBCOMN\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
+       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 A,TEST\r
+       BVS WAIT                ;BRANCH IF TEST OFF\r
+APAT1: JMP RESET               ;FAKE RESET\r
+CKS0:  .BYTE 0B9\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
+       JSR SETPOS\r
+       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
+\r
+15$:   LDA I,S.PLAY            ;ELSE ENTER PLAY\r
+       STA STATE\r
+       LDX OFFENS              ;POINT TO OFFENSE\r
+       LDA ZX,PLAYNO           ;GET PLAY #\r
+       CMP I,2                 ;RUNNING?\r
+       LDA I,6\r
+       BCS 17$                 ;NO\r
+       LDA I,15.               ;3/4 SECOND\r
+17$:   STA OFSPDT              ;OF FAST OFFENSE\r
+       LDA I,1                 ;SET GLOBAL FLAGS\r
+       STA WFLAG               ;TO "ONE" TO SNAP\r
+       LSR                     ;MAKE A ZERO\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$:   LDA OFSPDT\r
+       BEQ 35$\r
+       DEC OFSPDT\r
+35$:   LDA OFFENS\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 WFLAG\r
+       AND I,2\r
+       BNE 39$\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 AY,HPOSL\r
+       STA A,HPOSL+28.         ;BALL IS OBJECT 14. (PLAYERS ARE 0-13)\r
+       LDA AY,HPOSH\r
+       STA A,HPOSH+28.\r
+       LDA AY,VPOS\r
+       STA A,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
+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
+       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.INT:        JSR SETBAL              ;INTERCEPTION, SET SCRIMMAGE LINE\r
+       JSR FLIP                ;FLIP OFFENSE/DEFENSE\r
+       JMP EP.COM              ;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 A,FDHPOS            ;FIRST DOWN LINE\r
+       LDA SCRIMH+1            ;GET WHOLE YDS OF SCRIMMAGE LINE\r
+       SBC A,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
+       JSR FLIP                ;ELSE FLIP SIDES\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
+       STA PSTIM               ;RESET PLAY-SELECT TIMERS\r
+       STA PSTIM+2\r
+       STA HASBAL              ;RESET BALL POSSESSION\r
+       STA REC1                ;RESET\r
+       STA CTLPTR              ;RESET CONTROLLED MEN\r
+       STA CTLPTR+2\r
+       STA PSFLAG\r
+       LDA I,0\r
+       STA WFLAG               ;RESET GLOBAL FLAGS\r
+       STA WHYEND\r
+       STA MPSTIM              ;RESET MASTER P.S. TIMER\r
+       STA LEDWD               ;DOUSE LEDS\r
+       STA LEDWD+2\r
+       LDX I,28.\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\r
+       AND I,3\r
+       STA ZX,PLAYNO\r
+       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\r
+CHTAB: .BYTE 0,20,20,40,10,240.,240.,120.,40,0,0\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 A,FDHPOS\r
+       LDA SCRIMH+1\r
+       CLC\r
+       ADC AX,FDINC            ;OFFSET TOWARDS CORRECT GOAL\r
+       STA A,FDHPOS+1\r
+       LDA A,FDHPOS            ;CHECK FOR\r
+       CMP AX,GOALIN           ;PAST GOAL\r
+       LDA A,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 A,FDHPOS\r
+       LDA AX,GOALIN+1\r
+       STA A,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
+       AND I,2                 ;IS BALL CARRIER ON TEAM(X)\r
+       BEQ 11$                 ;IF SO SAY TOUCHDOWN\r
+       LSR K                   ;C SET IF OFFENSE\r
+       BCS 5$\r
+       LDA WHYEND\r
+       CMP I,EC.INT            ;INTERCEPTION?\r
+       BNE 20$                 ;NO, SKIP\r
+       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
+;Y=PLAYER TO CHECK, RETURNS Z=1 IF PAST SCRIMMAGE LINE\r
+PSCRIM: TYA\r
+       AND I,2\r
+       TAX\r
+       LDA AY,HPOSL\r
+       CMP SCRIMH\r
+       LDA AY,HPOSH\r
+       SBC SCRIMH+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 AX,HGOAL            ;SET POSITION=GOAL\r
+       STA AX,HPOSL\r
+       LDA AX,HGOAL+1\r
+       STA AX,HPOSH\r
+       LDA AX,VGOAL\r
+       STA AX,VPOS\r
+       LDA I,0\r
+       STA AX,VPOSL\r
+20$:   DEX\r
+       DEX\r
+       BPL 10$\r
+30$:   PLA\r
+       TAX\r
+       RTS\r
+STATS:  LDA SCRIMH\r
+       CMP A,FDHPOS\r
+       LDA SCRIMH+1\r
+       SEC\r
+       SBC A,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
+\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\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,45$-1$,14,46$-1$\r
+       .BYTE 4B,6$-1$,48,7$-1$,48,8$-1$\r
+       .BYTE 4C,9$-1$,4B,10$-1$,4A,11$-1$,4A,12$-1$\r
+       .BYTE 4A,13$-1$,4C,14$-1$,4A,15$-1$,4A,16$-1$\r
+       .BYTE 49,5$-1$,4D,17$-1$,49,0,45,2$-1$,49,3$-1$\r
+       .BYTE 47,18$-1$,41,19$-1$\r
+MESLST =.\r
+1$:    .ASCIN /INSERT COINS/\r
+2$:    .ASCIN /EACH COIN ADDS TIME/\r
+3$:    .ASCIN /SELECT PLAY/\r
+45$:   .ASCIN /DOWN TO GO/\r
+46$:   .ASCIN /TIME SCORE/\r
+5$:    .ASCIN /DELAY OF GAME/\r
+6$:    .ASCIN /GAME OVER/\r
+\r
+7$:    .ASCIN /YOU ARE OFFENSE/\r
+8$:    .ASCIN /YOU ARE DEFENSE/\r
+9$:    .ASCIN  /TACKLED/\r
+10$:   .ASCIN  /TOUCHDOWN/\r
+11$:   .ASCIN  /INCOMPLETE/\r
+12$:   .ASCIN  /INTERCEPTED/\r
+13$:   .ASCIN  /TOUCHBACK/\r
+14$:   .ASCIN  /SAFETY/\r
+15$:   .ASCIN  /OUT OF BOUNDS/\r
+16$:   .ASCIN /OFF SIDES/\r
+17$:   .ASCIN  /READY/\r
+18$:   .ASCIN /GAME ALMOST OVER/\r
+19$:   .ASCIN /INSERT COINS TO KEEP PLAYING/\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:30, 2:00, 2:30, OR 3: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 31,02,32,03       ;REVERSED MIDDLE DIGITS\r
+\f      .SBTTL SETUP STUFF\r
+SETBAL:        LDA A,BHPOSH\r
+15$:   LDY A,BHPOSL\r
+       STY A,SCRIMH            ;SET SCRIMMAGE LINE\r
+       STA SCRIMH+1\r
+       LDA A,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 0B4\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 A,FDVPOS+1          ;FIRST-DOWN MARKER\r
+       STX PLAYER              ;SAVE PLAYER #\r
+       TXA\r
+       ORA I,18\r
+       TAX\r
+3$:    TXA\r
+       EOR OFFENS\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
+       CMP I,NPLAYS            ;VALID?\r
+       BCC 2$                  ;YES\r
+       SBC I,NPLAYS            ;ELSE TAKE IT MODULO NPLAYS\r
+       STA ZX,PLAYNO\r
+       BCS 1$                  ;ALWAYS\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,14.               ;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\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.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 AX,VPOS             ;CHECK HIS POSITION\r
+       BPL 25$\r
+       EOR I,0F8\r
+25$:   AND I,0F8\r
+       BNE 30$                 ;STILL ON FIELD, KEEP MOVING\r
+       LDA AX,HGOAL            ;ELSE SET TO DESIRED GOAL\r
+       STA AX,HPOSL\r
+       LDA AX,HGOAL+1\r
+       STA AX,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 AX,VPOS\r
+       CLC\r
+       ADC AY,CHDTAB           ;MOVE PLAYER\r
+       STA AX,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
+       .REPT 0                 ;DISABLE PERMANENTLY\r
+\r
+;**********\r
+;THIS SECTION FOR DEBUG\r
+       LDA WFLAG\r
+       AND I,2\r
+       BEQ 1$\r
+       LDA OPTION+2\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
+       .ENDR\r
+\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
+;FOLLOWING IS HOOK FOR SNEAK\r
+       LDA WFLAG\r
+       AND I,3\r
+       CMP I,1                 ;BALL BEING SNAPPED\r
+       BNE EXECM               ;NO RE-DO LAST "MOVE"\r
+       RTS\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 AX,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 AX,VGOAL\r
+       STA TVINC+1\r
+       LDA I,1\r
+       STA LIMIT+1\r
+       LDA I,0\r
+       STA TVINC\r
+       STA LIMIT\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 AX,VGOAL\r
+       CLC\r
+       ADC TVINC+1\r
+       STA AX,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
+;ENTERED WITH X->PLAYER, A=TBVD(X), THINC=TBHD(X)\r
+X.LIM: .BYTE 30\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 50$                 ;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
+       JMP 70$\r
+50$:   LDA OFSPDT              ;OFFENSE SPEED TIMER\r
+       BEQ 70$                 ;RAN OUT\r
+       LDA TVINC+1\r
+       CMP I,80\r
+       ROR\r
+       TAY\r
+       LDA TVINC\r
+       ROR\r
+       CLC\r
+       ADC TVINC\r
+       STA TVINC\r
+       TYA\r
+       ADC TVINC+1\r
+       STA TVINC+1\r
+70$:\r
+MOVER: LDA I,0\r
+       STA J\r
+       LDA THINC               ;MOVE TEMP HINC\r
+       STA AX,HINC             ;TO REAL HORIZ INCR\r
+       CLC\r
+       ADC AX,HPOSL\r
+       TAY\r
+       LDA THINC+1\r
+       STA AX,HINC+1\r
+       ADC AX,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 AX,HPOSH\r
+       TYA\r
+       STA AX,HPOSL\r
+       LDA TVINC\r
+       STA AX,VINC\r
+       CLC\r
+       ADC AX,VPOSL\r
+       TAY\r
+       LDA TVINC+1\r
+       STA AX,VINC+1\r
+       ADC AX,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 AX,VPOS\r
+       TYA\r
+       STA AX,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
+       BEQ 10$\r
+       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$\r
+       LDA OFSPDT\r
+       BNE 45$\r
+       LDA FRAME\r
+       LSR\r
+       BCS 45$\r
+       RTS\r
+44$:   LDY PLAYER              ;GET PLAYER #\r
+       LDA AY,PLAYNO\r
+       CMP I,2                 ;SET C IF PASS PLAY SELECTED\r
+       ROR                     ;GET IT IN SIGN\r
+       EOR AX,VPOS             ;EOR WITH "TOP OF SCREEN"\r
+       ASL                     ;C=RUN IN TOP/PASS IN BOTTOM\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
+       STA THINC\r
+       STA THINC+1             ;CLEAR HORIZ MOVEMENT\r
+       JMP MOVER\r
+\r
+45$:   LDA I,0\r
+       STA LIMIT+1\r
+       BIT STATE               ;CHECK FOR "PLAY" STATE\r
+       LDA ATRACT              ;ATTRACT\r
+       BMI 47$                 ;NO, GAME\r
+       LDA AX,HPICT            ;IN ATTRACT\r
+       LSR                     ;CHECK FOR DEF.\r
+       BVC 49$                 ;NOPE, MOVE EVERYBODY FAST\r
+       LDA I,48\r
+       BCC 48$                 ;BRANCH IF DEFENSE\r
+47$:   LDA I,40\r
+48$:   CPX I,BALLNO*2          ;BALL\r
+       BNE 5$                  ;NO, 2 DOTS MAX\r
+49$:   LDA I,0A0               ;BALL 5 DOTS MAX\r
+5$:    STA LIMIT\r
+       JSR SPDLIM\r
+       JMP MOVER\r
+10$:   LDA AX,FLAGS\r
+       ORA I,80                ;SET "AT GOAL" FLAG\r
+       STA AX,FLAGS\r
+       RTS\r
+       .SBTTL DIRECTION\r
+;SETS HINC & VINC TO DISPLACEMENT FROM (H/V) POS TO (H/V) GOAL\r
+DIRECT:        LDA AX,VGOAL\r
+       SEC\r
+       SBC AX,VPOS\r
+       PHA                     ;SAVE DIFFERENCE\r
+       BCC 1$\r
+       EOR I,80                ;EOR CARRY,D7\r
+1$:    ASL                     ;C=C.EOR.D7\r
+       PLA                     ;GET DIFFERENCE BACK\r
+       BCS 2$                  ;IF C.EOR.D7=1, SIGN IS OK\r
+       ASL                     ;ELSE WAS O'FLO, GET ERRONEOUS SIGN\r
+       LDA I,7F                ;SET MAX POS.\r
+       ADC I,0                 ;CHANGE TO MAX NEG IF SIGN WAS MINUS\r
+       EOR I,0FF               ;FLIP, CUZ SIGN WAS WRONG\r
+2$:    STA TVINC+1             ;VERT. DISPLACEMENT (TEMP, FOR MOVEMENTS)\r
+       LDA I,0\r
+       STA TVINC               ;KEEP LSB'S 0\r
+       LDA AX,HGOAL\r
+       SEC\r
+       SBC AX,HPOSL\r
+       STA THINC\r
+       LDA AX,HGOAL+1\r
+       SBC AX,HPOSH\r
+       STA THINC+1\r
+       RTS\r
+       .SBTTL SPEED-LIMIT\r
+;SCALES HINC(X) & VINC(X) SUCH THAT TOTAL INCREMENT IS LESS THAN OR\r
+;EQUAL TO LIMIT\r
+SPDLIM:        LDA THINC\r
+       LDY THINC+1\r
+       BPL 10$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1                 ;ABS VAL OF HINC(X)\r
+       PHA\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0\r
+       TAY\r
+       PLA\r
+10$:   STA HABS                ;SAVE AS HABS\r
+       STY HABS+1\r
+       LDA TVINC\r
+       STA VABS\r
+       LDY TVINC+1\r
+       BPL 20$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+       STA VABS\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;ABS VAL OF VINC(X)\r
+       TAY                     ;CHA-CHA-CHA (ONE-TWO-CHA-CHA-CHA!!!)\r
+20$:   TYA\r
+       LSR\r
+       ROR VABS\r
+       LSR\r
+       ROR VABS\r
+       LSR\r
+       ROR VABS                ;SCALE VABS TO MATCH HABS\r
+       STA VABS+1\r
+       TXA\r
+       PHA                     ;SAVE OBJECT PTR\r
+;NOW FIND MAX FOR SCALING\r
+40$:   LDX I,0                 ;POINT TO HABS\r
+       LDA HABS\r
+       CMP VABS\r
+       LDA HABS+1\r
+       SBC VABS+1              ;D.P. COMPARE VABS: HABS\r
+       BCS NSL                 ;BRANCH IF HABS >= VABS\r
+       LDX I,2                 ;ELSE POINT TO VABS\r
+;X POINTS TO MAX IN HABS OR VABS\r
+NSL:   LDA LIMIT\r
+       CMP ZX,HABS\r
+       LDA LIMIT+1\r
+       SBC ZX,HABS+1           ;D.P. COMPARE MAX: LIMIT\r
+       BCC SCALE               ;IN RANGE, SKIP IT\r
+       JMP RECON\r
+;DIVSOR=MAX, MAC=LIMIT\r
+SCALE: LDA ZX,HABS\r
+       STA DIVSOR              ;ELSE DIVSOR=MAX\r
+       LDA ZX,HABS+1\r
+       STA DIVSOR+1\r
+       LDA LIMIT\r
+       STA ZX,HABS\r
+       LDA LIMIT+1\r
+       STA ZX,HABS+1\r
+       TXA\r
+       EOR I,2\r
+       TAX                     ;PT TO MIN\r
+;QUOT=MIN/MAX          ;CARRIED TO 3 BITS\r
+       LDA ZX,HABS\r
+       STA QUOT+1\r
+       LDA ZX,HABS+1\r
+       STA QUOT+2\r
+       LDY I,3\r
+10$:   LDA QUOT+1\r
+       CMP DIVSOR\r
+       LDA QUOT+2\r
+       SBC DIVSOR+1\r
+       BCC 15$\r
+       STA QUOT+2\r
+       LDA QUOT+1\r
+       SBC DIVSOR\r
+       STA QUOT+1\r
+       SEC\r
+15$:   ROL QUOT\r
+       ROL QUOT+1\r
+       ROL QUOT+2\r
+       DEY\r
+       BNE 10$\r
+;QUOT(+1,+2)=QUOT*LIMIT\r
+       LDA LIMIT\r
+       STA DIVSOR\r
+       LDA LIMIT+1\r
+       STA DIVSOR+1\r
+       LDA I,0\r
+       STA QUOT+1\r
+       STA QUOT+2\r
+       LDY I,3\r
+20$:   LSR QUOT\r
+       BCC 25$\r
+       CLC\r
+       LDA QUOT+1\r
+       ADC DIVSOR\r
+       STA QUOT+1\r
+       LDA QUOT+2\r
+       ADC DIVSOR+1\r
+       STA QUOT+2\r
+25$:   LSR QUOT+2\r
+       ROR QUOT+1\r
+       DEY\r
+       BNE 20$\r
+;MIN:=(MIN/MAX)*LIMIT\r
+       LDA QUOT+1\r
+       STA ZX,HABS             ;MOVE IT BACK\r
+       LDA QUOT+2\r
+       STA ZX,HABS+1\r
+SL.C45:        LDA ZX,HABS+1           ;SPEED-LIMIT. CHECK FOR 45 DEG\r
+       STA K\r
+       LDA ZX,HABS\r
+       LSR\r
+       ROR K\r
+       LSR\r
+       ROR K                   ;J,K <- (MAX(HABS,VABS)/4)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC ZX,HABS\r
+       STA J                   ;J <- LSB (MAX(ETC.)*3/4)\r
+       LDA ZX,HABS+1\r
+       SBC K\r
+       STA K                   ;J,K = 3/4*(MAX(HABS,VABS))\r
+       TXA\r
+       EOR I,2                 ;(PING-PONG)\r
+       TAX                     ;BACK TO MIN\r
+       LDY ZX,HABS\r
+       CPY J\r
+       LDA ZX,HABS+1\r
+       SBC K                   ;COMPARE MIN TO 3/4 MAX\r
+       BCC RECON               ;BRANCH IF 3/4 MAX GREATER, JUST RECONSTITUTE\r
+       STY L                   ;L := LSB(MIN)\r
+       LSR\r
+       ROR L\r
+       LSR\r
+       ROR L                   ;ACC, L=MIN/4\r
+       EOR I,0FF\r
+       TAY\r
+       LDA ZX,HABS\r
+       SEC\r
+       SBC L\r
+       STA ZX,HABS\r
+       TYA\r
+       ADC ZX,HABS+1           ;(A*X+B)-(C**+D)=B-D+X*(-C+D)\r
+       STA ZX,HABS+1           ;MIN := 3/4 * MIN\r
+       TXA\r
+       EOR I,2                 ;(PONG-PING)\r
+       TAX                     ;BACK TO MAX\r
+       LDA J\r
+       STA ZX,HABS\r
+       LDA K\r
+       STA ZX,HABS+1           ;MAX := 3/4 * MAX\r
+RECON: LDA VABS\r
+       ASL\r
+       ROL VABS+1\r
+       ASL\r
+       ROL VABS+1\r
+       ASL\r
+       ROL VABS+1              ;VABS := VABS*8\r
+       STA VABS\r
+       LDX I,2\r
+62$:   LDA ZX,THINC+1\r
+       CMP I,80                ;CARRY=ORIG SIGN\r
+       LDY ZX,HABS\r
+       LDA ZX,HABS+1\r
+       BCC 65$\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;CARRY SET (AFTER BCC) SO ADDS 1\r
+       TAY\r
+       LDA ZX,HABS+1\r
+       EOR I,0FF\r
+       ADC I,0                 ;FINISH D.P. NEGATE\r
+65$:   STA ZX,THINC+1\r
+       STY ZX,THINC\r
+       DEX\r
+       DEX\r
+       BPL 62$\r
+70$:   PLA                     ;GET ORIG X BACK\r
+       TAX                     ;POINT BACK TO OBJECT\r
+       RTS\r
+\f\r
+       .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 AX,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 AX,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA AVHDL\r
+       STA HDISP\r
+       LDA AX,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 AX,VPOS             ;SIMILARLY, SUB FROM V(X)\r
+       SBC VDISP\r
+       STA AX,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 AX,HPOSL            ;THEN SUB FROM (X)\r
+       SEC\r
+       SBC HDISP\r
+       STA AX,HPOSL\r
+       LDA AX,HPOSH\r
+       SBC HDISP+1\r
+       STA AX,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 051\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$:    STY HASBAL\r
+       LDA I,EC.INT            ;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 AX,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 AX,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA K\r
+       LDA AX,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 A,BHPOSL            ;FIRST HALF OF D.P. COMPARE\r
+       TAY\r
+       PLA\r
+       SBC A,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 5$                  ;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]\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
+       LDA A,OPTION\r
+       AND I,8                 ;SW. 3\r
+       BEQ DOLOGO              ;BRANCH IF ON\r
+5$:    RTS\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
+M3E:   .BYTE 3E\r
+M3F:   .BYTE 3F\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 2$                  ;NO, OFF TO LEFT\r
+       CMP I,4                 ;FOUR STAMPS WIDE\r
+       BCS 2$                  ;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
+2$:    RTS                     ;DONE\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/A33721.1B b/A33721.1B
new file mode 100644 (file)
index 0000000..f92e790
Binary files /dev/null and b/A33721.1B differ
diff --git a/A33721.1C b/A33721.1C
new file mode 100644 (file)
index 0000000..c65e197
Binary files /dev/null and b/A33721.1C differ
diff --git a/A33721.1D b/A33721.1D
new file mode 100644 (file)
index 0000000..1e28929
--- /dev/null
+++ b/A33721.1D
@@ -0,0 +1,529 @@
+       .TITLE FBINT\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 FBCOMN\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
+       LDA A,INPORT            ;INPORT HAS TRACK-BALL COUNTERS FOR 0\r
+       STA TBCTR\r
+       LDA A,INPORT+2          ;COUNTERS FOR 2\r
+       STA TBCTR+2\r
+       LDA TOUT1               ;GET WHAT'S SUPPOSED TO BE IN "OUT1"\r
+       TAX                     ;SAVE IT\r
+       ORA I,20                ;HAVE IT READY WITH CTRLD=1\r
+       STX A,OUT1              ;STORE WITH CTRLD=0 TO READ SWITCHES\r
+       LDX A,INPORT            ;READ SWITCHES\r
+       LDY A,INPORT+2          ;BOTH SETS\r
+       STA A,OUT1              ;STORE WITH CTRLD=1 TO FREE-UP COUNTERS\r
+       STX INPUT               ;SAVE INPUTS IN RAM\r
+       STY INPUT+2\r
+       LDA A,INPORT            ;INSURANCE READ OF COUNTERS\r
+       LDY A,INPORT+2\r
+       STY NEWTB+2\r
+       STA NEWTB\r
+       TXA                     ;LSB'S OF "INPUT" HAVE TBALL\r
+       STA TBDIR               ;DIRECTION BITS\r
+       INC INTCNT              ;COUNT INTERRUPTS\r
+       BIT VBLANK              ;VERT. BLANKING?\r
+\r
+;138 CYCLES (MIN) FROM FALL OF IRQ\r
+\r
+       BVC 2$\r
+       LDA INTCNT\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
+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
+\r
+       JSR MOOLAH              ;COIN ROUTINE\r
+\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 AX,HPOSL\r
+       SEC\r
+       SBC SFDL\r
+       AND I,0E0               ;SAVE TOP 3 BITS\r
+       STA IJ                  ;SAVE IN INTERRUPT'S BUCKET\r
+       LDA AX,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 AX,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
+       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:        LDA I,4                 ;KEEP KICKER HIGH TO ENABLE CROWD\r
+       STA A,OUT1              ;SET CTRLD=0 TO READ SW.\r
+       LDX I,0                 ;CLR X\r
+       LDA A,INPORT            ;GET FIRST SW. PORT\r
+       STA TBDIR               ;SAVE TRACK-BALL DIR.\r
+       STA INPUT               ;SAVE INPUTS\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 A,INPORT+2          ;OTHER SWITCHES\r
+       STA 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,0F                ;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
+       CLC                     ;FLAG "NO CHANGE"\r
+5$:    DEX\r
+       BMI 6$                  ;X OUT, HOW'S Y DOING\r
+       DEY                     ;ELSE MATCH DEX WITH DEY\r
+       BPL 5$                  ;EQUAL SO FAR, LOOP\r
+       BMI 7$                  ;ELSE Y WAS LESS, BEEP\r
+\r
+6$:    DEY\r
+       BMI 8$                  ;X=Y, NO SOUND\r
+7$:    SEC                     ;COME HERE TO BEEP\r
+8$:    TAY                     ;SAVE SWITCHES FOR NEXT\r
+       LDA I,12                ;CTRLD, KICKER (SHIFTED RIGHT)\r
+       ROL                     ;LINE IT UP AND PUT IN WHISTLE\r
+       STA A,OUT1              ;SET CTRLD=1, AND WHISTLE\r
+       LDX A,INPORT\r
+       STX OTB\r
+       LDX A,INPORT+2\r
+       STX OTB+2\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
+TBTEST:        LDX I,2\r
+1$:    LDA AX,INPORT           ;SAMPLE COUNTER VALUE\r
+       SEC\r
+       ORA I,0F                ;MAKE LSB'S DON'T CARE\r
+       SBC ZX,OTB              ;TAKE OUT COUNT OF 4 MS AGO\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR                     ;DOWN TO BOTTOM\r
+       LSR TBDIR               ;CHECK DIRECTION\r
+       ORA I,0                 ;TSTA\r
+       BEQ 2$                  ;0 STAYS 0\r
+       BCC 2$                  ;+ STAYS +\r
+       ORA I,0F0               ;ELSE PUT IN SIGN\r
+2$:    CLC\r
+       ADC ZX,TBVD\r
+       STA ZX,TBVD\r
+       LDA AX,INPORT\r
+       SEC\r
+       SBC ZX,OTB\r
+       LSR TBDIR\r
+       AND I,0F\r
+       BEQ 3$\r
+       BCC 3$\r
+       ORA I,0F0\r
+3$:    CLC\r
+       ADC ZX,TBHD\r
+       STA ZX,TBHD\r
+       DEX\r
+       DEX\r
+       BPL 1$                  ;LOOP FOR BALL 0\r
+;NOW USE TBVD,TBHD TO MOVE OBJ(J),OBJ(J+2)\r
+       LDX J\r
+       LDA TBHD\r
+       STA AX,HHPOS\r
+       LDA TBVD\r
+       STA AX,HVPOS\r
+       LDA TBHD+2\r
+       STA AX,HHPOS+2\r
+       LDA TBVD+2\r
+       STA AX,HVPOS+2\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 HARINARE\r
+;SET CROWD VOLUME PROPORTIONAL TO # OF SWITCHES CLOSED\r
+       TYA                     ;GET #OF CLOSED SWITCHES(1-6)\r
+       STA 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,3                 ;ISOLATE COIN MODE\r
+       CLC\r
+       ADC I,59                ;MAKE A CODE FROM A-D\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:        .BYTE 0,0,0,0,0,0\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
\ No newline at end of file
diff --git a/A33721.2A b/A33721.2A
new file mode 100644 (file)
index 0000000..7f9a698
--- /dev/null
+++ b/A33721.2A
@@ -0,0 +1,2706 @@
+       .TITLE FOOTV2\r
+;MODIFIED FUTBAL 21-NOV-78\r
+;CHANGES @ 5-19, 5-515 TO 5-593\r
+;         7-305, 7-349, 8-17\r
+;         10-159 TO 10-267\r
+;\r
+       .RADIX 16\r
+       .IIF NDF,NTB,NTB=1\r
+       .ASECT\r
+       .SBTTL ******************************\r
+       .SBTTL * PROGRAMER: MIKE ALBAUGH    *\r
+       .SBTTL *                            *\r
+       .SBTTL * CHECKER:                   *\r
+       .SBTTL *                            *\r
+       .SBTTL ******************************\r
+       .REPT 0\r
+\r
+DATE INITIATED: 22-MAR-78\r
+PROJECT CHARGE #: 5P221\r
+DISK #:        73\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
+                        8K 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:*FUTBAL,FUTBAL=FUTBAL/C\r
+\r
+LINK COMMAND STRING:*PP:/L,RK1:FBMAP.LST=FUTBAL,FBCHOR,FBCOIN,FBINT\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\r
+       .INCLUDE FBCOMN\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
+       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 A,TEST\r
+       BVS WAIT                ;BRANCH IF TEST OFF\r
+APAT1: JMP RESET               ;FAKE RESET\r
+CKS0:  .BYTE 031\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
+       JSR SETPOS\r
+       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
+\r
+15$:   LDA I,S.PLAY            ;ELSE ENTER PLAY\r
+       STA STATE\r
+       LDX OFFENS              ;POINT TO OFFENSE\r
+       LDA ZX,PLAYNO           ;GET PLAY #\r
+       CMP I,2                 ;RUNNING?\r
+       LDA I,6\r
+       BCS 17$                 ;NO\r
+       LDA I,15.               ;3/4 SECOND\r
+17$:   STA OFSPDT              ;OF FAST OFFENSE\r
+       LDA I,1                 ;SET GLOBAL FLAGS\r
+       STA WFLAG               ;TO "ONE" TO SNAP\r
+       LSR                     ;MAKE A ZERO\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$:   LDA OFSPDT\r
+       BEQ 35$\r
+       DEC OFSPDT\r
+35$:   LDA OFFENS\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 WFLAG\r
+       AND I,2\r
+       BNE 39$\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 AY,HPOSL\r
+       STA A,HPOSL+28.         ;BALL IS OBJECT 14. (PLAYERS ARE 0-13)\r
+       LDA AY,HPOSH\r
+       STA A,HPOSH+28.\r
+       LDA AY,VPOS\r
+       STA A,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
+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
+       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.INT:        JSR SETBAL              ;INTERCEPTION, SET SCRIMMAGE LINE\r
+       JSR FLIP                ;FLIP OFFENSE/DEFENSE\r
+       JMP EP.COM              ;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 A,FDHPOS            ;FIRST DOWN LINE\r
+       LDA SCRIMH+1            ;GET WHOLE YDS OF SCRIMMAGE LINE\r
+       SBC A,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
+       JSR FLIP                ;ELSE FLIP SIDES\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
+       STA PSTIM               ;RESET PLAY-SELECT TIMERS\r
+       STA PSTIM+2\r
+       STA HASBAL              ;RESET BALL POSSESSION\r
+       STA REC1                ;RESET\r
+       STA CTLPTR              ;RESET CONTROLLED MEN\r
+       STA CTLPTR+2\r
+       STA PSFLAG              ;SET "ALLOW PASS"\r
+       LDA I,0\r
+       STA WFLAG               ;RESET GLOBAL FLAGS\r
+       STA WHYEND\r
+       STA MPSTIM              ;RESET MASTER P.S. TIMER\r
+       STA LEDWD               ;DOUSE LEDS\r
+       STA LEDWD+2\r
+       LDX I,28.\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\r
+       AND I,3\r
+       STA ZX,PLAYNO\r
+       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\r
+CHTAB: .BYTE 0,20,20,40,10,240.,240.,120.,40,0,0\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 A,FDHPOS\r
+       LDA SCRIMH+1\r
+       CLC\r
+       ADC AX,FDINC            ;OFFSET TOWARDS CORRECT GOAL\r
+       STA A,FDHPOS+1\r
+       LDA A,FDHPOS            ;CHECK FOR\r
+       CMP AX,GOALIN           ;PAST GOAL\r
+       LDA A,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 A,FDHPOS\r
+       LDA AX,GOALIN+1\r
+       STA A,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
+       AND I,2                 ;IS BALL CARRIER ON TEAM(X)\r
+       BEQ 11$                 ;IF SO SAY TOUCHDOWN\r
+       LSR K                   ;C SET IF OFFENSE\r
+       BCS 5$\r
+       LDA WHYEND\r
+       CMP I,EC.INT            ;INTERCEPTION?\r
+       BNE 20$                 ;NO, SKIP\r
+       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
+;Y=PLAYER TO CHECK, RETURNS Z=1 IF PAST SCRIMMAGE LINE\r
+PSCRIM: TYA\r
+       AND I,2\r
+       TAX\r
+       LDA AY,HPOSL\r
+       CMP SCRIMH\r
+       LDA AY,HPOSH\r
+       SBC SCRIMH+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              ;KILL PASS OPTION\r
+4$:    LDA PSFLAG              ;IS PASS STILL ALLOWED?\r
+       BEQ 10$                 ;NO, RETURN\r
+       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
+       ORA WFLAG               ;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 AX,HGOAL            ;SET POSITION=GOAL\r
+       STA AX,HPOSL\r
+       LDA AX,HGOAL+1\r
+       STA AX,HPOSH\r
+       LDA AX,VGOAL\r
+       STA AX,VPOS\r
+       LDA I,0\r
+       STA AX,VPOSL\r
+20$:   DEX\r
+       DEX\r
+       BPL 10$\r
+30$:   PLA\r
+       TAX\r
+       RTS\r
+STATS:  LDA SCRIMH\r
+       CMP A,FDHPOS\r
+       LDA SCRIMH+1\r
+       SEC\r
+       SBC A,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
+       LDA I,0\r
+       LDY POINTS              ;GET POINTS FOR THIS ENDING\r
+       STA POINTS              ;CLEAR IT\r
+       BPL 5$                  ;IF D7=1, GIVE TO THIS PLAYER\r
+       TXA\r
+       EOR I,2                 ;ELSE FLIP PLAYER\r
+       TAX\r
+5$:    TYA\r
+       AND I,7F                ;CLEAR FLAG\r
+       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
+\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\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,45$-1$,14,46$-1$\r
+       .BYTE 4B,6$-1$,48,7$-1$,48,8$-1$\r
+       .BYTE 4C,9$-1$,4B,10$-1$,4A,11$-1$,4A,12$-1$\r
+       .BYTE 4A,13$-1$,4C,14$-1$,4A,15$-1$,4A,16$-1$\r
+       .BYTE 49,5$-1$,4D,17$-1$,49,0,45,2$-1$,49,3$-1$\r
+       .BYTE 47,18$-1$,41,19$-1$\r
+MESLST =.\r
+1$:    .ASCIN /INSERT COINS/\r
+2$:    .ASCIN /EACH COIN ADDS TIME/\r
+3$:    .ASCIN /SELECT PLAY/\r
+45$:   .ASCIN /DOWN TO GO/\r
+46$:   .ASCIN /TIME SCORE/\r
+5$:    .ASCIN /DELAY OF GAME/\r
+6$:    .ASCIN /GAME OVER/\r
+\r
+7$:    .ASCIN /YOU ARE OFFENSE/\r
+8$:    .ASCIN /YOU ARE DEFENSE/\r
+9$:    .ASCIN  /TACKLED/\r
+10$:   .ASCIN  /TOUCHDOWN/\r
+11$:   .ASCIN  /INCOMPLETE/\r
+12$:   .ASCIN  /INTERCEPTED/\r
+13$:   .ASCIN  /TOUCHBACK/\r
+14$:   .ASCIN  /SAFETY/\r
+15$:   .ASCIN  /OUT OF BOUNDS/\r
+16$:   .ASCIN /OFF SIDES/\r
+17$:   .ASCIN  /READY/\r
+18$:   .ASCIN /GAME ALMOST OVER/\r
+19$:   .ASCIN /INSERT COINS TO KEEP PLAYING/\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 A,BHPOSH\r
+15$:   LDY A,BHPOSL\r
+       STY A,SCRIMH            ;SET SCRIMMAGE LINE\r
+       STA SCRIMH+1\r
+       LDA A,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 0D5\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 A,FDVPOS+1          ;FIRST-DOWN MARKER\r
+       STX PLAYER              ;SAVE PLAYER #\r
+       TXA\r
+       ORA I,18\r
+       TAX\r
+3$:    TXA\r
+       EOR OFFENS\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
+       CMP I,NPLAYS            ;VALID?\r
+       BCC 2$                  ;YES\r
+       SBC I,NPLAYS            ;ELSE TAKE IT MODULO NPLAYS\r
+       STA ZX,PLAYNO\r
+       BCS 1$                  ;ALWAYS\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,14.               ;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\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.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 AX,VPOS             ;CHECK HIS POSITION\r
+       BPL 25$\r
+       EOR I,0F8\r
+25$:   AND I,0F8\r
+       BNE 30$                 ;STILL ON FIELD, KEEP MOVING\r
+       LDA AX,HGOAL            ;ELSE SET TO DESIRED GOAL\r
+       STA AX,HPOSL\r
+       LDA AX,HGOAL+1\r
+       STA AX,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 AX,VPOS\r
+       CLC\r
+       ADC AY,CHDTAB           ;MOVE PLAYER\r
+       STA AX,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
+       .REPT 0                 ;DISABLE PERMANENTLY\r
+\r
+;**********\r
+;THIS SECTION FOR DEBUG\r
+       LDA WFLAG\r
+       AND I,2\r
+       BEQ 1$\r
+       LDA OPTION+2\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
+       .ENDR\r
+\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
+;FOLLOWING IS HOOK FOR SNEAK\r
+       LDA WFLAG\r
+       AND I,3\r
+       CMP I,1                 ;BALL BEING SNAPPED\r
+       BNE EXECM               ;NO RE-DO LAST "MOVE"\r
+       RTS\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 AX,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 AX,VGOAL\r
+       STA TVINC+1\r
+       LDA I,1\r
+       STA LIMIT+1\r
+       LDA I,0\r
+       STA TVINC\r
+       STA LIMIT\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 AX,VGOAL\r
+       CLC\r
+       ADC TVINC+1\r
+       STA AX,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
+;ENTERED WITH X->PLAYER, A=TBVD(X), THINC=TBHD(X)\r
+X.LIM: .BYTE 30\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 50$                 ;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
+       JMP 70$\r
+50$:   LDA OFSPDT              ;OFFENSE SPEED TIMER\r
+       BEQ 70$                 ;RAN OUT\r
+       LDA TVINC+1\r
+       CMP I,80\r
+       ROR\r
+       TAY\r
+       LDA TVINC\r
+       ROR\r
+       CLC\r
+       ADC TVINC\r
+       STA TVINC\r
+       TYA\r
+       ADC TVINC+1\r
+       STA TVINC+1\r
+70$:\r
+MOVER: LDA I,0\r
+       STA J\r
+       LDA THINC               ;MOVE TEMP HINC\r
+       STA AX,HINC             ;TO REAL HORIZ INCR\r
+       CLC\r
+       ADC AX,HPOSL\r
+       TAY\r
+       LDA THINC+1\r
+       STA AX,HINC+1\r
+       ADC AX,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 AX,HPOSH\r
+       TYA\r
+       STA AX,HPOSL\r
+       LDA TVINC\r
+       STA AX,VINC\r
+       CLC\r
+       ADC AX,VPOSL\r
+       TAY\r
+       LDA TVINC+1\r
+       STA AX,VINC+1\r
+       ADC AX,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 AX,VPOS\r
+       TYA\r
+       STA AX,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
+       BEQ 10$\r
+       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$\r
+       LDA OFSPDT\r
+       BNE 45$\r
+       LDA FRAME\r
+       LSR\r
+       BCS 45$\r
+       RTS\r
+44$:   LDY PLAYER              ;GET PLAYER #\r
+       LDA AY,PLAYNO\r
+       CMP I,2                 ;SET C IF PASS PLAY SELECTED\r
+       ROR                     ;GET IT IN SIGN\r
+       EOR AX,VPOS             ;EOR WITH "TOP OF SCREEN"\r
+       ASL                     ;C=RUN IN TOP/PASS IN BOTTOM\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
+       STA THINC\r
+       STA THINC+1             ;CLEAR HORIZ MOVEMENT\r
+       JMP MOVER\r
+\r
+45$:   LDA I,0\r
+       STA LIMIT+1\r
+       BIT STATE               ;CHECK FOR "PLAY" STATE\r
+       LDA ATRACT              ;ATTRACT\r
+       BMI 47$                 ;NO, GAME\r
+       LDA AX,HPICT            ;IN ATTRACT\r
+       LSR                     ;CHECK FOR DEF.\r
+       BVC 49$                 ;NOPE, MOVE EVERYBODY FAST\r
+       LDA I,48\r
+       BCC 48$                 ;BRANCH IF DEFENSE\r
+47$:   LDA I,40\r
+48$:   CPX I,BALLNO*2          ;BALL\r
+       BNE 5$                  ;NO, 2 DOTS MAX\r
+49$:   LDA I,0A0               ;BALL 5 DOTS MAX\r
+5$:    STA LIMIT\r
+       JSR SPDLIM\r
+       JMP MOVER\r
+10$:   LDA AX,FLAGS\r
+       ORA I,80                ;SET "AT GOAL" FLAG\r
+       STA AX,FLAGS\r
+       RTS\r
+       .SBTTL DIRECTION\r
+;SETS HINC & VINC TO DISPLACEMENT FROM (H/V) POS TO (H/V) GOAL\r
+DIRECT:        LDA AX,VGOAL\r
+       SEC\r
+       SBC AX,VPOS\r
+       PHA                     ;SAVE DIFFERENCE\r
+       BCC 1$\r
+       EOR I,80                ;EOR CARRY,D7\r
+1$:    ASL                     ;C=C.EOR.D7\r
+       PLA                     ;GET DIFFERENCE BACK\r
+       BCS 2$                  ;IF C.EOR.D7=1, SIGN IS OK\r
+       ASL                     ;ELSE WAS O'FLO, GET ERRONEOUS SIGN\r
+       LDA I,7F                ;SET MAX POS.\r
+       ADC I,0                 ;CHANGE TO MAX NEG IF SIGN WAS MINUS\r
+       EOR I,0FF               ;FLIP, CUZ SIGN WAS WRONG\r
+2$:    STA TVINC+1             ;VERT. DISPLACEMENT (TEMP, FOR MOVEMENTS)\r
+       LDA I,0\r
+       STA TVINC               ;KEEP LSB'S 0\r
+       LDA AX,HGOAL\r
+       SEC\r
+       SBC AX,HPOSL\r
+       STA THINC\r
+       LDA AX,HGOAL+1\r
+       SBC AX,HPOSH\r
+       STA THINC+1\r
+       RTS\r
+       .SBTTL SPEED-LIMIT\r
+;SCALES HINC(X) & VINC(X) SUCH THAT TOTAL INCREMENT IS LESS THAN OR\r
+;EQUAL TO LIMIT\r
+SPDLIM:        LDA THINC\r
+       LDY THINC+1\r
+       BPL 10$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1                 ;ABS VAL OF HINC(X)\r
+       PHA\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0\r
+       TAY\r
+       PLA\r
+10$:   STA HABS                ;SAVE AS HABS\r
+       STY HABS+1\r
+       LDA TVINC\r
+       STA VABS\r
+       LDY TVINC+1\r
+       BPL 20$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+       STA VABS\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;ABS VAL OF VINC(X)\r
+       TAY                     ;CHA-CHA-CHA (ONE-TWO-CHA-CHA-CHA!!!)\r
+20$:   TYA\r
+       LSR\r
+       ROR VABS\r
+       LSR\r
+       ROR VABS\r
+       LSR\r
+       ROR VABS                ;SCALE VABS TO MATCH HABS\r
+       STA VABS+1\r
+       TXA\r
+       PHA                     ;SAVE OBJECT PTR\r
+;NOW FIND MAX FOR SCALING\r
+40$:   LDX I,0                 ;POINT TO HABS\r
+       LDA HABS\r
+       CMP VABS\r
+       LDA HABS+1\r
+       SBC VABS+1              ;D.P. COMPARE VABS: HABS\r
+       BCS NSL                 ;BRANCH IF HABS >= VABS\r
+       LDX I,2                 ;ELSE POINT TO VABS\r
+;X POINTS TO MAX IN HABS OR VABS\r
+NSL:   LDA LIMIT\r
+       CMP ZX,HABS\r
+       LDA LIMIT+1\r
+       SBC ZX,HABS+1           ;D.P. COMPARE MAX: LIMIT\r
+       BCC SCALE               ;IN RANGE, SKIP IT\r
+       JMP RECON\r
+;DIVSOR=MAX, MAC=LIMIT\r
+SCALE: LDA ZX,HABS\r
+       STA DIVSOR              ;ELSE DIVSOR=MAX\r
+       LDA ZX,HABS+1\r
+       STA DIVSOR+1\r
+       LDA LIMIT\r
+       STA ZX,HABS\r
+       LDA LIMIT+1\r
+       STA ZX,HABS+1\r
+       TXA\r
+       EOR I,2\r
+       TAX                     ;PT TO MIN\r
+;QUOT=MIN/MAX          ;CARRIED TO 3 BITS\r
+       LDA ZX,HABS\r
+       STA QUOT+1\r
+       LDA ZX,HABS+1\r
+       STA QUOT+2\r
+       LDY I,3\r
+10$:   LDA QUOT+1\r
+       CMP DIVSOR\r
+       LDA QUOT+2\r
+       SBC DIVSOR+1\r
+       BCC 15$\r
+       STA QUOT+2\r
+       LDA QUOT+1\r
+       SBC DIVSOR\r
+       STA QUOT+1\r
+       SEC\r
+15$:   ROL QUOT\r
+       ROL QUOT+1\r
+       ROL QUOT+2\r
+       DEY\r
+       BNE 10$\r
+;QUOT(+1,+2)=QUOT*LIMIT\r
+       LDA LIMIT\r
+       STA DIVSOR\r
+       LDA LIMIT+1\r
+       STA DIVSOR+1\r
+       LDA I,0\r
+       STA QUOT+1\r
+       STA QUOT+2\r
+       LDY I,3\r
+20$:   LSR QUOT\r
+       BCC 25$\r
+       CLC\r
+       LDA QUOT+1\r
+       ADC DIVSOR\r
+       STA QUOT+1\r
+       LDA QUOT+2\r
+       ADC DIVSOR+1\r
+       STA QUOT+2\r
+25$:   LSR QUOT+2\r
+       ROR QUOT+1\r
+       DEY\r
+       BNE 20$\r
+;MIN:=(MIN/MAX)*LIMIT\r
+       LDA QUOT+1\r
+       STA ZX,HABS             ;MOVE IT BACK\r
+       LDA QUOT+2\r
+       STA ZX,HABS+1\r
+SL.C45:        LDA ZX,HABS+1           ;SPEED-LIMIT. CHECK FOR 45 DEG\r
+       STA K\r
+       LDA ZX,HABS\r
+       LSR\r
+       ROR K\r
+       LSR\r
+       ROR K                   ;J,K <- (MAX(HABS,VABS)/4)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC ZX,HABS\r
+       STA J                   ;J <- LSB (MAX(ETC.)*3/4)\r
+       LDA ZX,HABS+1\r
+       SBC K\r
+       STA K                   ;J,K = 3/4*(MAX(HABS,VABS))\r
+       TXA\r
+       EOR I,2                 ;(PING-PONG)\r
+       TAX                     ;BACK TO MIN\r
+       LDY ZX,HABS\r
+       CPY J\r
+       LDA ZX,HABS+1\r
+       SBC K                   ;COMPARE MIN TO 3/4 MAX\r
+       BCC RECON               ;BRANCH IF 3/4 MAX GREATER, JUST RECONSTITUTE\r
+       STY L                   ;L := LSB(MIN)\r
+       LSR\r
+       ROR L\r
+       LSR\r
+       ROR L                   ;ACC, L=MIN/4\r
+       EOR I,0FF\r
+       TAY\r
+       LDA ZX,HABS\r
+       SEC\r
+       SBC L\r
+       STA ZX,HABS\r
+       TYA\r
+       ADC ZX,HABS+1           ;(A*X+B)-(C**+D)=B-D+X*(-C+D)\r
+       STA ZX,HABS+1           ;MIN := 3/4 * MIN\r
+       TXA\r
+       EOR I,2                 ;(PONG-PING)\r
+       TAX                     ;BACK TO MAX\r
+       LDA J\r
+       STA ZX,HABS\r
+       LDA K\r
+       STA ZX,HABS+1           ;MAX := 3/4 * MAX\r
+RECON: LDA VABS\r
+       ASL\r
+       ROL VABS+1\r
+       ASL\r
+       ROL VABS+1\r
+       ASL\r
+       ROL VABS+1              ;VABS := VABS*8\r
+       STA VABS\r
+       LDX I,2\r
+62$:   LDA ZX,THINC+1\r
+       CMP I,80                ;CARRY=ORIG SIGN\r
+       LDY ZX,HABS\r
+       LDA ZX,HABS+1\r
+       BCC 65$\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;CARRY SET (AFTER BCC) SO ADDS 1\r
+       TAY\r
+       LDA ZX,HABS+1\r
+       EOR I,0FF\r
+       ADC I,0                 ;FINISH D.P. NEGATE\r
+65$:   STA ZX,THINC+1\r
+       STY ZX,THINC\r
+       DEX\r
+       DEX\r
+       BPL 62$\r
+70$:   PLA                     ;GET ORIG X BACK\r
+       TAX                     ;POINT BACK TO OBJECT\r
+       RTS\r
+\f\r
+       .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 AX,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 AX,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA AVHDL\r
+       STA HDISP\r
+       LDA AX,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 AX,VPOS             ;SIMILARLY, SUB FROM V(X)\r
+       SBC VDISP\r
+       STA AX,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 AX,HPOSL            ;THEN SUB FROM (X)\r
+       SEC\r
+       SBC HDISP\r
+       STA AX,HPOSL\r
+       LDA AX,HPOSH\r
+       SBC HDISP+1\r
+       STA AX,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            ;CHECK MAN\r
+       LSR                     ;SET C IF OFFENSE\r
+       BCS C.PASR              ;OFFENSE?, CHECK RECVR'S\r
+       JMP C.INTC              ;ELSE CHECK INTERCEPT\r
+\r
+10$:   LDA AY,HPICT            ;CHECK MAN\r
+       LSR                     ;SET C IF OFFENSE\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
+       LDA PLAYNO              ;SEE IF THEY SELECTED THE SAME\r
+       CMP PLAYNO+2            ;PLAY (E.G. BOMB VS BOMB)\r
+       BNE 10$                 ;(FIRST HALF OF A LONG BEQ)\r
+       JMP C.FINC              ;IF SO, FORCE INCOMPLETE\r
+10$:   LDX REC1                ;ELSE PT TO REC.\r
+15$:   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 15$         ;NO, KEEP SCANNING\r
+       JSR D.JOY               ;ELSE FINISH DECODE\r
+       STX HASBAL\r
+       LDX I,-1\r
+       STX REC1                ;RESET RECEIVER\r
+       INX                     ;MAKE A ZERO\r
+       STX A,FLAGS+<BALLNO*2>  ;RESET BALL'S FLAGS\r
+       LDX I,28.               ;RESTORE X\r
+       BNE KLUGE0              ;WE NEED THE SPACE HERE\r
+C.PRER:        BRK                     ;ABORT\r
+CKS2:  .BYTE 0B3\r
+C.INTC:        BCC KLUGE1              ;THIS MUST STAY HERE FOR COMPATIBILITY\r
+;WITH VERSION -01 ROMS\r
+;A BCC WILL ALWAYS BRANCH\r
+KLUGE0:        JSR DECODE              ;BUMP BALL\r
+       LDY HASBAL              ;RESTORE Y AND PICK UP COLCHK\r
+$20$:  RTS                     ;WHERE WE LEFT OFF\r
+\r
+;CHECK FOR WITHIN RANGE OF ELIGIBLE RECEIVER\r
+KLUGE1:        LDA HASBAL              ;FREE BALL?\r
+       BPL 20$                 ;NO, SKIP\r
+       LDA PARAM+28.           ;CHECK PASS TIMER\r
+       CMP I,4                 ;NEAR END\r
+       BCC C.FINT              ;YES, FORCE INTERCEPT\r
+       LDX REC1                ;ELSE 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
+\r
+       .ENABL LSB\r
+\r
+C.INRG:        LDA AX,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 AX,HPOSL\r
+       SEC\r
+       SBC AY,HPOSL\r
+       STA K\r
+       LDA AX,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
+C.FINC:        LDA I,EC.INC            ;ENTER HERE WITH C SET TO FORCE INC.\r
+       BCS 25$\r
+       BIT INTCNT\r
+       BMI 25$\r
+       BVS 25$\r
+C.FINT:        LDA I,EC.INT            ;INTERCEPTION\r
+       STY HASBAL\r
+25$:   STA WHYEND\r
+30$:   RTS\r
+       .DSABL LSB\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 A,BHPOSL            ;FIRST HALF OF D.P. COMPARE\r
+       TAY\r
+       PLA\r
+       SBC A,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 5$                  ;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]\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
+       LDA A,OPTION\r
+       AND I,8                 ;SW. 3\r
+       BEQ DOLOGO              ;BRANCH IF ON\r
+5$:    RTS\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
+M3E:   .BYTE 3E\r
+M3F:   .BYTE 3F\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 2$                  ;NO, OFF TO LEFT\r
+       CMP I,4                 ;FOUR STAMPS WIDE\r
+       BCS 2$                  ;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
+2$:    RTS                     ;DONE\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/A34006.ROM b/A34006.ROM
new file mode 100644 (file)
index 0000000..feab820
Binary files /dev/null and b/A34006.ROM differ
diff --git a/FBCOMN.XX b/FBCOMN.XX
new file mode 100644 (file)
index 0000000..380142a
--- /dev/null
+++ b/FBCOMN.XX
@@ -0,0 +1,253 @@
+       .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 TO KEEP PLAYING"\r
+\f      .SBTTL ZERO PAGE\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 =INPUT          ;COINS IN D7\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  ON-LOGO @ 50 YD. LINE, OFF-NO LOGO\r
+;            3    D2   ON-CONSECUTIVE DELAY PENALITIES, OFF-ONE MAX\r
+;            2    D1   ON-TACKLE TEST, OFF-REGULAR GAME\r
+;            1    D0   ON-1:30/COIN,OFF-2 MINUTES\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
+$CCTIM:        .BLKB 1         ;COIN CTR PULSE TIMER\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 OTHER 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
+\r
+LEDWD: .BLKB 3         ;LED'S FOR PLAYER1,BUTTONS,PLAYER2\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
+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
+L:     .BLKB 1         ;  "\r
+LIMIT: .BLKB 2         ;SPEED LIMIT\r
+HABS:  .BLKB 2         ;!HORIZ!\r
+VABS:  .BLKB 2         ;!VERT!\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
+HASBAL:        .BLKB 1         ;POINTS TO PLAYER WHO HAS BALL (- IF NONE)\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
+MPSTIM:        .BLKB 1         ;MASTER PLAY-SELECT TIMER, 10 SECONDS\r
+INPLCE:        .BLKB 1         ;# OF PLAYERS IN PLACE\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
+REC1:  .BLKB 1         ;ELIGIBLE RECEIVER (-=NONE)\r
+OFSPDT:        .BLKB 1         ;TIMER FOR OFFENSE SPEED ADVANTAGE\r
+DOWN:  .BLKB 1         ;DOWN #\r
+DTG:   .BLKB 2         ;DECIMAL # OF YARDS "TO GO"\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
+TARDY: .BLKB 1         ;PLAYER WHO LAST CAUSED "DELAY OF GAME"\r
+POINTS: .BLKB 1                ;POINTS FOR THIS RESULTS, SET BY CKGOAL\r
+WFLAG: .BLKB 1         ;GLOBAL FLAGS FOR "WAIT"\r
+       .REPT 0\r
+BIT    SET BY          MEANING\r
+---    ------          -------\r
+\r
+D4     PASSQ*          START PASS (*ALSO EXEC, IN ATTRACT)\r
+D3     BALCOL          PASS COMPLETE\r
+D2     EXEC(BALL)      SPECIAL OFFENSE SYNC FOR SNEAK\r
+D1     EXEC(BALL)      BALL SNAPPED,ENABLE DEFENSE,ALSO OFFENSE QB\r
+D0     GAME            SNAP BALL,ENABLE OFFENSE (EXCEPT QB)\r
+       .ENDR\r
+\r
+ALT:   .BLKB 1\r
+MEN:   .BLKB 1\r
+FRAME: .BLKB 1         ;COUNT FRAMES (20 HZ)\r
+RUNTIM:        .BLKB 1         ;RUN CLOCK IF A 1, STOP IF 0\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
+       .BLKB 2         ;DUMMY***, 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. &nbs