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