TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 TABLE OF CONTENTS 1- 2 INTRODUCTION 2- 62 CSI & FCS DATA & BUFFERS 3- 113 HELP MESSAGE & TEXT 4- 149 TAPE / DISK DATA & TABLES 6- 229 PARSE INPUT SPECIFICATION & CHOOSE ACTION 9- 394 WAIT CODE & ERROR PROCESSING 10- 434 TAPE TO DISK OPERATIONS 11- 494 TAPEIN - TAPE INPUT AST 12- 537 DSKOUT - DISK OUTPUT AST 13- 561 TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 14- 709 DISK TO TAPE OPERATIONS 15- 768 DSKIN - DISK INPUT AST ROUTINE 16- 798 TAPOUT - TAPE OUTPUT I/O DONE AST ROUTINE 17- 823 DKTPDQ - DISK TO TAPE DEQUEUE ROUTINE 18- 925 --SUBROUTINES-- 18- 926 NODADD - ADD NODE TO DEQUE 18- 945 NODDEL - DELETE NODE FROM DEQUE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 1 1 .TITLE TPC - DOS11 TAPE/DISK COPY UTILITY 2 .SBTTL INTRODUCTION 3 .IDENT /V01.1/ 4 .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2,CSI$SW,CSI$ND,DIR$,PUT$ 5 .MCALL FDBDF$,FDAT$R,NMBLK$,WTSE$S,GET$,EXIT$S 6 .MCALL QIOW$,OFNB$,CSI$SV,FSRSZ$ 7 .MCALL QIOW$S,ASTX$S,FDOP$R,QIO$S,CLEF$S,SETF$S 8 .NLIST BEX 9 ;+ 10 ; VERSION 01 11 ; 12 ; REID L BROWN 27-OCT-77 13 ; 14 ; MODIFIED BY: 15 ; 16 ; G H COHEN, 21-AUG-78 17 ; INSERT A DEFAULT VALUE FOR FILE ALLOCATION SIZE 18 ; USE .TRNCL IN PLACE OF .CLOSE 19 ; PROVIDE A MEANS FOR FILE EXTENSION 20 ; ATTACH TO MAGTAPE UNIT AND SET DENSITY TO 800BPI 21 ; 22 ; 23 ; THIS ROUTINE WILL PRESERVE A DOS-11 MAGTAPE IN IMAGE FORMAT ON DISK, OR 24 ; RESTORE AN IMAGE FORMAT FILE FROM DISK TO MAGTAPE. ITS UTILITY IS ITS 25 ; ABILITY TO DRIVE THE MAGTAPE DRIVE AT FULL SPEED. THIS FEATURE IS USEFUL 26 ; WHEN MAKING LARGE NUMBERS OF COPIES OF DOS-11 MAGTAPE DATA. THE RSX-11 27 ; FILES-11 FILE IS COMPATIBLE WITH FCS VARIABLE LENGTH, BLOCK SPANNED 28 ; RECORD MODE. 29 ; 30 ;- 31 32 33 ; 34 ; LOCAL MACROS 35 ; 36 37 .MACRO ERRMSG MESSAG,WHERE,?A,?B,?C 38 BR C 39 A: .ASCII ^MESSAG^ 40 B: .EVEN 41 C: MOV #A,QIO+Q.IOPL 42 MOV #B-A,QIO+Q.IOPL+2 43 DIR$ #QIO 44 .IIF DF,WHERE JMP WHERE 45 .ENDM ERRMSG 46 47 .MACRO PAUSE 48 CLEF$S #16. 49 WTSE$S #16. 50 .ENDM PAUSE 51 52 .MACRO RESUME 53 SETF$S #16. 54 .ENDM RESUME 55 56 ; 57 ; ALLOCATE FSR AREA TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 1-1 INTRODUCTION 58 ; 59 60 000000 FSRSZ$ 3 ; ALLOCATE 3 BUFFERS TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 2 CSI & FCS DATA & BUFFERS 62 .SBTTL CSI & FCS DATA & BUFFERS 63 ; 64 ; FILE DESCRIPTOR BLOCKS & RELATED INFORMATION 65 ; 66 67 000000 FDBST: ; START OF FDB'S 68 000000 FDBINP::FDBDF$ ; DEFINE INPUT FDB 69 000140 FDBOUT::FDBDF$ ; DEFINE OUTPUT FDB 70 000300 FDBEND: ; END ADDR OF FDB'S 71 72 000300 GCMBLK: GCMLB$ 3,TPC,,TILUN ; COMMAND LINE CONTROL BLOCK 73 74 000750 INDFN: NMBLK$ ,DOS ; DEFAULT FILENAME: '.DOS' 75 001006 OUTDFN: NMBLK$ ,DOS ; " " '.DOS' 76 77 ; 78 ; LUNS 79 ; 80 81 000001 INLUN= 1 ; INPUT FILE ON 1 82 000002 OUTLUN= 2 ; OUTPUT FILE ON 2 83 000005 TILUN= 5 ; GCML & QIO'S TO #5 (DEFAULT FROM TKB) 84 85 ; 86 ; COMMAND STRING INTERPRETER 87 ; 88 89 001044 000000 CSIFLG: .WORD 0 ; FLAG WORD FOR COMMAND SWITCHES 90 91 000001 HLPMSK= 1 ; /HE - PRINT HELP MESSAGE 92 000002 BLKMSK= 2 ; /BL - ALLOCATE BLOCKS 93 000004 SALMSK= 4 ; /SA - SECONDARY ALLOCATION (BLOCKS) 94 000010 CONMSK= 10 ; /CO - CONTIGUOUS FILE 95 96 001046 CSISW: CSI$SW HE,HLPMSK,CSIFLG 97 001056 CSI$SW BL,BLKMSK,CSIFLG,,,ALCTAB 98 001066 CSI$SW SA,SALMSK,CSIFLG,,,SALTAB 99 001076 CSI$SW CO,CONMSK,CSIFLG 100 001106 CSI$ND 101 102 001110 ALCTAB: CSI$SV DECIMAL,ALLOC,2 103 001114 SALTAB: CSI$SV DECIMAL,SALOC,2 104 001120 CSI$ND 105 106 001122 177634 ALLOC: .WORD -100. ; ALLOCATION VALUE [+/-] 107 001124 177716 SALOC: .WORD -50. ; SECONDARY ALLOCATION VALUE [+/-] 108 109 001126 CSI$ 110 001126 CSI: .BLKB C.SIZE ; DEFINE THE CSI WORK AREA 111 .EVEN TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 3 HELP MESSAGE & TEXT 113 .SBTTL HELP MESSAGE & TEXT 114 ; 115 ; ERROR MESSAGE PROCESSING & HELP 116 ; 117 118 001202 QIO:: QIOW$ IO.WVB,TILUN,1,,IOSTAT,,<.-.,.-.,40,.-.,.-.,.-.> 119 001232 000000 000000 IOSTAT::.WORD 0,0 120 121 001236 ERRBUF: .BLKB 80. 122 123 001356 HLPMSG: 124 001356 124 120 103 .ASCIZ 'TPC - DOS11 TAPE / DISK UTILITY PROGRAM' 125 001426 011 124 110 .ASCIZ ' THIS PROGRAM WILL COPY DOS-11 MAGTAPES TO RSX-11 DISK' 126 001515 011 106 111 .ASCIZ ' FILES AND RECORD THEM IN A SPECIAL IMAGE MODE' 127 001574 011 124 110 .ASCIZ ' THIS ALLOWS VERY FAST MULTIPLE COPIES OF TAPES TO BE MADE' 128 001667 011 106 122 .ASCIZ ' FROM THE DISK IMAGE (MUCH FASTER THAN FILEX).' 129 001746 040 000 .ASCIZ ' ' 130 001750 011 124 110 .ASCIZ ' THE COMMAND FORMAT IS STANDARD RSX-11:' 131 002020 040 000 .ASCIZ ' ' 132 002022 011 011 124 .ASCIZ ' TPC>OUTFILE=INFILE[/BL:NNNN][/SA:MMMM][/CO][/HE]' 133 002105 011 127 110 .ASCIZ ' WHERE:' 134 002115 011 011 055 .ASCIZ ' -ONE "FILE" MUST BE A MAGTAPE DEVICE' 135 002164 011 011 057 .ASCIZ ' /BL:NNNN = AN OPTIONAL ALLOCATION SPECIFICATION' 136 002246 011 011 040 .ASCIZ ' IF DISK IS THE OUTPUT DEVICE' 137 002306 011 011 057 .ASCIZ ' /SA:MMMM = AN OPTIONAL SECONDARY ALLOCATION AMOUNT' 138 002373 011 011 040 .ASCIZ ' IF DISK IS THE OUTPUT DEVICE' 139 002433 011 011 057 .ASCIZ ' /CO = DISK FILE TO BE CONTIGUOUS' 140 002476 011 011 057 .ASCIZ ' /HE = THIS HELP TEXT' 141 002525' HLPEND= . 142 143 144 002525 124 120 103 DSKERM: .ASCIZ 'TPC -- DISK I/O ERROR. CODE=%D' 145 002565 124 120 103 MTERM: .ASCIZ 'TPC -- MAGTAPE I/O ERROR. CODE=%D' 146 147 .EVEN TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 4 TAPE / DISK DATA & TABLES 149 .SBTTL TAPE / DISK DATA & TABLES 150 ; 151 ; DISK & TAPE OPERATIONS ARE ENTIRELY AST DRIVEN, USING LINKED LISTS TO 152 ; CONTROL THE SEQUENCE OF EVENTS TO BE FOLLOWED. ALL BUFFERS FOR BOTH 153 ; INPUT & OUTPUT OPERATIONS ARE KEPT IN LINKED LISTS BY TYPES (INPUT OR 154 ; OUTPUT) AND ARE SCANNED AT EACH AST TO SEE WHAT WORK NEEDS TO BE DONE. 155 ; 156 ; THE GENERAL FORMAT FOR A LIST NODE IS: 157 ; 158 000000 N.FWD = 0 ; WD: 0 [ LINK TO NEXT NODE ] 159 000002 N.BWD = 2 ; WD: 1 [ LINK TO PRIOR NODE ] 160 000004 N.IOST = 4 ; WD: 2 [ IO STATUS WORD #0 ] 161 ; WD: 3 [ IO STATUS WORD #1 ] 162 000010 N.WRK = 10 ; WD: 4 [ TEMPORARY WORK VAR. ] 163 000012 N.BUF = 12 ; WD: 5 [ BUFFER ADDRESS ] 164 000014 N.LEN = 14 ; WD: 6 [ BUFFER LENGTH ] 165 000016 N.PTR = 16 ; WD: 7 [ CURRENT BUFFER POINTER] 166 000020 N.BKH = 20 ; WD: 10 [ HIGH ORDER BLOCK NO. ] 167 000022 N.BKL = 22 ; WD: 11 [ LOW ORDER BLOCK NO. ] 168 000024 N.SIZE = 24 ; SIZE OF NODE 169 ; 170 171 000020 DSKBKS= 16. ; NO. OF BLOCKS IN DISK BUFFER 172 020000 DSKBFS = DSKBKS*512. ; DISK BUFFER SIZE = 16 BLOCKS 173 002630 DSKBF0: .BLKB DSKBFS ; ALLOCATE 1ST BUFFER 174 022630 DSKBF1: .BLKB DSKBFS ; & 2ND BUFFER 175 176 001002 TPBFS = 512.+2 ; TAPE BUFFER SIZE = 1 BLOCK + 1 WORD 177 042630 TPBF0: .BLKB TPBFS ; TAPE BUFFER 1 178 043632 TPBF1: .BLKB TPBFS ; TAPE BUFFER 2 179 044634 TPBF2: .BLKB TPBFS ; TAPE BUFFER 3 180 045636 TPBF3: .BLKB TPBFS ; TAPE BUFFER 4 181 182 ; 183 ; CONTROL VARIABLES 184 ; 185 186 046640 000020 DSKFCT: .WORD DSKBKS ; DISK BLOCKING FACTOR 187 046642 000000 INVEC: .WORD 0 ; CURRENT INPUT VECTOR 188 046644 000000 OUTVEC: .WORD 0 ; CURRENT OUTPUT VECTOR 189 046646 000000 OUTDVF: .WORD 0 ; OUTPUT DEVICE FLAG(-1 FOR MAGTAPE, 0 FOR DISK) 190 046650 000000 INDVF: .WORD 0 ; INPUT DEVICE FLAG 191 046652 046515 052115 000000 MAGDEV: .WORD "MM,"MT,0 ; MAGTAPE DEVICE LIST 192 046660 000000 000000 IOST: .WORD 0,0 ; I/O STATUS BLOCK FOR SIMPLE QIO'S 193 046664 000000 FLAGS: .WORD 0 ; DISK & MAGTAPE FLAGS 194 046666 000000 MTERR: .WORD 0 ; MAGTAPE ERROR VALUE 195 046670 000000 DSKERR: .WORD 0 ; DISK ERROR VARIABLE 196 ; 197 ; FLAG VALUES FOR DISK & MAGTAPE FLAGS 198 ; 199 000001 EOV = 1 ; END OF VOLUME SEEN 200 000002 EOF = 2 ; END OF FILE SEEN 201 000004 ERR = 4 ; ERROR ENCOUNTERED 202 000010 DONE = 10 ; TRANSFER DONE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 5 TAPE / DISK DATA & TABLES 204 ; 205 ; DISK NODE LIST 206 ; 207 208 046672 046672' DSKLHD: .WORD DSKLHD ; DISK NODE LISTHEAD, FORWARD POINTER 209 046674 046672' .WORD DSKLHD ; & BACKWARD POINTER 210 ; NOTE: LISTHEAD & LISTS MUST REMAIN TOGETHER 211 212 046676 000000 000000 000000 DSKLST: .WORD 0,0,0,0,0,DSKBF0,DSKBFS,DSKBF0,0,0 ; DISK NODE #0 213 046722 000000 000000 000000 .WORD 0,0,0,0,0,DSKBF1,DSKBFS,DSKBF0,0,0 ; DISK NODE #1 214 046746' DSKLND= . 215 216 ; 217 ; TAPE NODE LIST 218 ; 219 220 046746 046746' TPLHD: .WORD TPLHD ; TAPE NODE LISTHEAD ADDRESS, FORWARD POINTER 221 046750 046746' .WORD TPLHD ; & BACKWARD POINTER 222 223 046752 000000 000000 000000 TPLST: .WORD 0,0,0,0,0,TPBF0,TPBFS,0,0,0 ; TAPE BUFFER #0 224 046776 000000 000000 000000 .WORD 0,0,0,0,0,TPBF1,TPBFS,0,0,0 ; TAPE BUFFER #1 225 047022 000000 000000 000000 .WORD 0,0,0,0,0,TPBF2,TPBFS,0,0,0 ; TAPE BUFFER #2 226 047046 000000 000000 000000 .WORD 0,0,0,0,0,TPBF3,TPBFS,0,0,0 ; TAPE BUFFER #3 227 047072' TPLND= . TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 6 PARSE INPUT SPECIFICATION & CHOOSE ACTION 229 .SBTTL PARSE INPUT SPECIFICATION & CHOOSE ACTION 230 231 ; 232 ; GET COMMAND LINE, PARSE IT & START ALL FILES 233 ; 234 235 047072 004767 001356 START: CALL CLOSE ; INSURE ALL FILES ARE CLOSED (IGNORE ERRORS) 236 047076 012700 000000' MOV #FDBST,R0 ; POINT TO THE FIRST FDB 237 047102 005020 110$: CLR (R0)+ ; CLEAR OUT THE FILE DESCRIPTOR BLOCKS 238 047104 020027 000300' CMP R0,#FDBEND ; AT END YET? 239 047110 103774 BLO 110$ ; NO - CONTINUE 240 047112 005067 131726 CLR CSIFLG ; RESET THE COMMAND STRING FLAGS 241 047116 005067 177526 CLR INDVF ; RESET INPUT DEVICE TYPE 242 047122 005067 177520 CLR OUTDVF ; RESET OUTPUT DEVICE TYPE 243 047126 012767 177634 131766 MOV #-100.,ALLOC ; RESET THE ALLOCATION AMOUNT 244 047134 012767 177716 131762 MOV #-50.,SALOC ; RESET THE SECONDARY ALLOCATION 245 246 047142 GCML$ #GCMBLK ; READ A COMMAND LINE 247 047156 103042 BCC 130$ ; CONTINUE IF NO ERRORS 248 047160 122760 177766 000140 CMPB #GE.EOF,G.ERR(R0) ; END OF COMMAND INPUT? 249 047166 001003 BNE 120$ ; NO - COMMAND INPUT ERROR 250 047170 EXIT$S 251 252 047176 120$: ERRMSG 253 047262 000703 BR START 254 255 047264 130$: CSI$1 #CSI,GCMBLK+G.CMLD+2,GCMBLK+G.CMLD ; PARSE COMMAND LINE 256 047310 103033 BCC 140$ ; CONTINUE IF NO ERRORS 257 047312 135$: ERRMSG 258 047376 000635 BR START 259 260 047400 140$: CSI$2 R0,OUTPUT,#CSISW ; PARSE OUTPUT FILESPEC & SWITCHES 261 047416 103027 BCC 160$ ; NO ERRORS - CONTINUE 262 047420 150$: ERRMSG 263 047472 000167 177374 JMP START 264 265 047476 132760 000030 000001 160$: BITB #,C.STAT(R0) 266 047504 001302 BNE 135$ 267 268 047506 032767 000001 131330 BIT #HLPMSK,CSIFLG ; DID THE USER WANT HELP? 269 047514 001402 BEQ 161$ ; NO - CONTINUE 270 047516 000167 000754 JMP HELP ; GIVE HIM HELP 271 272 047522 032767 000010 131314 161$: BIT #CONMSK,CSIFLG ; IS FILE TO BE CONTIGUOUS 273 047530 001006 BNE 162$ ; IF NE, YES 274 047532 005767 131364 TST ALLOC ; IS ALLOC NEGATIVE 275 047536 100410 BMI 163$ ; IF YES SKIP 276 047540 005467 131356 NEG ALLOC ; NEGATE IT 277 047544 000405 BR 163$ 278 047546 005767 131350 162$: TST ALLOC ; IS ALLOC POSITIVE 279 047552 100002 BPL 163$ ; IF YES SKIP 280 047554 005467 131342 NEG ALLOC ; NEGATE IT 281 047560 005767 131340 163$: TST SALOC ; BUT NEVER LET SALOC REMAIN NEGATIVE 282 047564 100002 BPL 164$ ; IF POSITIVE, SKIP 283 047566 005467 131332 NEG SALOC ; NEGATE IT 284 047572 164$: FDAT$R #FDBOUT,#R.VAR,#FD.CR,,ALLOC,SALOC ; INIT THE FDB 285 047626 FDOP$R R0,#OUTLUN TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 6-1 PARSE INPUT SPECIFICATION & CHOOSE ACTION 286 047634 010001 MOV R0,R1 ; R1 = FILENAME BLOCK ADDRESS 287 047636 062701 000102 ADD #F.FNB,R1 ; ... 288 047642 012702 001134' MOV #CSI+C.DSDS,R2 ; R2 = DATASET DESCRIPTOR 289 047646 012703 001006' MOV #OUTDFN,R3 ; R3 = DEFAULT FILENAME ADDRESS 290 047652 004767 000000G CALL .PARSE ; PARSE THE FILENAME BLOCK INFO 291 047656 103422 BCS 168$ ; ERROR ON PARSE 292 047660 004767 000544 CALL MAGTST ; TEST FOR MAGTAPE DEVICE 293 047664 103003 BCC 167$ ; OUTPUT FILE IS DISK - OPEN IT 294 047666 005367 176754 DEC OUTDVF ; OUTPUT IS MAGTAPE - SO INDICATE 295 047672 000450 BR 170$ ; CONTINUE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 7 PARSE INPUT SPECIFICATION & CHOOSE ACTION 297 047674 167$: OFNB$ R0,#FO.WRT,#OUTLUN,,,#FD.RWM 298 047722 103034 BCC 170$ ; CONTINUE IF NO ERRORS 299 047724 168$: ERRMSG 300 050010 000167 177056 JMP START 301 302 050014 012760 001002 000002 170$: MOV #1002,F.RSIZ(R0) ; INIT THE RECORD SIZE IN FDB 303 050022 005060 000014 CLR F.FFBY(R0) ; INDICATE NEXT BLOCK EMPTY 304 050026 CSI$2 #CSI,INPUT,#CSISW ; PARSE INPUT FILE & SWITCHES 305 050050 103002 BCC 171$ ; NO ERROR IF CARRY CLEAR 306 050052 000167 177342 JMP 150$ ; REPORT SWITCH ERROR 307 050056 132760 000030 000001 171$: BITB #,C.STAT(R0) ; NO WILDCARDS, ETC ALLOWED 308 050064 001402 BEQ 173$ ; OK - CONTINUE 309 050066 000167 177220 JMP 135$ ; REPORT IT AS ERROR 310 050072 032767 000001 130744 173$: BIT #HLPMSK,CSIFLG ; DID HE WANT HELP? 311 050100 001402 BEQ 175$ ; NO - CONTINUE 312 050102 000167 000370 JMP HELP ; YES - GIVE HIM HELP 313 314 050106 175$: FDOP$R #FDBINP,#INLUN ; DECLARE LUN TO INPUT FDB 315 050120 010001 MOV R0,R1 ; R1 = FNB ADDRESS 316 050122 062701 000102 ADD #F.FNB,R1 ; ... 317 050126 012702 001134' MOV #CSI+C.DSDS,R2 ; R2 = DATASET DESCRIPTOR 318 050132 012703 000750' MOV #INDFN,R3 ; R3 = DEFAULT FILENAME 319 050136 004767 000000G CALL .PARSE ; PARSE THE FILENAME BLOCK DATA 320 050142 103406 BCS 180$ ; ERROR ON PARSE 321 050144 004767 000260 CALL MAGTST ; SEE IF THIS IS MAGTAPE 322 050150 103037 BCC 190$ ; NO - TRY TO OPEN THE FILE 323 050152 005367 176472 DEC INDVF ; INDICATE INPUT DEVICE IS MAGTAPE 324 050156 000450 BR 200$ ; CONTINUE 325 050160 180$: ERRMSG 326 050244 000167 176622 JMP START 327 328 050250 190$: OFNB$ R0,#FO.RD,,#INLUN,,,#FD.RWM 329 050276 103730 BCS 180$ ; ERROR ON OPEN 330 331 ; 332 ; DETERMINE WHETHER WE HAVE CORRECT COMBINATION OF DISK & MAGTAPE DEVICES: 333 ; I.E. 1 DISK & 1 MAGTAPE 334 ; 335 336 050300 016700 176342 200$: MOV OUTDVF,R0 ; R0 = OUTPUT DEVICE FLAG 337 050304 016701 176340 MOV INDVF,R1 ; R1 = INPUT DEVICE FLAG 338 050310 074001 XOR R0,R1 ; IF NOT -1, THEN WE HAVE 2 OF A KIND! 339 050312 100440 BMI 210$ ; GOOD! - CONTINUE 340 050314 ERRMSG ,START 341 342 050414 005700 210$: TST R0 ; WHICH WAS IT? 343 050416 100002 BPL 215$ ; OUTPUT IS DISK 344 050420 000167 002124 JMP DSKTTP ; OUTPUT IS MAGTAPE 345 050424 000167 000256 215$: JMP TPTDSK ; TAPE-TO-DISK TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 8 PARSE INPUT SPECIFICATION & CHOOSE ACTION 347 ; 348 ; MAGTST - SUBROUTINE TO TEST FOR MAGTAPE AS THE REDIRECTED DEVICE WHICH 349 ; WAS ASSIGNED IN THE FILENAME BLOCK. 350 ; 351 352 050430 012705 046652' MAGTST: MOV #MAGDEV,R5 ; POINT R5 TO DEVICE LIST 353 354 050434 022561 000032 10$: CMP (R5)+,N.DVNM(R1); TEST DEVICE NAME FIELD OF FILENAME BLOCK 355 050440 001403 BEQ 90$ ; GOT IT! - ITS MAGTAPE (SET CARRY) 356 050442 005715 TST (R5) ; ANY MORE ENTRIES? 357 050444 001373 BNE 10$ ; YES - CONTINUE 358 050446 000207 RETURN 359 050450 000261 90$: SEC ; INDICATE MAGTAPE 360 050452 000207 RETURN 361 ; 362 ; CLOSE - CLOSE FILES AT END OF RUN 363 ; 364 365 050454 012700 000000' CLOSE: MOV #FDBINP,R0 ; POINT TO INPUT FDB 366 050460 004767 000000G CALL .TRNCL ; TRUNCATE AND CLOSE IT 367 050464 012700 000140' MOV #FDBOUT,R0 ; POINT TO OUTPUT FDB 368 050470 004767 000000G CALL .TRNCL ; TRUNCATE AND CLOSE IT 369 050474 000207 RETURN 370 371 ; 372 ; HELP - LIST OUT THE HELP TEXT ON TI: 373 ; 374 375 050476 012700 001356' HELP: MOV #HLPMSG,R0 ; R0 = HELP MESSAGE TEXT ADDRESS 376 050502 012767 000040 130512 MOV #40,QIO+Q.IOPL+4; SET THE CC-TYPE TO CR-LF 377 378 050510 010067 130502 10$: MOV R0,QIO+Q.IOPL ; PUT THE ADDRESS IN THE DPB 379 050514 010001 MOV R0,R1 ; SAVE THE BEGINNING ADDRESS IN R1 380 381 050516 105720 20$: TSTB (R0)+ ; SCAN TO NULL AT END 382 050520 001376 BNE 20$ ; CONTINUE TILL NULL CHARACTER 383 050522 010002 MOV R0,R2 ; R2 = ENDING LINE ADDRESS + 1 384 050524 005302 DEC R2 ; BACKUP TO END OF LINE 385 050526 160102 SUB R1,R2 ; R2 = LENGTH OF LINE 386 050530 010267 130464 MOV R2,QIO+Q.IOPL+2 ; PUT LENGTH IN QIO DPB 387 050534 DIR$ #QIO ; OUTPUT THE LINE 388 050542 020027 002525' CMP R0,#HLPEND ; ANY MORE TEXT TO GO? 389 050546 103760 BLO 10$ ; YES - CONTINUE 390 050550 000167 176316 JMP START 391 392 TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 9 WAIT CODE & ERROR PROCESSING 394 .SBTTL WAIT CODE & ERROR PROCESSING 395 ; 396 ; WAIT- PROCESSING OF NORMAL CODE SUSPENDS ITSELF HERE AFTER INITIATING 397 ; THE TAPE COPY OPERATION. ALL WORK IS DONE VIA AST ROUTINES, AND 398 ; IS COMPLETELY 'INTERRUPT' DRIVEN. WHEN AN ERROR OCCURS, OR THE 399 ; TRANSFER IS FINISHED, THE MAIN PROGRAM IS 'RESUMED'. IT MUST THEN 400 ; CHECK FOR ANY ERRORS ENCOUNTERED IN THE AST ROUTINES. 401 ; 402 403 050554 WAIT: PAUSE ; WAIT FOR PROCESSING TO COMPLETE 404 050600 032767 000004 176056 BIT #ERR,FLAGS ; ANY ERRORS ? 405 050606 001002 BNE 20$ ; YES - PROCESS IT 406 050610 000167 176256 JMP START ; NO - RESTART 407 408 050614 012701 002525' 20$: MOV #DSKERM,R1 ; ASSUME A DISK ERROR 409 050620 016746 176044 MOV DSKERR,-(SP) ; PUT ERROR CODE ON STACK 410 050624 001402 BEQ 30$ ; NO CODE - NOT DISK ERROR 411 050626 000167 000014 JMP ERROR ; GO PROCESS ERROR 412 413 050632 012701 002565' 30$: MOV #MTERM,R1 ; SETUP MAGTAPE ERROR MESSAGE 414 050636 016746 176024 MOV MTERR,-(SP) ; & ERROR CODE 415 050642 000167 000000 JMP ERROR ; PROCESS THE ERROR 416 417 418 ; 419 ; ERROR-PROCESS ERROR MESSAGES. THIS ROUTINE OUTPUTS ERROR MESSAGES TO 420 ; THE USERS TERMINAL USING $EDMSG. THE PATTERN STRING IS ASSUMED 421 ; TO BE POINTED TO BY R1, AND THE ERROR CODE ON THE STACK. THIS 422 ; ROUTINE SHOULD BE PASSED CONTROL VIA 'JMP ERROR'. 423 ; 424 425 050646 012700 001236' ERROR: MOV #ERRBUF,R0 ; R0 = OUTPUT BUFFER POINTER 426 050652 010602 MOV SP,R2 ; R2 = PARAMETER POINTER 427 050654 004767 000000G CALL $EDMSG ; EDIT THE MESSAGE 428 050660 012767 001236' 130330 MOV #ERRBUF,QIO+Q.IOPL ; SETUP THE QIO DPB 429 050666 010167 130326 MOV R1,QIO+Q.IOPL+2 ; ... 430 050672 005726 TST (SP)+ ; POP THE PARAMETER FROM THE STACK 431 050674 DIR$ #QIO ; OUTPUT IT 432 050702 000167 176164 JMP START ; RESTART TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 10 TAPE TO DISK OPERATIONS 434 .SBTTL TAPE TO DISK OPERATIONS 435 ; 436 ; TAPE TO DISK 437 ; 438 ; THIS FUNCTION INITIATES A TRANSFER SEQUENCE FROM THE TAPE DRIVE 439 ; TO THE DISK FILE. THE TAPE IS REWOUND PRIOR TO THE START OF 440 ; THE COPY, AND ALL OPERATIONS ARE MULTI-BUFFERED. 441 ; 442 443 050706 005067 175752 TPTDSK: CLR FLAGS ; RESET ALL FLAGS 444 050712 005067 175752 CLR DSKERR ; RESET DISK ERROR VALUE 445 050716 005067 175744 CLR MTERR ; & MAGTAPE ERROR VALUE 446 050722 012767 051300' 175712 MOV #TAPEIN,INVEC ; SETUP AST VECTORS 447 050730 012767 051550' 175706 MOV #DSKOUT,OUTVEC ; ... 448 050736 QIOW$S #IO.ATT,#INLUN,#1 ; ATTACH TO TAPE UNIT 449 051002 QIOW$S #IO.RWD,#INLUN,#1 ; REWIND THE MAGTAPE 450 051046 QIOW$S #IO.STC,#INLUN,#1,,,,<0> ; SET TO 800BPI 451 452 ; 453 ; INITIALIZE & PLACE ALL DISK BUFFERS IN THE QUEUE 454 ; 455 456 051114 012700 046672' MOV #DSKLHD,R0 ; R0 = DISK BUFFER LISTHEAD 457 051120 010004 MOV R0,R4 ; R4 = SAVED LISTHEAD ADDRESS 458 051122 010420 MOV R4,(R0)+ ; SETUP A NULL LISTHEAD 459 051124 010420 MOV R4,(R0)+ ; ... 460 ; NOTE: THE LISTHEAD & LISTS MUST BE TOGETHER! 461 462 051126 010005 10$: MOV R0,R5 ; R5 = BUFFER NODE ADDRESS 463 051130 004767 003106 CALL NODADD ; ADD IT TO DISK QUEUE 464 051134 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; UPDATE POINTER TO BUFFER START 465 051142 062700 000024 ADD #N.SIZE,R0 ; R0 = NEXT POINTER 466 051146 020027 046746' CMP R0,#DSKLND ; AT END OF LIST YET? 467 051152 103765 BLO 10$ ; NO - CONTINUE 468 469 ; 470 ; INITIALIZE TAPE BUFFER LISTHEAD TO NULL, AND INITIATE I/O TO THE TAPE 471 ; DRIVE FOR EVERY AVAILABLE BUFFER NODE IN ORDER TO START THE PROCESS GOING. 472 ; 473 474 051154 012700 046746' MOV #TPLHD,R0 ; R0 = TAPE LISTHEAD ADDRESS 475 051160 010001 MOV R0,R1 ; R1 = SAVED LISTHEAD ADDRESS 476 051162 010120 MOV R1,(R0)+ ; INITIALIZE THE LISTHEAD TO NULL 477 051164 010120 MOV R1,(R0)+ ; ... 478 479 051166 010001 30$: MOV R0,R1 ; R1 = COPY OF NODE ADDRESS 480 051170 005060 000016 CLR N.PTR(R0) ; RESET THE POINTER VALUE 481 051174 062701 000004 ADD #N.IOST,R1 ; R1 = IO STATUS ADDRESS 482 051200 010102 MOV R1,R2 ; R2 = " " " 483 051202 062701 000006 ADD #N.BUF-N.IOST,R1; POINT R1 TO BUFFER ADDRESS CELL 484 051206 012103 MOV (R1)+,R3 ; R3 = BUFFER ADDRESS 485 051210 005723 TST (R3)+ ; ADVANCE BEYOND 1ST WORD 486 051212 011104 MOV (R1),R4 ; & GET BUFFER SIZE 487 051214 162704 000002 SUB #2,R4 ; DECREASE BY TWO TO ACCOUNT FOR R3 OFFSET 488 051220 QIO$S #IO.RLB,#INLUN,,,R2,INVEC, ; READ THE BLOCK 489 051262 062700 000024 ADD #N.SIZE,R0 ; R0 = ADDRESS OF NEXT BUFFER NODE 490 051266 020027 047072' CMP R0,#TPLND ; ANY MORE TAPE BUFFERS? TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 10-1 TAPE TO DISK OPERATIONS 491 051272 103735 BLO 30$ ; YES - CONTINUE 492 051274 000167 177254 JMP WAIT ; NO - GO WAIT FOR I/O DONE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 11 TAPEIN - TAPE INPUT AST 494 .SBTTL TAPEIN - TAPE INPUT AST 495 ; 496 ; TAPEIN - HANDLE TAPE INPUT AST 497 ; 498 499 051300 012605 TAPEIN: MOV (SP)+,R5 ; R5 = I/O STATUS ADDRESS 500 051302 032767 000015 175354 BIT #,FLAGS ; ERROR OR END FLAGGED? 501 051310 001114 BNE 100$ ; YES - GET OUT 502 051312 016504 000006 MOV N.BUF-N.IOST(R5),R4 ; R4 = BUFFER ADDRESS 503 051316 105715 TSTB (R5) ; ERROR ON I/O? 504 051320 100030 BPL 50$ ; NO - SETUP & LINK BUFFER TO LISTHEAD 505 051322 122715 000000G CMPB #IE.EOF,(R5) ; EOF? 506 051326 001050 BNE 90$ ; NO - ERROR 507 051330 032767 000002 175326 BIT #EOF,FLAGS ; IS THIS 2ND EOF IN ROW? (EOV?) 508 051336 001010 BNE 20$ ; YES - END-OF-VOLUME 509 051340 052767 000002 175316 BIS #EOF,FLAGS ; NO - SO SET IT TO INDICATE 1ST EOF 510 051346 012765 000002 000002 MOV #2,2(R5) ; YES - SET LENGTH FOR OUTPUT = 2 BYTES 511 051354 005014 CLR (R4) ; DATA VALUE = 0 (COUNT = 0) 512 051356 000421 BR 60$ ; CONTINUE 513 514 051360 052767 000001 175276 20$: BIS #EOV,FLAGS ; INDICATE EOV SEEN 515 051366 012765 000004 000002 MOV #4,2(R5) ; YES - DATA LENGTH = 4 BYTES (2 NULLS) 516 051374 005024 CLR (R4)+ ; RESET THE TWO 'NULL' RECORDS 517 051376 005014 CLR (R4) ; ... 518 051400 000410 BR 60$ ; CONTINUE 519 520 051402 016514 000002 50$: MOV 2(R5),(R4) ; SETUP 1ST BUFFER WORD WITH DATA LENGTH 521 051406 062765 000002 000002 ADD #2,2(R5) ; TOTAL LENGTH INCLUDES THE LENGTH WORD 522 051414 042767 000002 175242 BIC #EOF,FLAGS ; RESET THE EOF SEEN FLAG 523 524 051422 162705 000004 60$: SUB #4,R5 ; ADJUST R5 TO POINT TO START OF NODE 525 051426 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; SETUP THE POINTER TO START OF DATA 526 051434 016704 175310 MOV TPLHD+2,R4 ; R4 = PRIOR NODE ADDRESS FOR ADD OPERATION 527 051440 004767 002576 CALL NODADD ; ADD NODE TO TAPE BUFFER LIST 528 051444 000167 000244 JMP TPDKDQ ; GO TRY TO DEQUEUE SOME WORK. 529 530 051450 90$: QIOW$S #IO.KIL,#INLUN,#1,,IOST ; CANCEL ALL TAPE I/O'S IN PROG. 531 051516 052767 000004 175140 BIS #ERR,FLAGS ; FLAG THE ERROR 532 051524 011567 175136 MOV (R5),MTERR ; COPY ERROR CODE FOR MAGTAPE 533 051530 RESUME ; RESUME THE MAIN TASK 534 535 051542 100$: ASTX$S ; EXIT THE AST TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 12 DSKOUT - DISK OUTPUT AST 537 .SBTTL DSKOUT - DISK OUTPUT AST 538 ; 539 ; DSKOUT - PROCESS DISK OUTPUT AST 540 ; 541 542 051550 012605 DSKOUT: MOV (SP)+,R5 ; R5 = AST ADDRESS 543 051552 032767 000014 175104 BIT #,FLAGS ; ANY ERRORS OR OPERATION COMPLETE? 544 051560 001052 BNE 100$ ; YES - JUST EXIT AST 545 051562 105715 TSTB (R5) ; ANY ERRORS ON OPERATION? 546 051564 100413 BMI 90$ ; YES - ERROR 547 548 051566 162705 000004 SUB #4,R5 ; R5 = NODE ADDRESS (ADJUSTED) 549 051572 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; RESET THE BUFFER POINTER 550 051600 016704 175070 MOV DSKLHD+2,R4 ; R4 = PRIOR NODE ADDRESS FOR ADD 551 051604 004767 002432 CALL NODADD ; ADD THIS TO DISK BUFFER QUEUE 552 051610 000167 000100 JMP TPDKDQ ; TRY TO DEQUEUE SOME WORK 553 554 051614 90$: QIOW$S #IO.KIL,#OUTLUN,#1,,#IOST ; CANCEL ALL OUTPUT I/O 555 051662 052767 000004 174774 BIS #ERR,FLAGS ; FLAG THE ERROR 556 051670 011567 174774 MOV (R5),DSKERR ; SAVE THE ERROR CODE 557 051674 RESUME ; CONTINUE THE MAIN TASK 558 559 051706 100$: ASTX$S TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 13 TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 561 .SBTTL TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 562 ; 563 ; TPDKDQ- 564 ; 565 ; THIS ROUTINE PERFORMS THE MAJORITY OF WORK IN THE TRANSFER OPERATION. 566 ; ENTRIES IN THE TAPE INPUT QUEUE REPRESENT DATA INPUT FROM THE MAG- 567 ; TAPE DRIVE, WHICH NEEDS TO BE OUTPUT TO THE DISK. THE ENTRIES IN THE 568 ; DISK QUEUE ARE EMPTY BUFFERS. THIS ROUTINE COPIES MAGTAPE BUFFER 569 ; INFORMATION STARTING WITH THE 1ST BUFFER IN THE QUEUE TO THE DISK 570 ; BUFFERS, ONLY EXITING THE AST WHEN THERE ARE NO MORE BUFFERS AVAILABLE 571 ; AT ANY TIME TO CONTINUE THE OPERATION. 572 ; 573 574 051714 012700 046672' TPDKDQ: MOV #DSKLHD,R0 ; R0 = DISK LISTHEAD ADDRESS 575 051720 020010 CMP R0,(R0) ; ANY OUTPUT BUFFERS AVAILABLE? 576 051722 001407 BEQ 10$ ; NO - JUST EXIT AST 577 051724 011000 MOV (R0),R0 ; R0 = BUFFER NODE ADDRESS 578 579 051726 012702 046746' MOV #TPLHD,R2 ; R2 = TAPE LISTHEAD ADDRESS 580 051732 020212 CMP R2,(R2) ; ANY TAPE BUFFERS READY? 581 051734 001402 BEQ 10$ ; NO - WAIT FOR SOME TO COME 582 051736 011202 MOV (R2),R2 ; R2 = BUFFER ADDRESS 583 051740 000403 BR 20$ ; CONTINUE 584 585 051742 10$: ASTX$S 586 587 ; 588 ; THERE IS AT LEAST ONE INPUT BUFFER READY & ONE OUTPUT BUFFER AVAILABLE. 589 ; SETUP ALL POINTERS, CALCULATE THE NUMBER OF BYTES TO COPY & THE AMOUNT 590 ; OF SPACE LEFT IN THE DISK BUFFER. TRANSFER AS MUCH AS WILL FIT INTO 591 ; THE DISK BUFFER. 592 ; 593 594 051750 016001 000016 20$: MOV N.PTR(R0),R1 ; R1 = REMAINING LENGTH IN DISK BUFFER 595 051754 166001 000012 SUB N.BUF(R0),R1 ; ... 596 051760 005401 NEG R1 ; (R1 = -AMOUNT USED) 597 051762 066001 000014 ADD N.LEN(R0),R1 ; ... 598 051766 003434 BLE 70$ ; NONE LEFT! 599 051770 016203 000006 MOV N.IOST+2(R2),R3 ; R3 = LENGTH OF TAPE BUFFER DATA 600 051774 001564 BEQ 80$ ; NO TAPE DATA! 601 602 051776 020103 CMP R1,R3 ; COMPARE REMAINING DISK TO TAPE BUFFER 603 052000 103005 BHIS 40$ ; DISK BUFFER WILL HOLD IT ALL - CONTINUE 604 052002 160103 SUB R1,R3 ; R3 = AMOUNT WHICH WILL NOT FIT 605 052004 010362 000006 MOV R3,N.IOST+2(R2) ; UPDATE THE AMOUNT WHICH REMAINS FOR TAPE 606 052010 010103 MOV R1,R3 ; R3 = TRANSFER COUNT 607 052012 000402 BR 50$ ; CONTINUE 608 609 052014 005062 000006 40$: CLR N.IOST+2(R2) ; XFER WILL FIT - NO DATA WILL BE LEFT 610 611 052020 016204 000016 50$: MOV N.PTR(R2),R4 ; R4 = FROM POINTER 612 052024 016005 000016 MOV N.PTR(R0),R5 ; R5 = TO POINTER 613 052030 006203 ASR R3 ; R3 = XFER COUNT IN WORDS 614 615 052032 012425 60$: MOV (R4)+,(R5)+ ; COPY THE BUFFER 616 052034 077302 SOB R3,60$ ; ... 617 TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 13-1 TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 618 052036 010560 000016 MOV R5,N.PTR(R0) ; RESTORE NEW BUFFER POINTER VALUES 619 052042 010462 000016 MOV R4,N.PTR(R2) ; ... 620 621 ; 622 ; WRITE OUT DISK BUFFER IF REQUIRED 623 ; 624 625 052046 166005 000012 SUB N.BUF(R0),R5 ; R5 = AMOUNT OF BUFFER USED 626 052052 020560 000014 CMP R5,N.LEN(R0) ; COMPARE TO BUFFER SIZE 627 052056 103533 BLO 80$ ; CONTINUE IF MORE ROOM LEFT 628 629 052060 010005 70$: MOV R0,R5 ; R5 = NODE ADDRESS 630 052062 004767 002176 CALL NODDEL ; DELETE THE NODE 631 052066 010246 MOV R2,-(SP) ; SAVE R2 632 052070 012704 000140' MOV #FDBOUT,R4 ; GET FDB ADDRESS 633 052074 016002 000014 76$: MOV N.LEN(R0),R2 ; COPY BUFFER LENGTH 634 052100 072227 177767 ASH #-9.,R2 ; CHANGE IT TO BLOCKS 635 052104 005202 INC R2 ; AND ROUND UP 636 052106 005003 CLR R3 ; CLEAR HIGH ORDER 637 052110 066402 000012 ADD F.EFBK+2(R4),R2 ; ADD LOW ORDER CURRENT BLOCK 638 052114 005503 ADC R3 ; ADD CARRY INTO HIGH ORDER 639 052116 066403 000010 ADD F.EFBK(R4),R3 ; ADD HIGH ORDER CURRENT BLOCK 640 052122 020364 000004 CMP R3,F.HIBK(R4) ; COMPARE ULTIMATE HIGH ORDER TO 641 ; AMOUT ALLOCATED ALREADY 642 052126 101003 BHI 71$ ; IF HIGH, MUST EXTEND 643 052130 020264 000006 CMP R2,F.HIBK+2(R4) ; COMPARE ULTIMATE LOW ORDER 644 052134 103426 BLO 75$ ; IF LOW, THERE IS ROOM 645 052136 010046 71$: MOV R0,-(SP) ; PUSH NODE ADDRESS ON STACK 646 052140 010400 MOV R4,R0 ; COPY FDB ADDRESS 647 052142 016701 126756 MOV SALOC,R1 ; GET SECONDARY ALLOCATION VALUE 648 052146 012702 000203 MOV #203,R2 ; SET CONTROL BITS FOR ENABLE, CONTIGUOUS 649 ; (BUT FILE IS NOW NON-CONTIGUOUS) 650 052152 032767 000010 126664 BIT #CONMSK,CSIFLG ; IS /CO SET? 651 052160 001002 BNE 73$ ; YES, HENCE WANTED CONTIGUOUS 652 052162 042702 000007 BIC #7,R2 ; CHANGE CONTROL INDICATORS TO NON-CONTIGUOUS 653 052166 004767 000000G 73$: CALL .EXTND ; DO THE EXTEND 654 052172 103005 BCC 74$ ; IF NO ERROR FROM EXTEND, GO ON 655 052174 012767 000004 174462 MOV #ERR,FLAGS ; FLAG AN ERROR 656 052202 005726 TST (SP)+ ; POP STACK 657 052204 000551 BR 100$ ; GET OUT 658 052206 012600 74$: MOV (SP)+,R0 ; RESTORE NODE ADDRESS IN R0 659 052210 000731 BR 76$ ; GO BACK TO CHECK THAT INCREMENT WAS ENOUGH 660 052212 012602 75$: MOV (SP)+,R2 ; RESTORE R2 661 052214 010001 MOV R0,R1 ; COPY NODE ADDRESS TO R1 662 052216 062701 000004 ADD #N.IOST,R1 ; R1 = IO STATUS BLOCK ADDRESS 663 052222 012703 000140' MOV #FDBOUT,R3 ; R3 = OUTPUT FDB POINTER 664 052226 016004 000012 MOV N.BUF(R0),R4 ; R4 = BUFFER ADDRESS 665 052232 016005 000014 MOV N.LEN(R0),R5 ; R5 = BUFFER LENGTH 666 052236 016360 000064 000020 MOV F.BKVB(R3),N.BKH(R0) ; MOVE BLOCK# INTO NODE 667 052244 016360 000066 000022 MOV F.BKVB+2(R3),N.BKL(R0) ; ... 668 052252 QIO$S #IO.WVB,#OUTLUN,,,R1,OUTVEC, 669 052320 066763 174314 000066 ADD DSKFCT,F.BKVB+2(R3) ; UPDATE BLOCK NUMBER TO NEXT WRITE 670 052326 005563 000064 ADC F.BKVB(R3) ; ... 671 052332 016363 000064 000010 MOV F.BKVB(R3),F.EFBK(R3) ; UPDATE EOF BLOCK# 672 052340 016363 000066 000012 MOV F.BKVB+2(R3),F.EFBK+2(R3) ; ... 673 674 ; TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 13-2 TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 675 ; QUEUE UP MAGTAPE FOR MORE INPUT IF BUFFER IS EMPTY 676 ; 677 678 052346 005762 000006 80$: TST N.IOST+2(R2) ; ANY MORE DATA TO XFER FROM THIS BUFFER? 679 052352 001402 BEQ 81$ ; NO 680 052354 000167 177334 JMP TPDKDQ ; TRY TO DEQUEUE MORE WORK 681 052360 032767 000001 174276 81$: BIT #EOV,FLAGS ; DONE? 682 052366 001415 BEQ 85$ ; NO - CONTINUE 683 052370 052767 000010 174266 BIS #DONE,FLAGS ; YES - FLAG IT 684 052376 012700 046672' MOV #DSKLHD,R0 ; R0 = DISK LISTHEAD ADDRESS 685 052402 020010 CMP R0,(R0) ; ANY ENTRIES IN LIST? 686 052404 001451 BEQ 100$ ; NO - DONE 687 052406 011000 MOV (R0),R0 ; R0 = DISK NODE ADDRESS 688 052410 026060 000012 000016 CMP N.BUF(R0),N.PTR(R0) ; ANY DATA IN BUFFER? 689 052416 001220 BNE 70$ ; YES - GO WRITE IT OUT 690 052420 001443 BEQ 100$ ; GO RESUME MAIN TASK & EXIT 691 692 052422 010205 85$: MOV R2,R5 ; COPY NODE ADDR TO R5 693 052424 004767 001634 CALL NODDEL ; DELETE THE NODE 694 052430 010203 MOV R2,R3 ; COPY NODE ADDRESS TO R3 695 052432 062703 000004 ADD #N.IOST,R3 ; R3 = IO STATUS ADDR 696 052436 016204 000012 MOV N.BUF(R2),R4 ; R4 = BUFFER ADDRESS 697 052442 005724 TST (R4)+ ; ADVANCE OVER 1ST WORD IN BUFFER 698 052444 016205 000014 MOV N.LEN(R2),R5 ; R5 = LENGTH (MAX) FOR READ 699 052450 162705 000002 SUB #2,R5 ; REDUCE BY AMOUNT BUFFER WAS ADVANCED 700 052454 QIO$S #IO.RLB,#INLUN,,,R3,INVEC, 701 052516 000167 177172 JMP TPDKDQ ; TRY TO DEQUEUE MORE WORK 702 703 052522 90$: ASTX$S ; EXIT THE AST 704 705 052530 100$: RESUME ; RESUME THE MAIN TASK 706 052542 ASTX$S ; EXIT AST TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 14 TPDKDQ - TAPE TO DISK DEQUEUE ROUTINE 708 709 .SBTTL DISK TO TAPE OPERATIONS 710 ; 711 ; DISK TO TAPE 712 ; 713 ; THIS FUNCTION TRANSFERS DATA FROM THE DISK FILE TO MAGTAPE. THE 714 ; MAGTAPE IS REWOUND PRIOR TO PROCESSING. ALL READS FROM DISK ARE 715 ; MULTI-BLOCK QIO'S (ALSO MULTI-BUFFERED) TO TAKE ADVANTAGE OF THE 716 ; HIGHER THROUGHPUT OF THE DISK. MAGTAPE OPERATIONS ARE ALSO MULTI- 717 ; BUFFERED. 718 ; 719 720 052550 005067 174110 DSKTTP: CLR FLAGS ; RESET ALL FLAGS 721 052554 005067 174110 CLR DSKERR ; RESET DISK ERROR VALUE 722 052560 005067 174102 CLR MTERR ; RESET MAGTAPE ERROR 723 052564 012767 053154' 174050 MOV #DSKIN,INVEC ; SETUP INPUT VECTOR 724 052572 012767 053360' 174044 MOV #TAPOUT,OUTVEC ; & OUTPUT VECTOR 725 052600 QIOW$S #IO.ATT,#OUTLUN,#1 ; ATTACH TO TAPE UNIT 726 052644 QIOW$S #IO.RWD,#OUTLUN,#1 ; REWIND TAPE 727 052710 QIOW$S #IO.STC,#OUTLUN,#1,,,,<0> ; SET TO 800BPI 728 729 ; 730 ; INITIALIZE & PALACE ALL TAPE BUFFERS IN OUTPUT QUEUE 731 ; 732 733 052756 012700 046746' MOV #TPLHD,R0 ; R0 = TAPE BUFFER LISTHEAD 734 052762 010004 MOV R0,R4 ; R4 = SAVED LISTHEAD ADDR 735 052764 010420 MOV R4,(R0)+ ; SET LISTHEAD TO NULL 736 052766 010420 MOV R4,(R0)+ ; ... 737 738 052770 010005 10$: MOV R0,R5 ; R5 = BUFFER NODE ADDRESS 739 052772 004767 001244 CALL NODADD ; ADD TAPE BUFFER TO LIST 740 052776 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; INIT THE POINTER 741 053004 005065 000010 CLR N.WRK(R5) ; RESET 'NUMBER REMAINING BYTES' COUNT 742 053010 062700 000024 ADD #N.SIZE,R0 ; ADVANCE TO NEXT BUFFER 743 053014 020027 047072' CMP R0,#TPLND ; AT END OF TAPE BUFFERS? 744 053020 103763 BLO 10$ ; NO - CONTINUE 745 746 ; 747 ; INITATE DISK I/O OPERATIONS FOR ALL AVAILABLE DISK BUFFERS 748 ; 749 750 053022 012700 046672' MOV #DSKLHD,R0 ; R0 = DISK LISTHEAD POINTER 751 053026 010001 MOV R0,R1 ; R1 = SAVE LISTHEAD ADDR 752 053030 010120 MOV R1,(R0)+ ; INITIATE THE LISTHEAD TO NULL 753 053032 010120 MOV R1,(R0)+ ; ... 754 755 053034 016002 000012 20$: MOV N.BUF(R0),R2 ; R2 = BUFFER ADDRESS 756 053040 010260 000016 MOV R2,N.PTR(R0) ; INIT THE BUFFER POINTER 757 053044 016003 000014 MOV N.LEN(R0),R3 ; R3 = LENGTH OF READ 758 053050 010001 MOV R0,R1 ; R1 = IO STATUS BLOCK ADDR 759 053052 062701 000004 ADD #N.IOST,R1 ; ... 760 053056 012705 000000' MOV #FDBINP,R5 ; R5 = INPUT FDB ADDRESS 761 053062 QIO$S #IO.RVB,#INLUN,,,R1,INVEC, 762 053130 066765 173504 000066 ADD DSKFCT,F.BKVB+2(R5) ; UPDATE THE NEXT BLOCK NO. 763 053136 005565 000064 ADC F.BKVB(R5) ; ... 764 053142 062700 000024 ADD #N.SIZE,R0 ; ADVANCE TO NEXT BUFFER NODE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 14-1 DISK TO TAPE OPERATIONS 765 053146 103732 BLO 20$ ; CONTINUE IF IN RANGE 766 053150 000167 175400 JMP WAIT ; ELSE GO WAIT FOR XFER TO COMPLETE TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 15 DSKIN - DISK INPUT AST ROUTINE 768 .SBTTL DSKIN - DISK INPUT AST ROUTINE 769 ; 770 ; DSKIN - HANDLE DISK I/O DONE AST 771 ; 772 773 053154 012605 DSKIN: MOV (SP)+,R5 ; R5 = IO STATUS ADDRESS 774 053156 162705 000004 SUB #4,R5 ; POINT R5 TO NODE BEGINNING 775 053162 032767 000014 173474 BIT #,FLAGS ; ANY ERRORS OR IS I/O COMPLETE? 776 053170 001070 BNE 100$ ; YES - JUST EXIT THE AST 777 053172 105765 000004 TSTB N.IOST(R5) ; WAS THERE AN ERROR ON THIS XFER? 778 053176 100010 BPL 50$ ; NO - CONTINUE 779 053200 122765 000000G 000004 CMPB #IE.EOF,N.IOST(R5) ; WAS IT EOF? 780 053206 001023 BNE 90$ ; NO - REAL ERROR 781 053210 052767 000002 173446 BIS #EOF,FLAGS ; FLAG EOF 782 053216 000455 BR 100$ ; & IGNORE AST 783 784 053220 016565 000006 000010 50$: MOV N.IOST+2(R5),N.WRK(R5) ; COPY THE # BYTES XFERRED 785 053226 066565 000012 000010 ADD N.BUF(R5),N.WRK(R5) ; POINT TO END BYTE + 1 786 053234 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; SETUP THE BEGINNING PTR 787 053242 016704 173426 MOV DSKLHD+2,R4 ; R4 = PRIOR (LAST) NODE IN LIST ADDR 788 053246 004767 000770 CALL NODADD ; ADD NODE TO END OF QUEUE 789 053252 000167 000256 JMP DKTPDQ ; GO TO MAIN DE-QUEUING ROUTINE 790 791 053256 90$: QIOW$S #IO.KIL,#INLUN,#1,,#IOST ; CANCEL ALL OTHER DISK I/O'S 792 053324 052767 000004 173332 BIS #ERR,FLAGS ; FLAG THE ERROR 793 053332 016567 000004 173330 MOV N.IOST(R5),DSKERR ; SAVE DISK ERROR CODE 794 053340 RESUME ; CONTINUE THE MAIN TASK 795 796 053352 100$: ASTX$S ; EXIT THE AST TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 16 TAPOUT - TAPE OUTPUT I/O DONE AST ROUTINE 798 .SBTTL TAPOUT - TAPE OUTPUT I/O DONE AST ROUTINE 799 ; 800 ; TAPOUT - TAPE OUTPUT I/O DONE ROUTINE 801 ; 802 803 053360 012605 TAPOUT: MOV (SP)+,R5 ; R5 = I/O STATUS ADDRESS 804 053362 032767 000014 173274 BIT #,FLAGS ; ERRORS OR DONE? 805 053370 001056 BNE 100$ ; YES - JUST EXIT 806 053372 162705 000004 SUB #N.IOST,R5 ; ADJUST R5 TO POINT TO NODE 807 053376 105765 000004 TSTB N.IOST(R5) ; WAS THERE AN ERROR ON THE XFER? 808 053402 100413 BMI 90$ ; YES - SO INDICATE 809 810 053404 016565 000012 000016 MOV N.BUF(R5),N.PTR(R5) ; SETUP THE BUFFER POINTER 811 053412 005065 000010 CLR N.WRK(R5) ; RESET THE NO. BYTES LEFT TO XFER 812 053416 016704 173326 MOV TPLHD+2,R4 ; R4 = PRIOR (LAST) EXISTING NODE ADDR 813 053422 004767 000614 CALL NODADD ; ADD THE NODE TO FREE TAPE BUFFER LIST 814 053426 000167 000102 JMP DKTPDQ ; GO TO THE MAIN DE-QUEUING ROUTINE 815 816 053432 90$: QIOW$S #IO.KIL,#OUTLUN,#1,,#IOST ; CANCEL ALL CURRENT I/O'S 817 053500 052767 000004 173156 BIS #ERR,FLAGS ; FLAG THE ERROR 818 053506 016567 000004 173152 MOV N.IOST(R5),MTERR ; SAVE ERROR CODE 819 053514 RESUME ; CONTINUE EXECUTION OF MAIN TASK 820 821 053526 100$: ASTX$S TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 17 DKTPDQ - DISK TO TAPE DEQUEUE ROUTINE 823 .SBTTL DKTPDQ - DISK TO TAPE DEQUEUE ROUTINE 824 ; 825 ; DKTPDQ- 826 ; 827 ; THIS ROUTINE INTERFACES THE DATA COMING IN A CONTINUOUS STREAM 828 ; FROM THE DISK (IN MULTI-BLOCK BUFFERS) TO THE MAGTAPE OUTPUT. AS 829 ; THE TAPE IS BLOCKED 512., IT IS DESIRABLE TO KEEP A CONSTANT NO. 830 ; OF I/O REQUESTS QUEUED UP TO THE TAPE DRIVE, THEREBY ALLOWING 831 ; THIS PROGRAM TO PAY FOR ITSELF. 832 ; 833 834 053534 012700 046672' DKTPDQ: MOV #DSKLHD,R0 ; R0 = DISK LISTHEAD POINTER 835 053540 021000 CMP (R0),R0 ; NULL LIST? 836 053542 001407 BEQ 10$ ; YES - WAIT FOR WORK 837 053544 011000 MOV (R0),R0 ; R0 = THE 1ST NODE ADDR IN LIST 838 839 053546 012702 046746' MOV #TPLHD,R2 ; R2 = TAPE OUTPUT LISTHEAD ADDR 840 053552 021202 CMP (R2),R2 ; ANY NODES FREE FOR OUTPUT? 841 053554 001402 BEQ 10$ ; NO - WAIT FOR SOME TO FREE UP 842 053556 011202 MOV (R2),R2 ; R2 = ADDR OF 1ST FREE TAPE NODE 843 053560 000403 BR 20$ ; CONTINUE 844 845 053562 10$: ASTX$S ; EXIT AST 846 847 ; 848 ; TRANSFER DATA FROM THE CURRENT DISK BUFFER TO THE CURRENT TAPE BUFFER 849 ; (NOTE THAT THIS MIGHT BE THE RESUMPTION OF A TRANSFER BEGUN EARLIER). WHEN 850 ; THE TAPE BUFFER IS FILLED (OR THE OPERATION TYPE DETERMINED IF EOF), THE 851 ; THE TAPE NODE IS DEQUEUED & THE OUTPUT INITIATED. WHEN A DISK BUFFER IS 852 ; EMPTY, THE NEXT ONE IN THE QUEUE IS SERVICED. 853 ; 854 855 053570 016203 000010 20$: MOV N.WRK(R2),R3 ; R3 = REMAINING BYTES IF PARTIAL XFER 856 053574 001010 BNE 30$ ; WAS A PARTIAL - CONTINUE IT 857 053576 017003 000016 MOV @N.PTR(R0),R3 ; ELSE, START OF NEW RECORD 858 053602 062760 000002 000016 ADD #2,N.PTR(R0) ; ADVANCE OVER CONTROL WORD 859 053610 010362 000010 MOV R3,N.WRK(R2) ; SAVE IT AS SIZE REQ'D 860 053614 001467 BEQ 70$ ; ZERO - GO WRITE EOF 861 862 053616 016001 000010 30$: MOV N.WRK(R0),R1 ; R1 = ENDING DISK BUFFER ADDR 863 053622 166001 000016 SUB N.PTR(R0),R1 ; R1 = # BYTES LEFT IN BUFFER 864 053626 001520 BEQ 80$ ; NO BYTES LEFT IN BUFFER! 865 053630 020103 CMP R1,R3 ; WILL THIS BE A PARTIAL COPY? 866 053632 103005 BHIS 40$ ; NO - ALL OF DATA IN DISK BUFFER 867 053634 160103 SUB R1,R3 ; R3 = AMOUNT STILL REQ'D 868 053636 010362 000010 MOV R3,N.WRK(R2) ; UPDATE TAPE BUFFER REMAINING COUNT 869 053642 010103 MOV R1,R3 ; R3 = ACTUAL NUMBER OF BYTES TO XFER 870 053644 000402 BR 50$ ; CONTINUE 871 872 053646 005062 000010 40$: CLR N.WRK(R2) ; INDICATE WHOLE XFER GOOD 873 874 053652 016004 000016 50$: MOV N.PTR(R0),R4 ; R4 = FROM POINTER 875 053656 016205 000016 MOV N.PTR(R2),R5 ; R5 = TO POINTER 876 053662 006203 ASR R3 ; R3 = WORD XFER COUNT 877 878 053664 012425 60$: MOV (R4)+,(R5)+ ; COPY THE DARA 879 053666 077302 SOB R3,60$ ; ... TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 17-1 DKTPDQ - DISK TO TAPE DEQUEUE ROUTINE 880 881 053670 010460 000016 MOV R4,N.PTR(R0) ; UPDATE THE DISK POINTER 882 053674 010562 000016 MOV R5,N.PTR(R2) ; & THE TAPE POINTER 883 053700 005762 000010 TST N.WRK(R2) ; DO WE WRITE THE TAPE BUFFER? 884 053704 001071 BNE 80$ ; NO - SEE ABOUT DISK 885 053706 016204 000012 MOV N.BUF(R2),R4 ; R4 = TAPE BUFFER ADDRESS 886 053712 160405 SUB R4,R5 ; R5 = NO. BYTES DATA IN BUFFER 887 053714 010203 MOV R2,R3 ; R3 = THE IO STATUS ADDR 888 053716 062703 000004 ADD #N.IOST,R3 ; ... 889 053722 QIO$S #IO.WLB,#OUTLUN,,,R3,OUTVEC, 890 053764 042767 000001 172672 BIC #EOV,FLAGS ; RESET THE END-OF-VOLUME TEST BIT 891 053772 000433 BR 75$ ; CONTINUE 892 893 053774 010203 70$: MOV R2,R3 ; R3 = IO STATUS ADDR 894 053776 062703 000004 ADD #N.IOST,R3 ; ... 895 054002 QIO$S #IO.EOF,#OUTLUN,,,R3,OUTVEC 896 054044 032767 000001 172612 BIT #EOV,FLAGS ; WAS EOV FLAG SET LAST TIME? 897 054052 001060 BNE 100$ ; YES - TWO EOF'S = EOV 898 054054 052767 000001 172602 BIS #EOV,FLAGS ; NO - SO SET IT FOR THIS EOF 899 900 054062 010205 75$: MOV R2,R5 ; R5 = NODE ADDRESS FOR DELETE 901 054064 004767 000174 CALL NODDEL ; DELETE THE NODE FROM THE QUEUE 902 903 ; 904 ; DETERMINE WHETHER CURRENT DISK BUFFER IS EMPTY & INITIATE A NEW READ IF SO 905 ; 906 907 054070 026060 000010 000016 80$: CMP N.WRK(R0),N.PTR(R0) ; BUFFER EMPTY? 908 054076 101216 BHI DKTPDQ ; NO - CONTINUE DEQUEUEING 909 054100 010005 MOV R0,R5 ; R5 = NODE ADDR 910 054102 004767 000156 CALL NODDEL ; DELETE THE NODE FROM DISK QUEUE 911 054106 010001 MOV R0,R1 ; R1 = IO STATUS ADDR 912 054110 062701 000004 ADD #N.IOST,R1 ; ... 913 054114 016004 000012 MOV N.BUF(R0),R4 ; R4 = BUFFER ADDR 914 054120 016005 000014 MOV N.LEN(R0),R5 ; R5 = NO. BYTES TO READ 915 054124 012703 000000' MOV #FDBINP,R3 ; R3 = FDB ADDR 916 054130 QIO$S #IO.RVB,#INLUN,,,R1,INVEC, 917 054176 066763 172436 000066 ADD DSKFCT,F.BKVB+2(R3) ; UPDATE NEXT BLOCK# 918 054204 005563 000064 ADC F.BKVB(R3) ; ... 919 054210 000167 177320 JMP DKTPDQ ; CONTINUE 920 921 054214 052767 000010 172442 100$: BIS #DONE,FLAGS ; FLAG I/O DONE 922 054222 RESUME ; CONTINUE THE MAIN TASK 923 054234 ASTX$S ; EXIT AST TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 18 --SUBROUTINES-- 925 .SBTTL --SUBROUTINES-- 926 .SBTTL NODADD - ADD NODE TO DEQUE 927 ; 928 ; NODADD- ADD NODE TO DEQUE LIST 929 ; 930 ; INPUTS: R5 = NODE ADDRESS 931 ; R4 = PRIOR NODE ADDRESS 932 ; 933 ; OUTPUTS: SAME 934 ; 935 936 054242 010465 000002 NODADD: MOV R4,2(R5) ; SETUP BACKWARD POINTER 937 054246 011415 MOV (R4),(R5) ; SETUP FORWARD POINTER 938 054250 010514 MOV R5,(R4) ; SETUP PRIOR FORWARD POINTER 939 054252 011505 MOV (R5),R5 ; POINT R5 TO NEXT NODE 940 054254 011465 000002 MOV (R4),2(R5) ; SETUP NEXT BACKWARD POINTER 941 054260 011405 MOV (R4),R5 ; RESTORE R5 942 054262 000207 RETURN 943 944 945 .SBTTL NODDEL - DELETE NODE FROM DEQUE 946 ; 947 ; NODDEL- DELETE NODE FROM DEQUEUE LIST 948 ; 949 ; INPUTS: R5 = NODE ADDRESS 950 ; 951 ; OUTPUTS: SAME 952 ; 953 954 054264 011575 000002 NODDEL: MOV (R5),@2(R5) ; POINT PRIOR TO NEXT 955 054270 011546 MOV (R5),-(SP) ; SAVE NEXT ADDRESS 956 054272 062716 000002 ADD #2,(SP) ; POINT TO NEXT BACWARD POINTER 957 054276 016536 000002 MOV 2(R5),@(SP)+ ; POINT NEXT BACKWARD TO PRIOR 958 054302 000207 RETURN 959 960 961 962 047072' .END START TPC - DOS11 TAPE/DISK COPY UTIL MACRO M1110 17-APR-79 23:22 PAGE 18-1 SYMBOL TABLE ALCTAB 001110R ERRBUF 001236R F.OVBS= 000030 IO.ATT= ****** GX R.VAR = ****** GX ALLOC 001122R ERROR 050646R F.RACC= 000016 IO.EOF= ****** GX SALMSK= 000004 BLKMSK= 000002 FDBEND 000300R F.RATT= 000001 IO.KIL= ****** GX SALOC 001124R CHR$$ = 000117 FDBINP 000000RG F.RCNM= 000034 IO.RLB= ****** GX SALTAB 001114R CLOSE 050454R FDBOUT 000140RG F.RCTL= 000017 IO.RVB= ****** GX SIZ$$ = 000002 CNT$$ = 000002 FDBST 000000R F.RSIZ= 000002 IO.RWD= ****** GX START 047072R CONMSK= 000010 FD.CCL= ****** GX F.RTYP= 000000 IO.STC= ****** GX S.BFHD= 000020 CSI 001126R FD.CR = ****** GX F.SEQN= 000100 IO.WLB= ****** GX S.FATT= 000016 CSIFLG 001044R FD.REC= ****** GX F.SPDV= 000072 IO.WVB= ****** GX S.FDB = 000140 CSISW 001046R FD.RWM= ****** GX F.SPUN= 000074 MAGDEV 046652R S.FNAM= 000006 CS.DIF= 000002 FD.TTY= ****** GX F.STBK= 000036 MAGTST 050430R S.FNB = 000036 CS.DVF= 000004 FLAGS 046664R F.UNIT= 000136 MTERM 002565R S.FNBW= 000017 CS.EQU= 000040 FO.RD = ****** GX F.URBD= 000020 MTERR 046666R S.FNTY= 000004 CS.INP= 000001 FO.WRT= ****** GX F.VBN = 000064 NODADD 054242R S.FTYP= 000002 CS.MOR= 000020 F.ACTL= 000076 F.VBSZ= 000060 NODDEL 054264R S.NFEN= 000020 CS.NMF= 000001 F.ALOC= 000040 GCMBLK 000300R N.BKH = 000020 TAPEIN 051300R CS.OUT= 000002 F.BBFS= 000062 GE.BIF= 177775 N.BKL = 000022 TAPOUT 053360R CS.WLD= 000010 F.BDB = 000070 GE.CLO= 000004 N.BUF = 000012 TILUN = 000005 C.CMLD= 000002 F.BGBC= 000057 GE.COM= 000001 N.BWD = 000002 TPBFS = 001002 C.DEVD= 000006 F.BKDN= 000026 GE.CON= 000020 N.DID = 000024 TPBF0 042630R C.DIRD= 000012 F.BKDS= 000020 GE.EOF= 177766 N.DVNM= 000032 TPBF1 043632R C.DSDS= 000006 F.BKEF= 000050 GE.IND= 000002 N.FID = 000000 TPBF2 044634R C.FILD= 000016 F.BKP1= 000051 GE.IOR= 177777 N.FNAM= 000006 TPBF3 045636R C.MKW1= 000024 F.BKST= 000024 GE.LC = 000010 N.FTYP= 000014 TPDKDQ 051714R C.MKW2= 000026 F.BKVB= 000064 GE.MDE= 177774 N.FVER= 000016 TPLHD 046746R C.SIZE= 000054 F.CHR = 000075 GE.OPR= 177776 N.FWD = 000000 TPLND = 047072R C.STAT= 000001 F.CNTG= 000034 GE.RBG= 177730 N.IOST= 000004 TPLST 046752R C.SWAD= 000022 F.DFNB= 000046 GE.SIZ= 000040 N.LEN = 000014 TPTDSK 050706R C.TYPR= 000000 F.DSPT= 000044 G.CMLD= 000146 N.NEXT= 000022 WAIT 050554R DKTPDQ 053534R F.DVNM= 000134 G.DPRM= 000160 N.PTR = 000016 $EDMSG= ****** GX DONE = 000010 F.EFBK= 000010 G.ERR = 000140 N.SIZE= 000024 $$ = 000000 DSKBFS= 020000 F.EFN = 000050 G.ISIZ= 000020 N.STAT= 000020 $$$ = 000460R DSKBF0 002630R F.EOBB= 000032 G.LPDL= 000100 N.UNIT= 000034 $$$ARG= 000002 DSKBF1 022630R F.ERR = 000052 G.MODE= 000141 N.WRK = 000010 $$$OST= 000014 DSKBKS= 000020 F.FACC= 000043 G.PSDS= 000142 OUTDFN 001006R .CSI1 = ****** G DSKERM 002525R F.FFBY= 000014 G.SIZE= 000224 OUTDVF 046646R .CSI2 = ****** G DSKERR 046670R F.FNAM= 000110 HELP 050476R OUTLUN= 000002 .EXTND= ****** GX DSKFCT 046640R F.FNB = 000102 HLPEND= 002525R OUTVEC 046644R .FSRCB= ****** G DSKIN 053154R F.FTYP= 000116 HLPMSG 001356R PAR$$$= 000000 .GCML1= ****** G DSKLHD 046672R F.FVER= 000120 HLPMSK= 000001 QIO 001202RG .OPFNB= ****** G DSKLND= 046746R F.HIBK= 000004 IE.EOF= ****** GX Q.IOAE= 000012 .PARSE= ****** GX DSKLST 046676R F.LUN = 000042 INDFN 000750R Q.IOEF= 000006 .TRNCL= ****** GX DSKOUT 051550R F.MBCT= 000054 INDVF 046650R Q.IOFN= 000002 ...PC1= 000300R DSKTTP 052550R F.MBC1= 000055 INLUN = 000001 Q.IOLU= 000004 ...PC2= 001022R EOF = 000002 F.MBFG= 000056 INVEC 046642R Q.IOPL= 000014 ...PC3= 000300R EOV = 000001 F.NRBD= 000024 IOST 046660R Q.IOPR= 000007 ...TPC= 000140 ERR = 000004 F.NREC= 000030 IOSTAT 001232RG Q.IOSB= 000010 . ABS. 000000 000 054304 001 $$FSR1 003060 002 ERRORS DETECTED: 0 VIRTUAL MEMORY USED: 7659 WORDS ( 30 PAGES) DYNAMIC MEMORY: 8260 WORDS ( 31 PAGES) ELAPSED TIME: 00:02:42 TPC,TPC=TPC