;*********************************************************
; NAMN		:	SIOTEST
; PROGRAMMERARE	:	L-O/IND
; DATUM		:	86-10-14
; MODIFIERAD	:	
;*********************************************************
;
; SYFTE		: Testa Tx - Rx p} SIOns B-sida samt RTS,
;		  DTR, CTS och DCD p} b}de A- och B-sidan.
;
; ANROPAS FR]N	: tknkoll
;
; SUBRUTINER
;    INTERNA	: SIGNALTEST	Kontrollerar CTS och DCD
;				vid olika upps{ttningar av
;				RTS och DTR.
;		  
;    EXTERNA	: PUTNUM	Konverterar testresultatet
;				till HEX-tecken och
;				anropar PUTCHR.
;		  PUTCHR	L{gger tkn i tx-buffert
;		  INIRAM	Initierar RAM.
;
;*********************************************************

	FORMLN	42
	NAME	SIOTEST

	INCLUDE	TMC.H

COMND	EQU	'O'		; Kommando = O

; LABLAR:

	INTERN	SIOTEST

	EXTERN	PUTNUM, PUTCHR

	PAGE
;*********************************************************
;
; Nollst{ll felmarkerings-variabeln
; Kontrollera Rx - Tx p} B-sidan
; Kontrollera RTS, DTR, CTS och DCD p} b}da sidor
; Skicka svar
; 
;*********************************************************

	RSECT	RAM

FELTYP	DEFS	1		; Felmarkeringsvariabel
CTSFEL	DEFS	1		; CTS-status felaktigt
DCDFEL	DEFS	1		; DCD-status felaktigt
VARVCNT	DEFS	1		; Varvr{knare f|r statustest

	RSECT	PROM

SIOTEST:
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL

	SUB	A		;
	LD	(FELTYP),A	; Nollst{ll felmarkerings-variabeln

	PAGE
;*********************************************************
;
; Kontrollera Rx - Tx p} B-sidan
; ------------------------------
;
; Se till att det inte finns ngt tecken att h{mta
; Byte att skicka = 2A
; REPEAT "Rx - Tx test"
;     Skicka byten
;     V{nta 2 ms
;     CASE "Tecken"
;         WHEN tecken mottaget
;             S{tt bit 1 i felmarkeraren WHEN tecken <> s{nd byte
;         OTHERWISE
;             S{tt bit 0 i felmarkeraren
;     END "Tecken"
;     Byte att skicka = komplementet till byten (=D5)
; END "Rx - Tx test" WHEN byten = 2A
; 
;*********************************************************

	IN	A,(SIOBD)	; Reset bit 0 i Read-Register 0
				; (Rx char available)

	LD	C,00101010B	; Byten som skall s{ndas, odd parity
	LD	A,C
TX_RX:
	OUT	(SIOBD),A	; Skicka byten

				; Tecknet skall komma om ca 1 ms vid 9600 baud,
	LD	B,2		; v{nta d{rf|r 2 millisek
OLOOP:	LD	A,156		; inre loopen ca 1 millisek
ILOOP:	DEC	A		; 4 Tstates = 1,6 uS
	JR	NZ,ILOOP	; 12 Tstates = 4,8 uS
	DEC	B
	JR	NZ,OLOOP

	SUB	A		; Write-Register 0
	OUT	(SIOBC),A	;
	LD	A,00010000B	; Reset external status
	OUT	(SIOBC),A	;
	IN	A,(SIOBC)	; H{mta status
	BIT	0,A		; Har det kommit n}got?
	JP	Z,NO_CHAR	; Nej

	IN	A,(SIOBD)	; Ja, h{mta byten
	CP	C		; Samma som s{ndes?
	JP	Z,NEXT		; Ja

	LD	HL,FELTYP	; Nej
	SET	1,(HL)		; Markera att fel tecken kom tillbaka
	JP	NEXT

NO_CHAR:
	LD	HL,FELTYP	;
	SET	0,(HL)		; Markera att inget tecken kom tillbaka
NEXT:
	LD	A,C		; Hamta senast sanda tecken
	CPL			; Invertera byten
	LD	C,A		;
	CP	00101010B	; Tv} bytes s{nda?
	JP	NZ,TX_RX	; Nej

	PAGE
;*********************************************************
;
; Kontrollera RTS, DTR, CTS och DCD p} b}da sidor
; -----------------------------------------------
;
; Kontrollera RTS, DTR, CTS och DCD p} A-sidan
; S{tt bit 2 i felmarkeraren WHEN CTSfel
; S{tt bit 3 i felmarkeraren WHEN DCDfel
; Kontrollera RTS, DTR, CTS och DCD p} B-sidan
; S{tt bit 4 i felmarkeraren WHEN CTSfel
; S{tt bit 5 i felmarkeraren WHEN DCDfel
; 
;*********************************************************

STATUSTEST:
	LD	C,SIOAC		; Testa f|rst A-kanalen
	CALL	SIGNALTEST

	LD	HL,FELTYP	; Felmarkeringsvariabeln
A_CTS:
	LD	A,(CTSFEL)	; CTS fel?
	CP	TRUE
	JP	NZ,A_DCD	; Nej
	SET	2,(HL)		; Ja, markera felet
A_DCD:
	LD	A,(DCDFEL)	; DCD fel?
	CP	TRUE
	JP	NZ,B_TEST	; Nej
	SET	3,(HL)		; Ja, markera felet

B_TEST:
	LD	C,SIOBC		; Testa sedan B-kanalen
	CALL	SIGNALTEST

	LD	HL,FELTYP	; Felmarkeringsvariabeln
B_CTS:
	LD	A,(CTSFEL)	; CTS fel?
	CP	TRUE
	JP	NZ,B_DCD	; Nej
	SET	4,(HL)		; Ja, markera felet
B_DCD:
	LD	A,(DCDFEL)	; DCD fel?
	CP	TRUE
	JP	NZ,SNDSTX	; Nej
	SET	5,(HL)		; Ja, markera felet

	PAGE
;*********************************************************
;
;	Skicka svar
;	-----------
;	
; "PUTCHAR" 'STX'
; "PUTNUM" testresultat
; "PUTCHAR" kommando
;
;*********************************************************

SNDSTX:
	LD	A,STX		; 
	CALL	PUTCHR		; Skicka STX
SNDRPM:
	LD	A,(FELTYP)	; 
	CALL	PUTNUM		; Skicka testresultat
SNDCMD:
	LD	A,COMND		; 
	CALL	PUTCHR		; Skicka kommando

	POP	HL
	POP	DE
	POP	BC
	POP	AF

	RET

	PAGE
;*********************************************************
;
; Kontrollera RTS, DTR, CTS och DCD
; ---------------------------------
;
; REPEAT "Signaltest" fyra g}nger
;     Nollst{ll felvariablerna
;     S{tt upp RTS och DTR
;     S{tt CTSfel till true WHEN CTS-status fel
;     S{tt DCDfel till true WHEN DCD-status fel
; END "Signaltest"
; 
;*********************************************************

SIGNALTEST:
	LD	A,FALSE		; 
	LD	(CTSFEL),A	; Nollst{ll felvariablerna
	LD	(DCDFEL),A	;

	LD	DE,SETUPTAB
	LD	HL,CHECKTAB
	SUB	A		; Noll varv
SIGNALLOOP:
	LD	(VARVCNT),A	; Justera varvr{knare
	LD	A,5		; Write-Register 5
	OUT	(C),A		;
	LD	A,(DE)		; H{mta bitm|nstret i setup-tabellen
	OUT	(C),A		; S{tt upp CTS och DCD

	SUB	A		; Write-Register 0
	OUT	(C),A		;
	LD	A,00010000B	; Reset external status
	OUT	(C),A		;
	IN	B,(C)		; H{mta status (Read-Register 0)
	LD	A,B		; 
	AND	00100000B	; Titta p} CTS-status
	CP	(HL)		; Som f|rv{ntat?
	JP	Z,DCD_KOLL	; Ja
	LD	A,TRUE		; Nej, markera felet
	LD	(CTSFEL),A	;
DCD_KOLL:
	INC	HL		; N{sta tabell-v{rde (DCD)
	LD	A,B		; 
	AND	00001000B	; Titta p} DCD-status
	CP	(HL)		; Som f|rv{ntat?
	JP	Z,LOOPENDQ	; Ja
	LD	A,TRUE		; Nej, markera felet
	LD	(DCDFEL),A	;
LOOPENDQ:
	INC	DE
	INC	HL
	LD	A,(VARVCNT)	; H{mta varvr{knare
	INC	A		; 
	CP	4		; Alla varianter testade?
	JP	NZ,SIGNALLOOP	; Nej

	RET			; Ja

;*********************************************************

SETUPTAB:
				; DTR RTS
	DEFB	10101010B	;  1   1
	DEFB	10101000B	;  1   0
	DEFB	00101010B	;  0   1
	DEFB	00101000B	;  0   0

CHECKTAB:
				; CTS DCD
	DEFB	00100000B	;  1
	DEFB	00001000B	;      1

	DEFB	00000000B	;  0
	DEFB	00001000B	;      1

	DEFB	00100000B	;  1
	DEFB	00001000B	;      1

	DEFB	00000000B	;  0
	DEFB	00000000B	;      0

	END
