100 SYS700 ;PAL 64 ASSEMBLER 110 ; SUPERKEY DRIVER PROGRAM 120 *=$C000 130 .OPT OO 140 ; 150 BUFNUM = 198 160 BUFMAX = 649 170 DATAPT = $DC00 180 DDR = $DC02 190 KEYBUF = 631 200 IRQVEC = 788 210 CNTR = $FD 220 PKEY = $FE 230 DELAY = 20 240 RPT = 4 250 LKEY = 16 260 ; 270 JMP SETUP ;CONNECT 280 SEI ;DISCONNECT 290 LDA OLDIRQ+1 300 STA IRQVEC 310 LDA OLDIRQ+2 320 STA IRQVEC+1 330 CLI 340 RTS 350 ; 360 SETUP SEI 370 LDA IRQVEC 380 STA OLDIRQ+1 390 LDA IRQVEC+1 400 STA OLDIRQ+2 410 LDA #START 440 STA IRQVEC+1 450 LDA #LKEY 460 STA PKEY 470 CLI 480 RTS 490 ; 500 START LDA BUFMAX 510 CMP BUFNUM ;CHECK IF KEYBUFFER FULL 520 BEQ OLDIRQ ;BRANCH IF YES 530 LDA #%00001111 540 STA DDR ;SET UP DATA DIRECTION REGISTER 550 LDY #$00 ;START KEY COUNT AT ZERO 560 KREAD STY DATAPT ;STORE COUNT IN PORT 2 570 LDA DATAPT 580 AND #%00010000 ;CHECK IF KEY PRESSED 590 BNE NOKEY ;BRANCH IF NOT PRESSED 600 CPY PKEY ;IS CURRENT KEY SAME AS LAST 610 BNE NOT ;BRANCH IF NOT THE SAME 620 DEC CNTR ;DECREMENT COUNT UNTIL REPEAT 630 BNE RESET ;BRANCH IF NOT TIME FOR REPEAT 640 LDA #RPT 650 BNE STORE 660 NOT LDA #DELAY 670 STORE STA CNTR ;SET UP COUNTER FOR NEXT REPEAT 680 LDA TABLE,Y ;LDA WITH CHARACTER FROM TABLE 690 LDX BUFNUM ;CURRENT KEY IN KEYBUFFER 700 STA KEYBUF,X ;STORE CHAR 710 INC BUFNUM ;ADD 1 TO # OF CHARS IN BUFFER 720 BNE END ;BRANCH ALWAYS! 730 NOKEY INY ;ADD 1 TO CURRENT KEY NUMBER 740 CPY #LKEY ;IS LOOP DONEPRINT 750 BNE KREAD ;BRANCH IF NOT DONE 760 END STY PKEY ;SAVE Y IN PREVIOUS KEY PRESSED 770 RESET LDA #%11111111 780 STA DDR ;RESTORE DATA DIRECTION REGISTR 790 OLDIRQ JMP $EA31 ;(null) TO OLD IRQ ROUTINE 800 TABLE .ASC "0123456789ABCDEF" 810 ;TABLE OF CHARACTERS FOR KEYS 820 .END