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 # 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!›