Added base source
[retro-software/dec/tops10/v4.5.git] / src / dtasrn.mac
1 TITLE   DTASRN - NEW FORMAT DECTAPE SERVICE FOR TD-10 (PDP-10)\r
2 SUBTTL  T. WACHS/RCC   TS 04 JUN 69  V406\r
3         XP      VDTASX,406\r
4                                 ;DEFINE GLOBABL VERSION NUMBER FOR LOADER MAP.\r
5         IFNDEF ALMACT, <ALMACT=0>\r
6 \r
7         ENTRY   DTASRN\r
8 DTASRN:                 ;THIS ENTRY FOR SELECTIVE LOAD BYT BUILD\r
9         INTERNAL DTADSP\r
10 EXTERNAL        TPOPJ,TPOPJ1,DTALOC,DTALC2,DTBOTH,WSYNC,DTACHL\r
11 EXTERNAL        STOIOS,STOTAC,SETACT,CLRACT,OUT,DTASAV,PIOMOD\r
12 EXTERNAL        DTAVAL,DTREQ,DTWAIT,SETIOD,THSDAT,PUNIT\r
13 EXTERNAL        ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
14 EXTERNAL        COMCHK,JOBPD1,DTTURN,PJOBN,RELEA9,UADCK1,STREQ\r
15 EXTERNAL        CLOCK,JBTADR,DEVPHY,PION,PIOFF,DTTRY\r
16 \r
17 ;DTALOC=PI LOC FOR DATA - CHANGED BY ROUTINE\r
18 ;DTALC2=PI LOC+1 FOR DAT\r
19 ;DTBOTH=10*(PI FOR DATA CHAN) + PI FOR FLAGS CHAN\r
20 ;DTTURN=300200+DTBOTH           (CONO FOR TURN-AROUND)\r
21 \r
22 BLK=4\r
23 \r
24 \r
25 DIRBLK=^D100    ;NUMBER OF BLOCK FOR DIRECTORY\r
26 \r
27 TOPBLK=1101     ;HIGHEST LEGAL BLOCK NUMBER\r
28 NAMSTR=^D83     ;1ST NAME WORD IN DIRECTORY\r
29 QUANT=3         ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
30 MINDIS=14       ;MINMUM NUMBER OF BLOCKS TO SEARCH BEFORE DISCONNECTING\r
31                 ;FROM A TAPE\r
32 SPACE=4         ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
33 \r
34 ;DDB MAGIC CELLS\r
35 FSTBLK=13\r
36 DLOC=14\r
37 IBLK=15\r
38 OBLK=16\r
39 DISPAD=17\r
40 DMPLST=20\r
41 SVDWRD=21\r
42 \f;FLAGS IN RH OF IOS\r
43 UDSD=100\r
44 LSTSAV=20000\r
45 \r
46 ;FLAGS IN LH OF IOS\r
47 NOLINK=200\r
48 CHNGDR=400\r
49 RVERSE=1000\r
50 SINGL=2000              ;JUST READ OR WRITE 1 BLOCK\r
51 DMPMOD=4000\r
52 RWDIR=10000\r
53 DMPCLS=20000\r
54 NOBUF=40000             ;DATA GOING DIRECTLY INTO USER AREA\r
55 NOBUFC=737777           ;-NOBUF\r
56 REWBIT=100000\r
57 RUNBIT=200000\r
58 RECKON=400000           ;THIS TAPE IS DEAD-RECKONING.\r
59                         ; (MUST BE SIGN BIT)\r
60 \r
61 CPBIT=-1                ;FEATURE TEST TO ALLOW IO INTO USER AREA DIRECTLY\r
62                         ;IT WILL ONLY HAPPEN ON DUMP MODE WITH NON-STANDARD BIT\r
63                         ;(UDSD) ON\r
64 \f       EXTERN  JIFSEC\r
65 \r
66         INTERN  DTAINT,DTADDB,DTAINI,DTADDS,DTADSP\r
67 \r
68 DTADDB: SIXBIT  /DTA0/\r
69         XWD     ^D60*HUNGST,200\r
70         0\r
71         EXP     DTADSP\r
72         XWD     1107,154403\r
73         EXP     0,0\r
74 \r
75         XWD     PROG,0\r
76         XWD     PROG,0\r
77         EXP     0,0,0\r
78 \r
79         EXP     DTADIR\r
80         EXP     0,0,0,0,0\r
81 \r
82 \r
83 DTADIR: BLOCK   200\r
84 DTADDS=.-DTADDR\r
85 \r
86         JRST    DTAINI\r
87         JRST    HUNGTP          ;HUNG DEVICE\r
88 DTADSP  JRST    UREL\r
89         JRST    UCLS\r
90         JRST    UOUT\r
91         JRST    UIN\r
92         JRST    ENTR\r
93         JRST    LOOK\r
94         JRST    DMPO\r
95         JRST    DMPI\r
96         JRST    SETO\r
97         JRST    SETI\r
98         JRST    GETF\r
99         JRST    RENAM\r
100         POPJ    PDP,            ;CLOSE INPUT\r
101         JRST    UTPCLR\r
102 ;FALL INTO MTAPE\r
103 \f       HRRZ    TAC1,UUO        ;MTAPE - GET OPERATION\r
104         CAIE    TAC1,1          ;REWIND OR\r
105         CAIN    TAC1,11         ;REWIND UNLOAD ARE LEGAL\r
106         SOJA    TAC1,MTA0\r
107         POPJ    PDP,            ;OTHERS ARE NO-OPS\r
108 \r
109 ;INITIALIZE DTC\r
110 DTAINI: CONO    DTC,0\r
111         SETZM   DISCON\r
112         MOVEI   TAC,^D1000      ;COMPUTE NO OF MILLISECS/TICK\r
113         IDIVI   TAC,JIFSEC      ;FOR THIS FREQUENCY CLOCK\r
114         ADDI    TAC,1           ;ADD FUDGE FACTORE FOR SAFETY\r
115         HRRM    TAC,MSECPT      ;SAVE FOR CLOCK CALCULATION\r
116         POPJ    PDP,\r
117 \f       EXTERN  JOBSAV\r
118 ;LOOKUP A DIRECTORY ENTRY\r
119 LOOK:   TRNE    IOS,UDSD        ;NON-STANDARD?\r
120         JRST    CPOPJ1          ;YES. LOOKUP OK\r
121         PUSHJ   PDP,DSERCH      ;NO. FIND DIRECTORY ENTRY\r
122         POPJ    PDP,            ;NOT THERE\r
123         HRRZ    TAC1,26(TAC)    ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
124         AOS     UUO             ;POINT UUO TO WORD 3\r
125         MOVEM   TAC1,@UUO       ;INTO USER'S LOOKUP BLOCK\r
126 LOOKA:  HLRE    TAC,TAC         ;GET INDEX\r
127         ADDI    TAC,27\r
128         SKIPN   FSTBLK(DEVDAT)  ;TAPE BEING WRITTEN?\r
129         HRLM    TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
130         HRRM    TAC,AC1         ;SAVE INDEX IN CASE LH(IBLK) IS\r
131                         ;CHANGED BY DEAD-RECKONING\r
132         MOVEI   TAC1,0\r
133         PUSHJ   PDP,BLKSRC      ;COUNT NUMBER OF BLOCKS IN FILE\r
134         AOJA    UUO,STOWD4      ;LAST BLOCK DONE\r
135         AOS     TAC1            ;COUNT THE BLOCK\r
136         SOS     1(PDP)          ;ADJUST FOR CORRECT RETURN\r
137         AOBJN   PDP,BLKSRB      ;LOOK FOR NEXT BLOCK\r
138 \r
139 ;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
140 STOWD4: IMUL    TAC1,[-177]     ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
141         HRLZM   TAC1,@UUO       ;STORE IN DIRECOTRY WD 4\r
142         SUBI    UUO,2           ;POINT UUO TO DIRECORY WD 2\r
143         TLZ     IOS,IO          ;MAKE SURE IO IS OFF\r
144         TLO     IOS,SINGL       ;JUST READ 1 RECORD\r
145         MOVEI   BLK,DIRBLK      ;NO, FIND FIRST MENTION OF BLOCK\r
146         PUSHJ   PDP,LSTFRE+1    ;NEAR DIRECTORY\r
147         JUMPN   BLK,LOOKE       ;FOUND IF BLK NOT =0\r
148 LOOKD:  PUSHJ   PDP,BLKSRC      ;FIND FIRST MENTION IN DIRECTORY\r
149         JRST    BDDIR           ;NOT THERE - ERROR\r
150 LOOKE:  PUSHJ   PDP,RDBLUK      ;GO READ IT\r
151         PUSHJ   PDP,WAIT1       ;WAIT TILL IT'S IN\r
152         HRLM    AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
153                         ;TEST ON ENTER - WONT ALLOW ENTER\r
154                         ;TO BE DONE ON LOOKED-UP FILE\r
155         HRRZ    BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
156 LOOKC:  SKIPN   FSTBLK(DEVDAT)  ;IF FILE HAS NOT BEEN ENTERED\r
157         MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
158         HRRM    BLK,@UUO        ;SAVE IN USER'S AREA\r
159         HLL     TAC,@UUO        ;GET USER'S EXTENSION\r
160         HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
161                                 ; AND SUPERSEDING SHARED SEGMENTS\r
162         JRST    CPOPJ1          ;AND TAKE GOOD EXIT\r
163 \fRENAM: PUSH    PDP,UUO         ;SAVE LOC OF NEW NAME\r
164         MOVEI   UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
165         PUSHJ   PDP,DSER1\r
166         JRST    RENER1          ;NOT FOUND - ERROR\r
167         POP     PDP,UUO         ;FOUND, RESTORE UUO\r
168         SKIPE   @UUO            ;RENAMING TO ZERO?\r
169         JRST    RENAM2          ;NO. GO TO REAL RENAME\r
170         SETZM   (TAC)           ;YES. DELETE NAME IN DIR\r
171         SETZM   26(TAC)         ;DELETE EXTENSION\r
172         SETZM   DEVFIL(DEVDAT)  ;ZERO DEVFIL\r
173         HLRE    TAC,TAC         ;GET INDEX OF FILE\r
174         ADDI    TAC,27\r
175         PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS OF FILE\r
176 RENAM1: TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
177         AOS     (PDP)           ;SET FOR GOOD RETURN\r
178         JRST    STOIOS          ;GO TO USER\r
179 \r
180 ;COME HERE TO RENAME TO A REAL NEW NAME\r
181 RENAM2: MOVE    DAT,TAC          ;SAVE LOC OF NAME IN DIRECTORY\r
182 \r
183         PUSHJ   PDP,DSERCH      ;SEARCH FOR NEW NAME\r
184         SKIPA           ;NOT FOUND - GOOD\r
185         JRST    RENER2          ;NAME ALREADY EXISTS - ERROR\r
186         MOVE    TAC,@UUO        ;GET NEW NAME\r
187         MOVEM   TAC,(DAT)       ;SAVE IN DIR\r
188         AOS     UUO\r
189         MOVE    TAC,@UUO        ;EXTENSION\r
190         HLLM    TAC,26(DAT)     ;SAVE IN DIR\r
191         HLLM    TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
192         JRST    RENAM1          ;GIVE GOOD RETURN TO USER\r
193 \r
194 RENER1: POP     PDP,UUO\r
195         TDZA    TAC,TAC         ;RH E+1 =0\r
196 RENER2: MOVEI   TAC,4           ;RH E+1 =4\r
197         AOS     UUO             ;POINT TO 2ND WORD\r
198         HRRM    TAC,@UUO        ;SET ERRORR CODE\r
199         POPJ    PDP,            ;AND TAKE ERROR RETURN\r
200 \f;SEARCH DIRECTORY FOR A MATCH\r
201 DSERCH: MOVEI   AC1,3(UUO)      ;CHECK VALIDITY OF ADDRESS\r
202         PUSHJ   PDP,UADCK1      ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
203 DSER1:  PUSHJ   PDP,DIRCHK      ;ENSURE DIRECTORY IS IN CORE\r
204         HRRZ    TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
205         ADD     TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
206 NMLOOK: SKIPN   TAC1,@UUO       ;GET NAME\r
207         JRST    TPOPJ           ;NULL ARGUMENT - ERROR RETURN                   \r
208         MOVEM   TAC1,DEVFIL(DEVDAT)     ;STORE FOR RENAME AND SUPERSEDING\r
209                                 ; SHARED SEGMENTS\r
210         CAMN    TAC1,(TAC)      ;TEST FOR MATCH\r
211         AOJA    UUOI,NMFOUN     ;FOUND NAME, CHECK EXTENSION\r
212         AOBJN   TAC,.-2         ;TRY NEXT NAME\r
213         POPJ    PDP,            ;NOT FOUND\r
214 NMFOUN: HLLZ    TAC1,@UUO       ;PICK UP USER'S EXTENSION\r
215         XOR     TAC1,26(TAC)    ;TEST AGAINST DIRECTORY EXTENSION\r
216         TLNN    TAC1,-1         ;MATCH?\r
217         JRST    CPOPJ1          ;YES. RETURN\r
218         AOBJP   TAC,.+2\r
219         SOJA    UUO,NMLOOK      ;NO. TRY NEXT NAME\r
220         SOJA    UUO,CPOPJ       ;NAME NOT FOUND\r
221 \r
222 ;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
223 DIRCHK: TRNN    IOS,UDSD        ;DONT BOTHER IF NON-STANDARD\r
224         SKIPG   DEVMOD(DEVDAT)  ;IS IT IN?\r
225         POPJ    PDP,            ;YES. RETURN\r
226         MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
227         TLZ     IOS,IO\r
228         PUSHJ   PDP,GETDT       ;GET CONTROL\r
229         TLO     IOS,RWDIR       ;JUST READ 1 BLOCK\r
230         PUSHJ   PDP,READBC      ;GO READ IT\r
231         PUSHJ   PDP,WAIT1       ;WAIT TILL IN\r
232         MOVSI   TAC1,DVDIRI     ;SET DIRECTORY-IN-CORE BIT\r
233         ORM     TAC1,DEVMOD(DEVDAT)\r
234         POPJ    PDP,\r
235 \f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
236 BLKSRC: MOVSI   DAT,440500      ;DAT IS A BLOCK POINTER\r
237         HRR     DAT,DLOC(DEVDAT)\r
238         MOVEI   BLK,1           ;START AT BLOCK 1\r
239 \r
240 BLKSRA: ILDB    TEM,DAT         ;INDEX OF NEXT BLOCK\r
241         CAMN    TAC,TEM         ;MATCH?\r
242         JRST    CPOPJ1          ;YES. RETURN\r
243 \r
244 BLKSRB: CAIGE   BLK,TOPBLK      ;NO. SEARCHED LAST?\r
245         AOJA    BLK,BLKSRA      ;NO. TRY NEXT BLOCK\r
246         POPJ    PDP,            ;YES. RETURN\r
247 \r
248 ;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
249 SETPTR: PUSH    PDP,BLK         ;SAVE BLK\r
250         PUSHJ   PDP,DRPTR       ;SET BLK AS A BYTE POINTER\r
251         MOVE    DAT,BLK         ;RETURN IT IN DAT\r
252         POP     PDP,BLK         ;RESTORE BLK\r
253         POPJ    PDP,            ;AND RETURN\r
254 \r
255 ;GET NEXT AVAILABLE FREE BLOCK\r
256 NXTFRE: PUSH    PDP,TEM \r
257         PUSHJ   PDP,SETPTR      ;SET DAT TO A BYTE POINTER\r
258         MOVEI   TAC,0           ;LOOK FOR FREE BLOCKS\r
259         PUSHJ   PDP,BLKSRA      ;FIND A ZERO BLOCK\r
260         MOVEI   BLK,0           ;NOT THERE- RETURN 0\r
261 FREXIT: POP     PDP,TEM\r
262         POPJ    PDP,\r
263 \r
264 ;GET PREVIOUS FREE BLOCK\r
265 LSTFRE: MOVEI   TAC,0\r
266         PUSH    PDP,TEM\r
267         ADDI    BLK,2\r
268         PUSHJ   PDP,SETPTR      ;SET DAT AS A POINTER\r
269         SUBI    BLK,2\r
270         PUSHJ   PDP,DECPTR      ;DECREMENT BYTE POINTER\r
271         LDB     TEM,DAT         ;INDEX TO BLOCK\r
272         CAMN    TEM,TAC         ;FOUND?\r
273         JRST    FREXIT          ;YES. RETURN\r
274         SOJG    BLK,.-4         ;TRY AGAIN IF NOT AT START\r
275         JRST    FREXIT          ;REACHED START - RETURN BLK=0\r
276 \r
277 ;DECREMENT BYTE POINTER\r
278 DECPTR: JUMPL   DAT,.+5\r
279         ADD     DAT,[BYTE (6) 5] ;DECREMENT\r
280         JUMPG   DAT,CPOPJ       ;IF POSITIVE - SAME WORD\r
281         HRLI    DAT,010500      ;RESET TO PREVIOS WORD\r
282         SOJA    DAT,CPOPJ\r
283         HRLI    DAT,060500\r
284         SOJA    DAT,CPOPJ\r
285 \r
286 \f;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC\r
287 DLETE:  MOVEI   TAC1,0          ;SET TO DELETE BLOCKS\r
288         PUSHJ   PDP,BLKSRC      ;FIND A BLOCK BELONGING TO FILE\r
289         JRST    CPOPJ   ;ALL THROUGH\r
290         DPB     TAC1,DAT        ;DELETE IT\r
291         SOS     1(PDP)          ;ADJUST PDL FOR RETURN\r
292         AOBJN   PDP,BLKSRB      ;AND FIND NEXT MATCH\r
293 \r
294 \r
295 ;ENTER A FILE NAME IN DIRECTORY\r
296 ENTR:   TRNE    IOS,UDSD        ;NON STANDARD?\r
297         JRST    CPOPJ1          ;YES. RETURN\r
298         PUSHJ   PDP,DSERCH      ;NO. LOOK FOR MATCH\r
299         JRST    NEWNT           ;THIS IS A NEW ENTRY\r
300 ENTR2:  MOVE    TAC1,@UUO       ;PICK UP 2ND WORD (EXTENSSION)\r
301         AOS     UUO             ;POINT TO WORD 3\r
302         HRR     TAC1,@UUO       ;ADD DATE\r
303         TRNN    TAC1,7777       ;IS DATE ALREADY THERE?\r
304         IOR     TAC1,THSDAT     ;NO, ADD CURRENT DATE\r
305         MOVEM   TAC1,26(TAC)    ;INTO DIRECTORY\r
306         SKIPGE  AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
307                                 ;BEFORE THE ENTER?)\r
308         AOJA    UUO,SETWD4      ;YES. STORE LENGTH IN DIRECTORY\r
309 ENTRA:  SUBI    UUO,2           ;NO. POINT TO NAME\r
310         MOVE    TAC1,@UUO       ;PICK IT UP\r
311         MOVEM   TAC1,(TAC)      ;INTO DIRECTORY\r
312         HLRE    TAC,TAC         ;COMPUTE INDEX OF FILE\r
313         ADDI    TAC,27\r
314         HLRZ    DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
315         SUB     DAT,TAC         ;WRITE SAME FILE AS READING?\r
316         JUMPE   DAT,CPOPJ       ;TAKE ERROR RETURN IF YES\r
317         HRLM    TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
318 \r
319         PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS BELONGING TO FILE\r
320         AOJE    AC3,FNTRD       ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
321                                 ;IS A SAVE FILE (UGETF DONE)\r
322         MOVEI   BLK,DIRBLK      ;NO. GET 1ST BLOCK CLOSE TO\r
323         TLO     IOS,RVERSE      ;DIRECTORY. GOING IN REVERSE\r
324         POPJ    PDP,USLSTA\r
325         CAILE   BLK,TOPBLK      ;BLOCK LEGAL?\r
326         POPJ    PDP,            ;NO. ERROR RETURN\r
327 ENTRC:  MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
328         HRRM    BLK,OBLK(DEVDAT)        ;SAVE IN DDB\r
329         AOS     UUO             ;POINT UUO TO WORD 2\r
330         HRRM    BLK,@UUO        ;SAVE 1ST BLOCK IN USER'S AREA\r
331         HLL     TAC,@UUO        ;GET EXTENSION\r
332         HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE EXTENSION IN DDB ALSO\r
333         TLO     IOS,NOLINK\r
334         AOS     (PDP)\r
335 \f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
336 MARKDR: PUSHJ   PDP,DRPTR       ;SET POINTER TO BLOCK IN DIR\r
337         HLRZ    TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
338         IDPB    TAC,BLK         ;MARK DIRECTORY\r
339         TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
340         JRST    STOIOS\r
341 \r
342 ;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
343 DRPTR:  SUBI    BLK,1           ;SET FOR ILDB OR IDPB\r
344         IDIVI   BLK,7           ;COMPUTE WORD, POSITION\r
345         ADD     BLK,OLOC(DEVDAT) ;GET CORRECT ADDRESS\r
346         HRLI    BLK,440500      ;MAKE IT A BYTE POINTER\r
347         JUMPE   DAT,CPOPJ       ;CORRECT FOR POSITION IN WORD\r
348         IBP     BLK\r
349         SOJG    DAT,.-1\r
350         POPJ    PDP,\r
351 \r
352 ;HERE FOR NEW FILE NAME ON ENTER\r
353 NEWENT: SUB     TAC,[XWD 26,26];START AT BEGINNING OF DIRECT.\r
354 \r
355         SKIPN   (TAC)           ;FIND A FREE SLOT\r
356         AOJA    UUO,ENTR2       ;RETURN WITH UUO POINTING TO WRD 2\r
357         AOBJN   TAC,.-2\r
358         POPJ    PDP,            ;NONE AVAILABLE.\r
359 \r
360 ;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
361 SETWD4: HLRE    TAC1,@UUO       ;GET -LENGTH\r
362         MOVNS   TAC1            ;+LENGTH\r
363         HRRE    TEM,@UUO\r
364         ADD     TAC1,TEM        ; +START ADDRESS\r
365         TRZ     TAC1,1777       ;STORE N-1, WHERE N IS NO OF K\r
366         LSH     TAC1,2\r
367         ORM     TAC1,26(TAC)    ;INTO 2ND WRD OF DIRECTORY\r
368         SOJA    UUO,ENTRA       ;CONTINUE WITH ENTER\r
369 \r
370 ENTRD:  MOVEI   TAC,0           ;GET THE 1ST FREE BLOCK ON TAPE\r
371         PUSHJ   PDP,BLKSRC      ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
372         POPJ    PDP,            ;NONE AVAILABLE\r
373         JRST    ENTRC           ;CONTINUE WITH ENTER\r
374 \f;USETI -  SET NEXT INPUT BLOCK TO READ\r
375 SETI:   TDZ     IOS,[XWD IOEND,IODEND]\r
376         SKIPA   DAT,DEVDAT\r
377 \r
378 ;USETO  -  SET NEXT OUTPUT BLOCK TO READ\r
379 SETO:   MOVEI   DAT,1(DEVDAT)\r
380         PUSHJ   PDP,WAIT1       ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
381         HRRM    UUO,IBLK(DAT)  ;SET BLOCK NUMBER\r
382         JRST    STOIOS          ;STOE IOS, POPJ\r
383 \r
384 ;UGETF  -  GET NEXT FREE BLOCK FOR THIS FILE\r
385 GETF:   PUSHJ   PDP,WAIT1       ;WAIT TILL BUFFERES EMPTY\r
386         PUSHJ   PDP,DIRCHK      ;ENSURE DIR, IN CORE\r
387         PUSHJ   PDP,USRFRE      ;GET NEXT AVAILABLE BLOCK\r
388         SKIPN   OBLK(DEVDAT)    ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
389         SETOB   BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
390                                 ;WILL FINE FIRST FREE BLOCK ON TAPE\r
391         MOVE    TAC,BLK         ;TELL USER THE BLOCK NUMBER\r
392         JRST    STOTAC\r
393 \r
394 ;GET NEXT (OR PREVIOUS) FREE BLOCK\r
395 USRFRE: MOVEI   TEM,SPACE       ;BLOCKS "SPACE" APART\r
396         LDB     BLK,PIOMOD      ;EXCEPT DUMP AND SAVMOD FILES\r
397         CAIL    BLK,SD          ;OR ONE OF DUMP MODES?\r
398         MOVEI   TEM,2           ;YES, WHICH ARE CLOSRER\r
399 USRFRA: HRRZ    BLK,OBLK(DEVDAT)        ;CURRENT BLOCK\r
400         TLNE    IOS,RVERSE      ;FORWARD?\r
401         JRST    USRLST          ;NO\r
402         ADDI    BLK,(TEM)       ;YES, FIND NEXT BLOCK AT LEAST N\r
403         CAILE   BLK,TOPBLK\r
404         TDZA    BLK,BLK\r
405 CALNXT: PUSHJ   PDP,NXTFRE       ;BLOCKS PAST THIS ONE\r
406         JUMPN   BLK,STOIOS      ;RETURN IF FOUND\r
407         TLOE    TEM,1           ;FOUND NONE ON THIS PASS\r
408         JRST    NOBLKS          ;TAPE IS FULL\r
409         TLC     IOS,RVERSE      ;REVERSE DIRECTION\r
410         HRRI    TEM,1           ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
411         JRST    USRFRA\r
412 USRLST: SUBI    BLK,(TEM)       ;LOOK FOR FREE BLOCK N BEFORE\r
413         SKIPG   BLK\r
414         TDZA    BLK,BLK         ;REVERSE IF AT FRONT OF TAPE\r
415 USLSTA: PUSHJ   PDP,LSTFRE      ;THIS ONE\r
416         JRST    CALNXT+1\r
417 \r
418 ;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER\r
419 NOBLKS: MOVEI   BLK,TOPBLK+1    ;SET HIGH BLOCK\r
420         POPJ    PDP,\r
421 \f;UTPCLR UUO\r
422 UTPCLR: TRNE    IOS,UDSD\r
423         POPJ    PDP,            ;FORGET IT FOR NON-STANDARD\r
424         MOVSI   TAC,DVDIRIN     ;SET DIRECTORY-IN-CORE BIT\r
425         ORM     TAC,DEVMOD(DEVDAT)\r
426         TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
427         HRRZ    TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
428         HRL     TAC1,TAC\r
429         HRRI    TAC1,1(TAC)     ;BLT POINTER\r
430         SETZM   (TAC)\r
431         BLT     TAC1,176(TAC)   ;LEAVE LAST WORD IN DIR, ALONE\r
432         MOVSI   TAC1,17000      ;MARK DIRECTORY AS UNAVAILABLE\r
433         MOVEM   TAC1,16(TAC)\r
434         MOVSI   TAC1,757000     ;RESERVE BLOCKS 1 AND 2\r
435         MOVEM   TAC1,(TAC)      ;FOR READ IN MODE LOADER\r
436         MOVSI   TAC1,777770     ;MARK BLOCKS 1102-1105 AS\r
437         ORCAM   TAC1,NAMSTR-1(TAC)  ;UNAVAILABLE ALSO\r
438         JRST    STOIOS\r
439 \f;CLOSE UUO\r
440 UCLS:   TLZE    IOS,NOLINK      ;IS LAST BLOCK NOT LINKED?\r
441         TRNE    IOS,UDSD        ;AND NOT NON-STD?\r
442         JRST    STOIOS          ;YES, RETURN\r
443         LDB     TAC,PIOMOD      ;NO. WRITE LAST BLOCK\r
444         CAIL    TAC,16          ;DUMPO MODE?\r
445         JRST    CLSDMP          ;YES. CLOSE DUMP MODE\r
446         MOVEI   TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
447         MOVE    TAC1,1(TAC)     ;LINK WORD\r
448         TLON    TAC1,-1         ;LINK=-1 IF NOT SPECIFIED\r
449         MOVEM   TAC1,1(TAC)     ;LINK = -1... EOF\r
450         MOVEM   IOS,DEVIOS(DEVDAT)  ;SAVE IOS\r
451         JRST    OUT             ;GO TO WRITE RECORD\r
452 \r
453 ;HERE TO CLOSE A DUMP MODE FILE\r
454 CLSDMP: TLO     IOS,DMPOCLS+IO+DMPMOD ;SET SWITCHES\r
455         PUSHJ   PDP,GETDT       ;GET CONTROL\r
456         SETZM   BUF             ;ENSURE ZERO LINK,WORDCOUNT\r
457         SETZM   BUF+1           ;MAKE SURE 0, SO CAN GET WITH 3 SERIES MON.\r
458                                 ;FILES SAVED WITH 4 SERIES MONITOR.\r
459         JRST    OUFULL          ;GO WRITE THE BLOCK\r
460 \f;RELEASE UUO\r
461 UREL:   PUSHJ   PDP,WAIT1       ;MAKE SURE THE TAPE IS STOPPED\r
462         PUSHJ   PDP,NXTCM2      ;CLEAR OUT DUMP-MODE STUFF\r
463         MOVSI   TAC,DVDIRIN     ;IF NONSTANDARD, WILL CLEAR\r
464         TRZE    IOS,UDSD        ;CLEAR NON-STANDARD BIT.\r
465         ANDCAM  TAC,DEVMOD(DEVDAT)      ;SO DIRECTORY WILL BE READ ANEW\r
466         SKIPG   DEVMOD(DEVDAT)  ;IF DIRECTORY HAS BEEN\r
467         TLZN    IOS,CHNGDR      ;MODIFIED IT MUST BE WRITTEN\r
468         JRST    UREL2           ;IT HASN'T BEEN CHANGED\r
469         TLO     IOS,IO\r
470         PUSHJ   PDP,GETDT       ;WAIT TILL DTC AVAILABLE\r
471         TLO     IOS,RWDIR       ;GOING TO WRITE DIRECTORY\r
472         MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
473         PUSHJ   PDP,WRTBLK      ;WRITE UT\r
474         PUSHJ   PDP,WAIT1       ;WAIT TILL IT HAS BEEN WRITTEN\r
475 \r
476 UREL2:  MOVE    TAC,DEVIAD(DEVDAT) ;BITS 1,2 ARE COUNT OF CHANS\r
477         TLNE    TAC,200000      ;DEV INITED ON ANOTHER CHANNEL TOO?\r
478 \r
479 QUANTL: POPJ    PDP,QUANT       ;YES, DON'T ZAP IOS OR DDB\r
480 \r
481 ;SOME BITS IN THE IOS WORD AND THE DDB WILL NORMALLY BE CHANGED ON THE\r
482 ;INTERRUPT LEVEL AFTER THE RELEASE, BUT HNGSTP CAN CAUSE  THESE ACTIONS\r
483 ;NEVER TO OCCUR, SO MAKE SURE THEY REALLY HAPPENED\r
484         TLZ     IOS,77600       ;ZERO IOS BITS\r
485         SETZM   OBLK(DEVDAT)    ;AND OBLK\r
486         SETZM   IBLK(DEVDAT)    ;ZERO IBLK SO WRITING A FILE AFTER READING\r
487                                 ;IT WILL WORK (CHECK IS MADE AT ENTER)\r
488         SETZM   FSTBLK(DEVDAT)\r
489         JRST    STOIOS          ;STORE IOS AND RETURN\r
490 \fGETDT0:        PUSHJ   PDP,SETACT      ;WAIT TILL TAPE COMES OUT OF REWIND\r
491         PUSHJ   PDP,WSYNC       ;BEFORE DOING ANYTHING ELSE TO IT\r
492 ;GET DEC TAPE CONTROLLER\r
493 GETDT:  TLNE    IOS,REWBIT      ;IF TAPE IS REWINDING NOW\r
494         JRST    GETDT0          ;WAIT TILL THRU BEFORE CONTINUING\r
495 GETDT1: AOSE    DTREQ           ;CAN I HAVE IT\r
496         PUSHJ   PDP,DTWAIT      ;NO. COME BACK LATER\r
497         LDB     TAC,PUNIT       ;HAVE CONTROL NOW\r
498         LSH     TAC,11          ;CONNECT TO DTA\r
499         CONO    DTC,30000(TAC)  ;SEE IF TAPE IS OK\r
500         CONSZ   DTS,100         ;SELECT ERROR?\r
501         JRST    QUEST           ;YES. COMPLAIN\r
502         TLNE    IOS,IO          ;NO. TRYING TO WRITE TAPE?\r
503         CONSO   DTS,4000        ;YES. WRITE PROTECTED?\r
504         SKIPA   TAC,QUANTL      ;NO. EVERYTHING IS OK\r
505         JRST    QUEST           ;YES. COMPLAIN\r
506         HRRZM   TAC,QUANTM      ;SFT UP NUMBER OF BLOCK TO KEEP CONTROL FOR\r
507         CONO    DTC,10000       ;DESELECT CONTROL SO FNDBLK TEST\r
508                                 ;WILL WORK RIGHT (CONCO DTC,20000)\r
509         MOVEM   DEVDAT,USEWRD   ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
510         JRST    SETACT          ;LIGHT IOACT AND RETURN\r
511 \r
512 ;COME HERE TO COMPLAIN ABOUT UNIT NOT RIGHT (SELECT OR PROTECT ERROR)\r
513 QUEST:  PUSHJ   PDP,THRUTD      ;GIVE UP CONTROL\r
514         PUSHJ   PDP,HNGSTP      ;TYPE "DTAN OK?"\r
515                                 ;NOTE -- AC BLK (=ITEM) USED TO BE\r
516                                 ; PUSHED HERE, BUT IS NOT ANY LONGER\r
517                                 ; BECAUSE HNGSTP NOW PRESERVES IT,\r
518                                 ; AND THE STACK IS VERY FULL.\r
519         JRST    GETDT1          ;GET CONTROL AGAIN AND RETRY\r
520 \f       EXTERN  JOBDDT,USRDDT\r
521 ;DUMP MODE INPUT\r
522 DMPI:   IFN     CPBIT, <\r
523         HRRZ    AC2,IBLK(DEVDAT)\r
524 >\r
525         TLZ     IOS,IO\r
526         PUSHJ   PDP,DMPSET      ;SET UP DUMP-MODE STUFF\r
527         JRST    ZERCOR          ;ZER USER'S CORE IF SAVE-MODE\r
528 \r
529 \r
530 ;INPUT UUO\r
531 UIN:    TLZ     IOS,IO\r
532         HRRZ    BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
533         PUSHJ   PDP,STOIOS\r
534         TRNE    IOS,UDSD        ;NON STANDAR?\r
535         JRST    READBF\r
536         JUMPE   BLK,EOF         ;0 MEANS EOF\r
537         PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK NUMBER\r
538         TLNN    IOS,DMPMOD      ;DUMP MODE?\r
539 \r
540         CAIE    BLK,DIRBLK      ;TRYING TO READ DIRECTORY?\r
541         JRST    READBF          ;NO. GO READ\r
542 \r
543 ;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
544         PUSHJ   PDP,DIRCHK      ;READ IT IF IT ISN'T IN ALREADY\r
545         HRL     TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
546         MOVEI   TAC1,@DEVIAD(DEVDAT)  ;WHERE USER WANTS IT\r
547         HRRI    TAC,1(TAC1)     ;LOC OF DATA\r
548         BLT     TAC,200(TAC1)   ;GIVE IT TO HIM\r
549         PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
550         JFCL\r
551         POPJ    PDP,\r
552 \f;CHECK VALIDITY OF BLOCK NUMBER\r
553 BLKCHK: CAIG    BLK,TOPBLK      ;LEGAL?\r
554         POPJ    PDP,            ;YES. RETURN\r
555         POP     PDP,TAC\r
556         TROA    IOS,IOBKTL      ;NO. LIGHT ERROR BIT\r
557 \r
558 ;INPUT BLOCK = 0 - END OF FILE\r
559 EOF:    TLO     IOS,IOEND       ;LIGHT EOF BIT\r
560         TLNN    IOS,DMPMOD\r
561         JRST    STOIOS\r
562         JRST    DMPEOF          ;GIVE UP CONTROL IF DUMP-MODE\r
563 \r
564 ;ZERO USER'S CORE ON SAVE-MODE INPUT\r
565 ZERCOR: MOVEI   TAC,JOBDDT(PROG) ;ZERO CORE\r
566         HRLI    TAC,1(TAC)\r
567         MOVSS   TAC             ;BLT POINTER\r
568         HRRZ    TAC1,DMPLST(DEVDAT)  ;TOP CELL TO ZERO (-175)\r
569         ADDI    TAC1,(PROG)     ;RELOCATE TO USER AREA\r
570         SETZM   -1(TAC)         ;ZERO\r
571         BLT     TAC,(TAC1)\r
572         SETZM   USRDDT          ;DDT IS KEPT IN PROTECTED PART\r
573         JRST    UIN\r
574 \f;DUMP MODE OUTPUT\r
575 DMPO:   PUSHJ   PDP,DIRCHK      ;MAKE SURE DIRECTORY IS IN CORE\r
576         IFN     CPBIT, <\r
577         HRRZ    AC2,OBLK(DEVDAT)\r
578 >\r
579         TLO     IOS,IO\r
580         PUSHJ   PDP,DMPSET      ;SET DUMPO-MODE POINTERS\r
581         JFCL\r
582 \r
583 ;OUTPUT UUO\r
584 UOUT:   TLO     IOS,IO\r
585         TRNE    IOS,UDSD        ;NON STANDARD?\r
586         JRST    UOUT2           ;YES\r
587         PUSHJ   PDP,DIRCHK      ;NO. MAKE SURE DIRECTORY IS IN CORE\r
588         TLO     IOS,IO          ;IF DIRCHK READ, IO WENT OFF\r
589         HRRZ    BLK,OBLK(DEVDAT)\r
590         CAIN    BLK,DIRBLKK     ;CHECK IF WRITING DIRECTORY\r
591         JRST    COR2HM          ;YES, WRITE CORE IMAGE\r
592         JUMPE   BLK,FAKAV       ;DONT WRITE IF NO BLOCK GIVEN\r
593 \r
594         PUSHJ   PDP,BLKCHK      ;CHECK FOR LEGAL BLOCK\r
595 UOUT2:  TLNN    IOS,DMPMOD      ;ALREADY HAVE CONTROL IF DUMP-MODE\r
596         PUSHJ   PDP,GETDT       ;GET DEC TAPE CONTROLLER\r
597 FILBUF:\r
598 DTOCHK: TLNE    IOS,DMPMOD      ;DUMP MODE?\r
599         JRST    DMPFIL          ;YES, FILL BUFFER FROM LIST\r
600         MOVSI   TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
601         ADD     TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
602         BLT     TAC,BUF+177     ;GO BLT IT\r
603         TLZ     IOS,NOLINK\r
604 \fOUFULL:        TRNE    IOS,UDSD        ;NON-STANDARD?\r
605         JRST    OUTBL2          ;YES, NO FILE-STRUCTURED OPERATIONS\r
606         HLRE    BLK,BUF         ;IS IT?\r
607         JUMPL   BLK,LSTBLK      ;YES, - LAST BLOCK OF FILE\r
608         JUMPN   BLK,OUTBLK      ;IF NON-0 - YES\r
609         TLNE    IOS,DMPCLS      ;NO. LAST BLOCK OF A DUMPO FILE?\r
610                         ;DMPCLS WILL BE TURNED OFF AT THE INTERRUPT\r
611         JRST    OUTBLK          ;YES. LINK MUST STAY 0\r
612 OUCOMP: PUSHJ   PDP,USRFRE      ;COMPUTE NEXT BLOCK\r
613         TLO     IOS,NOLINK      ;THIS BLOCK NOT LINKED\r
614 OUTBLK: HRLM    BLK,BUF          ;SAVE LINK IN 1ST WORD OF BLOCK\r
615         MOVE    TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
616         DPB     TEM,[POINT 10,BUF,27]\r
617         HRRZ    TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
618         HRRM    BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
619         MOVE    BLK,TEM\r
620         PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK\r
621         PUSHJ   PDP,MARKDR      ;MARK BLOCK TAKEN IN DIRECTORY\r
622         SKIPA   BLK,TEM\r
623 OUTBL2: HRRZ    BLK,OBLK(DEVDAT)\r
624         PUSHJ   PDP,STOIOS\r
625 \r
626 WRTBLK: PUSHJ   PDP,FNDBLK      ;GO SEARCH FOR BLOCK\r
627         MOVE    TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE\r
628         JRST    RDWRT\r
629 \f;WRITE LAST BLOCK\r
630 LSTBLK: MOVEI   BLK,0           ;LINK=0\r
631         JRST    OUTBLK          ;GO WRITE LAST BLOCK\r
632 \r
633 ;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
634 COR2HM: MOVEI   TAC,@DEVOAD(DEVDAT)  ;WHERE IT IS\r
635         HRLI    TAC,1(TAC)      \r
636         HRR     TAC,DLOC(DEVDAT)        ;WHERE TO PUT IT\r
637         MOVEI   TAC1,177(TAC)\r
638         BLT     TAC,(TAC1)\r
639         TLO     IOS,CHNGDR      ;REMEMBER TO WRITE IT OUT\r
640         MOVSI   TAC1,DVDIRI\r
641         ORM     TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
642 FAKADV: TLZE    IOS,DMPMOD      ;DUMP MODE?\r
643         JRST    THRUTD          ;YES. GIVE UP CONTROL\r
644         PUSHJ   PDP,ADVBFE      ;ADVANCE BUFFERS\r
645         JFCL\r
646         TLZ     IOS,NOLINK      ;DIRECTORY BLOCK IS NOT LINKED\r
647         SETZM   OBLK(DEVDAT)\r
648         JRST    STOIOS\r
649 \f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
650 DMPSET: PUSHJ   PDP,GETDT       ;GET CONTROL\r
651         TLO     IOS,DMPMOD      ;LIGHT BIT\r
652         PUSHJ   PDP,COMCHK      ;CHECK VALIDITY OF LIST\r
653         JRST    SVADER          ;NG. GIVE ADRESS ERROR\r
654         SKIPL   TAC,@UUO        ;OK. NULL LIST?\r
655         JRST    DMPTS1          ;YES. RETURN\r
656         IFN CPBIT, <\r
657         TRNE    IOS,UDSD        ;NO. NON-STD MODE?\r
658         SOJA    DAT,TDUSER      ;YES. GO ELSEWHERE\r
659 >\r
660 DMPST2: SOS     UUO             ;NO. SAVE START OF LIST (-1)\r
661         MOVEM   UUO,DMPLST(DEVDAT)\r
662         JRST    CPOPJ1\r
663 \r
664 DMPTS1: POP     PDP,TAC\r
665         JRST    THRUTD\r
666 \r
667         IFN CPBIT, <\r
668 ;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
669 TOUSRF: JUMPE   AC2,NOBLK0      ;CANT READ BLK 0 IN NON-STD DUMP  MODE\r
670         ASH     DAT,-7          ;NUMBER OF WRDS IN LIST /200\r
671         AOS     DAT\r
672         MOVEM   DAT,BLKCNT      ;SAVE TO UPDATE POSITION\r
673         MOVEI   UUO,@UUO        ;REAL ADDRESS OF LIST\r
674 TOUSR1: MOVEM   UUO,USPNTR      ;SAVE IT\r
675         MOVEM   UUO,SVPNTR\r
676         ADDI    TAC,(PROG)      ;RELOCATE ADDRESS OF 1ST IOWD\r
677         MOVEM   TAC,PNTR        ;AND SAVE IT\r
678         MOVE    TAC,[JSP DMPADV] ;SET UP LOC FOR WHEN\r
679         MOVEM   TAC,DTALC2      ;IOWD IS EXHAUSTED\r
680         HRRZM   PROG,ADRPRG     ;SAVE JUST ADDRESS OF PROG\r
681         TLO     IOS,NOBUF       ;INDICATE DIRECTLY TO USER\r
682         TLNN    IOS,IO\r
683         JRST    CPOPJ1          ;READING - CONTINUE\r
684         POP     PDP,TAC         ;WRITING - THIS WILL SAVE LOTS OF TIME\r
685         JRST    OUTBL2\r
686 \r
687 NOBLK0: TRO     IOS,IOIMPM\r
688         POP     PDP,TAC         ;RETURN TO UUOCON WITH ERROR BIT SET\r
689         JRST    THRUTD\r
690 >\r
691 \f;FILL OUTPUT BUFFER FROM LIST\r
692 DMPFIL: MOVSI   TAC1,-177\r
693         IFE     CPBIT, <\r
694         TRNE    IOS,UDSD\r
695         SUB     TAC1,ONEONE     ;200 DATA WORDS IF NON-STANDARD\r
696 >\r
697 DMPFLB: PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
698         JRST    DMPOTH          ;END OF LIST\r
699 DMPLFA: MOVE    TEM,(TAC)       ;GET NEXT WORD\r
700         MOVEM   TEM,BUF+1(TAC1) ;INTO BUFFER\r
701         AOBJP   TAC1,DMPOVR     ;BUFFER FULL IF GOES\r
702         AOBJN   TAC,.-3         ;GET NEXT WORD FROM COMMAND\r
703         JRST    DMPFLB          ;GET NEXT COMMAND\r
704 \r
705 DMPOTH:\r
706         IFE     CPBIT, <\r
707         TRNN    IOS,UDSD\r
708 >\r
709         HRRZM   TAC1,BUF        ;LIST RAN OUT  SAVE WORD COUNT\r
710         SETZM   BUF+1(TAC1)     ;ZERO REST OF BUFFER\r
711         HRRZI   TAC1,BUF+2(TAC1)\r
712         CAILE   TAC1,BUF+177    ;JUST ZERO 1 WORD IF AT TOP\r
713         JRST    OUFULL\r
714         HRLI    TAC1,-1(TAC1)\r
715         BLT     TAC1,BUF+177    ;****TEST IF TOP OF BUFFER\r
716         JRST    OUFULL          ;NOW WRITE BUFFER\r
717 \r
718 ;BUFFER FULL BEFORE END OF COMMAND\r
719 DMPOVR: AOBJN   TAC,.+3         ;WAS THAT LAST WORD OF COMMAND?\r
720         PUSHJ   PDP,NXTCOM      ;YES. GET NEXT\r
721         MOVEI   TAC,0\r
722         MOVEM   TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
723 DMPOVA: MOVEI   TAC,177\r
724         IFE     CPBIT, <\r
725         TRNN    IOS,UDSD\r
726 >\r
727         MOVEM   TAC,BUF         ;WD CNT =177\r
728         JRST    OUFULL          ;GO WRITE PART OF STUFF\r
729 \r
730 ;GET NEXT COMMAND FROM LIST\r
731 NXTCOM: SKIPN   DMPLST(DEVDAT)  ;END OF COMMANDS?\r
732         JRST    NXTCM2          ;YES. RETURN\r
733         AOSA    TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
734 NXTCM1: HRRM    TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
735         MOVE    TAC,@TAC        ;GET COMMAND\r
736         JUMPE   TAC,NXTCM2      ;END OF LIST\r
737         JUMPG   TAX,NXTCM1      ;GO-TO WORD\r
738         ADDI    TAC,(PROG)      ;REAL COMMAND - ADD RELOCATION\r
739         AOJA    TAC,CPOPJ1      ;AND RETURN\r
740 \f;END OF DUMP-MODE LIST\r
741 NXTCM2: SETZM   SVDWRD(DEVDAT)  ;ZERO POINTERS\r
742         SETZM   DMPLST(DEVDAT)\r
743         POPJ    PDP,\r
744 \r
745 DMPFLC: SKIPE   TAC,SVDWRD(DEVDAT)      ;IS THERE ANOTHER COMMAND\r
746         JRST    DMPFLA          ;YES. GET IT\r
747         JRST    DMPTH2          ;NO. THROUGH\r
748 \fDTC=320\r
749 DTS=324\r
750 \r
751 ;IO INTERFACE\r
752 READBF: TLNN    IOS,DMPMOD      ;HAVE CONTROL IF DUMP-MODE\r
753                                 ; UNLESS ON A LOOKUP, IN WHICH\r
754                                 ; CASE ALWAYS GET DT CONTROL\r
755 RDBLUK: PUSHJ   PDP,GETDT       ;GET DT CONTROL\r
756 \r
757 READBC: PUSHJ   PDP,FNDBLK      ;SEARCH FOR RIGHT BLOCK\r
758         MOVE    TAC1,[BLKI DTC,300] ;FOUND IT - START READING\r
759 \r
760 ;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
761 RDWRT:  HLLM    TAC1,IOWD       ;BLKI OR BLKO\r
762         HRLI    TAC,-200\r
763         TLNN    IOS,RWDIR       ;WRITING (READING) DIRECT?\r
764         SKIPA   TAC,BFPNTR      ;NO. INTO BUF\r
765         HRR     TAC,DLOC(DEVDAT)        ;YES. LOC OF DIRECTORY\r
766         CONSZ   DTC,100000      ;IN REVERSE?\r
767 \r
768         JRST    IORVRS          ;YES\r
769         SOS     TAC             ;ADDRESS -1\r
770         MOVE    TEM,IOWD        ;GET IOWD\r
771 IOGO:   MOVEM   TEM,DTALOC      ;SET UP INTERRUPT LOCATION\r
772         IFN CPBIT, <\r
773         TLNE    IOS,NOBUF       ;IF DIRECTLY TO USER\r
774         JRST    IOGO2           ;DTALC2, PNTR ALREADY SET UP\r
775 >\r
776         MOVEM   TAC,PNTR        ;POINTER\r
777         MOVE    TAC,[JSR DTATHR]        ;SET UP INTERRUPT LOC+1\r
778         MOVEM   TAC,DTALC2\r
779 IOGO2:  CONO    DTC,DTBOTH(TAC1) ;START READ OR WRITE\r
780         CONO    DTS,770000      ;ENABLE FOR ALL INTERRUPTS\r
781         POPJ    PDP,            ;DISMISS INTERRUPT\r
782 \f;HERE IF TAPE IS GOING IN REVERSE WHEN BLOCK NUMBER FOUND\r
783 IORVRS: ADDI    TAC,176         ;START AT TOP OF BUFFER\r
784         MOVE    TEM,[JSR RVERS]\r
785         JRST    TOGO            ;COMPILCATED STUFF FOR EACH WORD\r
786 \r
787 ;HERE FOR AY DATA WORD WITH TAPE IN REVERSE\r
788 RVERS:  0\r
789 IOWD:   BLKI    DTC,PNTR        ;READ (WRITE) A WORD\r
790                                 ; NOTE -- THIS LOCATION IS IMPURE.\r
791                                 ; MODIFIED TO A BLKI OR BLKO.\r
792         JRST    RVTHRU          ;POINTER RAN OUT\r
793         SOS     PNTR            ;POINTER HAS TO BACK UP\r
794         SOS     PNTR\r
795         JEN     @RVERS          ;DISMISS THE INTERRUPT\r
796 \r
797 ;HERE WHEN POINTER RUNS OUT IN REVERSE\r
798 RVTHRU: CONO    DTS,770001      ;FUNCTION STOP\r
799         JEN     @RVERS          ;DISMISS\r
800 \r
801 ;HERE WHEN POINTER RUNS OUT FORWARD\r
802 DTATHR: 0\r
803         CONO    DTS,770001      ;FUNCTION STOP\r
804         JEN     @DTATHR         ;DISMISS\r
805 \f;HERE TO PERFORM A REWIND MTAPE FOR DTA\r
806 MTAP0:  PUSHJ   PDP,GETDT       ;GET THE CONTROL FOR THE TAPE\r
807         LSH     TAC1,15         ;TAC1=0 FOR REQ; 10 FOR REW UNLD\r
808         TDZ     IOS,[XWD IO,IOACT] ;SET UP IOS\r
809         TLO     IOS,REWBIT+RVERSE(TAC1)\r
810         MOVEI   BLK,0           ;SEARCH FOR BLOCK 0\r
811         PUSHJ   PDP,FNDBLK      ;GO FIND BLOCK\r
812 \r
813 ;CONTROL COMES HERE ON INTERRUPT CHANNEL WHEN THE BLOCK IS FOUND\r
814         TLNE    IOS,RUNBIT      ;REWIND UNLOAD?\r
815         JRST    .+3             ;YES, CONTINUE\r
816         CONO    DTS,770001      ;NO, THROUGH WITH TAPE. - FNCTN STOP\r
817         POPJ    PDP,            ;DISMISS INTERRUPT\r
818         MOVE    TAC,RUNWD       ;USE THE CLOCK TO DESELECT THE TAPE\r
819         JSR     CLKREQ          ;FOR A WHILE - IT WILL GO OFF THE END\r
820         CONO    DTC,410000      ;DESELECT THE TAPE SO IT CAN GO OFF\r
821         POPJ    PDP,            ;DISMISS THE INTERRUPT\r
822 RUNWD:  XWD     RUNCLK,200\r
823 \r
824 ;COME HERE ON THE CLOCK LEVEL FOR REWIND AND UNLOAD\r
825 RUNCLK: MOVE    DEVDAT,USEWRD\r
826         LDB     TAC,PUNIT       ;GIVE CONO TO READ BLOCK NOS IN FORWARD\r
827         LSH     TAC,11          ;DIRECTION - THIS WILL CAUSE FULL REEL\r
828         CONO    DTC,230200(TAC);TO STOP FLAPPING WHEN CONO STOP IS DONE\r
829         MOVE    IOS,DEVIOS(DEVDAT)  ;RESET IOS\r
830         JRST    REWDUN          ;DECREASE DTREQ. STOP TAP\r
831 \r
832 ;HERE TO PUT C(TAC) IN THE CLOCK QUEUE\r
833 CLKREQ: 0\r
834         CONO    PI,PIOFF        ;TURN OFF PI\r
835         IDPB    TAC,CLOCK\r
836         CONO    PI,PION\r
837         JRST    @CLKREQ\r
838 \f       EXTERN  JOB\r
839         EXTERN  HNGSTP\r
840 ;COME HERE TO START READING BLOCK NUMBERS\r
841 FNDBLK: HRRZM   BLK,BLOCK       ;BLOCK WE'RE LOOKING FOR\r
842         POP     PDP,DISPAD(DEVDAT) ;WHERE TO GO WHEN RIGHT BLOCK FOUND\r
843         SETZM   ERRCNT\r
844 FNDBL2: LDB     TAC,PUNIT       ;GET UNIT NUMBER\r
845         LSH     TAC,11          ;POSITION IT\r
846         CONSZ   DTC,20000       ;TAPE SELECTED?\r
847         JRST    FNDBL4          ;YES\r
848         TRO     TAC,230000      ;NO, SET TO SELECT TAPE FORWARD\r
849         TLNE    IOS,RVERSE+NOBUF ;REVERSE OR DIRECT TO USER?\r
850         TRC     TAC,300000      ;YES. SET FOR REVERSE\r
851 FNDBL3: TRO     TAC,DTBOTH      ;ADD PI ASSIGNMENT\r
852         MOVE    TEM,[JSR SRCH]  ;SET UP PI LOCS FOR SEARCH\r
853         MOVEM   TEM,DTALOC      ;INTO PI INTERRUPTCELL\r
854         CONO    DTC,200(TAC)    ;START SEARCHING BLOCKS\r
855         CONO    DTS,670000      ;ENABLE FOR ALL BUT JOB DONE\r
856         SETOM   IOWRIT          ;SET SWITCH NON - 0 IF USING\r
857         TLNN    IOS,RWDIR       ;MONITOR BUFFER FOR OUTPUT\r
858         TLNN    IOS,IO          ;SO REKON WONT GIVE CONTROL (AND\r
859         SETZM   IOWRIT          ;BUFFER)  AWAY\r
860         TLZ     IOS,RECKON+IOFST ;TURN OFF DEAD-RECKON BIT\r
861         MOVEM   DEVDAT,USEWRD\r
862         PUSHJ   PDP,STOIOS      ;SAVE IOS\r
863         IFN CPBIT, <\r
864         TLZ     IOS,NOBUFC      ;SET WORD NON-ZERO IF NOBUF ON\r
865         HLRZM   IOS,DIRCTN\r
866 >\r
867         POPJ    PDP,            ;AND LEAVE\r
868 \r
869 FNDBL4: CONSZ   DTC,200000      ;DIRECTION TEST\r
870         TROA    TAC,200000      ;FORWARD\r
871         TRO     TAC,100000      ;REVERSE\r
872         JRST    FNDBL3          ;START SEARCH\r
873 \f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
874 SRCH:   0       \r
875         MOVEM   TAC,TEMP        ;SAVE WORKING AC\r
876         CONI    DTS,TAC         ;GET STATUS BITS\r
877         TLNE    TAC,2000        ;IS CONTROL STILL ACTIVE?\r
878         JRST    SRCHD           ;YES. MUST BE IN "PSEUDO END-ZONE"\r
879         DATAI   DTC,TAC         ;NO. READ A BLOCK NUMBER\r
880         TLZ     TAC,-1          ;LEGAL BLOCK NUMBER>\r
881         JRST    SRCHB           ;NO. SET ERROR SWITCH\r
882         SUB     TAC,BLOCK       ;NOW-WANTED\r
883         IFN CPBIT, <\r
884         SKIPE   DIRCTN          ;MUST BE GOING FORWARD IF DUMP-MODE\r
885         JRST    SRCHC           ;DIRECTLY TO USER\r
886 >\r
887         JUMPE   TAC,FOUND       ;=0 IF WE'RE THERE\r
888 SRCHA:  CONSZ   DTC,100000      ;IF TAPE IS IN REVERSE\r
889         MOVNS   TAC             ;SWITCH TURN-AROUND TEST\r
890         JUMPLE  TAC,.+3 ;TEST FOR DISCONNECT IF DIRECTION IS CORRECT\r
891 \r
892                                 ;***\r
893         CONO    DTC,DTTURN      ;TURN AROUND\r
894         JRST    SRCHXT          ;AND GO AWAY\r
895         MOVMS   TAC\r
896         CAILE   TAC,MINDIS      ;WORTH WHILE TO DISCONNECT TAPE?\r
897         JRST    BEKON           ;YES. GO DISCONNECT\r
898         SKIPLE  DISCON          ;NO. IS THERE A DISCON. TAPE\r
899                                 ;WHICH HAS TIMED OUT?\r
900         CAIG    TAC,2           ;YES. WILL THIS SEARCH TAKE LONG?\r
901         SKIPA                   ;NO\r
902         CONO    DTS,670002      ;YES. STOP DISCONNECTED TAPE\r
903         SKIPE   TAC,ALMSWT      ;READING BLOCK NOS OF AN ALMOST ACTIVE DTA?\r
904         JSR     CLKREQ          ;YES., GET ITS JOB BACK INTO MEMORY\r
905 SRCHXT: MOVE    TAC,TEMP        ;RESTORE TAC\r
906         SETZM   ALMSWT\r
907         JEN     @SRCH           ;AND DISMISS THE INTERRUPT\r
908 \f;HERE IF AN ILLEGAL BLOCK WAS READ FROM THE TAPE\r
909 SRCHR:  AOS     TAC,ERRCNT      ;BUMP ERROR COUNT\r
910         CAIG    TAC,DTTRV       ;TRIED ENOUGH?\r
911         JRST    SRCHXT          ;NO. READ ANOTHER BLOCK NUMBER\r
912         SETOM   BLOCK           ;YES. BLOCK = -1 AS AN ERROR SWITCH\r
913         CONO    DTA,770001      ;FUNCTION STOP\r
914         JRST    SRCHXT          ;GO AWAY\r
915 \r
916         IFN CPBIT, <\r
917 SRCHC:  CONSZ   DTC,100000      ;GOING FORWARD?\r
918         TLCA    TAC,400000      ;NO. SWITCH TURN AROUND TEST. ENSURE FORWARD\r
919         JUMPE   TAC,FOUND       ;GO IF FOUND FORWARD\r
920         SKIPI   TAC             ;TURN AROUND?>\r
921         CONO    DTC,DTTURN      ;YES\r
922         JRST    SRCHXT          ;READ ANOTHER BLOCK NUMBER\r
923 >\r
924 \r
925 ;COME HERE IF CONTROL IS STILL ACTIVE AFTER READING A BLOCK NUMBER\r
926 ;THIS MEANS THAT TAPE IS IN THE "PSEUDO END-ZONE" - EXTRA FILLERS\r
927 ;INSERTED FOR THE BENEFIT OF THE PDP-9\r
928 SRCHD:  CONO    DTC,DTTURN      ;TURN TAPE AROUND\r
929         JRST    SRCHXT          ;AND EXIT THE INTERRUPT\r
930 \f;COME HERE WHEN A TAPE IS IN A LONG SEARCH\r
931 ;IF THIS TAPE HAS NOT USED THE MONITOR BUFFER (READING), AND\r
932 ;IF NO OTHER TAPES ARE DISCONNECTD, THIS ONE WILL BE,\r
933 ;AND A CLOCK REQUEST WILL BE ENTERED FOR AN ESTIMATED TIME TO BLOCK.\r
934 \r
935 REKON:  SKIPN   IOWRIT          ;MONITOR BUFFER FULL?\r
936         SKIPGE  DISCON          ;ANOTHER TAPE DISCONNECTED?\r
937         JRST    SRCHXT          ;YES, FORGET IT\r
938         MOVEM   TAC1,FNDTMP     ;SAVE AN AC\r
939         MOVE    TAC1,DISTNC\r
940         SUB     TAC1,TAC        ;CHECK SEQUENCE\r
941         SOJN    TAC1,TRYLTR     ;JUMP IF NOT SEQUENTIAL BLOCKS\r
942         EXCH    DEVDAT,USEWRD   ;NO. DISCONNECT FROM THIS ONE\r
943         MOVSI   TAC1,ALMACT     ;SET TAPE AS ALMOST ACTIVE - SWAPPABLE AND \r
944                                 ;SHUFFLABLE EVEN THOUGH ACTIVE\r
945         ORM     TAC1,DEVIOS(DEVDAT)\r
946         LDB     TAC1,PJOBN      ;ASSOCIATED JOB NUMBER\r
947         HRRM    TAC1,MONB2      ;SAVE IN WD 2 OF MONITOR BUFFER\r
948         HRLM    DEVDAT,MONB2    ;SAVE ADDRESS OF DTA\r
949 \r
950         CONSZ   DTC,200000\r
951         IMULI   TAC,62          ;COMPUTE A TIME TO BLOCK\r
952         CONSZ   DTC,100000      ;BASED ON 50 MSEC/BLOCK FORWARD\r
953         IMULI   TAC,50          ;AND 40 MSEC/BLOCK IN REVERSE\r
954 MSECPT: IDIVI   TAC,.-.         ;DIVIDE BY NO, MILLISECS/TIC\r
955         CAILE   TAC,3300        ;IF THE COMPUTED TIME IS TOO HIGH\r
956         MOVEI   TAC,30          ;LOOK AGAIN IN 1 1/2 SECOND\r
957         MOVSI   TAC1,RECKON     ;LIGHT A BIT TO INDICATE THE TAPE IS\r
958         IORM    TAC1,DEVIOS(DEVDAT) ;DEAD RECKONING\r
959         MOVE    TAC1,FNDTMP     ;RESTORE TAC1\r
960         HRRM    TAC,TIMREQ      ;SET UP A TIME REQUEST\r
961         LDB     TAC,PUNIT       ;6 BITS OF INFORMATION\r
962         SKIPN   TAC             ;UNIT 0 = 8\r
963         MOVEI   TAC,10\r
964         LSH     TAC,14          ;IS THE UNIT NUMBER\r
965         ADD     TAC,TIMREQ      ;REQUEST THE MONITOR TO WAKE\r
966         JSR     CLKREQ          ;IN N TICKS\r
967         MOVE    TAC,BLOCK       ;SAVE THE BLOCK NO.\r
968         CONSO   DTC,200000      ;AND THE DIRECTION\r
969         TRO     TAC,200000\r
970         HRLM    TAC,IBLK(DEVDAT)  ;IN THE DDB\r
971         CONO    DTC,410000      ;DESELECT THE CONTROL\r
972         ;BIT 400000 IS TO PREVENT ERROR FLAGS FROM COMING IN LATER -\r
973         ; IT DOES NOT CAUSE THE DESELECTED TAPE TO STOP THOUGH\r
974         MOVEI   DEVDAT,0\r
975         EXCH    DEVDAT,USEWRD   ;RESET DEVDAT\r
976         SKIPLE  DISCON          ;SWITCHING DISCONNNECTED TAPES?\r
977         JRST    NXTICK          ;YES. COME BACK LATER\r
978         SOSL    DTREQ           ;NO. COUNT DOWN DTREQ\r
979         SETOM   DTAVAL\r
980         SETOM   DISCON          ;ONLY 1 RECKON AT A TIME\r
981         JRST SRCHXT             ;AND EXIT THE INTERRUPT\r
982 \fTRYLTR:        MOVEM   TAC,DISTNC\r
983         MOVE    TAC1,FNDTMP     ;RESTORE TAC1\r
984         JRST    SRCHXT\r
985 \r
986 ;HERE WHEN SWITCHING DISCONNECTED TAPES\r
987 ;TOO MUCH TO DO ON THE INTERRUPT LEVEL. SO COME BACK ON\r
988 ;NEXT CLOCK TICK\r
989 NXTICK: MOVE    TAC,TIMRQ2      ;COME BACK IN A JIFFY\r
990         JSR     CLKREQ\r
991         JRST    SRCHXT\r
992 \r
993 TIMREQ: XWD     BACK,0\r
994 TIMRQ2: XWD     BACKA,1\r
995 \r
996 IFN     ALMACT,<\r
997         EXTERN  PRIIN\r
998 ;COME HERE ON THE CLOCK LEVEL TO BRING THE JOB ASSOCIATED WITH\r
999 ;AN "ALMOST ACTIVE" TAPE BACK INTO CORE\r
1000 ALMREQ: XWD     .+1,1\r
1001         MOVE    DEVDAT,USEWRD   ;DDB LOC\r
1002         LDB     ITEM,PJOBN      ;JOB NUMBER\r
1003         PUSHJ   PDP,PRIIN       ;TELL SWAPPER TO GET IT\r
1004         JFCL\r
1005         MOVSI   TAC,ALMACT\r
1006         ANDCAM  TAC,DEVIOS(DEVDAT) ;ZAP BIT SO IT WONT BE SWAPPED OUT AGAIN\r
1007         POPJ    PDP,\r
1008 \r
1009 ;HERE WHEN SWAPPER DOES GET THE JOB BACK INTO CORE\r
1010 SWPBAK: MOVE    IOS,DEVIOS(DEVDAT)\r
1011         SETM    MONB2           ;CLEAR JOB NO, FROM MON BUFFER\r
1012         TLNN    IOS,IOFST       ;WAS JOB SWAPPED OUT WHEN DATA FINISHED?\r
1013         POPJ    PDP,            ;NO. TRANSFER COMPLETED\r
1014         MOVE    TAC,JBTSTS(ITEM) ;YES, WAS IO ABORTED?>\r
1015         TRNN    TAC,ALBORT\r
1016         JRST    FAKINT          ;NO. NOW TRANSFER DATA, ADVANCE BUFFERS\r
1017         JRST    THRUTP          ;YES. FORGET REST OF OPERATION\r
1018 >\r
1019 \f       EXTERN  CIPWTM\r
1020 ;COME HERE FROM THE MONITOR WHEN THE ESTIMATED TIME-TO BLOCK\r
1021 ;HAS EXPIRED\r
1022 BACK:   SKIPE   USEWRD  ;IS CONTROL AVAILABLE?\r
1023         JRST    FLAGIT          ;NO. SET FLAG\r
1024         AOS     DTREQ           ;YES. DTREQ WILL BE COUNTED DOWN LATER\r
1025         SETZM   DTAVAL\r
1026         SETZM   DISCON          ;NO TAPE IS NOW DISCONNECYTED\r
1027 BACK2:  TRZ     TAC,10\r
1028         LSH     TAC,11          ;UNIT\r
1029         PUSH    PDP,TAC         ;SAVE IT\r
1030         LSH     TAC,3\r
1031         ADD     TAC,DTADDB      ;CONVERT TO SIXBIT NAME\r
1032         PUSHJ   PDP,DEVPHY      ;SET UP DEVDAT FOR IT\r
1033         HALT    .               ;******************************\r
1034         MOVEM   DEVDAT,USEWRD   ;RESET USEWRD\r
1035         HLRZ    TAC1,IBLK(DEVDAT) ;BLOCK NEEDED\r
1036         DPB     TAC1,[POINT 10,BLOCK,35]\r
1037         HRRZ    TAC,CLOCK\r
1038 \r
1039         HRLI    TAC1,CPOPJ      ;FIND CLOCK-QUEUE REFERENVCE TO BACKC\r
1040 BACK3:  CAIN    TAC,CIPWTM\r
1041         JRST    BACKD           ;NOT THERE, TAPE MUST HAVE BEEN STOPPED\r
1042         HLRZ    TEM,(TAC)       ;ADDRESS OF CLOCK REQUEST\r
1043         CAIE    TEM,BACKC       ;THIS THE ONE?\r
1044         SOJA    TAC,BACK3       ;NO. KEEP LOOKING\r
1045         HLLM    TAC1,(TAC)      ;YES. MAKE A NO-OP OUT OF IT\r
1046 BACKD:  POP     PDP,TAC         ;UNIT\r
1047         TRO     TAC,270000      ;SET SELECT, DELAY INHIBIT\r
1048         TRNE    TAC1,200000     ;SET DIRECTION\r
1049         TRC     TAC,300000      ;LREVERSE\r
1050         MOVE    IOS,DEVIOS(DEVDAT) ;RESTORE OS\r
1051 IFN     ALMACT, <       ;UNTIL REST OF SCHEDR, SWAPPER IS FIXED - IGNORE\r
1052         MOVE    TAC1,ALMREQ     ;INDICATE CONNECTING TO AN ALMOST\r
1053         MOVEM   TAC1,ALMSWT     ;ACTIVE TAPE, SO JOB WILL BE BROUGHT\r
1054                                 ;BACK IN IF TAPE CLOSE TO TARGET BLOCK\r
1055 >\r
1056         JRST    FNDBL3          ;READ NEXT BLOCK NUMBER\r
1057 \f;HERE WHEN TIME IS UP AND ANOTHER TAPE HAS THE CONTROL\r
1058 FLAGIT: MOVEM   TAC,DISCON      ;DISCON POSITIVE IF NEED THE CONTROL\r
1059         MOVE    TAC,.+3         ;SET A CLOCK REQUEST TO STOP TAPE\r
1060         JSR     CLKREQ\r
1061         POPJ    PDP,            ;RETURN, WILL COME IN ON INTERRUTP LEVEL\r
1062         XWD     BACKC,10\r
1063 \r
1064 ;HERE WHEN DTASER CAN GIVE UP THE CONTROL\r
1065 BACKB:  CONO    DTC,400000      ;STOP CURRENT TAPE\r
1066         PUSHJ   PDP,THRUTA      ;GIVE IT UP\r
1067         TDZA    TAC,TAC         ;DISCON WILL GO TO 0\r
1068 \r
1069 BACKA:  SETOM   TAC             ;DISCON WILL GO TO -1\r
1070         EXCH    TAC,DISCON      ;UNIT TO CONNECT TO\r
1071         JRST    BACK2           ;GO RECONNECT\r
1072 \r
1073 ;IF WE GET HERE THERE IS A SLOW TAPE ON THE SELECTED DRIVE\r
1074 BACKC:  CONO    PI,PIOFF ;CANT RISK CHANGING THE INTERRUPT ENABLES HRE\r
1075         CONI    DTS,TAC         ;READ IN ENABLE FLAGS\r
1076         HLRZS   TAC             ;FLAGS INTO R.H.\r
1077         ANDI    TAC,770000      ;ONLY ENABLE FLAGS\r
1078         CONO    DTS,2(TAC)      ;STOP THE DESELECTED TAPE\r
1079         CONO    PI,PION\r
1080         POPJ    PDP,            ;BEFORE RUNNING OFF END OF THE REEL\r
1081 \f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
1082 FOUND:  MOVEM   TAC1,FNDTMP     ;SAVE THOSE ACS THAT WILL BE USED\r
1083         MOVEM   TEM,RVERS\r
1084         EXCH    DEVDAT,USEWRD\r
1085         EXCH    IOS,DEVIOS(DEVDAT)\r
1086         ECHO    PDP,FNDPDP\r
1087         PUSHJ   PDP,@DISPAD(DEVDAT)     ;GO TO DISPATCH LOCATION\r
1088         EXCH    PDP,FNDPDP              ;RESTORE ACS\r
1089         EXCH    IOS,DEVIOS(DEVDAT)\r
1090         EXCH    DEVDAT,USEWRD\r
1091         MOVE    TAC,TEMP\r
1092         MOVE    TAC1,FNDTMP\r
1093         MOVE    TEM,RVERS\r
1094         JEN     @SRCH           ;EXIT THE INTERRUPT\r
1095 \r
1096 FNDPDP: XWD     -2,.\r
1097         0\r
1098 \r
1099         IFN CPBIT, <\r
1100 ;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
1101 DMPADV: 0\r
1102         MOVEM   TAC,TEMP\r
1103         AOSA    TAC,USPNTR      ;ADVANCE LOC OF POINTER\r
1104 DMPAV1: HRRM    TAC,USPNTR\r
1105         SKIPN   TAC,@TAC        ;END OF LIST?\r
1106         JRST    DMPAV3          ;YES. STOP TAPE\r
1107         ADD     TAC,ADRPRG      ;ADD RELOCATION\r
1108         JUMPG   TAC,DMPAV1\r
1109         MOVEM   TAC,PNTR        ;NEW POINTER\r
1110 DMPAV2: MOVE    TAC,TEMP        ;RESTORE TAC\r
1111         JEN     @DMPADV\r
1112 \r
1113 \r
1114 DMPAV3: CONO    DTS,770001      ;GIVE FUNCTION STOP\r
1115         JRST    DMPAV2          ;RESTORE TAC AND EXIT THE INTERRUPT\r
1116 \r
1117 >\r
1118 \f;INTERRUPT HERE FOR FLAG CHANNEL\r
1119 DTAINT: CONSO   DTS,770000      ;INTERRUPT FOR DTA?\r
1120         JRST    .               ;NO\r
1121         CONSZ   DTS,20000       ;END ZONE?\r
1122         SKIPGE  BLOCK           ;YES. BAD BLOCK NUMBER?\r
1123         SKIPA                   ;YES\r
1124         JRST    TURN            ;NO. TURN TAPE AROUND\r
1125         JSR     DTASAV          ;SAVE ACS\r
1126 FAKINT: MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
1127         MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
1128         LDB     ITEM,PJOBN      ;JOB NUMBER\r
1129 IFN ALMACT,<\r
1130         PUSHJ   PDP,PRIIN               ;IS JOB SWAPPED OR SHUFFLED?\r
1131         JRST    SWPDLY          ;YES, CANT MOVE BUFFERS NOW\r
1132 >\r
1133         MOVE    PROG,JBTADR(ITEM)       ;ADDRESS\r
1134 DTAIN1: TLZE    IOS,REWBIT      ;NO, FROM A REWIND MTAPE?\r
1135         JRST    REWDUN          ;YES. DONE\r
1136         TLZE    IOS,IOFST       ;COMING FROM SWAP DELAY ROUTINE?\r
1137         JRST    DTAIN2          ;YES, TD10 HAS BEEN ZAPPED\r
1138         CONSZ   DTS,100000      ;JOB DONE?\r
1139         CONSZ   DTS,670000      ;AND NO ERRORS?\r
1140         JRST    ERRS            ;NO. TOUGH LUCK\r
1141         SKIPGE  BLOCK           ;BAD BLOCK NUMBER ON TAPE?\r
1142 DTAIN2: TLNE    IOS,DMPMOD      ;DUMP MODE?\r
1143         JRST    DMPTHR          ;YES. GO ELSEWHERE\r
1144         TLNN    IOS,SINGL\r
1145         JRST    .+3\r
1146         LDB     TAC,[POINT 10,BUF,27]  ;GET 1ST BLOCK NO. IF READ\r
1147                                 ;CAME FROM LOOKUP\r
1148         MOVEM   TAC,IBLK(DEVDAT)  ;STORE IN DDB\r
1149         TLZE    IOS,IOW         ;NO. IN IO WAIT?\r
1150         PUSHJ   PDP,SETIOD      ;YES. TAKE OUT OF WAIT\r
1151         TLZE    IOS,SINGL+RWDIR+DMPCLS ;DIRECTORY OPERATION OR\r
1152                                         ;CLOSING DUMP FILE?\r
1153         JRST    THRUTP          ;YES. LEAVE\r
1154         TLNE    IOS,IO          ;WRITING?\r
1155         JRST    OUTHRU          ;YES\r
1156 \fEXTERN JBTSTS,PJOBN\r
1157 \r
1158 ;HERE ON END OF AN INPUT BLOCK\r
1159         HRROI   TAC1,177        ;MASK OUT 1ST-BLK DATA\r
1160         TRNN    IOS,UDSD        ;UNLESS IN NON-STD\r
1161         ANDM    TAC1,BUF\r
1162         MOVEI   TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
1163         ADD     TAC,[XWD BUF,1];FROM BUF TO THERE\r
1164         MOVEI   TAC1,177(TAC)\r
1165         BLT     TAC,(TAC1)      ;TRANSFER IT\r
1166         HLRZ    BLK,BUF         ;NEXT BLOCK TO READ\r
1167         TRNE    IOS,UDSD        ;IF NON-STD\r
1168         AOSA    BLK,IBLK(DEVDAT);READ SEQUENTIAL BLOCKS\r
1169         HRRM    BLK,IBLK(DEVDAT) ;DAVE IN DDB\r
1170         TRNE    IOS,IODTER+IODERR+IOIMPM\r
1171         JRST    THRUIN\r
1172         PUSHJ   PDP,ADVBUFF     ;GET NEXT BUFFER\r
1173         JRST    THRUIN          ;EMPTY BUF NOT AVAILABLE\r
1174 \r
1175         SKIPLE  DISCON          ;TAPE TIMED OUT?\r
1176         JRST    BACKB           ;YES. GO RECONNECT\r
1177         SKIPE   BLK             ;EXIT  IF EOF OR BLOCK TOO LARGE\r
1178         CAILE   BLK,TOPBLK      ;THE ERROR WILL BE CAUGHT ON THE\r
1179         JRST    THRUIN          ;UUO LEVEL NEXT TIME AROUND\r
1180         SOSGE   QUANTM          ;HAS TAPE HAD CHAN LONG ENOUGH?\r
1181         SKIPG   DTREQ           ;YES. ANYONE ELSE WANT IT?\r
1182         JRST    READBC          ;NO. READ NEXT BLOCK\r
1183 \r
1184 THRUIN: HRRZ    TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN?\r
1185         JUMPN   TAC,THRUTP      ;YES. DONT CHANGE REVERSE BIT\r
1186         TLZ     IOS,RVERSE      ;NO. SET IOS BIT TO CORRECT DIRECTION\r
1187         CONSZ   DTC,100000\r
1188         TLO     IOS,RVERSE\r
1189 \f;HERE WHEN TAPE IS DONE\r
1190 THRUTP: SKIPLE  TAC,DISCON      ;TAPE TIMED OUT?\r
1191         JRST    BACKB           ;YES\r
1192         CONO    DTC,400000      ;STOP TAPE\r
1193 THRUTD: SOSL    DTREQ           ;BUMP COUNT DOWN\r
1194         SETOM   DTAVAL          ;TELL SCHEDULER\r
1195 THRUTA: CONO    DTC,10000       ;DESELECT CONTROL\r
1196         TLZ     IOS,DMPMOD+NOBUF+DMPCLS+PEWBIT+RUNBIT\r
1197         SETZM   USEWRD          ;INDICATE CONTROL NOW FREE\r
1198         JRST    CLRACT          ;RESET IOACT AND RETURN\r
1199 \r
1200 ;COME HERE IF A TAPE IS HUNG\r
1201 HUNGTP: JUMPGE  IOS,THRUTP      ;GIVE UP CONTROL IF NOT DEAD-RECKONING\r
1202         JRST    CPOPJ1          ;IGNORE IT IF DEAD RECKONING -\r
1203 ;WHEN THE TAPE TIMES OUT FNDBLK WILL RESET THE HUNG TIME, AND\r
1204 ;IF IT IS STILL HUNG AT ITS END THE ERROR MESSAGE WILL OCCUR\r
1205 \r
1206         INTERN  FTSWAP\r
1207         EXTERN  SHFWAT\r
1208 ;HERE ON END OF BLOCK WHEN THE JOB IS STILL SWAPPED OUT\r
1209 ;CONTROL GETS HERE IF SWP OR SHF IS ON IN JBTSTS\r
1210 ;IO THE JOB IS CURRENTLY SWAPPED OR SHUFFLED WE MUST DELAY\r
1211 ;SO TEST JOB NO AGAINST SHFWAT (IF SHUFFLE) OR FORCE (IF SWAP) TO DETERMINE\r
1212 ;IF JOB IS REALLY IN THAT STATE, OR IF MONITOR HAS LIT THE BIT\r
1213 ;IN ANTICIPATION OF PUTTING THE JOB IN THAT STATE\r
1214 SWPDLY:\r
1215 \r
1216         IFN FTSWAP, <\r
1217         EXTERN  FORCE\r
1218         TLNE    TAC1,SWP        ;SWAPPED JOB?\r
1219         SKIPA   TAC,FORCE       ;YES.\r
1220 >\r
1221         MOVE    TAC,SHFWAT      ;NO. SHUFFLED?\r
1222         CAMN    ITEM,TAC        ;JOB REALLY SWAPPED OR SHUFFLED?\r
1223         JRST    DTAIN1          ;NO, FINISH THIS DATA OPERATION\r
1224         CONO    DTC,400000      ;YES, STOP TAPE (WE MUST DELAY)\r
1225         TLO     IOS,IOFST       ;INDICATE JOB WAS DELAYED (FOR FAKINT)\r
1226         MOVE    TAC,[XWD FAKINT,1] ;IF JOB IS CURRENTLY BEING SHUFFLED\r
1227         TLNN    TAC,SWP         ;COME BACK ON NEXT CLOCK INTERRUPT, AT WHICH TIME\r
1228         JSR     CLKREQ          ;THE BLT MUST HAVE FINISHED\r
1229         JRST    STOIOS          ;AND GO AWAY\r
1230 \f;HERE ON END OF OUTPUT BLOCK\r
1231 OUTHRU: PUSHJ   PDP,ADVBFE      ;GET NEXT BUFFER\r
1232         JRST    THRUTP          ;NOT FULL\r
1233         SKIPLE  DISCON\r
1234         JRST    BACKB\r
1235         HRRZ    BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
1236         CAILE   BLK,TOPBLK      ;LEGAL?\r
1237         JRST    THRUTP          ;NO. CATCH ERROR ON UUO LEVEL\r
1238         SOSGE   QUANTM          ;YES. HAD CHAN LONG ENOUGH?\r
1239         SKIPG   DTREQ           ;AND SOMEONE ELSE WANT IT?\r
1240         JRST    FILBUF          ;NO. GO WRITE NEXT BLOCK\r
1241         JRST    THRUTP          ;YES. GIVE UP TAPE\r
1242 \r
1243 ;TURN TAPE AROUND AFTER END-ZONE INTERRUPT\r
1244 TURN:   CONSZ   DTC,500         ;READ BLOCK NUMBERS?\r
1245         JRST    DIREOF          ;NO. END ZONE WHILE READING DATA\r
1246         CONO    DTC,DTTURN      ;YES. TURN AROUND\r
1247         JEN     @DTACHL         ;DISMISS INTERRUPT\r
1248 \r
1249 ;COME HERE ON AN END ZONE INTERRUPT WHILE READING DATA\r
1250 ;THIS CAN ONLY HAPPEN IN MODE 116,117\r
1251 ;LIGHT IODEND (IT IS A PREMATURE EOF) AND LEAVE\r
1252 DIREOF: JSR     DTASAV          ;SAVE ACS\r
1253         MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
1254         MOVE    IOS,DEVIOS(DEVDAT)      ;AND IOS\r
1255         JRST    DMPEOF          ;LIGHT IODEND AND RETURN\r
1256 \f;COME HERE ON END OF DUMP MODE BLOCK\r
1257 SVDMTH: SKIPLE  DISCON          ;HAS A TAPE TIMED OUT\r
1258         CONO    DTS,2           ;YES. STOP IT\r
1259         IFN CPBIT, <\r
1260         TLNE    IOS,NOBUF       ;DIRECTLY TO USER?\r
1261         JRST    USDMTH          ;YES. ALMOST THROUGH\r
1262 >\r
1263         MOVSI   TAC1,-177\r
1264         IFE     CPBIT, <\r
1265         TRNE    IOS,UDSD\r
1266         SUB     TAC1,ONEONE     ;SET UP TAC1 WITH COUNT\r
1267 >\r
1268         TLNN    IOS,IO\r
1269         JRST    SVOMIN          ;INPUT FILE\r
1270         HRRZ    BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
1271         JUMPF   BLK,DMPTHA      ;LAST BLOCK\r
1272         IFE     CPBIT, <\r
1273         TRNE    IOS,UDSD        ;IF NON-STD MODE\r
1274         AOSA    OBLK(DEVDAT)    ;WRITE CONSECUTIVE BLOCKS\r
1275 >\r
1276         CAIG    BLK,TOPBLK      ;NOT LAST. LEGAL BLOCK NUMBER?\r
1277         POPJ    PDP,            ;YES. RETURN\r
1278 \r
1279         TRO     IOS,IOBKTL      ;BLOCK TOO LARGE\r
1280 DMPTHA: POP     PDP,TAC         ;REMOVE THE RETURN ADDRESS FROM\r
1281                                 ;CALL TO SVDMTH. SINCE\r
1282                                 ;NO MORE I/O WILL BE DONE\r
1283 DMPTH2: SETZM   SVDWRD(DEVDAT)  ;ZERO DUMP-MODE STUFF\r
1284         SETZM   DMPLST(DEVDAT)\r
1285 DMPTH3: TLZE    IOS,IOW         ;IS IO WAIT?\r
1286         PUSHJ   PDP,SETIOD      ;YES, RESTART JOB\r
1287         JRST    THRUTP\r
1288 \r
1289 ;HERE ON END SAVE MODE INPUT BLOCK\r
1290 SVDMIN: HLRZ    BLK,BUF         ;NEXT BLOCK NUMBER\r
1291         IFE     CPBIT, <\r
1292         TRNE    IOS,UDSD        ;NON-STANDARD?\r
1293         AOSA    BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
1294 >\r
1295         HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
1296         JRST    CPOPJ1\r
1297 \r
1298         IFN CPBIT, <\r
1299 ;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
1300 USDMTH: MOVEI   TAC1,IBLK(DEVDAT)\r
1301         TLNE    IOS,IO\r
1302         MOVEI   TAC1,OBLK(DEVDAT)       ;SET TAC1 TO RIGHT BLOCK NUMBER\r
1303         MOVE    TAC,BLKCNT      ;UPDATE BLOCK COUNTER\r
1304         ADDM    TAC,(TAC1)\r
1305         JRST    DMPTHA          ;THROUGH\r
1306 >\r
1307 \f;HERE WHEN THROUGH DUMP MODE BLOCK\r
1308 DMPTHR: PUSHJ   PDP,SVDMTH      ;END OF BLOCK HOUSEKEEPING\r
1309                                 ; RETURN ONLY IF MORE I/O\r
1310                                 ; WILL BE DONE\r
1311         JRST    DMPFLC          ;FILL BUFFER FOR NEXT OUTPUT\r
1312 \r
1313 ;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
1314 DMIFIL: SKIPE   TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
1315         JRST    DMIFLB          ;YES. CONTINUE\r
1316 DMIFLA: PUSHJ   PDP,NXTCOM      ;NO. GET NEXT COMMAND\r
1317         JRST    DMPTH2          ;END OF LIST - THROUGH\r
1318 DMIFLB: MOVE    TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
1319         MOVEM   TEM,(TAC)       ;GIVE TO USER\r
1320         AOBJP   TAC1,.+3        ;IF BUFFER IS FULL\r
1321         AOBJN   TAC,DMIFLB      ;GET NEXT WORD\r
1322         JRST    DMIFLA          ;GET NEXT COMMAND\r
1323 \r
1324         AOBJN   TAC,.+3         ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
1325         PUSHJ   PDP,NXTCOM      ;THAT COM, IS DONE. GET NEXT\r
1326 \r
1327         JRST    DMPTH2          ;END OF LIST - THROUGH\r
1328         MOVEM   TAC,SVDWRD(DEVDAT)  ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
1329         JUMPE   BLK,DMPEOF      ;IF EOF - LIGHT BIT\r
1330 RDNXT:  CAIG    BLK,TOPBLK      ;BLOCK LEGAL?\r
1331         JRST    READBC          ;GO READ BLOCK NUMBER\r
1332         TROA    IOS,IOBLKT      ;LIGHT ERROR BIT\r
1333 \r
1334 ;EOF BEFORE ALL DATA IS IN - DUMP MODE\r
1335 DMPEOF: TRO     IOS,IODEND      ;LIGHT EOF BIT\r
1336         JRST    DMPTH2          ;GIVE UP TAPE\r
1337 \fSVADER:        PUSHJ   PDP,DMPTH2      ;GIVE UP CONTROL\r
1338         JRST    ADRERR          ;TYPE ERROR MESSAGE\r
1339 ;COME HERE ON ERROR\r
1340 ERRS:   AOS     TAC,ERRCNT      ;BUMP COUNT\r
1341         IFN CPBIT, <\r
1342         TLNN    IOS,NOBUF       ;I/O DIRECT TO USER?\r
1343         JRST    ERRS1           ;NO\r
1344         MOVE    TAC1,SVPNTR     ;YES. RESET POINTERS\r
1345         MOVEM   TAC1,USPNTR\r
1346         MOVE    TAC1,(TAC1)     ;RESET PNTR\r
1347         ADD     TAC1,ADRPRG\r
1348         MOVEM   TAC1,PNTR\r
1349 >\r
1350 ERRS1:  CONSO   DTS,40000       ;IF ILLEGAL OP - DONT RETRY\r
1351         CAILE   TAC,DTTRY       ;ENOUGH REREADS?\r
1352         JRST    PERMET          ;YES. PERMANENT ERROR\r
1353         JRST    FNDBL2          ;NO. TRY AGAIN\r
1354 \r
1355 ;PERMANENT ERROR\r
1356 PERMER: SKIPL   BLOCK           ;IF BAD BLOCK # LIGHT IODTER\r
1357         CONSZ   DTS,400000      \r
1358         TRO     IOS,IODTER      ;PARITY\r
1359         CONSO   DTS,10000\r
1360         CONSZ   DTS,200000\r
1361 DERR:   TRO     IOS,IODERR      ;MISSED DATA\r
1362         CONSZ   DTS,40000\r
1363         TRO     IOS,IOIMPM      ;ILLEGAL OP\r
1364         TLNE    IOS,DMPMOD      ;DUMP MODE?\r
1365         JRST    DMPTHR          ;YES. NOT THROUGH YET\r
1366         TLNN    IOS,IO+RDDIR+SINGL\r
1367         JRST    DTAIN2\r
1368 REWDUN: TLZE    IOS,IOW\r
1369         PUSHJ   PDP,SETIOD      ;NO. TAKE OUT OF IO WAIT\r
1370         TLZN    IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
1371         JRST    THRUTP          ;NO. RETURN TO USER\r
1372         PUSHJ   PDP,THRUTP      ;YES. STOP TAPE\r
1373         MOVSI   TAC,DVDIRIN     ;CLEAR DIRECTORY IN CORE BIT\r
1374         ANDCAM  TAC,DEVMOND(DEVDAT)\r
1375 BDDIR:  LDB     ITEM,PJOBN      ;NUMBER OF OFFENDING JOB\r
1376         JRST    RADDIR          ;GO PRINT ERROR MESSAGE\r
1377 \f       INTERN  DTABUF\r
1378 BFPNTR: IOWD    200,BUF+1\r
1379 ONEONE: XWD     1,1\r
1380 USEWRD: 0\r
1381 USEPRG: 0\r
1382 ADRPRG: 0\r
1383 PNTR:   0\r
1384 TEMP:   0\r
1385 DISTNC: 0\r
1386 BLOCK:  0\r
1387 QUANTM: 0\r
1388 DISCON: 0\r
1389 ERRCNT: 0\r
1390 FNDTMP: 0\r
1391 IOWRIT: 0\r
1392 ALMSWT: 0\r
1393         IFN CPBIT, <\r
1394 BLKCNT: 0\r
1395 SVPNTR: 0\r
1396 \r
1397 USPNTR: 0\r
1398 DIRCNT: 0\r
1399 >\r
1400 ;THIS IS THE MONITOR BUFFER\r
1401 DTABUF:\r
1402 IFN ALMACT,<\r
1403         XWD     SWPBACK,0       ;RH WILL BE LINK TO NEXT MONITOR BUFFER\r
1404 >\r
1405 MONB2:  0\r
1406 BUF:    BLOCK   200\r
1407 DTAEND: END\r
1408 \f\r