10*KEY 0 REN.|MSAVE"HANDLER"|M 20*KEY 10 OLD|MMODE7|M 30OsByte=&FFF4 40KeyV=&228 50DIM Code &200 60FOR Pass=0 TO 2 STEP 2 70P%=Code 80[OPT Pass 90Lda KeyV 100Sta OldV 110Lda KeyV+1 120Sta OldV+1 130Lda #myv MOD 256 140Sta KeyV 150Lda #myv DIV 256 160Sta KeyV+1 170Rts 180.OldV BRK:BRK 190.dis 200Lda OldV:Sta KeyV 210Lda OldV+1:Sta KeyV+1 220Rts 230.P_in BRK 240.A_in BRK 250.X_in BRK 260.Y_in BRK 270.myv 280Php 290Sta A_in 300Stx X_in 310Sty Y_in 320Pla: Sta P_in 330Pha:Plp 340Bcc C_clear 350\ C set 360 Bvs C_set_V_set 370.C_set_V_clear 380JMP CSVC 390.C_set_V_set 400JMP CSVS 410.C_clear 420Bvs C_clear_V_set 430.C_clear_V_clear 440JMP CCVC 450.C_clear_V_set 460JMP CCVS 470.hisv 480 Ldx X_in 490 Ldy Y_in 500 Lda P_in 510 Pha 520 Lda A_in 530 Plp 540.rawjump 550Jmp (OldV) 560 570.return 580 Ldx X_in 590 Ldy Y_in 600 Lda P_in 610 Pha 620 Lda A_in 630 Plp 640 Rts 650 660.CCVC 670 Jmp hisv 680 690.CSVC 700 \ Perform his scan 710 Jsr hisv 720 \ If X <> #&FF then return 730 Cpx #&FF 740 Beq zz1 750 Stx X_in 760 Jmp return 770 .zz1 780 \ Scan using initial parameters 790 \ as OSBYTE &79 800 Jsr ourscan 810 \ X <- internal key no. 820 \ other regs as on entry. 830 Stx X_in 840 Stx A_in 850 Jmp return 860 870.CCVS 880 \ perform his scan 890 Jsr hisv 900 \ if X <> 0 then return 910 Cpx #0 920 Beq zz2 930 Stx X_in 940 Jmp return 950 .zz2 960 \ perform our scan 970 Jsr ourscan 980 Stx &EC 990 \ if no key pressed then X=0 and return 1000 Cpx #&FF 1010 Bne zz3 1020 Ldx #0 1030 Stx X_in 1040 Jmp return 1050.zz3 1060 \ ?&242 = #&FF 1070 Lda #&FF:Sta &242 1080 \ X = #&FF 1090 Ldx #&FF 1100 \ ?&EC = internal key no. 1110 Stx &EC 1120 Stx X_in 1130 Jmp return 1140 1150.CSVS 1160 \ do our scan 1170 Jsr ourscan 1180 \ if no key pressed then goto his scan 1190 Cpx #&FF 1200 Bne zz5 1210 Jmp hisv 1220.zz5 1230 Dec &E7 1240 Beq timedout 1250 Jmp return 1260.timedout 1270 \ if char found <> ?&EC then 1280 Cpx &EC 1290 Beq autorep 1300 \ do rollover 1310 \ else 1320\\\\\ Jmp return 1330.autorep 1340 \ Put in keyboard buffer(lookup(?&EC)) 1350 \ INTERNAL KEY NOT IS IN X ? 1360 Jsr translate 1370 Txa:Tay:Lda #138:Ldx #0:Jsr OsByte 1380 \ do auto repeat 1390 \ ?&E7 = ?&2CA 1400 Lda &2CA:Sta &E7 1410 \ ?&2CA = ?&255 {repeat counter} 1420 Lda &255:Sta &2CA 1430 \ end 1440 Jmp return 1450 1460.row BRK 1470.col BRK 1480 1490.ourscan 1500 \ Stop cycling latch 1510 \ Keyboard matrix gets values we 1520 \ put on latch. 1530 Lda #3: Sta &FE40 1540 \ FOR ROW = &1 TO &7 1550 Lda #1:Sta row 1560.for_row 1570 \ FOR COL = 10 TO 12 1580 Lda #10:Sta col 1590.for_col 1600 \ ?&FE41=ROW<<4!COL 1610 Lda row:AslA:AslA:AslA:AslA:Ora col 1620 Sta &FE41 1630 \ CH = ?&FE41 1640 Lda &FE41 1650 \ IF CH AND 128 THEN 1660 BPL end_if 1670 \ ! GOT A CHAR 1680 Tax 1690 Jmp donescan 1700 \ RETURN 1710 \ END IF 1720.end_if 1730 \ NEXT 1740 Inc col:Lda col 1750 Cmp #13:Bne for_col 1760 \ NEXT 1770Inc row:Lda row 1780Cmp #8:Bne for_row 1790Ldx #&FF 1800 \ Restore latch load value if changed 1810.donescan 1820 Lda #(3+8): Sta &FE40 1830 Rts 1840 1850.char BRK \ EXBED later 1860.translate \ CHAR X -> Val. 1870 \ Accouting for shift etc... 1880 Txa 1890 Sta char 1900 And #&F:Sec:Sbc #10 1910 Rol char 1920 Rol char:Rol A 1930 Rol char:Rol A 1940 Rol char:Rol A 1950 Sta char 1960 Clc:Clv:Jsr rawjump 1970 Php 1980 Clc 1990 Bpl qq1 2000 Sec 2010.qq1 2020 Rol char 2030 Plp 2040 Clc 2050 Bvc qq2 2060 Sec 2070.qq2 2080 Rol char 2090 Ldx char 2100 Lda keytab,X 2110 Tax 2120 2130 Rts 2140 2150.keytab 2160 \ Normal; Shift; Control; Control+Shift 2170 EQUS "????66668888++++" 2180 EQUS "////####00004444" 2190 EQUS "????77779999----" 2200 EQUD &7F7F7F7F 2210 EQUS "****11115555" 2220 EQUS "????????????" 2230 EQUD &0D0D0D0D 2240 EQUS "....,,,,33332222" 2250] 2260NEXT 2270PRINT&200-(P%-Code);" bytes left" 2280ON ERROR GOTO 2310 2290CALL Code 2300REPEAT VDU GET :UNTIL0 2310CALL dis 2320REPORT:PRINT" At Line ";ERL