Fixed typos in PDP6 dectape controller.
[retro-software/dec/tops10/v4.5.git] / src / dtcsrn.mac
1 TITLE   DTCSRN - NEW FORMAT DECTAPE SERVICE FOR 551 (PDP-6)\r
2 SUBTTL  DTA551 A.WACHS/TW/RCC 01 JUN 69  V012\r
3         XP      VDTASR,012      ;GLOBAL VERSION NUMBER FOR LOADER STORAGE MAP.\r
4 \r
5 \r
6         ENTRY   DTCSRN   ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD\r
7 DTCSRN:\r
8 EXTERNAL        TPOPJ,TPOPJ1,DTCCHL,DCOUT,DCIN,DCON,DCOFF\r
9 EXTERNAL        STOIOS,STOTAC,SETACT,CLRACT,OUT,DTCSAV,PIOMOD\r
10 EXTERNAL        DTAVAL,DTREQ,SETIOD,THSDAT,PUNIT,GETDCDT\r
11 EXTERNAL        ADVBFE,ADVBFF,ADRERR,WAIT1,CPOPJ,CPOPJ1,BADDIR\r
12 EXTERNAL        COMCHK,PJOBN,RELEA9,UADCK1,DTTRY\r
13 EXTERNAL        JBTADR,DCLOC,DCLOC1,DTCCHN,DCREQ,DCAVAL\r
14 \r
15 \r
16 BLK=4\r
17 \r
18 \r
19 DIRBLK=^D100    ;NUMBER OF BLOCK FOR DIRECTORY\r
20 \r
21 TOPBLK=1101     ;HIGHEST LEGAL BLOCK NUMBER\r
22 NAMSTR=^D83     ;1ST NAME WORD IN DIRECTORY\r
23 QUANT=5         ;NUMBER OF BLOCKS CAN READ BEORE GIVING UP DTC\r
24 SPACE=6         ;NUMBER OF BLOCKS SEPERATING CONTIGUOUS BLKS OF A FILE\r
25 \r
26 \r
27 ;DDB MAGIC CELLS\r
28 FSTBLK=13\r
29 DLOC=14\r
30 IBLK=15\r
31 OBLK=16\r
32 DISPAD=17\r
33 DMPLST=20\r
34 SVDWRD=21\r
35 \f;FLAGS IN RH OF IOS\r
36 UDSD=100\r
37 \r
38 \r
39 ;FLAGS IN LH OF IOS\r
40 NOLINK=200\r
41 CHNGDR=400\r
42 RVERSE=1000\r
43 SINGL=2000              ;JUST READ OR WRITE 1 BLOCK\r
44 DMPMOD=4000\r
45 RWDIR=10000\r
46 DMPCLS=20000\r
47 NOBUF=40000             ;DATA GOING DIRECTLY INTO USER AREA\r
48 NOBUFC=737777           ;-NOBUF\r
49 \r
50 CPBIT=-1                ;CONDITIONAL ASSEMBLY PARAMETER FOR I/O DIRECTLY\r
51                         ;TO USER.  IF -1 THE I/O IN DUMP MODE WITH\r
52                         ;BIT 29 ON IN INIT WILL DO IO DIRECTLY TO USER\r
53                         ;WITHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES\r
54 \r
55 \f       INTERN  DTCINT,DTCDDB,DTCINI,DTCDDS\r
56 \r
57 DTCDDB: SIXBIT  /DTA0/\r
58         XWD     ^D60*HUNGST,200\r
59         0\r
60         EXP     DTCDSP\r
61         XWD     1107,154403\r
62         EXP     0,0\r
63         XWD     PROG,0\r
64         XWD     PROG,0\r
65         EXP     0,0,0\r
66         EXP     DTCDIR\r
67         EXP     0,0,0,0,0\r
68 DTCDIR: BLOCK   200\r
69 DTCDDS=.-DTCDDB\r
70 \r
71 \r
72         JRST    DTCINI\r
73         JRST    THRUTP          ;HUNG DEVICE\r
74 DTCDSP: JRST    UREL\r
75         JRST    UCLS\r
76         JRST    UOUT\r
77         JRST    UIN\r
78         JRST    ENTR\r
79         JRST    LOOK\r
80         JRST    DMPO\r
81         JRST    DMPI\r
82         JRST    SETO\r
83         JRST    SETI\r
84         JRST    GETF\r
85         JRST    RENAM\r
86         POPJ    PDP,            ;CLOSE INPUT\r
87         JRST    UTPCLR\r
88         POPJ    PDP,            ;MTAPE\r
89 \r
90 \r
91 ;INITIALIZE DTC\r
92 DTCINI: CONO    DTC,0\r
93         CONO    DC,0\r
94         HLLZS   DTCINT  ;CLEAR CONSO\r
95         POPJ    PDP,\r
96 \f       EXTERN  JOBSAV\r
97 ;LOOKUP A DIRECTORY ENTRY\r
98 LOOK:   TRNE    IOS,UDSD        ;NON-STANDARD?\r
99         JRST    CPOPJ1          ;YES. LOOKUP OK\r
100         PUSHJ   PDP,DSERCH      ;NO. FIND DIRECTORY ENTRY\r
101         POPJ    PDP,            ;NOT THERE\r
102         HRRZ    TAC1,26(TAC)    ;GET DATE, NO. OF 1K BLOCKS NEEDED\r
103         AOS     UUO             ;POINT UUO TO WORD 3\r
104         MOVEM   TAC1,@UUO       ;INTO USER'S LOOKUP BLOCK\r
105 LOOKA:  HLRE    TAC,TAC         ;GET INDEX\r
106         ADDI    TAC,27\r
107         SKIPN   FSTBLK(DEVDAT)  ;TAPE BEING WRITTEN?\r
108         HRLM    TAC,OBLK(DEVDAT) ;NO. SAVE INDEX FOR POSSIUBLE OUTPUT\r
109         HRRM    TAC,AC1         ;SAVE INDEX IN CASE LH(IBLK) IS\r
110                         ;CHANGED BY DEAD-RECKONING\r
111         MOVEI   TAC1,0\r
112         PUSHJ   PDP,BLKSRC      ;COUNT NUMBER OF BLOCKS IN FILE\r
113         AOJA    UUO,STOWD4      ;LAST BLOCK DONE\r
114         AOS     TAC1            ;COUNT THE BLOCK\r
115         SOS     1(PDP)          ;ADJUST FOR CORRECT RETURN\r
116         AOBJN   PDP,BLKSRB      ;LOOK FOR NEXT BLOCK\r
117 \r
118 ;TAC1 HAS THE NUMBER OF BLOCKS BELONGING TO THE FILE\r
119 STOWD4: IMUL    TAC1,[-177]     ;-NUMBER OF WORDS IF ALL BLOCKS FULL\r
120         HRLZM   TAC1,@UUO       ;STORE IN DIRECOTRY WD 4\r
121         SUBI    UUO,2           ;POINT UUO TO DIRECORY WD 2\r
122         TLZ     IOS,IO          ;MAKE SURE IO IS OFF\r
123         TLO     IOS,SINGL       ;JUST READ 1 RECORD\r
124         MOVEI   BLK,DIRBLK      ;NO, FIND FIRST MENTION OF BLOCK\r
125         PUSHJ   PDP,LSTFRE+1    ;NEAR DIRECTORY\r
126         JUMPN   BLK,.+3         ;FOUND IF BLK NOT =0\r
127 LOOKD:  PUSHJ   PDP,BLKSRC      ;FIND FIRST MENTION IN DIRECTORY\r
128         JRST    BDDIR           ;NOT THERE - ERROR\r
129         PUSHJ   PDP,READBF      ;GO READ IT\r
130         PUSHJ   PDP,WAIT1       ;WAIT TILL IT'S IN\r
131         HRLM    AC1,IBLK(DEVDAT) ;SAVE INDEX ON INPUT FILE FOR LATER\r
132                         ;TEST ON ENTER - WONT ALLOW ENTER\r
133                         ;TO BE DONE ON LOOKED-UP FILE\r
134         HRRZ    BLK,IBLK(DEVDAT) ;GET FIRST BLOCK OF FILE\r
135 LOOKC:  SKIPN   FSTBLK(DEVDAT)  ;IF FILE HAS NOT BEEN ENTERED\r
136         MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE IN DDB\r
137         HRRM    BLK,@UUO        ;SAVE IN USER'S AREA\r
138         HLL     TAC,@UUO        ;GET USER'S EXTENSION\r
139         HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE IN DEVCE DATA BLOCK FOR RENAME AND\r
140                                 ; AND SUPERSEDING SHARED SEGMENTS\r
141         JRST    CPOPJ1          ;AND TAKE GOOD EXIT\r
142 \fRENAM: PUSH    PDP,UUO         ;SAVE LOC OF NEW NAME\r
143         MOVEI   UUO,DEVFIL(DEVDAT) ;SEARCH FOR OLD NAME\r
144         PUSHJ   PDP,DSER1\r
145         JRST    RENER1          ;NOT FOUND - ERROR\r
146         POP     PDP,UUO         ;FOUND, RESTORE UUO\r
147         SKIPE   @UUO            ;RENAMING TO ZERO?\r
148         JRST    RENAM2          ;NO. GO TO REAL RENAME\r
149         SETZM   (TAC)           ;YES. DELETE NAME IN DIR\r
150         SETZM   26(TAC)         ;DELETE EXTENSION\r
151         SETZM   DEVFIL(DEVDAT)  ;ZERO DEVFIL\r
152         HLRE    TAC,TAC         ;GET INDEX OF FILE\r
153         ADDI    TAC,27\r
154         PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS OF FILE\r
155 RENAM1: TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
156         AOS     (PDP)           ;SET FOR GOOD RETURN\r
157         JRST    STOIOS          ;GO TO USER\r
158 \r
159 ;COME HERE TO RENAME TO A REAL NEW NAME\r
160 RENAM2: MOVE    DAT,TAC          ;SAVE LOC OF NAME IN DIRECTORY\r
161         PUSHJ   PDP,DSERCH      ;SEARCH FOR NEW NAME\r
162         SKIPA           ;NOT FOUND - GOOD\r
163         JRST    RENER2          ;NAME ALREADY EXISTS - ERROR\r
164         MOVE    TAC,@UUO        ;GET NEW NAME\r
165         MOVEM   TAC,(DAT)       ;SAVE IN DIR\r
166         AOS     UUO\r
167         MOVE    TAC,@UUO        ;EXTENSION\r
168         HLLM    TAC,26(DAT)     ;SAVE IN DIR\r
169         HLLM    TAC,DEVEXT(DEVDAT) ;SAVE INN DDB\r
170         JRST    RENAM1          ;GIVE GOOD RETURN TO USER\r
171 \r
172 RENER1: POP     PDP,UUO\r
173         TDZA    TAC,TAC         ;RH E+1 =0\r
174 RENER2: MOVEI   TAC,4           ;RH E+1 =4\r
175         AOS     UUO             ;POINT TO 2ND WORD\r
176         HRRM    TAC,@UUO        ;SET ERRORR CODE\r
177         POPJ    PDP,            ;AND TAKE ERROR RETURN\r
178 \f;SEARCH DIRECTORY FOR A MATCH\r
179 DSERCH: MOVEI   AC1,3(UUO)      ;CHECK VALIDITY OF ADDRESS\r
180         PUSHJ   PDP,UADCK1      ;NEVER RETURN IF ADDR. OUT OF BOUNDS\r
181 DSER1:  PUSHJ   PDP,DIRCHK      ;ENSURE DIRECTORY IS IN CORE\r
182         HRRZ    TAC,DLOC(DEVDAT) ;LOCAION OF DIRECTORY\r
183         ADD     TAC,[XWD -26,NAMSTR] ;POINT TO START OF NAMES\r
184 NMLOOK: SKIPN   TAC1,@UUO       ;GET NAME\r
185         JRST    TPOPJ           ;NULL ARGUMENT - ERROR RETURN\r
186         MOVEM   TAC1,DEVFIL(DEVDAT)     ;STORE FOR RENAME AND SUPERSEDING\r
187                                 ; SHARED SEGMENTS\r
188         CAMN    TAC1,(TAC)      ;TEST FOR MATCH\r
189         AOJA    UUO,NMFOUN      ;FOUND NAME, CHECK EXTENSION\r
190         AOBJN   TAC,.-2         ;TRY NEXT NAME\r
191         POPJ    PDP,            ;NOT FOUND\r
192 NMFOUN: HLLZ    TAC1,@UUO       ;PICK UP USER'S EXTENSION\r
193         XOR     TAC1,26(TAC)    ;TEST AGAINST DIRECTORY EXTENSION\r
194         TLNN    TAC1,-1         ;MATCH?\r
195         JRST    CPOPJ1          ;YES. RETURN\r
196         AOBJP   TAC,.+2\r
197         SOJA    UUO,NMLOOK      ;NO. TRY NEXT NAME\r
198         SOJA    UUO,CPOPJ       ;NAME NOT FOUND\r
199 \r
200 ;CHECK IF DIRECTORY IS IN CORE, IF NOT, READ IT\r
201 DIRCHK: TRNN    IOS,UDSD        ;DONT BOTHER IF NON-STANDARD\r
202         SKIPG   DEVMOD(DEVDAT)  ;IS IT IN?\r
203         POPJ    PDP,            ;YES. RETURN\r
204         MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
205         TLZ     IOS,IO\r
206         PUSHJ   PDP,GETDT       ;GET CONTROL\r
207         TLO     IOS,RWDIR       ;JUST READ 1 BLOCK\r
208         PUSHJ   PDP,READBC      ;GO READ IT\r
209         PUSHJ   PDP,WAIT1       ;WAIT TILL IN\r
210         MOVSI   TAC1,DVDIRI     ;SET DIRECTORY-IN-CORE BIT\r
211         ORM     TAC1,DEVMOD(DEVDAT)\r
212         POPJ    PDP,\r
213 \f;SEARCH DIRECTORY FOR FILE WHOSE INDEX IS IN TAC\r
214 BLKSRC: MOVSI   DAT,440500      ;DAT IS A BLOCK POINTER\r
215         HRR     DAT,DLOC(DEVDAT)\r
216         MOVEI   BLK,1           ;START AT BLOCK 1\r
217 \r
218 BLKSRA: ILDB    TEM,DAT         ;INDEX OF NEXT BLOCK\r
219         CAMN    TAC,TEM         ;MATCH?\r
220         JRST    CPOPJ1          ;YES. RETURN\r
221 \r
222 BLKSRB: CAIGE   BLK,TOPBLK      ;NO. SEARCHED LAST?\r
223         AOJA    BLK,BLKSRA      ;NO. TRY NEXT BLOCK\r
224         POPJ    PDP,            ;YES. RETURN\r
225 \r
226 ;SET UP POINTER TO DIRECTORY FOR BLOCK IN BLK\r
227 SETPTR: PUSH    PDP,BLK         ;SAVE BLK\r
228         PUSHJ   PDP,DRPTR       ;SET BLK AS A BYTE POINTER\r
229         MOVE    DAT,BLK         ;RETURN IT IN DAT\r
230         POP     PDP,BLK         ;RESTORE BLK\r
231         POPJ    PDP,            ;AND RETURN\r
232 \r
233 ;GET NEXT AVAILABLE FREE BLOCK\r
234 NXTFRE: PUSH    PDP,TEM \r
235         PUSHJ   PDP,SETPTR      ;SET DAT TO A BYTE POINTER\r
236         MOVEI   TAC,0           ;LOOK FOR FREE BLOCKS\r
237         PUSHJ   PDP,BLKSRA      ;FIND A ZERO BLOCK\r
238         MOVEI   BLK,0           ;NOT THERE- RETURN 0\r
239 FREXIT: POP     PDP,TEM\r
240         POPJ    PDP,\r
241 \r
242 ;GET PREVIOUS FREE BLOCK\r
243 LSTFRE: MOVEI   TAC,0\r
244         PUSH    PDP,TEM\r
245         ADDI    BLK,2\r
246         PUSHJ   PDP,SETPTR      ;SET DAT AS A POINTER\r
247         SUBI    BLK,2\r
248         PUSHJ   PDP,DECPTR      ;DECREMENT BYTE POINTER\r
249         LDB     TEM,DAT         ;INDEX TO BLOCK\r
250         CAMN    TEM,TAC         ;FOUND?\r
251         JRST    FREXIT          ;YES. RETURN\r
252         SOJG    BLK,.-4         ;TRY AGAIN IF NOT AT START\r
253         JRST    FREXIT          ;REACHED START - RETURN BLK=0\r
254 \r
255 ;DECREMENT BYTE POINTER\r
256 DECPTR: JUMPL   DAT,.+5\r
257         ADD     DAT,[BYTE (6) 5] ;DECREMENT\r
258         JUMPG   DAT,CPOPJ       ;IF POSITIVE - SAME WORD\r
259         HRLI    DAT,010500      ;RESET TO PREVIOS WORD\r
260         SOJA    DAT,CPOPJ\r
261         HRLI    DAT,060500\r
262         SOJA    DAT,CPOPJ\r
263 \f;COME HERE TO DELETE THE FILE WHOSE INDEX IS INN TAC\r
264 DLETE:  MOVEI   TAC1,0          ;SET TO DELETE BLOCKS\r
265         PUSHJ   PDP,BLKSRC      ;FIND A BLOCK BELONGING TO FILE\r
266         JRST    CPOPJ   ;ALL THROUGH\r
267         DPB     TAC1,DAT        ;DELETE IT\r
268         SOS     1(PDP)          ;ADJUST PDL FOR RETURN\r
269         AOBJN   PDP,BLKSRB      ;AND FIND NEXT MATCH\r
270 \r
271 \r
272 ;ENTER A FILE NAME IN DIRECTORY\r
273 ENTR:   TRNE    IOS,UDSD        ;NON STANDARD?\r
274         JRST    CPOPJ1          ;YES. RETURN\r
275         PUSHJ   PDP,DSERCH      ;NO. LOOK FOR MATCH\r
276         JRST    NEWENT          ;THIS IS A NEW ENTRY\r
277 ENTR2:  MOVE    TAC1,@UUO       ;PICK UP 2ND WORD (EXTENSSION)\r
278         AOS     UUO             ;POINT TO WORD 3\r
279         HRR     TAC1,@UUO       ;ADD DATE\r
280         TRNN    TAC1,7777       ;IS DATE ALREADY THERE?\r
281         IOR     TAC1,THSDAT     ;NO, ADD CURRENT DATE\r
282         MOVEM   TAC1,26(TAC)    ;INTO DIRECTORY\r
283         SKIPGE  AC3,OBLK(DEVDAT) ;IS THIS A SAVE FILE (UGETF DONE\r
284                                 ;BEFORE THE ENTER?)\r
285         AOJA    UUO,SETWD4      ;YES. STORE LENGTH IN DIRECTORY\r
286 ENTRA:  SUBI    UUO,2           ;NO. POINT TO NAME\r
287         MOVE    TAC1,@UUO       ;PICK IT UP\r
288         MOVEM   TAC1,(TAC)      ;INTO DIRECTORY\r
289         HLRE    TAC,TAC         ;COMPUTE INDEX OF FILE\r
290         ADDI    TAC,27\r
291         HLRZ    DAT,IBLK(DEVDAT) ;INDEX OF INPUT FILE\r
292         SUB     DAT,TAC         ;WRITE SAME FILE AS READING?\r
293         JUMPE   DAT,CPOPJ       ;TAKE ERROR RETURN IF YES\r
294         HRLM    TAC,OBLK(DEVDAT) ;SAVE INDEX IN DDB\r
295 \r
296         PUSHJ   PDP,DLETE       ;DELETE ALL BLOCKS BELONGING TO FILE\r
297         AOJE    AC3,ENTRD       ;FIND FIRST FREE BLOCK ON TAPE IF THIS\r
298                                 ;IS A SAVE FILE (UGETF DONE)\r
299         MOVEI   BLK,DIRBLK      ;NO. GET 1ST BLOCK CLOSE TO\r
300         TLO     IOS,RVERSE      ;DIRECTORY. GOING IN REVERSE\r
301         PUSHJ   PDP,USLSTA\r
302         CAILE   BLK,TOPBLK      ;BLOCK LEGAL?\r
303         POPJ    PDP,            ;NO. ERROR RETURN\r
304 ENTRC:  MOVEM   BLK,FSTBLK(DEVDAT) ;SAVE AS 1ST BLOCK\r
305         HRRM    BLK,OBLK(DEVDAT)        ;SAVE IN DDB\r
306         AOS     UUO             ;POINT UUO TO WORD 2\r
307         HRRM    BLK,@UUO        ;SAVE 1ST BLOCK IN USER'S AREA\r
308         HLL     TAC,@UUO        ;GET EXTENSION\r
309         HLLM    TAC,DEVEXT(DEVDAT)      ;SAVE EXTENSION IN DDB ALSO\r
310         TLO     IOS,NOLINK\r
311         AOS     (PDP)\r
312 \f;MARK DIRECTORY ENTRY POINTED TO BY BLK AS TAKEN\r
313 MARKDR: PUSHJ   PDP,DRPTR       ;SET POINTER TO BLOCK IN DIR\r
314         HLRZ    TAC,OBLK(DEVDAT) ;PICK UP INDEX\r
315         IDPB    TAC,BLK         ;MARK DIRECTORY\r
316         TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
317         JRST    STOIOS\r
318 \r
319 ;;SET POINTER TO CORRECT DIRECTORY ENTRY\r
320 DRPTR:  SUBI    BLK,1           ;SET FOR ILDB OR IDPB\r
321         IDIVI   BLK,7           ;COMPUTE WORD, POSITION\r
322         ADD     BLK,DLOC(DEVDAT) ;GET CORRECT ADDRESS\r
323         HRLI    BLK,440500      ;MAKE IT A BYTE POINTER\r
324         JUMPE   DAT,CPOPJ       ;CORRECT FOR POSITION IN WORD\r
325         IBP     BLK\r
326         SOJG    DAT,.-1\r
327         POPJ    PDP,\r
328 \r
329 ;HERE FOR NEW FILE NAME ON ENTER\r
330 NEWENT: SUB     TAC,[XWD 26,26];START AT BEGINNING OF DIRECT.\r
331         SKIPN   (TAC)           ;FIND A FREE SLOT\r
332         AOJA    UUO,ENTR2       ;RETURN WITH UUO POINTING TO WRD 2\r
333         AOBJN   TAC,.-2\r
334         POPJ    PDP,            ;NONE AVAILABLE.\r
335 \r
336 \r
337 ;SET UP LENGTH OF FILE IN DIRECTORY FOR A SAVE FILE\r
338 SETWD4: HLRE    TAC1,@UUO       ;GET -LENGTH\r
339         MOVNS   TAC1            ;+LENGTH\r
340         HRRE    TEM,@UUO\r
341         ADD     TAC1,TEM        ; +START ADDRESS\r
342         TRZ     TAC1,1777       ;STORE N-1, WHERE N IS NO OF K\r
343         LSH     TAC1,2\r
344         ORM     TAC1,26(TAC)    ;INTO 2ND WRD OF DIRECTORY\r
345         SOJA    UUO,ENTRA       ;CONTINUE WITH ENTER\r
346 \r
347 ENTRD:  MOVEI   TAC,0           ;GET THE 1ST FREE BLOCK ON TAPE\r
348         PUSHJ   PDP,BLKSRC      ;AS THE 1ST LOGICAL BLOCK OF THE FILE\r
349         POPJ    PDP,            ;NONE AVAILABLE\r
350         JRST    ENTRC           ;CONTINUE WITH ENTER\r
351 \f;USETI -  SET NEXT INPUT BLOCK TO READ\r
352 SETI:   TDZ     IOS,[XWD IOEND,IODEND]\r
353         SKIPA   DAT,DEVDAT\r
354 \r
355 ;USETO  -  SET NEXT OUTPUT BLOCK TO READ\r
356 SETO:   MOVEI   DAT,1(DEVDAT)\r
357         PUSHJ   PDP,WAIT1       ;WAIT FOR BUFFERES TO FILL (OR EMPTY)\r
358         HRRM    UUO,IBLK(DAT)  ;SET BLOCK NUMBER\r
359         JRST    STOIOS          ;STOE IOS, POPJ\r
360 \r
361 ;UGETF  -  GET NEXT FREE BLOCK FOR THIS FILE\r
362 GETF:   PUSHJ   PDP,WAIT1       ;WAIT TILL BUFFERES EMPTY\r
363         PUSHJ   PDP,DIRCHK      ;ENSURE DIR, IN CORE\r
364         PUSHJ   PDP,USRFRE      ;GET NEXT AVAILABLE BLOCK\r
365         SKIPN   OBLK(DEVDAT)    ;HAS AN ENTER OR LOOKUP BEEN DONE?\r
366         SETOB   BLK,OBLK(DEVDAT) ;NO, SET SWITCH SO THAT THE NEXT ENTER\r
367                                 ;WILL FINE FIRST FREE BLOCK ON TAPE\r
368         MOVE    TAC,BLK         ;TELL USER THE BLOCK NUMBER\r
369         JRST    STOTAC\r
370 \r
371 \r
372 ;GET NEXT (OR PREVIOUS) FREE BLOCK\r
373 USRFRE: MOVEI   TEM,SPACE       ;BLOCKS "SPACE" APART\r
374         LDB     BLK,PIOMOD      ;EXCEPT DUMP AND SAVMOD FILES\r
375         CAIL    BLK,SD          ;OR ONE OF DUMP MODES?\r
376         MOVEI   TEM,2\r
377         MOVEI   TEM,2           ;YES, WHICH ARE CLOSRER\r
378 USRFRA: HRRZ    BLK,OBLK(DEVDAT)        ;CURRENT BLOCK\r
379         TLNE    IOS,RVERSE      ;FORWARD?\r
380         JRST    USRLST          ;NO\r
381         ADDI    BLK,(TEM)       ;YES, FIND NEXT BLOCK AT LEAST N\r
382         CAILE   BLK,TOPBLK\r
383         TDZA    BLK,BLK\r
384 CALNXT: PUSHJ   PDP,NXTFRE       ;BLOCKS PAST THIS ONE\r
385         JUMPN   BLK,STOIOS      ;RETURN IF FOUND\r
386         TLOE    TEM,1           ;FOUND NONE ON THIS PASS\r
387         JRST    NOBLKS          ;TAPE IS FULL\r
388         TLC     IOS,RVERSE      ;REVERSE DIRECTION\r
389         HRRI    TEM,1           ;START LOOKING AT NEXT BLOCK IN OTHER DIRECTION\r
390         JRST    USRFRA\r
391 USRLST: SUBI    BLK,(TEM)       ;LOOK FOR FREE BLOCK N BEFORE\r
392         SKIPG   BLK\r
393         TDZA    BLK,BLK         ;REVERSE IF AT FRONT OF TAPE\r
394 USLSTA: PUSHJ   PDP,LSTFRE      ;THIS ONE\r
395         JRST    CALNXT+1\r
396 \r
397 \r
398 ;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER\r
399 NOBLKS: MOVEI   BLK,TOPBLK+1    ;SET HIGH BLOCK\r
400         POPJ    PDP,\r
401 \f;UTPCLR UUO\r
402 UTPCLR: TRNE    IOS,UDSD\r
403         POPJ    PDP,            ;FORGET IT FOR NON-STANDARD\r
404         MOVSI   TAC,400000      ;SET DIRECTORY-IN-CORE BIT\r
405         ORM     TAC,DEVMOD(DEVDAT)\r
406         TLO     IOS,CHNGDR      ;DIRECTORY HAS CHANGED\r
407         HRRZ    TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
408         HRL     TAC1,TAC\r
409         HRRI    TAC1,1(TAC)     ;BLT POINTER\r
410         SETZM   (TAC)\r
411         BLT     TAC1,176(TAC)   ;LEAVE LAST WORD IN DIR, ALONE\r
412         MOVSI   TAC1,17000      ;MARK DIRECTORY AS UNAVAILABLE\r
413         MOVEM   TAC1,16(TAC)\r
414         MOVSI   TAC1,757000     ;RESERVE BLOCKS 1 AND 2\r
415         MOVEM   TAC1,(TAC)      ;FOR READ IN MODE LOADER\r
416         MOVSI   TAC1,777770     ;MARK BLOCKS 1102-1105 AS\r
417         ORCAM   TAC1,NAMSTR-1(TAC)  ;UNAVAILABLE ALSO\r
418         JRST    STOIOS\r
419 \f;CLOSE UUO\r
420 UCLS:   TLZE    IOS,NOLINK      ;IS LAST BLOCK NOT LINKED?\r
421         TRNE    IOS,UDSD        ;AND NOT NON-STD?\r
422         JRST    STOIOS          ;YES, RETURN\r
423         LDB     TAC,PIOMOD      ;NO. WRITE LAST BLOCK\r
424         CAIL    TAC,16          ;DUMPO MODE?\r
425         JRST    CLSDMP          ;YES. CLOSE DUMP MODE\r
426         MOVEI   TAC,@DEVOAD(DEVDAT) ;LOC OF BUFFER\r
427         MOVE    TAC1,1(TAC)     ;LINK WORD\r
428         TLON    TAC1,-1         ;LINK=-1 IF NOT SPECIFIED\r
429         MOVEM   TAC1,1(TAC)     ;LINK = -1... EOF\r
430         MOVEM   IOS,DEVIOS(DEVDAT)  ;SAVE IOS\r
431         JRST    OUT             ;GO TO WRITE RECORD\r
432 \r
433 \r
434 ;RELEASE UUO\r
435 UREL:   SETZM   FSTBLK(DEVDAT)  ;ZERO FSTBLK\r
436         PUSHJ   PDP,NXTCM2      ;CLEAR OUT DUMP-MODE STUFF\r
437         TRZ     IOS,UDSD        ;CLEAR NON-STD BIT.\r
438         SKIPG   DEVMOD(DEVDAT)  ;IF DIRECTORY HAS BEEN\r
439         TLZN    IOS,CHNGDR      ;MODIFIED IT MUST BE WRITTEN\r
440         POPJ    PDP,            ;NOT TOUCHED\r
441         TLO     IOS,RWDIR+IO    ;GOING TO WRITE IT\r
442         PUSHJ   PDP,GETDT       ;WAIT TILL DTC AVAILABLE\r
443         MOVEI   BLK,DIRBLK      ;BLOCK NUMBER\r
444         PUSHJ   PDP,WRTBLK      ;WRITE UT\r
445         JRST    WAIT1           ;DONT RETURN TO USER TILL DONE\r
446 \r
447 \r
448 ;GET DEC TAPE CONTROLLER\r
449 GETDT:  PUSHJ   PDP,GETDCDT     ;GET DATA CONTROL. DECTAPE CONTROL\r
450         AOSE    DTREQ           ;ARGUMENT FOR GETDCD\r
451         MOVEI   TAC,QUANT       ;HAVE IT NOW\r
452         MOVEM   TAC,QUANTM      ;KEEP IT FOR QUANT BLOCKS\r
453         MOVEM   PROG,USEPRG\r
454         MOVEM   DEVDAT,USEWRD   ;SAVE ACS NEEDED ON INTERRUPT LEVEL\r
455         JRST    SETACT          ;LIGHT IOACT AND RETURN\r
456 \r
457 \r
458 ;HERE TO CLOSE A DUMP MODE FILE\r
459 CLSDMP: TLO     IOS,CLSDMP              ;SET SWITCHES\r
460         PUSHJ   PDP,GETDT       ;GET CONTROL\r
461         SETZM   BUF             ;ENSURE LINK, WORDCOUNT=0\r
462         JRST    OUFULL          ;GO WRITE THE BLOCK\r
463 \f       EXTERN  JOBDDT,USRDDT\r
464 ;DUMP MODE INPUT\r
465 DMPI:   IFN     CPBIT, <\r
466         HRRZ    AC2,IBLK(DEVDAT)\r
467 >\r
468         PUSHJ   PDP,DMPSET      ;SET UP DUMP-MODE STUFF\r
469         JRST    ZERCOR          ;ZER USER'S CORE IF SAVE-MODE\r
470 \r
471 \r
472 ;INPUT UUO\r
473 UIN:    TLZ     IOS,IO\r
474         HRRZ    BLK,IBLK(DEVDAT) ;BLOCK TO READ\r
475         PUSHJ   PDP,STOIOS\r
476         TRNE    IOS,UDSD        ;NON STANDAR?\r
477         JRST    READBF\r
478         JUMPE   BLK,EOF         ;0 MEANS EOF\r
479         PUSHJ   PDP,BLKCHK      ;CHECK LEGALITY OF BLOCK NUMBER\r
480         TLNN    IOS,DMPMOD      ;DUMP MODE?\r
481         CAIE    BLK,DIRBLK      ;TRYING TO READ DIRECTORY?\r
482         JRST    READBF          ;NO. GO READ\r
483 \r
484 ;READING DIRECTORY - GIVE CORE IMAGE IF IT EXISTS\r
485         PUSHJ   PDP,DIRCHK      ;READ IT IF IT ISN'T IN ALREADY\r
486         HRL     TAC,DLOC(DEVDAT) ;LOC OF DIRECTORY\r
487         MOVEI   TAC1,@DEVIAD(DEVDAT)  ;WHERE USER WANTS IT\r
488         HRRI    TAC,1(TAC1)     ;LOC OF DATA\r
489         BLT     TAC,200(TAC1)   ;GIVE IT TO HIM\r
490         PUSHJ   PDP,ADVBFF      ;ADVANCE BUFFERS\r
491         JFCL\r
492         POPJ    PDP,\r
493 \f;CHECK VALIDITY OF BLOCK NUMBER\r
494 BLKCHK: CAIG    BLK,TOPBLK      ;LEGAL?\r
495         POPJ    PDP,            ;YES. RETURN\r
496         POP     PDP,TAC\r
497         TROA    IOS,IOBKTL      ;NO. LIGHT ERROR BIT\r
498 \r
499 ;INPUT BLOCK = 0 - END OF FILE\r
500 EOF:    TLO     IOS,IOEND       ;LIGHT EOF BIT\r
501         TLNN    IOS,DMPMOD\r
502         JRST    STOIOS\r
503         JRST    DMPEOF          ;GIVE UP CONTROL IF DUMP-MODE\r
504 \r
505 \r
506 ;ZERO USER'S CORE ON SAVE-MODE INPUT\r
507 ZERCOR: MOVEI   TAC,JOBDDT(PROG) ;ZERO CORE\r
508         HRLI    TAC,1(TAC)\r
509         MOVSS   TAC             ;BLT POINTER\r
510         HRRZ    TAC1,DMPLST(DEVDAT)  ;TOP CELL TO ZERO (-175)\r
511         ADDI    TAC1,(PROG)     ;RELOCATE TO USER AREA\r
512         SETZM   -1(TAC)         ;ZERO\r
513         BLT     TAC,(TAC1)\r
514         SETZM   USRDDT          ;DDT IS KEPT IN PROTECTED PART\r
515         JRST    UIN\r
516 \f;DUMP MODE OUTPUT\r
517 DMPO:   PUSHJ   PDP,DIRCHK      ;MAKE SURE DIRECTORY IS IN CORE\r
518         IFN     CPBIT, <\r
519         HRRZ    AC2,OBLK(DEVDAT)\r
520 >\r
521         PUSHJ   PDP,DMPSET      ;SET DUMPO-MODE POINTERS\r
522         JFCL\r
523 \r
524 ;OUTPUT UUO\r
525 UOUT:   TLO     IOS,IO\r
526         TRNE    IOS,UDSD        ;NON STANDARD?\r
527         JRST    UOUT2           ;YES\r
528         PUSHJ   PDP,DIRCHK      ;NO. MAKE SURE DIRECTORY IS IN CORE\r
529         HRRZ    BLK,OBLK(DEVDAT)\r
530         CAIN    BLK,DIRBLK      ;CHECK IF WRITING DIRECTORY\r
531         JRST    COR2HM          ;YES, WRITE CORE IMAGE\r
532         JUMPE   BLK,FAKADV      ;DONT WRITE IF NO BLOCK GIVEN\r
533         PUSHJ   PDP,BLKCHK      ;CHECK FOR LEGAL BLOCK\r
534 UOUT2:  TLNN    IOS,DMPMOD      ;ALREADY HAVE CONTROL IF DUMP-MODE\r
535         PUSHJ   PDP,GETDT       ;GET DEC TAPE CONTROLLER\r
536 FILBUF:\r
537 DTOCHK: TLNE    IOS,DMPMOD      ;DUMP MODE?\r
538         JRST    DMPFIL          ;YES, FILL BUFFER FROM LIST\r
539         MOVSI   TAC,@DEVOAD(DEVDAT) ;LOCATION OF BUFFER\r
540         ADD     TAC,[XWD 1,BUF];SET TO STORE IN MONITOR BUFFER\r
541         BLT     TAC,BUF+177     ;GO BLT IT\r
542         SKIPN   BUF             ;GIVE UP TAPE IF\r
543         JRST    THRUTP          ;NO BUFFER TO OUTPUT\r
544         TLZ     IOS,NOLINK\r
545 \fOUFULL:        TRNE    IOS,UDSD        ;NON-STANDARD?\r
546         JRST    OUTBL2          ;YES, NO FILE-STRUCTURED OPERATIONS\r
547         HLRE    BLK,BUF         ;IS IT?\r
548         JUMPL   BLK,LSTBLK      ;YES, - LAST BLOCK OF FILE\r
549         JUMPN   BLK,OUTBLK      ;IF NON-0 - YES\r
550         TLZE    IOS,DMPCLS      ;NO. LAST BLOCK OF A DUMPO FILE?\r
551         JRST    OUTBLK          ;YES. LINK MUST STAY 0\r
552 OUCOMP: PUSHJ   PDP,USRFRE      ;COMPUTE NEXT BLOCK\r
553         TLO     IOS,NOLINK      ;THIS BLOCK NOT LINKED\r
554 OUTBLK: HRLM    BLK,BUF          ;SAVE LINK IN 1ST WORD OF BLOCK\r
555         MOVE    TEM,FSTBLK(DEVDAT) ;STORE 1ST BLOCK OF FILE IN WORD\r
556         DPB     TEM,[POINT 10,BUF,27]\r
557         HRRZ    TEM,OBLK(DEVDAT) ;BLOCK TO WRITE NOW\r
558         HRRM    BLK,OBLK(DEVDAT) ;BLOCK TO WRITE NEXT\r
559         MOVE    BLK,TEM\r
560         PUSHJ   PDP,MARKDR      ;MARK BLOCK TAKEN IN DIRECTORY\r
561         SKIPA   BLK,TEM\r
562 OUTBL2: HRRZ    BLK,OBLK(DEVDAT)\r
563         PUSHJ   PDP,STOIOS\r
564 \r
565 \r
566 WRTBLK: PUSHJ   PDP,FNDBLK      ;GO SEARCH FOR BLOCK\r
567         MOVE    TAC1,[BLKO DC,700] ;HERE WE ARE - GO WRITE\r
568         JRST    RDWRT\r
569 \f;WRITE LAST BLOCK\r
570 LSTBLK: MOVEI   BLK,0           ;LINK=0\r
571         JRST    OUTBLK          ;GO WRITE LAST BLOCK\r
572 \r
573 ;TRYING TO WRITE DIRECTORY - STORE IN CORE\r
574 COR2HM: MOVEI   TAC,@DEVOAD(DEVDAT)  ;WHERE IT IS\r
575         HRLI    TAC,1(TAC)      \r
576         HRR     TAC,DLOC(DEVDAT)        ;WHERE TO PUT IT\r
577         MOVEI   TAC1,177(TAC)\r
578         BLT     TAC,(TAC1)\r
579         TLO     IOS,CHNGDR      ;REMEMBER TO WRITE IT OUT\r
580         MOVSI   TAC1,400000\r
581         ORM     TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE\r
582 FAKADV: TLZN    IOS,DMPMOD\r
583         PUSHJ   PDP,ADVBFE      ;ADVANCE BUFFERS\r
584         JFCL\r
585         TLZ     IOS,NOLINK      ;DIRECTORY BLOCK IS NOT LINKED\r
586         SETZM   OBLK(DEVDAT)\r
587         JRST    STOIOS\r
588 \f;SET UP POINTERS AND STUFF FOR DUMP-MODE\r
589 DMPSET: TLO     IOS,DMPMOD      ;LIGHT BIT\r
590         PUSHJ   PDP,GETDT       ;GET CONTROL\r
591         HRLI    UUO,PROG\r
592         PUSHJ   PDP,COMCHK      ;CHECK VALIDITY OF LIST\r
593         JRST    SVADER          ;NG. GIVE ADRESS ERROR\r
594         SKIPN   TAC,@UUO        ;OK. NULL LIST?\r
595         JRST    DMPTS1          ;YES. RETURN\r
596         IFN CPBIT, <\r
597         TRNE    IOS,UDSD        ;NO. NON-STD MODE?\r
598         SOJA    DAT,TOUSER      ;YES. GO ELSEWHERE\r
599 >\r
600 DMPST2: SOS     UUO             ;NO. SAVE START OF LIST (-1)\r
601         MOVEM   UUO,DMPLST(DEVDAT)\r
602         JRST    CPOPJ1\r
603 \r
604 DMPTS1: POP     PDP,TAC\r
605         JRST    THRUTD\r
606 \r
607 \r
608         IFN CPBIT, <\r
609 ;HERE TO START DUMP-MODE INTO USER AREA DIRECTLY\r
610 TOUSER: JUMPE   AC2,NOBLK0      ;CANT READ BLK 0 IN NON-STD DUMP  MODE\r
611         ASH     DAT,-7          ;NUMBER OF WRDS IN LIST /200\r
612         AOS     DAT\r
613         MOVEM   DAT,BLKCNT      ;SAVE TO UPDATE POSITION\r
614         MOVEI   UUO,@UUO        ;REAL ADDRESS OF LIST\r
615         MOVEM   UUO,USPNTR      ;SAVE IT\r
616         MOVEM   UUO,SVPNTR\r
617         ADDI    TAC,(PROG)      ;RELOCATE ADDRESS OF 1ST IOWD\r
618         MOVEM   TAC,PNTR        ;AND SAVE IT\r
619         MOVE    TAC,[JSR DMPADV] ;SET UP LOC FOR WHEN\r
620         MOVEM   TAC,DCLOC1      ;IOWD IS EXHAUSTED\r
621         HRRZM   PROG,ADRPRG     ;SAVE JUST ADDRESS OF PROG\r
622         TLO     IOS,NOBUF       ;INDICATE DIRECTLY TO USER\r
623         XCT     @1(PDP)         ;TURN ON/OFF IO\r
624         TLNN    IOS,IO\r
625         JRST    CPOPJ1          ;READING - CONTINUE\r
626         POP     PDP,TAC         ;WRITING - THIS WILL SAVE LOTS OF TIME\r
627         JRST    OUTBL2\r
628 >\r
629 \f;FILL OUTPUT BUFFER FROM LIST\r
630 DMPFIL: MOVSI   TAC1,-177\r
631         IFE     CPBIT, <\r
632         TRNE    IOS,UDSD\r
633         SUB     TAC1,ONEONE     ;200 DATA WORDS IF NON-STANDARD\r
634 >\r
635 DMPFLB: PUSHJ   PDP,NXTCOM      ;GET NEXT COMMAND\r
636         JRST    DMPOTH          ;END OF LIST\r
637 DMPFLA: MOVE    TEM,(TAC)       ;GET NEXT WORD\r
638         MOVEM   TEM,BUF+1(TAC1) ;INTO BUFFER\r
639         AOBJP   TAC1,DMPOVR     ;BUFFER FULL IF GOES\r
640         AOBJN   TAC,.-3         ;GET NEXT WORD FROM COMMAND\r
641         JRST    DMPFLB          ;GET NEXT COMMAND\r
642 \r
643 DMPOTH:\r
644         IFE     CPBIT, <\r
645         TRNN    IOS,UDSD\r
646 >\r
647         HRRZM   TAC1,BUF        ;LIST RAN OUT  SAVE WORD COUNT\r
648 \r
649         SETZM   BUF+1(TAC1)     ;ZERO REST OF BUFFER\r
650         HRRZI   TAC1,BUF+2(TAC1)\r
651         CAILE   TAC1,BUF+177    ;JUST ZERO 1 WORD IF AT TOP\r
652         JRST    OUFULL\r
653         HRLI    TAC1,-1(TAC1)\r
654         BLT     TAC1,BUF+177    ;****TEST IF TOP OF BUFFER\r
655         JRST    OUFULL          ;NOW WRITE BUFFER\r
656 \r
657 ;BUFFER FULL BEFORE END OF COMMAND\r
658 DMPOVR: AOBJN   TAC,.+3         ;WAS THAT LAST WORD OF COMMAND?\r
659         PUSHJ   PDP,NXTCOM      ;YES. GET NEXT\r
660         MOVEI   TAC,0\r
661         MOVEM   TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND\r
662 DMPOVA: MOVEI   TAC,177\r
663         IFE     CPBIT, <\r
664         TRNN    IOS,UDSD\r
665 >\r
666         MOVEM   TAC,BUF         ;WD CNT =177\r
667         JRST    OUFULL          ;GO WRITE PART OF STUFF\r
668 \r
669 ;GET NEXT COMMAND FROM LIST\r
670 NXTCOM: SKIPN   DMPLST(DEVDAT)  ;END OF COMMANDS?\r
671         JRST    NXTCM2          ;YES. RETURN\r
672         AOSA    TAC,DMPLST(DEVDAT) ;GET NEXT COMMAND\r
673 NXTCM1: HRRM    TAC,DMPLST(DEVDAT) ;STORE GO-TO ADDRESS\r
674         MOVE    TAC,@TAC        ;GET COMMAND\r
675         JUMPE   TAC,NXTCM2      ;END OF LIST\r
676         JUMPG   TAC,NXTCM1      ;GO-TO WORD\r
677         ADDI    TAC,(PROG)      ;REAL COMMAND - ADD RELOCATION\r
678         AOJA    TAC,CPOPJ1      ;AND RETURN\r
679 \r
680 ;END OF DUMP-MODE LIST\r
681 NXTCM2: SETZM   SVDWRD(DEVDAT)  ;ZERO POINTERS\r
682         SETZM   DMPLST(DEVDAT)\r
683         POPJ    PDP,\r
684 \r
685 \r
686 DMPFLC: SKIPE   TAC,SVDWRD(DEVDAT)      ;IS THERE ANOTHER COMMAND\r
687         JRST    DMPFLA          ;YES. GET IT\r
688         JRST    DMPTH2          ;NO. THROUGH\r
689 \fDTC=210\r
690 DTS=214\r
691 \r
692 ;IO INTERFACE\r
693 READBF: TLNN    IOS,DMPMOD      ;HAVE CONTROL IF DUMP-MODE\r
694         PUSHJ   PDP,GETDT       ;GET DT CONTROL\r
695 \r
696 READBC: PUSHJ   PDP,FNDBLK      ;SEARCH FOR RIGHT BLOCK\r
697         MOVE    TAC1,[BLKI DC,300] ;FOUND IT - START READING\r
698 \r
699 ;HERE WITH BLK=BLOCK NUMBER, TAC1=FUNCTION, START SEARCH\r
700 RDWRT:  PUSH    PDP,TAC\r
701         HLLM    TAC1,IOWD       ;BLKI OR BLKO\r
702         HRLI    TAC,-200\r
703         TLNN    IOS,RWDIR       ;WRITING (READING) DIRECT?\r
704         SKIPA   TAC,BFPNTR      ;NO. INTO BUF\r
705         HRR     TAC,DLOC(DEVDAT)        ;YES. LOC OF DIRECTORY\r
706         SOS     TAC             ;NO. SET FOR FORWARD READ\r
707 IOGO:   IFN CPBIT, <\r
708         TLNN    IOS,NOBUF       ;POINTER ALREADY SET UP IF DIRECT IO\r
709 >\r
710         MOVEM   TAC,PNTR        ;POINTER\r
711         OR      TAC1,UNIT       ;UNIT AND PI CHAN\r
712         MOVEM   TAC1,COMAND     ;SAVE COMMAND FOR READ OR WRITE\r
713         POP     PDP,TAC         ;RESTORE SEARCH COMMAND\r
714         CONO    DC,DCIN         ;SET DATA CONTROL TO READ\r
715         CONO    PI,DCON         ;TURN ON DC PI CHANNEL\r
716         HRLI    TAC,37\r
717         CONO    PI,PIOFF\r
718         CONO    DTC,(TAC)       ;START TAPE MOVING\r
719         HLRM    TAC,DTCINT\r
720         CONO    PI,PION\r
721         POPJ    PDP,            ;DISMISS INTERRUPT\r
722 \r
723 \r
724 ;HERE FOR ANY DATA WORD WITH TAPE IN REVERSE\r
725 RVERS:  0\r
726 IOWD:   BLKI    DC,PNTR         ;READ (WRITE) A WORD\r
727         JRST    RVTHRU          ;POINTER RAN OUT\r
728         SOS     PNTR            ;POINTER HAS TO BACK UP\r
729         SOS     PNTR\r
730         JEN     @RVERS          ;DISMISS THE INTERRUPT\r
731 \f;HERE WHEN POINTER RUNS OUT IN REVERSE\r
732 RVTHRU: JSR     SHUTDN          ;SHUT DOWN DATA CONTROL\r
733         JEN     @RVERS          ;DISMISS\r
734 \r
735 ;HERE WHEN POINTER RUNS OUT FORWARD\r
736 DTATHR: 0\r
737         JSR     SHUTDN          ;SHUT DOWN DATA CONTROL\r
738         JEN     @DTATHR         ;DISMISS\r
739 \r
740 \r
741 SHUTDN: 0\r
742         CONSZ   DC,10000        ;DATA MISSED?\r
743         SETOM   ERRFLG          ;YES. SET SWITCH\r
744         CONSO   DTC,400         ;READING?\r
745         CONO    DC,0            ;YES. TURN OFF DC\r
746         CONO    PI,DCOFF        ;TURN OFF DC PI\r
747         JRST    @SHUTDN\r
748 \f;COME HERE TO START READING BLOCK NUMBERS\r
749         EXTERN PION,PIOFF\r
750 \r
751 FNDBLK: HRRZM   BLK,BLOCK       ;BLOCK WE'RE LOOKING FOR\r
752         SETZM   ERRCNT\r
753 FNDBL2: SETZM   ERRFLG          ;RESET DATA MISSED FLAG\r
754         LDB     TAC,PUNIT       ;GET UNIT NUMBER\r
755         LSH     TAC,3           ;POSITION IT\r
756         TRO     TAC,DTCCHN      ;ADD PI CHANNEL\r
757         MOVEM   TAC,UNIT        ;SAVE\r
758         MOVE    TEM,[JSR SRCH]  ;SET UP  INTERRUPT CELLS\r
759         MOVEM   TEM,DCLOC\r
760         MOVE    TEM,[JSR DTATHR]\r
761         IFN     CPBIT, <\r
762         TLNN    IOS,NOBUF       ;DCLOC1 ALREADY SET UP IF DIRECT IO\r
763 >\r
764         MOVEM   TEM,DCLOC1      ;FOR FORWARD DATA OPERATIONS\r
765         CONSZ   DTC,20000       ;IS TAPE ALREADY MOVING/\r
766         JRST    FNDBL4          ;YES\r
767         TRO     TAC,323200      ;NO, SET READ BLK NOS., START DELAY\r
768         TLNN    IOS,RVERSE      ;MOVE TAPE BACKWARDS?\r
769         TRO     TAC,10000       ;YES\r
770 FNDBL3: IFN     CPBIT, <\r
771         PUSH    PDP,IOS\r
772         TLZ     IOS,NOBUFC      ;SET UP DIRCTN NON-0 IF DIRECT IO\r
773         HLLZM   IOS,DIRCTN\r
774         POP     PDP,IOS\r
775 >\r
776         MOVEM   IOS,DEVIOS(DEVDAT)      ;RESTORE IOS IN CORE\r
777         POPJ    PDP,            ;AND EXIT\r
778 \r
779 \r
780 ;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY\r
781 FNDBL4: CONSZ   DTC,10000       ;GOING BACKWARDS?\r
782         TRO     TAC,10000       ;YES\r
783         TRO     TAC,320200      ;SET TO READ BLOCKS, NO DELAY\r
784         JRST    FNDBL3          ;GO TELL CONTROL\r
785 \f;INTERRUPT HERE TO READ A BLOCK NUMBER\r
786 SRCH:   0       \r
787         MOVEM   TAC,TEMP        ;SAVE TAC\r
788         DATAI   DC,TAC          ;NO. READ A BLOCK NUMBER\r
789         SUB     TAC,BLOCK       ;;PRESENT BLOCK - TARGET BLOCK\r
790         IFN CPBIT, <\r
791         SKIPE   DIRCTN          ;IF DIRECT IO\r
792         CONSO   DTC,10000       ;MUST READ DATA FORWARD\r
793 >\r
794         JUMPE   TAC,FOUND       ;THERE IS ZERO\r
795         HRR     TAC,UNIT        ;NO. SET UP READ OF NEXT BLOCK\r
796         CONSZ   DTC,10000       ;GOING IN REVERSE\r
797         TDC     TAC,[XWD 400000,10000] ;YES, SWITCH TURN-AROUND TEST\r
798         SKIPL   TAC             ;TURN AROUND?\r
799         TRC     TAC,12000       ;YES, SWITCH DIR., TUERN AROUND DELAY\r
800         CONO    DTC,320200(TAC);TELL CONTROL\r
801         CONO    DC,DCIN         ;TELL DATA CONTROL ALSO\r
802 SRCHXT: MOVE    TAC,TEMP        ;RESET TAAC\r
803         JEN     @SRCH           ;AND EXIT THE INTERRUPT\r
804 \r
805 \r
806         IFN CPBIT, <\r
807 ;HERE WHERE DUMP-MODE POINTER RUNS OUT\r
808 DMPADV: 0\r
809         MOVEM   TAC,TEMP\r
810         AOSA    TAC,USPNTR      ;ADVANCE LOC OF POINTER\r
811 DMPAV1: HRRM    TAC,USPNTR\r
812         SKIPN   TAC,@TAC        ;END OF LIST?\r
813         JRST    DMPAV3          ;YES. STOP TAPE\r
814         ADD     TAC,ADRPRG      ;ADD RELOCATION\r
815         JUMPG   TAC,DMPAV1\r
816         MOVEM   TAC,PNTR        ;NEW POINTER\r
817 DMPAV2: MOVE    TAC,TEMP        ;RESTORE TAC\r
818         JEN     @DMPADV\r
819 \r
820 \r
821 DMPAV3: JSR     SHUTDN          ;SHUT DOWN TAPE\r
822         JRST    DMPAV2          ;RESTORE TAC AND EXIT THE INTERRUPT\r
823 \r
824 >\r
825 \f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND\r
826 FOUND:  CONSZ   DTC,10000       ;GOING FORWARD?\r
827         JRST    IORVRS          ;NO\r
828         MOVE    TAC,IOWD        ;YES. SET BLKI/BLKO INOT PI LOC\r
829 FND1:   MOVEM   TAC,DCLOC\r
830         MOVE    TAC,COMAND      ;PICK UP READ OR WRITE COMMAND\r
831         TRNE    TAC,400         ;WRITE?\r
832         CONO    DC,DCOUT        ;YES. CONDITION DATA CONTROL\r
833         CONO    DTC,360000(TAC) ;START DATA FLOW\r
834         JRST    SRCHXT          ;AND LEAVE\r
835 \r
836 IORVRS: MOVEI   TAC,10000       ;SET IO FOR REVERSE\r
837         ORM     TAC,COMAND\r
838         MOVEI   TAC,177\r
839         ADDM    TAC,PNTR        ;READ FROM TOP OF BUFFER DOWN\r
840         MOVE    TAC,[JSR RVERS] ;HAVE TO DO SOME STUFF AT INTERRUPT\r
841         JRST    FND1\r
842 \f;INTERRUPT HERE FOR FLAG CHANNEL\r
843 DTCINT: CONSO   DTS,37          ;INTERRUPT FOR DECTAPE?\r
844         JRST    .               ;NO, GO AWAY\r
845         CONSO   DTC,40000       ;YES. JOB DONE ENABLED?\r
846         JRST    BLKNUM          ;NO. READING BLOCK NUMBERS\r
847         CONSZ   DTC,4000        ;YES. TIME FLAG ENABLED?\r
848         JRST    TIMINT          ;YES. CHECK IF THIS IS A TIME INTERRUPT\r
849 DTCIN1: CONO    DC,0            ;NO. TURN OFF DATA CONTROL\r
850         JSR     DTCSAV          ;SAVE ACS\r
851         MOVE    DEVDAT,USEWRD   ;RESTORE DEVDAT\r
852         MOVE    IOS,DEVIOS(DEVDAT) ;AND IOS\r
853         MOVE    PROG,USEPRG\r
854         CONSZ   DTS,1           ;JOB DONE LIT?\r
855         CONSZ   DTS,116         ;AND NO ERORS?\r
856         JRST    ERRS            ;NO. ERROR\r
857         SKIPE   ERRFLG          ;DATA MISSED?\r
858         JRST    ERRS            ;YES. TOO BAD\r
859 \r
860 ;DATA WAS READ IN OR WRITTEN OUT FINE\r
861 DTCIN2: TLNE    IOS,DMPMOD      ;DUMP MODE?\r
862         JRST    DMPTHR          ;YES. GO ELSEWHERE\r
863         TLNN    IOS,SINGL\r
864         JRST    .+3\r
865         LDB     TAC,[POINT 10,BUF,27]  ;GET 1ST BLOCK NO. IF READ\r
866                                 ;CAME FROM LOOKUP\r
867         MOVEM   TAC,IBLK(DEVDAT)  ;STORE IN DDB\r
868         TLZE    IOS,IOW         ;NO. IN IO WAIT?\r
869         PUSHJ   PDP,SETIOD      ;YES. TAKE OUT OF WAIT\r
870         TLZE    IOS,SINGL+RWDIR ;DIRECTORY OPERATION?\r
871         JRST    THRUTP          ;YES. LEAVE\r
872         TLNE    IOS,IO          ;WRITING?\r
873         JRST    OUTHRU          ;YES\r
874 \fEXTERN JBTSTS,PJOBN\r
875 \r
876 \r
877 ;HERE ON END OF AN INPUT BLOCK\r
878         HRROI   TAC1,177        ;MASK OUT 1ST-BLK DATA\r
879         TRNN    IOS,UDSD        ;UNLESS IN NON-STD\r
880         ANDM    TAC1,BUF\r
881         MOVEI   TAC,@DEVIAD(DEVDAT) ;WHERE TO STORE BLOCK\r
882         ADD     TAC,[XWD BUF,1];FROM BUF TO THERE\r
883         MOVEI   TAC1,177(TAC)\r
884         BLT     TAC,(TAC1)      ;TRANSFER IT\r
885         HLRZ    BLK,BUF         ;NEXT BLOCK TO READ\r
886         TRNE    IOS,UDSD\r
887         AOSA    BLK,IBLK(DEVDAT) ;READ SEQUENTIAL BLOCKS\r
888         HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
889         TRNE    IOS,IODTER+IODERR+IOIMPM ;WAS THERE AN INPUT ERROR?\r
890         JRST    THRUIN          ;YES. DONT ADVANCE BUFFERS\r
891         PUSHJ   PDP,ADVBFF      ;GET NEXT BUFFER\r
892         JRST    THRUIN          ;EMPTY BUF NOT AVAILABLE\r
893         SKIPE   BLK             ;EXIT  IF EOF OR BLOCK TOO LARGE\r
894         CAILE   BLK,TOPBLK      ;THE ERROR WILL BE CAUGHT ON THE\r
895         JRST    THRUIN          ;UUO LEVEL NEXT TIME AROUND\r
896         SOSGE   QUANTM          ;HAS TAPE HAD CHAN LONG ENOUGH?\r
897         SKIPG   DTREQ           ;YES. ANYONE ELSE WANT IT?\r
898         JRST    READBC          ;NO. READ NEXT BLOCK\r
899 \r
900 \r
901 THRUIN: HRRZ    TAC,OBLK(DEVDAT) ;TAPE ALSO BEING WRITTEN?\r
902         JUMPN   TAC,THRUTP      ;YES. DONT CHANGE REVERSE BIT\r
903         TLZ     IOS,RVERSE      ;NO. SET IOS BIT TO CORRECT DIRECTION\r
904         CONSZ   DTC,10000\r
905         TLO     IOS,RVERSE\r
906 \f;HERE WHEN TAPE IS DONE\r
907 THRUTP: CONSO   DTC,20000       ;ON INTERRUPT LEVEL?\r
908         JRST    THRUTD          ;NO. TAPE IS NOT MOVING\r
909         MOVE    TAC,UNIT        ;SET TO STOP TAPE\r
910         CONSZ   DTC,10000       ;GOING REVERSE?\r
911         TRO     TAC,10000       ;YES\r
912         CONO    DTC,245000(TAC) ;STOP TAPE, WITH TIME FLAG INTERRUPT ON\r
913                                 ;ENABLE JOB DONE AS A FLAG FOR DTCINT\r
914 THRUTA: SOSL    DCREQ            ;GIVE UP DATA CONTROL (DECTAPE CONTROL\r
915         SETOM   DCAVAL           ;WILL BE GIVEN UP AT NEXT INTERRUPT\r
916         TLZ     IOS,DMPMOD+NOBUF ;RESET DUMP-MODE BIT\r
917         JRST    CLRACT  ;RESET IOACT AND RETURN\r
918 \r
919 THRUTD: PUSHJ   PDP,THRUTA      ;GIVE UP DATA CONTROL\r
920         SOSL    DTREQ           ;GIVE UP DECTAPE CONTROL\r
921         SETOM   DTAVAL  \r
922         CONO    DC,0            ;SHUT OFF DATA CONTROL\r
923         CONO    PI,DCOFF                ;AN TURN OF ITS PI CHANNEL\r
924         CONO    DTC,0           ;SHUT DOWN DATA CONTROL\r
925         HLLZS   DTCINT\r
926         POPJ    PDP,            ;AND LEAVE\r
927 \f       EXTERN  CLOCK\r
928 \r
929 ;HERE ON END OF OUTPUT BLOCK\r
930 OUTHRU: PUSHJ   PDP,ADVBFE      ;GET NEXT BUFFER\r
931         JRST    THRUTP          ;NOT FULL\r
932         JUMPE   BLK,THRUTP      ;DONE IF BLK=0\r
933         HRRZ    BLK,OBLK(DEVDAT) ;NEXT BLOCK TO WRITE\r
934         CAILE   BLK,TOPBLK      ;LEGAL?\r
935         JRST    THRUTP          ;NO. CATCH ERROR ON UUO LEVEL\r
936         SOSGE   QUANTM          ;YES. HAD CHAN LONG ENOUGH?\r
937         SKIPG   DTREQ           ;AND SOMEONE ELSE WANT IT?\r
938         JRST    FILBUF          ;NO. GO WRITE NEXT BLOCK\r
939         JRST    THRUTP          ;YES. GIVE UP TAPE\r
940 \r
941 \r
942 ;TURN TAPE AROUND AFTER END-ZONE INTERUPT\r
943 TURN:   MOVEM   TAC,TEMPA       ;SAVE TAC\r
944         MOVE    TAC,UNIT        ;UNIT AND CHANNEL\r
945         CONSO   DTC,10000       ;IN REVERSE?\r
946         TRO     TAC,10000       ;NO. NO WILL BE\r
947         CONO    DTC,322200(TAC);READ BLOCK NOS IN OPPOSITE DIRECTION\r
948         MOVE    TAC,TEMPA       ;RESTORE TAC\r
949         JEN     @DTCCHL         ;AND EXIT THE INTERRUPT\r
950 \r
951 TIMINT: CONSO   DTS,20          ;TIME FLAG INTERRUPT ON?\r
952         JRST    SPRIUS          ;NO. THIS IS A SPURIOUS INTERRUPT\r
953         EXCH    TAC,TIMREQ      ;ANOTHER TAPE CAN NOT BE\r
954         CONO    PI,PIOFF        ;SELECTED FOR 25 MSEC SO\r
955         IDPB    TAC,CLOCK       ;PUT IN A CLOCK REQUEST\r
956         CONO    PI,PION ;TO WAIT FOR 3 TICKS\r
957         EXCH    TAC,TIMREQ      ;BEFORE ALLOWING NEXT USER ON\r
958         CONO    DTC,0           ;SHUT DOWN DTC\r
959         HLLZS   DTCINT\r
960         JEN     @DTCCHL         ;AND LEAVE\r
961 \r
962 \r
963 ;HERE WITH AN INTERRUPT WHILE SEARCHING FOR BLOCK NUMBERS\r
964 BLKNUM: CONSZ   DTS,2           ;END ZONE INTERRUPT?\r
965         JRST    TURN            ;YES. TURN AROUND\r
966         CONSO   DTS,14          ;NO. ILLEGAL OP OR PARITY ERROR?\r
967         JRST    DTCINT+1        ;NO. NOT REALLY A DECTAPE INTERRUPT\r
968         JRST    DTCIN1          ;YES. GO HANDLE ERROR\r
969 \r
970 ;HERE ON A SPURIOUS DECTAPE INTERRUPT\r
971 SPRIUS: CONI    DTC,TEMPA       ;READ DTC STATUS BITS\r
972         CONO    DTC,@TEMPA      ;GIVE A CONO TO DTC TO CLEAR INTERRUPT\r
973         JEN     @DTCCHL         ;EXIT THE INTERRUPT\r
974 \r
975 TIMREQ: XWD     .+1,3   ;E CLOCK TICKS\r
976         SOSL    DTREQ   ;ALLOW OTHER JOBS\r
977 \f       SETOM   DTAVAL  ;TO GET DT CONTROL NOW\r
978         POPJ    PDP,\r
979 \f;COME HERE ON END OF DUMP MODE BLOCK\r
980 SVDMTH: IFN CPBIT, <\r
981         TLNE    IOS,NOBUF       ;DIRECTLY TO USER?\r
982         JRST    USDMTH          ;YES. ALMOST THROUGH\r
983 >\r
984         MOVSI   TAC1,-177\r
985         IFE     CPBIT, <\r
986         TRNE    IOS,UDSD\r
987         SUB     TAC1,ONEONE     ;SET UP TAC1 WITH COUNT\r
988 >\r
989         TLNN    IOS,IO\r
990         JRST    SVDMIN          ;INPUT FILE\r
991         HRRZ    BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK\r
992         JUMPE   BLK,DMPTHA      ;LAST BLOCK\r
993         IFE     CPBIT, <\r
994         TRNE    IOS,UDSD        ;IF NON-STD MODE\r
995         AOSA    OBLK(DEVDAT)    ;WRITE CONSECUTIVE BLOCKS\r
996 >\r
997         CAIG    BLK,TOPBLK      ;NOT LAST. LEGAL BLOCK NUMBER?\r
998         POPJ    PDP,            ;YES. RETURN\r
999 \r
1000         TRO     IOS,IOBKTL      ;BLOCK TOO LARGE\r
1001 DMPTHA: POP     PDP,TAC\r
1002 DMPTH2: SETZM   SVDWRD(DEVDAT)  ;ZERO DUMP-MODE STUFF\r
1003         SETZM   DMPLST(DEVDAT)\r
1004 DMPTH3: TLZE    IOS,IOW         ;IS IO WAIT?\r
1005         PUSHJ   PDP,SETIOD      ;YES, RESTART JOB\r
1006         JRST    THRUTP\r
1007 \r
1008 ;HERE ON END SAVE MODE INPUT BLOCK\r
1009 SVDMIN: HLRZ    BLK,BUF         ;NEXT BLOCK NUMBER\r
1010         IFE     CPBIT, <\r
1011         TRNE    IOS,UDSD        ;NON-STANDARD?\r
1012         AOSA    BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS\r
1013 >\r
1014         HRRM    BLK,IBLK(DEVDAT) ;SAVE IN DDB\r
1015         JRST    CPOPJ1\r
1016 \r
1017 \r
1018         IFN CPBIT, <\r
1019 ;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER\r
1020 USDMTH: MOVEI   TAC1,IBLK(DEVDAT)\r
1021         TLNE    IOS,IO\r
1022         MOVEI   TAC1,OBLK(DEVDAT)       ;SET TAC1 TO RIGHT BLOCK NUMBER\r
1023         MOVE    TAC,BLKCNT      ;UPDATE BLOCK COUNTER\r
1024         ADDM    TAC,(TAC1)\r
1025         JRST    DMPTHA          ;THROUGH\r
1026 >\r
1027 \f;HERE WHEN THROUGH DUMP MODE BLOCK\r
1028 DMPTHR: PUSHJ   PDP,SVDMTH      ;END OF BLOCK HOUSEKEEPING\r
1029         JRST    DMPFLC          ;FILL BUFFER FOR NEXT OUTPUT\r
1030 \r
1031 ;HERE WHEN THROUGH READING A DUMP-MODE BLOCK\r
1032 DMIFIL: SKIPE   TAC,SVDWRD(DEVDAT) ;PARTIAL COMMAND?\r
1033         JRST    DMIFLB          ;YES. CONTINUE\r
1034 DMIFLA: PUSHJ   PDP,NXTCOM      ;NO. GET NEXT COMMAND\r
1035         JRST    DMPTH2          ;END OF LIST - THROUGH\r
1036 DMIFLB: MOVE    TEM,BUF+1(TAC1) ;NEXT DATA WORD\r
1037         MOVEM   TEM,(TAC)       ;GIVE TO USER\r
1038         AOBJP   TAC1,.+3        ;IF BUFFER IS FULL\r
1039         AOBJN   TAC,DMIFLB      ;GET NEXT WORD\r
1040         JRST    DMIFLA          ;GET NEXT COMMAND\r
1041 \r
1042         AOBJN   TAC,.+3         ;BUFFER IO FULL. IS COUNT EXACTLY 177?\r
1043         PUSHJ   PDP,NXTCOM      ;THAT COM, IS DONE. GET NEXT\r
1044         JRST    DMPTH2          ;END OF LIST - THROUGH\r
1045         MOVEM   TAC,SVDWRD(DEVDAT)  ;SAVE PARTIAL COMMAND FOR NEXT TIME\r
1046         JUMPE   BLK,DMPEOF      ;IF EOF - LIGHT BIT\r
1047 RDNXT:  CAIG    BLK,TOPBLK      ;BLOCK LEGAL?\r
1048         JRST    READBC          ;GO READ BLOCK NUMBER\r
1049         TROA    IOS,IOBKTL      ;LIGHT ERROR BIT\r
1050 \r
1051 \r
1052 ;EOF BEFORE ALL DATA IS IN - DUMP MODE\r
1053 DMPEOF: TRO     IOS,IODEND      ;LIGHT EOF BIT\r
1054         JRST    DMPTH2          ;GIVE UP TAPE\r
1055 \fSVADER:        PUSHJ   PDP,DMPTH2      ;GIVE UP CONTROL\r
1056         JRST    ADRERR          ;TYPE ERROR MESSAGE\r
1057 \r
1058 \r
1059 ;COME HERE ON ERROR\r
1060 ERRS:   AOS     TAC,ERRCNT      ;BUMP COUNT\r
1061         IFN CPBIT, <\r
1062         MOVE    TAC1,SVPNTR     ;YES. RESET POINTERS\r
1063         MOVEM   TAC1,USPNTR\r
1064         MOVE    TAC1,(TAC1)     ;RESET PNTR\r
1065         ADD     TAC1,ADRPRG\r
1066         MOVEM   TAC1,PNTR\r
1067 >\r
1068 ERRS1:  CONSO   DTS,4           ;IF ILLEGAL OP - DONT RETRY\r
1069         CAILE   TAC,DTTRY       ;ENOUGH REREADS?\r
1070         SKIPA                   ;YES. PERMANENT ERROR\r
1071         JRST    FNDBL2          ;NO. TRY AGAIN\r
1072 \r
1073 ;PERMANENT ERROR\r
1074 PERMER: CONSZ   DTS,10  \r
1075         TRO     IOS,IODTER      ;PARITY\r
1076         CONSO   DTS,100\r
1077         SKIPE   ERRFLG\r
1078         TRO     IOS,IODERR      ;MISSING DATA\r
1079         CONSZ   DTS,4\r
1080 NOBLK0: TRO     IOS,IOIMPM      ;ILLEGAL OP\r
1081         TLNE    IOS,DMPMOD      ;DUMP MODE?\r
1082         JRST    DMPTHR          ;YES. NOT THROUGH YET\r
1083         TLNN    IOS,IO+RWDIR+SINGL ;READING DATA?\r
1084         JRST    DTCIN2          ;YES. GIVE BUFFER TO USER\r
1085         TLZE    IOS,IOW\r
1086         PUSHJ   PDP,SETIOD      ;OUT OF IO WAIT\r
1087         TLZN    IOS,RWDIR+SINGL ;DIRECTORY OPERATION?\r
1088         JRST    THRUTP          ;NO. RETURN TO USER\r
1089         PUSHJ   PDP,THRUTP      ;YES. STOP TAPE\r
1090         MOVSI   TAC,400000      ;CLEAR DIRECTORY IN CORE BIT\r
1091         ANDCAM  TAC,DEVMOD(DEVDAT)\r
1092 BDDIR:  LDB     BLK,PJOBN       ;NUMBER OF OFFENDING JOB\r
1093         JRST    BADDIR          ;GO PRINT ERROR MESSAGE\r
1094 \fBFPNTR:        IOWD    200,BUF+1\r
1095 ONEONE: XWD     1,1\r
1096 USEWRD: 0\r
1097 USEPRG: 0\r
1098 PNTR:   0\r
1099 TEMP:   0\r
1100 TEMPA:  0\r
1101 BLOCK:  0\r
1102 QUANTM: 0\r
1103 ERRCNT: 0\r
1104 FNDTMP: 0\r
1105 UNIT:   0\r
1106 COMAND: 0\r
1107 ERRFLG: 0\r
1108         IFN CPBIT, <\r
1109 BLKCNT: 0\r
1110 USPNTR: 0\r
1111 SVPNTR: 0\r
1112 ADRPRG: 0\r
1113 DIRCTN: 0\r
1114 >\r
1115 BUF:    BLOCK   200\r
1116 DTAEND: END\r
1117 \f\r