File: TU58NS.PA of Tape: OS8/OS8-V40/v40-9
(Source file text) 

/TU58NS NON-SYSTEM HANDLER - ASYNC LINK
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1980 BY DATAPLAN GMBH, LAUDA, BRD
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DATAPLAN GMBH.
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR ANY ERRORS THAT MAY
/APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DATAPLAN'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DATAPLAN.
/
/DATAPLAN GMBH ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DATAPLAN.
/
/
/
/
/
/
/
/
/
/
/WVDM - DP - ZUERICH - 1-JAN-80
/DEFINITIONS OF ASYNC IOT'S

TUVER=	"M&77

DEVR=	360	/DEVICECODE OF RECEIVE CHANNEL
DEVT=	370	/DEVICECODE OF TRANSMIT CHANNEL

KCFX=	6000+DEVR	/CLEAR RECEIVE FLAG
KSFX=	6001+DEVR	/SKIP ON RECEIVE FLAG
KCCX=	6002+DEVR	/CLEAR RECEIVE FLAG, CLEAR AC
KRSX=	6004+DEVR	/OR IN RECEIVE CHAR
KIEX=	6005+DEVR	/SET/CLEAR INTENA
KRBX=	6006+DEVR	/JAM IN RECEIVE CHAR, CLEAR FLAG
TSFX=	6001+DEVT	/SKIP ON TRANSMIT FLAG
TCFX=	6002+DEVT	/CLEAR TRANSMIT FLAG
TLSX=	6006+DEVT	/CLEAR FLAG, SEND CHAR


/NOTES ON THIS HANDLER:

/THIS HANDLER READS AND WRITES THE TAPE IN "12-BIT" MODE, IN WHICH
/ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. A TU58 DECTAPE II
/CONTAINS 512 OS/8 BLOCKS UNDER THIS METHOD


AC0002=CLL CLA CML RTL		/SET AC TO 0002
AC0004=CLL CLA IAC RTL		/SET AC TO 0004
AC4000=CLL CLA CML RAR		/SET AC TO 4000
AC7776=CLL CLA CMA RAL		/SET AC TO 7776
AC7775=CLL CLA CMA RTL		/SET AC TO 7775
/
/BUILD DATA
	*0
/
	-2		/TWO ENTRY POINTS
	DEVICE	TU58	/DEVICE GROUP NAME
	DEVICE	TUA0	/ENTRY POINT NAME
	4370		/CODE FOR TU58 TYPE
	TUA0&177+4000	/ENTRY POINT OFFSET
	0
	0
	DEVICE	TU58	/DEVICE GROUP NAME
	DEVICE	TUA1	/ENTRY POINT NAME
	4370		/CODE FOR TU58 TYPE
	TUA1&177+4000	/ENTRY POINT OFFSET
	0
	0
	*200
/
/  INIT CODE
/
INIGO,	HLT		/ADDR OF SECOND PAGE AT INIT TIME
LCDI0,	CIF CDF 0	/SET DF TO ZERO FOR INDIRECTS
CNT1,	JMS I	INIGO	/GO TO SECOND PAGE TO INIT
/
/  LIST OF VECTORS TO SECOND PAGE
/
LCOMAN,	COMAND-.
LCHKS,	CHKSEN-.
LPACK,	PACKG-.
LACK,	ACK-.
LSEND,	SEND-.
LWRITE,	WRITE2-.
LGETC,	TUGET-.
LCC,	CHKCHK-.
VCOUNT=LCOMAN-.		/FALLS THRU TO NEXT, HERE IS VECTOR COUNT
/
BUFF1,	JMP	INIEND	/THIS IS POINTED AT BY LLBUF
/
WRITE,	TAD	BUFCDF	/BUFFER FIELD IN AC
	JMS I	LWRITE	/ON END WILL RETURN TO 'ENDPACK'
	SNA CLA		/IS IT END OR DATA?
	JMP	ENDPCK	/COULD ALSO BE DATA !NO ROOM!
ERROR,	ISZ	RETRY	/3 TRIES FOR ASYNC LINE
	JMP	BREAK	/INITIALIZE TU58
FATAL,	AC4000		/SET ERROR STATUS
	JMP	EXIT	/BAD, ERROR RETURN
/
COMAND,	2		/READ/WRITE PACKET SKELETON
	12		/BYTE COUNT
FN,	2		/READ/WRITE : 2/3
	0		/MODIFIER
UNIT,	0		/OR 1
	0
BRKCNT,	0		/RETURNS TO 0
	0
	0		/LOW ORDER BYTE COUNT
PAGES,	0		/REALLY HIGH-ORDER BYTE COUNT
BLKL,	0		/LOW ORDER BLOCK NUMBER
BLKH,	0		/HIGH ORDER BLOCK NUMBER
LCDF0,	CDF 0		/CDF FOR NEGATIVE ENDPACKET
/
RBEGIN,	JMS I	LGETC	/GET BYTE COUNT
	CIA
	DCA	CNT1	/STORE AS COUNTER
RLOOP,	JMS I	LGETC	/GET EVEN BYTE
	MQL		/IN LOW ORDER
	JMS I	LGETC	/GET ODD BYTE
	BSW		/IN HIGH ORDER
	MQA		/MERGE
BUFCDF,	HLT		/TO BUFFER FIELD
	DCA I	BUFF1	/STORE 12-BIT
	ISZ	BUFF1	/NEXT LOC
L70,	70		/SKIP PROTECTION
	ISZ	CNT1	/2 BYTES PER WORD
	ISZ	CNT1	/MORE FROM THIS PACKET?
	JMP	RLOOP	/YES
	JMS I	LCC	/VERIFY CHECKSUM, IF ERROR TO ERROR
	JMP	ERROR	/GOTJA
READ,	JMS I	LACK	/GET FLAG: DATA OR END
	SZA CLA		/WAS IT END OR DATA?
	JMP	ERROR	/WAS CONTINUE OR RUBBISH
	SNL		/WAS IT DATA?
	JMP	RBEGIN	/YES, START READING
ENDPCK,	JMS I	LGETC	/IGNORE BYTE COUNT
	JMS I	LGETC	/IGNORE ENDPACKET ID
	JMS I	LGETC	/GET ERROR STATUS
	CLL RAR		/DON'T LOOK AT RETRIES
	SZA CLA		/ERROR?
	JMP	ERROR	/TRY SOME MORE?
	ISZ	TUA0	/OK, NO ERROR
EXIT,	HLT
	JMP I	TUA0	/RETURN TO USER
/
	IFZERO	.&177-101&4000	<_ERROR_>
/
/  ENTRY POINTS ARE AT 100, 104
/
	*.&7600+100
/
TUA0,	TUVER
	CLA CLL
	JMP	TUCOM	/JUMP TO COMMON START
L3700,	3700
/
BUF,
TUA1,	TUVER
	CLA CLL CML	/SET LINK=1
	TAD	TUA1	/GET ARG POINTER UNIT 1
	DCA	TUA0	/MAKE TUA0 COMMON POINTER
TUCOM,	RAL		/GET UNIT FROM LINK. ALSO CONSTANT X004
	DCA	UNIT	/SET UNIT TO 0 OR 1
	RDF		/GET CALLER'S FIELD
	TAD	LCDI0	/BUILD CIF CDF
	DCA	EXIT	/STORE FOR RETURN
	AC4000		/SET LINK=0, AC=4000
	TAD I	TUA0	/CARRY READ-WRITE BIT TO LINK
	AND	L70	/KEEP FIELD FOR BUFFER
	TAD	LCDF0	/MAKE CDF TO BUFFER FIELD
	DCA	BUFCDF	/PLACE INTO I/O LOOP
	IAC RAL		/MAKE FUNCTION CODE, 3=WRITE, 2=READ
	DCA	FN	/IN MESSAGE
	TAD I	TUA0	/MAKE LOOP CONTROL COUNT
	AND	L3700
	SNA
	AC4000		/40 PAGES FOR WHOLE FIELD
	BSW
	DCA	PAGES	/NUMBER OF PAGES IN MESSAGE
	ISZ	TUA0	/NEXT
	TAD I	TUA0	/IS BUFFER ADDRESS
	DCA	BUF
	ISZ	TUA0	/NEXT
	TAD I	TUA0	/GET BLOCK NUMBER
	ISZ	TUA0	/MOVE POINTER TO ERROR EXIT
	SPA		/IF NEGATIVE ERROR
	JMP	FATAL	/SOMEBODY IS HAVING FUN
	DCA	BLKL	/SAVE BLOCK# (ALSO LOW-ORDER WHEN MASKED)
	TAD	BLKL	/PICK OUT HIGH-ORDER
	CLL RTR		/SHIFT TO 6-BIT BOUNDARY
	AND	L3700	/TAKE WHAT'S LEFT
	BSW		/AND POSITION RIGHT JUSTIFIED
	DCA	BLKH	/SAVE HIGH ORDER BLOCK
INIEND,	JMP	INIT	/GETS WIPED OUT
	AC7775		/STORE -3
	DCA	RETRY	/FOR ERROR RETRIES
BREAK,	TLSX		/NOW GENERATE A BREAK
	ISZ	BRKCNT	/24MS... GOOD FOR ALL BAUD RATES
	JMP	.-2	/4096*6MMS ON A PDP8-A
	AC0004		/SEND INIT=4 TWO TIMES
	JMS I	LSEND
	AC0004		/AGAIN
	JMS I	LSEND	/'ACK' RESETS DATA-FIELD
	JMS I	LACK	/WAIT FOR ^P CONTINUE RESPONSE
	JMP	BREAK	/SOMETHING WRONG, TRY AGAIN
	TAD	LCOMAN	/NOW SEND COMMAND PACKET
	JMS I	LPACK	/PACKG SETS CHECKSUM TO 0
	JMS I	LCHKS	/SEND CHECKSUM OF PACKET
	TAD	BUF	/'BUF' IS UNCHANGED
	DCA	BUFF1	/RESET BUFFER POINTER
	TAD	FN	/IS IT READ OR WRITE?
	RAR		/WRITE IS 3: SETS LINK
	SNL CLA
	JMP	READ	/NO, IS READ
	JMP	WRITE	/YES, WRITE
/
	*.&7600+176	/FORCE TO END OF PAGE
/
INIT,	DCA	INIEND	/KILL 'JMP INIT'
RETRY,	JMS	INIGO	/LEAVE ADDR OF SECOND PAGE
/
/
/  VARIABLES, ALSO INIT CODE LIVES HERE
/
/
LLBUF,	0		/THIS CONTAINS ADDRESS OF 'BUFF1'
CHECKH,	0		/HIGH ORDER CHECKSUM
CHECKL,	0		/LOW ORDER CHECKSUM
FLIPPY,	0		/HIGH-LOW FLIPFLOP
BUFF2,	0		/PAGE 2 BUFFER POINTER
CNT2,	0		/PAGE 2 BYTE COUNTER
TEMP,	0		/STRING POINTER
CHAR,	0		/IN OR OUT CHAR
/
	IFNZRO	.&177-10&4000	<_ERROR>	/ENOUGH ROOM FOR INIT?
/
	*.&7600
/
/  INIT TIME:  FILL VECTOR TABLE
/
THERE,	0		/FILLED BY JMS, POINTS TO VECTOR
ILOOP,	TAD	THERE	/POINTER IS ALSO OFFSET!
	TAD I	THERE	/MAKING VECTOR
	DCA I	THERE
	ISZ	THERE	/MOVE TO NEXT VECTOR
	ISZ	TUGET	/CONTROL COUNT ON THIS PAGE
	JMP	ILOOP
	JMP I	THERE	/BACK TO FIRST PAGE
/
	XYZ=(77		/FOR L377
/
/  CHECK FOR CONTROL C, WAIT FOR CHAR FROM TU58
/
TUGET,  VCOUNT          /INIT COUNTER
LLCDF0, CDF     0       /DATA FIELD HERE IN CASE CONTROL C TO MONITOR
	KCCX		/CLEAR AC AND KILL OLD CHARS
TSTTU, 	KSFX		/IS TU58 TALKING?
        JMP     TSTTT   /NOPE, GO CHECK TTY
	KRBX		/YES, GET CHARACTER
	JMS	CHECKS	/CHECKSUM IT
	TAD	CHAR	/GET CHAR BACK (MASKED)
	JMP I	TUGET	/OR RUBBISH
TSTTT,	TAD     L7600   /FORCE TOP BITS TO BE 1 TO ELIMINATE 3,203
        KRS             /AMBIGUITY ON TEST
        TAD     L175    /IS IT A CONTROL C
        SNA CLA         /SKIP IF NOT
/	KSF             /SKIP IF A TTY CHARACTER HAS HAPPENED
        JMP I   L7600   /EXIT TO MONITOR !SORRY NO FLAG CHECK!
	JMP	TSTTU	/NO, GO CHECK FOR TU58 CHAR
/       JMP I   L7600   /EXIT TO MONITOR
/
SEND,	0		/SEND A CHAR TO TU58
	TSFX
	JMP	.-1	/FLAG WAS SET BY BREAK
	TLSX
	JMS	CHECKS
	JMP I	SEND

CHECKS,	0
	AND	L377
	DCA	CHAR	/SAVE CHAR FOR 'TUGET'
	TAD	CHAR
	CLL		/CLEAR LINK FOR OVERFLOW
	ISZ	FLIPPY	/HIGH OR LOW-ORDER?
	JMP	CLOW	/LOW ORDER FIRST (FLIPPY STARTS 0)
CHI,	TAD	L7400	/TRANSPORT OVERFLOW TO LINK
	TAD	CHECKH	/ACCUMULATE HIORD CHECKSUM
	AND	L377	/KEEP ONLY 8 BITS
	DCA	CHECKH	/UPDATE IT AND ROTATE LINK INTO
	RAL		/AC, IF ZERO 'CLOW' IS NOP
CLOW,	TAD	L7400	/IF LINK WAS NON-ZERO, THEN
	TAD	CHECKL	/MAKE END-AROUND CARRY
	AND	L377	/AGAIN KEEP ONLY 8-BITS
	DCA	CHECKL	/AND ACCUMULATE LOWORD CHECKSUM
	RAL		/ROTATE OVERFLOW INTO AC
	SZA		/DID THIS OVERFLOW?
	JMP	CHI	/YES, MAKE BYTE TO BYTE CARRY
CEX,	TAD	FLIPPY	/LOW: 1 TO -1
	CIA		/HI : 0 TO  0
	DCA	FLIPPY	/FLIPFLIPPY
	JMP I	CHECKS
/
/
ACK,	0		/CHECK IF CONTINUE, DATA OR END
	DCA	CHECKL
	DCA	CHECKH
	DCA	FLIPPY	/IN CASE OF CHECKSUM ACCUMULATION
	JMS	TUGET
	TAD	(-20	/IS IT 'CONTINUE'?
	SNA
	JMP	ACKEX	/YES
	TAD	(20-1	/CODE - 1
	CLL RAR		/DATA: AC=0,L=0  END: AC=0,L=1
	SKP		/ALL OTHER CODES AC NE 0
ACKEX,	ISZ	ACK	/SECOND RETURN IS CONTINUE
	JMP I	ACK
/
CHKCHK,	0		/CHECK RECEIVE CHECKSUM
	TAD	CHECKH
	DCA	TEMP	/SAVE A WHILE (GETS DESTROYED)
	JMS	TUGET	/GET LOW-ORDER CHECKSUM
	JMS	TUGET	/GET HI-ORDER CHECKSUM
	CIA		/SORRY! ONLY CHECKING HIGH-ORDER!
	TAD	TEMP	/COMPARE TO ACCUMULATED
	SNA CLA		/OK?
	ISZ	CHKCHK	/YES, SECOND RETURN
	JMP I	CHKCHK
/
CHKSEN,	0		/SEND SEND-CHECKSUM
	TAD	CHECKH
	DCA	TEMP	/SAVE FOR SAME REASON
	TAD	CHECKL
	JMS	SEND	/SEND LO-ORDER
	TAD	TEMP
	JMS	SEND	/SEND HI-ORDER
	JMP I	CHKSEN
/
PACKG,	0
	DCA	TEMP	/STORE STRING ADDRESS
	DCA	CHECKL	/INITIALIZE CHECKSUM
	DCA	CHECKH
	DCA	FLIPPY	/SET TO LOW ORDER
PCKLP,	TAD I	TEMP
	SPA		/- IS END OF STRING
	JMP	L7600
	JMS	SEND
	ISZ	TEMP
	JMP	PCKLP
L7600,	7600
	JMP I	PACKG
/
/
WRITE2,	0
	DCA	BCDF2	/STORE CDF BUFFER
DATA,	1		/DATA PACKET
	TAD I	LLBUF	/GET BUFFER POINTER AND 200 BYTE COUNT
L7400,	7400		/END PACKET AND NOP
	DCA	BUFF2	/STORE HERE
WACK,	JMS	ACK	/WAIT FOR 'CONTINUE', RESET CDF 0
	JMP I	WRITE2	/SOMETHING ELSE, END PACKET?
	TAD	LLBUF	/CONTENT: BUFF1,
	TAD	(DATA-BUFF1	/RELOCATES 'DATA'
	JMS	PACKG	/SEND 'DATA' PACKET, CLEAR CSUM
	TAD	L7600	/-200 FOR
	DCA	CNT2	/BYTE COUNT SET
BCDF2,	HLT		/BUFFER FIELD
	TAD I	BUFF2	/GET WORD
L377,	AND	(77	/ONLY 6-BIT BYTE
	JMS	SEND	/LOW ORDER FIRST
	TAD I	BUFF2
	BSW
	AND	(77	/THEN HIGH ORDER
	JMS	SEND
	ISZ	BUFF2	/NEXT LOC
L175,	175		/PROTECTION
	ISZ	CNT2
	ISZ	CNT2	/PACKET DONE?
	JMP	BCDF2	/NOT YET
	JMS	CHKSEN	/SEND CHECKSUM
	JMP	WACK	/MORE TO DO?
/

        PAGE
	$-$-$