DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

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

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦3f61ffb2b⟧ TextFile

    Length: 8722 (0x2212)
    Types: TextFile
    Names: »RXDRIVER.S«

Derivation

└─⟦a3edd706e⟧ Bits:30005202 8" Zilog MCZ/1 Floppy CR80FD_0028 ( TC 500 SEC. PROTOCOL BACK UP ! (V1) BB A1 820907 NCJ )
    └─ ⟦this⟧ »RXDRIVER.S« 

TextFile

;******************************************************************************
;*
;*		RECEIVER  MODULE
;*
;******************************************************************************
*INCLUDE CONSTANT.S
	
	EXTERNAL	SUBDEQ,SUBENQ
	EXTERNAL	SIOREADWRITE
	GLOBAL		RECROU
	GLOBAL		REC_START
	GLOBAL		NO_SYNCHRONIZATION
	GLOBAL		CONTENTION
	GLOBAL		CHARACTER_RECEIVER
	GLOBAL		CONTINUE_RECEIVER
	GLOBAL		CHECKSUM_CHECK
	GLOBAL		HUNT
	GLOBAL		RXSTOP
 
RECROU	LD	HL,RECTAB
	LD	C,(IY+1FH)
	LD	B,0
	ADD	HL,BC
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	EX	DE,HL
	JP	(HL)
 
RECTAB	DEFW	NO_SYNCHRONIZATION
	DEFW	REC_START
	DEFW	CONTENTION
	DEFW	CHARACTER_RECEIVER
	DEFW	CONTINUE_RECEIVER
	DEFW	CHECKSUM_CHECK
 
;ECHO \f


REC_START
 
	LD	BC,1010001100100000B
	CALL	SIOREADWRITE		; SIOCON	3,W,R,020H
	LD	C,(IY+1CH)	;GET SIO ADDRESS			
	IN	A,(C)		;READ RECEIVED CHARACTER		
	AND	7FH		;MASK PARITY BIT	
	CP	SYN		;IF RECEIVED CHARATER = SYNC	
	RET	Z		;THEN SKIP
	CP	EOT		;IF RECEIVED CHARACTER <> EOT
	JR 	Z,RS2		;AND
	CP	NACK		;IF RECEIVED CHARATER <> NACK
	JR	Z,RS2		;AND
	CP	ACK		;IF RECEIVED CHARACTER <>ACK
	RET	NZ		;
RS2
	PUSH	AF
	LD	(IY+0EH),02H	;SET RXFLAG
	LD	L,(IY+08H)	;IF BUFFER AVAILABLE FROM EMPTY BUFFER	
	LD	H,(IY+09H)	;				
	CALL	SUBDEQ		;
	JR	NC,NO1BUF	;THEN DO	
	LD	HL,RECOFF+BUFFHEAD	;CALCULATE RECEIVING START
	ADD	HL,DE		;	ADDRESS					11
	PUSH	HL		;
	LD	C,L		;					
	LD	B,H		;					
	LD	(IY+2AH),E	;	SAVE BUFFER ELEMENT ADDRESS	
	LD	(IY+2BH),D	;					
	LD	HL,TSAOFF	;	TRANSFER RECEIV.STARTADDRESS
	ADD	HL,DE		;	DRES STO REFLECTING START POINT	
	LD	(HL),C		;					
	INC	HL		;					
	LD	(HL),B		;					
	LD	HL,STWOFF	;	CALCULATE STATUS WORD ADDRESS
	ADD	HL,DE		;					
	LD	(HL),00H	;	RESET STATUS WORD			
	INC	HL		;					
	LD	(HL),00H	;					
	POP	HL		;
	POP	AF		;
	LD	(HL),A		;
	INC	HL		;					
	LD	(IY+2EH),L	;	TEMPORARY SAVING OF START 	
	LD	(IY+2FH),H	;	ADDRESS				
	LD	BC,01H		;	LOAD CURRENT BYTE COUNT 	
	LD	(IY+2CH),C	;	WITH 01H			
	LD	(IY+2DH),B	;					
	CP	EOT		;	IF RECEIVED CHARACTER < > EOT
	JR	Z,DLCEOT	;		(=ACK OR =NACK )
	LD	E,(IY+2AH)	;		GET BUFFER ELEMENT ADDRESS		
	LD	D,(IY+2BH)	;					
	LD	HL,BCOFF	;		CALCULATE BYTECOUNT
	ADD	HL,DE		;		ADDRESS			
	LD	(HL),C		;		SAVE BYTE COUNT		
	INC	HL		;					
	LD	(HL),B		;					
	LD	L,(IY+28H)	;		GET QUEUEHEAD ADDRESS	
	LD	H,(IY+29H)	;					
	CALL	SUBENQ		;		TRANSFER RECEIVED      
				;		BUFFER
	CALL	HUNT		;		SET SIO IN HUNT MODE
	LD	(IY+2AH),00H	;		RESET BUFFER ELEMENT ADDRESS
	LD	(IY+2BH),00H	;
	RET			;		RETURN FROM PROCESS
				;	FI
DLCEOT	LD	(IY+1FH),04H	;NEXT INT.ROUTINE = CONXTEN
	RET			;RETURN FROM PROCESS
	
NO1BUF	POP	AF		;ELSE DO				
	LD	(IY+1FH),02H	;	NEXT INT.ROUTINE = STAXREC
	RET			;
				;    END
;ECHO\f


;******************************************************************************
NO_SYNCHRONIZATION

	LD	(IY+0EH),00H	;RESET RXFLAG
	LD	C,(IY+1CH)	;GET SIO ADDRESS			
	IN	A,(C)		;READ RECEIVED CHARACTER		
	RET			;RETURN FROM PROCESS			
 
;******************************************************************************
CONTENTION

	LD	(IY+0EH),03H	;SET RXFLAG
	LD	C,(IY+1CH)	;GET SIO ADDRESS			19
	IN	A,(C)		;READ RECEIVED CHARACTER		12
	AND	07FH		;MASK PARITY BIT			07
	LD	E,A		;TEMPORARY SAVING OF RECEIVED CHARACTER
	CP	SYN		;IF RECEIVED CHARARTER = SYNC
	LD	C,(IY+2CH)	;	GET CURRENT BYTE COUNT	
	LD	B,(IY+2DH)	;		
	JR	NZ,NOSYNC	;	THEN DO
	LD	A,C		;
	CP	01		;IF BYTE COUNT = 01 THEN DO 
	RET	NZ		;
BUFTORQ	LD	E,(IY+2AH)	;	GET BUFFER ELEMENT ADDRESS	19
	LD	D,(IY+2BH)	;					19
	LD	HL,BCOFF	;	CALCULATE BYTECOUNT ADDRESS
	ADD	HL,DE		;					11
	LD	(HL),C		;	SAVE FINAL BYTE COUNT		07
	INC	HL		;					06
	LD	(HL),B		;					07
	LD	L,(IY+28H)	;	GET POINTER TO RECEIVER QUEUE
	LD	H,(IY+29H)	;					19
	CALL	SUBENQ		;	TRANSFER RECEIVED BUFFER     157
	CALL	HUNT		;	SET SIO IN HUNT MODE
	LD	(IY+2AH),00H	;	RESET BUFFER ELEMENT ADDRESS 
	LD	(IY+2BH),00H	;
	RET			;RETURN FROM PROCESS
	
NOSYNC
	LD	L,(IY+2EH)	;
	LD	H,(IY+2FH)	;
	LD	(HL),E		;SAVE CHARACTER IN BUFFER
	INC	HL		;INCREMENT BUFFER POINTER
	LD	(IY+2EH),L	;SAVE NEW BUFFER POINTER
	LD	(IY+2FH),H	;
	INC	(IY+2CH)	;INCREMENT BYTECOUNT
	JR	NZ,NO1		;
	INC	(IY+2DH)	;
NO1	INC	BC		;
	LD	A,C		;
	CP	04H		;IF BYTE COUNT < 04
	RET	C		;
	JR	Z,ISBC04	;
	CP	05H		;
	JR	Z,ISBC05	;
	JR	RXERR		;
				;
ISBC04	  	         	;IF BYTE COUNT = 04
	LD	A,E		;	GET RECEIVED CHARACTER
	CP	FSL		;IF RECEIVED CHARACTER = FSL
	RET	Z		;	THEN RETURN FI
	CP	POL		;IF RECEIVED CHARACTER = POL
	RET	Z		;	THEN RETURN FI
	CP	CON		;IF RECEIVED CHARACTER = CON
	JR	NZ,RXERR	;
	JP	BUFTORQ		;	TRANSFER BUFFER TO RECEIVER QUEUE
	
ISBC05	  	  		;IF BYTE COUNT = 05
	LD	A,E		;	GET RECEIVED CHARACTER
	CP	ENQ		;IF CHARACTER = ENQ
	JP	Z,BUFTORQ	;	THEN STOP
ISCHSOH	CP	SOH		;IF RECEIVED CHARACTER = SOH
	JR	NZ,RXERR	;
	LD	(IY+1FH),06H	;	NEXT INT.ROUTINE = CHAXREC
	RET			;RETURN FROM PROCESS
				;
RXERR
	LD	L,(IY+2AH)	;GET BUFFER ELEMENT ADDRESS
	LD	H,(IY+2BH)	;
	LD	DE,STWOFF	;CALCULATE STATUS WORD
	ADD	HL,DE		;
	SET	1,(HL)		;SET RXERROR BIT
	JP	BUFTORQ		;TRANSFER BUFFER TO RECEIVER QUEUE
;ECHO \f


;*****************************************************************************
CHARACTER_RECEIVE

	LD	(IY+0EH),04H	;SET RXFLAG
	LD	(IY+1FH),08H	;NEXT INT.ROUTINE = CONXREC
	LD	(IY+17H),00H	;RESET CHECKSUM BYTE			19
 
;******************************************************************************
CONTINUE_RECEIVER
 
	LD	(IY+0EH),05H	;SET RXFLAG
	LD	C,(IY+1CH)	;GET SIO ADDRESS			19
	IN	A,(C)		;READ RECEIVED CHARACTER		12
	AND	07FH		;MASK PARITY BIT			07
	CP	SYN		;IF SYNC RECEIVED			19
	RET	Z		;	RETURN				10
				;     END
LOOP1RE
	LD	C,A		;STORE CONTENS OF A REG.
	XOR	(IY+17H)	;XOR RECEIVED CHARACTER TO CHECKSUM	19
	LD	(IY+17H),A	;SAVE NEW CHECKSUM			07
	LD	A,C		;GET CONTENS OF A REG.
	CP	ETX		;IF ETX RECEIVED			19
	JR	NZ,NORMCHA	;THEN DO				10
CONCHA	LD	L,(IY+2EH)	;	SAVE RECEIVED CHARACTER		19
	LD	H,(IY+2FH)	;					19
	LD	(HL),A		;					07
	LD	E,(IY+2AH)	;	GET ELEMENT ADDRESS		19
	LD	D,(IY+2BH)	;					19
	LD	HL,BCOFF	;	CALCULATE BYTECOUNT ADDRESS
	ADD	HL,DE		;					11
	LD	C,(IY+2CH)	;	GET CURRENT BYTE COUNT		19
	LD	B,(IY+2DH)	;					19
	INC	BC		;	INCREMENT CURRENT BYTE COUNT	06
	LD	(HL),C		;	SAVE BYTE COUNT IN BUFFER 	07
	INC	HL		;	ELEMENT				06
	LD	(HL),B		;					07
	LD	(IY+1FH),0AH	;	NEXT INT.ROUTINE = PADXCRC
	RET			;	RETURN				10
				;     END
				;IF NORMALE CHARACTER RECEIVED
				;THEN DO
NORMCHA	LD	C,(IY+2CH)	;	GET CURRENT BYTE COUNT		19
	LD	B,(IY+2DH)	;					19
	INC	BC		;	INCREMENT CURRENT BYTE COUNT	06
	AND	A		;					04
	LD	HL,MAXSIZE	;	GET MAX BYTECOUNT
	SBC	HL,BC		;	IF CURRENT BYTE COUNT>MAXSIZE	15
	JR	NZ,CHANORM	;	THEN DO				10
	LD	L,(IY+2AH)	;		GET ELEMENT ADDRESS	19
	LD	H,(IY+2BH)	;					19
	LD	DE,STWOFF	;		CALCULATE STATUS WORD
	ADD	HL,DE		;		ADDRESS			11
	SET	0,(HL)		;		SET OVER FLOW BIT	15
	RET			;		RETURN			10
				;	     END
CHANORM	LD	(IY+2CH),C	;	SAVE CURRENT BYTE COUNT		19
	LD	(IY+2DH),B	;					19
	LD	L,(IY+2EH)	;	GET BUFFER ADDRESS		19
	LD	H,(IY+2FH)	;					19
	LD	(HL),A		;	SAVE RECEIVED CHARACTER		07
	INC	HL		;	INCREMENT BUFFER ADDRESS	06
	LD	(IY+2EH),L	;	SAVE BUFFER ADDRESS POINTER	19
	LD	(IY+2FH),H	;					19
	RET			;	RETURN				10
				;     END
;ECHO \f


;*****************************************************************************
CHECKSUM_CHECK

	LD	(IY+0EH),06H	;SET RXFLAG
	LD	C,(IY+1CH)	;GET ADDRESS OF CALCULATED CHECKSUM	19
	IN	A,(C)		;GET RECEIVED CHECKSUM			12
	AND	07FH		;					07
	CP	(IY+17H)	;IF RECEIVED CHECKSUM <> CALCULATED 	19
	LD	E,(IY+2AH)	;	GET BUFFER ELEMENT ADDRESS	19
	LD	D,(IY+2BH)	;					19
	JR	Z,NO1ERR	;THEN DO
	LD	HL,STWOFF	;	CALCULATE STATUS WORD
	ADD	HL,DE		;	WORD				11
	SET	6,(HL)		;	SET CHECKSUM ERROR BIT		15
				;
NO1ERR	LD	L,(IY+28H)	;	GET POINTER TO RECEIVE QUEUE
	LD	H,(IY+29H)	;					19
	CALL	SUBENQ		;	TRANSFER RECEIVED BUFFER       157
				;	ELEMENT
	CALL	HUNT		;	SET SIO IN HUNT MODE
	LD	(IY+2AH),00H	;	RESET BUFFER ELEMENT	
	LD	(IY+2BH),00H	;	ADDRESS				19
	RET			;	RETURN FROM GENERAL PROCESS	10
				;     END
;ECHO \f


;**************************************************
;*
;*  SUBROUTINE USED TO SET SIO IN HUNT MODE  
;*
;**************************************************
HUNT
	
	DI			;DISABLE INTERRUPT
	LD	(IY+26H),00H	;RESET SYNCHRONIZATION STATUS
	LD	BC,1110001100110010B
	CALL	SIOREADWRITE	;SIOCON 3,W,S,032H
	LD	L,(IY+24H)	;RESET ENTER HUNT MODE BIT
	LD	H,(IY+25H)	;
	LD	DE,03H		;
	ADD	HL,DE		;
	RES	4,(HL)		;AND SYNC CHARACTER LOAD INHIBIT
	RES	1,(HL)		;BIT IN SIO 1 CHANNEL TABLE
	CALL	RXSTOP		;GET INTERRUPT VECTOR NOXSYNC
	RET			;
	
	
;**********************************************************
;*
;*	SUBRUTINE USED TO GET INTERRUPT VECTOR NOXSYNC
;*
;**********************************************************
RXSTOP
	
	DI			;DISABLE INTERRUPT
	LD	(IY+0EH),00H	;RESET RXFLAG
	LD	(IY+1FH),00H	;NEXT INT.ROUTINE = NOXSYNC
	RET			;RETURN FROM PROCESS
;ECHO \f