Google
 

Trailing-Edge - PDP-10 Archives - BB-BT99V-BB_1990 - 10,7/dpatch/dpatch.mac
Click 10,7/dpatch/dpatch.mac to see without markup as text/plain
There is 1 other file named dpatch.mac in the archive. Click here to see a list.
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 <EOL> 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+<T3=1+<T2=1+<T1=2>>>> ;FOUR CONSECUTIVE TEMPORARY ACS
	P4=<1+<P3=1+<P2=1+<P1=6>>>> ;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,<DEFCPI==^D1000>	;DEFAULT CHECKPOINT INTERVAL
IFNDEF DEFLPP,<DEFLPP==^D55>	;DEFAULT LPT LINES PER PAGE
IFNDEF DEFLWD,<DEFLWD==^D72>	;DEFAULT LPT WIDTH
IFNDEF DEFPRD,<DEFPRD==^D200>	;DEFAULT BLOCKS PER READ REQUEST
IFNDEF DEFPSZ,<DEFPSZ==^D128>	;DEFAULT PATCH BUFFER SIZE
IFNDEF DEFSRT,<DEFSRT==^D1000>	;DEFAULT SORT BUFFER SIZE
IFNDEF DEFTPP,<DEFTPP==^D24>	;DEFAULT TERMINAL LINES PER PAGE
IFNDEF DEFTWD,<DEFTWD==^D72>	;DEFAULT TERMINAL WIDTH
IFNDEF PRVBIT,<PRVBIT==JP.POK>	;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<-<<MASK>_<^L<MASK>>>-1>>>


;COMPUTE POSITION OF MASK, I.E. BIT POSITION OF RIGHTMOST ONE IN MASK
DEFINE	POS	(MASK),<<^L<<MASK>&<-<MASK>>>>>


;CONSTRUCT BYTE POINTER TO MASK
DEFINE	POINTR	(LOC,MASK),<<POINT WID(MASK),LOC,POS(MASK)>>


;INSERT A RIGHT-JUSTIFIED VALUE INTO FIELD SPECIFIED BY MASK
DEFINE	INSVL.	(VALUE,MASK),<<<<VALUE>B<POS(<MASK>)>>&<MASK>>>
SUBTTL	DEFINITIONS -- MESSAGE MACROS


;MACRO TO GENERATE A MESSAGE
DEFINE	STOPCD	(PFX,TXT,MOR),<    .MSG. (0,PFX,0,<TXT>,MOR)>
DEFINE	FATAL	(PFX,CON,TXT,MOR),<.MSG. (1,PFX,CON,<TXT>,MOR)>
DEFINE	WARN	(PFX,CON,TXT,MOR),<.MSG. (2,PFX,CON,<TXT>,MOR)>
DEFINE	INFO	(PFX,CON,TXT,MOR),<.MSG. (3,PFX,CON,<TXT>,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 <POS><L>,<ZZ==0>
	IFIDN <POS><C>,<ZZ==1>
	IFIDN <POS><R>,<ZZ==2>
	LIST
	PUSHJ	P,[XLIST
		   PUSHJ P,T$JUST
		   EXP	 RTN
		   BYTE(2)ZZ(7)0(9)^D<COL>(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><TBL>,<...TBL==1>
	IFIDN <TBL><NAM>,<...NAM==1>
	IFIDN <TBL><PRC>,<...PRC==1>
	IFIDN <TBL><HLP>,<...HLP==1>
	IFIDN <TBL><CMD>,<...CMD==1>
> ;;END IRP TBL


;;GENERATE TABLE OF TABLE ADDRESSES
IFN ...TBL,<
PFX'.T:	EXP	<IFDEF PFX'.N,<PFX'.N>>!<IFNDEF PFX'.N,<0>>
	EXP	<IFDEF PFX'.P,<PFX'.P>>!<IFNDEF PFX'.P,<0>>
	EXP	<IFDEF PFX'.H,<PFX'.H>>!<IFNDEF PFX'.H,<0>>
	EXP	<IFDEF PFX'.C,<PFX'.C>>!<IFNDEF PFX'.C,<0>>
> ;;END IFN ...TBL
;;KEYTAB MACRO (CONTINUED)

;;GENERATE KEYWORD NAME TABLE
DEFINE	KEY	(NAM,PRC,HLP,CMD),<IFIW	[ASCIZ	/NAM/]>
IFN	...NAM,<
PFX'.N:	XWD	-PFX'.L,0
	KEYS
PFX'.L==.-PFX'.N
>


;;GENERATE PROCESSOR TABLE
DEFINE	KEY	(NAM,PRC,HLP,CMD),<IFIW	PRC>	;'NAM
IFN ...PRC,<
PFX'.P:	XWD	-PFX'.L,0
	KEYS
PFX'.L==.-PFX'.P
>


;;GENERATE HELP TABLE
DEFINE	KEY	(NAM,PRC,HLP,CMD),<IFIW	HLP>	;'NAM
IFN	...HLP,<
PFX'.H:	XWD	-PFX'.L,0
	KEYS
PFX'.L==.-PFX'.H
>


;;GENERATE NEXT COMMAND TABLE
DEFINE	KEY	(NAM,PRC,HLP,CMD),<IFIW 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,<ZZ==MAXDMP> ;DUMP
IFG MAXIOT-ZZ,<ZZ==MAXIOT> ;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,<Incorrect file allocation>)
X	(FIR,<Invalid RIBFIR>)
X	(IOE,<I/O error scanning directory tree>)
X	(MPD,<Missing parent directory>)
X	(MRE,<Missing retrieval entries>)
X	(NUB,<Missing or malformed change of unit pointer>)
X	(PTR,<Incorrect retrieval pointer(s)>)
X	(SFD,<SFDs nested too deeply>)
X	(SLF,<Incorrect RIBSLF>)
X	(XRW,<Extended RIB pointer wrong>)
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,<IFLE 44-FBENUM,<PRINTX ?File block error mask overflow>>
	LIST			;;REINSTATE LISTING
	FB.'NAM==1B<FBENUM>	;;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,<Checksum error>)
X	(DLF,<Directory lookup failure>)
X	(DNO,<Data file not opened>)
X	(EOD,<End of directory>)
X	(EOF,<End of file>)
X	(FNF,<File not found>)
X	(HRE,<HOM block read error>)
X	(IBN,<Illegal block number on structure>)
X	(IDV,<Illegal device>)
X	(IER,<Input error>)
X	(IFN,<Illegal file number>)
X	(IMD,<Illegal I/O mode>)
X	(INI,<File I/O not properly initialized>)
X	(NMF,<No more files>)
X	(NXR,<No extended RIB>)
X	(OER,<Output error>)
X	(SBZ,<SAT block zero>)
X	(SPN,<Structure parameters not initialized>)
X	(STP,<I/O stopped by user>)
X	(TRN,<Transmission error>)
X	(XLI,<Extended RIB file LOOKUP illegal>)
X	(XRI,<Extended RIB input error>)

> ;END DEFINE FERRT

DEFINE	X	(NAM,TXT),<FE'NAM'%==<ZZ==ZZ+1>>
	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 <FLG><G>,<NAM==:VAL>
IFIDN <FLG><L>,<NAM==VAL>
> ;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	<.!<BLKSIZ-1>>-.+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	<MAXSAT>/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+<<PRBHDR+44>/44> ;PROBABLE SIZE OF MAP
   PRBDAT==.+PRBHDR+PRBMAP+VARSIZ ;PROBABLE SIZE OF DEFINED DATA
   PRBLEN==<PRBDAT!<BLKSIZ-1>>+1 ;PROBABLE LENGTH OF HEADER
   MAPSIZ==<PRBLEN+44>/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	<.!<BLKSIZ-1>>-.+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),<IFIW	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	-<ZZ-.TKRTN>,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	<BYTE(3)VERWHO(9)VERMAJ(6)VERMIN(18)VEREDT>

	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,<Cannot read base address of JBTSTS in monitor>)
	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,<Cannot read job status word in monitor>,)
	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,<No privileges to perform super I/O>,)
	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>,             .DDT  ,DDTHLP,      )
KEY (<DELETE>,          .DELET,DELHLP,      )
KEY (<DIRECTORY>,       .DIREC,DIRHLP,      )
KEY (<DUMP>,            .DUMP ,DUMHLP,DUMP.T)
KEY (<EXIT>,            .EXIT ,EXIHLP,      )
KEY (<FILE>,            .FILE ,FILHLP,      )
KEY (<FINISH>,          .FINIS,FINHLP,      )
KEY (<FORMAT>,          .FORMA,FORHLP,FORM.T)
KEY (<GET>,             .GET  ,GETHLP,      )
KEY (<HELP>,            .HELP ,HLPHLP,      )
KEY (<PATCH>,           .PATCH,PATHLP,      )
KEY (<PUT>,             .PUT  ,PUTHLP,      )
KEY (<READ>,            .READ ,REDHLP,      )
KEY (<SET>,             .SET  ,SETHLP,SETX.T)
KEY (<SHOW>,            .SHOW ,SHWHLP,SHOW.T)
KEY (<START>,           .START,STAHLP,TASK.T)
KEY (<STRUCTURE>,       .STRUC,STRHLP,      )
KEY (<TRANSLATE>,       .TRANS,TRNHLP,TRAN.T)
KEY (<TYPE>,            .TYPE ,TYPHLP,      )
KEY (<WRITE>,           .WRITE,WRTHLP,      )
KEY (<ZERO>,            .ZERO ,ZERHLP,      )

>

	KEYTAB	(MAIN,<TBL,NAM,PRC,HLP,CMD>)
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,<No patch in progress>,)
	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,<No input filespec>,)

;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,<I/O set up failed for >,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,<Error deleting >,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,<LOOKUP failed for >,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,<I/O set up failed for >,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,<LOOKUP failed for >,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,<Invalid input filespec for DUMP>,)
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,<I/O set up failed for >,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,<Error reading >,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,<LOOKUP failed for >,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 (<AUTOMATIC>, DMPATO,HDMATO,      )
KEY (<BAT-BLOCK>, DMPBAT,HDMBAT,      )
KEY (<DIRECTORY>, DMPDIR,HDMDIR,      )
KEY (<DECIMAL>,   DMPDEC,HDMDEC,      )
KEY (<HOM-BLOCK>, DMPHOM,HDMHOM,      )
KEY (<MIXED-MODE>,DMPMIX,HDMMIX,      )
KEY (<OCTAL>,     DMPOCT,HDMOCT,      )
KEY (<RIB-BLOCK>, DMPRIB,HDMRIB,      )
KEY (<SIXBIT>,    DMPSIX,HDMSIX,      )
KEY (<SPECIAL>,   DMPSPC,HDMSPC,      )

>

	KEYTAB	(DUMP,<TBL,NAM,PRC,HLP,CMD>)


DEFDMP:	ASCIZ	/AUTOMATIC/	;DEFAULT FORMAT
	BLOCK	MAXHKS-<.-DEFDMP> ;PAD OUR REMAINDER
DEFINE	DUMP	(NAM,TXT,SUB),<
	PUSHJ	P,[PUSHJ P,DUMPER
		   EXP	<SIXBIT /'NAM/>
		   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
;	  <NON-SKIP>		;ALL DONE
;	<SKIP>			;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,<BAT block identifier: >,T$SIXN)
	DUMP	(BAFFIR,<Pointer to words for mapping bad regions: >,DMPAOB)
	DUMP	(BAFNBS,<Number of bad blocks found by map program: >,DMPNBS)
	DUMP	(BAFNBR,<Number of bad regions found by map program: >,DMPNBR)
	DUMP	(BAFKDC,<Controller device code used by map program: >,DMPKDC)
	DUMP	(BAFCNT,<Number of bad regions found by monitor: >,T$DECW)
	DUMP	(BAFCOD,<Unlikely code: >,T$XWD)
	DUMP	(BAFSLF,<Self pointer: >,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,<HOM block identifier: >,T$SIXN)
	DUMP	(HOMHID,<Unit Id: >,T$SIXN)
	DUMP	(HOMPHY,<HOM block disk addresses>,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,<Position in SSL: >,T$DECW)
	DUMP	(HOMSNM,<Structure name: >,T$SIXN)
	DUMP	(HOMNXT,<Unit Id of next unit in structure: >,T$SIXN)
	DUMP	(HOMPRV,<Unit Id of Previous unit in structure: >,T$SIXN)
	DUMP	(HOMLOG,<Logical unit name: >,T$SIXN)
	DUMP	(HOMLUN,<Logical unit within structure: >,T$OCTW)
	DUMP	(HOMPPN,<PPN which refreshed under timesharing: >,DMPPPN)
	DUMP	(HOMHOM,<Block numbers for HOM blocks: >,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,<Blocks to try for on output: >,T$DECW)
	DUMP	(HOMBSC,<Blocks per super cluster: >,T$DECW)
	DUMP	(HOMSCU,<Super clusters per unit: >,T$DECW)
	DUMP	(HOMCNP,<Byte pointer to cluster count: >,T$BPTR)
	DUMP	(HOMCKP,<Byte pointer to checksum: >,T$BPTR)
	DUMP	(HOMCLP,<Byte pointer to cluster address: >,T$BPTR)
	DUMP	(HOMBPC,<Blocks per cluster: >,T$DECW)
	DUMP	(HOMK4C,<K for swapping on unit: >,T$DECW)
	DUMP	(HOMREF,<Needs refreshing: >,T$YN)
	DUMP	(HOMSIC,<SAT blocks in core: >,T$DECW)
	DUMP	(HOMSID,<Unit ID of next unit in ASL: >,T$SIXN)
	DUMP	(HOMSUN,<Logical unit in ASL: >,T$DECW)
	DUMP	(HOMSLB,<First swapping block on unit: >,T$DECW)
	DUMP	(HOMCFS,<Swapping class: >,T$DECW)
	DUMP	(HOMSPU,<SAT blocks on unit: >,T$DECW)
	DUMP	(HOMOVR,<Blocks of overdraw allowed: >,T$DECW)
	DUMP	(HOMGAR,<Upper bound of blocks guaranteed: >,T$DECW)
	DUMP	(HOMSAT,<Logical block & length for SAT.SYS: >,DMPLBX)
	DUMP	(HOMHMS,<Logical block & length for HOME.SYS: >,DMPLBX)
	DUMP	(HOMSWP,<Logical block & length for SWAP.SYS: >,DMPLBX)
	DUMP	(HOMMNT,<Logical block & length for MAINT.SYS: >,DMPLBX)
	DUMP	(HOMBAD,<Logical block & length for BADBLK.SYS: >,DMPLBX)
	DUMP	(HOMSNP,<Logical block & length for SNAP.SYS: >,DMPLBX)
	DUMP	(HOMRCV,<Logical block & length for RECOV.SYS: >,DMPLBX)
	DUMP	(HOMSUF,<Logical block & length for SYS UFD: >,DMPLBX)
	DUMP	(HOMPUF,<Logical block & length for printer UFD: >,DMPLBX)
	DUMP	(HOMMFD,<Logical block & length for MFD UFD: >,DMPLBX)
	DUMP	(HOMPT1,<First retrieval pointer for MFD: >,T$XWD)
	DUMP	(HOMUN1,<Logical unit on which MFD begins: >,T$OCTW)
	DUMP	(HOMUTP,<Unit type on which HOM block was written: >,T$OCTW)
	DUMP	(HOMRIP,<RIPOFF word: >,T$XWD)
	DUMP	(HOMFEB,<KL10 FE block number: >,DMPFEB)
	DUMP	(HOMFEL,<KL10 FE file length: >,T$DECW)
	MOVE	T1,['HOMKLB']	;BASE SYMBOL
	MOVEI	T2,HOMKLB	;AND VALUE
	MOVE	T3,[-<20-<HOMFEL-HOMKLB>-1>,,HOMFEL+1] ;AOBJN POINTER
	PUSHJ	P,DMPXWD	;PRINT REMAINING KL10 FE WORDS
	DUMP	(HOMFEA,<KS10 FE block number: >,T$DECW)
	DUMP	(HOMFES,<KS10 FE file length:>,T$DECW)
	DUMP	(HOMTCS,<KS10 FE Track/Cylinder/Sector: >,DMPTCS)
	DUMP	(HOMKLE,<Word to find files for bootstrap/dump: >,T$XWD)
	SKIPE	HOMVSY(P1)	;SKIP IF OLD DISK
	DUMP	(HOMK4C,<K for CRASH.SAV: >,T$DECW)
	DUMP	(HOMSDL,<Position in SDL: >,T$DECW)
	DUMP	(HOMBTS,<Bits: >,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,<Owner PPN: >,DMPPPN)
	DUMP	(HOMMSU,<Multi-unit disk word: >,T$XWD)
	DUMP	(HOMCUS,<Customer words:>,CPOPJ)
	MOVE	T1,['HOMCUS']	;SYMBOL
	MOVEI	T2,HOMCUS	;BASE ADDRESS
	MOVE	T3,[-<HOMCUL-HOMCUS>,,HOMCUS] ;AOBJN POINTER
	PUSHJ	P,DMPXWD	;PRINT BLOCK
	DUMP	(HOMVID,<PDP-11 Volume Id: >,DMPP11)
	SKIPN	HOMVSY(P1)	;SKIP IF NEW DISK
	DUMP	(HOMOKC,<K for CRASH.SAV: >,T$DECW)
	DUMP	(HOMOWN,<PDP-11 Owner: >,DMPP11)
	DUMP	(HOMVSY,<PDP-11 System Id: >,DMPP11)
	DUMP	(HOMCOD,<Unlikely code: >,T$XWD)
	DUMP	(HOMSLF,<Self pointer: >,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,<Pointer to first retrieval pointer: >,DMPAOB)
	DUMP	(RIBPPN,<PPN: >,T$PPN)
	DUMP	(RIBNAM,<File name: >,DMPNAM)
	DUMP	(RIBEXT,<Extension: >,DMPEXT)
	DUMP	(RIBATT,<File attributes: >,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,<Written length: >,T$DECW)
	DUMP	(RIBVER,<Version: >,T$VERW)
	DUMP	(RIBSPL,<Spooled file name: >,T$SIXN)
	DUMP	(RIBEST,<Estimated length: >,T$DECW)
	DUMP	(RIBALC,<Allocated length: >,T$DECW)
	DUMP	(RIBPOS,<Position of last allocated group: >,T$DECW)
	DUMP	(RIBUNI,<Written on CPU/controller/unit: >,DMPUNI)
	DUMP	(RIBNCA,<Unprivileged customer word: >,T$XWD)
	DUMP	(RIBMTA,<Magtape label: >,T$SIXN)
	DUMP	(RIBDEV,<Structure file starts on: >,T$SIXN)
	DUMP	(RIBSTS,<Status: >,T$XWD)
	DUMP	(RIBELB,<Logical block with error: >,DMPELX)
	DUMP	(RIBEUN,<Logical unit on which error occured: >,DMPELX)
	DUMP	(RIBNBB,<Number of consecutice blocks in bad region: >,DMPELX)

	HLRZ	T1,RIBEXT(P1)	;GET EXTENSION
	CAIE	T1,'UFD'	;USER FILE DIRECTORY?
	JRST	DMPRI1		;NO
	DUMP	(RIBQTF,<Logged-in quota: >,T$DECW)
	DUMP	(RIBQTO,<Logged-out quota: >,T$DECW)
	DUMP	(RIBQTR,<Reserved quota: >,T$DECW)
	DUMP	(RIBUSD,<Blocks used: >,T$DECW)
	JRST	DMPRI2		;CONTINUE

DMPRI1:	DUMP	(RIBTYP,<File type and flags: >,T$XWD)
	DUMP	(RIBBSZ,<Byte size word: >,T$XWD)
	DUMP	(RIBRSZ,<Record and block size: >,T$XWD)
	DUMP	(RIBAPW,<Application word: >,T$XWD)

DMPRI2:	DUMP	(RIBAUT,<Author PPN: >,T$PPN)
	DUMP	(RIBNXT,<Name of next structure: >,T$SIXN)
	DUMP	(RIBPRD,<Name of predessor structure: >,T$SIXN)
	DUMP	(RIBPCA,<Privileged customer word: >,T$XWD)
	DUMP	(RIBUFD,<UFD data block number: >,T$DECW)
	DUMP	(RIBFLR,<Rel. block in file of first block in RIB: >,T$DECW)
	DUMP	(RIBXRA,<Extended RIB address: >,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,<Creation date & time: >,T$DTTM)
	HLRZ	T1,RIBEXT(P1)	;GET EXTENSION
	CAIE	T1,'UFD'	;USER FILE DIRECTORY?
	JRST	DMPRI4		;NO
	DUMP	(RIBLAD,<Last accounting date & time: >,T$DTTM)
	DUMP	(RIBDED,<Directory expiration date: >,DMPDED)
	JRST	DMPRI5		;ONWARD

DMPRI4:	DUMP	(RIBACT,<AOBJN pointer to account string: >,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,<Unlikely code: >,T$XWD)
	DUMP	(RIBSLF,<Self pointer: >,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,<Wildcarded data file spec illegal; >,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,<Patching terminated for >,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,<Illegal character; >,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 <keyword>

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 (<DUMP-DESCRIPTORS>,  FMTDMP,FMTDMH,      )
KEY (<IO-DESCRIPTORS>,    FMTIOT,FMTIOH,      )

>

	KEYTAB	(FORM,<TBL,NAM,PRC,HLP,CMD>)
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+<MAXDMP*.FMLEN>-1(D) ;COPY
	JRST	CPOPJ1