0100 ; MOUSE DRIVER , CMOS INTERFACE›0110 ; (C) 1991,1997 THOR-SOFTWARE›0120 ; (THOMAS RICHTER)›0130 ; MOUSE DRIVER AND SAMPLE CODE›0140 ; FOR THE MAC/65›0150 ;›0160 ; THIS DEMO ASSUMES THAT THE›0170 ; INTERFACE IS CONNECTED TO PORT›0180 ; 2 AND THE MEMORY $800 AND›0190 ; $3800 IS FREE (WHICH IS›0200 ; MOSTLY USED BY THE DOS UNLESS›0210 ; YOU USE MY DOS 2.XL)›0220 ; CHANGE THE LINE BELOW FOR›0230 ; A DIFFERENT BASE ADDRESS›0240 ;›0250     *=  $0800›0260     .OPT OBJ›0270 ; JUMP VECTORS FOR THE INTERFACE›0280 ; FUNCTIONS.›0290 ;›0300 ; INSTALL IS USED TO SETUP A›0310 ; VBI ROUTINE THAT READS THE›0320 ; MOUSE POINTERS AND PUSHES›0330 ; THEM INTO THE PADDLE POSITION›0340 ; SHADOW REGISTERS FOR EASY›0350 ; ACCESS. THE PTRIG REGS ARE›0360 ; PATCHED AS WELL TO REFLECT THE›0370 ; MOUSE BUTTONS.›0380     JMP INSTALL›0390 ; SETVBNEW IS A REPLACEMENT FOR›0400 ; THE SETVBV OS JUMP VECTOR›0410 ; IT LEAVES THE MOUSE VBI›0420 ; INTACT, BUT INSTALLS AN›0430 ; ADDITIONAL DEFFERED VBI ON›0440 ; REQUEST.›0450     JMP SETVBNEW›0460 ; DISABLE DISABLES THE DRIVER›0470 ; COMPLETELY, WITHOUT GIVING›0480 ; THE USER A CHANCE TO ENABLE›0490 ; IT AGAIN (VIA HELP).›0500 ; ENABLE ALLOWS DRIVER FUNCTIONS›0510 ; AGAIN, EVEN THOUGH THE USER›0520 ; MIGHT HAVE CHOOSEN TO TURN IT›0530 ; OFF. AN ADDITIONAL CALL TO›0540 ; PERMIT IS NECESSARY TO RESUME›0550     JMP ENABLE›0560     JMP DISABLE›0570 ; FORBID AND PERMIT SWITCH THE›0580 ; MOUSE DRIVER ON AND OFF. THIS›0590 ; FLAG IS ALSO UNDER CONTROL OF›0600 ; THE USER AND CAN BE TOGGLED›0610 ; WITH THE HELP KEY. MINOR›0620 ; MODIFICATIONS FOR THE A800 AND›0630 ; THE A400 ARE NECESSARY HERE.›0640     JMP PERMIT›0650     JMP FORBID›0660 ; TEMPORARY STORAGE›0670 MOUSEX: .BYTE 0›0680 MOUSEY: .BYTE 0›0690 TX: .BYTE 0›0700 TY: .BYTE 0›0710 TXLAST: .BYTE 0›0720 TYLAST: .BYTE 0›0730 GXLO: .BYTE 0›0740 GYLO: .BYTE 0›0750 GXHI: .BYTE 0›0760 GYHI: .BYTE 0›0770 EN: .BYTE 0›0780 ; ON-OFF FLAGS›0790 ENAB: .BYTE 0›0800 ALLO: .BYTE 0›0810 INSTALL›0820 ;INSTALL MOUSE DRIVER›0830     LDA #0›0840     STA TX›0850     STA TY›0860     STA ENAB›0870     STA ALLO›0880     LDA #7›0890     LDX # >VBI›0900     LDY # <VBI›0910     JSR $E45C   ;SETUP VBI›0920     LDA # <ENF›0930     STA $02E7›0940     LDA # >ENF›0950     STA $02E8›0960     RTS ›0970 ;›0980 ; *** MAIN VBI STARTS HERE ***›0990 VBI›1000     BIT ENAB    ;DISABLED ?›1010     BMI ENANO›1020     LDA $02DC›1030     BEQ NOHELP›1040     LDA ALLO    ; TOGGLE FLAG WITH HELP›1050     EOR #$FF›1060     STA ALLO›1070     LDA #$00›1080     STA $02DC›1090 NOHELP›1100     BIT ALLO›1110     BMI ENANO   ;ACTIVE ?›1120     JSR INITPIA ;SETUP PORT›1130     JSR READXY  ;READ MOUSE›1140     JSR RESETPIA ;RESET PORT›1150     LDA #$01    ;PATCH SHADOW REGISTERS FOR THE MOUSE POSITION›1160     BIT $0272›1170     BPL NOPRE›1180     LDA #$00›1190 NOPRE›1200     STA $027D›1210     LDA $0285›1220     STA $027C›1230     LDA #228    ;THIS ONE IS UPSIDE DOWN. SIGH.›1240     SEC ›1250     SBC MOUSEY›1260     LDX MOUSEX›1270     STX $0270›1280     STA $0271   ; PATCH PADDLE POSITION›1290     LDA #$0F›1300     BIT $027C›1310     BNE NOSET1›1320     AND #$0B›1330 NOSET1 BIT $027D›1340     BNE NOSET2›1350     AND #$07›1360 NOSET2 STA $0278›1370 ENANO›1380 SET1 CLC ›1390     BCC OVEX›1400 SET2 JSR $FFFF  ; CALL ADDITIONAL DEFFERRED VBI HERE›1410     NOP ›1420     NOP ›1430 OVEX›1440     JMP $E462›1450     ;   ›1460 ;›1470 ; INSTALL ADDITIONAL VBI WITHOUT REMOVING THE DRIVER›1480 SETVBNEW›1490     CMP #$07    ;PATCH ONLY DEFERRED VBI›1500     BNE SETOLD›1510     LDA #$18›1520     STA SET1    ;DISABLE›1530     STY SET2+1›1540     STX SET2+2  ;PATCH JSR ABOVE›1550     LDA #$38›1560     STA SET1›1570     RTS         ;ENABLE›1580 SETOLD›1590     JSR $E45C›1600     RTS ›1610 ;›1620 ; MOST BORING SET-FLAG ROUTINES›1630 ENABLE›1640     LDA #$00›1650     STA ENAB›1660     RTS ›1670 DISABLE›1680     LDA #$FF›1690     STA ENAB›1700     RTS ›1710 PERMIT›1720     LDA #$00›1730     STA ALLO›1740     RTS ›1750 FORBID›1760     LDA #$FF›1770     STA ALLO›1780     RTS ›1790 ;›1800 ; *** PIA SERVICE ROUTINES ***›1810 ;›1820 ; SETUP PORT FOR READING›1830 INITPIA:›1840     LDA #$30›1850     STA $D302   ;ACCESS DDR›1860     LDA #$C0›1870     STA $D300   ;PA6 AND 7 ARE OUTPUTS›1880     LDA #$3C›1890     STA $D302   ;ACCESS PORT›1900     LDA #$00    ;RESET LINES›1910     STA $D300›1920     JSR DELAY   ;TINY DELAY FOR CMOS›1930     RTS ›1940 ;›1950 ; RESETPIA. RESTORE USUAL PIA FUNCTION›1960 RESETPIA:›1970     LDA #$30›1980     STA $D302   ;ACCESS DDR›1990     LDA #$00›2000     STA $D300   ;EVERYTHING IS IN NOW›2010     LDA #$3C    ;BACK TO PORT REGISTERS›2020     STA $D302›2030     JSR DELAY   ;WAIT›2040     RTS ›2050 ;›2060 ; *** READXY - READ COUNTERS ***›2070 READXY:›2080     LDA #$00›2090     STA $D300›2100     JSR DELAY   ;ALL LINES OFF›2110     LDA #$80›2120     STA $D300   ;TELL SHIFT REGISTER TO LOAD DATA›2130     JSR DELAY›2140     LDA #$00›2150     STA $D300   ;LOAD OPERATION DONE›2160     STA TX›2170     STA TY      ;RESET TEMPORARY SCRATCH REGISTERS›2180     JSR DELAY›2190     LDX #$08    ;# OF BITS TO READ FROM SHIFT REGISTER›2200 INRDLOP:›2210     LDA $D300   ;READ DATA›2220     LSR A       ;ACCESS BITS PA4 AND 4 - WE'RE CONNECTED TO PORT 2›2230     LSR A›2240     LSR A›2250     LSR A›2260     LSR A       ;SHIFT TO CARRY›2270     ROL TX      ;READ X BIT›2280     LSR A›2290     ROL TY      ;READ Y BIT›2300     JSR DELAY›2310     LDA #$40›2320     STA $D300   ;GENERATE ONE CLOCK CYCLE FOR THE SHIFT REGISTER›2330     JSR DELAY   ;DELAY TO SETTLE STATE›2340     LDA #$00    ;RESET CLOCK SIGNAL›2350     STA $D300›2360     JSR DELAY›2370     DEX         ; READ NEXT BIT›2380     BNE INRDLOP›2390     ;           MOUSE COUNTERS ARE READ NOW. CALCULATE THE INTERNAL POSITION, HANDLE OVERFLOWS.›2400     LDX #$00›2410     JSR CALCMOVE›2420     INX ›2430     JSR CALCMOVE›2440     RTS ›2450 DELAY: ;        DELAY DUMMY. CMOS IS SO SLOW AND THE INTERFACE HAS A RATHER HIGH IMPENDANCE.›2460     NOP ›2470     NOP ›2480     NOP ›2490     RTS ›2500 ;›2510 ; OVERFLOWS AND UDERFLOWS OF THE HARDWARE COUNTERS ARE HANDLED HERE AS WELL›2520 ;X IS 0 FOR HORIZONTAL AND 1 FOR THE VERTICAL COUNTER›2530 CALCMOVE:›2540     SEC ›2550     LDA TXLAST,X›2560     SBC TX,X    ;CALCULATE MOVED DISTANCE›2570     BEQ EXIT›2580     BPL MOVEUP  ;UP OR DOWN?›2590     EOR #$FF    ;HERE UP!›2600     CLC ›2610     ADC #$01›2620     SEC ›2630     STA TXLAST,X ;DECREMENT INTERMEDIATE 16BIT COUNTERS›2640     LDA GXLO,X›2650     SBC TXLAST,X ;MISUSED!›2660     STA GXLO,X›2670     BCS ADDONE›2680     DEC GXHI,X›2690     BPL ADDONE›2700     LDA #$00    ;COMPLETE UNDERFLOW.›2710     STA GXLO,X  ;STICK TO BOUNDARY›2720     STA GXHI,X›2730     BEQ ADDONE›2740 MOVEUP ;        HERE UPWARDS›2750     CLC ›2760     ADC GXLO,X  ;INCREMENT 16BIT COUNTERS›2770     STA GXLO,X›2780     BCC ADLO›2790     INC GXHI,X›2800 ADLO›2810     LDA GXLO,X›2820     CMP # <228*4›2830     LDA GXHI,X›2840     SBC # >228*4›2850     BCC ADDONE  ;COMPLETE 16BIT OVERFLOW ?›2860     LDA # <228*4 ;THIS IS THE MAXIMUM VALUE DUE TO THE PADDLE LOGIC›2870     STA GXLO,X›2880     LDA # >228*4›2890     STA GXHI,X›2900 ADDONE›2910     LDA TX,X›2920     STA TXLAST,X ;SAVEBACK LAST POSITION FOR DIFFERENCE CALCULATIONS›2930     LDA GXHI,X  ;THE MOUSE IS›2940     LSR A       ; MOUCH TOO FAST›2950     TAY         ;SCALE IT DOWN›2960     LDA GXLO,X  ;BY A FACTOR OF›2970     ROR A       ;OF FOUR›2980     PHA ›2990     TYA ›3000     LSR A›3010     PLA ›3020     ROR A       ;AND STORE THE›3030     STA MOUSEX,X ;RESULT›3040 EXIT›3050     RTS ›3060     .WORD 0›3070 ;›3080 ;***** END OF MOUSE DRIVER *****›3090 ;›3100 ;DUMP EXAMPLE CODE STARTS HERE›3110 ;JUST A TINY P/M GFX ON THE SCREEN›3120 ENF›3130     *=  $3800›3140     JMP START›3150 LASTY: .BYTE 0  ;LAST Y POSITION OF THE PLAYER FOR EASY REMOVAL›3160 PMBASE = $6000  ;BASE OF THE P/M GFX STORAGE›3170 PLAYINIT:›3180     LDA # >PMBASE›3190     STA $D407›3200     LDA 559›3210     ORA #$1C›3220     STA 559›3230     LDA #$03›3240     STA $D01D›3250     LDA #$01›3260     STA 623     ;INIT ANTIC AND GTIA›3270     LDX #$00›3280     TXA ›3290 CLP: STA PMBASE+$0400,X ;ERASE MEMORY›3300     DEX ›3310     BNE CLP›3320     LDA #$38›3330     STA 704     ;RED COLOR›3340     LDA #$00›3350     STA LASTY›3360     RTS ›3370 BUILDPLAYER:›3380     LDY LASTY›3390     LDA #$00›3400     LDX #$08›3410 CLP2: STA PMBASE+$0400,Y›3420     INY         ;REMOVE OLD PLAYER›3430     DEX ›3440     BNE CLP2›3450     LDA MOUSEX›3460     STA $D000   ;SETUP X POSITION›3470     LDY MOUSEY›3480     STY LASTY   ;COPY PLAYER DATA›3490     LDX #$00    ;TO MOUSEY POSITION›3500 STL2: LDA PMDATA,X›3510     STA PMBASE+$0400,Y›3520     INY ›3530     INX ›3540     CPX #$08›3550     BCC STL2›3560     RTS ›3570 PMDATA: .BYTE $80,$40,$20,$10,$08,$04,$02,$01›3580 START:›3590     JSR PLAYINIT›3600     JSR INSTALL›3610 LOOP:›3620     JSR BUILDPLAYER›3630     LDA $14›3640 WT: CMP $14     ;WAIT FOR VBI TO AVOID FLICKER›3650     BEQ WT›3660     BNE LOOP›3670 ; THAT'S ALL FOLKS!›