DataMuseum.dk

Presents historical artifacts from the history of:

Intel ISIS Floppy Disks

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

See our Wiki for more about Intel ISIS Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦2ede1e43a⟧ TextFile

    Length: 18443 (0x480b)
    Types: TextFile
    Names: »CCAWPC.SRC«

Derivation

└─⟦519079be6⟧ Bits:30005500 8" CR80 Floppy CR80FD_0029 ( WBOOTL.SYS W.D bootload program 81 10 01 ??? )
└─⟦519079be6⟧ Intel_ISIS_II
    └─ ⟦this⟧ »CCAWPC.SRC« 

TextFile

;*** CCAWPC *** 81 07 24 **** LPO ***************************************\r
;ALL FILES CONTAINED HERE\r
;************************************************************************\r
\r
	PUBLIC	CCA_SCAN\r
	EXTRN	SYSRAM,SUB_WAIT,SUB_SIGNAL,SRELEASE\r
	EXTRN	WCA_TABLE_ADDRESS,CCA_TABLE_ADDRESS\r
\r
;POINTER REGISTER CONVENTION:\r
;			(IX+D) RELEATED TO WCA_TA,CCA_TA\r
;			(IY+D) RELEATED TO WPC_TA\r
;REGISTER E USED ERROR COUNTER\r
;REGISTER B USED FOR COMPARE\r
\r
;	WCA_TABLE_ADDRESSES:\r
;		COMMAND BYTE		IX+00H\r
;		SECTION 1		IX+01H\r
;					IX+02H\r
T01;		SECTION 2		IX+03H\r
;					IX+04H\r
;		TABLE CTRL STATUS	IX+05H\r
;		COMMUNICATION STATUS	IX+06H\r
;		PARAMETER 1		IX+07H\r
;			  2		IX+08H\r
;			  3		IX+09H\r
;			  4		IX+0AH\r
\r
\r
\r
T011;	CCA_TABLE_ADDRESSES:\r
;		COMMAND BYTE		IX+00H\r
;		SECTION 1		IX+01H\r
;					IX+02H\r
;					IX+03H\r
;		NOT USED		IX+04H\r
;		TABLE CTRL STATUS	IX+05H\r
;		CHANNEL NUMBER		IX+06H\r
;		CCA ADDRESS		IX+07H\r
;		PARAMETER 1		IX+08H\r
;		RESULT 1		IX+09H\r
;		RESULT 2		IX+0AH\r
\r
\r
\r
;*** CCA_SCAN ********************************************************\r
;SCANING OF CCA TABLE IS PERFORMED\r
;********************************************************************\r
\r
	CSEG\r
	PUBLIC	CCA_SCAN\r
	PUBLIC	COUT\r
\r
CCA_SCAN\r
T02	LD 	IX,CCA_TA	;CCA_TABLE_ADDRESS\r
	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	(IY+0BH),0	;CLEAR ERR CTRL INFO\r
	LD	(IY+07H),04H	;SET CCA ID FOR ERRD\r
	LD	A,(IX+00H)	;GET COMMAND BYTE\r
	CP	0		;COMPARE ACC WITH 0\r
	JR	Z,CCA1  	;ACC=0, Z=1, GO TO WPC_SCAN\r
	CP	01H		;\r
	JR	Z,CCA2  	;ACC=01H, REPLACE LTU\r
CCA5:	CP	02H		;\r
	JR	Z,CCA3  	;ACC=02H, READ CCA STATUS\r
CCA6:	CP	05H		;\r
	JR	Z,CCA4 		;ACC=05H, TRANSFER C_PAR TO CCA\r
	JP	COUT		;\r
CCA2:	CALL	SWITCH_LTU	;\r
	JP	CCA5		;\r
CCA3:	CALL	CCA_STATUS	;\r
	JP	CCA6		;\r
CCA4:	CALL	C_PAR1		;\r
COUT\r
	LD	A,(IY+0BH)	;GET ERR CTRL INFO\r
	CP	A,01H		;\r
	JP	Z,CCA1		;\r
	LD	IX,CCA_TA	;\r
	LD	(IX+00H),03H	;COMMAND EXECUTED\r
	JP	CCA1		;\r
CCA1:	JP	WPC_SCAN	;\r
\r
\r
\r
;*** CCA_STATUS *******************************************************\r
;CCA STATUS OF MONITORING BITS, M1 TO M4, AND ANALOG SIGNALS\r
;6 TX/RX SEQUENCES ARE PERFORMED\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	CCA_STATUS\r
;ACTUAL MODULE NOT APPLICABLE IN THE PRESENT APPLICATION\r
\r
CCA_STATUS\r
	RET			;TO CCA_SCAN\r
\r
\r
\r
;*** SWITCH_LTU *******************************************************\r
;SWITCH TO/FROM SPARE LTU\r
;PERFORMANCE:  	\r
;		 5 SEQUENCES USED\r
;		 SEND 2 BYTES\r
;		 RECEIVE 2 BYTES\r
;		 TEST 2. BYTE RECEIVED\r
;**********************************************************************\r
\r
	 \r
\r
	PUBLIC	SWITCH_LTU\r
\r
;REGISTERS: 	E ERROR COUNTER\r
\r
SWITCH_LTU\r
\r
;SEND CCA ADDR AND POINTER IE BANK NR OR DEVICES\r
SWL1	LD	E,0		;CLEAR ERR COUNTER\r
SWL11	LD	IX,CCA_TA	;CCA_TABLE_ADDRESS\r
	LD	A,(IX+01H)	;GET CCA ADDR, SECTION 1, BYTE 1\r
	CALL	WCATX		;TX1\r
	LD	A,(IX+02H)	;GET COMMAND (POINTER), SEC 1, BYTE 2\r
	LD	B,A		;SAVE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX 1. BYTE\r
	CALL	WCARX		;RX 2. BYTE\r
	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	A,(IY+06H)	;GET 2. BYTE RECEIVED, RX DATA\r
	CP	B		;COMPARE TX2 WITH RX2\r
	JR	Z,SWL2		;IF EQUAL, NEXT\r
	INC	E		;ERR COUNTER\r
	BIT	2,E		;TEST IF BIT SET\r
	JR	Z,SWL11	;REPEAT THIS SEQUENCE\r
	CALL	CERR1		;ERR ROUTINE\r
	RET			;TO CCA_SCAN\r
\r
;SEND CCA ADDR AND LTU ADDR\r
SWL2	LD	E,0		;RESET ERR COUNTER\r
SWL21	LD	A,(IX+01H)	;CCA ADDR\r
	CALL	WCATX		;TX1\r
	LD	A,(IX+03H)	;LTU ADDR\r
	AND	0FH		;MASK OUT UPPER NIBLE\r
	OR	20H		;ORL A,20H (SET BIT 5)\r
	LD	B,A		;SAVE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD	A,(IY+06H)	;RX DATA\r
	CP	B		;TX=RX\r
	JR	Z,SWL3		;NEXT\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,SWL21	;\r
	CALL	CERR1		;\r
	RET			;\r
\r
;SEND	CCA ADDR AND STROBE\r
SWL3	LD	E,0		;\r
SWL31	LD	A,(IX+01H)	;CCA ADDR\r
	CALL	WCATX		;\r
	LD	A,40H		;LOAD STROBE\r
	CALL	WCATX		;\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD 	A,(IY+06H)	;RX DATA\r
	CP	40H		;COMPARE TX,RX\r
	JR	Z,SWL4		;NEXT\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,SWL31	;\r
	CALL	CERR1		;\r
	RET			;\r
\r
;TRANCEIVE CCA ADDR AND LTU ADDR WITH ENABLE\r
SWL4	LD	E,0		;\r
SWL41	LD	A,(IX+01H)	;CCA ADDR\r
	CALL	WCATX		;TX1\r
	LD	A,(IX+03H)	;LTU ADDR\r
	AND	0FH		;MASK OUT UPPER NIBLE\r
	OR	30H		;SET SPARE ENABLE ENABLE BITS 5,4\r
	LD	B,A		;\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD	A,(IY+06H)	;RX DATA\r
	CP 	B		;COMPARE TX,RX\r
	JR	Z,SWL5		;IF OK NEXT\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,SWL41		;\r
	CALL	CERR1		;\r
	RET			;\r
\r
;SEND CCA ADDR AND STROBE\r
SWL5	LD	E,0		;\r
SWL51	LD	A,(IX+01H)	;\r
	CALL	WCATX		;\r
	LD	A,40H		;\r
	CALL	WCATX		;\r
	CALL	WCARX		;\r
	CALL	WCARX		;\r
	LD	A,(IY+06H)	;\r
	CP	40H		;\r
	JR	Z,SWL6		;\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,SWL51		;\r
	CALL	CERR1		;\r
\r
SWL6	RET			;RET TO CCA_SCAN\r
\r
\r
\r
\r
;*** C_PAR *************************************************************\r
;THIS MODULE CONTROLS THE 4 SWITCHES OF A CCA\r
;***********************************************************************\r
\r
\r
	PUBLIC	C_PAR1 \r
\r
C_PAR1\r
; THIS MODULE CONTROLES THE 4 SWITCHES OF CCA 0\r
T03	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	IX,CCA_TA	;CCA_TABLE_ADDRESS\r
	LD	A,(IX+07H)	;GET CCA ADDR\r
	LD	(IY+00H),A	;SAVE CCA ADDR\r
	LD	(IY+08H),08H	;SET POINTER 3\r
	LD	A,(IX+08H)	;GET PAR1 BYTE\r
	AND	0FH		;MASK BITS 3,2,1,0\r
	OR	20H		;ADD ENABLE BIT\r
	LD	(IY+09H),A	;SWITCH DATA TO THE CCA\r
	LD	A,(IX+08H)	;GET PAR1 BYTE\r
	AND	0FH		;MASK\r
	OR	40H		;ADD STROBE BIT\r
	LD	(IY+0AH),A	;STROBE AND DATA FOR SWITCH 1\r
	CALL	C_COM1		;TRANCEIVE\r
	RET			;TO CCA_SCAN\r
\r
\r
\r
;*** CCOM1 ************************************************************\r
;COMMUNICATION ROUTINE FOR W_PARS\r
;PERFORMANCE:\r
;		3 SEQUENCES ARE CONDUCTED\r
;		1. SEND 2 BYTES\r
;		2. RECEIVE 2 BYTES\r
;		3. TEST 2. BYTE RECEIVED\r
;**********************************************************************\r
\r
	 \r
\r
	PUBLIC	C_COM1\r
\r
;REGISTERS:	E ERROR COUNTER\r
\r
C_COM1\r
;LOAD CCA ADDR AND POINTER (CTRL REG)\r
CC1	LD	E,0		;RESET ERR COUNTER\r
	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
CC11	LD	A,(IY+00H)	;CCA ADDR\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+08H)	;LOAD POINTER 3\r
	CALL	WCATX		;SEND P3\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD	A,(IY+06H)	;LOAD RECEIVED DATA\r
	CP	08H		;COMPARE TX2,RX2\r
	JR	Z,CC2		;IF TX=RX, JMP TO NEXT SEQUENCE\r
	INC	E		;ERR COUNT\r
	BIT	2,E		;TEST BIT 2\r
	JR	Z,CC11		;IF NOT SET REPEAT\r
	CALL	CERR1		;ERR REPORT\r
	RET			;TO C_PAR1\r
\r
;CCA ADDR AND COMMAND DATA\r
CC2	LD	E,0		;RESET ERR COUNTER\r
CC21	LD	A,(IY+00H)	;CCA ADDR\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+09H)	;LOAD COMMAND DATA WITH ENABLE BIT\r
	LD	B,A		;SAVE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD	A,(IY+06H)	;RX DATA\r
	CP	B		;COMPARE TX,RX\r
	JR	Z,CC3		;IF OK NEXT STEP\r
	INC	E		;ERR COUNT\r
	BIT	2,E		;\r
	JR	Z,CC21		;\r
	CALL	CERR1		;\r
	RET			;\r
\r
;CCA ADDR AND STROBE\r
CC3	LD 	E,0		;\r
CC31	LD	A,(IY+00H)	;CCA ADDR\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+0AH)	;LOAD STROBE AND DATA\r
	LD	B,A		;SAVE FOR COMPARE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	CALL	WCARX		;RX2\r
	LD	A,(IY+06H)	;RX STROBE AND DATA\r
	CP	B		;COMPARE TX,RX\r
	JR	Z,CC4		;\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,CC31		;\r
	CALL	CERR1		;\r
\r
CC4	RET			;TO C_PAR1\r
\r
\r
\r
;*** WPC_SCAN *********************************************************\r
;SCANING OF THE WPC TABLE IS PERFORMED\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	WPC_SCAN\r
\r
WPC_SCAN\r
	LD	IX,WCA_TABLE_ADDRESS	;\r
	LD	IY,WPC_TABLE_ADDRESS	;\r
	LD	(IY+0BH),0		;CLEAR ERR CTRL INFO\r
	LD	(IY+07H),08H		;WPC ID FOR ERRD\r
	LD	A,(IX+00H)		;COMMAND BYTE\r
	CP	0			;COMPARE WITH 0\r
	JR	Z,WPC3			;IF ACC=0 Z=1,NO COMMAND\r
	CP	01H			;ACC=1, READ STATUS\r
	JR	Z,WPC2			;\r
WPC1	CALL	SRELEASE		;LEAVE WCA DRIVER\r
	JP	CCA_SCAN		;JMP TO START\r
WPC2	CALL	WPC_STATUS		;DELIVER WPC LTU STATUS\r
WPC3	LD	A,(IX+05H)		;GET CRTL STATUS WORD\r
	CP	0			;\r
	JR	Z,WPC1			;IF 0, REST OF TABLE INVALID\r
	CALL	W_PAR1			;\r
	CALL	W_PAR2			;\r
	CALL	W_PAR3			;\r
	CALL	W_PAR4			;\r
\r
WOUT	LD	A,(IY+0BH)		;ERR CTRL INFO\r
	CP	A,01H			;\r
	JP	Z,WPC1			;\r
	LD	(IX+00H),02H		;COMMAND EXECUTED\r
	LD	(IX+07H),01H		;COMMUNICATION OK\r
	JP	WPC1			;\r
\r
\r
\r
;*** WPC_STATUS *******************************************************\r
;READ AND DELIVER FRONT PANEL STATUS\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	WPC_STATUS\r
\r
;ACTUAL MODULE NOT APPLICABLE\r
\r
WPC_STATUS\r
	RET			;TO WPC_SCAN\r
\r
\r
\r
;*** W_PAR *************************************************************\r
;WPC PAREMETERS IS EXECUTED\r
;***********************************************************************\r
\r
	 \r
	PUBLIC	W_PAR1,W_PAR2,W_PAR3,W_PAR4\r
\r
W_PAR1				;\r
T04	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	IX,WCA_TA	;WCA_TABLE_ADDRESS\r
	LD	A,(IX+08H)	;W_PAR1 BYTE\r
	AND	07H		;MASK BITS 2,1,0\r
	LD	(IY+04H),A	;STATUS DATA TO BE DISPLAYED\r
	LD	(IY+03H),30H	;WRLH UPPER ADDR PART=30H\r
	LD	(IY+02H),06H	;WRLH LOWER ADDR PART=06H\r
	CALL	WCOM1		;EXECUTE COMMUNICATION\r
	LD	A,(IX+08H)	;\r
	AND	38H		;MASK BITS 5,4,3\r
	LD	(IY+04H),A	;STATUS DATA\r
	LD	(IY+02H),02H	;WRLH ADDR LOWER PART=02H\r
	CALL	WCOM1		;COMMUNICATION ROUTINE\r
	RET			;TO WPC_SCAN\r
\r
W_PAR2\r
T05	LD	A,(IX+09H)	;W_PAR2 BYTE\r
	AND	07H		;MASK BITS 2,1,0\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),07H	;WRLH ADDR LOWER PART=07\r
	CALL	WCOM1		;EXECUTE COMMUNICATION\r
	LD	A,(IX+09H)	;\r
	AND	38H		;MASK BITS 5,4,3\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),05H	;WRLH ADDR LOWER PART=05\r
	CALL	WCOM1		;\r
	RET			;\r
\r
W_PAR3\r
T06	LD	A,(IX+0AH)	;W_PAR3 BYTE\r
	AND	0FH		;MASK BITS 3,2,1,0\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),08H	;WRLH ADDR LOWER PART=08\r
	CALL	WCOM1		;\r
	LD	A,(IX+0AH)	;\r
	AND	0F0H		;MASK BITS 7.6.5.4\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),09H	;WRLH ADDR LOWER PART=09\r
	CALL	WCOM1		;\r
	RET			;\r
\r
W_PAR4\r
T07	LD	A,(IX+0BH)	;W_PAR4 BYTE\r
	AND	03H		;MASK BITS 1,0\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),0BH	;WRLH ADDR LOWER PART=0BH\r
	CALL	WCOM1		;EXECUTE COMMUNICATION\r
	LD	A,(IX+0BH)	;\r
	AND	1CH		;MASK BITS 4,3,2\r
	LD	(IY+04H),A	;DATA\r
	LD	(IY+02H),0AH	;WRLH ADDR LOWER PART=0AH\r
	CALL	WCOM1		;\r
	RET			;\r
\r
\r
\r
;*** WCOM1 ************************************************************\r
;THIS MODULE COMMUNICATES VIA THE WPC WITH FRONTPANEL\r
;PERFORMANCE:\r
;		4 SEQUENSES IS CONDUCTED\r
;		1. SEND 2 BYTES\r
;		2. RECEIVE 2BYTES\r
;		3. TEST 1. BYTE RECEIVED\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	WCOM1\r
\r
WCOM1\r
\r
;SEND STATUS DATA TO BE DISPLAYED TO PAM 122\r
WC1	LD	E,0		;CLEAR ERR COUNTER\r
WC11	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	A,(IY+04H)	;GET STATUS DATA\r
	LD	B,A		;SAVE FOR COMPARE\r
	LD 	A,122D		;ADDR PAM 122\r
	CALL	WCATX		;TX1\r
	LD	A,B		;STATUS DATA\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	LD	A,(IY+06H)	;RX DATA BYTE\r
	PUSH	AF		;SAVE\r
	CALL	WCARX		;RX2\r
	POP	AF		;\r
	CP	B		;COMP TX2,RX1\r
	JR	Z,WC2		;IF A=B, Z=1, JMP WP2\r
	INC	E		;ERR COUNTER\r
	BIT	2,E		;\r
	JR	Z,WC11		;REPEAT\r
	CALL 	WERR1		;REPEAT 3 TIMES\r
	RET			;TO ACTUAL W_PAR\r
\r
;SEND UPPER ADDR PART OF WPC WRLH TO PAM 121\r
WC2	LD	E,0   		;\r
WC21	LD 	A,121D		;ADDR PAM 121\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+03H)	;WRLH ADDR UPPER PART\r
	LD	B,A		;SAVE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	LD	A,(IY+06H)	;RX DATA\r
	PUSH	AF		;\r
	CALL	WCARX		;RX2\r
	POP	AF		;\r
	CP	B		;COMP TX,RX\r
	JR	Z,WC3		;\r
	INC	E		;\r
	BIT	2,E		;\r
	JR	Z,WC21		;\r
	CALL 	WERR1		;\r
	RET			;\r
\r
;TX/RX	LOWER ADDR PART OF WRLH WITH HS TO PAM 120\r
;WAIT UNTIL WPC HS IS SET\r
WC3	LD	E,0		;\r
WC31	LD	A,120D		;ADDR PAM 120\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+02H)	;LOVER WRLH ADDR PART\r
	OR	20H		;ADD HAND SHAKE BIT\r
	LD	B,A		;\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	LD	A,(IY+06H)	;RX DATA\r
	PUSH	AF		;\r
	CALL	WCARX		;RX2\r
	POP	AF		;\r
	CP 	B		;\r
	JR	Z,WC4		;\r
	INC	E		;\r
	BIT	5,E		;20H IS MAX REPEAT\r
	JR	Z,WC31		;\r
	CALL	WERR2 		;\r
	RET			;\r
\r
;TX/RX LOWER ADDR PART OF WRLH, NO HS TO PAM 120\r
;WAIT UNTILL WPC HS IS REMOVED\r
WC4	LD	E,0		;\r
WC41	LD	A,120D		;PAM 120\r
	CALL	WCATX		;TX1\r
	LD	A,(IY+02H)	;ADDR WITHOUT HS\r
	LD	B,A		;SAVE FOR COMPARE\r
	CALL	WCATX		;TX2\r
	CALL	WCARX		;RX1\r
	LD	A,(IY+06H)	;RX DATA\r
	PUSH	AF		;\r
	CALL	WCARX		;RX2\r
	POP	AF		;\r
	CP	B		;\r
	JR	Z,WC5		;\r
	INC	E		;\r
	BIT	5,E		;\r
	JR	Z,WC41		;\r
	CALL	WERR2		;\r
\r
WC5	RET			;TO ACTUAL W_PAR\r
\r
\r
\r
;*** ERRCW ************************************************************\r
;DIV ERROR ROUTINES\r
;**********************************************************************\r
\r
	 \r
\r
	PUBLIC	ERRD,CERR1,CERR2,WERR1,WERR2\r
\r
;REGISTERS:	E ERROR COUNTER\r
\r
;DETERMINE CCA OR WPC TYPE\r
;ONLY USED BY TTXE,TRXF\r
ERRD\r
	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD 	A,(IY+07H)	;GET CCA/WPC ID\r
	CP	04H		;CCA ID\r
	JP	Z,CERR2		;\r
	CP	08H		;WPC ID\r
	JP	Z,WERR2		;\r
\r
;CCA COMMUNICATION ERROR, RX UNEQUAL TX, BIT 2 SET IN COMMAND BYTE\r
CERR1\r
T09	LD	E,0		;CLEAR E\r
	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	(IY+0BH),01H	;SET ERR CTRL INFO\r
	LD	IX,CCA_TA	;CCA_TABLE_ADDRESS\r
	LD	(IX+00H),04H	;COMMUNICATION ERROR\r
;	LD	(IX+07H),02	;RX UNEQUAL TX\r
	RET			;\r
\r
;CCA COMMUNICATION NOT ESTABLISHED, BIT 0 SET IN COMMAND BYTE\r
CERR2\r
T0A	LD 	E,0		;\r
	LD	IY,WPC_TA	;\r
	LD	(IY+0BH),01H	;\r
	LD	IX,CCA_TA	;\r
	LD	(IX+00H),04H	;COMMUNICATION NOT ESTABLISHED\r
;	LD	(IX+07H),0	;COMMUNICATION ERROR\r
	RET			;\r
\r
;WPC COMMUNICATION ERROR, RX UNEQUAL TX, BIT 2 SET IN COMMAND BYTE\r
WERR1\r
T0B	LD	E,0		;\r
	LD	IY,WPC_TA	;\r
	LD	(IY+0BH),01H	;\r
	LD	IX,WCA_TA	;\r
	LD	(IX+00H),03H	;WPC COMMUNICATION ERROR\r
	LD	(IX+07H),02H	;COMMUNICATION ERROR\r
	RET			;\r
\r
;WPC COMMUNICATION NOT ESTABLISHED, BIT 0 SET IN COMMAND BYTE\r
WERR2\r
T0C	LD	E,0		;\r
	LD	IY,WPC_TA	;\r
	LD	(IY+0BH),01H	;\r
	LD	IX,WCA_TA	;\r
	LD	(IX+00H),03H	;WPC COMMUNICATION ERROR\r
	LD	(IX+07H),0	;COMMUNICATION NOT ESTABLISHED\r
	RET			;\r
\r
\r
\r
;*** WCATX ************************************************************\r
;SEND ONE BYTE\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	WCATX\r
\r
WCATX\r
T0D	LD	IY,WPC_TA	;\r
	LD	(IY+05H),A	;SAVE DATA TO BE SEND\r
	CALL	RCD		;RESET COMMAND DECODER\r
	CALL	TTXE1		;TEST IF TX EMPTY\r
	CALL	TXBY		;LOAD AND TX ONE BYTE\r
	RET			;TO C/WCOMM1\r
\r
\r
;*** RCD *************************************************************\r
;SUB MODULE CALLED FRO WCATRC\r
;RESET COMMAND DECODER\r
;3 TO 8 BIT DECODER + CLK\r
;COMM CRTL INPUTS: OPC0 TO OPC3\r
;PRODUCE A LOW SQUARE PULSE\r
;*********************************************************************\r
\r
	CSEG\r
	PUBLIC	RCD\r
\r
RCD\r
T0E	LD	C,22H		;LOAD POINTER\r
	LD	A,0F0H		;SET LOWER NIBBLE LOW\r
	OUT	(C),A		;PORT C\r
	LD 	A,0F8H		;SET BIT 3\r
	OUT	(C),A		;PORT C\r
	RET			;\r
\r
\r
\r
;*** TTXE1 *************************************************************\r
;TEST IF TX EMPTY, CALLED FROM WCATX\r
;***********************************************************************\r
\r
	 \r
	PUBLIC	TTXE1\r
\r
TTXE1\r
T0F	LD	IY,WPC_TA	;\r
	LD	C,22H		;LOAD POINTER, PORT C\r
	IN	A,(C)		;GET DATA, ICP4=1\r
	BIT	4,A		;TEST IF BIT 4=1, THEN Z=0\r
	RET	NZ		;IF TX EMPTY RET TO WCATX\r
	DI			;\r
	LD	(IY+00H),01H	;TEST EVERY 8. MS\r
	LD	(IY+01H),0	;MAX TIME CA 8 MS\r
	EI			;\r
	PUSH	BC		;\r
\r
	LD	HL,SYSRAM+400H+14D*8	;OPEMAC\r
	DI				;\r
	LD	(SYSRAM+0E4H),HL	;\r
	CALL	SUB_WAIT		;QUEUE 14 USED\r
\r
	POP	BC		;REPEAT TEST OF TX\r
	IN	A,(C)		;ICP4\r
	BIT	4,A		;\r
	RET	NZ		;TO WCATX\r
	CALL	ERRD		;ERR ROUTINE\r
	RET			;TO WCATX\r
\r
\r
\r
;*** TXBY ************************************************************\r
;SEND ONE BYTE INCL STROBE TO UART\r
;*********************************************************************\r
\r
	PUBLIC	TXBY\r
\r
TXBY\r
T11	LD	IY,WPC_TA	;\r
	LD	C,22H		;LOAD POINTER, PORT C\r
	LD	A,0F5H		;MODE COMMAND\r
	OUT	(C),A   	;LOAD UART TX\r
	LD	C,20H		;LOAD POINTER, PORT A\r
	LD	A,(IY+05H)	;LOAD DATA TO BE SEND\r
	OUT	(C),A		;\r
	LD	C,22H		;LOAD POINTER, PORT C\r
	LD 	A,0FDH		;LOAD UART TX + UART STROBE\r
	OUT	(C),A		;TX IS EXECUTED\r
	RET			;TO WCATX\r
\r
\r
\r
;*** WCARX ************************************************************\r
;RECEIVE ONE BYTE\r
;**********************************************************************\r
\r
	 \r
	PUBLIC	WCARX\r
\r
WCARX\r
T12	LD	IY,WPC_TA	;\r
	CALL	RCD		;RESET COMMAND DECODER\r
	CALL	TRXF1		;TEST IF RX FULL\r
	CALL	PURC		;POINT AT UART AND CLK\r
	CALL	RXBY		;RECEIVE ONE BYTE\r
	LD	(IY+006H),A	;SAVE RX DATA\r
	RET			;TO C/WCOMM1\r
\r
\r
\r
;*** TRXF1 **********************************************************\r
;TEST IF UART RX FULL.  TRUE: JMP TO RXBY, I E RECEIVE BYTE\r
;			FALSE: WAIT CA 20 MSEC, THEN ERR REPORT\r
;********************************************************************\r
\r
	 \r
	PUBLIC	TRXF1\r
\r
TRXF1\r
T13	LD	IY,WPC_TA	;WPC_TABLE_ADDRESS\r
	LD	C,22H		;POINTER PORT C\r
	IN	A,(C)		;GET COMMAND NIBBLE, IPC5\r
	BIT	5,A		;IF RX FULL BIT 5=1, Z=0\r
	RET	NZ		;IF RX FULL, RET TO WCARX\r
	DI			;\r
	LD	(IY+00H),04H	;TEST FROM OPEMAC EVERY 8. MS\r
	LD	(IY+01H),0	;MAX TIME CA 32MS\r
	EI			;\r
	PUSH	BC		;\r
\r
	LD	HL,SYSRAM+400H+14D*8	;\r
	DI				;\r
	LD	(SYSRAM+0E4H),HL	;\r
	CALL	SUB_WAIT		;OPEMAC QUEUE 14\r
\r
	POP	BC		;\r
	IN	A,(C)		;\r
	BIT	5,A		;\r
	RET	NZ		;\r
	CALL	ERRD		;ERR ROUTINE\r
	RET			;TO WCARX\r
\r
\r
\r
;*** PURC ************************************************************\r
;POINT AT UART READ AND CLK\r
;*********************************************************************\r
\r
	 \r
	PUBLIC	PURC\r
\r
PURC\r
T14	LD	C,22H		;SET POINTER\r
	LD	A,0F6H		;UART COMMAND READ\r
	OUT	(C),A		;\r
	LD 	A,0FEH		;CLK UART\r
	OUT	(C),A		;\r
	RET			;TO WCARX\r
\r
\r
\r
;*** RXBY ************************************************************\r
;RECEIVE BYTE FROM UART\r
;*********************************************************************\r
\r
	 \r
	PUBLIC	RXBY\r
\r
RXBY\r
T15	LD	C,21H		;POINTER PORT B\r
	IN	A,(C)		;GET BYTE\r
	RET			;WCARX\r
\r
\r
\r
;*** TIMER1 *************************************************************\r
;TIMER USED OF TTXE1, CALLED FROM OPEMAC\r
;************************************************************************\r
\r
	PUBLIC	TIMER1\r
\r
TIMER1					;\r
T16	LD	IY,WPC_TABLE_ADDRESS	;\r
	LD	L,(IY+00H)		;LOADED FROM TTXE1\r
	LD	H,(IY+01H)		;DO\r
	LD	A,L			;\r
	OR	H			;IF ZERO, Z=1\r
	RET	Z			;TO OPEMAC\r
	DEC	HL			;\r
	LD	(IY+00H),L		;\r
	LD	(IY+01H),H		;\r
	LD	A,L			;\r
	OR	H			;\r
	RET	NZ			;\r
	LD	HL,SYSRAM+400H+14D*8	;#QHEAD=14\r
	CALL	SUB_SIGNAL		;QUEUE 14\r
	RET				;TO OPEMAC\r
\r
\r
\r
;***********************************************************************\r
;		WCA DRIVER TABLE\r
;***********************************************************************\r
\r
	DSEG\r
	LIST	S\r
	PUBLIC	WPC_TABLE_ADDRESS\r
\r
WPC_TABLE_ADDRESS\r
\r
T17	DW	1		;TIMER1 LOWER BYTE		0000H\r
				;TIMER1 UPPER BYTE		0001H\r
	DS	1		;WRLH LOWER ADDR BYTE		0002H\r
	DS	1		;WRLH UPPER ADDR BYTE		0003H\r
	DS	1		;WPC DATA			0004H\r
	DS	1		;TX DATA			0005H\r
	DS	1		;RX DATA			0006H\r
	DS	1		;CCA/WPC ID			0007H\r
	DS	1		;POINTER			0008H\r
	DS	1		;CCA SWITCH DATA		0009H\r
	DS	1		;STROBE				000AH\r
	DB	1		;ERR CTRL INFO			000BH\r
\r
	END\r