1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 2 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 ;********************************
21 ;** RECORDS LONGER THAN 1K
22 ;** AUTOMTAIC DETERMINATION OF DENSITY AND RECORD LENGTH WHEN READING
23 ;** ALLOW CLOSE WHEN TAPE HAS BEEN TAKEN OFF
24 ;** BE MORE FORGIVING OF CONTROLLER LOSSAGE
25 ;** PASS .MTAPE TO JOB DEVICE
26 ;** HAVE AN IGNORE ERRORS SWITCH
27 ;** THIS HORRIBLE BLETCHEROUS IOT CODE SHOULD BE REDESIGNED
29 ;********************************
34 IFN TM10A,INFORM IO BUSS MAG TAPE,1
35 IFN TM10B,INFORM DATA CHANNEL MAG TAPE,1
36 MSCBL==8 ; COMMAND BUFFER LENGTH
37 MGQDLL==6 ; INTERUPT LEVEL PDL
38 IF2 IFN MNUMB-140600, .ERR IMPLICIT DEPENDENCY ON MNUMB
39 MSEOFP==210100 ;HIGH BIT OF MNUMB IN MEMBLT IS EOF FLAG
40 MSCHN==140500 ;OTHER 5 BITS OF MNUMB IN MEMBLT IS DRIVE NUMBER
42 MTXP==410300,, ;XPORT NUMBER
43 MUNITF==170300 ; UNIT FIELD IN MTC CONI
55 MGNRTY==10. ;NUMBER OF READ RETRIES
57 SUBTTL MAG TAPE OPEN ROUTINE
60 ; D/ MODE (ROT 1) 4.9=1=>OUTPUT
62 ; R/ IOCHNM WORD POINTER
64 MAGTO: SKIPL W,I ; GET DEVICE
65 CAIL W,NMTCS ; TO BIG?
66 JRST OPNL1 ; NO SUCH DEVICE
68 TDNE T,MSRAC(W) ; REWINDING
69 PUSHJ P,UFLS ; YES, THEN WAIT
70 CONO PI,CLKOFF ; DON'T WANT STATUS CHANGED FROM UNDER ME
71 SKIPGE MTUSE(W) ; CHECK FOR FIRST USER
73 CAME U,MTUSR(W) ;SAME USER
74 JRST OPNL10 ; DIFFERENT USER IS ERROR
77 SKIPL B ; CHECK FOR SECOND OPEN IN SAME DIRECTION
78 JRST OPNL2 ; WRONG DIRECTION
79 MAGTU: MOVEM U,MTUSR(W) ; STORE USER
80 SETZM MSCRW(W) ; INDICATE READ UNTIL FOUND TO BE OTHERWISE
81 TLNE C,1 ; READ OR WRITE
82 SETOM MSCRW(W) ;INDICATE WRITE
83 AOS MTUSE(W) ;INDICATE 1 MORE USER
85 MTUSE(W) ; SOS IF PCLSRED
86 CONO PI,CLKON ; LET UM GET ME
87 PUSHJ P,MTSTAT ; GET CONIS OF 340 AND 344 IN I AND J
89 TLNE A,%MAERR ; PI ERROR MEANS DEVICE NOT THERE
92 JRST OPNL7 ; DEVICE NOT ONLINE
93 SKIPN MSCRW(W) ;WRITING?
95 TRNE J,10 ; AND WRITE LOCKED
96 JRST OPNL26 ; DEVICE WRITELOCKED
97 SKIPE MSRAC(W) ; WRITING
100 MOVSI A,%MAETW+%MAERR ; IF WRITE AND EOT,MAKE .IOT GIVE IOC ERROR BUT LET OPEN WIN
102 MTOW1: TRNN J,400000 ; XPORT HUNG
104 TRNN J,20000 ; OK IF REWINDING
105 JRST OPNL7 ;DEVICE NOT WORKING
106 MTOW2: TLNN C,400 ; GET CORE DUMP MODE
111 TLCE C,300 ; IBM AND DENSITY 800 BPI OK
112 JRST OPNL12 ; MODE NOT AVAILABLE
113 MTOW3: ;BY THIS POINT OPEN WILL WIN
114 PUSHJ P,LSWDEL ; RELEASE MTUSE SWITCH
115 MOVEI A,MTCCHN_3 ;SET UP MAG TAPE CONO
116 IFN TM10A, TRO A,1 ; DATA PI CHANNEL
117 LDB B,[300200,,C] ; GET DENSITY FROM OPEN
120 SUBI B,1 ; CONVERT TO PROPER PARITY
122 TLNN C,400 ; CORE DUMP
124 TLNN C,40 ; PARITY CHECK
125 TRO A,40000 ; SET ODD PARITY
126 DPB W,[170300,,A] ; SET UNIT NUMBER
127 MOVEM A,MTCONO(W) ; STORE IT
128 LDB B,[330300,,C] ; GET WORDS PER BLOCK
131 LSH A,(B) ;NUMBER OF WORDS PER RECORD
132 MOVEM A,MTBLKS(W) ;BLOCKSIZE
133 LDB A,[230200,,C] ; GET MODE (BUT NOT READ/WRITE BIT)
134 HLR C,MTOPTB(A) ; GET INPUT DISPATCH
135 TLNE D,400000 ; OPEN FOR OUTPUT?
136 HRR C,MTOPTB(A);CHANGE TO OUTPUT IF SO
137 MOVEM C,(R) ;STORE IN IOCHNM
138 DPB W,[MTXP(R)] ; STORE XPORT NUMBER
139 JRST POPJ1 ; SKIP RETURN
141 MTOPTB: MTUAIX,,MTUAOX
146 MAGTU1: SETZM MSBUFP(W) ; INDICATE NO BUFFERS ON CHAIN
147 SETZM MSNBOL(W) ; ANOTHER WAY OF SAYING ABOVE
148 SETZM MSMPRC(W) ; BUFFER WORDS REMAINING
149 SETZM MSMPRP(W) ; POINTER TO BUFFERS
150 SETOM MTMDN(W) ;NO BUFFER AT MP
151 SETOM MGCABN(W) ;NONE AT PI
154 MOVEM A,MTCEFW(W) ; NUMBER OF EOF'S WRITTEN
156 IORM A,MSRAC(W) ; INDICATE NOTHING WRITTEN ON TAPE
159 MTOL1: SETZM MSRAC(W)
162 SUBTTL MAG TAPE INPUT .IOT ROUTINES
165 MTUAI: MOVEI B,CHRKTI ;UNIT ASCII INPUT
170 MTUII: MOVEI B,CHRKTI ;UNIT IMAGE
174 MTBI: MOVE E,[444400,,1] ;BLOCK INPUT
176 MTREAD: LDB W,[MTXP(R)] ; W <= XPT #
178 MOVEM P,MTPSAV(W) ; SAVE P FOR EOF RETURN
179 JSP B,(B) ;BLKT,CHRKT,SIOKT
180 MSMPRP(W) ;LOC OF NEXT WORD
181 MSMPRC(W) ;COUNT REMAINING
182 SETZ MTRBG ; GET NEW BUFFER (SETZ FOR CHRKT RETURN ON EOF)
183 MTRBD ; DISCARD BUFFER
185 PUSHJ P,MTRBFW ; FLUSH INSTRUCTION WAIT FOR BUFFERS TO COME FROM PI
187 ;MAG TAPE READ BUFFER GET ROUTINE
188 ; BUFFER ASSUMED TO HAVE COME IN FROM PI LEVEL. (I.E. MTRBFW WAS CALLED)
190 MTRBG: SKIPG MSNBOL(W) ;ANY BUFFER AVAILABLE?
191 JRST MTRBG3 ;NO, MUST BE ERROR OR EOF
193 HLRZ A,MSBUFP(W) ; GET IN POINTER
194 HRRZ TT,MSBUFP(W) ; GET OUT POINTER
195 MOVEM TT,MTMDN(W) ; STORE BUFFER ACTIVE AT MP
198 LDB T,[MLO,,MEMBLT(TT)] ; BACK POINTER TO NEXT BLOCK
199 HRRM T,MSBUFP(W) ;STORE NEW OUT POINTER
202 MTRBG1: SETZM MSBUFP(W) ;EMPTY BUFFER LIST
203 MTRBG2: SOS MSNBOL(W) ; ONE LESS BUFFER ON LIST
205 LDB J,[MWC,,MEMBLT(TT)] ;WORD COUNT OF BLOCK
206 MOVEM J,MTBLKS(W) ;SAVE FOR MTAPE 13
207 LSH TT,10. ;MAKE BLOCK NUMBER AN ADDRESS
211 MTRBG3: SKIPGE MSRAC(W) .SEE %MAEOF
212 JRST [ MOVSI T,%MAEFA ;THE EOF IS NOW NO LONGER READ-AHEAD
213 ANDCAM T,MSRAC(W) ;TELL THE USER ABOUT IT
216 JRST 4,. ;BULLSHIT, WHY DID MTRBFW SKIP?
218 ;MAG TAPE READ BUFFER DISCARD ROUTINE
219 MTRBD: SKIPGE A,MTMDN(W) ; ANY BUFFERS
220 JRST MOVTWJ ;SET UP T FOR BUFFER WAIT,RETURN
221 CONO PI,UTCOFF ; SHUT UP WORLD
222 SETOM MTMDN(W) ; NO BUFFER ACTIVE AT M.P.
224 LDB TT,[MSEOFP,,MEMBLT(A)] ;GET EOF FLAG FROM PI
225 PUSHJ P,MGMEMR ;RETURN MEM, TURN UTCON
226 JUMPN TT,MTRBD2 ;EOF?
227 MOVTWJ: MOVE T,W ; T NEEDS CHANNEL NUMBER FOR BUFFER WAIT UFLUSH
228 POPJ P, ;ALSO MTRBG, MTRBFW RELY ON THIS SETTING T
230 MTRBD2: MOVSI A,%MAEOF ; SET EOF
234 ;MAG TAPE READ WAIT FOR DATA ROUTINE
235 MTRBFW: SKIPG MSNBOL(T) ; ANY FREE BUFFERS ON LIST?
236 SKIPGE MSRAC(T) .SEE %MAEOF
237 JRST POPJ1 ;INPUT AVAILABLE, OR AT EOF, UNHANG
239 TLNE TT,%MAERR ; CHECK FOR ERRORS
240 JRST POPJ1 ;WAKE UP SO YOU CAN GET YOUR IOC ERROR
241 TLNE TT,%MARAC ; IF NOT ALREADY DONE SO, SEND OUT A CALL FOR TAPE READ
243 PUSH P,W ;THIS BEING DONE UNDER A UFLS. ONLY T GOOD
246 MOVEI B,MGREAD ;WHERE TO GO AT PI LEVEL
247 MOVEI T,MSCBL ;MAKE SURE THAT THERE IS ROOM IN THE RING BUFFER
249 JRST MTRBW2 ; NO ROOM, GO AWAY
251 IORM TT,MSRAC(W) ;READ IS ACTIVE NOW, OR WILL BE SHORTLY
258 SUBTTL MAG TAPE OUTPUT .IOT ROUTINES
261 MTUAO: MOVEI B,CHRKT ;UNIT ASCII OUTPUT
266 MTUIO: MOVEI B,CHRKT ;UNIT IMAGE OUTPUT
270 MTBO: MOVE E,[444400,,1] ; BLOCK OUT
272 MTWRIT: LDB W,[MTXP(R)] ; GET XPORT NUMBER
274 HRLZI A,%MAETW ; END OF TAPE CHECK
278 SETZ MSMPRP(W) ;LOC OF WORD
280 SETZ MTWBFG ; GET NEW BUFFER
281 MTWBFD ; WRITE OUT BUFFERS
283 TRNA ;NO WAIT FOR BUFFER
285 ;MAG TAPE WRITE BUFFER GET ROUTINE
287 MTWBFG: PUSHJ P,MTIECK
288 PUSHJ P,TCALL ; TURN OFF UTC
290 POPJ P, ;GO BACK NO SKIP IF NO CORE
291 MOVEM A,MTMDN(W) ; STORE ACTIVE BUFFER NUMBER
293 DPB T,[MUR,,MEMBLT(A)] ; TELL WORLD THAT IT IS A MAG TAPE BUFFER
294 DPB W,[MSCHN,,MEMBLT(A)] ; CHANNEL NUMBER
296 DPB A,[121000,,TT] ;CONVERT BLOCK NUMBER TO ADDRESS IN TT
297 MOVE J,MTBLKS(W) ;GET WRITE BLOCK SIZE
300 ;MAG TAPE WRITE BUFFER DISCARD ROUTINE
302 MTWBFD: PUSHJ P,MTIECK
307 PUSHJ P,UFLS ; MAKE SURE ROOM IN COMMAND BUFFER EXISTS IN CASE OF PCLSRING
308 MOVE T,MTBLKS(W) ; DISCARD BUFFER. FIRST SEE HOW BIG IT IS
310 CONO PI,UTCOFF ;CAN'T TOLERATE ANY HANKY PANKY
311 SETOM MTMDN(W) ;CLEAR IT
312 SETZM MSMPRC(W) ; CLEAR COUNT
313 JUMPE T,MEMR ; DON'T DO ANYTHING BUT RETURN BLOCK IF NO WORDS
314 DPB T,[MWC,,MEMBLT(A)] ; STORE WORD COUNT
315 SKIPG MSNBOL(W) ; LIST STARTED YET?
317 HLRZ TT,MSBUFP(W) ; GET OLD IN POINTER
318 DPB A,[MLO,,MEMBLT(TT)] ;CHAIN BACK
320 MTWBD1: HRRM A,MSBUFP(W) ; START NEW LIST
321 HRLM A,MSBUFP(W) ; IN = OUT = (A)
323 DPB TT,[MLO,,MEMBLT(A)] ; INDICATE END OF LIST
324 AOS MSNBOL(W) ; ONE MORE BUFFER ON LIST
331 SETZM MTCEFW(W) ; INDICATE SOMETHING WRITTEN
334 SUBTTL MTCMD - GIVE COMMAND TO PI LEVEL
337 ;RH(W) HAS XPORT NUMBER
338 ;RH(B) HAS ADDR OF INTERUPT ROUTINE
340 MTCMD: MOVEI T,MSCBL ; COMAND BUFFER LENGTH
341 CAMG T,MSCMDC(W) ;COMAND COUNT
342 PUSHJ P,UFLS ; WAIT FOR ROOM
343 MTCMD1: MOVE T,MTCMBP(W) ; GET POINTER TO RING BUFFER
345 SUB T,[MSCBL,,MSCBL] ; REACHED END OF BUFFER, RING IT
346 MOVEM B,(T) ; STORE COMMAND
347 MOVEM T,MTCMBP(W) ; STORE NEW POINTER
349 AOS MSCMDC(W) ; INDICATE ONE MORE COMMAND
350 JRST MSTRTR ; START UP PI ROUTINE
352 SUBTTL MTIECK - CHECK FOR IOC ERROR
354 MTIECK: PUSH P,A ; CHECK FOR IOTERR
356 TLNN A,%MAERR ; ERROR AT PI?
359 PUSHJ P,UFLS ; LET PI CLEAR BEFORE MUNGING BUFFERS
365 PUSHJ P,MTCBFF ; FREE CHAIN
367 MOVE T,MGCMTS(W) ; GET CONI MTS,
368 TRNE T,440000 ; XPT HUNG,ILLOP
370 TRNE T,23600 ; PAR ERROR,R/C, RLI,DL,BT
371 JRST IOCER3 ; IRRECORVERABLE DATA ERROR
373 JRST IOCER9 ; EOT, DEV FULL
374 MOVE A,MGEOFR(W) ; LOGICAL EOT
377 JRST IOCER3 ; UNKNOWN, GIVE IRR DATA
379 SUBTTL MAG TAPE .STATUS ROUTINE
381 STAMTC: LDB W,[MTXP(R)] ; LOAD W
382 DPB A,[60300,,D] ; OPEN MODE
384 LDB A,[.BP %MAETW_22,MSRAC(W)] ; EOT ON WRITE
385 LDB B,[.BP %MAETR_22,MSRAC(W)] ; EOT ON READ
387 DPB B,[140100,,D] ;EOT
390 DPB A,[150100,,D] ; 7 OR 9
391 LDB A,[160100,,MTCONO(W)]
393 DPB A,[200100,,D] ;PARITY
394 LDB A,[60200,,MTCONO(W)] ; DENSITY
399 LDB A,[.BP %MARCE_22,MSRAC(W)] ; READ COMPARE ERROR
403 TRNE A,20000 ; OR CORE DUMP
405 TRO D,140000 ; IBM, 9 TRACK AND 800 BPI
409 ;RCHST ROUTINE FOR MAG TAPE
411 RCHMGT: HLRZ E,(R) ;OPEN-MODE IS KEPT IN LH OF IOCHNM WORD - HOW CONVENIENT!
412 LDB J,[MTXP(R)] ;GET THE MAG TAPE DRIVE NUMBER
413 MOVSI J,'MT0(J) ;RETURN THAT DRIVE'S DEVICE NAME.
414 TRZ E,(.BM MTXP) ;CLEAR THE PLACE IN THE OPEN-MODE THAT HAS THE DRIVE #.
415 JRST POPJ1 ;SKIP SO THAT J OVERRIDES BUILT-IN DEVICE NAME.
419 SUBTTL MAG TAPE STORAGE AREA
421 MGVTC: 0 ; 1 SCRATCH WORD FOR VIRGIN TAPE CHECK
422 MGRWCD: BLOCK NMTCS ; REWIND COMMAND
423 MGEOTT: BLOCK NMTCS ; TIMEOUT FOR VIRGIN TAPE
424 MGJDTI: 0 ; WAIT FOR JOB DONE TIME OUT
425 MGEOFR: BLOCK NMTCS ; NUMBER OF EOFS SINCE LAST READ
426 MGNWRD: 0 ; NUMBER OF WORDS READ IN A PI LEVEL READ
427 MTPSAV: BLOCK NMTCS ; STORAGE TO RESTORE P ON EOF
428 MSRAC: BLOCK NMTCS ; MAG TAPE GENERAL GARBAGE
430 %MAEOF==400000 ; 4.9 EOF ON READ
431 %MAETR==200000 ; 4.8 EOT ON INTERNAL READ
432 %MAETW==100000 ; 4.7 EOT ON WRITE
433 %MAERR==040000 ; 4.6 PI ERROR
434 %MARCE==020000 ; 4.5 READ COMPARE ERROR
435 %MACTH==014000 ; 4.4 CORE ALLOCATOR SAYS STOP
436 ; 4.3 " (WHY 2 BITS?)
437 %MASTP==002000 ; 4.2 STOP READ AHEAD
438 %MANWT==001000 ; 4.1 NOTHING WRITTEN ON TAPE YET
439 %MAEFA==000400 ; 3.9 EOF SEEN ON READ-AHEAD, USER HASN'T SEEN YET
440 %MAESO==000200 ; 3.8 EOF READ SINCE OPEN
441 %MAMSO==000100 ; 3.7 TAPE MOVED SINCE FIRST OPEN
442 %MAREW==000040 ; 3.6 REWINDING FLAG
443 %MARAC==000020 ; 3.5 READ ACTIVE FLAG
444 MGTBZY: -1 ; FLAG TO GET INTURPT STARTED
445 MTCONO: REPEAT NMTCS,\.RPCNT_17+20 ; MAIN CONO STORAGE
446 MGUNIT: -1 ; UNIT EXPECTING INTERUPT
447 MGCMTS: BLOCK NMTCS ; PI CONI MTS STORAGE
448 MGCMTC: BLOCK NMTCS ; PI MTC STORAGE
449 MGWCW: 0 ; WAIT FOR CONTROL WORD WRITTEN FLAG
450 LMIOWD: 0 ; LAST MIOWD
451 MGERRC: BLOCK NMTCS ; ERROR COUNT
452 MTMFNC: BLOCK NMTCS ; .MTAPE FUNCTION STORAGE
453 MTMCNT: BLOCK NMTCS ; .MTAPE COUNT
454 MTMTAP: BLOCK NMTCS ; MTAPE CALL WORD
455 MTCEFW: BLOCK NMTCS ; NUMBER OF EOF'S WRITTEN AT CLOSE
456 MSCMDC: REPEAT NMTCS,0 ; NUMBER OF COMMANDS
457 MSBUFP: REPEAT NMTCS,0 ; MAG TAPE BUFFER POINTER IN,,OUT
458 MSCRW: BLOCK NMTCS ; -1=>OUTPUT 0=>INPUT
459 MSMPRC: BLOCK NMTCS ; WORDS LEFT IN BUFFER
460 MSMPRP: BLOCK NMTCS ;NEXT WORD IN BUFFER
461 MTMDN: REPEAT NMTCS,-1 ; BLOCK ACTIVE AT MP
462 MTUSE: REPEAT NMTCS,-1 ; NUMBER OF CHANNELS OPEN ON THIS MTAPE
463 MTUSR: REPEAT NMTCS,-1 ; USER INDEX OF XPORT
464 MSNBOL: BLOCK NMTCS ; NUMBER OF BUFFERS ON LIST
465 MGCABN: REPEAT NMTCS,-1 ; BUFFER ACTIVE AT PI LEVEL
466 MTBLKS: BLOCK NMTCS ; WRITE, BUFFER SIZE
467 ; READ, SIZE OF LAST RECORD READ
468 MGQDLP: REPEAT NMTCS,-MGQDLL,,CONC MGQD,\.RPCNT,-1 ;QDL POINTER
470 CONC MSCB,\.RPCNT,: BLOCK MSCBL ; COMMAND BUFFER
471 MGRCV ; TO RING BUFFER
473 MGNCMD ; GET NEW COMMAND
474 CONC MGQD,\.RPCNT,: BLOCK MGQDLL
475 IFE .RPCNT,MSLCTB==.-MSCB0 ; LENGTH OF EACH TABLE
477 MTCMBP: REPEAT NMTCS,-MSCBL-1,,CONC MSCB,\.RPCNT,-1 ; INPUT TO COMMAND TABLE
478 MGCMBP: REPEAT NMTCS,4400,,CONC MSCB,\.RPCNT,-1 ; OUTPUT FROM COMAND TABLE
479 IFE KL10P,MIOWD: BLOCK 2 ; CHANNEL PROGRAM
485 MGEMTC: 0 ;CONI MTC, AT LAST ERROR
486 MGEMTS: 0 ;CONI MTS, AT LAST ERROR
489 SUBTTL MAG TAPE PI LEVEL
491 ;ROUTINES TO GET INTERUPT ROUTINES STARTED
492 MGXGO: MOVE Q,MGQDLP(W) ;GET QDLPOINTER
493 PUSHJ P,QPOPJ ;CALL ROUTINE . SHOULD FINISH WITH POPJ P,OR PUSHJ Q,CPOPJ
494 ;PUSHJ Q,CPOPJ IF ROUTINE WANTS TO RETURN
495 ;POPJ P, IF AT END OF COMAND. AND NEW IS TO BE GOTTEN
496 MOVEM Q,MGQDLP(W) ; STORE NEW QDL
499 MGRCV: MOVNI A,MSCBL+1 ;AT END OF COMAND LIST,RING IT
500 ADDM A,MGCMBP(W) ;RING THE BUFFER
501 MGNCM1: ILDB B,MGCMBP(W) ; GET NEW COMMAND
504 MGNCMD: AOBJN Q,MGNCM1 ; AT BOTTOM OF QDL, SIMULATE PUSHJ AND GET NEW COMMAND
505 JRST 4,. ;QDL POINTER CLOBBERED
510 MSTRTR: CONO PI,UTCOFF ; GET MAGTAPE INTURPT STARTED
516 ;HERE FOR MAG TAPE FLAG CHANNEL INTERUPT
517 MGHBRK: SKIPGE W,MGUNIT ; LOAD UNIT
518 JRST MGUBRK ;NO ONE WANTS IT
520 CAME W,B ; UNITS AGREE
521 JRST 4,. ; WE MUST NOT MIX UNITS
532 MGSBRK: SETOM MGTBZY ;HERE FOR ANY RANDOM MP PI STARTUP
534 SKIPG MSCMDC(B) ;ANY COMMANDS IN BUFFER
537 JRST DSKEX ; THEN GOTO DSKEX
541 TDNN B,MSRAC(W) ; CORE ALLOCATOR SAYING GO AWAY
542 PUSHJ P,MGXGO ; START UP THAT ROUTINE
544 JRST MGSBK1 ; ANY MORE?
546 MGUBRK: LDB W,[MUNITF,,A] ; WHO CAUSED INTERUPT?
549 CONO MTS,31 ; CLEAR INTERUPT
552 ; ROUTINE TO WAIT FOR JOB DONE TO SET
554 TRNE J,440000 ;SKIP IF STARTED SUCCESSFULLY
555 JRST MGERR ;JOB-DONE ISN'T EVER GOING TO SET
557 SKIPN MGJDTI ; TIME OUT?
562 MGWJD2: TRNN J,100 ; JOB DONE?
563 JRST MGOVER ; NOT SET
565 CONI MTC,I ; GET CONI MTC
568 SKIPE MGWCW ; SHOULD I WAIT FOR CONTROL WORD WRITTEN
569 PUSHJ Q,MGWCWC ; CHECK TO SEE IF IT IS WRITTEN
570 SETZM MGWCW ;CLEAR FLAG
571 CONO MTS,30 ; CLEAR CHANNEL CONDITIONS
573 CONO MTC,(B) ; RELESE MTC, CLEAR JOB DONE
576 POPJ Q, ;CHANNEL ERROR
579 POPJ Q, ; RANDOM OTHER NON PERFECTIONS, NOT NECESSARILY ERRORS
580 JRST QPOPJ1 ; SUCCESS
583 MGGXPT: CONSO MTS,2 ; LOAD NEXT UNIT SET?
584 JRST MGOVER ; NO, WAIT FOR IT
587 ADDI T,10.*30. ; TIME OUT IN 10. SECONDS
590 CONO MTC,MNOPIN(B) ; SELECT DRIVE
592 JFCL ; WAIT FOR JOB DONE, BUT ALLOW ANY ERRORS
596 MGOVER: CONSZ MTS,440020 ; ANY PROBLEMS?
597 JRST MGERR ;TAPE HUNG, ILL FUNCTION, CHANNEL ERROR
602 MGERR: CONI MTS,MGEMTS
604 MOVSI T,%MARAC ;READ NOT ACTIVE, FOR SURE
606 SETZM MSCMDC(W) ; NO COMMANDS
607 SETOM MGUNIT ; CLEAR UNIT WAIT FLAG
610 TLNE J,160 ; CHANNEL ERROR?
611 BUG PAUSE,[MTAPE: CHANNEL ERROR, STATUS=],OCT,J,[MICWA+1=],OCT,MICWA+1,[MIOWD=],OCT,MIOWD
613 SKIPL A,MGCABN(W) ; ANY PI BUFFERS?
616 HRLZI B,%MAERR ; PI ERROR
617 IORM B,MSRAC(W) ; STORE IN STATUS WORD
618 MOVE Q,[-MGQDLL,,MGQD0-1]
623 MOVE Q,[-MSCBL-1,,MSCB0-1]
625 MOVEM Q,MTCMBP(W) ; INITIALIZE MP AND PI COMMND POINTERS
626 MOVE Q,[4400,,MSCB0-1]
630 ANDCAM B,MSRAC(W) ; CLEAR REWINDING
631 SKIPN MSCRW(W) ; DONE IF READING
633 SKIPN MSNBOL(W) ; ANY BUFFERS ON LIST?
635 MGERR1: HRRZ A,MSBUFP(W)
638 SOSLE MSNBOL(W) ; ANY MORE
640 SETZM MSBUFP(W) ;EMPTY LIST
645 SKIPE MICWA+1 ; CONTROL WORD WRITTEN?
647 CONO MTS,4 ; TELL IT TO WRITE IT
648 MGWCW1: SKIPE MICWA+1
653 MGWCW2: MOVE I,MGCMTC(W)
654 MOVE J,MGCMTS(W) ;RESTORE STATUS
655 TLO J,10 ;SET CONTROL WORD WRITTEN
660 MGDCSI: SKIPA A,[BLKI MTC,MIOWD]
661 MGDCSO: MOVE A,[BLKO MTC,MIOWD]
668 SUBTTL MAG TAPE PI LEVEL WRITE
670 MGWRIT: PUSHJ Q,MGGXPT ; GET XPORT
671 TRNE J,600010 ; WRITE LOCKED,HUNG OR REWINDING
673 MOVEM W,MGUNIT ; SET UNIT
674 MOVSI A,%MACTH ; CORE ALLOC WANT QUIT TEMPORARLY
677 HRRZ A,MSBUFP(W) ; GET BUFFER POINTER
678 HLRZ B,MSBUFP(W) ; IN POINTER
679 SOS MSNBOL(W) ; ONE LESS BUFFER
680 MOVEM A,MGCABN(W) ; BUFFER ACTIVE AT PI
681 SKIPN MSCRW(W) ; WRITING
685 SETZM MSBUFP(W) ; EMPTY BUFFER LIST
688 MGWRT1: LDB B,[MLO,,MEMBLT(A)] ; BACK POINTER
689 HRRM B,MSBUFP(W) ; NEW OUT POINTER
690 MGWRT2: LDB B,[MWC,,MEMBLT(A)] ; WORD COUNT
693 IFN KL10P, LSH B,4 ; SHIFT IF KL10 DATA CHANNEL
694 IFN KL10P, MOVE R,A ; SAVE CORE PAGE NUMBER FOR CACHE SWEEP
695 LSH A,10. ; FORM WORD POINTER
697 HRRM A,B ; CHANNEL POINTER IN B
698 IFN TM10B, DATAO MTS,[MICWA] ; SET TO GO TO MAG TAPE
699 IFN TM10A, PUSHJ Q,MGDCSO
701 MOVEM B,LMIOWD ; LAST MIOWD
702 SETZM MIOWD+1 ; TELL CHANNEL TO STOP
704 PUSHJ P,CSHSWP ; UNLOAD BUFFER FROM CACHE INTO CORE
708 CONO MTC,MWRITE(B) ; DO IT
709 PUSHJ Q,MGWTJD ; WAIT FOR JOB DONE
710 JRST MGWBT ; WRITE BLANK TAPE AND TRY AGAIN
711 MGWRT3: MOVE A,MGCABN(W) ; GET BUFFER NUMBER
712 HRLZI B,%MAETW+%MAERR ; END OF TAPE CHECK
713 TRNE J,4000 ; END POINT
714 IORM B,MSRAC(W) ; TELL MP
715 LDB T,[MUR,,MEMBLT(A)]
716 CAIE T,MUMGB ; DO I OWN BLOCK
718 SETOM MGCABN(W) ; NO BUFFER ACTIVE AT PI
719 PUSHJ P,IMEMR ; GIVE BACK BUFFER
721 IORM A,MSRAC(W) ; TAPE MOVEMENT
725 IFN TM10B, SETZM MIOWD ; WRITE BLANK TAPE OVER POSSIBLE BAD SPOT
728 MOVEM A,MIOWD ; ONE RECORD
730 TRNE J,644010 ; BAD TYPES OF ERRORS
733 CONO MTC,MSPRR(B) ; REVERSE 1 RECORD
734 PUSHJ Q,MGWTJD ; WAIT FOR JOB DONE
737 MOVEM B,MIOWD ; RESTORE MIOWD
739 CONO MTC,14000(B) ; WRITE WITH EXTENDED EOR
740 PUSHJ Q,MGWTJD ; WAIT
741 JRST MGWBT ; INFINITE RETRIES ; JRST MGERR ; ERRORS
744 MGWRT4: PUSHJ Q,CPOPJ ; WAIT A WHILE
747 SUBTTL MAG TAPE PI LEVEL READ
749 MGREAD: PUSHJ Q,MGGXPT ; GET XPORT
750 MGRD0: TRNE J,600000 ; UNIT HUNG OR REWINDING OR EOT
752 MOVE B,MGEOFR(W) ; EOF'S READ
755 MOVEM W,MGUNIT ; STORE UNIT NUMBER
756 SKIPE MSCRW(W) ; MAKE SURE READING
758 MOVSI B,%MACTH ; CORE ALLOCATOR WANT OUT
761 JRST MGROVR ; WAIT FOR IT
762 MOVEM A,MGCABN(W) ; STORE ACTIVE BUFFER AT PI LEVEL
764 DPB B,[MUR,,MEMBLT(A)] ; CLAIM BLOCK
765 HRREI B,-MGNRTY ; NUMBER OF RETRIES
766 MOVEM B,MGERRC(W) ; STORE ERROR COUNT
768 LSH A,10. ; FORM ADDRESS
770 IFE KL10P, HRLI B,-2000
771 IFN KL10P, HRLI B,-2000_4
773 MOVEM B,LMIOWD ; STORE LAST IOWD FOR RETRY
774 IFN TM10B, DATAO MTS,[MICWA] ; SET CHANNEL STARTING ADDRESS
775 IFN TM10A, PUSHJ Q,MGDCSI
776 IFN TM10B, SETZM MICWA+1
778 MGRD1: MOVEM B,MIOWD ; CHANNEL COMMAND
780 MOVEM B,MGNWRD ; ASSUME AT FIRST THAT THE RECORD TO BE READ HAS 2000 WORDS
782 PUSHJ P,CSHSWP ; ENSURE NO RESIDUE OF THIS PAGE IN CACHE
786 CONO MTC,MREAD(B) ; DO IT
787 IFN TM10B, SETOM MGWCW ; TELL IT TO WAIT FOR CONTROL WORD WRITTEN
788 PUSHJ Q,MGWTJD ; WAIT FOR JOB DONE
790 MGRD2: SKIPG A,MGCABN(W)
791 BUG ;BUFFER SHOULDN'T BE -1, WOULD SCREW UP MEMBLT
792 SETOM MGCABN(W) ; NO BUFFER ACTIVE AT PI
793 HLRZ T,MSBUFP(W) ;LAST BUFFER IN
795 DPB B,[MLO,,MEMBLT(A)] ; BACK POINTER IS 0
797 HRRM A,MSBUFP(W) ; ONE BUFFER MEANS IN = OUT
798 HRLM A,MSBUFP(W) ; NEW IN POINTER
800 DPB A,[MLO,,MEMBLT(T)] ; CHAIN BACK BUFFERS
801 AOS C,MSNBOL(W) ; ONE MORE BUFFER ON LIST (COUNT TO C)
803 DPB B,[MWC,,MEMBLT(A)] ; NUMBER OF WORDS IN BUFFER
805 JRST [ MOVSI B,%MAESO+%MAEFA ;YES
808 DPB B,[MSEOFP,,MEMBLT(A)]
811 JRST MGRD4 ; LOGICAL EOT, SPACE BACK OVER IT
813 SETZM MGEOFR(W) ; NO EOF
815 IORB A,MSRAC(W) ; TAPE MOVEMENT
818 TRNN J,10000 ;IF NO EOF, NOT 6 BUFFERS YET,
822 JRST MGRD0 ; AND NO REQUEST TO STOP, KEEP READING
823 MGRD5: MOVSI A,%MASTP+%MARAC ;GIVE UP FOR NOW, CLEAR READ ACTIVE
825 JRST MGCMDR ;MP LEVEL WILL SEND NEW READ COMMAND WHEN READY
827 MGRD3: DPB B,[MSEOFP,,MEMBLT(A)] ;PHYSICAL EOT
828 DPB B,[420100,,MSRAC(W)] .SEE %MAETR ; INDICATE EOT ON READ
831 MGRD4: MOVSI A,%MAESO+%MARAC+%MASTP ;SECOND EOF, LOGICAL EOT
838 JRST MGERR ; CHANNEL ERROR
843 JRST MGMRT ; DATA TYPE OF ERROR OR OVERRUN, MAYBE TRY AGAIN
844 ;RECORD LENGTH ERROR, ADJUST MGNWRD
845 IFN TM10B, HRRZ A,MICWA+1
846 IFN TM10A, HRRZ A,MIOWD
849 IFN TM10B, SOS A ; CHANNEL FUNNYNESS
850 CAIN A,1 ; POS EOF IS ALL
852 MGRER1: MOVEM A,MGNWRD
855 MGRER2: TRNE J,14000 ; 1 WORD, EOF? EOT?
856 SETZM A ; YES, THIS RECORD HAS ZERO LENGTH, IT JUST CARRIES MSEOFP
859 MGMRT: AOSL MGERRC(W)
860 JRST MGERR ; TOO MANY ERRORS
861 IFN TM10B, SETZM MIOWD
864 MOVEM A,MIOWD ; ONE RECORD
868 CONO MTC,MSPRR(B) ; REVERSE RECORD
870 JRST MGERR ; NO ERRORS ALLOWED
871 IFN TM10A, PUSHJ Q,MGDCSI ; PUT BACK PI 1 BLKI
873 JRST MGRD1 ; TRY AGAIN
875 MGROVR: PUSHJ Q,CPOPJ
878 SUBTTL MAG TAPE PI LEVEL SPACE
880 MGSPCF: PUSHJ Q,MGGXPT ; GET XPORT SPACE FORWARD
883 MGSPC: MOVEM W,MGUNIT
884 MOVE B,MGRWCD(W) ; GET COMMAND
897 JRST MGERR ; NO RETRIES
902 CAIL B,2 ;TOO MANY EOF'S
904 MGCMDR: SOS MSCMDC(W) ; GENERAL EXIT ROUTINE
909 CONO MTC,MNOPIN(B) ; INTERUPT WHEN UNIT READY
910 MOVEM W,MGUNIT ; RESTORE UNIT NUMBER
916 MGSPFR: MOVEI B,MSPFR ; SPACE FOR RECORD
919 IORM B,MSRAC(W) ; TAPE MOVEMENT
922 MGSPFF: MOVSI B,%MAESO
924 JRST MGCMDR ; EOF ALREADY READ DURING THE READ
925 AOS MSCMDC(W) ;SO IT WILL RETURN
930 JRST MGCMDR ; EOF READ ON SPACE RECORD. DONE
935 MGSPRR: MOVEI B,MSPRR
941 MGSPCR: PUSHJ Q,MGGXPT ; SPACE REVERSE
945 JRST MGCMDR ; THEN DO NOTHING
962 SOSGE MGEOFR(W) ; ONE LESS EOF
966 MGSPRF: MOVEI B,MSPRF ; REVERSE FILE
968 MOVSI A,%MAESO ; EOF READ IN FORWARD DIRECTION
971 AOS MSCMDC(W) ; YES DO IT TWICE
974 ANDCAM B,MSRAC(W) ; TURN OFF FLAG
975 JRST MGSPCR ; SECOND TIME
977 MGRWD1: PUSHJ Q,MGGXPT ; REWIND
979 MOVE B,MGRWCD(W) ; GET COMMAND
982 PUSHJ Q,MGWTJD ; WAIT
986 ANDCAM A,MSRAC(W) ;CLEAR TAPE MOTION
987 MGRWD2: TRNN J,200000 ; STILL REWINDING?
994 MGRWD3: MOVE T,TIME ;WAIT 1 SECOND MORE
995 ADDI T,30. ;THIS IS AN ATTEMPT TO FIX A HARDWARE BUG
1004 MGRWND: MOVEI B,MREWND ; NORMAL REWIND
1006 MGRWDM: MOVEI B,MRWNDD ; REWIND AND DISMOUNT
1009 MOVSI A,%MAMSO+%MAREW
1013 MGSEOT: PUSHJ Q,MGGXPT ; SKIP TO LOGICAL EOT
1017 TRNE J,100000 ; BOT?
1018 JRST MGVTCK ; VIRGIN TAPE CHECK
1019 MGNVT: MOVE B,MTCONO(W)
1022 MOVE A,[-1,,MGVTC-1]
1023 MOVEM A,MIOWD ; ONE RECORD
1025 IFN TM10B, SETZM MIOWD
1026 CONO MTC,MSPRR(B) ; SPACE REVERSE FIRST
1027 PUSHJ Q,MGWTJD ; WAIT
1031 MGEOT2: MOVE B,MTCONO(W)
1032 CONO MTC,MSPFF(B) ; SKIP FORWARD FILE
1035 MOVSI B,%MAETR ; EOT CHECK
1037 IORM B,MSRAC(W) ; TELL MP
1040 MOVE A,[-1,,MGVTC-1]
1041 MOVEM A,MIOWD ; ONE RECORD
1043 IFN TM10B, SETZM MIOWD
1044 CONO MTC,MSPFR(B) ; SPACE FORWARD RECORD
1047 MOVSI B,%MAETR ; EOT AGAIN
1049 IORM B,MSRAC(W) ; TELL MP
1050 TRNN J,10000 ; EOF ALSO?
1051 JRST MGEOT2 ; NO, TRY AGAIN
1052 MOVE B,MTCONO(W) ; YES, NOW GO BACK OVER LAST
1056 MOVSI B,%MAEOF+%MAETR ; TELL MP,EOF
1061 ADDI T,60. ; TWO SECOND TIME OUT
1062 MOVEM T,MGEOTT(W) ; EOT TIME
1068 MOVE A,[-1,,MGVTC-1]
1073 CONO MTC,MREAD(B) ; DO READ, WAIT EITHER FOR JOB DONE OR TIME OUT
1077 JRST MGNVT ; NOT VIRGIN TAPE
1079 JRST MGERR ; ERRORS?
1081 CAMG T,TIME ; TIME UP?
1083 PUSHJ Q,CPOPJ ; WAIT
1086 MGVT: MOVE B,MTCONO(W)
1088 CONO MTC,MNOPIN(B) ; NO-OP WAIT FOR JOB DONE
1090 JFCL ; SEE IF I CARE IF THERE ARE ERRORS
1093 PUSHJ Q,MGRWD1 ; REWIND
1096 JRST MGCMDR ; RETURN
1098 MGMEOT: PUSHJ Q,MGGXPT
1102 SKIPE MTCEFW(W) ;HOW MANY EOF WRITTEN?
1104 AOS MSCMDC(W) ; SO WILL RETURN
1107 MGMET1: MOVE A,MTCEFW(W)
1113 MGMET2: MOVE A,MSRAC(W)
1114 TLNE A,%MANWT ; BACK OVER LAST?
1116 AOS MSCMDC(W) ; SO IT WILL RETURN
1118 MGMET3: MOVSI A,%MANWT
1123 MGWEOF: PUSHJ Q,MGGXPT
1132 IORM A,MSRAC(W) ; TAPE MOVEMENT
1133 JRST MGCMDR ; RETURN
1135 MGSTAT: PUSHJ Q,MGGXPT ; GETS STATUS
1138 MGW3IN: PUSHJ Q,MGGXPT
1147 MOVE A,[-1,,MGVTC-1]
1152 CONO MTC,MW3IN(B) ; WRITE THE RANDOM WORD PRECEEDED BY 3 INCHES OF BLANK TAPE
1154 JFCL ; ALLOW BAD TAPE ERROR
1155 JRST MGSPRR ; NOW SPACE RECORD REVERSE OVER THE ONE WORD
1161 ; COMMAND/ COUNT,,FUNCTION
1163 AMTAPE: XCTR XR,[HLRZ R,(J)]
1166 HRRZM R,UUAC(U) ; SO THAT ERRORS WILL BE REPORTED ON THE
1168 ADDI R,IOCHNM(U) ; FORM IOCHNM POINTER
1169 HRRZ A,(R) ; A: CLSTB/IOTTB index
1170 CAIL A,MTUAIX ; Min index for tape
1172 POPJ P, ; Laconic error reportage.
1173 LDB W,[MTXP(R)] ; GET XPORT NUMBER
1174 CAME U,MTUSR(W) ; SAME USER
1177 MOVEM J,MTMTAP(W) ; SAVE J
1181 HRRZM A,MTMFNC(W) ;STORE FUNCTION
1182 HLREM A,MTMCNT(W) ;AND COUNT
1183 SKIPN MTMCNT(W) ;A COUNT OF ZERO ALWAYS MEANS ONE, FOR COMPATIBILITY
1184 AOS MTMCNT(W) ; WITH THE OLD CODE.
1186 CAIL A,NMTAPC ; LEGAL COMMAND
1188 AOS (P) ; SKIP RETURN
1191 MTAPDT: MTHANG ;0 HANG TILL TAPE MOTION DONE
1193 MTRWDM ;2 REWIND AND DISMOUNT
1194 MTWEOR ;3 WRITE EOR IF APPROPRIATE
1195 MTW3IN ;4 WRITE 3 INCHES OF BLANK TAPE
1197 MTSPR ;6 SPACE RECORDS
1198 MTSPF ;7 SPACE FILES
1199 MTSPEOT ;10 SPACE TO EOT
1200 MTSTOP ;11 STOP ALL COMMAND ASSOCIATED WITH THIS COMMAND
1201 MTSBKS ;12 SET BLOCK SIZE (TO COUNT)
1202 MTRBKS ;13 READ BLOCK SIZE (TO AC)
1205 MTSBKS: MOVE A,MTMCNT(W) ;DESIRED BLOCKSIZE
1206 CAIL A,4 ;CHECK REASONABLENESS
1208 SOSA (P) ;FAIL IF TOO BIG OR TOO SMALL
1209 MOVEM A,MTBLKS(W) ;OK, CHANGE WRITE-BUFFER SIZE
1212 MTRBKS: MOVE A,MTBLKS(W)
1215 MTHANG: SKIPLE MSCMDC(W) ; HANG UNTILL ALL MOTION FINISHED
1219 MTRWND: MOVEI B,MGRWND ; REWIND
1220 MTRWD1: SKIPE MSCRW(W)
1226 MTRWDM: MOVEI B,MGRWDM ; REWIND AND DISMOUNT
1229 ;"WRITE END OF RECORD" - THIS IS REALLY THE FORCE SYSTEM CALL, OR SHOULD BE.
1230 MTWEOR: SKIPG MTMDN(W) ; ANY BUFFERS STARTED
1232 SKIPE MSCRW(W) ; WRITING
1233 JRST MTWBFD ; DISCARD BUFFER
1234 MTSOSP: SOS (P) ; NOT WRITING, ERROR
1237 MTWEOF: SKIPN MSCRW(W) ; WRITING?
1240 MOVEI B,MGWEOF ; WRITE EOF
1243 ANDCAM TT,MSRAC(W) ; SOMETHING WRITTEN
1246 MTW3IN: SKIPN MSCRW(W) ; WRITING?
1254 ;SPACE RECORDS, +=FORWARD, -=BACK
1255 MTSPR: SKIPE MSCRW(W) ; NOT ALLOWED IF WRITING
1257 PUSHJ P,MTFLRA ;FLUSH READ-AHEAD, FIND OUT HOW FAR OFF WE ARE
1258 ADD B,C ;NUMBER OF RECORDS TAPE IS AHEAD OF USER (EOF=RECORD)
1259 MOVNS B ;SUBTRACT THIS FROM USER'S REQUEST
1261 JUMPE B,CPOPJ ;IF COUNT IS NOW ZERO, WE ARE DONE
1262 MTSPR1: PUSHJ P,MTCNTR ;UPDATE USER'S COPY IN CASE PCLSR
1263 JUMPG B,MTSPFR ; SPACE FORWARD
1264 MOVEI B,MGSPRR ; SPACE REVERSE
1270 MTSPFR: MOVEI B,MGSPFR
1276 ;THIS ROUTINE FLUSHES READAHEAD. CALL BEFORE DOING A SPACING OPERATION
1277 ;THIS DOESN'T ACTUALLY UNDO THE EFFECT ON THE DRIVE
1278 ;OF THE READ-AHEAD. IT DOES MAKE SURE THAT READ-AHEAD'S EFFECT CAN'T
1279 ;CHANGE, THEN RETURNS IN B THE NUMBER OF RECORDS AHEAD (NON-NEGATIVE)
1280 ;AND IN C THE NUMBER OF EOF'S AHEAD (0 OR 1). IF CALLED TWICE IT WILL
1281 ;RETURN ZERO THE SECOND TIME. BE SURE TO UPDATE YOUR PARAMETERS.
1282 MTFLRA: PUSHJ P,MTCNTR ;FIRST, ENSURE WRITEABILITY, MUSTN'T PCLSR IN MTCNTR LATER
1285 IORM B,MSRAC(W) ;IF READ IS ACTIVE, TELL IT TO STOP
1286 TDNE T,MSRAC(W) ;AWAIT CESSATION OF READ
1287 PUSHJ P,UFLS ;IF THIS PCLSR'S OUT WITH %MASTP SET, NO GREAT HARM DONE.
1288 ANDCAM B,MSRAC(W) ;THEN TURN OFF %MASTP, THINGS ARE NOW QUIET
1289 SKIPLE MSCMDC(W) ;BEFORE MESSING WITH BUFFERS, WAIT FOR PI TO QUIESCE
1291 MOVE B,MSNBOL(W) ;NUMBER OF BUFFERS = NUMBER OF RECORDS
1292 LDB C,[.BP (%MAEFA),MSRAC(W)] ;1 IF PAST EOF WHICH THE USER DOESN'T KNOW ABOUT
1293 MOVSI T,%MAEFA ;NOW GET RID OF THE READ-AHEAD
1297 MTSPF: SKIPE MSCRW(W) ; NOT ALLOWED IF WRITING
1299 PUSHJ P,MTFLRA ;FLUSH READ-AHEAD
1300 MOVN B,C ;NUMBER OF FILES TAPE IS AHEAD OF USER
1303 MTSPF1: PUSHJ P,MTCNTR ;UPDATE USER'S COUNT IN CASE OF PCLSR
1304 JUMPG B,MTSPFF ; SPACE FORWARD FILES
1311 MTSPFF: MOVEI B,MGSPFF
1317 MTCNTR: HRRZ A,MTMTAP(W)
1323 MTSTAT: SKIPLE MSCMDC(W) ; WAIT TILL ALL COMMANDS DONE
1325 MOVEI B,MGSTAT ; GET CONI'S
1326 PUSHJ P,MTCMD ; GIVE TO PI
1327 SKIPLE MSCMDC(W) ; WAIT TILL DONE
1333 MTSPEOT: MOVEI B,MGSEOT ; SPACE TO LOGICAL EOT
1334 JRST MTCMD ;NOTE THIS IS INDEPENDENT OF READ-AHEAD
1336 MTSTOP: CONO PI,UTCOFF ;THIS DOESN'T DEAL WITH READ-AHEAD, PROBABLY OK
1337 SETZM MSCMDC(W) ;NO MORE COMANDS
1338 MOVE Q,[-MGQDLL,,MGQD0-1]
1342 MOVEM Q,MGQDLP(W) ; RESTORE Q
1343 MOVE Q,[-MSCBL-1,,MSCB0-1]
1345 MOVEM Q,MTCMBP(W) ; INITIALIZE MP AND PI COMAND POINTERS
1346 MOVE Q,[4400,,MSCB0-1]
1350 PUSHJ P,IMEMR ; RELEASE MP BUFFER
1353 SETZM MSMPRC(W) ; SO BLKT WON'T GET UNHAPPY
1354 PUSHJ P,MTCBFF ; FLUSH BUFFER LIST
1355 CAME W,MGUNIT ; SAME UNIT?
1357 SETOM MGUNIT ; SO INTERUPT WILL GO AWAY
1358 CONI MTC,I ; SEE WHAT DRIVE IS BEING TALKED TO
1361 JRST UTCONJ ; IF NOT SAME UNIT, DON'T DO ANYTHING
1363 CONO MTS,31 ; STOP THE TAPE
1364 CONO MTC,(B) ; CLEAR INTERUPTS
1365 SKIPGE A,MGCABN(W) ; ANY BUFFERS ACTIVE AT PI
1367 PUSHJ P,IMEMR ; RETURN IT
1371 SUBTTL MAG TAPE CLOSE ROUTINES
1373 MTOCL: LDB W,[MTXP(R)]
1375 POPJ P, ; NOT ONLY CHANNEL OPEN
1376 AOS MTUSE(W) ; INCASE PCLSRED
1377 MOVSI A,%MAERR ;ERROR?
1382 ; PUSHJ P,UFLS ; WAIT FOR ROOM FOR THREE COMMANDS
1383 SKIPL MTMDN(W) ; MAG TAPE OUTPUT CLOSE
1384 PUSHJ P,MTWBFD ; WRITE OUT BUFFERS
1385 ; MOVEI B,MGWEOF ; WRITE OUT TWO EOF(S)
1387 ; JRST MTOCL2 ; MAY HAVE BEEN PCLSRED
1388 ;MTOCL1: PUSHJ P,MTCMD
1389 ; AOS MTCEFW(W) ; ONE MORE CLOSE EOF WRITTEN
1390 ;MTOCL2: MOVE A,MTCEFW(W)
1391 ; SOSG A ; DON'T WRITE EOF IF PCLSRED
1392 ; PUSHJ P,MTCMD ; DO IT TWICE
1398 ; PUSHJ P,MTCMD ; NOW BACK UP OVER ONE
1401 MOVEI B,MGMEOT ; MAKE EOT
1403 SKIPLE MSCMDC(W) ; NOW WAIT TILL DONE
1407 SKIPL MTMDN(W) ;ANY ACTIVE BUFFERS
1418 MTOCL3: SKIPL A,MTMDN(W)
1419 PUSHJ P,MEMR ; IF BUFFER AROUND,FLUSH IT
1424 MTICL: LDB W,[MTXP(R)]
1425 SOSL MTUSE(W) ; LAST USER
1429 CAMGE T,MSCMDC(W) ; ALLOW ONE COMMAND IF REWINDING
1430 PUSHJ P,UFLS ; ALL COMMANDS DONE
1432 TLNE T,%MAREW ; REWINDING?
1434 SKIPLE MSCMDC(W) ; NO, WAIT TILL COMMAND DONE
1436 MTICL3: SKIPL MGCABN(W) ; ANY PI BUFFERS LEFT
1438 PUSHJ P,MTRBD ;GET RID OF M.P. BUF, IF ANY
1440 PUSHJ P,MTCBFF ; FREE BUFFERS
1443 TLNE T,%MAREW ; DON'T HAVE TO SKIP TO EOF IF REWINDING
1446 TDNE A,(R) ;CHECK TO SKIP TO EOF
1449 TDNN A,MSRAC(W) ;TAPE MOVEMENT
1451 SKIPE MGEOFR(W) ;NO TIMING CONFLECT HERE SINCE WE WAITED FOR PI TO CLEAR
1452 JRST MTICL2 ;NOTE THAT THIS DISPOSES OF A READ-AHEAD EOF.
1461 MTICL2: MOVSI T,%MAREW
1462 ANDM T,MSRAC(W) ;CLEAR ALL BUT REWINDING
1465 MTCBFF: SKIPN MSNBOL(W) ;ANY BUFFERS ON CHAIN?
1467 HRRZ A,MSBUFP(W) ;YES, FREE ONE
1468 PUSHJ P,MTICL1 ; FIX CHAIN
1469 PUSHJ P,MEMR ; RETURN BUFFER
1470 SOSLE MSNBOL(W) ;ANY MORE?
1472 SETZM MSBUFP(W) ;EMPTY LIST
1475 MTICL1: LDB T,[MLO,,MEMBLT(A)] ; GET BACK POINTER