mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
377 lines
10 KiB
377 lines
10 KiB
;
|
|
; Test program for Z80 KBDMSE on Retrobrewcomputer.org (Load with CPM).
|
|
;
|
|
; V0.1 ;Original version 2/23/2014 by John Monahan
|
|
; V0.2 ;Update for Z80 KBDMSE with VT82C42 PS/2 Keyboard Controller by Andrew Lynch
|
|
;
|
|
; Based on works by John Monahan S100Computers.com
|
|
; for S100 MSDOS Support Board with HT6542B Keyboard Controller
|
|
; Thanks to John for generously posting this program for others to use and adapt
|
|
;
|
|
; This is a simple test program to work with the Z80 KBDMSE board. It is written so
|
|
; the only other hardware use is the CP/M Console Port -- typically serial port interface.
|
|
; Note the data is displayed in crude (bulk) form. A proper scancode to ASCII translation
|
|
; routine must be written for practical use. See the IBM PC BIOS or SKEY.Z80 docs
|
|
|
|
|
|
|
|
; PORT ASSIGNMENTS
|
|
|
|
KEY_DATA .EQU 0E2H ;Port used to access keyboard & Mouse (also sometimes Controller itself)
|
|
KEY_CTRL .EQU 0E3H ;Port for VT82C42 PS/2 Keyboard & Mouse Controller
|
|
|
|
ESC .EQU 1BH
|
|
CR .EQU 0DH
|
|
LF .EQU 0AH
|
|
TAB .EQU 09H
|
|
BELL .EQU 07H
|
|
|
|
.ORG 0100H
|
|
START:
|
|
LD SP,STACK
|
|
|
|
LD HL,SIGNON ; Signon
|
|
CALL PRINT_STRING
|
|
|
|
LD C,0AAH ;Test PS/2 Controller
|
|
CALL CMD_OUT
|
|
CHK1:
|
|
CALL KEY_IN_STATUS ;wait for feedback
|
|
JR Z,CHK1
|
|
IN A,(KEY_DATA)
|
|
CP 055H ;If not 55H then error
|
|
JR NZ,INIT_ERR
|
|
LD C,060H ; Set keyboard controller cmd byte
|
|
CALL CMD_OUT
|
|
LD C,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS
|
|
CALL KEY_OUT
|
|
LD C,0AEH ;Enable 1st PS/2 port
|
|
CALL CMD_OUT ;Send it
|
|
JR DONE_INIT
|
|
|
|
INIT_ERR:
|
|
LD HL,INIT_ERR_STR ;Say error
|
|
CALL PRINT_STRING
|
|
HALT ;Just Halt!
|
|
|
|
DONE_INIT:
|
|
LD HL,INIT_OK ;Say all OK
|
|
CALL PRINT_STRING
|
|
|
|
LOOP:
|
|
CALL KEY_IN_STATUS ;See if keyboard key available
|
|
JR Z,LOOP
|
|
IN A,(KEY_DATA)
|
|
LD C,A ;Store in [C]
|
|
LD HL,SCAN_MSG
|
|
CALL PRINT_STRING ;No registers changed
|
|
|
|
CALL A_HEXOUT ;Display Hex value of typed character + two spaces
|
|
|
|
;CP 0F0H ;Is it an UP key
|
|
AND 080H ;Is it an UP key
|
|
JR Z,DOWNKY ;Must be a down key stroke
|
|
LD HL,UPKEY_MSG ;Say Up Key
|
|
CALL PRINT_STRING
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
DOWNKY:
|
|
CP 58H ;Is it CAPS Lock key
|
|
; CP 3AH ;Is it CAPS Lock key
|
|
JR NZ,NOT_CAPSKEY
|
|
LD HL,CAPS_MSG ;Say Caps lock key
|
|
CALL PRINT_STRING
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
NOT_CAPSKEY:
|
|
CP 12H ;Is it a SHIFT key
|
|
; CP 2AH ;Is it a SHIFT key
|
|
JR Z,SHIFTKEY
|
|
CP 59H ;Is it the other SHIFT key
|
|
; CP 36H ;Is it the other SHIFT key
|
|
JR NZ,NOT_SHIFTKEY
|
|
|
|
SHIFTKEY:
|
|
LD HL,SHIFT_MSG ;Say Shift key
|
|
CALL PRINT_STRING
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
NOT_SHIFTKEY:
|
|
CP 14H ;Is it the CTRL key
|
|
; CP 1DH ;Is it the CTRL key
|
|
JR NZ,NOT_CTRLKEY
|
|
LD HL,CTRL_MSG ;Say CTRL key
|
|
CALL PRINT_STRING
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
NOT_CTRLKEY:
|
|
CP 77H ;Is it the NUM LOCK key
|
|
; CP 45H ;Is it the NUM LOCK key
|
|
JR NZ,NOT_NUMKEY
|
|
LD HL,NUM_MSG ;Say Number key
|
|
CALL PRINT_STRING
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
NOT_NUMKEY:
|
|
PUSH BC ;Save Character
|
|
LD HL,IBM1_MSG ;Say Table 1 lookup
|
|
CALL PRINT_STRING
|
|
LD HL,IBM1TBL ;Point to lookup table for upper case
|
|
CALL SHOW_CHAR
|
|
|
|
POP BC ;Get back character
|
|
LD HL,IBM2_MSG ;Say Table 2 lookup
|
|
CALL PRINT_STRING
|
|
LD HL,IBM2TBL ;Point to lookup table for upper case
|
|
CALL SHOW_CHAR
|
|
|
|
CALL ZCRLF
|
|
JR LOOP
|
|
|
|
SHOW_CHAR:
|
|
LD D,0
|
|
LD E,C
|
|
ADD HL,DE ;Add in offset
|
|
LD C,(HL)
|
|
LD A,C
|
|
CP ESC
|
|
RET Z ;ESC messes up the screen display
|
|
CP CR
|
|
RET Z ;CR messes up the screen display
|
|
CP LF
|
|
RET Z ;LF messes up the screen display
|
|
CP TAB
|
|
RET Z ;TAB messes up the screen display
|
|
CALL ZCO ;Display on Screen
|
|
RET
|
|
|
|
KEY_IN_STATUS: ;Ret NZ if character is available
|
|
IN A,(KEY_CTRL)
|
|
AND 1
|
|
RET ;Ret NZ if character available
|
|
|
|
CMD_OUT: ;Send a byte (in [C]) to Control port
|
|
IN A,(KEY_CTRL)
|
|
AND 2
|
|
JR NZ,CMD_OUT ;Chip is not ready yet to receive character
|
|
LD A,C
|
|
OUT (KEY_CTRL),A
|
|
RET
|
|
|
|
KEY_OUT: ;Send a byte (in [C]) to Data port
|
|
IN A,(KEY_CTRL)
|
|
AND 2
|
|
JR NZ,KEY_OUT ;Chip is not ready yet to receive character
|
|
LD A,C
|
|
OUT (KEY_DATA),A
|
|
RET
|
|
|
|
|
|
; A_HEXOUT ;output the 2 hex digits in [A]
|
|
A_HEXOUT: ;No registers altered
|
|
push AF
|
|
push BC
|
|
push AF
|
|
srl a
|
|
srl a
|
|
srl a
|
|
srl a
|
|
call hexdigout
|
|
pop AF
|
|
call hexdigout ;get upper nibble
|
|
LD C,' '
|
|
call ZCO ;Space for easy reading
|
|
call ZCO
|
|
pop BC
|
|
pop AF
|
|
ret
|
|
|
|
hexdigout:
|
|
and 0fh ;convert nibble to ascii
|
|
add a,90h
|
|
daa
|
|
adc a,40h
|
|
daa
|
|
LD c,a
|
|
call ZCO
|
|
ret
|
|
|
|
; Main console I/O routines
|
|
;
|
|
|
|
ZCO:
|
|
PUSH HL
|
|
LD E,C
|
|
LD C,02H ;BDOS Function 2 Write Console Byte
|
|
CALL 0005H ;Call BDOS
|
|
POP HL
|
|
RET
|
|
|
|
ZCI:
|
|
LD C,0BH ;BDOS Function 11 Read Console Status
|
|
CALL 0005H ;Call BDOS
|
|
JP Z,ZCI
|
|
LD C,01H ;BDOS Function 1 Read Console Byte
|
|
CALL 0005H ;Call BDOS
|
|
RET
|
|
;
|
|
; Send CR/LF to Console
|
|
;
|
|
ZCRLF:
|
|
PUSH AF
|
|
PUSH BC
|
|
LD C,CR
|
|
CALL ZCO
|
|
LD C,LF
|
|
CALL ZCO
|
|
POP BC
|
|
POP AF
|
|
RET
|
|
|
|
|
|
PRINT_STRING:
|
|
PUSH AF
|
|
push BC
|
|
print1:
|
|
LD a,(HL) ;Point to start of string
|
|
inc HL ;By using the CS over-ride we will always have
|
|
CP '$' ;a valid pointer to messages at the end of this monitor
|
|
JP z,print2
|
|
CP 0 ;Also terminate with 0's
|
|
JP Z,print2
|
|
LD C,A
|
|
call ZCO
|
|
jp print1
|
|
print2:
|
|
pop BC
|
|
POP AF
|
|
ret
|
|
|
|
;---------------------------------------------------------------------------------------------------
|
|
; Black: ESC,[30m
|
|
; Red: ESC,[31m
|
|
; Green: ESC,[32m
|
|
; Yellow: ESC,[33m
|
|
; Blue: ESC,[34m
|
|
; Magenta: ESC,[35m
|
|
; Cyan: ESC,[36m
|
|
; White: ESC,[37m
|
|
; Reset: ESC,[0m
|
|
|
|
SIGNON:
|
|
.DB CR,LF,LF
|
|
.DB ESC,"[33m","Test VT82C42 PC Keyboard & Mouse controller chip on Z80 KBDMSE Board." ; Yellow
|
|
.DB CR,LF,"$"
|
|
INIT_ERR_STR:
|
|
.DB CR,LF,BELL
|
|
.DB ESC,"[31m","Error: The 0xAA Test of Controller did nor return 0x55. Program Halted." ; Red
|
|
.DB CR,LF,"$"
|
|
INIT_OK:
|
|
.DB CR,LF
|
|
.DB ESC,"[32m","The 0xAA Test of Controller returned 0x55. Now enter keyboard keys." ; Green
|
|
.DB CR,LF,LF,"$"
|
|
|
|
SCAN_MSG:
|
|
.DB ESC,"[34m","Scancode = $" ; Blue
|
|
UPKEY_MSG:
|
|
.DB "(Up Keystroke)$"
|
|
CAPS_MSG:
|
|
.DB "(Caps Lock)$"
|
|
SHIFT_MSG:
|
|
.DB "(Shift Key)$"
|
|
CTRL_MSG:
|
|
.DB "(CTRL Key)$"
|
|
NUM_MSG:
|
|
.DB "(NUM Key)$"
|
|
IBM1_MSG:
|
|
.DB ESC,"[36m","Table 1 lookup -> $" ; Cyan
|
|
IBM2_MSG:
|
|
.DB ESC,"[37m"," Table 2 lookup -> $" ; White
|
|
|
|
|
|
IBM1TBL: ;The "Normal" table
|
|
;00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f
|
|
; .DB 0,"*", 0,"*","*","*","*","*", 0,"*","*","*","*",09H,"`",00H
|
|
.DB 000,027,"1","2","3","4","5","6","7","8","9","0","-","=",008,009 ;00-0F
|
|
|
|
;10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f
|
|
; .DB 0, 0, 0, 0, 0,"q","1", 0, 0, 0,"z","s","a","w","2",0
|
|
.DB "q","w","e","r","t","y","u","i","o","p","[","]",013,000,"a","s" ;10-1F
|
|
|
|
;20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e, 2f
|
|
; .DB 0,"c","x","d","e","4","3", 0, 0," ","v","f","t","r","5",0
|
|
.DB "d","f","g","h","j","k","l",";",27H,60H,000,092,"z","x","c","v" ;20-2F
|
|
|
|
;30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3a, 3b, 3c, 3d, 3e, 3f
|
|
; .DB 0,"n","b","h","g","y","6", 0, 0, 0,"m","j","u","7","8",0
|
|
.DB "b","n","m",",",".","/",000,000,000," ",000,000,000,000,000,000 ;30-3F
|
|
|
|
;40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e, 4f
|
|
; .DB 0,",","k","i","o","0","9", 0, 0,".","/","l",";","p","-",0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F
|
|
|
|
;50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 5a, 5b, 5c, 5d, 5e, 5f
|
|
; .DB 0, 0,27H, 0,"[","=", 0, 0, 0, 0,0DH,"]", 0,5CH, 0,0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F
|
|
|
|
;60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 6a, 6b, 6c, 6d, 6e, 6f
|
|
; .DB 0, 0, 0, 0, 0, 0,08H, 0, 0,11H, 0,13H,10H, 0, 0, 0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F
|
|
|
|
;70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 7a, 7b, 7c, 7d, 7e, 7f
|
|
; .DB 0BH,7FH,03H,15H,04H,05H,1BH,00H,"*",02H,18H,16H,0CH,17H,"*",0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F
|
|
|
|
;80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 8a, 8b, 8c, 8d, 8e, 8f
|
|
; .DB 0, 0, 0,"*", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;80-8F
|
|
|
|
|
|
IBM2TBL: ;If the SHIFT key or CAPS lock key is on
|
|
;00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f
|
|
; .DB 0, "*", 0,"*","*","*","*","*", 0,"*","*","*","*",09H,"~",00H
|
|
.DB 000,027,"!","@","#","$","%","^","&","*","(",")","_","+",008,009 ;00-0F
|
|
|
|
;10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f
|
|
; .DB 0, 0, 0, 0, 0,"Q","!", 0, 0, 0,"Z","S","A","W","@",0
|
|
.DB "Q","W","E","R","T","Y","U","I","O","P","{","}",013,000,"A","S" ;10-1F
|
|
|
|
;20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e, 2f
|
|
; .DB 0,"C","X","D","E","$","#", 0, 0," ","V","F","T","R","%",0
|
|
.DB "D","F","G","H","J","K","L",":",034,"~",000,"|","Z","X","C","V" ;20-2F
|
|
|
|
;30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3a, 3b, 3c, 3d, 3e, 3f
|
|
; .DB 0,"N","B","H","G","Y","^", 0, 0, 0,"M","J","U","&","*",0
|
|
.DB "B","N","M","<",">","?",000,000,000," ",000,000,000,000,000,000 ;30-3F
|
|
|
|
;40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e, 4f
|
|
; .DB 0,"<","K","I","O",29H,"(", 0, 0,">","?","L",":","P", "_",0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F
|
|
|
|
;50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 5a, 5b, 5c, 5d, 5e, 5f
|
|
; .DB 0, 0,22H, 0,"{","+", 0, 0, 0, 0,0DH,"}", 0,"|", 0,0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F
|
|
|
|
;60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 6a, 6b, 6c, 6d, 6e, 6f
|
|
; .DB 0, 0, 0, 0, 0, 0,08H, 0, 0,11H, 0,13H,10H, 0, 0, 0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F
|
|
|
|
;70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 7a, 7b, 7c, 7d, 7e, 7f
|
|
; .DB 0BH,7FH,03H,15H,04H,05H,1BH,00H,"*",02H,18H,16H,0CH,17H,"*",0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F
|
|
|
|
;80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 8a, 8b, 8c, 8d, 8e, 8f
|
|
; .DB 0, 0, 0,"*", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
.DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;80-8F
|
|
|
|
|
|
.FILL 040H,000H
|
|
STACK: .DB 0H
|
|
.FILL 19,000H
|
|
|
|
.END
|
|
|