; Љлавиатура и мышь PS/2 Test program for Z180 CPU
; (C) Eugene Po - efu@mail.ru (http://orion.efu.name)

PS2DATA	.EQU	160H		; порт PS/2 контроллера
PS2CNTR	.EQU	PS2DATA+4

;==============================================================================
.org (0000h)
  di
  ld sp,0FFFFh

  ld a,10000000b	; установить рабочую частоту 18,432 мГц
  out0 (1fh),a		; CPU Control Register 

  ld a,01110100b	; RTS=1,8,N,1
  out0 (00h),a		; Init CNTLA0 (COM1)

  ld a,10111000b	; PS=30, DR=64, SS=1, 9600BPS длЯ PHI=18,432 мѓц
  out0 (02h),a		; Init CNTLB0 (COM1)
;==============================================================================
; ‚ывод строки приветствиЯ в порт
;==============================================================================
  ld hl, WelcomeString	; ‚ывод строки приветствиЯ
out_sym:  
  in0 a,(04h)		; читать статус порта COM1 (STAT0)
  rra
  rra			; проверЯем бит 1
  jp nc,out_sym		; если буфер не пустой - байт не передан (флаг C=0), опЯть проверить
  ld a,(hl)
  out0 (06h),a		; отправить в COM1
  inc hl
  cp 0ah		; пока не встретитсЯ символ "0AH"
  jp nz,out_sym

  in0 a,(36h)		; читать Refresh Control Register (RCR)
  res 7,a		; сброс бита 7
  out0 (36h),a		; откл. регенерацию памЯти - откл. пищалку
;==============================================================================
; инициализациЯ PS/2 контроллера
;==============================================================================
ReadStatusKeyb:
  xor a			; установить рабочую частоту 18,432/2 мѓц
  out0 (1fh),a		; CPU Control Register 
  ld bc,PS2CNTR		; номер порта в bc
  in a,(c)		; читаем байт состоЯниЯ
;  in a,160h
  rra
  rra			; проверЯем готовность приЮма
  jp c,ReadStatusKeyb	; если не готов (бит 1 = 1)- читаем ещЮ
  ld bc,PS2CNTR		; номер порта в bc
  ld a,0FFh
  out (c),a		; сброс контроллера
  ld a,0AAH
  out (c),a		; самотестирование контроллера
  ld bc,PS2DATA		; номер порта в bc
  in a,(c)		; получить ответ самотестированиЯ
  cp 0AAH
  ld hl, KeybOkString
  jp z,out_sym1		; Test OK - внутренний тест прошел
  ld hl, KeybErrorString
  cp 0FDH
  jp z,out_sym1		; Diag. Failure - ошибка внутреннего теста.
  ld hl, KeybNPString	; нет отклика контроллера PS/2
  
;==============================================================================
out_sym1:  		; вывод в терминал результат теста контроллера

  ld a,10000000b	; установить рабочую частоту 18,432 мѓц
  out0 (1fh),a		; CPU Control Register 
  
  in0 a,(04h)		; читать статус порта COM1 (STAT0)
  rra
  rra			; проверЯем бит 1
  jp nc,out_sym1	; если буфер не пустой - байт не передан (флаг C=0), опЯть проверить
  ld a,(hl)
  out0 (06h),a		; отправить в COM1
  inc hl
  cp 0ah		; пока не встретитсЯ символ "0AH"
  jp nz,out_sym1
  set 7,a		; установка бита 7
  out0 (36h),a		; вкл. регенерацию памЯти , т.е. пищалку
  halt			; ‘’ЋЏ!!!
  
;==============================================================================
Init_Keyb:
  ld bc,PS2CNTR		; номер порта в bc
  ld a,60h
  out (c),a		; управлЯющий байт
  ld bc,PS2DATA		; номер порта в bc
  ld a,00100000b	; разрешить только клавиатуру без прерываниЯ
  out (c),a		; инициализациЯ
;==============================================================================
ReadDataKeyb:
  ld bc,PS2CNTR		; номер порта команд  в bc
  in a,(c)		; читаем байт состоЯниЯ
  rra			; проверЯем готовность приЮма
  jp nc,ReadDataKeyb	; если не готов (бит 0 = 0)- читаем ещЮ
  ld bc,PS2DATA		; номер порта данных в bc
  in h,(c)		; получить в h
;==============================================================================
; отправить содержимое h в порт
;==============================================================================
out_symb:
  in0 a,(04h)		; читать статус порта COM1 (STAT0)
  rra
  rra			; проверЯем бит 1
  jp nc,out_symb	; если буфер не пустой - (байт не передан, флаг C=0), опЯть проверить
  out0 (06h),h		; Ћтправить h в COM1
  jp ReadDataKeyb	; возврат к чтению клавиатуры
;==============================================================================
TestKeybOK:
  ld h,'O'
  jp Init_Keyb

TestKeybERR:
  ld h,'E'
  jp Init_Keyb

WelcomeString:
  .db "Orion-XT starting.", 0dh, 0ah
KeybOkString:
  .db "Keyboard Init.", 0dh, 0ah
KeybErrorString:
  .db "Keyboard Error!", 0dh, 0ah
KeybNPString:
  .db "Keyboard not present!", 0dh, 0ah
  
  .end


