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