DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

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

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦e977c69bc⟧

    Length: 27114 (0x69ea)
    Notes: pts_type(SC)
    Names: »DRTC01.SC«

Derivation

└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
    └─⟦this⟧ »TOSSWORK/DRTC01.SC« 
└─⟦781e933ac⟧ Bits:30009686 Philips computer tape "600310"
    └─⟦this⟧ »M:92T1/DRTC01.SC« 

PTS(SC)

	IDENT DRTC01 	REL 9.2 79-11-16  870105040920 

			=2, INTERFACE UNKNOWN HANG-UP
			REL 9.1 79-11-02 
			=1,SKIP LEADER BIT WHEN BOT
			REL 9.1 79-05-23 
* 
* 
******************************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRTC01 = DRIVER TAPE CASSETTE RECORDER
* 
* 
* 
* 
* 
* 
******************************************************* 
* 
* 
*   THIS DRIVER HANDLES ONE OR TWO TAPE CASSETTE RECORDERS
*   CONNECTED TO CPU VIA CHCR-DCR 
* 
*   ONLY ONE RECORDER CAN BE BE OPERATED AT A TIME, EXCEPT
*   AT REWIND AND UNLOAD
* 
*   DATA IS RECORDED IN BLOCKS WITH LENGTHS FROM 2 TO 
*   256 CHARACTERS
* 
	EJECT			DRTC01 
* 
* 
*   THE DRIVER CONSISTS OF THE FOLLOWING PARTS: 
* 
*   T C D A :	ACTIVATION PART 
* 
*   I H T C :	INTERRUPT HANDLER 
* 
*   R C O V E R :	RECOVERY ROUTINE
* 
*   D W T C 0 1 :	DEVICE WORK TABLE 01
* 
*   D W T C 0 2 :	DEVICE WORK TABLE 02
* 
*   AND  O R D E R  P R O C E S S O R S 
* 
* 
*   THE FOLLOWING ORDERS ARE TREATED: 
* 
*   ORDER /00:	TEST STATUS
*         /02:	READ 
*         /05:    WRITE 
*         /06:    WRITE 
*         /22:	WRITE TAPE MARK
*         /26:    LOCK
*         /31:	REWIND 
*         /33:    REVERSE 
*         /24:    ERASE 
*         /37:	LOAD 
*         /38:	UNLOAD 
* 
	EJECT			DRTC01 
* 
* 
*   THE FOLLOWING RETURN CODES ARE USED:
* 
*	BIT 0  REQUEST ERROR
*	    1  LEADER 
*	    2  BOT MISSING
*	    3  TAPE MARK DETECTED 
*	    4  NO DATA/ERASED 
*	    5  BOT/EOT HOLE 
*	    6  WRITE PROTECTED
*	    7  B-SIDE 
*	    9  REWIND TIME-OUT
*	   11  SEQUENCE ERROR 
*	      -READ SEQUENCE ERROR
*	      -POSITION OF TAPE UNSUCCESSFULL AT WRITE RECOVERY 
*	      -POWER RECOVERY WHEN SEQ. COUNTER NOT USED
*	      -POWER RECOVERY NOT SUCCESSFULL 
*	   12  INCORRECT LENGTH 
*	   13  CRC ERRROR 
*	   14  THROUGHPUT ERROR 
*	   15  NOT OPERABEL 
* 
	EJECT			DRTC01 
* 
* 
*   NORMAL USAGE OF REGISTERS:
* 
*   REGISTER A1:	RETURN CODE
*            A2:	SST STATUS 
*            A3:	DWT STATUS AFTER SST 
*            A4:	RETRY COUNTER
*            A5:  SEQUENCE CHARACTER AFTER READ/WRITE 
*            A6:	DWT ADDRESS
*            A8:	SUBROUTINE STACK 
* 
* 
*   SYSTEM ADAPTATION:
* 
*   BY MEANS OF CONDITIONAL ASSEMBLY THE DRIVER CAN BE
*   REDUCED TO HANDLE:
* 
*  -ONLY ONE CASSETTE RECORDER
*  -ORDERS REVERSE, ERASE AND LOCK EXCLUDED 
* 
	EJECT			DRTC01 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	IHTC	INTERRUPT ADDRESS 
	ENTRY	DWTC01	DWT FOR CASSETTE RECORDER 01
	ENTRY	DWTC02	DWT FOR CASSETTE RECORDER 02
	ENTRY	TCDRON	POWER UP RECOVERY 



* 
* 
********************************
* EXTERNAL TOSS MODULE ENTRIES *
********************************
* 
* 
	EXTRN	TDISP	DISPATCHER MAIN ENTRY
	EXTRN	SAVE8	DISPATCHER SAVE REGS 1-8 SUBROUTINE
	EXTRN	SWLXY	SWITCH TO LEVEL XY 
	EXTRN	RETUR8	DISPATCHER LOAD A1-A8 RETURN
	EXTRN	TENDIO	GLOBAL END-OF-I/O ROUTINE 
	EXTRN	DISEND	GO TO DISPATCHER VIA TENDIO 
	EXTRN	DISIOE	DISPATCHER I/O REQUEST ERROR ENTRY
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	INIFLG	INIT FLAG AT PGM LOADING
	EXTRN	ECBRL	REQUESTED LENGTH IN ECB
	EXTRN	ECBEL	EFFECTIVE LENGTH IN ECB
	EXTRN	ECBCW	CONTROL WORD IN ECB
	EJECT			DRTC01 
* 
* 
******************
* DWT PARAMETERS *
******************
* 
* 
	EXTRN	DWTST	DWT SOFTWARE STATUS: 
*			BIT # 0 - DEVICE AND CONTROLLER READY 
*			BIT #11 - TAPE MARK ENCOUNTERED ON LAST 
*			BIT #12 - REPOSITIONING AT RECOVERY 
*			BIT #13 - WRITE PROTECTED 
*			BIT #14 - A-SIDE
			BIT #15 - DEVICE LOCKED (OPERABLE) 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB ADDRESS 
	EJECT			DRTC01 
* 
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
*   THE DRIVER CAN BE REDUCED TO HANDLE ONLY ONE CASSETTE 
*   RECORDER BY SETTING X:A=1 
* 
X:A	EQU	1 
DBCAS	EQU	X:A 
* 
*   ORDERS REVERSE, ERASE AND LOCK MAY BE EXCLUDED
*   BY SETTING X:B=0
* 
X:B	EQU	0 
REVER	EQU	X:B 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
*   MMU BUFFER SIZE 
* 
X:C	EQU	129 
DVBLEN	EQU	X:C
* 
*   MMU DEVICE INDEX
* 
X:D	EQU	2 
DEVIND	EQU	X:D
* 
	EJECT			DRTC01 
* 
* CONSTANTS AND WORK AREAS
* 
	DATA	DVBLEN+DVBLEN	DEVICE DEPENDENT BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
TCAD	DATA	TCDA	ACTIVATION ENTRY 
	DATA	0	ABORT ROUTINE ADDRESS 
	RES	4	SUBROUTINE STACK 
STB	EQU	*-2 
* 
* 
TAB	DATA	/0031,/2237,/3802,/0506
	IFT	REVER=1
	DATA	/2633,/24FF 
	XIF
TABL	EQU	*-TAB
	EJECT			DRTC01 
* 
* 
*************************** 
* CHANNEL UNIT PARAMETERS * 
*************************** 
* 
* 
*  DEVICE ADDRESS:
* 
CHCRDA	EQU	/0E
* 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
RTRIES	EQU	3	MAX NO OF RETRIES
* 
PSUBS	EQU	5	POWER UP BACKSPACE NUMBER 
* 
PREAD	EQU	4	POWER UP READ NUMBER
* 
PINT	EQU	10	POWER UP RECOVERY BLOCK COUNT INTERVAL
* 
	IFT	REVER=1
PERAS	EQU	6	NO OF ERASE FOR ORDER /24 
	XIF
	EJECT			DRTC01 
* 
* 
*   T C D A 
* 
*   ACTIVATION PART : CHECK VALIDITY OF ORDERS AND START PROCESSING 
* 
* 
TCDA	EQU	*
	LDK	A1,0 
	LDK	A4,TABL-1
* 
TCDA10	CC	A7,TAB,A4	FIND  OUT IF LEGAL ORDER
	RF(E)	TCDA20	VALID ORDER 
	SUK	A4,1 
	RB(NN)	TCDA10	TRY NEXT 
* 
TCDA15	EQU	*
	ABL	DISIOE	ILLEGAL ORDER 
* 
TCDA20	ADR	A4,A4	DOUBLE TO GET INDEX
	ST	A4,TCDAX	SAVE INDEX 
	LD	A5,ECBRL,A8	GET REQUESTED LENGTH
	LD	A3,SEKBYT,A6	SEQUENCE COUNTER ? 
	RF(NE)	TCDA21	NO 
	ADK	A5,1	COMPENSATE FOR SEQUENCE CHARACTER 
* 
TCDA21	EQU	*
	LDR	A2,A3	RECOVERY/SEQUENCE ERROR STATUS 
	ANK	A2,2 
	RF(NZ)	TCDR10	YES
* 
	ADK	A5,1 
	NGR	A5,A5	MAKE REQUESTED LENGTH NEGATIVE 
	ST	A5,HELPME	SAVE IT FOR RECOVERY PURPOSES 
	SUK	A7,/37	LOAD ?
	RF(NE)	TCDA22	NO 
	LD	A3,ECBCW,A8	GET CONTROL WORD
	ANK	A3,1 
	ST	A3,SEKBYT,A6	INDICATE SEQ. COUNTER OR NOT 
* 
TCDA22	LD	A3,2,A8	GET BUFFER ADDRESS
	ST	A3,BUFADR	SAVE IT FOR RECOVERY PURPOSES 
	SUK	A4,14
	RF(Z)	TCDA23	WRITE 
	ADK	A4,2 
	RF(NZ)	TCDA25	NOT WRITE
* 
TCDA23	ADK	A5,3	CHECK REQUESTED LENGTH
	RB(P)	TCDA15	LESS THAN 2 CHARACTERS
	ADK	A5,254 
	RB(N)	TCDA15	MORE THAN 256 CHARACTERS
	SUR	A3,A5
	LD	A4,SEKBYT,A6	SEQ. COUNTING ?
	RF(NZ)	TCDA25	NO 
	LD	A2,DWTBKC,A6	GET SEQUENCE CHARACTER 
	SC	A2,255,A3	STORE IT IN BUFFER
* 
TCDA25	ST	A6,TCDADT	SAVE ACTIVE DWT 
	EJECT			DRTC01 
* 
* 
* SELECT RECORDER 
* 
* 
TCDA30	LDKL	A8,STB	LOAD STACK BASE
	CF	A8,SELECT	SELECT CASSETT
	CF	A15,SWLXY	SWITCH TO LEVEL XY
	LDR	A1,A2	SAVE STATUS
	LDK	A4,RTRIES	PRESET NUMBER OF RETRIES 
	LDKL	A2,0	GET FUNCTION INDEX 
TCDAX	EQU	*-2	**ORDER INDEX** 
	ABI	TCDFUN,A2	BRANCH TO FUNCTION 
TCDFUN	DATA	ENDIO,REWIND,TM,LOAD,UNLOAD,READ,WRITE,WRITE
	IFT	REVER=1
	DATA	OLOCK,REVERS,ERTAPE 
	XIF
* 
	EJECT			DRTC01 
* 
* 
* RECOVERY AFTER POWER ON 
* 
* 
TCDRON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LD	A1,INIFLG	CHECK IF PGM LOADING
	ABL(NZ)	TDISP	YES SKIP RECOVERY
	LDKL	A8,STB	LOAD STACK BASE
	LDKL	A6,DWTC01	FIRST DWT 
	CF	A8,RCOVER	RECOVERY
	IFT	DBCAS=2
	LDR*	A6,A6	GET OTHER DWT 
	CF	A8,RCOVER	RECOVERY
	XIF
	LDKL	A4,0	GET ACTIVE DWT 
TCDADT	EQU	*-2	**ACTIVATED DWT ADDRESS**
	RF(Z)	ENDIO	NO REQUEST GOING ON
	LDR	A6,A4	PUT DWT ADDRESS IN A6
	LD	A3,SEKBYT,A6	SEQ. COUNTING
	RB(Z)	TCDA30	YES; REACTIVATE ORDER 
* 
TCDR10	ANK	A3,1	JUSTIFY SEQ. INDICATOR
	ST	A3,SEKBYT,A6
	ORK	A1,/10	IND SEQUENCE ERROR, BIT #11 
	RF	ENDIO 
* 
	EJECT			DRTC01 
* 
*   R E A D 
* 
READ	CF	A8,READR	READ RECORD
	ANKL	A1,/400	SAVE EOT BIT
	ORR	A1,A2
	ANK	A2,/0E 
	RF(Z)	READ20	STATUS OK 
* 
READ15	SUK	A4,1	RECOVERABLE ERROR 
	RF(Z)	READ20	3 TRIALS DONE 
	CF	A8,BKSP	BACKSPACE ONE BLOCK 
	RB	READ 	READ AGAIN
* 
READ20	LDR	A2,A1
	SLL	A2,3	CHECK IF TAPE MARK
	RF(NN)	READ30	NOT TAPE MARK
* 
READ25	ORK	A3,/10	INDICATE TAPE MARK
	LDK	A7,0	RESET EFFECTIVE LENGTH
	RF	READ35	 
* 
READ30	LDR	A2,A1
	LDKL	A7,0	GET EFFECTIVE LENGTH 
EFFLEN	EQU	*-2	**EFFECTIVE LENGTH** 
	ANKL	A2,/801	NO DATA,NOT OP
	RF(NZ)	READ32
	LDR	A7,A7
	RF(NZ)	READ32	NOT EQUAL ZERO 
	LDR	A4,A4	THIRD TRIAL DONE 
	RB(NZ)	READ15	NO; READ SAME BLOCK AGAIN
	LDK	A4,1	SET NO OF RETRIES TO ONE
	RB	READ 	TRY NEXT BLOCK
* 
READ32	EQU	*
	ANK	A3,/2F	NOT TAPE MARK 
	LD	A2,SEKBYT,A6	SEQ. COUNTING ?
	RF(NE)	READ35	NO 
	SUK	A7,1	DECREMENT EFF. LENGTH COUNTER 
	CC	A5,DWTBKC+1,A6	CHECK SEQUENCE COUNTER 
	RF(E)	READ35	OK
	ORK	A1,/10	SEQUENCE ERROR
* 
READ35	IM	DWTBKC,A6	INCREMENT SEQUENCE COUNTER
* 
READ40	LD	A8,DWTECB,A6	GET ECB ADDRESS
	ST	A7,ECBEL,A8	SAVE EFFECTIVE LENGTH 
	LDK	A2,RTRIES
	SUR	A2,A4	GET NUMBER OF RETRIES PERFORMED
	ST	A2,ECBCW,A8	SAVE IT IN CONTROL WORD 
* 
READ50	EQU	*
	ST	A3,DWTST,A6	SAVE STATUS 
	EJECT			DRTC01 
* 
* 
* END OF I/O OPERATION
* 
* 
ENDIO	EQU	* 
	LDKL	A2,/400	BOT/EOT RETURN CODE	=1
	TM	A2,A1		=1 
	RF(Z)	ENDIO2	NOT BOT/EOT	=1
	ANKL	A1,/BFFF	RESET LEADER BIT	=1
ENDIO2	EQU	*		=1
	CM	TCDADT	INDICATE NONE ACTIVE DWT 
	IFT	DBCAS=2
	CF	A15,SWLXY	SWITCH TO LEVEL XY
	LDR*	A6,A6	GET OTHER DWT 
	CF	A15,TENDIO	PERFORM TENDIO FOR THIS
	LDR*	A6,A6	GET FIRST DWT 
	XIF
	CF	A15,SWLXY	SWITCH TO LEVEL XY
	ABL	DISEND	GO TO DISPATCHER VIA TENDIO 
* 
	EJECT			DRTC01 
* 
* 
*   WRITE TAPE MARK 
* 
TM	LDKL	A3,-1 
	ST	A3,HELPME 
* 
*   W R I T E 
* 
*   WRITE ONE BLOCK 
* 
* 
WRITE	LD	A3,DWTBKC,A6	GET BLOCK COUNTER 
	RF(NZ)	WRIT10	NOT FIRST BLOCK
	CF	A8,ERASE	MAKE ONE BLANK BLOCK 
	SUK	A4,1	DEC. NO OF RETRIES 1ST BLOCK
* 
WRIT10	CF	A8,WRITER	WRITE RECORD
	ANKL	A1,/400	SAVE EOT-BIT
	ORR	A1,A2
	ANK	A2,/0E 
	RF(Z)	WRIT30	STATUS OK 
* 
WRIT12	ST	A4,WRITA4	STORE RETRY COUNTER 
	LD	A2,SEKBYT,A6
	RF(Z)	WRIT15	SEQ. COUNTING 
* 
	EJECT			DRTC01 
* 
* 
	CF	A8,BKSP	BACKSPACE ONE BLOCK 
	LDK	A4,0	ONE ERASE 
	RF	WRIT20
* 
WRIT15	CF	A8,REPOS	POSITION TAPE
	CM	SEKBYT,A6	RESET SEQ. INDICATOR
	LD	A4,WRITA4	GET NO ...
	LDR	A2,A2
	RF(NZ)	WRIT40	POSITIONING NOT OK 
	SUK	A4,RTRIES	... OF ERASE 
* 
WRIT20	CF	A8,ERASE	ERASE
	ORR	A1,A2	SAVE EOT 
	ADK	A4,1	COUNT ERASE 
	RB(NG)	WRIT20	NOT READY
	LDKL	A4,0	GET RETRY COUNTER
WRITA4	EQU	*-2	**RETRY COUNTER**
	SUK	A4,1 
	RB(NZ)	WRIT10	TRY AGAIN
	ORR	A1,A2	3 TRIALS DONE,SET ERASE BIT #4 
	RF	WRIT50	GIVE UP
* 
	EJECT			DRTC01 
* 
* 
WRIT30	LD	A2,TCDAX	GET ORDER
	SUK	A2,4	TAPE MARK WRITTEN?
	RB(NZ)	READ30	NO 
	LDR	A2,A1	CHECK IF 
	SLL	A2,3	TAPE MARK OK
	RB(N)	READ25	YES 
	RB	WRIT12	NO 
* 
WRIT40	ORK	A1,/10	POSITIONING FAILED = SEQUENCE ERROR 
* 
WRIT50	LD	A7,EFFLEN	GET EFFECTIVE LENGTH
	RB	READ40
* 
	EJECT			DRTC01 
* 
* 
*   L O A D 
* 
*   LOAD CASSETTE 
* 
* 
LOAD	CF	A8,LOCK	LOCK CASSETTE 
	RF(Z)	REWIND	CASSETTE LOCKED 
LOAD10	LDR	A1,A2	NO CASSETTE
	RB	READ50
* 
* 
*   R E W I N D 
* 
*   REWIND TAPE 
* 
* 
REWIND	CM	DWTBKC,A6	CLEAR BLOCK COUNTER 
	CF	A8,SBOT	SEARCH BEGINNING OF TAPE
REW010	EQU	*
	LDR	A3,A2
	SRL	A3,7 
	ANK	A3,6 
	ORK	A3,1	PREPARE STATUS
	RB	LOAD10
* 
	EJECT			DRTC01 
* 
* 
*   U N L O A D 
* 
*   UNLOAD CASSETTE 
* 
* 
UNLOAD	CM	DWTST,A6	RESET STATUS 
	CF	A8,UNLD	UNLOAD CASSETTE 
UNLO10	LDR	A1,A2	SAVE RETURN CODE 
	RB	ENDIO 
	IFT	REVER=1
* 
* 
*   R E V E R S 
* 
*   BACKSPACE ONE BLOCK 
* 
* 
REVERS	CF	A8,BKSP	BACKSPACE 
	LDKL	A4,-1	DECREMENT BLOCK SEQ.
	ADS	A4,DWTBKC,A6	COUNTER BY ONE
	RB	UNLO10
* 
	EJECT			DRTC01 
* 
* 
*   E R T A P E 
* 
*   ERASE TAPE
* 
* 
ERTAPE	LDK	A4,PERAS	SET NO OF ERASE 
ERT10	CF	A8,ERASE	ERASE ONE BLOCK 
	ANKL	A1,/400	SAVE EOT BIT
	ORR	A1,A2	RETURN CODE
	SUK	A4,1 
	RB(NZ)	ERT10	ERASE NOT READY 
	RB	READ50
* 
* 
*   O L O C K 
* 
*   ORDER LOCK CASSETTE 
* 
* 
OLOCK	CF	A8,LOCK	LOCK CASSETTE
	RB(Z)	REW010	CASSETTE LOCKED 
	RB	LOAD10
	XIF
* 
	EJECT			DRTC01 
* 
* 
* CASSETTE COMMANDS 
* 
* 
* SELECT
* 
SELECT	EQU	*
	LDK	A2,/FF	LOAD MASK 
	ANS	A2,DWTST,A6	SET DWT BUSY 
	IFT	DBCAS=1
	LDK	A3,0	SELECT CODE 
	XIF
	IFT	DBCAS=2
	LDR*	A3,A6	GET OTHER DWT 
	ANS	A2,DWTST,A3	SET DWT BUSY 
	ANK	A3,1	GET SELECT CODE 
	XIF
* 
CRCOM	CIO	A3,1,CHCRDA	CIO START 
	RF(Z)	EXIT	ACCEPTED	=2 
	LDK	A1,1	ERROR 
	ABL	ENDIO
* 
* READ SEQUENCE CHAR TO A5
* 
READSQ	EQU	*
	LDK	A3,/A
	ST	A3,REQLEN	MAKE REQUESTED LENGTH > 0 
	RB	CRCOM 
* 
	EJECT			DRTC01 
* 
* READ ONE RECORD 
* 
READR	LDK	A3,/A 
READR1	CM	EFFLEN	RESET EFFECTIVE LENGTH 
	LDKL	A2,0	GET BUFFER ADDRESS 
BUFADR	EQU	*-2	**BUFADR** 
	ST	A2,TCDBA
	LDKL	A2,0	GET REQUESTED LENGTH 
HELPME	EQU	*-2	**HELPME** 
	ST	A2,REQLEN 
	RB	CRCOM 
* 
* WRITE ONE RECORD
* 
WRITER	LDK	A3,/B
	RB	READR1
* 
* ERASE ONE BLOCK 
* 
ERASE	LDK	A3,9
	RB	CRCOM 
* 
* LOCK CASSETTE 
* 
LOCK	LDK	A3,2 
	RB	CRCOM 
* 
	EJECT			DRTC01 
* 
* SEARCH BEGINNING OF TAPE
* 
SBOT	LDK	A3,8 
	RB	CRCOM 
* 
* REWIND TAPE AND UNLOCK CASSETTE 
* 
UNLD	LDK	A3,/F
	RB	CRCOM 
* 
* BACKSPACE ONE BLOCK 
* 
BKSP	LDK	A3,/E
	RB	CRCOM 
* 
	EJECT			DRTC01 
* 
* 
*   I H T C 
* 
*   INTERRUPT HANDLER : PROCESS OF INTERRUPT
* 
* 
IHTC	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	STR	A5,A15	SAVE A5 ON STACK
	SST	A5,CHCRDA
	RF(A)	SST	SST ACCEPTED 
	IM	REQLEN	INCREMENT COUNTER
	RF(Z)	CIOHLT 
	RF(P)	INRSQ	GET SEQUENCE COUNTER 
	STR	A3,A15	SAVE A3 ON STACK
	LDKL	A3,0	GET BUFFER ADDRESS 
TCDBA	EQU	*-2	**BUFFER ADDRESS**
	IM	TCDBA	INCREMENT BUFFER ADDRESS
	LD	A5,TCDAX	GET FUNCTION SWITCH FOR READ/WRITE 
	SUK	A5,10
	RF(NZ)	IHTC05	WRITE
* 
IHTC02	INR	A5,0,CHCRDA	READ CHAR. 
	SCR	A5,A3	STORE CHARACTER IN BUFFER
	RF	EXIT2 
* 
IHTC05	EQU	*
	LCR	A5,A3	GET CHAR FROM BUFFER 
	OTR	A5,0,CHCRDA	OUTPUT IT
	EJECT			DRTC01 
* 
* 
EXIT2	ST	A5,TCDA5 
 	IM	EFFLEN	INCREMENT EFFECTIVE LENGTH
	LDR*	A3,A15	RESTORE A3 AND A5 FROM STACK 
* 
EXIT3	LDR*	A5,A15 
	RTN	A15
* 
INRSQ	INR	A5,0,CHCRDA	READ CHAR TO A5 
	ST	A5,TCDA5
	RB	EXIT3 
* 
SST	ST	A5,TCDA2	SAVE STATUS 
	LDR*	A5,A15	RESTORE A5 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A1,0
TCDA1	EQU	*-2 
	LDKL	A4,0
TCDA4	EQU	*-2 
	LDKL	A5,0
TCDA5	EQU	*-2 
	LDKL	A6,0
TCDA6	EQU	*-2 
	LDKL	A8,0
TCDA8	EQU	*-2 
	EJECT			DRTC01 
* 
* 
	LDKL	A2,0	RESTORE STATUS 
TCDA2	EQU	*-2 
 	LDR	A3,A2	GET STATUS
	SLL	A3,9	SHIFT 
	ST	A3,2,A8	SAVE ON STACK 
	LD	A3,DWTST,A6	PUT DWT STATUS IN A3
* 
IHTRTN	EQU	*
	RTN	A8 
* 
CIOHLT	EQU	*
 	CIO	A1,0,CHCRDA	CIO-HALT
	RB	EXIT3 
* 
EXIT	ST	A1,TCDA1
	ST	A4,TCDA4
	ST	A5,TCDA5
	ST	A6,TCDA6
	ST	A8,TCDA8
 	ABL	TDISP	GO TO DISPATCHER
* 
	EJECT			DRTC01 
* 
* 
*   R C O V E R 
* 
*   RECOVERY ROUTINE : POSITIONING OF TAPE AT POWER ON
* 
* 
RCOVER	EQU	*
	CF	A8,SELECT	SELECT
	ANK	A3,1 
	RB(Z)	IHTRTN	NOT LOCKED: RETURN FROM RECOVERY
	CF	A8,LOCK 
	RF(NZ)	REPER	NO CASSETTE 
	LD	A1,DWTBKC,A6	ANY BLOCK WRITTEN/READ 
	RF(NZ)	RC0050	YES
	CF	A8,SBOT	SEARCH BEGINNING OF TAPE
	SLL	A2,5 
	RF(NN)	REPER	BOT NOT FOUND 
	RF	REPOK 
* 
RC0050	LD	A1,SEKBYT,A6	SEQ. COUNTING
	RF(NZ)	REPER	NO
* 
	EJECT			DRTC01 
* 
* 
*   R E P O S 
* 
*   REPOSITIONING OF TAPE AT POWER ON 
*   AND WRITE RECOVERY
* 
*   EXIT:             A2 EQ ZERO         SUCCESS
*                     A2 NOT EQ ZERO     NO SUCCESS 
* 
* 
REPOS	EQU	* 
	LDK	A4,8	SET REPOSITIONING BIT 
	ORS	A4,DWTST,A6	STORE IN DWT 
* 
REP005	EQU	*
	LDK	A4,PSUBS	SET NO OF BACKSPACES
* 
REP010	CF	A8,BKSP	BACKSPACE 
	SLL	A2,4 
	RF(NN)	REP015	DATA FOUND 
	LD	A2,DWTBKC,A6	GET BLOCK COUNTER
	SUK	A2,8	GREATER 8 ? 
	RF(G)	REPER	YES
	CF	A8,SBOT	NO DATA; SEARCH BEGIN OF TAPE 
	SLL	A2,5 
	RF(NN)	REPER	BOT NOT FOUND 
	LDKL	A5,-1	RESET SEQ. COUNTER
	RF	REP020	READ SEQ. CHAR 
* 
	EJECT			DRTC01 
* 
* 
REP015	EQU	*
	SUK	A4,1 
	RB(NZ)	REP010	BACKSPACE AGAIN
	LDK	A4,PREAD	SET NO OF MAX READ
* 
REP017	CF	A8,READSQ	READ SEQ. CHAR
	LDKL	A7,/180F	SET READ MASK
	TM	A2,A7 
	RF(Z)	REP020	READ OK 
	SUK	A4,1	COUNT READ
	RB(P)	REP017	NOT ALL READ DONE 
	RF	REP060	GIVE UP
* 
REP020	LC	A4,DWTBKC+1,A6	GET SEQ. CHAR
	SUR	A4,A5	CALCULATE
	SUK	A4,1	NO OF BLOCKS TO 
	ANK	A4,/FF	READ FORWARD. 
	CWK	A4,PINT	TOO MANY BLOCKS
	RF(G)	REPER	YES
* 
	EJECT			DRTC01 
* 
* 
REP030	SUK	A4,1	POSITION TAPE 
	RF(N)	REP040	READY 
	CF	A8,READSQ	READ NEXT BLOCK 
	RB	REP030
* 
REP040	LDK	A4,RTRIES	SET NO OF RETRY
REP042	LDKL	A7,/80F	SET READ MASK 
	TM	A2,A7	CORRECT READ
	RF(Z)	REP045	YES 
	SUK	A4,1	COUNT RETRY 
	RF(NP)	REP060	GIVE UP
	CF	A8,BKSP	BACKSPACE 
	CF	A8,READSQ	READ SEQ NUMBER 
	RB	REP042
* 
	EJECT			DRTC01 
* 
* 
REP045	SLC	A2,3 
	RF(NN)	REP050	NOT TAPE MARK
	ANK	A3,/10 
	RF(Z)	REP060	SHOULD NOT BE TAPE MARK 
	RF	REPOK 
* 
REP050	ADK	A5,1	CHECK SEQ. NUMBER 
	CC	A5,DWTBKC+1,A6
	RF(E)	REPOK	EQUAL
* 
REP060	LD	A7,DWTST,A6 
	ANK	A7,8	TRY POSITIONING AGAIN?
	RF(Z)	REPER	NO 
	XRS	A7,DWTST,A6	RESET REPOSITIONING BIT
	RB	REP005	YES
* 
* 
REPER	LDK	A2,2	IND RECOVERY/SEQUENCE ERROR STATUS 
	ORS	A2,SEKBYT,A6	SAVE IN DWT 
	RTN	A8 
* 
REPOK	LDK	A2,0	IND RECOVERY CORRECT 
	RTN	A8 
* 
	EJECT			DRTC01 
* 
* 
*   D W T C 0 2 
* 
*   DEVICE WORK TABLE FOR CASSETTE RECORDER 02
* 
* 
DWTC02	EQU	*	TABLE ENTRY
	IFT	DBCAS=2
	DATA	DWTC01+1	DWT NO. 1
	DATA	/8000	STATUS./8000 MEANS DEVICE READY 
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	TCAD	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TERMINAL QUEUE
	IFT	MMUPAG=1 
	DATA	0	SAVE AREA USER ECB ADDRESS
	DATA	ECBTC2	MMU ECB ADDRESS
	XIF
	IFT	DBCAS=2
	DATA	0	BLOCK COUNTER 
	DATA	0	SEQ. INDICATOR
	IFT	MMUPAG=1 
ECBTC2	EQU	*
	DATA	0 
	DATA	TCBUF2
	DATA	0,0,0,0 
TCBUF2	RES	DVBLEN+1 
	XIF
* 
	EJECT			DRTC01 
* 
* 
*   D W T C 0 1 
* 
*   DEVICE WORK TABLE FOR CASSETTE RECORDER 01
* 
* 
DWTC01	EQU	*	TABLE ENTRY	 
	DATA	DWTC02	DWT NO. 2
	DATA	/8000	STATUS./8000 MEANS DEVICE READY 
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	TCAD	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TERMINAL QUEUE
	IFT	MMUPAG=1 
	DATA	0	SAVE AREA USER ECB ADDRESS
	DATA	ECBTC1	MMU ECB ADDRESS
	XIF
DWTBKC	EQU	*-DWTC01	BLOCK COUNTER 
	DATA	0 
SEKBYT	EQU	*-DWTC01 
	DATA	0	SEQ. INDICATOR
* 
	IFT 	MMUPAG=1
ECBTC1	EQU	*
	DATA	0 
	DATA	TCBUF1
	DATA	0,0,0,0 
TCBUF1	RES	DVBLEN+1 
	XIF
* 
REQLEN	DATA	0	REQUESTED LENGTH
* 
* 
* 
	END

Full view