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›1040 STA DOSINI+1›1050 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›1160 STA MEMLO+1›1170 ;›1180 ;Insert Fast Moves into the›1190 ;keyboard service routines.›1200 ;›1210 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 # 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 ›