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
6 ENTRY DTCSRN ;ENTRY POINT FOR SELECTIVE LOAD BY BUILD
\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
19 DIRBLK=^D100 ;NUMBER OF BLOCK FOR DIRECTORY
\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
35 \f;FLAGS IN RH OF IOS
\r
43 SINGL=2000 ;JUST READ OR WRITE 1 BLOCK
\r
47 NOBUF=40000 ;DATA GOING DIRECTLY INTO USER AREA
\r
48 NOBUFC=737777 ;-NOBUF
\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 ;WIUTHOUT DIRECT CONSIDERATION OF BLOCK BOUNDRIES
\r
55 \f INTERN DTCINT,DTCDDB,DTCINI,DTCDDS
\r
57 DTCDDB: SIXBIT /DTA0/
\r
73 JRST THRUTP ;HUNG DEVICE
\r
86 POPJ PDP, ;CLOSE INPUT
\r
94 HLLZS DTCINT ;CLEAR CONSO
\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
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
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
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
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
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
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
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
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
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
197 SOJA UUO,NMLOOK ;NO. TRY NEXT NAME
\r
198 SOJA UUO,CPOPJ ;NAME NOT FOUND
\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
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
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
218 BLKSRA: ILDB TEM,DAT ;INDEX OF NEXT BLOCK
\r
219 CAMN TAC,TEM ;MATCH?
\r
220 JRST CPOPJ1 ;YES. RETURN
\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
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
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
242 ;GET PREVIOUS FREE BLOCK
\r
243 LSTFRE: MOVEI TAC,0
\r
246 PUSHJ PDP,SETPTR ;SET DAT AS A POINTER
\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
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
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
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
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
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
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
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
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
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
334 POPJ PDP, ;NONE AVAILABLE.
\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
341 ADD TAC1,TEM ; +START ADDRESS
\r
342 TRZ TAC1,1777 ;STORE N-1, WHERE N IS NO OF K
\r
344 ORM TAC1,26(TAC) ;INTO 2ND WRD OF DIRECTORY
\r
345 SOJA UUO,ENTRA ;CONTINUE WITH ENTER
\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
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
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
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
377 MOVEI TEM,2 ;YES, WHICH ARE CLOSRER
\r
378 USRFRA: HRRZ BLK,OBLK(DEVDAT) ;CURRENT BLOCK
\r
379 TLNE IOS,RVERSE ;FORWARD?
\r
381 ADDI BLK,(TEM) ;YES, FIND NEXT BLOCK AT LEAST N
\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
391 USRLST: SUBI BLK,(TEM) ;LOOK FOR FREE BLOCK N BEFORE
\r
393 TDZA BLK,BLK ;REVERSE IF AT FRONT OF TAPE
\r
394 USLSTA: PUSHJ PDP,LSTFRE ;THIS ONE
\r
398 ;NO FREE BLOCKS AVAILABLE. GIVE HIGH BLOCK,SET IOBKTL LATER
\r
399 NOBLKS: MOVEI BLK,TOPBLK+1 ;SET HIGH BLOCK
\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
409 HRRI TAC1,1(TAC) ;BLT POINTER
\r
411 BLT TAC1,176(TAC) ;LEAVE LAST WORD IN DIR, ALONE
\r
412 MOVSI TAC1,17000 ;MARK DIRECTORY AS UNAVAILABLE
\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
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
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
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
454 MOVEM DEVDAT,USEWRD ;SAVE ACS NEEDED ON INTERRUPT LEVEL
\r
455 JRST SETACT ;LIGHT IOACT AND RETURN
\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
466 HRRZ AC2,IBLK(DEVDAT)
\r
468 PUSHJ PDP,DMPSET ;SET UP DUMP-MODE STUFF
\r
469 JRST ZERCOR ;ZER USER'S CORE IF SAVE-MODE
\r
474 HRRZ BLK,IBLK(DEVDAT) ;BLOCK TO READ
\r
476 TRNE IOS,UDSD ;NON STANDAR?
\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
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
493 \f;CHECK VALIDITY OF BLOCK NUMBER
\r
494 BLKCHK: CAIG BLK,TOPBLK ;LEGAL?
\r
495 POPJ PDP, ;YES. RETURN
\r
497 TROA IOS,IOBKTL ;NO. LIGHT ERROR BIT
\r
499 ;INPUT BLOCK = 0 - END OF FILE
\r
500 EOF: TLO IOS,IOEND ;LIGHT EOF BIT
\r
503 JRST DMPEOF ;GIVE UP CONTROL IF DUMP-MODE
\r
506 ;ZERO USER'S CORE ON SAVE-MODE INPUT
\r
507 ZERCOR: MOVEI TAC,JOBDDT(PROG) ;ZERO CORE
\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
514 SETZM USRDDT ;DDT IS KEPT IN PROTECTED PART
\r
516 \f;DUMP MODE OUTPUT
\r
517 DMPO: PUSHJ PDP,DIRCHK ;MAKE SURE DIRECTORY IS IN CORE
\r
519 HRRZ AC2,OBLK(DEVDAT)
\r
521 PUSHJ PDP,DMPSET ;SET DUMPO-MODE POINTERS
\r
526 TRNE IOS,UDSD ;NON STANDARD?
\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,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
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
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 TLNE 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
560 PUSHJ PDP,MARKDR ;MARK BLOCK TAKEN IN DIRECTORY
\r
562 OUTBL2: HRRZ BLK,OBLK(DEVDAT)
\r
566 WRTBLK: PUSHJ PDP,FNDBLK ;GO SEARCH FOR BLOCK
\r
567 MOVE TAC1,[BLKO DTC,700] ;HERE WE ARE - GO WRITE
\r
569 \f;WRITE LAST BLOCK
\r
570 LSTBLK: MOVEI BLK,0 ;LINK=0
\r
571 JRST OUTBLK ;GO WRITE LAST BLOCK
\r
573 ;TRYING TO WRITE DIRECTORY - STORE IN CORE
\r
574 COR2HM: MOVEI TAC,@DEVOAD(DEVDAT) ;WHERE IT IS
\r
576 HRR TAC,DLOC(DEVDAT) ;WHERE TO PUT IT
\r
577 MOVEI TAC1,177(TAC)
\r
579 TLO IOS,CHNGDR ;REMEMBER TO WRITE IT OUT
\r
581 ORM TAC1,DEVMOD(DEVDAT) ;DIR. IS NOW IN CORE
\r
582 FAKADV: TLZN IOS,DMPMOD ;DUMP MODE?
\r
583 PUSHJ PDP,ADVBFE ;ADVANCE BUFFERS
\r
585 TLZ IOS,NOLINK ;DIRECTORY BLOCK IS NOT LINKED
\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
592 PUSHJ PDP,COMCHK ;CHECK VALIDITY OF LIST
\r
593 JRST SVADER ;NG. GIVE ADRESS ERROR
\r
594 SKIPL TAC,@UUO ;OK. NULL LIST?
\r
595 JRST DMPTS1 ;YES. RETURN
\r
597 TRNE IOS,UDSD ;NO. NON-STD MODE?
\r
598 SOJA DAT,TOUSER ;YES. GO ELSEWHERE
\r
600 DMPST2: SOS UUO ;NO. SAVE START OF LIST (-1)
\r
601 MOVEM UUO,DMPLST(DEVDAT)
\r
604 DMPTS1: POP PDP,TAC
\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
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
617 ADDI TAC,(PROG) ;RELOCATE ADDRESS OF 1ST IOWD
\r
618 MOVEM TAC,PNTR ;AND SAVE IT
\r
619 MOVE TAC,[JSP 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
625 JRST CPOPJ1 ;READING - CONTINUE
\r
626 POP PDP,TAC ;WRITING - THIS WILL SAVE LOTS OF TIME
\r
629 \f;FILL OUTPUT BUFFER FROM LIST
\r
630 DMPFIL: MOVSI TAC1,-177
\r
633 SUB TAC1,ONEONE ;200 DATA WORDS IF NON-STANDARD
\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
647 HRRZM TAC1,BUF ;LIST RAN OUT SAVE WORD COUNT
\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
654 BLT TAC1,BUF+177 ;****TEST IF TOP OF BUFFER
\r
655 JRST OUFULL ;NOW WRITE BUFFER
\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
661 MOVEM TAC,SVDWRD(DEVDAT) ;NO. SAVE REMAINDER OF COMMAND
\r
662 DMPOVA: MOVEI TAC,177
\r
666 MOVEM TAC,BUF ;WD CNT =177
\r
667 JRST OUFULL ;GO WRITE PART OF STUFF
\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
680 ;END OF DUMP-MODE LIST
\r
681 NXTCM2: SETZM SVDWRD(DEVDAT) ;ZERO POINTERS
\r
682 SETZM DMPLST(DEVDAT)
\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
693 READBF: TLNN IOS,DMPMOD ;HAVE CONTROL IF DUMP-MODE
\r
694 PUSHJ PDP,GETDT ;GET DT CONTROL
\r
696 READBC: PUSHJ PDP,FNDBLK ;SEARCH FOR RIGHT BLOCK
\r
697 MOVE TAC1,[BLKI DTC,300] ;FOUND IT - START READING
\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
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
708 TLNN IOS,NOBUF ;POINTER ALREADY SET UP IF DIRECT IO
\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 REAF
\r
715 CONO PI,DCON ;TURN ON DC PI CHANNEL
\r
718 CONO DTC,(TAC) ;START TAPE MOVING
\r
721 POPJ PDP, ;DISMISS INTERRUPT
\r
724 ;HERE FOR ANY DATA WORD WITH TAPE IN REVERSE
\r
726 IOWD: BLKI DTC,PNTR ;READ (WRITE) A WORD
\r
727 JRST RVTHRU ;POINTER RAN OUT
\r
728 SOS PNTR ;POINTER HAS TO BACK UP
\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
735 ;HERE WHEN POINTER RUNS OUT FORWARD
\r
737 JSR SHUTDN ;SHUT DOWN DATA CONTROL
\r
738 JEN @DTATHR ;DISMISS
\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. TERN OFF DC
\r
746 CONO PI,DCOFF ;TURN OFF DC PI
\r
748 \f;COME HERE TO START READING BLOCK NUMBERS
\r
751 FNDBLK: HRRZM BLK,BLOCK ;BLOCK WE'RE LOOKING FOR
\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
760 MOVE TEM,[JSR DTATHR]
\r
762 TLNN IOS,NOBUF ;DCLOC1 ALREADY SET UP IF DIRECT IO
\r
764 MOVEM TEM,DCLOC1 ;FOR FORWARD DATA OPERATIONS
\r
765 CONSZ DTC,20000 ;IS TAPE ALREADY MOVING/
\r
767 TRO TAC,323200 ;NO, SET READ BLK NOS., START DELAY
\r
768 TLNN IOS,RVERSE ;MOVE TAPE BACKWARDS?
\r
770 FNDBL3: IFN CPBIT, <
\r
772 TLZ IOS,NOBUFC ;SET UP DIRCTN NON-0 IF DIRECT IO
\r
776 MOVEM IOS,DEVIOS(DEVDAT) ;RESTORE IOS IN CORE
\r
777 POPJ PDP, ;AND EXIT
\r
780 ;HERE TO INITIATE READ OF A TAPE THAT IS MOVING ALREADY
\r
781 FNDBL4: CONSZ DTC,10000 ;GOING BACKWARDS?
\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
787 MOVEM TAC,TEMP ;SAVE TAC
\r
788 DATAI DTC,TAC ;NO. READ A BLOCK NUMBER
\r
789 SUB TAC,BLOCK ;;PRESENT BLOCK - TARGET BLOCK
\r
791 SKIPE DIRCTN ;IF DIRECT IO
\r
792 CONSO DTC,10000 ;MUST READ DATA FORWARD
\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
807 ;HERE WHERE DUMP-MODE POINTER RUNS OUT
\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
816 MOVEM TAC,PNTR ;NEW POINTER
\r
817 DMPAV2: MOVE TAC,TEMP ;RESTORE TAC
\r
821 DMPAV3: JSR SHUTDN ;SHUT DOWN TAPE
\r
822 JRST DMPAV2 ;RESTORE TAC AND EXIT THE INTERRUPT
\r
825 \f;HERE WHEN CORRECT BLOCK NUMBER IS FOUND
\r
826 FOUND: CONSZ DTC,10000 ;GOING FORWARD?
\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
836 IORVRS: MOVEI TAC,10000 ;SET IO FOR REVERSE
\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
842 \f;INTERRUPT HERE FOR FLAG CHANNEL
\r
843 DTCINT: CONSO DTS,37 ;INTERRUPT FOR DECTAPE?
\r
844 JRST . ;NO, GO AWAY
\r
845 CONSZ DTS,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
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
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
865 LDB TAC,[POINT 10,BUF,27] ;GET 1ST BLOCK NO. IF READ
\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
874 \fEXTERN JBTSTS,PJOBN
\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
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 ;IF NON-STD
\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
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
906 \f;HERE WHEN TAPE IS DONE
\r
907 THRUTP: CONSO DTC,200000 ;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
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 DTREQ ;GIVE UP DATA CONTROL (DECTAPE CONTROL
\r
915 SETOM DTAVAL ;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
919 THRUTD: PUSHJ PDP,THRUTA ;GIVE UP DATA CONTROL
\r
920 SOSL DTREQ ;GIVE UP DECTAPE CONTROL
\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
926 POPJ PDP, ;AND LEAVE
\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
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
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
960 JEN @DTCCHL ;AND LEAVE
\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
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
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
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
987 SUB TAC1,ONEONE ;SET UP TAC1 WITH COUNT
\r
990 JRST SVDMIN ;INPUT FILE
\r
991 HRRZ BLK,OBLK(DEVDAT) ;OUTPUT FILE, NEXT BLOCK
\r
992 JUMPE BLK,DMPTHA ;LAST BLOCK
\r
994 TRNE IOS,UDSD ;IF NON-STD MODE
\r
995 AOSA OBLK(DEVDAT) ;WRITE CONSECUTIVE BLOCKS
\r
997 CAIG BLK,TOPBLK ;NOT LAST. LEGAL BLOCK NUMBER?
\r
998 POPJ PDP, ;YES. RETURN
\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
1008 ;HERE ON END SAVE MODE INPUT BLOCK
\r
1009 SVDMIN: HLRZ BLK,BUF ;NEXT BLOCK NUMBER
\r
1011 TRNE IOS,UDSD ;NON-STANDARD?
\r
1012 AOSA BLK,IBLK(DEVDAT) ;YES, READ CONSECUTIVE BLOCKS
\r
1014 HRRM BLK,IBLK(DEVDAT) ;SAVE IN DDB
\r
1019 ;HERE WHEN THROUGH DUMP-MODE DIRECTLY TO USER
\r
1020 USDMTH: MOVEI TAC1,IBLK(DEVDAT)
\r
1022 MOVEI TAC1,OBLK(DEVDAT) ;SET TAC1 TO RIGHT BLOCK NUMBER
\r
1023 MOVE TAC,BLKCNT ;UPDATE BLOCK COUNTER
\r
1025 JRST DMPTHA ;THROUGH
\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
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
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
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
1059 ;COME HERE ON ERROR
\r
1060 ERRS: AOS TAC,ERRCNT ;BUMP COUNT
\r
1062 MOVE TAC1,SVPNTR ;YES. RESET POINTERS
\r
1064 MOVE TAC1,(TAC1) ;RESET PNTR
\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
1074 PERMER: CONSZ DTS,10
\r
1075 TRO IOS,IODTER ;PARITY
\r
1078 TRO IOS,IODERR ;MISSING DATA
\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
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,DVDIRIN ;CLEAR DIRECTORY IN CORE BIT
\r
1091 ANDCAM TAC,DEVMOD(DEVDAT)
\r
1092 BDDIR: LDB ITEM,PJOBN ;NUMBER OF OFFENDING JOB
\r
1093 JRST BADDIR ;GO PRINT ERROR MESSAGE
\r
1094 \fBFPNTR: IOWD 200,BUF+1
\r