home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Antic Magazine 1985 November
/
Antic_Magazine_1985_11_Antic.atr
/
fastmove.m65
< prev
next >
Wrap
Text File
|
2023-02-26
|
7KB
|
1 lines
10 ; FAST MOVES, LISTING 2¢20 ; BY PATRICK DELL'ERA¢30 ; (c) 1985, ANTIC PUBLISHING¢40 ;¢0100 ; EQUATES¢0110 ;¢0120 RUNAD = $02E0 ;Auto run addr¢0130 MEMLO = $02E7 ;Lower limit of¢0140 ; ; free memory¢0150 DOSVEC = $0A ;Addr jumped to¢0160 ; ; when DOS called¢0170 DOSINI = $0C ;Initialization¢0180 ; ; addr for DOS¢0190 VVBLKD = $0224 ;dlyd vbi vctr¢0200 SETVBV = $E45C ;set vbi¢0210 VKEYBD = $0208 ;Keyboard vctr¢0220 SKSTAT = $D20F ;Keyboard status¢0230 KBCODE = $D209 ;Pokey rgstr¢0240 CH = $02FC ;Current key--¢0250 ; ; KBCODE shadow¢0260 CH1 = $02F2 ;Previous key¢0270 ATTRACT = $4D ;Atct mode flag¢0280 SRTIMR = $022B ;Auto-Repeat tmr¢0290 UP = $8E ;Hardware codes¢0300 DOWN = $8F ; for key¢0310 LEFT = $86 ; pressed¢0320 RIGHT = $87 ;¢0330 DUMMY = $FF ;Variable byte¢0340 ADDR = $FFFF ;Variable word¢0350 ;¢0380 ;¢0390 *= $1D7C ;End of resident¢0420 ;¢0430 ;¢0440 DBOUNCE .BYTE 1¢0450 FASTFLG .BYTE $FF¢0460 TABLE¢0470 .BYTE UP,DOWN,LEFT,RIGHT¢0480 FAST.MOVES¢0490 TXA ;OS has already¢0500 PHA ; saved reg A,¢0510 ; ; we also save X¢0520 LDA KBCODE ;Get key pressed¢0530 LDX #4 ;Then search¢0540 ; ; TABLE for a¢0550 ; ; match¢0560 SEARCH¢0570 DEX ¢0580 STX FASTFLG ;Save index into¢0590 ; ; TABLE¢0600 BMI NONE ;End of table...¢0610 CMP TABLE,X ;Found a match?¢0620 BNE SEARCH ;No,keep looking¢0630 STA CH1 ;Key is a cursor¢0640 STA CH ; control, so¢0650 LDA #$0F ; update current¢0660 STA DBOUNCE ; and previous¢0670 STA ATTRACT ; key pressed,¢0680 PLA ; set our delay¢0690 TAX ; timer, reset¢0700 PLA ; attract mode¢0710 RTI ; and go back¢0720 NONE¢0730 PLA ;No matches so¢0740 TAX ; let OS have key¢0750 VKEYBD.SAVE = *+1¢0760 JMP ADDR ;Addr is modi-¢0770 ; ; fied by INIT¢0780 ; ; to point to¢0790 ; ; OS's handler¢0800 ;¢0810 ;¢0820 ;The addr for REINIT is stored¢0830 ;in DOSINI. SYSTEM RESET will¢0840 ;come through here and then¢0850 ;through INIT2 to re-establish¢0860 ;Fast Moves.¢0870 ;¢0880 REINIT¢0890 JSR ADDR ;Address is¢0900 ; ; changed to¢0910 ; ; DOSINI vector¢0920 ; ; by INIT¢0930 ;¢0940 ;After returning from the¢0950 ;DOS initialization, we have to¢0960 ;re-establish the vectors in¢0970 ;DOSINI, and DOSVEC. In this way¢0980 ;we make Fast Moves "persistent".¢0990 ;¢1000 INIT2¢1010 LDA # <REINIT¢1020 STA DOSINI¢1030 LDA # >REINIT¢1040 STA DOSINI+1¢1050 LDA # <CALL.DOS¢1060 STA DOSVEC¢1070 LDA # >CALL.DOS¢1080 STA DOSVEC+1¢1090 ;¢1100 ;Move lo mem up to create safe¢1110 ;place for Fast Moves.¢1120 ;¢1130 LDA # <FINIS¢1140 STA MEMLO¢1150 LDA # >FINIS¢1160 STA MEMLO+1¢1170 ;¢1180 ;Insert Fast Moves into the¢1190 ;keyboard service routines.¢1200 ;¢1210 LDA # <FAST.MOVES¢1220 STA VKEYBD¢1230 LDA # >FAST.MOVES¢1240 STA VKEYBD+1¢1250 ;¢1260 ;Install our vertical blank¢1270 ;routine the safe way, through¢1280 ;the OS routine for setting¢1290 ;vertical blank routines!¢1300 ;¢1310 LDA #7¢1320 LDX # >VBLANK¢1330 LDY # <VBLANK¢1340 JMP SETVBV¢1350 ;¢1360 ;Any call to DOS will vector¢1370 ;through here.¢1380 ;¢1390 CALL.DOS¢1400 ;¢1410 ;Fisrt, replace the OS keyboard¢1420 ;routine.¢1430 ;¢1440 LDA #DUMMY ;This value is¢1450 ; ; is set by INIT¢1460 VKEYBD.L = *-1¢1470 STA VKEYBD¢1480 LDA #DUMMY ;So is this one!¢1490 VKEYBD.H = *-1¢1500 STA VKEYBD+1¢1510 ;¢1520 ;Then, re-establish the original¢1530 ;vertical blank routine.¢1540 ;¢1550 LDA #7¢1560 LDX VBLANK.1+2¢1570 LDY VBLANK.1+1¢1580 JSR SETVBV¢1590 ;¢1600 ;Then DOS initialization and¢1601 ;start addresses.¢1610 ;¢1620 DOSREINI¢1630 DOS1 = *+1¢1640 LDA #DUMMY ;Dummy values¢1650 STA DOSINI ; are changed by¢1660 DOS2 = *+1¢1670 LDA #DUMMY ; INIT to¢1680 STA DOSINI+1 ; restore¢1685 DOS3 = *+1¢1690 LDA #DUMMY ; DOSINI and¢1700 STA DOSVEC ; DOSVEC¢1705 DOS4 = *+1¢1710 LDA #DUMMY ;¢1720 STA DOSVEC+1¢1730 ;¢1740 ;Now we can go safely to DOS.¢1750 ;¢1760 DO.DOS.V¢1770 JMP ADDR ;Addr changed by¢1780 ; ; INIT to show¢1790 ; ; DOSVEC¢1800 ;¢1810 ;Vertical Blank Interrupts¢1820 ;vector through here. We check¢1830 ;to see if a key is being held¢1840 ;down. If so, then we determine¢1850 ;if it is a cursor control key.¢1860 ;If so, then we make it repeat¢1870 ;more quickly than OS does.¢1880 ;¢1890 VBLANK¢1900 LDA DBOUNCE ;Debounce logic¢1910 ; ; in use?¢1920 BEQ VBLANK.3 ;No, make next¢1930 ; ; test¢1940 DEC DBOUNCE ;Yes, subtract 1¢1950 ; ; from timer¢1960 BNE VBLANK.1 ;If DBOUNCE<>0,¢1970 ; ; all done¢1980 VBLANK.3¢1990 LDA FASTFLG ;Equals $FF if¢2000 BMI VBLANK.1 ; not cursor ctl¢2010 LDA SKSTAT ;Bit 3 is on if¢2020 AND #4 ; key is still¢2030 BNE VBLANK.1 ; held down¢2040 LDA #6 ;If timer has¢2050 CMP SRTIMR ; already been¢2060 ; ; set with 6¢2070 ; ; (Fast Moves'¢2080 BCS VBLANK.2 ; speed),branch¢2090 STA SRTIMR ;Else, set timer¢2100 VBLANK.2¢2110 DEC SRTIMR ;Subtract 1¢2120 VBLANK.1¢2130 JMP ADDR ;Addr is changed¢2140 ; ; to OS's VBI¢2150 ; ; routine by INIT¢2160 ;¢2170 ;FINIS marks the end of pro-¢2180 ;tected memory.¢2190 ;¢2200 FINIS¢2210 ;¢2220 ;DOS jumps here after auto load-¢2230 ;loading Fast Moves. Several¢2240 ;addresses within Fast Moves are¢2250 ;modified. This routine is not¢2260 ;protected as it is needed only¢2270 ;once.¢2280 ;¢2290 INIT¢2300 LDA DOSVEC ;Save DOS vector¢2310 STA DO.DOS.V+1¢2320 STA DOS3¢2330 LDA DOSVEC+1¢2340 STA DO.DOS.V+2¢2350 STA DOS4¢2360 ;¢2370 LDA DOSINI ;Save DOS initi-¢2380 STA REINIT+1 ; alization¢2390 STA DOS1 ; vector¢2400 LDA DOSINI+1¢2410 STA REINIT+2¢2420 STA DOS2¢2430 ;¢2440 LDA VKEYBD ;Save keyboard¢2450 STA VKEYBD.SAVE ; handler¢2460 STA VKEYBD.L ; vector¢2470 LDA VKEYBD+1¢2480 STA VKEYBD.SAVE+1¢2490 STA VKEYBD.H¢2500 ;¢2510 LDA VVBLKD ;Save VBI¢2520 STA VBLANK.1+1 ; routine¢2530 LDA VVBLKD+1 ; vector¢2540 STA VBLANK.1+2¢2550 ;¢2560 JMP INIT2 ;Continue initi-¢2570 ; ; alization¢2580 ;Autorun¢2590 ;¢2600 *= RUNAD¢2610 .WORD INIT¢2620 ;¢2630 .END ¢