$CONTROL NOWARN,USLINIT,MAP,CODE,MAIN=SDFMAINLINE                       00010000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1976. ",            & 00012000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00014000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00016000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00018000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00020000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00022000
$TITLE "GLOBAL DATA DEFINITIONS."                                       00024000
BEGIN                                                                   00026000
                                                                        00028000
                                                                        00030000
<<-----------------------------------------------------------------     00032000
          SOFTWARE DUMP FACILITY MAINLINE                               00034000
----------------------------------------------------------------->>     00036000
                                                                        00038000
                                                                        00040000
<<* * * MISCELLANEOUS DEFINITIONS * * *>>                               00042000
                                                                        00044000
INTEGER ARRAY DELTAQ(*)=Q-0;                                            00046000
LOGICAL STAT=Q-1;                                                       00048000
LOGICAL RETURNP=Q-2;  <<RETURN POINTER IN STACK MARKER>>                00050000
LOGICAL PMAP=Q-4;     <<OPTION VARIABLE PARAMETER MAP>>                 00052000
INTEGER XREG=X;                                                         00054000
INTEGER S0=S-0,S1=S-1,S2=S-2,S3=S-3,S4=S-4,S5=S-5;                      00056000
POINTER SP0=S-0;                                                        00058000
INTEGER QM0=Q-0,QM5=Q-5,QM7=Q-7;                                        00060000
LOGICAL LS0=S-0, LS1=S-1;                                      <<03017>>00062000
BYTE BS0=S-0,BS1=S-1;                                                   00064000
BYTE POINTER BPS0=S-0,BPS1=S-1;                                         00066000
DOUBLE DS3=S-3,DS6=S-6;                                                 00068000
INTEGER RUNPARM=Q-4;                                                    00070000
LOGICAL SAVEAREASECTORSIZE;  <<MAY BE 128 FOR DISCS OR>>       <<03605>>00072000
                             <<512 FOR LINUS CARTRIDGE TAPE>>  <<03605>>00074000
                                                                        00076000
EQUATE                                                                  00078000
      RECSIZE         = 72,                                             00080000
   SECTORSIZE        = 128,                                             00082000
   QUADRUPLESECTORSIZE = 512,   <<LINUS SECTOR IS 512 WORDS>>  <<03605>>00084000
   DEVICECLOSE       = 4,                                               00086000
   WRITEOF           = 6,                                               00088000
   FORWARDSPACEFILE  = 7,                                               00090000
   SETDENSITY1600    = 16,  << DENSITY FOR DUMP TO 7976 >>     <<02669>>00092000
   CLEAR7976         = 17,  << 7976 DVR CLEAR FUNCTION  >>     <<02669>>00094000
   CARRIAGERETURN    = %15,                                             00096000
   MAXBANK           = 15,                                              00098000
   MAXUNIT           = 15,                                              00100000
   MAXDRT          = %777,                                     <<03749>>00102000
   MINDRT            = 4,                                               00104000
   FOREVER           = TRUE,                                            00106000
   CCG               = 0,                                               00108000
   CCL               = 1,                                               00110000
   CCE               = 2;                                               00112000
DEFINE                                                                  00114000
   CARRYBIT          = STAT.(5:1)#,                                     00116000
   ASMB     =ASSEMBLE#,                                        <<03605>>00118000
   CONDITIONCODE     = STAT.(6:2)#;                                     00120000
INTEGER POINTER                                                         00122000
   CONTEXTBASE      = 3;                                                00124000
                                                                        00126000
                                                                        00128000
<<* * *  MESSAGE NUMBERS * * *>>                                        00130000
                                                                        00132000
EQUATE                                                                  00134000
   MOUNTNEWPACK     = 55,                                               00136000
   FATALERROR       = 56,                                               00138000
   SOFTWARERROR     = 57,                                               00140000
   BADPACKFORMAT    = 58,                                               00142000
   SYSTEMDISCERR    = 59,                                               00144000
   CHECKSUMERR      = 60,                                               00146000
   HARDWARERRORMSG  = 61,                                               00148000
   POWERFAILMSG     = 62,                                               00150000
   SYSDISCDRT       = 63,                                               00152000
   SERIALDISCERR    = 64,                                               00154000
   INVALIDNUM       = 65,                                               00156000
   INVALIDEV        = 66,                                               00158000
   INVALIDISC       = 67,                                               00160000
   ENTERSUBTYPE     = 68;                                               00162000
                                                                        00164000
                                                                        00166000
<<* * * PERFORMIO LOGICAL DEVICES * * *>>                               00168000
                                                                        00170000
EQUATE                                                                  00172000
   SYSTEMDISC       = 1,                                                00174000
   SERIALDEVICE     = 2,                                                00176000
   COMMANDISC       = 3,                                                00178000
   DUMPDISC         = 4;                                                00180000
                                                                        00182000
                                                                        00184000
<<* * * DRIVER FUNCTION CODES * * *>>                                   00186000
                                                                        00188000
EQUATE                                                                  00190000
   INPUT            = 0,                                                00192000
   OUTPUT           = 1,                                                00194000
   INSERTDISC       = 2;                                                00196000
                                                                        00198000
                                                                        00200000
<<* * * PERFORMIO RETURN STATUS * * *>>                                 00202000
                                                                        00204000
EQUATE                                                                  00206000
   SUCCESSFULIO     = 1,                                                00208000
   BADIO            = 4;                                                00210000
                                                                        00212000
                                                                        00214000
                                                                        00216000
<<* * * DEVICE TYPES AND SUBTYPES * * *>>                               00218000
                                                                        00220000
EQUATE                                                                  00222000
   T13037           = 0,    <<DISCS USING 13037 CONTROLLER>>            00224000
   TFLEXIBLE        = 2,                                                00226000
   TCONSOLE         = 16,                                               00228000
   T'CS'80      =  3,    <<TYPE FOR COMMAND SET 80 DEVICES>>   <<03605>>00230000
   STYPE'A9140  =  0,    <<SUBTYPE FOR LINUS CARTRIDGE TAPE>>  <<03605>>00232000
   TMAGTAPE         = 24,                                      <<02669>>00234000
   STYPE7976        =  1;                                      <<02669>>00236000
                                                                        00238000
EQUATE                                                                  00240000
   R7905            = 4,                                                00242000
   F7905            = 5,                                                00244000
   A7905            = 6,                                                00246000
   FHDISCREPLACEMENT= 7,                                                00248000
   A7920            = 8,                                                00250000
   A7925            = 9,                                                00252000
   R7906            = 10,                                               00254000
   F7906            = 11,                                               00256000
   A7906            = 12;                                               00258000
                                                                        00260000
                                                                        00262000
<<* * * DESC FIELDS * * *>>                                             00264000
                                                                        00266000
   DEFINE                                                               00268000
      DESCDRT             = DESC0.(0:9)     #,                 <<03017>>00270000
      DESCSUBTYPE         = DESC0.(9:4)     #,                 <<03017>>00272000
      DESCUNIT            = DESC0.(13:3)    #,                 <<03017>>00274000
      DESCTYPE            = DESC1           #;                          00276000
                                                                        00278000
                                                                        00280000
<<* * * MODES * * *>>                                                   00282000
                                                                        00284000
<<SDF EXECUTION MODES>>                                                 00286000
EQUATE                                                                  00288000
   SYNTAXCHECKING    = 0,                                               00290000
   COMMAND           = 1,                                               00292000
   INTERACTIVE       = 2;                                               00294000
                                                                        00296000
<<DUMP MODE>>                                                           00298000
EQUATE                                                                  00300000
                                                                        00302000
   <<VARIABLES USED BY DUMPSYSDISC>>                                    00304000
   SERIALDEVICEDUMP  = 0,                                               00306000
   DISCFILEDUMP      = 1;                                               00308000
                                                                        00310000
INTEGER                                                                 00312000
   MODE,DUMPMODE;                                                       00314000
INTEGER                                                                 00316000
   RECORDCOUNT:=0;                                                      00318000
LOGICAL                                                                 00320000
   NOSYSTEMDISC;                                                        00322000
                                                                        00324000
<<* * * COMMAND PROCESSING PARAMETERS * * *>>                           00326000
EQUATE                                                                  00328000
   <<VALUES RETURNED BY GETNEXTPARM>>                                   00330000
   KEYWORDPARM        = 0,                                              00332000
   DICTIONARYPARM     = 1,                                              00334000
   ALPHANUMERICPARM   = 2,                                              00336000
   NUMERICPARM        = 3,                                              00338000
   NULLPARM           = 4,                                              00340000
   INVALIDPARM        = 5,                                              00342000
                                                                        00344000
   MAXCOMMANDNUM      = 10,                                             00346000
   MAXPARMS           = 40,                                             00348000
   MAXPARMLENGTH      = 8,                                              00350000
   COMMA              = 0,                                              00352000
   DASH               = 1,                                              00354000
   EQUAL              = 2,                                              00356000
   SEMICOLON          = 3,                                              00358000
   CR                 = 4;                                              00360000
                                                                        00362000
                                                                        00364000
BYTE ARRAY                                                              00366000
   DELIM(0:4):=",-=;",%15;                                              00368000
                                                                        00370000
INTEGER                                                                 00372000
   COMMANDTYPE;                                                         00374000
                                                                        00376000
                                                                        00378000
<<* * * VARIABLES IMPLICITLY ACCESSED BY LOW LEVEL PROCEDURES * * *>>   00380000
  << SDFMAP  - STORAGE MAP RELATED >>                          <<03017>>00382000
  <<===============================>>                          <<03017>>00384000
                                                               <<03017>>00386000
EQUATE                                                         <<03017>>00388000
     MEMORY        = 1,                                        <<03017>>00390000
     SDF'FILE      = 2,                                        <<03017>>00392000
     MAPENTRYSIZE  = 8;    <<RECORD LENGTH IN WORDS>>          <<03017>>00394000
                                                               <<03017>>00396000
EQUATE      <<FIELDS IN MAP RECORDS>>                          <<03017>>00398000
     SRCMEDIA      = 0,    <<SOURCE WAS FROM MEM,DISC, ETC>>   <<03017>>00400000
     STGMEDIA      = 1,    <<STORAGE IS ON DISC,MEM,ETC.>>     <<03017>>00402000
   DSRC'START      = 1,    <<SOURCE START ADDRESS>>            <<03017>>00404000
     SRC'START'HI  = 2,                                        <<03017>>00406000
     SRC'START'LO  = 3,                                        <<03017>>00408000
   DSRC'END        = 2,    <<SOURCE END ADDRESS>>              <<03017>>00410000
     SRC'END'HI    = 4,                                        <<03017>>00412000
     SRC'END'LO    = 5,                                        <<03017>>00414000
   DSTG            = 3,    <<STORAGE ADDRESS>>                 <<03017>>00416000
     STG'HI        = 6,                                        <<03017>>00418000
     STG'LO        = 7;                                        <<03017>>00420000
                                                               <<03017>>00422000
LOGICAL                                                        <<03017>>00424000
     SDF'MAP'BUFFER'LOADED := FALSE;                           <<03017>>00426000
                           <<SET TO TRUE WHEN A COPY OF THE>>  <<03017>>00428000
                           <<STORAGE MAP HAS BEEN READ>>       <<03017>>00430000
                                                               <<03017>>00432000
ARRAY SDFMAPBUFFER (0:127);                                    <<03017>>00434000
     <<GLOBAL BUFFER FOR SDF "STORAGE" MAP >>                  <<03017>>00436000
                                                               <<03017>>00438000
DEFINE SDFMAP'MAXBANK = SDFMAPBUFFER(36)#;                     <<03017>>00440000
   <<BANK NUMBER OF UPPER MEMORY BOUND >>                      <<03017>>00442000
                                                               <<03017>>00444000
DOUBLE ARRAY                                                            00446000
   DPARMS(0:MAXPARMS);                                                  00448000
ARRAY                                                                   00450000
   PARMS(*)=DPARMS;                                                     00452000
BYTE ARRAY                                                              00454000
   COMMANDBUF(0:80),BUF(0:80);                                          00456000
INTEGER                                                                 00458000
   NUMPARMS,CURRENTPARM;                                                00460000
POINTER                                                                 00462000
   CONFIG;                                                              00464000
DOUBLE POINTER                                                          00466000
   CONFIGD=CONFIG;                                                      00468000
BYTE POINTER                                                            00470000
   COMMANDEFN,BUFB:=@BUF;                                               00472000
BYTE ARRAY                                                              00474000
   COMMANDICT(0:1034):=                                                 00476000
   23, 4, "DUMP", <<LENGTH 174>>                                        00478000
       ">DUMP [BANK NUM]",                                              00480000
     <<" [;DSEG=SEG...[,SEG]]  [;DISC=ITEM...[,ITEM]]",>>"#",           00482000
     <<" WHERE:#",>>                                                    00484000
     <<"  SEG  = ALL#",>>                                               00486000
     <<"         STACKS#",>>                                            00488000
     <<"         SYSTEM#",>>                                            00490000
     <<"         SEG NUMBER#",>>                                        00492000
     <<"         SEG NUMBER - SEG NUMBER#",>>                           00494000
   50, 8, "DUMPFILE",  <<CONTINUATION OF DEFINITION FOR DUMP COMMAND>>  00496000
     <<"  ITEM = SYS DISC SECTOR#",>>                                   00498000
     <<"         SYS DISC SECTOR - SYS DISC SECTOR#",>>                 00500000
       " DUMPS MAIN MEMORY",                                            00502000
     <<", VIRTUAL MEMORY, AND/OR SYSTEM DISC AREAS#",>>                 00504000
       " TO THE DUMP DEVICE.##",                                        00506000
   58, 7, "COMMENT",                                                    00508000
       ">COMMENT <STRING>#",                                            00510000
       " COMMENT COMMANDS ARE IGNORED##",                               00512000
   57, 7, "CONSOLE",                                                    00514000
       ">CONSOLE DRT#",                                                 00516000
       " CHANGES THE CONSOLE'S DRT NUMBER##",                           00518000
   51, 5, "DEBUG",                                                      00520000
       ">DEBUG#",                                                       00522000
       " ENTERS THE HELP DEBUGGING FACILITY##",                         00524000
   83, 7, "DUMPDEV",                                                    00526000
       ">DUMPDEV [DRT  [,UNIT]]#",                                      00528000
     <<"         [DISC]#", >>                                           00530000
       " CHANGES THE DUMP DEVICE'S DRT AND UNIT NUMBERS.",              00532000
     <<" IS SPECIFIED, THE DUMP FILE NAMED IN THE DUMPFILE COMMAND#",>> 00534000
     <<" WILL BE USED",>>                                               00536000
       "##",                                                            00538000
   47, 4, "HALT",                                                       00540000
       ">HALT#",                                                        00542000
       " CAUSES SDF TO HALT ITS EXECUTION##",                           00544000
  173, 4, "HELP",                                                       00546000
       ">HELP [COMMAND NAME] [,COMMAND NAME] ... [,COMMAND NAME]#",     00548000
       " PRINTS A BRIEF EXPLANATION OF THE SPECIFIED COMMANDS.  IF#",   00550000
       " NO COMMAND NAME IS INPUT, THEN LIST ALL COMMANDS##",           00552000
   72, 11, "INTERACTIVE",                                               00554000
       ">INTERACTIVE#",                                                 00556000
       " OBTAINS REMAINING COMMANDS FROM THE CONSOLE##",                00558000
   44, 9, "WARMSTART",                                                  00560000
       ">WARMSTART#",                                                   00562000
       " INITIATES WARMSTART##",                                        00564000
   0;                                                                   00566000
                                                                        00568000
                                                                        00570000
<<* * * SYNTAX CHECKING PARAMETERS * * *>>                              00572000
                                                                        00574000
<<FCLOSE>>                                                              00576000
EQUATE                                                                  00578000
   NOCHANGE           = 0,                                              00580000
   SAVE               = 1,                                              00582000
   PURGE              = 4,                                              00584000
   NOSECURITY         = 0;                                              00586000
<<FOPTIONS>>                                                            00588000
EQUATE                                                                  00590000
   F1                 = 6,                                              00592000
   FILE               = 0,                                              00594000
   NOFILE             = 1,                                              00596000
   F2                 = 2,                                              00598000
   NOCCTL             = 0,                                              00600000
   CCTL               = 1,                                              00602000
   F3                 = 2,                                              00604000
   FIXED              = 0,                                              00606000
   VARYABLE           = 1,                                              00608000
   UNDEFINED          = 2,                                              00610000
   F4                 = 3,                                              00612000
   FILENAME           = 0,                                              00614000
   STDLIST            = 1,                                              00616000
   NEWPASS            = 2,                                              00618000
   OLDPASS            = 3,                                              00620000
   STDIN              = 4,                                              00622000
   STDINX             = 5,                                              00624000
   NULL               = 6,                                              00626000
   F5                 = 1,                                              00628000
   BYENARY            = 0,                                              00630000
   ARSCII             = 1,                                              00632000
   F6                 = 2,                                              00634000
   NEWFILE            = 0,                                              00636000
   OLDSYSTEMFILE      = 1,                                              00638000
   TEMPORARYFILE      = 2,                                              00640000
   OLDUSERFILE        = 3;                                              00642000
                                                                        00644000
<<AOPTIONS>>                                                            00646000
EQUATE                                                                  00648000
   A1                 = 8,                                              00650000
   BUFFERING          = 0,                                              00652000
   NOBUFFERING        = 1,                                              00654000
   A2                 = 2,                                              00656000
   DEFAULTACCESS      = 0,                                              00658000
   EXCLUSIVE          = 1,                                              00660000
   SEMIEXCLUSIVE      = 2,                                              00662000
   SHARE              = 3,                                              00664000
   A3                 = 6,                                              00666000
   READONLY           = 0,                                              00668000
   WRITEONLY          = 1,                                              00670000
   WRITESAVEONLY      = 2,                                              00672000
   APPENDONLY         = 3,                                              00674000
   UPDATE             = 4,                                              00676000
   EXECUTE            = 5;                                              00678000
                                                                        00680000
DEFINE                                                                  00682000
   DEVTYPE            = 8:8#,                                           00684000
   RECTYPE            = 8:2#;                                           00686000
                                                                        00688000
INTEGER ARRAY                                                           00690000
   FILENUMBER(0:3)=DB:=4(0);                                            00692000
INTEGER                                                                 00694000
   LISTFN=FILENUMBER,INPUTFN=FILENUMBER+1,COMMANDFN=FILENUMBER+2,       00696000
   OLDCOMMANDFN=FILENUMBER+3;                                           00698000
EQUATE                                                                  00700000
   LISTFX             = 0,                                              00702000
   INPUTFX            = 1,                                              00704000
   COMMANDFX          = 2,                                              00706000
   OLDCOMMANDFX       = 3,                                              00708000
   ENDOFINPUT         = 4;                                              00710000
LOGICAL                                                                 00712000
   SYNTAXERROR:=FALSE;                                                  00714000
                                                                        00716000
                                                                        00718000
<<* * * DUMP COMMAND DATA * * *>>                                       00720000
                                                                        00722000
BYTE ARRAY                                                              00724000
   DUMPDICT(0:12):=                                                     00726000
   6,4,"DSEG",                                                          00728000
   6,4,"DISC",                                                          00730000
   0;                                                                   00732000
BYTE ARRAY                                                              00734000
   VIRTDICT(0:21):=                                                     00736000
   5,3,"ALL",                                                           00738000
   8,6,"STACKS",                                                        00740000
   8,6,"SYSTEM",                                                        00742000
   0;                                                                   00744000
EQUATE                                                                  00746000
   VIRTUALMEMORY     = 1;                                               00748000
                                                                        00750000
                                                                        00752000
<<* * * DUMP DEVICE COMMAND DATA * * *>>                                00754000
                                                                        00756000
BYTE ARRAY                                                              00758000
   DUMPDEVDICT(0:6):=                                                   00760000
   6,4,"DISC",                                                          00762000
   0;                                                                   00764000
                                                                        00766000
                                                                        00768000
<<* * * DUMP FILE LABEL PARAMETERS * * *>>                              00770000
                                                                        00772000
EQUATE                                                                  00774000
   FLABLEN          = 77;                                               00776000
DEFINE                                                                  00778000
   FLMAXNUMRECORDS  = FLABD(15)        #,                               00780000
   FLBLOCKSIZE      = FLAB(38)         #,                               00782000
   FLSECTOROFFSET   = FLAB(39).(0:8)   #,                               00784000
   FLNUMEXTENTS     = FLAB(39).(11:5)  #,                               00786000
   FLEXTENTSIZE     = FLAB(41)         #,                               00788000
   FLNUMRECORDS     = FLAB(43)         #,                               00790000
   FLEXTENTBASE     = FLABD(22)        #;                               00792000
ARRAY                                                                   00794000
   OLDFLAB(0:76):=FLABLEN(0);                                           00796000
                                                                        00798000
                                                                        00800000
<<* * * COMMAND ABORT VARIABLES * * *>>                                 00802000
INTEGER                                                                 00804000
   ABORTSREGISTER,ABORTDELTAQ,ABORTPREGISTER,ABORTSTATUS,OLDABORTPLABEL;00806000
                                                                        00808000
                                                                        00810000
<<* * * * PRINT STRINGS * * *>>                                         00812000
                                                                        00814000
BYTE ARRAY                                                              00816000
   SPACE(0:1):=" #";                                                    00818000
BYTE ARRAY                                                              00820000
   PROMPT(0:1):=">#";                                                   00822000
BYTE ARRAY                                                              00824000
   BADCOMMANDFILE(0:35):="COMMAND FILE HAS INVALID ATTRIBUTES#";        00826000
BYTE ARRAY                                                              00828000
   BADEVICE(0:24):="INVALID DEVICE SPECIFIED#";                         00830000
BYTE ARRAY                                                              00832000
   BADSYSTEMDISC(0:41):="ONLY DUMPED MEMORY DUE TO BAD SYSTEM DISC#";   00834000
BYTE ARRAY                                                              00836000
   COMMANDFILEOF(0:27):="END-OF-FILE ON COMMAND FILE#";                 00838000
BYTE ARRAY                                                              00840000
   COMMANDFILERR(0:18):="COMMAND FILE ERROR#";                          00842000
BYTE ARRAY                                                              00844000
   DUMPDEVICEFAIL(0:25):="DUMP FILE DEVICE FAILURE#";                   00846000
BYTE ARRAY                                                              00848000
   ERRORMESSAGE(0:18):="* * * ERROR * * * #";                           00850000
BYTE ARRAY                                                              00852000
   EXPECTEDKEYWORD(0:26):="EXPECTED KEYWORD PARAMETER#";                00854000
BYTE ARRAY                                                              00856000
   EXHAUSTEDUMPFILE(0:19):="EXHAUSTED DUMP FILE#";                      00858000
BYTE ARRAY                                                              00860000
   EXPECTEDNUMBER(0:28):="EXPECTED NUMERICAL PARAMETER#";               00862000
BYTE ARRAY                                                              00864000
   EXPECTEDPARM(0:28):="EXPECTED POSITIONAL PARAMETER#";                00866000
BYTE ARRAY                                                              00868000
   EXTRAPARM(0:20):="EXTRANEOUS PARAMETER#";                            00870000
BYTE ARRAY                                                              00872000
   INVALIDRANGE(0:45):="END OF RANGE SMALLER THAN BEGINNING OF RANGE #";00874000
BYTE ARRAY                                                              00876000
   INVALIDVALUE(0:23):="INVALID PARAMETER VALUE#";                      00878000
BYTE ARRAY                                                              00880000
   NODUMPDEVICE(0:15):="NO DUMP DEVICE #";                              00882000
BYTE ARRAY                                                              00884000
   NODUMPFILEXTANT(0:20):="NO DUMP FILE EXISTS #";                      00886000
BYTE ARRAY EOTSERIALDEVICE(0:45):=                                      00888000
   "END-OF-TAPE ON DUMP DEVICE, MOUNT NEXT VOLUME#";                    00890000
BYTE ARRAY                                                              00892000
   SERIALDEVICEFAIL(0:21):="SERIAL DEVICE FAILURE#";                    00894000
BYTE ARRAY                                                              00896000
   SUCCESSFUL(0:10):="SUCCESSFUL#";                                     00898000
BYTE ARRAY                                                              00900000
   SYSTEMDISCFAIL(0:19):="SYSTEM DISC FAILURE#";                        00902000
BYTE ARRAY                                                              00904000
   UGLYDUMPFILELABEL(0:28):="INVALID DUMP FILE FILE-LABEL#";            00906000
BYTE ARRAY                                                              00908000
   UNKNOWNCOMMAND(0:15):="UNKNOWN COMMAND#";                            00910000
BYTE ARRAY                                                     <<03110>>00912000
  TRYAGAIN1(0:41):="SERIAL DEVICE I/O ERROR - You are now in#";<<03110>>00914000
BYTE ARRAY                                                     <<03110>>00916000
  TRYAGAIN2(0:41):="SOFTDUMP INTERACTIVE MODE.  Please mount#";<<03110>>00918000
BYTE ARRAY                                                     <<03110>>00920000
  TRYAGAIN3(0:40):="new media, then type 'DUMP' in response#"; <<03110>>00922000
BYTE ARRAY                                                     <<03110>>00924000
  TRYAGAIN4(0:19):="to the prompt '>'.#";                      <<03110>>00926000
                                                                        00930000
                                                                        00932000
<<* * * ICF/25 INSTRUCTION DEFINITIONS * * *>>                          00934000
                                                                        00936000
DEFINE                                                                  00938000
   SIOP             = CON %20302; CON 0    #,                           00940000
   HIOP             = CON %20302; CON 1    #,                           00942000
   RIOC             = CON %20302; CON 2    #,                           00944000
   WIOC             = CON %20302; CON 3    #,                           00946000
   ROCL             = CON %20302; CON 4    #,                           00948000
   IOCL             = CON %20302; CON 5    #,                           00950000
   INIT             = CON %20302; CON 6    #,                           00952000
   MCS              = CON %20302; CON 7    #,                           00954000
   SEML             = CON %20302; CON 8    #,                           00956000
   STRT             = CON %20302; CON 9    #,                           00958000
   DUMPER           = CON %20302; CON 10   #,                           00960000
   RIOA             = CON %20302; CON 11   #,                  <<03017>>00962000
   WIOA             = CON %20302; CON 12   #,                  <<03017>>00964000
   RCCR             = CON %20104; CON 0    #,                           00966000
   SCLR             = CON %20104; CON 1    #,                           00968000
   TOFF             = CON %20104; CON 2    #,                           00970000
   TON              = CON %20104; CON 3    #,                           00972000
   HBPE             = CON %20104; CON 4    #,                           00974000
   HBPD             = CON %20104; CON 5    #,                           00976000
   SINC             = CON %20104; CON 8    #;                           00978000
$PAGE "CONFIGURE DATA SEGMENT"                                          00980000
<<* * * CONFIGURATION TABLE * * *>>                                     00982000
                                                                        00984000
EQUATE                                                                  00986000
   CTCONFIGLEN      = 68,                                               00988000
   CTBLOCKLEN       = 1024,                                             00990000
   CTBLOCKLOC       = 3;                                                00992000
                                                                        00994000
DEFINE                                                                  00996000
   CTCHECKSUM       = CONFIG           #,                               00998000
   CTNUMBERBANKS    = CONFIG(1)        #,                               01000000
                                                                        01002000
   CTDUMPDEVDESC    = CONFIGD(1)       #,                               01004000
   CTDUMPDEVDRT     = CONFIG(2).(0:9)  #,                      <<03017>>01006000
   CTDUMPDEVSUBTYPE = CONFIG(2).(9:4)  #,                      <<03017>>01008000
   CTDUMPDEVUNIT    = CONFIG(2).(13:3) #,                      <<03017>>01010000
   CTDUMPDEVTYPE    = CONFIG(3)        #,                               01012000
                                                                        01014000
   CTLINEPTRDESC    = CONFIGD(2)       #,                               01016000
   CTLINEPTRDRT     = CONFIG(4).(0:9)  #,                      <<03017>>01018000
   CTLINEPTRSUBTYPE = CONFIG(4).(9:4)  #,                      <<03017>>01020000
   CTLINEPTRUNIT    = CONFIG(4).(13:3) #,                      <<03017>>01022000
   CTLINEPTRDEVTYPE = CONFIG(5)        #,                               01024000
                                                                        01026000
   CTCONSOLEDESC    = CONFIGD(3)       #,                               01028000
   CTCONSOLEDRT     = CONFIG(6).(0:9)  #,                      <<03017>>01030000
   CTCONSOLESUBTYPE = CONFIG(6).(9:4)  #,                      <<03017>>01032000
   CTCONSOLEUNIT    = CONFIG(6).(13:3) #,                      <<03017>>01034000
   CTCONSOLEDEVTYPE = CONFIG(7)        #,                               01036000
                                                                        01038000
   CTCOMMANDESC     = CONFIGD(4)       #,                               01040000
   CTCOMMANDRT      = CONFIG(8).(0:9)  #,                      <<03017>>01042000
   CTCOMMANDSUBTYPE = CONFIG(8).(9:4)  #,                      <<03017>>01044000
   CTCOMMANDUNIT    = CONFIG(8).(13:3) #,                      <<03017>>01046000
   CTCOMMANDEVTYPE  = CONFIG(9)        #,                               01048000
                                                                        01050000
   CTSYSDISCDESC    = CONFIGD(5)       #,                               01052000
   CTSYSDISCDRT     = CONFIG(10).(0:9) #,                      <<03017>>01054000
   CTSYSDISCSUBTYPE = CONFIG(10).(9:4) #,                      <<03017>>01056000
   CTSYSDISCUNIT    = CONFIG(10).(13:3)#,                      <<03017>>01058000
   CTSYSDISCDEVTYPE = CONFIG(11)       #,                               01060000
                                                                        01062000
   CTDUMPFILEDESC   = CONFIGD(6)       #,                               01064000
   CTDUMPFILEDRT    = CONFIG(12).(0:9) #,                      <<03017>>01066000
   CTDUMPFILESUBTYPE= CONFIG(12).(9:4) #,                      <<03017>>01068000
   CTDUMPFILEUNIT   = CONFIG(12).(13:3)#,                      <<03017>>01070000
   CTDUMPFILEDEVTYPE= CONFIG(13)       #,                               01072000
   CTDUMPFILELEN    = CONFIG(14)       #,                               01074000
                                                                        01076000
   CTMODE           = CONFIG(15)       #,                               01078000
   CTCOMMANDFILE    = CONFIGD(8)       #,                               01080000
   CTDUMPFILE       = CONFIGD(9)       #,                               01082000
   CTOVERLAYSECNUM  = CONFIGD(10)      #,                               01084000
   CTBADSYSDISC     = CONFIG(22).(0:1) #,                               01086000
   CTBACKUPDUMP     = CONFIG(22).(1:1) #,                               01088000
   CTCOMMANDLENGTH  = CONFIG(23)       #;                               01090000
                                                                        01092000
                                                                        01094000
<<* * * CONTEXT AREA * * *>>                                            01096000
                                                                        01098000
DEFINE                                                                  01100000
   CNMACHINEID      = CONTEXTBASE(0).(8:8) #,                  <<03017>>01102000
   CNDUMPDESC       = CONTEXTBASE(1)       #,                           01104000
   CNDUMPDEVDRT     = CONTEXTBASE(1).(7:9) #,                  <<03017>>01106000
   CNXREGISTER      = CONTEXTBASE(2)       #,                           01108000
   CNDLREGISTER     = CONTEXTBASE(3)       #,                           01110000
   CNDBANKREGISTER  = CONTEXTBASE(4)       #,                           01112000
   CNDBREGISTER     = CONTEXTBASE(5)       #,                           01114000
   CNQREGISTER      = CONTEXTBASE(6)       #,                           01116000
   CNSREGISTER      = CONTEXTBASE(7)       #,                           01118000
   CNSBANKREGISTER  = CONTEXTBASE(8)       #,                           01120000
   CNZREGISTER      = CONTEXTBASE(9)       #,                           01122000
   CNSTATUSREGISTER = CONTEXTBASE(10)      #,                           01124000
   CNPBANKREGISTER  = CONTEXTBASE(11)      #,                           01126000
   CNPBREGISTER     = CONTEXTBASE(12)      #,                           01128000
   CNPREGISTER      = CONTEXTBASE(13)      #,                           01130000
   CNPLREGISTER     = CONTEXTBASE(14)      #,                           01132000
   CNCIREGISTER     = CONTEXTBASE(15)      #,                           01134000
   CNNUMBANKS       = CONTEXTBASE(16)      #,                           01136000
   CNSYSTEMFAILNUM  = CONTEXTBASE(17)      #,                           01138000
   CNINTERRUPTSTATUS= CONTEXTBASE(18)      #,                           01140000
   CNBANKSDUMPED    = CONTEXTBASE(19)      #,                           01142000
   CNINTERRUPTMASK  = CONTEXTBASE(%110)    #,                           01144000
   CNDUMPDRT0       = CONTEXTBASE(%111)    #,                           01146000
   CNDUMPDRT1       = CONTEXTBASE(%112)    #,                           01148000
   CNDUMPDRT2       = CONTEXTBASE(%113)    #,                           01150000
   CNDUMPDRT3       = CONTEXTBASE(%114)    #,                  <<03017>>01152000
   CNDRTBANK        = CONTEXTBASE(%122)    #,                  <<03017>>01154000
   CNDRTOFFSET      = CONTEXTBASE(%123)    #,                  <<03017>>01156000
   CNMASKIMB0       = CONTEXTBASE(%124)    #,                  <<03017>>01158000
   CNMASKIMB1       = CONTEXTBASE(%125)    #,                  <<03017>>01160000
   CNMASKIMB2       = CONTEXTBASE(%126)    #,                  <<03017>>01162000
   CNMASKIMB3       = CONTEXTBASE(%127)    #,                  <<03017>>01164000
   CNSDFINITVERSION = CONTEXTBASE(%130)    #,                  <<03017>>01166000
   CNCIVERSION      = CONTEXTBASE(%131)    #,                  <<03017>>01168000
   CNUTILVERSION    = CONTEXTBASE(%132)    #,                  <<03017>>01170000
   CNTAPEVERSION    = CONTEXTBASE(%133)    #;                  <<03017>>01172000
$PAGE "EXTERNAL PROCEDURES."                                            01174000
INTRINSIC                                                               01176000
   PRINT,QUIT,XCONTRAP,ASCII,DASCII,BINARY,DBINARY,FOPEN,FREAD,FWRITE,  01178000
   FGETINFO,FRENAME,FCLOSE,TERMINATE,PRINTFILEINFO,MYCOMMAND,SEARCH;    01180000
                                                                        01182000
                                                                        01184000
INTEGER PROCEDURE PRINTSTRING(TEXT,COUNT,CONTROL);                      01186000
VALUE TEXT,COUNT,CONTROL;                                               01188000
BYTE POINTER TEXT;                                                      01190000
INTEGER COUNT,CONTROL;                                                  01192000
OPTION VARIABLE,FORWARD;                                                01194000
$PAGE "REQUIRED BUT NOT USED PROCEDURES FOR SYNTAX CHECKING MODE."      01196000
$CONTROL SEGMENT=SYNSEG                                                 01198000
PROCEDURE FATAL;                                                        01200000
   BEGIN                                                                01202000
   ARRAY FATALMSG(0:40);                                                01204000
   MOVE FATALMSG:="* * * FATAL SOFTWARERROR * * *",2;                   01206000
   PRINT(FATALMSG,S0-@FATALMSG,0);                                      01208000
   END  <<FATAL>>;                                                      01210000
                                                                        01212000
<<READ FROM THE CONSOLE>>                                               01214000
INTEGER PROCEDURE READ(TARGET,TARGETLEN);                               01216000
VALUE TARGETLEN;                                                        01218000
BYTE ARRAY TARGET;                                                      01220000
INTEGER TARGETLEN;                                                      01222000
FATAL;                                                                  01224000
                                                               <<02669>>01226000
                                                               <<02669>>01228000
<< DELAY FOR "TIME" MILLISECONDS >>                            <<02669>>01230000
PROCEDURE DELAY(TIME);                                         <<02669>>01232000
VALUE TIME;                                                    <<02669>>01234000
DOUBLE TIME;                                                   <<02669>>01236000
FATAL;                                                         <<02669>>01238000
                                                               <<02669>>01240000
                                                               <<02669>>01242000
                                                                        01244000
                                                                        01246000
LOGICAL PROCEDURE CHECKDISC(DESC);                                      01248000
VALUE DESC;                                                             01250000
DOUBLE DESC;                                                            01252000
FATAL;                                                                  01254000
                                                                        01256000
PROCEDURE WAITINSERTDISC(LDEV);                                         01258000
VALUE LDEV;                                                             01260000
INTEGER LDEV;                                                           01262000
FATAL;                                                                  01264000
                                                                        01266000
PROCEDURE INITADCC(N);                                                  01268000
VALUE N;                                                                01270000
INTEGER N;                                                              01272000
FATAL;                                                                  01274000
                                                                        01276000
PROCEDURE HELP;                                                         01278000
FATAL;                                                                  01280000
                                                                        01282000
PROCEDURE MESSAGE(N);                                                   01284000
VALUE N; INTEGER N;    <<MESSAGE NUMBER>>                               01286000
FATAL;                                                                  01288000
                                                                        01290000
LOGICAL PROCEDURE IDENTIFYDEVICE(DRTUNIT,DESC);                         01292000
VALUE DRTUNIT;                                                          01294000
INTEGER                                                                 01296000
   DRTUNIT;           <<(0:8) - DRT # OF DEVICE TO BE IDENTIFIED        01298000
                        (8:8) - UNIT # OF THE DEVICE>>                  01300000
DOUBLE                                                                  01302000
   DESC;              <<DRT, SUBTYPE, UNIT, TYPE FORMAT>>               01304000
FATAL;                                                                  01306000
                                                                        01308000
DOUBLE PROCEDURE PERFORMIO(LDEV,FUNCTION,TARGET,COUNT,PARM);            01310000
VALUE LDEV,FUNCTION,COUNT,PARM;                                         01312000
INTEGER                                                                 01314000
   LDEV,              <<LOGICAL DEVICE NUMBER                           01316000
                        1 = SYSTEM DISC                                 01318000
                        2 = SERIAL DISC                                 01320000
                        3 = MAG TAPE                                    01322000
                        4 = AUX DISC 1                                  01324000
                        5 = AUX DISC 2>>                                01326000
   FUNCTION,          <<0 = READ                                        01328000
                        1 = WRITE                                       01330000
                        OTHERS ARE DRIVER DEFINED>>                     01332000
   COUNT;             <<LENGTH OF THE BUFFER                            01334000
                        + = WORDS                                       01336000
                        - = BYTES>>                                     01338000
ARRAY                                                                   01340000
   TARGET;            <<DB RELATIVE ADDR OF DATA BUFFER>>               01342000
DOUBLE                                                                  01344000
   PARM;              <<DRIVER DEFINED                                  01346000
                        DISC DRIVER - LOGICAL SEGMENT ADDR>>            01348000
OPTION VARIABLE;                                                        01350000
   BEGIN                                                                01352000
   DEFINE CONDCODE=STAT.(6:2)#;                                         01354000
   EQUATE CCE=2;                                                        01356000
   INTEGER I;                                                           01358000
   IF FUNCTION=0 THEN                                                   01360000
      FOR I:=0 UNTIL COUNT-1 DO TARGET(I):=I;                           01362000
   CONDCODE:=CCE;                                                       01364000
   END;                                                                 01366000
                                                                        01368000
LOGICAL PROCEDURE EXCHANGEDB(DSTX);                                     01370000
VALUE DSTX;                                                             01372000
INTEGER DSTX;         <<TARGET DATA SEGMENT NUMBER>>                    01374000
FATAL;                                                                  01376000
                                                                        01378000
                                                                        01380000
PROCEDURE CHANGEDEVICE(SYSDISCDESC,SERDISCDESC,AUXDISC1DESC,            01382000
   AUXDISC2DESC,CONSOLEDESC,PRINTERDESC);                               01384000
VALUE SYSDISCDESC,SERDISCDESC,AUXDISC1DESC,AUXDISC2DESC,                01386000
   CONSOLEDESC,PRINTERDESC;                                             01388000
DOUBLE                                                                  01390000
   SYSDISCDESC,       <<DEVICE DESCRIPTORS>>                            01392000
   SERDISCDESC,       <<WORD 0 - 0:8  - DRT>>                           01394000
   AUXDISC1DESC,      <<         8:4  - SUBTYPE>>                       01396000
   AUXDISC2DESC,      <<         12:4 - UNIT>>                          01398000
   CONSOLEDESC,       <<WORD 1 - DEVICE TYPE>>                          01400000
   PRINTERDESC;                                                         01402000
OPTION VARIABLE;                                                        01404000
FATAL;                                                                  01406000
$PAGE "SYNTAX CHECKING MODE PROCEDURES"                                 01408000
$CONTROL SEGMENT=SEG'                                                   01410000
PROCEDURE SYNTAXEXIT(FILEX);                                            01412000
VALUE FILEX;                                                            01414000
INTEGER                                                                 01416000
   FILEX;              <<=  0 NO FILE FAILED                            01418000
                         <> 0 FAILING FILE'S INDEX INTO FILE ARRAY>>    01420000
   BEGIN                                                                01422000
   DEFINE                                                               01424000
      OLDCFOPTIONS    = [F1/NOFILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,      01426000
                         F5/ARSCII,F6/OLDSYSTEMFILE]#,                  01428000
      OLDCAOPTIONS    = [A1/BUFFERING,A2/EXCLUSIVE,A3/WRITEONLY]#;      01430000
   INTEGER I,LENGTH,DUMMY;                                              01432000
   BYTE ARRAY DESIG(0:28),DESIG1(0:28);                                 01434000
                                                                        01436000
   SUBROUTINE ERRORTERMINATION;                                         01438000
      BEGIN                                                             01440000
      <<INSURE THAT ALL THE FILES ARE CLOSED>>                          01442000
      FCLOSE(LISTFN,SAVE,NOSECURITY);                                   01444000
      FCLOSE(INPUTFN,NOCHANGE,NOSECURITY);                              01446000
      FCLOSE(COMMANDFN,NOCHANGE,NOSECURITY);                            01448000
      FCLOSE(OLDCOMMANDFN,NOCHANGE,NOSECURITY);                         01450000
                                                                        01452000
      <<INFORM USER THAT NO NEW COMMAND FILE WAS CREATED>>              01454000
      MOVE BUF:="* * * NO NEW COMMAND FILE CREATED * * *",2;            01456000
      PRINT(BUF,@BUF-S0,0);                                             01458000
      QUIT(0);                                                          01460000
      END  <<ERRORTERMINATION>>;                                        01462000
                                                                        01464000
   IF FILEX <= OLDCOMMANDFX THEN                                        01466000
      BEGIN   <<ERROR IN FILE ACCESS>>                                  01468000
      PRINTFILEINFO(FILEX);                                             01470000
      MOVE BUFB:="* * * FILE ERROR ON ",2;                              01472000
      CASE FILEX OF                                                     01474000
         BEGIN                                                          01476000
         MOVE *:="LIST FILE * * *",2;                                   01478000
         MOVE *:="INPUT FILE * * *",2;                                  01480000
         MOVE *:="COMMAND FILE * * *",2;                                01482000
         MOVE *:="EXISTING COMMAND FILE * * *",2;                       01484000
         END  <<CASE>>;                                                 01486000
      PRINT(BUFB,@BUFB-S0,0);                                           01488000
      ERRORTERMINATION;                                                 01490000
      END  <<FILE ACCESS ERROR>>                                        01492000
   ELSE IF SYNTAXERROR THEN                                             01494000
      ERRORTERMINATION                                                  01496000
   ELSE                                                                 01498000
      BEGIN                                                             01500000
      <<NO ERRORS, CLOSE THE FILES>>                                    01502000
      FCLOSE(LISTFN,SAVE,NOSECURITY);                                   01504000
      IF <> THEN SYNTAXEXIT(LISTFX);                                    01506000
      FCLOSE(COMMANDFN,TEMPORARYFILE,NOSECURITY);                       01508000
      IF <> THEN SYNTAXEXIT(COMMANDFX);                                 01510000
      END  <<CLOSE FILES>>;                                             01512000
   MOVE BUFB:="NEW COMMAND FILE CREATED ",2;                            01514000
   PRINT(BUF,@BUFB-S0,0);                                               01516000
   TERMINATE;                                                           01518000
   END  <<SYNTAXEXIT>>;                                                 01520000
PROCEDURE SYNTAXINITIALIZE;                                             01522000
   BEGIN                                                                01524000
   DEFINE                                                               01526000
      LISTFOPTIONS    = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/STDLIST,         01528000
                         F5/ARSCII,F6/NEWFILE]#,                        01530000
      LISTAOPTIONS    = [A1/BUFFERING,A2/DEFAULTACCESS,A3/WRITEONLY]#,  01532000
      INPUTFOPTIONS   = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        01534000
                         F5/ARSCII,F6/OLDSYSTEMFILE]#,                  01536000
      INPUTAOPTIONS   = [A1/BUFFERING,A2/DEFAULTACCESS,A3/READONLY]#,   01538000
      DFOPTIONS       = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        01540000
                         F5/ARSCII,F6/TEMPORARYFILE]#,                  01542000
      CFOPTIONS       = [F1/FILE,F2/NOCCTL,F3/FIXED,F4/FILENAME,        01544000
                         F5/ARSCII,F6/NEWFILE]#,                        01546000
      CAOPTIONS       = [A1/BUFFERING,A2/DEFAULTACCESS,A3/WRITEONLY]#;  01548000
   BYTE ARRAY DESIG(0:8),CDEVICE(0:4);                                  01550000
   DOUBLE CFILESIZE,FILESIZE;                                           01552000
   INTEGER                                                              01554000
      DUMMY,FOPTIONS,AOPTIONS,RECSIZE,DEVICETYPE,BLOCKSIZE,NUMEXTENT;   01556000
   EQUATE                                                               01558000
      LISTRECSIZE       = -132,                                         01560000
      CRECSIZE          = -72,                                          01562000
      CNUMEXTENT        = 1,                                            01564000
      CBLOCKFACTOR      = 3,                                            01566000
      CBLOCKSIZE        = CRECSIZE*CBLOCKFACTOR;                        01568000
                                                                        01570000
   <<OPEN LIST, INPUT, AND COMMAND FILES>>                              01572000
   MOVE DESIG:="LIST ";                                                 01574000
   LISTFN:=FOPEN(DESIG,LISTFOPTIONS,LISTAOPTIONS,LISTRECSIZE);          01576000
   IF <> THEN SYNTAXEXIT(LISTFX);                                       01578000
   MOVE DESIG:="INPUT ";                                                01580000
   INPUTFN:=FOPEN(DESIG,INPUTFOPTIONS,INPUTAOPTIONS);                   01582000
   IF <> THEN SYNTAXEXIT(INPUTFX);                                      01584000
   FGETINFO(INPUTFN,,,,,,,,,,CFILESIZE);                                01586000
   MOVE DESIG:="SDFCOM ";                                               01588000
   MOVE CDEVICE:="DISC ";                                               01590000
   DUMMY:=FOPEN(DESIG,DFOPTIONS);  <<PURGE POSSIBLE TEMP SDFCOM>>       01592000
   IF = THEN FCLOSE(DUMMY,PURGE,0);                                     01594000
   COMMANDFN:=FOPEN(DESIG,CFOPTIONS,CAOPTIONS,CRECSIZE,CDEVICE,,,       01596000
      CBLOCKFACTOR,,CFILESIZE,CNUMEXTENT);                              01598000
   IF <> THEN SYNTAXEXIT(COMMANDFX);                                    01600000
   FGETINFO(COMMANDFN,,FOPTIONS,,RECSIZE,DEVICETYPE,,,,,,FILESIZE,,,    01602000
      BLOCKSIZE,,NUMEXTENT);                                            01604000
   IF FOPTIONS.(RECTYPE)<>FIXED OR BLOCKSIZE<>CBLOCKSIZE                01606000
      OR RECSIZE<>CRECSIZE  OR NUMEXTENT<>CNUMEXTENT                    01608000
      OR ((DEVICETYPE.(DEVTYPE)<>T13037)                       <<04855>>01610000
         LAND (DEVICETYPE.(DEVTYPE)<>T'CS'80))                 <<04855>>01612000
         <<We must also allow for CS'80 Discs (Type 3)>>       <<04855>>01614000
      OR FILESIZE<CFILESIZE THEN                               <<04855>>01616000
         BEGIN                                                          01618000
         PRINTSTRING(BADCOMMANDFILE);                                   01620000
         SYNTAXEXIT(COMMANDFX);                                         01622000
         END;                                                           01624000
                                                                        01626000
   END  <<SYNTAXINITIALIZATION>>;                                       01628000
$PAGE "UTILITY PROCEDURES."                                             01630000
PROCEDURE INITIALIZE;                                                   01632000
   BEGIN                                                                01634000
   @CONFIG:=XREG;                                                       01636000
   MODE:=IF CTCOMMANDFILE <> 0D THEN COMMAND ELSE INTERACTIVE;          01638000
   PUSH(S); ABORTSREGISTER:=TOS;                                        01640000
   PUSH(Q); ABORTDELTAQ:=TOS-DELTAQ;                                    01642000
   ABORTPREGISTER:=RETURNP; ABORTSTATUS:=STAT;                          01644000
   NOSYSTEMDISC:=CTBADSYSDISC;                                          01646000
   IF CTDUMPFILE <> 0D THEN                                             01648000
      BEGIN                                                             01650000
      PERFORMIO(DUMPDISC,INPUT,OLDFLAB,FLABLEN,CTDUMPFILE);             01652000
      IF <> THEN                                                        01654000
         BEGIN                                                          01656000
         PRINTSTRING(UGLYDUMPFILELABEL);                                01658000
         CTDUMPFILE:=0D;                                                01660000
         DUMPMODE:=SERIALDEVICEDUMP;                                    01662000
         END;                                                           01664000
      END;                                                              01666000
   END  <<INITIALIZATION>>;                                             01668000
INTEGER PROCEDURE PRINTSTRING(TEXT,COUNT,CONTROL);                      01670000
VALUE TEXT,COUNT,CONTROL;                                               01672000
BYTE POINTER TEXT;                                                      01674000
INTEGER COUNT,CONTROL;                                                  01676000
OPTION VARIABLE;                                                        01678000
   BEGIN                                                                01680000
   <<OUTPUTS CHARACTER STRING TO THE LIST FILE.                         01682000
     INPUT:                                                             01684000
       TEXT       - TEXT STRING TO BE LISTED.                           01686000
       COUNT      - LENGTH OF STRING (+ WORDS, - BYTES).  IF THIS       01688000
                    PARAMETER IS OMITTED THEN THE TEXT STRING MUST      01690000
                    BE DELIMITED BY EITHER A CARRIAGE RETURN OR         01692000
                    BY A POUND SIGN (#).                                01694000
       CONTROL    - SPACING CONTROL.  IF OMITTED THEN A VALUE OF        01696000
                    %40 WILL BE USED (SINGLE SPACE).                    01698000
       PRINTSTRING- BYTE INDEX OF THE END OF PRINT STRING + 1.          01700000
   >>                                                                   01702000
   BYTE ARRAY                                                           01704000
      OUTSTRING(0:79);                                                  01706000
   IF PMAP.(15:1)=0 THEN                                                01708000
      CONTROL:=IF MODE=SYNTAXCHECKING THEN " " ELSE %201;               01710000
   IF PMAP.(14:1)=0 THEN                                                01712000
      BEGIN                                                             01714000
      SCAN TEXT UNTIL %6443,1;                                          01716000
      COUNT:=-TOS+@TEXT;                                                01718000
      END;                                                              01720000
   COUNT:=IF COUNT < 0 THEN -COUNT ELSE 2*COUNT;                        01722000
   PRINTSTRING:=COUNT+1;                                                01724000
   DO                                                                   01726000
      BEGIN                                                             01728000
      <<PRINT A LINE>>                                                  01730000
      MOVE OUTSTRING:=TEXT,(80);                                        01732000
      FWRITE(LISTFN,OUTSTRING,-(COUNT MOD 80),CONTROL);                 01734000
      @TEXT:=@TEXT+80;                                                  01736000
      END UNTIL (COUNT:=COUNT-80) <= 0;                                 01738000
   END;                                                                 01740000
PROCEDURE PRINTERROR(ERRMSG,CHARADDR);                                  01742000
VALUE ERRMSG,CHARADDR;                                                  01744000
BYTE POINTER                                                            01746000
   ERRMSG,            <<BYTE ADDR OF THE ERROR MESSAGE>>                01748000
   CHARADDR;          <<BYTE ADDR OF THE OFFENDING WORD>>               01750000
OPTION VARIABLE;                                                        01752000
   BEGIN                                                                01754000
   <<1) PRINTS AN ARROW UNDERNEATH THE OFFENDING WORD.                  01756000
     2) PRINTS THE ERROR STATEMENT.                                     01758000
     3) SETS THE ERROR FLAG.                                            01760000
   >>                                                                   01762000
   INTEGER I;                                                           01764000
   IF MODE=SYNTAXCHECKING THEN PRINT(COMMANDBUF,-RECSIZE,0);            01766000
   IF PMAP THEN                                                         01768000
      BEGIN  <<PRINT ARROW>>                                            01770000
      BUFB:=" "; MOVE BUFB(1):=BUFB,(79);                               01772000
      I:=@CHARADDR-@COMMANDBUF;                                         01774000
      BUFB(I):=%136; BUFB(I+1):="#";                                    01776000
      PRINTSTRING(BUFB);                                                01778000
      END;                                                              01780000
   PRINTSTRING(ERRORMESSAGE);                                           01782000
   PRINTSTRING(ERRMSG);                                                 01784000
   PRINTSTRING(SPACE);                                                  01786000
   SYNTAXERROR:=TRUE;                                                   01788000
   IF MODE = COMMAND THEN MODE:=INTERACTIVE;                            01790000
   END  <<PRINTERROR>>;                                                 01792000
PROCEDURE ABORTCOMMAND;                                                 01794000
   BEGIN                                                                01796000
   <<ABORTS THE CURRENT COMMAND BY RETURNING DIRECTLY TO                01798000
     THE MAINLINE.                                                      01800000
   >>                                                                   01802000
   XCONTRAP(0,OLDABORTPLABEL);                                          01804000
   MOVE BUFB:="* * * COMMAND ABORTED * * *#";                           01806000
   PRINTSTRING(BUFB);                                                   01808000
   MODE:=INTERACTIVE;                                                   01810000
   PUSH(Q); DELTAQ:=TOS-ABORTDELTAQ;                                    01812000
   RETURNP:=ABORTPREGISTER; STAT:=ABORTSTATUS;                          01814000
   XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                              01816000
   END  <<ABORTCOMMAND>>;                                               01818000
PROCEDURE GETNEXTCOMMAND(COMMANDBUF);                                   01820000
BYTE ARRAY COMMANDBUF;                                                  01822000
   BEGIN                                                                01824000
   <<SYNTAX CHECKING MODE - GETS NEXT COMMAND FROM INPUT FILE AND       01826000
                            AND WRITES IT TO THE OUTPUT FILE.           01828000
     COMMAND FILE MODE    - GETS NEXT COMMAND FROM THE COMMAND FILE     01830000
                            AND WRITES IT TO THE CONSOLE.               01832000
     INTERACTIVE MODE     - GETS NEXT COMMAND FROM THE CONSOLE.         01834000
   >>                                                                   01836000
   EQUATE                                                               01838000
      BLOCKFACTOR     = 3;                                              01840000
   INTEGER I:=RECSIZE,COUNT;                                            01842000
   ARRAY DISCBUF(0:SECTORSIZE);                                         01844000
   BYTE POINTER RECORDLOC;                                              01846000
   COMMANDBUF:=CARRIAGERETURN;                                          01848000
   MOVE COMMANDBUF(1):=COMMANDBUF,(73);                                 01850000
   CASE MODE OF                                                         01852000
      BEGIN                                                             01854000
      BEGIN                     <<**SYNTAX CHECKING MODE>>              01856000
      COUNT:=FREAD(INPUTFN,COMMANDBUF,-RECSIZE);                        01858000
      IF < THEN SYNTAXEXIT(INPUTFX);                                    01860000
      IF > THEN SYNTAXEXIT(ENDOFINPUT);                                 01862000
      FWRITE(COMMANDFN,COMMANDBUF,-COUNT,0);                            01864000
      IF <> THEN SYNTAXEXIT(COMMANDFX);                                 01866000
      END  <<SYNTAX CHECKING MODE>>;                                    01868000
      BEGIN                     <<**COMMAND MODE>>                      01870000
      IF LOGICAL(RECORDCOUNT:=RECORDCOUNT+1) > CTCOMMANDLENGTH THEN     01872000
         BEGIN  <<END-OF-FILE ON COMMAND FILE>>                         01874000
         MODE:=INTERACTIVE;                                             01876000
         PRINTSTRING(COMMANDFILEOF);                                    01878000
         END                                                            01880000
      ELSE                                                              01882000
         BEGIN                                                          01884000
         PERFORMIO(COMMANDISC,INPUT,DISCBUF,SECTORSIZE,                 01886000
            CTCOMMANDFILE+DOUBLE((RECORDCOUNT-1)/BLOCKFACTOR));         01888000
         IF = THEN                                                      01890000
            BEGIN  <<SUCCESSFUL>>                                       01892000
            @RECORDLOC:=@DISCBUF&LSL(1)                                 01894000
               +((RECORDCOUNT-1) MOD BLOCKFACTOR)*RECSIZE;              01896000
            MOVE COMMANDBUF:=RECORDLOC,(RECSIZE);                       01898000
            WHILE (I:=I-1)>0 AND COMMANDBUF(I)=" " DO                   01900000
               COMMANDBUF(I):=CARRIAGERETURN;                           01902000
            PRINTSTRING(COMMANDBUF,-RECSIZE);                           01904000
            XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                     01906000
            END                                                         01908000
         ELSE                                                           01910000
            BEGIN  <<ERROR IN COMMAND FILE ACCESS>>                     01912000
            <<CHANGE MODE TO INTERACTIVE AND GET NEXT COMMAND FROM      01914000
              THE CONSOLE.                                              01916000
            >>                                                          01918000
            PRINTSTRING(COMMANDFILERR);                                 01920000
            MODE:=INTERACTIVE;                                          01922000
            GETNEXTCOMMAND(COMMANDBUF);                                 01924000
            END;                                                        01926000
         END;                                                           01928000
      END  <<COMMAND FILE MODE>>;                                       01930000
      BEGIN                     <<**INTERACTIVE MODE>>                  01932000
      PRINTSTRING(SPACE);                                               01934000
      PRINTSTRING(PROMPT,,%320);                                        01936000
      COUNT:=READ(COMMANDBUF,-RECSIZE);                        <<03749>>01938000
      WHILE COUNT<RECSIZE DO                                   <<03749>>01940000
         <<If a control X was done the count returned by the >><<03749>>01942000
         <<read procedure may be less than the number of     >><<03749>>01944000
         <<characters actually put into the buffer, so we    >><<03749>>01946000
         <<overwrite any extra chars with carriage returns   >><<03749>>01948000
         BEGIN                                                 <<03749>>01950000
         COMMANDBUF(COUNT):=CARRIAGERETURN;                    <<03749>>01952000
         COUNT:=COUNT+1;                                       <<03749>>01954000
         END;                                                  <<03749>>01956000
      MOVE COMMANDBUF:=COMMANDBUF WHILE A,1;                            01958000
      MOVE COMMANDBUF(RECSIZE):=COMMANDBUF(71),(S0-@COMMANDBUF-RECSIZE);01960000
      XCONTRAP(@ABORTCOMMAND,OLDABORTPLABEL);                           01962000
      END  <<INTERACTIVE MODE>>;                                        01964000
      END  <<CASE>>;                                                    01966000
   END  <<GETNEXTCOMMAND>>;                                             01968000
   PROCEDURE READISC(BUFFER,LENGTH,SECTOR);                             01970000
   VALUE LENGTH,SECTOR;                                                 01972000
   ARRAY BUFFER;                                                        01974000
   INTEGER LENGTH;                                                      01976000
   DOUBLE SECTOR;                                                       01978000
      BEGIN                                                             01980000
      PERFORMIO(SYSTEMDISC,INPUT,BUFFER,LENGTH,SECTOR);                 01982000
      IF <> THEN QUIT(SYSTEMDISCERR);                                   01984000
      END  <<READISC>>;                                                 01986000
                                                               <<03017>>01990000
PROCEDURE LOAD'SDF'MAP'BUFFER;                                 <<03017>>01992000
<<===========================>>                                <<03017>>01994000
BEGIN                                                          <<03017>>01996000
                                                               <<03017>>01998000
  EQUATE SDFMAPADDR = 1;   <<WORDS 1,2 ARE SECTOR ADDRESS>>    <<03017>>02000000
   READISC( SDFMAPBUFFER,SECTORSIZE,3D);                       <<03017>>02002000
   TOS := @SDFMAPBUFFER;                                       <<03017>>02004000
   TOS := SECTORSIZE;                                          <<03017>>02006000
   TOS := SDFMAPBUFFER(SDFMAPADDR);                            <<03017>>02008000
   TOS := SDFMAPBUFFER(SDFMAPADDR+1);                          <<03017>>02010000
   READISC( *,*,*);                                            <<03017>>02012000
                                                               <<03017>>02014000
   SDFMAP'MAXBANK := CTNUMBERBANKS - 1;  <<LOAD HIGHEST BANK>> <<03017>>02016000
      <<NUMBER INTO LAST MEMORY STORAGE RECORD = UPPER MEM>>   <<03017>>02018000
      <<BOUND.  THIS MUST BE DYNAMICALLY LOADED FOR GETAREA >> <<03017>>02020000
   SDF'MAP'BUFFER'LOADED := TRUE;                              <<03017>>02022000
END;                                                           <<03017>>02024000
                                                               <<03017>>02026000
PROCEDURE GETAREA ( SOURCE, TARGET, TCOUNT );                  <<03017>>02028000
<<==========================================>>                 <<03017>>02030000
 VALUE SOURCE,TARGET,TCOUNT;                                   <<03017>>02032000
                                                               <<03017>>02034000
 DOUBLE                                                        <<03017>>02036000
   SOURCE;    <<SOURCE BANK AND ABSOLUTE ADDRESS>>             <<03017>>02038000
 POINTER                                                       <<03017>>02040000
   TARGET;    <<DB-REL DESTINATION ADDRESS>>                   <<03017>>02042000
 LOGICAL                                                       <<03017>>02044000
   TCOUNT;    <<LENGTH OF DESTINATION AREA IN WORDS>>          <<03017>>02046000
              <<IF NOT SPECIFIED THEN 1 WORD IS USED>>         <<03017>>02048000
                                                               <<03017>>02050000
 OPTION VARIABLE;                                              <<03017>>02052000
BEGIN                                                          <<03017>>02054000
                                                               <<03017>>02056000
 POINTER                                                       <<03017>>02058000
   PTR;            <<POINTER INTO MAP BUFFER>>                 <<03017>>02060000
 DOUBLE POINTER                                                <<03017>>02062000
   DPTR = PTR;     <<DOUBLE WORD POINTER (SAME) INTO MAP>>     <<03017>>02064000
                                                               <<03017>>02066000
 DOUBLE                                                        <<03017>>02068000
   END'ADDR,       <<LAST DESIRED WORD OF REQUEST>>            <<03017>>02070000
                                                               <<03017>>02072000
   XFER'START,     <<START ADDRESS FOR CURRENT TRANSFER>>      <<03017>>02074000
   CUR'SECTOR,     <<SECTOR NUMBER FOR CURRENT TRANSFER>>      <<03017>>02076000
   FULL'SECTORS,   <<NUMBER OF FULL SECTORS TO TRANSFER>>      <<03017>>02078000
   SECTOR'OFFSET;  <<SECTOR OFFSET FROM START SECTOR>>         <<03017>>02080000
                   <<OF CURRENT STORAGE RECORD>>               <<03017>>02082000
 LOGICAL                                                       <<03017>>02084000
   XFER'BANK=XFER'START,  <<BANK PORTION OF XFER'START>>       <<03017>>02086000
   CUR'LEN,        <<LENGTH OF CURRENT TRANSFER>>              <<03017>>02088000
   XFER'LEN,       <<LENGTH OF RECORD TRANSFER>>               <<03017>>02090000
   WORD'OFFSET,    <<WORD OFFSET FROM START ADDR OF STG REC>>  <<03017>>02092000
   BANK'OFFSET,    <<BANK OFFSET FROM START ADDR OF STG REC>>  <<03017>>02094000
   LEADING'WORDS,  <<NUMBER OF WORDS BEFORE FIRST SECTOR BND>> <<03017>>02096000
   TRAILING'WORDS; <<NUMBER OF WORDS IN LAST PARTIAL SECTOR>>  <<03017>>02098000
 ARRAY SECTORBUF (0:511);                                      <<03605>>02100000
                                                               <<03017>>02102000
 <<------------------------------------------------------->>   <<03017>>02104000
                                                               <<03017>>02106000
 IF NOT PMAP THEN TCOUNT := 1;                                 <<03017>>02108000
    <<IF OPTIONAL PARAM IS OMITTED USE DEFAULT 1 WORD>>        <<03017>>02110000
                                                               <<03017>>02112000
 END'ADDR := SOURCE + DOUBLE( TCOUNT) - 1D;                    <<03017>>02114000
    <<CALCULATE LAST DESIRED WORD OF REQUEST>>                 <<03017>>02116000
                                                               <<03017>>02118000
 XFER'START := SOURCE;                                         <<03017>>02120000
    <<FIRST TRANSFER TO START AT SPECIFIED START ADDR>>        <<03017>>02122000
                                                               <<03017>>02124000
 IF NOT SDF'MAP'BUFFER'LOADED                                  <<03017>>02126000
 THEN LOAD'SDF'MAP'BUFFER;                                     <<03017>>02128000
       <<INSURE THAT WE HAVE A COPY OF THE MAP>>               <<03017>>02130000
                                                               <<03017>>02132000
 @PTR := @SDFMAPBUFFER;                                        <<03017>>02134000
    <<INSURE POINTERS AIM AT FIRST RECORD IN MAP BUFFER>>      <<03017>>02136000
                                                               <<03017>>02138000
                                                               <<03017>>02140000
 DO BEGIN  <<GET THE REQUESTED AREA>>                          <<03017>>02142000
       <<THIS MAY REQUIRE MULTIPLE TRANSFERS FROM>>            <<03017>>02144000
       <<VARIOUS STORAGE RECORDS>>                             <<03017>>02146000
                                                               <<03017>>02148000
   IF XFER'START > DPTR(DSRC'END)                              <<03017>>02150000
   THEN                                                        <<03017>>02152000
       <<START ADDRESS FALLS BEYOND END OF CURRENT>>           <<03017>>02154000
       <<MAP RECORD. WE HAVE TO ADVANCE TO NEXT REC.>>         <<03017>>02156000
     @PTR := @PTR + MAPENTRYSIZE                               <<03017>>02158000
                                                               <<03017>>02160000
   ELSE BEGIN                                                  <<03017>>02162000
       <<START ADDRESS FALLS WITHIN CURRENT RECORD>>           <<03017>>02164000
       <<=========================================>>           <<03017>>02166000
       <<CHECK TO SEE IF REMAINING AMOUNT OF REQUEST>>         <<03017>>02168000
       <<CAN BE SATISFIED FROM THIS STORAGE RECORD>>           <<03017>>02170000
                                                               <<03017>>02172000
     IF END'ADDR <= DPTR(DSRC'END)                             <<03017>>02174000
     THEN                                                      <<03017>>02176000
       <<ENTIRELY CONTAINED WITHIN THIS RECORD>>               <<03017>>02178000
       XFER'LEN :=LOGICAL(END'ADDR-XFER'START) + 1             <<03017>>02180000
     ELSE                                                      <<03017>>02182000
       <<DESIRED REQUEST GOES BEYOND CURRENT RECORD>>          <<03017>>02184000
       <<WE WILL TRANSFER TO END OF THIS RECORD, >>            <<03017>>02186000
       <<AND PICK UP THE REST NEXT PASS AROUND FROM>>          <<03017>>02188000
       <<THE NEXT STORAGE RECORD>>                             <<03017>>02190000
       XFER'LEN := LOGICAL(DPTR(DSRC'END)-XFER'START)+1;       <<03017>>02192000
                                                               <<03017>>02194000
       <<CALCULATE THE OFFSETS FROM THE ACTUAL START>>         <<03017>>02196000
       <<ADDRESS OF THE STORAGE RECORD, TO THE FIRST>>         <<03017>>02198000
       <<DESIRED WORD IN THE STORAGE WE WISH TO ACCESS>>       <<03017>>02200000
                                                               <<03017>>02202000
    WORD'OFFSET := LOGICAL(XFER'START-DPTR(DSRC'START));       <<03017>>02204000
    BANK'OFFSET := XFER'BANK - PTR(SRC'START'HI);              <<03017>>02206000
    SECTOR'OFFSET := DOUBLE( WORD'OFFSET/SAVEAREASECTORSIZE);  <<03605>>02208000
                                                               <<03017>>02210000
       <<BASED ON THE STORAGE RECORD, DETERMINE IF >>          <<03017>>02212000
       <<THIS CURRENT XFER IS FROM MEMORY OR DISC>>            <<03017>>02214000
       <<AND PERFORM THE CURRENT TRANSFER>>                    <<03017>>02216000
                                                               <<03017>>02218000
    IF PTR(STGMEDIA) = MEMORY                                  <<03017>>02220000
    THEN BEGIN                                                 <<03017>>02222000
       <<STORAGE IS IN MEMORY. USE MOVE ABSOLUTE FOR XFER>>    <<03017>>02224000
       <<------------------------------------------------>>    <<03017>>02226000
                                                               <<03017>>02228000
      PUSH(DB);                                                <<03017>>02230000
      TOS:=TOS+@TARGET;           <<DESTINATION>>              <<03017>>02232000
      TOS:=DPTR(DSTG);            <<SOURCE=STORAGE ADDRESS>>   <<03017>>02234000
      LS1 := LS1 + BANK'OFFSET;   <<CORRECT FOR BANK OFFSET>>  <<03017>>02236000
      TOS := TOS+WORD'OFFSET;     <<CORRECT FOR OFFSET>>       <<03017>>02238000
      TOS := XFER'LEN;            <<LENGTH FOR MOVE>>          <<03017>>02240000
                                                               <<03017>>02242000
      ASSEMBLE(MABS);                                          <<03017>>02244000
      @TARGET:=LOGICAL( @TARGET )+XFER'LEN;                    <<03017>>02246000
      END  <<STORAGE IS IN MEMORY>>                            <<03017>>02248000
           <<-------------------->>                            <<03017>>02250000
                                                               <<03017>>02252000
    ELSE BEGIN                                                 <<03017>>02254000
       <<STORAGE IS ON DISC>>                                  <<03017>>02256000
       <<------------------>>                                  <<03017>>02258000
                                                               <<03017>>02260000
      WORD'OFFSET := WORD'OFFSET MOD SAVEAREASECTORSIZE;       <<03605>>02262000
        <<NOW REMAINDER BEYOND SECTOR'OFFSET>>                 <<03017>>02264000
                                                               <<03017>>02266000
      CUR'SECTOR := DPTR(DSTG) + SECTOR'OFFSET;                <<03017>>02268000
        <<ADD OUR KNOWN OFFSET TO START ADDRESS OF STORAGE>>   <<03017>>02270000
        <<THIS WILL BE THE START SECTOR FOR OUR FIRST XFER>>   <<03017>>02272000
                                                               <<03017>>02274000
        <<DETERMINE POSSIBLE NUMBER OF LEADING WORDS UNTIL>>   <<03017>>02276000
        <<THE FIRST SECTOR BOUNDARY>>                          <<03017>>02278000
      LEADING'WORDS:= SAVEAREASECTORSIZE - WORD'OFFSET;        <<03605>>02280000
      LEADING'WORDS:= IF LEADING'WORDS < XFER'LEN              <<03017>>02282000
                      THEN LEADING'WORDS ELSE XFER'LEN;        <<03017>>02284000
                                                               <<03017>>02286000
      IF LEADING'WORDS > 0                                     <<03017>>02288000
      THEN BEGIN                                               <<03017>>02290000
        <<READ THE SECTOR INTO A TEMP BUFFER AND THEN COPY>>   <<03017>>02292000
        <<THE PARTIAL SECTOR OF LEADING WORDS TO TARGET>>      <<03017>>02294000
                                                               <<03017>>02296000
        READISC(SECTORBUF,SAVEAREASECTORSIZE,CUR'SECTOR);      <<03605>>02298000
        MOVE TARGET:=SECTORBUF(WORD'OFFSET),(LEADING'WORDS);   <<03017>>02300000
        CUR'SECTOR:=CUR'SECTOR+1D;                             <<03017>>02302000
        @TARGET:=LOGICAL(@TARGET)+LEADING'WORDS;               <<03017>>02304000
        CUR'LEN := XFER'LEN - LEADING'WORDS;                   <<03017>>02306000
      END;                                                     <<03017>>02308000
                                                               <<03017>>02310000
      TRAILING'WORDS:= CUR'LEN MOD SAVEAREASECTORSIZE;         <<03605>>02312000
      FULL'SECTORS := DOUBLE( CUR'LEN/SAVEAREASECTORSIZE);     <<03605>>02314000
      CUR'LEN := CUR'LEN - TRAILING'WORDS;                     <<03017>>02316000
                                                               <<03017>>02318000
      IF FULL'SECTORS > 0D                                     <<03017>>02320000
      THEN BEGIN                                               <<03017>>02322000
        <<TRANSFER ALL FULL SECTORS DIRECT TO TARGET >>        <<03017>>02324000
        <<IN ONE LARGE DISC READ>>                             <<03017>>02326000
                                                               <<03017>>02328000
        READISC(TARGET, CUR'LEN,CUR'SECTOR);                   <<03017>>02330000
        CUR'SECTOR := CUR'SECTOR + FULL'SECTORS;               <<03017>>02332000
        @TARGET := LOGICAL( @TARGET) + CUR'LEN;                <<03017>>02334000
      END;                                                     <<03017>>02336000
                                                               <<03017>>02338000
      IF TRAILING'WORDS > 0                                    <<03017>>02340000
      THEN BEGIN                                               <<03017>>02342000
        <<TRANSFER THE REMAINING PARTIAL SECTOR DIRECT>>       <<03017>>02344000
        <<TO TARGET IN ONE READ>>                              <<03017>>02346000
                                                               <<03017>>02348000
        READISC( TARGET, TRAILING'WORDS, CUR'SECTOR);          <<03017>>02350000
        @TARGET := LOGICAL(@TARGET) + TRAILING'WORDS;          <<03017>>02352000
      END;                                                     <<03017>>02354000
    END;  <<STORAGE IS ON DISC>>                               <<03017>>02356000
                                                               <<03017>>02358000
       <<UPDATE TCOUNT TO REFLECT THE TRANSFER>>               <<03017>>02360000
       <<AND ADVANCE TO THE NEXT RECORD>>                      <<03017>>02362000
    TCOUNT := TCOUNT - XFER'LEN;                               <<03017>>02364000
    @PTR := @PTR + MAPENTRYSIZE;                               <<03017>>02366000
    XFER'START := XFER'START +DOUBLE(XFER'LEN);                <<03017>>02368000
                                                               <<03017>>02370000
   END; <<START ADDRESS FELL WITHIN CURRENT RECORD>>           <<03017>>02372000
        <<========================================>>           <<03017>>02374000
                                                               <<03017>>02376000
 END UNTIL TCOUNT = 0; <<TOTAL REQUEST IS COMPLETED>>          <<03017>>02378000
                                                               <<03017>>02380000
END; <<PROCEDURE GETAREA>>                                     <<03017>>02382000
PROCEDURE CHECKBACKUP;                                                  02384000
   BEGIN                                                                02386000
   INTEGER ARRAY CHECKSUMBUF(0:127);                                    02388000
   INTEGER CHECKSUM:=%123456;                                           02390000
   DEFINE                                                               02392000
      BOOTSEC       = 3D#;                                              02394000
   EQUATE                                                               02396000
      STACKGLOBALDST = 9,                                               02398000
      SERIALDISCDST  = 15;                                              02400000
   DOUBLE                                                               02402000
      CURRENTDISCWRITE=DB+%26,CURRENTDISCREAD=DB+%30;                   02404000
   <<DETERMINE IF A BACKUP SDF DISC>>                                   02406000
   PERFORMIO(SERIALDEVICE,INPUT,CHECKSUMBUF,SECTORSIZE,BOOTSEC);        02408000
   FOR XREG:=1 UNTIL SECTORSIZE-1 DO                                    02410000
      CHECKSUM:=CHECKSUM+CHECKSUMBUF(XREG);                             02412000
   IF CHECKSUM = CHECKSUMBUF THEN                                       02414000
      BEGIN  <<BACKUP DISC, SKIP OVER SDFLOAD FILE>>                    02416000
      PERFORMIO(SERIALDEVICE,FORWARDSPACEFILE);                         02418000
      EXCHANGEDB(SERIALDISCDST);                                        02420000
      CURRENTDISCWRITE:=CURRENTDISCREAD;                                02422000
      EXCHANGEDB(STACKGLOBALDST);                                       02424000
      CTBACKUPDUMP:=1                                                   02426000
      END                                                               02428000
   ELSE                                                                 02430000
      BEGIN                                                             02432000
      PERFORMIO(SERIALDEVICE,WRITEOF);                                  02434000
      CTBACKUPDUMP:=0;                                                  02436000
      END;                                                              02438000
   END  <<CHECKBACKUP>>;                                                02440000
$PAGE "COMMAND PARAMETER ANALYZER."                                     02442000
LOGICAL PROCEDURE GETNEXTPARM(KEYWORDICT,TYPE,PARMVALUE,PARMADDR,       02444000
   DELIMNUM,DEFN,DPARM);                                                02446000
BYTE ARRAY KEYWORDICT;                                                  02448000
INTEGER TYPE,PARMVALUE,DELIMNUM;                                        02450000
BYTE POINTER PARMADDR,DEFN;                                             02452000
DOUBLE DPARM;                                                           02454000
OPTION VARIABLE;                                                        02456000
   BEGIN                                                                02458000
   <<OBTAINS THE NEXT PARAMETER FROM THE CURRENT COMMAND                02460000
     INPUT                                                              02462000
       KEYWORD        - SEARCH DICTIONARY FOR (POSSIBLE) KEYWORD        02464000
                        COMMAND.  SHOULD BE IN THE SAME FORMAT AS       02466000
                        THE "DICT" COMMAND OF THE SEARCH INTRINSIC.     02468000
     OUTPUT:                                                            02470000
       GETNEXTPARM    TRUE = A PARAMETER WAS FOUND                      02472000
                      FALSE= NO MORE PARAMETERS ON THE CURRENT KEYWORD  02474000
                            (IF NOT EXECUTING IN A KEYWORD THEN NO      02476000
                            MORE PARAMETERS IN THIS COMMAND).           02478000
       TYPE           0 = KEY WORD.                                     02480000
                      1 = ALPHANUMERIC WITH MATCH IN DICTIONARY.        02482000
                      2 = ALPHANUMERIC.                                 02484000
                      3 = NUMERIC.                                      02486000
                      4 = INVALID PARAMETER.                            02488000
       PARMVALUE      - VALUE RETURNED IS DEPENDANT OF THE VALUE OF     02490000
                        "GETNEXTPARM".                                  02492000
                        GETNEXTPARM VALUE.   PARMVALUE MEANING.         02494000
                        -----------------    -----------------          02496000
                        0                    UNDEFINED.                 02498000
                        1                    BINARY VALUE.              02500000
                        2                    ENTRY NUMBER IN COMMAND    02502000
                                             DICTIONARY.                02504000
                        3                    ENTRY NUMBER IN COMMAND    02506000
                                             DICTIONARY.                02508000
                        4                    LENGTH OF ALPHANUMERIC SEQ.02510000
                        5                    ILLEGAL PARAMETER VALUE.   02512000
       PARMADDR       - BYTE ADDRESS OF THE PARAMETER                   02514000
       DELIMNUM       - TYPE OF DELIMITER                               02516000
                        0  COMMA                                        02518000
                        1  DASH                                         02520000
                        2  SEMICOLON                                    02522000
                        3  CARRIAGE RETURN                              02524000
                        4  EQUAL                                        02526000
       DEFN           - BYTE ADDRESS OF THE "DEFINITION" PORTION OF THE 02528000
                        KEYWORD COMMANDS AND ALPHA DICTIONARY COMMANDS. 02530000
   >>                                                                   02532000
   OWN LOGICAL                                                          02534000
      ENDOFKEYWORD:=FALSE;                                              02536000
   INTEGER                                                              02538000
      I,EN,DUMPARMVAL,DEFNADDRESS=Q-6,PARMVALUEADDRESS=Q-9,             02540000
      TYPEADDRESS=Q-10,KEYWORDICTADDRESS=Q-11,DUMTYPE,PARMLENGTH,       02542000
      DUMDICT:=0;                                                       02544000
   BYTE POINTER                                                         02546000
      PARMADDRESS,DUMPNTR:=@DUMDICT;                                    02548000
   INTEGER                                                              02550000
     DUMDUM=DUMPNTR;                                                    02552000
   POINTER                                                              02554000
      DUMDEFNADDRESS:=@DUMDUM;                                          02556000
   EQUATE                                                               02558000
      BINARYTYPE       = 2;                                             02560000
   DEFINE                                                               02562000
      KEYWORDICTPRES   = PMAP.(9:1) #,                                  02564000
      TYPEPRES         = PMAP.(10:1)#,                                  02566000
      PARMVALUEPRES    = PMAP.(11:1)#,                                  02568000
      PARMADDRPRES     = PMAP.(12:1)#,                                  02570000
      DELIMPRES        = PMAP.(13:1)#,                                  02572000
      DEFNPRES         = PMAP.(14:1)#,                                  02574000
      DPARMPRES        = PMAP.(15:1)#,                                  02576000
      ENTRYNUMBER      = PARMVALUE#,                                    02578000
      BINARYVALUE      = PARMVALUE#,                                    02580000
      PARAMETERADDRESS = DEFN#,                                         02582000
      PPARMADDRESS     = PARMS(I-1)#,                                   02584000
      PPARMLENGTH      = PARMS(I).(0:8)#,                               02586000
      PCHARTYPE        = PARMS(I).(8:3)#,                               02588000
      PPARMTYPE        = PARMS(I).(11:5)#;                              02590000
                                                                        02592000
   <<TEST FOR PRESENCE OF PARAMETERS>>                                  02594000
   IF NOT DEFNPRES THEN DEFNADDRESS:=@DUMDEFNADDRESS;                   02596000
   IF NOT PARMVALUEPRES THEN PARMVALUEADDRESS:=@DUMPARMVAL;             02598000
   IF NOT TYPEPRES THEN TYPEADDRESS:=@DUMTYPE;                          02600000
   IF NOT KEYWORDICTPRES THEN KEYWORDICTADDRESS:=@DUMDICT;              02602000
                                                                        02604000
   <<CHECK IF AT END OF COMMAND OR KEYWORD>>                            02606000
   I:=2*CURRENTPARM-1;                                                  02608000
   IF PARMADDRPRES THEN @PARMADDR:=PPARMADDRESS+PPARMLENGTH;            02610000
   IF ENDOFKEYWORD THEN                                                 02612000
      BEGIN                                                             02614000
      ENDOFKEYWORD:=FALSE;                                              02616000
      IF CURRENTPARM <> 0 THEN RETURN;                                  02618000
      END;                                                              02620000
   IF CURRENTPARM+1 > NUMPARMS THEN RETURN;                             02622000
   I:=I+2; CURRENTPARM:=CURRENTPARM+1;                                  02624000
   GETNEXTPARM:=TRUE;                                                   02626000
   IF DELIMPRES THEN DELIMNUM:=PPARMTYPE;                               02628000
                                                                        02630000
   <<GET PARAMETER ADDRESS AND LENGTH>>                                 02632000
   @PARMADDRESS:=PPARMADDRESS;                                          02634000
   IF PARMADDRPRES THEN @PARMADDR:=@PARMADDRESS;                        02636000
   IF PPARMTYPE = SEMICOLON THEN ENDOFKEYWORD:=TRUE;                    02638000
                                                                        02640000
   <<START PARAMETER CATAGORIZATION>>                                   02642000
   IF (PARMLENGTH:=PPARMLENGTH) = 0 THEN                                02644000
      TYPE:=NULLPARM                                                    02646000
   ELSE IF PPARMTYPE = EQUAL THEN                                       02648000
      TYPE:=  <<KEYWORD PARAMETER>>                                     02650000
        IF (ENTRYNUMBER:=SEARCH(PARMADDRESS,PARMLENGTH,KEYWORDICT,DEFN))02652000
        <> 0 THEN KEYWORDPARM ELSE INVALIDPARM                          02654000
   ELSE                                                                 02656000
      BEGIN   <<POSITIONAL PARAMETER>>                                  02658000
      <<SEE IF THE PARAMETER CAN BE FOUND IN THE DICTIONARY>>           02660000
      IF (EN:=SEARCH(PARMADDRESS,PARMLENGTH,KEYWORDICT,DEFN))<>0 THEN   02662000
         BEGIN                                                          02664000
         TYPE:=DICTIONARYPARM;                                          02666000
         ENTRYNUMBER:=EN                                                02668000
         END                                                            02670000
      ELSE                                                              02672000
         BEGIN   <<TEST IF NUMERIC>>                                    02674000
         IF DPARMPRES THEN                                              02676000
            DPARM:=DBINARY(PARMADDRESS,PARMLENGTH)                      02678000
         ELSE                                                           02680000
            BINARYVALUE:=BINARY(PARMADDRESS,PARMLENGTH);                02682000
         TYPE:=IF = THEN NUMERICPARM ELSE ALPHANUMERICPARM;             02684000
         END  <<NUMERIC PARAMETER TEST>>;                               02686000
      END  <<POSITIONAL PARAMETER>>;                                    02688000
   END  <<GETNEXTPARM>>;                                                02690000
$PAGE "SYNTAX CHECKING ROUTINES"                                        02692000
LOGICAL PROCEDURE DUMPSYNTAX;                                           02694000
   BEGIN                                                                02696000
   BYTE POINTER PARMADDR;                                               02698000
   INTEGER TYPE,PV,DELIMNUM;                                            02700000
   DOUBLE DPV;                                                          02702000
                                                                        02704000
   SUBROUTINE LEAVE(MESSAGE);                                           02706000
   BYTE ARRAY MESSAGE;                                                  02708000
      BEGIN                                                             02710000
      IF MESSAGE <> "SUCCESSFUL" THEN                                   02712000
         PRINTERROR(MESSAGE,PARMADDR)                                   02714000
      ELSE                                                              02716000
         DUMPSYNTAX:=TRUE;                                              02718000
      ASSEMBLE(EXIT 0);                                                 02720000
      END  <<LEAVE>>;                                                   02722000
SUBROUTINE DSRANGECHECK(FIRSTVALUE);                                    02724000
VALUE FIRSTVALUE;                                                       02726000
INTEGER FIRSTVALUE;                                                     02728000
   BEGIN                                                                02730000
   IF NOT GETNEXTPARM(,TYPE,PV,PARMADDR) OR TYPE <> NUMERICPARM THEN    02732000
      LEAVE(EXPECTEDNUMBER);                                            02734000
   IF FIRSTVALUE > PV THEN LEAVE(INVALIDRANGE);                         02736000
   END  <<DSRANGECHECK>>;                                               02738000
                                                                        02740000
SUBROUTINE DISCRANGECHECK(FIRSTVALUE);                                  02742000
VALUE FIRSTVALUE;                                                       02744000
DOUBLE FIRSTVALUE;                                                      02746000
   BEGIN                                                                02748000
   IF NOT GETNEXTPARM(,TYPE,,PARMADDR,,,DPV) OR TYPE <> NUMERICPARM THEN02750000
      LEAVE(EXPECTEDNUMBER);                                            02752000
   IF FIRSTVALUE > DPV THEN LEAVE(INVALIDRANGE);                        02754000
   END  <<DISCRANGECHECK>>;                                             02756000
                                                                        02758000
   IF GETNEXTPARM(,TYPE,PV,PARMADDR) THEN                               02760000
      BEGIN  <<PARAMETER SCAN>>                                         02762000
      <<NUMBER OF BANKS>>                                               02764000
      IF TYPE <> NULLPARM THEN                                          02766000
         BEGIN                                                          02768000
         IF TYPE <> NUMERICPARM THEN LEAVE(EXPECTEDNUMBER);             02770000
         IF NOT (0<= PV <= MAXBANK) THEN LEAVE(INVALIDVALUE);           02772000
         END;                                                           02774000
      IF GETNEXTPARM(,,,PARMADDR) THEN LEAVE(EXTRAPARM);                02776000
      WHILE GETNEXTPARM(DUMPDICT,TYPE,PV,PARMADDR) DO                   02778000
         BEGIN  <<KEYWORD SCAN>>                                        02780000
         IF TYPE <> KEYWORDPARM THEN LEAVE(EXPECTEDKEYWORD);            02782000
         IF PV = VIRTUALMEMORY THEN                                     02784000
            BEGIN  <<VIRTUAL MEMORY DATA SEGMENTS>>                     02786000
            IF NOT GETNEXTPARM(VIRTDICT,TYPE,PV,PARMADDR,DELIMNUM) THEN 02788000
               LEAVE(EXPECTEDPARM);                                     02790000
            DO IF TYPE = NUMERICPARM AND PV<>0 THEN                     02792000
               BEGIN                                                    02794000
               IF DELIMNUM = DASH THEN DSRANGECHECK(PV);                02796000
               END                                                      02798000
            ELSE IF TYPE <> DICTIONARYPARM THEN                         02800000
               LEAVE(INVALIDVALUE)                                      02802000
            UNTIL NOT GETNEXTPARM(VIRTDICT,TYPE,PV,PARMADDR,DELIMNUM);  02804000
            END                                                         02806000
         ELSE                                                           02808000
            BEGIN   <<DISC SECTORS>>                                    02810000
            IF NOT GETNEXTPARM(,TYPE,,PARMADDR,DELIMNUM,,DPV) THEN      02812000
               LEAVE(EXPECTEDPARM);                                     02814000
            DO                                                          02816000
               IF TYPE <> NUMERICPARM THEN                              02818000
                  LEAVE(EXPECTEDNUMBER)                                 02820000
               ELSE IF DELIMNUM = DASH THEN                             02822000
                  DISCRANGECHECK(DPV)                                   02824000
            UNTIL NOT GETNEXTPARM(,TYPE,,PARMADDR,DELIMNUM,,DPV);       02826000
            END;                                                        02828000
         END  <<KEYWORD SCAN>>;                                         02830000
      END  <<PARAMETER SCAN>>;                                          02832000
   LEAVE(SUCCESSFUL);                                                   02834000
   END  <<DUMPSYNTAX>>;                                                 02836000
LOGICAL PROCEDURE CONSOLESYNTAX;                                        02838000
   BEGIN                                                                02840000
   BYTE POINTER PARMADDR;                                               02842000
   INTEGER TYPE,PARMVALUE;                                              02844000
   IF GETNEXTPARM(,TYPE,PARMVALUE,PARMADDR) THEN                        02846000
      BEGIN                                                             02848000
      IF TYPE <> NUMERICPARM THEN                                       02850000
         PRINTERROR(EXPECTEDNUMBER,PARMADDR)                            02852000
      ELSE IF NOT (MINDRT <= PARMVALUE <= MAXDRT) THEN                  02854000
         PRINTERROR(INVALIDVALUE,PARMADDR)                              02856000
      ELSE                                                              02858000
         CONSOLESYNTAX:=TRUE;                                           02860000
      END  <<DRT PARAMETER>>                                            02862000
   ELSE                                                                 02864000
      PRINTERROR(EXPECTEDPARM);                                         02866000
   END  <<CONSOLESYNTAX>>;                                              02868000
LOGICAL PROCEDURE DUMPDEVSYNTAX;                                        02870000
   BEGIN                                                                02872000
   BYTE POINTER PARMADDR;                                               02874000
   INTEGER TYPE,PARMVALUE;                                              02876000
   IF GETNEXTPARM(DUMPDEVDICT,TYPE,PARMVALUE,PARMADDR) THEN             02878000
      BEGIN  <<PARAMETER SCAN>>                                         02880000
      IF TYPE = DICTIONARYPARM THEN                                     02882000
         DUMPDEVSYNTAX:=TRUE                                            02884000
      ELSE IF TYPE = NUMERICPARM THEN                                   02886000
         BEGIN  <<DRT,UNIT SCAN>>                                       02888000
         IF NOT(MINDRT <= PARMVALUE <= MAXDRT) THEN                     02890000
            PRINTERROR(INVALIDVALUE,PARMADDR);                          02892000
         ELSE IF GETNEXTPARM(,TYPE,PARMVALUE,PARMADDR) THEN             02894000
            BEGIN  <<UNIT>>                                             02896000
            IF TYPE <> NUMERICPARM THEN                                 02898000
               PRINTERROR(EXPECTEDNUMBER,PARMADDR)                      02900000
            ELSE IF NOT (0<=PARMVALUE<=MAXUNIT) THEN                    02902000
               PRINTERROR(INVALIDVALUE,PARMADDR)                        02904000
            ELSE                                                        02906000
               DUMPDEVSYNTAX:=TRUE;                                     02908000
            END  <<UNIT>>                                               02910000
         ELSE                                                           02912000
            DUMPDEVSYNTAX:=TRUE;                                        02914000
         END  <<DRT,UNIT SCAN>>                                         02916000
      ELSE                                                              02918000
         PRINTERROR(INVALIDVALUE,PARMADDR);                             02920000
      END  <<PARAMETER SCAN>>;                                          02922000
   ELSE                                                                 02924000
      PRINTERROR(EXPECTEDPARM);                                         02926000
   END  <<DUMPDEVSYNTAX>>;                                              02928000
LOGICAL PROCEDURE EXPLAINSYNTAX;                                        02930000
   BEGIN                                                                02932000
   INTEGER TYPE;                                                        02934000
   BYTE POINTER PARMADDR;                                               02936000
   IF GETNEXTPARM(COMMANDICT,TYPE,,PARMADDR) THEN                       02938000
      DO                                                                02940000
         IF TYPE <> DICTIONARYPARM THEN                                 02942000
            BEGIN                                                       02944000
            PRINTERROR(UNKNOWNCOMMAND,PARMADDR);                        02946000
            RETURN;                                                     02948000
            END                                                         02950000
      UNTIL NOT GETNEXTPARM(COMMANDICT,TYPE,,PARMADDR);                 02952000
   EXPLAINSYNTAX:=TRUE;                                                 02954000
   END  <<EXPLAINSYNTAX>>;                                              02956000
$PAGE "COMMAND EXECUTOR ROUTINES"                                       02958000
PROCEDURE DUMP(DUMPMODE);                                               02960000
VALUE DUMPMODE;                                                         02962000
INTEGER                                                                 02964000
   DUMPMODE;          <<0 - DUMP TO SERIAL DISC/MAG TAPE>>              02966000
                      <<1 - DUMP TO DISC FILE>>                         02968000
   BEGIN                                                                02970000
   EQUATE                                                               02972000
      DESCLENGTH     = 4,                                               02974000
      VACANT         = %100000,                                         02976000
      DBUFSIZE       = 4096,                                            02978000
      BANKSDUMPEDLOC = %1423,                                           02980000
      BANKLIMIT      = 15,  <<64K/DBUFSIZE-1>>                          02982000
      VHEADERLENGTH  = 7,                                               02984000
      DATASEGMENTID  = 0,                                               02986000
      DUMPSYSDISCID  = 1;                                               02988000
   DEFINE                                                               02990000
      BOOTSEC        = 3D#,                                             02992000
      DSTLOC         = 2D#,                                             02994000
      DBUFNUMSECTOR  = DOUBLE(DBUFSIZE/SECTORSIZE)#,                    02996000
                                                                        02998000
      <<DATA SEGMENT HEADER FORMAT>>                                    03000000
      VID            = DUMPBUF       #,                                 03002000
      VDSEGNUM       = DUMPBUF(1)    #,                                 03004000
      VDSEGLEN       = DUMPBUF(2)    #,                                 03006000
      VDSEGDESC      = DUMPBUF(3)    #,                                 03008000
                                                                        03010000
      <<DISC SECTOR HEADER FORMAT>>                                     03012000
      DID            = DUMPBUF       #,                                 03014000
      DSECTORLEN     = DUMPBUF(1)    #,                                 03016000
      DFIRSTSECNUM   = DUMPBUFD(1)   #,                                 03018000
      DNUMSEC        = DUMPBUFD(2)   #,                                 03020000
                                                                        03022000
      <<DATA SEGMENT TABLE ENTRY>>                                      03024000
      DSABSENT       = DESC0.(0:1)= 1#,                                 03026000
      DSLENGTH       = DESC0.(3:13)  #,                                 03028000
      DSBANKNUM      = DESC2.(12:4)  #,                                 03030000
      DSADDRESS      = DESC3         #,                                 03032000
      DSHIORDERDISC  = DESC2.(12:4)  #,                                 03034000
      DSLORDERDISC   = DESC3         #;                                 03036000
                                                                        03038000
   <<VARIABLES USED BY ALL SUBROUTINES>>                                03040000
   DOUBLE                                                               03042000
      DATASEGMENTSECTOR,NUMSEC,SECTORNUM,SECTORLIMIT;                   03044000
   INTEGER                                                              03046000
      TYPE,PARMVALUE,BANKNUM,I,J,VESTIGE,LASTDATASEG,LENGTH,DSTADDR,    03048000
      HEADR,DELIMNUM,DESC0,DESC1,DESC2,DESC3;                           03050000
   ARRAY DESC(*)=DESC0,DUMPBUF(0:DBUFSIZE);                             03052000
   ARRAY                                                                03054000
      DISCNUMBUFFER(0:9),FLAB(0:76);                                    03056000
   DOUBLE ARRAY                                                         03058000
      DUMPBUFD(*)=DUMPBUF,FLABD(*)=FLAB;                                03060000
                                                                        03062000
   <<VARIABLES USED BY OUTPUTDUMP>>                                     03064000
   EQUATE                                                               03066000
      ENDOFTAPE       = %31;                                            03068000
   DOUBLE                                                               03070000
      DVRSTAT,DFILESECTOR;                                              03072000
   INTEGER                                                              03074000
      STAT=DVRSTAT,NEXTDISCNUM:=0;                                      03076000
                                                                        03078000
   <<VARIABLES USED BY DUMPDSEG>>                                       03080000
   INTEGER                                                              03082000
      COUNT,SEC0=DATASEGMENTSECTOR,SEC1=DATASEGMENTSECTOR+1,            03084000
      STARTSEG=PARMVALUE,ENDSEG;                                        03086000
                                                                        03088000
                                                                        03090000
   <<VARIABLES USED BY DUMPSYSTEMSEGMENT>>                              03092000
   DEFINE                                                               03094000
      SYSTEMSEGMENT      = LOGICAL(DESC2.(11:1))#;                      03096000
                                                                        03098000
   <<VARIABLES USED BY DUMPSTACKS>>                                     03100000
   ARRAY                                                                03102000
      VDSL(0:1023);                                                     03104000
   INTEGER                                                              03106000
      VDSLENGTH;                                                        03108000
   DEFINE                                                               03110000
      STACKDATASEGMENT   = VDSL(I).(3:1)#;                              03112000
   EQUATE                                                               03114000
      VDSL'DST           = 40;                                          03116000
                                                                        03118000
   SUBROUTINE DUMPDISCIO(FUNCTION,TARGET,TCOUNT,SECTOR);                03120000
   VALUE FUNCTION,TCOUNT,SECTOR;                                        03122000
   INTEGER FUNCTION,TCOUNT;                                             03124000
   ARRAY TARGET;                                                        03126000
   DOUBLE SECTOR;                                                       03128000
      BEGIN                                                             03130000
      PERFORMIO(DUMPDISC,FUNCTION,TARGET,TCOUNT,DFILESECTOR);           03132000
      IF <> THEN                                                        03134000
         BEGIN  <<ERROR ON ACCESSING DUMP FILE>>                        03136000
         PRINTSTRING(DUMPDEVICEFAIL);                                   03138000
         ASSEMBLE(EXIT 1);                                              03140000
         END;                                                           03142000
      END  <<DUMPDISCIO>>;                                              03144000
                                                                        03146000
   SUBROUTINE OUTPUTDUMP(TARGET,TCOUNT);                                03148000
   VALUE TCOUNT;                                                        03150000
   ARRAY TARGET;                                                        03152000
   INTEGER TCOUNT;                                                      03154000
   BEGIN                                                                03156000
      IF DUMPMODE = DISCFILEDUMP THEN                                   03158000
         BEGIN  <<DUMP TO DISC FILE>>                                   03160000
         IF DOUBLE(FLNUMRECORDS:=FLNUMRECORDS+1) > FLMAXNUMRECORDS THEN 03162000
            BEGIN  <<END-OF-FILE>>                                      03164000
            PRINTSTRING(EXHAUSTEDUMPFILE);                              03166000
            ASSEMBLE(EXIT 1);                                           03168000
            END;                                                        03170000
         DFILESECTOR:=DOUBLE((FLNUMRECORDS-1)*FLBLOCKSIZE)+FLEXTENTBASE;03172000
         DUMPDISCIO(OUTPUT,TARGET,TCOUNT,DFILESECTOR);                  03174000
         END  <<DUMP FILE MODE>>                                        03176000
      ELSE                                                              03178000
         BEGIN  <<SERIAL DEVICE DUMP MODE>>                             03180000
         DO                                                             03182000
            BEGIN  <<ATTEMPT TO WRITE THE RECORD>>                      03184000
            DVRSTAT:=PERFORMIO(SERIALDEVICE,OUTPUT,TARGET,TCOUNT);      03186000
            IF <> THEN                                                  03188000
               BEGIN  <<I/O PROBLEM>>                                   03190000
               IF STAT = ENDOFTAPE THEN                                 03192000
                  BEGIN                                                 03194000
                  <<WRITE EOF, # OF NEXT DISC, AND 2 EOFS>>             03196000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      03198000
                  DISCNUMBUFFER:=(NEXTDISCNUM:=NEXTDISCNUM+1);          03200000
                  MOVE DISCNUMBUFFER(1):=DISCNUMBUFFER,(9);             03202000
                  PERFORMIO(SERIALDEVICE,OUTPUT,DISCNUMBUFFER,10);      03204000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      03206000
                  PERFORMIO(SERIALDEVICE,WRITEOF);                      03208000
                  PERFORMIO(SERIALDEVICE,DEVICECLOSE);                  03210000
                  <<MOUNT NEW DISC, WRITE DISC #>>                      03212000
                  PRINTSTRING(EOTSERIALDEVICE);                         03214000
                  IF CTDUMPDEVTYPE<>TMAGTAPE                   <<03749>>03216000
                    THEN WAITINSERTDISC(1);<<For serial discs>><<03749>>03218000
                  CHANGEDEVICE(,CTDUMPDEVDESC);                         03220000
                  IF CTDUMPDEVTYPE<>TMAGTAPE                   <<03749>>03222000
                    THEN CHECKBACKUP;      <<For serial discs>><<03749>>03224000
                  PERFORMIO(SERIALDEVICE,OUTPUT,DISCNUMBUFFER,10);      03226000
                  END                                                   03228000
               ELSE                                                     03230000
                  BEGIN  <<I/O FAILURE ON SERIAL DEVICE>>               03232000
                  MODE:=INTERACTIVE;                           <<03110>>03234000
                  <<Tell user to use new media and   >>        <<03110>>03236000
                  <<try again                        >>        <<03110>>03238000
                  PRINTSTRING(TRYAGAIN1);                      <<03110>>03240000
                  PRINTSTRING(TRYAGAIN2);                      <<03110>>03242000
                  PRINTSTRING(TRYAGAIN3);                      <<03110>>03244000
                  PRINTSTRING(TRYAGAIN4);                      <<03110>>03246000
                  ASSEMBLE(EXIT 1);                                     03248000
  << Exit back to SDF Mainline with MODE set to INTERACTIVE >> <<03749>>03250000
                  END;                                                  03252000
               END  <<I/O PROBLEM>>;                                    03254000
            END UNTIL STAT <> ENDOFTAPE;                                03256000
         END  <<SERIAL DEVICE DUMP MODE>>;                              03258000
      END  <<OUTPUTDUMP>>;                                              03260000
                                                                        03262000
   SUBROUTINE DUMPDATASEGMENT(DATASEGMENT);                             03264000
   VALUE DATASEGMENT;                                                   03266000
   INTEGER DATASEGMENT;                                                 03268000
      BEGIN                                                             03270000
      <<GET CONTENTS OF THE SEGMENT'S DESCRIPTOR IN THE DATA SEGMENT    03272000
        TABLE.                                                          03274000
      >>                                                                03276000
      GETAREA(DOUBLE(DSTADDR+4*DATASEGMENT),DESC,DESCLENGTH);           03278000
                                                                        03280000
      IF (DATASEGMENT < LASTDATASEG) OR (DESC0 <> VACANT) THEN          03282000
         BEGIN  <<SEGMENT EXISTS>>                                      03284000
         IF DSABSENT OR DSBANKNUM > BANKNUM THEN                        03286000
            BEGIN  <<SEGMENT WAS NOT WRITTEN OUT IN MEMORY DUMP>>       03288000
            <<FORMAT HEADER FIELD>>                                     03290000
            VID:=DATASEGMENTID; VDSEGNUM:=DATASEGMENT;                  03292000
            MOVE VDSEGDESC:=DESC,(4);                                   03294000
            HEADR:=SECTORSIZE;  <<MAKE ROOM FOR HEADER FIELD>>          03296000
            IF (LENGTH:=4*DSLENGTH) = 0 THEN                            03298000
               OUTPUTDUMP(DUMPBUF,VHEADERLENGTH)                        03300000
            ELSE IF DSABSENT THEN                                       03302000
               BEGIN                                                    03304000
               SEC0:=DSHIORDERDISC; SEC1:=DSLORDERDISC;                 03306000
               WHILE LENGTH > 0 DO                                      03308000
                  BEGIN                                                 03310000
                  COUNT:=IF LENGTH>DBUFSIZE THEN DBUFSIZE ELSE LENGTH;  03312000
                  READISC(DUMPBUF(HEADR),COUNT,DATASEGMENTSECTOR);      03314000
                  OUTPUTDUMP(DUMPBUF,COUNT+HEADR);                      03316000
                  HEADR:=0;                                             03318000
                  LENGTH:=LENGTH-DBUFSIZE;                              03320000
                  DATASEGMENTSECTOR:=DATASEGMENTSECTOR-DBUFNUMSECTOR;   03322000
                  END  <<WHILE>>;                                       03324000
               END  <<ABSENT DATA SEGMENT>>                             03326000
            ELSE                                                        03328000
               BEGIN  <<PRESENT DATA SEGMENT>>                          03330000
               WHILE LENGTH > 0 DO                                      03332000
                  BEGIN                                                 03334000
                  COUNT:=IF LENGTH>DBUFSIZE THEN DBUFSIZE ELSE LENGTH;  03336000
                  TOS:=DSBANKNUM; TOS:=DSADDRESS;                       03338000
                  GETAREA(*,DUMPBUF,COUNT);                             03340000
                  DSADDRESS:=DSADDRESS+DBUFSIZE;                        03342000
                  OUTPUTDUMP(DUMPBUF,COUNT);                            03344000
                  LENGTH:=LENGTH-DBUFSIZE;                              03346000
                  END  <<WHILE>>;                                       03348000
               END  <<PRESENT DATA SEGMENT>>;                           03350000
            END  <<DUMPABLE DATA SEGMENT>>;                             03352000
         END  <<SEGMENT EXISTS>>;                                       03354000
      END  <<DUMPDATASEGMENT>>;                                         03356000
   SUBROUTINE DUMPSTACKS;                                               03358000
      BEGIN                                                             03360000
      GETAREA(DOUBLE(DSTADDR+4*VDSL'DST),DESC,DESCLENGTH);              03362000
      VDSLENGTH:=4*DSLENGTH;                                            03364000
      GETAREA(DOUBLE(DSADDRESS),VDSL,VDSLENGTH);                        03366000
      FOR I:=0 UNTIL LASTDATASEG DO                                     03368000
         IF STACKDATASEGMENT THEN DUMPDATASEGMENT(I);                   03370000
      END  <<DUMPSTACKS>>;                                              03372000
                                                                        03374000
   SUBROUTINE DUMPSYSTEMSEGMENTS;                                       03376000
      BEGIN                                                             03378000
      FOR I:=1 UNTIL LASTDATASEG DO                                     03380000
         BEGIN                                                          03382000
         GETAREA(DOUBLE(DSTADDR+4*I),DESC,DESCLENGTH);                  03384000
         IF SYSTEMSEGMENT THEN DUMPDATASEGMENT(I);                      03386000
         END;                                                           03388000
      END  <<DUMPSYSTEMSEGMENTS>>;                                      03390000
                                                                        03392000
    SUBROUTINE DUMPVIRTUALMEMORY;                                       03394000
      BEGIN                                                             03396000
      WHILE GETNEXTPARM(VIRTDICT,TYPE,PARMVALUE,,DELIMNUM) DO           03398000
         IF TYPE = NUMERICPARM THEN                                     03400000
            BEGIN                                                       03402000
            IF DELIMNUM = DASH THEN                                     03404000
               GETNEXTPARM(,,ENDSEG)                                    03406000
            ELSE                                                        03408000
               ENDSEG:=STARTSEG;                                        03410000
            FOR I:=STARTSEG UNTIL ENDSEG DO DUMPDATASEGMENT(I);         03412000
            END  <<NUMERIC PARAMETER>>                                  03414000
         ELSE                                                           03416000
            CASE PARMVALUE-1 OF    <<KEYWORD PARAMETER>>                03418000
               BEGIN                                                    03420000
               FOR I:=1 UNTIL LASTDATASEG DO DUMPDATASEGMENT(I);<<ALL>> 03422000
               DUMPSTACKS;                                   <<STACKS>> 03424000
               DUMPSYSTEMSEGMENTS;                           <<SYSTEM>> 03426000
               END  <<CASE>>;                                           03428000
      END  <<DUMPVIRTUALMEMORY>>;                                       03430000
                                                                        03432000
   SUBROUTINE DUMPSYSDISC;                                              03434000
      BEGIN                                                             03436000
      WHILE GETNEXTPARM(,,,,DELIMNUM,,SECTORNUM) DO                     03438000
         BEGIN                                                          03440000
         <<FORMAT HEADER RECORD>>                                       03442000
         DID:=DUMPSYSDISCID; DSECTORLEN:=SECTORSIZE;                    03444000
         DFIRSTSECNUM:=SECTORNUM;                                       03446000
         IF DELIMNUM = DASH THEN                                        03448000
            GETNEXTPARM(,,,,,,SECTORLIMIT)                              03450000
         ELSE                                                           03452000
            SECTORLIMIT:=SECTORNUM;                                     03454000
         DNUMSEC:=NUMSEC:=SECTORLIMIT-SECTORNUM+1D;                     03456000
         HEADR:=SECTORSIZE;                                             03458000
         <<WRITE OUT THE SECTORS>>                                      03460000
         WHILE NUMSEC >= DBUFNUMSECTOR DO                               03462000
            BEGIN                                                       03464000
            <<WRITE OUT A BUFFERSIZE WORTH OF THE SECTORS>>             03466000
            READISC(DUMPBUF(HEADR),DBUFSIZE-HEADR,SECTORNUM);           03468000
            OUTPUTDUMP(DUMPBUF,DBUFSIZE);                               03470000
            HEADR:=0;                                                   03472000
            NUMSEC:=NUMSEC-DBUFNUMSECTOR;                               03474000
            SECTORNUM:=SECTORNUM+DBUFNUMSECTOR;                         03476000
            END;                                                        03478000
         IF (VESTIGE:=INTEGER(NUMSEC)*SECTORSIZE) > 0 THEN              03480000
            BEGIN                                                       03482000
            <<WRITE OUT THE REMAINING SECTORS (PARTIAL RECORD>>         03484000
            READISC(DUMPBUF(HEADR),VESTIGE,SECTORNUM);                  03486000
            OUTPUTDUMP(DUMPBUF(HEADR),VESTIGE);                         03488000
            END;                                                        03490000
         END  <<WHILE>>;                                                03492000
      END  <<DUMPSYSDISC>>;                                             03494000
                                                               <<03749>>03496000
<< ** Procedure DUMP Mainline ** >>                            <<03749>>03498000
                                                                        03500000
   <<REWIND THE DUMP DEVICE>>                                           03502000
   IF DUMPMODE = DISCFILEDUMP THEN                                      03504000
      MOVE FLAB:=OLDFLAB,(FLABLEN)                                      03506000
   ELSE                                                                 03508000
      BEGIN                                                             03510000
      IF CTDUMPDEVDESC = 0D THEN                                        03512000
         BEGIN                                                          03514000
         PRINTSTRING(NODUMPDEVICE);                                     03516000
         MODE:=INTERACTIVE; <<If no dump device is configured>><<03749>>03518000
                            <<then go into interactive mode  >><<03749>>03520000
         RETURN;                                                        03522000
         END;                                                           03524000
      CHANGEDEVICE(,CTDUMPDEVDESC);                                     03526000
      IF < THEN                                                         03528000
         BEGIN  <<NOT A SERIAL DEVICE>>                                 03530000
         PRINTSTRING(BADEVICE);                                         03532000
         RETURN;                                                        03534000
         END;                                                           03536000
      <<DETERMINE IF A BACKUP SDF DISC>>                                03538000
      IF CTDUMPDEVTYPE <> TMAGTAPE THEN CHECKBACKUP;                    03540000
      END;                                                              03542000
                                                                        03544000
   IF (CTSYSDISCDEVTYP=T'CS'80)AND(CTSYSDISCSUBTYP=STYPE'A9140)<<03605>>03546000
   THEN BEGIN                                                  <<03605>>03548000
        SAVEAREASECTORSIZE:=QUADRUPLESECTORSIZE;               <<03605>>03550000
        <<A LINUS SECTOR IS 4 TIMES AS LARGE AS A DISC>>       <<03605>>03552000
        END                                                    <<03605>>03554000
   ELSE BEGIN                                                  <<03605>>03556000
        SAVEAREASECTORSIZE:=SECTORSIZE;                        <<03605>>03558000
        END;                                                   <<03605>>03560000
   <<DUMP MAIN MEMORY>>                                                 03562000
   IF NOT GETNEXTPARM(,TYPE,BANKNUM) OR TYPE <> NUMERICPARM             03564000
      OR LOGICAL(BANKNUM) > (CTNUMBERBANKS-1) THEN                      03566000
      BANKNUM:=CTNUMBERBANKS-1;                                         03568000
   GETNEXTPARM;  <<FLUSH SEMICOLON>>                                    03570000
   IF (CTDUMPDEVTYPE=TMAGTAPE) AND (CTDUMPDEVSUBTYP=STYPE7976) <<02669>>03572000
    THEN  << WE MUST SET DENSITY TO 1600 BPI ON HP7976 >>      <<02669>>03574000
    BEGIN  << ACTIONS TO SET DENSITY TO 1600BPI ON 7976 >>     <<02669>>03576000
     PERFORMIO(SERIALDEVICE,CLEAR7976,DUMPBUF,DBUFSIZE);       <<02669>>03578000
     PERFORMIO(SERIALDEVICE,SETDENSITY1600,DUMPBUF,DBUFSIZE);  <<02669>>03580000
    END;                                                       <<02669>>03582000
   FOR I:=0 UNTIL BANKNUM DO                                            03584000
      FOR J:=0 UNTIL BANKLIMIT DO  <<DUMP A BANK>>                      03586000
         BEGIN  <<WRITE ONE DUMP RECORD>>                               03588000
         TOS:=I; TOS:=DBUFSIZE*J;       <<SOURCE BANK AND ADDRESS>>     03590000
         GETAREA(*,DUMPBUF,DBUFSIZE);                                   03592000
         IF I=0 AND J=0 THEN DUMPBUF(BANKSDUMPEDLOC):=BANKNUM+1;        03594000
         OUTPUTDUMP(DUMPBUF,DBUFSIZE);                                  03596000
         END;                                                           03598000
                                                                        03600000
   <<DUMP VIRTUAL MEMORY AND/OR SYSTEM DISC SECTORS>>                   03602000
   IF GETNEXTPARM(DUMPDICT,TYPE,PARMVALUE) THEN                         03604000
      IF NOSYSTEMDISC THEN                                              03606000
         PRINTSTRING(BADSYSTEMDISC)                                     03608000
      ELSE                                                              03610000
         BEGIN                                                          03612000
         PERFORMIO(SERIALDEVICE,WRITEOF);                               03614000
         <<GET DATA SEGMENT TABLE LOCATION>>                            03616000
         GETAREA(DSTLOC,DSTADDR);                                       03618000
         GETAREA(DOUBLE(DSTADDR),LASTDATASEG);                          03620000
         DO CASE PARMVALUE-1 OF                                         03622000
            BEGIN                                                       03624000
            DUMPVIRTUALMEMORY;             <<DSEG>>                     03626000
            DUMPSYSDISC;                   <<DISC>>                     03628000
            END UNTIL NOT GETNEXTPARM(DUMPDICT,TYPE,PARMVALUE);         03630000
         END;                                                           03632000
   IF DUMPMODE = DISCFILEDUMP THEN  <<UPDATE DUMP FILE LABEL>>          03634000
      DUMPDISCIO(OUTPUT,FLAB,FLABLEN,CTDUMPFILE)                        03636000
   ELSE                                                                 03638000
      PERFORMIO(SERIALDEVICE,DEVICECLOSE);                              03640000
   END  <<DUMP>>;                                                       03642000
LOGICAL PROCEDURE CHANGECONSOLE;                                        03644000
   BEGIN                                                                03646000
   DOUBLE DESCRIPTOR;                                                   03648000
   INTEGER TYPE,DESC0=DESCRIPTOR,DESC1=DESCRIPTOR+1;                    03650000
   INTEGER DRT;                                                         03652000
   GETNEXTPARM(,,DRT);                                                  03654000
     IF IDENTIFYDEVICE(DRT&LSL(7),DESCRIPTOR) AND              <<03017>>03656000
        DESCTYPE=TCONSOLE THEN                                 <<03017>>03658000
      BEGIN                                                             03660000
      CHANGECONSOLE:=TRUE;                                              03662000
      CHANGEDEVICE(,,,,DESCRIPTOR);                                     03664000
      END                                                               03666000
   ELSE                                                                 03668000
      PRINTSTRING(BADEVICE);                                            03670000
   END  <<CHANGECONSOLE>>;                                              03672000
LOGICAL PROCEDURE CHANGEDUMPDEV(DUMPMODE);                              03674000
INTEGER                                                                 03676000
   DUMPMODE;          <<0 - USE SERIAL DISC/MAG TAPE>>                  03678000
                      <<1 - USE DISC FILE>>                             03680000
   BEGIN                                                                03682000
   DOUBLE DESCRIPTOR;                                                   03684000
   LOGICAL SERTYPE,DRT,UNIT:=0;                                         03686000
   INTEGER PARMVALUE,TYPE,DESC0=DESCRIPTOR,DESC1=DESCRIPTOR+1;          03688000
   GETNEXTPARM(,TYPE,DRT);                                              03690000
   IF TYPE=NUMERICPARM THEN                                             03692000
      BEGIN                                                             03694000
      GETNEXTPARM(,,UNIT);                                              03696000
     IF IDENTIFYDEVICE(DRT&LSL(7) LOR UNIT,DESCRIPTOR) THEN    <<03017>>03698000
         BEGIN                                                          03700000
         CHANGEDEVICE(,DESCRIPTOR);                                     03702000
         IF = THEN                                                      03704000
            BEGIN  <<VALID DEVICE>>                                     03706000
            DUMPMODE:=SERIALDEVICEDUMP;                                 03708000
            CTDUMPDEVDESC:=DESCRIPTOR;                                  03710000
            CHANGEDUMPDEV:=TRUE;                                        03712000
            END                                                         03714000
         ELSE                                                           03716000
            BEGIN  <<INVALID DEVICE>>                                   03718000
            IF DESCTYPE = TCONSOLE THEN INITADCC(0);                    03720000
            PRINTSTRING(BADEVICE);                                      03722000
            END;                                                        03724000
         END  <<IDENTIFIED DEVICE>>                                     03726000
      ELSE                                                              03728000
         PRINTSTRING(BADEVICE);                                         03730000
      END  <<NUMERIC PARAMETER>>                                        03732000
   ELSE                                                                 03734000
      IF CTDUMPFILE <> 0D THEN                                          03736000
         BEGIN  <<DUMP TO DISC DUMP FILE>>                              03738000
         CHANGEDUMPDEV:=TRUE;                                           03740000
         DUMPMODE:=DISCFILEDUMP;                                        03742000
         END                                                            03744000
      ELSE                                                              03746000
         PRINTSTRING(NODUMPFILEXTANT);                                  03748000
   END  <<CHANGEDUMPDEV>>;                                              03750000
PROCEDURE EXPLAIN;                                                      03752000
   BEGIN                                                                03754000
   <<EXPLAINS THE SYNTAX OF THE COMMANDS.                               03756000
   >>                                                                   03758000
   INTEGER I;                                                           03760000
   BYTE POINTER DEFN,NEXT;                                              03762000
                                                                        03764000
   IF NOT GETNEXTPARM(COMMANDICT,,,,,DEFN) THEN                         03766000
      BEGIN   <<LIST ALL COMMANDS>>                                     03768000
      @DEFN:=@COMMANDICT;                                               03770000
      FOR I:=1 UNTIL MAXCOMMANDNUM-1 DO                                 03772000
         BEGIN   <<LIST ONE COMMAND AT A TIME>>                         03774000
         @NEXT:=@DEFN+INTEGER(DEFN(1))+2;                               03776000
         DO                                                             03778000
            BEGIN                                                       03780000
            <<PRINT A LINE OF THE COMMAND'S EXPLANATION>>               03782000
            @NEXT:=@NEXT+PRINTSTRING(NEXT);                             03784000
            IF NEXT(2)="DUMPFILE" THEN                                  03786000
               BEGIN  <<CONTINUATION OF DUMP DESCRIPTION>>              03788000
               @DEFN:=@DEFN+INTEGER(DEFN);                              03790000
               @NEXT:=@NEXT+10;                                         03792000
               END;                                                     03794000
            END UNTIL NEXT = "#";                                       03796000
         @DEFN:=@DEFN+INTEGER(DEFN);                                    03798000
         END;                                                           03800000
      END  <<LIST ALL COMMANDS>>                                        03802000
   ELSE                                                                 03804000
      DO   <<LIST ONLY SELECTED PARAMETERS>>                            03806000
         DO                                                             03808000
            BEGIN                                                       03810000
            <<PRINT A LINE OF THE COMMAND'S EXPLANATION>>               03812000
            @DEFN:=@DEFN+PRINTSTRING(DEFN);                             03814000
            IF DEFN(2)="DUMPFILE" THEN @DEFN:=@DEFN+10; <<CONT COMMAND>>03816000
            END UNTIL DEFN = "#"                                        03818000
         UNTIL NOT GETNEXTPARM(COMMANDICT,,,,,DEFN);                    03820000
   END  <<EXPLAIN>>;                                                    03822000
PROCEDURE WARMSTART;                                                    03824000
   BEGIN                                                                03826000
   INTEGER SUBTYPE;                                                     03828000
   SUBTYPE:=CTSYSDISCSUBTYPE;                                           03832000
   TOS:=IF SUBTYPE = R7905 OR SUBTYPE = R7906 THEN 1 ELSE 0;            03834000
   TOS:=CTSYSDISCDRT;                                                   03836000
   ASSEMBLE(STRT);                                                      03838000
   END  <<WARMSTART>>;                                                  03840000
$PAGE "MAINLINE."                                                       03842000
IF (MODE:=RUNPARM) = SYNTAXCHECKING THEN                                03844000
   SYNTAXINITIALIZE                                                     03846000
ELSE                                                                    03848000
   BEGIN                                                                03850000
   INITIALIZE;                                                          03852000
   TOS:=ABORTSREGISTER; SET(S);                                         03854000
   END;                                                                 03856000
WHILE FOREVER DO                                                        03858000
   BEGIN                                                                03860000
   GETNEXTCOMMAND(COMMANDBUF);                                          03862000
   CURRENTPARM:=0;                                                      03864000
   COMMANDTYPE:=                                                        03866000
      MYCOMMAND(COMMANDBUF,DELIM,MAXPARMS,NUMPARMS,DPARMS,COMMANDICT);  03868000
   IF >= THEN                                                           03870000
      BEGIN  <<RECOGNIZABLE COMMAND>>                                   03872000
      CASE COMMANDTYPE-1 OF                                             03874000
         BEGIN                                                          03876000
         <<SYNTAX CHECK THE COMMAND BEFORE EXECUTING IT>>               03878000
         TOS:=DUMPSYNTAX;                     <<DUMP>>                  03880000
         TOS:=TRUE;                           <<DUMPFILE>>              03882000
         TOS:=TRUE;                           <<COMMENT>>               03884000
         TOS:=CONSOLESYNTAX;                  <<CONSOLE>>               03886000
         TOS:=TRUE;                           <<DEBUG>>                 03888000
         TOS:=DUMPDEVSYNTAX;                  <<DUMPDEV>>               03890000
         TOS:=TRUE;                           <<HALT>>                  03892000
         TOS:=EXPLAINSYNTAX;                  <<HELP>>                  03894000
         TOS:=TRUE;                           <<INTERACTIVE>>           03896000
         TOS:=TRUE;                           <<WARMSTART>>             03898000
         END  <<CASE>>;                                                 03900000
      IF TOS AND MODE <> SYNTAXCHECKING THEN                            03902000
         BEGIN                                                          03904000
         <<EXECUTE COMMAND>>                                            03906000
         CURRENTPARM:=0;                                                03908000
         CASE COMMANDTYPE-1 OF                                          03910000
            BEGIN  <<INVOKE THE COMMAND EXECUTOR>>                      03912000
            DUMP(DUMPMODE);                   <<DUMP>>                  03914000
            ;                                 <<DUMMY>>                 03916000
            ;                                 <<COMMENT>>               03918000
                                              <<CONSOLE>>               03920000
            IF NOT CHANGECONSOLE THEN MODE:=INTERACTIVE;                03922000
            HELP;                             <<DEBUG>>                 03924000
            IF NOT CHANGEDUMPDEV(DUMPMODE) THEN<<DUMPDEV>>              03926000
               MODE:=INTERACTIVE;                                       03928000
            ASSEMBLE(HALT 0);                 <<HALT>>                  03930000
            EXPLAIN;                          <<HELP>>                  03932000
            MODE:=INTERACTIVE;                <<INTERACTIVE>>           03934000
            WARMSTART;                        <<WARMSTART>>             03936000
            END  <<CASE STATEMENT>>;                                    03938000
         END  <<COMMAND EXECUTOR>>                                      03940000
      END  <<RECOGNIZABLE COMMAND>>                                     03942000
   ELSE                                                                 03944000
      PRINTERROR(UNKNOWNCOMMAND)  <<UNRECOGNIZABLE COMMAND>>;           03946000
   END  <<COMMAND INTERPRETOR>>;                                        03948000
END  <<MAINLINE>>;                                                      03950000
