mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
MSX-KEYBOARD: optimised interrupt handler
This commit is contained in:
@@ -4,10 +4,9 @@
|
||||
; CREATED BY: DEAN NETHERTON
|
||||
; KBD.ASM DRIVER USED AS TEMPLATE
|
||||
;
|
||||
;
|
||||
;======================================================================
|
||||
; USAGE:
|
||||
; THIS DRIVER IS CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER
|
||||
; THIS DRIVER CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER
|
||||
; ADD THE OPTION TO YOUR BUILD CONFIGURATION TO ACTIVATE THE KEYBOARD
|
||||
; DRIVER:
|
||||
; MSKENABLE .SET TRUE
|
||||
@@ -16,11 +15,9 @@
|
||||
;
|
||||
; TODO:
|
||||
; IMPLEMENT MULTIBYTE SCAN CODES (ARROW KEYS, ETC)
|
||||
; OPTIMISE INTERRUPT HANDLER - HAS NEGATIVE IMPACT ON SERIAL IO AT 115200 FOR CPU @ 8MHZ
|
||||
; BACKSPACE DOES NOT AUTO-REPEAT
|
||||
; AUTO DETECT PPI
|
||||
;
|
||||
;
|
||||
;======================================================================
|
||||
; DRIVER - CONSTANTS
|
||||
;======================================================================
|
||||
@@ -46,10 +43,10 @@ PPICMD_GA_MODE_2 .EQU 64
|
||||
PPICMD_COMMAND .EQU 128
|
||||
|
||||
; COUNT FOR PERIOD TO START REPEATING CHARACTERS
|
||||
KEY_REPEAT_INIT: .EQU 10
|
||||
KEY_REPEAT_INIT: .EQU 30
|
||||
|
||||
; COUNT FOR PERIOD BETWEEN AUTO REPEATING CHARACTERS
|
||||
KEY_REPEAT_PERIOD: .EQU 2
|
||||
KEY_REPEAT_PERIOD: .EQU 3
|
||||
|
||||
; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60))
|
||||
SCAN_INT_PERIOD: .EQU 3
|
||||
@@ -69,20 +66,20 @@ MKY_WAITTO .EQU 0 ; 0 IS MAX WAIT (256)
|
||||
;
|
||||
; STATUS BITS (FOR MKY_STATUS)
|
||||
;
|
||||
MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE
|
||||
MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT
|
||||
MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY
|
||||
MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE
|
||||
MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT
|
||||
MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY
|
||||
;
|
||||
; STATE BITS (FOR MKY_STATE, MKY_LSTATE, MKY_RSTATE)
|
||||
;
|
||||
MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED)
|
||||
MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED)
|
||||
MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED)
|
||||
MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED)
|
||||
MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD)
|
||||
MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED)
|
||||
MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED)
|
||||
MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED)
|
||||
MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED)
|
||||
MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON)
|
||||
MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD)
|
||||
;
|
||||
MKY_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS)
|
||||
MKY_DEFSTATE .EQU MKY_NUMLCK ; DEFAULT STATE (NUM LOCK ON)
|
||||
@@ -205,10 +202,8 @@ MKY_INIT:
|
||||
|
||||
LD A, PPICMD_COMMAND | PPICMD_GA_MODE_0 | PPICMD_GB_MODE_0 | PPICMD_A_IN | PPICMD_B_IN | PPICMD_CLOW_OUT | PPICMD_CHIGH_OUT
|
||||
OUT (MKY_REGCMD), A
|
||||
|
||||
LD A, 64 ; CAPS OFF
|
||||
LD A, 64 ; CAPS OFF
|
||||
OUT (MKY_REGC), A
|
||||
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
@@ -225,10 +220,9 @@ MKY_FLUSH:
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
MKY_STAT:
|
||||
LD A, $FF
|
||||
LD (MKY_SCANON), A
|
||||
CALL MKY_DECODE ; CHECK THE KEYBOARD
|
||||
JP Z,CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY
|
||||
CALL MKY_SCAN ; SCAN AND SET SCANCODE FOR DETECTED KEY EVENT
|
||||
CALL MKY_DECODE ; DECODE THE SCANCODE INTO A KEYCODE
|
||||
JP Z, CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
@@ -242,19 +236,19 @@ MKY_READ:
|
||||
CALL MKY_STAT ; KEY READY?
|
||||
;
|
||||
JR Z, MKY_READ ; NOT READY, KEEP TRYING
|
||||
LD A,(MKY_STATE) ; GET STATE
|
||||
LD A, (MKY_STATE) ; GET STATE
|
||||
AND $01 ; ISOLATE EXTENDED SCANCODE BIT
|
||||
RRCA ; ROTATE IT TO HIGH ORDER BIT
|
||||
LD E,A ; SAVE IT IN E FOR NOW
|
||||
LD A,(MKY_SCANCODE) ; GET SCANCODE
|
||||
LD E, A ; SAVE IT IN E FOR NOW
|
||||
LD A, (MKY_SCANCODE) ; GET SCANCODE
|
||||
OR E ; COMBINE WITH EXTENDED BIT
|
||||
LD C,A ; STORE IT IN C FOR RETURN
|
||||
LD A,(MKY_KEYCODE) ; GET KEYCODE
|
||||
LD E,A ; SAVE IT IN E
|
||||
LD A,(MKY_STATE) ; GET STATE FLAGS
|
||||
LD D,A ; SAVE THEM IN D
|
||||
LD C, A ; STORE IT IN C FOR RETURN
|
||||
LD A, (MKY_KEYCODE) ; GET KEYCODE
|
||||
LD E, A ; SAVE IT IN E
|
||||
LD A, (MKY_STATE) ; GET STATE FLAGS
|
||||
LD D, A ; SAVE THEM IN D
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
LD (MKY_STATUS),A ; CLEAR STATUS TO INDICATE BYTE RECEIVED
|
||||
LD (MKY_STATUS), A ; CLEAR STATUS TO INDICATE BYTE RECEIVED
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
@@ -264,9 +258,11 @@ MKY_READ:
|
||||
; ; SUCUESS/FAILURE IN A
|
||||
; ; NUMBER OF BYTES RETURNED IN B (ZERO IF NO SCAN CODES AVAILABLE)
|
||||
; ; SCAN CODE BYTES IN D, E, H, L, C
|
||||
;
|
||||
; WORK - IN - PROGRESS
|
||||
;__________________________________________________________________________________________________
|
||||
MKY_RDSCAN:
|
||||
LD A, (MKY_SCANBUFFLEN)
|
||||
CALL Z, MKY_GENSCODE
|
||||
LD A, (MKY_SCANBUFFLEN)
|
||||
LD B, A
|
||||
LD A, (MKY_SCANBUFF)
|
||||
@@ -283,6 +279,36 @@ MKY_RDSCAN:
|
||||
XOR A
|
||||
LD (MKY_SCANBUFFLEN), A
|
||||
RET
|
||||
|
||||
MKY_SCAN:
|
||||
LD A, (MKY_SCANNED) ; NEED TO WAIT UNTIL A NEW SCAN HAS COMPLETED (MKY_INT)
|
||||
OR A
|
||||
RET Z
|
||||
|
||||
DI ; CAPTURE THE LATEST KEYBOARD SCANNED STATE
|
||||
XOR A ; CLEAR SCANNED STATE
|
||||
LD (MKY_SCANNED), A
|
||||
|
||||
LD DE, MKY_SCNKEY ; COPY NEWKEY TO SCNKEY
|
||||
LD HL, MKY_NEWKEY ; AND RESET NEWKEY TO $FF
|
||||
LD B, MATRIX_ROW_COUNT
|
||||
LD C, 255
|
||||
MKY_SCAN_LP1:
|
||||
LD A, (HL)
|
||||
LD (DE), A
|
||||
LD (HL), C
|
||||
INC HL
|
||||
INC DE
|
||||
DJNZ MKY_SCAN_LP1
|
||||
EI
|
||||
|
||||
EX AF, AF'
|
||||
PUSH AF
|
||||
CALL MKY_GENSCODE
|
||||
CALL MKY_RPTGEN
|
||||
POP AF
|
||||
EX AF, AF'
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
; HARDWARE INTERFACE
|
||||
@@ -291,19 +317,16 @@ MKY_RDSCAN:
|
||||
; KEYBOARD INPUT STATUS
|
||||
; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING
|
||||
;
|
||||
MKY_IST:
|
||||
LD A, (MKY_SCANBUFFLEN)
|
||||
OR A
|
||||
RET
|
||||
#define MKY_IST LD A, (MKY_SCANBUFFLEN) \ OR A
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT
|
||||
;
|
||||
MKY_GETDATA:
|
||||
LD B,MKY_WAITTO ; SETUP TO LOOP
|
||||
LD B, MKY_WAITTO ; SETUP TO LOOP
|
||||
MKY_GETDATA0:
|
||||
CALL MKY_IST ; GET INPUT REGISTER STATUS
|
||||
JR NZ,MKY_GETDATA1 ; BYTE PENDING, GO GET IT
|
||||
MKY_IST ; GET INPUT REGISTER STATUS
|
||||
JR NZ, MKY_GETDATA1 ; BYTE PENDING, GO GET IT
|
||||
CALL DELAY ; WAIT A BIT
|
||||
DJNZ MKY_GETDATA0 ; LOOP UNTIL COUNTER EXHAUSTED
|
||||
XOR A ; NO DATA, RETURN ZERO
|
||||
@@ -317,7 +340,7 @@ MKY_GETDATA1:
|
||||
; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT
|
||||
;
|
||||
MKY_GETDATAX:
|
||||
CALL MKY_IST ; GET INPUT REGISTER STATUS
|
||||
MKY_IST ; GET INPUT REGISTER STATUS
|
||||
RET Z ; NOTHING THERE, DONE
|
||||
JR MKY_GETDATA1 ; GO GET IT
|
||||
|
||||
@@ -660,36 +683,6 @@ MKY_DEC10B:
|
||||
XOR $20 ; FLIP BIT 5 TO SWAP UPPER/LOWER CASE
|
||||
LD (MKY_KEYCODE),A ; SAVE IT
|
||||
|
||||
; MKY_DEC11: ; HANDLE NUM PAD KEYS
|
||||
; LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS
|
||||
; AND $7F;~MKY_NUMPAD ; ASSUME NOT A NUMPAD KEY, CLEAR THE NUMPAD BIT
|
||||
; LD (MKY_STATE),A ; SAVE IT
|
||||
|
||||
; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE
|
||||
; AND 11100000B ; ISOLATE TOP 3 BITS
|
||||
; CP 11000000B ; IS IN NUMPAD RANGE?
|
||||
; JR NZ,MKY_DEC12 ; NOPE, GET OUT
|
||||
|
||||
; LD A,(MKY_STATE) ; LOAD THE CURRENT STATE FLAGS
|
||||
; OR MKY_NUMPAD ; TURN ON THE NUMPAD BIT
|
||||
; LD (MKY_STATE),A ; SAVE IT
|
||||
|
||||
; AND MKY_NUMLCK ; IS NUM LOCK BIT SET?
|
||||
; JR Z,MKY_DEC11A ; NO, SKIP NUMLOCK PROCESSING
|
||||
; LD A,(MKY_KEYCODE) ; GET THE KEYCODE
|
||||
; XOR $10 ; FLIP VALUES FOR NUMLOCK
|
||||
; LD (MKY_KEYCODE),A ; SAVE IT
|
||||
|
||||
; MKY_DEC11A: ; APPLY NUMPAD MAPPING
|
||||
; LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE
|
||||
; LD HL,MKY_MAPNUMPAD ; LOAD THE START OF THE MAPPING TABLE
|
||||
; SUB $C0 ; KEYCODES START AT $C0
|
||||
; LD E,A ; INDEX TO E
|
||||
; LD D,0 ; D IS ZERO
|
||||
; ADD HL,DE ; POINT TO RESULT OF MAPPING
|
||||
; LD A,(HL) ; GET IT IN A
|
||||
; LD (MKY_KEYCODE),A ; SAVE IT
|
||||
|
||||
MKY_DEC12: ; DETECT UNKNOWN/INVALID KEYCODES
|
||||
LD A,(MKY_KEYCODE) ; GET THE FINAL KEYCODE
|
||||
CP $FF ; IS IT $FF (UNKNOWN/INVALID)
|
||||
@@ -712,21 +705,21 @@ MKY_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS)
|
||||
;__________________________________________________________________________________________________
|
||||
; INTERRUPT HANDLER
|
||||
;
|
||||
; IF MKY_SCANBUFFF HAS CONTENT, DO NOTHING
|
||||
; OTHERWISE, SCAN KEYBOARD AND IF A KEY EVENT IS DETECTED
|
||||
; WRITE SCANCODES TO MKY_SCANBUFFF
|
||||
; SCAN KEYBOARD AND IN THE NEWKEY SCAN STATS
|
||||
;
|
||||
; ALSO GENERATE KEY REPEAT EVENTS, IF KEY HELD DOWN
|
||||
;
|
||||
; NB: THIS HANDLER IS QUITE EXPENSIVE IN TIME
|
||||
; AND CAN IMPACT SERIAL OPERATION FOR 115200 BAUD RATE FOR CPU AT 8MHZ
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
MKY_INT:
|
||||
LD A, (MKY_SCANON) ; OPTIMISATION - ONLY SCAN IF REQUIRED
|
||||
LD A, (MKY_RPTACTIVE) ; NO REPEAT KEY IS HELD?
|
||||
OR A
|
||||
RET Z
|
||||
JR Z, MKY_INTSCAN1
|
||||
LD A, (MKY_RPTCNT) ; DECREMENT REPEAT COUNTER
|
||||
DEC A ; DOWN TO ZERO
|
||||
CP $FF
|
||||
JR Z, MKY_INTSCAN1
|
||||
LD (MKY_RPTCNT), A
|
||||
|
||||
MKY_INTSCAN1:
|
||||
LD A, (MKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.
|
||||
DEC A
|
||||
LD (MKY_SCNCNT), A
|
||||
@@ -735,16 +728,8 @@ MKY_INT:
|
||||
LD A, SCAN_INT_PERIOD
|
||||
LD (MKY_SCNCNT), A
|
||||
|
||||
LD A, (MKY_SCANBUFFLEN) ; SKIP SCANNING UNTIL CODE BUFFER IS EMPTY
|
||||
OR A
|
||||
RET NZ
|
||||
|
||||
EX AF, AF'
|
||||
PUSH AF
|
||||
;
|
||||
; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT MKY_NEWKEY
|
||||
;
|
||||
; MKY_SCAN:
|
||||
IN A, (MKY_REGC) ; READ AND MASK THE CURRENT STATE OF PPI PORT C
|
||||
AND $F0
|
||||
LD D, A
|
||||
@@ -759,12 +744,8 @@ MKY_SCAN_LP:
|
||||
INC D
|
||||
DJNZ MKY_SCAN_LP ; LOOP UNTIL ALL ROWS READ
|
||||
|
||||
CALL MKY_GENSCODE
|
||||
|
||||
MKY_INT_END:
|
||||
CALL MKY_RPTGEN
|
||||
POP AF
|
||||
EX AF, AF'
|
||||
LD A, $FF ; NOTE THAT A SCAN HAS BEEN DONE
|
||||
LD (MKY_SCANNED), A
|
||||
RET
|
||||
|
||||
;
|
||||
@@ -772,20 +753,20 @@ MKY_INT_END:
|
||||
; COMPARE MKY_OLDKEY O MKY_NEWKEY
|
||||
; GENERATE SCAN CODES
|
||||
;
|
||||
; FOR EACH BIT IN MKY_OLDKEY ND MKY_NEWKEY
|
||||
; FOR EACH BIT IN MKY_OLDKEY CP WITH CORRESPONDING BIT IN MKY_SCNKEY
|
||||
; IF BOTH = 1, THEN NO KEY PRESS - NOTHING CHANGED
|
||||
; IF BOTH = 0, THEN KEY WAS AND IS STILL PRESSED - NOTHING CHANGED
|
||||
; IF OLD = 1 AND NEW = 0, KEY WAS PRESSED
|
||||
; IF OLD = 0 AND NEW = 1, KEY WAS RELEASED
|
||||
; STOP OF FIRST CHANGE - STORE IN BUFFER - THEN NOTHING HAPPENS,
|
||||
; UNTIL MKY_RDSCAN IS CALLED AND CLEARS THE SCAN BUFFER
|
||||
; ALSO RESET MKY_RPTACTIVE IS A KEY IS HELD DOWN
|
||||
; IF OLD = 1 AND SCN = 0, KEY WAS PRESSED
|
||||
; IF OLD = 0 AND SCN = 1, KEY WAS RELEASED
|
||||
; STOP OF FIRST CHANGE - STORE IN BUFFER, AND RESET/CLEAR BIT IN MKY_OLDKEY
|
||||
; ALSO SET MKY_RPTACTIVE. NZ -> A KEY IS HELD DOWN, ZERO -> NO KEYS HELD DOWN
|
||||
;
|
||||
MKY_GENSCODE:
|
||||
XOR A
|
||||
LD (MKY_RPTACTIVE), A ; CLEAR FLAG TO INDICATE A KEYHOLD STATE
|
||||
|
||||
LD HL, MKY_OLDKEY
|
||||
LD DE, MKY_NEWKEY
|
||||
LD DE, MKY_SCNKEY
|
||||
XOR A
|
||||
EX AF, AF' ; ROW COUNT IN A'
|
||||
|
||||
@@ -856,11 +837,18 @@ MKY_NORPT:
|
||||
JR MKY_GENSCODENXT
|
||||
|
||||
MKY_KEYDOWN:
|
||||
PUSH AF
|
||||
LD A, KEY_REPEAT_INIT ; SET COUNTER FOR REPEAT TRIGGER
|
||||
LD (MKY_RPTCNT), A
|
||||
POP AF
|
||||
|
||||
MKY_KEYDOWN_RPT:
|
||||
CALL MKY_RESOLDBIT
|
||||
CALL MKY_SCANADDR
|
||||
LD A, (HL)
|
||||
OR A ; IF NO SCANCODE - IGNORE IT
|
||||
RET Z
|
||||
|
||||
LD (MKY_SCANBUFF), A
|
||||
LD A, 1
|
||||
LD (MKY_SCANBUFFLEN), A
|
||||
@@ -887,27 +875,20 @@ MKY_RPTGEN:
|
||||
|
||||
LD A, (MKY_RPTACTIVE) ; NO KEY IS HELD
|
||||
OR A
|
||||
JR Z, MKY_RPTCLR
|
||||
RET Z
|
||||
|
||||
LD A, (MKY_RPTCNT)
|
||||
DEC A
|
||||
JR Z, MKY_RPTADD
|
||||
LD (MKY_RPTCNT), A
|
||||
RET
|
||||
OR A
|
||||
RET NZ
|
||||
|
||||
MKY_RPTADD:
|
||||
; GENERATE THE KEY DOWN SCAN CODE FOR THE REPEATING KEY
|
||||
LD A, KEY_REPEAT_PERIOD
|
||||
LD (MKY_RPTCNT), A
|
||||
LD A, (MKY_NRPTCOL)
|
||||
LD B, A
|
||||
LD A, (MKY_NRPTROW)
|
||||
EX AF, AF'
|
||||
JR MKY_KEYDOWN
|
||||
|
||||
MKY_RPTCLR:
|
||||
LD A, KEY_REPEAT_INIT
|
||||
LD (MKY_RPTCNT), A
|
||||
RET
|
||||
JR MKY_KEYDOWN_RPT
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
@@ -917,14 +898,16 @@ MKY_RPTCLR:
|
||||
; B = 1 TO 8 - COLUMN COUNT
|
||||
; A' IS ROW COUNT - 0 TO MATRIX_ROW_COUNT
|
||||
; OUTPUT:
|
||||
; HL = BYTE WITHIN MKY_OLDKEY RRAY
|
||||
; HL = BYTE WITHIN MKY_OLDKEY ARRAY
|
||||
; A = BIT MASK FOR COLUMN COUNT (EG: B = 3, A = 8)
|
||||
; PROTECTS:
|
||||
; A' IS UNCHANGED
|
||||
; B IS UNCHANGED
|
||||
|
||||
MKY_GETKEYIDX:
|
||||
LD HL, MKY_OLDKEY
|
||||
LD A, $80
|
||||
LD D, B ; SAVE B (COLUMN COUNT - 1 TO 8)
|
||||
LD C, B ; SAVE B (COLUMN COUNT - 1 TO 8)
|
||||
MKY_SETOLDBIT_LP:
|
||||
DEC B
|
||||
JR Z, SKIP
|
||||
@@ -932,39 +915,36 @@ MKY_SETOLDBIT_LP:
|
||||
JR MKY_SETOLDBIT_LP
|
||||
|
||||
SKIP:
|
||||
LD HL, MKY_OLDKEY
|
||||
EX AF, AF' ; RETRIEVE ROW COUNT
|
||||
LD C, A
|
||||
LD E, A
|
||||
EX AF, AF'
|
||||
LD B, 0
|
||||
ADD HL, BC
|
||||
LD B, D ; RETORE B (COLUMN COUNT)
|
||||
LD D, 0
|
||||
LD B, C ; RETORE B (COLUMN COUNT)
|
||||
ADD HL, DE
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; SET BIT WITHIN THE KEY MATRIX ARRAY
|
||||
; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY
|
||||
; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY
|
||||
; C BIT MASK TO BE OR'ED
|
||||
;
|
||||
MKY_SETOLDBIT:
|
||||
CALL MKY_GETKEYIDX
|
||||
LD C, (HL)
|
||||
OR C
|
||||
OR (HL)
|
||||
LD (HL), A
|
||||
RET
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
;
|
||||
; RESET BIT WITHIN THE KEY MATRIX ARRAY
|
||||
; HL -> ADDRESS WITHIN MKY_OLDKEY R MKY_NEWKEY ARRAY
|
||||
; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY
|
||||
; C CPL BIT MASK TO BE AND'ED
|
||||
;
|
||||
MKY_RESOLDBIT:
|
||||
CALL MKY_GETKEYIDX
|
||||
LD C, (HL)
|
||||
CPL
|
||||
AND C
|
||||
AND (HL)
|
||||
LD (HL), A
|
||||
RET
|
||||
;
|
||||
@@ -1014,19 +994,26 @@ MKY_READBYT:
|
||||
; DYNAMIC DATA STORAGE:
|
||||
;
|
||||
; STORAGE OF KEYBOARD MATRIX, USED FOR DETECTING KEY REPETITION
|
||||
MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF
|
||||
MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF
|
||||
;
|
||||
; CURRENT STATE OF THE KEYBOARD MATRIX
|
||||
MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF
|
||||
MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF
|
||||
;
|
||||
; COPY OF MKY_NEWKEY FOR USE IN GENERATING SCANCODE
|
||||
MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF
|
||||
;
|
||||
; SET TO NZ WHEN A SCAN IS COMPLETED
|
||||
; SET TO ZERO AFTER A SCAN CODE CONVERSION
|
||||
MKY_SCANNED: .DB 0
|
||||
;
|
||||
; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE
|
||||
; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD
|
||||
MKY_SCNCNT: .DB SCAN_INT_PERIOD
|
||||
MKY_SCNCNT: .DB SCAN_INT_PERIOD
|
||||
|
||||
; INITIALL SET TO FALSE, AND THUS DISABLING INTERRUPT HANDLER'S SCAN FUNCTION
|
||||
; AS SOON AT THE KEY REQUEST FUNCTIONS (STATUS, READ), THIS IS SET AND INTERRUPT HANDLER
|
||||
; IS PERMANETLY ON.
|
||||
MKY_SCANON: .DB 0
|
||||
; MKY_SCANON: .DB 0
|
||||
|
||||
;
|
||||
MKY_NRPTCOL: .DB 0
|
||||
@@ -1081,9 +1068,6 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES
|
||||
.DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED
|
||||
.DB $7D,$F4, $7E,$FD, $00,$00
|
||||
;
|
||||
; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES
|
||||
; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D
|
||||
; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D
|
||||
#ENDIF
|
||||
#IF (MKYKBLOUT == KBD_DE)
|
||||
;__________________________________________________________________________________________________
|
||||
@@ -1126,11 +1110,6 @@ MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES
|
||||
.DB $74,$04, $75,$05, $7A,$1A, $7C,$ED ; Cursor right , Cursor up , Page down
|
||||
.DB $7D,$17, $7E,$FD, $00,$00 ; Page up , n.a. , END MKY_MAPEXT (Pairs end)
|
||||
;
|
||||
; MKY_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES
|
||||
|
||||
; .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D
|
||||
; .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;__________________________________________________________________________________________________
|
||||
|
||||
Reference in New Issue
Block a user