; Keyboard handler by AnChoR 2000. IDIR "sonic:includes/" FDIR "sonic:functions/" INCLUDE "standard.i" QLVOYES INIT K_RepeatDelay.C=20,K_RepeatSpeed.C=1 INIT K_Buffer.D=256,K_KeyTable.D=16,K_KeyBuffer.D=256 FUNCTION K_Data /K_ShiftKey INSL 0 /K_AmigaKey INSL 0 /K_CTRLKey INSL 0 /K_AltKey INSL 0 /K_MsgPort INSL 0 /K_IoReq INSL 0 /K_Key INSL 0 /K_Repeat INSL 0 /K_RepeatCounter INSL 0 /KeyboardName INSERT "keyboard.device" EVEN FEND olib {graphics},{gfxbase} FUNCTION K_WaitTOF ml gfxbase,a6 jsr _LVOWaitTOF(a6) FEND FUNCTION GetKey temp=peek[K_KeyTable] GIVE temp FEND FUNCTION K_InitKeyTable CYCLE i=0 TO 3 loke[K_KeyTable+i*4,¯1] NEXT FEND FUNCTION K_CheckQualifiers TASM cmp.b #$60,d0 beq K_CQW0 cmp.b #$61,d0 beq K_CQW0 cmp.b #$62,d0 beq K_CQW0 /K_CQC0 cmp.b #$64,d0 beq K_CQW1 cmp.b #$65,d0 beq K_CQW1 /K_CQC1 cmp.b #$66,d0 beq K_CQW2 cmp.b #$67,d0 beq K_CQW2 /K_CQC2 cmp.b #$63,d0 bne K_CQW3 mw #¯1,K_CTRLKey mb #¯1,-(a0) addq.l #1,a0 /K_CQW3 rts /K_CQW0 mw #¯1,K_ShiftKey mb #¯1,-(a0) addq.l #1,a0 bra K_CQC0 /K_CQW1 mw #¯1,K_AltKey mb #¯1,-(a0) addq.l #1,a0 bra K_CQC1 /K_CQW2 mw #¯1,K_AmigaKey mb #¯1,-(a0) addq.l #1,a0 bra K_CQC2 TOFF FEND FUNCTION K_OpenKeyboard TASM ml 4.w,a6 jsr _LVOCreateMsgPort(a6) ; Create MsgPort ml d0,K_MsgPort ml d0,a0 ml #5000,d0 ; Size jsr _LVOCreateIORequest(a6) ; CreateIoRequest ml d0,K_IoReq lea KeyboardName(pc),a0 mq #0,d0 mq #0,d1 jsr _LVOOpenDevice(a6) ; OpenDevice TOFF FEND FUNCTION K_ReadKeyMatrix TASM ml 4.w,a6 ml K_IoReq(pc),a1 mw #10,$1c(a1) ; command=KBD_READMATRIX ml #13,$24(a1) ; length ml #K_KeyBuffer,$28(a1) ; data jsr _LVODoIO(a6) ; DoIo TOFF FEND FUNCTION K_CloseKeyboard TASM ml 4.w,a6 ml K_IoReq(pc),a1 jsr _LVOCloseDevice(a6) ; CloseDevice ml K_IoReq(pc),a0 jsr _LVODeleteIORequest(a6) ; DeleteIoRequest ml K_MsgPort(pc),a0 jsr _LVODeleteMsgPort(a6) ; DeleteMsgPort TOFF FEND FUNCTION K_KeyCheck TASM cmp.b K_Key(pc),d0 beq K_KHNo mb d0,K_Key mw #K_RepeatDelay,K_RepeatCounter ; init clr.w K_Repeat ; off mq #0,d0 rts /K_KHNo tst.w K_Repeat beq K_RepCome tst.w K_RepeatCounter beq K_RepOn bra K_RW0 /K_RepCome tst.w K_RepeatCounter beq K_RepOn /K_RW0 subq.w #1,K_RepeatCounter mq #¯1,d0 rts /K_RepOn mw #K_RepeatSpeed,K_RepeatCounter ; init mw #¯1,K_Repeat ; on mq #0,d0 TOFF FEND FUNCTION K_KeyHandler TASM mq #¯1,d0 cmp.b K_Key(pc),d0 beq K_KCX mq #0,d0 mq #0,d1 mb K_Key(pc),d0 ml d0,d1 and.b #$f0,d1 lsr.w #4,d1 ; word # and.w #$f,d0 ; bit # lea K_KeyBuffer,a0 mw (a0,d1.l*2),d2 mw d2,d3 lsl.w #8,d3 lsr.w #8,d2 mb d2,d3 btst d0,d3 bne K_KCX mb #¯1,K_Key TOFF /K_KCX FEND FUNCTION K_MakeKeyStates K_InitKeyTable[] TASM lea K_KeyTable,a0 lea K_KeyBuffer,a1 mq #0,d1 ; words /K_MKS0 mq #0,d0 ; bits mw (a1,d1.l*2),d3 mb d3,d4 lsl.w #8,d4 lsr.w #8,d3 mb d3,d4 /K_MKS1 btst d0,d4 beq K_MKS3 mw d1,d2 lsl.w #4,d2 addi.b d0,d2 ; make scan code mb d2,(a0)+ /K_MKS3 addq.w #1,d0 cmp.w #16,d0 bne K_MKS1 addq.w #1,d1 cmp.w #8,d1 bne K_MKS0 TOFF FEND FUNCTION K_KeyboardHandler K_ReadKeyMatrix[] K_MakeKeyStates[] K_KeyHandler[] clr.l K_ShiftKey ; init clr.l K_AmigaKey ; init clr.l K_AltKey ; init mq #7,d1 lea K_KeyTable,a0 /K_KHL0 mb (a0)+,d0 K_CheckQualifiers[] dbf d1,K_KHL0 FEND K_OpenKeyboard[] REPEAT K_KeyboardHandler[] WHEN GetKey[]=$50 AND K_KeyCheck[]=0 ; F1 Pressed? print {AnChoR\} WEND K_WaitTOF[] UNTIL GetKey[]=$45 OR checkmouse[]=1 K_CloseKeyboard[] STOP