00100 * JOYSTICK DRIVERS
00200 JOYTAB  FDB     JPORT-JOYTAB    VECTOR TABLE FOR DOING JOYSTICK
00300         FDB     JPORT-JOYTAB    INPUT
00400         FDB     GETMAX-JOYTAB
00500         FDB     XPAD-JOYTAB
00600         FDB     HIRES-JOYTAB
00700 
00800 JOYSTK  LDA     JOYTYP,U        GET JOYSTICK TYPE
00900         LSLA                    MUL BY 2 FOR 16 OFFSET
01000         LEAX    JOYTAB,PCR      GET VECTOR OFFSET TABLE INPUT
01100         LDD     A,X             GET OFFSET FOR THAT ONE
01200         JMP     D,X             CALL THE INPUT READING
01300 
01400 *THIS ONE READS JOYSTICK POSITION FROM HI-RES INTERFACE FROM R-S
01500 HIRES   CLRA                    SELECT RIGHT JOYSTICK
01600         BSR     BUTSTA          AND GET BUTTON STATUS
01700         LDD     YJOY,U          GET OLD X & Y POSITION
01800         COM     FLIP,U          DO THE READING 30 TIMES A SEC.
01900         BMI     HIRES9          (SKIP READING 1/2 THE TIME!)
02000 
02100         LDX     #$FF00          BASE ADDRESS OF PORTS
02200         LDA     $23,X           GET THE SOUND ON/OFF BIT
02300         LDB     $20,X           AND DAC BITS
02400         PSHS    D               SAVE THEM
02500         ANDA    #$F7            TURN OFF SOUND
02600         STA     $23,X
02700 
02800         LDA     1,X             GET THE L.S.BIT AND
02900         LDB     3,X             M.S.BIT OF THE JOY SELECTOR
03000         PSHS    D               SAVE THEM
03100 
03200         ANDB    #$F7            SELECT JOYSTICK 0
03300         STB     3,X
03400         ORA     #8              AND SELECT Y INPUT OF JOYSTICK
03500         STA     1,X
03600 
03700         BSR     HIRES1          READ Y VAL 0-255
03800         LDA     #192            MAKE IT 0 TO 191
03900         MUL
04000         PSHS    A               SAVE THE Y POSITION
04100 
04200         LDA     1,X             SELECT X INPUT FOR READING
04300         ANDA    #$F7            BY RESET LSB OF SELECTOR
04400         STA     1,X
04500         BSR     HIRES1          DO A 0 TO 255 READING
04600         LSRB                    MAKE IT 0 TO 127 FOR X
04700         PULS    A               GET SAVED Y POSITION
04800         TFR     D,Y             SAVE BOTH X & Y
04900 
05000         PULS    D               GET OLD DATA OF SELECTOR
05100         STA     1,X             AND RESTORE THE PORTS
05200         STB     3,X
05300 
05400         PULS    D               GET SOUND ON/OFF AND DAC DATA
05500         STB     $20,X           AND RETORE
05600         STA     $23,X
05700         TFR     Y,D             LOAD UP X & Y VAL (SAVED IN Y)
05800 HIRES9  RTS                     EXIT
05900 
06000 * THIS IS A HI-RES INTERFACE READ (0 TO 255)
06100 HIRES1  PSHS    CC              SAVE IRQ & FIRQ FLAGS
06200         LDA     #$FF            USE DAC (OF CASSETTE) TO RESET
06300         STA     $20,X           THE TIMING RAMP GEN.
06400         LDA     #45             THIS SHOULD DO IT
06500 HIRES2  DECA                    DO A TIMING LOOP
06600         BNE     HIRES2
06700 
06800         LDD     #2*256+126      USED TO START TIMING RAMP
06900         ORCC    #$50            DISABLE IRQ & FIRQ
07000         STA     $20,X           START TIMEING RAMP
07100 HIRES3  DECB
07200         BNE     HIRES3
07300 HIRES4  LDA     ,X              HAS J-STICK MATCH RAMP?
07400         BMI     HIRES5          YES, THEN EXIT LOOP!
07500         NOP                     MAKE LOOP THE RIGHT TIMING
07600         NOP
07700         NOP
07800         INCB                    NO, DOWN COUNT THEN
07900         BNE     HIRES4          IF NO TIME OUT THEN LOOP AGAIN
08000 
08100         DECB                    MAKE IT 255 IF TIMED OUT
08200 HIRES5  PULS    PC,CC           EXIT WITH ERROR (RESTORE IRQS)
08300 
08400 
08500 *THIS DOES A BUTTON READ OFF THE RIGHT/LEFT JOYSTICK
08600 BUTSTA  PSHS    A               SAVE RIGHT/LEFT FLAG
08700         LDX     #$FF00          POINT TO THE I/O PORT
08800         LDA     2,X             GET THE KEY SELECT DATA
08900         LDB     #$FF            SELECT NO KEYS
09000         STB     2,X             TO READ JUST THE BUTTONS
09100         PULS    B               GET RIGHT/LEFT BUTTON SELECT
09200         INCB                    MAKE IT "01"(R) OR "10" (L)
09300         COMB                    MAKE SELECTED BIT ZERO
09400         ORB     ,X              IS GET THAT BUTTON BIT
09500         STA     2,X             RESTORE KEY SELECT DATA
09600         COMB                    MAKE IT A ONE IF PRESS
09700         ANDB    #3              ONLY RIGHT/LEFT BUTTON BITS!
09800         STB     BUTDWN,U        UPDATE BUTTON DOWN STATUS
09900         RTS                     AND EXIT
10000 
10100 *THIS ONE READS THE 6 DAC PORT FOR THE RIGHT/LEFT JOYSTICKS
10200 JPORT   LDA     JOYTYP,U        GET RIGHT/LEFT FLAG
10300         BSR     BUTSTA          GET BUTTON DOWN STATUS
10400         PSHS    U               SAVE VARIABLE BLOCK POINTER
10500         LDX     #$FF00          POINT TO I/O PORTS
10600         LDA     $23,X           GET SOUND ON BIT
10700         LDB     $20,X           AND DAC LEVEL DATA
10800         TFR     D,Y             AND SAVE THEM
10900         ANDA    #255-8          TURN OFF SOUND BIT
11000         STA     $23,X
11100 
11200         LDA     1,X             GET JOYSTICK/AUDIO
11300         LDB     3,X             SELECTOR BIT
11400         TFR     D,U             AND SAVE THEM TOO
11500         ORA     #8              SELECT Y READING
11600         STA     1,X
11700         ANDB    #$FF-8          SET RIGHT JOYSTICK FOR NOW
11800         PSHS    B               AND SAVE IT OR NOW
11900         LDB     JOYTYP+DATA,PCR    GET RIGHT/LEFT FLAG
12000         LSLB                    PUT THE BIT (0) IN BIT 2
12100         LSLB
12200         LSLB
12300         ORB     ,S+             NOW SELECT LEFT/RIGHT
12400         STB     3,X
12500 
12600         BSR     JOYSK0          DO 6 BIT DAC READ FOR Y
12700         LDA     #3              AND MAKE THE 0 TO 63
12800         MUL                     TO 0 TO 189 STEPS OF 3
12900         PSHS    B               AND SAVE IT
13000         LDA     1,X             NOW SELECT X POSITION
13100         ANDA    #255-8          BY RESETTING THE SELECT BIT
13200         STA     1,X
13300         BSR     JOYSK0          DO 6 BIT DAC FOR X POSITION
13400         LSLB                    MAKE 0 TO 63 TO 0 TO 126 STEP 2
13500         PSHS    B               SAVE IT FOR NOW
13600         TFR     U,D             RESTORE JOY/AUTO
13700         STB     3,X             SELECTOR
13800         STA     1,X
13900 
14000         TFR     Y,D             RESTORE SOUND ON BIT AND DAC
14100         STB     $20,X
14200         STA     $23,X
14300         PULS    B               GET X POSITION DATA
14400         PULS    PC,U,A          GET Y POSITION DATA AND EXIT
14500 
14600 JOYSK0  LDD     #$4080          START DAC LEVEL
14700 JOYSK1  PSHS    A               SAVE START NUMBER
14800         ORB     #2              MAKE PRINTER HIGH
14900         STB     $20,X           SEND IT TO THE DAC
15000         EORB    #2              REMOVE PRINTER BIT
15100         LDA     ,X              IS IT ABOVE OR BELOW?
15200         BMI     JOYSK2          SKIP IF ABOVE
15300 
15400         SUBB    ,S              REMOVE 1/2 IF BELOW
15500         BRA     JOYSK3
15600 
15700 JOYSK2  ADDB    ,S              ADD 1/2 IF ABOVE
15800 JOYSK3  PULS    A
15900         LSRA
16000         CMPA    #1
16100         BNE     JOYSK1          LOOP 6 TIMES
16200         LSRB                    PUT THE DAC BITS IN 0-5 BIT
16300         LSRB                    FOR JOYSTICK VAL
16400         RTS                     AND EXIT
16500 
16600 XPAD    LDB     $FF60           GET X-PAD X POSITION
16700         LSRB                    MAKE IT 0 TO 127
16800         LDA     $FF61           GET X-POS Y POSITION
16900         PSHS    D               SAVE IT FOR UPDATEING
17000         LDB     $FF62           GET STATUS OF X-PAD
17100         BITB    #2              IS PEN IN PROXIMITY?
17200         BNE     XPAD1           DON'T UPDATE JOYVAL IF NOT
17300         LDD     YJOY,U          ELSE GET OLD X & Y POSITION
17400         STD     ,S              AND SAVE IT
17500         CLRB                    MAKE PEN UP (NOT PRESSED)
17600         BRA     XPAD9           DO NOT LOOK AT NEW X & Y
17700 XPAD1   BITB    #4              IS PEN IN X MARGIN?
17800         BEQ     XPAD2           YES, THEN USE IT
17900         LDA     XJOY,U          GET THE OLD X POSITION
18000         STA     1,S             UPDATE THE OLD X VAL.
18100 
18200 XPAD2   BITB    #8              IS PEN IN Y MARGIN?
18300         BEQ     XPAD9           YES, THEN UPDATE
18400         LDA     YJOY,U          ELSE USE OLD Y POSITION
18500         STA     ,S              UPDATE THE OLD Y VAL.
18600 XPAD9   ANDB    #1              GET PEN STATUS
18700         STB     BUTDWN,U
18800         PULS    PC,D            EXIT READ X-PAD
18900 
19000 GETMAX  PSHS    D               SETUP TEMP FOR JOY VAL.
19100         LDX     #$FF90          POINT TO COCO MAX PORT
19200         BSR     READMX          READ PORT AND SKIP IT
19300         BSR     READMX          READ PORT
19400         LDB     #192            AND MAKE  0 TO 255 TO
19500         MUL                     0 TO 191
19600         STA     ,S              FOR Y POSITION
19700         BSR     READMX          READ PORT
19800         LSRA                    MAKE IT 0 TO 127
19900         STA     1,S             AND SAVE X POSITION
20000         BSR     READMX          READ PORT
20100         COMA                    FOR BUTTON
20200         ANDA    #128            <128 THEN DOWN
20300         STA     BUTDWN,U        >127 THEN UP
20400         PULS    PC,D            GET X & Y AND EXIT
20500 
20600 READMX  LDA     ,X+             READ COCO MAX PORT
20700         LDB     #10             DO A TIME DELAY LOOP
20800 RDMX1   DECB
20900         BNE     RDMX1
21000         RTS                     AND EXIT
