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
Back to previous page