1 TITLE MTASRX - MAGTAPE ROUTINES FOR PDP-10(TM-10) V420
\r
2 SUBTTL T. WACHS/TH TS 20 MAY 69
\r
3 XP VMTASR,420 ;DEFINE VERSION NUMBER FOR LOADER STORAGE MAP
\r
13 JRST HUNGTP ;HUNG DEVICE
\r
14 MTADSP: JRST MTAREL ;RELEASE
\r
26 POPJ PDP, ;CLOSE INPUT
\r
34 ;MTACHN=FLAG CHANNEL
\r
35 ;MTOCHN=DATA CHANNEL
\r
36 ;MTFLAG=10*MTACHN + 400
\r
37 ;MTBOTH=10*MTACHN+MTDCHN
\r
38 ;MTALOC=40 + 2*MTDCHN
\r
40 INTERN MTAINT,MTADDS,MTADDB
\r
41 EXTERN ADVBFE,ADVBFF,MTFLAG,MTBOTH,SETACT,CLRACT,WSYNC
\r
42 EXTERN STDENS,SETIOD,MTREQ,MTAVAL,CLOCK,MTALOC,MTLOC1,OUT
\r
43 EXTERN CPOPJ,CPOPJ1,PIOMOD,PUNIT,MTWAIT,JIFSC2,COMCHK
\r
44 EXTERN PIOFF,PION,MTASAV,ADRERR,PDVCNT,MTSIZ,STOIOS,IADRCK
\r
46 COMPAT=10000 ;IBM COMPATABLE 9-TRACK
\r
47 DMPMOD=200000 ;DUMP MODE FLAG
\r
48 MTREW=400000 ;MAGTAPE IS REWINDING
\r
50 MTTRY=3 ;NO. OF TIMES TO RETRY ON AN ERROR
\r
51 QUANT=3 ;NO. OF RECORDS TO READ UNINTERRUPTED
\r
54 MTADDB: SIXBIT /MTA0/
\r
55 XWD ^D30*HUNGST,MTSIZ+1
\r
63 XP MTADDS,.-MTADDB ;SIZE OF DDB (FOR BUILD)
\r
65 MTAINI: SETOM NMTREW ;RESET FLAGS
\r
69 CONO MTC,0 ;TURN OFF MTC
\r
70 MOVE TAC,[JSR MTDEND] ;SET UP END-CONDITION
\r
71 MOVEM TAC,MTLOC1 ;FOR BLKI/BLKO
\r
74 ;IF ENTER OR LOOKUP IN SAVE MODE - CHANGE TO MODE 16
\r
75 SAVCHK: LDB TAC,PIOMOD ;GET MODE
\r
76 CAIN TAC,2 ;SAVE MODE?
\r
77 TRO IOS,16 ;YES, CHANGE TO DUMP-MODE
\r
78 MOVEM IOS,DEVIOS(DEVDAT)
\r
79 JRST CPOPJ1 ;GIVE GOOD RETURN FROM LOOKUP/ENTER
\r
81 MTCLOS: TLNN DEVDAT,OUTPB ;OUTPUT BEEN DONE?
\r
82 POPJ PDP, ;NO. GO AWAY
\r
84 CAIGE TAC,16 ;DUMP MODE?
\r
85 PUSHJ PDP,OUT ;NO. EMPTY LAST PARTIAL BUFFER
\r
86 PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP
\r
87 MOVEI UUO,3 ;WRITE 2 ENDS-OF FILE
\r
89 TRNE IOS,IOIMPM ;WRITE LOCK?
\r
90 POPJ PDP, ;YES RETURN
\r
97 MOVEI UUO,7 ;AND BACKSPACE OVER ONE OF THEM
\r
100 HUNGTP: TLZN IOS,MTREW ;TAPE REWINDING?
\r
101 JRST THRUTP ;NO. GIVE UP CONTROL
\r
102 SOS NMTREW ;YES. DECREASE COUNT OF TAPES IN REW
\r
103 AOS MTREQ ;THRUTP WILL SOS THIS BACK
\r
104 JRST THRUTP ;TURN OFF TM10
\r
105 \f;CONNECT CONTROL TO A TRANSPORT
\r
106 CONECT: MOVEI TAC,440102 ;SET UP INTERRUPT CONDITIONS
\r
108 HRRM DEVDAT,USEWRD ;SAVE DEVDAT FOR INTERRUPT
\r
109 LDB TP,PUNIT ;GET UNIT
\r
110 CAMN TP,UNIT ;ALREADY CONNECTED TO IT?
\r
112 LSH TP,17 ;NO. SET FOR CONO
\r
113 CONSZ MTS,2 ;CONTROL FREE?
\r
114 JRST ONECT2 ;YES. DO A NO-OP CONO
\r
115 TRO TP,MTFLAG ;NO. SET CONTROL FREE ENABLE
\r
116 TLNN IOS,MTREW ;CONNECTING TO A REWINDING TAPE?
\r
117 PUSHJ PDP,ONECT4 ;NO.CHANGE RETURN
\r
118 ONECT2: HRLM TP,USEWRD ;MIGHT NEED ON INTERRUPT LEVEL
\r
119 CONO MTC,(TP) ;CONO TO MTC
\r
120 LSH TP,3 ;SAVE UNIT
\r
122 ONECT3: JUMPGE IOS,WSYNC ;WAIT FOR DEV TO FREE IF NOT REWINDING
\r
123 TRNN TP,4000 ;REWINDING, CONTROL FREE ENABLE?
\r
124 AOS (PDP) ;NO. SKIP RETURN
\r
125 POPJ PDP, ;YES. IMMEDIATE RETURN
\r
126 ONECT4: MOVEI TAC,TPREDY ;SET DEVICE ACTIVE
\r
127 HRRM TAC,-1(PDP) ;AGAIN WHEN INACTIVE
\r
128 JRST SETACT ;SET DEVICE ACTIVE
\r
131 ;DELAY TILL TAPE COMES OUT OF IO WAIT, THEN GET CONTROL
\r
132 DLYRDY: SETOM MTAVAL
\r
133 PUSHJ PDP,WSYNC ;WAIT FOR IO TO STOP
\r
136 ;GET MTC, CONNECT TAPE TO CONTROL
\r
137 TPREDY: AOSE MTREQ ;GET CONTROL
\r
138 PUSHJ PDP,MTWAIT ;WAIT FOR IT
\r
139 MOVEI TAC,QUANT ;SET QUANTUM TIME
\r
141 TPRDY2: MOVEM PROG,USEPRG
\r
142 PUSHJ PDP,CONECT ;CONECT CONTROL TO TAPE
\r
145 ;SET TP FOR THIS TAPE
\r
146 TPSET: LDB TP,[POINT 2,IOS,28] ;PARITY
\r
147 SKIPN TP ;USE STANDARD IF 0
\r
148 MOVEI TP,STDENS ;NOT SPECIFIED, USE STANDARD FOR SYS.
\r
149 SOS TP ;SET TO USER'S REQUEST
\r
151 TRNN IOS,IOPAR ;PARITY
\r
153 MOVE TAC1,UNIT ;UNIT
\r
154 DPB TAC1,[POINT 3,TP,20] ;INTO COMMAND
\r
155 TRO TP,MTBOTH ;PI CHANNELS
\r
156 MOVEI TAC,MTTRY ;SET ERROR COUNT
\r
158 CONSZ MTS,4 ;7 OR 9 TRACK?
\r
159 JRST RDYCHK ;7 TRACK
\r
160 TLNN IOS,COMPAT ;9 TRACK. CORE DUMP?
\r
162 TRO TP,40300 ;NO. SET 800 BPI, ODD PARITY
\r
163 \f;MAKE SURE TAPE IS READY
\r
164 RDYCHK: CONSZ MTS,40 ;READY?
\r
166 CONSO MTS,200000 ;REWINDING?
\r
167 POPJ PDP, ;NO. LET XPORT HUNG INTERRUPT HANDLE IT
\r
169 TLO IOS,MTREW ;YES. MUST BE REWINDING
\r
170 PUSHJ PDP,SETACT ;DEVICE ACTIVE
\r
171 AOS NMTREW ;BUMP COUNT OF REWINDING DRIVES
\r
172 SOSL MTREQ ;LET SOMEONE ELSE USE TAPES
\r
173 JRST DLYRDY ;NOONE ELSE WANTS CONTROL
\r
174 PUSHJ PDP,CLOKRQ ;PUT IN A TIME REQUEST
\r
175 JRST DLYRDY+1 ;AND WAIT
\r
176 \fMTCLOK: XWD .+1,JIFSC2
\r
177 SETZM CLKREQ ;INDICATE NO CLOCK REQUEST IN NOW
\r
178 SKIPL MTREQ ;CONTROL FREF?
\r
179 POPJ PDP, ;NO. COME BACK LATER
\r
180 MTCLK2: SETOM NMTREW ;COUNT NO. OF TAPES REWINDING
\r
181 MOVEM DEVDAT,SAVDEV
\r
182 MOVEI DEVDAT,MTADDB ;START AT MTA0
\r
183 AOS MTREQ ;MAKE SURE NO OTHER MTA REQUESTS ARE HONORED NOW
\r
184 REWCHK: MOVE IOS,DEVIOS(DEVDAT)
\r
185 JUMPGE IOS,REWCK2 ;TAPE NOT REWINDING
\r
186 PUSHJ PDP,CONECT ;REWINDING - CONECT TO IT
\r
187 POPJ PDP, ;CONTROL NOT FREE NOW - RETURN ON INTERRUPT LEVEL
\r
188 REWCKA: CONSO MTS,40 ;STILL REWINDING?
\r
190 TLZE IOS,IOW ;NO, TAKE OUT OF IO WAIT
\r
193 PUSHJ PDP,CLRACT ;NO LONGER ACTIVE
\r
195 REWCK1: AOS NMTREW ;COUNT REWINDING TAPE
\r
197 CONSZ MTS,200000 ;IF TAPE IS STILL REWINDING
\r
198 DPB TAC,PDVCNT ;MAKE SURE IT DOESN'T GET A HUNG DEVICE
\r
199 REWCK2: HLRZ DEVDAT,DEVSER(DEVDAT) ;NEXT DEVICE
\r
200 HLRZ TAC,DEVNAM(DEVDAT) ;A MAG TAPE?
\r
201 CAIN TAC,(SIXBIT .MTA.)
\r
202 JRST REWCHK ;YES. CHECK IT
\r
203 MOVE DEVDAT,SAVDEV ;PICK UP DEVDAT AGAIN
\r
204 SOSL MTREQ ;FREE MTASER AGAIN
\r
205 SETOM MTAVAL ;SOMEONE WAITING FOR CONTROL
\r
206 SKIPGE NMTREW ;ANY TAPE REWINDING?
\r
209 CLOKRQ: MOVE TAC,MTCLOK ;PUT A CLOCK REQUEST IN
\r
210 CONO PI,PIOFF ;HAVE MONITOR WAKE UP
\r
211 SKIPL CLKREQ ;IF NO CLOCK REQUEST IN ASK TO WAKE UP
\r
212 IDPB TAC,CLOCK ;IN HALF A SECOND
\r
213 SETOM CLKREQ ;NOW WE HAVE ONE
\r
216 SAVDEV: 0 ;TEMPORARY STORAGE FOR DEVDAT
\r
218 MTAP0: TRNE UUO,100 ;SETTING 7 TRACK MODE?
\r
221 MTAP: TRZ IOS,776000 ;TURN OFF ERROR BITS
\r
222 MOVEM IOS,DEVIOS(DEVDAT) ;SAVE IOS
\r
223 MTAP1: PUSHJ PDP,TPREDY ;GET CONTROL FOR THIS TAPE
\r
224 MTAP3: TRZ TP,7 ;NO DATA TRANSFER
\r
225 ANDI UUO,17 ;GET FUNCTION
\r
226 ROT UUO,-1 ;TRANSLATE FROM TABLE
\r
228 SKIPA TAC,MTPTBL(UUO)
\r
229 HLRZ TAC,MTPTBL(UUO)
\r
230 TRZE TAC,100 ;MOVE TAPE BACKWORD?
\r
231 CONSO MTS,100000 ;YES, TAPE AT LOAD POINT?
\r
232 TRNN TAC,-1 ;OR NO-OP?
\r
233 JRST THRUTA ;YES, GO CHECK FOR BOT
\r
234 TRZE TAC,200 ;SKIP TO LOGICAL EOT?
\r
236 TRZN TAC,400 ;TRY TO WRITE TAPE?
\r
238 CONSZ MTS,10 ;YES. WRITE LOCKED?
\r
239 JRST ILLOP ;YES. LIGHT ERROR BIT
\r
240 MTAGO: DPB TAC,[POINT 4,TP,26] ;PUT FUNCTION INTO COMMAND
\r
241 HRLM TP,USEWRD ;SAVE COMMAND
\r
242 CONO MTC,(TP) ;START TAPE MOVING
\r
243 JRST CLRACT ;AND RETURN
\r
248 TLOA IOS,COMPAT ;SET IBM COMPAT.
\r
249 MTAREL: TLZ IOS,COMPAT ;NOT IBM COMPAT
\r
251 ;SKIP TO LOGICAL EOT
\r
252 LEOT: CONSZ MTS,100000 ;TAPE AT BOT?
\r
253 JRST LEOT2 ;YES, DONT BACKSPACE
\r
254 PUSHJ PDP,MTAGO ;BACKSPACE RECORD
\r
255 PUSHJ PDP,EOTWT ;WAIT FOR IT
\r
256 LEOT2: MOVEI UUO,16 ;SKIP A FILE
\r
258 MOVEI UUO,6 ;SKIP A RECORD
\r
260 PUSHJ PDP,EOTWT ;WAIT FOR IT
\r
261 MOVE IOS,DEVIOS(DEVDAT)
\r
262 TRNN IOS,IODEND ;END OF FILE SEEN?
\r
263 JRST LEOT2 ;NO. SKIP TO NEXT FILE
\r
264 MOVEI UUO,7 ;YES. BACKSPACE RECORD
\r
266 MTAP2: PUSHJ PDP,TPRDY2
\r
268 ;WAIT FOR TAPE TO FINISH. MTREQ WILL COUNT DOWN AT END OF OPERATION
\r
270 PUSHJ PDP,MTWAIT ;WAIT TILL MTREQ IS COUNTED DOWN
\r
272 \fMTPTBL: XWD 101,0 ;REW,NOP
\r
273 XWD 405,0 ;WRITE EOF.
\r
275 XWD 107,6 ;BACKSPACE REC,SKIP REC
\r
276 XWD 111,207 ;REW,UNLOAD,LOG EOT
\r
277 XWD 415,0 ;WRITE BLANK TAPE,
\r
279 XWD 117,16 ;BACK FILE,SKIP FILE
\r
281 MTOUT: PUSHJ PDP,TPREDY ;GET CONTROL SETUP TP
\r
282 CONSZ MTS,10 ;WRITE LOCK?
\r
283 JRST ILLOP ;YES, SET IOIMPM AND RETURN
\r
284 CONSZ MTS,4000 ;EOT?
\r
285 TROA IOS,IOTEND+IOBKTL ;YES. LIGHT BIT
\r
286 TLOA IOS,IO ;NO. INDICATE OUTPUT
\r
287 JRST ADVOUT ;DONE IF EOT
\r
288 MTOUT1: MOVEI TAC,@DEVOAD(DEVDAT) ;ADDRESS OF BUFFER
\r
289 MOVN TAC1,1(TAC) ;-WORD COUNT
\r
290 HRL TAC,TAC1 ;IN LH OF COMMAND
\r
291 AOJG TAC,ADVOUT ;SKIP IF 0 WORDS
\r
292 MTOUT2: TRO TP,4000 ;FUNCTION = WRITE
\r
293 MOVSI TAC1,(BLKO MTC,) ;SETUP BLKO
\r
294 MTDTGO: MOVEM TAC,PNTR ;SAVE BLKI/BLKO POINTER
\r
296 HRRI TAC1,PNTR ;BLKI/BLKO PNTR
\r
297 MOVEM TAC1,MTALOC ;INTO INTERRUPT LOC
\r
298 HRLM TP,USEWRD ;SAVE COMMAND
\r
299 CONO MTC,(TP) ;START TAPE MOVING
\r
300 TRO IOS,IOACT ;SETACT CLEARS IOW
\r
301 JRST STOIOS ;STORE IOS AND RETURN
\r
304 MTIN: PUSHJ PDP,TPREDY ;SETUP TP FOR THIS DRIVE
\r
306 MTIN1: SETCM TAC,@DEVIAD(DEVDAT) ;-LARGEST POSSIBLE WRD CNT
\r
307 HRRI TAC,@DEVIAD(DEVDAT) ;STARTING ADDRESS
\r
308 ADD TAC,[XWD 2,1] ;MAKE REAL IOWD
\r
309 MTIN2: TRO TP,2000 ;FUNCTION = READ
\r
310 MOVSI TAC1,(BLKI MTC,) ;SETUP BLKI
\r
311 JRST MTDTGO ;GO START TAPE
\r
313 \fMTAINT: CONSO MTS,440102 ;INTERRUPT FOR MAG TAPE?
\r
314 JRST . ;NO. GO AWAY
\r
315 CONSO MTC,400 ;HAS CONTROL FREE ENABLED?
\r
316 CONSZ MTS,440100 ;NO. CONTROL FREE ERRONEOUSLY ON?
\r
317 JRST .+2 ;REAL MTA INTERRUPT
\r
318 JRST MTAINT+1 ;THIS INTERRUPT NOT REALLY FOR MTA
\r
319 JSR MTASAV ;YES. SAVE ACS
\r
320 HRRZ DEVDAT,USEWRD ;RESET DEVDAT
\r
321 MOVE IOS,DEVIOS(DEVDAT) ;AND IOS
\r
322 JUMPL IOS,REWCKA ;CNTRL FREE INTERRUPT ON A REW TAPE
\r
324 SKIPE TAC,ERRFLG ;BACKSPACE FROM ERROR?
\r
325 JRST TRYAGN ;YES. REISSUE COMMAND
\r
326 CONSZ MTS,440000 ;ERROR?
\r
327 JRST ERROR ;YES. ILLEGAL OP OR HUNG DEVICE
\r
328 CONSZ MTC,7 ;DATA OPERATION?
\r
330 LDB TP,[POINT 4,USEWRD,8] ;GET FUNCTION
\r
331 CAIN TP,6 ;SKIPPING A RECORD?
\r
332 CONSO MTS,10000 ;YES. SEEN AN EOF?
\r
334 TRO IOS,IODEND ;YES. TURN ON EOF BIT
\r
335 THRUTA: CONSZ MTS,300000 ;NO. BOT OR REWINDING?
\r
336 TROA IOS,IOBOT ;YES. SET BOT BIT FOR USER TO SEE
\r
337 TRZ IOS,IOBOT ;NO. TURN OFF BOT BIT
\r
338 THRUTP: CONSZ MTS,4000 ;NO. EOT?
\r
339 TRO IOS,IOTEND ;YES
\r
340 TLZE IOS,IOW ;JOB IN IO WAIT?
\r
341 PUSHJ PDP,SETIOD ;YES. TAKE IT OUT
\r
344 ;CONTROL FREE INTERRUPT?
\r
345 ;YES. DONT COUNT DOWN MTREQ
\r
346 SOSGE MTREQ ;COUNT DOWN REQUEST COUNT
\r
347 JRST THRUT2 ;NOONE ELSE WAITING
\r
348 SKIPL NMTREW ;IF THERE ARE TAPES REWINDING
\r
349 SKIPE CLKREQ ;WHICH HAVEN'T BEEN CHECKED IN
\r
350 SKIPA ;MORE THAN 1/2 A SECOND
\r
351 JRST MTCLK2 ;GO CHECK THEM NOW
\r
352 SETOM MTAVAL ;SOMEONE ELSE WANTS IT
\r
353 JRST THRUT3 ;DISMISS INTERRUPT AND RETURN
\r
354 \f;HERE CONTROL IS ALL DONE. CHECK ON REWINDING TAPES IF NEEDED
\r
355 THRUT2: SKIPL NMTREW ;ANY DRIVES REWINDING?
\r
356 JRST MTCLK2 ;YES. CHECK IF ANY THROUGH
\r
357 THRUT3: HLRZ TP,USEWRD ;GET UNIT
\r
358 TRZ TP,17777 ;MASK OUT FUNCTION
\r
359 CONO MTC,(TP) ;DISMISS INTERRUPT
\r
360 HLLZS MTAINT ;DONT LOOK AT ANY MORE INTERRUPTS
\r
361 POPJ PDP, ;AND EXIT
\r
364 ;HERE WHEN BLKI/BLKO COUNTS DOWN TO ZERO
\r
366 CONO MTS,1 ;GIVE A FUNCTION STOP
\r
367 JEN @MTDEND ;AND EXIT
\r
368 \fDATEND: CONSZ MTS,20600 ;RECORD OK?
\r
369 JRST RETRY ;PARITY, DATA LATE OR BAD TAPE
\r
370 DATND2: TLNE IOS,DMPMOD ;DUMP MODE?
\r
372 TLNN IOS,IO ;READING?
\r
373 JRST INPTND ;YES, FINISH INPUT
\r
374 ADVOUT: PUSHJ PDP,ADVBFE ;WRITING, ADVANCE BUFFERS
\r
376 JRST THRUTP ;YES, DONT WRITE ANY MORE
\r
377 NXTREC: TLZE IOS,IOW ;IN IO WAIT?
\r
378 PUSHJ PDP,SETIOD ;RESTART JOB
\r
379 SOSG QUANTM ;COUNT DOWN PROTECT TIME
\r
380 SKIPG MTREQ ;ANYONE ELSE WANT CONTROL?
\r
381 CONSZ MTS,4000 ;NO. KEEP GOING UNLESS EOT
\r
382 JRST THRUTP ;YES, GIVE UP CONTROL
\r
383 MOVNI TAC,MTTRY ;RESET ERROR COUNT
\r
385 HLRZ TP,USEWRD ;PICK UP COMMAND
\r
386 TLNE IOS,IO ;AND DO NEXT RECORD
\r
388 HLRZ TAC,@DEVIAD(DEVDAT) ;PICK MAX. SIZE OF BUFFER
\r
389 ADDI TAC,@DEVIAD(DEVDAT) ;AND IN FIRST ADDRESS
\r
390 PUSHJ PDP,IADRCK ;CHECK IT'S O.K.
\r
391 JRST THRUTP ;NO - RELEASE CONTROL
\r
392 JRST MTIN1 ;O.K. DO NEXT INPUT.
\r
394 ;HERE WHEN THROUGH AN INPUT RECORD
\r
395 INPTND: CONSZ MTS,10000 ;EOF?
\r
397 MOVEI TAC,@DEVIAD(DEVDAT) ;START OF RECORD
\r
398 HRRZ TAC1,PNTR ;WHERE WE ARE NOW
\r
399 SUBI TAC1,1(TAC) ;LAST LOC-FIRST LOC
\r
400 HRRM TAC1,1(TAC) ;=WORD COUNT
\r
401 PUSHJ PDP,ADVBFF ;ADVANCE BUFFERS
\r
402 JRST THRUTP ;NONE FREE
\r
403 JRST NXTREC ;CONTINUE WITH NEXT RECORD
\r
406 ; HERE AT THE END OF A DUMP MODE RECORD
\r
407 DMPEND: HLRZ TP,USEWRD ;SET UP COMMAND AGAIN
\r
408 CONSO MTS,14000 ;EOF OR EOT?
\r
409 JRST DMPBLK ;NO,GET NEXT COMMAND
\r
410 CONSO MTS,4000 ;EOF?
\r
411 TRO IOS,IODEND ;YES,SET EOF BIT
\r
412 JRST THRUTP ;AND RETURN TO USER
\r
413 \fMTDMPO: TLOA IOS,IO ;DUMP OUTPUT
\r
414 MTDMPI: TLZ IOS,IO ;DUMP INPUT
\r
416 PUSHJ PDP,COMCHK ;CHECK VALIDIT OF LIST
\r
417 JRST ADRERR ;NOT VALID
\r
418 PUSH PDP,IOS ;WSYNC WILL CLOBBER IOS
\r
419 PUSHJ PDP,TPREDY ;GET CONTROL, SETUP TP
\r
421 TLNE IOS,IO ;CHECK WRITE LOCK
\r
422 CONSO MTS,4010 ;AND EOT IF WRITING
\r
424 CONSO MTS,4000 ;ERROR
\r
425 TROA IOS,IOIMPM ;WRITE LOCK
\r
426 TRO IOS,IOTEND+IOBKTL ;EOT
\r
427 JRST THRUTP ;GIVE UP TAPE AND RETURN
\r
428 MTDMP2: TLO IOS,DMPMOD ;INDICATE DUMP-MODE
\r
429 SOS UUO ;WILL COUNT IT UP LATER
\r
430 MOVEM UUO,LSTLOC ;SAVE LOC OF LIST
\r
431 DMPBLK: PUSHJ PDP,NXTCOM ;GET NEXT COMMAND
\r
432 ADDI TAC,(PROG) ;ADD RELOCATION FACTOR
\r
433 TLNE IOS,IO ;WRITING?
\r
434 JRST MTOUT2 ;YES. GO WRITE RECORD
\r
436 TRO TP,10000 ;OR - READ ACROSS RECORD BOUNDARIES
\r
437 JRST MTIN2 ;GO READ RECORD(S)
\r
439 NXTCOM: SKIPE TAC,REMNDR ;PARTIAL IOWD LEFT TO DO?
\r
440 JRST NXTCM3 ;YES, CONTINUE WITH IT
\r
441 AOSA TAC,LSTLOC ;GET NEXT COMMAND LOC
\r
443 MOVE TAC,@TAC ;PICK UP COMMAND
\r
444 JUMPL TAC,NXTCM2 ;REAL COMMAND
\r
445 JUMPG TAC,NXTCOM+1 ;GO-TO-WORD
\r
446 POP PDP,TAC ;0 - THROUGH
\r
449 EXTERN MMTSIZ ;-MTSIZ
\r
450 NXTCM2: TLNE IOS,IO ;WRITING?
\r
451 TRNE IOS,1 ;YES, MODE 16?
\r
452 POPJ PDP, ;NO. USE IOWD AS OBTAINED
\r
453 NXTCM3: HLRE TAC1,TAC ;YES. GET WORDCOUNT
\r
455 CAML TAC1,MTSZ ;RECORD TOO LARGE?
\r
456 POPJ PDP, ;NO, GO WRITE
\r
457 ADD TAC,[XWD MTSIZ,MTSIZ] ;YES.
\r
458 MOVEM TAC,REMNDR ;IOWD TO USE FOR NEXT RECORD
\r
459 SUBI TAC,MTSIZ ;ADDRESS FOR THIS IOWD
\r
460 HRLI TAC,MMTSIZ ;WRITE -MTSIZE WORD RECORDS
\r
461 POPJ PDP, ;RETURN THE IOWD
\r
463 MTSZ: XWD -1,MMTSIZ ;NEG. OF RECORD SIZE IN WORDS
\r
464 \fMTHUNG: PUSHJ PDP,THRUT3 ;TURN OFF ERROR PI BIT
\r
465 PUSHJ PDP,SETACT ;TURN ON IOACT
\r
466 MOVEI TAC,1 ;SET HUNG-TIME TO 1 MORE TICK
\r
467 DPB TAC,PDVCNT ;SET HUNG TIME
\r
468 POPJ PDP, ;AND EXIT
\r
471 ERROR: CONSZ MTS,400000 ;HUNG DEVICE?
\r
474 ;ILLEGAL OP INTERRUPT
\r
475 TRNN IOS,IOACT ;DATA OPERATION?
\r
476 JRST ILLOP ;NO. LIGHT ERROR BIT, GIVE UP CONTROL
\r
477 TRO IOS,IOIMPM ;YES. LIGHT IOIMPM
\r
478 MOVEM IOS,DEVIOS(DEVDAT) ;SINCE DEVICE IS STILL ACTIVE
\r
479 JRST THRUT2 ;COUNT DOWN MTRWQ ON HUNG CALL
\r
481 ILLOP: TROA IOS,IOIMPM
\r
482 DATEOF: TLO IOS,IOEND ;EOF - LIGHT BIT
\r
483 JRST THRUTP ;AND GIVE UP CONTROL
\r
485 ;TRY AGAIN ON PARITY ERROR OR BAD TAPE
\r
486 RETRY: TRNN IOS,IONRCK ;WANT TO STOP ON ERROR?
\r
487 AOSL TAC,ERCNT ;OR TRIED ENOUGH?
\r
488 JRST PERMER ;YES. PERMANENT ERROR
\r
489 RETRY1: MOVEI TAC,2 ;SET RETRY SWITCH
\r
491 RETRY2: HLRZ TP,USEWRD ;PICK UP COMMAND
\r
492 ANDI TP,760770 ;SET FOR BACKSPACE
\r
493 CONO MTC,7000(TP) ;BACKSPACE RECORD
\r
494 POPJ PDP, ;AND GO AWAY
\r
496 ;COME HERE AFTER BACKSPACE IS THROUGH
\r
497 TRYAGN: SOJLE TAC,TRYSKP ;GO IF NOT 2ND BACKSPACE
\r
498 CONSO MTS,100000 ;BOT?
\r
499 JRST RETRY2-1 ;NO. BACKSPACE AGAIN
\r
500 TRYNXT: ;READ RECORD AGAIN
\r
501 MOVE TAC,SVPNTR ;RESET POINTER
\r
503 HRLZ TP,USEWRD ;GET COMMMAND
\r
504 CONO MTC,(TP) ;EXECUTE IT AGAIN
\r
506 POPJ PDP, ;AND GO AWAY
\r
508 ;HERE AFTER 2ND BACKSPACE OR SKIP AFTER ERROR
\r
509 TRYSKP: JUMPL TAC,TRYNXT ;AFTER FORWARD SKIP IF NEGATIVE
\r
510 HLRZ TP,USEWRD ;AFTER 2ND BACKSPACE - SKIPA RECORD
\r
512 CONO MTC,6000(TP) ;SKIP A RECORD
\r
513 SETOM ERRFLG ;INDICATE FORWARD SKIP
\r
514 POPJ PDP, ;AND GO AWAY
\r
515 \fPERMER: TLNE IOS,IO ;READING?
\r
516 TRNE IOS,IONRCK ;NO RECOVERY WANTED?
\r
517 JRST SETIOS ;REALLY PERMANENT
\r
518 CAILE TAC,100 ;TRIED TO REWRITE 100 TIMES
\r
519 JRST SETIOS ;YES. REALLY PERMANENT
\r
520 JUMPG TAC,RETRY2 ;TRY WRITING WITH 3 INCHES OF
\r
521 MOVSI TAC,10000 ;BLANK TAPE TO ERASE BAD SPOT
\r
522 ORM TAC,USEWRD ;SET COMMAND TO 14 (FROM 4)
\r
523 JRST RETRY1 ;AND TRY AGAIN
\r
525 SETIOS: CONSZ MTS,400 ;DATA MISSED OR BAD TAPE?
\r
526 TRO IOS,IODERR ;YES
\r
527 CONSZ MTS,20200 ;PARITY ERROR?
\r
528 TRO IOS,IODTER ;YES
\r
529 JRST DATND2 ;SAVE ERROR WORD AND GO AWAY
\r