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