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