TITLE DPATCH - FILE STRUCTURE DAMAGE ASSEMENT AND RESTORATION PROGRAM SUBTTL D. P. MASTROVITO /DPM ; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION ; 1988, 1989, 1990 ; ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ;VERSION NUMBERS VERMAJ==1 ;MAJOR VERSION VERMIN==0 ;MINOR VERSION VEREDT==56 ;EDIT LEVEL VERWHO==0 ;WHO LAST EDITED SEARCH UUOSYM ;TOPS-10 UUO SYMBOLS SALL ;CLEAN LISTINGS .DIRECT FLBLST ;CLEANER LISTINGS SUBTTL TABLE OF CONTENTS ; TABLE OF CONTENTS FOR DPATCH ; ; ; SECTION PAGE ; 1. TABLE OF CONTENTS......................................... 2 ; 2. REVSION HISTORY........................................... 3 ; 3. ASSEMBLY PARAMETERS....................................... 4 ; 4. DEFINITIONS ; 4.1 BYTE MANIPULATION................................. 5 ; 4.2 MESSAGE MACROS.................................... 6 ; 4.3 TEXT JUSTIFICATION MACRO.......................... 7 ; 4.4 COMMAND PROCESSING................................ 8 ; 4.5 FORMAT DESCRIPTOR................................. 10 ; 4.6 SCAN BLOCK........................................ 11 ; 4.7 FILE BLOCKS....................................... 12 ; 4.8 FILE I/O DATA BASE................................ 13 ; 4.9 LOGICAL BLOCK NUMBERS............................. 15 ; 4.10 SPECIAL PROGRAM SYMBOLS........................... 16 ; 4.11 BAT BLOCK......................................... 17 ; 4.12 HOM BLOCK......................................... 18 ; 4.13 RIB BLOCK......................................... 21 ; 4.14 UNIT BLOCKS....................................... 24 ; 4.15 SAT STORAGE....................................... 25 ; 4.16 DATA FILE......................................... 26 ; 4.17 TASK TABLE........................................ 27 ; 5. PROGRAM INITIALIZATION ; 5.1 ENTRY POINT....................................... 28 ; 5.2 CHKPRV - CHECK FOR PRIVILEGES..................... 29 ; 6. TOP LEVEL COMMAND PROCESSING.............................. 30 ; 7. DDT COMMAND............................................... 32 ; 8. DELETE COMMAND............................................ 33 ; 9. DIRECT COMMAND............................................ 34 ; 10. DUMP COMMAND.............................................. 45 ; 11. DUMP COMMAND ; 11.1 DMP7BT - 7-BIT ASCII.............................. 52 ; 11.2 DMP8BT - 8-BIT ASCII.............................. 54 ; 11.3 DMPATO - AUTOMATIC BLOCK DETECTION................ 56 ; 11.4 DMPBAT - BAT BLOCK................................ 57 ; 11.5 DMPDEC - DECIMAL.................................. 59 ; 11.6 DMPDIR - DIRECTORY................................ 60 ; 11.7 DMPHOM - HOM BLOCK................................ 61 ; 11.8 DMPMIX - MIXED FORMAT............................. 63 ; 11.9 DMPOCT - OCTAL.................................... 65 ; 11.10 DMPRIB - RIB...................................... 66 ; 11.11 DMPSIX - SIXBIT................................... 69 ; 11.12 DMPSPC - SPECIAL.................................. 70 ; 11.13 MISCELLANEOUS..................................... 71 ; 12. EXIT COMMAND.............................................. 72 ; 13. FILE COMMAND.............................................. 73 ; 14. FINISH COMMAND............................................ 75 ; 15. FORMAT COMMAND ; 15.1 ENTRY POINT....................................... 76 ; 15.2 FMTDMP - DUMP..................................... 78 ; 15.3 FMTIOT - I/O TRACE................................ 80 ; 16. GET COMMAND............................................... 91 ; 17. HELP COMMAND.............................................. 92 ; 18. PATCH COMMAND............................................. 97 ; 19. PUT COMMAND............................................... 106 ; 20. READ COMMAND.............................................. 107 ; 21. SET COMMAND ; 21.1 .SET - ENTRY POINT................................ 108 ; 21.2 SETBAT - BAT-UPDATES.............................. 110 ; 21.3 SETBPR - BLOCKS-PER-READ.......................... 111 ; 21.4 SETCED - CHECKSUM-ERROR........................... 112 ; 21.5 SETCPI - CHECKPOINT-INTERVAL...................... 113 ; 21.6 SETDFM - DUMP-FORMAT.............................. 114 ; 21.7 SETEDV - ERSATZ DEVICE............................ 115 ; 21.8 SETFAC - SET FILE-ACCESS.......................... 116 ; 21.9 SETHOM - HOM-UPDATES.............................. 117 ; 21.10 SETIBC - INHIBIT-CLEARING......................... 118 ; 21.11 SETIOT - I/O TRACE................................ 119 ; 21.12 SETLIP - LOGGED-IN PPN............................ 120 ; 21.13 SETLKP - SET LOOKUP TYPE.......................... 121 ; 21.14 SETNO - "NO" PREFIX HANDLING...................... 122 ; 21.15 SETOFN - "OFF/ON" HANDLING........................ 123 ; 21.16 SETPTH - PATH..................................... 124 ; 21.17 SETPPN - CURRENT PPN.............................. 125 ; 21.18 SETPSZ - PATCH-BUFFER-SIZE........................ 126 ; 21.19 SETRNG - SET RANGE................................ 127 ; 21.20 SETRIB - RIB-UPDATES.............................. 128 ; 21.21 SETSAT - SAT-UPDATES.............................. 129 ; 21.22 SETSRT - SORT BUFFER SIZE......................... 130 ; 21.23 SETZRS - ZERO-RIBSIZ.............................. 131 ; 22. START COMMAND............................................. 132 ; 23. STRUCTURE COMMAND ; 23.1 .STRUC - ENTRY POINT.............................. 137 ; 23.2 HOMDAT - COPY HOME BLOCK DATA..................... 139 ; 23.3 HOMFIX - FIXUP INCONSISTANCIES.................... 140 ; 23.4 HOMRD - READ HOM BLOCKS........................... 148 ; 23.5 HOMRPT - REPORT HOM CONSISTANCY ERRORS............ 149 ; 23.6 RDDISK - READ AND VALIDATE DATA................... 150 ; 23.7 STRFIX - FINAL VALUE FIXUPS....................... 157 ; 24. SHOW COMMAND.............................................. 159 ; 25. TRANSLATE COMMAND......................................... 162 ; 26. TYPE COMMAND.............................................. 174 ; 27. WRITE COMMAND............................................. 175 ; 28. ZERO COMMAND.............................................. 176 ; 29. COMMAND SCANNING ; 29.1 C$ATOM - READ INTO ATOM BUFFER.................... 178 ; 29.2 C$AYNQ - ASK A YES/NO QUESTION.................... 179 ; 29.3 C$BACK - BACK UP THE BYTE PONTER.................. 180 ; 29.4 C$TYI - READ A CHARACTER.......................... 181 ; 29.5 C$CEOL - CHECK FOR END OF LINE.................... 182 ; 29.6 C$CURR - GET CURRENT CHARACTER.................... 183 ; 29.7 C$FILE - PARSE A FILESPEC......................... 184 ; 29.8 C$DFIL - DEFAULT A SCAN BLOCK..................... 188 ; 29.9 C$ZFIL - ZERO OUT A SCAN BLOCK.................... 189 ; 29.10 C$HELP - TREE STRUCTURED HELP PROCESSOR........... 190 ; 29.11 C$HLPT - TABLE DRIVEN HELP........................ 191 ; 29.12 C$KEYW - READ A KEYWORD........................... 192 ; 29.13 C$NUMI - READ A NUMBER............................ 194 ; 29.14 C$OCTW - WILDCARDED OCTAL INPUT................... 196 ; 29.15 C$OPTN - SET OPTION PARAMETERS.................... 197 ; 29.16 C$READ - READ A COMMAND LINE...................... 198 ; 29.17 C$RNGE - RANGE CHECK NUMBERS...................... 202 ; 29.18 C$SAVE - SAVE COMMAND TABLE POINTERS.............. 203 ; 29.19 C$SIXQ - QUOTED/WILD SIXBIT TEXT.................. 204 ; 29.20 C$SKIP - SKIP TABS AND SPACES..................... 206 ; 29.21 TBLSET - TABLE SETUP.............................. 207 ; 29.22 COMMON ERROR ROUTINES............................. 208 ; 30. DATA FILE PROCESSING ; 30.1 D$ACTV - CHECK FOR ACTIVE FILE.................... 209 ; 30.2 D$EDVF - FIND ERSATZ DEVICE....................... 210 ; 30.3 D$EDVL - LOAD ERSATZ DEVICE TABLE................. 212 ; 30.4 D$EDVM - MODIFY AN ERSATZ DEVICE.................. 214 ; 30.5 D$FBLK - FIND AN FB GIVEN A BLOCK................. 215 ; 30.6 D$FNUM - FIND AN FB GIVEN A FILE NUMBER........... 216 ; 30.7 D$RBAT - READ BAT BLOCKS.......................... 217 ; 30.8 D$SORT - SORT FILE BLOCKS......................... 218 ; 30.9 D$FILE - OPEN DATA FILE........................... 226 ; 30.10 D$INIT - INITIALIZE PARAMETERS.................... 232 ; 30.11 D$RBTS - READ BOOT BLOCKS......................... 233 ; 30.12 D$RHOM - READ HOM BLOCKS.......................... 234 ; 30.13 D$RRIB - READ RETRIEVAL INFORMATION BLOCKS........ 235 ; 30.14 D$RSAT - READ SAT BLOCKS.......................... 240 ; 30.15 D$IOER - REPORT I/O ERROR......................... 247 ; 30.16 D$RHDR/D$WHDR - READ/WRITE HEADER................. 248 ; 30.17 D$READ - READ A BLOCK............................. 249 ; 30.18 D$WRIT - WRITE A BLOCK............................ 250 ; 30.19 D$SHWD - SHOW DATA FILE INFO...................... 251 ; 30.20 D$SERR - SHOW ERROR SUMMARY....................... 252 ; 30.21 D$SSAT - SHOW SAT-BLOCKS.......................... 255 ; 30.22 D$SDMP - SHOW DUMP DESCRIPTORS.................... 256 ; 30.23 D$SIOT - SHOW I/O TRACE DESCRIPTORS............... 257 ; 30.24 D$SHWE - SHOW ERSATZ DEVICES...................... 259 ; 30.25 D$SHWP - SHOW PARAMETERS.......................... 260 ; 30.26 D$SHPT - SHOW PATCH DATA.......................... 263 ; 30.27 D$SHWS - SHOW STRUCTURE DATA...................... 264 ; 30.28 D$TSKS - SCHEDULE A TASK.......................... 265 ; 30.29 D$VARS - SET VARIOUS RUNTIME VARIABLES............ 266 ; 30.30 D$VGET - ALLOCATE VARIABLE STORAGE................ 269 ; 30.31 D$VGIV - DEALLOCATE VARIABLE STORAGE.............. 270 ; 30.32 D$WILD - DO WILDCARD COMPARRISIONS................ 271 ; 31. FILE SERVICE ; 31.1 F$ADVP - ADVANCE POSITION WITHIN FILE............. 272 ; 31.2 F$BLKS - CONVERT UNIT/BLOCK TO STRUCTURE.......... 273 ; 31.3 F$BLKU - CONVERT BLOCK NUMBER TO UNIT............. 274 ; 31.4 F$BUFS - BUFFER SETUP............................. 275 ; 31.5 F$CHKS - GENERATE A CHECKSUM...................... 276 ; 31.6 F$CLOS - CLOSE A FILE............................. 277 ; 31.7 F$CVTF - CONVERT FILE BLOCK TO SCAN BLOCK......... 278 ; 31.8 F$DEL - DELETE A FILE............................. 279 ; 31.9 F$ECOD - STORE AN ERROR CODE...................... 281 ; 31.10 F$ETXT - RETURN ERROR TEXT........................ 282 ; 31.11 F$FIN - FINISH I/O PROCESSING..................... 283 ; 31.12 F$FMOD - FETCH WILDCARD MODE...................... 284 ; 31.13 F$FSCN - FIXUP SCAN BLOCK DEFAULTS................ 285 ; 31.14 F$RHOM - READ A HOM BLOCK......................... 289 ; 31.15 F$IBUF - INPUT.................................... 290 ; 31.16 F$IBYT - INPUT A BYTE............................. 291 ; 31.17 F$INI - INITIAL FOR FILE I/O...................... 292 ; 31.18 F$LKP - LOOKUP.................................... 293 ; 31.19 F$OBUF - OUTPUT................................... 302 ; 31.20 F$OBYT - OUTPUT A BYTE............................ 303 ; 31.21 F$POS - POSITION FOR I/O.......................... 304 ; 31.22 F$RBAT - READ A BAT BLOCK......................... 305 ; 31.23 F$RSET - RESET FILE SYSTEM........................ 306 ; 31.24 F$REST - RESTORE THE FILE SYSTEM.................. 307 ; 31.25 F$SAVE - SAVE THE FILE SYSTEM..................... 308 ; 31.26 F$SETU - POST LOOKUP SET UP....................... 309 ; 31.27 F$TRAC - I/O TRACE................................ 310 ; 31.28 F$DRIB - DEALLOCATE ALL CLUSTERS.................. 311 ; 31.29 F$VRIB - VALIDATE A RIB........................... 312 ; 31.30 F$XFRB - COUNT BLOCKS TRANSFERED.................. 317 ; 31.31 F$DSAT - DEALLOCATE BITS IN A SAT................. 318 ; 31.32 F$RSAT - READ A SAT BLOCK FROM DISK............... 319 ; 31.33 F$WSAT - WRITE A SAT BLOCK TO DISK................ 320 ; 32. LISTING CONTROL ; 32.1 L$CHAR - CHARACTER OUTPUT......................... 323 ; 32.2 L$CLOS - CLOSE FILE............................... 324 ; 32.3 L$ENVI - LIST ENVIRONMENT......................... 325 ; 32.4 L$FILE - SET UP OUTPUT SCAN BLOCK................. 326 ; 32.5 L$HDRS - SET HEADER SUBROUTINE.................... 327 ; 32.6 L$HDRZ - ZERO HEADER COUNTERS..................... 328 ; 32.7 L$HEAD - GENERATE BANNER/HEADER................... 329 ; 32.8 L$OPEN - OPEN FILE................................ 330 ; 32.9 L$PGSZ - RETURN PAGE SIZE......................... 334 ; 32.10 L$TABS - TAB TO SPECIFIED COLUMN.................. 335 ; 32.11 L$TEST - TEST PAGE................................ 336 ; 33. MEMORY MANAGER ; 33.1 M$GETW - ALLOCATE CORE............................ 337 ; 33.2 M$GIVW - DEALLOCATE CORE.......................... 339 ; 33.3 M$INIT - INITIALIZATION........................... 342 ; 34. TEXT PROCESSING ; 34.1 T$INIT - INITIALIZATION........................... 343 ; 34.2 T$ADDR - PRINT AN ADDRESS......................... 344 ; 34.3 T$ASCI - ASCII WORD............................... 345 ; 34.4 T$BPTR - PRINT A BYTE POINTER..................... 346 ; 34.5 T$CHAR - PRINT A CHARACTER........................ 347 ; 34.6 T$DATE - 15-BIT DATE.............................. 348 ; 34.7 T$DIRB - DIRECTORY................................ 349 ; 34.8 T$DTTM - DATE/TIME................................ 350 ; 34.9 T$ETIM - ELAPSED TIME............................. 351 ; 34.10 T$FCHR - FUNNY CHARACTER.......................... 352 ; 34.11 T$FILE - FILE (SCAN) BLOCK........................ 353 ; 34.12 T$HTIM - HIGH PRECISION TIME...................... 354 ; 34.13 T$JUST - JUSTIFY OUTPUT........................... 355 ; 34.14 T$RDXW - PRINT NUMBERS............................ 358 ; 34.15 T$PATH - PATH BLOCK............................... 359 ; 34.16 T$PPN - PPN....................................... 360 ; 34.17 T$PPNB - BRACKETED MASKED PPN..................... 361 ; 34.18 T$PPNM - MASKED PPN............................... 362 ; 34.19 T$RNGD - RANGE.................................... 363 ; 34.20 T$SETO - SET ALTERNATE CHARACTER OUTPUT ROUTINE... 364 ; 34.21 T$SIXN - PRINT A SIXBIT WORD...................... 365 ; 34.22 T$TIME - TIME..................................... 366 ; 34.23 T$STRG - PRINT A STRING........................... 367 ; 34.24 T$VERW - VERSION.................................. 368 ; 34.25 T$VMSG - VERBOSITY CONTROLLED MESSAGE............. 369 ; 34.26 T$XLAT - TRANSLATE DATA TO STRING STORAGE......... 371 ; 34.27 SPECIAL SINGLE CHARACTERS......................... 372 ; 34.28 MISCELLANEOUS ROUTINES............................ 373 ; 35. UNIT PROCESSING ; 35.1 U$CLOS - CLOSE A CHANNEL.......................... 374 ; 35.2 U$OPEN - OPEN A CHANNEL........................... 375 ; 35.3 U$POSI - POSITION FOR I/O......................... 376 ; 35.4 U$READ/U$WRIT - READ & WRITE...................... 377 ; 36. AC SAVE CO-ROUTINES....................................... 378 ; 37. FILE COPYING ROUTINES ; 37.1 CPYBLK - SETUP UUO BLOCKS......................... 379 ; 37.2 CPYCLS - CLOSE FILE............................... 380 ; 37.3 CPYCMD - READ FILESPECS........................... 381 ; 37.4 CPYENT - CREATE OUTPUT FILE....................... 383 ; 37.5 CPYFSC - FIXUP SCAN BLOCK......................... 384 ; 37.6 CPYFEX - FIXUP FILENAME & EXTENSION............... 386 ; 37.7 CPYFLP - FLIP SCAN BLOCKS......................... 387 ; 37.8 CPYLKP - LOOKUP A FILE............................ 388 ; 37.9 CPYRFS - READ RETURNED FILESPEC................... 389 ; 37.10 CPYSUM - PRINT SUMMARY............................ 390 ; 38. MISCELLANEOUS ROUTINES ; 38.1 BIT MAP HANDLING.................................. 391 ; 38.2 DATE/TIME CONVERSION.............................. 393 ; 38.3 GET DISK CHARACTERISTICS.......................... 397 ; 38.4 PDP-11 STRING PROCESSING.......................... 398 ; 39. LITERAL POOL.............................................. 401 ; 40. IMPURE STORAGE............................................ 402 SUBTTL REVSION HISTORY ; 1 DPM 10-AUG-88 ; CREATE FROM THE RUINS OF SEVERAL OTHER PROGRAMS. PURPOSE: TO ; PROVIDE A FACILITY TO PATCH DISKS AND RESTORE FILE STRUCTURES ; AFTER A SERIOUS SYSTEM FAILURE. ; ; 2 DPM 25-SEP-88 ; LOAD HOM, BAT, AND BOOT BLOCKS INTO DATA FILE FOR LATER EVALUATION. ; ; 3 DPM 10-OCT-88 ; CLEAN UP RIB READING CODE. CORRECT SOME BUGS IN BLOCK POSITIONING. ; ; 4 DPM 18-OCT-88 ; ADD REAL MEMORY MANAGER STOLEN FROM GLXLIB AND OPTIMIZED TO SUIT ; OUR NEEDS. ; ; 5 DPM 20-OCT-88 ; CORRECT BUG IN RRBCHK WHICH MIGHT LET A BLOCK WITHOUT RIBCOD PASS ; FOR A REAL RIB. ; ; 6 DPM 24-OCT-88 ; IMPLEMENT FILE BLOCK SORT ROUTINES. TEACH DIRECTORY COMMAND TO ; FOLLOW FILE BLOCK SORT LINKS. FIX OFF-BY-ONE BUF IN D$FNUM WHICH ; CAUSED THE WRONG DATA FILE BLOCK TO BE SELECTED IF THE TARGET FILE ; NUMBER WAS AN EVEN MULTIPLE OF FILE BLOCKS PER DISK BLOCK. ; ; 7 DPM 27-OCT-88 ; IMPLEMENT FILESPEC SCANNER AND SELECTIVE DIRECTORY OF FILES. ; ; 10 DPM 17-NOV-88 ; FIX ANOTHER BUG IN I/O ERROR RECOVERY WHICH CAUSED MULTIPLE FILE ; BLOCKS TO BE INSERTED INTO THE DATA FILE BECAUSE OF POSITIONING ; ERRORS. ; ; 11 DPM 21-NOV-88 ; FIX A PROBLEM WITH THE FILE BLOCK COMPARE ROUTINE WHICH CAUSED ; THE SORTED ORDER OF FILES TO BE WRONG WHEN SFDS WERE INVOLVED. ; ; 12 DPM 28-NOV-88 ; MERGE KEYWORDS FOR ENABLE & DISABLE INTO THE SET COMMAND. SEPARATE ; OUT THE INITIAL STRUCTURE & UNIT PROMPTING CODE AND PUT INTO THE ; STRUCTURE COMMAND. THIS WILL ALLOW PARAMETER SETTING BEGORE ANY ; UNIT OR STRUCTURE SPECIFICATIONS. ; ; 13 DPM 29-NOV-88 ; ADD A "START" COMMAND TO COMMENCE DAMAGE ASSESSMEMT. ; ; 14 DPM 30-NOV-88 ; ENABLE CHECKPOINT/RESTARTS. SORT CHECKPOINTS DON'T WORK YET. ; ; 15 DPM 2-DEC-88 ; FIX LOGIC WHICH DETERMINES RIB TYPES. ; ; 16 DPM 5-DEC-88 ; BEGIN FILSER SIMULATION. ADD CODE TO "OPEN", INPUT FROM, AND ; "CLOSE" A FILE. ; ; 17 DPM 14-DEC-88 ; IMPLEMENT TASK HANDLING/CHECKPOINT ROUTINES. ; ; 20 DPM 21-DEC-88 ; ADD DUMP COMMAND TO DUMP ARBITRARY BLOCKS ON THE SELECTED STRUCTURE, ; UNITS WITHIN THAT STRUCTURE, OR RELATIVE BLOCKS OF FILES ON THAT ; STRUCTURE. ; ; 21 DPM 22-DEC-88 ; START ADDING LISTING CONTROL PRIMATIVES. ; ; 22 DPM 28-DEC-88 ; FINISH UP LISTING CODE. CLEAN UP DIRECTORY AND DUMP COMMAND ; INTERFACES AS FAR AS LISTINGS ARE CONCERNED. ; ; 23 DPM 20-JUN-89 ; CLEAN UP SOME COMMAND INTERFACE STUFF. ; ; 24 DPM 22-JUN-88 ; ADD CODE TO IGNORE CERTAIN PARTS OF THE DISK WHEN SCANNING ; FOR RIBS. THE DATA IN FILES SUCH AS SWAP.SYS AND CRASH.EXE ; CAN BE EXCLUDED, AS THESE FILES CAN CONTAIN RIBS FROM MONITOR ; BUFFERS. ; ; 25 DPM 4-JAN-90 ; FIX LOOKUP BY HOM BLOCKS. ; ; 26 DPM 31-MAR-90 ; FURTHER REFINE LOOKUP BY HOM BLOCKS. ALMOST THERE, BUT MORE ; OR LESS USABLE RIGHT NOW. ; ; 27 DPM 2-APR-90 ; ADD PATCHING FACILITY. ; ; 30 DPM 5-APR-90 ; DO MORE CLEANUP ON THE LOOKUP CODE. NEARLY EVERYTHING WORKS ; NOW EXCEPT F.DIRB AND F.DIRP OPTIONS. ADD TRANSLATE COMMAND ; TO CONVERT DATA FROM ONE FORMAT INTO ANOTHER. ; ; 31 DPM 9-APR-90 ; REPLACE THE RATHER COMPLEX MEMORY MANAGER WITH A JOBFF-STYLE ; CORE ALLOCATOR. THIS IS BEST SUITED TO OUR NEEDS AND USES ; OVER 2P LESS CODE. ; ; 32 DPM 12-APR-90 ; DO MISCELLANEOUS CLEANUP. MAKE SURE ALL CALLS TO U$READ AND ; U$WRTE HAVE SETUP UP THE UNIT AND BLOCK ON UNIT PROPERLY. ; MAKE OPENING A CHANNEL TO THE CORRECT UNIT AUTOMATIC. ROUTINES ; WISHING TO DO I/O NO LONGER NEED TO MAKE CALLS TO U$OPEN. ; REPLACE ALL HALTS WITH APPROPRIATE ERROR MESSAGES OR RETURNS. ; ; 33 DPM 24-APR-90 ; FIX PROBLEMS WITH FILE-ACCESS VIA DATA FILE. A SIDE EFFECT WAS ; FORCING RETURNED FILE BLOCK AND SCAN BLOCKS POINTED TO BY THE ; DATA FILE TO BE FILLED AT THE TIME OF THE LOOKUP. CALLS TO ; F$INI NO LONGER HAVE THE OPTION OF SPECIFYING UNIQUE RETURNED ; FILESPEC BLOCKS. ; ; 34 DPM 1-MAY-90 ; ADD ERSATZ DEVICE SUPPORT. HAVE LOOKUP CODE RESOLVE SCAN BLOCK ; FIXUPS INSTEAD OF DOING IT IN THE FILESPEC SCANNER. ; ; 35 DPM 4-MAY-90 ; FIX SOME MINOR BUGS WHICH SURFACED WHILE REPAIRING A DAMAGED DISK. ; REMOVE THE DEFAULT INPUT, OUTPUT, AND LISTING FILESPECS. THEY ; WERE NOT USEFUL. ADD SET ERSATZ-DEVICE, PATH, AND PPN COMMANDS. ; ; 36 DPM 11-MAY-90 ; ADD F$POS TO DO POSITIONING WITHIN FILES. WITH THIS ROUTINE, ; IT IS POSSIBLE TO PATCH BLOCKS WITHIN A FILE. MAKE DATA FILE ; HEADER SIZE COMPUTATION EASIER. MOVE THE FILE I/O DATA STORAGE ; FOR PATCHING TO THE STATIC PORTION OF THE HEADER. FORGOT ABOUT ; HOMBTS IN THE HOM BLOCK DUMP CODE. DUMP AND EXPAND THE WORD. ; ; 37 DPM 14-MAY-90 ; REMOVE "SET IGNORE" FACILITY. IT CANNOT EASILY BE MADE TO WORK ; AND IS LESS THAN USEFUL IN ITS CURRENT STATE. ; ; 40 DPM 16-MAY-90 ; BE MORE DEFENSIVE ABOUT FILE FORMAT SKEWS. DON'T MEMORIZE HOM ; BAD BAT BLOCKS IN THE DATA FILE. INSTEAD, JUST KEEP A BIT MASK ; OF THE BLOCKS IN ERROR. ADD "SHOW ERROR-SUMMARY" COMMAND TO ; DISPLAY THE ERRORS. ALSO MOVE THE CHECKPOINT/RESTART DATA FOR ; RIB SCANNING INTO THE VARIABLE PORTION OF THE FILE HEADER. ; ; 41 DPM 23-MAY-90 ; MODIFY FILE SERVICE TO RECOGNIZE SYS:SAT.SYS SO IT MAY BE READ ; SEQUENTIALLY WITHOUT HAVING TO IGNORE UNSED BLOCKS. ADD CODE ; TO LOAD THE SAT BLOCKS INTO THE DATA FILE. ADD SAT ERRORS TO ; SHOW ERROR DISPLAY. ; ; 42 DPM 29-MAY-90 ; DON'T TRUST THE CONTENTS OF RIBFLR IF PROCESSING A PRIME RIB ; IN F$SETU. OLD RIBS CONTAIN JUNK IN THIS WORD. ; ; 43 DPM 31-MAY-90 ; ADD CODE TO READ AND WRITE THE SATS. CURRENTLY THERE IS NO LOGIC ; TO DO ACTUAL CLUSTER ALLOCATION OR DEALLOCATION. ; ; 44 DPM 4-JUN-90 ; INCLUDE HOMOVR IN TOTAL FREE BLOCK CALCULATIONS. MEMORIZE THIS ; PARAMETER WHEN THE STRUCTURE COMMAND IS GIVEN. ; ; 45 DPM 7-JUN-90 ; ADD FORMAT DESCRIPTORS, I/O TRACE FACILITY, AND DUMP "SPECIAL". ; ; 46 DPM 12-JUN-90 ; ADD DELETE COMMAND. IT IS FUNCTIONALLY EQUIVALENT TO THE DELFIL ; /S OPTION. ; ; 47 DPM 13-JUN-90 ; ADD GET COMMAND TO PULL FILES OFF THE SELECTED STRUCTURE. ; ; 50 DPM 15-JUN-90 ; IMPLEMENT CHECKSUM ERROR DETECTION AND A WAY TO OVERRIDE THE ; FEATURE. ; ; 51 DPM 9-JUL-90 ; FIX BUGS IN DATA FILE SAT MANAGEMENT WHICH CAUSED SATS FROM THE ; DATA FILE TO APPEAR INVALID. ; ; 52 DPM 18-SEP-90 ; MAKE COSMETIC IMPROVEMENTS. ; ; 53 DPM 19-SEP-90 ; FIX BUG IN SETEDV WHICH PREVENTED CHANGING ERSATZ DEVICE PPN ; ASSIGNMENTS. ALSO DON'T LET ERSATZ DEVICE SEARCHES TO SUCCEED ; IF THE PPN IS ZERO. ; ; 54 DPM 27-SEP-90 ; REWRITE FILE BLOCK SORT ROUTINE TO HANDLE CASES WHERE THE TOTAL ; NUMBER OF FILE BLOCKS WILL NOT FIT INTO CORE. IMPLEMENT A NEW ; SET COMMAND (SET SORT-BUFFER-SIZE) TO CONTROL THE NUMBER OF ; FILE BLOCKS WHICH CAN BE SORTED AT ONCE. FOR PRACTICAL REASONS, ; AN ARBITRARY LIMIT OF MAXSRT FILE BLOCKS WILL BE IMPOSED. ; ; 55 DPM 28-SEP-90 ; REMOVE REFERENCES TO "HIDDEN" MFD DATA. THIS WAS NEVER USED. ; ADD TRANSLATE ERROR TO DISPLAY THE ERROR TEXT ASSOCIATED WITH ; AN ERROR MNEMONIC. THESE MNEMONICS ARE DISPLAYED BY THE ; SHOW ERROR COMMAND WHEN SPECIAL BLOCKS ON UNITS ARE IN ERROR. ; ; 56 DPM 9-OCT-90 ; TREAT AS "ON" IN SET COMMANDS. ALSO PROVIDE HELP ON ; RESTRICTIONS AND PRACTICAL LIMITATIONS. SUBTTL ASSEMBLY PARAMETERS ;ACCULUMATORS P=1 ;PUSH DOWN LIST POINTER T4=<1+>>> ;FOUR CONSECUTIVE TEMPORARY ACS P4=<1+>>> ;FOUR CONSECUTIVE PRESERVED ACS D=12 ;DATA FILE HEADER ADDRESS U=13 ;UNIT BLOCK R=14 ;RETRIEVAL POINTER F=15 ;FILE I/O DIRECTORY LEVEL DATA POINTER ;CHANNELS DATCHN==1 ;DATA FILE I/O LSTCHN==2 ;LISTINGS CPYCHN==3 ;FILE COPYING DSKCHN==4 ;DISK I/O ;JOBDAT LOCATIONS JOBREL==44 ;HIGHEST ADDRESS IN LOW SEGMENT JOBDDT==74 ;DDT END,,START ADDRESSES JOBBPT==76 ;UNSOLICITED BREAKPOINT ADDRESS JOBSYM==116 ;SYMBOL TABLE POINTER JOBUSY==117 ;UNDEFINED SYMBOL TABLE POINTER JOBSA==120 ;INITIAL SIZE,,PROGRAM START ADDR JOBFF==121 ;FIRST FREE WORD AT END OF LOW SEGMENT JOBREN==124 ;REENTER ADDRESS JOBINT==134 ;INTERCEPT BLOCK JOBVER==137 ;VERSION JOBDA==140 ;FIRST WORD NOT USED BY JOB DATA AREA ;DEFAULT PARAMETERS IFNDEF DEFCPI, ;DEFAULT CHECKPOINT INTERVAL IFNDEF DEFLPP, ;DEFAULT LPT LINES PER PAGE IFNDEF DEFLWD, ;DEFAULT LPT WIDTH IFNDEF DEFPRD, ;DEFAULT BLOCKS PER READ REQUEST IFNDEF DEFPSZ, ;DEFAULT PATCH BUFFER SIZE IFNDEF DEFSRT, ;DEFAULT SORT BUFFER SIZE IFNDEF DEFTPP, ;DEFAULT TERMINAL LINES PER PAGE IFNDEF DEFTWD, ;DEFAULT TERMINAL WIDTH IFNDEF PRVBIT, ;NECESSARY PRIVS TO RUN WITH JACCT CMDSIZ==^D120 ;NUMBER OF CHARACTERS IN COMMAND BUFFER CMDWDS==CMDSIZ/5 ;NUMBER OF WORDS IN COMMAND BUFFER BLKSIZ==200 ;SIZE OF A DISK BLOCK CRDSIZ==BLKSIZ+10 ;NUMBER OF WORDS FOR CHECKPOINT RESTART DATA LSTSIZ==^D120*3 ;NUMBER CHARACTERS IN LISTING BANNER/HEADER LSTWDS==LSTSIZ/5 ;NUMBER WORDS IN LISTING BANNER/HEADER MAXDMP==12 ;MAXIMUM NUMBER OF DUMP DESCRIPTORS MAXEDV==200 ;PROBABLE NUMBER OF ERSATZ DEVICES (MUST ; BE GREATER THAN THE ACTUAL NUMBER) MAXIOT==12 ;MAXIMUM NUMBER OF I/O TRACE DESCRIPTORS MAXHKS==4 ;MAXIMUM HEADER KEYWORD SIZE IN WORDS MAXPAT==BLKSIZ*4 ;MAXIMUM SIZE OF PATCH BUFFER MAXSAT==^D100 ;MAXIMUM NUMBER OF SATS PER STRUCTURE MAXSFD==24 ;MAXIMUM NUMBER OF SFDS ALLOWED MAXSRT==^D1000 ;MAXIMUM NUMBER OF FILE BLOCKS TO SORT AT ONCE MAXUNI==20 ;MAXIMUM NUMBER OF UNITS PER STRUCTURE OURNAM=='DPATCH' ;OUR NAME OURPFX=='DPA' ;PREFIX FOR ERRORS, ETC. P11SIZ==3 ;MAXIMUM WORDS IN PDP-11 TRANSLATION BUFFER PATSIZ==200 ;PATCH SPACE PDLSIZ==100 ;PUSH DOWN LIST SIZE ;OPDEFS OPDEF IFIW [1B0] ;INSTRUCTION FORMAT INDIRECT WORD OPDEF PJRST [JUMPA 17,] ;PUSHJ/POPJ .NODDT IFIW, PJRST SUBTTL DEFINITIONS -- BYTE MANIPULATION ;COMPUTE WIDTH OF MASK, I.E. LENGTH OF LEFTMOST STRING OF ONES DEFINE WID (MASK),<<^L<-<_<^L>>-1>>> ;COMPUTE POSITION OF MASK, I.E. BIT POSITION OF RIGHTMOST ONE IN MASK DEFINE POS (MASK),<<^L<&<->>>> ;CONSTRUCT BYTE POINTER TO MASK DEFINE POINTR (LOC,MASK),<> ;INSERT A RIGHT-JUSTIFIED VALUE INTO FIELD SPECIFIED BY MASK DEFINE INSVL. (VALUE,MASK),<<<B)>>&>> SUBTTL DEFINITIONS -- MESSAGE MACROS ;MACRO TO GENERATE A MESSAGE DEFINE STOPCD (PFX,TXT,MOR),< .MSG. (0,PFX,0,,MOR)> DEFINE FATAL (PFX,CON,TXT,MOR),<.MSG. (1,PFX,CON,,MOR)> DEFINE WARN (PFX,CON,TXT,MOR),<.MSG. (2,PFX,CON,,MOR)> DEFINE INFO (PFX,CON,TXT,MOR),<.MSG. (3,PFX,CON,,MOR)> DEFINE .MSG. (TYP,PFX,CON,TXT,MOR),< PUSHJ P,[XLIST PUSHJ P,T$VMSG XWD ''PFX'',[ASCIZ |TXT|] XWD TYP,CON XWD MOR,0 LIST] > SUBTTL DEFINITIONS -- TEXT JUSTIFICATION MACRO ;MACRO TO JUSTIFY TEXT DEFINE JUSTIFY (POS,COL,CHR,RTN,ADR),< XLIST IFIDN , IFIDN , IFIDN , LIST PUSHJ P,[XLIST PUSHJ P,T$JUST EXP RTN BYTE(2)ZZ(7)0(9)^D(10)0(8)CHR] PURGE ZZ LIST > ;END DEFINE JUSTIFY SUBTTL DEFINITIONS -- COMMAND PROCESSING ;MACRO TO GENERATE COMMAND SCANNING TABLES DEFINE KEYTAB (PFX,TBL),< XLIST ...TBL==0 ...NAM==0 ...PRC==0 ...HLP==0 ...CMD==0 IRP TBL,< IFIDN ,<...TBL==1> IFIDN ,<...NAM==1> IFIDN ,<...PRC==1> IFIDN ,<...HLP==1> IFIDN ,<...CMD==1> > ;;END IRP TBL ;;GENERATE TABLE OF TABLE ADDRESSES IFN ...TBL,< PFX'.T: EXP >!> EXP >!> EXP >!> EXP >!> > ;;END IFN ...TBL ;;KEYTAB MACRO (CONTINUED) ;;GENERATE KEYWORD NAME TABLE DEFINE KEY (NAM,PRC,HLP,CMD), IFN ...NAM,< PFX'.N: XWD -PFX'.L,0 KEYS PFX'.L==.-PFX'.N > ;;GENERATE PROCESSOR TABLE DEFINE KEY (NAM,PRC,HLP,CMD), ;'NAM IFN ...PRC,< PFX'.P: XWD -PFX'.L,0 KEYS PFX'.L==.-PFX'.P > ;;GENERATE HELP TABLE DEFINE KEY (NAM,PRC,HLP,CMD), ;'NAM IFN ...HLP,< PFX'.H: XWD -PFX'.L,0 KEYS PFX'.L==.-PFX'.H > ;;GENERATE NEXT COMMAND TABLE DEFINE KEY (NAM,PRC,HLP,CMD), ;'NAM IFN ...CMD,< PFX'.C: XWD -PFX'.L,0 KEYS PFX'.L==.-PFX'.C > SALL PURGE ...TBL,...NAM,...PRC,...HLP,...CMD LIST > ;END DEFINE KEYTAB SUBTTL DEFINITIONS -- FORMAT DESCRIPTOR .ORG 0 .FMBPT:! BLOCK 1 ;BYTE POINTER TO DATA .FMKEY:! BLOCK MAXHKS ;ASCIZ KEYWORD .FMLEN:! ;LENGTH OF BLOCK .ORG ;DETERMINE THE MAXIMUM SIZE OF A FORMAT DESCRIPTOR BUFFER ZZ==0 IFG MAXDMP-ZZ, ;DUMP IFG MAXIOT-ZZ, ;I/O TRACE MAXFMT==ZZ ;MAXIMUM SIZE OF BUFFER SUBTTL DEFINITIONS -- SCAN BLOCK .ORG 0 .SBFLG:! BLOCK 1 ;SCANNER FLAGS SB.DEV==1B0 ;DEVICE SPECIFIED SB.NAM==1B1 ;FILE NAME SPECIFIED SB.EXT==1B2 ;EXTENSION SPECIFIED SB.DIR==1B3 ;DIRECTORY SPECIFIED SB.DPT==1B4 ;DEFAULT PATH ([-]) SPECIFIED SB.DCP==1B5 ;DEFAULT CURRENT PPN ([,]) SPECIFIED SB.DLP==1B6 ;DEFAULT LOGGED-IN PPN ([/]) SPECIFIED SB.DFF==1B7 ;DIRECTORY/FILE NAME FIXUP NEEDED SB.PPN==1B8 ;PPN FIXED UP SB.GDV==1B9 ;GLOBAL DEVICE SB.GNM==1B10 ;GLOBAL FILE NAME SB.GEX==1B11 ;GLOBAL EXTENSION SB.GDI==1B12 ;GLOBAL DIRECTORY SB.WLD==1B13 ;WILDCARDED FILESPEC .SBDEV:! BLOCK 1 ;DEVICE .SBDVM:! BLOCK 1 ;DEVICE MASK .SBNAM:! BLOCK 1 ;FILE NAME .SBNMM:! BLOCK 1 ;FILE NAME MASK .SBEXT:! BLOCK 1 ;EXTENSION,,MASK .SBDIR:! BLOCK 1 ;PPN .SBDIM:! BLOCK 1 ;PPN MASK .SBMIN:! ;MINIMUM LENGTH OF BLOCK .ORG SUBTTL DEFINITIONS -- FILE BLOCKS ;MACRO TO DEFINE ERROR FLAGS ;NOTE THAT DEFINITIONS OF THE FORM %NN ARE PLACE HOLDERS. WHEN A ;NEW BIT NEEDS TO BE DEFINED, TAKE THE FIRST AVAILABLE PLACE HOLDER. ;ERROR CODE NUMBERING STARTS WITH ONE, NOT ZERO. THEREFORE, %00 ;MUST NOT BE USED AND THERE IS A LIMIT OF 17 (DECIMAL) ERROR TYPES ;FOR A FILE BLOCK. DEFINE FBERR,< X (%00,<>) X (ALC,) X (FIR,) X (IOE,) X (MPD,) X (MRE,) X (NUB,) X (PTR,) X (SFD,) X (SLF,) X (XRW,) X (%11,<>) X (%12,<>) X (%13,<>) X (%14,<>) X (%15,<>) X (%16,<>) X (%17,<>) > ;END DEFINE FBERR DEFINE X (NAM,TXT),< XLIST ;;SUPPRESS LISTING FBENUM==FBENUM+1 ;;ADVANCE COUNTER IF1,> LIST ;;REINSTATE LISTING FB.'NAM==1B ;;ASSIGN A VALUE > ;END DEFINE X FBENUM==-1 ;CODE ZERO NOT USED .ORG 0 .FBIDN:! BLOCK 1 ;IDENTIFICATION WORD FB.NUM==777777B17 ;FILE NUMBER FB.SRT==777777B35 ;NEXT (SORTED) FILE NUMBER .FBXTR:! BLOCK 1 ;EXTENDED RIB WORD .FBBLK:! BLOCK 1 ;RIB BLOCK NUMBER (FROM CFP) .FBUFD:! BLOCK 1 ;BLOCK NUMBER WITHIN OWNING DIRECTORY .FBFLG:! BLOCK 1 ;FLAGS (LH = ERRORS, RH = MISCELLANEOUS) FBERR ;DEFINE ERROR BITS FB.RIB==1B24 ;POSSIBLE RIB FB.PRM==1B25 ;PRIME RIB FB.SPR==1B26 ;SPARE RIB FB.XTR==1B27 ;EXTENDED RIB FB.XRN==377B35 ;EXTENDED RIB NUMBER .FBNAM:! BLOCK 1 ;FILE NAME .FBEXT:! BLOCK 1 ;EXTENSION,,PROTECTION .FBCRE:! BLOCK 1 ;CREATION DATE/TIME .FBVER:! BLOCK 1 ;VERSION .FBALC:! BLOCK 1 ;ALLOCATION .FBPPN:! BLOCK 1 ;PPN .FBMIN:! ;MIMIMUM LENGTH OF BLOCK .ORG SUBTTL DEFINITIONS -- FILE I/O DATA BASE ;THE FILE I/O BLOCKS ARE DIVIDED INTO TWO SECTIONS. THE FIRST IS ;NECESSARY FOR I/O TO A SINGLE FILE. THE SECOND PART IS REQUIRED FOR ;DIRECTORY TREE SCANNING. THESE TWO SECTIONS MUST BE KEPT DISTINCT. ;THE SYMBOL ".FWMIN" DENOTES THE END OF THE FIRST PART; THOSE WORDS ;NECESSARY ONLY FOR SIMPLE FILE I/O. .ORG 0 .FWADR:! BLOCK 1 ;DISK ADDRESS (BLOCK) OF TARGET RIB .FWBLK:! BLOCK 1 ;BLOCK WITHIN FILE .FWBRH:! BLOCK 3 ;BUFFER RING HEADER .FWCLS:! BLOCK 1 ;NON-ZERO IF WORDS IN BUFFER NOT WRITTEN .FWECD:! BLOCK 1 ;ERROR CODE .FWFBF:! BLOCK 1 ;FILE BLOCK FLAGS .FWFBN:! BLOCK 1 ;FILE-RELATIVE BLOCK ON LAST I/O .FWIOD:! BLOCK 1 ;I/O DIRECTION (0 = READ, 1 = WRITE) .FWIOW:! BLOCK 1 ;IOWD TO BUFFER .FWLFT:! BLOCK 1 ;BLOCKS LEFT IN CURRENT POINTER .FWMOD:! BLOCK 1 ;MODE .FWOPF:! BLOCK 1 ;NON-ZERO IF FILE "OPENED" .FWOPT:! BLOCK 1 ;OLD RETRIEVAL POINTER (FOR CHECKSUMS) .FWRIF:! BLOCK 1 ;RIB I/O POSITION .FWRRB:! BLOCK 1 ;NON-ZERO IF RIB MUST BE REWRITTEN .FWPRM:! BLOCK 1 ;DISK ADDRESS (BLOCK) OF PRIME RIB .FWRBO:! BLOCK 1 ;RIB/BLOCK OFFSET FOR POSITIONING WITH XRIBS .FWRPT:! BLOCK 1 ;AOBJN POINTER TO RETRIEVAL PTRS IN .FWRIB .FWRIB:! BLOCK BLKSIZ ;RIB BUFFER .FWRWC:! BLOCK 1 ;REMAINING WORD COUNT IN FILE .FWSAT:! BLOCK 1 ;NON-ZERO IF READING SAT.SYS .FWSBN:! BLOCK 1 ;STRUCTURE-RELATIVE BLOCK ON LAST I/O .FWSFB:! BLOCK 1 ;-1 TO SKIP BLOCK IN RIB (PRIME/EXTENDED RIB) .FWSLB:! BLOCK 1 ;-1 TO SKIP BLOCK IN RIB (SPARE RIB) .FWUBN:! BLOCK 1 ;UNIT-RELATIVE BLOCK ON LAST I/O .FWUNI:! BLOCK 1 ;CURRENT LOGICAL UNIT FOR I/O .FWMIN:! ;MINIMUM LENGTH OF BLOCK .FWBUF:! BLOCK BLKSIZ ;DIRECTORY BLOCK DATA BUFFER .FWCON:! BLOCK 1 ;-1 TO CONTINUE SCANNING PREVIOUS LEVEL .FWDIF:! BLOCK 1 ;NON-ZERO IF CURRENT ENTRY IS A DIRECTORY .FWDIR:! BLOCK 2 ;TARGET DIRECTORY NAME AND MASK .FWEXT:! BLOCK 2 ;TARGET EXTENSION & MASK .FWFIL:! BLOCK 2 ;COUNT OF FILES SCANNED & MATCHED .FWLVL:! BLOCK 1 ;THIS DIRECTORY LEVEL .FWLVP:! BLOCK 1 ;POINTER TO THIS DIRECTORY LEVEL .FWNAM:! BLOCK 2 ;TARGET FILE NAME & MASK .FWPAS:! BLOCK 1 ;DIRECTORY SCAN PASS COUNT .FWPTR:! BLOCK 1 ;POINTER WITHIN CURRENT BUFFER .FWLEN:! ;LENGTH OF BLOCK .ORG ;SPECIAL "MODE" WORD FLAGS IN THE LEFT HALF OF TOPS-10 MODE WORD F.DIRA==1B0 ;RETURN DIRECTORY AFTER ITS CONTENTS F.DIRB==1B1 ;RETURN DIRECTORY BEFORE ITS CONTENTS F.DIRP==1B2 ;RETURN PARENT DIRECTORY IF LOW LEVEL WILD F.NOIO==1B3 ;NO I/O (ONLY LOOKUP) F.RETA==1B12 ;DIRECTORY RETURNED "AFTER" F.RETB==1B13 ;DIRECTORY RETURNED "BEFORE" F.RETP==1B13 ;RETURNED FILE FROM PARENT DIRECTORY F.WILD==7B17 ;MASK OF WILDCARD SCAN ROUTINE INDEX ;MACRO TO GENERATE FILE SERVICE ERRORS DEFINE FERR (NAM,RET),< PUSHJ P,[PUSHJ P,F$ECOD XWD FE'NAM'%,RET] > ;END DEFINE FERR ;MACRO TO BUILD ERROR TEXT TABLE ;NOTE THE REFERENCE TO FBERR. FILE BLOCK ERROR CODE DEFINITIONS ;MUST PRECEDE ALL OTHERS, SINCE THERE IS A DIRECT RELATIONSHIP ;BETWEEN A FILE BLOCK ERROR CODE AND ITS CORRESPONDING BIT IN THE ;FILE BLOCK ERROR MASK. DEFINE FERRT,< FBERR X (CKS,) X (DLF,) X (DNO,) X (EOD,) X (EOF,) X (FNF,) X (HRE,) X (IBN,) X (IDV,) X (IER,) X (IFN,) X (IMD,) X (INI,) X (NMF,) X (NXR,) X (OER,) X (SBZ,) X (SPN,) X (STP,) X (TRN,) X (XLI,) X (XRI,) > ;END DEFINE FERRT DEFINE X (NAM,TXT),> ZZ==FBENUM-1 FERRT SUBTTL DEFINITIONS -- LOGICAL BLOCK NUMBERS LBNHOM==^D1 ;FIRST HOME BLOCK LB2HOM==^D10 ;SECOND HOME BLOCK LBOBAT==1 ;OFFSET FROM HOME BLOCK TO BAT BLOCK LBOISW==2 ;OFFSET FROM HOME BLOCK TO INITIAL SWAPPING SAT FBOOTB==^D4 ;STARTING BLOCK NUMBER FOR BOOTS NBOOTB==4 ;NUMBER OF BLOCKS IN BOOTS DEFINE SYM (FLG,NAM,VAL),< IFIDN , IFIDN , > ;END DEFINE SYM SUBTTL DEFINITIONS -- SPECIAL PROGRAM SYMBOLS DEFINE SYMPGM,< SYM (G,BUF, DATHDR+.DFPBF) ;PATCH BUFFER ADDRESS SYM (G,DEBUG, DEBUG) ;PROGRAM DEBUGGING START ADDRESS SYM (G,FBOOTB,FBOOTB) ;STARTING BLOCK NUMBER FOR BOOTS SYM (G,JOBSYM,JOBSYM) ;SYMBOL TABLE POINTER SYM (G,JOBUSY,JOBUSY) ;UNDEFINED SYMBOL TABLE POINTER SYM (G,LBNHOM,LBNHOM) ;LOGICAL BLOCK NUMBER OF THE FIRST HOM BLOCK SYM (G,LB2HOM,LB2HOM) ;LOGICAL BLOCK NUMBER OF THE SECOND HOM BLOCK SYM (G,LBOBAT,LBOBAT) ;OFFSET FROM A HOM BLOCK TO A BAT BLOCK SYM (G,LBOISW,LBOISW) ;OFFSET TO THE INITIAL SWAPPING SAT SYM (G,NBOOTB,NBOOTB) ;NUMBER OF BLOCKS IN BOOTS SYM (G,PATCH, PATCH) ;PATCH SPACE SYM (G,RET, RET) ;ADDRESS TO RETURN TO PROGRAM SYM (G,SAVSYM,SAVSYM) ;SAVED ORIGINAL SYMBOL TABLE POINTER SYM (G,SAVUSY,SAVUSY) ;SAVED ORIGINAL UNDEFINED SYMBOL TABLE POINTER SYM (G,START, START) ;PROGRAM START ADDRESS SYM (G,SYMTAB,SYMTAB) ;PATCH SYMBOL TABLE SYM (P,DPATCH,0) ;PROGRAM NAME (MUST BE LAST) > ;END DEFINE SYMPGM SUBTTL DEFINITIONS -- BAT BLOCK DEFINE SYMBAT,< SYM (L,BAFNAM,0) ;"BAT" IN SIXBIT SYM (L,BAFFIR,1) ;AOBJN POINTER TO BAD REGION WORD PAIRS SYM (L,BAFNBS,2) ;# BAD BLOCKS FOUND BY MAP PROGRAM SYM (L,BASNBS,^D9) ;BYTE SIZE SYM (L,BANNBS,^D8) ;BYTE POSITION SYM (L,BAFNBR,BAFNBS) ;# OF BAD REGIONS FOUND BY MAP PROGRAM SYM (L,BASNBR,^D9) ;BYTE SIZE SYM (L,BANNBR,^D17) ;BYTE POSITION SYM (L,BAFKDC,2) ;KONTROLLER DEVICE CODE USED BY MAP PROGRAM SYM (L,BASKDC,^D7) ;BYTE SIZE SYM (L,BANKDC,^D24) ;BYTE POSITION SYM (L,BAFCNT,3) ;# BAD REGIONS FOUND BY MONITOR SYM (L,BAFREG,4) ;OFFSET OF FIRST BAD REGION WORD PAIR ;BAD REGION WORD PAIR DEFINITIONS SYM (L,BAFNBB,0) ;# BAD BLOCKS-1 IN THIS REGION SYM (L,BASNBB,^D9) ;BYTE SIZE SYM (L,BANNBB,^D8) ;BYTE POSITION SYM (L,BAFNUM,777) ;MAX NUMBER OF BAD BLOCKS IN A REGION-1 SYM (L,BAFOTH,0) ;BIT NON-ZERO IF BAD REGION IS DETECTED ON ANOTHER ;KONTROLLER OR PROCESSOR THAN THE ONE WHICH ADDED ;THE ENTRY IN THE FIRST PLACE SYM (L,BAPOTH,400) ;BIT POS IN LH SYM (L,BAFPUB,0) ;PHYSICAL UNIT BIT WITHIN CONTROLLER SYM (L,BASPUB,^D8) ;BYTE SIZE SYM (L,BANPUB,^D17) ;BYTE POSITION SYM (L,BAFKNM,0) ;LOGICAL KONTROLLER NUMBER OF THIS TYPE SYM (L,BASKNM,^D3) ;BYTE SIZE SYM (L,BANKNM,^D20) ;BYTE POSITION SYM (L,BAPNTP,40000) ;BIT ON FOR NEW-STYLE BAT BLOCK ENTRIES SYM (L,BAFAPN,0) ;ARITHMETIC PROCESSOR NUMBER WHICH DETECTED ERROR SYM (L,BASAPN,^D14) ;BYTE SIZE SYM (L,BANAPN,^D35) ;BYTE POSITION SYM (L,BAFELB,1) ;FIRST LOGICAL BLOCK (WITHIN UNIT) OF BAD REGION SYM (L,BAJCNI,-^D6) ;-VE # OF LOW ORDER STATUS BITS WHICH DO NOT CONTAIN ; INTERESTING CONI ERROR STATUS BITS. ;LH OF BAFELB IS USED FOR CONI BITS 12 THROUGH 29 ; ON RC-10 AND RP-10 UNITS. SYM (L,BAFVER,1) ;BITS 0-2 VERSION NUMBER OF ENTRY SYM (L,BAFERR,1) ;ERROR BITS SYM (L,BAPOTR,40000) ;OTHER (L,NOT DATA OR SEARCH ERROR) SYM (L,BAPDTR,20000) ;DATA ERROR (L,PARITY OR ECC HARD) SYM (L,BAPHDR,10000) ;SEARCH ERROR OR HEADER COMPARE ERROR SYM (L,BATMSK,777000) ;MASK (LH) FOR BAT ENTRY BLOCK NUMBER SYM (L,MBTMSK,700777) ;MASK FOR JUST ERROR BITS FOR BAT ENTRY SYM (L,BAFCOD,176) ;CONTAINS UNLIKELY CODE SYM (L,CODBAT,606060) ;UNLIKELY CODE FOR BAT BLOCK SYM (L,BAFSLF,177) ;BLOCK # WITHIN UNIT OF THIS BLOCK SYM (P,BAT,0) ;PROGRAM NAME (MUST BE LAST) > ;END DEFINE SYMBAT SYMBAT SUBTTL DEFINITIONS -- HOM BLOCK DEFINE SYMHOM,< SYM (L,HOMNAM,0) ;"HOM" IN SIXBIT SYM (L,HOMHID,1) ;SIXBIT UNIT ID SYM (L,HOMPHY,2) ;LH = PHYSICAL ADDRESS OF THIS HOM BLOCK ;RH = PHYSICAL ADDRESS OF OTHER HOM BLOCK SYM (L,HOMSRC,3) ;LOCICAL POSITION OF STR IN SSL SYM (L,HOMSNM,4) ;SIXBIT STR NAME THIS UNIT BELONGS TO SYM (L,HOMNXT,5) ;SIXBIT UNIT ID OF NEXT UNIT IN THIS STR SYM (L,HOMPRV,6) ;SIXBIT UNIT ID OF PREVIOUS UNIT IN THIS STR SYM (L,HOMLOG,7) ;SIXBIT LOGICAL UNIT # WITHIN STR OF THIS UNIT SYM (L,HOMLUN,10) ;LOGICAL UNIT # WITHIN STR OF THIS UNIT SYM (L,HOMPPN,11) ;PPN OF USER WHO REFRESHED DISK UNDER TIMESHARING SYM (L,HOMHOM,12) ;LH = LOGICAL BLOCK # WITHIN UNIT FOR 1ST HOM BLOCK ;RH = LOGICAL BLOCK # WITHIN UNIT FOR 2ND HOM BLOCK SYM (L,HOMGRP,13) ;# BLOCKS TO TRY FOR ON SEQUENTIAL OUTPUT ALLOCATION SYM (L,HOMBSC,14) ;# BLOCKS PER SUPER CLUSTER IN THIS STR SYM (L,HOMSCU,15) ;# SUPER CLUSTERS PER UNIT SYM (L,HOMCNP,16) ;BYTE PTR FOR CLUSTER COUNT IN A RETRIEVAL PTR SYM (L,HOMCKP,17) ;BYTE PTR FOR CHECKSUM IN A RETRIEVAL PTR SYM (L,HOMCLP,20) ;BYTE PTR FOR CLUSTER ADDRESS IN A RETRIEVAL PTR SYM (L,HOMBPC,21) ;# BLOCKS PER CLUSTER SYM (L,HOMK4S,22) ;# OF K WORDS OF THIS UNIT USED FOR SWAPPING SYM (L,HOMREF,23) ;NON-ZERO IF STR MUST BE REFRESHED SYM (L,HOMSIC,24) ;# SAT BLOCKS IN CORE SYM (L,HOMSID,25) ;SWAPPING ID - SIXBIT UNIT ID OF NEXT UNIT IN ASL SYM (L,HOMSUN,26) ;LOGICAL UNIT # IN ASL SYM (L,HOMSLB,27) ;FIRST LOGICAL BLOCK ON UNIT FOR SWAPPING SYM (L,HOMCFS,30) ;SWAPPING CLASS FOR UNIT SYM (L,HOMSPU,31) ;# SAT BLOCKS PER UNIT SYM (L,HOMOVR,32) ;-# OF BLOCKS OF OVERDRAW ALLOWED A USER ON THIS STR SYM (L,HOMGAR,33) ;UPPER BOUND ON BLOCKS GUARRANTEED BY RESERVED QUOTAS SYM (L,HOMTAB,34) ;FIRST LOC OF TABLE OF LOG. BLOCK NOS OF SYSTEM FILES SYM (L,HOMSAT,HOMTAB) ;LOGICAL BLOCK # WITHIN STR OF RIB FOR SAT.SYS SYM (L,HOMHMS,35) ; " FOR HOME.SYS SYM (L,HOMSWP,36) ; " FOR SWAP.SYS SYM (L,HOMMNT,37) ; " MAINT.SYS SYM (L,HOMBAD,40) ; " BADBLK.SYS SYM (L,HOMCRS,41) ; " FOR CRASH.EXE SYM (L,HOMSNP,42) ; " SNAP.SYS SYM (L,HOMRCV,43) ; " RECOV.SYS SYM (L,HOMSUF,44) ; " SYS UFD SYM (L,HOMPUF,45) ; " PRINTR UFD SYM (L,HOMMFD,46) ; " FOR MFD [1,1].UFD SYM (L,HOMPT1,47) ;COPY OF 1ST RETRIEVAL PTR FOR MFD FOR STR SYM (L,HOMUN1,50) ;LOGICAL UNIT # OF UNIT ON WHICH MFD BEGINS SYM (L,HOMLEN,51) ;FIRST ADDRESS OF TABLE OF LENGTHS OF SYSTEM FILES SYM (L,HOMUTP,57) ;UNIT TYPE ON WHICH HOM BLOCK WAS WRITTEN (UNYUTP) SYM (L,HOMRIP,60) ;USED BY RIPOFF SYM (L,HOMKLB,61) ;20 WORDS USED BY PDP-11 IN KL10 SYSTEMS SYM (L,HOMFEB,HOMKLB) ;FIRST DATA BLOCK # OF FE.SYS SYM (L,FEVALID,100000) ;VALID ADDRESS IF ON SYM (L,HOMFEL,62) ;LENGTH OF FE.SYS SYM (L,HOMFEA,101) ;FE-FILE ADDRESS FOR KS10 SYM (L,HOMFES,102) ;FE-FILE LENGTH FOR KS10 SYM (L,HOMTCS,103) ;TRACK/CYL/SECTOR FOR KS10 SYM (L,HOMKLE,104) ;TO FIND FILES FOR BOOTSTRAP/DUMP SYM (L,HOMK4C,105) ;K FOR CRASH.SAV (NEW DISK) SYM (L,HOMBTS,106) ;BITS IN THE HOM BLOCK SYM (L,HOMPVS,HOMBTS) ;WORD CONTAINING BIT WHICH SAYS PRIVATE STR SYM (L,HOPPVS,1B35) ;ON IF THIS UNIT IS CONTAINED IN A PRIVATE STR SYM (L,HOSPVS,1) ;BYTE SIZE SYM (L,HONPVS,^D35) ;BYTE POSITION SYM (L,HOMSET,HOMBTS) ;WORD CONTAINING BYTE WHICH SPECIFIES DISK SET FOR STR SYM (L,HOSSET,6) ;BYTE SIZE SYM (L,HONSET,^D32) ;BYTE POSITION SYM (L,HOMSDL,107) ;POSITION OF THIS STR IN SYSTEM DUMP LIST SYM (L,HOMOPP,110) ;OWNER PPN OF THIS STR SYM (L,HOMMSU,111) ;FOR FUTURE USE SYM (L,HOMCUS,112) ;4 WORDS RESERVED TO CUSTOMERS SYM (L,HOMCUL,115) ;LAST WORD IN THE HOM BLOCK RESERVED TO CUSTOMERS SYM (L,HOMEND,115) ;LAST WORD CONTAINING VALID DATA IN HOM BLOCK SYM (L,HOMVID,165) ;VOLUME ID (3 WORDS, 12 PDP-11 BYTES) SYM (L,HOMOKC,170) ;K FOR CRASH.SAV (OLD DISK) SYM (L,HOMOWN,170) ;OWNER NAME SYM (L,HOMVSY,173) ;SYSTEM TYPE (TOPS-10) SYM (L,HOMCOD,176) ;CONTAINS UNLIKELY CODE SYM (L,CODHOM,707070) ;THE UNLIKELY CODE FOR THE HOM BLOCK SYM (L,HOMSLF,177) ;BLOCK # WITHIN UNIT OF THIS BLOCK SYM (P,HOM,0) ;PROGRAM NAME (MUST BE LAST) > ;END DEFINE SYMHOM SYMHOM SUBTTL DEFINITIONS -- RIB BLOCK DEFINE SYMRIB,< SYM (L,RIBFIR,0) ;AOBJN POINTER TO FIRST RETRIEVAL POINTER SYM (L,RIBPPN,1) ;PPN WHICH OWNS FILE SYM (L,RIBNAM,2) ;FILE NAME SYM (L,RIBEXT,3) ;LH = EXTENSION ;RH = ACCESS DATE SYM (L,RIBATT,4) ;FILE ATTRIBUTES SYM (L,RIBPRV,RIBATT) ;00-08 ACCESS CODE SYM (L,RISPRV,^D9) ;BYTE SIZE SYM (L,RINPRV,^D8) ;BYTE POSITION ;09-12 CREATION TIME IN MINUTES SINCE MIDNIGHT ;24-35 CREATION DATE SYM (L,RIBSIZ,5) ;WRITTEN LENGTH IN WORDS SYM (L,RIBVER,6) ;VERSION NUMBER SYM (L,RIBSPL,7) ;SPOOLED FILE NAME SYM (L,RIBEST,10) ;ESTIMATED FILE LENGTH SYM (L,RIBALC,11) ;# OF BLOCKS ALLOCATED TO FILE INCLUDING RIBS SYM (L,RIBPOS,12) ;LOGICAL BLOCK WITHIN STR OF LAST ALLOCATED GROUP SYM (L,RIBFT1,13) ;PRIVILEGED ARG FOR DIGITAL TO DEFINE SYM (L,RIBUNI,RIBFT1) ;UNITS WHICH WROTE FILE ;BITS 10-17 = UNIT ;BITS 18-20 = KONTROLLER ;BITS 21-35 = APR SERIAL NUMBER SYM (L,RIBNCA,14) ;UNPRIVILEGED ARG FOR EACH CUSTOMER TO DEFINE SYM (L,RIBLNA,RIBNCA) ;LAST UNPRIVILEGED ARG SYM (L,RIBMTA,15) ;36-BIT TAPE LABEL IF FILE HAS BEEN PUT ON MAGTAPE SYM (L,RIBDEV,16) ;FILE STRUCTURE NAME FILE STARTS ON SYM (L,RIBSTS,17) ;STATUS BITS FOR ALL FILES IN UFD(LH), THIS FILE (RH) SYM (L,RIPLOG,400000) ;(LH) USER LOGGED IN SYM (L,RIPCHG, 10000) ;(LH) ANY FILE WRITTEN/RENAMED SYM (L,RIPDIR,400000) ;(RH) DIRECTORY FILE SYM (L,RIPNDL,200000) ;(RH) NO DELETE SYM (L,RIPDMP,100000) ;(RH) CONTAINS AN UNPROCESSED MONITOR CRASH SYM (L,RIPNFS, 40000) ;(RH) NO FAILSAFE SYM (L,RIPABC, 20000) ;(RH) ALWAYS BAD CHECKSUM SYM (L,RIPCBS, 10000) ;(RH) COMPRESS BIT SET ON ENTRY TO COMPRESSOR SYM (L,RIPABU, 4000) ;(LH/RH) ALWAYS BACKUP SYM (L,RIPNQC, 2000) ;(LH/RH) NON QUOTA-CHECKED FILE SYM (L,RIPCMP, 1000) ;(RH) THIS UFD IS BEING COMPRESSED SYM (L,RIPSCE, 400) ;(LH/RH) SOFTWARE CHECKSUM ERROR SYM (L,RIPHWE, 200) ;(LH/RH) HARD WRITE DATA ERROR SYM (L,RIPHRE, 100) ;(LH/RH) HARD READ DATA ERROR SYM (L,RIPRMS, 40) ;(RH) RMS FILE SYM (L,RIPPAL, 20) ;(RH) PRE-ALLOCATED FILE SYM (L,RIPBFA, 10) ;(LH/RH) FILE(S) FOUND BAD BY FAILSAFE SYM (L,RIPCRH, 4) ;(LH/RH) FILE(S) CLOSED AFTER A CRASH SYM (L,RIPBDA, 1) ;(LH/RH) FILE(S) FOUND BAD BY DAMAGE ASSESSMENT CUSP SYM (L,RIBELB,20) ;LOGICAL BLOCK WITH ERROR IN WHICH BAD REGION BEGINS SYM (L,RIBEUN,21) ;LH=LOGICAL UNIT ON WHICH ERROR REGION OCCURED SYM (L,RIBNBB,RIBEUN) ;RH=# OF CONSECUTIVE LOGICAL BLOCKS IN BAD REGION SYM (L,RIBQTF,22) ;(UFD ONLY) FIRST COME FIRST SERVE LOGGED IN QUOTA SYM (L,RIBTYP,RIBQTF) ;(DATA FILE) FILE TYPE AND FLAGS SYM (L,RIBQTO,23) ;(UFD ONLY) LOGGED-OUT QUOTA SYM (L,RIBBSZ,RIBQTO) ;(DATA FILE) BYTE SIZE WORD SYM (L,RIBQTR,24) ;(UFD ONLY) RESERVED LOGGED IN QUOTA SYM (L,RIBRSZ,RIBQTR) ;(DATA FILE) RECORD AND BLOCK SIZES SYM (L,RIBUSD,25) ;(UFD ONLY) COUNT OF BLOCKS USED SYM (L,RIBAPW,RIBUSD) ;(DATA FILE) APPLICATION WORD SYM (L,RIBAUT,26) ;PPN OF AUTHOR OF FILE SYM (L,RIBNXT,27) ;NAME OF NEXT FILE STRUCTURE IF FILE IS CONTINUED SYM (L,RIBPRD,30) ;NAME OF PREDECESSOR FILE STRUCTURE SYM (L,RIBPCA,31) ;PRIVILEGED ARG FOR EACH CUSTOMER TO DEFINE SYM (L,RIBUFD,32) ;LOGICAL BLOCK WITHIN STR OF UFD DATA BLOCK SYM (L,RIBFLR,33) ;RELATIVE BLOCK IN FILE OF FIRST BLOCK IN RIB SYM (L,RIBXRA,34) ;EXTENDED RIB ADDRESS SYM (L,DESRBC,^D8) ;COUNT OF RIBS, BYTE SIZE SYM (L,DENRBC,^D8) ;BYTE POSITION, POINTER IS DEYRBC SYM (L,DESRBU,^D4) ;LOGICAL UNIT WITHIN STR, BYTE SIZE SYM (L,DENRBU,^D12) ;BYTE POSITION, POINTER IS DEYRBU SYM (L,DESRBA,^D23) ;CLUSTER ADDRESS, BYTE SIZE SYM (L,DENRBA,^D35) ;BYTE POSITION, POINTER IS DEYRBA SYM (L,RIBTIM,35) ;CREATION DATE & TIME IN NEW DATE FORMAT SYM (L,RIBLAD,36) ;(UFD ONLY) LAST ACCOUNTING DATE SYM (L,RIBDED,37) ;(UFD ONLY) DIRECTORY EXPIRATION DATE SYM (L,RIBACT,40) ;AOBJN POINTER TO ACCOUNT STRING ;FIRST RETRIEVAL POINTER STORED HERE. THERE IS NO SYMBOL ASSIGNED. ;RIBFIR IS THE ONLY POINTER TO THIS AREA. SYM (L,RIPNUB,400000) ;BIT SET IN NEW UNIT PTR. TO INSURE NON-ZERO SYM (L,RIBCOD,176) ;CONTAINS UNLIKELY CODE SYM (L,CODRIB,777777) ;THE UNLIKELY CODE FOR THE RIB BLOCK SYM (L,RIBSLF,177) ;BLOCK # WITHIN UNIT OF THIS BLOCK SYM (P,RIB,0) ;PROGRAM NAME (MUST BE LAST) > ;END DEFINE SYMRIB SYMRIB SUBTTL DEFINITIONS -- UNIT BLOCKS .ORG 0 .UNNAM:! BLOCK 1 ;SIXBIT PHYSICAL UNIT NAME .UNLOG:! BLOCK 1 ;SIXBIT LOGICAL UNIT NAME WITHIN STRUCTURE .UNLUN:! BLOCK 1 ;LOGICAL UNIT WITHIN STRUCTURE .UNSNM:! BLOCK 1 ;STRUCTURE NAME .UNBSC:! BLOCK 1 ;BLOCKS PER SUPER CLUSTER .UNCNP:! BLOCK 1 ;BP FOR CLUSTER COUNT IN RETRIEVAL POINTER .UNCKP:! BLOCK 1 ;BP FOR CHECKSUM IN RETRIEVAL POINTER .UNCLP:! BLOCK 1 ;BP FOR CLUSTER ADDRESS IN RETRIEVAL POINTER .UNUSZ:! BLOCK 1 ;UNIT SIZE IN BLOCKS .UNBPC:! BLOCK 1 ;BLOCKS PER CLUSTER .UNSPU:! BLOCK 1 ;SATS PER UNIT (FROM HOM BLOCK) .UNOVR:! BLOCK 1 ;OVERDRAW BLOCK COUNT .UNHLB:! BLOCK 1 ;HIGHEST LEGAL BLOCK NUMBER .UNPOS:! BLOCK 1 ;DESIRED POSITION .UNBLK:! BLOCK 1 ;CURRENT BLOCK NUMBER .UNCHN:! BLOCK 1 ;I/O CHANNEL NUMBER .UNFLG:! BLOCK 1 ;FLAGS UN.OUT==1B0 ;DOING OUTPUT UN.OFL==1B1 ;OFFLINE UN.NER==1B2 ;NO (IGNORE) I/O ERRORS .UNIOC:! BLOCK 2 ;I/O COMMAND LIST .UNIOM:! BLOCK 1 ;I/O MODE (OPEN BITS) .UNIOS:! BLOCK 1 ;I/O STATUS .UNLEN:! ;LENGTH OF BLOCK .ORG SUBTTL DEFINITIONS -- SAT STORAGE .ORG 0 .SDNUM:! BLOCK 1 ;SAT BLOCK NUMBER (1 TO N) .SDUNI:! BLOCK 1 ;LOGICAL UNIT NUMBER .SDUBN:! BLOCK 1 ;UNIT-RELATIVE BLOCK FOR THIS SAT .SDERR:! BLOCK 1 ;BYTE POINTER TO ERROR BYTE FOR THIS SAT .SDBLK:! BLOCK 1 ;DATA FILE DISK BLOCK FOR THIS SD .SDTAL:! BLOCK 1 ;NUMBER OF FREE CLUSTERS IN THIS SAT BLOCK .SDCPS:! BLOCK 1 ;CLUSTERS IN THIS SAT .SDMIN:! ;MINIMUM LENGTH OF SAT DESCRIPTOR BLOCK ;WORDS BEFORE THIS ARE KEPT INCORE, THOSE AFTER ;IN THE DATA FILE .SDHDR:! BLOCK 1 ;OFFSET IN DATA FILE HEADER OF THIS SD .SDFIR:! BLOCK 1 ;STARTING CLUSTER IN THIS SAT .SDLAS:! BLOCK 1 ;ENDING CLUSTER IN THIS SAT .SDWPS:! BLOCK 1 ;-VE WORDS IN THIS SAT,,0 .SDSCN:! BLOCK 1 ;LH = -VE WORD COUNT ;RH = BLOCK OFFSET TO START LOOKING FOR FREE SPACE .SDUPD:! BLOCK 1 ;NON-ZERO IF UPDATE IN PROGRESS .SDVAL:! BLOCK 1 ;NON-ZERO IF DISK,,COMPUTED & MULTPLY-USED BLOCKS VALID .SDDSK:! BLOCK BLKSIZ ;DISK SAT .SDCOM:! BLOCK BLKSIZ ;COMPUTED SAT .SDMUL:! BLOCK BLKSIZ ;MULTIPLY-USED SAT BLOCK <.!>-.+1 ;ROUND UP TO THE NEXT BLOCK BOUNDRY .SDLEN:! ;LENGTH OF SAT DESCRIPTOR BLOCK .ORG SUBTTL DEFINITIONS -- DATA FILE VARSIZ==0 ;CLEAR COUNT OF VARIABLE WORDS NEEDED DEFINE VDATA (LEN),< BLOCK 1 ;;RESERVE WORD FOR OFFSET TO VARIABLE DATA XLIST ;;SUPPRESS LISTING VARSIZ==VARSIZ+LEN ;;TALLY UP WORDS NEEDED FOR STORAGE LIST ;;TURN LISTING BACK ON > ;END DEFINE VDATA DEFINE VSUM (STT,COM,ACT,HDR),< IF1,< PRINTX Static storage: 'STT PRINTX Computed variable storage: 'COM PRINTX Actual storage available: 'ACT PRINTX Data file header size: 'HDR > ;END IF1 > ;END DEFINE VSUM .ORG 0 .DFNAM:! BLOCK 1 ;PROGRAM NAME .DFVER:! BLOCK 1 ;VERSION .DFSIZ:! BLOCK 1 ;HEADER SIZE IN WORDS .DFFMT:! BLOCK 1 ;FILE FORMAT %FMT==1 ;FILE FORMAT .DFEOF:! BLOCK 1 ;NEXT BLOCK TO WRITE AT EOF .DFTSK:! BLOCK MAXHKS ;TASK NAME .DFCRS:! BLOCK 1 ;CHECKPOINT/RESTART STATE .DFCRD:! VDATA (CRDSIZ) ;OFFSET TO CHECKPOINT/RESTART DATA ;PARAMETERS .DFFLG:! BLOCK 1 ;FLAGS DF.DSK==1B0 ;DSK WRITING (0=OFF, 1=ON) DF.HOM==1B1 ;HOM WRITING (0=OFF, 1=ON) DF.BAT==1B2 ;BAT WRITING (0=OFF, 1=ON) DF.SAT==1B3 ;SAT WRITING (0=OFF, 1=ON) DF.RIB==1B4 ;RIB WRITING (0=OFF, 1=ON) DF.LBA==1B5 ;LOOKUP BY ANY RIB DF.LBP==1B6 ;LOOKUP BY PRIME RIB DF.LBS==1B7 ;LOOKUP BY SPARE RIB DF.PIP==1B8 ;PATCH IN PROGRESS DF.IBC==1B9 ;INHIBIT PATCH BUFFER CLEARING DF.PFS==1B10 ;PREFER DATA FILE SAT OVER DISK SAT DF.ZRS==1B11 ;ZERO RIBSIZ ON ZERO COMMANDS DF.IOT==1B12 ;I/O TRACE DF.CED==1B13 ;CHECKSUM ERROR DETECTION (0=OFF, 1=ON) DF.DMP==17B32 ;DUMP FORMAT CODE DF.FAC==7B35 ;FILE ACCESS CODE .DFBPR:! BLOCK 1 ;BLOCKS PER READ .DFCPI:! BLOCK 1 ;CHECKPOINT INTERVAL (IN BLOCKS) .DFDFM:! BLOCK MAXHKS ;DEFAULT DUMP FORMAT (KEYWORD) .DFDMP:! BLOCK MAXDMP*.FMLEN ;DUMP FORMAT DESCRIPTORS .DFDPS:! BLOCK 1 ;DEFAULT PATCH BUFFER SIZE .DFEDV:! VDATA (MAXEDV) ;-LENGTH,,OFFSET TO ERSATZ DEVICE TABLE .DFFAC:! BLOCK MAXHKS ;FILE ACCESS (KEYWORD) .DFIOT:! BLOCK MAXIOT*.FMLEN ;I/O TRACE FORMAT DESCRIPTORS .DFLPN:! BLOCK 1 ;LOGGED-IN PPN .DFLVL:! BLOCK 1 ;MAXIMUM SFD LEVEL .DFMFD:! BLOCK 1 ;MFD PPN .DFPPN:! BLOCK 1 ;CURRENT PPN .DFPTH:! VDATA (.PTPPN+MAXSFD) ;-LENGTH,,OFFSET TO PATH BLOCK .DFRNG:! BLOCK 2 ;DUMP RANGE .DFSRT:! BLOCK 1 ;SORT BUFFER SIZE .DFSBL:! BLOCK 1 ;LENGTH OF A SCAN BLOCK .DFCMD:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR COMMANDS .DFINP:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR INPUT SPEC .DFISV:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR SAVED INPUT SPEC .DFOUT:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR OUTPUT SPEC .DFRFB:! VDATA (.FBMIN+MAXSFD) ;OFFSET TO FILE BLOCK FOR RETURNED SPEC .DFRSB:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR RETURNED SPEC .DFRSV:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO SCAN BLOCK FOR SAVED RETURNED SPEC .DFFBB:! BLOCK 1 ;NUMBER OF FILE BLOCKS PER DISK BLOCK .DFFBL:! BLOCK 1 ;LENGTH OF FILE BLOCK .DFFBT:! VDATA (.FBMIN+MAXSFD) ;OFFSET TO TEMPORARY FILE BLOCK ;STRUCTURE DATA .DFSTR:! BLOCK 1 ;STRUCTURE NAME .DFSTN:! BLOCK 1 ;NUMBER OF UNITS IN STRUCTURE .DFBPC:! BLOCK 1 ;BLOCKS PER CLUSTER .DFBSC:! BLOCK 1 ;BLOCKS PER SUPER CLUSTER .DFCKP:! BLOCK 1 ;BP FOR CHECKSUM IN RETRIEVAL POINTER .DFCLP:! BLOCK 1 ;BP FOR CLUSTER ADDRESS RETRIEVAL POINTER .DFCNP:! BLOCK 1 ;BP FOR CLUSTER COUNT IN RETRIEVAL POINTER .DFSCU:! BLOCK 1 ;SUPER CLUSTERS PER UNIT .DFBUS:! BLOCK 1 ;BIGGEST UNIT SIZE .DFFIN:! BLOCK 1 ;NON-ZERO IF FINISHED SCANNING .DFHLB:! BLOCK 1 ;HIGHEST LEGAL BLOCK .DFOVR:! BLOCK 1 ;OVERDRAW ;UNIT DATA .DFUNI:! BLOCK MAXUNI*.UNLEN ;UNIT DATA ;SPECIAL DISK BLOCK DATA .DFBAT:! BLOCK 1 ;BAT BLOCK ERROR BITS (1ST,,2ND) .DFBTS:! BLOCK NBOOTB+1 ;BOOT BLOCKS IN ERROR (0,4,5,6,7) .DFHOM:! BLOCK 1 ;HOM BLOCK ERROR BITS (1ST,,2ND) .DFNSB:! BLOCK 1 ;NUMBER OF SAT BLOCKS .DFSAT:! VDATA (MAXSAT*.SDMIN) ;OFFSET TO IN CORE SD .DFSEB:! BLOCK /4 ;SAT ERROR BYTE STORAGE .DFSRB:! BLOCK 1 ;BLOCK NUMBER OF RIB FOR SAT.SYS ;FILE DATA .DFFBN:! BLOCK 1 ;NUMBER OF FILE BLOCKS .DFFIL:! BLOCK 1 ;OFFSET TO FILE BLOCKS .DFFSF:! BLOCK 1 ;FIRST SORTED FILE BLOCK NUMBER .DFLSF:! BLOCK 1 ;LAST SORTED FILE BLOCK NUMBER ;PATCH DATA .DFPBF:! BLOCK MAXPAT ;PATCH BUFFER .DFPFL:! VDATA (.SBMIN+MAXSFD) ;OFFSET TO FILESPEC .DFPFW:! VDATA (.FWMIN) ;OFFSET TO FILE I/O BLOCK .DFPLR:! BLOCK 1 ;LAST BLOCK READ .DFPLW:! BLOCK 1 ;LAST BLOCK WRITTEN .DFPIO:! BLOCK 1 ;LAST I/O DIRECTION (0 = READ, 1 = WRITE) .DFPMD:! BLOCK 1 ;PATCH MODE (-1=STR, 0=UNIT, +1=FILE) .DFPNM:! BLOCK 1 ;LOGICAL UNIT OR STRUCTURE NAME ;VARIABLE DATA STORAGE (MUST BE LAST AND ORDER NOT CHANGED) ;NOTE THAT THE COMPUTATION OF THE "PROBABLE" QUANTITIES IS ;NECESSITATED BY THE FACT THAT THERE ARE SO MANY FORWARD REFRENCES ;AND, UNDERSTANBLY, MACRO CANNOT HANDLE THEM. .DFVFW:! BLOCK 1 ;VARIABLE STORAGE FREE WORDS PRBHDR==<.+VARSIZ+44>/44 ;PROBABLE SIZE OF MAP FOR HEADER MINUS MAP PRBMAP==PRBHDR+</44> ;PROBABLE SIZE OF MAP PRBDAT==.+PRBHDR+PRBMAP+VARSIZ ;PROBABLE SIZE OF DEFINED DATA PRBLEN==>+1 ;PROBABLE LENGTH OF HEADER MAPSIZ==/44 ;SIZE OF ACTUAL BIT MAP FOR ENTIRE HEADER .DFVMP:! BLOCK MAPSIZ ;VARIABLE STORAGE BIT MAP .DFVAR:! BLOCK VARSIZ ;RESERVE SPACE FOR VARIABLE STORAGE BLOCK <.!>-.+1 ;ROUND UP TO THE NEXT BLOCK BOUNDRY .DFLEN:! ;LENGTH IN WORDS .ORG VSUM (\.DFVMP,\VARSIZ,\<.DFLEN-.DFVAR>,\.DFLEN) SUBTTL DEFINITIONS -- TASK TABLE .ORG 0 .TKABO:! BLOCK 1 ;ABORT ROUTINE .TKPTR:! BLOCK 1 ;WORKING AOBJN POINTER .TKRTN:! ;START OF SUBROUTINES .ORG ;MACRO TO GENERATE TASK TABLE HEADERS DEFINE TASKH (ABO),< ...TSK==. ;;SET TEMP SYMBOL TO RELOC COUNTER XLIST ;;SUPPRESS LISTING EXP ABO ;;ABORT ROUTINE EXP 0 ;;WORKING AOBJN POINTER LIST ;;REINSTATE LISTING > ;END DEFINE TASKH ;MACRO TO GENERATE TASK TABLE SUBROUTINE ENTRIES DEFINE TASKS (ADR), ;MACRO TO TERMINATE TASK TABLE DEFINE TASKT,< XLIST ;;SUPPRESS LISTING .XCREF ;;SUPPRESS USELES SYMBOLS ZZ==.-...TSK ;;TOTAL LENGTH OF TABLE .ORG ...TSK+.TKPTR ;;CHANGE RELOCATION COUNTER XWD -,0 ;;AOBJN POINTER TO SUBROUTINES .ORG ;;RESTORE RELOCATION COUNTER PURGE ZZ, ...TSK ;;REMOVE USELESS SYMBOLS .CREF ;;TURN CREF BACK ON LIST ;;REINSTATE LISTING > ;END DEFINE TASKT SUBTTL PROGRAM INITIALIZATION -- ENTRY POINT RELOC 0 LOC JOBINT ;INTERCEPT BLOCK ADDRESS EXP INTBLK LOC JOBVER ;VERSION NUMBER EXP RELOC START: JFCL ;NO CCL TDZA P,P ;NOT DEBUGGING DEBUG: MOVNI P,1 ;GET DEBUG FLAG MOVEM P,DEBUGF ;SAVE FOR LATER RESET ;STOP I/O SETZB 0,Z.BEG ;CLEAR AC 0 & FIRST WORD OF STORAGE MOVE 17,[Z.BEG,,Z.BEG+1] ;SET UP BLT BLT 17,Z.END-1 ;CLEAR ALL STORAGE MOVEI 17,1 ;SET UP BLT BLT 17,17 ;CLEAR THE ACS MOVE P,[IOWD PDLSIZ,PDL] ;SET UP STACK PUSHJ P,CHKPRV ;TURN ON PRIVS PUSHJ P,DDTSAV ;SAVE DDT ADDRESSES PUSHJ P,PATSYM ;FIXUP PATCHING SYMBOL TABLE PUSHJ P,M$INIT ;INITIALIZE MEMORY MANAGER PUSHJ P,T$INIT ;INITIALIZE TEXT PROCESSOR PUSHJ P,D$INIT ;INITIALIZE DATA FILE PARAMETERS PUSHJ P,D$VARS ;SET VARIABLES FROM DEFAULTS JRST MAIN ;ENTER TOP LEVEL COMMAND LOOP SUBTTL PROGRAM INITIALIZATION -- CHKPRV - CHECK FOR PRIVILEGES CHKPRV: GETPPN T1, ;GET OUR PPN JFCL ;INCASE OF JACCT MOVE T2,[%LDFFA] ;NEED THE PPN FOR [OPR] GETTAB T2, ;ASK MONITOR MOVE T2,[1,,2] ;TYPICAL VALUE CAMN T1,T2 ;GODLY? JRST CHKPR1 ;YES HRROI T1,.GTPRV ;WILL NEED TO CHECK PRIVS GETTAB T1, ;ASK MONITOR SETZ T1, ;FAILED TDNN T1,[PRVBIT] ;HAVE THE NECESSARY PRIVS TO RUN JACCT PROGRAM? JRST NOPRIV ;NOPE MOVE T1,[3,,T2] ;POKE. UUO AC MOVE T2,[.GTSTS,,.GTSLF] ;NEED ADDR OF JBTSTS IN MONITOR GETTAB T2, ;ASK MONITOR FATAL (CRJ,NOPRIV,) HRRZS T2 ;ISOLATE TABLE ADDRESS PJOB T3, ;GET OUR JOB ADDI T2,(T3) ;INDEX BY OUR JOB NUMBER HRROI T3,.GTSTS ;OUR JOB STATUS WORD GETTAB T3, ;READ IT FATAL (CRS,NOPRIV,,) MOVE T4,T3 ;COPY IT TLOE T4,1 ;TURN ON JACCT JRST CHKPR1 ;ALREADY HAVE IT! POKE. T1, ;ENABLE PRIVS JRST NOPRIV ;FAILED CHKPR1: SETZM CCTRAP ;ALLOW CONTROL-C TO WORK POPJ P, ;YES NOPRIV: FATAL (NPV,.+1,,) EXIT 1, ;DIE QUIETLY JRST .-1 ;THE FOOL TYPED CONTINUE SUBTTL TOP LEVEL COMMAND PROCESSING REENTR: MOVE P,[IOWD PDLSIZ,PDL] ;RESET THE STACK SETZM INTBLK+.EROPC ;RE-ENABLE INTERRUPTS PUSHJ P,DDTRES ;RESTORE DDT START AND BREAKPOINT ADDRESSES PUSHJ P,L$RSET ;RESET OPENED LISTING FILE (IF ANY) SKIPN CNAME ;COMMAND IN PROGRESS? JRST MAIN ;NOPE WARN (CAB,MAIN,<>,E..CAB) E..CAB: MOVE T1,CNAME ;GET COMMAND NAME PUSHJ P,T$STRG ;PRINT IT MOVEI T1,[ASCIZ / command aborted/] PJRST T$STRG ;PRINT TEXT AND RETURN MAIN: MOVE P,[IOWD PDLSIZ,PDL] ;RESET THE STACK PUSHJ P,F$RSET ;RESET FILE I/O IN PROGRESS (IF ANY) SETZM CMDOPF ;INVALIDATE ANY STALE PARSE OPTIONS SETZM CNAME ;CLEAR OUT LAST COMMAND NAME SETZM CCTRAP ;ALLOW EXIT ON CONTROL-C MOVEI T1,REENTR ;GET REENTER ADDRESS MOVEM T1,JOBREN ;TELL MONITOR WHERE TO LOOK XMOVEI T1,MAIN.T ;POINT TO COMMAND TABLES PUSHJ P,C$TSET ;SET UP SCANNER ;MATCH ANGLE BRACKETS < MOVEI T1,[ASCIZ /DPATCH>/] ;PROMPT STRING PUSHJ P,C$READ ;READ A COMMAND LINE JRST MAIN2 ;NO INPUT PUSHJ P,C$ATOM ;GET THE COMMAND NAME JRST [PUSHJ P,C$EILC ;REPORT ILLEGAL CHARACTER JRST MAIN] ;TRY AGAIN MAIN1: XMOVEI T1,CMDATB ;POINT TO ATOM BUFFER XMOVEI T2,MAIN.N ;AND TO KEYWORDS PUSHJ P,C$KEYW ;CHECK FOR A MATCH JRST [PUSHJ P,C$EKEY ;FAILED JRST MAIN] ;TRY AGAIN MOVEM T1,CNAME ;SAVE ADDRESS OF FULL COMMAND NAME HRRZ T3,MAIN.P(T2) ;GET DISPATCH ADDRESS JUMPE T3,[PUSHJ P,C$EUNK ;NOT A VALID OPTION JRST MAIN] ;TRY AGAIN PUSHJ P,@MAIN.P(T2) ;DISPATCH JFCL ;INCASE OF SKIP RETURN MAIN2: SKIPE CMDEOF ;WAS LAST CHARACTER CONTROL-Z? PUSHJ P,.EXIT ;YES--RETURN TO MONITOR JFCL ;IGNORE NON-SKIP JRST MAIN ;LOOP BACK FOR ANOTHER DEFINE KEYS,< KEY (, .DDT ,DDTHLP, ) KEY (, .DELET,DELHLP, ) KEY (, .DIREC,DIRHLP, ) KEY (, .DUMP ,DUMHLP,DUMP.T) KEY (, .EXIT ,EXIHLP, ) KEY (, .FILE ,FILHLP, ) KEY (, .FINIS,FINHLP, ) KEY (, .FORMA,FORHLP,FORM.T) KEY (, .GET ,GETHLP, ) KEY (, .HELP ,HLPHLP, ) KEY (, .PATCH,PATHLP, ) KEY (, .PUT ,PUTHLP, ) KEY (, .READ ,REDHLP, ) KEY (, .SET ,SETHLP,SETX.T) KEY (, .SHOW ,SHWHLP,SHOW.T) KEY (, .START,STAHLP,TASK.T) KEY (, .STRUC,STRHLP, ) KEY (, .TRANS,TRNHLP,TRAN.T) KEY (, .TYPE ,TYPHLP, ) KEY (, .WRITE,WRTHLP, ) KEY (, .ZERO ,ZERHLP, ) > KEYTAB (MAIN,) SUBTTL DDT COMMAND .DDT: PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL MOVEM 0,CRSHAC+0 ;SAVE AC 0 MOVE 0,[1,,CRSHAC+1] ;SET UP BLT BLT 0,CRSHAC+17 ;SAVE THE ACS SKIPN T1,JOBBPT ;GET UNSOLICITED BREAKPOINT ADDRESS SKIPN T1,JOBDDT ;GET DDT START ADDRESS TLOA T1,(JSR) ;MAKE BPT JUMP HRLI T1,(JRST) ;ELSE NORMAL JUMP TO START ADDR MOVEM T1,DDTGO ;SAVE FOR A MOMENT MOVE T1,CRSHAC+T1 ;RELOAD AC MOVSI T1,(DF.PIP) ;BIT TO TEST TDNN T1,.DFFLG(D) ;PATCH IN PROGRESS? WARN (NPP,.+1,,) XCT DDTGO ;ENTRE DDT RET: MOVE 0,[CRSHAC+1,,1] ;SET UP BLT BLT 0,17 ;RESTORE THE ACS MOVE 0,CRSHAC ;RELOAD AC 0 JRST CPOPJ1 ;RETURN DDTSAV: MOVE T1,JOBDDT ;GET DDT START ADDRESS MOVEM T1,SAVDDT ;SAVE IT MOVE T1,JOBBPT ;GET UNSOLICITED BREAKPOINT ADDRESS MOVEM T1,SAVBPT ;SAVE IT POPJ P, ;RETURN DDTHLP: ASCIZ \ The DDT command enters DDT. It may be used to examine and/or modify the patch buffer. The command syntax is: DDT A special symbol table is set up containing all the necessary structure and special block symbols. The following symbols are available: BUF - Patch buffer FBOOTB - First block where BOOTS resides NBOOTB - Length of BOOTS in blocks LBNHOM - Logical block number of the first HOM block LB2HOM - Logical block number of the second HOM block LBOBAT - Offset from a HOM block to a BAT block LBOISW - Offset from a HOM block to the initial swapping SAT PATCH - Patch space RET - The DDT return address In addition, the following groups of symbols are defined: All HOM block symbols All BAT block symbols All RIB block symbols \ SUBTTL DELETE COMMAND .DELET: MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;INITIALIZE IT PUSHJ P,C$CEOL ;AT END OF LINE? SKIPA ;NO FATAL (NIF,CPOPJ,,) ;READ FILESPEC PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR MOVSI T3,(T1) ;GET RETURNED SCAN BLOCK HRR T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE HRRZ T4,T3 ;POINT TO DESTINATION ADD T4,.DFSBL(D) ;COMPUTE ENDING ADDRESS BLT T3,-1(T4) ;COPY SCAN BLOCK PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL DELET1: PUSHJ P,SAVE3 ;SAVE SOME ACS SETZB P1,P2 ;ZERO COUNT OF FILES DELETED, BLOCKS FREED MOVEI T1,.IOIMG ;MODE = IMAGE MOVE T2,[IOWD BLKSIZ,CPYBUF] ;IOWD PUSHJ P,F$INI ;INITIALIZE FOR FILE I/O FATAL (IOF,CPOPJ,,T$FERR) DELET2: PUSHJ P,F$LKP ;FIND A FILE JRST DELET5 ;CAN'T PUSHJ P,F$DEL ;DELETE THE FILE, FREE UP BLOCKS IF POSSIBLE JRST DELET4 ;CAN'T ADD P2,T1 ;TALLY UP ALLOCATED BLOCKS FREED MOVE P3,T1 ;MAKE A COPY PUSHJ P,F$CLOS ;CLOSE JUMPN P1,DELET3 ;JUMP IF BEEN HERE BEFORE XMOVEI T1,[ASCIZ / Files deleted:/] PUSHJ P,T$STRG ;PRINT TEXT PUSHJ P,T$CRLF ;END LINE DELET3: PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,.DFRSB(D) ;GET OFFSET TO RETURNED FILESPEC SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,T$FILE ;PRINT FILE DELETED XMOVEI T1,[ASCIZ / (/] PUSHJ P,T$STRG ;PRINT TEXT MOVE T1,P3 ;COPY BLOCKS IN THIS FILE PUSHJ P,T$DECW ;PRINT IT XMOVEI T1,[ASCIZ / blocks)/] CAIN P3,1 ;JUST ONE? XMOVEI T1,[ASCIZ / block)/] PUSHJ P,T$STRG ;PRINT TEXT PUSHJ P,T$CRLF ;END LINE AOJA P1,DELET2 ;LOOP BACK FOR MORE FILES DELET4: MOVE T2,.DFRSB(D) ;GET OFFSET TO RETURNED FILESPEC SCAN BLOCK ADDI T2,(D) ;RELOCATE WARN (EDF,.+1,,T$FERR) PUSHJ P,F$CLOS ;CLOSE FILE JRST DELET5 ;FAILED JRST DELET2 ;LOOP BACK FOR ANOTHER FILE DELET5: CAIN T1,FENMF% ;NO MORE FILES? JRST DELET6 ;ALMOST DONE CAIN T1,FEFNF% ;FILE NOT FOUND? SKIPA T2,.DFINP(D) ;MUST USE INPUT SPEC MOVE T2,.DFRSB(D) ;ELSE USE TRANSLATION SCAN BLOCK ADDI T2,(D) ;RELOCATE FATAL (LKP,F$FIN,,T$FERR) DELET6: PUSHJ P,F$FIN ;CLEAN UP JRST CPOPJ1 ;RETURN DELHLP: ASCIZ \ The DELETE command deletes files. Once deleted, a file will no longer be pointed to by its parent directory. The command syntax is: DELETE filespec "filespec" may be a wildcarded input file specification (the default). \ SUBTTL DIRECT COMMAND .DIREC: MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;INITIALIZE IT MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;INITIALIZE IT MOVE T1,.DFFBT(D) ;GET OFFSET TO TEMP FILE BLOCK ADDI T1,(D) ;RELOCATE SETZM (T1) ;CLEAR FIRST WORD HRLS T1 ;PUT IN BOTH HALVES AOS T1 ;MAKE A BLT POINTER HLRZ T2,T1 ;GET FILE BLOCK STARTING ADDRESS ADD T2,.DFFBL(D) ;COMPUTE END BLT T1,-1(T2) ;CLEAR IT OUT PUSHJ P,C$CEOL ;AT END OF LINE? JRST DIREC1 ;NO SETZB T1,T2 ;NO SCAN BLOCK PUSHJ P,L$FILE ;DEFAULT LISTING SCAN BLOCK JRST DIREC4 ;GO INPUT FILE APPLY DEFAULTS ;READ POSSIBLE OUTPUT FILESPEC DIREC1: PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR PUSH P,T1 ;SAVE SCAN BLOCK ADDRESS CAIE T2,"=" ;OUTPUT FILE? SETZ T1, ;NO PUSHJ P,L$FILE ;PROCESS LISTING SCAN BLOCK POP P,T1 ;RESTORE SCAN BLOCK ADDRESS JUMPE T1,DIREC4 ;NO FILESPEC AT ALL? CAIE T2,"=" ;WAS THIS THE OUTPUT FILESPEC? JRST DIREC3 ;NO PUSHJ P,C$SKIP ;SKIP LEADING TABS AND SPACES ;HERE FOR AN INPUT FILSPEC PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR DIREC3: MOVSI T3,(T1) ;GET RETURNED SCAN BLOCK HRR T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE HRRZ T4,T3 ;POINT TO DESTINATION ADD T4,.DFSBL(D) ;COMPUTE ENDING ADDRESS BLT T3,-1(T4) ;COPY SCAN BLOCK PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL DIREC4: XMOVEI T1,DIRDIB ;POINT TO DEFAULT OUTPUT BLOCK MOVEI T2,DIRDIL ;GET ITS LENGTH MOVE T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE PUSHJ P,C$DFIL ;APPLY DEFAULTS DIREC5: MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,L$OPEN ;CREATE LISTING FILE POPJ P, ;FAILED PUSHJ P,L$ENVI ;PRINT ENVIRONMENTAL DATA (IF NECESSARY) PUSHJ P,T$FORM ;START WITH A FORM FEED XMOVEI T1,DIRHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRN ;SET FOR LATER PUSHJ P,DIRXXX ;PRINT DIRECTORY LISTING PUSHJ P,L$CLOS ;CLOSE OF LISTING FILE JRST CPOPJ1 ;RETURN ;DEFAULT INPUT SCAN BLOCK (DSK:*.*[-]) DIRDIB: EXP SB.NAM!SB.EXT!SB.DPT ;SCANNER FLAGS EXP 0 ;DEVICE EXP 0 ;DEVICE MASK EXP '* ' ;FILE NAME EXP 0 ;FILE NAME MASK XWD '* ',0 ;EXTENSION,,MASK DIRDIL==.-DIRDIB ;LENGTH OF BLOCK ;DEFAULT OUTPUT SCAN BLOCK DIRDOB: EXP SB.DEV!SB.EXT ;SCANNER FLAGS EXP 'TTY ' ;DEVICE EXP -1 ;DEVICE MASK EXP 0 ;FILE NAME EXP 0 ;FILE NAME MASK XWD 'DIR',-1 ;EXTENSION,,MASK DIRDOL==.-DIRDOB ;LENGTH OF BLOCK DIRHLP: ASCIZ \ The DIRECTORY command will print a directory of the files on the structure. The command syntax is: DIRECTORY listing-file = filespec "listing-file" is optional and defaults to TTY:str.LST[-] where "str" is the name of the currently selected structure. "filespec" may be a wildcarded input file specification (the default). \ DIRXXX: PUSHJ P,SAVE4 ;SAVE SOME ACS MOVE T1,[F.NOIO+.IOIMG] ;SUPPRESS I/O, USE IMAGE MODE MOVE T2,[IOWD BLKSIZ,CPYBUF] ;BUFFER (NOT USED) PUSHJ P,F$INI ;INITIALIZE FOR I/O FATAL (IOF,CPOPJ,,T$FERR) DIRXX1: PUSHJ P,F$LKP ;FIND A FILE JRST DIRXX2 ;CAN'T MOVE P3,.DFRFB(D) ;GET OFFSET TO RETURNED FILE BLOCK ADDI P3,(D) ;RELOCATE PUSHJ P,DIRPNT ;PRINT DIRECTORY LINE PUSHJ P,F$CLOS ;CLOSE FILE JFCL ;DON'T CARE ABOUT FAILURES JRST DIRXX1 ;LOOP FOR ALL FILES DIRXX2: CAIN T1,FENMF% ;NO MORE FILES? PJRST F$FIN ;ALL DONE CAIN T1,FEFNF% ;FILE NOT FOUND? SKIPA T2,.DFINP(D) ;MUST USE INPUT SPEC MOVE T2,.DFRSB(D) ;ELSE USE TRANSLATION SCAN BLOCK ADDI T2,(D) ;RELOCATE FATAL (LKP,F$FIN,,T$FERR) ;PAGE HEADER ROUTINE DIRHDR: PUSHJ P,DIRSAM ;SAME AS PREVIOUS PATH? TDZA T1,T1 ;NO MOVEI T1,1 ;REMEMBER CONTINUATION PUSH P,T1 ;SAVE FLAG PUSHJ P,DIRSAV ;SAVE POSSIBLY NEW PATH PUSHJ P,DIRPTH ;NOW PRINT THE PATH POP P,T1 ;GET FLAG BACK JUMPE T1,DIRHD1 ;CONTINUATION? XMOVEI T1,[ASCIZ / (continued)/] PUSHJ P,T$STRG ;PRINT TEXT DIRHD1: XMOVEI T1,DIRTTL ;POINT TO TITLE TEXT PJRST T$STRG ;PRINT IT AND RETURN DIRPNT: PUSHJ P,DIRSAM ;SAME AS PREVIOUS PATH? SKIPA ;NO JRST DIRPN1 ;DON'T PUT OUT PATH AGAIN ;PATH MOVEI T1,2+2+2 ;LINE COUNT PUSHJ P,L$TEST ;MAKE ROOM FOR PATH, TITLE, AND FILE LISTING PUSHJ P,T$CRLF ;START WITH A NEW LINE SETZ T1, ;NOT AT A PAGE BREAK PUSHJ P,DIRHDR ;PRINT HEADER JRST DIRPN2 ;PRESS ON DIRPN1: MOVEI T1,2+1 ;LINE COUNT PUSHJ P,L$TEST ;MAKE ROOM FOR FILE LISTING & SUMMARY ;FILE NUMBER DIRPN2: PUSHJ P,T$SPAC ;SPACE OVER LDB T1,[POINTR (.FBIDN(P3),FB.NUM)] ;FILE NUMBER JUSTIFY (R,6," ",T$DECW) ;BLOCK NUMBER PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,.FBBLK(P3) ;BLOCK NUMBER JUSTIFY (R,^D7," ",T$DECW) ;RIB TYPE PUSHJ P,DIRRIB ;PRINT RIB TYPE ;FILE NAME AND EXTENSION PUSHJ P,DIRFIL ;PRINT FILE NAME AND EXTENSION ;ALLOCATION PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,.FBALC(P3) ;GET ALLOCATED BLOCKS JUSTIFY (R,^D7," ",T$DECW) ;PROTECTION PUSHJ P,T$SPAC ;SPACE OVER PUSHJ P,T$LANG ;PRINT LEFT ANGLE BRACKET HRRZ T1,.FBEXT(P3) ;PROTECTION CODE JUSTIFY (R,3,"0",T$OCTW) ;PRINT IT PUSHJ P,T$RANG ;PRINT RIGHT ANGLE BRACKET ;CREATION DATE/TIME PUSHJ P,DIRDTM ;PRINT DATE AND TIME ;VERSION PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,.FBVER(P3) ;GET VERSION JUSTIFY (R,^D15," ",T$VERW) ;ERROR BITS PUSHJ P,DIRERR ;PRINT ERROR BITS PJRST T$CRLF ;END LINE AND RETURN DIRTTL: ASCIZ \ File Block RIB Name & Ext. Alloc Prot. Creation Version ------ ------- --- ------------- ------- ----- --------------- --------------- \ ;PRINT DATE AND TIME DIRDTM: PUSHJ P,T$SPAC ;SPACE OVER SKIPE .FBCRE(P3) ;GET CREATION DATE/TIME JRST DIRDT1 ;HAVE IT MOVEI T1,[ASCIZ /(undated)/] JUSTIFY (C,^D15," ",T$STRG) ;PRINT TEXT POPJ P, ;RETURN DIRDT1: HLRZ T1,.FBCRE(P3) ;GET DATE COMPONENT PUSHJ P,T$DATE ;PRINT IT PUSHJ P,T$SPAC ;SPACE OVER HRRZ T1,.FBCRE(P3) ;GET TIME IN MINUTES PAST MIDNIGHT IDIVI T1,^D60 ;GET HOURS IN T1, MINUTES IN T2 CAIGE T1,^D10 ;SINGLE DIGIT? PUSHJ P,T$SPAC ;YES--PAD WITH A LEADING SPACE PUSHJ P,T$DECW ;PRINT HOURS PUSHJ P,T$COLN ;AND A COLON MOVEI T2,"0" ;GET A ZERO EXCH T1,T2 ;SWAP AROUND CAIGE T2,^D10 ;SINGLE DIGIT? PUSHJ P,T$CHAR ;YES--PUT OUT A LEADING ZERO MOVE T1,T2 ;GET NUMBER BACK PJRST T$DECW ;PRINT IT AND RETURN ;PRINT ERROR INFORMATION DIRERR: HLLZ T1,.FBFLG(P3) ;GET ERROR BITS JUMPE T1,CPOPJ ;RETURN IF THERE AREN'T ANY PUSHJ P,SAVE2 ;SAVE P1 AND P2 MOVE P1,T1 ;COPY BITS SETZ P2, ;INIT TABLE INDEX PUSHJ P,T$CRLF ;START WITH A NEW LINE XMOVEI T1,[ASCIZ / Errors:/] PUSHJ P,T$STRG ;PRINT INTRODUCTION DIRER1: ROT P1,1 ;GET A BIT TRZN P1,1 ;CLEAR FOR NEXT TIME JRST DIRER2 ;NO ERROR HERE AOS FBXETD(P2) ;COUNT ERRORS FOR DIRECTORY AOS FBXETC(P2) ;COUNT ERRORS FOR TOTAL PUSHJ P,T$SPAC ;START WITH A SPACE HLLZ T1,FETEXT(P2) ;GET A MNEMONIC PUSHJ P,T$SIXN ;PRINT IT DIRER2: AOS P2 ;ADVANCE TABLE INDEX JUMPN P1,DIRER1 ;LOOP BACK FOR MORE POPJ P, ;RETURN ;PRINT FILE NAME AND EXTENSION DIRFIL: PUSHJ P,T$SPAC ;SPACE OVER HLRZ T1,.FBEXT(P3) ;GET EXTENSION CAIE T1,'UFD' ;USER FILE DIRECTORY? JRST DIRFI1 ;NO SKIPG T1,.FBNAM(P3) ;GET PPN, SEE IF SIXBIT JRST DIRFI1 ;SIXBIT, SO HANDLE LIKE NORMAL FILE NAME HLRZS T1 ;ISOLATE PROJECT NUMBER JUSTIFY (R,6," ",T$OCTW) ;PRINT IT PUSHJ P,T$COMA ;PRINT COMMA HRRZ T1,.FBNAM(P3) ;GET PROGRAMMER NUMBER JUSTIFY (L,6," ",T$OCTW) ;PRINT IT POPJ P, ;RETURN IGNORING EXTENSION DIRFI1: PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,.FBNAM(P3) ;GET SIXBIT FILE NAME JUSTIFY (L,6," ",T$SIXN) ;PRINT IT MOVEI T1,[ASCIZ / /] ;SPACE PUSHJ P,T$STRG ; OVER HLLZ T1,.FBEXT(P3) ;EXTENSION JUSTIFY (L,4," ",T$SIXN) ;PRINT IT POPJ P, ;RETURN ;PRINT PATH DIRPTH: PUSHJ P,T$SPAC ;SPACE OVER PUSHJ P,T$LBRK ;PRINT LEFT SQUARE BRACKET HLRZ T1,.FBPPN(P3) ;PROJECT NUMBER PUSHJ P,T$OCTW PUSHJ P,T$COMA ;PRINT COMMA HRRZ T1,.FBPPN(P3) ;PROGRAMMER NUMBER PUSHJ P,T$OCTW MOVN T4,.DFLVL(D) ;GET MAXIMUM SFD LEVEL HRLZS T4 ;PUT IN LH HRRI T4,.FBMIN(P3) ;OFFSET TO START OF SFD DIRPT1: SKIPN (T4) ;HAVE AN SFD? JRST DIRPT2 ;NO--END OF PATH PUSHJ P,T$COMA ;PRINT COMMA MOVE T1,(T4) ;GET SFD NAME PUSHJ P,T$SIXN ;PRINT IT AOBJN T4,DIRPT1 ;LOOP BACK FOR MORE DIRPT2: PUSHJ P,T$RBRK ;PRINT RIGHT SQUARE BRACKET POPJ P, ;RETURN ;PRINT RIB TYPE DIRRIB: PUSHJ P,T$SPAC ;SPACE OVER MOVSI T1,'???' ;UNCASE UNKNOWN MOVE T2,.FBFLG(P3) ;GET FLAG WORD TRNE T2,FB.PRM ;PRIME RIB? MOVSI T1,'P ' ;YES TRNE T2,FB.SPR ;SPARE RIB? MOVSI T1,'S ' ;YES TRNE T2,FB.XTR ;EXTENDED RIB? JRST DIRRI1 ;YES JUSTIFY (C,3," ",T$SIXN) ;PRINT CHARACTER POPJ P, ;RETURN DIRRI1: LDB T1,[POINTR (T2,FB.XRN)] ;GET EXTENDED RIB NUMBER JUSTIFY (R,3," ",T$DECW) ;PRINT EXTENDED RIB NUMBER POPJ P, ;RETURN ;SEE IF PATH HAS CHANGED DIRSAM: AOS FBXCTT ;COUNT TOTAL FILES MOVN T1,.DFLVL(D) ;GET -VE SFD LEVEL SOS T1 ;INCLUDE ONE FOR THE PPN HRLZS T1 ;MAKE AN AOBJN POINTER MOVE T2,.DFFBT(D) ;GET OFFSET TO TEMP FILE BLOCK ADDI T2,(D) ;RELOCATE ADDI T2,.FBPPN ;AND TO THE PPN WORD MOVEI T3,.FBPPN(P3) ;POINT TO THE CURRENT DIRECTORY DIRSA1: MOVE T4,(T2) ;GET A DIRECTORY COMPONENT CAME T4,(T3) ;MATCH THE PREVIOUS ONE? JRST DIRSA2 ;NO AOS T2 ;ADVANCE AOS T3 ; POINTERS AOBJN T1,DIRSA1 ;LOOP FOR ENTIRE PATH AOS FBXCTD ;COUNT FILES IN THIS DIRECTORY JRST CPOPJ1 ;RETURN INDICATING SAME PATH DIRSA2: MOVE T1,[FBXETD,,FBXETD+1] ;SET UP BLT SETZM FBXETD ;CLEAR FIRST WORD BLT T1,FBXETD+FBENUM-1 ;CLEAR PER-DIRECTORY STORAGE SETZM FBXCTD ;ZAP COUNT OF FILES IN DIRECTORY POPJ P, ;RETURN ;SAVE CURRENT PATH INFORMATION DIRSAV: MOVSI T1,(P3) ;POINT TO FILE BLOCK HRR T1,.DFFBT(D) ;GET OFFSET TO TEMP FILE BLOCK ADDI T1,(D) ;RELOCATE HRRZ T2,T1 ;GET FB ADDR AGAIN ADD T2,.DFFBL(D) ;COMPUTE END OF BLT BLT T1,-1(T2) ;SAVE NEW PATH INFORMATION POPJ P, ;RETURN SUBTTL DUMP COMMAND .DUMP: SETOM DMPFMT ;NO FORMAT SPECIFIED YET MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;INITIALIZE IT MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;INITIALIZE IT PUSHJ P,C$CEOL ;AT END OF LINE? JRST DUMP1 ;NO SETZB T1,T2 ;NO SCAN BLOCK PUSHJ P,L$FILE ;DEFAULT LISTING SCAN BLOCK JRST DUMP4 ;GO INPUT FILE APPLY DEFAULTS ;READ POSSIBLE OUTPUT FILESPEC DUMP1: PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR PUSH P,T1 ;SAVE SCAN BLOCK ADDRESS CAIE T2,"=" ;OUTPUT FILE? SETZ T1, ;NO PUSHJ P,L$FILE ;PROCESS LISTING SCAN BLOCK POP P,T1 ;RESTORE SCAN BLOCK ADDRESS JUMPE T1,DUMP4 ;NO FILESPEC AT ALL? CAIE T2,"=" ;WAS THIS THE OUTPUT FILESPEC? JRST DUMP3 ;NO PUSHJ P,C$SKIP ;SKIP LEADING TABS AND SPACES ;HERE FOR AN INPUT FILSPEC PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR DUMP3: MOVSI T3,(T1) ;GET RETURNED SCAN BLOCK HRR T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE HRRZ T4,T3 ;POINT TO DESTINATION ADD T4,.DFSBL(D) ;COMPUTE ENDING ADDRESS BLT T3,-1(T4) ;COPY SCAN BLOCK PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL DUMP4: MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE MOVSI T2,(SB.NAM!SB.EXT!SB.DIR) ;BITS WHICH DESCRIBE FILES TDNE T2,.SBFLG(T1) ;FILE-ORIENTED DUMP? JRST DMPFIL ;YES MOVSI T2,(SB.DEV) ;GET A BIT MOVE T3,.DFSTR(D) ;AND THE STRUCTURE NAME TDNN T2,.SBFLG(T1) ;DEVICE SPECIFIED? MOVEM T3,.SBDEV(T1) ;DEFAULT USING THE STRUCTURE NAME IORM T2,.SBFLG(T1) ;SET FLAG BIT ACCORDINGLY MOVE T2,.SBDEV(T1) ;GET DEVICE CAMN T2,.DFSTR(D) ;STRUCTURE-ORIENTED DUMP? JRST DMPSTR ;YES MOVN U,.DFSTN(D) ;GET -VE UNITS IN STRUCTURE HRLZS U ;PUT IN LH HRRI U,.DFUNI(D) ;MAKE AN AOBJN POINTER DUMP5: CAMN T2,.UNLOG(U) ;LOGICAL UNIT NAME? JRST DMPLOG ;YES ADDI U,.UNLEN-1 ;ACCOUNT FOR MULTI-WORD ENTRIES AOBJN U,DUMP5 ;TRY ALL UNIT BLOCKS FATAL (IDF,CPOPJ,,) DMPFIL: MOVEI T1,1 ;GET A FLAG MOVEM T1,DMPMOD ;INDICATE FILE MODE XMOVEI T1,DMPDIB ;POINT TO DEFAULT INPUT BLOCK MOVEI T2,DMPDIL ;GET ITS LENGTH MOVE T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE PUSHJ P,C$DFIL ;APPLY DEFAULTS DMPFI1: MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,L$OPEN ;OPEN LISTING FILE POPJ P, ;FAILED PUSHJ P,L$ENVI ;PRINT ENVIRONMENTAL DATA (IF NECESSARY) MOVEI T1,.IOASC ;MODE = ASCII MOVE T2,[IOWD BLKSIZ,CPYBUF] ;IOWD PUSHJ P,F$INI ;INITIALIZE FOR FILE I/O FATAL (IOF,CPOPJ,,T$FERR) DMPFI2: PUSHJ P,F$LKP ;FIND A FILE JRST DMPFI5 ;CAN'T MOVEI T1,1 ;START WITH BLOCK 1 MOVE T2,[377777,,-2] ;STOP ON EOF PUSHJ P,DMPINI ;SET RANGE DMPFI3: PUSHJ P,DMPNXT ;GET NEXT BLOCK TO DUMP JRST DMPFI6 ;DONE PUSHJ P,F$POS ;POSITION FOR I/O JRST DMPFI4 ;CHECK FOR ERRORS PUSHJ P,F$IBUF ;READ A BUFFER JRST DMPFI4 ;CHECK ERRORS XMOVEI T1,CPYBUF ;POINT TO BUFFER PUSHJ P,DMPBLK ;DUMP ITS CONTENTS JRST DMPFI3 ;LOOP BACK FOR MORE BLOCKS DMPFI4: CAIN T1,FEEOF% ;END OF FILE? JRST DMPFI6 ;YES MOVE T2,.DFRSB(D) ;GET OFFSET TO RETURNED SCAN BLOCK ADDI T2,(D) ;RELOCATE WARN (ERF,DMPFI6,,T$FERR) DMPFI5: CAIN T1,FENMF% ;NO MORE FILES? JRST DMPFI7 ;THAT'S NOT REALLY AN ERROR CAIN T1,FEFNF% ;FILE NOT FOUND? SKIPA T2,.DFINP(D) ;MUST USE INPUT SPEC MOVE T2,.DFRSB(D) ;ELSE USE TRANSLATION SCAN BLOCK ADDI T2,(D) ;RELOCATE FATAL (LKP,DMPFI7,,T$FERR) DMPFI6: PUSHJ P,F$CLOS ;CLOSE FILE JFCL ;IGNORE ERRORS JRST DMPFI2 ;LOOP BACK FOR ANOTHER FILE DMPFI7: PUSHJ P,F$FIN ;ALL DONE PUSHJ P,L$CLOS ;CLOSE LISTING FILE JRST CPOPJ1 ;AND RETURN ;DEFAULT INPUT SCAN BLOCK (DSK:*.*[-]) DMPDIB: EXP SB.NAM!SB.EXT!SB.DPT ;SCANNER FLAGS EXP 0 ;DEVICE EXP 0 ;DEVICE MASK EXP '* ' ;FILE NAME EXP 0 ;FILE NAME MASK XWD '* ',0 ;EXTENSION,,MASK DMPDIL==.-DMPDIB ;LENGTH OF BLOCK ;LOGICAL UNIT DUMP DMPLOG: SETZM DMPMOD ;INDICATE LOGICAL UNIT MODE MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,L$OPEN ;OPEN LISTING FILE POPJ P, ;GIVE UP PUSHJ P,L$ENVI ;PRINT ENVIRONMENTAL DATA (IF NECESSARY) SETZ T1, ;START WITH BLOCK 0 MOVE T2,.UNUSZ(U) ;AND STOP WHEN WE GET HERE SOS T2 ;RANGE IS INCLUSIVE PUSHJ P,DMPINI ;SET RANGE DMPLO1: PUSHJ P,DMPNXT ;GET NEXT BLOCK TO DUMP JRST DMPLO2 ;DONE MOVE T2,[IOWD BLKSIZ,RIB] ;GET IOWD PUSHJ P,U$READ ;READ A BLOCK JRST DMPLO1 ;TRY THE NEXT BLOCK XMOVEI T1,RIB ;POINT TO BUFFER PUSHJ P,DMPBLK ;DUMP THE BLOCK JRST DMPLO1 ;LOOP BACK FOR MORE DMPLO2: PUSHJ P,L$CLOS ;CLOSE LISTING FILE JRST CPOPJ1 ;RETURN ;STRUCTURE DUMP DMPSTR: SETOM DMPMOD ;INDICATE STRUCTURE MODE MOVE T1,.DFOUT(D) ;GET OFFSET TO OUTPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,L$OPEN ;OPEN LISTING FILE POPJ P, ;GIVE UP PUSHJ P,L$ENVI ;PRINT ENVIRONMENTAL DATA (IF NECESSARY) SETZ T1, ;START WITH BLOCK ZERO MOVE T2,.DFHLB(D) ;GET HIGHEST BLOCK ON STRUCTURE PUSHJ P,DMPINI ;SET RANGE DMPST1: PUSHJ P,DMPNXT ;GET NEXT BLOCK TO DUMP JRST DMPST2 ;DONE PUSHJ P,F$BLKU ;SET UP UNIT AND BLOCK ON UNIT JRST DMPST2 ;ILLEGAL BLOCK--END OF ON STRUCTURE MOVE T2,[IOWD BLKSIZ,RIB] ;GET IOWD PUSHJ P,U$READ ;READ A BLOCK JRST DMPST1 ;TRY THE NEXT BLOCK XMOVEI T1,RIB ;POINT TO BUFFER PUSHJ P,DMPBLK ;DUMP THE BLOCK JRST DMPST1 ;LOOP BACK FOR MORE DMPST2: PUSHJ P,L$CLOS ;CLOSE LISTING FILE JRST CPOPJ1 ;RETURN DUMHLP: ASCIZ \ The DUMP command will display one or more disk blocks of the currently selected structure, of units that comprise the structure, or of a file that resides on the structure. The command syntax is: DUMP listing-file = filespec "listing-file" is optional and defaults to TTY:str.LST[-] where "str" is the name of the currently selected structure. "filespec" may be either the selected structure name, a logical unit name which belongs to the structure, or the name of a file that resides on the structure. The listing format can vary depending upon the options selected. The default format is to match each block with a format that best displays the contents of that block. \ DEFINE KEYS,< KEY (<7-BIT>, DMP7BT,HDM7BT, ) KEY (<8-BIT>, DMP8BT,HDM8BT, ) KEY (, DMPATO,HDMATO, ) KEY (, DMPBAT,HDMBAT, ) KEY (, DMPDIR,HDMDIR, ) KEY (, DMPDEC,HDMDEC, ) KEY (, DMPHOM,HDMHOM, ) KEY (,DMPMIX,HDMMIX, ) KEY (, DMPOCT,HDMOCT, ) KEY (, DMPRIB,HDMRIB, ) KEY (, DMPSIX,HDMSIX, ) KEY (, DMPSPC,HDMSPC, ) > KEYTAB (DUMP,) DEFDMP: ASCIZ /AUTOMATIC/ ;DEFAULT FORMAT BLOCK MAXHKS-<.-DEFDMP> ;PAD OUR REMAINDER DEFINE DUMP (NAM,TXT,SUB),< PUSHJ P,[PUSHJ P,DUMPER EXP XWD 'NAM,[ASCIZ \'TXT\] MOVE T1,'NAM(T2) SUB] > ;END DEFINE DUMP DUMPER: EXCH P1,(P) ;SAVE P1, GET ADDRESS OF ARGS FROM VALL HRRZS P1 ;STRIP OFF LH JUNK PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,0(P1) ;GET SYMBOL NAME JUSTIFY (L,7," ",T$SIXN) ;PRINT IT PUSHJ P,T$LPAR ;PRINT LEFT PARANTHESIS HLRZ T1,1(P1) ;GET OFFSET VALUE JUSTIFY (R,3,"0",T$OCTW) ;PRINT IT MOVEI T1,[ASCIZ /) - /] PUSHJ P,T$STRG ;PRINT SEPARATOR HRRZ T1,1(P1) ;GET TEXT ADDRESS PUSHJ P,T$STRG ;PRINT IT MOVE T2,(P) ;GET BLOCK ADDRESS XCT 2(P1) ;LOAD UP T1 WITH QUANTITY TO PRINT PUSHJ P,@3(P1) ;PRINT SOMETHING PUSHJ P,T$CRLF ;END LINE POP P,P1 ;RESTORE P1 POPJ P, ;RETURN ;ROUTINE TO DUMP A BLOCK ;CALL: MOVE T1, ADDRESS OF BLOCK ; PUSHJ P,DMPBLK DMPBLK: PUSHJ P,SAVE4 ;SAVE SOME ACS MOVE P1,T1 ;GET BLOCK ADDRESS MOVSI P2,-BLKSIZ ;AOBJN POINTER PUSHJ P,L$PGSZ ;READ PAGE SIZE HLRZS T1 ;ISOLATE WIDTH MOVEI P3,-7(T1) ;CONVERT TO -VE USABLE COLUMNS AND SAVE SETZM DMPIDN ;ASSUME NO SPECIAL BLOCK IDENTIFIER SKIPGE T1,DMPFMT ;GET REQUESTED DUMP FORMAT LDB T1,[POINTR (.DFFLG(D),DF.DMP)] ;USE DEFAULT PUSHJ P,@DUMP.P(T1) ;PRINT BLOCK BASED ON FORMAT TYPE POPJ P, ;ROUTINE TO SET UP INITIAL BLOCK FOR DUMPING ;CALL: MOVE T1, DEFAULT STARTING BLOCK ; MOVE T2, DEFAULT ENDING BLOCK ; PUSHJ P,DMPINI DMPINI: SKIPN T3,.DFRNG+0(D) ;GET LOW RANGE SKIPA T3,T1 ;USE SUPPLIED VALUES SKIPA T4,.DFRNG+1(D) ;GET HIGH RANGE MOVE T4,T2 ;USE SUPPLIED VALUES SOS T3 ;WILL INCREMENT BEFORE CHECKING AOS T4 ;BECAUSE RANGE IS INCLUSIVE MOVEM T3,DMPCBN ;STORE "CURRENT" BLOCK NUMBER MOVEM T4,DMPLBN ;SAVE LAST BLOCK TO DUMP POPJ P, ;RETURN ;ROUTINE TO GET NEXT BLOCK FOR DUMPING ;CALL: PUSHJ P,DMPNXT ; ;ALL DONE ; ;T1 := DMPCBN (BLOCK TO DUMP) DMPNXT: AOS T1,DMPCBN ;ADVANCE BLOCK CAMGE T1,DMPLBN ;PAST THE LAST BLOCK? AOS (P) ;NO--DUMP THIS BLOCK POPJ P, ;RETURN SUBTTL DUMP COMMAND -- DMP7BT - 7-BIT ASCII DMP7BT: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER MOVEI T1,^D8 ;COLUMNS NEEDED PER WORD (5 PLUS " +N") PUSHJ P,DMPCOL ;COMPUTE ITEMS PER LINE (SET P3 & P4) DMP7B1: TRNN P4,-1 ;FIRST TIME ON THIS LINE? PUSHJ P,DMPOFS ;YES--PRINT BLOCK OFFSET HLRZ T1,(P1) ;GET LH WORD PUSHJ P,ASC7BT ;PRINT AS 7-BIT ASCII MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER AOBJN P4,DMP7B2 ;COUNT ITEMS PRINTED PUSHJ P,T$CRLF ;END LINE MOVE P4,P3 ;RESET COUNTER DMP7B2: AOS P1 ;ADVANCE POINTER AOBJN P2,DMP7B1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDM7BT: ASCIZ \ The 7-BIT option will cause the contents of a block to be displayed as 7-bit ASCII. \ ;ROUTINE TO DO THE ACTUAL OUTPUT ASC7BT: MOVE T2,[POINT 7,(P1)] ;GET BYTE POINTER MOVSI T3,-5 ;AND BYTE COUNT ASC7B1: ILDB T1,T2 ;GET A CHARACTER CAIL T1," " ;WEED OUT CONTROL CHARACTERS CAIN T1,177 ;AND RUBOUT MOVEI T1," " ;CONVERT IT PUSHJ P,T$CHAR ;PRINT CHARACTER AOBJN T3,ASC7B1 ;LOOP PUSHJ P,T$SPAC ;SPACE OVER PUSHJ P,T$PLUS ;ADD A PLUS SIGN MOVE T1,(P1) ;GET WORD ANDI T1,1 ;ISOLATE LSN BIT ADDI T1,"0" ;MAKE READABLE PJRST T$CHAR ;PRINT IT AND RETURN SUBTTL DUMP COMMAND -- DMP8BT - 8-BIT ASCII DMP8BT: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER MOVEI T1,^D8 ;COLUMNS NEEDED PER WORD (4 PLUS " +NN") PUSHJ P,DMPCOL ;COMPUTE ITEMS PER LINE (SET P3 & P4) DMP8B1: TRNN P4,-1 ;FIRST TIME ON THIS LINE? PUSHJ P,DMPOFS ;YES--PRINT BLOCK OFFSET HLRZ T1,(P1) ;GET LH WORD PUSHJ P,ASC8BT ;PRINT AS 8-BIT ASCII MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER AOBJN P4,DMP8B2 ;COUNT ITEMS PRINTED PUSHJ P,T$CRLF ;END LINE MOVE P4,P3 ;RESET COUNTER DMP8B2: AOS P1 ;ADVANCE POINTER AOBJN P2,DMP8B1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDM8BT: ASCIZ \ The 8-BIT option will cause the contents of a block to be displayed as 8-bit ASCII. \ ;ROUTINE TO DO THE ACTUAL OUTPUT ASC8BT: MOVE T2,[POINT 8,(P1)] ;GET BYTE POINTER MOVSI T3,-4 ;AND BYTE COUNT ASC8B1: ILDB T1,T2 ;GET A CHARACTER ANDI T1,177 ;REDUCE FOR COMPARRISON CAIL T1," " ;WEED OUT CONTROL CHARACTERS CAIN T1,177 ;AND RUBOUT SKIPA T1,[" "] ;CONVERT IT LDB T1,T2 ;RELOAD CHARACTER PUSHJ P,T$CHAR ;PRINT CHARACTER AOBJN T3,ASC8B1 ;LOOP PUSHJ P,T$SPAC ;SPACE OVER PUSHJ P,T$PLUS ;ADD A PLUS SIGN MOVE T1,(P1) ;GET WORD ANDI T1,17 ;ISOLATE JUNK BITS JUSTIFY (R,2,"0",T$OCTW) ;PRINT BITS POPJ P, ;RETURN SUBTTL DUMP COMMAND -- DMPATO - AUTOMATIC BLOCK DETECTION DMPATO: SKIPLE DMPMOD ;STRUCTURE OR UNIT MODE? JRST DMPAT1 ;NO MOVE T1,DMPCBN ;GET CURRENT BLOCK NUMBER CAIE T1,LBNHOM ;FIRST HOM BLOCK? CAIN T1,LB2HOM ;REDUNDANT HOM BLOCK? PJRST DMPHOM ;YES CAIE T1,LBNHOM+LBOBAT ;FIRST BAT BLOCK? CAIN T1,LB2HOM+LBOBAT ;REDUNDANT BAT BLOCK? PJRST DMPBAT ;YES SKIPE DMPMOD ;UNIT MODE? JRST DMPAT2 ;NO PUSHJ P,F$BLKS ;TRANSLATE TO BLOCK ON STRUCTURE MOVE T1,DMPCBN ;THAT'S OK, MIGHT NOT BE A PRIME RIB JRST DMPAT2 ;CONTINUE DMPAT1: MOVE T1,.FWSBN(F) ;GET LAST BLOCK READ DMPAT2: MOVE T2,P1 ;POINT TO BUFFER PUSHJ P,F$VRIB ;SEE IF WE HAVE A RIB PJRST DMPMIX ;NO--DEFAULT TO MIXED MODE PJRST DMPRIB ;GO DECODE A RIB HDMATO: ASCIZ \ The AUTOMATIC option will cause each block to be examined to see if it conforms to a known format (i.e. BAT, HOM, RIB, etc.) and if so, change the display format automatically to present the best representation of that block. The format selected for a particular block may be one of the standard display formats. \ SUBTTL DUMP COMMAND -- DMPBAT - BAT BLOCK DMPBAT: XMOVEI T1,DHDBAT ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER XMOVEI T1,[ASCIZ /, BAT block/] MOVEM T1,DMPIDN ;SAVE SPECIAL BLOCK IDENTIFIER PUSHJ P,T$FORM ;START WITH A FORM-FEED DUMP (BAFNAM,,T$SIXN) DUMP (BAFFIR,,DMPAOB) DUMP (BAFNBS,,DMPNBS) DUMP (BAFNBR,,DMPNBR) DUMP (BAFKDC,,DMPKDC) DUMP (BAFCNT,,T$DECW) DUMP (BAFCOD,,T$XWD) DUMP (BAFSLF,,T$DECW) PUSHJ P,T$CRLF SKIPN BAFCNT(P1) ;ANY BAD REGIONS TO REPORT? POPJ P, ;NO XMOVEI T1,BATHDR ;POINT TO HEADER PUSHJ P,T$STRG ;PRINT IT MOVN P2,BAFCNT(P1) ;GET BAD REGIONS FOUND BY MONITOR HRLZS P2 ;PUT IN LH HRR P2,BAFFIR(P1) ;OFFSET TO START OF BAD REGION WORD PAIRS HRRZ T1,BAFFIR(P1) ;... ADD P1,T1 ;POINT TO IT DMPBA1: PUSHJ P,DMPOFS ;PRINT BLOCK OFFSET XMOVEI T1,[ASCIZ /New /] ;ASSUME NEW FORMAT ENTRIES MOVEI T2,BAPNTP ;IF OLD STYLE TDNN T2,BAFAPN(P1) ;CHECK IT XMOVEI T1,[ASCIZ /Old /] ;OLD-STYLE PUSHJ P,T$STRG ;PRINT TEXT LDB T1,[POINT 3,BAFVER(P1),2] ;GET VERSION CODE PUSHJ P,T$OCTW ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER XMOVEI T1,[ASCIZ /No /] ;ASSUME ONLY DETECTED ONCE MOVSI T2,BAPOTH ;BIT TO TEST TDNE T2,BAFOTH(P1) ;BAD REGION DETECTED BY MORE THAN ONE CPU/KONT? XMOVEI T1,[ASCIZ /Yes/] ;YES PUSHJ P,T$STRG ;PRINT YES/NO MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER MOVE T1,BAFELB(P1) ;GET START OF REGION TLZ T1,BATMSK ;MASK OUT ALL BUT ADDR MOVEI T2,BAPNTP ;IF OLD STYLE TDNN T2,BAFAPN(P1) ;CHECK IT HRRZS T1 ;ONLY 18 BITS COUNT JUSTIFY (R,7," ",T$DECW) ;PRINT START ADDRESS OF BAD REGION MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,[POINT BASNBB,BAFNBB(P1),BANNBB] ;GET BAD BLOCKS-1 IN REGION AOS T1 ;ADJUST SO NUMBER IS PLEASING TO THE EYE JUSTIFY (R,3," ",T$DECW) ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,[POINT BASAPN,BAFAPN(P1),BANAPN] ;CPU WHICH DETECTED ERROR JUSTIFY (R,5," ",T$DECW) ;PRINT SERIAL NUMBER MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,[POINT BASKNM,BAFKNM(P1),BANKNM] ;GET KONT NUMBER JUSTIFY (R,3," ",T$DECW) ;PRINT IT MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER MOVE T1,BAFPUB(P1) ;GET WORD CONTAINING UNIT NUMBER LSH T1,14 ;LEFT JUSTIFY MASK JFFO T1,.+1 ;FIND FIRST BIT MOVEI T1,7 ;HIGHEST LEGAL UNIT IN A BAT BLOCK SUBI T1,(T2) ;COMPUTE ACTUAL UNIT NUMBER JUSTIFY (R,2," ",T$DECW) ;PRINT UNIT NUMBER MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER HLRZ T1,BAFELB(P1) ;GET POSSIBLE CONI BITS LSH T1,-BAJCNI ;POSITION THEM MOVEI T2,BAPNTP ;IF OLD STYLE TDNN T2,BAFAPN(P1) ;CHECK IT JUSTIFY (R,6,"0",T$OCTW) ;PRINT CONI XMOVEI T1,[ASCIZ / /] TDNE T2,BAFAPN(P1) ;CHECK AGAIN PUSHJ P,T$STRG ;FILL OUT THE COLUMN WITH BLANKS MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN DMPBA2: MOVE T2,BAFERR(P1) ;GET ERROR WORD XMOVEI T1,[ASCIZ /???/] TLNE T2,BAPOTR ;OTHER? XMOVEI T1,[ASCIZ /Other/] TLNE T2,BAPDTR ;DATA ERROR? XMOVEI T1,[ASCIZ /Data/] TLNE T2,BAPHDR ;SEARCH OR HEADER COMPARE? MOVEI T1,[ASCIZ /Search or header compare/] PUSHJ P,T$STRG ;PRINT ERROR TYPE PUSHJ P,T$CRLF ;END LINE DMPBA3: AOS P1 ;ADVANCE POINTER AOS P2 ;ACCOUNT FOR TWO WORD ENTRIES AOBJN P2,DMPBA1 ;LOOP FOR ALL BAD REGIONS POPJ P, ;RETURN HDMBAT: ASCIZ \ The BAT-BLOCK option will cause blocks to be interpreted as if they contained BAT block data. In this mode, each recorded bad region will be decoded and displayed in a broken down fashion. Data in the FORMAT column refers to the style of bad region entry. Basically, this amounts to a flag which indicates either an old or new-style entry and a 3-bit version number. Items under the MUL column are either a "NO" or "YES", indicating whether or not the bad region was detected by CPUs or controllers other than the one which created the original entry. The BLOCK column is the starting block number of the bad region. The NO column contains the number of blocks in the bad region. The CPU, CTL, and UNIT columns record information about the hardware configuration which detected the bad region. The CONI bits are valid only for old-style entries. The column will be blank for new entries. The ERROR column displays the type of error for the bad region. \ DHDBAT: PUSHJ P,DMPHDR ;PRINT BLOCK HEADER HLRE T2,P2 ;GET REMAINING WORD COUNT MOVMS T2 ;MAKE POSITIVE CAIN T2,BLKSIZ ;DOING THE RETRIEVAL POINTER BREAKDOWN? POPJ P, ;NO--ALL DONE XMOVEI T1,BATHDR ;POINT TO ADDITIONAL HEADER TEXT PJRST T$STRG ;PRINT IT AND RETURN BATHDR: ASCIZ \ Bad Region Breakdown Format Mul Block No. CPU Ctl Unit CONI Error ------ --- ------- --- ----- --- ---- ------ ----- \ ;DUMP BAD BLOCKS FOUND BY MAP PROGRAM DMPNBS: LDB T1,[POINT BASNBS,T1,BANNBS] PJRST T$DECW ;DUMP BAD REGIONS FOUND BY MAP PROGRAM DMPNBR: LDB T1,[POINT BASNBR,T1,BANNBR] PJRST T$DECW ;DUMP CONTROLLER DEVICE CODE USED BY MAP PROGRAM DMPKDC: LDB T1,[POINT BASKDC,T1,BANKDC] LSH T1,2 ;CONVERT 7-BIT TO 9-BIT JUSTIFY (R,3,"0",T$OCTW) ;PRINT DEVICE CODE POPJ P, ;RETURN SUBTTL DUMP COMMAND -- DMPDEC - DECIMAL DMPDEC: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER MOVEI T1,^D13 ;COLUMNS NEEDED PER WORD (12 PLUS ".") PUSHJ P,DMPCOL ;COMPUTE ITEMS PER LINE (SET P3 & P4) PUSHJ P,T$FORM ;START WITH A FORM-FEED DMPDE1: TRNN P4,-1 ;FIRST TIME ON THIS LINE? PUSHJ P,DMPOFS ;YES--PRINT BLOCK OFFSET HLRZ T1,(P1) ;GET LH WORD JUSTIFY (R,12," ",T$DECW) ;PRINT DECIMAL PUSHJ P,T$DOT ;TERMINATE WITH A PERIOD MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER AOBJN P4,DMPDE2 ;COUNT ITEMS PRINTED PUSHJ P,T$CRLF ;END LINE MOVE P4,P3 ;RESET COUNTER DMPDE2: AOS P1 ;ADVANCE POINTER AOBJN P2,DMPDE1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDMDEC: ASCIZ \ The DECIMAL option will cause the contents of a block to be displayed as a series of decimal numbers. \ SUBTTL DUMP COMMAND -- DMPDIR - DIRECTORY DMPDIR: XMOVEI T1,DHDDIR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER XMOVEI T1,[ASCIZ /, directory block/] MOVEM T1,DMPIDN ;SAVE SPECIAL BLOCK IDENTIFIER PUSHJ P,T$FORM ;START WITH A FORM-FEED DMPDI1: MOVE T2,P1 ;COPY BLOCK POINTER MOVE T3,P2 ;COPY AOBJN POINTER DMPDI2: SKIPN 0(T2) ;ZERO FILE NAME? SKIPE 1(T2) ;ZERO EXTENSION AND CFP? JRST DMPDI3 ;NO ADDI T2,2 ;ADVANCE POINTER AOBJN T3,.+1 ;ACCOUNT FOR TWO WORD ENTRIES AOBJN T3,DMPDI2 ;LOOP THROUGH BLOCK DMPDI3: HRRZ T1,T3 ;GET ENDING POINT CAME T3,P2 ;FIRST TIME THROUGH? CAIG T1,2(P2) ;ONE ENTRY DIFFERENCE? JRST DMPDI4 ;YES SUBI T2,2 ;BACK OFF TO SUB T3,[2,,2] ; LAST ZERO ENTRY PUSHJ P,T$CRLF ;END LINE XMOVEI T1,[ASCIZ / Words /] PUSHJ P,T$STRG ;PRINT TEXT HRRZ T1,P2 ;GET STARTING POINT PUSHJ P,T$OCTW ;PRINT IT XMOVEI T1,[ASCIZ / through /] PUSHJ P,T$STRG ;PRINT TEXT MOVEI T1,1(T3) ;GET ENDING POINT PUSHJ P,T$OCTW ;PRINT IT XMOVEI T1,[ASCIZ / contain zeros/] PUSHJ P,T$STRG ;PRINT TEXT PUSHJ P,T$CRLF ;END LINE MOVE P1,T2 ;UPDATE BLOCK POINTER MOVE P2,T3 ;UPDATE AOBJN POINTER JRST DMPDI7 ;CONTINUE DMPDI4: PUSHJ P,DMPOFS ;PRINT BLOCK OFFSET HLRZ T1,1(P1) ;GET EXTENSION CAIN T1,'UFD' ;USER FILE DIRECTORY? SKIPG T1,0(P1) ;YES--GET PPN, SEE IF SIXBIT JRST DMPDI5 ;SIXBIT, SO HANDLE LIKE NORMAL FILE NAME HLRZS T1 ;ISOLATE PROJECT NUMBER JUSTIFY (R,6," ",T$OCTW) ;PRINT IT PUSHJ P,T$COMA ;PRINT COMMA HRRZ T1,0(P1) ;GET PROGRAMMER NUMBER JUSTIFY (L,6," ",T$OCTW) ;PRINT IT JRST DMPDI6 ;CONTINUE DMPDI5: PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,0(P1) ;GET SIXBIT FILE NAME JUSTIFY (L,6," ",T$SIXN) ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER HLLZ T1,1(P1) ;EXTENSION JUSTIFY (L,4," ",T$SIXN) ;PRINT IT DMPDI6: MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER HRRZ T1,1(P1) ;GET CFP JUSTIFY (R,6,"0",T$OCTW) ;PRINT IT MOVEI T1,4 ;SPACE PUSHJ P,T$SPAN ; OVER HRRZ T1,1(P1) ;GET CFP AGAIN IDIV T1,.DFSCU(D) ;DIVIDE BY SUPER CLUSTERS PER UNIT IMUL T2,.DFBSC(D) ;COMPUTE BLOCK NUMBER JUSTIFY (R,2," ",T$DECW) ;PRINT UNIT MOVEI T1,4 ;SPACE PUSHJ P,T$SPAN ; OVER MOVE T1,T2 ;GET BLOCK NUMBER JUSTIFY (R,7," ",T$DECW) ;PRINT IT DMPDI7: PUSHJ P,T$CRLF ;END LINE ADDI P1,2 ;ADVANCE POINTER AOBJN P2,.+1 ;ACCOUNT FOR TWO WORD ENTRIES AOBJN P2,DMPDI1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDMDIR: ASCIZ \ The DIRECTORY option will cause the contents of a block to be interpreted as a directory data block. a word pair is treated as a single entry consisting of a SIXBIT 6-character file name, 3-character extension, and an 18-bit octal Compressed File Pointer. The CFP is further broken down into its unit and block numbers. \ DHDDIR: PUSHJ P,DMPHDR ;PRINT BLOCK HEADER XMOVEI T1,DBKHDR ;POINT TO ADDITIONAL HEADER TEXT PJRST T$STRG ;PRINT IT AND RETURN DBKHDR: ASCIZ \ Name & Ext. C.F.P. Unit Block ------------- ------ ---- ------- \ SUBTTL DUMP COMMAND -- DMPHOM - HOM BLOCK DMPHOM: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER XMOVEI T1,[ASCIZ /, HOM block/] MOVEM T1,DMPIDN ;SAVE SPECIAL BLOCK IDENTIFIER PUSHJ P,T$FORM ;START WITH A FORM-FEED DUMP (HOMNAM,,T$SIXN) DUMP (HOMHID,,T$SIXN) DUMP (HOMPHY,,CPOPJ) XMOVEI T1,[ASCIZ / #1 at cylinder /] PUSHJ P,T$STRG ;PRINT INTRODUCTION LDB T1,[POINT 8,HOMPHY(P1),7] ;CYLINDER PUSHJ P,T$OCTW XMOVEI T1,[ASCIZ / surface /] PUSHJ P,T$STRG LDB T1,[POINT 5,HOMPHY(P1),12] ;SECTOR PUSHJ P,T$OCTW XMOVEI T1,[ASCIZ / sector /] PUSHJ P,T$STRG LDB T1,[POINT 5,HOMPHY(P1),17] ;SURFACE PUSHJ P,T$OCTW PUSHJ P,T$CRLF XMOVEI T1,[ASCIZ / #2 at cylinder /] PUSHJ P,T$STRG ;PRINT INTRODUCTION LDB T1,[POINT 8,HOMPHY(P1),25] ;CYLINDER PUSHJ P,T$OCTW XMOVEI T1,[ASCIZ / surface /] PUSHJ P,T$STRG LDB T1,[POINT 5,HOMPHY(P1),30] ;SECTOR PUSHJ P,T$OCTW XMOVEI T1,[ASCIZ / sector /] PUSHJ P,T$STRG LDB T1,[POINT 5,HOMPHY(P1),35] ;SURFACE PUSHJ P,T$OCTW PUSHJ P,T$CRLF DUMP (HOMSRC,,T$DECW) DUMP (HOMSNM,,T$SIXN) DUMP (HOMNXT,,T$SIXN) DUMP (HOMPRV,,T$SIXN) DUMP (HOMLOG,,T$SIXN) DUMP (HOMLUN,,T$OCTW) DUMP (HOMPPN,,DMPPPN) DUMP (HOMHOM,,CPOPJ) XMOVEI T1,[ASCIZ / #1 at /] PUSHJ P,T$STRG HLRZ T1,HOMHOM(P1) PUSHJ P,T$DECW PUSHJ P,T$CRLF XMOVEI T1,[ASCIZ / #2 at /] PUSHJ P,T$STRG HRRZ T1,HOMHOM(P1) PUSHJ P,T$DECW PUSHJ P,T$CRLF DUMP (HOMGRP,,T$DECW) DUMP (HOMBSC,,T$DECW) DUMP (HOMSCU,,T$DECW) DUMP (HOMCNP,,T$BPTR) DUMP (HOMCKP,,T$BPTR) DUMP (HOMCLP,,T$BPTR) DUMP (HOMBPC,,T$DECW) DUMP (HOMK4C,,T$DECW) DUMP (HOMREF,,T$YN) DUMP (HOMSIC,,T$DECW) DUMP (HOMSID,,T$SIXN) DUMP (HOMSUN,,T$DECW) DUMP (HOMSLB,,T$DECW) DUMP (HOMCFS,,T$DECW) DUMP (HOMSPU,,T$DECW) DUMP (HOMOVR,,T$DECW) DUMP (HOMGAR,,T$DECW) DUMP (HOMSAT,,DMPLBX) DUMP (HOMHMS,,DMPLBX) DUMP (HOMSWP,,DMPLBX) DUMP (HOMMNT,,DMPLBX) DUMP (HOMBAD,,DMPLBX) DUMP (HOMSNP,,DMPLBX) DUMP (HOMRCV,,DMPLBX) DUMP (HOMSUF,,DMPLBX) DUMP (HOMPUF,,DMPLBX) DUMP (HOMMFD,,DMPLBX) DUMP (HOMPT1,,T$XWD) DUMP (HOMUN1,,T$OCTW) DUMP (HOMUTP,,T$OCTW) DUMP (HOMRIP,,T$XWD) DUMP (HOMFEB,,DMPFEB) DUMP (HOMFEL,,T$DECW) MOVE T1,['HOMKLB'] ;BASE SYMBOL MOVEI T2,HOMKLB ;AND VALUE MOVE T3,[-<20--1>,,HOMFEL+1] ;AOBJN POINTER PUSHJ P,DMPXWD ;PRINT REMAINING KL10 FE WORDS DUMP (HOMFEA,,T$DECW) DUMP (HOMFES,,T$DECW) DUMP (HOMTCS,,DMPTCS) DUMP (HOMKLE,,T$XWD) SKIPE HOMVSY(P1) ;SKIP IF OLD DISK DUMP (HOMK4C,,T$DECW) DUMP (HOMSDL,,T$DECW) DUMP (HOMBTS,,T$XWD) XMOVEI T1,[ASCIZ / Private: /] PUSHJ P,T$STRG LDB T1,[POINT HOSPVS,HOMBTS(P1),HONPVS] MOVE T1,YNQKEY+1(T1) PUSHJ P,T$STRG PUSHJ P,T$CRLF XMOVEI T1,[ASCIZ / Disk-set: /] PUSHJ P,T$STRG LDB T1,[POINT HOSSET,HOMBTS(P1),HONSET] PUSHJ P,T$DECW PUSHJ P,T$CRLF DUMP (HOMOPP,,DMPPPN) DUMP (HOMMSU,,T$XWD) DUMP (HOMCUS,,CPOPJ) MOVE T1,['HOMCUS'] ;SYMBOL MOVEI T2,HOMCUS ;BASE ADDRESS MOVE T3,[-,,HOMCUS] ;AOBJN POINTER PUSHJ P,DMPXWD ;PRINT BLOCK DUMP (HOMVID,,DMPP11) SKIPN HOMVSY(P1) ;SKIP IF NEW DISK DUMP (HOMOKC,,T$DECW) DUMP (HOMOWN,,DMPP11) DUMP (HOMVSY,,DMPP11) DUMP (HOMCOD,,T$XWD) DUMP (HOMSLF,,T$DECW) POPJ P, ;RETURN HDMHOM: ASCIZ \ The HOM-BLOCK option will cause blocks to be interpreted as if they contained HOM block data. \ DMPAOB: PUSH P,T1 ;SAVE AOBJN POINTER HLRES T1 ;GET -VE LH PUSHJ P,T$OCTW ;PRINT IT PUSHJ P,T$COMA ;SEPARATE WITH A COMMAN POP P,T1 ;GET QUANTITY BACK HRRES T1 ;ISOLATE RH PJRST T$OCTW ;PRINT IT AND RETURN DMPLBX: PUSHJ P,T$DECW ;PRINT LOGICAL BLOCK NUMBER PUSHJ P,T$COMA ;SEPARATE AND PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,2(P1) ;GET INSTRUCTION TO FETCH LBN SUBI T1,HOMTAB ;REDUCE TO OFFSET WITHIN TABLE ADDI T1,HOMLEN ;INDEX INTO LENGTH TABLE XCT T1 ;LOAD UP T1 WITH LENGTH PJRST T$DECW ;PRINT IT AND RETURN DMPP11: MOVE T2,-1(P) ;FETCH BUFFER ADDRESS MOVE T3,2(P1) ;GET INSTRUCTION TO FETCH QUANTITY TLZ T3,(MOVE) ;CLEAR OUT "MOVE" TLO T3,(XMOVEI) ;MAKE IMMEDIATE XCT T3 ;LOAD UP T1 WITH ADDRESS MOVEI T2,3*4 ;3 WORDS WITH 4 BYTES EACH PUSHJ P,P11GET ;TRANSLATE STRING PJRST T$STRG ;PRINT TEXT AND RETURN DMPPPN: JUMPN T1,T$PPN ;OK IF A REAL PPN XMOVEI T1,[ASCIZ /(none)/] PJRST T$STRG ;PRINT TEXT AND RETURN DMPXWD: PUSH P,T1 ;SAVE BASE SYMBOL NAME PUSH P,T2 ;AND VALUE DMPXW1: MOVEI T1,^D16 ;SPACE PUSHJ P,T$SPAN ; OVER MOVE T1,-1(P) ;GET NAME PUSHJ P,T$SIXN ;PRINT IT PUSHJ P,T$PLUS ;ADD SEPARATOR HRRZ T1,T3 ;GET OFFSET INTO HOME BLOCK SUB T1,(P) ;REDUCE JUSTIFY (R,2,"0",T$OCTW) ;PRINT IT PUSHJ P,T$COLN ;PRINT A COLON PUSHJ P,T$SPAC ;AND A SPACE HRRZ T1,T3 ;GET HOM BLOCK OFFSET ADD T1,P1 ;INDEX INTO BLOCK MOVE T1,(T1) ;FETCH CONTENTS PUSHJ P,T$XWD ;PRINT AS HALF-WORDS PUSHJ P,T$CRLF ;END LINE AOBJN T3,DMPXW1 ;LOOP FOR ALL WORDS POP P,T2 ;RESTORE T2 POP P,T1 ;RESTORE T1 POPJ P, ;RETURN DMPFEB: PUSH P,T1 ;SAVE BLOCK NUMBER, ETC. HRRZS T1 ;ISOLOATE IT PUSHJ P,T$DECW ;AND PRINT IT XMOVEI T1,[ASCIZ / (valid)/] ;BE OPTIMISTIC MOVEI T2,FEVALID ;BIT TO TEST TDNN T2,(P) ;BLOCK NUMBER OK? XMOVEI T1,[ASCIZ / (invlaid)/] PUSHJ P,T$STRG ;PRINT SOMETHING POP P,T1 ;RESTORE T1 POPJ P, ;RETURN DMPTCS: PUSH P,T1 ;SAVE WORD LDB T1,[POINT 5,(P),27] ;GET TRACK PUSHJ P,T$OCTW ;PRINT IT PUSHJ P,T$SLSH ;SEPARATE LDB T1,[POINT 9,(P),11] ;GET CYLINDER PUSHJ P,T$OCTW ;PRINT IT PUSHJ P,T$SLSH ;SEPARATE LDB T1,[POINT 5,(P),35] ;GET SECTOR PUSHJ P,T$OCTW ;PRINT IT POP P,T1 ;RESTORE T1 POPJ P, ;RETURN SUBTTL DUMP COMMAND -- DMPMIX - MIXED FORMAT DMPMIX: XMOVEI T1,DHDMIX ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER PUSHJ P,T$FORM ;START WITH A FORM-FEED DMPMI1: MOVE T2,P1 ;COPY BLOCK POINTER MOVE T3,P2 ;COPY AOBJN POINTER DMPMI2: SKIPE (T2) ;ZERO? JRST DMPMI3 ;NO AOS T2 ;ADVANCE POINTER AOBJN T3,DMPMI2 ;LOOP THROUGH BLOCK DMPMI3: HRRZ T1,T3 ;GET ENDING POINT CAME T3,P2 ;FIRST TIME THROUGH? CAIN T1,1(P2) ;ONE WORD DIFFERENCE? JRST DMPMI4 ;YES PUSHJ P,T$CRLF ;END LINE XMOVEI T1,[ASCIZ / Words /] PUSHJ P,T$STRG ;PRINT TEXT HRRZ T1,P2 ;GET STARTING POINT PUSHJ P,T$OCTW ;PRINT IT XMOVEI T1,[ASCIZ / through /] PUSHJ P,T$STRG ;PRINT TEXT HRRZ T1,T3 ;GET ENDING POINT PUSHJ P,T$OCTW ;PRINT IT XMOVEI T1,[ASCIZ / contain zeros/] PUSHJ P,T$STRG ;PRINT TEXT PUSHJ P,T$CRLF ;END LINE MOVE P1,T2 ;UPDATE BLOCK POINTER MOVE P2,T3 ;UPDATE AOBJN POINTER JRST DMPMI5 ;AND CONTINUE DMPMI4: PUSHJ P,DMPOFS ;PRINT BLOCK OFFSET MOVE T1,(P1) ;GET WORD JUSTIFY (R,12," ",T$DECW) ;PRINT DECIMAL PUSHJ P,T$DOT ;TERMINATE WITH A PERIOD MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER HLRZ T1,(P1) ;GET LH WORD JUSTIFY (R,6,"0",T$OCTW) ;PRINT OCTAL PUSHJ P,T$SPAC ;SEPARATE HRRZ T1,(P1) ;GET RH WORD JUSTIFY (R,6,"0",T$OCTW) ;PRINT OCTAL MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER MOVE T1,(P1) ;GET WORD JUSTIFY (L,6," ",T$SIXN) ;PRINT SIXBIT MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER PUSHJ P,ASC7BT ;PRINT 7-BIT ASCII MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER PUSHJ P,ASC8BT ;PRINT 7-BIT ASCII DMPMI5: PUSHJ P,T$CRLF ;END LINE AOS P1 ;ADVANCE BLOCK POINTER AOBJN P2,DMPMI1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN DHDMIX: PUSHJ P,DMPHDR ;PRINT BLOCK HEADER XMOVEI T1,MIXHDR ;POINT TO ADDITIONAL HEADER TEXT PJRST T$STRG ;PRINT IT AND RETURN MIXHDR: ASCIZ \ Decimal Octal SIXBIT 7 Bit 8 Bit ------------- ------------- ------ -------- -------- \ HDMMIX: ASCIZ \ The MIXED-MODE option will display blocks in 5 different formats, viz. DECIMAL, OCTAL, SIXBIT, 7-BIT, and 8-BIT. \ SUBTTL DUMP COMMAND -- DMPOCT - OCTAL DMPOCT: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER MOVEI T1,^D13 ;COLUMNS NEEDED PER WORD (6+6 PLUS " ") PUSHJ P,DMPCOL ;COMPUTE ITEMS PER LINE (SET P3 & P4) PUSHJ P,T$FORM ;START WITH A FORM-FEED DMPOC1: TRNN P4,-1 ;FIRST TIME ON THIS LINE? PUSHJ P,DMPOFS ;YES--PRINT BLOCK OFFSET HLRZ T1,(P1) ;GET LH WORD JUSTIFY (R,6,"0",T$OCTW) ;PRINT OCTAL PUSHJ P,T$SPAC ;SEPARATE HRRZ T1,(P1) ;GET RH WORD JUSTIFY (R,6,"0",T$OCTW) ;PRINT OCTAL MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER AOBJN P4,DMPOC2 ;COUNT ITEMS PRINTED PUSHJ P,T$CRLF ;END LINE MOVE P4,P3 ;RESET COUNTER DMPOC2: AOS P1 ;ADVANCE POINTER AOBJN P2,DMPOC1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDMOCT: ASCIZ \ The OCTAL option will cause the contents of a block to be displayed as a series of octal numbers. \ SUBTTL DUMP COMMAND -- DMPRIB - RIB DMPRIB: XMOVEI T1,DHDRIB ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER XMOVEI T1,[ASCIZ /, RIB block/] MOVEM T1,DMPIDN ;SAVE SPECIAL BLOCK IDENTIFIER PUSHJ P,T$FORM ;START WITH A FORM-FEED DUMP (RIBFIR,,DMPAOB) DUMP (RIBPPN,,T$PPN) DUMP (RIBNAM,,DMPNAM) DUMP (RIBEXT,,DMPEXT) DUMP (RIBATT,,CPOPJ) XMOVEI T1,[ASCIZ / RIBPRV: /] PUSHJ P,T$STRG ;PRINT TEXT LDB T1,[POINT RISPRV,RIBPRV(P1),RINPRV] ;GET ACCESS CODE JUSTIFY (R,3,"0",T$OCTW) ;PRINT IT PUSHJ P,T$CRLF ;END LINE DUMP (RIBSIZ,,T$DECW) DUMP (RIBVER,,T$VERW) DUMP (RIBSPL,,T$SIXN) DUMP (RIBEST,,T$DECW) DUMP (RIBALC,,T$DECW) DUMP (RIBPOS,,T$DECW) DUMP (RIBUNI,,DMPUNI) DUMP (RIBNCA,,T$XWD) DUMP (RIBMTA,,T$SIXN) DUMP (RIBDEV,,T$SIXN) DUMP (RIBSTS,,T$XWD) DUMP (RIBELB,,DMPELX) DUMP (RIBEUN,,DMPELX) DUMP (RIBNBB,,DMPELX) HLRZ T1,RIBEXT(P1) ;GET EXTENSION CAIE T1,'UFD' ;USER FILE DIRECTORY? JRST DMPRI1 ;NO DUMP (RIBQTF,,T$DECW) DUMP (RIBQTO,,T$DECW) DUMP (RIBQTR,,T$DECW) DUMP (RIBUSD,,T$DECW) JRST DMPRI2 ;CONTINUE DMPRI1: DUMP (RIBTYP,,T$XWD) DUMP (RIBBSZ,,T$XWD) DUMP (RIBRSZ,,T$XWD) DUMP (RIBAPW,,T$XWD) DMPRI2: DUMP (RIBAUT,,T$PPN) DUMP (RIBNXT,,T$SIXN) DUMP (RIBPRD,,T$SIXN) DUMP (RIBPCA,,T$XWD) DUMP (RIBUFD,,T$DECW) DUMP (RIBFLR,,T$DECW) DUMP (RIBXRA,,T$XWD) SKIPN RIBXRA(P1) ;HAVE ONE? JRST DMPRI3 ;NO XMOVEI T1,[ASCIZ / RIB number: /] PUSHJ P,T$STRG ;PRINT TEXT LDB T1,[POINT DESRBC,RIBXRA(P1),DENRBC] ;GET RIB NUMBER PUSHJ P,T$DECW ;PRINT IT PUSHJ P,T$CRLF ;END LINE XMOVEI T1,[ASCIZ / Logical unit: /] PUSHJ P,T$STRG ;PRINT TEXT LDB T1,[POINT DESRBU,RIBXRA(P1),DENRBU] ;GET UNIT PUSHJ P,T$DECW ;PRINT IT PUSHJ P,T$CRLF ;END LINE XMOVEI T1,[ASCIZ / Cluster address: /] PUSHJ P,T$STRG ;PRINT TEXT LDB T1,[POINT DESRBA,RIBXRA(P1),DENRBA] ;GET CLUSTER ADDRESS PUSHJ P,T$DECW ;PRINT IT PUSHJ P,T$CRLF ;END LINE DMPRI3: DUMP (RIBTIM,,T$DTTM) HLRZ T1,RIBEXT(P1) ;GET EXTENSION CAIE T1,'UFD' ;USER FILE DIRECTORY? JRST DMPRI4 ;NO DUMP (RIBLAD,,T$DTTM) DUMP (RIBDED,,DMPDED) JRST DMPRI5 ;ONWARD DMPRI4: DUMP (RIBACT,,DMPAOB) XMOVEI T1,[ASCIZ / No account string set/] HRRZ T2,RIBACT(P1) ;GET OFFSET TO STRING ADD T2,P1 ;INDEX TO BEGINING OF BLOCK SKIPN T2 ;ANYTHING THERE? PJRST T$STRG ;NO XMOVEI T1,[ASCIZ / Account string: "/] PUSHJ P,T$STRG ;PRINT INTRODUCTION MOVE T1,T2 ;COPY ADDRESS PUSHJ P,T$STRG ;PRINT STRING PUSHJ P,T$DQUO ;CLOSE QUOTES PUSHJ P,T$CRLF ;END LINE DMPRI5: DUMP (RIBCOD,,T$XWD) DUMP (RIBSLF,,T$DECW) MOVE T1,RIBFIR(P1) ;GET AOBJN POINTER TO RET POINTERS ADDI T1,(P1) ;RELOCATE SKIPE (T1) ;END AOBJN T1,.-1 ;COUNT POINTERS SUBI T1,(P1) ;KEEP ONLY THE STARTING OFFSET SUB T1,RIBFIR(P1) ;STRIP OFFSET LEAVING COUNT OF RET POINTERS HRRZS T1 ;ON LH JUNK ADDI T1,RIBHDL+1 ;ACCOUNT FOR HEADER + 1 DATA LINE PUSHJ P,L$TEST ;TEST PAGE XMOVEI T1,RIBHDR ;POINT TO HEADER PUSHJ P,T$STRG ;PRINT IT MOVE P2,RIBFIR(P1) ;AOBJN POINTER TO RETRIEVEL POINTERS HRRZ T1,P2 ;ISOLATE OFFSET ADD P1,T1 ;SET BLOCK POINTER ACCORDINGLY MOVSI P3,1 ;NO UNIT NUMBER YET DMPRI6: SKIPN R,(P1) ;GET RETRIEVAL POINTER POPJ P, ;DONE PUSHJ P,DMPOFS ;PRINT BLOCK OFFSET MOVE T1,R ;COPY POINTER PUSHJ P,T$XWD ;PRINT AS OCTAL HALF-WORDS MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER TDNE R,[-1-RIPNUB-MAXUNI] ;CHANGE OF UNIT POINTER? JRST DMPRI7 ;NO TRZ R,RIPNUB ;CLEAR CHANGE BIT MOVEI P3,(R) ;COPY NEW UNIT NUMBER DMPRI7: PUSHJ P,T$SPAC ;SPACE OVER MOVE T1,P3 ;GET UNIT JUSTIFY (R,2," ",T$DECW) ;PRINT IT CAMN P3,R ;NEW UNIT? JRST DMPRI8 ;YES--SHORT LINE MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,.DFCNP(D) ;GET CLUSTER COUNT JUSTIFY (R,6," ",T$DECW) ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,.DFCKP(D) ;GET CHECKSUM JUSTIFY (R,6,"0",T$OCTW) ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,.DFCLP(D) ;GET CLUSTER ADDRESS JUSTIFY (R,6,"0",T$OCTW) ;PRINT IT MOVEI T1,2 ;SPACE PUSHJ P,T$SPAN ; OVER LDB T1,.DFCLP(D) ;GET CLUSTER ADDRESS AGAIN IMUL T1,.DFBSC(D) ;COMPUTE BLOCK NUMBER JUSTIFY (R,7," ",T$DECW) ;PRINT IT DMPRI8: PUSHJ P,T$CRLF ;END LINE AOS P1 ;ADVANCE POINTER AOBJN P2,DMPRI6 ;LOOP BACK FOR MORE POPJ P, ;RETURN HDMRIB: ASCIZ \ The RIB-BLOCK option will cause blocks to be interpreted as if they contained Retrieval Information Block data. In addition to displaying the contents of various RIB words, the retrieval pointers are broken down. The CONTENTS column merely shows the retrieval pointer as two 18-bot octal half-words. The pointer is then broken down into its integral parts of unit numbers, cluster counts, checksums, and cluster addresses, and displayed in the UNIT, # CLUS, CHKSUM, and ADDR columns respectely. Cluster addresses are also converted to block numbers and displayed under the BLOCK column. \ RIBHDL==5 ;LENGTH OF HEADER IN LINES RIBHDR: ASCIZ \ Retrieval Pointer Breakdown Contents Unit # Clus Chksum Addr Block -------------- ---- ------ ------ ------ ------- \ DMPELX: MOVE T2,T1 ;PRESERVE QUANTITY XMOVEI T1,[ASCIZ /(no errors in file)/] MOVE T3,-1(P) ;GET BLOCK ADDRESS SKIPN RIBELB(T3) ;ANY ERRORS? PJRST T$STRG ;NO MOVE T1,T2 ;RESTORE T1 PJRST T$DECW ;PRINT NUMBER AND RETURN DMPEXT: HLLZS T1 ;ISOLATE EXTENSION PJRST T$SIXN ;PRINT IT AND RETURN DMPDED: MOVE T2,T1 ;COPY POSSIBLE DATA/TIME WORD XMOVEI T1,[ASCIZ /Never/] SKIPE T2 ;IS THAT TRUE? CAMN T2,[EXP -1] ;... PJRST T$STRG ;YES XMOVEI T1,[ASCIZ /Eternity/] CAMN T2,[377777,,-1] ;IS THAT THE CASE? PJRST T$STRG ;YES MOVE T1,T2 ;ELSE GET THE UDT PJRST T$DTTM ;AND PRINT IT DMPNAM: JUMPLE T1,T$SIXN ;CHECK FOR SIXBIT PJRST T$PPN ;ELSE TREAT AS A PPN DMPUNI: PUSH P,T1 ;SAVE WORD LDB T1,[POINT 14,(P),35] ;GET CPU NUMBER PUSHJ P,T$DECW ;PRINT IT PUSHJ P,T$SLSH ;SEPARATE LDB T1,[POINT 3,(P),20] ;GET KONTROLLER PUSHJ P,T$DECW ;PRINT IT PUSHJ P,T$SLSH ;SEPARATE POP P,T1 ;GET WORD BACK LSH T1,14 ;LEFT JUSTIFY MASK JFFO T1,.+1 ;FIND FIRST BIT MOVEI T1,7 ;HIGHEST LEGAL UNIT IN A BAT BLOCK SUBI T1,(T2) ;COMPUTE ACTUAL UNIT NUMBER PJRST T$DECW ;PRINT UNIT AND RETURN DHDRIB: PUSHJ P,DMPHDR ;PRINT BLOCK HEADER HLRE T2,P2 ;GET REMAINING WORD COUNT MOVMS T2 ;MAKE POSITIVE CAIN T2,BLKSIZ ;DOING THE RETRIEVAL POINTER BREAKDOWN? POPJ P, ;NO--ALL DONE XMOVEI T1,RIBHDR ;POINT TO ADDITIONAL HEADER TEXT PJRST T$STRG ;PRINT IT AND RETURN SUBTTL DUMP COMMAND -- DMPSIX - SIXBIT DMPSIX: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER MOVEI T1,^D6 ;COLUMNS NEEDED PER WORD (6 CHARACTERS) PUSHJ P,DMPCOL ;COMPUTE ITEMS PER LINE (SET P3 & P4) PUSHJ P,T$FORM ;START WITH A FORM-FEED DMPSI1: TRNN P4,-1 ;FIRST TIME ON THIS LINE? PUSHJ P,DMPOFS ;YES--PRINT BLOCK OFFSET MOVE T1,(P1) ;GET WORD JUSTIFY (L,6," ",T$SIXN) ;PRINT SIXBIT MOVEI T1,3 ;SPACE PUSHJ P,T$SPAN ; OVER AOBJN P4,DMPSI2 ;COUNT ITEMS PRINTED PUSHJ P,T$CRLF ;END LINE MOVE P4,P3 ;RESET COUNTER DMPSI2: AOS P1 ;ADVANCE POINTER AOBJN P2,DMPSI1 ;LOOP THROUGH BLOCK POPJ P, ;RETURN HDMSIX: ASCIZ \ The SIXBIT option will cause the contents of a block to be displayed as a series of sixbit words. \ SUBTTL DUMP COMMAND -- DMPSPC - SPECIAL DMPSPC: XMOVEI T1,DMPHDR ;ROUTINE TO GENERATE A HEADER PUSHJ P,L$HDRS ;SET FOR LATER PUSHJ P,T$FORM ;START WITH A FORM-FEED MOVSI T1,-MAXDMP ;-VE FORMAT BUFFER ENTRIES HRRI T1,.DFDMP(D) ;AND BUFFER ADDRESS MOVSI T2,-BLKSIZ ;-VE DATA BUFFER WORD COUNT HRRI T2,(P1) ;AND BUFFER ADDRESS XMOVEI T3,FMTD.T ;TABLE OF DISPATCH TABLES SETZ T4, ;NO LINE IDENTIFIER PUSHJ P,FMTDPY ;DISPLAY THE BLOCK JFCL ;WILL ALWAYS SKIP POPJ P, ;RETURN HDMSPC: ASCIZ \ The SPECIAL option will cause the contents of a block to be displayed according to a predefined format descriptor. This descriptor is defined using the FORMAT DUMP-DESCRIPTOR command. \ SUBTTL DUMP COMMAND -- MISCELLANEOUS ;ROUTINE TO PRINT BLOCK HEADER DMPHDR: PUSH P,T1 ;SAVE SUB-PAGE COUNTER XMOVEI T1,[ASCIZ / *** Dump of /] PUSHJ P,T$STRG ;PRINT TEXT MOVE T1,DMPMOD ;GET MODE MOVE T1,[IFIW [ASCIZ /structure /] IFIW [ASCIZ /logical unit /] IFIW [ASCIZ /file /]]+1(T1) PUSHJ P,T$STRG ;PRINT TEXT SKIPG DMPMOD ;CHECK MODE SKIPA T1,.DFINP(D) ;USE INPUT SCAN BLOCK FOR STR OR LOG UNIT MOVE T1,.DFRSB(D) ;GET OFFSET TO RETURNED FILESPEC SCAN BLOCK ADDI T1,(D) ;RELOCATE SKIPG DMPMOD ;CHECK MODE AGAIN SKIPA T1,.SBDEV(T1) ;GET STRUCTURE OR LOGICAL UNIT NAME SKIPA T2,[IFIW T$FILE] ;FILE MODE XMOVEI T2,T$SIXN ;STRUCTURE/LOGICAL UNIT MODE PUSHJ P,(T2) ;PRINT INPUT SPEC XMOVEI T1,[ASCIZ /, block /] PUSHJ P,T$STRG ;PRINT TEXT MOVE T1,DMPCBN ;GET CURRENT BLOCK NUMBER PUSHJ P,T$DECW ;PRINT IT SKIPE T1,DMPIDN ;HAVE A SPECIAL BLOCK IDENTIFIER? PUSHJ P,T$STRG ;YES--PRINT IT XMOVEI T1,[ASCIZ / ***/] POP P,T2 ;GET COUNT BACK SKIPE T2 ;CONTINUATION? XMOVEI T1,[ASCIZ / (continued) ***/] PUSHJ P,T$STRG ;PRINT TEXT PUSHJ P,T$CRLF ;END LINE PJRST T$CRLF ;ONE MORE FOR CLARITY ;ROUTINE TO PRINT BLOCK OFFSET DMPOFS: PUSHJ P,T$SPAC ;SPACE OVER HRRZ T1,P2 ;GET WORD NUMBER JUSTIFY (R,3,"0",T$OCTW) ;PRINT IT XMOVEI T1,[ASCIZ ./ .] PJRST T$STRG ;PRINT SEPARATOR AND RETURN ;ROUTINE TO SET THE NUMBER OF ITEMS PER LINE DMPCOL: ADDI T1,3 ;ACCOUNT FOR COLUMN SEPARATORS IDIVI P3,(T1) ;DIVIDE BY COLUMNS NEEDED PER WORD CAILE P3,10 ;WITHIN REASON? MOVEI P3,10 ;REDUCE SO BLOCK OFFSETS ARE EASY TO READ MOVNS P3 ;MAKE NEGATIVE HRLZS P3 ;PUT IN LH MOVE P4,P3 ;SET WORKING COPY POPJ P, ;RETURN SUBTTL EXIT COMMAND .EXIT: PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL PUSHJ P,MONRET ;RETURN TO MONITOR JRST CPOPJ1 ;CONTINUE MONRET: SETZ T1, ;CLEAR AN AC MOVEM T1,JOBBPT ;ZAP UNSOLICED BREAKPOINT ENTRY TO DDT SETDDT T1, ;AND THE DDT START ADDRESS SETZM CMDEOF ;INCASE THE TOAD TYPED "EXIT^Z" EXIT 1, ;RETURN TO MONITOR QUIETLY DDTRES: MOVE T1,SAVBPT ;GET SAVED BREAKPOINT ENTRY ADDRESS MOVEM T1,JOBBPT ;RESTORE MOVE T1,SAVDDT ;GET DDT START ADDRESS SETDDT T1, ;RESET IT POPJ P, ;THE FOOL TYPED CONTINUE EXIHLP: ASCIZ \ The EXIT command causes control to be returned to the monitor. This is equivalent to typing Control-Z. \ SUBTTL FILE COMMAND .FILE: PUSHJ P,C$CEOL ;CHECK FOR EOL SKIPA ;NOT YET JRST FILE1 ;USE DEFAULT PUSHJ P,C$FILE ;READ A FILESPEC POPJ P, ;SYNTAX ERROR MOVSI T3,(T1) ;GET RETURNED SCAN BLOCK HRR T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE HRRZ T4,T3 ;POINT TO DESTINATION ADD T4,.DFSBL(D) ;COMPUTE ENDING ADDRESS BLT T3,-1(T4) ;COPY SCAN BLOCK PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL JRST FILE2 ;ENTER COMMON CODE FILE1: PUSHJ P,STRCHK ;WAS STRUCTURE COMMAND GIVEN? POPJ P, ;NO MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;CLEAR IT OUT FILE2: PUSHJ P,FILDE1 ;DO SCAN BLOCK DEFAULTING POPJ P, ;FAILED--ERROR ALREADY ISSUED XMOVEI T1,FILDIB ;POINT TO DEFAULT SCAN BLOCK MOVEI T2,FILDIL ;GET ITS LENGTH MOVE T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE PUSHJ P,C$DFIL ;DEFAULT EMPTY FIELDS MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,D$FILE ;OPEN DATA FILE POPJ P, ;FAILED PUSHJ P,D$WHDR ;UPDATE HEADER JRST CPOPJ1 ;RETURN ;DEFAULT THE DATA FILE SPEC FILDEF: MOVE T1,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T1,(D) ;RELOCATE PUSHJ P,C$ZFIL ;CLEAR IT OUT FILDE1: MOVSI T2,(SB.WLD) ;BIT TO TEST TDNE T2,.SBFLG(T1) ;WILDCARDED SPEC? FATAL (WFI,CPOPJ,,T$FILE) MOVSI T2,(SB.NAM) ;BIT TO TEST MOVE T3,.DFSTR(D) ;INCASE NO NAME GIVEN TDNE T2,.SBFLG(T1) ;HAVE A FILENAME? JRST FILDE2 ;ONWARD IORM T2,.SBFLG(T1) ;REMEMBER WE HAVE A FILENAME MOVEM T3,.SBNAM(T1) ;NOW WE DO SETOM .SBNMM(T1) ;SET MASK ACCORDINGLY FILDE2: XMOVEI T1,FILDIB ;POINT TO DEFAULT SCAN BLOCK MOVEI T2,FILDIL ;GET ITS LENGTH MOVE T3,.DFINP(D) ;GET OFFSET TO INPUT SCAN BLOCK ADDI T3,(D) ;RELOCATE PUSHJ P,C$DFIL ;DEFAULT EMPTY FIELDS JRST CPOPJ1 ;RETURN ;DEFAULT INPUT SCAN BLOCK FILDIB: EXP SB.DEV!SB.NAM!SB.EXT ;SCANNER FLAGS EXP 'DSK ' ;DEVICE EXP -1 ;DEVICE MASK EXP OURNAM ;FILE NAME EXP -1 ;FILE NAME MASK XWD OURPFX,-1 ;EXTENSION,,MASK FILDIL==.-FILDIB ;LENGTH OF BLOCK FILHLP: ASCIZ \ The FILE command \ SUBTTL FINISH COMMAND .FINIS: PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL MOVSI T1,(DF.PIP) ;GET BIT TDNE T1,.DFFLG(D) ;MAKE FOR PRETTY DISPLAY INFO (PTM,.+1,,PATSPC) PUSHJ P,PATZAP ;ZERO OUT IMPORTANT STORAGE PUSHJ P,D$WHDR ;UPDATE HEADER JRST CPOPJ1 ;RETURN FINHLP: ASCIZ \ The FINISH command is used to terminate patching. It performs no I/O. Data remaining in the patch buffer must be written out by a WRITE command. Its only purpose is to provide an orderly cleanup of the data file and internal storage used to maintain the patching facilities. \ SUBTTL FORMAT COMMAND -- ENTRY POINT .FORMA: PUSHJ P,C$CEOL ;CHECK FOR END OF LINE SKIPA ;NO PJRST C$ENAS ;NO ARGUMENTS SPECIFIED PUSHJ P,SAVE4 ;SAVE SOME ACS XMOVEI T1,FORM.T ;POINT TO COMMAND TABLES PUSHJ P,C$TSET ;SET UP SCANNER PUSHJ P,C$ATOM ;READ A KEYWORD FATAL (ILC,CPOPJ,,T$FCHR) PUSHJ P,C$CEOL ;CHECK FOR EOL PJRST C$EEOL ;ERROR AT EOL XMOVEI T1,CMDATB ;POINT TO ATOM BUFFER XMOVEI T2,FORM.N ;AND TO KEYWORDS PUSHJ P,C$KEYW ;CHECK FOR A MATCH PJRST C$EKEY ;FAILED PUSHJ P,@FORM.P(T2) ;DISPATCH POPJ P, ;FAILED PUSHJ P,D$WHDR ;UPDATE HEADER JRST CPOPJ1 ;RETURN FORHLP: ASCIZ \ The FORMAT command is used to define customized data displays. Once defined, the data display information is referred to as a group of format descriptors. The descriptors are stored in the data file and may be displayed by a SHOW command. The command syntax is: FORMAT When the command is given, a dialogue will be invoked which will allow the specification of words or bytes and the method of display. \ ;FORMAT KEYWORD TABLE DEFINE KEYS,< KEY (, FMTDMP,FMTDMH, ) KEY (, FMTIOT,FMTIOH, ) > KEYTAB (FORM,) SUBTTL FORMAT COMMAND -- FMTDMP - DUMP FMTDMP: MOVSI P1,-MAXDMP ;-VE NUMBER OF ENTRIES XMOVEI P2,FMTD.N ;POINT TO KEYWORD TABLE XMOVEI P3,DEFFMD ;AND TO DEFAULT KEYWORD XMOVEI P4,FMTD.P ;GET PROCESSOR TABLE (FOR BYTE SIZE DEFAULTS) PUSHJ P,FORMAT ;GO SET UP DESCRIPTORS MOVSI T1,FORBUF ;GET TEMP STORAGE HRRI T1,.DFDMP(D) ;AND ADDR OF STORAGE IN DATA FILE HEADER BLT T1,.DFDMP+-1(D) ;COPY JRST CPOPJ1 ;RETURN FMTDMH: ASCIZ \ The FORMAT DUMP-DESCRIPTORS command will invoke a dialogue which is used to define DUMP descriptors. When DUMP format "SPECIAL" is selected, the defined DUMP descriptors will be used to decode and display the data. The command syntax is: FORMAT DUMP-DESCRIPTORS Once the command is completed, a question and answer dialogue will allow the specification of buffer addresses, bytes, and the format in which to display the data. \ ;FORMAT DUMP TABLE DEFINE KEYS,< KEY (<7-BIT>, FMT7BT,HDM7BT, ) KEY (<8-BIT>, FMT8BT,HDM8BT, ) KEY (, FMTDEC,HDMDEC, ) KEY (, FMTHLF,HDMHOM, ) KEY (, FMTOCT,HDMOCT, ) KEY (, FMTSIX,HDMSIX, ) > KEYTAB (FMTD,) DEFFMD: ASCIZ /OCTAL/ ;DEFAULT FORMAT BLOCK MAXHKS-<.-DEFFMD> ;PAD OUR REMAINDER SUBTTL FORMAT COMMAND -- FMTIOT - I/O TRACE ;I/O TRACE FMTIOT: MOVSI P1,-MAXIOT ;-VE NUMBER OF ENTRIES XMOVEI P2,FMTI.N ;POINT TO KEYWORD TABLE XMOVEI P3,DEFFMI ;AND TO DEFAULT KEYWORD XMOVEI P4,FMTI.P ;GET PROCESSOR TABLE (FOR BYTE SIZE DEFAULTS) PUSHJ P,FORMAT ;GO SET UP DESCRIPTORS MOVSI T1,FORBUF ;GET TEMP STORAGE HRRI T1,.DFIOT(D) ;AND ADDR OF STORAGE IN DATA FILE HEADER BLT T1,.DFIOT+-1(D) ;COPY JRST CPOPJ1 ;RETURN FMTIOH: ASCIZ \ The FORMAT IO-DESCRIPTORS command will invoke a dialogue which is used to define data descriptors. When I/O tracing is enabled, the data descriptors are used to decode data in the I/O buffers and display a portion of that data while normal file I/O is in progress. The command syntax is: FORMAT IO-DESCRIPTORS Once the command is completed, a question and answer dialogue will allow the specification of buffer addresses, bytes, and the format in which to display the data. \ ;FORMAT I/O TRACE TABLE DEFINE KEYS,< KEY (<7-BIT>, FMT7BT,HDM7BT, ) KEY (<8-BIT>, FMT8BT,HDM8BT, ) KEY (, FMTDEC,HDMDEC, ) KEY (, FMTHLF,HDMHOM, ) KEY (, FMTOCT,HDMOCT, ) KEY (, FMTPAU,HDMOCT, ) KEY (, FMTSIX,HDMSIX, ) > KEYTAB (FMTI,) DEFFMI: ASCIZ /OCTAL/ ;DEFAULT FORMAT BLOCK MAXHKS-<.-DEFFMI> ;PAD OUR REMA