First commit main
authorHistorical Source <49599193+historicalsource@users.noreply.github.com>
Fri, 15 Oct 2021 00:46:24 +0000 (20:46 -0400)
committerHistorical Source <49599193+historicalsource@users.noreply.github.com>
Fri, 15 Oct 2021 00:46:24 +0000 (20:46 -0400)
A34711.1A [new file with mode: 0644]
A34711.1B [new file with mode: 0644]
A34711.1C [new file with mode: 0644]
BASBAL.DOC [new file with mode: 0644]
BASBAL.MAP [new file with mode: 0644]
BSAN.XX [new file with mode: 0644]
BSCOMN.XX [new file with mode: 0644]
BSMOT.ROM [new file with mode: 0644]
PENNY.OLD [new file with mode: 0644]

diff --git a/A34711.1A b/A34711.1A
new file mode 100644 (file)
index 0000000..a96a82f
--- /dev/null
+++ b/A34711.1A
@@ -0,0 +1,4222 @@
+       .TITLE BSBALL\r
+       .RADIX 16\r
+       .ENABL AMA\r
+       .IIF NDF,NTB,NTB=1\r
+       .ASECT\r
+       .SBTTL ******************************\r
+       .SBTTL * PROGRAMMER: ED ROTBERG    *\r
+       .SBTTL *                            *\r
+       .SBTTL * CHECKER:                   *\r
+       .SBTTL *                            *\r
+       .SBTTL ******************************\r
+       .REPT 0\r
+\r
+DATE INITIATED: 23-JAN-79\r
+PROJECT CHARGE #: \r
+DISK #:                109\r
+HARDWARE REQUIREMENTS: MONSTER-MAN PCB, CONSISTING OF BASIC MOC16\r
+                       WITH ADDITIONS  \r
+                                       1) 4 ANODE MULTIPLEXED LED DISPLAYS\r
+                                       2) 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:*BSBA1,BSBA1=BSBA1/C\r
+\r
+LINK COMMAND STRING:   PP:/L=BSBA1,BSCOIN,BSINT\r
+\r
+PROGRAM DESCRIPTION: MAIN PROGRAM FOR "MONSTER-MAN BASEBALL".\r
+                    USES STANDARD COIN ROUTINE, (CUSTOMIZED BY BSCOIN)\r
+                    ON FILE BSCOIN.OBJ FOR HANDLING COINS.\r
+                    BSINT IS INTERRUPT, TEST, AND VECTORS.  BSCOMN\r
+                    (INCLUDED) DEFINES STORAGE. GAME IS ON "EACH COIN\r
+                    ADDS TIME" BASIS\r
+       .ENDR\r
+NPLAYS=4\r
+       .GLOBL $CNCT\r
+       .INCLUDE BSCOMN\r
+\r
+\f      .IIF NDF,AIM,AIM=0      ;DEFAULT TO NO AIM\r
+       .IF NE,AIM\r
+       .SBTTL AIM,DEBUG STUFF\r
+       .=PROG-100              ;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
+       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 MOVLEG\r
+       JSR RAND\r
+       INC FRAME\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 3A\r
+       .PAGE\r
+       .SBTTL GAME MASTER CONTROL\r
+\r
+;BLOCK NAME:   START GAME\r
+;BLOCK TYPE:   DIRECT\r
+;DESCRIPTION:  START GAME WRITES OUT THE PLAYFIELD, MOVES ALL PLAYERS TO\r
+;              THEIR DUGOUTS. INITIALIZES, RUNS, OFFENSE #, TIMERS, INNINGS\r
+;              AND WRITES OUT THE SCOREBOARD.\r
+;\r
+;INPUT PARAMS: ATRACT\r
+;OUTPUT PARAMS:        PLAYFIELD, SCOREBOARD, RUNS, INNINGS, STATE PLAYER POSITIONS,\r
+;              WHISTL, CRACK, THUD, PAUST\r
+;SUBS USED:    CAN,PLYFLD,BANNER,DSTAT\r
+;REGS USED:    A,X,Y\r
+;STACK USAGE:  NONE\r
+;\r
+STRTGM:        JSR CAN\r
+       LDA I,S.PAUS            ;SET INTO PAUSE\r
+       STA STATE\r
+       LDA I,10                ;INIT PAUSE TIMER\r
+       STA PAUST\r
+       LDA I,0                 ;INITIALIZE\r
+       STA RUNS                ;RUNS\r
+       STA RUNS+2\r
+       STA OFFENS              ;VISITORS OF FIRST\r
+       JSR PLYFLD              ;WRITE OUT PLAYFIELD\r
+       LDA I,1\r
+       STA INNING              ;1ST INNING\r
+       LDX I,PITCHER*2         ;START ALL PLAYERS IN DUGOUT\r
+10$:   LDA I,HDUGD\r
+       STA AX,HPOSH\r
+       LDA I,VDUGD\r
+       STA AX,VPOS\r
+       INX\r
+       INX\r
+       CPX I,BATTER*2          ;OFFENSIVE PLAYERS IN OTHER DUGOUT\r
+       BNE 10$\r
+20$:   LDA I,HDUGO\r
+       STA AX,HPOSH\r
+       LDA I,VDUGO\r
+       STA AX,VPOS\r
+       INX\r
+       INX\r
+       CPX I,<BATTER+4>*2\r
+       BNE 20$\r
+       JSR BANNER              ;WRITE OUT SCOREBOARD\r
+       BIT ATRACT\r
+       BPL 25$\r
+       INC SCBDLV              ;POINT TO FIRST INNING\r
+       DEC SCBDRV\r
+       LDA I,1C\r
+       STA RUNING\r
+25$:   LDA I,0\r
+       STA WHISTL              ;KILL LEFT OVER SOUND\r
+       STA CRACK\r
+       STA THUD\r
+       JSR DSTAT               ;DISPLAY STATISTICS\r
+       .SBTTL GAME CONTROL\r
+;BLOCK NAME:   GAME\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  GAME HANDLES COIN MODES AND ONE OR TWO PLAYER START\r
+;              CONDITIONS.  IT PUTS GAME INTO GAME MODE AND INITIALIZES\r
+;              TPC LOCATIONS FOR PLAY SECTION.\r
+;\r
+;INPUT PARAMS: $CNCT,ININGS,ATRACT,CLK8S,SCNDQT,PLYR1,CMPLYR\r
+;OUTPUT PARAMS:        ININGS,ATRACT,SCNDQT,BEEP,LEDWD+1,PLYR1,CMPLYR\r
+;REGS USED:    A,X,Y\r
+;STACK USAGE:  NONE\r
+;SUBS USED:    UPING,DSTAT,BUTTON,WRITEB,REPLAC\r
+;\r
+GAME:  BIT ATRACT\r
+       BPL 2$                  ;IF ATTRACT, BRK\r
+       LDA PLYR2\r
+       ORA PLYR1               ;NO ONE PUSHED YET\r
+       BEQ 2$\r
+       LDA I,1B                ;BLANK SCORE BOARD\r
+       BIT INTCNT\r
+       BVS 1$\r
+       LDA RUNING              ;BLINK SCORE BOARD\r
+1$:    LDX OFFENS\r
+       STA NX,SCBDRV\r
+       ORA I,40\r
+       STA NX,SCBDLV\r
+2$:    LDA $CNCT               ;ANY COINS\r
+       BEQ 10$                 ;NO!\r
+       DEC $CNCT               ;SUBTRACT 1\r
+       LDA ININGS              ;1 ST COIN DEPOSITED\r
+       BNE 5$                  ;YES, SKIP CRAP\r
+       LDA I,-1\r
+       STA ATRACT              ;GO TO GAME MODE\r
+5$:    JSR UPING\r
+       JSR DSTAT\r
+10$:   LDA PLYR2               ;2 PLAYER GAME?\r
+       BNE 37$                 ;YES SKIP THIS CRAP\r
+       LDA ININGS              ;ANY MONEY YET?\r
+       BEQ 37$                 ;NO\r
+       LDA PLYR1               ;NONE PLAYER\r
+       BEQ 15$                 ;NO\r
+       LDA INNING              ;YES FIRST INNING?\r
+       LSR\r
+       BNE 37$                 ;NO TOO LATE\r
+       LDA ININGS              ;MORE THAN 1 COIN?\r
+       LSR\r
+       BNE 30$                 ;YES\r
+       LDY I,0\r
+       LDX CMPLYR\r
+       LDA I,M.IC\r
+       BNE 35$\r
+15$:   STA LEDWD+1             ;TURN OFF LICONS\r
+       LDX I,2\r
+16$:   JSR BUTTON              ;BUTTON PRESSED?\r
+       BNE 20$                 ;YES\r
+       DEX\r
+       DEX\r
+       BPL 16$\r
+       LDA I,M.PS              ;NO, "PUSH START"\r
+       BIT INTCNT              ;FLASH IT\r
+       BMI 18$\r
+       LDY I,3                 ;TURN ON LICONS\r
+       STY LEDWD+1\r
+       ORA I,80\r
+18$:   JMP WRITEB\r
+30$:   LDY I,1                 ;LIGHT BUTTON LIGHTX\r
+       LDX CMPLYR\r
+       BEQ 31$\r
+       INY\r
+31$:   STY LEDWD+1\r
+       LDY I,0\r
+       STY TEMP1\r
+       JSR BUTTON              ;LOOK FOR BUTTON PUSH\r
+       BNE 38$                 ;PUSHED IT\r
+       LDY TEMP1\r
+       LDA I,M.PS              ;"PUSH START"\r
+35$:   BIT INTCNT              ;FLASH IT\r
+       BMI 36$\r
+       STY LEDWD+1\r
+       ORA I,80\r
+36$:   JSR REPLAC\r
+37$:   JMP DSPTCH\r
+38$:   LDA I,0                 ;RESET ONE PLAER GAME\r
+       STA PLYR1\r
+       INC PLYR2\r
+       LDA ININGS              ;DECREMENT # OF INNINGS\r
+       SEC\r
+       SED\r
+       SBC I,1\r
+       CLD\r
+       STA ININGS\r
+       BNE DSPTCH              ;ALWAYS\r
+20$:   INC PLYR1               ;INDICATE 1 PLAYER\r
+       TXA\r
+       EOR I,2                 ;COMPUTE PLAYER\r
+       STA CMPLYR\r
+       LDA I,M.RDY             ;TELL HIM "READY"\r
+       JSR REPLAC\r
+40$:   LDA I,<PLAYIT&0FF>-1    ;INIT TPC FOR MOD. CASE 5 MT.\r
+       STA TPC\r
+       LDA I,<PLAYIT&0FF00>/100\r
+       STA TPC+1\r
+       JMP STRTGM              ;DO NECCESSARY INITIALIZATION\r
+\r
+DSPTCH:        BIT STATE               ;WHAT STATE ARE WE IN\r
+       BMI PAUSE               ;S.PAUS=80\r
+       BVS 1$\r
+       JMP SELECT              ;S.SEL=1\r
+1$:    JMP PLAY                ;MUST BE PLAY (S.PLAY=40)\r
+\r
+       .PAGE\r
+       .SBTTL PAUSE STATE CONTROLLER\r
+;BLOCK NAME:   PAUSE\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  PAUSE WILL TIME THE PAUSE TRANSITION STATE BETWEEN PLAY\r
+;              STATE AND SELECT STATE, AND SET STATE SELECT AT TERMINATION\r
+;              IN ADDITION, PAUSE WILL INITIALIZE VARIOUS VARIABLES AND\r
+;              TIMERS, CHANGE FIELDS AT END OF EACH HALF INNING, INIT SCORE\r
+;              BOARD FOR EACH 1/2 INNING, MOVE PLAYERS TO STARTING POSITIONS,\r
+;              HANDLE LAST 1/2 INNING WARNING AND END THE GAME.\r
+;\r
+;INPUT PARAMS: PAUST,OUTS,INNING,ININGS,SCBDL,SCBDRV,SCBDCH,SCBDRH,ATRACT\r
+;OUTPUT PARAMS:        PSTIM,LEDWD,ATRACT,ININGS,SCNDQT,INNINGS,SCBDRV,SCBDLV,\r
+;              SCBDRH,SCBDLH,BEEP,PLAYNO,STATE,MPSTIM\r
+;REGS USED:    A,X,Y\r
+;STACK USAGE:  NONE\r
+;SUBS CALLED:  BANNER,WRITEB,PLYFLD,INIT,SETUP,RAND,SCORBD\r
+;\r
+PAUSE: LDA W30TIM              ;WARNING TIMER RUNNING?\r
+       BEQ 8$\r
+       JMP 10$                 ;YES\r
+8$:    LDY PAUST               ;CHECK PAUSE TIMER\r
+       BNE 2$                  ;TIMED OUT\r
+1$:    JMP 40$\r
+2$:    DEC PAUST               ;RUN IT\r
+       BEQ 4$\r
+       RTS\r
+4$:    LDA I,-1                ;INITIALIZE PLAY SELECT TIMERS\r
+       STA PSTIM\r
+       STA PSTIM+2\r
+       LDA I,0                 ;DOUSE LED'S\r
+       STA LEDWD\r
+       STA LEDWD+2\r
+       LDA I,2\r
+       CMP OUTS                ;3 OUTS?\r
+       BCC 5$                  ;YES\r
+       JMP 44$                 ;NO-NORMAL PROCESSING\r
+5$:    LDA OFFENS              ;YES\r
+       EOR I,2\r
+       STA OFFENS              ;END OF INNING?\r
+       BNE 48$                 ;NO, -1/2 INNING\r
+       BIT ATRACT              ;GAME MODE?\r
+       BPL 49$                 ;NO\r
+       LDA INNING              ;YES\r
+       CMP ININGS\r
+       BNE 20$\r
+       LDA I,M.GO              ;GAME IS OVER\r
+       JSR WRITEB\r
+       LDX I,2\r
+       JSR SCORBD\r
+       LDA I,0                 ;SET TO ATTRACT MODE\r
+       STA ATRACT\r
+       STA ININGS              ;INITIALIZE\r
+       STA PLYR1\r
+       STA PLYR2\r
+       BEQ 42$\r
+20$:   AND I,0F                ;INNING ROLLOVER?\r
+       BNE 25$                 ;NO\r
+       JSR BANNER              ;YES, START AT INING #1\r
+25$:   LDA INNING              ;INCREMENT CURRENT INNING #\r
+       CLC\r
+       SED\r
+       ADC I,1\r
+       CLD\r
+       STA INNING\r
+       LDX I,2\r
+       JSR SCORBD\r
+       INC SCBDLV              ;UPDATE POINTERS\r
+       DEC SCBDRV\r
+       LDA I,1C\r
+       STA RUNING\r
+       BNE 42$                 ;ALWAYS\r
+48$:   BIT ATRACT\r
+49$:   BPL 42$\r
+       LDX I,0\r
+       JSR SCORBD\r
+       INC SCBDLH              ;UPDATE POINTERS\r
+       DEC SCBDRH\r
+       LDA I,1C\r
+       STA RUNING\r
+       LDA INNING\r
+       CMP ININGS              ;LAST 1/2 INNING?\r
+       BNE 42$\r
+       LDA I,90.\r
+       STA W30TIM              ;YES, START WARNING TIMER\r
+       LDA I,M.GAO             ;SUCK COINS!!!! (SHAME ON YOU!!!)\r
+       JMP WRITEB\r
+10$:   LSR                     ;NOT TIMED OUT YET\r
+       BNE 12$\r
+       STA W30TIM              ;TIMED OUT!\r
+       STA BEEP                ;TURN OFF BEEP\r
+       BEQ 42$\r
+12$:   DEC W30TIM              ;TIME\r
+       AND I,2\r
+       BEQ 15$\r
+       LSR\r
+15$:   STA BEEP                ;BEEP EVERY OTHER DECREMENT\r
+       LDA W30TIM              ;1/2 WAY THROUGH TIME?\r
+       CMP I,45.\r
+16$:   BNE 45$                 ;NO\r
+       LDA I,M.ECAT            ;YES, CHANGE MESSAGE\r
+       JMP WRITEB\r
+42$:   JSR PLYFLD              ;CHANGE FIELDS\r
+44$:   JSR INIT\r
+40$:   BIT ATRACT\r
+       BPL 43$\r
+       LDX I,2\r
+       JSR BUTTON\r
+       BNE 47$\r
+       LDX I,0\r
+       JSR BUTTON\r
+       BEQ 43$\r
+47$:   INC SETFLG\r
+43$:   LDX I,BATTER*2          ;LAST PLAYER TO SETUP\r
+       JSR SETUP               ;MOVE PLAYERS\r
+       BNE 45$\r
+46$:   LDX I,2\r
+41$:   JSR RAND                ;START WITH RANDOM PLAY #\r
+       LSR\r
+       LSR\r
+       AND I,3\r
+       STA ZX,PLAYNO\r
+       DEX\r
+       DEX\r
+       BPL 41$\r
+       LDA I,S.SEL\r
+       STA STATE               ;STATE=SELECT\r
+       LDA I,-1\r
+       STA MPSTIM\r
+45$:   RTS\r
+       .PAGE\r
+       .SBTTL SCOREBOARD UPDATE\r
+;BLOCK NAME:   SCORBD\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  UPDATE SCOREBOARD\r
+;INPUT PARAMS: X=0 FOR VISITOR 1 FOR HOME, RUNING\r
+;OUTPUT PARAMS:        SCOREBOARD UPDATED\r
+SCORBD:        LDA RUNING\r
+       STA NX,SCBDRV\r
+       ORA I,40\r
+       STA NX,SCBDLV\r
+       RTS\r
+       .PAGE\r
+       .SBTTL SELECT STATE CONTROLLER\r
+;BLOCK NAME:   SELECT\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  HANDLES THE PLAY SELECTION OR OUTPUTTING OF MESSAGES DURING\r
+;              ATTRACT.  SETS STATE=PLAY\r
+;INPUT PARAMS: PSTIM,ATRACT,PLAYNO\r
+;OUTPUT PARAMS:        PINFO,ANGLE,STATE\r
+;REGS USED:    A,X,Y\r
+;STACK USAGE:  NONE\r
+;SUBS USED:    FIELDR,PSEL,WRITEB,RAND,TELLEM\r
+\r
+SELECT:        JSR FIELDR              ;RESET EVERYTHING\r
+       JSR PSEL                ;CHECK BUTTONS\r
+       LDA PSTIM\r
+       ORA PSTIM+2             ;"OR" OF INDIV TIMERS\r
+       BNE 20$                 ;BRANCH IF STILL WAITING\r
+       STA SETFLG              ;RESET SET FLAG\r
+15$:   LDA I,S.PLAY            ;ELSE ENTER PLAY\r
+       STA STATE\r
+       BIT ATRACT\r
+       BMI 16$\r
+       LDA I,M.ECAT            ;MONEY REQUEST\r
+       JSR WRITEB\r
+       INC 24F                 ;2 COINS/INNING\r
+       INC 3AE\r
+       BNE 18$\r
+16$:   LDA I,M.RDY             ;"READY"\r
+       JSR WRITEB\r
+18$:   JSR RAND\r
+       LSR\r
+       LSR\r
+       AND I,0F                ;SET UP CURVE START\r
+       CLC\r
+       ADC I,STCRV1\r
+       STA PINFO\r
+       LDX OFFENS\r
+       LDA ZX,PLAYNO           ;SET CARRY IF LEFTY\r
+       LSR\r
+       LDA I,81\r
+       BCC 17$\r
+       LDA I,82                ;ADJUST INITIAL ANGLE SLIGHTLY FOR LEFTY\r
+17$:   STA ANGLE\r
+       RTS\r
+20$:   BIT ATRACT\r
+       BMI 25$\r
+       LDA I,M.IC              ;IN ATTRACT, ASK FOR MONEY\r
+       JSR WRITEB\r
+       RTS\r
+25$:   JSR TELLEM              ;IN GAME, REMIND THEM TO SELECT\r
+       RTS\r
+\f      .SBTTL GAME PLAY\r
+;\r
+;BLOCK NAME:   GAME PLAY\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIP:        MAINLINE GAME PLAY ROUTINE\r
+;\r
+PLAY:                          ;DISPLAY STATISTICS\r
+       LDA I,<EXIT&0FF00>/100  ;HIGH BYTE OF EXIT\r
+       LDX I,0\r
+       CMP NX,TPC\r
+       BEQ 1$                  ;EVERYTHING KOSHER\r
+       JMP RESET               ;BADO BADO (SKU-BA-DO-DO??)\r
+1$:    LDA TPC+1               ;SET UP MODIFIED CASE CONSTRUCT\r
+       PHA\r
+       LDA TPC\r
+       PHA\r
+       RTS\r
+       .BYTE <EXIT&0FF00>/100\r
+PLAYIT:        JSR PITCH               ;PITCH BALL\r
+       JSR SWING               ;SWING BAT\r
+       JSR FLITE               ;MOVE BALL\r
+       JSR HITCHK              ;BALL HIT?\r
+       BCC 10$                 ;NO\r
+       LDA I,-1                ;YES\r
+       STA CLK32S\r
+       JMP HIT\r
+10$:   JSR FIELDR              ;MOVE FIELDERS\r
+       JSR CATCH               ;BALL CAUGHT BY CATCHER?\r
+       BCS COUNT               ;YES\r
+       JSR EXIT                ;NO\r
+       JMP PLAYIT              ;CONTINUE\r
+COUNT: LDA CALL                ;CHECK CALL\r
+       BMI 10$                 ;HIT BATSMAN\r
+       BNE STRKBL              ;STRIKE\r
+       LDA I,M.BALL            ;BALL\r
+       JSR WRITEB              ;TELL THEM\r
+       LDA I,48                ;SAY BALL\r
+       STA FLASH\r
+       INC BALLS\r
+       LDA I,4                 ;WALK?\r
+       CMP BALLS\r
+       BEQ 1$\r
+       JMP ENDPLY              ;NO\r
+1$:    LDX OFFENS              ;YES, CORRECT PICTURE ORIENTATION\r
+       LDA ZX,PLAYNO\r
+       LSR                     ;CARRY=LEFTY\r
+       LDA A,MOBJ+<BATTER*2>\r
+       BCC 5$\r
+       EOR I,80                ;CHANGE LEFTY TO RIGHTY\r
+5$:    AND I,0C0\r
+       ORA I,08                ;MAKE RUNNER\r
+       STA A,MOBJ+<BATTER*2>\r
+       LDA I,1                 ;SET BATTER TO DRONE MODE\r
+       STA MOVE\r
+       STA FSTFLD              ;FOOL CKBASE TO STOP HIM AT 1ST\r
+       LDA A,BGOALH+2          ;MOVE BATTER TO FIRST\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA A,BGOALV+2\r
+       STA A,VGOAL+<BATTER*2>\r
+       JSR CKBASE              ;MOVE'EM ALONG\r
+       JSR FORCHK              ;ONLY MOVE OTHER RUNNERS IF FORCED\r
+       JMP WRAP\r
+10$:   LDA I,M.HB              ;HIT BATTER\r
+       JSR WRITEB\r
+       LDA I,3C                ;LET THEM HEAR THE BALL HIT BATTER\r
+       STA THUD\r
+       LDA I,70                ;BUNCH OF SADISTS!!! YOU BETCHA!\r
+       STA CHEER\r
+       JMP 1$                  ;JUST LIKE WALK\r
+STRKBL:        LDA I,M.STRK            ;TELL'EM STRIKE\r
+       JSR WRITEB\r
+       LDA I,40                ;SAY STRIKE\r
+       STA FLASH\r
+STRKB0:        INC STRIKE\r
+       LDA I,3                 ;3 STRIKES?\r
+       CMP STRIKE\r
+       BEQ 10$                 ;YES, BATTER IS OUT!\r
+       JMP ENDPLY\r
+10$:   INC OUTS\r
+       CMP OUTS                ;3 OUTS?\r
+       BNE 20$\r
+       JMP ENDING              ;YES\r
+20$:   LDX I,0                 ;NO- PUT OUT BATTER\r
+       JSR PUTOUT\r
+       INC BATOUT\r
+       LDA I,0                 ;STOP OTHER RUNNERS\r
+       STA MOVE+1\r
+       STA MOVE+2\r
+       STA MOVE+3\r
+       JMP WRAP                ;WRAP UP PLAY\r
+HIT:   LDA FRAME               ;MASTER PLAY TIME -32 SECONDS AFTER BALL HIT\r
+       AND I,3\r
+       BNE 40$\r
+       DEC CLK32S              ;DECREMENT EVERY FOURTH FRAME\r
+       BNE 40$                 ;NOT TIMED OUT\r
+       INC FSTFLD              ;TIMED OUT\r
+       BNE 41$\r
+40$:   LDA FSTFLD              ;BALL BEEN FIELDED ONCE YET?\r
+       BEQ 3$                  ;NO\r
+       LDA BATOUT              ;YES, IS BATTER OUT?\r
+       BEQ 1$                  ;NO\r
+       LDA MOVE+1              ;YES, IS ANYBODY ELSE MOVING?\r
+       ORA MOVE+2\r
+       ORA MOVE+3\r
+       BEQ 6$                  ;NO!\r
+       BNE 3$                  ;YES\r
+1$:    LDX I,BATTER*2          ;IS BATTER ON BASE (OTHER THAN HOME)\r
+       JSR BASCOL\r
+       AND I,0FB\r
+       BEQ 3$                  ;NO\r
+6$:    DEC CLCK2S              ;YES, TIMEOUT PLAY IF HE STAYS THERE 2 SEC.\r
+       BNE 4$\r
+41$:   LDX HASBAL              ;TIMED OUT, WHO HAS BALL\r
+       BEQ 7$                  ;NO ONE\r
+       LDA AX,MOBJ             ;TURN HIS PICTURE ON\r
+       ORA I,0A\r
+       STA AX,MOBJ\r
+7$:    LDA I,0                 ;MAKE SURE NO ONE HAS THE BALL\r
+       STA HASBAL\r
+       LDA I,PITCHER*2         ;MOVE BALL TO PITCHER\r
+       STA TOBALX\r
+2$:    JSR AUTOBL              ;MOVE BALL\r
+       BEQ 9$                  ;BRANCH IF DONE\r
+       JSR EXIT\r
+       JMP 2$                  ;LOOP\r
+3$:    LDA I,55.               ;RESET TIMER\r
+       STA CLCK2S\r
+4$:    JSR BATRUN              ;MOVE BATTER\r
+       JSR FIELDR              ;MOVE FIELDERS\r
+       JSR RUN                 ;MOVE RUNNERS\r
+       JSR INFLD               ;MOVE INFIELDERS\r
+       JSR CKBASE              ;CHECK THE BASES\r
+       JSR SWING               ;SWING BAT REST OF WAY AROUND\r
+       LDA I,FLDFLG            ;BALL FIELDED?\r
+       BIT BALFLG\r
+       BNE FLDPLY              ;YES\r
+       JSR COLCHK              ;NO- TRY TO FIELD IT\r
+       LDA I,3\r
+       CMP OUTS                ;3 OUTS\r
+       BNE 5$\r
+       JMP ENDING              ;YES!\r
+5$:    LDA I,PLYEND            ;PLAY ENDED.\r
+       BIT BALFLG\r
+       BEQ 10$                 ;NO, CONTINUE.\r
+9$:    JMP WRAPUP              ;END OF PLAY\r
+10$:   LDA I,THROFL            ;IS THIS A THROWN BALL?\r
+       BIT BALFLG\r
+       BNE 20$                 ;YES\r
+       JSR FLITE               ;NO- A HIT BALL\r
+       BCC 15$                 ;NOTHING UNUSUAL\r
+       JSR CKBASE\r
+       JMP WRAP                ;HOMER OR TRIPLE\r
+15$:   JSR BOUNCE\r
+       LDA I,FOUL              ;BALL FOUL\r
+       BIT BALFLG\r
+       BEQ 30$                 ;NO\r
+       JMP FOULBL              ;YES\r
+20$:   JSR DEFENS              ;COMPUTER ON DEFENSE\r
+       BCS 22$                 ;YES\r
+       BIT ATRACT\r
+       BMI 25$                 ;GAME MODE\r
+22$:   JSR AUTOBL              ;AUTOMATIC THROWS\r
+       BNE 30$\r
+25$:   JSR BALMOV              ;TRACK BALL THROWS\r
+30$:   JSR EXIT\r
+       JMP HIT\r
+FLDPLY:        LDX HASBAL              ;GET PLAYER WITH BALL\r
+       JSR BASCOL              ;TOUCHING A BASE\r
+       BEQ 42$                 ;NO- NO FORCE POSSIBLE\r
+       STA TEMP1               ;SAVE BASE #\r
+       TAY\r
+       DEY\r
+       BEQ 20$                 ;SPECIAL CASE. FORCE AT FIRST\r
+       LDA FORCE\r
+       LSR                     ;GET RID OF FORCE AT FIRST\r
+5$:    LSR                     ;FORCE SET CARRY\r
+       BCC 40$                 ;NO MORE FORCES\r
+       DEY                     ;FIELDER AT FORCE BASE?\r
+       BNE 5$                  ;NOT YET\r
+       LDX I,3                 ;FORCE OUT POSSIBLE\r
+       LDA TEMP1\r
+       SBC I,1                 ;LOOK FOR PLAYER OUT ON FORCE\r
+10$:   CMP ZX,BASE\r
+       BNE 15$                 ;DON'T HAVE HIM YET\r
+11$:   LDA I,0FF               ;GOT HIM\r
+       LDY TEMP1               ;REMOVE FORCE\r
+12$:   DEY\r
+       BEQ 13$\r
+       ASL\r
+       BNE 12$\r
+13$:   EOR I,0FF\r
+       AND FORCE\r
+       STA FORCE\r
+       JMP 45$\r
+15$:   DEX                     ;NEXT\r
+       BNE 10$                 ;NOT DONE YET\r
+       BEQ TAGCHK              ;DONE\r
+20$:   LDA BATOUT              ;BATTER OUT?\r
+       BNE 40$                 ;YEP\r
+       LDA BASE                ;ON BASE?\r
+       BEQ 25$                 ;NO- HE'S OUT\r
+       BPL TAGCHK              ;YES\r
+25$:   LDA I,1                 ;BATTER IS OUT\r
+       STA BATOUT\r
+       LDX I,0                 ;ZILCH HIM\r
+       BEQ 11$\r
+40$:   LDA FLYOUT              ;FLY BALL OUT?\r
+       BEQ TAGCHK              ;NO\r
+       LDY I,3\r
+       LDA TEMP1\r
+41$:   CMP AY,BASE             ;FORCE OUT?\r
+       BNE 43$                 ;NO\r
+       TYA                     ;GET PLAYER INDEX FOR BASE COLLISION ROUTINE\r
+       CLC\r
+       ADC I,BATTER\r
+       ASL\r
+       TAX\r
+       JSR BASCOL              ;POSSIBLE FORCE, IS HE ON BASE\r
+       BEQ 44$                 ;OUT!\r
+       CMP TEMP1\r
+       BNE 44$                 ;OUT!\r
+42$:   JMP TAGCHK              ;SAFE, CHECK FOR TAG OUT\r
+43$:   DEY\r
+       BNE 41$\r
+       BEQ TAGCHK              ;ALL DONE\r
+44$:   TYA\r
+       TAX\r
+45$:   INC OUTS                ;UPDATE OUTS\r
+       LDA I,3\r
+       CMP OUTS                ;3 OUTS\r
+       BNE 46$                 ;NO\r
+       JMP ENDING              ;YES\r
+46$:   JSR PUTOUT\r
+TAGCHK:        JSR TAG                 ;A TAG POSSIBLE?\r
+       CPX I,0\r
+       BEQ 20$                 ;NO\r
+       JSR BASCOL              ;RUNNER ON BASE?\r
+       BNE 20$                 ;YES\r
+       CPX I,BATTER*2          ;IS IT BATTER?\r
+       BNE 15$                 ;NO\r
+       LDA BASE                ;YES- CHECK FOR OVERRUN\r
+       BEQ 10$                 ;NO, ON BASE- NO OVERRUN\r
+       LDA AX,HPOSH\r
+       CLC\r
+       ADC AX,VPOS\r
+       BCS 10$                 ;NO OVERRUN\r
+       CMP I,0AD\r
+       BCC 20$                 ;OVERRUN\r
+10$:   LDA BATOUT              ;BATTER OUT YET?\r
+       BNE 20$                 ;YES\r
+       INC BATOUT              ;NO\r
+15$:   TXA\r
+       SEC\r
+       SBC I,BATTER*2          ;GET RUNNER #\r
+       LSR\r
+       TAY\r
+       LDA AY,MOVE\r
+       BMI 20$                 ;PLAYER ALREADY OUT\r
+       INC OUTS                ;UPDATEOUT\r
+       LDA I,3\r
+       CMP OUTS\r
+       BNE 18$\r
+       JMP ENDING              ;SIDES RETIRED\r
+18$:   TYA\r
+       TAX\r
+       JSR PUTOUT              ;SEND PLAYER TO DUGOUT & OUTPUT OUT MESSAGE\r
+20$:   JSR THROW\r
+       JSR EXIT\r
+       JMP HIT\r
+WRAPUP:        JSR FORCHK              ;GET EVERYONE'S DIRECTION\r
+       BIT ATRACT\r
+       BPL 4$\r
+       JSR OFENSE              ;COMP ON OFFENSE?\r
+       BCS 4$                  ;YES\r
+       LDA BATOUT              ;BATTER OUT\r
+       BNE 19$         ;YEP, ALL SET UP\r
+       LDA BASE                ;BATTERS BASE\r
+       BEQ 40$                 ;ON WAY TO 1ST\r
+       AND I,03\r
+       BNE 5$\r
+4$:    JMP WRAP                ;SCORED\r
+5$:    STA MOVE                ;SET UP FOR RETURN TO BASE\r
+       TAY                     ;SAVE\r
+       LDX I,BATTER*2          ;BATTER ON A BASE\r
+       JSR BASCOL\r
+       BEQ 10$                 ;NO\r
+       STA MOVE                ;YES- HE STAYS THERE\r
+       BNE 45$\r
+10$:   LDX I,3\r
+       TYA                     ;SOMEONE ELSE ON HIS BASE?\r
+11$:   CMP ZX,BASE\r
+       BEQ 12$                 ;YES\r
+       DEX\r
+       BNE 11$                 ;NOT DONE\r
+       BEQ 15$                 ;NO ONE THERE\r
+12$:   CMP ZX,MOVE             ;IS HE BACKING UP OR STAYING THERE\r
+       BEQ 14$                 ;STAYING, BACK HIM UP\r
+       LDA ZX,MOVE\r
+       BNE 15$                 ;HE'S HEADED SOMEWHERE\r
+14$:   DEC MOVE                ;BACK HIM UP\r
+       JMP 45$\r
+15$:   LSR\r
+       BEQ 20$                 ;ON 1ST\r
+       BCC 18$                 ;2ND OR SCORED\r
+       LDA A,VPOS+<BATTER*2>   ;3RD\r
+       SBC I,0A0               ;1/2 WAY?\r
+       BMI 35$                 ;YES\r
+       BPL 45$                 ;NO\r
+18$:   LSR\r
+19$:   BNE WRAP                ;HE SCORED\r
+       LDA A,VPOS+<BATTER*2>   ;1/2 WAY?\r
+       SBC I,0A2\r
+       BMI 45$                 ;NO\r
+       BPL 35$                 ;YES\r
+20$:   LDA A,VPOS+<BATTER*2>   ;1/2 WAY?\r
+       SBC I,62\r
+       BMI 45$                 ;NO\r
+35$:   INY                     ;WHAT BASE IS HE HEADED TO?\r
+       LDX I,3\r
+36$:   TYA\r
+       CMP ZX,BASE\r
+       BEQ 37$                 ;SOMEONE THERE\r
+       DEX\r
+       BNE 36$\r
+       BEQ 40$                 ;NO ONE THERE\r
+37$:   CMP ZX,MOVE\r
+       BEQ 45$                 ;BACKING UP TO IT\r
+       LDA ZX,MOVE\r
+       BEQ 45$                 ;STAYING THERE\r
+40$:   INC MOVE\r
+45$:   LDA MOVE                ;SET UP GOALS\r
+       AND I,0F\r
+       ASL\r
+       TAX\r
+       LDA AX,BGOALH\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA AX,BGOALV\r
+       STA A,VGOAL+<BATTER*2>\r
+       LDA MOVE                ;SET UP PICTURE\r
+       LSR\r
+       LSR                     ;CARRY SET FOR 2ND & 3RD\r
+       LDA I,0C8\r
+       BCC 50$\r
+       EOR I,80\r
+50$:   LDY OFFENS\r
+       BEQ 51$\r
+       EOR I,0C0\r
+51$:   STA A,MOBJ+<BATTER*2>\r
+WRAP:  JSR RUN                 ;MOVE RUNNERS\r
+       JSR CKBASE              ;CHECK POSITIONS\r
+       LDA FSTFLD              ;BALL FIELDED ONE YET?\r
+       BNE 10$                 ;YES\r
+       LDA HOMRUN              ;NO, IS THIS HOMERUN OR TRIPLE?\r
+       BEQ 10$                 ;NEITHER, BRANCH\r
+5$:    BIT MOVE\r
+       BMI 10$                 ;BATTER SCORED\r
+       BIT INTCNT              ;FLASH SCORE BOARD\r
+       BVS 7$\r
+       LDA I,80\r
+       BNE 8$                  ;ALWAYS\r
+7$:    LDA I,0\r
+8$:    STA FLASH\r
+9$:    BIT HOMRUN\r
+       BPL 10$                 ;HOMERUN\r
+       LDA I,4                 ;TRIPLE, WAIT FOR BATTER TO GET TO 3RD\r
+       CMP MOVE\r
+       BNE 20$                 ;NOT THERE YET\r
+       LDA I,0                 ;GOT THERE, STOP HIM THERE\r
+       STA MOVE\r
+       INC FSTFLD              ;MAKE IT LOOK LIKE BALL FIELDED\r
+10$:   LDA MOVE+1              ;HAVE ALL RUNNERS STOPPED MOVING?\r
+       ORA MOVE+2\r
+       ORA MOVE+3\r
+       ORA MOVE\r
+       BNE 20$                 ;NOT YET\r
+       LDA I,7F                ;THEY'VE ALL STOPPED\r
+       AND FLASH               ;TURN SCOREBOARD BACK TO NORMAL\r
+       STA FLASH\r
+       LDA I,0         ;RESET COUNTS\r
+       STA BALLS\r
+       STA STRIKE\r
+       BEQ BASES\r
+20$:   JSR EXIT\r
+       JMP WRAP\r
+FOULBL:        LDA I,M.FOUL            ;INIDICATE FOUL\r
+       JSR WRITEB\r
+       LDA I,50                ;SAY FOUL\r
+       STA FLASH\r
+       LDX OFFENS\r
+       LDA ZX,PLAYNO           ;IF BUNT, TREAT AS STRIKE\r
+       LSR\r
+       LSR\r
+       BCC 10$                 ;NO BUNT\r
+5$:    JMP STRKB0\r
+10$:   LDA I,2\r
+       CMP STRIKE\r
+       BNE 5$                  ;LESS THAN 2 STRIKES\r
+F.END: JMP ENDPLY\r
+BASES: LDX I,0\r
+       LDY I,3\r
+       LDA BASE                ;CHECK FOR 2 RUNNERS ON A BASE\r
+       BEQ 30$\r
+10$:   CMP AY,BASE\r
+       BNE 20$                 ;NO, GET NEXT\r
+       INC OUTS                ;UPDATE OUTS\r
+       JSR PUTOUT              ;SEND BATTER TO DUGOUT\r
+       LDA I,3\r
+       CMP OUTS\r
+       BEQ ENDING              ;3 OUTS!!\r
+       JMP WRAP                ;LESS THAN 3 OUTS\r
+20$:   DEY\r
+       BNE 10$                 ;NOT DONE CHECKING\r
+30$:   LDA I,3\r
+       CMP OUTS\r
+       BEQ ENDING              ;SIDE RETIRED\r
+       LDA BASE\r
+       AND I,3                 ;WHAT BASE IS BATTER ON?\r
+       BEQ F.END               ;DIDN'T MAKE A BASE\r
+       LDY I,3\r
+       LDX I,<BATTER+3>*2      ;LOOK FOR IDLE RUNNER\r
+40$:   LDA AY,BASE\r
+       BNE 45$\r
+       LDA A,MOBJ+<BATTER*2>   ;CHANGE PLACES\r
+       STA AX,MOBJ\r
+       LDA A,HPOSH+<BATTER*2>\r
+       STA AX,HPOSH\r
+       LDA A,VPOS+<BATTER*2>\r
+       STA AX,VPOS\r
+       LDA I,HDUGO             ;PUT BATTER IN DUGOUT\r
+       STA A,HPOSH+<BATTER*2>\r
+       LDA I,VDUGO\r
+       STA A,VPOS+<BATTER*2>\r
+       LDA BASE\r
+       STA AY,BASE\r
+       BNE ENDPLY              ;*** ALWAYS\r
+45$:   DEX\r
+       DEX\r
+       DEY\r
+       BNE 40$\r
+       JMP RESET               ;BADO-BADO\r
+ENDING:        LDA I,M.SR              ;SIDE RETIRED\r
+       BIT ATRACT              ; IN ATTRACT?\r
+       BMI 1$                  ; NO\r
+       LDA I,M.AB              ;YES, OUTPUT "ATARI BASEBALL"\r
+1$:    JSR WRITEB\r
+       LDA I,58                ;SAY "YER OUT!!"\r
+       STA FLASH\r
+       LDA I,90                ;BIG CHEER\r
+       STA CHEER\r
+       LDX OFFENS              ;BACK OUT BAD RUNS              ;FROM TOTAL\r
+       LDA ZX,RUNS\r
+       SEC\r
+       SED\r
+       SBC RUNPLY\r
+       CLD\r
+       STA ZX,RUNS\r
+5$:\r
+       LDA RUNING\r
+       SEC\r
+       SBC RUNPLY\r
+       STA RUNING\r
+9$:    LDX I,PITCHER*2         ;MOVE PLAYERS OFF OF FIELD\r
+10$:   LDA I,HDUGD\r
+       STA AX,HGOAL\r
+       LDA I,VDUGD\r
+       STA AX,VGOAL\r
+       INX\r
+       INX\r
+       CPX I,BATTER*2          ;NOW OFFENSE\r
+       BNE 10$\r
+20$:   LDA I,HDUGO\r
+       STA AX,HGOAL\r
+       LDA I,VDUGO\r
+       STA AX,VGOAL\r
+       LDY OFFENS              ;MAKE SURE RUNNERS ARE FACING RIGHT WAY\r
+       BNE 23$\r
+       LDA I,48\r
+       BNE 25$\r
+23$:   LDA I,88\r
+25$:   STA AX,MOBJ\r
+       CPX I,<BATTER+3>*2\r
+       BEQ 30$\r
+       INX\r
+       INX\r
+       BNE 20$                 ;ALWAYS\r
+30$:   LDX I,<BATTER+3>*2\r
+       JSR SETUP               ;MOVE PLAYERS AT FAST SPEED\r
+       BEQ ENDPLY              ;DONE\r
+       JSR EXIT\r
+       JMP 30$\r
+ENDPLY:        LDA I,S.PAUSE           ;CHANGE STATE\r
+       STA STATE\r
+       LDA I,18                ;SET PAUSE TIMER\r
+       STA PAUST\r
+       JSR EXIT\r
+       JMP PLAYIT\r
+EXIT:  JSR DSTAT\r
+       PLA                     ;SET UP FOR MODIFIED CASE\r
+       STA TPC\r
+       PLA\r
+       STA TPC+1\r
+       RTS\r
+CKS1:  .BYTE 32\r
+       .PAGE\r
+       .SBTTL PITCH ROUTINE\r
+;\r
+;BLOCK NAME:   PITCH\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  PITCH WILL CONROL THE MOTION OF THE BALL TOWARDS THE PLATE\r
+;              BASED ON THE VALUE PTYPE (PLAYNO)\r
+;              WHERE PTYPE:\r
+;                      0 = FAST BALL\r
+;                      1 = CHANGE UP\r
+;                      2 = CURVE BALL\r
+;                      3 = KNUCKLE BALL\r
+;\r
+;INPUT PARAMS: NONE (PTYPE IS GLOBAL)\r
+;OUTPUT PARAMS:        SPEED & ANGLE UPDATED\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE:  2 BYTES\r
+;SUBROUTINES\r
+;      CALLED: RAND\r
+;\r
+PITCH: LDA OFFENS              ;GET DEFENCE PITCH TYPE\r
+       EOR I,2                 ;DEFENSE PLAYER\r
+       TAX\r
+       LDA ZX,PLAYNO\r
+       ASL                     ;*2\r
+       TAY\r
+       LDA AY,PTAB+1           ;HI BYTE OF CASE STATEMENT\r
+       PHA\r
+       LDA AY,PTAB             ;LOW BYTE OF CASE STATEMENT\r
+       PHA\r
+       RTS\r
+PTAB:  .WORD P.FB-1,P.CU-1,P.CB-1,P.KB-1\r
+P.FB:  LDA I,FBSPD             ;SET FAST BALL SPEED\r
+       STA SPEED\r
+       RTS\r
+P.CU:  LDA A,BHPOSH\r
+       CMP I,5D\r
+       BNE 2$\r
+       LDA I,FBSPD             ;SET CHANGE UP START SPEED\r
+       STA SPEED\r
+       BNE P.RET0\r
+2$:    LDA PINFO               ;SLOW BALL DOWN YET?\r
+       CMP A,BHPOSH\r
+       BCC P.RET0              ;NO\r
+       LDA I,CHUSPD            ;YES\r
+       STA SPEED\r
+P.RET0:        RTS\r
+\r
+P.CB:  LDA I,CRVSPD            ;SET CURVE BALL SPEED\r
+       STA SPEED\r
+       LDA PINFO               ;START BALL CURVING?\r
+       CMP A,BHPOSH\r
+       BCC P.RET0              ;NO\r
+       LDX OFFENS              ;YES, CURVE WHICH WAY?\r
+       LDA ZX,PLAYNO\r
+       LSR                     ;CARRY SET=LEFTY AT BAT\r
+       BCS 10$                 ;LEFTY\r
+       INC ANGLE               ;CURVE BALL AWAY FROM RIGHTY\r
+       BNE P.RET0\r
+10$:   DEC ANGLE\r
+       BNE P.RET0\r
+P.KB:  LDA I,KBSPD             ;SET KNUCKLE BALL SPEED\r
+       STA SPEED\r
+       JSR RAND                ;GET RANDOM NUMBER\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LDY I,0                 ;COUNT # OF 1'S IN 2 LSB'S\r
+       ROR\r
+       BCC 1$\r
+       INY\r
+1$:    ROR\r
+       BCC 2$\r
+       INY\r
+2$:    TYA                     ;HAVE WEIGHTED RANDOM # (0-2)\r
+       ROR\r
+       BCS 6$                  ;BALL GOES STRAIGHT\r
+       ROR\r
+       BCS 4$                  ;BALL GOES LEFT\r
+       BIT BALFLG              ;BALL GOES RIGHT\r
+       BMI P.RET               ;BALL ALREADY GOING RIGHT\r
+       LDA I,ANGL45            ;45 DEGREES\r
+       BVC 3$                  ;IF BALL GOING STRAIGHT\r
+       ASL                     ;MAKE IT 90 DEG\r
+3$:    ADC ANGLE               ;CHANGE ANGLE TO GO RIGHT\r
+       STA ANGLE\r
+       LDA BALFLG              ;SET GOING RIGHT FLAG\r
+       AND I,3F\r
+       ORA I,KBRFLG\r
+       STA BALFLG\r
+       RTS\r
+4$:    BIT BALFLG\r
+       BVS P.RET               ;BALL ALREADY GOING LEFT\r
+       LDA ANGLE\r
+       SBC I,ANGL45\r
+       BIT BALFLG\r
+       BPL 5$                  ;HAD BEEN GOING STR\r
+       SEC\r
+       SBC I,ANGL45\r
+5$:    STA ANGLE\r
+       LDA BALFLG\r
+       AND I,3F\r
+       ORA I,KBLFLG\r
+       STA BALFLG\r
+       RTS\r
+\r
+6$:    LDA ANGLE               ;CORRECT ANGLE\r
+       BIT BALFLG\r
+       BMI 7$                  ;BALL GOING RIGHT\r
+       BVC P.RET               ;BALL GOING STRAIGHT - RETURN\r
+       CLC                     ;BALL GOING LEFT - STRAIGHTEN\r
+       ADC I,ANGL45\r
+       JMP 8$\r
+7$:    SBC I,ANGL45\r
+8$:    STA ANGLE\r
+       LDA BALFLG              ;SET BALL GOING STRAIGHT\r
+       AND I,3F\r
+       STA BALFLG\r
+P.RET: RTS\r
+       .PAGE\r
+       .SBTTL HIT CHECK\r
+;\r
+;BLOCK NAME:   HITCHK\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  HITCHK WILL DETERMINE COLLISION BETWEEN BALL AND BAT AND THEN\r
+;              SET UP THE SPEED AND ANGLE FOR THE BALL BASED ON THE SPEED OF\r
+;              THE PITCH, THE SPEED OF THE BAT AND THE BALL POSITION AT TIME\r
+;              OF COLLISION.\r
+;\r
+;INPUT PARAMS: THRESHOLD TABLE (THRSHD), BALL POSITION (BHPOS,BVPOS) AND BAT\r
+;              STAMP #.\r
+;OUTPUT PARAMS:        NEW VALUES FOR SPEED AND ANGLE\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE:  NONE\r
+;\r
+HITCHK:        LDA BSTMP               ;GET CURRENT BAT STAMP #\r
+       AND I,0F\r
+       ASL                     ;*4\r
+       ASL\r
+       TAY                     ;USE AS INDEX TO THRESHOLD TBL\r
+       LDX OFFENS\r
+       LDA ZX,PLAYNO\r
+       LSR\r
+       LDA I,0\r
+       BCC 50$                 ;IF RIGHTY BRANCH\r
+       LDA AY,THRSHD+1\r
+       SBC I,7E                ;LEFT JUSTIFY VERTICAL COLLISION TBL\r
+50$:   STA TEMP1\r
+       LDA AY,THRSHD           ;CHECK BALL INSIDE OR OUTSIDE\r
+       SEC\r
+       SBC TEMP1\r
+       CMP A,BVPOS\r
+       BCC 3$                  ;BALL INSIDE OR OUTSIDE\r
+       LDA AY,THRSHD+1\r
+       SBC TEMP1\r
+       CMP A,BVPOS\r
+       BCS 3$                  ;BALL INSIDE OR OUTSIDE\r
+       LDA A,BHPOSH            ;BALL HORIZ POS\r
+       CMP AY,THRSHD+2         ;(RIGHT HAND HORIZ THRESHOLD)\r
+       BCS 3$                  ;NOT THERE YET (OR TOO FAR)\r
+       CMP AY,THRSHD+3         ;(LEFT HAND HORIZ THRESHOLD)\r
+       BCS 5$\r
+3$:    CLC\r
+       RTS\r
+5$:    LDA I,40                ;CRACK OF BAT\r
+       STA CRACK\r
+       LDA I,0C8\r
+       LDX OFFENS\r
+       BEQ 6$\r
+       LDA I,08\r
+6$:    STA A,MOBJ+<BATTER*2>\r
+;CALCULATE ANGLE OF BALL TRAVEL\r
+       JSR RAND\r
+       LSR\r
+       AND I,7\r
+       STA TEMP1\r
+       LDA BSTMP\r
+       AND I,0F\r
+       TAY\r
+       LDX OFFENS\r
+       LDA ZX,PLAYNO\r
+       LSR\r
+       LDA AY,BATNGL\r
+       BCC 7$                  ;IF RIGHT, BR\r
+       EOR I,0FF               ;NEGATE ANGLE\r
+       ADC I,0\r
+7$:    LDY OFFENS\r
+       BEQ 1$\r
+       EOR I,80                ;COMPLIMENT ANGLE\r
+1$:    SEC\r
+       SBC TEMP1\r
+       ASL                     ;DOUBLE\r
+       SEC\r
+       SBC ANGLE               ;ANGLE INC=ANGLE REFLECT\r
+       STA ANGLE\r
+       BMI 15$                 ;WHICH OUTFIELDER GETS BALL\r
+       SEC\r
+       SBC I,8\r
+       BMI 18$\r
+       LDA I,7*2               ;LEFT\r
+       BNE 19$\r
+15$:   CLC\r
+       ADC I,0B\r
+       BPL 18$\r
+       LDA I,9*2               ;RIGHT\r
+       BNE 19$\r
+18$:   LDA I,8*2               ;CENTER\r
+19$:   STA FLDBAL\r
+       LDA A,BGOALH+2          ;SET BATTER'S GOALS TO FIRST BASE\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA A,BGOALV+2\r
+       STA A,VGOAL+<BATTER*2>\r
+       LDX I,SSTOP*2           ;START WITH PITCHER\r
+21$:   LDA AX,IVGOAL           ;SET UP GOALS FOR INFIELDERS\r
+       STA AX,VGOAL\r
+       LDA AX,IHGOAL\r
+       STA AX,HGOAL\r
+       DEX\r
+       DEX\r
+       BNE 21$\r
+;DETERMINE WHICH INFIELDER GETS BALL\r
+       LDX OFFENS\r
+       LDY I,1                 ;START WITH PITCHER\r
+       LDA ZX,PLAYNO\r
+       LSR\r
+       LSR\r
+       BCS 20$                 ;BRANCH IF BUNT - BALL GOES TO PITCHER\r
+       INY\r
+       INY                     ;SKIP CATCHER\r
+       LDA ANGLE               ;DETERMINE QUADRANT\r
+       BPL 10$                 ;LEFT SIDE\r
+       ADC I,14\r
+       BMI 20$                 ;1ST BASEMAN'S BALL\r
+       INY\r
+       BNE 20$                 ;SECOND BASEMAN'S BALL\r
+10$:   INY\r
+       INY\r
+       SBC I,13\r
+       BPL 20$                 ;3RD BASEMAN\r
+       INY                     ;SHORT STOP\r
+20$:   TYA\r
+       ASL                     ;MAKE INDEX\r
+       STA TOBALL\r
+       .REPT 0\r
+       CMP I,<FIRSTB*2>\r
+       BNE 25$\r
+       LDA A,IVGOAL+<FIRSTB*2> ;MOVE PITCHER TO COVER FIRST\r
+       SBC I,4                 ;OFFSET A LITTLE\r
+       STA A,VGOAL+<PITCHER*2>\r
+       LDA A,IHGOAL+<FIRSTB*2>\r
+       SBC I,4\r
+       STA A,HGOAL+<PITCHER*2>\r
+       BNE 30$\r
+       .ENDR\r
+25$:   CMP I,<THIRDB*2>        ;THIRD BASEMAN'S BALL?\r
+       BNE 30$                 ;NO\r
+       LDA A,IVGOAL+<THIRDB*2> ;YES, SHORT STOP COVERS 3RD\r
+       ADC I,4                 ;OFFSET A LITTLE\r
+       STA A,VGOAL+<SSTOP*2>\r
+       LDA A,IHGOAL+<THIRDB*2>\r
+       ADC I,4\r
+       STA A,HGOAL+<SSTOP*2>\r
+;DETERMINE WHERE TO INTERCEPT BALL\r
+30$:   LDA TOBALL\r
+       LSR\r
+       LSR\r
+       BEQ H.40                        ;IF PITCHER, DON'T DO ANYTHING\r
+       BCC 32$                 ;2ND BASEMAN OR SHORT STOP\r
+       LDA I,60                ;1ST OR  3RD BASEMAN\r
+       BNE 33$\r
+32$:   LDA I,80\r
+33$:   STA IJ                  ;SAVE DISTANCE\r
+       LDA ANGLE\r
+       JSR COS                 ;COSINE OF ANGLE\r
+       LDX IJ\r
+       JSR MULT                ;GET HORIZONTAL GOAL\r
+       LDX TOBALL              ;INDEX TO PLAYER\r
+       TYA\r
+       ASL\r
+       ADC A,BHPOSH            ;NORMALIZE\r
+       STA AX,HGOAL            ;SET UP HORIZ GOAL\r
+       LDA ANGLE\r
+       JSR SIN\r
+       LDX IJ\r
+       JSR MULT                ;GET VERTICAL GOAL\r
+       LDX TOBALL              ;INDEX\r
+       TYA\r
+       ASL\r
+       EOR I,80                ;OFFSET FROM CENTER\r
+       STA TEMP1\r
+       LDA BVPOS\r
+       SEC\r
+       SBC I,84\r
+       ADC TEMP1\r
+       STA AX,VGOAL            ;SET UP VERTICAL GOAL\r
+;CALCULATE NEW BALL SPEED\r
+       LDX OFFENS              ;REFRESH OFFENSE INDEX\r
+H.40:  LDY ZX,PLAYNO           ;GET SWING SPEED\r
+       TXA\r
+       EOR I,2                 ;DEFENSE\r
+       TAX\r
+       TYA                     ;SWING SPEED\r
+       AND I,2\r
+       ASL\r
+       CLC\r
+       ADC ZX,PLAYNO           ;ADD IN PITCH\r
+       TAX\r
+       LDA AX,SPDTBL           ;GET BALL SPEED\r
+       STA SPEED\r
+H.RET: LDA I,HITFLG\r
+       ORA BALFLG\r
+       STA BALFLG\r
+       INC INSPDX              ;INCREASE INFIELDER CAPABILITY\r
+       SEC                     ;INDICATE HIT\r
+       RTS\r
+       .PAGE\r
+       .SBTTL SWING ROUTINE\r
+;\r
+;BLOCK NAME:   SWING\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  SWING WILL CONTROL THE MOTION OBJECT STAMP WHICH REPRESENTS\r
+;              THE BAT BASED ON THE VALUE OF STYPE (PLAYNO).\r
+;              WHERE STYPE:\r
+;                      0 = FAST SWING\r
+;                      1 = SLOW SWING\r
+;                      2 = HIT & RUN\r
+;                      3 = BUNT\r
+;\r
+;INPUT PARAMS: NONE (STYPE IS GLOBAL)\r
+;OUTPUT PARAMS:        BAT STAMP MODIFIED (MAYBE)\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE:  2 BYTES\r
+;SUBRT'S CALLED:BUTTON\r
+;\r
+SWING: LDA SSTART              ;SWING STARTED\r
+       BMI 20$\r
+       BNE S.DOIT              ;YES, SKIP THIS CRAP\r
+       LDX OFFENS\r
+       JSR OFENSE              ;COMPUTER AT BAT?\r
+       BCS 10$                 ;YES\r
+       BIT ATRACT              ;ATTRACT MODE\r
+       BMI 30$                 ;NO\r
+10$:   JSR RAND                ;GET RANDOM VALUE\r
+       AND I,0F\r
+       STA IJ\r
+       LDA I,STCRV1\r
+       SBC IJ                  ;NOW HAVE RANDOM BALL POSITION TO START SWING\r
+       CMP A,BHPOSH            ;START IT YET?\r
+       BCC S.RET               ;NO\r
+       TXA                     ;YES\r
+       EOR I,2\r
+       TAY\r
+       LDA AY,PLAYNO           ;TAKE OCCASIONALLY ON K.B.\r
+       EOR I,3\r
+       BNE 12$\r
+       LDA INTCNT\r
+       BPL 12$\r
+       STA SSTART\r
+20$:   BMI S.RET\r
+12$:   JSR RAND\r
+       AND I,3\r
+       BEQ 40$\r
+       LDA ZX,PLAYNO\r
+       AND I,0FD\r
+       STA ZX,PLAYNO           ;DON'T BUNT SO MUCH\r
+       JMP 40$\r
+30$:   JSR BUTTON\r
+       BEQ S.RET               ;SWING BUTTON NOT PUSHED YET\r
+40$:   INC SSTART              ;START SWING\r
+       LDA ZX,PLAYNO           ;BUNT OR SWING AWAY?\r
+       AND I,2\r
+       BNE S.BUNT\r
+\r
+S.FS:  LDA I,FSLAST            ;LAST STAMP\r
+       STA TMASK\r
+       BNE S.DOIT              ;***ALWAYS\r
+S.BUNT:        LDA I,BLAST             ;LAST STAMP\r
+       STA TMASK\r
+S.DOIT:        LDA BSTMP               ;GET CURRENT BAT STAMP\r
+       BEQ S.RET\r
+       TAY\r
+       AND TMASK               ;LAST STAMP?\r
+       CMP TMASK\r
+       BEQ 6$                  ;YES, JUST RETURN\r
+       INY                     ;NEXT STAMP\r
+       TYA\r
+       AND I,0F                ;CHANGE STAMP POS YET?\r
+       CMP I,7\r
+       BNE 4$                  ;NO, SKIP CRAP\r
+       LDA BTHPOS              ;GE CURRENT BAT POSITION\r
+       STA TEMP1\r
+       LDA I,0FF               ;MOWE BAT OFF SCREEN\r
+       STA BTHPOS\r
+       STY BSTMP               ;UPDATE STAMP #\r
+       LDA TEMP1               ;INCREMENT BAT POSITION BY 8\r
+       CLC\r
+       ADC I,8\r
+       STA BTHPOS\r
+       BNE S.RET                       ;***ALWAYS\r
+4$:    STY BSTMP\r
+       BNE S.RET               ;*** ALWAYS\r
+6$:    LDX I,0                 ;ZERO OUT BPOS\r
+       LDA I,HITFLG\r
+       BIT BALFLG              ;HE HASNT HIT IT YET\r
+       BEQ S.RET\r
+       STX BSTMP               ;GET RID OF BAT\r
+S.RET: RTS\r
+CKS2:  .BYTE 95\r
+\f      .SBTTL FLITE ROUTINE\r
+;\r
+;BLOCK NAME:   FLITE\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  THIS SECTION OF CODE WILL CONTROL THE ACTUAL POSITION UPDATING\r
+;              OF THE BALL USING SPEED, ANGLE AND UPDATE ANGLE ON A WALL\r
+;              BOUNCE.\r
+;INPUT PARAMS: ANGLE, SPEED\r
+;OUTPUT PARAMS:        MOTION OBJECT 0'S POSITION IS UPDATED\r
+;      CARRY IS SET FOR HOMERUN OR TRIPLE.  HOMRUN = POSITIVE FOR\r
+;      TRIPLE ZERO OTHERWISE\r
+;REGISTER USED:\r
+;SUBROUTINES\r
+;      CALLED: MULT, SINE, COS, SHIFT, LSHIFT\r
+;STACK USAGE:  2 BYTES FOR SUBROUTINE CALLS\r
+;\r
+FLITE: LDA SPEED\r
+       BEQ 1$\r
+       AND I,0FC\r
+       BNE 2$\r
+1$:    CLC             ;BALL STOPPED OR CAUGHT\r
+       RTS\r
+2$:    LDA ANGLE               ;COSINE OF ANGLE\r
+       JSR COS\r
+       TAY                     ;SAVE COS\r
+       LDA SPEED\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       TAX                     ;SET UP FOR MULT\r
+       TYA\r
+       JSR MULT                ;GIVES HORIZ INCREMENT\r
+       LDA A,BHPOSL            ;SHIFT CURRENT HORIZ POS RIGHT 1 BIT\r
+       STA TEMP1\r
+       LDA A,BHPOSH\r
+       STA TEMP2\r
+       JSR SHIFT1\r
+       AND I,7F                ;GET RID OF ANY SIGN\r
+       STA A,BHPOSH\r
+       TXA                     ;GET LSB OF HORIZ INC\r
+       CLC\r
+       ADC TEMP1               ;INCREMENT\r
+       STA TEMP1\r
+       TYA\r
+       ADC A,BHPOSH\r
+       PHP                     ;SAVE MINUS FLAG TO SEE IF BOUNCED\r
+       JSR LSHFT1\r
+       STA A,BHPOSH            ;NEW HORIZ POS\r
+       LDA TEMP1\r
+       STA A,BHPOSL\r
+       PLP\r
+       BMI 5$                  ;BOUNCE\r
+       LDA A,BHPOSH\r
+       JSR BCHECK\r
+       BCC 10$\r
+5$:    LDA TEMP2\r
+       STA A,BHPOSH\r
+       LDA I,NGL180            ;BOUNCE CHANGE ANGLE\r
+       SEC\r
+       SBC ANGLE\r
+       STA ANGLE\r
+       LDA I,1                 ;INDICATE BOUNCE\r
+       BNE 11$\r
+10$:   LDA I,0                 ;NO BOUNCE\r
+11$:   STA IJ                  ;SAVE\r
+       LDA ANGLE               ;SINE OF ANGLE\r
+       JSR SIN\r
+       TAY                     ;SAVE SW\r
+       LDA SPEED\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       TAX                     ;SET UP FOR MULT\r
+       TYA\r
+       JSR MULT\r
+       LDA A,BVPOSL            ;SHIFT CURRENT VERT POS RIGHT\r
+       STA TEMP1\r
+       LDA A,BVPOS\r
+       STA TEMP2\r
+       JSR SHIFT1\r
+       AND I,7F                ;GET RID OF PROPOGATED SIGN\r
+       STA A,BVPOS\r
+       TXA                     ;GET LSB OF SINE X SPEED\r
+       CLC\r
+       ADC TEMP1               ;ADD LSB OF SHIFTED VERT POS\r
+       STA TEMP1\r
+       TYA\r
+       ADC A,BVPOS             ;ADD MSB'S\r
+       PHP                     ;SAVE MINUS FLAG FOR BOUNCE\r
+       JSR LSHFT1              ;NEW BALL VERT POS\r
+       STA A,BVPOS\r
+       LDA TEMP1\r
+       STA A,BVPOSL\r
+       PLP                     ;RETURN OLD STATUS\r
+       BMI 15$                 ;BOUNCE\r
+       LDA A,BVPOS\r
+       JSR BVCHEK\r
+       BCC 16$                 ;NO BOUNCE\r
+15$:   LDA TEMP2\r
+       STA A,BVPOS\r
+       LDA I,0                 ;TAKE NEGATIVE OF ANGLE\r
+       SEC\r
+       SBC ANGLE\r
+       STA ANGLE\r
+       LDA I,1                 ;INDICATE BOUNCE\r
+       BNE 17$\r
+16$:   LDA I,0\r
+17$:   ORA IJ\r
+       BEQ SP.RET              ;NO BOUNCE\r
+       JSR FOULCK\r
+       BCS SP.FOUL             ;FOUL BALL\r
+       LDA FAIR\r
+       BNE SP.RET\r
+       INC FAIR\r
+       LSR SPEED\r
+       LDA A,BVPOS             ;GET BALL\r
+       SBC I,84\r
+       BPL 30$                 ;CENTER OF FIELD\r
+       CLC                     ;ABS VALUE\r
+       EOR I,0FF\r
+       ADC I,1\r
+30$:   CMP I,17\r
+       BCS 35$                 ;NOT HOMER\r
+       INC HOMRUN              ;HOMER\r
+       LDA I,240.\r
+       STA CHEER\r
+       LDA I,M.HR\r
+       BNE SPECL\r
+35$:   SBC I,50\r
+       CMP I,19\r
+       BCS SP.RET\r
+       LDA MISSED              ;MISSED A BASE\r
+       BNE SP.RET\r
+       LDA I,0F0               ;INDICATE TRIPLE\r
+       STA HOMRUN\r
+       LDA I,0A0\r
+       STA CHEER\r
+       LDA I,M.TRPL\r
+SPECL: JSR WRITEB\r
+       LDA I,0\r
+       STA SPEED\r
+       STA A,MOBJ+1C           ;ZILCH BALL OVER FENCE\r
+       BIT ATRACT              ;GAME MODE?\r
+       BPL 10$                 ;NO, ATRACT MODE\r
+       LDX BASE                ;YES, TURN RUNNER TO DRONE\r
+       INX\r
+       STX MOVE\r
+       TXA\r
+       ASL\r
+       TAX\r
+       LDA AX,BGOALH\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA AX,BGOALV\r
+       STA A,VGOAL+<BATTER*2>\r
+10$:   SEC\r
+       RTS\r
+SP.FOUL:LDA I,FOUL\r
+       ORA BALFLG              ;ELSE SET FOUL\r
+       STA BALFLG\r
+SP.RET:        CLC                     ;NOTHING UNTOWARD\r
+       RTS                     ;ALL DONE\r
+       .PAGE\r
+       .SBTTL CATCH ROUTINE\r
+;\r
+;BLOCK NAME:   CATCH\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  CATCH WILL DETERMINE IF THE BALL HAS PASSED THE BATTER \r
+;              SUFFICIENTLY TO BE CAUGHT BY THE CATCHER.  IN THE FUTURE\r
+;              IT WILL ALSO DETERMINE A BALL, STRIKE, WP OR HB.  IN THE\r
+;              THE CASE OF A CATCH, IT SETS THE CATCH FLAG.\r
+;\r
+;INPUT PARAMS: CATCHER POSITION AND BALL POSITION\r
+;OUTPUT PARAMS:        CARRY SET AND SPEED IF CATCH\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE   NONE\r
+CATCH: LDA A,HPOSH+<CATCHER*2>\r
+       SEC\r
+       SBC A,BHPOSH            ;HORIZONTAL POXIMITY TO CATCHER\r
+       BMI 2$                  ;PAST CATER\r
+       CMP I,-PROX             ;BALL CLOSE ENOUGH?\r
+       BCS 6$                  ;NO - CHECK BALL OR STRIKE\r
+       BCC 3$\r
+2$:    CMP I,PROX\r
+       BCC 10$\r
+3$:    LDA A,VPOS+<CATCHER*2>\r
+       SEC\r
+       SBC A,BVPOS\r
+       BCC 5$                  ;IF NEG, DON'T NEGATE\r
+       EOR I,0FF\r
+       ADC I,0\r
+5$:    CMP I,PROX\r
+       BCC C.RET               ;NOT WILD PITCH TILL PAST CATCHER\r
+6$:    LDA I,0CC               ;CATCH SOUND\r
+       STA THUD\r
+       SEC\r
+       RTS\r
+;\r
+;MOVE CATCHER, CHECK FOR BALLS & STRIKES\r
+;\r
+10$:   LDA SSTART\r
+       BEQ 20$\r
+       BMI 20$\r
+       LDA I,1                 ;ITS A STRIKE\r
+       STA CALL                ;MOVE CATCHER\r
+20$:   LDA OFFENS              ;GET DEFENSE\r
+       EOR I,2\r
+       TAX\r
+       LDA ZX,PLAYNO\r
+       ASL\r
+       TAY\r
+       LDA AY,CTAB+1           ;DO CASE\r
+       PHA\r
+       LDA AY,CTAB\r
+       PHA\r
+       RTS\r
+CTAB:  .WORD C.STRK-1,C.STRK-1,C.CURV-1,C.KB-1\r
+C.KB:  LDA A,BHPOSH\r
+       SBC I,22\r
+       BPL C.CALL\r
+C.CURV:        LDA A,BVPOS             ;MOVE CATCHER\r
+       CMP A,VPOS+<CATCHER*2>\r
+       BEQ C.CALL\r
+       STA A,VPOS+<CATCHER*2>\r
+       LDA I,4\r
+       ORA BITMAP              ;MOVE LEGS\r
+       STA BITMAP\r
+C.CALL:        LDA CALL                ;DON'T CHANGE A STRIKE\r
+       BNE C.RET\r
+       LDA A,BHPOSH            ;BALL IN STRIKE ZONE?\r
+       SEC\r
+       SBC I,21\r
+       BCS 10$\r
+       EOR I,0FF               ;ABS VALUE\r
+       ADC I,1\r
+10$:   CMP I,4\r
+       BCS C.RET               ;NOT IN STRIKE ZONE YET\r
+       LDA A,BVPOS\r
+       SBC I,83\r
+       BCS 20$\r
+       EOR I,0FF               ;ABS VALUE\r
+       ADC I,1\r
+20$:   CMP I,4\r
+       BCS C.CHK               ;NOT IN STRIKE ZONE\r
+C.STRK:        LDA I,1\r
+       STA CALL\r
+C.RET: CLC                     ;BALL NOT CAUGHT YET\r
+       RTS\r
+C.CHK: LDX OFFENS\r
+       LDA ZX,PLAYNO\r
+       LSR\r
+       LDA I,80\r
+       BCS 10$                 ;LEFTY\r
+       LDA I,8E                ;RIGHTY\r
+       SEC\r
+10$:   SBC A,BVPOS\r
+       BMI C.RET\r
+       CMP I,6\r
+       BCS C.RET\r
+       LDA I,-1                ;HIT BATSMAN\r
+       STA CALL\r
+       SEC\r
+       RTS\r
+       .PAGE\r
+       .SBTTL BOUNCE\r
+;\r
+;BLOCK NAME:   BOUNCE\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  BOUNCE WILL SIMULATE # BOUNCING MOTION FOR THE BALL AS WELL\r
+;              AS DECAYING THE SPEED TO ZERO\r
+;INPUT PARAMS: SPEED AND ANGLE\r
+;OUTPUT PARAMS:        SPEED AND ANGLE\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE:\r
+;\r
+;TEMPORARILY WILL JUST DECAY THE SPEED\r
+;\r
+BOUNCE:        LDA SPEED               ;GET SPEED\r
+       CLC\r
+       TAY\r
+       ADC I,3F                ;ADD 3F\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       LSR\r
+       STA TEMP1               ;SAVE\r
+       TYA                     ;SPEED\r
+       SEC\r
+       SBC TEMP1               ;SPEED - ((SPEED+15)/16)\r
+       STA SPEED\r
+       AND I,0FC\r
+       BNE 10$                 ;IF BALL HASNT STOPPED\r
+       LDA BATOUT              ;DON'T CALL LINE OUT FOUL\r
+       BNE 10$\r
+       JSR FOULCK\r
+       BCC 10$                 ;BALL NOT FOUL\r
+       LDA I,FOUL              ;SET FOUL\r
+       ORA BALFLG\r
+       STA BALFLG\r
+10$:   RTS\r
+       .PAGE\r
+       .SBTTL MOVE OBJECT LEGS\r
+       \r
+;BLOCK NAME:   MOVLEG\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    MOVLEG WILL FIRST LOCK OUT\r
+;                      THE MOITION OBJECT UPDATE IN THE INTERRUPT\r
+;                      ROUTINE AND THEN TOGGLE THE ONE BIT\r
+;                      OF THE PICTURE STAMP # FOR EVERY MOTION\r
+;                      OBJECT INDICATE IN THE 2 BYTE BIT MAP\r
+;\r
+;INPUT PARAMS: BITMAP (2 BYTES)\r
+;OUTPUT PARAMS:        MOTION OBJECT STAMPS UPDATED\r
+;REGISTER USED:        A,X\r
+;STACK USED:   NONE\r
+;\r
+MOVLEG:        LDA FRAME\r
+       AND I,03                ;EVERY 4TH FRAME ONLY\r
+       BNE 5$\r
+       LDY I,8                 ;8 OBJ'S IN FIRST BYTE\r
+       STA SLOCK               ;LOCK OUT INTERRUPT\r
+       LDX I,0\r
+1$:    LDA I,1                 ;SET UP FOR EOR\r
+       LSR BITMAP\r
+       BCC 2$                  ;NO UPDATE\r
+       EOR AX,MOBJ             ;UPDATE STAMP\r
+       STA AX,MOBJ\r
+2$:    INX\r
+       INX\r
+       DEY\r
+       BNE 1$\r
+       LDY I,8                 ;8 OBJ'S IN 2ND BYTE\r
+3$:    LDA I,1                 ;SET UP FOR EOR\r
+       LSR BITMAP+1\r
+       BCC 4$                  ;NO UPDATE\r
+       EOR AX,MOBJ             ;UPDATE STAMP\r
+       STA AX,MOBJ\r
+4$:    INX\r
+       INX\r
+       DEY\r
+       BNE 3$\r
+       LDX HASBAL              ;FLASH MAN WITH BALL\r
+       BEQ 6$\r
+       LDA AX,MOBJ\r
+       AND I,0C0               ;PRESERVE FLAGS\r
+       STA AX,MOBJ\r
+       LDA I,0                 ;UNLOCK INTERRUPT\r
+       STA SLOCK\r
+       RTS                     ;RETURN\r
+5$:    LDX HASBAL\r
+       BEQ 6$\r
+       LDA AX,MOBJ\r
+       ORA I,0A\r
+       STA AX,MOBJ\r
+6$:    RTS\r
+       .PAGE\r
+       .SBTTL TRACK BALL RUNNER\r
+       \r
+;BLOCK NAME:   BATRUN\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    THIS ROUTINE WILL UPDATE THE POSITION\r
+;                      OF THE BATTER AS A RUNNER BASED ON OFFENSIVE\r
+;                      TRACK BALL INPUT AND SLIDE CONDITION\r
+;\r
+;INPUT PARAMS: THINC,TVINC\r
+;OUTPUT PARAMS:        H & V POSITION OF RUNNER (BATTER)\r
+;REGISTERS USED: A,X\r
+;SUBROUTINE USED:      TBALL,BUTTON\r
+;STACK USED    NONE ADDITIONAL\r
+;\r
+BATRUN:        BIT ATRACT\r
+       BPL 50$                 ;IN ATRACT\r
+       JSR OFENSE\r
+       BCS 50$                 ;COMPUTER AT BAT\r
+       LDA MOVE\r
+       BNE 50$\r
+       BIT SLIDE\r
+       BMI 1$                  ;SLIDING!\r
+       LDA I,SLDVAL\r
+       CMP SLIDE\r
+       BEQ 1$                  ;NORMAL MOVEMENT\r
+       INC SLIDE\r
+       CMP SLIDE\r
+       BNE 50$                 ;STOPPED AFTER SLIDE\r
+       LDA A,MOBJ+<BATTER*2>   ;CHANGE TO RUNNER\r
+       AND I,0C0\r
+       BIT SAVE1\r
+       BPL 55$\r
+       EOR I,40\r
+55$:   LDX OFFENS\r
+       ORA I,08\r
+       STA A,MOBJ+<BATTER*2>\r
+       BNE 15$                 ;ALWAYS\r
+50$:   RTS\r
+1$:    LDX OFFENS      ;GET H & V INCREMENTS\r
+       JSR TBALL\r
+       BIT SLIDE\r
+       BMI 20$\r
+       LDA BASE                ;TO FIRST YET?\r
+       BEQ 18$                 ;YES, DONT ALLOW SLIDE\r
+15$:   JSR BUTTON              ;BUTTON PUSHED?\r
+       BNE 16$                 ;YES\r
+18$:   LDA THINC               ;NO\r
+       ORA TVINC\r
+       BEQ 25$                 ;DON'T MOVE LEGS\r
+       LDA I,4                 ;MOVE LEGS\r
+       ORA BITMAP+1\r
+       STA BITMAP+1\r
+       BNE 25$                 ;ALWAYS\r
+16$:   LDA I,-SLDVAL\r
+       STA SLIDE\r
+       LDA A,MOBJ+<BATTER*2>   ;CHANGE TO SLIDER PICTURE\r
+       AND I,0C0\r
+       BIT THINC+1             ;THIS ALL WORKED THRU TRIAL & ERROR\r
+       BPL 17$\r
+       EOR I,40\r
+17$:   ORA I,0E\r
+       STA A,MOBJ+<BATTER*2>\r
+       LDA THINC+1\r
+       STA SAVE1               ;SAVE SIGN OF LAST HORIZ INCREMENT\r
+       LDA BITMAP+1\r
+       AND I,0FB\r
+       STA BITMAP+1\r
+20$:   INC SLIDE\r
+       LDA THINC               ;DOUBLE SPEED\r
+       STA TEMP1\r
+       LDA THINC+1\r
+       JSR LSHFT1\r
+       STA THINC+1\r
+       LDA TEMP1\r
+       STA THINC\r
+       LDA TVINC\r
+       STA TEMP1\r
+       LDA TVINC+1\r
+       JSR LSHFT1\r
+       STA TVINC+1\r
+       LDA TEMP1\r
+       STA TVINC\r
+25$:   LDA A,HPOSL+<BATTER*2>          ;INCREMENT H POS\r
+       CLC\r
+       ADC THINC\r
+       STA A,HPOSL+<BATTER*2>\r
+       LDA A,HPOSH+<BATTER*2>\r
+       ADC THINC+1\r
+       JSR BCHECK\r
+       BCS 26$\r
+       STA A,HPOSH+<BATTER*2>\r
+26$:   LDA A,VPOSL+<BATTER*2>          ;INCREMENT V POS\r
+       CLC\r
+       ADC TVINC\r
+       STA A,VPOSL+<BATTER*2>\r
+       LDA A,VPOS+<BATTER*2>\r
+       ADC TVINC+1\r
+       JSR BVCHEK\r
+       BCS 27$\r
+       STA A,VPOS+<BATTER*2>\r
+27$:   LDA SLIDE\r
+       BMI B.RET\r
+       BEQ B.RET\r
+       LDA TVINC+1             ;NOT SLIDING, ANY VERT CHANGE?\r
+       BNE 30$                 ;YES\r
+       LDA TVINC\r
+       BNE 30$                 ;YES\r
+       RTS\r
+30$:   TXA\r
+       ROR\r
+       ROR\r
+       ROR\r
+       EOR TVINC+1\r
+       BMI 35$                 ;DID HE CHANGE VERT DIRECTIONS?\r
+       LDA I,7F                ;ADJUST RUNNER DIRECTION\r
+       AND A,MOBJ+<BATTER*2>\r
+       BNE 40$                 ;ALWAYS\r
+35$:   LDA I,80                ;ADJUST RUNNER DIRECTION\r
+       ORA A,MOBJ+<BATTER*2>\r
+40$:   STA A,MOBJ+<BATTER*2>\r
+B.RET: RTS\r
+CKS3:  .BYTE 89\r
+       .PAGE\r
+       .SBTTL FIELDER MOTION (TRACK BALL)\r
+       \r
+;BLOCK NAME:   FIELD\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    FIELD WILL DETERMINE WHICH\r
+;                      FIELDER (IF ANY) ARE UNDER CONTROL OF THE\r
+;                      TRACK BALL AND MOVE THEM ACCORDINALY\r
+;\r
+;INPUT PARAMS: FLDCTL (3 BYTE ARRAY), THINC,TVINC\r
+;OUTPUT PARAMS:        H & V POSITIONS OF FIELDERS UPDATED\r
+;REGISTERS USED: A,X,Y\r
+;SUBROUTINE USED: TBALL\r
+;STACK USED:   NONE ADDITIONAL\r
+;\r
+FIELDR:        JSR DEFENS              ;COMPUTE ON DEFENSE?\r
+       BCS 8$                  ;YES, LIKE ATTRACT\r
+       BIT ATRACT\r
+       BMI 7$\r
+8$:    JMP F.ATRC\r
+7$:    LDA FLDCTL              ;ANY FIELDERS TO CONTROL?\r
+       BEQ 2$                  ;NO\r
+       LDA OFFENS              ;GET DEFENSE IN X\r
+       EOR I,2\r
+       TAX\r
+       JSR TBALL               ;SET UP H & V INCREMENTS\r
+       LDY I,0                 ;AT MOST 3 PLAYERS CONTROLLED\r
+1$:    LDX AY,FLDCTL           ;GET CONTROLLED PLAYER\r
+       BNE 5$\r
+2$:    JMP F.RET\r
+5$:    LDA THINC\r
+       BNE 3$\r
+       LDA TVINC\r
+       BEQ 10$                 ;NO\r
+3$:    JSR FLDLEG\r
+10$:   CLC\r
+       LDA THINC               ;INCREMENT HPOS\r
+       ADC AX,HPOSL\r
+       STA AX,HPOSL\r
+       LDA THINC+1\r
+       ADC AX,HPOSH\r
+       JSR BCHECK                      ;CHECK FOR OUT OF BOUNDS\r
+       BCS 15$\r
+       STA AX,HPOSH\r
+15$:   CLC\r
+       LDA TVINC               ;INCREMENT VPOS\r
+       ADC AX,VPOSL\r
+       STA AX,VPOSL\r
+       LDA TVINC+1\r
+       ADC AX,VPOS\r
+       JSR BVCHEK              ;CHECK FOR OUT OF BOUNDS\r
+       BCS 20$\r
+       STA AX,VPOS\r
+20$:   LDA THINC               ;FIELDERS MOVE AT 1 1/2 SPEED LIMIT\r
+       STA TEMP1\r
+       LDA THINC+1\r
+       JSR SHIFT1\r
+       STA TEMP2\r
+       LDA AX,HPOSL            ;UPDATE HORIZ\r
+       CLC\r
+       ADC TEMP1\r
+       STA AX,HPOSL\r
+       LDA AX,HPOSH\r
+       ADC TEMP2\r
+       JSR BCHECK\r
+       BCS 25$\r
+       STA AX,HPOSH\r
+25$:   LDA TVINC\r
+       STA TEMP1\r
+       LDA TVINC+1\r
+       JSR SHIFT1\r
+       STA TEMP2\r
+       LDA AX,VPOSL            ;UPDATE VERT\r
+       CLC\r
+       ADC TEMP1\r
+       STA AX,VPOSL\r
+       LDA AX,VPOS\r
+       ADC TEMP2\r
+       JSR BVCHEK\r
+       BCS 40$\r
+       STA AX,VPOS\r
+40$:   INY\r
+       CPY I,3                 ;ALL DONE?\r
+       BEQ F.RET\r
+       JMP 1$                  ;NOPE!\r
+F.ATRC:        LDA A,BHPOSH            ;BALL OUT OF INFIELD?\r
+       CMP I,INMAX\r
+       BCC F.RET               ;NO\r
+       LDX FLDBAL              ;MOVE OUTFIELDER TO BALL\r
+       LDA A,BHPOSH\r
+       STA AX,HGOAL\r
+       LDA A,BVPOS\r
+       STA AX,VGOAL\r
+       JSR DIRECT\r
+       LDA I,0\r
+       JSR SPDLIM\r
+       JSR UPDTHV\r
+       LDA TVINC+1\r
+       ORA THINC+1\r
+       BEQ F.RET\r
+       JSR FLDLEG\r
+F.RET: RTS\r
+;ENTERED WITH X->PLAYER, A=TBVD(X), THINC=TBHD(X)\r
+X.LIM: .BYTE 28\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
+TBALL: 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
+       LDY OFFENS              ;MUST PRE-INVERT FOR OFFENSE #2\r
+       BEQ 5$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+5$:    STA THINC               ;SAVE LSB'S OF TBHP(X)\r
+       LDY I,0\r
+       LDA ZX,TBVD\r
+       STY ZX,TBVD             ;SAME HAZARD HERE\r
+       LDY OFFENS\r
+       BEQ 10$\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,1\r
+10$:   JSR X.TBLIM\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 THINC               ;SAME FOR THINC\r
+       ASL\r
+       ROL\r
+       ROL\r
+       TAY\r
+       AND I,0F8\r
+       STA THINC\r
+       TYA\r
+       ROL\r
+       AND I,7\r
+       CMP I,4\r
+       BCC 40$\r
+       ORA I,0F8\r
+40$:   STA THINC+1\r
+       RTS\r
+       .PAGE\r
+       .SBTTL FIELDER-BALL COLLISION CHECK\r
+       \r
+;BLOCK NAME:   COLCHK\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    COLCHK WILL DETERMINE IF A COLLISION\r
+;                      HAS OCCURED BETWEEN THE BALL & A FIELDER &\r
+;                      WILL SET THE FIELD FLAG IN BALFLG IF SO.\r
+;\r
+;INPUT PARMS:  BALL & FIELDER POSITIONS\r
+;OUTPUT PARMS: UPDATE OF BALFLG\r
+;REGISTERS USED:       A,X,Y\r
+;STACK USED:   NONE\r
+;SUBROUTINE USED: FORCHK\r
+COLCHK:        LDX I,9*2               ;START W/RIGHT FIELDER\r
+1$:    LDA A,BHPOSH            ;BALL POSITION\r
+       SEC                     ;HORIZ PROXIMITY\r
+       SBC AX,HPOSH\r
+       BCS 10$                 ;BR IF ?????\r
+       EOR I,0FF               ;GET ABSOLUTE VALUE\r
+       ADC I,1\r
+10$:   CMP I,FPROX\r
+       BCS 20$                 ;OUTSIDE HORIZ RANGE\r
+       LDA A,BVPOS\r
+       SEC\r
+       SBC AX,VPOS             ;GET PROXIMITY\r
+       BCS 15$\r
+       EOR I,0FF               ;ABS VALUE\r
+       ADC I,1\r
+15$:   CMP I,FPROX\r
+       BCC 25$                 ;WE GOT HIM\r
+20$:   DEX\r
+       DEX\r
+       BNE 1$                  ;NOT DONE YET\r
+       LDX HASBAL\r
+       BEQ 22$\r
+       LDA AX,MOBJ\r
+       ORA I,0A\r
+       STA AX,MOBJ\r
+       LDA I,0\r
+       STA HASBAL\r
+22$:   RTS\r
+25$:   CPX HASBAL              ;SAME PLAYER CAN'T CATCH BALL HE THREW\r
+       BEQ 22$\r
+       LDY HASBAL\r
+       BEQ 26$\r
+       LDA AY,MOBJ\r
+       ORA I,0A\r
+       STA AY,MOBJ\r
+26$:   LDA AX,HPOSH\r
+       CMP I,0A8\r
+       BCS 30$                 ;OUTFIELDER BRANCH\r
+       LDA SPEED               ;GET INFIELD MAX SPEED\r
+       CMP INSPDX\r
+       BCS 20$                 ;NO COLLISION BALL MOVING TOO FAST\r
+       CMP I,50\r
+       BCC 40$                 ;NO\r
+       BCS 38$                 ;YES\r
+30$:   LDY FAIR                ;BALL BOUNCE YET?\r
+       BNE 40$                 ;YES\r
+       CMP I,44\r
+       BCC 40$                 ;NO\r
+38$:   LDA FSTFLD              ;NOT FLYBALL\r
+       BNE 40$\r
+       STX TEMP1               ;YES, BATTER IS OUT\r
+       INC BATOUT\r
+       INC FLYOUT              ;INDICATE FLYOUT\r
+       LDX I,0\r
+       STX FORCE\r
+       JSR PUTOUT              ;SEND BATTER BACK TO DUGOUT\r
+       LDX TEMP1\r
+       INC OUTS\r
+40$:   LDA I,0CC               ;CATCH SOUND\r
+       STA THUD\r
+       STA THRTMR              ;INIT THROW TIMER\r
+       STX HASBAL              ;SHOW WHO HAS BALL\r
+       STX FLDCTL              ;MAKE HIM CONTROLLED MAN\r
+       LDA FLYOUT              ;DON'T SET FOUL ON OUT\r
+       BNE 45$\r
+       JSR FOULCK\r
+       BCC 45$\r
+       LDA I,FOUL              ;BALL FOUL WHEN CAUGHT, INDICATE FOUL\r
+       ORA BALFLG\r
+       STA BALFLG\r
+45$:   LDA AX,HPOSH            ;MOVE BALL TO CENTER OF GUY THAT HAS IT\r
+       STA A,BHPOSH\r
+       LDA AX,VPOS\r
+       STA A,BVPOS\r
+       LDA I,0\r
+       STA SPEED               ;SET BALL SPEED TO 0\r
+       STA FLDCTL+1            ;NO OTHERS UNDER TBALL CONTROL\r
+       STA TOBALX\r
+       LDY TOBALL              ;MOVE SELECTED INFIELDER BACK TO POSITION\r
+       STA TOBALL\r
+       LDA AY,IVGOAL\r
+       STA AY,VGOAL\r
+       LDA AY,IHGOAL\r
+       STA AY,HGOAL\r
+       LDA I,FLDFLG            ;INDICATE BALL FIELDED\r
+       ORA BALFLG\r
+       STA BALFLG\r
+       LDA FSTFLD              ;IS THIS THE FIRST FIELDING?\r
+       BEQ 31$                 ;YES\r
+       CPX I,PITCHER*2\r
+       BNE 49$\r
+       LDA I,PLYEND            ;SET PLYEND (TEMP)\r
+       ORA BALFLG\r
+       STA BALFLG\r
+31$:   JSR FORCHK\r
+49$:   INC FSTFLD              ;INCREMENT FIELDED COUNT\r
+50$:   RTS\r
+       .PAGE\r
+       .SBTTL FORCE CHECK\r
+;BLOCK NAME: FORCHK\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: FORCHK WILL SET THE MOVE FLAG FOR EACH RUNNER\r
+;                  (EXCEPT BATTER) ACCORDING TO THE FORCE CONDITIONS\r
+;                  AND POSITION OF RUNNERS AT TIME OF CALL\r
+;\r
+;INPUT PARAMS: FORCE & H & V POSITIONS OF RUNNERS\r
+;OUTPUT PARAMS: MOVE ARRAY\r
+;STACK USED: NONE\r
+;\r
+FORCHK:\r
+       LDX I,3                 ;START WITH 3RD DRONE\r
+5$:    LDA ZX,MOVE\r
+       BMI 50$                 ;OUT\r
+       BEQ 50$                 ;HOLDING\r
+       LDA ZX,BASE\r
+       BEQ 50$                 ;NOT ON BASE\r
+       TAY\r
+       STA ZX,MOVE\r
+       LDA FLYOUT\r
+       BNE 35$\r
+       LDA FORCE\r
+       BEQ 21$                 ;HAVE RUNNERS TAG UP\r
+       LSR                     ;GET RID OF FORCE AT 1ST\r
+10$:   LSR\r
+       DEY\r
+       BNE 10$\r
+       BCC 21$                 ;NO FORCE ON THIS GUY\r
+13$:   TXA\r
+       ASL\r
+       TAY\r
+15$:   INC ZX,MOVE             ;MOVE THIS GUY ALONG\r
+       BNE 45$                 ;NEXT GUY\r
+21$:   LDA HASBAL              ;WHO HAS THE BALL\r
+       BNE 22$\r
+       LDA HOMRUN\r
+       BNE 13$                 ;HR OR TRIPLE\r
+       TXA                     ;WALK OR HB\r
+       ASL\r
+       TAY\r
+       JMP 45$\r
+22$:   TXA                     ;BATTER IN ATTRACT?\r
+       BEQ 23$                 ;CONSERVATIVE!!!\r
+       LDA HASBAL\r
+       SBC I,<SSTOP*2>\r
+       BPL 13$\r
+23$:   TXA                     ;GET INDEX\r
+       ASL                     ;*2\r
+       TAY\r
+       LDA ZX,BASE\r
+       LSR                     ;WHAT BASE\r
+       BEQ 25$                 ;1ST\r
+       BCC 30$                 ;2ND\r
+       LDA AY,VPOS+<BATTER*2>  ;3RD\r
+       SBC I,0A4               ;1/2 WAY?\r
+       BMI 15$                 ;YES\r
+       BPL 40$                 ;NO\r
+25$:   LDA AY,VPOS+<BATTER*2>  ;1/2 WAY?\r
+       SEC\r
+       SBC I,6A\r
+       BMI 40$                 ;NO\r
+       BPL 15$                 ;YES\r
+30$:   LDA AY,VPOS+<BATTER*2>\r
+       SEC\r
+       SBC I,0A2               ;1/2 WAY\r
+       BMI 40$                 ;NO\r
+       BPL 15$\r
+35$:   TXA\r
+       ASL\r
+       TAY\r
+40$:   LDA AY,MOBJ+<BATTER*2>  ;FLIP PICTURE\r
+       EOR I,80\r
+       STA AY,MOBJ+<BATTER*2>\r
+45$:   LDA ZX,MOVE             ;SET UP RUNNER'S GOALS\r
+       STX TEMP1\r
+       ASL\r
+       TAX\r
+       LDA AX,BGOALH\r
+       STA AY,HGOAL+<BATTER*2>\r
+       LDA AX,BGOALV\r
+       STA AY,VGOAL+<BATTER*2>\r
+       LDX TEMP1\r
+50$:   DEX\r
+       JSR OFENSE\r
+       TXA\r
+       BCS 55$\r
+       BIT ATRACT              ;ATTRACT?\r
+       BMI 52$                 ;GAME\r
+55$:   TXA\r
+       BPL 53$                 ;BATTER ALSO IN ATTRACT\r
+51$:   RTS\r
+52$:   BEQ 51$                 ;RUNNERS ONLY\r
+53$:   JMP 5$\r
+       .PAGE\r
+       .SBTTL PUTOUT\r
+;BLOCK NAME:   PUTOUT\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  PUTOUT WILL MAKE RUNNER A DRONE AND SEND HIM TO THE DUGOUT\r
+;INPUT PARAMS: X=RUNNER #\r
+;REGS USED:    A,X\r
+;\r
+PUTOUT:        LDA I,0\r
+       STA ZX,BASE\r
+       LDA I,0FF\r
+       STA ZX,MOVE             ;MAKE RUNNER DRONE TO DUGOUT\r
+       TXA\r
+       ASL\r
+       TAX\r
+       LDA OFFENS\r
+       BNE 10$\r
+       LDA I,48                ;CHANGE PICTURE\r
+       BNE 20$\r
+10$:   LDA I,88\r
+20$:   STA AX,MOBJ+<BATTER*2>\r
+       LDA I,HDUGO             ;MOVE HIM TO DUGOUT\r
+       STA AX,HGOAL+<BATTER*2>\r
+       LDA I,VDUGO\r
+       STA AX,VGOAL+<BATTER*2>\r
+       LDX I,70                ;SMALL CHEER\r
+       LDA MISSED\r
+       BNE 28$\r
+       LDA OMESL               ;WAS LAST MESSAGE AN OUT OF SOME KIND\r
+       CMP I,M.OUT\r
+       BEQ 21$                 ;YES\r
+       CMP I,M.FOUT\r
+       BEQ 21$                 ;YES\r
+       CMP I,M.LOUT            ;NO\r
+       BNE 22$\r
+21$:   LDX I,90                ;BIGGER CHEER\r
+       LDA I,M.DP              ;DOUBLE PLAY\r
+       BNE 30$                 ;ALWAYS\r
+22$:   LDA FLYOUT              ;FLY OUT?\r
+       BEQ 29$                 ;NO\r
+       LDA A,BHPOSH\r
+       CMP I,0A0\r
+       BCS 27$                 ;OUTFIELD\r
+       LDA I,M.LOUT            ;INFIELD - LINE OUT\r
+       BNE 30$\r
+27$:   LDA I,M.FOUT            ;FLY OUT\r
+       BNE 30$\r
+28$:   LDA I,M.MB              ;MISSED BASE\r
+       BNE 30$\r
+29$:   LDA I,M.OUT             ;OUT\r
+30$:   STX CHEER\r
+       JSR WRITEB\r
+       LDA I,58                ;SAY "YER OUT!"\r
+       STA FLASH\r
+       RTS\r
+       .PAGE\r
+       .SBTTL INFIELD MOTION ROUTINE\r
+;\r
+;BLOCK NAME:   INFLD\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  INFLD WILL CONROL INFIELDER MOTION MOVING EVERY PLAYER TO A\r
+;              PRE-ASSIGNED LOCATION, OR TO THE BALL, DEPENDING ON VARIABLES\r
+;              TOBALL AND HASBAL\r
+;\r
+;INPUT PARAMS: TOBALL,HASBALL,VGOAL,HGOAL,VPOS,HPOS\r
+;OUTPUT PARAMS:        VPOS,HPOS FOR EACH INFIELDER\r
+;REGS USED:    A\r
+;STACK USAGE:  NONE (DIRECT USES SOME)\r
+;SUBRTNS USED: DIRECT,SPDLIM,FLDLEG,FORCHK\r
+\r
+INFLD:\r
+1$:    LDX I,SSTOP*2           ;START WITH SHORT STOP\r
+2$:    BIT ATRACT\r
+       BPL 3$\r
+       CPX HASBAL              ;PLAYER HAVE BALL?\r
+       BEQ 50$                 ;YES, DON'T TRY TO MOVE HIM\r
+3$:    CPX TOBALL              ;MOVE THIS ONE TO BALL?\r
+       BNE 10$                 ;NOPE!\r
+       CPX I,PITCHER*2         ;PITCHER TO BALL?\r
+       BEQ 7$                  ;YES - ZERO IN ON BALL\r
+       LDA A,BHPOSH            ;YEP- GET HORIZ POS\r
+       CMP I,INMAX             ;BALL OUT OF INFIELD?\r
+       BCC 5$                  ;NO\r
+       LDA AX,IVGOAL           ;YES,RESET GOALS\r
+       STA AX,VGOAL\r
+       LDA AX,IHGOAL\r
+       STA AX,HGOAL\r
+       BNE 10$\r
+5$:    LDA SPEED               ;BALL STOPPED?\r
+       AND I,0E0\r
+       BNE 10$                 ;NO\r
+7$:    LDA A,BHPOSH\r
+       STA AX,HGOAL\r
+       LDA A,BVPOS\r
+       STA AX,VGOAL\r
+10$:   JSR DIRECT              ;GET H&V INCREMENT\r
+       LDA I,0\r
+       JSR SPDLIM              ;LIMIT SPEED\r
+       JSR UPDTHV              ;UPDATE POSITIONS\r
+       LDA TVINC+1\r
+       ORA THINC+1\r
+       BEQ 50$\r
+       JSR FLDLEG              ;MOVE LEGS\r
+50$:   DEX\r
+       DEX\r
+       BNE 2$                  ;NOT DONE\r
+       RTS\r
+       .SBTTL DIRECTION\r
+;SETS HINC & VINC TO DISPLACEMENT FROM (H/V) POS TO (H/V) GOAL\r
+DIRECT:        LDA X,VGOAL\r
+       SEC\r
+       SBC X,VPOS\r
+       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 X,HGOAL\r
+       SEC\r
+       SBC AX,HPOSH\r
+       PHA\r
+       BCC 5$\r
+       EOR I,80\r
+5$:    ASL\r
+       PLA\r
+       BCS 10$\r
+       ASL\r
+       LDA I,7F\r
+       ADC I,0\r
+       EOR I,0FF\r
+10$:   STA THINC+1\r
+       LDA I,0\r
+       STA THINC\r
+       RTS\r
+       .SBTTL SPEED-LIMIT\r
+;SPDLIM - SPEED LIMIT\r
+;\r
+;ENTRY (THINC,THINC+1) = HPOS DIFFERENCE (SIGNED)\r
+;      (TVINC,TVINC+1) = VPOS DIFFERENCE (SIGNED)\r
+;      (A) = INDEX FOR WHICH SPEED (MULTIPLES OF 10)\r
+;EXIT  (THINC,THINC+1) = HPOS DIFFERENCE IN RANGE\r
+;      (TVINC,TVINC+1) = VPOS DIFFERENCE IN RANGE\r
+SPDLIM:        STX K                   ;SAVE PLAYER NUMBER\r
+       STA IJ\r
+       LDA THINC+1\r
+       BPL 25$                 ;HABS=ABS (THINC)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,01\r
+25$:   STA J\r
+       LDA TVINC+1\r
+       BPL 30$                 ;VABS=ABS (TVINC)\r
+       EOR I,0FF\r
+       CLC\r
+       ADC I,01\r
+30$:   LDX I,0         ;X POINTS TO MAX\r
+       LDY J\r
+       CMP J\r
+       BEQ 90$                 ;IF AT 45 DEGREE ANGLE\r
+       BCC 35$                 ;PICK MAX (HABS,VABS)\r
+       LDX I,2                 ;HABS IS MAX\r
+       TAY\r
+       LDA J\r
+35$:   ASL\r
+       STA QUOT+1              ;QUOTIENT=MIN*2\r
+       STY DIVSOR              ;DIVISOR=MAX\r
+       LDA I,1\r
+       LDY IJ\r
+       BEQ 36$\r
+       LDA I,4\r
+36$:   CMP DIVSOR\r
+       BCS 80$                 ;VALUES ARE GOOD ALREADY\r
+       LDY I,3                 ;3 DIGITS OF ACCURACY FOR MIN/MAX\r
+40$:   LDA QUOT+1\r
+       SEC\r
+       SBC DIVSOR\r
+       BCC 45$                 ;NO SUBTRACT\r
+       STA QUOT+1\r
+45$:   ROL QUOT\r
+       ROL QUOT+1\r
+       DEY\r
+       BNE 40$                 ;LOOP 3 TIMES\r
+       LDA QUOT\r
+       AND I,07\r
+       ASL                     ;*2 FOR 2 WORD ENTRIES\r
+       ORA IJ\r
+       TAY\r
+       LDA AY,SPDLM1           ;GET MAX VALUES\r
+       STA ZX,QUOT             ;SAVE MAX SPEED LIMIT (ASSUMES DIVISOR FOLLOWS QUOT)\r
+       TXA\r
+       EOR I,02                ;SWITCH TO MINIMUM\r
+       TAX\r
+       LDA AY,SPDLM1+1\r
+       STA ZX,QUOT             ;SAVE MIN\r
+60$:   LDA I,0\r
+       STA QUOT+1              ;SET MSB OF VABS AND HABS\r
+       STA QUOT+3              ;ASSUMED TO BE DIVSOR-A SCRATCH CELL\r
+       LDX I,2\r
+65$:   LDA ZX,THINC+1\r
+       ASL\r
+       LDY ZX,QUOT\r
+       LDA ZX,QUOT+1\r
+       BCC 70$                 ;WAS POSITIVE\r
+       TYA\r
+       EOR I,0FF\r
+       ADC I,0                 ;COMPLEMENT VABS OR QUOT\r
+       TAY\r
+       LDA ZX,QUOT+1\r
+       EOR I,0FF\r
+       ADC I,0\r
+70$:   STY ZX,THINC            ;LSB/8\r
+       ASL ZX,THINC\r
+       ROL\r
+       ASL ZX,THINC\r
+       ROL\r
+       ASL ZX,THINC\r
+       ROL\r
+       STA ZX,THINC+1          ;SCALED CORRECTLY NOW\r
+       DEX\r
+       DEX\r
+       BPL 65$\r
+80$:   LDX K                   ;RESTORE X=PLAYER NUMBER\r
+       RTS\r
+\r
+90$:   LDA I,1\r
+       LDY IJ\r
+       BEQ 95$                 ;IF SLOW OBJECT\r
+       LDA I,04\r
+95$:   CMP J\r
+       BCS 80$                 ;LESS THAN SPEED LIMIT RETURN\r
+       LDA AY,SPDLM1\r
+       STA QUOT\r
+       STA QUOT+2\r
+       BNE 60$                 ;ALWAYS\r
+\r
+SPDLM1:        .BYTE 28,0,28,05,28,0A,28,0F    ;LIMIT=0 FOR SLOW PLAYERS\r
+       .BYTE 28,14,28,19,28,1E,28,23   ;EACH ENTRY REPRESENTS XXXYYYY LINES\r
+       .BYTE 68,0,68,0D,68,1A,68,27    ;LIMIT=10 FOR FACT PLAYERS\r
+       .BYTE 68,34,68,41,68,4E,68,5E\r
+CKS4:  .BYTE 46\r
+       .PAGE\r
+       .SBTTL SETUP\r
+       \r
+;BLOCK NAME: SETUP\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: SETUP WILL MOVE THE 9 FIELDERS\r
+;      & THE BATTER TO THEIR INITIAL FIELD POSITIONS\r
+;      FROM WHEREVER THEY ARE. WHEN ALL PLAYERS\r
+;      ARE MOVED, IT WILL RETURN WITH Z FLAG SET,\r
+;      OTHERWISE, Z FLAG CLEAR\r
+;\r
+;INPUT PARMS: CURRENT PLAYER POSITIONS & INITBL, X=STARTING M.O. INDEX\r
+;OUTPUT PARMS: PLAYER POSITIONS & Z FLAG = SET WHEN DONE CLEAR OTHERWISE\r
+;REGISTERS USED: A,X,Y\r
+;SUBROUTINES USED: DIRELT,SPDLIM,FLDLEG,UPDTHV\r
+;STACK USED: NONE\r
+;\r
+SETUP: LDA I,0                 ;SET UP TEMP3\r
+       STA TEMP3\r
+10$:   JSR DIRECT              ;GET H & V INCREMENTS\r
+       LDA SETFLG              ;HAS BUTTON BEEN PUSHED IN PAUSE?\r
+       BNE 20$                 ;YES, SKIP SPEED LIMIT\r
+       LDA I,10\r
+       JSR SPDLIM\r
+20$:   JSR UPDTHV              ;UPDATE H & V POS\r
+       LDA TVINC+1\r
+       ORA THINC+1\r
+       BEQ 30$                 ;HE'S THERE ALREADY\r
+       STA TEMP3               ;INDICATE NOT DONE\r
+       JSR FLDLEG              ;MOVE LEG'S\r
+30$:   DEX\r
+       DEX\r
+       BNE 10$                 ;NOT DONE\r
+       LDA TEMP3               ;GET INDICATOR\r
+       RTS\r
+       .PAGE\r
+       .SBTTL UPDATE H & V POSITIONS\r
+;\r
+;BLOCK NAME: UPDTHV\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: UPDATES H & V POSITIONS OF\r
+;      MOTION OBJECT BASED ON THINC & TVINC\r
+;      \r
+;INPUT PARMS: X=INDEX TO MOTION OBJECT,THINC,TVINC\r
+;OUTPUT PARAMS: H & V POSITIONS UPDATED\r
+;REGISTERS USED: A\r
+;STACK USED: NONE\r
+;\r
+UPDTHV:        LDA AX,HPOSL            ;UPDATE H LSBS\r
+       CLC\r
+       ADC THINC\r
+       STA AX,HPOSL\r
+       LDA AX,HPOSH            ;UPDATE H MSB\r
+       ADC THINC+1\r
+       STA AX,HPOSH\r
+       LDA AX,VPOSL            ;UPDATE V LSBS\r
+       CLC\r
+       ADC TVINC\r
+       STA AX,VPOSL\r
+       LDA AX,VPOS             ;UPDATE V MSBS\r
+       ADC TVINC+1\r
+       STA AX,VPOS\r
+       RTS\r
+       .PAGE\r
+       .SBTTL FIELDERS LEG MOTION\r
+;\r
+;ENTRY X=FIELDER # TIMES 2\r
+;\r
+;EXIT  BITMAP IS UPDATED\r
+;      A IS CLOBBERED,TEMP1 AND TEMP2 CLOBBERED CALLS LSHFT1\r
+;\r
+FLDLEG:        STX TEMP2               ;SAVE PLAYER #\r
+       TXA\r
+       LSR                     ;REAL PLAYER #\r
+       TAX\r
+       LDA I,1                 ;FLAG\r
+       STA TEMP1\r
+       LSR                     ;ZERO ACCUM\r
+5$:    JSR LSHFT1              ;BAT NEVER TOGGLED\r
+       DEX\r
+       BNE 5$                  ;ALL DONE SHIFTING?\r
+       ORA BITMAP+1            ;SET BITS\r
+       STA BITMAP+1\r
+       LDA TEMP1\r
+       ORA BITMAP\r
+       STA BITMAP\r
+       LDX TEMP2               ;RESTORE INDEX\r
+       RTS\r
+       .PAGE\r
+       .SBTTL ONE PLAYER OFFENSE & DEFENSE CHECKS\r
+;BLOCK NAME: OFENSE\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: WILL SET CARRY IF COMPUTER IS ON\r
+;                  OFFENSE IN ONE PLAER GAME. ELSE, \r
+;                  CARRY IS CLEAR\r
+;\r
+;INPUT PARM: PLYR1,OFFENSE,CMPLYR\r
+;OUTPUT PARM: CARRY IS SET FOR COMPUTER ON OFFENSE\r
+;            CLEAR OTHERWISE\r
+;\r
+;REGISTER USED: A\r
+;\r
+OFENSE:        LDA PLYR1               ;IN ONE PLAYER MODE?\r
+       BEQ 10$                 ;NO\r
+       LDA OFFENS              ;COMPUTER ON OFFENSE?\r
+       CMP CMPLYR\r
+       BEQ 20$                 ;CARRY IS SET\r
+10$:   CLC\r
+20$:   RTS\r
+DEFENS:        LDA PLYR1               ;IN ONE PLAYER MODE?\r
+       BEQ 20$                 ;NO\r
+       LDA OFFENS              ;COMPUTER ON DEFENSE\r
+       CMP CMPLYR\r
+       BEQ 20$                 ;NO\r
+       SEC                     ;YES\r
+       RTS\r
+20$:   CLC\r
+       RTS\r
+\f\r
+       .SBTTL BOUNDARY CHECK\r
+       \r
+;BLOCK NAME:   BCHECK\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    WILL DETERMINE IF VALUE IN A\r
+;                      IS OUT OF BOUNDS AND SET CARRY\r
+;                      IF SO. OTHERWISE CARRY IS RESET\r
+;\r
+;INPUT PARAMS: H OR V POS IN A\r
+;OUTPUT PARAMS:        CARRY SET=OUT OF BOUNDS\r
+;REGISTERS USED: A\r
+;STACK USED:   NONE\r
+;\r
+BCHECK:        CMP I,08\r
+       BCC 10$                 ;OUT OF BOUNDS\r
+       CMP I,0F0\r
+       RTS                     ;CARRY SET OR RESET PROPERLY\r
+10$:   SEC                     ;SET CARRY\r
+       RTS\r
+BVCHEK:        CMP I,10\r
+       BCC 10$                 ;OUT OF BOUNDS\r
+       CMP I,0F8\r
+       RTS                     ;CARRY SET OR RESET PROPERLY\r
+10$:   SEC                     ;SET CARRY\r
+       RTS\r
+       .PAGE\r
+       .SBTTL MOVE BALL WITH FIELDER & THROW\r
+       \r
+;BLOCK NAME:   THROW\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    THROW WILL CHECK THE DEFENSIVE\r
+;                      PLAYERS PUSH BUTTON TO SET IF IT HAS\r
+;                      BEEN PUSHED YET. IF SO HE WILL RESET\r
+;                      THE FLDFLG, SET THE THROFL, BALL SPEED\r
+;                      & ANGLE, & RETURN. OTHER WISE HE WILL\r
+;                      MOVE THE BALL WITH PLAYER HASBAL\r
+;\r
+;INPUT PARAMS: PUSH BUTTONS & HASBALL\r
+;OUTPUT PARAMS:        BALFLG & BALL POSITION, SPEED & ANGLE\r
+;REGISTERS USED:       A,X,Y\r
+;STACK USED:   NONE\r
+;SUBRT'S USED: BUTTON\r
+;\r
+THROW: BIT ATRACT              ;GAME MODE?\r
+       BPL 4$                  ;NO\r
+       JSR DEFENS\r
+       BCS 4$\r
+       JMP 20$                 ;YES\r
+4$:    LDX HASBAL              \r
+       TXA\r
+       SEC\r
+       SBC I,<SSTOP*2>+1       ;INFIELD OR OUTFIELD\r
+       BPL 13$                 ;OUTFIELD\r
+       LDA FSTFLD              ;INFIELD\r
+       LSR                     ;FIRST FIELDING OF BALL?\r
+       BEQ 10$                 ;YES-LOOK FOR FORCE\r
+       TXA                     ;NO-ANYONE COMING THIS WAY? I DON'T KNOW!!\r
+       LSR\r
+       SEC\r
+       SBC I,CATCHER\r
+       BMI 18$                 ;PITCHER (SHOULDNT HAPPEN)\r
+       BNE 1$                  ;IF NOT CATCHER\r
+       LDA I,4                 ;CATCHER IS AT HOME\r
+       BNE 2$                  ;ALWAYS\r
+1$:    CMP I,SSTOP-CATCHER     ;SHORTSTOP?\r
+       BNE 2$                  ;NO\r
+       LDA I,SCNDB-CATCHER     ;YES, 2ND BASE IS OK\r
+2$:    LDY I,3                 ;ANY ONE HEADING THIS WAY? \r
+3$:    CMP AY,MOVE\r
+       BNE 5$                  ;NO\r
+       TYA                     ;YES, WE HAVE A SUCKER\r
+       ASL                     ;MOVE TOWARD HIM\r
+       ADC I,BATTER*2\r
+       TAY\r
+       LDA AY,HPOSH\r
+       STA AX,HGOAL\r
+       LDA AY,VPOS\r
+       STA AX,VGOAL\r
+       BNE 30$\r
+5$:    DEY\r
+       BPL 3$\r
+10$:   LDA FORCE               ;LOOK FOR FORCE BASE\r
+       BEQ 18$                 ;NO FORCES\r
+       LDY I,1                 ;PICK HIGHEST BASE\r
+11$:   LSR\r
+       BEQ 12$\r
+       INY\r
+       BNE 11$\r
+12$:   TYA                     ;BASE OF FORCE\r
+       AND I,3                 ;MAKE HOME LOOK LIKE BASE 0\r
+       CLC\r
+       ADC I,CATCHER           ;MAKE PLAYER INDEX\r
+       ASL\r
+       CMP I,SCNDB*2           ;SECOND BASEMAN?\r
+       BNE 17$                 ;NO     \r
+       CMP HASBAL              ;DOES HE HAVE BALL?\r
+       BNE 17$                 ;NO\r
+       LDA I,SSTOP*2           ;YES, THROW TO SHORTSTOP\r
+17$:   CMP HASBAL              ;DOES HE HAVE BALL?\r
+       BNE 19$                 ;NO\r
+       SBC I,<CATCHER*2>       ;YES, RACE HIM TO BAG\r
+       TAY\r
+       LDA AY,BGOALH\r
+       STA AX,HGOAL\r
+       LDA AY,BGOALV\r
+       STA AX,VGOAL\r
+       BNE 30$\r
+19$:   STA TOBALX\r
+       BNE 25$                 ;ALWAYS\r
+13$:   LDY I,2                 ;LOOK FOR HIGHEST BASE OBTAINED\r
+       LDA MOVE+3\r
+       BPL 14$\r
+       EOR I,0FF\r
+14$:   CMP AY,MOVE\r
+       BCS 15$                 ;THIS ONE HIGHER\r
+       LDX AY,MOVE\r
+       BMI 15$\r
+       TXA\r
+15$:   DEY\r
+       BPL 14$\r
+       TAY                     ;THIS IS HIGH BASE OBTAINED\r
+       BNE 12$\r
+18$:   LDA I,PITCHER*2         ;RETURN BALL TO PITCHER\r
+       STA TOBALX\r
+       BNE 25$\r
+20$:   LDA OFFENS\r
+       EOR I,2                 ;GET DEFENSE\r
+       TAX\r
+       JSR BUTTON\r
+       BEQ 30$                 ;THROW BUTTON NOT PUSHED YET\r
+25$:   LDA I,FLDFLG?0FF        ;RESET FIELDED FLAG\r
+       AND BALFLG\r
+       ORA I,THROFL            ;SET THROW FLAG\r
+       STA BALFLG\r
+       LDA I,0                 ;SET UP THROW SPEED\r
+       STA SPEED\r
+       STA FLDCTL              ;RESET TBALL CONTROL\r
+       STA RUNPLY              ;RESET RUNS/PLAY\r
+;\r
+;\r
+       RTS\r
+30$:   LDX HASBAL              ;MOVE BALL WITH PLAYER\r
+       LDA AX,HPOSH\r
+       STA A,BHPOSH\r
+       LDA AX,VPOS\r
+       STA A,BVPOS\r
+       DEC THRTMR              ;HAS BALL BEEN THROWN FOR 6 SECOND?\r
+       BNE 35$                 ;YES!\r
+       LDA I,1                 ;NO!\r
+       STA CLK32S              ;CAUSE MASTER PLAY TIMER TO TIMEOUT\r
+35$:   RTS\r
+\f\r
+       .SBTTL BALL THROWN MOTION\r
+       \r
+;BLOCK NAME:   BALMOV\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    BALMOV WILL MOVE THE BALL UNDER\r
+;                      TBALL CONTROL AT DOUBLE PLAYER MOTION\r
+;                      SPEED LIMIT\r
+;\r
+;INPUT PARAMS: THINC TVINC\r
+;OUTPUT PARAMS:        BHPOSH,BVPOS\r
+;REGISTERS USED: A\r
+;SUBROUTINES USED: TBALL\r
+;STACK USED:   NONE\r
+;\r
+BALMOV:        LDA OFFENS\r
+       EOR I,2                 ;GET DEFENSE NUMBER\r
+       TAX\r
+       JSR TBALL               ;MOVE BALL ACCORDING TO TBALL\r
+       LDA THINC\r
+       STA TEMP1\r
+       LDA THINC+1\r
+       JSR LSHFT2              ;4* H INCREMENTS\r
+       STA TEMP2\r
+       LDA A,BHPOSL            ;INCREMENT H POS OF BALL\r
+       CLC\r
+       ADC TEMP1\r
+       STA A,BHPOSL\r
+       LDA A,BHPOSH\r
+       ADC TEMP2\r
+       JSR BCHECK\r
+       BCS 10$                 ;OUT OF BOUNDS\r
+       STA A,BHPOSH\r
+10$:   LDA TVINC               ;4* V INCREMENT\r
+       STA TEMP1\r
+       LDA TVINC+1\r
+       JSR LSHFT2\r
+       STA TEMP2               ;INCREMENT V POS OF BALL\r
+       LDA A,BVPOSL\r
+       CLC\r
+       ADC TEMP1\r
+       STA A,BVPOSL\r
+       LDA A,BVPOS\r
+       ADC TEMP2\r
+       JSR BVCHEK\r
+       BCS 20$                 ;OUT OF BOUNDS\r
+       STA A,BVPOS\r
+20$:   RTS\r
+       .PAGE\r
+       .SBTTL FOUL BALL CHECK\r
+       \r
+;BLOCK NAME:   FOULCK\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRIPTION:    FOULCK WILL DETERMINE IF THE BALL IS\r
+;                      IN FOUL TERRITORY AND SET FOULD IN BALFLG IF SO\r
+;\r
+;INPUT PARAMS: BVPOS,BHPOSH\r
+;OUTPUT PARAMS:        CARY SET=FOUL\r
+;REGISTERS USED: A,X\r
+;STACK USED:   NONE\r
+;\r
+FOULCK:        LDA FAIR\r
+       BNE 30$                 ;BALL HAS ALREADY BOUNCED FAIR\r
+       LDA A,BHPOSH            ;GET HORIZONTAL BALL POSITION\r
+       SEC\r
+       SBC I,1C                ;SUBTRACT AREA BEHING PLATE\r
+       BCC 20$                 ;IF NEGATIVE BALL IS FOUL\r
+       STA TEMP1               ;SAVE IT\r
+       LDA A,BVPOS             ;VERT POSITION\r
+       SBC I,4\r
+       BPL 10$\r
+       CLC\r
+       EOR I,0FF               ;FOLD FIELD OVER\r
+       ADC I,1\r
+10$:   CLC\r
+       ADC TEMP1               ;ADD HORIZONTAL\r
+       BCS 30$\r
+       BMI 30$\r
+20$:   SEC                     ;SET CARRY FOR FOUL\r
+       RTS\r
+30$:   CLC                     ;CLEAR CARRY FOR FAIR\r
+       RTS\r
+       .PAGE\r
+       .SBTTL CHECK BASES\r
+       \r
+;BLOCK NAME:   CKBASE\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DECRIPTION:     THIS ROUTINE WILL CHECK THE RUNNERS\r
+;                      PROGRESS AND DETERMINE IF THEY HAVE\r
+;                      REACHED A BASE. IF SO, THEY WILL\r
+;                      INDICATE THE CURRENT BASE # IN\r
+;                      THE 4 BYTE ARRAY BASE. IF IT IS DETERMINE\r
+;                      THAT A BASE WAS REACHED WITHOUT\r
+;                      THE PRIOR BASE BEING TOUCHED, THEN THE\r
+;                      MINUS FLAG IS SET ALONG WITH THE BASE\r
+;                      MISSED IN THE HIGH NIBBLE.\r
+;                      WILL ALSO UPDATE FORCE CONDITION\r
+;\r
+;INPUT PARAMS: POSITIONS OF RUNNERS BASE (4 BYTES)\r
+;OUTPUT PARAMS:        BASE,FORCE\r
+;REGISTERS USED: A,X,Y\r
+;STACK USED:   NONE\r
+;SUBROUTINE USED: BASCOL\r
+;\r
+CKBASE:        LDA MOVE\r
+       BMI 9$\r
+1$:    LDA BASE                ;GET OLD BASE #\r
+       STA TEMP1               ;SAVE IT\r
+       LDX I,BATTER*2\r
+       JSR BASCOL              ;CHECK FOR COLLISION\r
+       BEQ 4$                  ;NO COLLISION\r
+       SEC\r
+       STA TEMP2               ;SAVE IT\r
+       SBC TEMP1               ;DIFFERENCE\r
+       BEQ 4$\r
+       LSR\r
+       BEQ 10$                 ;IT'S ONE, SO EVERYTHING OK\r
+       CMP I,2\r
+       BNE 5$\r
+       LDA TEMP1\r
+4$:    BEQ CKOTHR\r
+5$:    LDX I,0                 ;MISSED A BASED\r
+       INC MISSED\r
+       INC BATOUT              ;BATTER IS OUT\r
+       JSR PUTOUT\r
+       INC OUTS\r
+9$:    BNE CKOTHR\r
+10$:   LDA TEMP2\r
+       STA BASE\r
+       LDY I,0                 ;REMOVE FORCES\r
+       STY FORCE\r
+       CMP I,4                 ;DID HE SCORE\r
+       BNE 15$                 ;NO\r
+       JSR INCRUN              ;YES, UPDATE SCORE\r
+       LDY OFFENS              ;CHANGE PICTURE TO RUN TO DUGOUT\r
+       BNE 11$\r
+       LDA I,48\r
+       BNE 12$\r
+11$:   LDA I,88\r
+12$:   STA A,MOBJ+<BATTER*2>   ;MOVE HIM TO DUGOUT\r
+       LDA I,HDUGO\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA I,VDUGO\r
+       STA A,VGOAL+<BATTER*2>\r
+       LDA I,PLYEND            ;END PLAY\r
+       ORA BALFLG\r
+       STA BALFLG\r
+       LDA I,0FF               ;TURN HIM INTO DRONE\r
+       STA MOVE\r
+       BNE CKOTHR\r
+15$:   LDA FSTFLD              ;BALL FIELDED?\r
+       BNE 20$                 ;YES\r
+       LDA MOVE                ;DRONE?\r
+       BEQ CKOTHR              ;NO\r
+       INC MOVE                ;YES, MOVE HIM TO NEXT BASE\r
+       LDA MOVE\r
+       AND I,1\r
+       BNE 16$\r
+       LDA A,MOBJ+<BATTER*2>   ;CHANGE PICTURE OF DRONE AT 1ST & 3RD\r
+       EOR I,80\r
+       STA A,MOBJ+<BATTER*2>\r
+16$:   LDA MOVE\r
+       ASL\r
+       TAX\r
+       LDA AX,BGOALH           ;SET UP NEW GOALS\r
+       STA A,HGOAL+<BATTER*2>\r
+       LDA AX,BGOALV\r
+       STA A,VGOAL+<BATTER*2>\r
+       BNE CKOTHR\r
+20$:   LDA I,0                 ;STOP DRONE BATTER\r
+       STA MOVE\r
+CKOTHR:        LDX I,<BATTER*2>+2      ;START WITH 1ST RUNNER\r
+       LDY I,1\r
+1$:    LDA AY,MOVE\r
+       BMI 50$\r
+       BEQ 50$\r
+       JSR BASCOL\r
+       BEQ 50$                 ;NOT TOUCHING A BASE\r
+       CMP AY,BASE             ;SAME BASE\r
+       BEQ 50$\r
+       STA AY,BASE\r
+       CMP I,4\r
+       BNE 20$\r
+       LDA I,0FF               ;SCORED!\r
+       STA AY,MOVE\r
+       LDA I,0\r
+       STA AY,BASE\r
+       LDA AX,MOBJ             ;FLIP PICTURE\r
+       EOR I,80\r
+       STA AX,MOBJ\r
+       LDA I,HDUGO             ;SEND HIM TO DUGOUT\r
+       STA AX,HGOAL\r
+       LDA I,VDUGO\r
+       STA AX,VGOAL\r
+       STX TEMP1\r
+       JSR INCRUN\r
+       LDX TEMP1\r
+       JMP 50$\r
+20$:   CMP I,3                 ;3RD?\r
+       BNE 30$                 ;NO\r
+       LDA AX,MOBJ             ;YES, FLIP PICTURE\r
+       EOR I,80\r
+       STA AX,MOBJ\r
+30$:   LDA FSTFLD\r
+       BNE 45$                 ;STOP RUNNERS\r
+       LDA AY,BASE             ;MOVE'M ALONG\r
+       CLC\r
+       ADC I,1\r
+       STA AY,MOVE\r
+       STY TEMP1\r
+       ASL\r
+       TAY\r
+       LDA AY,BGOALH           ;UPDATE GOALS\r
+       STA AX,HGOAL\r
+       LDA AY,BGOALV\r
+       STA AX,VGOAL\r
+       LDY TEMP1\r
+       BNE 50$                 ;ALWAYS\r
+45$:   LDA I,0                 ;YES\r
+       STA AY,MOVE             ;STOP RUNNER AT BASE\r
+50$:   INY\r
+       INX\r
+       INX\r
+       CPY I,4                 ;DONE?\r
+       BEQ 55$\r
+       JMP 1$\r
+55$:   LDA FORCE\r
+       BEQ CF.RET\r
+       LDA BASE                ;BATTER ON?\r
+       BNE CF.10               ;YEP - NO FORCES\r
+       LDX I,1\r
+       STX TEMP1               ;CONVENT\r
+       LDY I,2\r
+C.FORCE:LDA ZX,BASE\r
+       CMP TEMP1               ;NEXT BASE OCCUPIED\r
+       BNE CF.15               ;NOT YET\r
+       TYA                     ;YES\r
+       ORA FORCE               ;UPDATE FORCE\r
+       STA FORCE\r
+       TYA\r
+       ASL\r
+       TAY\r
+       LDA I,3                 ;DONE?\r
+       CMP TEMP1\r
+       BEQ CF.RET              ;YES\r
+       INC TEMP1               ;NEXT BASE\r
+       LDX I,1\r
+       BNE C.FORCE             ;ALWAYS\r
+CF.10: LDA I,0                 ;TURN OFF FORCES\r
+       BEQ CF.20\r
+CF.15: INX\r
+       CPX I,4\r
+       BNE C.FORCE\r
+       LDX TEMP1\r
+       LDA I,0FE\r
+10$:   DEX\r
+       BEQ 15$\r
+       ASL\r
+       BNE 10$\r
+15$:   EOR I,0FF\r
+       AND FORCE\r
+CF.20: STA FORCE\r
+CF.RET:        RTS\r
+       .PAGE\r
+       .SBTTL INCREMENT RUNS\r
+;BLOCK NAME:   INCRUN\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  INCREMENTS RUNS\r
+;\r
+;REGS USED:    A,X\r
+;\r
+INCRUN:        BIT ATRACT              ;GAME MODE?\r
+       BPL 10$                 ;NO, RETURN\r
+       LDX OFFENS              ;INCREMENT RUNS\r
+       LDA ZX,RUNS\r
+       CLC\r
+       SED\r
+       ADC I,1\r
+       CLD\r
+       STA ZX,RUNS\r
+       INC RUNPLY\r
+       LDA I,0B0               ;A BIG CHEER\r
+       STA CHEER\r
+       INC RUNING\r
+       LDA I,30                ;ROL OVER\r
+       CMP RUNING\r
+       BNE 10$\r
+       LDA I,1C\r
+       STA RUNING\r
+10$:   RTS\r
+       .PAGE\r
+       .SBTTL INCREMENT INNINGS PAID FOR\r
+;BLOCK NAME: UPING\r
+;BLOCK TYPE: SUBROUTINES\r
+;DESCRIPTION: INCREMENT INNING PAID FOR\r
+;REGS USED: A\r
+;\r
+UPING: LDA ININGS\r
+       CMP I,99                ;MAX OUT INNINGS AT 99\r
+       BEQ 10$\r
+       CLC\r
+       SED\r
+       ADC I,1                 ;INCREMENT IN DECIMAL\r
+       STA ININGS\r
+       CLD\r
+10$:   RTS\r
+       .PAGE\r
+       .SBTTL BASE COLLISION\r
+;BLOCK NAME: BASCOL\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: BASCOL WILL DETERMINE IF A GIVEN\r
+;      MOTION OBJECT IS IN CONTACT WITH A BASE\r
+;      IF SO, THE NUMBER OF THE BASE (1 TO 4) IS\r
+;      RETURNED IN THE ACCUMULATOR.\r
+;      OTHERWISE 0 IS RETURNED\r\r
+;INPUT PARAMS:  X=INDEX TO MOTION OBJECT\r
+;OUTPUT PARAMS: A=BASE COLLIDED WITH, ELSEP A=0\r
+;REGISTERS USED: A (X USED BY NOT MODIFIED)\r
+;STACK USED: NONE\r
+;\r
+BASCOL:        LDA AX,HPOSH            ;BET HORIZONTAL POSITION\r
+       SEC\r
+       SBC I,54                ;CHECK FOR 1 ST OR 3 RD\r
+       BCC 30$                 ;MIGHT BE AT HOME\r
+       CMP I,BTPROX            ;CLOSE ENOUGH?\r
+       BCS 40$                 ;NO-MIGHT BE SECOND BASE\r
+       LDA AX,VPOS\r
+       SBC I,41                ;CHECK FIRST BASE\r
+       BCC B.NO                ;RIGHT OF FIRST BASE\r
+       CMP I,BTPROX-4\r
+       BCS 10$                 ;LEFT OF FIRST-CHECK SECOND\r
+       LDA I,1                 ;HIT FIRST!\r
+       BNE B.RTRN\r
+10$:   SBC I,7B\r
+       CMP I,BTPROX-4\r
+       BCS B.NO                ;NOT ON ANY BASE\r
+       LDA I,3                 ;HIT 3 RD\r
+       BNE B.RTRN\r
+30$:   LDA AX,HPOSH            ;CHECK HOME\r
+       SBC I,17\r
+       BMI B.NO                ;BEHIND HOME (WHAT IS HE, A CATCHER?)\r
+       CMP I,BTPROX\r
+       BCS B.NO                ;BETWEEN HOME & 3RD OR 1 ST\r
+       LDA AX,VPOS             ;GET VERTICAL POSITION\r
+       SBC I,7B\r
+       BMI B.NO                ;OFF RIGHT OF HOME\r
+       CMP I,BTPROX-4\r
+       BCS B.NO                ;OFF LEFT OF HOME\r
+       LDA I,4                 ;HIT HOME\r
+       BNE B.RTRN\r
+40$:   SBC I,40                ;CHECK SECOND\r
+       BMI B.NO                ;NOT THERE EITHER\r
+       CMP I,BTPROX-4\r
+       BCS B.NO                ;OVERAN SECOND!\r
+       LDA AX,VPOS\r
+       SBC I,7C\r
+       BMI B.NO                ;OFF RIGHT OF SECOND\r
+       CMP I,BTPROX\r
+       BCS B.NO                ;OFF LEFT OF 2 ND\r
+       LDA I,2\r
+       BNE B.RTRN\r
+B.NO:  LDA I,0                 ;INDICATE NO COLLISION\r
+B.RTRN:        RTS\r
+       .PAGE\r
+       .SBTTL TAG\r
+;BLOCK NAME: TAG\r
+;BLOCK TYPE: SUBROUTINE\r
+;BLOCK DESCRIPTION: TAG WILL CHECK THE PLAYER\r
+;      WHO HAS THE BALL AGAINST THE RUNNERS ON\r
+;      BASE & THE BATTER. IF A COLLISION OCCURRS\r
+;      THE X REGISTER WILL HAVE THE MOTION OBJECT\r
+;      INDEX TO THE RUNNER TAGGED. OTHERWISE\r
+;      X WILL BE ZERO\r
+;INPUT PARAMS: POSITIONS OF HASBALL FIELDER & RUNNERS\r
+;OUTPUT PARAMS: X=INDEX TO RUNNER TAGGED\r
+;REGISTERS USED: A,X,Y\r
+;STACK USED: NONE\r
+;\r
+TAG:   LDY HASBAL              ;WHO HAS THE BALL?\r
+       BEQ T.RET               ;NO ONE HAS THE BALL?\r
+1$:    LDX I,BATTER*2          ;START WITH BATTER\r
+10$:   LDA AX,HPOSH\r
+       BEQ 40$                 ;NOT ON BASE\r
+       SEC\r
+       SBC AY,HPOSH            ;GET DIFFERENCE HORIZ\r
+       BCS 11$                 ;IF POS, BR.\r
+       EOR I,0FF               ;ABS VALUE\r
+       ADC I,1\r
+11$:   CMP I,7                 ;CHECK PROXIMITY\r
+       BCS 40$                 ;NO COLLISION\r
+       LDA AX,VPOS             ;VERT POS OF RUNNER\r
+       SEC\r
+       SBC AY,VPOS             ;DIFFERENCE\r
+       BCS 12$                 ;IF POS BR\r
+       EOR I,0FF\r
+       ADC I,1\r
+12$:   CMP I,7\r
+       BCC T.RET               ;A COLLISION - RETURN W/NEWS\r
+40$:   INX\r
+       INX\r
+       CPX I,<<BATTER+3>*2>+1\r
+       BCC 10$                 ;CHECK NEXT RUNNER\r
+       LDX I,0                 ;NO COLLISIONS\r
+T.RET: RTS\r
+\f\r
+       .SBTTL RUN\r
+       \r
+;BLOCK NAME:   RUN\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCRITPION:    RUN WILL ADVANCE ALL RUNNERS\r
+;\r
+;INPUT PARMS:  ARRAY BASE (4 BYTES)\r
+;OUTPUT PARMS: H & V POS OF RUNNERS\r
+;REGISTER USED: A,Y,X\r
+;STACK USED:   NONE\r
+;SUBS USED:    FOULCK,DIRECT,SPDLIM,UDTHV,FLDLEG\r
+;\r
+RUN:   LDA FSTFLD\r
+       BNE 1$\r
+       LDA BATOUT              ;BATTER OUT?\r
+       BNE 1$                  ;YES\r
+       JSR FOULCK\r
+       BCS 55$                 ;IF BALL NOT FOUL\r
+1$:    LDY I,3                 ;START WITH LAST RUNNER\r
+       LDX I,<BATTER+3>*2\r
+5$:    LDA AY,MOVE\r
+       BEQ 50$                 ;DON'T MOVE THIS GUY\r
+       STY TEMP3\r
+       JSR DIRECT\r
+       LDA THINC\r
+       ORA THINC+1\r
+       ORA TVINC\r
+       ORA TVINC+1\r
+       BNE 30$\r
+       STA AY,MOVE             ;STOP HIM\r
+       BEQ 50$\r
+30$:   LDA I,0\r
+       JSR SPDLIM              ;LIMIT SPEED\r
+       JSR UPDTHV              ;UPDATE POSITION\r
+       JSR FLDLEG              ;MOVE HIS LEGS\r
+       LDY TEMP3\r
+50$:   DEX\r
+       DEX\r
+       DEY\r
+       BPL 5$\r
+55$:   RTS\r
+       .PAGE\r
+       .SBTTL AUTOMATIC BALL MOVEMENT\r
+;BLOCK NAME:   AUTOBL\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  WILL DIRECT THE BALL TO PLAYER SPECIFIED IN TOBALL.\r
+;\r
+;INPUT PARAMS: TBALL INPUT, BALL POSITION, TOBALL\r
+;OUTPUT PARAMS:        BALL POSITION ACC=0 WHEN DONE\r
+;SUBS USED:    DIRECT, SPDLIM, UPDTHV\r
+;STACK USAGE:  NONE\r
+;\r
+AUTOBL:        LDX TOBALX              ;WHO DO WE MOVE BALL TO?\r
+       LDA AX,HPOSH            ;SET UP GOAL\r
+       STA A,HGOAL+1C\r
+       LDA AX,VPOS\r
+       STA A,VGOAL+1C\r
+       LDX I,1C                ;BALL INDEX\r
+       JSR DIRECT\r
+       LDA I,10                ;BALL SPEED\r
+       JSR SPDLIM\r
+       LDA TVINC\r
+       ORA TVINC+1\r
+       ORA THINC\r
+       ORA THINC+1\r
+       BEQ 10$\r
+       JSR UPDTHV\r
+       LDA I,1\r
+10$:   RTS\r
+CKS5:  .BYTE 8E\r
+       .PAGE\r
+       .SBTTL PLAYFIELD\r
+;\r
+;BLOCK NAME:   PLYFLD\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  PLYFLD WILL FIRST BLANK THE SCREEN AND THEN WRITE OUT THE PLAYFIELD\r
+;              BASED ON WHETHER PLAYER #1 OR #2 IS OFFENSE.\r
+;INPUT PARAMS: OFFENS\r
+;OUTPUT PARAMS:        PLAYFIELD (1000-13BF)\r
+;REGISTER USED:        A,X,Y\r
+;STACK USAGE:  3 BYTES IN BASLIN LOCAL SUBROUTINE\r
+;\r
+PLYFLD:        LDA I,0                 ;SET UP TO CLEAR SCREEN\r
+       STA OUTS\r
+       STA BALLS\r
+       STA STRIKE\r
+       STA A,SFHPOS\r
+       STA THPOS\r
+       LDA OPTION              ;CHOOSE INFIELD SKILL\r
+       AND I,3\r
+       TAY\r
+       LDA AY,SKILL\r
+       STA INSPDX\r
+       LDA I,10\r
+       STA THPOS+1             ;INDIRECT ADDRESS\r
+       LDA I,0\r
+       LDX I,3\r
+1$:    LDY I,0FF\r
+2$:    STA NY,THPOS            ;START OF LOOP\r
+       DEY\r
+       BNE 2$\r
+       STA NY,THPOS\r
+       STA ZX,BASE             ;INIT BASE RUNNERS\r
+       INC THPOS+1             ;NEXT 100 BYTES\r
+       DEY\r
+       DEX\r
+       BMI 3$                  ;ALL DONE\r
+       BNE 1$                  ;SECTORS 0,1,2\r
+       LDY I,0BF               ;SECTOR 3\r
+       BNE 2$                  ;***ALWAYS\r
+3$:    LDX OFFENS\r
+       BNE 4$\r
+       LDA I,12                ;STARTING LOCATION OFFENS #1\r
+       STA THPOS\r
+       LDA I,10\r
+       STA THPOS+1\r
+       BNE 5$                  ;***ALWAYS\r
+4$:    LDA I,1A                ;STARTING ADDRESS FOR OFFENSE #\r
+       STA THPOS\r
+       LDA I,12\r
+       STA THPOS+1\r
+5$:    LDX I,14.               ;LOOP COUNT\r
+       LDA I,1F                ;INCREMENT\r
+       LDY I,03                ;STAMP # FOR BASELINE\r
+       JSR BASLIN              ;SET UP LEFT FIELD FOUL LINE\r
+       LDX OFFENS\r
+       BNE 6$                  ;BRANCH FOR OFFENSE #2\r
+       LDA I,12                ;STARTING ADDR FOR\r
+       STA THPOS\r
+       STA THPOS+1\r
+       BNE 7$                  ;***ALWAYS\r
+6$:    LDA I,12                ;STARTING ADDR FOR OFFENSE #2\r
+       STA THPOS\r
+       LDA I,11\r
+       STA THPOS+1\r
+7$:    LDX I,6                 ;LOOP COUNT\r
+       LDA I,1F                ;INCREMENT\r
+       LDY I,03                ;STAMP # FOR BASELINE\r
+       JSR BASLIN              ;SET UP BASELINE 1ST-2ND\r
+       LDX OFFENS\r
+       BNE 8$                  ;OFFENSE #2 THEN BRANCH\r
+       LDA I,05                ;STARTING ADDRESS OFFENSE #1\r
+       STA THPOS\r
+       LDA I,12\r
+       STA THPOS+1\r
+       BNE 9$                  ;***ALWAYS\r
+8$:    LDA I,0D                ;STARTING ADDRESS OFFENSE #2\r
+       STA THPOS\r
+       LDA I,10\r
+       STA THPOS+1\r
+9$:    LDX I,14.               ;LOOP COUNT\r
+       LDA I,21                ;INCREMENT\r
+       LDY I,43                ;BASELINE STAMP #\r
+       JSR BASLIN              ;SETUP RIGHT FIELD FOUL LINE\r
+       LDA I,0D                ;LOW BYTE SAME FOR BOTH\r
+       STA THPOS\r
+       LDX I,11\r
+       LDA OFFENS              ;BRANCH IF #1 OFFENSE\r
+       BEQ 10$\r
+       INX                     ;ELSE BUMP TO NEXT PAGE\r
+10$:   STX THPOS+1\r
+       LDY I,43                ;STAMP #\r
+       LDX I,06                ;LOOP COUNT\r
+       LDA I,21                ;INCREMENT\r
+       JSR BASLIN              ;SET UP BASELINE 2ND-3RD\r
+       JSR DSTAT\r
+;\r
+;SET UP BASES\r
+;\r
+       LDX OFFENS              ;BASES FOR PLAYER #2\r
+       BNE OFF2\r
+       LDA I,04                ;3RD BASE\r
+       STA 10EB\r
+       LDA I,44\r
+       STA 10EC\r
+       LDA I,06                ;HOME PLATE\r
+       STA 11C4\r
+       LDA I,86\r
+       STA 11E4\r
+       LDA I,05                ;2ND BASE\r
+       STA 11D3\r
+       LDA I,85\r
+       STA 11F3\r
+       LDA I,84                ;1ST BASE\r
+       STA 12CB\r
+       LDA I,0C4\r
+       STA 12CC\r
+;\r
+;SET UP TRIPLE-HR TARGETS\r
+;\r
+       LDA I,50                ;THERE HAS GOT TO BE A BETTER WAY\r
+       STA 10BE\r
+       STA 139E\r
+       LDA I,0D0\r
+       STA 103E\r
+       STA 131E\r
+       LDX I,60\r
+       STX 105E\r
+       STX 133E\r
+       INX\r
+       STX 107E\r
+       STX 135E\r
+       INX\r
+       STX 109E\r
+       STX 137E\r
+       INX\r
+       STX 119E\r
+       INX\r
+       STX 11BE\r
+       INX\r
+       STX 11DE\r
+       INX     \r
+       STX 11FE\r
+       INX\r
+       STX 121E\r
+       INX\r
+       STX 123E\r
+       RTS\r
+OFF2:  LDA I,04                ;1ST BASE\r
+       STA 10F3\r
+       LDA I,44\r
+       STA 10F4\r
+       LDA I,45                ;2ND BASE\r
+       STA 11CC\r
+       LDA I,0C5\r
+       STA 11EC\r
+       LDA I,46                ;HOME PLATE\r
+       STA 11DB\r
+       LDA I,0C6\r
+       STA 11FB\r
+       LDA I,84                ;3RD BASE\r
+       STA 12D3\r
+       LDA I,0C4\r
+       STA 12D4\r
+;\r
+;SET UP TARGETS\r
+;\r
+       LDA I,50\r
+       STA 10A1\r
+       STA 1381\r
+       LDA I,0D0\r
+       STA 1021\r
+       STA 1301\r
+       LDX I,0A0\r
+       STX 1081\r
+       STX 1361\r
+       INX\r
+       STX 1061\r
+       STX 1341\r
+       INX\r
+       STX 1041\r
+       STX 1321\r
+       INX\r
+       STX 1221\r
+       INX\r
+       STX 1201\r
+       INX\r
+       STX 11E1\r
+       INX\r
+       STX 11C1\r
+       INX\r
+       STX 11A1\r
+       INX\r
+       STX 1181\r
+       RTS\r
+BASLIN:        STA TEMP1                       ;SAVE INCREMENT\r
+1$:    TYA                             ;GET STAMP VALUE\r
+       LDY I,0                         ;ZERO INDEX\r
+       STA NY,THPOS\r
+       DEX\r
+       BEQ 5$                          ;IF DONE RETURN\r
+       TAY                             ;SAVE STAMP #\r
+       LDA TEMP1                       ;GET INCREMENT\r
+       CLC\r
+       ADC THPOS                       ;INC TO NEXT LOC\r
+       STA THPOS\r
+       BCC 1$\r
+       INC THPOS+1\r
+       BCS 1$                          ;***ALWAYS\r
+5$:    RTS\r
+       .SBTTL INIT\r
+;\r
+;\r
+;\r
+INIT:  LDA I,0\r
+       STA MOVE\r
+       STA BASE\r
+       LDX I,MISSED-BALFLG\r
+12$:   STA ZX,BALFLG\r
+       DEX\r
+       BPL 12$\r
+       JSR OFENSE              ;CARRY SET IF COMPUTER AT BAT\r
+       LDA I,1\r
+       STA FORCE               ;ALWAYS FORCE AT FIRST\r
+       BCS 10$\r
+       BIT ATRACT\r
+       BMI 1$\r
+10$:   STA MOVE                ;DRONE BATTER IN A ATRACT\r
+1$:    LDA I,SLDVAL\r
+       STA SLIDE\r
+;\r
+;TBALL CONTROL OF LEFT CENTER RIGHT\r
+       LDA I,7*2\r
+       STA FLDCTL\r
+       LDA I,8*2\r
+       STA FLDCTL+1\r
+       LDA I,9*2\r
+       STA FLDCTL+2\r
+       LDA I,80                ;180 DEG FOR PLAYER #1 OFFENSE\r
+       STA ANGLE\r
+       LDY I,0D0               ;1ST BAT STAMP\r
+       LDA OFFENS\r
+       BNE 2$\r
+       LDY I,10\r
+2$:    STY BSTMP\r
+       LDX I,-1                ;ZAP CTLPTR\r
+       STX CTLPTR\r
+       STX CTLPTR+2\r
+       STX SLOCK               ;LOCK OUT INTERRUPT ROUTINE\r
+       LDY I,15                ;START AT END OF TABLE\r
+       LDX I,15\r
+20$:   LDA AX,INITBL           ;SET UP POSITIONS\r
+       STA AY,VGOAL-1\r
+       DEX\r
+       LDA AX,INITBL\r
+       STA AY,HGOAL-1\r
+       DEX\r
+       DEY\r
+       DEY\r
+       BPL 20$\r
+       LDA A,INITBL            ;BAT POSITION\r
+       STA A,HPOSH\r
+       LDA A,INITBL+1\r
+       STA A,VPOS\r
+       LDA A,INITBL+1C         ;BALL POS\r
+       STA A,BHPOSH\r
+       LDA A,INITBL+1D\r
+       STA A,BVPOS\r
+       LDX I,2                 ;SET UP PICTURE STAMPS\r
+       LDA I,0CA               ;FIELDER 0\r
+       LDY OFFENS\r
+       BEQ 3$\r
+       LDA I,0A\r
+3$:    LDY I,9                 ;9 FIELDERS\r
+5$:    STA AX,MOBJ\r
+       INX\r
+       INX\r
+       DEY\r
+       BNE 5$\r
+       LDA I,0CC               ;BATTER IS MOBJ #10\r
+       LDY OFFENS\r
+       BEQ 7$\r
+       LDA I,0C\r
+7$:    STA AX,MOBJ\r
+       LDY I,1\r
+INIRUN:        INX\r
+       INX\r
+       LDA AY,BASE             ;SET UP RUNNERS\r
+       STA AY,MOVE             ;IN CASE ZERO, ZERO IT\r
+       BEQ 14$\r
+       AND I,0F                ;NO APPEALS AFTER PLAY OVER\r
+       STA AY,BASE\r
+       CLC\r
+       ADC I,1\r
+       STA AY,MOVE\r
+       STY TEMP1\r
+       ASL\r
+       TAY\r
+       LDA AY,BGOALH           ;SET UP RUNNERS GOALS\r
+       STA AX,HGOAL\r
+       LDA AY,BGOALV\r
+       STA AX,VGOAL\r
+       LDY TEMP1\r
+       LDA AY,BASE\r
+       SEC\r
+       SBC I,1\r
+       BNE 11$\r
+       LDA I,48                ;1ST BASE\r
+       STA AX,MOBJ\r
+       LDA I,5C\r
+       STA AX,HPOSH\r
+       LDA I,45\r
+       STA AX,VPOS\r
+       BNE 13$                 ;NEXT\r
+11$:   SBC I,1\r
+       BNE 12$\r
+       LDA I,48                ;2ND BASE\r
+       STA AX,MOBJ\r
+       LDA I,9B\r
+       STA AX,HPOSH\r
+       LDA I,85\r
+       STA AX,VPOS\r
+       BNE 13$                 ;NEXT\r
+12$:   LDA I,0C8               ;3RD BASE\r
+       STA AX,MOBJ\r
+       LDA I,58\r
+       STA AX,HPOSH\r
+       LDA I,0BF\r
+       STA AX,VPOS\r
+13$:   LDA OFFENS\r
+       BEQ 14$\r
+       LDA AX,MOBJ\r
+       EOR I,0C0               ;FLIP FOR OFFENS=2\r
+       STA AX,MOBJ\r
+14$:   INY\r
+       CPY I,4\r
+       BNE INIRUN\r
+       INX\r
+       INX\r
+       LDA I,87                ;BALL IS MOTION OBJ #14\r
+       LDY OFFENS\r
+       BEQ 15$\r
+       LDA I,47\r
+15$:   STA AX,MOBJ\r
+       INX\r
+       INX\r
+       TYA\r
+       STA AX,MOBJ             ;NO MOTION OBJECT #15\r
+       LDA I,0\r
+       STA SLOCK\r
+       RTS\r
+;LSHFT - LEFT SHIFT\r
+;\r
+;ENTRY (A) = MSB\r
+;      (TEMP1) = LSB\r
+;EXIT  (A) = MSB\r
+;      (TEMP1) = LSB\r
+LSHFT3:        ASL TEMP1\r
+       ROL\r
+LSHFT2:        ASL TEMP1\r
+       ROL\r
+LSHFT1:        ASL TEMP1\r
+       ROL\r
+       RTS\r
+;MULT - MULTIPLY INDEX BY A SIGNED NUMBER\r
+;\r
+;ENTRY (A) = MULTIPLIER (SIGNED -128 TO 127)\r
+;      (X) = MULTIPLICAND (0 TO 127)\r
+;EXIT  (X) = LSB OF RESULT\r
+;      (Y) = MSB OF RESULT\r
+;USES  A,X,Y,TEMP1,(TEMP2,TEMP2+1)\r
+MULT:  LDY I,0\r
+       STA TEMP2               ;SAVE OPERAND\r
+       STX TEMP1\r
+       ORA I,0\r
+       BPL 10$\r
+       LDY I,0FF               ;SIGN EXTEND\r
+10$:   STY TEMP2+1\r
+       LDX I,0                 ;CLEAR RESULT\r
+       LDY I,0\r
+20$:   LSR TEMP1\r
+       BCS 30$                 ;TIME TO ADD IN\r
+       BNE 40$                 ;IF NO MORE MULTIPLIER\r
+       RTS\r
+\r
+30$:   CLC\r
+       TXA\r
+       ADC TEMP2\r
+       TAX\r
+       TYA\r
+       ADC TEMP2+1\r
+       TAY\r
+40$:   ASL TEMP2               ;2*MULTIPLIER\r
+       ROL TEMP2+1\r
+       JMP 20$\r
+\r
+\r
+;RAND - RANDOM NUMBER GENERATOR\r
+;\r
+;EXIT  (A)=RANDOM NUMBER\r
+;USES  A\r
+RAND:  ASL POLYL               ;SHIFT LEFT\r
+       ROL POLYH\r
+       BPL 1$\r
+       INC POLYL\r
+1$:    LDA POLYL               ;CHANGE BIT 0 DEPENDING ON BIT 1\r
+       AND I,2\r
+       BEQ 2$\r
+       LDA POLYL\r
+       EOR I,1\r
+       STA POLYL\r
+2$:    LDA POLYH               ;CHECK FOR ZERO\r
+       ORA POLYL\r
+       BNE 3$\r
+       INC POLYL\r
+3$:    LDA POLYL\r
+       RTS\r
+\r
+\r
+;SHIFT - SIGN EXTENSION DOUBLE BYTE SHIFT (DIVIDE)\r
+;\r
+;ENTRY (A) = MSB\r
+;      (TEMP1) = LSB\r
+;EXIT  (A) = NEW MSB\r
+;      (TEMP1) = NEW LSB\r
+;USES  A,TEMP1\r
+SHIFT2:        CMP I,80\r
+       ROR\r
+       ROR TEMP1\r
+SHIFT1:        CMP I,80\r
+       ROR\r
+       ROR TEMP1\r
+       RTS\r
+\r
+\r
+;COS-COSINE\r
+;\r
+;ENTRY (A) = ANGLE 6 TO FF REPRESENTS 0 TO 360 DEGREES\r
+;EXIT  (A) = COSINE (-127 TO +127)\r
+;USES  A,X\r
+COS:   CLC                     ;COS(A)=SIN(A+PI/2) COUNTER CLOCKWISE\r
+       ADC I,40\r
+\r
+\r
+;SIN-SINE\r
+;\r
+;ENTRY (A) = ANGLE (0 TO FF REPRESENTS 0 TO 360 DEGREES)\r
+;EXIT  (A) = SINE (-127 TO +127)\r
+;USES  A,X\r
+SIN:   LSR\r
+       LSR                     ;0 TO 3F\r
+       TAX\r
+       LDA AX,77$              ;SINE\r
+       RTS\r
+\r
+77$:   .BYTE 0,13.,25.,37.,49.,60.,71.,81.             ;SIN (0-7)\r
+       .BYTE 91.,99.,106.,113.,118.,122.,126.,127.     ;SIN (8-F)\r
+       .BYTE 127.,127.,126.,122.,118.,113.,106.,99.    ;SIN (10-17)\r
+       .BYTE 91.,81.,71.,60.,49.,37.,25.,13.           ;SIN (18-1F)\r
+       .BYTE 0,-13.,-25.,-37.,-49.,-60.,-71.,-81.      ;SIN (20-27)\r
+       .BYTE -91.,-99.,-106.,-113.,-118.,-122.,-126.,-127.     ;SIN (28-2F)\r
+       .BYTE -127.,-127.,-126.,-122.,-118.,-113.,-106.,-99.    ;SIN (30-37)\r
+       .BYTE -91.,-81.,-71.,-60.,-49.,-37.,-25.,-13.   ;SIN (38-3F)\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,0C                ;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,02                ;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
+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
+       .PAGE\r
+       .SBTTL BUTTON PUSH CHECK\r
+;\r
+;BLOCK NAME:   BUTTON\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  BUTTON WILL CHECK THE SELECTED BUTTON TO DETERMINE IF PUSHED.\r
+;              IT WILL DEBOUNCE AND RETURN WITH THE ACC=10.  IF PUSHED, ACC=0\r
+;              IF NOT AND THE ZFLAG SET ACCORDINGLY.\r
+;\r
+;INPUT PARAMS: X=INDEX TO BUTTON TO CHECK (0 OR 2)\r
+;OUTPUT PARAMS:        ACC=10 FOR PUSH, 0 FOR NOT, ZFLAG\r
+;REGS USED:    A,Y(X NOT CHANGED)\r
+;STACK USAGE:  NONE\r
+;\r
+BUTTON:        LDY ZX,SWSTAT           ;GET SWITCH STATUS\r
+       TYA\r
+       EOR ZX,OSSTAT           ;DEBOUNCE SWITCH\r
+       AND ZX,OSSTAT           ;CHANGE TO 0?\r
+       STY ZX,OSSTAT\r
+       AND I,10                ;SELECT SWITCH\r
+       RTS\r
+\f\r
+\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
+       CMP MPSTIM\r
+       BEQ 1$\r
+       DEC MPSTIM\r
+1$:    LDA PLYR1               ;ONE PLAYER?\r
+       BEQ 2$          ;NO\r
+       CPX CMPLYR              ;COMPUTER'S TURN\r
+       BEQ 3$                  ;YES, SELECT IMMEDIATELY\r
+2$:    LDA ATRACT              ;IN ATTRACT?\r
+       BMI 5$                  ;NO, GAME\r
+3$:    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
+       JSR BUTTON\r
+       BNE 15$                 ;PRESSED, SELECT PLAY\r
+       LDA ZX,PSTIM            ;CHECK TIMER\r
+       BPL 14$                 ;STARTED,\r
+       LDA MPSTIM              ;TIMEOUT?\r
+       BEQ 15$                 ;YES, FACE PUSH\r
+       BNE 50$                 ;NO, CONTINUE\r
+14$:   BEQ 50$                 ;TIMED OUT, SKIP\r
+       DEC ZX,PSTIM            ;RUN IT\r
+       BPL 50$                 ;ALWAYS\r
+15$:   LDA ZX,PSTIM            ;HAS HE SELECTED?\r
+       BEQ 50$                 ;YES, LOCK IT IN\r
+19$:   LDA I,60.\r
+       STA ZX,PSTIM            ;PSTIM:=60. (FOR 2 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
+       CPX OFFENS\r
+       BNE 49$\r
+       AND I,1                 ;LEFTY OR RIGHTY?\r
+       BNE 43$                 ;LEFTY\r
+       LDA I,8A                ;RIGHTY\r
+       STA A,VPOS+<BATTER*2>   ;BATTER POSITION\r
+       TXA\r
+       BEQ 45$\r
+40$:   LDA BSTMP\r
+       ORA I,80\r
+       STA BSTMP\r
+       LDA A,MOBJ+<BATTER*2>\r
+       AND I,7F\r
+       STA A,MOBJ+<BATTER*2>\r
+       BNE 49$                 ;ALWAYS\r
+43$:   LDA I,7E\r
+       STA A,VPOS+<BATTER*2>\r
+       TXA\r
+       BEQ 40$\r
+45$:   LDA BSTMP\r
+       AND I,7F\r
+       STA BSTMP\r
+       LDA A,MOBJ+<BATTER*2>\r
+       ORA I,80\r
+       STA A,MOBJ+<BATTER*2>\r
+49$:   SEC\r
+       LDA I,0\r
+31$:   ROL\r
+       DEY\r
+       BPL 31$\r
+       LDY PLYR1\r
+       BEQ 34$\r
+33$:   CPX CMPLYR              ;COMPUTER'S TURN?\r
+       BEQ 50$                 ;YES, DON'T LIGHT ANY LED'S\r
+34$:   STA ZX,LEDWD            ;LEDWD(X)-2**(PLAYNO(X)-1)\r
+50$:   DEX\r
+       DEX\r
+       BMI 51$\r
+       JMP 1$\r
+51$:   LDA LEDTMP\r
+       STA LEDWD+1\r
+       RTS\r
+CKS6:  .BYTE 1F\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
+\r
+       .PAGE\r
+       .SBTTL TELL PLAYERS TO SELECT PLAY\r
+;\r
+;BLOCK NAME:   TELLEM\r
+;BLOCK TYPE:   SUBROUTINE\r
+;BLOCK DESCIPT:        TELLEM WILL TELL PLAYERS TO SELECT SWING/PITCH\r
+;\r
+TELLEM:        LDX I,2\r
+10$:   LDA ZX,OMESL            ; LAST MESSGE PUSH START?\r
+       AND I,7F\r
+       CMP I,M.PS\r
+       BEQ 31$                 ;YES, SKIP.\r
+       CMP I,M.IC              ;INSERT COINS?\r
+       BEQ 31$                 ;YES, SKIP\r
+       LDA ZX,PSTIM            ;SELECTED?\r
+       BNE 15$\r
+       LDA I,M.RDY             ;YES\r
+       BNE 30$\r
+15$:   LDA I,M.SWNG            ;ASSUME #2 OFFENS\r
+       CPX OFFENS\r
+       BEQ 20$\r
+       LDA I,M.PTCH            ;#1 OFFENS\r
+20$:   BIT INTCNT              ;FLASH AT ABOUT 1 HZ\r
+       BMI 30$\r
+       ORA I,80                ;BLINK\r
+30$:   JSR REPLAC\r
+31$:   DEX\r
+       DEX                     ;NEXT PLAYER\r
+       BPL 10$\r
+       RTS\r
+       .PAGE\r
+       .SBTTL BANNER\r
+;BLOCK NAME:   BANNER\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  BANNER WILL OUTPUT AN EMPTY SCOREBOARD AND INITIALIZE\r
+;              LOCATIONS SCBDLH, SCBDLV, SCBDRH AND SCBDRV\r
+;INPUT PARAMS: NONE\r
+;OUTPUT PARAMS:        SCBDLH,SCBDLV,SCBDRH,SCBDRV\r
+;REG'S USED:   A\r
+;SUBRT'S USED: WRITEB\r
+;\r
+BANNER:        LDA I,M.BAN1            ;OUTPUT SCOREBOARD\r
+       JSR WRITEB\r
+       LDA I,M.BAN2\r
+       JSR WRITEB\r
+       LDA I,M.BAN3\r
+       JSR WRITEB\r
+       LDA I,5D                ;SET UP SCOREBOARD LOCATIONS\r
+       STA SCBDRH\r
+       LDA I,3D\r
+       STA SCBDRV\r
+       LDA I,2\r
+       STA SCBDRH+1\r
+       STA SCBDRV+1\r
+       LDA I,0A0\r
+       STA SCBDLH\r
+       LDA I,0C0\r
+       STA SCBDLV\r
+       LDA I,3\r
+       STA SCBDLH+1\r
+       STA SCBDLV+1\r
+       RTS\r
+       .PAGE\r
+       .SBTTL DISPLAY STATISTICS\r
+;\r
+;BLOCK NAME:   DSTAT\r
+;BLOCK TYPE:   SUBROUTINE\r
+;DESCRIPTION:  DSTAT WILL DISPLAY CURRENT STATISTICS\r
+;\r
+DSTAT: LDA OUTS                ;OUTS\r
+       JSR ASCAX               ;CONVERT TO ASCII\r
+       TXA\r
+       LDY I,57                ;WRITE TO EACH SIDE\r
+       JSR WRTAN\r
+       LDY I,0C6\r
+       JSR WRTAN\r
+       LDA BALLS               ;BALLS\r
+       JSR ASCAX               ;CONVERT TO ASCII\r
+       TXA\r
+       LDY I,4F                ;WRITE TO BOTH\r
+       JSR WRTAN\r
+       LDY I,0CE\r
+       JSR WRTAN\r
+       LDA STRIKE              ;STRIKES\r
+       JSR ASCAX               ;CONVERT TO ASCII\r
+       TXA\r
+       LDY I,53                ;WRITE TO BOTH\r
+       JSR WRTAN\r
+       LDY I,0CA\r
+       JSR WRTAN\r
+       LDA RUNS                ;RUNS FOR #1\r
+       JSR ASCAX\r
+       LDY I,4B\r
+       CMP I,'0                ;SUPPRESS ZERO\r
+       BNE 30$\r
+       LDA I,0\r
+30$:   PHA                     ;SVE HIGH BYTE\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       PLA\r
+       LDY I,0D2               ;ON OTHER SIDE\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       LDA RUNS+2              ;RUNS FOR #2\r
+       JSR ASCAX\r
+       LDY I,02B\r
+       CMP I,'0                ;SUPPRESS ZERO\r
+       BNE 40$\r
+       LDA I,0\r
+40$:   PHA                     ;SAVE HIGH BYTE\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       PLA\r
+       LDY I,0F2               ;DISPLAY ON OHTER SIDE\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       LDA ININGS              ;DISPLAY INNINGS PURCHASED\r
+       JSR ASCAX\r
+       LDY I,5A\r
+       CMP I,'0\r
+       BNE 50$\r
+       LDA I,0\r
+50$:   PHA                     ;SAVE HIGH BYTE\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       PLA                     ;DISPLAY ON OTHER SIDE\r
+       LDY I,0C3\r
+       JSR WRTAN\r
+       TXA\r
+       JSR WRTAN\r
+       RTS\r
+       .PAGE\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$,20,46$-1$,40,47$-1$\r
+       .BYTE 51,6$-1$,51,7$-1$,50,8$-1$\r
+       .BYTE 51,9$-1$,53,10$-1$,51,11$-1$,52,12$-1$\r
+       .BYTE 50,14$-1$,53,15$-1$,50,16$-1$\r
+       .BYTE 50,5$-1$,54,17$-1$,51,0,4E,2$-1$,55,3$-1$\r
+       .BYTE 4E,18$-1$,52,M.20-1$,52,M.21-1$,51,M.22-1$\r
+       .BYTE 50,M.23-1$,4F,M.24-1$\r
+MESLST =.\r
+1$:    .ASCIN /INSERT@C0INS/\r
+2$:    .ASCIN /1@C0IN@1@INNING/\r
+3$:    .ASCIN /0UT/\r
+45$:   .BYTE 1B,1D,1E,1F,20,21,22,23\r
+       .BYTE 24,25,26,0,54,0,0,4A\r
+       .BYTE 4F,0,51,57,58,0,0\r
+       .BYTE 5A,3A,0,3B,3E,0BF\r
+46$:   .BYTE 3C\r
+       .REPT 9.\r
+       .BYTE 1B\r
+       .ENDR\r
+       .BYTE 9B\r
+47$:   .BYTE 3D\r
+       .REPT 9.\r
+       .BYTE 1B\r
+       .ENDR\r
+       .BYTE 9B\r
+5$:    .ASCIN /SIDE@RETIRED/\r
+6$:    .ASCIN /GAME@0VER/\r
+\r
+7$:    .ASCIN /SELECT@HIT/\r
+8$:    .ASCIN /SELECT@PITCH/\r
+9$:    .ASCIN  /BALL/\r
+10$:   .ASCIN  /STRIKE/\r
+11$:   .ASCIN  /F0UL@BALL/\r
+12$:   .ASCIN  /H0ME@RUN/\r
+14$:   .ASCIN  /HIT@BATTER/\r
+15$:   .ASCIN  /TRIPLE/\r
+16$:   .ASCIN /D0UBLE@PLAY/\r
+17$:   .ASCIN  /READY/\r
+18$:   .ASCIN /GAME@ALM0ST@0VER/\r
+M.20:  .ASCIN /LINE@0UT/\r
+M.21:  .ASCIN /FLY@0UT/\r
+M.22:  .ASCIN /MISSED@BASE/\r
+M.23:  .ASCIN  /PUSH@START/\r
+M.24:  .ASCIN  /ATARI@BASEBALL/\r
+THRSHD:        .BYTE 0,0,0,0,89,85,22,16\r
+       .BYTE 89,84,22,17,89,83,22,18\r
+       .BYTE 89,81,22,19,89,7E,22,1A\r
+       .BYTE 89,7C,22,1C,89,7C,23,1C\r
+       .BYTE 89,7E,24,1C,89,81,25,1C\r
+       .BYTE 89,82,27,1C,89,84,28,1C\r
+       .BYTE 0,0,0,0\r
+BATNGL:        .BYTE 90,98,0A0,0A8,0B0,0B8,0C0,0C8\r
+       .BYTE 0D0,0D8,0E0,0E8,0F0,0\r
+SPDTBL:        .BYTE 90,84,68,5C,34,30,28,21\r
+SKILL: .BYTE 4C,55,5E,68\r
+INITBL:        .BYTE 1C,84,60,84,10,84,6C,48,91,60\r
+       .BYTE 66,0C0,8B,0AC,0C0,0E0,0D8,87,0C0,30\r
+       .BYTE 21,8A,0,0,0,0,0,0,5D,84,0,0\r
+FRED:  .BYTE 84,60,86,24,46,61,80,9D\r
+       .BYTE 0C2,60,88,9B\r
+BGOALH:        .BYTE 24\r
+BGOALV:        .BYTE 84\r
+       .BYTE 5E,4A,98,84,5E,0C0\r
+       .BYTE 24,84\r
+CKS7:  .BYTE 2F\r
+IVGOAL = FRED-2\r
+IHGOAL = IVGOAL+1\r
+MAINND:\r
+       .END\r
+\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/A34711.1B b/A34711.1B
new file mode 100644 (file)
index 0000000..e627124
Binary files /dev/null and b/A34711.1B differ
diff --git a/A34711.1C b/A34711.1C
new file mode 100644 (file)
index 0000000..54d0a4d
--- /dev/null
+++ b/A34711.1C
@@ -0,0 +1,524 @@
+       .TITLE BSINT\r
+       .RADIX 16\r
+       .ASECT\r
+       .IIF NDF,NTB,NTB=1\r
+       .GLOBL EOZP,$COINA,$LAM,$LMBIT,$CNSTT,$PSTSL\r
+       .GLOBL $CCTIM,$LMTIM,$INTCT,MAINND,PLAYIT\r
+       .GLOBL EOPROG\r
+       .INCLUDE BSCOMN.XX\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 MAINND\r
+       .=.-1\r
+       LDA AX,106\r
+       SBC I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD MAINND\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 INTCNT              ;VBLANK?\r
+       AND I,3\r
+       CMP I,3\r
+       LDA TOUT1\r
+       BCC 1$\r
+       EOR FLASH\r
+       AND I,7F\r
+       EOR FLASH\r
+       STA TOUT1\r
+1$:    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
+       BPL 30$\r
+       LDA I,1                 ;2 FIELD'S PER FRAME\r
+       STA FIELD               ;(1,0)\r
+       INC SYNC                ;SYNC UP MAINLINE\r
+       JSR MOTUP               ;UPDATE MOTION OBJECT POSITIONS\r
+\r
+;+13 MINIMUM\r
+\r
+30$:   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
+25$:   JSR DEBNCE              ;IF NOT ALREADY\r
+\r
+       .SBTTL  HANDLE SOUNDS\r
+SOUND: LDA WHISTL      ;WHISTLE\r
+       BEQ 1$\r
+       LDA INTCNT      ;WARBLE\r
+       LSR\r
+       LSR\r
+       AND I,5\r
+       BNE 1$\r
+       DEC WHISTL\r
+1$:    ORA BEEP                ;STEADY TONE\r
+       ORA I,4\r
+12$:   LSR THUD        ;HIT SOUND\r
+       BCC 2$\r
+15$:   ORA I,2\r
+2$:    BIT CRACK\r
+       BMI 40$         ;DELAY\r
+       BVC 20$         ;NO THING\r
+       LDA I,0D        ;START\r
+       STA CROWD\r
+       LDA I,0         ;INDICATE DELAY\r
+       STA CRACK\r
+       LDA I,7\r
+       BNE 20$\r
+40$:   LDA CROWD\r
+       SEC\r
+       SBC I,4         ;DELAY SOUND\r
+       STA CROWD\r
+       LSR\r
+       BNE 40$         ;NOT DONE YET\r
+       STA CRACK       ;DONE\r
+20$:   ORA Z,FLASH\r
+       BIT TOUT1\r
+       BPL 21$\r
+       ORA I,80\r
+       BNE 22$\r
+21$:   AND I,7F\r
+22$:   STA TOUT1\r
+       LDA I,98                ;RESET LATCH\r
+       AND Z,FLASH\r
+       STA Z,FLASH\r
+       LDA I,20        ;A) SLAM BIT   B) TURN ON SOUNDS\r
+       BIT ATRACT      ;IN ATTRACT?\r
+       BMI 3$          ;NO\r
+       AND INPUT       ;SLAM BIT ON?\r
+       BNE 25$         ;NO\r
+       LDA I,0FF       ;YES, INITIALIZE WHISTLE\r
+       STA WHISTL\r
+25$:   LDA WHISTL      ;ABUSE?\r
+       BEQ 3$          ;NO\r
+       LDA I,20        ;YES TURN ON SOUNDS\r
+3$:    ORA CROWD       ;INCLUDE CROWD SOUNDS\r
+       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
+       LDA BSTMP               ;UPDATE BAT STAMP\r
+       STA A,MOBJ\r
+       LDX I,30.               ;OBJ. 0-15, 2 BYTES @\r
+1$:    LDA AX,HPOSH\r
+       LDY OFFENS\r
+       BEQ 2$\r
+       LDA I,0F8\r
+       SEC\r
+       SBC AX,HPOSH\r
+2$:    STA AX,HHPOS            ;OUT TO HARDWARE\r
+       LDA AX,VPOS             ;THIS ONE'S PRE-ADJUSTED\r
+       LDY OFFENS\r
+       BEQ 3$\r
+       LDA I,08\r
+       SEC\r
+       SBC AX,VPOS\r
+3$:    STA AX,HVPOS            ;CORRECT OR BLANKED, OUT TO HDW.\r
+       DEX\r
+       DEX\r
+       BPL 1$                  ;WHILE OBJ # >= 0\r
+4$:    RTS\r
+\r
+\f      .SBTTL POWER-ON-RESET\r
+RESET: LDX I,0DF\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
+       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
+       LDA I,0                 ;INIT TPC\r
+       .=.-1\r
+       .WORD PLAYIT-1\r
+       .=.-1\r
+       STA Z,TPC\r
+       LDA I,0\r
+       .=.-1\r
+       .ENABL M68\r
+       .WORD PLAYIT-1\r
+       .DSABL M68\r
+       .=.-1\r
+       STA Z,TPC+1\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
+       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,31.               ;32 PAGES OF ROM\r
+       TXA                     ;SEED FOR L.R.C.\r
+                               ;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,3                 ;2 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,0A\r
+2$:    STA AX,HPICT\r
+       EOR I,0C0\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
+;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,0F                        ;ISOLATE COIN MODE\r
+       CLC\r
+       ADC I,70                ;MAKE A CODE\r
+       STA A,SCRFLD+28         ;DISPLAY ON SCROLLFIELD\r
+       JMP SWTEST              ;LOOP WHILE TEST SW IS ON\r
+ERMSG: .ASCII /BAD@R0M@0K/\r
+       .ASCII /BAD@RAM@0K/\r
+EOPROG:        .REPT 6\r
+       .BYTE 0\r
+       .ENDR\r
+       .VCTRS 7FFA,RESET,RESET,IRQ\r
+       .END\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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/BASBAL.DOC b/BASBAL.DOC
new file mode 100644 (file)
index 0000000..8f13ec7
Binary files /dev/null and b/BASBAL.DOC differ
diff --git a/BASBAL.MAP b/BASBAL.MAP
new file mode 100644 (file)
index 0000000..a3fff61
Binary files /dev/null and b/BASBAL.MAP differ
diff --git a/BSAN.XX b/BSAN.XX
new file mode 100644 (file)
index 0000000..2f576c7
Binary files /dev/null and b/BSAN.XX differ
diff --git a/BSCOMN.XX b/BSCOMN.XX
new file mode 100644 (file)
index 0000000..3353602
--- /dev/null
+++ b/BSCOMN.XX
@@ -0,0 +1,277 @@
+       .SBTTL EQUATES\r
+       .GLOBL  MOOLAH,IRQ,RESET,START,MAINND,PLAYIT\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
+FSLAST =0C             ;LAST SWING PICTURE\r
+BLAST  =06             ;LAST BUNT PICTURE\r
+CRVSIN =1              ;CURVE BALL ANGLE INCREMENT\r
+CTCHFL =02             ;BALL CAUGHT FLAG (BY CATCHER)\r
+HITFLG =01             ;BALL HIT FLAG\r
+FLDFLG =04             ;BALL FIELDED FLAG\r
+THROFL =08             ;BALL THROWN FLAG\r
+PLYEND =10             ;END OF PLAY FLAG\r
+FOUL   =20             ;FOULD BALL FLAG\r
+FBSPD  =40             ;INITIAL FAST BALL SPEED\r
+CRVSPD =30             ;INITIAL CURVE BALL SPEED\r
+KBSPD  =20             ;INITIAL KNUCKLE BALL SPEED\r
+CHUSPD =30             ;SECONDARY CHANGE UP SPEED\r
+STCRV1 =61.            ;BASE HORIZONTAL POSITION TO START CURVE\r
+KBRFLG =80             ;KNUCKLE BALL LEFT FLAG\r
+KBLFLG =40             ;KNUCKLE BALL RIGHT FLAG\r
+ANGL45 =1F             ;45 DEGREES\r
+PROX   =-4             ;PROXIMITY VALUE (USED IN CATCH)\r
+FPROX  =6              ;PROXIMITY VALUE (USED IN COLCHK)\r
+BTPROX =16.            ;BASE COLLISION PROXIMITY VALUE\r
+ANGL90 =3F             ;40 DEG.\r
+HDUGD  =0              ;DEFENSE DUGOUT HORIZ LOCATION\r
+VDUGD  =38             ;DEFENSE DUGOUT VERT LOCATION\r
+HDUGO  =0              ;OFFENSE DUGOUT HORIZ LOCATION\r
+VDUGO  =0C8            ;OFFENSE DUGOUT VERT LOCATION\r
+BTHPOS =HPOSH          ;BAT=M.O. #1\r
+BTVPOS =VPOS\r
+NGL180 =7F             ;180 DEG\r
+SLDVAL =8              ;# OF FRAMES TO "SLIDE"\r
+PITCHER        =1              ;PLAYER NUMBERS\r
+CATCHER        =2\r
+FIRSTB =3\r
+SCNDB  =4\r
+THIRDB =5\r
+SSTOP  =6\r
+BATTER =10.\r
+INFIELD        =6              ;HIGHEST INFIELDER #\r
+INMAX  =0A0\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   =6000           ;8K 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.BAN3 =M.BAN2+1\r
+M.GO   =M.BAN3+1       ;MESSAGE "GAME OVER"\r
+M.SWNG =M.GO+1         ;"SELECT SWING"\r
+M.PTCH =M.SWNG+1       ;"SELECT PITCH"\r
+M.BALL =M.PTCH+1       ;"BALL"\r
+M.STRK =M.BALL+1       ;"STRIKE"\r
+M.FOUL =M.STRK+1       ;"FOUL BALL"\r
+M.HR   =M.FOUL+1       ;"HOME RUN"\r
+M.HB   =M.HR+1         ;  "    "HIT BATSMAN"\r
+M.TRPL =M.HB+1         ;  "    "TRIPLE"\r
+M.DP   =M.TRPL+1       ;  "    "OFF SIDES"\r
+M.SR   =M.DP+1         ;  "    "SIDES RETIRED"\r
+M.RDY  =M.SR+1 ;  "    "READY"\r
+M.IC   =M.RDY+1        ;  "    "INSERT COINS"\r
+M.ECAT =M.IC+1         ;  "    "EACH COIN ADDS TIME"\r
+M.OUT  =M.ECAT+1       ;  "    "OUT"\r
+M.GAO  =M.OUT+1        ;  "    "GAME ALMOST OVER"\r
+M.LOUT =M.GAO+1                ;"LINE OUT"\r
+M.FOUT =M.LOUT+1               ;"FLY OUT"\r
+M.MB   =M.FOUT+1               ;"MISSED BASE"\r
+M.PS   =M.MB+1                 ;"PRESS START"\r
+M.AB   =M.PS+1                 ;"ATARI BASEBALL"\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
+WHISTL:        .BLKB 1         ;WHISTLE SOUND TIMER (WARBLED BEEP)\r
+ADL:   .BLKB 1\r
+ADH:   .BLKB 1\r
+THUD:  .BLKB 1         ;HIT SOUND TIMER\r
+CRACK: .BLKB 1\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
+POLYL: .BLKB 1         ;USED IN RAND\r
+POLYH: .BLKB 1         ;  "\r
+J:     .BLKB 1         ;BUCKET FOR MAINLINE\r
+K:     .BLKB 1         ;  "\r
+TOBALL:        .BLKB 1         ;WHAT FIELDER MOVES TO BALL\r
+BALFLG:        .BLKB 1         ;PLAY STATUS\r
+CALL:  .BLKB 1         ;PITCH CALL (1=STRIKE, 0=BALL)\r
+FAIR:  .BLKB 1         ;FLAG FOR FAIR BALL\r
+HASBAL:        .BLKB 1         ;WHO HAS THE BALL\r
+SSTART:        .BLKB 1         ;SWING STARTED FLAG\r
+BATOUT:        .BLKB 1         ;BATTER OUT FLAG\r
+FSTFLD:        .BLKB 1         ;BALL NOT FIELDED=0\r
+HOMRUN:        .BLKB 1         ;HOMERUN=POS (NON ZERO) TRIPLE NEG\r
+FLYOUT:        .BLKB 1         ;FLYBALL OUT\r
+FLASH: .BLKB 1         ;FLASH SCOREBOARD=80, LOW 2 BITS=VOICE\r
+RUNPLY:.BLKB 1         ;RUNS ON EACH PLAY\r
+MISSED:        .BLKB 1         ;MISSED BASE\r
+ANMSK: .BLKB 1         ;3F OR 0, USED IN MESSAGE ROUTINE\r
+PINFO: .BLKB 1         ;PITCH INFORMATION\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
+FLDBAL:        .BLKB 1         ;OUTFIELD TO BALL\r
+OFFENS:        .BLKB 1         ;POINTS TO BASE OF OFFENSE PLAYER\r
+PLAYER:        .BLKB 1         ;SAVE X -> PLAYER\r
+WPLAYR: .BLKB 1                ;DIRECTION INDICATOR FOR BATTER-RUNNER\r
+FORCE: .BLKB 1         ;FORCE BASES\r
+SLIDE: .BLKB 1         ;SLIDING IF NEGATIVE\r
+SAVE1: .BLKB 1         ;USED IN BATRUN FOR SPECIAL PICTURE HANDLING\r
+FRAME: .BLKB 1         ;COUNT FRAMES (20 HZ)\r
+RUNTIM:        .BLKB 1         ;RUN CLOCK IF A 1, STOP IF 0\r
+BCNT:  .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
+BSTMP: .BLKB 1         ;BAT STAMP\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
+SCORE: .BLKB 4         ;2 BYTES EACH\r
+;BELOW ARE OBJECT CONTROL BLOCKS\r
+ANGLE: .BLKB 1         ;ANGLE BALL IS TRAVELING\r
+SPEED: .BLKB 1         ;SPEED BALL IS TRAVELING\r
+TEMP1: .BLKB 1\r
+TEMP2: .BLKB 1\r
+TEMP3: .BLKB 1\r
+TDEC:  .BLKB 1         ;TEMP FOR SWING ROUTINE\r
+TMASK: .BLKB 1         ;"      "       "       "\r
+BITMAP:        .BLKB 2         ;BIT MAP FOR LEG MOTION\r
+FLDCTL:        .BLKB 3         ;FIELDERS TO CONTROL\r
+RUNS:  .BLKB 1         ;FUNS OFFENS #1\r
+OUTS:  .BLKB 2         ;OUTS & RUNS OFFENS #2\r
+INNING:        .BLKB 1         ;CURRENT INNING\r
+BALLS: .BLKB 1\r
+STRIKE:        .BLKB 1\r
+BASE:  .BLKB 4         ;BASE OBTAINED BY EACH RUNNER\r
+MOVE:  .BLKB 4         ;BASE EACH RUNNER HEADED TO: 0=STOPPED, FF=TO DUGOUT\r
+ININGS:        .BLKB 1\r
+THPOS: .BLKB 2         ;TEMP HPOS\r
+TVPOS: .BLKB 1\r
+THGOAL:        .BLKB 1\r
+TVGOAL:        .BLKB 2\r
+THINC: .BLKB 2\r
+TVINC: .BLKB 2\r
+VDISP: .BLKB 1\r
+HDISP: .BLKB 2\r
+W30TIM:        .BLKB 1         ;0=NO WARNING,1=WARNING GIVEN,OTHERWISE IS TIMER\r
+OLDOFF:        .BLKB 1         ;OLD OFFENSE, USED BY PAUSE,CHANGE\r
+LEDTMP:        .BLKB 1         ;USED BY PSEL\r
+QUOT:  .BLKB 4         ;"M.Q." REGISTER\r
+DIVSOR:        .BLKB 2         ;"L" REGISTER\r
+CLCK2S:        .BLKB 1         ;2 SEC CLOCK\r
+TPC:   .BLKB 2         ;PC LOCATION FOR MODIFIED CASE\r
+TOBALX:        .BLKB 1         ;OUTFIELDER TO BALL\r
+INSPDX:        .BLKB 1         ;CURRENT MAX SPEED FOR INFIELD FIELDING\r
+MPSTIM:        .BLKB 1         ;MASTER PLAY SELECT TIMER\r
+CLK32S:        .BLKB 1         ;MASTER PLAY TIMER\r
+SCBDRV:        .BLKB 2         ;SCOREBOARD POINTER RIGHT VISITOR\r
+SCBDRH:        .BLKB 2         ;SCOREBOARD POINTER RIGHT HOME\r
+SCBDLV:        .BLKB 2         ;SCOREBOARD POINTER LEFT VISITOR\r
+SCBDLH:        .BLKB 2         ;SCOREBOARD POINTER LEFT HOME\r
+PLYR1: .BLKB 1         ;1 PLAYER INDICATOR\r
+CMPLYR:        .BLKB 1         ;COMPUTER PLAYER #\r
+SAVPIC:        .BLKB 4         ;SAVE LOCATIONS FOR INTERRUPT RTN\r
+SETFLG:        .BLKB 1         ;SETUP FLAG\r
+THRTMR:        .BLKB 1         ;THROW TIMER\r
+PLYR2: .BLKB 1         ; 2 PLAYER  FLAG\r
+RUNING:        .BLKB 1         ;RUNS IN INNING\r
+EOZP:                  ;END-OF-ZERO-PAGE\r
+       .SBTTL TRACE POINTERS\r
+;BELOW ARE INPUT TO TRACE ROUTINE\r
+       .=100\r
+TSRC:  .BLKB 2         ;POINTS TO WORD TO BE TRACED\r
+TDST:  .BLKB 1         ;POINT TO SCREEN LOCATION\r
+\f      .SBTTL MISC.(NON-ZERO-PAGE) RAM\r
+       .=280\r
+HPOSL: .BLKB 1         ;FRACTIONAL YDS OF H-POSN\r
+HPOSH: .BLKB 1         ;INTEGRAL YDS OF H-POSN\r
+       .BLKB 28.\r
+BHPOSL =HPOSL+<BALLNO*2>\r
+BHPOSH =HPOSH+<BALLNO*2>\r
+FDHPOS: .BLKB 2                ;FIRST-DOWN MARKER H-POS\r
+\r
+VPOSL: .BLKB 1         ;VPOS LOW BITS (< 1/8 YD)\r
+VPOS:  .BLKB 1         ;VPOS IN YDS/8\r
+       .BLKB 28.       ;OTHER MEN\r
+BVPOSL =VPOSL+<BALLNO*2>\r
+BVPOS  =VPOS+<BALLNO*2>\r
+FDVPOS: .BLKB 2                ;FIRST-DOWN MARKER V-POS\r
+\r
+FLAGS: .BLKB 1         ;D7=HAS BEEN AT HGOAL, VGOAL, D1 (ON BALL) IN PASS\r
+;D0=IN COLLISION, D2=IN COLLISION WITH OPPONENT\r
+\r
+\r
+VGOAL: .BLKB 1         ;FIELDERS GOAL (POSITION)\r
+HGOAL: .BLKB 1\r
+       .BLKB 30.       \r
+\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
diff --git a/BSMOT.ROM b/BSMOT.ROM
new file mode 100644 (file)
index 0000000..d5a5aea
Binary files /dev/null and b/BSMOT.ROM differ
diff --git a/PENNY.OLD b/PENNY.OLD
new file mode 100644 (file)
index 0000000..a7d02d1
--- /dev/null
+++ b/PENNY.OLD
@@ -0,0 +1,490 @@
+;        .TITLE PENNY- COIN & CREDIT ACCRUER\r
+        .SBTTL *********************************\r
+        .SBTTL * PROGRAMERS: DOWNEND & ALBAUGH *\r
+        .SBTTL *                               *\r
+        .SBTTL * CHECKER:                      *\r
+        .SBTTL *                               *\r
+        .SBTTL *********************************\r
+        .SBTTL EXPLANATION\r
+        .RADIX 16\r
+       .ENABL LC\r
+        .LIST MEB\r
+;COIN ROUTINE FOR 16-OPTION STANDARD AS PER MEMO\r
+;FROM STEVE BRISTOW DATED 9.27.77 OR 4-OPTION STANDARD\r
+;PER MEMO FROM FRANK BALLOUZ 4/20/78\r
+;\r
+;THREE-MECH, INCLUDE, AND RTS, OPTIONS ADDED\r
+;7-MAY-79 (MEA)\r
+;\r
+        .SBTTL DEFAULT ASSIGNMENTS\r
+;THESE DEFAULTS CONFIGURE FOR SPRINT4 HARDWARE\r
+        .LIST CND\r
+        .IIF NDF,MODES,MODES=4          ;FOUR COIN MODES STANDARD\r
+       .IIF NDF,MECHS,MECHS=2          ;# OF MECHS\r
+       .IIF NDF,INCLUDE,INCLUDE=0      ;NOT ".INCLUDE"'D\r
+       .IIF NDF,RTS,RTS=1              ;EXIT VIA RTS\r
+       .IF EQ,MODES-16.                ;IF MODES=16\r
+       .IIF NDF,SEPCCT,SEPCCT=1        ;DEFAULT SEPARATE COIN-COUNTS\r
+       .IFF                            ;IF MODES=0 OR 4\r
+       .IIF NDF,SEPCCT,SEPCCT=0        ;DEFAULT SAME COIN-COUNT\r
+       .ENDC\r
+        .IIF NDF,OFFSET,OFFSET=2        ;SWITCHES AND STATUS BYTES TWO-APART\r
+        .IIF NDF,COIN,COIN=0            ;COIN IS LOW-TRUE\r
+        .IIF NDF,CNTINT,CNTINT=1        ;COUNT INTERRUPTS (IN $INTCT)\r
+        .IIF NDF,SLAM,SLAM=1            ;SLAM IS HIGH-TRUE\r
+        .IIF NDF,CMZP,CMZP=1            ;COIN MODE IS IN ZERO-PAGE\r
+        .IIF NDF,SHRCMD,SHRCMD=1        ;SHARE A BYTE FOR CMODE, FIRST\r
+        .IIF NDF,LONGST,LONGST=1        ;USE LONG (1/2 SEC) STRINGTIMER\r
+        .IIF NDF,COIN67,COIN67=0        ;COINS NOT IN D7,D6 OF SAME BYTE\r
+       .IIF NDF,COIN01,COIN01=0        ;COINS NOT IN D0,D1 EITHER\r
+        .IIF NDF,PRST,PRST=30.          ;PRE-COIN SLAM KILLS COINS FOR 30 FRAMES\r
+        .IIF NDF,POST,POST=30.          ;POST-COIN SLAM KILLS COINS WITHIN 30 FRAMES\r
+       .IIF NDF,CTCOIN,CTCOIN=0        ;SET TO ONE TO COUNT TOTAL COINS\r
+       .IIF NDF,CTCRED,CTCRED=0        ;SET TO ONE TO COUNT TOTAL CREDITS\r
+       .IIF NDF,PULSE,PULSE=4          ;4 FRAME (66 MS.) PULSE FOR COIN-COUNTER\r
+        .IF NE,CMZP\r
+        .MACRO GCM\r
+        LDA Z,$CMODE            ;GET COIN MODE FROM ZERO-PAGE\r
+        .IIF NE,SHRCMD, AND I,MODES-1&0FF       ;STRIP "FIRST"\r
+        .ENDM\r
+        .ENDC\r
+        .NLIST CND\r
+;ENTRY POINT\r
+        .GLOBL MOOLAH\r
+;\r
+;EXTERNAL REFERENCES\r
+       .IF NE,MODES\r
+       .IF NE,CMZP\r
+        .GLOBL $CMODE                   ;INPUT COIN MODE\r
+       .ENDC\r
+       .ENDC\r
+        .GLOBL $COINA,$LAM              ;SWITCH LOCATIONS (COIN & SLAM)\r
+        .GLOBL $LMBIT                   ;MASK WITH 1 IN BIT WHERE SLAM SW. IS\r
+        .GLOBL $CNSTT,$PSTSL           ;INTERNAL LOCATIONS\r
+       .IF NE,LONGST!PULSE-2           ;IF LONG STRING-TIMER OR PULSES, WE NEED\r
+       .GLOBL $INTCT                   ;INTERRUPT COUNTER\r
+       .ENDC\r
+       .IF EQ,MODES-16\r
+        .GLOBL $FIRST                   ;COULD SHARE BYTE WITH CMODE\r
+       .ENDC\r
+        .GLOBL $LMTIM,$CNCT             ;SLAM-TIMER, COINCOUNT\r
+       .IF NE,MODES\r
+        .GLOBL $$CRDT                   ;RESULT OF ALL THIS\r
+       .ENDC\r
+       .IF NE,CTCOIN!CTCRED\r
+       .GLOBL $CCTIM\r
+       .ENDC\r
+        .IF NE,MODES&<MODES-4>&<MODES-16.>\r
+        .ERROR                  ;3 FLAVORS-0,4, OR 16 MODES\r
+        .ENDC\r
+       .IF NE,<PULSE-2>&<PULSE-4>&<PULSE-8>    ;CHECK PULSE LENGTH SPEC'D\r
+       .ERROR                  ;2,4,OR 8 FRAME PULSES ONLY\r
+       .ENDC\r
+       .IF NE,<MECHS-2>*<MECHS-3>      ;CHECK # OF MECHS SPEC'D\r
+       .ERROR                  ;2 OR 3 MECHS ONLY, PLEASE\r
+       .ENDC\r
+       .IF EQ,MECHS-3\r
+       .IF EQ,MODES-16\r
+       .ERROR                  ;16 MODES ON 3 MECHS DOESN'T WORK\r
+       .ENDC                   ;MODES-16\r
+       .ENDC                   ;MECH-3\r
+       .IF EQ,RTS\r
+       .IF EQ,INCLUDE\r
+       .ERROR                  ;NO RTS, NO INCLUDE???\r
+       .ENDC                   ;INCLUDE\r
+       .ENDC                   ;RTS\r
+        .IIF GT,PRST-31.,PRST=31.\r
+        .IIF GT,POST-63.,POST=63.\r
+        .IF EQ,MODES-16\r
+        .REPT 0\r
+When a coin is detected, the coin-count ($CNCT) is incremented.  Then the  "price"  of  "x\r
+credits" is fetched from CPTAB.  If the coin-count.GE.price, then credit is incremented as\r
+indicated in CPTAB.\r
+An entry in CPTAB looks like:\r
+\r
+        (XXXXFAAA)=1 BYTE\r
+        XXXX = CREDIT, I.E., no. of plays\r
+        F    = 1 IF later coins count one more credit than first coin\r
+        AAA = PRICE, I.E., no. of coins for XXXX CREDITS\r
+\r
+Thus any variation from 1 PLAY/7 COINS to 16 PLAYS/1 COIN is possible\r
+\r
+The index into CPTAB is created as follows:\r
+        (XXXACCCC)=1 BYTE\r
+        X : ALWAYS ZERO\r
+        A : 0 = LEFT coin mech\r
+            1 = RIGHT coin mech\r
+        cccc:   coin mode (0000-1111)\r
+        .endr\r
+        .endc\r
+        .rept 0\r
+        The coin routine assumes the presence of the following .GLOBL variables:\r
+   1) $$CRDT:   base page byte initialized to 0 on restart.  This is where accrued  credit\r
+        is  kept.   Should  be  decremented  for each player-start.  Note that a DECREMENT\r
+        instruction must be used to insure  mutual  exclusion  between  the  main  program\r
+        accessing  $$CRDT  and  the  interrupt-driven coin routine accessing $$CRDT".  Not\r
+        used if MODES=0\r
+   2) $CMODE:   base page byte that contains the coin option  switches  in  its  low-order\r
+        nybble  (high true).  You must put it there.  this is not used if flag CMZP=0.  In\r
+        this case you must define a macro to get the coin mode in the lsb's  of  the  ACC,\r
+        clearing the msb's, not disturbing carry\r
+   3) $CNSTT:   Two base page bytes ($CNSTT, $CNSTT+OFFSET) which should be initialized to\r
+        00 (the timers for coin detection).\r
+   4) $COINA:   Two locations containing coin switches in D7 Left mech  at  $COINA,  Right\r
+        mech  at  $COINA+OFFSET.   If  COIN67=1,  Switches  are  both in $COINA, D7-Right,\r
+        D6-Left.\r
+   5) $FIRST:   Base page byte.  Flag indicating whether first  coin  has  been  accepted.\r
+        Must  be initialized to plus (or zero, if SHRCMD=0) and reset to plus (or zero) at\r
+        the end of a game.  All other bits are ignored/maintained if the  flag  SHRCMD  is\r
+        set non-zero.  Used only if MODES=16\r
+   6) $CNCT:    2 base page bytes ($CNCT, $CNCT+OFFSET) which must be initialized to  zero\r
+        on pwron - coin counters (only one is used if MODES = 0 or 4)\r
+   7) $PSTSL:   Pair of base page bytes  ($PSTSL,  $PSTSL+OFFSET)used  to  time  post-coin\r
+        slam.\r
+   8) $LAM:     Address of the SLAM switch.  the bit position inside $LAM is specified  by\r
+        $LMBIT (see below)\r
+   9) $LMTIM:   Base  page  byte  used  as  a  timer  for  pre-slam  protection.   May  be\r
+        initialized  to  FF  at  pwron  to  disallow  coin input for 4 seconds.  Coins are\r
+        disallowed for two frames anyway.\r
+   10) $INTCT:  Interrupt counter for  long  string-timer.   If  CNTINT=1,  this  will  be\r
+        incremented  (default  case).   If CNTINT=0, this should be equated to an existing\r
+        counter.\r
+   11) $LMBIT:  Mask used to select which bit in the slam switch  byte  should  be  tested\r
+        (used as I,$LMBIT).  NOT A LOCATION, JUST A VALUE!!\r
+   12) $CCTIM:  TIMER FOR PULSES OUTPUT TO ELECTRO-MECHANICAL COUNTER. IF CTCOIN\r
+       OR CTCRED IS NON-ZERO, ROUTINE WILL RETURN WITH CARRY SET IF COIN\r
+       COUNTER SHOULD BE TURNED ON, CLEARED FOR OFF.\r
+Space requirements:\r
+                RAM: 9 bytes (8 if CMZP=0 or SHRCMD=1)\r
+                ROM: About 200 bytes\r
+The coin routine also assumes it will be called 4 times  a  frame,  where  one  frame=1/60\r
+second.   In  most  cases  this may be accomplished by making the coin routine part of the\r
+interrupt routine.\r
+SAMPLE BASE PAGE ALLOCATION:  (WHERE OFFSET=2)\r
+        $FIRST: .BLKB 1\r
+       $CCTIM: .BLKB 1         ;COIN COUNTER TIMER (IF USED)\r
+        $$CRDT: .BLKB 1\r
+        $CMODE: .BLKB 1         ;OR CMODE=FIRST\r
+        $PSTSL: .BLKB 1\r
+        $LMTIM: .BLKB 1\r
+                .BLKB 1                ;$PSTSL FOR SECOND MECH\r
+        $CNCT:  .BLKB 4\r
+        $CNSTT  =$CNCT+1\r
+        .ENDR\r
+        .IF EQ,MODES-16\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    2 COINS/PLAY-LEFT AND RIGHT\r
+  1:    1 COIN/PLAY-LEFT AND RIGHT\r
+  2:    2 PLAYS/COIN-LEFT AND RIGHT\r
+  3:    3 PLAYS/COIN-LEFT AND RIGHT\r
+  4:    4 PLAYS/COIN-LEFT AND RIGHT\r
+  5:    FIRST COIN-1 PLAY; SECOND AND EXTRA COINS-2 PLAYS/COIN\r
+  6:    FIRST COIN-2 PLAYS; SECOND AND EXTRA COINS-3 PLAYS/COIN\r
+  7:    LEFT=2 COINS/PLAY\r
+        RIGHT=1 COIN/PLAY\r
+  8:    LEFT=1 COIN/PLAY\r
+        RIGHT=1 COIN/2 PLAYS\r
+  9:    LEFT=2 PLAYS/COIN\r
+        RIGHT=4 PLAYS/COIN\r
+  A:    LEFT=FIRST COIN-1 PLAY; SECOND AND EXTRA COINS-2 PLAYS/COIN\r
+        RIGHT=FIRST COIN-3 PLAYS; SECOND AND EXTRA COINS-4 PLAYS/COIN\r
+  B:    LEFT=FIRST COIN-2 PLAYS; SECOND AND EXTRA COINS-3 PLAYS/COIN\r
+        RIGHT=FIRST COIN-5 PLAYS; SECOND AND EXTRA COINS-6 PLAYS/COIN\r
+  C:    LEFT=FIRST COIN-3 PLAYS; SECOND AND EXTRA COINS-4 PLAYS/COIN\r
+        RIGHT=FIRST COIN-7 PLAYS; SECOND AND EXTRA COINS-8 PLAYS/COIN\r
+  D:    LEFT=3 COINS/PLAY\r
+        RIGHT=1 COIN/PLAY\r
+  E:    LEFT=1 COIN/PLAY\r
+        RIGHT=3 PLAYS/COIN\r
+  F:    LEFT=3 PLAYS/COIN\r
+        RIGHT=6 PLAYS/COIN\r
+        .ENDR\r
+        .ENDC\r
+        .IF EQ,MODES-4\r
+        .REPT 0\r
+THE COIN MODES ARE:\r
+  0:    FREE PLAY- $CNCT is zeroed, $$CRDT is not changed\r
+  1:    2 PLAYS PER COIN\r
+  2:    1 PLAY PER COIN\r
+  3:    2 COINS PER PLAY\r
+        .ENDR\r
+        .ENDC\r
+        .REPT 0\r
+                   *** COIN DETECTION ***\r
+Coin detection, courtesy of Mike Albaugh, uses two counters in one  byte  ($CNSTT).   This\r
+byte  is  used to remember the condition of the coin switch.  The upper counter (D7,D6,D5)\r
+runs when the coin is absent and is reset when the coin is  present.   The  lower  counter\r
+(D4-D0)  runs  when  the  coin is present and is reset when the coin is absent, unless the\r
+coin was present for 5 successive samples.  This "unless"  enables  $CNSTT  to  "remember"\r
+that a coin has been VALID-HIGH while waiting for VALID-LOW.\r
+Basically, a valid coin is defined as between 16 and 800 ms of coin present, preceded  and\r
+followed  by  33 ms of coin absent.  The 33 ms lows need not immediately precede or follow\r
+the high.  The lower five bits count  down  from  31  when  the  coin  is  present.   This\r
+countdown  is  fast  (once  per  interupt)  for the first five samples (31-26, about 16-20\r
+milliseconds) then slow (once per EIGHT interrupts) for the remaining counts (26-0,  about\r
+800  ms).   The  count  then  stops  at zero.  This counter is reset if the coin goes away\r
+during the first five counts, I.E., the coin must be present for at least  16  ms.   After\r
+that  the coin must go away for eight counts to reset it.  This is because after the first\r
+five counts a coin is VALID HIGH and must not be reset until VALID LOW occurs  to  prevent\r
+mid-coin glitches from making a valid coin into 0 or 2 (or more) coins.\r
+\r
+The upper three bits count up from zero when the coin is absent.  The count  is  reset  if\r
+coin  is  ever  found  present.   When  the  count  finally wraps (8 samples, 33 ms).  The\r
+coin-present counter is checked.  A count from 27-31 (less than 16-20 ms) is too short.  A\r
+count of 0 (more than 800 ms) is too long.  Both of these cases are simply reset to 31.  A\r
+count of 1-26 is a (tentatively) valid coin.  The counter is again set to 31, but  another\r
+counter ($PSTSL) is started.\r
+\r
+$PSTSL is the POST-COIN-SLAM timer.  Initially  set  to  120,  it  counts  down  once  per\r
+interrupt  (4  times per frame) to give a nominal 1/2 second delay.  If the slam switch is\r
+seen during this time, $PSTSL is cleared, invalidating the coin.  The length of the  delay\r
+(in  frames)  is  defined by POST which defaults to 30.  It may be set as high as 63 (1.05\r
+seconds) by definition E.G.\r
+\r
+        POST=50         ;POST-SLAM=50 FRAMES\r
+\r
+SIMILARY A SLAM IS "REMEMBERED" FOR PRST frames (default=30, max=31) and no  coin  can  be\r
+"seen" during this time.\r
+\r
+Note that the proper initial  state  of  all  these  counters  etc  is  0,  therefore  the\r
+traditional power-on clear does the trick.  Since coins "transit" from $CNSTT to $PSTSL to\r
+$CNCT to $$CRDT, locations should be cleared in that order, I.E.   $$CRDT  should  be  the\r
+last location cleared.\r
+        .ENDR\r
+\f        .SBTTL MAINLOOP\r
+;INSTRUCTIONS IN BRACKETS( "[" AND "]" ) ARE FOR ILLUSTRATION ONLY, AND ARE NOT\r
+;ACTUALLY ASSEMBLED.\r
+MOOLAH:\r
+        LDX I,OFFSET*<MECHS-1> ;X IS USED TO INDEX FROM RIGHT TO LEFT COIN MECH\r
+        .IF EQ,COIN67!COIN01\r
+DETECT: LDA AX,$COINA\r
+        ASL\r
+        .IFF\r
+        LDA A,$COINA            ;GET COIN SWITCHES\r
+       .IF NE,COIN01\r
+DETECT:        LSR                     ;SHIFT SWITCH INTO CARRY\r
+       .IFF\r
+DETECT: ASL\r
+        .ENDC                  ;NE,COIN01\r
+       .ENDC                   ;EQ,COIN67!COIN01\r
+        LDA ZX,$CNSTT\r
+        AND I,31.               ;SHARED INST. SEE BELOW IN BRACKETS []\r
+        .IF EQ,COIN\r
+        BCS 5$                  ;BRANCH IF INPUT HIGH (COIN ABSENT)\r
+        .IFF\r
+        BCC 5$                  ;BRANCH IF INPUT LOW (COIN ABSENT)\r
+        .ENDC                  ;EQ,COIN\r
+;       [AND I,31.]             ISOLATE COIN-ON DOWN-COUNTER, RESET COIN-OFF UP-CTR.\r
+        BEQ 1$                  ;STICK AT 0 (TERMINAL COUNT)\r
+        .IF NE,LONGST\r
+        CMP I,27.               ;IN FIRST FIVE SAMPLES\r
+        BCS 10$                 ;YES, RUN FAST\r
+        TAY                     ;ELSE SAVE STATUS\r
+        LDA Z,$INTCT            ;CHECK INTERUPT CTR\r
+        AND I,7                 ;ARE D0-D2 ALL ONES?\r
+        CMP I,7\r
+        TYA                     ;STATUS BACK INTO ACC\r
+        BCC 1$                  ;SKIP IF NOT BOTH ONES\r
+10$:    SBC I,1                 ;CARRY SET\r
+        .IFF                   ;LONGEST\r
+        .IF EQ,COIN\r
+        SBC I,0                 ;CARRY CLEAR, THIS SUBTRACTS ONE\r
+        .IFF\r
+        SBC I,1                 ;CARRY SET OR WE WOULDN'T BE HERE\r
+        .ENDC                   ;COIN CONDITIONAL\r
+        .ENDC                   ;LONGST CONDITIONAL\r
+1$:     STA ZX,$CNSTT           ;SAVE UPDATED STATUS\r
+        LDA A,$LAM              ;CHECK SLAM SWITCH\r
+        AND I,$LMBIT\r
+        .IF NE,SLAM\r
+        BEQ 2$                  ;BRANCH IF BIT LO (SWITCH OFF)\r
+        .IFF\r
+        BNE 2$                  ;BRANCH IF BIT HI (SWITCH OFF)\r
+        .ENDC\r
+        LDA I,PRST*8            ;ELSE SET PRE-COIN SLAM TIMER\r
+        STA Z,$LMTIM            ;DECR. 8 TIMES/FRAME=PRST FRAMES\r
+2$:     LDA Z,$LMTIM            ;CHECK PRE-COIN SLAM TIMER\r
+        BEQ 3$                  ;O.K.\r
+        DEC Z,$LMTIM            ;ELSE RUN TIMER\r
+        LDA I,0\r
+        STA ZX,$CNSTT           ;CLEAR COIN STATUS\r
+        STA ZX,$PSTSL           ;CLEAR POST-COIN SLAM-TIMER\r
+3$:     CLC                     ;DEFAULT "NO COIN DETECTED"\r
+        LDA ZX,$PSTSL           ;CHECK POST-COIN SLAM-TIMER\r
+        BEQ 8$                  ;EMPTY, PROCEED\r
+        DEC ZX,$PSTSL           ;RUN TIMER\r
+        BNE 8$                  ;NOT DONE, PROCEED\r
+        SEC                     ;WHEN IT BECOMES ZERO, INDICATE A COIN\r
+        BCS 8$                  ;*** ALWAYS\r
+5$:;    [AND I,31.]             GET COIN-ON DOWN-CTR (ACTUALLY DONE BEFORE)\r
+        CMP I,27.               ;IS COIN VALID YET (ON FOR >4 SAMPLES)\r
+        BCS 6$                  ;NO, RESET IT\r
+        LDA ZX,$CNSTT           ;GET STATUS AGAIN\r
+        ADC I,32.               ;BUMP COIN-OFF UP-CTR.\r
+        BCC 1$                  ;IF IT DIDN'T WRAP, JUST STORE STATUS\r
+        BEQ 6$                  ;IT WRAPPED BUT COIN WAS ON TOO LONG, JUST RESET\r
+        CLC                     ;SET "VALIDITY" AGAIN\r
+6$:     LDA I,31.               ;RESET DOWN-COUNTER\r
+        BCS 1$                  ;BRANCH IF COIN TOO LONG OR TOO SHORT\r
+        STA ZX,$CNSTT           ;SAVE RESET STATUS\r
+;       [CLC]                   DEFAULT TO "NO COIN" (CARRY IS ALREADY CLEAR)\r
+        LDA ZX,$PSTSL           ;CHECK HOWIES ASSUMPTION\r
+        BEQ 7$                  ;BRANCH IF $PSTSL VACANT\r
+        SEC                     ;ELSE GIVE CREDIT A LITTLE EARLY\r
+7$:     LDA I,POST*4            ;/(4 COUNTS/FRAME)="POST" FRAMES\r
+        STA ZX,$PSTSL           ;DELAY ACCEPTANCE FOR POST 60 SEC.\r
+        \r
+8$:                             ;CARRY=1 IF COIN FALLS OUT\r
+        .IF EQ,MODES-4&MODES    ;IF MODES=0 OR 4\r
+        BCC 9$                  ;INC COIN CNT IF CARRY SET\r
+       .IF NE,SEPCCT           ;IF ASKED FOR SEPARATE COUNT,\r
+       INC X,$CNCT             ;USE INDEXED INC\r
+       .IFF                    ;ELSE USE COMMON COUNTER\r
+        INC $CNCT\r
+       .ENDC                   ;NE,SEPCCT\r
+       .IF NE,CTCOIN           ;IF COIN COUNTER USED\r
+       INC $CCTIM              ;INIT COIN PULSE\r
+       .ENDC                   ;CTCOIN\r
+9$:\r
+        .IFF                    ;IF MODES=16\r
+CONVRT:                         ;CONVERT COINS TO CREDITS\r
+        GCM                     ;GET COIN MODE IN ACC 0-3\r
+        BCC 20$                 ;CARRY=1 IF COIN WAS DETECTED ELSE ZERO\r
+       .IF NE,CTCOIN           ;IF COIN COUNTER USED\r
+       INC $CCTIM              ;INIT COIN PULSE\r
+       .ENDC                   ;NE,CTCOIN\r
+        CMP I,7                 ;MODES 0-6 ARE SPECIAL IN THAT BOTH MECHS COUNT\r
+                                ;THE SAME WAY SO USE ONLY ONE COIN COUNTER\r
+        BPL 10$\r
+        INC Z,$CNCT             ;INCREMENT COMMON COUNTER\r
+        JMP 20$\r
+10$:    INC ZX,$CNCT            ;ELSE INCREMENT APPROPRIATE COUNTER\r
+                                ;CREATE INDEX\r
+20$:\r
+        CPX I,0                 ;IS IT FIRST (LEFT) MECH\r
+        BEQ 40$\r
+        ORA I,10                ;PUT 0,1 AT BIT POITION "A"\r
+40$:    TAY                     ;ACC=INDEX INTO CPTAB\r
+        LDA AY,CPTAB            ;GET NO. OF COINS NEEDED FOR "X" CREDITS FROM CPTAB\r
+        AND I,07                ;  OF COINS IN 3 LSB\r
+        EOR I,0FF\r
+        SEC                     ;NEGATE\r
+        ADC ZX,$CNCT            ;ACC <- COINCT-CPTAP(Y)\r
+        BCC 100$                ;BRANCH ON BORROW\r
+        STA ZX,$CNCT            ;ELSE STORE REDUCED COINCT\r
+        LDA AY,CPTAB            ;GET BACK TABLE ENTRY\r
+        LSR\r
+        LSR\r
+        LSR\r
+        LSR                     ;GET   OF CREDITS IN ACC 0-3, "F" IN CARRY\r
+        LDY Z,$FIRST            ;CHECK FOR FIRST COIN\r
+        .IF NE,SHRCMD\r
+        BMI 50$\r
+        .IFF\r
+        BNE 50$\r
+        .ENDC                   ;SHRCMD CONDITIONAL\r
+        CLC                     ;IF FIRST COIN, CLEAR CARRY\r
+50$:    ADC Z,$$CRDT\r
+       .IF NE,CTCRED           ;IF COUNTING CREDITS\r
+       TAY                     ;SAVE NEW CREDIT\r
+       SEC\r
+       SBC $$CRDT              ;SUB OLD\r
+       CLC\r
+       ADC $CCTIM              ;ADD OFFSET\r
+       STA $CCTIM              ;TO COIN PULSE TIMER\r
+       STY $$CRDT              ;STORE NEW CREDIT\r
+       .IFF                    ;CTCRED=0\r
+        STA Z,$$CRDT            ;CREDIT=CREDIT+CPTAB(Y)/16.+"F"&(NOT FIRST)\r
+       .ENDC                   ;CTCRED COND.\r
+       .IF NE,SHRCMD\r
+        LDA I,80\r
+        ORA Z,$FIRST\r
+        STA Z,$FIRST\r
+        .IFF\r
+        INC Z,$FIRST            ;A COIN IN EITHER COUNTS AS THE FIRST COIN\r
+        .ENDC                   ;SHRCMD CONDITIONAL\r
+100$:   .IFTF                   ;NO MATTER WHAT NMODES IS\r
+        .IF NE,COIN67!COIN01\r
+        LDA A,$COINA            ;GET SWITCHES AGAIN\r
+       .IF EQ,MECHS-3          ;IF 3 MECHS\r
+       CPX I,OFFSET            ;CHECK FOR LAST MECH\r
+       BNE 110$                ;IF NOT, SHIFT ONCE, FOR MIDDLE\r
+       .IF NE,COIN01\r
+       LSR                     ;ELSE SHIFT TWICE, FOR D2\r
+110$:  LSR                     ;NEXT MECH INTO D0\r
+       .IFF\r
+       ASL                     ;ELSE SHIFT TWICE, FOR D5\r
+110$:  ASL                     ;NEXT MECH INTO SIGN\r
+        .ENDC                  ;NE,COIN01\r
+       .IFF                    ;IF 2 MECHS\r
+       .IF NE,COIN01           ;IF COINS IN D1,D0\r
+       LSR                     ;GET D1 INTO D0 FOR DETECT\r
+       .IFF                    ;IF COINS IN D7,D6\r
+       ASL                     ;GET D6 INTO D7 FOR DETECT\r
+       .ENDC                   ;NE,COIN01\r
+       .ENDC                   ;EQ,MECHS-3\r
+       .ENDC                   ;NE,COIN67!COIN01\r
+        .REPT OFFSET\r
+        DEX\r
+        .ENDR\r
+        .IFF                    ;ONLY FOR MODES=16\r
+        BMI EXIT\r
+        JMP DETECT              ;LOOP FOR SECOND MECH\r
+CPTAB:                                  ;TABLE OF CREDIT/PRICE VALUES\r
+;I.E. FIRST ENTRY (12) READS: 1 CREDIT FOR 2 COINS\r
+        .BYTE 12,11,21,31,41,19,29,12   ;LEFT MECH\r
+        .BYTE 11,21,19,29,39,13,11,31\r
+        .BYTE 12,11,21,31,41,19,29,11   ;RIGHT MECH\r
+        .BYTE 21,41,39,59,79,11,31,61\r
+        .IFT                   ;THAT IS, IF MODES=0 OR 4\r
+        BPL DETECT\r
+        .ENDC\r
+        .IF EQ,MODES-4          ;ONLY IF MODES=4\r
+CONVRT: GCM                     ;GET COIN MODE IN ACC 0,1\r
+        TAY                     ;SAVE IT & TEST IT\r
+        BEQ 2$                  ;IF FREE PLAY, KEEP COIN COUNT CLEAR, LEAVE CREDIT\r
+        LSR\r
+        ADC I,0                 ;FORM PRICE (0,1,1,2)\r
+        EOR I,0FF\r
+        SEC                     ;NEGATE\r
+        ADC $CNCT               ;ACC <- COINCT - PRICE\r
+        BCC EXIT                ;BRANCH ON BORROW\r
+        CPY I,2                 ;COIN MODE 2 OR 3?\r
+        BCS 1$                  ;YES, JUST ONE CREDIT\r
+        INC $$CRDT              ;ELSE GIVE TWO FOR MODES 0,1\r
+       .IF NE,CTCRED           ;IF COUNTING CREDITS\r
+       INC $CCTIM              ;INIT COUNTER PULSE\r
+       .IFTF\r
+1$:    INC $$CRDT\r
+       .IFT\r
+       INC $CCTIM\r
+       .ENDC                   ;NE, CTCRED\r
+2$:     STA $CNCT               ;STORE REDUCED (OR CLEARED) COINCT\r
+        .ENDC\r
+EXIT:  .IF NE,LONGST!<PULSE-2>         ;IF LONG STRING TIMER, OR PULSE>2 FRAMES\r
+       .IIF NE,CNTINT, INC Z,$INTCT            ;COUNT INTERUPTS WHEN REQUESTED\r
+       .ENDC\r
+       .IF NE,CTCRED!CTCOIN            ;INCLUDE PULSER\r
+       .IIF NE,PULSE-2,        LDA Z,$INTCT            ;NEED $INTCT IF PULSE>2\r
+       .IIF EQ,PULSE-4,        LSR                     ;USE LSB IF PULSE=4\r
+       .IF EQ,PULSE-8.\r
+       AND I,3                         ;ISOLATE 2 LSB'S\r
+       CMP I,1                         ;CLEAR CARRY IF 00\r
+       .ENDC\r
+       LDA Z,$CCTIM                    ;GET COIN-COUNTER TIMER\r
+       .IIF NE,PULSE-2,        BCS 2$\r
+       BEQ 2$                          ;BRANCH IF IDLE\r
+       CMP I,10                        ;MSB'S CLEAR?\r
+       BCS 1$                          ;NO,SKIP\r
+       ADC I,-1                        ;ELSE INIT PULSE, SET CARRY\r
+1$:    ADC I,0EF               ;(ONE LESS CUZ CARRY SET) DEC MSB'S OF TIMER\r
+       STA Z,$CCTIM                    ;STORE UPDATED TIMER\r
+2$:    ASL                             ;SET CARRY PER D7 OF TIMER\r
+       .ENDC\r
+       .IF NE,RTS              ;IF THIS IS A SUBROUTINE\r
+       RTS\r
+       .ENDC                   ;NE,RTS\r
+\r
+       .IIF EQ,INCLUDE,.END    ;NO .END TO ".INCLUDE"'D FILES\r
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file