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