DataMuseum.dk

Presents historical artifacts from the history of:

Zilog MCZ Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦f44eccdc8⟧ TextFile

    Length: 4772 (0x12a4)
    Types: TextFile
    Names: »SIOTST.S«

Derivation

└─⟦f2a3f19b6⟧ Bits:30005203 8" Zilog MCZ/1 Floppy CR80FD_0030 ( BB LTU TEST BACK UP! BB VD1 821220 )
    └─ ⟦this⟧ »SIOTST.S« 

TextFile

;*****************************************************************************
;* PROCEDURE NAME	: LOOPTST
;*
;* DESCRIPTION		: THE ROUTINE LOOPS THE CONTENT OF A MESSAGE BUFFER ON
;*			  THE Z80 SIO, AND TESTS THE SIO FOR ERRORS
;*
;* ENTRY		: DE = ADDRESS OF MESSAGE BUFFER
;*			  IY = ADDRESS OF CHANNEL TABLE
;*
;* EXIT			: DE = ADDRESS OF MESSAGE BUFFER
;*			  ERROR CODE IN BUFFER :
;*				4 : TRANSMIT ERROR
;*				5 : TX CLOCK ERROR
;*				6 : RECEIVE ERROR
;*				7 : TRANSMISSION ERROR
;*
;* DESTROY		: SIO WRITE REGISTERS
;*			  A,F,B,C,H,L
;*****************************************************************************
*INCLUDE CONST.S
 
	GLOBAL	LOOPTST
 
LOOPTST	IN	A,(APIO1+1)
	SET	4,A
	OUT	(APIO1+1),A	;TURN ON TEST LED
 
	LD	(IY+12H),E	;SAVE BUFFER ADDRESS
	LD	(IY+13H),D
 
	CALL	CHINIT		;INITIALIZE CHAR.POINTER AND BYTECOUNTERS
	JP	Z,LOOPOUT	;IF DATA BYTECOUNT = 0 THEN EXIT
 
	LD	C,(IY+15H)
	LD	A,18H		;
	OUT	(C),A		;RESET CHANNEL
	LD	L,4		;
	OUT	(C),L		;
	LD	A,01000111B	;*16 CLOCK
				;1 STOP BIT
	OUT	(C),A		;EVEN PARITY
	LD	L,3		;
	OUT	(C),L		;
	LD	A,11000001B	;8 RX BIT/CHAR
	OUT	(C),A		;RX ENABLED
	LD	L,5		;
	OUT	(C),L		;
	LD	A,01100000B	;8 TX BIT/CHAR
	OUT	(C),A		;TX DISABLED
 
	IN	L,(C)
	BIT	2,L
	LD	B,4
	CALL	Z,SIOERR	;IF TRANSMIT BUFFER NOT EMPTY THEN ERROR
	LD	L,(IY+0EH)
	LD	H,(IY+0FH)	;GET POINTER TO FIRST CHARACTER
	LD	E,(HL)		;GET FIRST CHARACTER
	DEC	C
	DEC	C
	OUT	(C),E		;LOAD FIRST CHARACER
	INC	C
	INC	C
	IN	L,(C)
	BIT	2,L
	CALL	NZ,SIOERR	;IF TRANSMIT BUFFER EMPTY THEN ERROR
	LD	L,5
	OUT	(C),L
	SET	3,A
	OUT	(C),A		;ENABLE TX
	DEC	C
	DEC	C
 
LOOP2	INC	C		;DO
	INC	C		;
	LD	B,0		;
WAIT1	DJNZ	WAIT1		;
	LD	B,50		;  DELAY 1 MILLI SEC.
WAIT2	DJNZ	WAIT2		;
	LD	L,1		;
	OUT	(C),L		;
	IN	L,(C)		;
	BIT	0,L		;
	LD	B,5		;
	CALL	Z,SIOERR	;  IF CHARACTER NOT SENT THEN ERROR
	IN	L,(C)		;
	BIT	2,L		;
	CALL	Z,SIOERR	;  IF NO TX-CLOCK THEN ERROR
	BIT	0,L		;
	LD	B,6		;
	CALL	Z,SIOERR	;  IF CHARACTER NOT RECEIVED THEN ERROR
	DEC	C		;
	DEC	C		;
	IN	A,(C)		;  GET RECEIVED CHARACTER
	CP	E		;
	LD	B,7		;
	CALL	NZ,SIOERR	;  IF RX CH«soh»AR. <> TX CHAR THEN ERROR
				;
	CALL	NEXTCHA		;  SAVE CHARACTER AND GET NEXT CHARACTER
	JR	Z,TR1NEXT	;  IF NO MORE CHARACTERS THEN EXIT
				;
	OUT	(C),E		;  TRANSMIT NEXT CHARACTER
	JR	LOOP2		;OD
 
TR1NEXT	INC	C
	INC	C
	LD	L,1
	OUT	(C),L
	IN	A,(C)
	AND	70H
	LD	B,7
	CALL	NZ,SIOERR	;IF TRANSMISSION ERROR THEN ERROR
 
LOOPOUT	LD	E,(IY+12H)	;GET BUFFER ADDRESS
	LD	D,(IY+13H)
	IN	A,(APIO1+1)
	RES	4,A
	OUT	(APIO1+1),A	;TURN OFF TEST LED
	RET
 
 
SIOERR	PUSH	AF
	PUSH	HL
	PUSH	DE
	LD	E,(IY+12H)	;GET BUFFER ADDRESS
	LD	D,(IY+13H)
	LD	HL,BUFFHEAD+ERROFF
	ADD	HL,DE
	LD	A,(HL)
	AND	A
	JR	NZ,ERROUT	;IF NO ERROR INDICATION ALLREADY THEN
	LD	A,(IY+14H)	;  GET SIO BASE ADDRESS
	BIT	0,A		;
	JR	Z,ERRNXT	;  IF CHANNEL B THEN
	ADD	A,3		;  ADD 3 TO SIO BASE ADDRESS
ERRNXT	ADD	A,B		;  CALCULATE ERROR CODE
	LD	(HL),A		;  SAVE ERROR CODE IN BUFFER
				;FI
ERROUT	POP	DE
	POP	HL
	POP	AF
	RET
;ECHO \f


;****************************************************************************
;* PROCEDURE NAME	: CHINIT
;*
;* DESCRIPTION		: THE ROUTINE INITIALIZES TX CHAR.POINTER AND TX BY-
;*			  TECOUNT IN CHANNEL TABLE
;*
;* ENTRY		: IY = ADDRESS OF CHANNEL TABLE
;*
;* EXIT			: Z = 1 IF DATA BYTECOUNT = 0
;*			  Z = 0 IF DATA BYTECOUNT > 0
;*
;* DESTROY		: A,F,B,C,D,E,H,L
;*****************************************************************************
 
CHINIT	LD	E,(IY+12H)	;GET BUFFER ADDRESS
	LD	D,(IY+13H)
	LD	HL,BUFFHEAD+BYTOFF
	ADD	HL,DE
	LD	C,(HL)
	INC	HL		;GET TX BYTECOUNT
	LD	B,(HL)
	LD	A,C
	OR	B
	RET	Z		;IF DATA BYTECOUNT = 0 THEN EXIT
	LD	(IY+10H),C	;SAVE DATA BYTECOUNT IN CHANNEL TABLE
	LD	(IY+11H),B
	LD	HL,BUFFHEAD+DATOFF
	ADD	HL,DE
	LD	(IY+0EH),L
	LD	(IY+0FH),H	;SAVE DATA CHARACTER POINTER
	RET
 
;ECHO \f


;******************************************************************************
;* PROCEDURE NAME	: NEXTCHA
;*
;* DESCRIPTION		: THE ROUTINE SAVES RECEIVED CHARACTER IN BUFFER AND
;*			  INCREMENTS RX BYTECOUNT IN BUFFER,
;*			  INCREMENTS TX CHAR.POINTER AND DECREMENTS TX BYTE-
;*			  COUNT IN CHAN.TABLE AND GETS NEXT CHAR. TO TRANSMIT
;*
;* ENTRY		: A = RECEIVED CHARACTER
;*			  IY = ADDRESS OF CHANNEL TABLE
;*
;* EXIT			: Z = 0 IF MORE CHARACTERS TO TRANSMIT
;*			  E = CHARACTER TO TRANSMIT
;*
;*			  Z = 1 IF NO MORE CHARACTERS TO TRANSMIT
;*
;* DESTROY		: A,F,E,H,L
;******************************************************************************
 
NEXTCHA	LD	L,(IY+0EH)
	LD	H,(IY+0FH)
	LD	(HL),A		;SAVE RECEIVED CHARACTER
	INC	HL
	LD	E,(HL)		;GET NEXT CHARACTER
	LD	(IY+0EH),L
	LD	(IY+0FH),H	;SAVE NEW CHARACTER POINTER
	LD	L,(IY+10H)
	LD	H,(IY+11H)
	DEC	HL		;DECREMENT TX BYTECOUNT
	LD	A,L
	OR	H
	RET	Z		;IF TX BYTECOUNT = 0 THEN EXIT
	LD	(IY+10H),L
	LD	(IY+11H),H	;SAVE NEW TX BYTECOUNT
	RET
 
;ECHO \f