;    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


