87e7435861b76063a678f98165deebb9f53cbfcd
[retro-software/dec/tops10/v4.5.git] / src / mtasrx.mac
1         TITLE   MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420\r
2 SUBTTL  T. WACHS/TH  TS  20 MAY 69\r
3         XP      VMTASR,420      ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP\r
4 \r
5 ENTRY MTASRX\r
6 MTASRX:\r
7 \r
8 INTERNAL MTADSP\r
9 \r
10 ;DISPATCH TABLE\r
11         JRST    MTAINI\r
12         JRST    HUNGTP          ;HUNG DEVICE\r
13 MTADSP: JRST    MTAREL          ;RELEASE\r
14         JRST    MTCLOS          ;CLOSE\r
15         JRST    MTOUT\r
16         JRST    MTIN\r
17         JRST    SAVCHK          ;ENTER\r
18         JRST    SAVCHK          ;LOOKUP\r
19         JRST    MTDMPO\r
20         JRST    MTDMPI\r
21         POPJ    PDP,            ;USETO\r
22         POPJ    PDP,            ;USETI\r
23         JRST    CPOPJ1          ;RENAME\r
24         POPJ    PDP,            ;CLOSE INPUT\r
25         POPJ    PDP,            ;UTPCLR\r
26         JRST    MTAP0T\r
27 \r
28 MTC=340\r
29 MTS=344\r
30 \r
31 ;MTACHN=FLAG CHANNEL\r
32 ;MTOCHN=DATA CHANNEL\r
33 ;MTFLAG=10*MTACHN + 400\r
34 ;MTBOTH=10*MTACHN+MTDCHN\r
35 ;MTALOC=40 + 2*MTDCHN\r
36 ;MTLOC1=MTALOC+1\r
37         INTERN  MTAINI,MTADDS,MTADDB\r
38         EXTERN  ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC\r
39         EXTERN  STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT\r
40         EXTERN  CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK\r
41         EXTERN  PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK\r
42 \r
43 COMPAT=1000                     ;IBM COMPATABLE 9-TRACK\r
44 DMPMOD=20000                    ;DUMP MODE FLAG\r
45 MTREW=40000                     ;MAGTAPE IS REWINDING\r
46 \r
47 MTTRY=3                         ;NO. OF TIMES TO RETRY ON AN ERROR\r
48 QUANT=3                         ;NO. OF RECORDS TO READ UNINTERRUPTED\r
49 \fTP=DAT\r
50 ;DDB\r
51 MTADDB: SIXBIT  /MTA0/\r
52         XWD     ^D30*HUNGST,MTSIZ+1\r
53         0\r
54         MTADSP\r
55         XWD     1023,154403\r
56         0\r
57         0\r
58         XWD     PROG,0\r
59         XWD     PROG,0\r
60         XP      MTADDS,.-MTADB  ;SIZE OF DDB (FOR BUILD)\r
61 \f;INITIALIZE\r
62 MTAINI: SETOM   NMTREW          ;RESET FLAGS\r
63         SETOM   UNIT\r
64         SETZM   ERRFLG\r
65         SETZM   REMNDR\r
66         CONO    MTC,0           ;TURN OFF MTC\r
67         MOVE    TAC,[JSR MTDEND] ;SET UP END-CONDITION\r
68         MOVEM   TAC,MTLOC1      ;FOR BLKI/BLKO\r
69         POPJ    PDP,\r
70 \r
71 ;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16\r
72 SAVCHK: LDB     TAC,PIOMOD      ;GET MODE\r
73         CAIN    TAC,0           ;SAVE MODE?\r
74         TRO     IOS,16          ;YES, CHANGE TO DUMP-MODE\r
75         MOVEM   IOS,DEVIOS(DEVDAT)\r
76         JRST    CPOPJ1          ;GIVE GOOD RETURN FROM LOOKUP/ENTER\r
77 ;CLOSE\r
78 MTCLOS: TLNN    DEVDAT,OUTPB    ;OUTPUT BEEN DONE?\r
79         POPJ    PDP,            ;NO. GO AWAY\r
80 \r
81         LDB     TAC,PIOMOD\r
82         CAIGE   TAC,16          ;DUMP MODE?\r
83         PUSHJ   PDP,OUT         ;NO. EMPTY LAST PARTIAL BUFFER\r
84         PUSHJ   PDP,WSYNC       ;WAIT FOR IO TO STOP\r
85         MOVEI   UUO,3           ;WRITE 2 ENDS-OF FILE\r
86         PUSHJ   PDP,MTAP1\r
87         TRNE    IOS,IOIMPM      ;WRITE LOCK?\r
88         POPJ    PDP,            ;YES RETURN\r
89         PUSHJ   PDP,SETACT\r
90         PUSHJ   PDP,WSYNC\r
91         MOVEI   UUO,3\r
92         PUSHJ   PDP,MTAP1\r
93         PUSHJ   PDP,SETACT\r
94         PUSHJ   PDP,WSYNC\r
95         MOVEI   UUO,7           ;AND BACKSPACE OVER ONE OF THEM\r
96         JRST    MTAP1\r
97 \r
98 HUNGTP: TLZN    IOS,MTREW       ;TAPE REWINDING?\r
99         JRST    THRUTP  ;NO. GIVE UP CONTROL\r
100         SOS     NMTREW  ;YES. DECREASE COUNT OF TAPES IN REW\r
101         AOS     MTREQ           ;THRUTP WILL SOS THIS BACK\r
102         JRST    THRUPT  ;TURN OFF TM10\r
103 \f;CONNECT CONTROL TO A TRANSPORT\r
104 CONECT: MOVEI   TAC,440102      ;SET UP INTERRUPT CONDITIONS\r
105         HRRM    TAC,MTAINT\r
106         HRRM    DEVDAT,USEWRD   ;SAVE DEVDAT FOR INTERRUPT\r
107         LDB     TP,PUNIT        ;GET UNIT\r
108         CAMN    TP,UNIT         ;ALREADY CONNECTED TO IT?\r
109         JRST    ONECT3          ;YES\r
110         LSH     TP,17           ;NO. SET FOR CONO\r
111         CONSZ   MTS,2           ;CONTROL FREE?\r
112         JRST    ONECT2          ;YES. DO A NO-OP CONO\r
113         TRO     TP,MTFLAG       ;NO. SET CONTROL FREE ENABLE\r
114         TLNN    IOS,MTREW       ;CONNECTING TO A REWINDING TAPE?\r
115         PUSHJ   PDP,ONECT4      ;NO.CHANGE RETURN\r
116 ONECT2: HRLM    TP,USEWRD       ;MIGHT NEED ON INTERRUPT LEVEL\r
117         CONO    MTC,(TP)        ;CONO TO MTC\r
118         LSH     TP,3            ;SAVE UNIT\r
119         HLRZM   TP,UNIT\r
120 ONECT3: JUMPGE  IOS,WSYNC       ;WAIT FOR DEV TO FREE IF NOT REWINDING\r
121         TRNN    TP,4000         ;REWINDING, CONTROL FREE ENABLE?\r
122         AOS     (PDP)           ;NO. SKIP RETURN\r
123         POPJ    PDP,            ;YES. IMMEDIATE RETURN\r
124 ONECT4: MOVEI   TAC,TPREDY      ;SET DEVICE ACTIVE\r
125         HRRM    TAC,-1(PDP)     ;AGAIN WHEN INACTIVE\r
126         JRST    SETACT          ;SET DEVICE ACTIVE\r
127 \r
128 ;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL\r
129 DLYRDY: SETOM   MTAVAL\r
130         PUSHJ   PDP,WSYNC       ;WAIT FOR IO TO STOP\r
131 \r
132 ;GET MTC, CONNECT TAPE TO CONTROL\r
133 TPREDY: AOSE    MTREQ           ;GET CONTROL\r
134         PUSHJ   PDP,MTWAIT      ;WAIT FOR IT\r
135         MOVEI   TAC,QUANT       ;SET QUANTUM TIME\r
136         MOVEM   TAC,QUANTM\r
137 TPRDY2: MOVEM   PROG,USEPRG\r
138         PUSHJ   PDP,CONECT      ;CONECT CONTROL TO TAPE\r
139 \r
140 ;SET TP FOR THIS TAPE\r
141 TPSET:  LDB     TP,[POINT 2,IOS,28] ;PARITY\r
142         SKIPN   TP              ;USE STANDARD IF 0\r
143         MOVEI   TP,STDENS       ;NOT SPECIFIED, USE STANDARD FOR SYS.\r
144         SOS     TP              ;SET TO USER'S REQUEST\r
145         LSH     TP,6\r
146         TRNN    IOS,IOPAR       ;PARITY\r
147         TRO     TP,40000        ;ODD\r
148         MOVE    TAC1,UNIT       ;UNIT\r
149         DPB     TAC1,[POINT 3,TP,20] ;INTO COMMAND\r
150         TRO     TP,MTBOTH       ;PI CHANNELS\r
151         MOVEI   TAC,MTTRY       ;SET ERROR COUNT\r
152         MOVNM   TAC,ERCNT\r
153         CONSZ   MTS,4           ;7 OR 9 TRACK?\r
154         JRST    RDYCHK          ;7 TRACK\r
155         TLNN    IOS,COMPAT      ;9 TRACK. CORE DUMP?\r
156         TROA    TP,20030        ;YES\r
157         TRO     TP,40300        ;NO. SET 800 BPI, ODD PARITY\r
158 \f;MAKE SURE TAPE IS READY\r
159 RDYCHK: CONSZ   MTS,40          ;READY?\r
160         POPJ    PDP,            ;YES\r
161         CONSO   MTS,20000       ;REWINDING?\r
162         POPJ    PDP,            ;NO. LET XPORT HUNG INTERRUPT HANDLE IT\r
163         TLO     IOS,MTREW       ;YES. MUST BE REWINDING\r
164         PUSHJ   PDP,SETACT      ;DEVICE ACTIVE\r
165         AOS     NMTREW          ;BUMP COUNT OF REWINDING DRIVES\r
166         SOSL    MTREQ           ;LET SOMEONE ELSE USE TAPES\r
167         JRST    DLYRDY          ;NOONE ELSE WANTS CONTROL\r
168         PUSHJ   PDP,CLOKRQ      ;PUT IN A TIME REQUEST\r
169         JRST    DLYRDY+1                ;AND WAIT\r
170 \fMTCLOK:        XWD     .+1,JIFSC2\r
171         SETZM   CLKREQ          ;INDICATE  NO CLOCK REQUEST IN NOW\r
172         SKIPL   MTREQ           ;CONTROL FREF?\r
173         POPJ    PDP,            ;NO. COME BACK LATER\r
174 MTCLK2: SETOM   NMTREW          ;COUNT NO. OF TAPES REWINDING\r
175         MOVEM   DEVDAT,SAVDEV\r
176         MOVEI   DEVDAT,MTADDR   ;START AT MTA0\r
177         AOS     MTREQ           ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW\r
178 REWCHK: MOVE    IOS,DEVIOS(DEVDAT)\r
179         JUMPGE  IOS,REWCK2      ;TAPE NOT REWINDING\r
180         PUSHJ   PDP,CONECT      ;REWINDING - CONECT TO IT\r
181         POPJ    PDP,            ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL\r
182 REWCKA: CONSO   MTS,40          ;STILL REWINDING?\r
183         JRST    REWCK1          ;YES\r
184         TLZE    IOS,IOW         ;NO, TAKE OUT OF IO WAIT\r
185         PUSHJ   PDP,SETIOD\r
186         TLZ     IOS,MTREQ\r
187         PUSHJ   PDP,CLRACT      ;NO LONGER ACTIVE\r
188         JRST    REWCK2\r
189         \r
190 REWCK1: AOS     NMTREW          ;COUNT REWINDING TAPE\r
191         MOVEI   TAC,36  \r
192         CONSZ   MTS,20000       ;IF TAPE IS STILL REWINDING\r
193         DPB     TAC,PDVCNT      ;MAKE SURE IT DOESN'T GET A HUNG DEVICE\r
194 REWCK2: HLRZ    DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE\r
195         HLRZ    TAC,DEVNAM(DEVDAT) ;A MAG TAPE?\r
196         CAIN    TAC,(SIXBIT .MTA.)\r
197         JRST    REWCHK          ;YES. CHECK IT\r
198         MOVE    DEVDAT,SAVDEV   ;PICK UP DEVDAT AGAIN\r
199         SOSL    MTREQ           ;FREE MTASER AGAIN\r
200         SETOM   MTAVAL          ;SOMEONE WAITING FOR CONTROL\r
201         SKIPGE  NMTREW          ;ANY TAPE REWINDING?\r
202         JRST    THRUT3          ;NO\r
203 \r
204 CLOKRQ: MOVE    TAC,MTCLOK      ;PUT A CLOCK REQUEST IN\r
205         CONO    PI,PIOFF        ;HAVE MONITOR WAKE UP\r
206         SKIPL   CLKREQ          ;IF NO CLOCK REQUEST IN ASK TO WAKE UP\r
207         IDPB    TAC,CLOCK       ;IN HALF A SECOND\r
208         SETOM   CLKREQ          ;NOW WE HAVE ONE\r
209         CONO    PI,PION\r
210         JRST    THRUT3\r
211 SAVDEV: 0                       ;TEMPORARY STORAGE FOR DEVDAT\r
212 \f;MTAPE\r
213 MTAP0:  TRNE    UUO,100         ;SETTING 7 TRACK MODE?\r
214         JRST    SET9TK          ;YES\r
215 \r
216 MTAP:   TRZ     IOS,776000      ;TURN OFF ERROR BITS\r
217         MOVEM   IOS,DEVIOS(DEVDAT) ;SAVE IOS\r
218 MTAP1:  PUSHJ   PDP,TPREDY      ;GET CONTROL FOR THIS TAPE\r
219 MTAP3:  TRZ     TP,7            ;NO DATA TRANSFER\r
220         ANDI    UUO,17          ;GET FUNCTION\r
221         ROT     UUO,-1          ;TRANSLATE FROM TABLE\r
222         SKIPL   UUO\r
223         SKIPA   TAC,MTPTBL(UUO)\r
224         HLRZ    TAC,MTPTBL(UUO)\r
225         TRZE    TAC,100         ;MOVE TAPE BACKWORD?\r
226         CONSO   MTS,100000      ;YES, TAPE AT LOAD POINT?\r
227         TRNN    TAC,-1          ;OR NO-OP?\r
228         JRST    THRUTA           ;YES, GO CHECK FOR BOT\r
229         TRZE    TAC,200         ;SKIP TO LOGICAL EOT?\r
230         JRST    LEOT            ;YES\r
231         TRZN    TAC,400 ;TRY TO WRITE TAPE?\r
232         JRST    MTAGO           ;NO.\r
233         CONSZ   MTS,10          ;YES. WRITE LOCKED?\r
234         JRST    ILLOP           ;YES. LIGHT ERROR BIT\r
235 MTAGO:  DPB     TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND\r
236         HRLM    TP,USEWRD       ;SAVE COMMAND\r
237         CONO    MTC,(TP)        ;START TAPE MOVING\r
238         JRST    CLRACT          ;AND RETURN\r
239 \r
240 ;SET 9-TRACK TAPE\r
241 SET9TK: TRNE UUO,1\r
242         TLOA    IOS,COMPAT      ;SET IBM COMPAT.\r
243 MTAREL: TLZ     IOS,COMPAT      ;NOT IBM COMPAT\r
244         JRST STOIOS\r
245 ;SKIP TO LOGICAL EOT\r
246 LEOT:   CONSZ   MTS,100000      ;TAPE AT BOT?\r
247         JRST    LEOT2           ;YES, DONT BACKSPACE\r
248         PUSHJ   PDP,MTAG0       ;BACKSPACE RECORD\r
249         PUSHJ   PDP,EOTWT       ;WAIT FOR IT\r
250 LEOT2:  MOVEI   UUO,16          ;SKIP A FILE\r
251         PUSHJ   PDP,MTAP2\r
252         MOVEI   UUO,6           ;SKIP A RECORD\r
253         PUSHJ   PDP,MTAP\r
254         PUSHJ   PDP,EOTWT       ;WAIT FOR IT\r
255         MOVE    IOS,DEVIOS(DEVDAT)\r
256         TRNN    IOS,IODENT      ;END OF FILE SEEN?\r
257         JRST    LEOT2           ;NO. SKIP TO NEXT FILE\r
258         MOVEI   UUO,7           ;YES. BACKSPACE RECORD\r
259 \r
260 MTAP2:  PUSHJ   PDP,TPRDY2\r
261         JRST    MTAP3\r
262 ;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION\r
263 EOTWT:  AOSE    MTREQ\r
264         PUSHJ   PDP,MTWAIT      ;WAIT TILL MTREQ IS COUNTED DOWN\r
265         POPJ    PDP,\r
266 \fMTPTBL:        XWD     101,0           ;REW,NOP\r
267         XWD     405,0           ;WRITE EOF.\r
268         XWD     0,0\r
269         XWD     107,6           ;BACKSPACE REC,SKIP REC\r
270         XWD     111,207         ;REW,UNLOAD,LOG EOT\r
271         XWD     415,0           ;WRITE BLANK TAPE,\r
272         XWD     0,0\r
273         XWD     117,16          ;BACK FILE,SKIP FILE\r
274 \f;OUTPUT UUO\r
275 MTOUT:  PUSHJ   PDP,TPREDY      ;GET CONTROL SETUP TP\r
276         CONSZ   MTS,10          ;WRITE LOCK?\r
277         JRST    ILLOP           ;YES, SET IOIMPM AND RETURN\r
278         CONSZ   MTS,4000        ;EOT?\r
279         TROA    IOS,IOTEND+IOBKTL ;YES. LIGHT BIT\r
280         TLOA    IOS,IO          ;NO. INDICATE OUTPUT\r
281         JRST    ADVOUT          ;DONE IF EOT\r
282 MTOUT1: MOVEI   TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER\r
283         MOVN    TAC1,1(TAC)     ;-WORD COUNT\r
284         HRL     TAC,TAC1        ;IN LH OF COMMAND\r
285         AOJG    TAC,ADVOUT      ;SKIP IF 0 WORDS\r
286 MTOUT2: TRO     TP,4000         ;FUNCTION = WRITE\r
287         MOVSI   TAC1,(BLKO MTC,) ;SETUP BLKO\r
288 MTDTGO: MOVEM   TAC,PNTR        ;SAVE BLKI/BLKO POINTER\r
289         MOVEM   TAC,SVNPTR      \r
290         HRRI    TAC1,PNTR       ;BLKI/BLKO PNTR\r
291         MOVEM   TAC1,MTALOC     ;INTO INTERRUPT LOC\r
292         HRLM    TP,USEWRD       ;SAVE COMMAND\r
293 \r
294         CONO    MTC,(TP)        ;START TAPE MOVING\r
295         TRO     IOS,IOACT       ;SETACT CLEARS IOW\r
296         JRST    STOIOS          ;STORE IOS AND RETURN\r
297 \r
298 ;INPUT UUO\r
299 MTIN:   PUSHJ   PDP,TPREDY      ;SETUP TP FOR THIS DRIVE\r
300         TLZ     IOS,IO          ;INPUT\r
301 MTIN1:  SETCM   TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT\r
302         HRRI    TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS\r
303         ADD     TAC,[XWD 2,1]   ;MAKE REAL IOWD\r
304 MTIN2:  TRO     TP,2000         ;FUNCTION = READ\r
305         MOVSI   TAC1,(BLKI MTC,) ;SETUP BLKI\r
306         JRST    MTDTGO          ;GO START TAPE\r
307 \fMTAINT:        CONSO   MTS,440102      ;INTERRUPT FOR MAG TAPE?\r
308         JRST    .               ;NO. GO AWAY\r
309         CONSO   MTC,400         ;HAS CONTROL FREE ENABLED?\r
310         CONSZ   MTS,440100      ;NO. CONTROL FREE ERRONEOUSLY ON?\r
311         JRST    +2              ;REAL MTA INTERRUPT\r
312         JRST    MTAINT+1        ;THIS INTERRUPT NOT REALLY FOR MTA\r
313         JSR     MTASAV          ;YES. SAVE ACS\r
314         HRRZ    DEVDAT,USEWRD   ;RESET DEVDAT\r
315         MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
316         JUMPL   IOS,REWCKA      ;CNTRL FREE INTERRUPT ON A REW TAPE\r
317         MOVE    PROG,USEPRG\r
318         SKIPE   TAC,ERRFLG      ;BACKSPACE FROM ERROR?\r
319         JRST    TRYAGN          ;YES. REISSUE COMMAND\r
320         CONSZ   MTS,440000      ;ERROR?\r
321         JRST    ERROR           ;YES. ILLEGAL OP OR HUNG DEVICE\r
322         CONSZ   MTC,7           ;DATA OPERATION?\r
323         JRST    DATEND          ;YES\r
324         LDB     TP,[POINT 4,USEWRD,8] ;GET FUNCTION\r
325         CAIN    TP,6            ;SKIPPING A RECORD?\r
326         CONSO   MTS,10000       ;YES. SEEN AN EOF?\r
327         SKIPA                   ;NO.\r
328         TRO     IOS,IODEND      ;YES. TURN ON EOF BIT\r
329 THRUTA: CONSZ   MTS,300000      ;NO. BOT OR REWINDING?\r
330         TROA    IOS,IOBOT       ;YES. SET BOT BIT FOR USER TO SEE\r
331         TRZ     IOS,IOBOT       ;NO. TURN OFF BOT BIT\r
332 THRUTP: CONSZ   MTS,4000        ;NO. EOT?\r
333         TRO     IOS,IOTEND      ;YES\r
334         TLZE    IOS,IOW         ;JOB IN IO WAIT?\r
335         PUSHJ   PDP,SETIOD      ;YES. TAKE IT OUT\r
336         TLZ     IOS,DMPMOD\r
337         PUSHJ   PDP,CLRACT\r
338                                  ;CONTROL FREE INTERRUPT?\r
339                                  ;YES. DONT COUNT DOWN MTREQ\r
340         SOSGE   MTREQ           ;COUNT DOWN REQUEST COUNT\r
341         JRST    THRUT2          ;NOONE ELSE WAITING\r
342         SKIPL   NMTREW          ;IF THERE ARE TAPES REWINDING\r
343         SKIPE   CLKREQ          ;WHICH HAVEN'T BEEN CHECKED IN\r
344         SKIPA                   ;MORE THAN 1/2 A SECOND\r
345         JRST    MTCLK2          ;GO CHECK THEM NOW\r
346         SETOM   MTAVAL          ;SOMEONE ELSE WANTS IT\r
347         JRST    THRUT3          ;DISMISS INTERRUPT AND RETURN\r
348 \f;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED\r
349 THRUT2: SKIPL   NMTREW          ;ANY DRIVES REWINDING?\r
350         JRST    MTCLK2          ;YES. CHECK IF ANY THROUGH\r
351 THRUT3: HLRZ    TP,USEWRD       ;GET UNIT\r
352         TRZ     TP,17777        ;MASK OUT FUNCTION\r
353         CONO    MTC,(TP)        ;DISMISS INTERRUPT\r
354         HLLZS   MTAINT          ;DONT LOOK AT ANY MORE INTERRUPTS\r
355         POPJ    PDP,            ;AND EXIT\r
356 \r
357 ;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO\r
358 MTDEND: 0\r
359         CONO    MTS,1           ;GIVE A FUNCTION STOP\r
360         JEN     @MTDEND         ;AND EXIT\r
361 \fDATENO:        CONSZ   MTS,20600       ;RECORD OK?\r
362         JRST    RETRY           ;PARITY, DATA LATE OR BAD TAPE\r
363 DATND2: TLNE    IOS,DMPMOD      ;DUMP MODE?\r
364         JRST    CMPEND          ;YES\r
365         TLNN    IOS,IO          ;READING?\r
366         JRST    INPTND          ;YES, FINISH INPUT\r
367 ADVOUT: PUHSJ   PDP,ADVBFE      ;WRITING, ADVANCE BUFFERS\r
368                                 ;END OF TAPE?\r
369         JRST    THRUTP          ;YES, DONT WRITE ANY MORE\r
370 NXTREC: TLZE    IOS,IOW         ;IN IO WAIT?\r
371         PUSHJ   PDP,GETIOD      ;RESTART JOB\r
372         SOSG    QUANTM          ;COUNT DOWN PROTECT TIME\r
373         SKIPG   MTREQ           ;ANYONE ELSE WANT CONTROL?\r
374         CONSZ   MTS,4000        ;NO. KEEP GOING UNLESS EOT\r
375         JRST    THRUTP          ;YES, GIVE UP CONTROL\r
376         MOVNI   TAC,MTTRY       ;RESET ERROR COUNT\r
377         MOVEM   TAC,ERCNT\r
378         HLRZ    TP,USEWRD       ;PICK UP COMMAND\r
379         TLNE    IOS,IO          ;AND DO NEXT RECORD\r
380         JRST    MTOUT1\r
381         HLRZ    TAC,@DEVIAD(DEVDAT)     ;PICK MAX. SIZE OF BUFFER\r
382         ADDI    TAC,@DEVIAD(DEVDAT)     ;AND IN FIRST ADDRESS\r
383         PUSHJ   PDP,IADRCK              ;CHECK IT'S O.K.\r
384         JRST    THRUTP                  ;NO - RELEASE CONTROL\r
385         JRST    MTIN1                   ;O.K. DO NEXT INPUT.\r
386 \r
387 ;HERE WHEN THROUGH AN INPUT RECORD\r
388 INPTND: CONSZ   MTS,10000       ;EOF?\r
389         JRST    DATEOF          ;YES\r
390         MOVEI   TAC,@DEVIAD(DEVDAT) ;START OF RECORD\r
391         HRRZ    TAC1,PNTR       ;WHERE WE ARE NOW\r
392         SUBI    TAC1,1(TAC)     ;LAST LOC-FIRST LOC\r
393         HRRM    TAC1,1(TAC)     ;=WORD COUNT\r
394         PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
395         JRST    THRUTP          ;NONE FREE\r
396         JRST    NXTREC          ;CONTINUE WITH NEXT RECORD\r
397 \r
398 ; HERE AT THE END OF A DUMP MODE RECORD\r
399 DMPEND: HLRZ    TP,USEWRD       ;SET UP COMMAND AGAIN\r
400         CONSO   MTS,14000       ;EOF OR EOT?\r
401         JRST    DMPBLK          ;NO,GET NEXT COMMAND\r
402         CONSO   MTS,4000        ;EOF?\r
403         TRO     IOS,IODEND      ;YES,SET EOF BIT\r
404         JRST    THRUTP          ;AND RETURN TO USER\r
405 \fMTDMPO:        TLOA    IOS,IO          ;DUMP OUTPUT\r
406 MTDMPI: TLZ     IOS,IO          ;DUMP INPUT\r
407         HRLI    UUO,PROG\r
408         PUSHJ   PDP,COMCHK      ;CHECK VALIDIT OF LIST\r
409         JRST    ADRERR          ;NOT VALID\r
410         PUSH    PDP,IOS         ;WSYNC WILL CLOBBER IOS\r
411         PUSHJ   PDP,TPREDY      ;GET CONTROL, SETUP TP\r
412         POP     PDP,IOS\r
413         TLNE    IOS,IO          ;CHECK WRITE LOCK\r
414         CONSO   MTS,4010        ;AND EOT IF WRITING\r
415         JRST    MTDMP2\r
416         CONSO   MTS,4000        ;ERROR\r
417         TROA    IOS,IOIMPM      ;WRITE LOCK\r
418         TRO     IOS,IOTEND+IOBKTL  ;EOT\r
419         JRST    THRUTP          ;GIVE UP TAPE AND RETURN\r
420 MTDMP2: TLO     IOS,DMPMOD      ;INDICATE DUMP-MODE\r
421         SOS     UUO             ;WILL COUNT IT UP LATER\r
422         MOVEM   UUO,LSTLOC      ;SAVE LOC OF LIST\r
423 DMPBLK: PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
424 \r
425         ADDI    TAC,(PROG)      ;ADD RELOCATION FACTOR\r
426         TLNE    IOS,IO          ;WRITING?\r
427         JRST    MTOUT2          ;YES. GO WRITE RECORD\r
428         TRMN    IOS,1\r
429         TRO     TP,10000        ;OR - READ ACROSS RECORD BOUNDARIES\r
430         JRST    MTIN2           ;GO READ RECORD(S)\r
431 \r
432 NXTCOM: SKIPE   TAC,REMNDR      ;PARTIAL IOWD LEFT TO DO?\r
433         JRST    NXTCM3          ;YES, CONTINUE WITH IT\r
434         AOSA    TAC,LSTLOC      ;GET NEXT COMMAND LOC\r
435         HRRM    TAC,LSTLOC\r
436         MOVE    TAC,@TAC        ;PICK UP COMMAND\r
437         JUMPL   TAC,NXTCM2      ;REAL COMMAND\r
438         JUMPG   TAC,NXTCOM+1    ;GO-TO-WORD\r
439         POP     PDP,TAC         ;0 - THROUGH\r
440         JRST    THRUTP\r
441 \r
442         EXTERN  MMTSIZ          ;-MTSIZ\r
443 NXTCM2: TLNE    IOS,IO          ;WRITING?\r
444         TRNE    IOS,1           ;YES, MODE 16?\r
445         POPJ    PDP,            ;NO. USE IOWD AS OBTAINED\r
446 NXTCM3: HLRE    TAC1,TAC        ;YES. GET WORDCOUNT\r
447         SETZM   REMNDR\r
448         CAML    TAC1,MTSZ       ;RECORD TOO LARGE?\r
449         POPJ    PDP,            ;NO, GO WRITE\r
450         ADD     TAC,[XWD MTSIZ,MTSIZ] ;YES.\r
451         MOVEM   TAC,REMNDR      ;IOWD TO USE FOR NEXT RECORD\r
452         SUBI    TAC,MTSIZE      ;ADDRESS FOR THIS IOWD\r
453         HRLI    TAC,MMTSIZ      ;WRITE -MTSIZE WORD RECORDS\r
454         POPJ    PDP,            ;RETURN THE IOWD\r
455 REMNDR: 0\r
456 MTSZ:   XWD -1,MMTSIZ           ;NEG. OF RECORD SIZE IN WORDS\r
457 \fMTHUNG:        PUSHJ   PDP,THRUT3      ;TURN OFF ERROR PI BIT\r
458         PUSHJ   PDP,SETACT      ;TURN ON IOACT\r
459         MOVEI   TAC,1           ;SET HUNG-TIME TO 1 MORE TICK\r
460         DPB     TAC,PDVCNT      ;SET HUNG TIME\r
461         POPJ    PDP,            ;AND EXIT\r
462 \r
463 \r
464 ERROR:  CONSZ   MTS,400000      ;HUNG DEVICE?\r
465         JRST    MTHUNG          ;YES\r
466 \r
467 ;ILLEGAL OP INTERRUPT\r
468         TRNN    IOS,IOACT       ;DATA OPERATION?\r
469         JRST    ILLOP           ;NO. LIGHT ERROR BIT, GIVE UP CONTROL\r
470         TRO     IOS,IOIMPM      ;YES. LIGHT IOIMPM\r
471         MOVEM   IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE\r
472         JRST    THRUT2          ;COUNT DOWN MTRWQ ON HUNG CALL\r
473 \r
474 ILLOP:  TROA    IOS,IOIMPM\r
475 DATEOF: TLO     IOS,IOEND       ;EOF - LIGHT BIT\r
476         JRST    THRUTP          ;AND GIVE UP CONTROL\r
477 \r
478 ;TRY AGAIN ON PARITY ERROR OR BAD TAPE\r
479 RETRY:  TRNN    IOS,ONRCK       ;WANT TO STOP ON ERROR?\r
480         AOSL    TAC,ERCNT       ;OR TRIED ENOUGH?\r
481         JRST    PERMER          ;YES. PERMANENT ERROR\r
482 RETRY1: MOVEI   TAC,2           ;SET RETRY SWITCH\r
483         MOVEM   TAC,ERRFLG\r
484 RETRY2: HLRZ    TP,USEWRD       ;PICK UP COMMAND\r
485         ANDI    TP,760770       ;SET FOR BACKSPACE\r
486         CONO    MTC,7000(TP)    ;BACKSPACE RECORD\r
487         POPJ    PDP,            ;AND GO AWAY\r
488 \r
489 ;COME HERE AFTER BACKSPACE IS THROUGH\r
490 TRYAGN: SOJLE   TAC,TRYSKP      ;GO IF NOT 2ND BACKSPACE\r
491         CONSO   MTS,100000      ;BOT?\r
492         JRST    RETRY2-1        ;NO. BACKSPACE AGAIN\r
493 TRYNXT:                         ;READ RECORD AGAIN\r
494         MOVE    TAC,SVPNTR      ;RESET POINTER\r
495         MOVEM   TAC,PNTR\r
496         HRLZ    TP,USEWRD       ;GET COMMMAND\r
497         CONO    MTC,(TP)        ;EXECUTE IT AGAIN\r
498         SETZM   ERRFLG\r
499         POPJ    PDP,            ;AND GO AWAY\r
500 \r
501 ;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR\r
502 TRYSKP: JUMPL   TAC,TRYNXT      ;AFTER FORWARD SKIP IF NEGATIVE\r
503         HLRZ    TP,USEWRD       ;AFTER 2ND BACKSPACE - SKIPA RECORD\r
504         ANDI    TP,760770\r
505         CONO    MTC,6000(TP)    ;SKIP A RECORD\r
506         SETOM   ERRFLG          ;INDICATE FORWARD SKIP\r
507         POPJ    PDP,            ;AND GO AWAY\r
508 \fPERMER:        TLNE    IOS,IO          ;READING?\r
509         TRNE    IOS,IONRCK      ;NO RECOVERY WANTED?\r
510         JRST    SETIOS          ;REALLY PERMANENT\r
511         CAILE   TAC,100         ;TRIED TO REWRITE 100 TIMES\r
512         JRST    SETIOS          ;YES. REALLY PERMANENT\r
513         JUMPG   TAC,RETRY2      ;TRY WRITING WITH 3 INCHES OF\r
514         MOVSI   TAC,10000       ;BLANK TAPE TO ERASE BAD SPOT\r
515         ORM     TAC,USEWRD      ;SET COMMAND TO 14 (FROM 4)\r
516         JRST    RETRY1          ;AND TRY AGAIN\r
517 \r
518 SETIOS: CONSZ   MTS,400         ;DATA MISSED OR BAD TAPE?\r
519         TRO     IOS,IODERR      ;YES\r
520         CONSZ   MTS,20200       ;PARITY ERROR?\r
521         TRO     IOS,IODTER      ;YES\r
522         JRST    DATND2          ;SAVE ERROR WORD AND GO AWAY\r
523 NMTREW: 0\r
524 USEWRD: 0\r
525 USEPRG: 0\r
526 CLKREQ: 0\r
527         \r
528 UNIT:   0\r
529 ERCNT:  0\r
530 ERRFLG: 0\r
531 QUANTM: 0\r
532 LSTLOC: 0\r
533 PNTR:   0\r
534 SVPNTR: 0\r
535 MTAEND: END\r
536 \f\r