|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 30000 (0x7530)
Notes: pts_type(SC)
Names: »DRMT01.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRMT01.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRMT01.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