96 lines
2.9 KiB
ArmAsm
96 lines
2.9 KiB
ArmAsm
;----------------------------------------------------------------
|
|
;Keyboard interface driver for Z8C
|
|
;Controller used: vt82c42
|
|
;Datasheet: http://www.s100computers.com/My%20System%20Pages/MSDOS%20Board/vt82c42%20PC%20Keyboard%20conrtroller.pdf
|
|
;by Dennis Gunia (04/2022)
|
|
;----------------------------------------------------------------
|
|
|
|
;IO Ports
|
|
CS_VT82C42_DATA .EQU F0h
|
|
CS_VT82C42_CTRL .EQU F1h
|
|
|
|
keyboard_init_io: ;Subroutine for initializing keyboard controller
|
|
LD A, A7h ;Disable Mouse
|
|
OUT (CS_VT82C42_CTRL), A
|
|
LD A, ADh ;Disable Keyboard
|
|
OUT (CS_VT82C42_CTRL), A
|
|
_keyboard_init_flush_buffer:
|
|
IN A,(CS_VT82C42_DATA) ;Read buffer
|
|
IN A,(CS_VT82C42_CTRL) ;Read status byte
|
|
BIT 0,A ;Test if buffer is empty
|
|
JR Z, _keyboard_init_flush_buffer
|
|
;buffer is now flushed. Now set the Controller Configuration Byte
|
|
IN A,(CS_VT82C42_CTRL) ;Disable bits 0,1,6 (disablee IRQ and Translation)
|
|
AND 10111100
|
|
OUT (CS_VT82C42_CTRL),A
|
|
;Perform Controller Self Test
|
|
LD A, AAh
|
|
OUT (CS_VT82C42_CTRL), A
|
|
NOP
|
|
IN A,(CS_VT82C42_CTRL) ;Check results
|
|
CP 55h
|
|
JR NZ, keyboard_init_failed
|
|
;Perform Interface Tests
|
|
LD A, ABh
|
|
OUT (CS_VT82C42_CTRL), A
|
|
NOP
|
|
IN A,(CS_VT82C42_CTRL) ;Check results
|
|
CP 00h
|
|
JR NZ, _keyboard_init_failed
|
|
;Enable Devices
|
|
LD A,AEh
|
|
OUT (CS_VT82C42_CTRL), A
|
|
;Reset Devices
|
|
LD A,FFh
|
|
OUT (CS_VT82C42_DATA), A ;Send reset to keboard (0xFF command)
|
|
NOP
|
|
IN A,(CS_VT82C42_CTRL) ;Read status byte
|
|
BIT 0,A ;Test if buffer is empty -> no keyboard found
|
|
JP NZ, _keyboard_init_dev_missing
|
|
CP A, 0xFC
|
|
JR Z, _keyboard_init_okay ; 0xFC -> Success. Init done!
|
|
;Else device error
|
|
LD HL, [STR_keyboard_init_failed]
|
|
CALL print_str
|
|
HALT
|
|
_keyboard_init_failed:
|
|
LD HL, [STR_keyboard_init_err]
|
|
CALL print_str
|
|
HALT
|
|
_keyboard_init_dev_missing:
|
|
LD HL, [STR_keyboard_init_missing]
|
|
CALL print_str
|
|
HALT
|
|
_keyboard_init_okay:
|
|
LD HL, [STR_keyboard_init_okay]
|
|
CALL print_str
|
|
RET
|
|
|
|
;Keyboard IO functions
|
|
keyboard_read:
|
|
IN A,(CS_VT82C42_CTRL) ;Read status byte
|
|
BIT 0,A ;Test if buffer is empty
|
|
RET NZ ;Return if empty
|
|
IN A,(CS_VT82C42_DATA)
|
|
RET ;Return with data in A
|
|
|
|
keyboard_write:
|
|
PUSH AF
|
|
_keyboard_write_wait:
|
|
IN A,(CS_VT82C42_CTRL) ;Read status byte
|
|
BIT 1,A ;Test if buffer is full
|
|
JR Z, _keyboard_write_wait ;Wait if input buffer is full
|
|
POP AF
|
|
OUT (CS_VT82C42_DATA), A
|
|
RET
|
|
|
|
|
|
;Status message strings
|
|
STR_keyboard_init_okay:
|
|
.BYTE "PS/2 Keyboard initialized.",0
|
|
STR_keyboard_init_err:
|
|
.BYTE "PS/2 Controller error! System HALT!",0
|
|
STR_keyboard_init_failed:
|
|
.BYTE "PS/2 Keyboard error! System HALT!",0
|
|
STR_keyboard_init_missing:
|
|
.BYTE "PS/2 no keyboard found!",0 |