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