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

⟦780de5765⟧

    Length: 23978 (0x5daa)
    Notes: pts_type(SC)
    Names: »DRMT01.SC«

Derivation

└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
    └─⟦this⟧ »TOSSWORK/DRMT01.SC« 

PTS(SC)

	IDENT DRMT01 	REL 9.2 79-11-16  870105040920 

* 
* 
***************************************************** 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRMT01 = DRIVER 1/2 " MAGNETIC TAPE RECORDER
* 
* 
* 
* 
* 
* 
***************************************************** 
* 
* 
* 
* THIS DRIVER HANDLES EIGHT 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
*	2:  REWINDING	10: EOT 
*	3:  TAPE MARK	11: SEQUENCE ERROR
* 
*	4:  NO DATA	12: INCORRECT LENGTH
*	5:  BOT		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
	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 





* 
*	HARDWARE ADDRESSES
* 

CHMT	EQU	/0C	CHMT ADDRESS 
MTIOPL	EQU	CHMT+CHMT	IOP CTRL WORD 1 : BLOCK LENGTH 
MTIOPA	EQU	CHMT+CHMT+1	IOP CTRL WORD 2 : BUFFER ADDRESS 
* 
	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 
* 
* 
X:A	EQU	0 
DVBLEN	EQU	X:A
* 
* 
*   MMU DEVICE INDEX
* 
* 
X:B	EQU	4 
DEVIND	EQU	X:B
* 
	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,/7	MASK JUST IN CASE
	LDR	A7,A2	SAVE CHANNEL FOR SELC
	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
* 

TEST	LC	A7,DWTOR,A6	SELECT TO GET STATUS
	ANK	A7,/7
	CF	A5,SELC 
	ABL	ENDIO8 
	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 
	RF(E)	ENDIO1	JUMP IF EQUAL 
	XIF
* 
	EJECT			DRMT01 
* 
* 
READ30	EQU	*
	ORK	A1,/0010	INDICATE SEQ ERROR
	RF	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
	LDR	A3,A1
	SLC	A3,3	CHECK IF TAPE MARK OK 
	RF(NN)	WRTM10	NOT TAPE MARK
	IMR	A2	INCR SEQ COUNTER
	RF	ENDIO4

WRTM10	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	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 
	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
	CF	A5,OFLI	SET OFF-LINE
	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
	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 
	ABL	DISEND	PERFORM TENDIO AND GO TO DISPATCHER 
	EJECT			DRMT01 

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

CKPWF	SLC	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 

SBOW20	SRC	A1,2 
	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,/02	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,/00	WRITE BLOCK 
WBLK10	ORKL	A3,/4000	INDICATE WRITE TO IOP
	RB	RBLK10

WTMK	LDK	A1,/04	WRITE TAPE MARK 
	RF	COMM
ERA4	LDK	A1,/0C	ERASE 4"
	RF	COMM

SBOT	LDK	A1,/41	SEARCH BOT
	RF	COMM

ONLI	LDK	A1,/51	SET ON-LINE 
	RF	COMM

OFLI	LDK	A1,/40	SET OFF-LINE
	RF	COMM

SKPR	LDK	A1,/21	SKIP REVERSE
	RF	COMM

SKPF	LDK	A1,/20	SKIP FORWARD
	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

COMM	CM	MTINT	IND INT ALLOWED 
	CIO	A1,1,CHMT
	RF(A)	COMM10 
	RF(3)	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	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
* 
	SST	A1,CHMT
	RF(A)	IHMT10 
	LDK	A1,9	PARAMETER 
	CF	A15,HALT	SST NOT ACC. 
IHMT10	C1S	MTINT
	RF(NZ)	IHMT20
	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
	LDK	A2,/00 
	LDKL	A3,/2847	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 
	CM	DWTST,A6	SET BUSY DWT 
	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
* 


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
	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:    " 
	DATA	0,1	CH4:    " 
	DATA	0,1	CH5:    " 
	DATA	0,1	CH6:    " 
	DATA	0,1	CH7:    " 

MTCHSE	EQU	*
* 
* 
* 
	END

Full view