$CONTROL NOWARN,USLINIT,MAP,CODE,MAIN=SDFMAINLINE                       00010000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1976. ",            & 00015000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00020000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00025000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00030000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00035000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00040000
$TITLE "GLOBAL DATA DEFINITIONS."                                       00045000
BEGIN                                                                   00050000
                                                                        00055000
                                                                        00060000
<<-----------------------------------------------------------------     00065000
          SOFTWARE DUMP FACILITY MAINLINE                               00070000
----------------------------------------------------------------->>     00075000
                                                                        00080000
                                                                        00085000
<<* * * MISCELLANEOUS DEFINITIONS * * *>>                               00090000
                                                                        00095000
INTEGER ARRAY DELTAQ(*)=Q-0;                                            00100000
LOGICAL STAT=Q-1;                                                       00105000
LOGICAL RETURNP=Q-2;  <<RETURN POINTER IN STACK MARKER>>                00110000
LOGICAL PMAP=Q-4;     <<OPTION VARIABLE PARAMETER MAP>>                 00115000
INTEGER XREG=X;                                                         00120000
INTEGER S0=S-0,S1=S-1,S2=S-2,S3=S-3,S4=S-4,S5=S-5;                      00125000
POINTER SP0=S-0;                                                        00130000
INTEGER QM0=Q-0,QM5=Q-5,QM7=Q-7;                                        00135000
LOGICAL LS0=S-0, LS1=S-1;                                      <<03017>>00140000
BYTE BS0=S-0,BS1=S-1;                                                   00145000
BYTE POINTER BPS0=S-0,BPS1=S-1;                                         00150000
DOUBLE DS3=S-3,DS6=S-6;                                                 00155000
INTEGER RUNPARM=Q-4;                                                    00160000
INTEGER VERSION:=%01;                                          <<D8951>>00165000
LOGICAL SAVEAREASECTORSIZE;  <<MAY BE 128 FOR DISCS OR>>       <<03605>>00170000
                             <<512 FOR LINUS CARTRIDGE TAPE>>  <<03605>>00175000
                                                                        00180000
EQUATE                                                                  00185000
      RECSIZE         = 72,                                             00190000
   SECTORSIZE        = 128,                                             00195000
   QUADRUPLESECTORSIZE = 512,   <<LINUS SECTOR IS 512 WORDS>>  <<03605>>00200000
   DEVICECLOSE       = 4,                                               00205000
   REWIND            = 5,                                      <<B8100>>00210000
   WRITEOF           = 6,                                               00215000
   FORWARDSPACEFILE  = 7,                                               00220000
   SETDENSITY1600    = 16,  << DENSITY FOR DUMP TO 7976 >>     <<02669>>00225000
   CLEAR7976         = 17,  << 7976 DVR CLEAR FUNCTION  >>     <<02669>>00230000
   IMMEDREPORT       = 18,  << 7974 ENABLE IMMEDIATE REPORT >> <<K7526>>00235000
   CARRIAGERETURN    = %15,                                             00240000
   MAXBANK           = 15,                                              00245000
   MAXUNIT           = 15,                                              00250000
   MAXDRT          = %777,                                     <<03749>>00255000
   MINDRT            = 4,                                               00260000
   FOREVER           = TRUE,                                            00265000
   CCG               = 0,                                               00270000
   CCL               = 1,                                               00275000
   CCE               = 2;                                               00280000
DEFINE                                                                  00285000
   CARRYBIT          = STAT.(5:1)#,                                     00290000
   ASMB     =ASSEMBLE#,                                        <<03605>>00295000
   CONDITIONCODE     = STAT.(6:2)#;                                     00300000
INTEGER POINTER                                                         00305000
   CONTEXTBASE      = 3;                                                00310000
                                                                        00315000
                                                                        00320000
<<* * *  MESSAGE NUMBERS * * *>>                                        00325000
                                                                        00330000
EQUATE                                                                  00335000
   MOUNTNEWPACK     = 55,                                               00340000
   FATALERROR       = 56,                                               00345000
   SOFTWARERROR     = 57,                                               00350000
   BADPACKFORMAT    = 58,                                               00355000
   SYSTEMDISCERR    = 59,                                               00360000
   CHECKSUMERR      = 60,                                               00365000
   HARDWARERRORMSG  = 61,                                               00370000
   POWERFAILMSG     = 62,                                               00375000
   SYSDISCDRT       = 63,                                               00380000
   SERIALDISCERR    = 64,                                               00385000
   INVALIDNUM       = 65,                                               00390000
   INVALIDEV        = 66,                                               00395000
   INVALIDISC       = 67,                                               00400000
   ENTERSUBTYPE     = 68;                                               00405000
                                                                        00410000
                                                                        00415000
<<* * * PERFORMIO LOGICAL DEVICES * * *>>                               00420000
                                                                        00425000
EQUATE                                                                  00430000
   SYSTEMDISC       = 1,                                                00435000
   SERIALDEVICE     = 2,                                                00440000
   COMMANDISC       = 3,                                                00445000
   DUMPDISC         = 4;                                                00450000
                                                                        00455000
                                                                        00460000
<<* * * DRIVER FUNCTION CODES * * *>>                                   00465000
                                                                        00470000
EQUATE                                                                  00475000
   INPUT            = 0,                                                00480000
   OUTPUT           = 1,                                                00485000
   INSERTDISC       = 2;                                                00490000
                                                                        00495000
                                                                        00500000
<<* * * PERFORMIO RETURN STATUS * * *>>                                 00505000
                                                                        00510000
EQUATE                                                                  00515000
   SUCCESSFULIO     = 1,                                                00520000
   BADIO            = 4;                                                00525000
                                                                        00530000
                                                                        00535000
                                                                        00540000
<<* * * DEVICE TYPES AND SUBTYPES * * *>>                               00545000
                                                                        00550000
EQUATE                                                                  00555000
   T13037           = 0,    <<DISCS USING 13037 CONTROLLER>>            00560000
   TFLEXIBLE        = 2,                                                00565000
   TCONSOLE         = 16,                                               00570000
   T'CS'80      =  3,    <<TYPE FOR COMMAND SET 80 DEVICES>>   <<03605>>00575000
   STYPE'A9140  =  0,    <<SUBTYPE FOR LINUS CARTRIDGE TAPE>>  <<03605>>00580000
   TMAGTAPE         = 24,                                      <<02669>>00585000
   STYPE7976        =  1,                                      <<K7526>>00590000
   STYPE7978        =  2,                                      <<K7526>>00595000
   STYPE7974        =  3;                                      <<K7526>>00600000
                                                                        00605000
EQUATE                                                                  00610000
   R7905            = 4,                                                00615000
   F7905            = 5,                                                00620000
   A7905            = 6,                                                00625000
   FHDISCREPLACEMENT= 7,                                                00630000
   A7920            = 8,                                                00635000
   A7925            = 9,                                                00640000
   R7906            = 10,                                               00645000
   F7906            = 11,                                               00650000
   A7906            = 12;                                               00655000
                                                                        00660000
                                                                        00665000
<<* * * DESC FIELDS * * *>>                                             00670000
                                                                        00675000
   DEFINE                                                               00680000
      DESCDRT             = DESC0.(0:9)     #,                 <<03017>>00685000
      DESCSUBTYPE         = DESC0.(9:4)     #,                 <<03017>>00690000
      DESCUNIT            = DESC0.(13:3)    #,                 <<03017>>00695000
      DESCTYPE            = DESC1           #;                          00700000
                                                                        00705000
                                                                        00710000
<<* * * MODES * * *>>                                                   00715000
                                                                        00720000
<<SDF EXECUTION MODES>>                                                 00725000
EQUATE                                                                  00730000
   SYNTAXCHECKING    = 0,                                               00735000
   COMMAND           = 1,                                               00740000
   INTERACTIVE       = 2;                                               00745000
                                                                        00750000
<<DUMP MODE>>                                                           00755000
EQUATE                                                                  00760000
                                                                        00765000
   <<VARIABLES USED BY DUMPSYSDISC>>                                    00770000
   SERIALDEVICEDUMP  = 0,                                               00775000
   DISCFILEDUMP      = 1;                                               00780000
                                                                        00785000
INTEGER                                                                 00790000
   MODE,DUMPMODE;                                                       00795000
INTEGER                                                                 00800000
   RECORDCOUNT:=0;                                                      00805000
LOGICAL                                                                 00810000
   NOSYSTEMDISC;                                                        00815000
                                                                        00820000
<<* * * COMMAND PROCESSING PARAMETERS * * *>>                           00825000
EQUATE                                                                  00830000
   <<VALUES RETURNED BY GETNEXTPARM>>                                   00835000
   KEYWORDPARM        = 0,                                              00840000
   DICTIONARYPARM     = 1,                                              00845000
   ALPHANUMERICPARM   = 2,                                              00850000
   NUMERICPARM        = 3,                                              00855000
   NULLPARM           = 4,                                              00860000
   INVALIDPARM        = 5,                                              00865000
                                                                        00870000
   MAXCOMMANDNUM      = 10,                                             00875000
   MAXPARMS           = 40,                                             00880000
   MAXPARMLENGTH      = 8,                                              00885000
   COMMA              = 0,                                              00890000
   DASH               = 1,                                              00895000
   EQUAL              = 2,                                              00900000
   SEMICOLON          = 3,                                              00905000
   CR                 = 4;                                              00910000
                                                                        00915000
                                                                        00920000
BYTE ARRAY                                                              00925000
   DELIM(0:4):=",-=;",%15;                                              00930000
                                                                        00935000
INTEGER                                                                 00940000
   COMMANDTYPE;                                                         00945000
                                                                        00950000
                                                                        00955000
<<* * * VARIABLES IMPLICITLY ACCESSED BY LOW LEVEL PROCEDURES * * *>>   00960000
  << SDFMAP  - STORAGE MAP RELATED >>                          <<03017>>00965000
  <<===============================>>                          <<03017>>00970000
                                                               <<03017>>00975000
EQUATE                                                         <<03017>>00980000
     MEMORY        = 1,                                        <<03017>>00985000
     SDF'FILE      = 2,                                        <<03017>>00990000
     MAPENTRYSIZE  = 8;    <<RECORD LENGTH IN WORDS>>          <<03017>>00995000
                                                               <<03017>>01000000
EQUATE      <<FIELDS IN MAP RECORDS>>                          <<03017>>01005000
     SRCMEDIA      = 0,    <<SOURCE WAS FROM MEM,DISC, ETC>>   <<03017>>01010000
     STGMEDIA      = 1,    <<STORAGE IS ON DISC,MEM,ETC.>>     <<03017>>01015000
   DSRC'START      = 1,    <<SOURCE START ADDRESS>>            <<03017>>01020000
     SRC'START'HI  = 2,                                        <<03017>>01025000
     SRC'START'LO  = 3,                                        <<03017>>01030000
   DSRC'END        = 2,    <<SOURCE END ADDRESS>>              <<03017>>01035000
     SRC'END'HI    = 4,                                        <<03017>>01040000
     SRC'END'LO    = 5,                                        <<03017>>01045000
   DSTG            = 3,    <<STORAGE ADDRESS>>                 <<03017>>01050000
     STG'HI        = 6,                                        <<03017>>01055000
     STG'LO        = 7;                                        <<03017>>01060000
                                                               <<03017>>01065000
LOGICAL                                                        <<03017>>01070000
     SDF'MAP'BUFFER'LOADED := FALSE;                           <<03017>>01075000
                           <<SET TO TRUE WHEN A COPY OF THE>>  <<03017>>01080000
                           <<STORAGE MAP HAS BEEN READ>>       <<03017>>01085000
                                                               <<03017>>01090000
ARRAY SDFMAPBUFFER (0:127);                                    <<03017>>01095000
     <<GLOBAL BUFFER FOR SDF "STORAGE" MAP >>                  <<03017>>01100000
                                                               <<03017>>01105000
DEFINE SDFMAP'MAXBANK = SDFMAPBUFFER(36)#;                     <<03017>>01110000
   <<BANK NUMBER OF UPPER MEMORY BOUND >>                      <<03017>>01115000
                                                               <<03017>>01120000
DOUBLE ARRAY                                                            01125000
   DPARMS(0:MAXPARMS);                                                  01130000
ARRAY                                                                   01135000
   PARMS(*)=DPARMS;                                                     01140000
BYTE ARRAY                                                              01145000
   COMMANDBUF(0:80),BUF(0:80);                                          01150000
INTEGER                                                                 01155000
   NUMPARMS,CURRENTPARM;                                                01160000
POINTER                                                                 01165000
   CONFIG;                                                              01170000
DOUBLE POINTER                                                          01175000
   CONFIGD=CONFIG;                                                      01180000
BYTE POINTER                                                            01185000
   COMMANDEFN,BUFB:=@BUF;                                               01190000
BYTE ARRAY                                                              01195000
   COMMANDICT(0:1034):=                                                 01200000
   23, 4, "DUMP", <<LENGTH 174>>                                        01205000
       ">DUMP [BANK NUM]",                                              01210000
     <<" [;DSEG=SEG...[,SEG]]  [;DISC=ITEM...[,ITEM]]",>>"#",           01215000
     <<" WHERE:#",>>                                                    01220000
     <<"  SEG  = ALL#",>>                                               01225000
     <<"         STACKS#",>>                                            01230000
     <<"         SYSTEM#",>>                                            01235000
     <<"         SEG NUMBER#",>>                                        01240000
     <<"         SEG NUMBER - SEG NUMBER#",>>                           01245000
   50, 8, "DUMPFILE",  <<CONTINUATION OF DEFINITION FOR DUMP COMMAND>>  01250000
     <<"  ITEM = SYS DISC SECTOR#",>>                                   01255000
     <<"         SYS DISC SECTOR - SYS DISC SECTOR#",>>                 01260000
       " DUMPS MAIN MEMORY",                                            01265000
     <<", VIRTUAL MEMORY, AND/OR SYSTEM DISC AREAS#",>>                 01270000
       " TO THE DUMP DEVICE.##",                                        01275000
   58, 7, "COMMENT",                                                    01280000
       ">COMMENT <STRING>#",                                            01285000
       " COMMENT COMMANDS ARE IGNORED##",                               01290000
   57, 7, "CONSOLE",                                                    01295000
       ">CONSOLE DRT#",                                                 01300000
       " CHANGES THE CONSOLE'S DRT NUMBER##",                           01305000
   51, 5, "DEBUG",                                                      01310000
       ">DEBUG#",                                                       01315000
       " ENTERS THE HELP DEBUGGING FACILITY##",                         01320000
   83, 7, "DUMPDEV",                                                    01325000
       ">DUMPDEV [DRT  [,UNIT]]#",                                      01330000
     <<"         [DISC]#", >>                                           01335000
       " CHANGES THE DUMP DEVICE'S DRT AND UNIT NUMBERS.",              01340000
     <<" IS SPECIFIED, THE DUMP FILE NAMED IN THE DUMPFILE COMMAND#",>> 01345000
     <<" WILL BE USED",>>                                               01350000
       "##",                                                            01355000
   47, 4, "HALT",                                                       01360000
       ">HALT#",                                                        01365000
       " CAUSES SDF TO HALT ITS EXECUTION##",                           01370000
  173, 4, "HELP",                                                       01375000
       ">HELP [COMMAND NAME] [,COMMAND NAME] ... [,COMMAND NAME]#",     01380000
       " PRINTS A BRIEF EXPLANATION OF THE SPECIFIED COMMANDS.  IF#",   01385000
       " NO COMMAND NAME IS INPUT, THEN LIST ALL COMMANDS##",           01390000
   72, 11, "INTERACTIVE",                                               01395000
       ">INTERACTIVE#",                                                 01400000
       " OBTAINS REMAINING COMMANDS FROM THE CONSOLE##",                01405000
   44, 9, "WARMSTART",                                                  01410000
       ">WARMSTART#",                                                   01415000
       " INITIATES WARMSTART##",                                        01420000
   0;                                                                   01425000
                                                                        01430000
                                                                        01435000
<<* * * SYNTAX CHECKING PARAMETERS * * *>>                              01440000
                                                                        01445000
<<FCLOSE>>                                                              01450000
EQUATE                                                                  01455000
   NOCHANGE           = 0,                                              01460000
   SAVE               = 1,                                              01465000
   PURGE              = 4,                                              01470000
   NOSECURITY         = 0;                                              01475000
<<FOPTIONS>>                                                            01480000
EQUATE                                                                  01485000
   F1                 = 6,                                              01490000
   FILE               = 0,                                              01495000
   NOFILE             = 1,                                              01500000
   F2                 = 2,                                              01505000
   NOCCTL             = 0,                                              01510000
   CCTL               = 1,                                              01515000
   F3                 = 2,                                              01520000
   FIXED              = 0,                                              01525000
   VARYABLE           = 1,                                              01530000
   UNDEFINED          = 2,                                              01535000
   F4                 = 3,                                              01540000
   FILENAME           = 0,                                              01545000
   STDLIST            = 1,                                              01550000
   NEWPASS            = 2,                                              01555000
   OLDPASS            = 3,                                              01560000
   STDIN              = 4,                                              01565000
   STDINX             = 5,                                              01570000
   NULL               = 6,                                              01575000
   F5                 = 1,                                              01580000
   BYENARY            = 0,                                              01585000
   ARSCII             = 1,                                              01590000
   F6                 = 2,                                              01595000
   NEWFILE            = 0,                                              01600000
   OLDSYSTEMFILE      = 1,                                              01605000
   TEMPORARYFILE      = 2,                                              01610000
   OLDUSERFILE        = 3;                                              01615000
                                                                        01620000
<<AOPTIONS>>                                                            01625000
EQUATE                                                                  01630000
   A1                 = 8,                                              01635000
   BUFFERING          = 0,                                              01640000
   NOBUFFERING        = 1,                                              01645000
   A2                 = 2,                                              01650000
   DEFAULTACCESS      = 0,                                              01655000
   EXCLUSIVE          = 1,                                              01660000
   SEMIEXCLUSIVE      = 2,                                              01665000
   SHARE              = 3,                                              01670000
   A3                 = 6,                                              01675000
   READONLY           = 0,                                              01680000
   WRITEONLY          = 1,                                              01685000
   WRITESAVEONLY      = 2,                                              01690000
   APPENDONLY         = 3,                                              01695000
   UPDATE             = 4,                                              01700000
   EXECUTE            = 5;                                              01705000
                                                                        01710000
DEFINE                                                                  01715000
   DEVTYPE            = 8:8#,                                           01720000
   RECTYPE            = 8:2#;                                           01725000
                                                                        01730000
INTEGER ARRAY                                                           01735000
   FILENUMBER(0:3)=DB:=4(0);                                            01740000
INTEGER                                                                 01745000
   LISTFN=FILENUMBER,INPUTFN=FILENUMBER+1,COMMANDFN=FILENUMBER+2,       01750000
   OLDCOMMANDFN=FILENUMBER+3;                                           01755000
EQUATE                                                                  01760000
   LISTFX             = 0,                                              01765000
   INPUTFX            = 1,                                              01770000
   COMMANDFX          = 2,                                              01775000
   OLDCOMMANDFX       = 3,                                              01780000
   ENDOFINPUT         = 4;                                              01785000
LOGICAL                                                                 01790000
   SYNTAXERROR:=FALSE;                                                  01795000
                                                                        01800000
                                                                        01805000
<<* * * DUMP COMMAND DATA * * *>>                                       01810000
                                                                        01815000
BYTE ARRAY                                                              01820000
   DUMPDICT(0:12):=                                                     01825000
   6,4,"DSEG",                                                          01830000
   6,4,"DISC",                                                          01835000
   0;                                                                   01840000
BYTE ARRAY                                                              01845000
   VIRTDICT(0:21):=                                                     01850000
   5,3,"ALL",                                                           01855000
   8,6,"STACKS",                                                        01860000
   8,6,"SYSTEM",                                                        01865000
   0;                                                                   01870000
EQUATE                                                                  01875000
   VIRTUALMEMORY     = 1;                                               01880000
                                                                        01885000
                                                                        01890000
<<* * * DUMP DEVICE COMMAND DATA * * *>>                                01895000
                                                                        01900000
BYTE ARRAY                                                              01905000
   DUMPDEVDICT(0:6):=                                                   01910000
   6,4,"DISC",                                                          01915000
   0;                                                                   01920000
                                                                        01925000
                                                                        01930000
<<* * * DUMP FILE LABEL PARAMETERS * * *>>                              01935000
                                                                        01940000
EQUATE                                                                  01945000
   FLABLEN          = 77;                                               01950000
DEFINE                                                                  01955000
   FLMAXNUMRECORDS  = FLABD(15)        #,                               01960000
   FLBLOCKSIZE      = FLAB(38)         #,                               01965000
   FLSECTOROFFSET   = FLAB(39).(0:8)   #,                               01970000
   FLNUMEXTENTS     = FLAB(39).(11:5)  #,                               01975000
   FLEXTENTSIZE     = FLAB(41)         #,                               01980000
   FLNUMRECORDS     = FLAB(43)         #,                               01985000
   FLEXTENTBASE     = FLABD(22)        #;                               01990000
ARRAY                                                                   01995000
   OLDFLAB(0:76):=FLABLEN(0);                                           02000000
                                                                        02005000
                                                                        02010000
<<* * * COMMAND ABORT VARIABLES * * *>>                                 02015000
INTEGER                                                                 02020000
   ABORTSREGISTER,ABORTDELTAQ,ABORTPREGISTER,ABORTSTATUS,OLDABORTPLABEL;02025000
                                                                        02030000
                                                                        02035000
<<* * * * PRINT STRINGS * * *>>                                         02040000
                                                                        02045000
BYTE ARRAY                                                              02050000
   SPACE(0:1):=" #";                                                    02055000
BYTE ARRAY                                                              02060000
   PROMPT(0:1):=">#";                                                   02065000
BYTE ARRAY                                                              02070000
   BADCOMMANDFILE(0:35):="COMMAND FILE HAS INVALID ATTRIBUTES#";        02075000
BYTE ARRAY                                                              02080000
   BADEVICE(0:24):="INVALID DEVICE SPECIFIED#";                         02085000
BYTE ARRAY                                                              02090000
   BADSYSTEMDISC(0:41):="ONLY DUMPED MEMORY DUE TO BAD SYSTEM DISC#";   02095000
BYTE ARRAY                                                              02100000
   COMMANDFILEOF(0:27):="END-OF-FILE ON COMMAND FILE#";                 02105000
BYTE ARRAY                                                              02110000
   COMMANDFILERR(0:18):="COMMAND FILE ERROR#";                          02115000
BYTE ARRAY                                                              02120000
   DUMPDEVICEFAIL(0:25):="DUMP FILE DEVICE FAILURE#";                   02125000
BYTE ARRAY                                                              02130000
   ERRORMESSAGE(0:18):="* * * ERROR * * * #";                           02135000
BYTE ARRAY                                                              02140000
   EXPECTEDKEYWORD(0:26):="EXPECTED KEYWORD PARAMETER#";                02145000
BYTE ARRAY                                                              02150000
   EXHAUSTEDUMPFILE(0:19):="EXHAUSTED DUMP FILE#";                      02155000
BYTE ARRAY                                                              02160000
   EXPECTEDNUMBER(0:28):="EXPECTED NUMERICAL PARAMETER#";               02165000
BYTE ARRAY                                                              02170000
   EXPECTEDPARM(0:28):="EXPECTED POSITIONAL PARAMETER#";                02175000
BYTE ARRAY                                                              02180000
   EXTRAPARM(0:20):="EXTRANEOUS PARAMETER#";                            02185000
BYTE ARRAY                                                              02190000
   INVALIDRANGE(0:45):="END OF RANGE SMALLER THAN BEGINNING OF RANGE #";02195000
BYTE ARRAY                                                              02200000
   INVALIDVALUE(0:23):="INVALID PARAMETER VALUE#";                      02205000
BYTE ARRAY                                                              02210000
   NODUMPDEVICE(0:15):="NO DUMP DEVICE #";                              02215000
BYTE ARRAY                                                              02220000
   NODUMPFILEXTANT(0:20):="NO DUMP FILE EXISTS #";                      02225000
BYTE ARRAY EOTSERIALDEVICE(0:45):=                                      02230000
   "END-OF-TAPE ON DUMP DEVICE, MOUNT NEXT VOLUME#";                    02235000
BYTE ARRAY                                                              02240000
   SERIALDEVICEFAIL(0:21):="SERIAL DEVICE FAILURE#";                    02245000
BYTE ARRAY                                                              02250000
   SUCCESSFUL(0:10):="SUCCESSFUL#";                                     02255000
BYTE ARRAY                                                              02260000
   SYSTEMDISCFAIL(0:19):="SYSTEM DISC FAILURE#";                        02265000
BYTE ARRAY                                                              02270000
   UGLYDUMPFILELABEL(0:28):="INVALID DUMP FILE FILE-LABEL#";            02275000
BYTE ARRAY                                                              02280000
   UNKNOWNCOMMAND(0:15):="UNKNOWN COMMAND#";                            02285000
BYTE ARRAY                                                     <<03110>>02290000
  TRYAGAIN1(0:41):="SERIAL DEVICE I/O ERROR - You are now in#";<<03110>>02295000
BYTE ARRAY                                                     <<03110>>02300000
  TRYAGAIN2(0:41):="SOFTDUMP INTERACTIVE MODE.  Please mount#";<<03110>>02305000
BYTE ARRAY                                                     <<03110>>02310000
  TRYAGAIN3(0:40):="new media, then type 'DUMP' in response#"; <<03110>>02315000
BYTE ARRAY                                                     <<03110>>02320000
  TRYAGAIN4(0:19):="to the prompt '>'.#";                      <<03110>>02325000
                                                                        02330000
                                                                        02335000
<<* * * ICF/25 INSTRUCTION DEFINITIONS * * *>>                          02340000
                                                                        02345000
DEFINE                                                                  02350000
   SIOP             = CON %20302; CON 0    #,                           02355000
   HIOP             = CON %20302; CON 1    #,                           02360000
   RIOC             = CON %20302; CON 2    #,                           02365000
   WIOC             = CON %20302; CON 3    #,                           02370000
   ROCL             = CON %20302; CON 4    #,                           02375000
   IOCL             = CON %20302; CON 5    #,                           02380000
   INIT             = CON %20302; CON 6    #,                           02385000
   MCS              = CON %20302; CON 7    #,                           02390000
   SEML             = CON %20302; CON 8    #,                           02395000
   STRT             = CON %20302; CON 9    #,                           02400000
   DUMPER           = CON %20302; CON 10   #,                           02405000
   RIOA             = CON %20302; CON 11   #,                  <<03017>>02410000
   WIOA             = CON %20302; CON 12   #,                  <<03017>>02415000
   RCCR             = CON %20104; CON 0    #,                           02420000
   SCLR             = CON %20104; CON 1    #,                           02425000
   TOFF             = CON %20104; CON 2    #,                           02430000
   TON              = CON %20104; CON 3    #,                           02435000
   HBPE             = CON %20104; CON 4    #,                           02440000
   HBPD             = CON %20104; CON 5    #,                           02445000
   SINC             = CON %20104; CON 8    #;                           02450000
$PAGE "CONFIGURE DATA SEGMENT"                                          02455000
<<* * * CONFIGURATION TABLE * * *>>                                     02460000
                                                                        02465000
EQUATE                                                                  02470000
   CTCONFIGLEN      = 68,                                               02475000
   CTBLOCKLEN       = 1024,                                             02480000
   CTBLOCKLOC       = 3;                                                02485000
                                                                        02490000
DEFINE                                                                  02495000
   CTCHECKSUM       = CONFIG           #,                               02500000
   CTNUMBERBANKS    = CONFIG(1)        #,                               02505000
                                                                        02510000
   CTDUMPDEVDESC    = CONFIGD(1)       #,                               02515000
   CTDUMPDEVDRT     = CONFIG(2).(0:9)  #,                      <<03017>>02520000
   CTDUMPDEVSUBTYPE = CONFIG(2).(9:4)  #,                      <<03017>>02525000
   CTDUMPDEVUNIT    = CONFIG(2).(13:3) #,                      <<03017>>02530000
   CTDUMPDEVTYPE    = CONFIG(3)        #,                               02535000
                                                                        02540000
   CTLINEPTRDESC    = CONFIGD(2)       #,                               02545000
   CTLINEPTRDRT     = CONFIG(4).(0:9)  #,                      <<03017>>02550000
   CTLINEPTRSUBTYPE = CONFIG(4).(9:4)  #,                      <<03017>>02555000
   CTLINEPTRUNIT    = CONFIG(4).(13:3) #,                      <<03017>>02560000
   CTLINEPTRDEVTYPE = CONFIG(5)        #,                               02565000
                                                                        02570000
   CTCONSOLEDESC    = CONFIGD(3)       #,                               02575000
   CTCONSOLEDRT     = CONFIG(6).(0:9)  #,                      <<03017>>02580000
   CTCONSOLESUBTYPE = CONFIG(6).(9:4)  #,                      <<03017>>02585000
   CTCONSOLEUNIT    = CONFIG(6).(13:3) #,                      <<03017>>02590000
   CTCONSOLEDEVTYPE = CONFIG(7)        #,                               02595000
                                                                        02600000
   CTCOMMANDESC     = CONFIGD(4)       #,                               02605000
   CTCOMMANDRT      = CONFIG(8).(0:9)  #,                      <<03017>>02610000
   CTCOMMANDSUBTYPE = CONFIG(8).(9:4)  #,                      <<03017>>02615000
   CTCOMMANDUNIT    = CONFIG(8).(13:3) #,                      <<03017>>02620000
   CTCOMMANDEVTYPE  = CONFIG(9)        #,                               02625000
                                                                        02630000
   CTSYSDISCDESC    = CONFIGD(5)       #,                               02635000
   CTSYSDISCDRT     = CONFIG(10).(0:9) #,                      <<03017>>02640000
   CTSYSDISCSUBTYPE = CONFIG(10).(9:4) #,                      <<03017>>02645000
   CTSYSDISCUNIT    = CONFIG(10).(13:3)#,                      <<03017>>02650000
   CTSYSDISCDEVTYPE = CONFIG(11)       #,                               02655000
                                                                        02660000
   CTDUMPFILEDESC   = CONFIGD(6)       #,                               02665000
   CTDUMPFILEDRT    = CONFIG(12).(0:9) #,                      <<03017>>02670000
   CTDUMPFILESUBTYPE= CONFIG(12).(9:4) #,                      <<03017>>02675000
   CTDUMPFILEUNIT   = CONFIG(12).(13:3)#,                      <<03017>>02680000
   CTDUMPFILEDEVTYPE= CONFIG(13)       #,                               02685000
   CTDUMPFILELEN    = CONFIG(14)       #,                               02690000
                                                                        02695000
   CTMODE           = CONFIG(15)       #,                               02700000
   CTCOMMANDFILE    = CONFIGD(8)       #,                               02705000
   CTDUMPFILE       = CONFIGD(9)       #,                               02710000
   CTOVERLAYSECNUM  = CONFIGD(10)      #,                               02715000
   CTBADSYSDISC     = CONFIG(22).(0:1) #,                               02720000
   CTBACKUPDUMP     = CONFIG(22).(1:1) #,                               02725000
   CTCOMMANDLENGTH  = CONFIG(23)       #;                               02730000
                                                                        02735000
                                                                        02740000
<<* * * CONTEXT AREA * * *>>                                            02745000
                                                                        02750000
DEFINE                                                                  02755000
   CNMACHINEID      = CONTEXTBASE(0).(8:8) #,                  <<03017>>02760000
   CNDUMPDESC       = CONTEXTBASE(1)       #,                           02765000
   CNDUMPDEVDRT     = CONTEXTBASE(1).(7:9) #,                  <<03017>>02770000
   CNXREGISTER      = CONTEXTBASE(2)       #,                           02775000
   CNDLREGISTER     = CONTEXTBASE(3)       #,                           02780000
   CNDBANKREGISTER  = CONTEXTBASE(4)       #,                           02785000
   CNDBREGISTER     = CONTEXTBASE(5)       #,                           02790000
   CNQREGISTER      = CONTEXTBASE(6)       #,                           02795000
   CNSREGISTER      = CONTEXTBASE(7)       #,                           02800000
   CNSBANKREGISTER  = CONTEXTBASE(8)       #,                           02805000
   CNZREGISTER      = CONTEXTBASE(9)       #,                           02810000
   CNSTATUSREGISTER = CONTEXTBASE(10)      #,                           02815000
   CNPBANKREGISTER  = CONTEXTBASE(11)      #,                           02820000
   CNPBREGISTER     = CONTEXTBASE(12)      #,                           02825000
   CNPREGISTER      = CONTEXTBASE(13)      #,                           02830000
   CNPLREGISTER     = CONTEXTBASE(14)      #,                           02835000
   CNCIREGISTER     = CONTEXTBASE(15)      #,                           02840000
   CNNUMBANKS       = CONTEXTBASE(16)      #,                           02845000
   CNSYSTEMFAILNUM  = CONTEXTBASE(17)      #,                           02850000
   CNINTERRUPTSTATUS= CONTEXTBASE(18)      #,                           02855000
   CNBANKSDUMPED    = CONTEXTBASE(19)      #,                           02860000
   CNINTERRUPTMASK  = CONTEXTBASE(%110)    #,                           02865000
   CNDUMPDRT0       = CONTEXTBASE(%111)    #,                           02870000
   CNDUMPDRT1       = CONTEXTBASE(%112)    #,                           02875000
   CNDUMPDRT2       = CONTEXTBASE(%113)    #,                           02880000
   CNDUMPDRT3       = CONTEXTBASE(%114)    #,                  <<03017>>02885000
   CNDRTBANK        = CONTEXTBASE(%122)    #,                  <<03017>>02890000
   CNDRTOFFSET      = CONTEXTBASE(%123)    #,                  <<03017>>02895000
   CNMASKIMB0       = CONTEXTBASE(%124)    #,                  <<03017>>02900000
   CNMASKIMB1       = CONTEXTBASE(%125)    #,                  <<03017>>02905000
   CNMASKIMB2       = CONTEXTBASE(%126)    #,                  <<03017>>02910000
   CNMASKIMB3       = CONTEXTBASE(%127)    #,                  <<03017>>02915000
   CNSDFINITVERSION = CONTEXTBASE(%130)    #,                  <<03017>>02920000
   CNCIVERSION      = CONTEXTBASE(%131)    #,                  <<03017>>02925000
   CNUTILVERSION    = CONTEXTBASE(%132)    #,                  <<03017>>02930000
   CNTAPEVERSION    = CONTEXTBASE(%133)    #;                  <<03017>>02935000
$PAGE "EXTERNAL PROCEDURES."                                            02940000
INTRINSIC                                                               02945000
   PRINT,QUIT,XCONTRAP,ASCII,DASCII,BINARY,DBINARY,FOPEN,FREAD,FWRITE,  02950000
   FGETINFO,FRENAME,FCLOSE,TERMINATE,PRINTFILEINFO,MYCOMMAND,SEARCH;    02955000
                                                               <<D8951>>02960000
<<================= EXTERNAL PROCEDURE DECLARATIONS ========>> <<D8951>>02965000
                                                               <<D8951>>02970000
LOGICAL PROCEDURE CONSOLEISLYNX;                               <<D8951>>02975000
   OPTION EXTERNAL;                                            <<D8951>>02980000
                                                               <<D8951>>02985000
PROCEDURE LYNXSTOPIDLE;                                        <<D8951>>02990000
   OPTION EXTERNAL;                                            <<D8951>>02995000
                                                               <<D8951>>03000000
INTEGER PROCEDURE GETIO (NUM);                                 <<D8951>>03005000
VALUE NUM;                                                     <<D8951>>03010000
INTEGER NUM;                                                   <<D8951>>03015000
   OPTION EXTERNAL;                                            <<D8951>>03020000
                                                               <<D8951>>03025000
LOGICAL PROCEDURE DRTR (DRT, OFFSET);                          <<D8951>>03030000
VALUE DRT, OFFSET;                                             <<D8951>>03035000
INTEGER  DRT, OFFSET;                                          <<D8951>>03040000
   OPTION EXTERNAL;                                            <<D8951>>03045000
                                                               <<D8951>>03050000
PROCEDURE SETIO (DAT, COD);                                    <<D8951>>03055000
VALUE DAT, COD;                                                <<D8951>>03060000
INTEGER DAT, COD;                                              <<D8951>>03065000
   OPTION EXTERNAL;                                            <<D8951>>03070000
                                                               <<D8951>>03075000
INTEGER PROCEDURE TTYIN (BUF, COUNT);                          <<D8951>>03080000
VALUE COUNT;                                                   <<D8951>>03085000
INTEGER COUNT;                                                 <<D8951>>03090000
BYTE ARRAY BUF;                                                <<D8951>>03095000
   OPTION EXTERNAL;                                            <<D8951>>03100000
                                                               <<D8951>>03105000
PROCEDURE CRLF;                                                <<D8951>>03110000
   OPTION EXTERNAL;                                            <<D8951>>03115000
                                                               <<D8951>>03120000
PROCEDURE PRINT'DUS'REV;                                       <<D8951>>03125000
   OPTION EXTERNAL;                                            <<D8951>>03130000
                                                               <<D8951>>03135000
PROCEDURE PRINT'SDFUTIL'REV;                                   <<D8951>>03140000
   OPTION EXTERNAL;                                            <<D8951>>03145000
                                                               <<D8951>>03150000
<<========== END OF EXTERNAL PROCEDURE DECLARATIONS ========>> <<D8951>>03155000
                                                                        03160000
                                                                        03165000
INTEGER PROCEDURE PRINTSTRING(TEXT,COUNT,CONTROL);                      03170000
VALUE TEXT,COUNT,CONTROL;                                               03175000
BYTE POINTER TEXT;                                                      03180000
INTEGER COUNT,CONTROL;                                                  03185000
OPTION VARIABLE,FORWARD;                                                03190000
$PAGE "REQUIRED BUT NOT USED PROCEDURES FOR SYNTAX CHECKING MODE."      03195000
$CONTROL SEGMENT=SYNSEG                                                 03200000
PROCEDURE FATAL;                                                        03205000
   BEGIN                                                                03210000
   ARRAY FATALMSG(0:40);                                                03215000
   MOVE FATALMSG:="* * * FATAL SOFTWARERROR * * *",2;                   03220000
   PRINT(FATALMSG,S0-@FATALMSG,0);                                      03225000
   END  <<FATAL>>;                                                      03230000
                                                               <<02669>>03235000
                                                               <<02669>>03240000
<< DELAY FOR "TIME" MILLISECONDS >>                            <<02669>>03245000
PROCEDURE DELAY(TIME);                                         <<02669>>03250000
VALUE TIME;                                                    <<02669>>03255000
DOUBLE TIME;                                                   <<02669>>03260000
FATAL;                                                         <<02669>>03265000
                                                               <<02669>>03270000
                                                               <<02669>>03275000
                                                                        03280000
                                                                        03285000
LOGICAL PROCEDURE CHECKDISC(DESC);                                      03290000
VALUE DESC;                                                             03295000
DOUBLE DESC;                                                            03300000
FATAL;                                                                  03305000
                                                                        03310000
PROCEDURE WAITINSERTDISC(LDEV);                                         03315000
VALUE LDEV;                                                             03320000
INTEGER LDEV;                                                           03325000
FATAL;                                                                  03330000
                                                                        03335000
PROCEDURE INITADCC(N);                                                  03340000
VALUE N;                                                                03345000
INTEGER N;                                                              03350000
FATAL;                                                                  03355000
                                                                        03360000
PROCEDURE HELP;                                                         03365000
FATAL;                                                                  03370000
                                                                        03375000
PROCEDURE MESSAGE(N);                                                   03380000
VALUE N; INTEGER N;    <<MESSAGE NUMBER>>                               03385000
FATAL;                                                                  03390000
                                                                        03395000
LOGICAL PROCEDURE IDENTIFYDEVICE(DRTUNIT,DESC);                         03400000
VALUE DRTUNIT;                                                          03405000
INTEGER                                                                 03410000
   DRTUNIT;           <<(0:8) - DRT # OF DEVICE TO BE IDENTIFIED        03415000
                        (8:8) - UNIT # OF THE DEVICE>>                  03420000
DOUBLE                                                                  03425000
   DESC;              <<DRT, SUBTYPE, UNIT, TYPE FORMAT>>               03430000
FATAL;                                                                  03435000
                                                                        03440000
DOUBLE PROCEDURE PERFORMIO(LDEV,FUNCTION,TARGET,COUNT,PARM);            03445000
VALUE LDEV,FUNCTION,COUNT,PARM;                                         03450000
INTEGER                                                                 03455000
   LDEV,              <<LOGICAL DEVICE NUMBER                           03460000
                        1 = SYSTEM DISC                                 03465000
                        2 = SERIAL DISC                                 03470000
                        3 = MAG TAPE                                    03475000
                        4 = AUX DISC 1                                  03480000
                        5 = AUX DISC 2>>                                03485000
   FUNCTION,          <<0 = READ                                        03490000
                        1 = WRITE                                       03495000
                        OTHERS ARE DRIVER DEFINED>>                     03500000
   COUNT;             <<LENGTH OF THE BUFFER                            03505000
                        + = WORDS                                       03510000
                        - = BYTES>>                                     03515000
ARRAY                                                                   03520000
   TARGET;            <<DB RELATIVE ADDR OF DATA BUFFER>>               03525000
DOUBLE                                                                  03530000
   PARM;              <<DRIVER DEFINED                                  03535000
                        DISC DRIVER - LOGICAL SEGMENT ADDR>>            03540000
OPTION VARIABLE;                                                        03545000
   BEGIN                                                                03550000
   DEFINE CONDCODE=STAT.(6:2)#;                                         03555000
   EQUATE CCE=2;                                                        03560000
   INTEGER I;                                                           03565000
   IF FUNCTION=0 THEN                                                   03570000
      FOR I:=0 UNTIL COUNT-1 DO TARGET(I):=I;                           03575000
   CONDCODE:=CCE;                                                       03580000
   END;                                                                 03585000
                                                                        03590000
LOGICAL PROCEDURE EXCHANGEDB(DSTX);                                     03595000
VALUE DSTX;                                                             03600000
INTEGER DSTX;         <<TARGET DATA SEGMENT NUMBER>>                    03605000
FATAL;                                                                  03610000
                                                                        03615000
                                                                        03620000
PROCEDURE CHANGEDEVICE(SYSDISCDESC,SERDISCDESC,AUXDISC1DESC,            03625000
   AUXDISC2DESC,CONSOLEDESC,PRINTERDESC);                               03630000
VALUE SYSDISCDESC,SERDISCDESC,AUXDISC1DESC,AUXDISC2DESC,                03635000
   CONSOLEDESC,PRINTERDESC;                                             03640000
DOUBLE                                                                  03645000
   SYSDISCDESC,       <<DEVICE DESCRIPTORS>>                            03650000
   SERDISCDESC,       <<WORD 0 - 0:8  - DRT>>                           03655000
   AUXDISC1DESC,      <<         8:4  - SUBTYPE>>                       03660000
   AUXDISC2DESC,      <<         12:4 - UNIT>>                          03665000
   CONSOLEDESC,       <<WORD 1 - DEVICE TYPE>>                          03670000
   PRINTERDESC;                                                         03675000
OPTION VARIABLE;                                                        03680000
FATAL;                                                                  03685000
$PAGE "SYNTAX CHECKING MODE PROCEDURES"                                 03690000
$CONTROL SEGMENT=SEG'                                                   03695000
                                                               <<D8951>>03700000
<<READ FROM THE CONSOLE>>                                      <<D8951>>03705000
INTEGER PROCEDURE READ(TARGET,TARGETLEN);                      <<D8951>>03710000
VALUE TARGETLEN;                                               <<D8951>>03715000
BYTE ARRAY TARGET;                                             <<D8951>>03720000
INTEGER TARGETLEN;                                             <<D8951>>03725000
BEGIN                                                          <<D8951>>03730000
   READ := TTYIN (TARGET, TARGETLEN);                          <<D8951>>03735000
   CRLF;                                                       <<D8951>>03740000
END;                                                           <<D8951>>03745000
                                                               <<D8951>>03750000
<< SHUTS OFF CTL Y/ATN CHANNEL PROGRAM>>                       <<D8951>>03755000
PROCEDURE STOPIDLE;                                            <<D8951>>03760000
BEGIN                                                          <<D8951>>03765000
INTEGER HOLD, WAITTIME;                                        <<D8951>>03770000
LOGICAL INTERRUPTCODE, INTERRUPTSTATUS, HARDWARESTATUS;        <<D8951>>03775000
   IF CONSOLEISLYNX THEN                                       <<D8951>>03780000
      LYNXSTOPIDLE    <<HALT CHANNEL PROGRAM>>                 <<D8951>>03785000
   ELSE                                                        <<D8951>>03790000
      BEGIN                                                    <<D8951>>03795000
         HOLD := GETIO (0);                                    <<D8951>>03800000
         ASMB (LOAD HOLD; HIOP);                               <<D8951>>03805000
         WHILE DRTR (HOLD, 3) <> 0 DO;  <<WAIT FOR HIOP>>      <<D8951>>03810000
      END;                                                     <<D8951>>03815000
   SETIO (0, 6);  <<CLEAR ATN LOCATION>>                       <<D8951>>03820000
END  <<STOPIDLE>>;                                             <<D8951>>03825000
                                                               <<D8951>>03830000
PROCEDURE SYNTAXEXIT(FILEX);                                            03835000
VALUE FILEX;                                                            03840000
INTEGER                                                                 03845000
   FILEX;              <<=  0 NO FILE FAILED                            03850000
                         <> 0 FAILING FILE'S INDEX INTO FILE ARRAY>>    03855000
   BEGIN                                                                03860000
   DEFINE                                                               03865000
      OLDCFOPTIONS    = [F1/NOFILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,      03870000
                         F5/ARSCII,F6/OLDSYSTEMFILE]#,                  03875000
      OLDCAOPTIONS    = [A1/BUFFERING,A2/EXCLUSIVE,A3/WRITEONLY]#;      03880000
   INTEGER I,LENGTH,DUMMY;                                              03885000
   BYTE ARRAY DESIG(0:28),DESIG1(0:28);                                 03890000
                                                                        03895000
   SUBROUTINE ERRORTERMINATION;                                         03900000
      BEGIN                                                             03905000
      <<INSURE THAT ALL THE FILES ARE CLOSED>>                          03910000
      FCLOSE(LISTFN,SAVE,NOSECURITY);                                   03915000
      FCLOSE(INPUTFN,NOCHANGE,NOSECURITY);                              03920000
      FCLOSE(COMMANDFN,NOCHANGE,NOSECURITY);                            03925000
      FCLOSE(OLDCOMMANDFN,NOCHANGE,NOSECURITY);                         03930000
                                                                        03935000
      <<INFORM USER THAT NO NEW COMMAND FILE WAS CREATED>>              03940000
      MOVE BUF:="* * * NO NEW COMMAND FILE CREATED * * *",2;            03945000
      PRINT(BUF,@BUF-S0,0);                                             03950000
      QUIT(0);                                                          03955000
      END  <<ERRORTERMINATION>>;                                        03960000
                                                                        03965000
   IF FILEX <= OLDCOMMANDFX THEN                                        03970000
      BEGIN   <<ERROR IN FILE ACCESS>>                                  03975000
      PRINTFILEINFO(FILEX);                                             03980000
      MOVE BUFB:="* * * FILE ERROR ON ",2;                              03985000
      CASE FILEX OF                                                     03990000
         BEGIN                                                          03995000
         MOVE *:="LIST FILE * * *",2;                                   04000000
         MOVE *:="INPUT FILE * * *",2;                                  04005000
         MOVE *:="COMMAND FILE * * *",2;                                04010000
         MOVE *:="EXISTING COMMAND FILE * * *",2;                       04015000
         END  <<CASE>>;                                                 04020000
      PRINT(BUFB,@BUFB-S0,0);                                           04025000
      ERRORTERMINATION;                                                 04030000
      END  <<FILE ACCESS ERROR>>                                        04035000
   ELSE IF SYNTAXERROR THEN                                             04040000
      ERRORTERMINATION                                                  04045000
   ELSE                                                                 04050000
      BEGIN                                                             04055000
      <<NO ERRORS, CLOSE THE FILES>>                                    04060000
      FCLOSE(LISTFN,SAVE,NOSECURITY);                                   04065000
      IF <> THEN SYNTAXEXIT(LISTFX);                                    04070000
      FCLOSE(COMMANDFN,TEMPORARYFILE,NOSECURITY);                       04075000
      IF <> THEN SYNTAXEXIT(COMMANDFX);                                 04080000
      END  <<CLOSE FILES>>;                                             04085000
   MOVE BUFB:="NEW COMMAND FILE CREATED ",2;                            04090000
   PRINT(BUF,@BUFB-S0,0);                                               04095000
   TERMINATE;                                                           04100000
   END  <<SYNTAXEXIT>>;                                                 04105000
PROCEDURE SYNTAXINITIALIZE;                                             04110000
   BEGIN                                                                04115000
   DEFINE                                                               04120000
      LISTFOPTIONS    = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/STDLIST,         04125000
                         F5/ARSCII,F6/NEWFILE]#,                        04130000
      LISTAOPTIONS    = [A1/BUFFERING,A2/DEFAULTACCESS,A3/WRITEONLY]#,  04135000
      INPUTFOPTIONS   = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        04140000
                         F5/ARSCII,F6/OLDSYSTEMFILE]#,                  04145000
      INPUTAOPTIONS   = [A1/BUFFERING,A2/DEFAULTACCESS,A3/READONLY]#,   04150000
      DFOPTIONS       = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        04155000
                         F5/ARSCII,F6/TEMPORARYFILE]#,                  04160000
      CFOPTIONS       = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        04165000
                         F5/ARSCII,F6/NEWFILE]#,                        04170000
      CAOPTIONS       = [A1/BUFFERING,A2/DEFAULTACCESS,A3/WRITEONLY]#;  04175000
   BYTE ARRAY DESIG(0:8),CDEVICE(0:4);                                  04180000
   DOUBLE CFILESIZE,FILESIZE;                                           04185000
   INTEGER                                                              04190000
      DUMMY,FOPTIONS,AOPTIONS,RECSIZE,DEVICETYPE,BLOCKSIZE,NUMEXTENT;   04195000
   EQUATE                                                               04200000
      LISTRECSIZE       = -132,                                         04205000
      CRECSIZE          = -72,                                          04210000
      CNUMEXTENT        = 1,                                            04215000
      CBLOCKFACTOR      = 3,                                            04220000
      CBLOCKSIZE        = CRECSIZE*CBLOCKFACTOR;                        04225000
                                                                        04230000
   <<OPEN LIST, INPUT, AND COMMAND FILES>>                              04235000
   MOVE DESIG:="LIST ";                                                 04240000
   LISTFN:=FOPEN(DESIG,LISTFOPTIONS,LISTAOPTIONS,LISTRECSIZE);          04245000
   IF <> THEN SYNTAXEXIT(LISTFX);                                       04250000
   MOVE DESIG:="INPUT ";                                                04255000
   INPUTFN:=FOPEN(DESIG,INPUTFOPTIONS,INPUTAOPTIONS);                   04260000
   IF <> THEN SYNTAXEXIT(INPUTFX);                                      04265000
   FGETINFO(INPUTFN,,,,,,,,,,CFILESIZE);                                04270000
   MOVE DESIG:="SDFCOM ";                                               04275000
   MOVE CDEVICE:="DISC ";                                               04280000
   DUMMY:=FOPEN(DESIG,DFOPTIONS);  <<PURGE POSSIBLE TEMP SDFCOM>>       04285000
   IF = THEN FCLOSE(DUMMY,PURGE,0);                                     04290000
   COMMANDFN:=FOPEN(DESIG,CFOPTIONS,CAOPTIONS,CRECSIZE,CDEVICE,,,       04295000
      CBLOCKFACTOR,,CFILESIZE,CNUMEXTENT);                              04300000
   IF <> THEN SYNTAXEXIT(COMMANDFX);                                    04305000
   FGETINFO(COMMANDFN,,FOPTIONS,,RECSIZE,DEVICETYPE,,,,,,FILESIZE,,,    04310000
      BLOCKSIZE,,NUMEXTENT);                                            04315000
   IF FOPTIONS.(RECTYPE)<>FIXED OR BLOCKSIZE<>CBLOCKSIZE                04320000
      OR RECSIZE<>CRECSIZE  OR NUMEXTENT<>CNUMEXTENT                    04325000
      OR ((DEVICETYPE.(DEVTYPE)<>T13037)                       <<04855>>04330000
         LAND (DEVICETYPE.(DEVTYPE)<>T'CS'80))                 <<04855>>04335000
         <<We must also allow for CS'80 Discs (Type 3)>>       <<04855>>04340000
      OR FILESIZE<CFILESIZE THEN                               <<04855>>04345000
         BEGIN                                                          04350000
         PRINTSTRING(BADCOMMANDFILE);                                   04355000
         SYNTAXEXIT(COMMANDFX);                                         04360000
         END;                                                           04365000
                                                                        04370000
   END  <<SYNTAXINITIALIZATION>>;                                       04375000
$PAGE "UTILITY PROCEDURES."                                             04380000
PROCEDURE INITIALIZE;                                                   04385000
   BEGIN                                                                04390000
   @CONFIG:=XREG;                                                       04395000
   MODE:=IF CTCOMMANDFILE <> 0D THEN COMMAND ELSE INTERACTIVE;          04400000
   PUSH(S); ABORTSREGISTER:=TOS;                                        04405000
   PUSH(Q); ABORTDELTAQ:=TOS-DELTAQ;                                    04410000
   ABORTPREGISTER:=RETURNP; ABORTSTATUS:=STAT;                          04415000
   NOSYSTEMDISC:=CTBADSYSDISC;                                          04420000
   IF CTDUMPFILE <> 0D THEN                                             04425000
      BEGIN                                                             04430000
      PERFORMIO(DUMPDISC,INPUT,OLDFLAB,FLABLEN,CTDUMPFILE);             04435000
      IF <> THEN                                                        04440000
         BEGIN                                                          04445000
         PRINTSTRING(UGLYDUMPFILELABEL);                                04450000
         CTDUMPFILE:=0D;                                                04455000
         DUMPMODE:=SERIALDEVICEDUMP;                                    04460000
         END;                                                           04465000
      END;                                                              04470000
   END  <<INITIALIZATION>>;                                             04475000
INTEGER PROCEDURE PRINTSTRING(TEXT,COUNT,CONTROL);                      04480000
VALUE TEXT,COUNT,CONTROL;                                               04485000
BYTE POINTER TEXT;                                                      04490000
INTEGER COUNT,CONTROL;                                                  04495000
OPTION VARIABLE;                                                        04500000
   BEGIN                                                                04505000
   <<OUTPUTS CHARACTER STRING TO THE LIST FILE.                         04510000
     INPUT:                                                             04515000
       TEXT       - TEXT STRING TO BE LISTED.                           04520000
       COUNT      - LENGTH OF STRING (+ WORDS, - BYTES).  IF THIS       04525000
                    PARAMETER IS OMITTED THEN THE TEXT STRING MUST      04530000
                    BE DELIMITED BY EITHER A CARRIAGE RETURN OR         04535000
                    BY A POUND SIGN (#).                                04540000
       CONTROL    - SPACING CONTROL.  IF OMITTED THEN A VALUE OF        04545000
                    %40 WILL BE USED (SINGLE SPACE).                    04550000
       PRINTSTRING- BYTE INDEX OF THE END OF PRINT STRING + 1.          04555000
   >>                                                                   04560000
   BYTE ARRAY                                                           04565000
      OUTSTRING(0:79);                                                  04570000
   IF PMAP.(15:1)=0 THEN                                                04575000
      CONTROL:=IF MODE=SYNTAXCHECKING THEN " " ELSE %201;               04580000
   IF PMAP.(14:1)=0 THEN                                                04585000
      BEGIN                                                             04590000
      SCAN TEXT UNTIL %6443,1;                                          04595000
      COUNT:=-TOS+@TEXT;                                                04600000
      END;                                                              04605000
   COUNT:=IF COUNT < 0 THEN -COUNT ELSE 2*COUNT;                        04610000
   PRINTSTRING:=COUNT+1;                                                04615000
   DO                                                                   04620000
      BEGIN                                                             04625000
      <<PRINT A LINE>>                                                  04630000
      MOVE OUTSTRING:=TEXT,(80);                                        04635000
      FWRITE(LISTFN,OUTSTRING,-(COUNT MOD 80),CONTROL);                 04640000
      @TEXT:=@TEXT+80;                                                  04645000
      END UNTIL (COUNT:=COUNT-80) <= 0;                                 04650000
   END;                                                                 04655000
PROCEDURE PRINTERROR(ERRMSG,CHARADDR);                                  04660000
VALUE ERRMSG,CHARADDR;                                                  04665000
BYTE POINTER                                                            04670000
   ERRMSG,            <<BYTE ADDR OF THE ERROR MESSAGE>>                04675000
   CHARADDR;          <<BYTE ADDR OF THE OFFENDING WORD>>               04680000
OPTION VARIABLE;                                                        04685000
   BEGIN                                                                04690000
   <<1) PRINTS AN ARROW UNDERNEATH THE OFFENDING WORD.                  04695000
     2) PRINTS THE ERROR STATEMENT.                                     04700000
     3) SETS THE ERROR FLAG.                                            04705000
   >>                                                                   04710000
   INTEGER I;                                                           04715000
   IF MODE=SYNTAXCHECKING THEN PRINT(COMMANDBUF,-RECSIZE,0);            04720000
   IF PMAP THEN                                                         04725000
      BEGIN  <<PRINT ARROW>>                                            04730000
      BUFB:=" "; MOVE BUFB(1):=BUFB,(79);                               04735000
      I:=@CHARADDR-@COMMANDBUF;                                         04740000
      BUFB(I):=%136; BUFB(I+1):="#";                                    04745000
      PRINTSTRING(BUFB);                                                04750000
      END;                                                              04755000
   PRINTSTRING(ERRORMESSAGE);                                           04760000
   PRINTSTRING(ERRMSG);                                                 04765000
   PRINTSTRING(SPACE);                                                  04770000
   SYNTAXERROR:=TRUE;                                                   04775000
   IF MODE = COMMAND THEN MODE:=INTERACTIVE;                            04780000
   END  <<PRINTERROR>>;                                                 04785000
PROCEDURE ABORTCOMMAND;                                                 04790000
   BEGIN                                                                04795000
   <<ABORTS THE CURRENT COMMAND BY RETURNING DIRECTLY TO                04800000
     THE MAINLINE.                                                      04805000
   >>                                                                   04810000
   XCONTRAP(0,OLDABORTPLABEL);                                          04815000
   MOVE BUFB:="* * * COMMAND ABORTED * * *#";                           04820000
   PRINTSTRING(BUFB);                                                   04825000
   MODE:=INTERACTIVE;                                                   04830000
   PUSH(Q); DELTAQ:=TOS-ABORTDELTAQ;                                    04835000
   RETURNP:=ABORTPREGISTER; STAT:=ABORTSTATUS;                          04840000
   XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                              04845000
   END  <<ABORTCOMMAND>>;                                               04850000
PROCEDURE GETNEXTCOMMAND(COMMANDBUF);                                   04855000
BYTE ARRAY COMMANDBUF;                                                  04860000
   BEGIN                                                                04865000
   <<SYNTAX CHECKING MODE - GETS NEXT COMMAND FROM INPUT FILE AND       04870000
                            AND WRITES IT TO THE OUTPUT FILE.           04875000
     COMMAND FILE MODE    - GETS NEXT COMMAND FROM THE COMMAND FILE     04880000
                            AND WRITES IT TO THE CONSOLE.               04885000
     INTERACTIVE MODE     - GETS NEXT COMMAND FROM THE CONSOLE.         04890000
   >>                                                                   04895000
   EQUATE                                                               04900000
      BLOCKFACTOR     = 3;                                              04905000
   INTEGER I:=RECSIZE,COUNT;                                            04910000
   ARRAY DISCBUF(0:SECTORSIZE);                                         04915000
   BYTE POINTER RECORDLOC;                                              04920000
   COMMANDBUF:=CARRIAGERETURN;                                          04925000
   MOVE COMMANDBUF(1):=COMMANDBUF,(73);                                 04930000
   CASE MODE OF                                                         04935000
      BEGIN                                                             04940000
      BEGIN                     <<**SYNTAX CHECKING MODE>>              04945000
      COUNT:=FREAD(INPUTFN,COMMANDBUF,-RECSIZE);                        04950000
      IF < THEN SYNTAXEXIT(INPUTFX);                                    04955000
      IF > THEN SYNTAXEXIT(ENDOFINPUT);                                 04960000
      FWRITE(COMMANDFN,COMMANDBUF,-COUNT,0);                            04965000
      IF <> THEN SYNTAXEXIT(COMMANDFX);                                 04970000
      END  <<SYNTAX CHECKING MODE>>;                                    04975000
      BEGIN                     <<**COMMAND MODE>>                      04980000
      IF LOGICAL(RECORDCOUNT:=RECORDCOUNT+1) > CTCOMMANDLENGTH THEN     04985000
         BEGIN  <<END-OF-FILE ON COMMAND FILE>>                         04990000
         MODE:=INTERACTIVE;                                             04995000
         PRINTSTRING(COMMANDFILEOF);                                    05000000
         END                                                            05005000
      ELSE                                                              05010000
         BEGIN                                                          05015000
         PERFORMIO(COMMANDISC,INPUT,DISCBUF,SECTORSIZE,                 05020000
            CTCOMMANDFILE+DOUBLE((RECORDCOUNT-1)/BLOCKFACTOR));         05025000
         IF = THEN                                                      05030000
            BEGIN  <<SUCCESSFUL>>                                       05035000
            @RECORDLOC:=@DISCBUF&LSL(1)                                 05040000
               +((RECORDCOUNT-1) MOD BLOCKFACTOR)*RECSIZE;              05045000
            MOVE COMMANDBUF:=RECORDLOC,(RECSIZE);                       05050000
            WHILE (I:=I-1)>0 AND COMMANDBUF(I)=" " DO                   05055000
               COMMANDBUF(I):=CARRIAGERETURN;                           05060000
            PRINTSTRING(COMMANDBUF,-RECSIZE);                           05065000
            XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                     05070000
            END                                                         05075000
         ELSE                                                           05080000
            BEGIN  <<ERROR IN COMMAND FILE ACCESS>>                     05085000
            <<CHANGE MODE TO INTERACTIVE AND GET NEXT COMMAND FROM      05090000
              THE CONSOLE.                                              05095000
            >>                                                          05100000
            PRINTSTRING(COMMANDFILERR);                                 05105000
            MODE:=INTERACTIVE;                                          05110000
            GETNEXTCOMMAND(COMMANDBUF);                                 05115000
            END;                                                        05120000
         END;                                                           05125000
      END  <<COMMAND FILE MODE>>;                                       05130000
      BEGIN                     <<**INTERACTIVE MODE>>                  05135000
      PRINTSTRING(SPACE);                                               05140000
      PRINTSTRING(PROMPT,,%320);                                        05145000
      COUNT:=READ(COMMANDBUF,-RECSIZE);                        <<03749>>05150000
      WHILE COUNT<RECSIZE DO                                   <<03749>>05155000
         <<If a control X was done the count returned by the >><<03749>>05160000
         <<read procedure may be less than the number of     >><<03749>>05165000
         <<characters actually put into the buffer, so we    >><<03749>>05170000
         <<overwrite any extra chars with carriage returns   >><<03749>>05175000
         BEGIN                                                 <<03749>>05180000
         COMMANDBUF(COUNT):=CARRIAGERETURN;                    <<03749>>05185000
         COUNT:=COUNT+1;                                       <<03749>>05190000
         END;                                                  <<03749>>05195000
      MOVE COMMANDBUF:=COMMANDBUF WHILE A,1;                            05200000
      MOVE COMMANDBUF(RECSIZE):=COMMANDBUF(71),(S0-@COMMANDBUF-RECSIZE);05205000
      XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                           05210000
      END  <<INTERACTIVE MODE>>;                                        05215000
      END  <<CASE>>;                                                    05220000
   END  <<GETNEXTCOMMAND>>;                                             05225000
   PROCEDURE READISC(BUFFER,LENGTH,SECTOR);                             05230000
   VALUE LENGTH,SECTOR;                                                 05235000
   ARRAY BUFFER;                                                        05240000
   INTEGER LENGTH;                                                      05245000
   DOUBLE SECTOR;                                                       05250000
      BEGIN                                                             05255000
      PERFORMIO(SYSTEMDISC,INPUT,BUFFER,LENGTH,SECTOR);                 05260000
      IF <> THEN QUIT(SYSTEMDISCERR);                                   05265000
      END  <<READISC>>;                                                 05270000
                                                               <<03017>>05275000
PROCEDURE LOAD'SDF'MAP'BUFFER;                                 <<03017>>05280000
<<===========================>>                                <<03017>>05285000
BEGIN                                                          <<03017>>05290000
                                                               <<03017>>05295000
  EQUATE SDFMAPADDR = 1;   <<WORDS 1,2 ARE SECTOR ADDRESS>>    <<03017>>05300000
   READISC( SDFMAPBUFFER,SECTORSIZE,3D);                       <<03017>>05305000
   TOS := @SDFMAPBUFFER;                                       <<03017>>05310000
   TOS := SECTORSIZE;                                          <<03017>>05315000
   TOS := SDFMAPBUFFER(SDFMAPADDR);                            <<03017>>05320000
   TOS := SDFMAPBUFFER(SDFMAPADDR+1);                          <<03017>>05325000
   READISC( *,*,*);                                            <<03017>>05330000
                                                               <<03017>>05335000
   SDFMAP'MAXBANK := CTNUMBERBANKS - 1;  <<LOAD HIGHEST BANK>> <<03017>>05340000
      <<NUMBER INTO LAST MEMORY STORAGE RECORD = UPPER MEM>>   <<03017>>05345000
      <<BOUND.  THIS MUST BE DYNAMICALLY LOADED FOR GETAREA >> <<03017>>05350000
   SDF'MAP'BUFFER'LOADED := TRUE;                              <<03017>>05355000
END;                                                           <<03017>>05360000
                                                               <<03017>>05365000
PROCEDURE GETAREA ( SOURCE, TARGET, TCOUNT );                  <<03017>>05370000
<<==========================================>>                 <<03017>>05375000
 VALUE SOURCE,TARGET,TCOUNT;                                   <<03017>>05380000
                                                               <<03017>>05385000
 DOUBLE                                                        <<03017>>05390000
   SOURCE;    <<SOURCE BANK AND ABSOLUTE ADDRESS>>             <<03017>>05395000
 POINTER                                                       <<03017>>05400000
   TARGET;    <<DB-REL DESTINATION ADDRESS>>                   <<03017>>05405000
 LOGICAL                                                       <<03017>>05410000
   TCOUNT;    <<LENGTH OF DESTINATION AREA IN WORDS>>          <<03017>>05415000
              <<IF NOT SPECIFIED THEN 1 WORD IS USED>>         <<03017>>05420000
                                                               <<03017>>05425000
 OPTION VARIABLE;                                              <<03017>>05430000
BEGIN                                                          <<03017>>05435000
                                                               <<03017>>05440000
 POINTER                                                       <<03017>>05445000
   PTR;            <<POINTER INTO MAP BUFFER>>                 <<03017>>05450000
 DOUBLE POINTER                                                <<03017>>05455000
   DPTR = PTR;     <<DOUBLE WORD POINTER (SAME) INTO MAP>>     <<03017>>05460000
                                                               <<03017>>05465000
 DOUBLE                                                        <<03017>>05470000
   END'ADDR,       <<LAST DESIRED WORD OF REQUEST>>            <<03017>>05475000
                                                               <<03017>>05480000
   XFER'START,     <<START ADDRESS FOR CURRENT TRANSFER>>      <<03017>>05485000
   CUR'SECTOR,     <<SECTOR NUMBER FOR CURRENT TRANSFER>>      <<03017>>05490000
   FULL'SECTORS,   <<NUMBER OF FULL SECTORS TO TRANSFER>>      <<03017>>05495000
   SECTOR'OFFSET;  <<SECTOR OFFSET FROM START SECTOR>>         <<03017>>05500000
                   <<OF CURRENT STORAGE RECORD>>               <<03017>>05505000
 LOGICAL                                                       <<03017>>05510000
   XFER'BANK=XFER'START,  <<BANK PORTION OF XFER'START>>       <<03017>>05515000
   CUR'LEN,        <<LENGTH OF CURRENT TRANSFER>>              <<03017>>05520000
   XFER'LEN,       <<LENGTH OF RECORD TRANSFER>>               <<03017>>05525000
   WORD'OFFSET,    <<WORD OFFSET FROM START ADDR OF STG REC>>  <<03017>>05530000
   BANK'OFFSET,    <<BANK OFFSET FROM START ADDR OF STG REC>>  <<03017>>05535000
   LEADING'WORDS,  <<NUMBER OF WORDS BEFORE FIRST SECTOR BND>> <<03017>>05540000
   TRAILING'WORDS; <<NUMBER OF WORDS IN LAST PARTIAL SECTOR>>  <<03017>>05545000
 ARRAY SECTORBUF (0:511);                                      <<03605>>05550000
                                                               <<03017>>05555000
 <<------------------------------------------------------->>   <<03017>>05560000
                                                               <<03017>>05565000
 IF NOT PMAP THEN TCOUNT := 1;                                 <<03017>>05570000
    <<IF OPTIONAL PARAM IS OMITTED USE DEFAULT 1 WORD>>        <<03017>>05575000
                                                               <<03017>>05580000
 END'ADDR := SOURCE + DOUBLE( TCOUNT) - 1D;                    <<03017>>05585000
    <<CALCULATE LAST DESIRED WORD OF REQUEST>>                 <<03017>>05590000
                                                               <<03017>>05595000
 XFER'START := SOURCE;                                         <<03017>>05600000
    <<FIRST TRANSFER TO START AT SPECIFIED START ADDR>>        <<03017>>05605000
                                                               <<03017>>05610000
 IF NOT SDF'MAP'BUFFER'LOADED                                  <<03017>>05615000
 THEN LOAD'SDF'MAP'BUFFER;                                     <<03017>>05620000
       <<INSURE THAT WE HAVE A COPY OF THE MAP>>               <<03017>>05625000
                                                               <<03017>>05630000
 @PTR := @SDFMAPBUFFER;                                        <<03017>>05635000
    <<INSURE POINTERS AIM AT FIRST RECORD IN MAP BUFFER>>      <<03017>>05640000
                                                               <<03017>>05645000
                                                               <<03017>>05650000
 DO BEGIN  <<GET THE REQUESTED AREA>>                          <<03017>>05655000
       <<THIS MAY REQUIRE MULTIPLE TRANSFERS FROM>>            <<03017>>05660000
       <<VARIOUS STORAGE RECORDS>>                             <<03017>>05665000
                                                               <<03017>>05670000
   IF XFER'START > DPTR(DSRC'END)                              <<03017>>05675000
   THEN                                                        <<03017>>05680000
       <<START ADDRESS FALLS BEYOND END OF CURRENT>>           <<03017>>05685000
       <<MAP RECORD. WE HAVE TO ADVANCE TO NEXT REC.>>         <<03017>>05690000
     @PTR := @PTR + MAPENTRYSIZE                               <<03017>>05695000
                                                               <<03017>>05700000
   ELSE BEGIN                                                  <<03017>>05705000
       <<START ADDRESS FALLS WITHIN CURRENT RECORD>>           <<03017>>05710000
       <<=========================================>>           <<03017>>05715000
       <<CHECK TO SEE IF REMAINING AMOUNT OF REQUEST>>         <<03017>>05720000
       <<CAN BE SATISFIED FROM THIS STORAGE RECORD>>           <<03017>>05725000
                                                               <<03017>>05730000
     IF END'ADDR <= DPTR(DSRC'END)                             <<03017>>05735000
     THEN                                                      <<03017>>05740000
       <<ENTIRELY CONTAINED WITHIN THIS RECORD>>               <<03017>>05745000
       XFER'LEN :=LOGICAL(END'ADDR-XFER'START) + 1             <<03017>>05750000
     ELSE                                                      <<03017>>05755000
       <<DESIRED REQUEST GOES BEYOND CURRENT RECORD>>          <<03017>>05760000
       <<WE WILL TRANSFER TO END OF THIS RECORD, >>            <<03017>>05765000
       <<AND PICK UP THE REST NEXT PASS AROUND FROM>>          <<03017>>05770000
       <<THE NEXT STORAGE RECORD>>                             <<03017>>05775000
       XFER'LEN := LOGICAL(DPTR(DSRC'END)-XFER'START)+1;       <<03017>>05780000
                                                               <<03017>>05785000
       <<CALCULATE THE OFFSETS FROM THE ACTUAL START>>         <<03017>>05790000
       <<ADDRESS OF THE STORAGE RECORD, TO THE FIRST>>         <<03017>>05795000
       <<DESIRED WORD IN THE STORAGE WE WISH TO ACCESS>>       <<03017>>05800000
                                                               <<03017>>05805000
    WORD'OFFSET := LOGICAL(XFER'START-DPTR(DSRC'START));       <<03017>>05810000
    BANK'OFFSET := XFER'BANK - PTR(SRC'START'HI);              <<03017>>05815000
    SECTOR'OFFSET := DOUBLE( WORD'OFFSET/SAVEAREASECTORSIZE);  <<03605>>05820000
                                                               <<03017>>05825000
       <<BASED ON THE STORAGE RECORD, DETERMINE IF >>          <<03017>>05830000
       <<THIS CURRENT XFER IS FROM MEMORY OR DISC>>            <<03017>>05835000
       <<AND PERFORM THE CURRENT TRANSFER>>                    <<03017>>05840000
                                                               <<03017>>05845000
    IF PTR(STGMEDIA) = MEMORY                                  <<03017>>05850000
    THEN BEGIN                                                 <<03017>>05855000
       <<STORAGE IS IN MEMORY. USE MOVE ABSOLUTE FOR XFER>>    <<03017>>05860000
       <<------------------------------------------------>>    <<03017>>05865000
                                                               <<03017>>05870000
      PUSH(DB);                                                <<03017>>05875000
      TOS:=TOS+@TARGET;           <<DESTINATION>>              <<03017>>05880000
      TOS:=DPTR(DSTG);            <<SOURCE=STORAGE ADDRESS>>   <<03017>>05885000
      LS1 := LS1 + BANK'OFFSET;   <<CORRECT FOR BANK OFFSET>>  <<03017>>05890000
      TOS := TOS+WORD'OFFSET;     <<CORRECT FOR OFFSET>>       <<03017>>05895000
      TOS := XFER'LEN;            <<LENGTH FOR MOVE>>          <<03017>>05900000
                                                               <<03017>>05905000
      ASSEMBLE(MABS);                                          <<03017>>05910000
      @TARGET:=LOGICAL( @TARGET )+XFER'LEN;                    <<03017>>05915000
      END  <<STORAGE IS IN MEMORY>>                            <<03017>>05920000
           <<-------------------->>                            <<03017>>05925000
                                                               <<03017>>05930000
    ELSE BEGIN                                                 <<03017>>05935000
       <<STORAGE IS ON DISC>>                                  <<03017>>05940000
       <<------------------>>                                  <<03017>>05945000
                                                               <<03017>>05950000
      WORD'OFFSET := WORD'OFFSET MOD SAVEAREASECTORSIZE;       <<03605>>05955000
        <<NOW REMAINDER BEYOND SECTOR'OFFSET>>                 <<03017>>05960000
                                                               <<03017>>05965000
      CUR'SECTOR := DPTR(DSTG) + SECTOR'OFFSET;                <<03017>>05970000
        <<ADD OUR KNOWN OFFSET TO START ADDRESS OF STORAGE>>   <<03017>>05975000
        <<THIS WILL BE THE START SECTOR FOR OUR FIRST XFER>>   <<03017>>05980000
                                                               <<03017>>05985000
        <<DETERMINE POSSIBLE NUMBER OF LEADING WORDS UNTIL>>   <<03017>>05990000
        <<THE FIRST SECTOR BOUNDARY>>                          <<03017>>05995000
      LEADING'WORDS:= SAVEAREASECTORSIZE - WORD'OFFSET;        <<03605>>06000000
      LEADING'WORDS:= IF LEADING'WORDS < XFER'LEN              <<03017>>06005000
                      THEN LEADING'WORDS ELSE XFER'LEN;        <<03017>>06010000
                                                               <<03017>>06015000
      IF LEADING'WORDS > 0                                     <<03017>>06020000
      THEN BEGIN                                               <<03017>>06025000
        <<READ THE SECTOR INTO A TEMP BUFFER AND THEN COPY>>   <<03017>>06030000
        <<THE PARTIAL SECTOR OF LEADING WORDS TO TARGET>>      <<03017>>06035000
                                                               <<03017>>06040000
        READISC(SECTORBUF,SAVEAREASECTORSIZE,CUR'SECTOR);      <<03605>>06045000
        MOVE TARGET:=SECTORBUF(WORD'OFFSET),(LEADING'WORDS);   <<03017>>06050000
        CUR'SECTOR:=CUR'SECTOR+1D;                             <<03017>>06055000
        @TARGET:=LOGICAL(@TARGET)+LEADING'WORDS;               <<03017>>06060000
        CUR'LEN := XFER'LEN - LEADING'WORDS;                   <<03017>>06065000
      END;                                                     <<03017>>06070000
                                                               <<03017>>06075000
      TRAILING'WORDS:= CUR'LEN MOD SAVEAREASECTORSIZE;         <<03605>>06080000
      FULL'SECTORS := DOUBLE( CUR'LEN/SAVEAREASECTORSIZE);     <<03605>>06085000
      CUR'LEN := CUR'LEN - TRAILING'WORDS;                     <<03017>>06090000
                                                               <<03017>>06095000
      IF FULL'SECTORS > 0D                                     <<03017>>06100000
      THEN BEGIN                                               <<03017>>06105000
        <<TRANSFER ALL FULL SECTORS DIRECT TO TARGET >>        <<03017>>06110000
        <<IN ONE LARGE DISC READ>>                             <<03017>>06115000
                                                               <<03017>>06120000
        READISC(TARGET, CUR'LEN,CUR'SECTOR);                   <<03017>>06125000
        CUR'SECTOR := CUR'SECTOR + FULL'SECTORS;               <<03017>>06130000
        @TARGET := LOGICAL( @TARGET) + CUR'LEN;                <<03017>>06135000
      END;                                                     <<03017>>06140000
                                                               <<03017>>06145000
      IF TRAILING'WORDS > 0                                    <<03017>>06150000
      THEN BEGIN                                               <<03017>>06155000
        <<TRANSFER THE REMAINING PARTIAL SECTOR DIRECT>>       <<03017>>06160000
        <<TO TARGET IN ONE READ>>                              <<03017>>06165000
                                                               <<03017>>06170000
        READISC( TARGET, TRAILING'WORDS, CUR'SECTOR);          <<03017>>06175000
        @TARGET := LOGICAL(@TARGET) + TRAILING'WORDS;          <<03017>>06180000
      END;                                                     <<03017>>06185000
    END;  <<STORAGE IS ON DISC>>                               <<03017>>06190000
                                                               <<03017>>06195000
       <<UPDATE TCOUNT TO REFLECT THE TRANSFER>>               <<03017>>06200000
       <<AND ADVANCE TO THE NEXT RECORD>>                      <<03017>>06205000
    TCOUNT := TCOUNT - XFER'LEN;                               <<03017>>06210000
    @PTR := @PTR + MAPENTRYSIZE;                               <<03017>>06215000
    XFER'START := XFER'START +DOUBLE(XFER'LEN);                <<03017>>06220000
                                                               <<03017>>06225000
   END; <<START ADDRESS FELL WITHIN CURRENT RECORD>>           <<03017>>06230000
        <<========================================>>           <<03017>>06235000
                                                               <<03017>>06240000
 END UNTIL TCOUNT = 0; <<TOTAL REQUEST IS COMPLETED>>          <<03017>>06245000
                                                               <<03017>>06250000
END; <<PROCEDURE GETAREA>>                                     <<03017>>06255000
PROCEDURE CHECKBACKUP;                                                  06260000
   BEGIN                                                                06265000
   INTEGER ARRAY CHECKSUMBUF(0:127);                                    06270000
   INTEGER CHECKSUM:=%123456;                                           06275000
   DEFINE                                                               06280000
      BOOTSEC       = 3D#;                                              06285000
   EQUATE                                                               06290000
      STACKGLOBALDST = 9,                                               06295000
      SERIALDISCDST  = 15;                                              06300000
   DOUBLE                                                               06305000
      CURRENTDISCWRITE=DB+%26,CURRENTDISCREAD=DB+%30;                   06310000
   <<DETERMINE IF A BACKUP SDF DISC>>                                   06315000
   PERFORMIO(SERIALDEVICE,INPUT,CHECKSUMBUF,SECTORSIZE,BOOTSEC);        06320000
   FOR XREG:=1 UNTIL SECTORSIZE-1 DO                                    06325000
      CHECKSUM:=CHECKSUM+CHECKSUMBUF(XREG);                             06330000
   IF CHECKSUM = CHECKSUMBUF THEN                                       06335000
      BEGIN  <<BACKUP DISC, SKIP OVER SDFLOAD FILE>>                    06340000
      PERFORMIO(SERIALDEVICE,FORWARDSPACEFILE);                         06345000
      EXCHANGEDB(SERIALDISCDST);                                        06350000
      CURRENTDISCWRITE:=CURRENTDISCREAD;                                06355000
      EXCHANGEDB(STACKGLOBALDST);                                       06360000
      CTBACKUPDUMP:=1                                                   06365000
      END                                                               06370000
   ELSE                                                                 06375000
      BEGIN                                                             06380000
      PERFORMIO(SERIALDEVICE,WRITEOF);                                  06385000
      CTBACKUPDUMP:=0;                                                  06390000
      END;                                                              06395000
   END  <<CHECKBACKUP>>;                                                06400000
$PAGE "COMMAND PARAMETER ANALYZER."                                     06405000
LOGICAL PROCEDURE GETNEXTPARM(KEYWORDICT,TYPE,PARMVALUE,PARMADDR,       06410000
   DELIMNUM,DEFN,DPARM);                                                06415000
BYTE ARRAY KEYWORDICT;                                                  06420000
INTEGER TYPE,PARMVALUE,DELIMNUM;                                        06425000
BYTE POINTER PARMADDR,DEFN;                                             06430000
DOUBLE DPARM;                                                           06435000
OPTION VARIABLE;                                                        06440000
   BEGIN                                                                06445000
   <<OBTAINS THE NEXT PARAMETER FROM THE CURRENT COMMAND                06450000
     INPUT                                                              06455000
       KEYWORD        - SEARCH DICTIONARY FOR (POSSIBLE) KEYWORD        06460000
                        COMMAND.  SHOULD BE IN THE SAME FORMAT AS       06465000
                        THE "DICT" COMMAND OF THE SEARCH INTRINSIC.     06470000
     OUTPUT:                                                            06475000
       GETNEXTPARM    TRUE = A PARAMETER WAS FOUND                      06480000
                      FALSE= NO MORE PARAMETERS ON THE CURRENT KEYWORD  06485000
                            (IF NOT EXECUTING IN A KEYWORD THEN NO      06490000
                            MORE PARAMETERS IN THIS COMMAND).           06495000
       TYPE           0 = KEY WORD.                                     06500000
                      1 = ALPHANUMERIC WITH MATCH IN DICTIONARY.        06505000
                      2 = ALPHANUMERIC.                                 06510000
                      3 = NUMERIC.                                      06515000
                      4 = INVALID PARAMETER.                            06520000
       PARMVALUE      - VALUE RETURNED IS DEPENDANT OF THE VALUE OF     06525000
                        "GETNEXTPARM".                                  06530000
                        GETNEXTPARM VALUE.   PARMVALUE MEANING.         06535000
                        -----------------    -----------------          06540000
                        0                    UNDEFINED.                 06545000
                        1                    BINARY VALUE.              06550000
                        2                    ENTRY NUMBER IN COMMAND    06555000
                                             DICTIONARY.                06560000
                        3                    ENTRY NUMBER IN COMMAND    06565000
                                             DICTIONARY.                06570000
                        4                    LENGTH OF ALPHANUMERIC SEQ.06575000
                        5                    ILLEGAL PARAMETER VALUE.   06580000
       PARMADDR       - BYTE ADDRESS OF THE PARAMETER                   06585000
       DELIMNUM       - TYPE OF DELIMITER                               06590000
                        0  COMMA                                        06595000
                        1  DASH                                         06600000
                        2  SEMICOLON                                    06605000
                        3  CARRIAGE RETURN                              06610000
                        4  EQUAL                                        06615000
       DEFN           - BYTE ADDRESS OF THE "DEFINITION" PORTION OF THE 06620000
                        KEYWORD COMMANDS AND ALPHA DICTIONARY COMMANDS. 06625000
   >>                                                                   06630000
   OWN LOGICAL                                                          06635000
      ENDOFKEYWORD:=FALSE;                                              06640000
   INTEGER                                                              06645000
      I,EN,DUMPARMVAL,DEFNADDRESS=Q-6,PARMVALUEADDRESS=Q-9,             06650000
      TYPEADDRESS=Q-10,KEYWORDICTADDRESS=Q-11,DUMTYPE,PARMLENGTH,       06655000
      DUMDICT:=0;                                                       06660000
   BYTE POINTER                                                         06665000
      PARMADDRESS,DUMPNTR:=@DUMDICT;                                    06670000
   INTEGER                                                              06675000
     DUMDUM=DUMPNTR;                                                    06680000
   POINTER                                                              06685000
      DUMDEFNADDRESS:=@DUMDUM;                                          06690000
   EQUATE                                                               06695000
      BINARYTYPE       = 2;                                             06700000
   DEFINE                                                               06705000
      KEYWORDICTPRES   = PMAP.(9:1) #,                                  06710000
      TYPEPRES         = PMAP.(10:1)#,                                  06715000
      PARMVALUEPRES    = PMAP.(11:1)#,                                  06720000
      PARMADDRPRES     = PMAP.(12:1)#,                                  06725000
      DELIMPRES        = PMAP.(13:1)#,                                  06730000
      DEFNPRES         = PMAP.(14:1)#,                                  06735000
      DPARMPRES        = PMAP.(15:1)#,                                  06740000
      ENTRYNUMBER      = PARMVALUE#,                                    06745000
      BINARYVALUE      = PARMVALUE#,                                    06750000
      PARAMETERADDRESS = DEFN#,                                         06755000
      PPARMADDRESS     = PARMS(I-1)#,                                   06760000
      PPARMLENGTH      = PARMS(I).(0:8)#,                               06765000
      PCHARTYPE        = PARMS(I).(8:3)#,                               06770000
      PPARMTYPE        = PARMS(I).(11:5)#;                              06775000
                                                                        06780000
   <<TEST FOR PRESENCE OF PARAMETERS>>                                  06785000
   IF NOT DEFNPRES THEN DEFNADDRESS:=@DUMDEFNADDRESS;                   06790000
   IF NOT PARMVALUEPRES THEN PARMVALUEADDRESS:=@DUMPARMVAL;             06795000
   IF NOT TYPEPRES THEN TYPEADDRESS:=@DUMTYPE;                          06800000
   IF NOT KEYWORDICTPRES THEN KEYWORDICTADDRESS:=@DUMDICT;              06805000
                                                                        06810000
   <<CHECK IF AT END OF COMMAND OR KEYWORD>>                            06815000
   I:=2*CURRENTPARM-1;                                                  06820000
   IF PARMADDRPRES THEN @PARMADDR:=PPARMADDRESS+PPARMLENGTH;            06825000
   IF ENDOFKEYWORD THEN                                                 06830000
      BEGIN                                                             06835000
      ENDOFKEYWORD:=FALSE;                                              06840000
      IF CURRENTPARM <> 0 THEN RETURN;                                  06845000
      END;                                                              06850000
   IF CURRENTPARM+1 > NUMPARMS THEN RETURN;                             06855000
   I:=I+2; CURRENTPARM:=CURRENTPARM+1;                                  06860000
   GETNEXTPARM:=TRUE;                                                   06865000
   IF DELIMPRES THEN DELIMNUM:=PPARMTYPE;                               06870000
                                                                        06875000
   <<GET PARAMETER ADDRESS AND LENGTH>>                                 06880000
   @PARMADDRESS:=PPARMADDRESS;                                          06885000
   IF PARMADDRPRES THEN @PARMADDR:=@PARMADDRESS;                        06890000
   IF PPARMTYPE = SEMICOLON THEN ENDOFKEYWORD:=TRUE;                    06895000
                                                                        06900000
   <<START PARAMETER CATAGORIZATION>>                                   06905000
   IF (PARMLENGTH:=PPARMLENGTH) = 0 THEN                                06910000
      TYPE:=NULLPARM                                                    06915000
   ELSE IF PPARMTYPE = EQUAL THEN                                       06920000
      TYPE:=  <<KEYWORD PARAMETER>>                                     06925000
        IF (ENTRYNUMBER:=SEARCH(PARMADDRESS,PARMLENGTH,KEYWORDICT,DEFN))06930000
        <> 0 THEN KEYWORDPARM ELSE INVALIDPARM                          06935000
   ELSE                                                                 06940000
      BEGIN   <<POSITIONAL PARAMETER>>                                  06945000
      <<SEE IF THE PARAMETER CAN BE FOUND IN THE DICTIONARY>>           06950000
      IF (EN:=SEARCH(PARMADDRESS,PARMLENGTH,KEYWORDICT,DEFN))<>0 THEN   06955000
         BEGIN                                                          06960000
         TYPE:=DICTIONARYPARM;                                          06965000
         ENTRYNUMBER:=EN                                                06970000
         END                                                            06975000
      ELSE                                                              06980000
         BEGIN   <<TEST IF NUMERIC>>                                    06985000
         IF DPARMPRES THEN                                              06990000
            DPARM:=DBINARY(PARMADDRESS,PARMLENGTH)                      06995000
         ELSE                                                           07000000
            BINARYVALUE:=BINARY(PARMADDRESS,PARMLENGTH);                07005000
         TYPE:=IF = THEN NUMERICPARM ELSE ALPHANUMERICPARM;             07010000
         END  <<NUMERIC PARAMETER TEST>>;                               07015000
      END  <<POSITIONAL PARAMETER>>;                                    07020000
   END  <<GETNEXTPARM>>;                                                07025000
$PAGE "SYNTAX CHECKING ROUTINES"                                        07030000
LOGICAL PROCEDURE DUMPSYNTAX;                                           07035000
   BEGIN                                                                07040000
   BYTE POINTER PARMADDR;                                               07045000
   INTEGER TYPE,PV,DELIMNUM;                                            07050000
   DOUBLE DPV;                                                          07055000
                                                                        07060000
   SUBROUTINE LEAVE(MESSAGE);                                           07065000
   BYTE ARRAY MESSAGE;                                                  07070000
      BEGIN                                                             07075000
      IF MESSAGE <> "SUCCESSFUL" THEN                                   07080000
         PRINTERROR(MESSAGE,PARMADDR)                                   07085000
      ELSE                                                              07090000
         DUMPSYNTAX:=TRUE;                                              07095000
      ASSEMBLE(EXIT 0);                                                 07100000
      END  <<LEAVE>>;                                                   07105000
SUBROUTINE DSRANGECHECK(FIRSTVALUE);                                    07110000
VALUE FIRSTVALUE;                                                       07115000
INTEGER FIRSTVALUE;                                                     07120000
   BEGIN                                                                07125000
   IF NOT GETNEXTPARM(,TYPE,PV,PARMADDR) OR TYPE <> NUMERICPARM THEN    07130000
      LEAVE(EXPECTEDNUMBER);                                            07135000
   IF FIRSTVALUE > PV THEN LEAVE(INVALIDRANGE);                         07140000
   END  <<DSRANGECHECK>>;                                               07145000
                                                                        07150000
SUBROUTINE DISCRANGECHECK(FIRSTVALUE);                                  07155000
VALUE FIRSTVALUE;                                                       07160000
DOUBLE FIRSTVALUE;                                                      07165000
   BEGIN                                                                07170000
   IF NOT GETNEXTPARM(,TYPE,,PARMADDR,,,DPV) OR TYPE <> NUMERICPARM THEN07175000
      LEAVE(EXPECTEDNUMBER);                                            07180000
   IF FIRSTVALUE > DPV THEN LEAVE(INVALIDRANGE);                        07185000
   END  <<DISCRANGECHECK>>;                                             07190000
                                                                        07195000
   IF GETNEXTPARM(,TYPE,PV,PARMADDR) THEN                               07200000
      BEGIN  <<PARAMETER SCAN>>                                         07205000
      <<NUMBER OF BANKS>>                                               07210000
      IF TYPE <> NULLPARM THEN                                          07215000
         BEGIN                                                          07220000
         IF TYPE <> NUMERICPARM THEN LEAVE(EXPECTEDNUMBER);             07225000
         IF NOT (0<= PV <= MAXBANK) THEN LEAVE(INVALIDVALUE);           07230000
         END;                                                           07235000
      IF GETNEXTPARM(,,,PARMADDR) THEN LEAVE(EXTRAPARM);                07240000
      WHILE GETNEXTPARM(DUMPDICT,TYPE,PV,PARMADDR) DO                   07245000
         BEGIN  <<KEYWORD SCAN>>                                        07250000
         IF TYPE <> KEYWORDPARM THEN LEAVE(EXPECTEDKEYWORD);            07255000
         IF PV = VIRTUALMEMORY THEN                                     07260000
            BEGIN  <<VIRTUAL MEMORY DATA SEGMENTS>>                     07265000
            IF NOT GETNEXTPARM(VIRTDICT,TYPE,PV,PARMADDR,DELIMNUM) THEN 07270000
               LEAVE(EXPECTEDPARM);                                     07275000
            DO IF TYPE = NUMERICPARM AND PV<>0 THEN                     07280000
               BEGIN                                                    07285000
               IF DELIMNUM = DASH THEN DSRANGECHECK(PV);                07290000
               END                                                      07295000
            ELSE IF TYPE <> DICTIONARYPARM THEN                         07300000
               LEAVE(INVALIDVALUE)                                      07305000
            UNTIL NOT GETNEXTPARM(VIRTDICT,TYPE,PV,PARMADDR,DELIMNUM);  07310000
            END                                                         07315000
         ELSE                                                           07320000
            BEGIN   <<DISC SECTORS>>                                    07325000
            IF NOT GETNEXTPARM(,TYPE,,PARMADDR,DELIMNUM,,DPV) THEN      07330000
               LEAVE(EXPECTEDPARM);                                     07335000
            DO                                                          07340000
               IF TYPE <> NUMERICPARM THEN                              07345000
                  LEAVE(EXPECTEDNUMBER)                                 07350000
               ELSE IF DELIMNUM = DASH THEN                             07355000
                  DISCRANGECHECK(DPV)                                   07360000
            UNTIL NOT GETNEXTPARM(,TYPE,,PARMADDR,DELIMNUM,,DPV);       07365000
            END;                                                        07370000
         END  <<KEYWORD SCAN>>;                                         07375000
      END  <<PARAMETER SCAN>>;                                          07380000
   LEAVE(SUCCESSFUL);                                                   07385000
   END  <<DUMPSYNTAX>>;                                                 07390000
LOGICAL PROCEDURE CONSOLESYNTAX;                                        07395000
   BEGIN                                                                07400000
   BYTE POINTER PARMADDR;                                               07405000
   INTEGER TYPE,PARMVALUE;                                              07410000
   IF GETNEXTPARM(,TYPE,PARMVALUE,PARMADDR) THEN                        07415000
      BEGIN                                                             07420000
      IF TYPE <> NUMERICPARM THEN                                       07425000
         PRINTERROR(EXPECTEDNUMBER,PARMADDR)                            07430000
      ELSE IF NOT (MINDRT <= PARMVALUE <= MAXDRT) THEN                  07435000
         PRINTERROR(INVALIDVALUE,PARMADDR)                              07440000
      ELSE                                                              07445000
         CONSOLESYNTAX:=TRUE;                                           07450000
      END  <<DRT PARAMETER>>                                            07455000
   ELSE                                                                 07460000
      PRINTERROR(EXPECTEDPARM);                                         07465000
   END  <<CONSOLESYNTAX>>;                                              07470000
LOGICAL PROCEDURE DUMPDEVSYNTAX;                                        07475000
   BEGIN                                                                07480000
   BYTE POINTER PARMADDR;                                               07485000
   INTEGER TYPE,PARMVALUE;                                              07490000
   IF GETNEXTPARM(DUMPDEVDICT,TYPE,PARMVALUE,PARMADDR) THEN             07495000
      BEGIN  <<PARAMETER SCAN>>                                         07500000
      IF TYPE = DICTIONARYPARM THEN                                     07505000
         DUMPDEVSYNTAX:=TRUE                                            07510000
      ELSE IF TYPE = NUMERICPARM THEN                                   07515000
         BEGIN  <<DRT,UNIT SCAN>>                                       07520000
         IF NOT(MINDRT <= PARMVALUE <= MAXDRT) THEN                     07525000
            PRINTERROR(INVALIDVALUE,PARMADDR);                          07530000
         ELSE IF GETNEXTPARM(,TYPE,PARMVALUE,PARMADDR) THEN             07535000
            BEGIN  <<UNIT>>                                             07540000
            IF TYPE <> NUMERICPARM THEN                                 07545000
               PRINTERROR(EXPECTEDNUMBER,PARMADDR)                      07550000
            ELSE IF NOT (0<=PARMVALUE<=MAXUNIT) THEN                    07555000
               PRINTERROR(INVALIDVALUE,PARMADDR)                        07560000
            ELSE                                                        07565000
               DUMPDEVSYNTAX:=TRUE;                                     07570000
            END  <<UNIT>>                                               07575000
         ELSE                                                           07580000
            DUMPDEVSYNTAX:=TRUE;                                        07585000
         END  <<DRT,UNIT SCAN>>                                         07590000
      ELSE                                                              07595000
         PRINTERROR(INVALIDVALUE,PARMADDR);                             07600000
      END  <<PARAMETER SCAN>>;                                          07605000
   ELSE                                                                 07610000
      PRINTERROR(EXPECTEDPARM);                                         07615000
   END  <<DUMPDEVSYNTAX>>;                                              07620000
LOGICAL PROCEDURE EXPLAINSYNTAX;                                        07625000
   BEGIN                                                                07630000
   INTEGER TYPE;                                                        07635000
   BYTE POINTER PARMADDR;                                               07640000
   IF GETNEXTPARM(COMMANDICT,TYPE,,PARMADDR) THEN                       07645000
      DO                                                                07650000
         IF TYPE <> DICTIONARYPARM THEN                                 07655000
            BEGIN                                                       07660000
            PRINTERROR(UNKNOWNCOMMAND,PARMADDR);                        07665000
            RETURN;                                                     07670000
            END                                                         07675000
      UNTIL NOT GETNEXTPARM(COMMANDICT,TYPE,,PARMADDR);                 07680000
   EXPLAINSYNTAX:=TRUE;                                                 07685000
   END  <<EXPLAINSYNTAX>>;                                              07690000
$PAGE "COMMAND EXECUTOR ROUTINES"                                       07695000
PROCEDURE DUMP(DUMPMODE);                                               07700000
VALUE DUMPMODE;                                                         07705000
INTEGER                                                                 07710000
   DUMPMODE;          <<0 - DUMP TO SERIAL DISC/MAG TAPE>>              07715000
                      <<1 - DUMP TO DISC FILE>>                         07720000
   BEGIN                                                                07725000
   EQUATE                                                               07730000
      DESCLENGTH     = 4,                                               07735000
      VACANT         = %100000,                                         07740000
      DBUFSIZE       = 4096,                                            07745000
      BANKSDUMPEDLOC = %1423,                                           07750000
      BANKLIMIT      = 15,  <<64K/DBUFSIZE-1>>                          07755000
      VHEADERLENGTH  = 7,                                               07760000
      DATASEGMENTID  = 0,                                               07765000
      DUMPSYSDISCID  = 1;                                               07770000
   DEFINE                                                               07775000
      BOOTSEC        = 3D#,                                             07780000
      DSTLOC         = 2D#,                                             07785000
      DBUFNUMSECTOR  = DOUBLE(DBUFSIZE/SECTORSIZE)#,                    07790000
                                                                        07795000
      <<DATA SEGMENT HEADER FORMAT>>                                    07800000
      VID            = DUMPBUF       #,                                 07805000
      VDSEGNUM       = DUMPBUF(1)    #,                                 07810000
      VDSEGLEN       = DUMPBUF(2)    #,                                 07815000
      VDSEGDESC      = DUMPBUF(3)    #,                                 07820000
                                                                        07825000
      <<DISC SECTOR HEADER FORMAT>>                                     07830000
      DID            = DUMPBUF       #,                                 07835000
      DSECTORLEN     = DUMPBUF(1)    #,                                 07840000
      DFIRSTSECNUM   = DUMPBUFD(1)   #,                                 07845000
      DNUMSEC        = DUMPBUFD(2)   #,                                 07850000
                                                                        07855000
      <<DATA SEGMENT TABLE ENTRY>>                                      07860000
      DSABSENT       = DESC0.(0:1)= 1#,                                 07865000
      DSLENGTH       = DESC0.(3:13)  #,                                 07870000
      DSBANKNUM      = DESC2.(12:4)  #,                                 07875000
      DSADDRESS      = DESC3         #,                                 07880000
      DSHIORDERDISC  = DESC2.(12:4)  #,                                 07885000
      DSLORDERDISC   = DESC3         #;                                 07890000
                                                                        07895000
   <<VARIABLES USED BY ALL SUBROUTINES>>                                07900000
   DOUBLE                                                               07905000
      DATASEGMENTSECTOR,NUMSEC,SECTORNUM,SECTORLIMIT;                   07910000
   INTEGER                                                              07915000
      TYPE,PARMVALUE,BANKNUM,I,J,VESTIGE,LASTDATASEG,LENGTH,DSTADDR,    07920000
      HEADR,DELIMNUM,DESC0,DESC1,DESC2,DESC3;                           07925000
   ARRAY DESC(*)=DESC0,DUMPBUF(0:DBUFSIZE);                             07930000
   ARRAY                                                                07935000
      DISCNUMBUFFER(0:9),FLAB(0:76);                                    07940000
   DOUBLE ARRAY                                                         07945000
      DUMPBUFD(*)=DUMPBUF,FLABD(*)=FLAB;                                07950000
                                                                        07955000
   <<VARIABLES USED BY OUTPUTDUMP>>                                     07960000
   EQUATE                                                               07965000
      ENDOFTAPE       = %31;                                            07970000
   DOUBLE                                                               07975000
      DVRSTAT,DFILESECTOR;                                              07980000
   INTEGER                                                              07985000
      STAT=DVRSTAT,NEXTDISCNUM:=0;                                      07990000
                                                                        07995000
   <<VARIABLES USED BY DUMPDSEG>>                                       08000000
   INTEGER                                                              08005000
      COUNT,SEC0=DATASEGMENTSECTOR,SEC1=DATASEGMENTSECTOR+1,            08010000
      STARTSEG=PARMVALUE,ENDSEG;                                        08015000
                                                                        08020000
                                                                        08025000
   <<VARIABLES USED BY DUMPSYSTEMSEGMENT>>                              08030000
   DEFINE                                                               08035000
      SYSTEMSEGMENT      = LOGICAL(DESC2.(11:1))#;                      08040000
                                                                        08045000
   <<VARIABLES USED BY DUMPSTACKS>>                                     08050000
   ARRAY                                                                08055000
      VDSL(0:1023);                                                     08060000
   INTEGER                                                              08065000
      VDSLENGTH;                                                        08070000
   DEFINE                                                               08075000
      STACKDATASEGMENT   = VDSL(I).(3:1)#;                              08080000
   EQUATE                                                               08085000
      VDSL'DST           = 40;                                          08090000
                                                                        08095000
   SUBROUTINE DUMPDISCIO(FUNCTION,TARGET,TCOUNT,SECTOR);                08100000
   VALUE FUNCTION,TCOUNT,SECTOR;                                        08105000
   INTEGER FUNCTION,TCOUNT;                                             08110000
   ARRAY TARGET;                                                        08115000
   DOUBLE SECTOR;                                                       08120000
      BEGIN                                                             08125000
      PERFORMIO(DUMPDISC,FUNCTION,TARGET,TCOUNT,DFILESECTOR);           08130000
      IF <> THEN                                                        08135000
         BEGIN  <<ERROR ON ACCESSING DUMP FILE>>                        08140000
         PRINTSTRING(DUMPDEVICEFAIL);                                   08145000
         ASSEMBLE(EXIT 1);                                              08150000
         END;                                                           08155000
      END  <<DUMPDISCIO>>;                                              08160000
                                                                        08165000
   SUBROUTINE OUTPUTDUMP(TARGET,TCOUNT);                                08170000
   VALUE TCOUNT;                                                        08175000
   ARRAY TARGET;                                                        08180000
   INTEGER TCOUNT;                                                      08185000
   BEGIN                                                                08190000
      IF DUMPMODE = DISCFILEDUMP THEN                                   08195000
         BEGIN  <<DUMP TO DISC FILE>>                                   08200000
         IF DOUBLE(FLNUMRECORDS:=FLNUMRECORDS+1) > FLMAXNUMRECORDS THEN 08205000
            BEGIN  <<END-OF-FILE>>                                      08210000
            PRINTSTRING(EXHAUSTEDUMPFILE);                              08215000
            ASSEMBLE(EXIT 1);                                           08220000
            END;                                                        08225000
         DFILESECTOR:=DOUBLE((FLNUMRECORDS-1)*FLBLOCKSIZE)+FLEXTENTBASE;08230000
         DUMPDISCIO(OUTPUT,TARGET,TCOUNT,DFILESECTOR);                  08235000
         END  <<DUMP FILE MODE>>                                        08240000
      ELSE                                                              08245000
         BEGIN  <<SERIAL DEVICE DUMP MODE>>                             08250000
         DO                                                             08255000
            BEGIN  <<ATTEMPT TO WRITE THE RECORD>>                      08260000
            DVRSTAT:=PERFORMIO(SERIALDEVICE,OUTPUT,TARGET,TCOUNT);      08265000
            IF <> THEN                                                  08270000
               BEGIN  <<I/O PROBLEM>>                                   08275000
               IF STAT = ENDOFTAPE THEN                                 08280000
                  BEGIN                                                 08285000
                  <<WRITE EOF, # OF NEXT DISC, AND 2 EOFS>>             08290000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      08295000
                  DISCNUMBUFFER:=(NEXTDISCNUM:=NEXTDISCNUM+1);          08300000
                  MOVE DISCNUMBUFFER(1):=DISCNUMBUFFER,(9);             08305000
                  PERFORMIO(SERIALDEVICE,OUTPUT,DISCNUMBUFFER,10);      08310000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      08315000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      08320000
                  PERFORMIO(SERIALDEVICE,DEVICECLOSE);                  08325000
                  <<MOUNT NEW DISC, WRITE DISC #>>                      08330000
                  PRINTSTRING(EOTSERIALDEVICE);                         08335000
                  IF CTDUMPDEVTYPE<>TMAGTAPE                   <<03749>>08340000
                    THEN WAITINSERTDISC(1);<<For serial discs>><<03749>>08345000
                  CHANGEDEVICE(,CTDUMPDEVDESC);                         08350000
                  IF CTDUMPDEVTYPE<>TMAGTAPE                   <<03749>>08355000
                    THEN CHECKBACKUP;      <<For serial discs>><<03749>>08360000
                  PERFORMIO(SERIALDEVICE,OUTPUT,DISCNUMBUFFER,10);      08365000
                  END                                                   08370000
               ELSE                                                     08375000
                  BEGIN  <<I/O FAILURE ON SERIAL DEVICE>>               08380000
                  MODE:=INTERACTIVE;                           <<03110>>08385000
                  <<Tell user to use new media and   >>        <<03110>>08390000
                  <<try again                        >>        <<03110>>08395000
                  PRINTSTRING(TRYAGAIN1);                      <<03110>>08400000
                  PRINTSTRING(TRYAGAIN2);                      <<03110>>08405000
                  PRINTSTRING(TRYAGAIN3);                      <<03110>>08410000
                  PRINTSTRING(TRYAGAIN4);                      <<03110>>08415000
                  ASSEMBLE(EXIT 1);                                     08420000
  << Exit back to SDF Mainline with MODE set to INTERACTIVE >> <<03749>>08425000
                  END;                                                  08430000
               END  <<I/O PROBLEM>>;                                    08435000
            END UNTIL STAT <> ENDOFTAPE;                                08440000
         END  <<SERIAL DEVICE DUMP MODE>>;                              08445000
      END  <<OUTPUTDUMP>>;                                              08450000
                                                                        08455000
   SUBROUTINE DUMPDATASEGMENT(DATASEGMENT);                             08460000
   VALUE DATASEGMENT;                                                   08465000
   INTEGER DATASEGMENT;                                                 08470000
      BEGIN                                                             08475000
      <<GET CONTENTS OF THE SEGMENT'S DESCRIPTOR IN THE DATA SEGMENT    08480000
        TABLE.                                                          08485000
      >>                                                                08490000
      GETAREA(DOUBLE(DSTADDR+4*DATASEGMENT),DESC,DESCLENGTH);           08495000
                                                                        08500000
      IF (DATASEGMENT < LASTDATASEG) OR (DESC0 <> VACANT) THEN          08505000
         BEGIN  <<SEGMENT EXISTS>>                                      08510000
         IF DSABSENT OR DSBANKNUM > BANKNUM THEN                        08515000
            BEGIN  <<SEGMENT WAS NOT WRITTEN OUT IN MEMORY DUMP>>       08520000
            <<FORMAT HEADER FIELD>>                                     08525000
            VID:=DATASEGMENTID; VDSEGNUM:=DATASEGMENT;                  08530000
            MOVE VDSEGDESC:=DESC,(4);                                   08535000
            HEADR:=SECTORSIZE;  <<MAKE ROOM FOR HEADER FIELD>>          08540000
            IF (LENGTH:=4*DSLENGTH) = 0 THEN                            08545000
               OUTPUTDUMP(DUMPBUF,VHEADERLENGTH)                        08550000
            ELSE IF DSABSENT THEN                                       08555000
               BEGIN                                                    08560000
               SEC0:=DSHIORDERDISC; SEC1:=DSLORDERDISC;                 08565000
               WHILE LENGTH > 0 DO                                      08570000
                  BEGIN                                                 08575000
                  COUNT:=IF LENGTH>DBUFSIZE THEN DBUFSIZE ELSE LENGTH;  08580000
                  READISC(DUMPBUF(HEADR),COUNT,DATASEGMENTSECTOR);      08585000
                  OUTPUTDUMP(DUMPBUF,COUNT+HEADR);                      08590000
                  HEADR:=0;                                             08595000
                  LENGTH:=LENGTH-DBUFSIZE;                              08600000
                  DATASEGMENTSECTOR:=DATASEGMENTSECTOR-DBUFNUMSECTOR;   08605000
                  END  <<WHILE>>;                                       08610000
               END  <<ABSENT DATA SEGMENT>>                             08615000
            ELSE                                                        08620000
               BEGIN  <<PRESENT DATA SEGMENT>>                          08625000
               WHILE LENGTH > 0 DO                                      08630000
                  BEGIN                                                 08635000
                  COUNT:=IF LENGTH>DBUFSIZE THEN DBUFSIZE ELSE LENGTH;  08640000
                  TOS:=DSBANKNUM; TOS:=DSADDRESS;                       08645000
                  GETAREA(*,DUMPBUF,COUNT);                             08650000
                  DSADDRESS:=DSADDRESS+DBUFSIZE;                        08655000
                  OUTPUTDUMP(DUMPBUF,COUNT);                            08660000
                  LENGTH:=LENGTH-DBUFSIZE;                              08665000
                  END  <<WHILE>>;                                       08670000
               END  <<PRESENT DATA SEGMENT>>;                           08675000
            END  <<DUMPABLE DATA SEGMENT>>;                             08680000
         END  <<SEGMENT EXISTS>>;                                       08685000
      END  <<DUMPDATASEGMENT>>;                                         08690000
   SUBROUTINE DUMPSTACKS;                                               08695000
      BEGIN                                                             08700000
      GETAREA(DOUBLE(DSTADDR+4*VDSL'DST),DESC,DESCLENGTH);              08705000
      VDSLENGTH:=4*DSLENGTH;                                            08710000
      GETAREA(DOUBLE(DSADDRESS),VDSL,VDSLENGTH);                        08715000
      FOR I:=0 UNTIL LASTDATASEG DO                                     08720000
         IF STACKDATASEGMENT THEN DUMPDATASEGMENT(I);                   08725000
      END  <<DUMPSTACKS>>;                                              08730000
                                                                        08735000
   SUBROUTINE DUMPSYSTEMSEGMENTS;                                       08740000
      BEGIN                                                             08745000
      FOR I:=1 UNTIL LASTDATASEG DO                                     08750000
         BEGIN                                                          08755000
         GETAREA(DOUBLE(DSTADDR+4*I),DESC,DESCLENGTH);                  08760000
         IF SYSTEMSEGMENT THEN DUMPDATASEGMENT(I);                      08765000
         END;                                                           08770000
      END  <<DUMPSYSTEMSEGMENTS>>;                                      08775000
                                                                        08780000
    SUBROUTINE DUMPVIRTUALMEMORY;                                       08785000
      BEGIN                                                             08790000
      WHILE GETNEXTPARM(VIRTDICT,TYPE,PARMVALUE,,DELIMNUM) DO           08795000
         IF TYPE = NUMERICPARM THEN                                     08800000
            BEGIN                                                       08805000
            IF DELIMNUM = DASH THEN                                     08810000
               GETNEXTPARM(,,ENDSEG)                                    08815000
            ELSE                                                        08820000
               ENDSEG:=STARTSEG;                                        08825000
            FOR I:=STARTSEG UNTIL ENDSEG DO DUMPDATASEGMENT(I);         08830000
            END  <<NUMERIC PARAMETER>>                                  08835000
         ELSE                                                           08840000
            CASE PARMVALUE-1 OF    <<KEYWORD PARAMETER>>                08845000
               BEGIN                                                    08850000
               FOR I:=1 UNTIL LASTDATASEG DO DUMPDATASEGMENT(I);<<ALL>> 08855000
               DUMPSTACKS;                                   <<STACKS>> 08860000
               DUMPSYSTEMSEGMENTS;                           <<SYSTEM>> 08865000
               END  <<CASE>>;                                           08870000
      END  <<DUMPVIRTUALMEMORY>>;                                       08875000
                                                                        08880000
   SUBROUTINE DUMPSYSDISC;                                              08885000
      BEGIN                                                             08890000
      WHILE GETNEXTPARM(,,,,DELIMNUM,,SECTORNUM) DO                     08895000
         BEGIN                                                          08900000
         <<FORMAT HEADER RECORD>>                                       08905000
         DID:=DUMPSYSDISCID; DSECTORLEN:=SECTORSIZE;                    08910000
         DFIRSTSECNUM:=SECTORNUM;                                       08915000
         IF DELIMNUM = DASH THEN                                        08920000
            GETNEXTPARM(,,,,,,SECTORLIMIT)                              08925000
         ELSE                                                           08930000
            SECTORLIMIT:=SECTORNUM;                                     08935000
         DNUMSEC:=NUMSEC:=SECTORLIMIT-SECTORNUM+1D;                     08940000
         HEADR:=SECTORSIZE;                                             08945000
         <<WRITE OUT THE SECTORS>>                                      08950000
         WHILE NUMSEC >= DBUFNUMSECTOR DO                               08955000
            BEGIN                                                       08960000
            <<WRITE OUT A BUFFERSIZE WORTH OF THE SECTORS>>             08965000
            READISC(DUMPBUF(HEADR),DBUFSIZE-HEADR,SECTORNUM);           08970000
            OUTPUTDUMP(DUMPBUF,DBUFSIZE);                               08975000
            HEADR:=0;                                                   08980000
            NUMSEC:=NUMSEC-DBUFNUMSECTOR;                               08985000
            SECTORNUM:=SECTORNUM+DBUFNUMSECTOR;                         08990000
            END;                                                        08995000
         IF (VESTIGE:=INTEGER(NUMSEC)*SECTORSIZE) > 0 THEN              09000000
            BEGIN                                                       09005000
            <<WRITE OUT THE REMAINING SECTORS (PARTIAL RECORD>>         09010000
            READISC(DUMPBUF(HEADR),VESTIGE,SECTORNUM);                  09015000
            OUTPUTDUMP(DUMPBUF(HEADR),VESTIGE);                         09020000
            END;                                                        09025000
         END  <<WHILE>>;                                                09030000
      END  <<DUMPSYSDISC>>;                                             09035000
                                                               <<03749>>09040000
<< ** Procedure DUMP Mainline ** >>                            <<03749>>09045000
                                                                        09050000
   <<REWIND THE DUMP DEVICE>>                                           09055000
   IF DUMPMODE = DISCFILEDUMP THEN                                      09060000
      MOVE FLAB:=OLDFLAB,(FLABLEN)                                      09065000
   ELSE                                                                 09070000
      BEGIN                                                             09075000
      IF CTDUMPDEVDESC = 0D THEN                                        09080000
         BEGIN                                                          09085000
         PRINTSTRING(NODUMPDEVICE);                                     09090000
         MODE:=INTERACTIVE; <<If no dump device is configured>><<03749>>09095000
                            <<then go into interactive mode  >><<03749>>09100000
         RETURN;                                                        09105000
         END;                                                           09110000
      CHANGEDEVICE(,CTDUMPDEVDESC);                                     09115000
      IF < THEN                                                         09120000
         BEGIN  <<NOT A SERIAL DEVICE>>                                 09125000
         PRINTSTRING(BADEVICE);                                         09130000
         RETURN;                                                        09135000
         END;                                                           09140000
      <<DETERMINE IF A BACKUP SDF DISC>>                                09145000
      IF CTDUMPDEVTYPE <> TMAGTAPE THEN CHECKBACKUP;                    09150000
      END;                                                              09155000
                                                                        09160000
   IF (CTSYSDISCDEVTYP=T'CS'80)AND(CTSYSDISCSUBTYP=STYPE'A9140)<<03605>>09165000
   THEN BEGIN                                                  <<03605>>09170000
        SAVEAREASECTORSIZE:=QUADRUPLESECTORSIZE;               <<03605>>09175000
        <<A LINUS SECTOR IS 4 TIMES AS LARGE AS A DISC>>       <<03605>>09180000
        END                                                    <<03605>>09185000
   ELSE BEGIN                                                  <<03605>>09190000
        SAVEAREASECTORSIZE:=SECTORSIZE;                        <<03605>>09195000
        END;                                                   <<03605>>09200000
   <<DUMP MAIN MEMORY>>                                                 09205000
   IF NOT GETNEXTPARM(,TYPE,BANKNUM) OR TYPE <> NUMERICPARM             09210000
      OR LOGICAL(BANKNUM) > (CTNUMBERBANKS-1) THEN                      09215000
      BANKNUM:=CTNUMBERBANKS-1;                                         09220000
   GETNEXTPARM;  <<FLUSH SEMICOLON>>                                    09225000
   IF (CTDUMPDEVTYPE=TMAGTAPE) AND (CTDUMPDEVSUBTYP=STYPE7976) <<02669>>09230000
    THEN  << WE MUST SET DENSITY TO 1600 BPI ON HP7976 >>      <<02669>>09235000
    BEGIN  << ACTIONS TO SET DENSITY TO 1600BPI ON 7976 >>     <<02669>>09240000
     PERFORMIO(SERIALDEVICE,CLEAR7976,DUMPBUF,DBUFSIZE);       <<02669>>09245000
     PERFORMIO(SERIALDEVICE,SETDENSITY1600,DUMPBUF,DBUFSIZE);  <<02669>>09250000
    END;                                                       <<02669>>09255000
   IF (CTDUMPDEVTYPE=TMAGTAPE) AND (CTDUMPDEVSUBTYP=STYPE7974  <<K7526>>09260000
      OR CTDUMPDEVSUBTYP=STYPE7978)                            <<K7526>>09265000
    THEN  << WE MUST SET DENSITY TO 1600 BPI ON HP7974/86 >>   <<K7526>>09270000
    BEGIN  << ACTIONS TO SET DENSITY TO 1600BPI ON 7976 >>     <<K7526>>09275000
     PERFORMIO(SERIALDEVICE,CLEAR7976,DUMPBUF,DBUFSIZE);       <<K7526>>09280000
     PERFORMIO(SERIALDEVICE,IMMEDREPORT,DUMPBUF,DBUFSIZE);     <<K7526>>09285000
     PERFORMIO(SERIALDEVICE,SETDENSITY1600,DUMPBUF,DBUFSIZE);  <<K7526>>09290000
    END;                                                       <<K7526>>09295000
   FOR I:=0 UNTIL BANKNUM DO                                            09300000
      FOR J:=0 UNTIL BANKLIMIT DO  <<DUMP A BANK>>                      09305000
         BEGIN  <<WRITE ONE DUMP RECORD>>                               09310000
         TOS:=I; TOS:=DBUFSIZE*J;       <<SOURCE BANK AND ADDRESS>>     09315000
         GETAREA(*,DUMPBUF,DBUFSIZE);                                   09320000
         IF I=0 AND J=0 THEN DUMPBUF(BANKSDUMPEDLOC):=BANKNUM+1;        09325000
         OUTPUTDUMP(DUMPBUF,DBUFSIZE);                                  09330000
         END;                                                           09335000
                                                                        09340000
   <<DUMP VIRTUAL MEMORY AND/OR SYSTEM DISC SECTORS>>                   09345000
   IF GETNEXTPARM(DUMPDICT,TYPE,PARMVALUE) THEN                         09350000
      IF NOSYSTEMDISC THEN                                              09355000
         PRINTSTRING(BADSYSTEMDISC)                                     09360000
      ELSE                                                              09365000
         BEGIN                                                          09370000
         PERFORMIO(SERIALDEVICE,WRITEOF);                               09375000
         <<GET DATA SEGMENT TABLE LOCATION>>                            09380000
         GETAREA(DSTLOC,DSTADDR);                                       09385000
         GETAREA(DOUBLE(DSTADDR),LASTDATASEG);                          09390000
         DO CASE PARMVALUE-1 OF                                         09395000
            BEGIN                                                       09400000
            DUMPVIRTUALMEMORY;             <<DSEG>>                     09405000
            DUMPSYSDISC;                   <<DISC>>                     09410000
            END UNTIL NOT GETNEXTPARM(DUMPDICT,TYPE,PARMVALUE);         09415000
         END;                                                           09420000
   IF DUMPMODE = DISCFILEDUMP THEN  <<UPDATE DUMP FILE LABEL>>          09425000
      DUMPDISCIO(OUTPUT,FLAB,FLABLEN,CTDUMPFILE)                        09430000
   ELSE                                                                 09435000
    BEGIN                                                      <<B8100>>09440000
      PERFORMIO(SERIALDEVICE,REWIND);                          <<B8100>>09445000
      PERFORMIO(SERIALDEVICE,DEVICECLOSE);                              09450000
    END;                                                       <<B8100>>09455000
   END  <<DUMP>>;                                                       09460000
LOGICAL PROCEDURE CHANGECONSOLE;                                        09465000
   BEGIN                                                                09470000
   DOUBLE DESCRIPTOR;                                                   09475000
   INTEGER TYPE,DESC0=DESCRIPTOR,DESC1=DESCRIPTOR+1;                    09480000
   INTEGER DRT;                                                         09485000
   GETNEXTPARM(,,DRT);                                                  09490000
     IF IDENTIFYDEVICE(DRT&LSL(7),DESCRIPTOR) AND              <<03017>>09495000
        DESCTYPE=TCONSOLE THEN                                 <<03017>>09500000
      BEGIN                                                             09505000
      CHANGECONSOLE:=TRUE;                                              09510000
      CHANGEDEVICE(,,,,DESCRIPTOR);                                     09515000
      END                                                               09520000
   ELSE                                                                 09525000
      PRINTSTRING(BADEVICE);                                            09530000
   END  <<CHANGECONSOLE>>;                                              09535000
LOGICAL PROCEDURE CHANGEDUMPDEV(DUMPMODE);                              09540000
INTEGER                                                                 09545000
   DUMPMODE;          <<0 - USE SERIAL DISC/MAG TAPE>>                  09550000
                      <<1 - USE DISC FILE>>                             09555000
   BEGIN                                                                09560000
   DOUBLE DESCRIPTOR;                                                   09565000
   LOGICAL SERTYPE,DRT,UNIT:=0;                                         09570000
   INTEGER PARMVALUE,TYPE,DESC0=DESCRIPTOR,DESC1=DESCRIPTOR+1;          09575000
   GETNEXTPARM(,TYPE,DRT);                                              09580000
   IF TYPE=NUMERICPARM THEN                                             09585000
      BEGIN                                                             09590000
      GETNEXTPARM(,,UNIT);                                              09595000
     IF IDENTIFYDEVICE(DRT&LSL(7) LOR UNIT,DESCRIPTOR) THEN    <<03017>>09600000
         BEGIN                                                          09605000
         CHANGEDEVICE(,DESCRIPTOR);                                     09610000
         IF = THEN                                                      09615000
            BEGIN  <<VALID DEVICE>>                                     09620000
            DUMPMODE:=SERIALDEVICEDUMP;                                 09625000
            CTDUMPDEVDESC:=DESCRIPTOR;                                  09630000
            CHANGEDUMPDEV:=TRUE;                                        09635000
            END                                                         09640000
         ELSE                                                           09645000
            BEGIN  <<INVALID DEVICE>>                                   09650000
            IF DESCTYPE = TCONSOLE THEN INITADCC(0);                    09655000
            PRINTSTRING(BADEVICE);                                      09660000
            END;                                                        09665000
         END  <<IDENTIFIED DEVICE>>                                     09670000
      ELSE                                                              09675000
         PRINTSTRING(BADEVICE);                                         09680000
      END  <<NUMERIC PARAMETER>>                                        09685000
   ELSE                                                                 09690000
      IF CTDUMPFILE <> 0D THEN                                          09695000
         BEGIN  <<DUMP TO DISC DUMP FILE>>                              09700000
         CHANGEDUMPDEV:=TRUE;                                           09705000
         DUMPMODE:=DISCFILEDUMP;                                        09710000
         END                                                            09715000
      ELSE                                                              09720000
         PRINTSTRING(NODUMPFILEXTANT);                                  09725000
   END  <<CHANGEDUMPDEV>>;                                              09730000
PROCEDURE EXPLAIN;                                                      09735000
   BEGIN                                                                09740000
   <<EXPLAINS THE SYNTAX OF THE COMMANDS.                               09745000
   >>                                                                   09750000
   INTEGER I;                                                           09755000
   BYTE POINTER DEFN,NEXT;                                              09760000
                                                                        09765000
   IF NOT GETNEXTPARM(COMMANDICT,,,,,DEFN) THEN                         09770000
      BEGIN   <<LIST ALL COMMANDS>>                                     09775000
      @DEFN:=@COMMANDICT;                                               09780000
      FOR I:=1 UNTIL MAXCOMMANDNUM-1 DO                                 09785000
         BEGIN   <<LIST ONE COMMAND AT A TIME>>                         09790000
         @NEXT:=@DEFN+INTEGER(DEFN(1))+2;                               09795000
         DO                                                             09800000
            BEGIN                                                       09805000
            <<PRINT A LINE OF THE COMMAND'S EXPLANATION>>               09810000
            @NEXT:=@NEXT+PRINTSTRING(NEXT);                             09815000
            IF NEXT(2)="DUMPFILE" THEN                                  09820000
               BEGIN  <<CONTINUATION OF DUMP DESCRIPTION>>              09825000
               @DEFN:=@DEFN+INTEGER(DEFN);                              09830000
               @NEXT:=@NEXT+10;                                         09835000
               END;                                                     09840000
            END UNTIL NEXT = "#";                                       09845000
         @DEFN:=@DEFN+INTEGER(DEFN);                                    09850000
         END;                                                           09855000
      END  <<LIST ALL COMMANDS>>                                        09860000
   ELSE                                                                 09865000
      DO   <<LIST ONLY SELECTED PARAMETERS>>                            09870000
         DO                                                             09875000
            BEGIN                                                       09880000
            <<PRINT A LINE OF THE COMMAND'S EXPLANATION>>               09885000
            @DEFN:=@DEFN+PRINTSTRING(DEFN);                             09890000
            IF DEFN(2)="DUMPFILE" THEN @DEFN:=@DEFN+10; <<CONT COMMAND>>09895000
            END UNTIL DEFN = "#"                                        09900000
         UNTIL NOT GETNEXTPARM(COMMANDICT,,,,,DEFN);                    09905000
   END  <<EXPLAIN>>;                                                    09910000
PROCEDURE WARMSTART;                                                    09915000
   BEGIN                                                                09920000
   INTEGER SUBTYPE;                                                     09925000
   SUBTYPE:=CTSYSDISCSUBTYPE;                                           09930000
   TOS:=IF SUBTYPE = R7905 OR SUBTYPE = R7906 THEN 1 ELSE 0;            09935000
   TOS:=CTSYSDISCDRT;                                                   09940000
   ASSEMBLE(STRT);                                                      09945000
   END  <<WARMSTART>>;                                                  09950000
$PAGE "MAINLINE."                                                       09955000
IF (MODE:=RUNPARM) = SYNTAXCHECKING THEN                                09960000
   SYNTAXINITIALIZE                                                     09965000
ELSE                                                                    09970000
   BEGIN                                                                09975000
   INITIALIZE;                                                          09980000
   TOS:=ABORTSREGISTER; SET(S);                                         09985000
   END;                                                                 09990000
WHILE FOREVER DO                                                        09995000
   BEGIN                                                                10000000
   GETNEXTCOMMAND(COMMANDBUF);                                          10005000
   CURRENTPARM:=0;                                                      10010000
   COMMANDTYPE:=                                                        10015000
      MYCOMMAND(COMMANDBUF,DELIM,MAXPARMS,NUMPARMS,DPARMS,COMMANDICT);  10020000
   IF >= THEN                                                           10025000
      BEGIN  <<RECOGNIZABLE COMMAND>>                                   10030000
      CASE COMMANDTYPE-1 OF                                             10035000
         BEGIN                                                          10040000
         <<SYNTAX CHECK THE COMMAND BEFORE EXECUTING IT>>               10045000
         TOS:=DUMPSYNTAX;                     <<DUMP>>                  10050000
         TOS:=TRUE;                           <<DUMPFILE>>              10055000
         TOS:=TRUE;                           <<COMMENT>>               10060000
         TOS:=CONSOLESYNTAX;                  <<CONSOLE>>               10065000
         TOS:=TRUE;                           <<DEBUG>>                 10070000
         TOS:=DUMPDEVSYNTAX;                  <<DUMPDEV>>               10075000
         TOS:=TRUE;                           <<HALT>>                  10080000
         TOS:=EXPLAINSYNTAX;                  <<HELP>>                  10085000
         TOS:=TRUE;                           <<INTERACTIVE>>           10090000
         TOS:=TRUE;                           <<WARMSTART>>             10095000
         END  <<CASE>>;                                                 10100000
      IF TOS AND MODE <> SYNTAXCHECKING THEN                            10105000
         BEGIN                                                          10110000
         <<EXECUTE COMMAND>>                                            10115000
         CURRENTPARM:=0;                                                10120000
         CASE COMMANDTYPE-1 OF                                          10125000
            BEGIN  <<INVOKE THE COMMAND EXECUTOR>>                      10130000
            DUMP(DUMPMODE);                   <<DUMP>>                  10135000
            ;                                 <<DUMMY>>                 10140000
            ;                                 <<COMMENT>>               10145000
                                              <<CONSOLE>>               10150000
            IF NOT CHANGECONSOLE THEN MODE:=INTERACTIVE;                10155000
            HELP;                             <<DEBUG>>                 10160000
            IF NOT CHANGEDUMPDEV(DUMPMODE) THEN<<DUMPDEV>>              10165000
               MODE:=INTERACTIVE;                                       10170000
            ASSEMBLE(HALT 0);                 <<HALT>>                  10175000
            EXPLAIN;                          <<HELP>>                  10180000
            MODE:=INTERACTIVE;                <<INTERACTIVE>>           10185000
            WARMSTART;                        <<WARMSTART>>             10190000
            END  <<CASE STATEMENT>>;                                    10195000
         END  <<COMMAND EXECUTOR>>                                      10200000
      END  <<RECOGNIZABLE COMMAND>>                                     10205000
   ELSE                                                                 10210000
      PRINTERROR(UNKNOWNCOMMAND)  <<UNRECOGNIZABLE COMMAND>>;           10215000
   END  <<COMMAND INTERPRETOR>>;                                        10220000
END  <<MAINLINE>>;                                                      10225000
