Updated
This commit is contained in:
96
OperatingSystem/monitor_v2/include/vt82c42.s
Normal file
96
OperatingSystem/monitor_v2/include/vt82c42.s
Normal file
@@ -0,0 +1,96 @@
|
||||
;----------------------------------------------------------------
|
||||
;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
|
||||
Reference in New Issue
Block a user