Files
Dennis Gunia bc1b9a399d Updated
2022-12-16 20:45:34 +01:00

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