þþÉd#X; MOUSE DRIVER , CMOS INTERFACEn!X; (C) 1991,1997 THOR-SOFTWARExX; (THOMAS RICHTER)‚"X; MOUSE DRIVER AND SAMPLE CODEŒX; FOR THE MAC/65–X;  X; THIS DEMO ASSUMES THAT THEª$X; INTERFACE IS CONNECTED TO PORT´X; 2 AND THE MEMORY $800 AND¾X; $3800 IS FREE (WHICH ISÈ#X; MOSTLY USED BY THE DOS UNLESSÒX; YOU USE MY DOS 2.XL)ÜX; CHANGE THE LINE BELOW FORæX; A DIFFERENT BASE ADDRESSðX;úF$X; JUMP VECTORS FOR THE INTERFACEX; FUNCTIONS."X;, X; INSTALL IS USED TO SETUP A6 X; VBI ROUTINE THAT READS THE@X; MOUSE POINTERS AND PUSHESJ#X; THEM INTO THE PADDLE POSITIONTX; SHADOW REGISTERS FOR EASY^ X; ACCESS. THE PTRIG REGS AREh$X; PATCHED AS WELL TO REFLECT THErX; MOUSE BUTTONS.| !‡INSTALL†#X; SETVBNEW IS A REPLACEMENT FORX; THE SETVBV OS JUMP VECTORšX; IT LEAVES THE MOUSE VBI¤X; INTACT, BUT INSTALLS AN® X; ADDITIONAL DEFFERED VBI ON¸X; REQUEST. !ˆSETVBNEWÌ!X; DISABLE DISABLES THE DRIVERÖ X; COMPLETELY, WITHOUT GIVINGà!X; THE USER A CHANCE TO ENABLEêX; IT AGAIN (VIA HELP).ô$X; ENABLE ALLOWS DRIVER FUNCTIONSþ!X; AGAIN, EVEN THOUGH THE USER#X; MIGHT HAVE CHOOSEN TO TURN IT X; OFF. AN ADDITIONAL CALL TO#X; PERMIT IS NECESSARY TO RESUME& !†ENABLE0 !‡DISABLE:"X; FORBID AND PERMIT SWITCH THED#X; MOUSE DRIVER ON AND OFF. THISN#X; FLAG IS ALSO UNDER CONTROL OFX!X; THE USER AND CAN BE TOGGLEDbX; WITH THE HELP KEY. MINORl$X; MODIFICATIONS FOR THE A800 ANDv"X; THE A400 ARE NECESSARY HERE.€ !†PERMITŠ !†FORBID”X; TEMPORARY STORAGEž‡MOUSEX: ¨‡MOUSEY: ² ƒTX: ¼ ƒTY: ƇTXLAST: ЇTYLAST: Ú …GXLO: ä …GYLO: î …GXHI: ø …GYHI:  ƒEN:  X; ON-OFF FLAGS …ENAB:   …ALLO: * ‡INSTALL4X;INSTALL MOUSE DRIVER>Q>HP‚TXRP‚TY\ P„ENABf P„ALLOpQ>z $>5ƒVBI„ %>4ƒVBIŽ \ä;;SETUP VBI˜ Q>4ƒENF¢Pç¬ Q>5ƒENF¶PèÀ:ÊX;Ô"X; *** MAIN VBI STARTS HERE ***ÞƒVBIè*„ENAB;;DISABLED ?ò G…ENANOüQÜ F†NOHELP!Q„ALLO;; TOGGLE FLAG WITH HELPN>ÿ$ P„ALLO.Q>8PÜB †NOHELPL *„ALLOVG…ENANO;;ACTIVE ?` ‡INITPIA;;SETUP PORTj †READXY;;READ MOUSEt ˆRESETPIA;;RESET PORT~6Q>;;PATCH SHADOW REGISTERS FOR THE MOUSE POSITIONˆ*r’ I…NOPREœQ>¦ …NOPRE°P}ºQ…ÄP|Î'Q>ä;;THIS ONE IS UPSIDE DOWN. SIGH.Ø;â S†MOUSEYì $†MOUSEXö&pPq;; PATCH PADDLE POSITION Q>*| H†NOSET1(M> 2†NOSET1*}< H†NOSET2FM>P†NOSET2PxZ …ENANOd „SET1,n D„OVEXx1„SET2 ÿÿ;; CALL ADDITIONAL DEFFERRED VBI HERE‚4Œ4–„OVEX !b䪴X;¾8X; INSTALL ADDITIONAL VBI WITHOUT REMOVING THE DRIVERÈ ˆSETVBNEWÒ R>;;PATCH ONLY DEFERRED VBIÜ H†SETOLDæQ>ðP„SET1;;DISABLEú '„SET2&„SET2;;PATCH JSR ABOVEQ>8 P„SET1" :;;ENABLE, †SETOLD6 \ä@:JX;T#X; MOST BORING SET-FLAG ROUTINES^ †ENABLEhQ>r P„ENAB|:† ‡DISABLEQ>ÿš P„ENAB¤:® †PERMIT¸Q> P„ALLOÌ:Ö †FORBIDàQ>ÿê P„ALLOô:þX;"X; *** PIA SERVICE ROUTINES ***X;X; SETUP PORT FOR READING& ˆINITPIA:0Q>0:PÓ;;ACCESS DDRDQ>ÀNPÓ;;PA6 AND 7 ARE OUTPUTSXQ>;;RESET LINESvPÓ€ …DELAY;;TINY DELAY FOR CMOSŠ:”X;ž*X; RESETPIA. RESTORE USUAL PIA FUNCTION¨ ‰RESETPIA:²Q>0¼PÓ;;ACCESS DDRÆQ>ÐPÓ;;EVERYTHING IS IN NOWÚQ><;;BACK TO PORT REGISTERSäPÓî …DELAY;;WAITø:X; $X; *** READXY - READ COUNTERS *** ‡READXY: Q>*PÓ4 …DELAY;;ALL LINES OFF>Q>€H)PÓ;;TELL SHIFT REGISTER TO LOAD DATAR …DELAY\Q>fPÓ;;LOAD OPERATION DONEpP‚TXz*P‚TY;;RESET TEMPORARY SCRATCH REGISTERS„ …DELAYŽ.$>;;# OF BITS TO READ FROM SHIFT REGISTER˜ ˆINRDLOP:¢QÓ;;READ DATA¬8V?;;ACCESS BITS PA4 AND 4 - WE'RE CONNECTED TO PORT 2¶V?ÀV?ÊV?ÔV?;;SHIFT TO CARRYÞU‚TX;;READ X BITèV?òU‚TY;;READ Y BITü …DELAY Q>@ 8PÓ;;GENERATE ONE CLOCK CYCLE FOR THE SHIFT REGISTER ! …DELAY;;DELAY TO SETTLE STATE$ Q>;;RESET CLOCK SIGNAL. PÓ8 …DELAYB 0;; READ NEXT BITL H‡INRDLOPV T;MOUSE COUNTERS ARE READ NOW. CALCULATE THE INTERNAL POSITION, HANDLE OVERFLOWS.` $>j ˆCALCMOVEt 2~ ˆCALCMOVEˆ :’ X†DELAY:;DELAY DUMMY. CMOS IS SO SLOW AND THE INTERFACE HAS A RATHER HIGH IMPENDANCE.œ 4¦ 4° 4º :Ä X;Î OX; OVERFLOWS AND UDERFLOWS OF THE HARDWARE COUNTERS ARE HANDLED HERE AS WELLØ 9X;X IS 0 FOR HORIZONTAL AND 1 FOR THE VERTICAL COUNTERâ ‰CALCMOVE:ì ;ö Q†TXLAST9 "S‚TX9;;CALCULATE MOVED DISTANCE F„EXIT I†MOVEUP;;UP OR DOWN? N>ÿ;;HERE UP!( ,2 O>< ;F 3P†TXLAST9;;DECREMENT INTERMEDIATE 16BIT COUNTERSP Q„GXLO9Z S†TXLAST9;;MISUSED!d P„GXLO9n E†ADDONEx "„GXHI9‚ I†ADDONEŒ Q>;;COMPLETE UNDERFLOW.– P„GXLO9;;STICK TO BOUNDARY  P„GXHI9ª F†ADDONE´ †MOVEUP;HERE UPWARDS¾ ,È $O„GXLO9;;INCREMENT 16BIT COUNTERSÒ P„GXLO9Ü D„ADLOæ #„GXHI9ð „ADLOú Q„GXLO9 R>4ä Q„GXHI9 S>5ä" &D†ADDONE;;COMPLETE 16BIT OVERFLOW ?, >Q>4ä;;THIS IS THE MAXIMUM VALUE DUE TO THE PADDLE LOGIC6 P„GXLO9@ Q>5äJ P„GXHI9T †ADDONE^ Q‚TX9h @P†TXLAST9;;SAVEBACK LAST POSITION FOR DIFFERENCE CALCULATIONSr Q„GXHI9;;THE MOUSE IS| V?;; MOUCH TOO FAST† ?;;SCALE IT DOWN Q„GXLO9;;BY A FACTOR OFš W?;;OF FOUR¤ 5® C¸ V? 7Ì W?;;AND STORE THEÖ P†MOUSEX9;;RESULTà „EXITê :ô  þ X; $X;***** END OF MOUSE DRIVER ***** X; "X;DUMP EXAMPLE CODE STARTS HERE& &X;JUST A TINY P/M GFX ON THE SCREEN0 ƒENF: 8D !…STARTN =†LASTY: ;;LAST Y POSITION OF THE PLAYER FOR EASY REMOVALX +†PMBASE`;;BASE OF THE P/M GFX STORAGEb ‰PLAYINIT:l Q>5†PMBASEv PÔ€ Q/Š L>” P/ž Q>¨ Pв Q>¼ Po;;INIT ANTIC AND GTIAÆ $>Ð AÚ #„CLP:P†PMBASE9;;ERASE MEMORYä 0î HƒCLPø Q>8 PÀ;;RED COLOR Q> P…LASTY :* ŒBUILDPLAYER:4 %…LASTY> Q>H $>R …CLP2:P†PMBASE8\ 3;;REMOVE OLD PLAYERf 0p H„CLP2z Q†MOUSEX„ PÐ;;SETUP X POSITIONŽ %†MOUSEY˜ '…LASTY;;COPY PLAYER DATA¢ $>;;TO MOUSEY POSITION¬ …STL2:Q†PMDATA9¶ P†PMBASE8À 3Ê 2Ô (>Þ D„STL2è :ò #‡PMDATA: €=@= =====ü †START: ˆPLAYINIT ‡INSTALL …LOOP:$ ‹BUILDPLAYER.Q8)ƒWT:R;;WAIT FOR VBI TO AVOID FLICKERBF‚WTL H„LOOPVX; THAT'S ALL FOLKS!