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

⟦2aac48b4a⟧

    Length: 30000 (0x7530)
    Notes: pts_type(SC)
    Names: »DRMT01.SC«

Derivation

└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
    └─⟦this⟧ »TOSSWORK/DRMT01.SC« 
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/DRMT01.SC« 

PTS(SC)

	IDENT DRMT01 	REL 11.0 81-01-26 870105041100 

* 
* 
***************************************************** 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRMT01 = DRIVER 1/2 " MAGNETIC TAPE RECORDER
* 
* 
* 
* 
* 
* 
***************************************************** 
* 
* 
* 
* THIS DRIVER HANDLES FOUR 1/2 " MAGNETIC TAPE RECORDERS
* CONNECTED TO CPU VIA IOP AND CHMT ON MULTIPLEXED CHANNEL. 
* 
* 
* ONLY ONE RECORDER CAN BE WORKING AT A TIME EXCEPT AT
* UNLOAD. 
* 
* 
* DATA IS RECORDED IN BLOCKS WITH LENGTH FROM 2 TO 4095 
* CHARACTERS. NORMALLY THE TWO LAST CHARACTERS ARE USED AS
* A BLOCK SEQUENCE NUMBER.
* 
	EJECT			DRMT01 
* 
* THE DRIVER CONSISTS OF THE FOLLOWING PARTS: 
* 
*	M T D A		ACTIVATION ROUTINE 
* 
*	O R D E R  P R O C E S S O R S
* 
*	C O M M A N D  H A N D L E R S
* 
*	I H M T		INTERRUPT HANDLER
* 
*	M T D R O N	POWER ON RECOVERY ROUTINE 
* 
*	D W M T 0 1	DEVICE WORK TABLE 
* 
* ORDERS TREATED: 
* 
*	/00 TEST STATUS	/33 STEP REVERSE
*	/02 READ 	/34 STEP FORWARD
*	/05 WRITE	/37 LOAD
*	/06 WRITE	/38 UNLOAD
*	/22 WRITE TAPE MARK	/3F RECOVER 
*	/31 REWIND
* 
* STATUS BITS:
* 
*	0:  REQUEST ERROR	8:
*	1:		9:  HARDWARE ERROR (+REWINDING) 
*	2:  BOT/EOT	10: 
*	3:  TAPE MARK	11: SEQUENCE ERROR
* 
*	4:         	12: INCORRECT LENGTH
*	5:     		13: DATA ERROR 
*	6:  WRITE PROTECTED	14: THROUGPUT ERROR 
*	7:		15: NOT OPERABLE
* 
	EJECT			DRMT01 



* 
*	ENTRIES 
* 
	ENTRY	IHMT	INTERRUPT HANDLER 
	ENTRY	DWMT01	DEVICE WORK TABLE 
	ENTRY	MTDRON	POWER ON RECOVERY 



* 
*	EXTERNALS 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	DISEND	DISPATCER END I/O 
	EXTRN	DISIOE	DISPATCHER I/O REQ ERROR
	EXTRN	SAVE8	SAVE A1-A8 AND INH 
	EXTRN	SETIMP	START TIMER 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT INDEX AND ORDER
	EXTRN	DWTECB	DWT ECB ADDRESS 
	EXTRN	DWTTAB	TTAB ADDRESS
	EXTRN	DWTUEC	USER ECB ADDRESS
	EXTRN	TTB:MT	MMU TABLE 
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBCW	ECB CONTROL WORD 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	HALT	MONITOR HALT ROUTINE
	EXTRN	PFPOST	PWF POST PROCESSING FLAG
	EJECT			DRMT01 

* 
*	CONSTANTS 
* 

MTRTRY	EQU	3	MAX NO OF RETRIES AT READ/WRITE
MTRTOT	EQU	90	REWIND TIME OUT IN 2 SEC STEPS
MTPTOT	EQU	10	POWER FAIL TIME OUT IN 100 MS 
MTRBLK	EQU	40	NO OF BLOCKS TO REVERSE AT POWER ON 
	EJECT
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	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 
* 
* 
DVBLEN	EQU	0
* 
* 
*   MMU DEVICE INDEX
* 
* 
DEVIND	EQU	4
* 
* 
*         IF THERE IS EURO-CARD IN THE COMPUTER 
*         THE CONSTANT P831 SHOULD BE SET TO 1
* 
X:A	EQU	0 
P831	EQU	X:A
* 
	IFT	P831=0 
CHMT	EQU	/0C	CHMT ADDRESS PTS 6000
MASK	EQU	/7 
READBL	EQU	/02
WRITBL	EQU	/00
WRITMK	EQU	/04
ERASE4	EQU	/0C
SLOADP	EQU	/41
ONLINE	EQU	/51
SKIPRE	EQU	/21
SKIPFO	EQU	/20
OFLINE	EQU	/40
ILLSD	EQU	/2847 
	XIF
	IFT	P831=1 
CHMT	EQU	/05	CHMT ADDRESS PTS 8000
MASK	EQU	/3 
READBL	EQU	/0A
WRITBL	EQU	/03
WRITMK	EQU	/11
ERASE4	EQU	/19
SLOADP	EQU	/24
ONLINE	EQU	/2C
SKIPRE	EQU	/04
SKIPFO	EQU	/00
ILLSD	EQU	/2807 
	XIF
MTIOPL	EQU	CHMT+CHMT	IOP CTRL WORD 1 : BLOCK LENGTH 
MTIOPA	EQU	CHMT+CHMT+1	IOP CTRL WORD 2 : BUFFER ADDRESS 
	EJECT			DRMT01 

* 
*	MTDA	ACTIVATION PART. ENTERED AFTER LKM-REQUEST.
*		THE VALIDITY OF THE ORDER IS CHECKED AND A 
*		BRANCH TO THE ORDER PROCESSOR IS MADE. 
* 
*	ENTRY:
* 
*	A5:  DWTSB2 
*	A6:  DWT ADDRESS
*	A7:  ORDER
*	A8:  ECB ADDRESS
* 
*	EXIT: TO ORDER PROCESSOR
* 
*	A1:  STATUS AFTER SELECT
*	A2:  ACT CHANNEL STATUS ADDRESS 
*	A3:  REQUESTED LENGTH 
*	A4:  BUFFER ADDRESS 
*	A5:  STACK POINTER
*	A6:  DWT ADDRESS
*	A7:  MAX NO OF RETRIES
*	A8:  ECB ADDRESS
* 

MTDA	INH
	LDK	A4,MTLEN	CHECK IF LEGAL ORDER

MTDA10	CC	A7,MTTAB-1,A4 
	RF(E)	MTDA30	FOUND 
	SUK	A4,1 
	RB(NZ)	MTDA10	TRY NEXT 

MTDA20	ABL	DISIOE	ILLEGAL ORDER 

MTDA30	ADR	A4,A4
	ADKL	A4,MTORD-2
	ST	A4,MTREQ	SAVE ADDRESS TO ORDER PNTR 

MTDA40	LC	A2,DWTOR,A6	GET CHANNEL NUMBER
	ANK	A2,MASK	MASK JUST IN CASE
	LDR	A7,A2	SAVE CHANNEL FOR SELC
	IFT	P831=1 
	SLC	A7,4 
	XIF
	SLL	A2,2 
	ADKL	A2,MTCHS	GET ADDRESS OF ACT CH STATUS 
	CWK	A4,MTNOL	DOES THIS ORDER REQUIRE LENGTH
	RF(NL)	MTDA60	NO 

	LD	A3,ECBRL,A8	GET REQUESTED LENGTH
	LD	A4,2,A2	CHECK IF SEQ NUMBERS
	RF(N)	MTDA50	NO
	ADK	A3,2	YES ADJUST LENGTH 
MTDA50	LDR	A4,A3	CHECK REQ LENGTH 
	SRL	A4,1 
	RB(Z)	MTDA20	LESS THAN 2 CHARACTERS
	SRL	A4,11
	RB(NZ)	MTDA20	MORE THAN 4095 CHARACTERS

MTDA60	LD	A4,ECBBA,A8	GET BUFFER ADDRESS

	CWR*	A2,A6	CHECK IF CH ALREADY SELECTED
	RF(E)	MTDA70	YES 
	CF	A5,SELC	SELECT CHANNEL
MTDA70	CM	MTEOT	CLEAR EOT INDICATOR 
	LDK	A7,MTRTRY	GET MAX NO OF RERIES 
	ABI*	MTREQ	GO TO ORDER PROCESSOR 
	EJECT			DRMT01 

* 
*	ORDER PROCESSORS: 
* 
*	ENTRY:
* 
*	A2:  ACT CHANNEL STATUS ADDRESS 
*	A3:  REQUESTED LENGTH 
*	A4:  BUFFER ADDRESS 
*	A5:  STACK POINTER
*	A6:  DWT ADDRESS
*	A7:  MAX NO OF RETRIES
*	A8:  ECB ADDRESS
* 
*	EXIT:  ABL DISEND 
* 
*	A1:  STATUS 
*	A6:  DWT ADDRESS
* 
*	EFFECTIVE LENGTH (ECBEL) AND CONTROL WORD (ECBCW) 
*	ARE UPDATED.
* 
* 
*	TEST STATUS  /00
* 

	IFT	P831=0 
TEST	LC	A7,DWTOR,A6	SELECT TO GET STATUS
	ANK	A7,MASK
	CF	A5,SELC 
	ABL	ENDIO8 
	XIF
	IFT	P831=1 
TEST	CF	A5,SKPR	DUMMY INSTR TO GET STATUS 
	LDR	A3,A1
	SLC	A3,5	BOT ? 
	RF(N)	TEST10	YES ! 
	CF	A5,SKPF	DUMMY INSTRUCTION 
TEST10	ANKL	A1,/F7FF	MASK AWAY BIT 4 "NO DATA"
	ABL	ENDIO6 
	XIF
	EJECT			DRMT01 

* 
*	READ  /02 
* 

READ	CF	A5,RBLK	READ BLOCK
	RF(0)	READ10	STATUS DATA OK
	ABL(1)	ENDIO2	ILL STATUS 
	SUK	A7,1 
	ABL(N)	ENDIO4	NO MORE RETRIES
	CF	A5,SKPR	SKIP REVERSE
	RB	READ	TRY AGAIN

READ10	LDR	A5,A1	CHECK IF TAPE MARK 
	SLC	A5,3 
	ABL(N)	ENDIO0	TAPE MARK
READ20	LD	A5,2,A2	CHECK SEQ MODE
	ABL(N)	ENDIO1	NO SEQ NUMBERS 
* 
	IFT	MMUPAG=0 
	RER	A5,MTIOPA	GET ADDRESS TO SEQ NUMBER
	SUK	A5,1 
	LDR*	A3,A2	GET SEQ COUNTER 
	CCR	A3,A5
	RF(NE)	READ30	NOT CORRECT SEQ NUMBER 
	ECR	A3,A3
	SUK	A5,1 
	CCR	A3,A5
	RF(E)	ENDIO1	BOTH SEQ CHARS OK 

	XIF
* 
	EJECT			DRMT01 
* 
* 
	IFT	MMUPAG=1 
	LD	A5,DWTTAB,A6	GET TTAB ADDRESS 
	SUKL	A15,32	ADJUST STACKPOINTER
	TS	2,A15	SAVE MMU REGISTERS ON STACK 
	TL	TTB:MT,A5	LOAD MMU REGISTERS FROM TTAB
	RER	A5,MTIOPL
	ANKL	A5,/FFF 
	LD	A3,ECBRL,A8 
	SUR	A3,A5	GET EFFECTIVE LENGTH 
	LD	A5,DWTUEC,A6	GET USER ECB ADDRESS 
	EL	A5,ECBBA,A5	GET BUFFER ADDRESS
	ADR	A5,A3
	LDR	A3,A5
	ANK	A3,1 
	RF(NZ)	READ40	ADDRESS UNEVEN?
	ELR	A5,A5	GET ACTUAL SEQUENCE NUMBER 
* 
READ25	EQU	*
	TL	2,A15	RESTORE MMU REGISTERS FROM STACK
	ADKL	A15,32	ADJUST STACKPOINTER
	CWR*	A5,A2	CHECK SEQUENCE NUMBER 
	ABL(E)	ENDIO1	JUMP IF EQUAL
	XIF
* 
	EJECT			DRMT01 
* 
* 
READ30	EQU	*
	ORK	A1,/0010	INDICATE SEQ ERROR
	ABL	ENDIO1 
* 
	IFT	MMUPAG=1 
READ40	ELR	A3,A5
	ANK	A3,/FF 
	EL	A5,1,A5 
	ANKL	A5,/FF00
	ORR	A5,A3
	ECR	A5,A5
	RB	READ25
	XIF
* 
	EJECT			DRMT01 


* 
*	WRITE  /05,/06
* 

WRIT	LD	A1,2,A2	CHECK SEQ MODE
	RF(N)	WRIT10	NO SEQ NUMBERS
	LDR*	A1,A2	GET SEQ COUNTER 
* 
	IFT	MMUPAG=0 
	LDR	A8,A4	CALC ADDR TO SEQ NUMBER
	ADR	A8,A3
	SC	A1,-1,A8	STORE SEQ NUMBER 
	ECR	A1,A1
	SC	A1,-2,A8
	XIF
* 
	IFT	MMUPAG=1 
	LD	A7,DWTTAB,A6	GET TTAB ADDRESS 
	SUKL	A15,32	ADJUST STACKPOINTER
	TS	2,A15	SAVE MMU REGISTERS ON STACK 
	TL	TTB:MT,A7	LOAD MMU REGISTERS
	LD	A4,DWTUEC,A6	GET USER ECB ADDRESS 
	EL	A4,ECBBA,A4	GET USER BUFFER ADDRESS 
	ADR	A4,A3	GET ADDRESS TO SEQUENCE NUMBER 
	SRC	A4,1 
	RF(N)	WRIT20	ADDRESS UNEVEN? 
	SLC	A4,1	NO, OK
	ES	A1,-2,A4	STORE SEQUENCE NUMBER
* 
WRIT05	LD	A4,ECBBA,A8	RESET BUFFER ADDRESS
	TL	2,A15	RESTORE MMU REGISTERS FROM STACK
	ADKL	A15,32	ADJUST STACKPOINTER
	LDK	A7,MTRTRY
	XIF
* 
WRIT10	CF	A5,WBLK	WRITE BLOCK 
	RF(0)	ENDIO1	STATUS,DATA OK
	RF(1)	ENDIO2	ILL STATUS
	CF	A5,SKPR	SKIP REVERSE
	CF	A5,ERA4	ERASE 4"
	SUK	A7,1 
	RF(N)	ENDIO4	NO MORE RETRIES 
	ANK	A1,/20	SAVE EOT
	ORS	A1,MTEOT 
	RB	WRIT10	TRY AGAIN
* 
	IFT	MMUPAG=1 
WRIT20	EQU	*	SEQUENCE NUMBER ADDRESS WAS UNEVEN 
	SLC	A4,1 
	ECR	A6,A1
	ELR	A7,A4
	ANK	A7,/FF 
	SLL	A1,8 
	ORR	A1,A7
	ESR	A1,A4
	EL	A7,-3,A4
	ANKL	A7,/FF00
	ANK	A6,/FF 
	ORR	A7,A6
	ES	A7,-3,A4
	RB	WRIT05
	XIF
* 
	EJECT			DRMT01 
* 
*	WRITE TAPE MARK  /22
WRTM	CF	A5,WTMK 
	RF(1)	ENDIO4	ILL STATUS
	IFT	P831=1 
	CF	A5,SKPR 
	XIF
	LDR	A3,A1
	SLC	A3,3	CHECK IF TAPE MARK OK 
	RF(NN)	WRTM10	NOT TAPE MARK
	IFT	P831=1 
	CF	A5,SKPF	MOVE FORWARD
	XIF
	IMR	A2	INCR SEQ COUNTER
	RF	ENDIO4

WRTM10	EQU	*
	IFT	P831=0 
	CF	A5,SKPR	SKIP REVERSE
	XIF
	CF	A5,ERA4	ERASE 4"
	SUK	A7,1 
	RF(N)	ENDIO4	NO MORE RETRIES 
	ANK	A1,/20	SAVE EOT
	ORS	A1,MTEOT 
	RB	WRTM	TRY AGAIN
* 
*	LOAD  /37 
* 

LOAD	LD	A1,ECBCW,A8 
	SRC	A1,1 
	ST	A1,2,A2	SET SEQ MODE
	CF	A5,ONLI	SET ON-LINE 
	IFT	P831=1 
	LDR	A1,A1
	RF(NZ)	ENDIO6
	XIF
	EJECT			DRMT01 

* 
*	REWIND  /31 
* 


RWND	CMR	A2	CLEAR SEQ COUNTER 
	CF	A5,SBOW	SEARCH BOT AND WAIT 
	RF	ENDIO6


* 
*	UNLOAD  /38 
* 

UNLD	CMR	A2	CLEAR SEQ COUNTER 
	CF	A5,SBOT	SEARCH BOT
	RF(NZ)	ENDIO7	NOT OPERABLE 
	CF	A5,OFLI	SET OFF-LINE
	ANKL	A1,/FFFE	SKIP BIT 15
	RF	ENDIO7


* 
*	STEP REVERSE  /33 
* 

STPR	CF	A5,SKPR	SKIP REVERSE
STPR10	RF(1)	ENDIO6	ILL STATUS
	LDKL	A3,-1 
	ADRS	A3,A2	DECR SEQ COUNTER
	LDR	A3,A1
	SLC	A3,5	CHECK IF BOT
	RF(NN)	ENDIO6	NOT BOT
	RB	RWND	BOT
* 
*	STEP FORWARD  /34 
* 

STPF	CF	A5,SKPF	SKIP FORWARD
	RF(1)	ENDIO6	ILL STATUS
STPF10	IMR	A2	INCR SEQ COUNTER
STPF20	RF	ENDIO6



* 
*	RECOVER  /3F
* 

RECV	CF	A5,MTRC	RECOVER 
	RF	ENDIO8
	EJECT			DRMT01 
* 
*	ENDIO	COMMON EXITS FOR ORDER PROCESSORS 
* 
ENDIO0	IMR	A2	INCREMENT SEQUENCE COUNTER
	ANKL	A1,/FFF7	MASK INCORR LENGTH (ONLY ON P831)
	RF	ENDIO4
* 
ENDIO1	IMR	A2	INCR SEQ COUNTER

	IFT	MMUPAG=0 
ENDIO2	RER	A3,MTIOPA	GET NEXT BUFFER ADDRESS
	XIF
* 
	IFT	MMUPAG=1 
ENDIO2	RER	A4,MTIOPL
	ANKL	A4,/FFF 
	LD	A3,ECBRL,A8 
	XIF
	SUR	A3,A4
	IFT	MMUPAG=0 
ENDIO3	LD	A4,2,A2	CHECK IF SEQ NUMBERS
	RF(N)	*+4	NO 
	SUK	A3,2	YES ADJUST LENGTH 
	XIF
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
ENDIO4	LDK	A4,MTRTRY
	SUR	A4,A7	GET NO OF RETRIES

ENDIO5	ST	A4,ECBCW,A8	STORE IN CONTROL WORD 
ENDIO6	LDR	A7,A1
	SRC	A7,1 
	RF(N)	CKPWF	NOT OPERABLE CHECK IF POWER FAIL 
ENDIO7	LDKL	A4,/8000	SAVE SEQ MODE BIT
	ANS	A4,2,A2
	OR	A1,MTEOT	PUT IN EOT INDICATOR 
	ORS	A1,2,A2	SAVE STATUS
ENDIO8	CM	MTREQ	INDICATE NO RUNNING ORDER 
* 
	EJECT			DRMT01 
* 
*	MODIFY RETURN CODE
* 
	ADK	A1,0	SET CR
	RF(Z)	ENDIOC	NO ERRORS 
	LDKL	A2,/2000
	TM	A1,A2 
	RF(Z)	ENDIO9 
	XRR	A1,A2	RESET BIT 2
	ORK	A1,/40	SET BIT 9 INSTEAD 
* 
ENDIO9	EQU	*
	LDKL	A3,/420 
	TM	A1,A3 
	RF(Z)	ENDIOA 
	ORR	A1,A2	SET BIT 2
	ANKL	A1,/FBDF	RESET BIT 5 AND 10 
* 
ENDIOA	EQU	*
	SRL	A2,2 
	TM	A1,A2 
	RF(Z)	ENDIOB 
	XRR	A1,A2	RESET BIT 4
	ORK	A1,4	SET BIT 13 INSTEAD
* 
	EJECT			DRMT01 
* 
* 
ENDIOB	EQU	*
	SRL	A2,2 
	TM	A1,A2 
	RF(Z)	ENDIOC	NOT WRITE PROTECTED 
	LD	A7,DWTOR,A6	ORDER CODE
	ANK	A7,/FF 
	SUK	A7,/05 
	RF(N)	ENDIOC	NO WRITE ORDER
	SUK	A7,/22-/05 
	RF(P)	ENDIOC	NO WRITE ORDER
	ORK	A1,/40	SET BIT 9 
* 
ENDIOC	EQU	*
	ABL	DISEND	PERFORM TENDIO AND GO TO DISPATCHER 
* 
	EJECT			DRMT01 

* 
*	THE THING WAS NOT OPERABLE, CHECK IF A POWER
*	FAIL IS COMING ALONG. 
* 

CKPWF	LDK	A7,1
	ST	A7,MTSA7	SAVE REGISTERS 
	ST	A2,MTSA2
	LDR	A1,A6
	LDKL	A4,MTTIM
	CF	A15,SETIMP	WAIT FOR POWER FAIL
	DATA	CKPWF1,MTPTOT 
	ABL	TDISP

CKPWF1	LDR	A6,A1	RESTORE REGISTERS
	LD	A1,MTSA7
	LD	A2,MTSA2
	CM	MTTIM	INDICATE NO TIMER 
	RB	ENDIO8
	EJECT			DRMT01 

* 
*	SBOW	SEARCH BOT AND WAIT FOR REWIND 
* 
*	ENTRY:
* 
*	A6:  DWT ADDRESS
* 
*	EXIT: 
* 
*	A1:  STATUS AFTER COMMAND 
*	A2:  RESTORED 
*	A6:  DWT ADDRESS
*	A7:  RESTORED 
*	A8:  ECB ADDRESS
* 

SBOW	LDKL	A1,-MTRTOT-1	SET UP TIME OUT
	ST	A1,MTCTR

SBOW10	CF	A5,SBOT	SEARCH BOT
	SLC	A1,2	CHECK IF READY
	RF(N)	SBOW30	STILL REWINDING 

	IFT	P831=0 
SBOW20	SRC	A1,2 
	XIF
	IFT	P831=1 
SBOW20	LDKL	A1,/400 
	XIF
	RTN	A5	RETURN

SBOW30	IM	MTCTR	CHECK IF TIME OUT 
	RB(Z)	SBOW20	DON'T WAIT ANY MORE 
	ST	A5,MTSA5	SAVE REGISTER
	LDR	A1,A6
	LDKL	A4,MTTIM
	CF	A15,SETIMP	WAIT 2 SECONDS 
	DATA	SBOW40,20 
	ABL	TDISP

SBOW40	LDR	A6,A1	ENTERED EACH 2 SECONDS 
	LD	A2,MTSA2	RESTORE REGISTERS
	LD	A5,MTSA5
	LD	A7,MTSA7
	CM	MTTIM	INDICATE NO TIMER 
	RB	SBOW10	GO BACK AND TRY AGAIN
	EJECT			DRMT01 

* 
*	COMMAND HANDLERS
* 
*	ENTRY:  CF   A5,<COM> 
* 
*	A2:  IF SELC: ACTIVE CHANNEL ADDRESS
*	A3:  IF RBLK,WBLK: REQUSTED LENGTH
*	A4:  IF RBLK,WBLK: BUFFER ADDRESS 
*	A6:  DWT ADDRESSS 
*	A7:  IF SELC: CHANNEL NO (0-7)
* 
*	EXIT:  RTN A5 
* 
*	A1:  STATUS AFTER COMMAND 
*	A2:  RESTORED 
*	A3:  REQUESTED LENGTH IN ECB
*	A4:  BUFFER ADDRESS IN ECB
*	A6:  DWT ADDRESS
*	A7:  RESTORED 
*	A8:  ECB ADDRESS
* 
*	CR:  =0:  NOT ILL STATUS, NOT ILL DATA
*	     =1:  ILL STATUS: REWINDING,HARD ERR,NOT OP 
*	     =2:  NOT ILL STATUS, ILL DATA: NO DATA,DATA ERR,THRUPUT ERR
* 


RBLK	LDK	A1,READBL	READ BLOCK 
RBLK10	EQU	*
	IFT	MMUPAG=1 
	LDR*	A6,A8	GET FIRST WORD OF ECB 
	ANKL	A6,/3000	GET BITS 16-17 IN BUFFER ADDRESS 
	ORR	A3,A6
	XIF
* 
RBLK20	EQU	*
	WER	A3,MTIOPL	GIVE REQUESTED LENGTH
	WER	A4,MTIOPA	AND BUFFER ADDRESS TO IOP
	RF	COMM

WBLK	LDK	A1,WRITBL	WRITE BLOCK
WBLK10	ORKL	A3,/4000	INDICATE WRITE TO IOP
	RB	RBLK10

WTMK	LDK	A1,WRITMK	WRITE TAPE MARK
	RF	COMM
ERA4	LDK	A1,ERASE4	ERASE 4" 
	RF	COMM

SBOT	LDK	A1,SLOADP	SEARCH BOT 
	RF	COMM

ONLI	LDK	A1,ONLINE	SET ON-LINE
	RF	COMM


SKPR	LDK	A1,SKIPRE	SKIP REVERSE 
	RF	COMM

SKPF	LDK	A1,SKIPFO	SKIP FORWARD 
	IFT	P831=0 
	RF	COMM
OFLI	LDK	A1,OFLINE	SET OFF-LINE 
	RF	COMM

RSQN	LDK	A1,/03	READ SEQUENCE NUMBER
	LDK	A3,2	SET UP BUFFER FOR SEQ NO
	LDKL	A4,MTBUF
	RB	RBLK20

SELC	LDK	A1,/60	SELECT CHANNEL
	ORR	A1,A7
	STR	A2,A6	SAVE ACTIVE CHANNEL

	XIF
COMM	LD	A3,PFPOST 
	RF(NZ)	COMM15	PFINIT PENDING 
CIOMT	CIO	A1,1,CHMT 
	RF(A)	COMM10 
	RF(U)	COMM05	NO INTERFACE
	LDK	A1,9	PARAMETER 
	CF	A15,HALT	STOP EXECUTION 
COMM05	LD	A3,ECBRL,A8 
	LD	A4,ECBBA,A8 
	ADK	A5,4 
	LDKL	A6,DWMT01	GET DWT ADDRESS 
	LDK	A1,1	NOT OPERABLE
	ABR*	A5


COMM10	CM	MTINT	IND INT ALLOWED 
COMM15	ST	A2,MTSA2	SAVE REGISTERS 
	ST	A5,MTSA5
	ST	A7,MTSA7
	ABL	TDISP	GO TO DISPATCHER 
	EJECT			DRMT01 

* 
*	IHMT	INTERRUPT HANDLER CHMT 
* 

IHMT	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
SSTMT	SST	A1,CHMT 
	RF(A)	IHMT10 
	LDK	A1,9	PARAMETER 
	CF	A15,HALT	SST NOT ACC. 
IHMT10	C1S	MTINT
	RF(NZ)	IHMT20
	IFT	P831=1 
	C1S	MTINT	SET INT. NOT ALLOWED 
	SLC	A1,1	SKIP "TAPE WAS NOT
	ABL(N)	TDISP	READY"-INTERRUPT
	XIF
	LDK	A1,5	ILLEGAL INTERRUPT PARAMETER 
	CF	A15,HALT

IHMT20	LDKL	A6,DWMT01	GET DWT ADDRESS 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A5,MTSA5	RESTORE STACK POINTER
	IFT	P831=1 
	ANKL	A1,/BFFF	MASK AWAY "TAPE WAS NOT READY"-BIT 
	XIF
	LDK	A2,/00 
	LDKL	A3,ILLSD	CHECK IF ILL STATUS,DATA 
	TM	A1,A3 
	RF(Z)	IHMT30	STATUS,DATA OK
	LDK	A2,/40 
	SUKL	A3,/806 
	TM	A1,A3 
	RF(NZ)	IHMT30	ILL STATUS 
	LDK	A2,/80	ILL DATA

IHMT30	SLC	A2,2 
	ST	A2,2,A5	UPDATE CR 
	LD	A2,MTSA2	RESTORE REGISTERS
	LD	A3,ECBRL,A8 
	LD	A4,2,A2	CHECK IF SEQ NUMBERS
	RF(N)	*+4	NO 
	ADK	A3,2	YES ADJUST LENGTH 
	LD	A4,ECBBA,A8 
	LD	A7,MTSA7
	RTN	A5 
	EJECT			DRMT01 

* 
*	MTDRON	ENTRY AT POWER ON RECOVERY 
* 

MTDRON	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
* 
	LDKL	A6,DWMT01 
	LDKL	A4,/7FFF	SET DWT BUSY 
	ANS	A4,DWTST,A6
	CMR	A6	IND NO ACTIVE CHANNEL 
	LD	A4,MTTIM	CHECK IF TIMER ON
	RF(Z)	MTON05	NO
	CMR	A4	RESET TIMER 
	CM	MTTIM	INDICATE NO TIMER 

MTON05	LD	A4,MTPWF	CHECK IF PWF TIMER ON
	RF(NZ)	MTON10	YES
	LDKL	A4,MTPWF
	CF	A15,SETIMP	NO START IT
	DATA	MTON20,MTPTOT 

MTON10	LDKL	A3,-MTPTOT	WAIT FOR EVERYTHING
	STR	A3,A4
	ABL	TDISP

MTON20	CM	MTPWF	IND NO PWF TIMER
	LDKL	A6,DWMT01	LOAD DWT ADDRESS
	LD	A8,DWTECB,A6	LOAD ECB ADDRESS 
	LDKL	A5,MTSTB	LOAD STACK BASE
	LDKL	A2,MTCHS	GET ADDRESS TO CHANNEL STATUS

MTON30	LD	A1,2,A2	GET STATUS
	SRC	A1,1 
	RF(N)	MTON40	OFF-LINE
	CF	A5,MTRC	RECOVER THIS CHANNEL

MTON40	ADK	A2,4 
	CWK	A2,MTCHSE	ARE ALL CHANNELS DONE
	RB(NE)	MTON30	NO TRY NEXT

	LD	A4,MTREQ	CHECK IF ACTIVE REQUEST
	ABL(Z)	DISEND	NO RETURN
	ABL	MTDA40	REPEAT ACTIVE REQUEST 
	EJECT			DRMT01 

* 
*	MTRC	RECOVERY ROUTINE. THE TAPE IS POSITIONED BEFORE
*		THE BLOCK GIVEN BY THE SEQUENCE COUNTER. 
*		IF UNSUCCESSFUL DUE TO INCORRECT SEQUNCE NUMBERS 
*		THE RECORDER IS PUT OFF-LINE.
* 
*	ENTRY:
* 
*	A2:  ADDRESS TO CHANNEL STATUS
*	A6:  DWT ADDRESS
* 
*	EXIT: 
* 
*	A1:  STATUS AFTER RECOVERY
*	A2:  ADDRESS TO CHANNEL STATUS
*	A6:  DWT ADDRESS
* 
	IFT	P831=0 


MTRC	LDR	A7,A2	CALC CHANNEL NUMBER
	SUKL	A7,MTCHS
	SRL	A7,2 
	CF	A5,SELC	SELECT CHANNEL
	LD	A1,2,A2	CHECK SEQ MODE
	RF(N)	MTRC70	NO SEQ NUMBERS
	CF	A5,ONLI 
	LDR*	A3,A2	GET SEQ COUNTER 
	ABL(Z)	SBOW	TAPE SHOULD BE AT BOT
	LDK	A7,MTRBLK	REVERSE TAPE TO AVOID ANY OLD BLOCKS 
MTRC05	CF	A5,SKPR 
	SUK	A7,1 
	RB(NZ)	MTRC05

MTRC10	CF	A5,RSQN	READ SEQUENCE NUMBER
	SLC	A1,3	CHECK IF TAPE MARK
	RB(N)	MTRC10	TAPE MARK, TRY AGAIN
	SLC	A1,2	CHECK IF BOT
	RF(NN)	MTRC20	NOT BOT
	CM	MTBUF	CLEAR SEQ NUMBER

MTRC20	ANK	A1,/E4	CHECK IF REW, DATA ERR, THRU ERR, NOT OP
	RF(NZ)	MTRC70	ILLEGAL CONDITIONS 

	LD	A3,MTBUF	OK NICE SEQ NO FOUND 
	ECR	A7,A3	PUT IT RIGHT 
	SUR*	A7,A2	CALC NO OF BLOCKS TO GO 
	CCR	A3,A2
	RF(NE)	MTRC25
	LDR	A7,A7
MTRC25	RF(G)	MTRC50	GO REVERSE

MTRC30	NGR	A7,A7	TRY FORWARD
MTRC40	SUK	A7,1 
	RF(N)	MTRC60 
	CF	A5,SKPF 
	RB	MTRC40

MTRC50	SUK	A7,1	TRY REVERSE 
	RF(N)	MTRC60 
	CF	A5,SKPR 
	RB	MTRC50

MTRC60	CF	A5,RSQN	READ SEQ NUMBER 
	RF(4)	MTRC70	ILL STATUS,DATA 
	SLC	A1,3	CHECK IF TAPE MARK
	RF(NN)	MTRC80	NOT TAPE MARK
	LD	A3,2,A2	GET STATUS OF CHANNEL 
	SLC	A3,3 
	RF(N)	MTRC90	SHOULD BE TAPE MARK 

MTRC70	ABL	OFLI	RECOVERY FAILED 

MTRC80	LD	A3,MTBUF	CHECK SEQ NUMBER 
	ECR	A3,A3
	ADK	A3,1 
	CWR*	A3,A2 
	RB(NE)	MTRC70	NOT EQUAL

MTRC90	ABL	SKPF	OK RECOVERY DONE
	XIF
	IFT	P831=1 
MTRC	LDR	A7,A2	CALC CHANNEL NUMBER
	SUKL	A7,MTCHS
	SRL	A7,2 
	CF	A5,SELC	SELECT CHANNEL
	LD	A1,2,A2	CHECK SEQ MODE
	RF(N)	MTRC70	NO SEQ NUMBERS
	CF	A5,ONLI 
	SRC	A1,1	NOT OPERABLE ?
	RF(N)	OFLI	YES ! RECOVERY FAILED 
	LDR*	A7,A2	GET SEQ COUNTER 
	ABL(Z)	SBOW	TAPE SHOULD BE AT BOT
MTRC05	CF	A5,SKPR	REWIND TAPE TO BOT
	SLC	A1,5	CHECK IF BOT
	RB(NN)	MTRC05


MTRC40	SUK	A7,1 
	RF(N)	MTRC60 
	CF	A5,SKPF 
	SLC	A1,4	NO DATA ? 
	RF(N)	MTRC70	YES ! 
	RB	MTRC40

MTRC60	EQU	*
	SRC	A1,1	TAPE MARK ? 
	RF(NN)	MTRC80	NOT TAPE MARK
	SRC	A1,3 
	LD	A3,2,A2	GET STATUS OF CHANNEL 
	SLC	A3,3 
	RF(N)	MTRC90	SHOULD BE TAPE MARK 

MTRC70	RF	OFLI	RECOVERY FAILED

MTRC80	EQU	*
MTRC90	RTN	A5	OK RECOVERY DONE
* 
*   SELECT DEVICE 
* 
SELC	EQU	*
	LDKL	A1,/FFCF	MASK 
	ANS	A1,CIOMT	MASK AWAY OLD DEVICE
	ORS	A7,CIOMT	PUT NEW DEVICE IN CIO-INSTR.
	ANS	A1,SSTMT	SST-INSTR.
	ORS	A7,SSTMT 
	ANS	A1,CIOM2	ANOTHER CIO-INSTR.
	ORS	A7,CIOM2 
	RTN	A5 
* 
*   OFF LINE
* 
OFLI	EQU	*
	CF	A5,SKPR	DUMMY INSTRUCTIONS TO GET STATUS
	SLC	A1,5	BOT ? 
	RF(N)	OFLI10	YES ! DON'T STEP FORWARD
	CF	A5,SKPF	DUMMY INSTRUCTION 
	SRC	A1,1 
	RF(NN)	OFLI10
OFLI05	LDK	A1,1	NOT OPERABLE
	RTN	A5 
OFLI10	LDK	A1,/20	SET OFF LINE
CIOM2	CIO	A1,1,CHMT 
	RB	OFLI05
	XIF
	EJECT			DRMT01 

* 
*	LEGAL ORDER TAB 
* 

MTTAB	DATA	/0205,/0600,/2231
	DATA	/3334,/3738,/3F00 

MTLEN	EQU	*-1-MTTAB 

MTORD	DATA	READ,WRIT,WRIT,TEST,WRTM,RWND
	DATA	STPR,STPF,LOAD,UNLD,RECV
MTNOL	EQU	*-8-8 
	EJECT			DRMT01 
* 
*	DWMT01	DEVICE WORK TABLE FOR DRMT01 
* 

DWMT01	DATA	0	DWTCHP PNTR TO ACTIVE CHANNEL 
	DATA	/8000	DWTST  BIT0=READY 
	DATA	0	ECB ADDRESS 
	DATA	0	DWTOR  BIT0-7=INDEX, BIT10-15=ORDER 
	DATA	MTADR	DWTADR
	DATA	0	DWTTAB
	DATA	0	DWTWAT
	DATA	0	DWTTQ 
	IFT	MMUPAG=1 
	DATA	0	SAVE AREA USER ECB ADDRESS
	DATA	DEVECB	MMU ECB ADDRESS
	XIF
MTREQ	DATA	0	REQUESTED ORDER POINTER
MTSA2	DATA	0	SAVE AREA FOR REGISTERS
MTSA5	DATA	0
MTSA7	DATA	0
	DATA	0,0,0	SUBROUTINE STACK
MTSTB	DATA	0	DWTSB2 
* 
	IFT	MMUPAG=1 
DEVECB	EQU	*
	DATA	0,0,0,0,0,0 
	XIF
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	4	DEVICE INDEX
MTADR	DATA	MTDA 
	DATA	0	ABORT ROUTINE ADDRESS 
MTCTR	DATA	0	TIME OUT COUNTER 
MTINT	DATA	/FFFF	/0: INTERRUPT ALLOWED
MTPWF	DATA	0	PWF TIMER POINTER
MTTIM	DATA	0	TIMER POINTER
MTBUF	DATA	0	BUFFER FOR SEQ NUMBER
MTEOT	DATA	0	EOT INDICATOR
* 
	EJECT			DRMT01 

* 
*	CHANNEL STATUS WORDS
* 
*	FIRST WORD:     SEQUENCE COUNTER
*	SECOND WORD:    BIT0: NO SEQ NO:S, BIT1-15: LAST STATUS 
* 


MTCHS	DATA	0,1	CH0: SEQ NO, STATUS
	DATA	0,1	CH1:    " 
	DATA	0,1	CH2:    " 
	DATA	0,1	CH3:    " 

MTCHSE	EQU	*
* 
* 
* 
	END

Full view