00100 *MOUSE2/ASM    FILE NUMBER 2
00200 
00300 TURNON  PSHS    CC              SAVE IRQ ENABLE FLAG
00400         ORCC    #$50            DISABLE IRQ CURSOR DRAW
00500         LDB     CSTAT,U         GET CURSOR STATUS
00600         ORB     #64             SET DRAW CURSOR FLAG
00700         STB     CSTAT,U         AND SAVE IT
00800         BSR     CURON           DRAW CURSOR IF NOT ALREADY ON
00900         PULS    PC,CC           TURN IN IRQ AND EXIT
01000 
01100 CURON   LDB     CSTAT,U         IS CURSOR ON SCREEN ALREADY?
01200         BMI     CEXIT           SKIP IF SO
01300         BITB    #64             SHOULD CURSOR BE PLACED?
01400         BEQ     CEXIT           NO, THEN EXIT
01500 
01600         PSHS    CC,U            SAVE BLOCK POINTER CPU STATUS
01700         ORCC    #$50            DISABLE IRQS
01800         ORB     #128            SET CURSOR STATUS TO SHOW
01900         STB     CSTAT,U         THAT CURSOR IS ON SCREEN
02000         LEAX    CURDAT,PCR      GET CURSOR SHAPE DATA
02100         LEAY    CURBUF,PCR      GET BUFFER FOR SAVE SCREEN UNDER IT
02200         LDD     YJOY,U          GET CURSOR POSITION
02300         SUBA    ,X+             UPDATE POSITION WITH HOT SPOT
02400         SUBB    ,X+             DATA FOR NEW POSITION
02500         CLR     FAST,U          RESET FAST FLAG TO CLIP DRAW
02600         CMPA    #192-16         IS THE FULL CURSOR ON THE SCREEN
02700         BHS     CURON0          SKIP IF PART OF Y OFF SCREEN
02800         CMPB    #128-12         NOW TEST IF PART OF X LEN OFF
02900         BHS     CURON0          OF SCREEN (SKIP IF SO)
03000         COM     FAST,U          DO FAST CURSOR DRAW ALL ON SCREEN
03100 
03200 CURON0  PSHS    B               SAVE X POSITION
03300         TFR     X,U             LOAD U WITH CURSOR SHAPE DATA
03400 
03500         CMPA    #192+5          IS THE LINE A NEGATIVE LINE?
03600         PSHS    CC              SAVE TEST FLAGS
03700         BLO     CURON1
03800         NEGA                    IF SO THEN MAKE POSITIVE LINE
03900 CURON1  LDB     #32             CONVERT LINE TO MEMORY POSITION
04000         MUL
04100         PULS    CC              GET TEST FLAGS
04200         BLO     CURON2          SKIP IF PLUS
04300         COMA                    NEG THE D REG
04400         COMB
04500         ADDD    #1
04600 CURON2  ADDA    SSTART          OFFSET TO BASIC SCREEN POSITION
04700         TFR     D,X             AND PUT IN 16-BIT POINTER
04800         LDB     ,S              GET X POSITION
04900         ASRB                    GET BYTE POSITION ON SCREEN
05000         ASRB                    BY 1/4
05100         STB     STRIP+DATA,PCR  SAVE FOR COUNTING LATER
05200         LEAX    B,X             ADD IT TO THE SCREEN POINTER
05300         STX     MEMPOS+DATA,PCR AND MEMORY POINTER TOO
05400         PULS    A               GET THE X POSITION
05500         ANDA    #3              GET THE OFFSET INTO THE BYTE ON LINE
05600         LDB     #3*16*2         SIZE OF SHAPE
05700         MUL                     MUL IT BY THE SHAPE SIZE IN "B"
05800         LEAU    D,U             AND OFFSET THE SHAPE POINTER BY IT
05900 
06000         LDA     #16             NUMBER OF LINE IN CURSOR OF DATA
06100         LDB     FAST+DATA,PCR   DO WE DO A FULL OR PART DRAW?
06200         BNE     ONFAST          SKIP IF FAST!
06300 
06400 CURON3  CMPX    SSTART          IS THIS LINE ABOVE THE SCREEN?
06500         BLO     CURON6          SKIP IF OFF THE SCREEN
06600         PSHS    X,U,A           SAVE POINTER AND Y-COUNT
06700         LDA     #3              3 BYTE PER LINE
06800         LDB     STRIP+DATA,PCR  GET (BYTE) LINE POSITION
06900 CURON4  CMPB    #32             ARE WE TO FAR LEFT/RIGHT?
07000         BHS     CURON5          SKIP THIS BYTE IF SO
07100         CMPX    SEND            IS THE BYTE ABOVE SCREEN?
07200         BHS     CURON5          SKIP BYTE IF SO
07300         PSHS    A               SAVE X COUNTER
07400         LDA     ,X              GET DATA OFF THE SCREEN
07500         STA     ,Y+             SAVE IT IN UNDER BUFFER
07600         ANDA    ,U              AND IT WITH MASK OF CURSOR
07700         EORA    3*16,U          THEN FLIP BITS WITH EOR DATA
07800         STA     ,X              AND PLACE IT ON THE SCREEN
07900         PULS    A               GET X COUNT
08000 CURON5  LEAX    1,X             MOVE NEXT BYTE ON THE LINE
08100         LEAU    1,U             AND NEXT BYTE IN SHAPE DATA
08200         INCB                    MOVE TO NEXT BYTE STRIP
08300         DECA                    DONE WITH THIS LINE?
08400         BNE     CURON4          NO, LOOP BACK THEN
08500         PULS    X,U,A           RESTORE POINTERS TO START OF LINE
08600 CURON6  LEAX    32,X            MOVE SCREEN POINTER TO NEXT LINE
08700         LEAU    3,U             MOVE SHAPE POINTER TO NEXT LINE
08800         DECA                    ARE ALL LINES DONE?
08900         BNE     CURON3          NO, LOOP BACK
09000         PULS    PC,CC,U         RESTORE IRQS, VAR POINTER & EXIT
09100 
09200 *THIS IS A FAST CURSOR DRAWER
09300 ONFAST  STA     COUNT+DATA,PCR  SET LINE COUNTER
09400 ONFST1  LDD     ,X              GET FIRST 2 BYTES OF LINE
09500         STD     ,Y++            SAVE THEM IN UNDER BUFFER
09600         ANDA    ,U              AND THE MASK DATA
09700         EORA    16*3,U          FLIP DATA TOO
09800         ANDB    1,U             NOW THE NEXT BYTE ON LINE
09900         EORB    16*3+1,U
10000         STD     ,X++            PUT BOTH ON SCREEN
10100         LDA     ,X              GET LAST BYTE ON LINE
10200         STA     ,Y+             SAVE IN UNDER BUFFER
10300         ANDA    2,U             AND WITH MASK
10400         EORA    2+16*3,U        FLIP WITH DATA
10500         STA     ,X              PUT ON SCREEN
10600         LEAU    3,U             GOTO NEXT LINE IN SHAPE
10700         LEAX    32-2,X          SKIP TO NEXT LINE ON SCREEN
10800         DEC     COUNT+DATA,PCR  ARE ALL LINES DONE
10900         BNE     ONFST1          NO, LOOP BACK
11000         PULS    PC,U,CC         RESTORE IRQS, VAR POINTER & EXIT
11100 
11200 * TURN OFF CURSOR (#0)
11300 TURNOF  PSHS    CC              SAVE IRQ FLAGS
11400         ORCC    #$50            TURN OFF IRQS
11500         LDB     CSTAT,U         GET CURSOR STATUS FLAG
11600         ANDB    #255-64         DISABLE DRAWING CURSOR ON IRQ
11700         STB     CSTAT,U         AND SAVE NEW STATUS
11800         BSR     CUROFF          REMOVE CURSOR IF ON SCREEN
11900 OEXIT   PULS    PC,CC           TURN ON IRQS AND EXIT
12000 
12100 CUROFF  PSHS    CC              SAVE IRQ FLAGS
12200         ORCC    #$50            TURN OFF IRQS
12300         LDB     CSTAT,U         GET CURSOR STATUS
12400         BPL     OEXIT           EXIT NO CURSOR ON SCREEN
12500         ANDB    #127            SET CURSOR ON SCREEN FLAG
12600         STB     CSTAT,U         TO OFF AND SAVE
12700         LEAY    CURBUF,PCR      GET BUFFER OF DATA UNDER CURSOR
12800         LDX     MEMPOS,U        GET SCREEN (MEM) POSITION OF CURSOR
12900 
13000         LDA     #16             NUMBER OF LINES OF CURSOR
13100         LDB     FAST,U          WAS CURSOR DRAWN FAST OR CLIPED?
13200         BNE     OFFAST          SKIP IF FAST!
13300 
13400 CUROF1  CMPX    SSTART          IS MEMORY POINTER BELOW SCREEN?
13500         BLO     CUROF5          SKIP IF SO
13600         PSHS    A,X             SAVE SCREEN POINTER & LINE COUNTER
13700         LDB     STRIP,U         GET BYTE X POSITION
13800         LDA     #3              3 BYTES PER LINE
13900         STA     COUNT,U         SET X COUNTER WITH IT
14000 CUROF2  CMPB    #32             TOO FAR LEFT OR RIGHT?
14100         BHS     CUROF3          SKIP IF SO
14200         CMPX    SEND            IS MEMORY POINTER ON SCREEN?
14300         BHS     CUROF3          SKIP IF OFF SCREEN
14400         LDA     ,Y+             GET UNDER CURSOR BYTE
14500         STA     ,X              PUT IT ON SCREEN
14600 CUROF3  LEAX    1,X             MOVE TO NEXT BYTE ON LINE
14700         INCB                    MOVE INDEX COUNTER
14800         DEC     COUNT,U         ARE ALL BYTE DONE ON THIS LINE?
14900         BNE     CUROF2          NO, THEN LOOP BACK
15000         PULS    X,A             GET START OF LINE POINTER & COUNTER
15100 CUROF5  LEAX    32,X            MOVE TO NEXT LINE
15200         DECA                    ARE ALL LINES DONE?
15300         BNE     CUROF1          NO, THEN LOOP BACK
15400         PULS    PC,CC           TURN ON IRQS AND EXIT
15500 
15600 OFFAST  STA     COUNT,U         SET UP LINE COUNTER
15700 OFFST1  LDD     ,Y++            GET FIRST 2 BYTE OF UNDER DATA
15800         STD     ,X++            AND PUT IT ON SCREEN
15900         LDB     ,Y+             GET LAST BYTE ON LINE OF UNDER
16000         STB     ,X              AND PUT IT TOO ON SCREEN
16100         LEAX    32-2,X          MOVE TO NEXT LINE ON SCREEN
16200         DEC     COUNT,U         ALL LINES DONE?
16300         BNE     OFFST1          LOOP IF NOT
16400         PULS    PC,CC           TURN OF IRQS AND EXIT
16500 
16600 *DISABLE MOUSE SOFTWARE (UNLINK) (#6)
16700 DSABLE  LBSR    TURNOF          TURN OFF CURSOR IF ON SCREEN
16800         LDX     OLDIRQ,U        GET OLD IRQ VECTOR
16900         STX     $10D            AND PUT IT BACK
17000         LDD     OLDIO,U         GET OUTPUT VECTOR
17100         STD     $168            AND PUT IT BACK
17200         LDD     OLDCOM,U        GET OLD COMMAND TABLE VECTOR
17300         STD     $123            AND PUT IT BACK
17400         CLRB                    RETURN A ZERO FOR FUCTION
17500         RTS                     AND EXIT
17600 
17700 * SELECT TYPE OF JOYSTICK TO USE (9-13)
17800 *  9 = RIGHT JOYSTICK
17900 * 10 = LEFT  JOYSTICK
18000 * 11 = COCO MAX HI-RES INPUT MODULE
18100 * 12 = RADIO SHACK X-PAD
18200 * 13 = HI-RES JOYSTICK INTERFACE
18300 SELJOY  SUBB    #9              FIRST SELECT COMMAND (RIGHT)
18400         STB     JOYTYP,U        SELECT JOYSTICK TYPE
18500         RTS                     AND EXIT
18600 
18700 *THIS IS THE IRQ PATCH FOR THE MOUSE SOFTWARE
18800 IRQ     LEAU    DATA,PCR        SETUP VARIABLE POINTER
18900         LDX     NEWJOY,U        GET THE NEW JOYSTICK X & Y POSITION
19000         LDA     HOLD,U          MAKE SURE THAT CURSOR IS OFF IF
19100         ORA     CSTAT,U         ON HOLD
19200         CMPA    #64             IF CURSOR IS TURNED OFF OR HOLD
19300         BEQ     IRQ1            >0 THEN REMOVE CURSOR... ELSE...
19400         CMPX    YJOY,U          IS THE OLD AND POSITION THE SAME?
19500         BEQ     IRQ2            SKIP DRAW CURSOR THEN
19600         PSHS    X               SAVE NEW X & Y POSITION
19700         LBSR    CUROFF          REMOVE CURSOR
19800         PULS    X               RESTORE NEW X & Y POSITION
19900         LDA     HOLD,U          IS CURSOR ON HOLD?
20000         BNE     IRQ2            SKIP IF SO
20100 IRQ1    STX     YJOY,U          UPDATE CURSOR POSITION
20200         LBSR    CURON           DRAW CURSOR
20300         BRA     IRQ3
20400 IRQ2    LDB     HOLD,U          ARE WE ON HOLD?
20500         BEQ     IRQ3            SKIP IF NOT
20600         DEC     HOLD,U          COUNT IT TILL ZERO THEN
20700 
20800 IRQ3    LEAX    <IRQ5,PCR       SETUP RETURN ADDRESS
20900         PSHS    X               PUT IT ON STACK FOR AN RTI
21000         PSHS    U,Y,X,D,CC,DP   FILL IN THE REST OF RTI STACK DATA
21100         JMP     [OLDIRQ,U]      CALL BASIC'S IRQ VECTOR
21200 
21300 IRQ5    BSR     JOYSTK          NOW WE ARE BACK, DO JOYSTICK READ
21400         STD     NEWJOY,U        AND SAVE THE X & Y POSITIONS
21500         LDB     BUTDWN,U        GET BUTTON UP/DOWN FLAG
21600         LDA     BUTCNT,U        AND BUTTON DE-BOUNCE COUNTER
21700         BEQ     IRQ6            SKIP IF AT ZERO
21800 
21900         TSTB                    IS BUTTON PRESSED?
22000         BNE     IRQ7            RESTART BUTTON COUNT (SKIP TO IT)
22100         DEC     BUTCNT,U        ELSE DEC DEBOUCE COUNT
22200         BRA     IRQ9            SKIP (ALL DONE HERE)
22300 
22400 IRQ6    TSTB                    IS BUTTON UP?
22500         BEQ     IRQ9            SKIP IF SO
22600         STB     BUTTON,U        SET JUST PRESSED FLAG
22700 IRQ7    LDA     #2              RESET DE-BOUNCE COUNTER
22800         STA     BUTCNT,U
22900 IRQ9    RTI                     EXIT IRQ
