$CONTROL MAP,CODE,USLINIT                                               00010000
  <<   3/25/77  NRIO,MODULE 62 - NON RESIDENT I/O ROUTINES >>           00015000
<< HP32033C MPE SOURCE C.00.00 >>                                       00020000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00025000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00030000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00035000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00040000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00045000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00050000
$TITLE "DEC 27 ,1975  S62  NON CORE RESIDENT I/O ROUTINES"              00055000
$CONTROL PRIVILEGED, MAIN = NRIO ,SEGMENT = NRIO                        00060000
$TP                                                                     00065000
                                                                        00070000
BEGIN    << NON CORE RESIDENT I/O  ROUTINES >>                          00075000
                                                                        00080000
EQUATE                                                                  00085000
    ABORT'    =  0,        << ABORT THIS I/O REQUEST >>                 00090000
    ABORT'IO  = 66,      << SCCP ABORTIO AND PROCIO FUNCTION >><<00.TE>>00095000
    CCE       = 2,                                                      00100000
    CCG       = 0,                                                      00105000
    CCL       = 1,                                                      00110000
    CR        =%15,                                                     00115000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00120000
    DCULOG'DSTSIZE =%12200,<< Size of DST for DCU logging>>    <<04452>>00125000
    DDLTP     = 4,         << DLT POINTER >>                            00130000
    DELECHO'  = 2,         << CHARACTER DELETION ECHO CODE >>           00135000
    DILTP     = 5,         << ILT POINTER >>                            00140000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00145000
    DISC'     =  1,        << DEVICE IS A DISC (DIT) >>                 00150000
    DLAST     =23,                                             <<00.06>>00155000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00160000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00165000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00170000
    DSTATE'   =12,         << DEVICE STATE                              00175000
                               0 - NULL         %10 - EOR SYNC          00180000
                               1 - WRITING      %11 - WRITE BUF FILL    00185000
                               2 - READING      %12 - DELETE LF OR CHAR 00190000
                               3 - XON WRITE    %13 - DELETE CR         00195000
                               4 - READ TURN    %14 - DELETE !'S        00200000
                               5 - BAND WAIT    %15 - WRT TURN DONE     00205000
                               6 - EOR LF       %16 - START READ        00210000
                               7 - EOR CR       %17 - FINISH READ  >>   00215000
    DSTAT     = 6,         << LAST HARDWARE INTERRUPT STATUS >>         00220000
    DSIZE     = 5,         << DEVICE TYPE >>                            00225000
    DSYNC     =29,         << CR,LF SYNC DATA AND SYNC COUNTER >>       00230000
    DTYPE     = 7,         << STOP FLAGS, TERMTYPE, HSTATE,TIMER FLAGS>>00235000
    ECHOOFF   = 0,         << TURN ECHO OFF CODE TO MPXCONTROL >>       00240000
    FIRSTINDEX= 8,         << INDEX TO FIRST BUFFER OF TABLE >>         00245000
    GOODIO    = 1,         << SUCCESSFUL I/O STATUS RETURN >>           00250000
    HP2645K  = 12,         <<HP2645K 8-BIT TTYPE>>             <<AMS00>>00255000
    HSI       = 19,        << HSI DEVICE TYPE >>               <<00.TE>>00260000
    IAK'      = 8,         << DEVICE HAS INTERRUPTED (DIT) >>           00265000
    ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>        <<00.TP>>00270000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00275000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00280000
    JUNKWAIT  = %20,                                                    00285000
    MHDISC    = 1,         << MOVING HEAD DISC TYPE >>         <<00.TE>>00290000
    NOPCB     = %13,       << NO PCB I/O REQUEST >>            <<00.TE>>00295000
    NOIMPEDE  = 0,         << AWAKEIO CALLER MAY NOT BE IMPEDED >>      00300000
    NOPTY'    = 2,         <<8-BIT DATA  FLAG-->>              <<AMS00>>00305000
                           <<SET IN 8TH BIT>>                  <<AMS00>>00310000
    NULL      = 0,                                                      00315000
    PARITYBITS'=7,     <<1ST PRTY CNTRL BIT IN DCNTRL>>        <<+1.M3>>00320000
    READFUNC  = 0,         << READ FUNCTION CODE >>                     00325000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>      <<00.03>>00330000
    SSLC      = 18,        << SSLC DEVICE TYPE >>              <<00.TE>>00335000
    SYSDB     =%1000,                                                   00340000
    SYNCCHAR  =%47777,     << SYNC CHARACTER  >>                        00345000
    SYSDISK   = 1,         << SYSTEM DISK LOGICAL DEVICE # >>           00350000
    SYSCST    = 1,                                                      00355000
    SYSDST    = 2,                                                      00360000
    SYSIOQ    = 5,        << IOQ TABLE PTR SYSDB INDEX >>      <<00.05>>00365000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00370000
    SYSSBUF   = 6,                                                      00375000
    TELENET   = 13,        << TELENET TERMINAL TYPE >>                  00380000
    TERMINAL' = 0,         << DEVICE IS A TERMINAL >>                   00385000
    UNDEFINED =%37,        << UNDEFINED TERMINAL TYPE >>                00390000
    WRTCHAN   =-1,         << FLAG TO INDICATE WRITE CHANNEL MPXCNTRL >>00395000
    Y'C       =%31,        << CONTROL Y >>                              00400000
  ENDEQ       = 0;                                                      00405000
                                                                        00410000
  DEFINE                                                                00415000
    TERMINAL  = (TERMINAL':1)#,                                <<06883>>00420000
    ABS       = ABSOLUTE#,                                              00425000
    ASMB      = ASSEMBLE#,                                              00430000
    CC        =( 6:2)#,    << CONDITION CODE FIELD IN STATUS >>         00435000
    COMPLETED = (6:1)#,    << REQUEST COMPLETED BY DRIVER >>   <<00.TE>>00440000
    CHARMASK  =( 8:8)#,                                                 00445000
    CRSYNCS   =( 4:6)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>00450000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>00455000
    DEVTYPE   =(8:8)#,     << DEVICE TYPE OF DLT >>                     00460000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     00465000
    DSTATE    =(DSTATE'  :4)#,                                          00470000
    DUPLICATE =ASSEMBLE( DUP     )#,                                    00475000
    EIGHTBITS = (8:1)#,    <<8-BIT PROTOCOL,PARITY DISALLOWED>>         00480000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     00485000
    ECHO      =( 3:1)#,    << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00490000
    ESIZE     =(8:8)#,     << TABLE ENTRY SIZE >>                       00495000
    IAK       =(IAK':1)#,                                               00500000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         00505000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           00510000
                               1 - 240 CPS         5 - 15 CPS           00515000
                               2 - 120 CPS         6 - 10 CPS           00520000
                               3 -  60 CPS         7 - 14 CPS  >>       00525000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00530000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           00535000
    MSGREPLY  =(15:1)#,  << MESSAGE REPLY BIT OF IOQ >>                 00540000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                00545000
                                0 - HARDWIRED   2 - 202C                00550000
                                1 - 103         3 - 2002   >>           00555000
    NOPTY     =(NOPTY':1)#,<<8-BIT DATA FLAG-->>               <<AMS00>>00560000
                           <<NO PARITY SET IN 8TH BIT>>        <<AMS00>>00565000
    NOSYNC    =( 7:1)#,    << NO SYNC TERMINAL, USES ENQ AND ACK >>     00570000
    OUTSPEED  =( 6:4)#,    << OUTPUT SPEED AND CHARACTER SIZE CODE      00575000
                               SEE INSPEED FOR MEANING >>               00580000
    PARITYBITS=(PARITYBITS':2)#,<<PRTY CNTRL BITS>>            <<+1.M3>>00585000
    PCBIO    =IOQ'PCB<>0#,<<TRUE IF PROC. RELATED IO>><<00.TE>><<06883>>00590000
    PDISABLE  = ASMB(PSDB)#,                                   <<00.05>>00595000
    PENABLE   = ASMB(PSEB)#,                                   <<00.05>>00600000
    QABORTS   = (11:1)#,   << Q ABORTS RATHER THAN SET BITS >> <<00.TE>>00605000
    RBYTE     =(8:8)#,                                                  00610000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS<<00.02>>00615000
    SPDSENSING = (4:1)#,   << DEVICE IS IN SPEED SENSING MODE    01.01>>00620000
    SPEEDF    =(10:6)#,    << SPEED INDEX FIELD IN TERM TABLE >>        00625000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  00630000
    TFIELD    =(11:5)#,    << TERM TYPE FIELD IN TERMTABLE >>           00635000
    TERMSPEED =(12:4)#,    << PRECONFIGURED TERMINAL SPEED >>  <<00.06>>00640000
    TERMINALTYPE=( 0:7)#,  << DEFAULT TERMINAL TYPE >>         <<00.06>>00645000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            00650000
    UNIT      =( 3:5)#,    << DLDEV, UNIT NUMBER >>                     00655000
    UP        =( 1:1)#,    <<ONLINE, SPEED SENSED, CAN DO I/O >>        00660000
    ENDDEF    = 0#;                                                     00665000
                                                                        00670000
$INCLUDE INCLPCB5                                              <<06883>>00675000
$INCLUDE INCLDRQ                                               <<06883>>00680000
$INCLUDE INCLIOQ                                               <<06883>>00685000
$INCLUDE INCLSBH                                               <<06883>>00690000
$INCLUDE INCLLPDT                                              <<06883>>00695000
$INCLUDE INCLOBJ                                               <<06883>>00700000
                                                                        00705000
                                                                        00710000
                                                                        00715000
    INTEGER POINTER PS0 = S-0,  PS1 = S-1;                              00720000
    POINTER LPS0 = S-0;                                                 00725000
    INTEGER S0 = S-0, S1 = S-1, X = X;                                  00730000
                                                                        00735000
    INTEGER RSTATUS = Q -1;   << PCAL RETURN STATUS >>                  00740000
                                                                        00745000
    INTEGER ARRAY WA0(*) = DB + 0;                                      00750000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    00755000
                                                                        00760000
    INTEGER ARRAY DST (@) = DB + SYSDST;                                00765000
                                                                        00770000
    INTEGER DSETB = DB+%66;                                             00775000
$PAGE " EXTERNAL PROCEDURE DECLARATIONS    JUNE 28, 1974"               00780000
                                                                        00785000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS);    00790000
  VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                       00795000
  INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                     00800000
  OPTION EXTERNAL;                                                      00805000
                                                                        00810000
DOUBLE PROCEDURE P'ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,   <<*7530>>00815000
                          P2,FLAGS,EB,ES);                     <<*7530>>00820000
  VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS,EB,ES;        <<*7530>>00825000
  INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS,ES;         <<*7530>>00830000
  DOUBLE EB;                                                   <<*7530>>00835000
  OPTION EXTERNAL,VARIABLE;                                    <<*7530>>00840000
                                                               <<*7530>>00845000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       00850000
  VALUE PCBPT, N, WAITF;                                                00855000
  INTEGER PCBPT, N, WAITF;                                              00860000
  OPTION EXTERNAL;                                                      00865000
                                                                        00870000
PROCEDURE AWAKEIO(DITP,IMPDFLAG);                                       00875000
  VALUE DITP, IMPDFLAG;  INTEGER IMPDFLAG;                              00880000
  INTEGER POINTER DITP;                                                 00885000
  OPTION EXTERNAL;                                                      00890000
                                                                        00895000
PROCEDURE CHECKLDEV(LDEV);                                              00900000
  VALUE LDEV;  INTEGER LDEV;                                            00905000
  OPTION EXTERNAL;                                                      00910000
  <<                                                                    00915000
     RETURN:  CCE - SIO DEVICE                                          00920000
              CCG - TERMINAL                                            00925000
              CCL - INVALID DEVICE                                      00930000
  >>                                                                    00935000
                                                                        00940000
INTEGER PROCEDURE EXCHANGEDB(DST);                             <<01201>>00945000
  VALUE DST;                                                   <<01201>>00950000
  INTEGER DST;                                                 <<01201>>00955000
  OPTION EXTERNAL;                                             <<01201>>00960000
                                                               <<01201>>00965000
INTEGER PROCEDURE GENMSG(A,B,C,D,E,F,G,H,I,J,K,L,M);           <<0U.EB>>00970000
   VALUE A,B,C,D,E,F,G,H,I,J,K,L,M;                            <<0U.EB>>00975000
   INTEGER A,B,C,D,E,F,G,H,I,J,K,L,M;                          <<0U.EB>>00980000
   OPTION EXTERNAL,VARIABLE;                                   <<0U.EB>>00985000
                                                               <<0U.EB>>00990000
INTEGER PROCEDURE GETDEVINFO(DEVICE,DEVINFO);                  <<SP.03>>00995000
   BYTE ARRAY DEVICE;                                          <<SP.03>>01000000
   INTEGER ARRAY DEVINFO;                                      <<SP.03>>01005000
   OPTION EXTERNAL;                                            <<SP.03>>01010000
                                                               <<SP.03>>01015000
PROCEDURE HELP;   OPTION EXTERNAL;                                      01020000
                                                                        01025000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01030000
  VALUE DRTN;    INTEGER DRTN;                                          01035000
  ARRAY DITP;    OPTION  EXTERNAL;                                      01040000
                                                                        01045000
PROCEDURE IOIMPEDE(TBASE);                                              01050000
  VALUE TBASE;  INTEGER TBASE;                                          01055000
  OPTION EXTERNAL;                                                      01060000
                                                                        01065000
PROCEDURE LOG; OPTION EXTERNAL;                                         01070000
                                                                        01075000
PROCEDURE RESETDB(OLDDB);                                               01080000
  VALUE OLDDB;  INTEGER OLDDB;                                          01085000
  OPTION EXTERNAL;                                                      01090000
                                                                        01095000
PROCEDURE RETURNIOQ(PNTR);                                              01100000
  VALUE PNTR;   INTEGER PNTR;                                  <<06883>>01105000
  OPTION EXTERNAL;                                                      01110000
                                                                        01115000
PROCEDURE RETURNTBUF(BPTR);                                             01120000
  VALUE BPTR;                                                           01125000
  POINTER BPTR;                                                         01130000
  OPTION EXTERNAL;                                                      01135000
                                                                        01140000
INTEGER PROCEDURE SETSYSDB;  OPTION EXTERNAL;                           01145000
                                                                        01150000
PROCEDURE SUDDENDEATH(NUMBER);                                          01155000
  VALUE NUMBER;  INTEGER NUMBER;                                        01160000
  OPTION EXTERNAL;                                                      01165000
                                                                        01170000
PROCEDURE WAIT(WAITFIELD,WAITTYPE);                                     01175000
  VALUE WAITFIELD, WAITTYPE;                                            01180000
  INTEGER WAITFIELD, WAITTYPE;                                          01185000
  OPTION EXTERNAL;                                                      01190000
                                                               <<00.05>>01195000
DOUBLE PROCEDURE WAITFORIO(IOQX);                              <<00.05>>01200000
   VALUE IOQX; INTEGER IOQX;                                   <<00.05>>01205000
   OPTION EXTERNAL;                                            <<00.05>>01210000
                                                               <<SP.03>>01215000
INTEGER PROCEDURE THISCPU;                                     <<HM.00>>01220000
OPTION EXTERNAL;                                               <<HM.00>>01225000
                                                               <<HM.00>>01230000
LOGICAL PROCEDURE GETCLASS(BUF,EVERYTHING,CLADR,CLINX,CLNAME); <<HM.00>>01235000
VALUE EVERYTHING,CLADR,CLINX;                                  <<HM.00>>01240000
INTEGER CLADR,CLINX;                                           <<HM.00>>01245000
LOGICAL EVERYTHING;                                            <<HM.00>>01250000
INTEGER ARRAY CLNAME,BUF;                                      <<HM.00>>01255000
OPTION VARIABLE,EXTERNAL;                                      <<HM.00>>01260000
                                                               <<HM.00>>01265000
INTEGER PROCEDURE FINDSDISCGAP(LDEV,BLOCK,ADR,LEN);            <<HM.00>>01270000
VALUE LDEV,BLOCK;                                              <<HM.00>>01275000
INTEGER LDEV,BLOCK;                                            <<HM.00>>01280000
DOUBLE ADR,LEN;                                                <<HM.00>>01285000
OPTION VARIABLE,EXTERNAL;                                      <<HM.00>>01290000
                                                               <<HM.00>>01295000
procedure SENDMSG(DESTPIN,DESTPORT,MSGLEN,FLAGS);              <<02803>>01300000
value DESTPIN,DESTPORT,MSGLEN,FLAGS;                           <<02803>>01305000
integer DESTPIN,DESTPORT,MSGLEN;                               <<02803>>01310000
logical FLAGS;                                                 <<02803>>01315000
option external;                                               <<02803>>01320000
                                                               <<02803>>01325000
logical procedure PORTSTATUS(PORTNUMBER);                      <<02803>>01330000
value PORTNUMBER;                                              <<02803>>01335000
integer PORTNUMBER;                                            <<02803>>01340000
option external;                                               <<02803>>01345000
                                                               <<02803>>01350000
procedure RECEIVEMSG(PORTNUM,MSGLEN,FLAGS);                    <<02803>>01355000
value PORTNUM,MSGLEN,FLAGS;                                    <<02803>>01360000
integer PORTNUM,MSGLEN;                                        <<02803>>01365000
logical FLAGS;                                                 <<02803>>01370000
option external;                                               <<02803>>01375000
                                                               <<02803>>01380000
procedure RETURNSBUF(IX);                                      <<02803>>01385000
value IX; integer IX;                                          <<02803>>01390000
option external;                                               <<02803>>01395000
                                                               <<02803>>01400000
integer procedure GETDATASEG(SIZE,VMALLOC);                    <<02803>>01405000
value SIZE,VMALLOC;                                            <<02803>>01410000
integer SIZE,VMALLOC;                                          <<02803>>01415000
option external;                                               <<02803>>01420000
                                                               <<02803>>01425000
procedure RETURNSYSBUF(INDEX);                                 <<02803>>01430000
value INDEX;                                                   <<02803>>01435000
integer INDEX;                                                 <<02803>>01440000
option external;                                               <<02803>>01445000
                                                               <<02803>>01450000
double procedure IOSTATUS(IOQX);                               <<02803>>01455000
value IOQX;                                                    <<02803>>01460000
integer IOQX;                                                  <<02803>>01465000
option external;                                               <<02803>>01470000
                                                               <<02803>>01475000
procedure RELDATASEG(INDEX);                                   <<02803>>01480000
value INDEX;                                                   <<02803>>01485000
integer INDEX;                                                 <<02803>>01490000
option external;                                               <<02803>>01495000
                                                               <<02803>>01500000
integer procedure GETSIR(SIRNUM);                              <<02803>>01505000
value SIRNUM;  logical SIRNUM;                                 <<02803>>01510000
option external;                                               <<02803>>01515000
                                                               <<02803>>01520000
procedure RELSIR(SIRNUM,A);                                    <<02803>>01525000
value SIRNUM,A;  logical SIRNUM,A;                             <<02803>>01530000
option external;                                               <<02803>>01535000
                                                               <<02803>>01540000
procedure UNIMPEDE(PCBPT);                                     <<02803>>01545000
value PCBPT;  integer PCBPT;                                   <<02803>>01550000
option external;                                               <<02803>>01555000
                                                               <<02803>>01560000
integer procedure GETSBUF(TYPE);                               <<02803>>01565000
value TYPE;  integer TYPE;                                     <<02803>>01570000
option external;                                               <<02803>>01575000
                                                               <<02803>>01580000
double procedure TIMER;                                        <<02803>>01585000
option external;                                               <<02803>>01590000
                                                               <<02803>>01595000
procedure ABORTTIMEREQ(TRLX);                                  <<02803>>01600000
value TRLX;  integer TRLX;                                     <<02803>>01605000
option external;                                               <<02803>>01610000
                                                               <<02803>>01615000
integer procedure TIMEREQ(CODE,REQ,TIME);                      <<02803>>01620000
value CODE, REQ, TIME;                                         <<02803>>01625000
double TIME;                                                   <<02803>>01630000
integer CODE, REQ;                                             <<02803>>01635000
option external;                                               <<02803>>01640000
                                                               <<02803>>01645000
procedure MPE'TABLE'FULL(INX);                                 <<02803>>01650000
value INX;   integer INX;                                      <<02803>>01655000
option external;                                               <<02803>>01660000
                                                               <<06883>>01665000
integer procedure LDEVTOTYPE(LDEV);                            <<06883>>01670000
value LDEV;                                                    <<06883>>01675000
integer LDEV;                                                  <<06883>>01680000
option external;                                               <<06883>>01685000
                                                               <<06883>>01690000
integer procedure LDEVTOSUBTYPE(LDEV);                         <<06883>>01695000
value LDEV;                                                    <<06883>>01700000
integer LDEV;                                                  <<06883>>01705000
option external;                                               <<06883>>01710000
                                                               <<02803>>01715000
procedure LOG15(I,J,K,L);                                      <<02803>>01720000
value I,J,K,L;                                                 <<02803>>01725000
logical I,J,K,L;                                               <<02803>>01730000
option external;                                               <<02803>>01735000
                                                               <<02803>>01740000
procedure LOG46(I,J,K,L,M,N,O,P,Q,R,S);                        <<03101>>01745000
value I,J,K,L,M,N,O,P,Q,R,S;                                   <<03101>>01750000
logical I,J,K,L,M,N,O,P,Q,R,S;                                 <<03101>>01755000
option external;                                               <<03101>>01760000
                                                               <<03101>>01765000
procedure LOG47(I,J,K,L,M,N);                                  <<03101>>01770000
value I,J,K,L,M,N;                                             <<03101>>01775000
logical I,J,K,L,M,N;                                           <<03101>>01780000
option external;                                               <<03101>>01785000
                                                               <<03101>>01790000
procedure IOFREEZE'(SEG);                                      <<04187>>01795000
value SEG;                                                     <<04187>>01800000
DOUBLE SEG;                                                    <<06883>>01805000
option external;                                               <<04187>>01810000
                                                               <<04187>>01815000
procedure IOUNFREEZE'(SEG);                                    <<04187>>01820000
value SEG;                                                     <<04187>>01825000
DOUBLE SEG;                                                    <<06883>>01830000
option external;                                               <<04187>>01835000
                                                               <<04187>>01840000
logical procedure IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,      <<04187>>01845000
     P5,DEST,REPLY,OFFSET,DITP,IOTYPE);                        <<04187>>01850000
value SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,              <<04187>>01855000
     OFFSET,DITP,IOTYPE;                                       <<04187>>01860000
integer SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,            <<04187>>01865000
     OFFSET,IOTYPE;                                            <<04187>>01870000
integer pointer DITP;                                          <<04187>>01875000
option variable,external;                                      <<04187>>01880000
                                                               <<04187>>01885000
INTRINSIC                                                      <<HM.00>>01890000
   FOPEN,FCLOSE,FREAD,FWRITE,FCONTROL,FREADDIR,DEBUG,          <<HM.00>>01895000
   FGETINFO,FCHECK,PRINTFILEINFO,PRINT,BINARY,ARITRAP,ASCII;   <<HM.00>>01900000
$PAGE  "NON CORE RESIDENT I/O SERVICE ROUTINES"                         01905000
                                                               <<01201>>01910000
                                                               <<01201>>01915000
LOGICAL PROCEDURE DEVICESTATUS(LDEV);                          <<01201>>01920000
  VALUE  LDEV;   INTEGER LDEV;                                 <<01201>>01925000
  OPTION UNCALLABLE, PRIVILEGED;                               <<01201>>01930000
                                                                        01935000
<< THIS PROCEDURE RETURNS THE HARDWARE INTERRUPT STATUS                 01940000
   FOR DEVICES OTHER THAN TERMINALS. FOR SERIES 2/3 I/O                 01945000
   TYPE, STATUS IS GOTTEN FROM THE DIT TABLE, WORD 6.                   01950000
   FOR HPIB I/O TYPE, STATUS IS RETURNED BY USING AN                    01955000
   ATTACHIO CALL WITH A FUNCTION CODE OF 15.                            01960000
                                                                        01965000
     RETURNS:  CCE - DEVICE STATUS RETURNED                             01970000
               CCL - INVALID LDEV OR A TERMINAL      >>                 01975000
                                                                        01980000
  BEGIN                                                        <<01201>>01985000
    INTEGER SAVST;  << STATUS REGISTER >>                      <<01201>>01990000
    INTEGER CCODE;  << CONDITION CODE >>                       <<01201>>01995000
    INTEGER DBSAVE;  << DB SAVED >>                            <<01201>>02000000
    INTEGER LPDT'INDEX;                                        <<06883>>02005000
    INTEGER POINTER DITP;                                      <<06883>>02010000
    INTEGER DEVST;  << STATUS RETURN >>                        <<01201>>02015000
                                                               <<01201>>02020000
    <<  NOTE:  PROCEDURE ENTERED IN SPLIT STACK MODE >>        <<01201>>02025000
                                                               <<01201>>02030000
    SAVST := RSTATUS;  << SAVE STATUS REGISTER >>              <<01201>>02035000
    CCODE := 1;  << INIT TO CONDITION CODE CCL >>              <<01201>>02040000
    DBSAVE := SETSYSDB;  << SET DB TO SYSDB >>                 <<01201>>02045000
    CHECKLDEV(LDEV);                                           <<01201>>02050000
    IF = THEN    << VALID LDEV, NOT A TERMINAL >>              <<01201>>02055000
      BEGIN  << GET STATUS >>                                  <<01201>>02060000
      LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;                 <<06883>>02065000
      @DITP := LPDT'DIT'PTR;                                   <<06883>>02070000
      IF DITP(DLDEV).(0:2)=0 THEN  << CHECK I/O TYPE >>        <<01369>>02075000
        BEGIN  << SERIES 2/3 SYSTEM >>                         <<01201>>02080000
        IF WA0(DITP(DDLTP)+DSIZE).DEVTYPE = 23 THEN            <<01201>>02085000
          << IF PGM CNTRLER, PUT STATUS IN DIT >>              <<01201>>02090000
          ATTACHIO(LDEV,0,0,0,28,0,1,0,1);                     <<01201>>02095000
        DEVICESTATUS := DITP(DSTAT);  << RET. STATUS >>        <<01201>>02100000
        RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>           <<01201>>02105000
        END                                                    <<01201>>02110000
      ELSE                                                     <<01201>>02115000
        BEGIN  << SERIES 33/HPIB >>                            <<01201>>02120000
        RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>           <<01201>>02125000
        DBSAVE := EXCHANGEDB(0);  << SET TO USER DB >>         <<01201>>02130000
        DEVST := 0;  << CLEAR STATUS >>                        <<01201>>02135000
        ATTACHIO(LDEV,0,0,@DEVST,15,1,0,0,1);                  <<01201>>02140000
        DEVICESTATUS := DEVST; << RET.SINGLE STATUS >>         <<01201>>02145000
        EXCHANGEDB(DBSAVE);  << RESET TO SPLIT STACK >>        <<01201>>02150000
        END;                                                   <<01201>>02155000
      CCODE := CCODE + 1;  << SET CCE >>                       <<01201>>02160000
      END ELSE                                                 <<01248>>02165000
      RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>             <<01248>>02170000
    RSTATUS := SAVST;  << RESTORE STATUS >>                    <<01201>>02175000
    RSTATUS.CC := CCODE;  << SET CC IN STAT REG FOR RET >>     <<01201>>02180000
    END;                                                       <<01201>>02185000
                                                               <<01201>>02190000
$PAGE                                                                   02195000
                                                                        02200000
LOGICAL PROCEDURE IOCONTROL(LDEV,FUNCTION);                             02205000
  VALUE   LDEV, FUNCTION;                                               02210000
  INTEGER LDEV, FUNCTION;                                               02215000
  OPTION PRIVILEGED, UNCALLABLE;                                        02220000
                                                                        02225000
  << THIS PROCEDURE GENERATES A BLOCKED CONTROL REQUEST.                02230000
                                                                        02235000
     RETURN: TRUE  - SUCCESSFULLY COMPLETED                             02240000
             FALSE - ERROR OCCURED IN PERFORMING REQUEST                02245000
  >>                                                                    02250000
  BEGIN                                                                 02255000
    TOS := ATTACHIO(LDEV, 0, 0, 0, FUNCTION, 0, 0, 0, 1 );              02260000
    DEL;     << DELETE TRANSFER COUNT >>                                02265000
    IF TOS.STATUS = GOODIO THEN                                         02270000
      IOCONTROL := 1;     << SET TRUE RETURN >>                         02275000
  END;                                                                  02280000
<<  INTEGER PROCEDURE TO HANDLE THE ENABLING/DISABLING >>      <<06883>>02285000
<<  OF RPS FOR CS'80 DISCS. IT WILL RETURN AN INTEGER  >>      <<06883>>02290000
<<  STATUS.                                            >>      <<06883>>02295000
<<                                                     >>      <<06883>>02300000
INTEGER PROCEDURE RPS'ALLOW (LDEV, FUNC);                      <<06883>>02305000
VALUE LDEV, FUNC;                                              <<06883>>02310000
INTEGER LDEV,FUNC;                                             <<06883>>02315000
                                                               <<06883>>02320000
BEGIN                                                          <<06883>>02325000
  EQUATE                                                       <<06883>>02330000
                                                               <<06883>>02335000
    CS80'TYPE         = 3,                                     <<06883>>02340000
    DISABLE'DONE      = %200,                                  <<06883>>02345000
    ENABLE'DONE       = %201,                                  <<06883>>02350000
    INVALID'DEVICE    = %202,                                  <<06883>>02355000
    RPS'NOT'AVAILABLE = %203,                                  <<06883>>02360000
    STATUS'DISABLE    = %204,                                  <<06883>>02365000
    STATUS'ENABLE     = %205,                                  <<06883>>02370000
                                                               <<06883>>02375000
<< FUNCTION OF ATTACHIO CALLS >>                               <<06883>>02380000
                                                               <<06883>>02385000
    RPS'ENABLE        = 97,                                    <<06883>>02390000
    RPS'DISABLE       = 98,                                    <<06883>>02395000
    RPS'STATUS        = 99;                                    <<06883>>02400000
                                                               <<06883>>02405000
                                                               <<06883>>02410000
  INTEGER   SUBTYPE, BUFF, STATE, STATE2;                      <<08916>>02415000
  INTEGER LPDT'INDEX;                                          <<08916>>02420000
                                                               <<08916>>02425000
                                                               <<06883>>02430000
  LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY; << PEG LPDT >>      <<08916>>02435000
  IF LDEVTOTYPE(LDEV) <> CS80'TYPE THEN                        <<06883>>02440000
    RPS'ALLOW := INVALID'DEVICE                                <<06883>>02445000
  ELSE                                                         <<06883>>02450000
   BEGIN                                                       <<06883>>02455000
    SUBTYPE := LDEVTOSUBTYPE(LDEV);                            <<06883>>02460000
    IF  (SUBTYPE = 1 OR                                        <<06883>>02465000
         SUBTYPE = 2 OR                                        <<06883>>02470000
         SUBTYPE = 4 OR                                        <<06883>>02475000
         SUBTYPE = 5 OR                                        <<08916>>02480000
         SUBTYPE = 8 )                                         <<08916>>02485000
        AND   << SYSTEM DOMAIN OR MOUNTED NON SYSTEM >>        <<08916>>02490000
        ( NOT LPDT'NON'SYS'DOMAIN   << SYSTEM DOMAIN >>        <<08916>>02495000
         LOR ( LPDT'NON'SYS'DOMAIN                             <<08916>>02500000
              LAND ( LPDT'MOUNTED'PV LOR                       <<08916>>02505000
                     LPDT'RDY'SER'FRN'DISC )                   <<08916>>02510000
             )                                                 <<08916>>02515000
        )                                                      <<08916>>02520000
       THEN                                                    <<08916>>02525000
    BEGIN                                                      <<08916>>02530000
     TOS := ATTACHIO(LDEV,0,0,@BUFF,RPS'STATUS,1,0,0,1);       <<06883>>02535000
     DEL;                                                      <<06883>>02540000
     STATE := TOS;                                             <<06883>>02545000
     IF STATE.(13:3) <> 1 THEN                                 <<06883>>02550000
       RPS'ALLOW := STATE.(8:8)                                <<06883>>02555000
     ELSE                                                      <<06883>>02560000
       BEGIN                                                   <<06883>>02565000
        CASE FUNC OF                                           <<06883>>02570000
          BEGIN                                                <<06883>>02575000
                                                               <<06883>>02580000
  << 0 >>  BEGIN     << DISABLE IS REQUESTED >>                <<06883>>02585000
             IF BUFF = 0 THEN                                  <<06883>>02590000
               RPS'ALLOW := DISABLE'DONE                       <<06883>>02595000
             ELSE                                              <<06883>>02600000
               BEGIN                                           <<06883>>02605000
                TOS :=ATTACHIO(LDEV,0,0,0,RPS'DISABLE,1,0,0,1);<<06883>>02610000
                DEL;                                           <<06883>>02615000
                RPS'ALLOW := TOS.(8:8);                        <<06883>>02620000
               END;                                            <<06883>>02625000
           END;      << CASE 0 >>                              <<06883>>02630000
                                                               <<06883>>02635000
  << 1 >>  BEGIN    << ENABLE IS REQUESTED >>                  <<06883>>02640000
             IF BUFF = 1 THEN                                  <<06883>>02645000
                RPS'ALLOW := ENABLE'DONE                       <<06883>>02650000
             ELSE                                              <<06883>>02655000
               BEGIN                                           <<06883>>02660000
                 TOS :=ATTACHIO(LDEV,0,0,0,RPS'ENABLE,1,0,0,1);<<06883>>02665000
                 DEL;                                          <<06883>>02670000
                 STATE := TOS;                                 <<06883>>02675000
                 TOS :=                                        <<06883>>02680000
                   ATTACHIO(LDEV,0,0,@BUFF,RPS'STATUS,1,0,0,1);<<06883>>02685000
                 DEL;                                          <<06883>>02690000
                 STATE2 := TOS;                                <<06883>>02695000
                 IF (STATE.(13:3) <> 1 OR STATE2.(13:3) <> 1)  <<06883>>02700000
                 THEN                                          <<06883>>02705000
                    RPS'ALLOW := STATE.(8:8)                   <<06883>>02710000
                 ELSE                                          <<06883>>02715000
                   BEGIN                                       <<06883>>02720000
                     IF BUFF = 0 THEN                          <<06883>>02725000
                        RPS'ALLOW := RPS'NOT'AVAILABLE         <<06883>>02730000
                     ELSE                                      <<06883>>02735000
                        RPS'ALLOW := STATE.(8:8);              <<06883>>02740000
                   END;                                        <<06883>>02745000
               END;                                            <<06883>>02750000
           END;      << CASE 1 >>                              <<06883>>02755000
                                                               <<06883>>02760000
  << 2 >>  BEGIN     << STATUS IS REQUESTED >>                 <<06883>>02765000
             IF BUFF = 1 THEN                                  <<06883>>02770000
                RPS'ALLOW := STATUS'ENABLE                     <<06883>>02775000
             ELSE                                              <<06883>>02780000
                RPS'ALLOW := STATUS'DISABLE;                   <<06883>>02785000
           END;      << CASE 2 >>                              <<06883>>02790000
                                                               <<06883>>02795000
          END; << OF CASE >>                                   <<06883>>02800000
       END;                                                    <<06883>>02805000
    END                                                        <<06883>>02810000
   ELSE RPS'ALLOW := INVALID'DEVICE;                           <<06883>>02815000
  END;                                                         <<06883>>02820000
END;           << INTEGER FUNCTION >>                          <<06883>>02825000
$PAGE   "NON RESIDENT TERMINAL SERVICE ROUTINES"                        02830000
                                                                        02835000
LOGICAL PROCEDURE RESETBREAKBITS(LDEV,BFLAG);                           02840000
  VALUE  LDEV, BFLAG;                                                   02845000
  INTEGER LDEV;  LOGICAL BFLAG;                                         02850000
  OPTION UNCALLABLE, PRIVILEGED;                                        02855000
                                                                        02860000
  <<                                                                    02865000
    THIS PROCEDURE RESETS THE BREAK OR CONTROL Y OCCURED BITS IN        02870000
    THE LPDT AND RETURNS THE PREVIOUS SETTING.                          02875000
                                                                        02880000
    BFLAG:  TRUE  - RESET BREAK BIT                                     02885000
            FALSE - RESET CONTROL Y BIT                                 02890000
                                                                        02895000
    RETURN: TRUE  - BIT WAS SET BEFORE BEING CLEARED                    02900000
            FALSE - BIT WAS CLEAR                                       02905000
  >>                                                                    02910000
BEGIN                                                          <<06883>>02915000
   INTEGER LPDT'INDEX;                                         <<06883>>02920000
                                                               <<06883>>02925000
   CHECKLDEV( LDEV );                                          <<06883>>02930000
   IF > THEN                                                   <<06883>>02935000
      BEGIN  << IT'S A TERMINAL >>                             <<06883>>02940000
      LPDT'INDEX := LDEV * SIZE'OF'LPDT'ENTRY;                 <<06883>>02945000
      DISABLE;                                                 <<06883>>02950000
      IF BFLAG THEN                                            <<06883>>02955000
         LPDT'BREAK := 0                                       <<06883>>02960000
      ELSE                                                     <<06883>>02965000
         LPDT'CONTROL'Y := 0;                                  <<06883>>02970000
      IF <> THEN RESETBREAKBITS := 1;                          <<06883>>02975000
      END;                                                     <<06883>>02980000
                                                               <<06883>>02985000
END;                                                           <<06883>>02990000
$PAGE                                                                   02995000
                                                                        03000000
                                                                        03005000
$PAGE                                                                   03010000
$PAGE "SYSTEM BUFFER ROUTINES"                                          03015000
INTEGER PROCEDURE GETSYSBUF( NUM, IMPF);                       <<06883>>03020000
   VALUE NUM, IMPF;                                            <<06883>>03025000
   LOGICAL NUM, IMPF;                                          <<06883>>03030000
   OPTION PRIVILEGED, UNCALLABLE;                              <<06883>>03035000
BEGIN                                                          <<06883>>03040000
                                                               <<06883>>03045000
ENTRY FGETSYSBUF;                                              <<06883>>03050000
INTEGER                                                        <<06883>>03055000
   CSTAT       = Q-1, << CALLER STATUS >>                      <<06883>>03060000
   LASTWORD;          << LAST LOCATION OF SBUF's >>            <<06883>>03065000
LOGICAL                                                        <<06883>>03070000
   TYPE,              << BUFFER FENCE >>                       <<06883>>03075000
   SIZE,              << BUFFER SIZE >>                        <<06883>>03080000
   NEWINUSE,                                                   <<06883>>03085000
   SBF'ENTRY'INDEX,                                            <<06883>>03090000
   PREV'INDEX;        << PREV SBUF ENTRY INDEX >>              <<06883>>03095000
                                                               <<06883>>03100000
   TYPE := 0; << NO BUFFER FENCE >>                            <<06883>>03105000
   GO AROUND;                                                  <<06883>>03110000
   HELP;  <<FOR HELP PLABEL *************>>                    <<06883>>03115000
FGETSYSBUF:                                                    <<06883>>03120000
   TYPE := 8; << BUFFER FENCE FOR FILESYSTEM TO PREVENT HOGGING<<06883>>03125000
AROUND:                                                        <<06883>>03130000
   SIZE := SBH'ENT'SIZE;    << BUFFER SIZE >>                  <<06883>>03135000
   LASTWORD := (SBH'TOT'ENT-1) * SIZE + SBH'HEADER'SIZE;       <<06883>>03140000
   SBH'REQCOUNU := SBH'REQCOUNU + 1; << INC. REQ. CNTR >>      <<06883>>03145000
   IF CARRY THEN SBH'REQCOUNT := SBH'REQCOUNT + 1;             <<06883>>03150000
   IF NOT(1 <= INTEGER(NUM) <= INTEGER(SBH'PRI'ENT)) THEN      <<06883>>03155000
      BEGIN                                                    <<06883>>03160000
      TOS := CCL;                                              <<06883>>03165000
      GO TO SETCC;                                             <<06883>>03170000
      END;                                                     <<06883>>03175000
                                                               <<06883>>03180000
   DISABLE;                                                    <<06883>>03185000
TRYAGAIN:                                                      <<06883>>03190000
   NEWINUSE := SBH'CUR'NUSE + NUM;                             <<06883>>03195000
   IF NEWINUSE + TYPE > SBH'PRI'ENT THEN                       <<06883>>03200000
      BEGIN << CAN'T SUPPLY ENOUGH BUFFERS >>                  <<06883>>03205000
      << If first overflow, report table full to console >>    <<06883>>03210000
      IF SBH'OVRFLOWS = 0 THEN                                 <<06883>>03215000
         MPE'TABLE'FULL(1);  << table 1 is SBUF >>             <<06883>>03220000
      SBH'OVRFLOWS := SBH'OVRFLOWS + 1;                        <<06883>>03225000
      IF IMPF THEN                                             <<06883>>03230000
         BEGIN << IMPEDE THIS PROCESS >>                       <<06883>>03235000
         IOIMPEDE( 1 << IMPEDE SBUF TABLE # >> );              <<*7899>>03240000
         GO TO TRYAGAIN;                                       <<06883>>03245000
         END;                                                  <<06883>>03250000
      TOS := CCG; << IMFORM CALLER OF BUFFER SHORTAGE >>       <<06883>>03255000
      GO TO SETCC;                                             <<06883>>03260000
      END;                                                     <<06883>>03265000
   IF NEWINUSE > SBH'MAX'NUSE THEN                             <<06883>>03270000
      SBH'MAX'NUSE := NEWINUSE;                                <<06883>>03275000
   SBH'CUR'NUSE := NEWINUSE; << UPDATE USE CNTR >>             <<06883>>03280000
   SBF'ENTRY'INDEX := SBH'FREEHEAD;                            <<06883>>03285000
   GETSYSBUF := SBF'ENTRY'INDEX; << RETURN INDEX TO CALLER >>  <<06883>>03290000
                                                               <<06883>>03295000
   DO BEGIN                                                    <<06883>>03300000
      IF NOT(SBH'HEADER'SIZE <= INTEGER(SBF'ENTRY'INDEX-1)     <<06883>>03305000
         <= LASTWORD) THEN SUDDENDEATH( 250);                  <<06883>>03310000
      IF (SBF'ENTRY'INDEX-SBH'HEADER'SIZE-1) MOD SIZE <> 0     <<06883>>03315000
         THEN SUDDENDEATH( 250);                               <<06883>>03320000
      PREV'INDEX := SBF'ENTRY'INDEX;                           <<06883>>03325000
      SBF'ENTRY'INDEX := SBF'LINK;                             <<06883>>03330000
      NUM := NUM - 1;                                          <<06883>>03335000
      END UNTIL =;                                             <<06883>>03340000
                                                               <<06883>>03345000
   IF SBF'ENTRY'INDEX = 0 THEN                                 <<06883>>03350000
      SBH'FREETAIL := SBH'FREEHEAD'INDEX + 1;                  <<06883>>03355000
   SBH'FREEHEAD := SBF'ENTRY'INDEX;                            <<06883>>03360000
   SBF'ENTRY'INDEX := PREV'INDEX;                              <<06883>>03365000
   SBF'LINK := 0; << ZERO LAST LINK >>                         <<06883>>03370000
   TOS := CCE;                                                 <<06883>>03375000
SETCC:                                                         <<06883>>03380000
   CSTAT.CC := TOS;                                            <<06883>>03385000
END;                                                           <<06883>>03390000
$PAGE "ABORT I/O ROUTINES"                                              03395000
PROCEDURE ABORTPROCIO(PCBNUMB);                                         03400000
VALUE PCBNUMB;  INTEGER PCBNUMB;                                        03405000
OPTION PRIVILEGED, UNCALLABLE;                                          03410000
BEGIN                                                                   03415000
INTEGER POINTER                                                         03420000
   DITP,                                                                03425000
   DLTP;                                                       <<00.TE>>03430000
LOGICAL POINTER                                                <<00.TE>>03435000
   DLTPL,                                                      <<00.TE>>03440000
   DITPL     = DITP;                                           <<00.TE>>03445000
LOGICAL                                                        <<00.TE>>03450000
   I := 0,                                                     <<06883>>03455000
   PIN,                                                        <<06883>>03460000
   FOUNDONE;                                                   <<00.TE>>03465000
INTEGER                                                        <<00.TE>>03470000
   IOQ'ENTRY'INDEX,                                            <<06883>>03475000
   LPDT'INDEX,                                                 <<06883>>03480000
   DBSAVE;                                                     <<06883>>03485000
                                                               <<00.TE>>03490000
  DBSAVE := SETSYSDB;                                          <<00.TE>>03495000
  PIN := PCBNUMB;                                              <<00.TE>>03500000
   IF = THEN PIN := (CURPRC)/PCBSIZE;                          <<06883>>03505000
                                                               <<00.TE>>03510000
  WHILE (I:=I+1) <= LPDT'MAX'ENTRIES DO                        <<06883>>03515000
    BEGIN   << SEARCH LPDT FOR PROCCESS I/O TO ABORT >>        <<00.TE>>03520000
    LPDT'INDEX := I * SIZE'OF'LPDT'ENTRY;                      <<06883>>03525000
    @DITP := LPDT'DIT'PTR;                                     <<06883>>03530000
    IF NOT LPDT'VIRTUAL'DEVICE AND                             <<06883>>03535000
       @DITP <> 0 AND << CHECK FOR ALL ZERO LPDT ENTRY >>      <<06883>>03540000
       DITP.(TERMINAL':2) <> DISC' THEN                        <<06883>>03545000
      BEGIN   << VALID DEVICE FOR ABORTING I/O >>              <<00.TE>>03550000
      FOUNDONE := FALSE;                                       <<00.TE>>03555000
      @DLTPL := DITP(DDLTP);                                   <<00.TE>>03560000
      IF DLTPL.QABORTS THEN  << SEND REQUEST TO ABORT >>       <<00.TE>>03565000
                                                               <<03645>>03570000
        << PCBNUM is passed to datacom driver via the QMISC >> <<03645>>03575000
        << parameter in the call to ATTACHIO.  The datacom  >> <<03645>>03580000
        << driver compares this PIN to all its outstanding  >> <<03645>>03585000
        << IOQ's and aborts only those with the same PIN.   >> <<03645>>03590000
        << This information is per Cathy Smith (DCO lab) on >> <<03645>>03595000
        << 12/28/81.  (AJK - MPE I/O)                       >> <<03645>>03600000
                                                               <<03645>>03605000
        ATTACHIO(I, PIN, 0, 0, ABORT'IO, 0, 0, 0, NOPCB)       <<00.TE>>03610000
      ELSE                                                     <<00.TE>>03615000
        BEGIN    << SET BITS TO CAUSE ABORT >>                 <<00.TE>>03620000
        PDISABLE;                                              <<00.TE>>03625000
        IOQ'ENTRY'INDEX := DITP(DIOQP);                        <<06883>>03630000
        WHILE <> DO  << SEARCH DEVICE IOQ LIST >>              <<00.TE>>03635000
          BEGIN                                                <<00.TE>>03640000
          IF NOT IOQ'DONE AND IOQ'PCB = PIN THEN               <<06883>>03645000
            BEGIN    << ABORT REQUEST >>                       <<00.TE>>03650000
            DISABLE;                                           <<00.TE>>03655000
            IOQ'ABORT := 1;                                    <<06883>>03660000
            IF DITP>=0 THEN DITP.IAK := 1;<<NOT A TERMINAL >>  <<00.TE>>03665000
            ENABLE;                                            <<00.TE>>03670000
            FOUNDONE := TRUE;                                  <<00.TE>>03675000
            END;                                               <<00.TE>>03680000
          IOQ'ENTRY'INDEX := IOQ'QLINK; <<STEP TO NEXT IOQ>>   <<06883>>03685000
          END;                                                 <<00.TE>>03690000
        PENABLE;                                               <<00.TE>>03695000
        IF FOUNDONE THEN AWAKEIO(DITP,IMPEDABLE);              <<00.TE>>03700000
        END;                                                   <<00.TE>>03705000
      END;                                                     <<00.TE>>03710000
    END;                                                       <<00.TE>>03715000
                                                               <<00.TE>>03720000
  RESETDB(DBSAVE);                                             <<00.TE>>03725000
END;   <<  ABORT PROC IO  >>                                            03730000
                                                                        03735000
PROCEDURE ABORTIO(LDEVICE);                                             03740000
VALUE LDEVICE;   INTEGER LDEVICE;                                       03745000
OPTION PRIVILEGED, UNCALLABLE;                                          03750000
BEGIN                                                                   03755000
<< This procedure will mark all IOQ's for a LDEV >>            <<02644>>03760000
<< as ABORTED and AWAKEN the monitor to process  >>            <<02644>>03765000
<< the abortion requests.  If a negative LDEV is >>            <<02644>>03770000
<< passed to this routine, only PCB related IOQ's>>            <<02660>>03775000
<< will be marked as aborted.  If the LDEV is    >>            <<02660>>03780000
<< positive, all IOQ's for this device are marked>>            <<02660>>03785000
<< as aborted.  The return status are as follows:>>            <<02644>>03790000
<<            CCE - IOQ's existed & were aborted >>            <<02644>>03795000
<<            CCG - no IOQ's were found          >>            <<02644>>03800000
<<            CCL - invalid LDEV to do ABORTIO   >>            <<02644>>03805000
INTEGER POINTER                                                <<00.TE>>03810000
  DITP,                                                        <<00.TE>>03815000
  DLTP;                                                        <<06883>>03820000
INTEGER                                                        <<00.TE>>03825000
  IOQ'ENTRY'INDEX,                                             <<06883>>03830000
  LPDT'INDEX,                                                  <<06883>>03835000
  DBSAVE;                                                      <<00.TE>>03840000
LOGICAL                                                        <<00.TE>>03845000
  FIRST'IOQ'ABORTED := false,<<first IOQ in chain was aborted>><<02660>>03850000
  ABORTALL := true;   <<abort all PCB's I/Os against device>>  <<02644>>03855000
                                                               <<00.TE>>03860000
  DBSAVE := SETSYSDB;                                          <<00.TE>>03865000
  X := LDEVICE;                                                <<00.TE>>03870000
  IF < THEN    << ABORT ONLY PCB RELATED I/O >>                <<00.TE>>03875000
    BEGIN  LDEVICE := -X;   ABORTALL := FALSE;   END;          <<00.TE>>03880000
                                                               <<00.TE>>03885000
  LPDT'INDEX := LDEVICE * SIZE'OF'LPDT'ENTRY;                  <<06883>>03890000
  @DITP := LPDT'DIT'PTR;                                       <<06883>>03895000
  @DLTP := DITP(DDLTP);                                        <<00.TE>>03900000
                                                               <<00.TE>>03905000
  TOS := CCL;  << INVALID DEVICE RETURN >>                     <<00.TE>>03910000
                                                               <<02644>>03915000
  <<check if LDEV is valid, not virtual, and not DISC>>        <<02644>>03920000
  CHECKLDEV(LDEVICE);                                          <<03645>>03925000
  if >= and      << Is valid LDEV >>                           <<03645>>03930000
     nocarry then  << is not a DISC >>                         <<03645>>03935000
    BEGIN   << VALID DEVICE AND TYPE, SO DO ABORT >>           <<00.TE>>03940000
    TOS := CCG;   << ASSUME EMPTY QUEUE >>                     <<00.TE>>03945000
    <<if device is datacomm, must do ATTACHIO to driver>>      <<02644>>03950000
    IF NOT LOGICAL(DLTP).QABORTS THEN                          <<00.TE>>03955000
      BEGIN   << CHECK QUEUE >>                                <<00.TE>>03960000
      DISABLE;   <<protect IOQ chain integrity>>               <<02644>>03965000
      IOQ'ENTRY'INDEX := DITP(DIOQP);                          <<06883>>03970000
      IF <> THEN  << SOMETHING ON QUEUE >>                     <<00.TE>>03975000
        BEGIN                                                  <<00.TE>>03980000
        IOQ'ENTRY'INDEX := DITP(DIOQP);                        <<06883>>03985000
        WHILE <> DO  << ABORT REQUEST >>                       <<00.TE>>03990000
          BEGIN                                                <<00.TE>>03995000
          IF NOT IOQ'DONE AND (ABORTALL OR PCBIO) THEN         <<06883>>04000000
            begin                                              <<02660>>04005000
            IOQ'ABORT := 1;   <<mark IOQ aborted>>             <<06883>>04010000
            IF IOQ'ENTRY'INDEX = DITP(DIOQP) THEN              <<06883>>04015000
              FIRST'IOQ'ABORTED := true; <<must awake monitor>><<02660>>04020000
            end;                                               <<02660>>04025000
          IOQ'ENTRY'INDEX := IOQ'QLINK; <<STEP TO NEXT IOQ>>   <<06883>>04030000
          END;                                                 <<00.TE>>04035000
        <<if first IOQ aborted, waken monitor>>                <<02660>>04040000
        if FIRST'IOQ'ABORTED then                              <<02660>>04045000
          begin                                                <<02660>>04050000
          if DITP>=0 then DITP.IAK := 1; <<NOT a terminal>>    <<02660>>04055000
          ENABLE;                                              <<02660>>04060000
          AWAKEIO(DITP, IMPEDABLE);                            <<02660>>04065000
          end                                                  <<02660>>04070000
        else                                                   <<02660>>04075000
          ENABLE;                                              <<02660>>04080000
                                                               <<02644>>04085000
        <<now, report a good completion code>>                 <<02660>>04090000
                                                               <<02660>>04095000
        TOS := CCE;  << REPORT I/O ABORTED >>                  <<00.TE>>04100000
        end                                                    <<02644>>04105000
      else                                                     <<02644>>04110000
        ENABLE;  <<enable interrupts>>                         <<02644>>04115000
      END                                                      <<00.TE>>04120000
                                                               <<02644>>04125000
<<For datacomm, we must issue a request of the driver to>>     <<02644>>04130000
<<abort the current I/O.                                >>     <<02644>>04135000
    ELSE IF IOCONTROL(LDEVICE,ABORT'IO) THEN TOS := CCE;       <<00.TE>>04140000
    END;                                                       <<00.TE>>04145000
                                                               <<00.TE>>04150000
  RSTATUS.CC := TOS;                                           <<00.TE>>04155000
  RESETDB(DBSAVE);                                             <<00.TE>>04160000
END; << ABORT IO >>                                                     04165000
PROCEDURE ABORTIOX(IOQX);                                      <<00.05>>04170000
VALUE IOQX;                                                    <<00.05>>04175000
INTEGER IOQX;                                                  <<00.05>>04180000
OPTION PRIVILEGED,UNCALLABLE;                                  <<00.05>>04185000
BEGIN                                                          <<00.05>>04190000
EQUATE                                                         <<00.05>>04195000
   DISC       = 1; << DEV TYPE IS DISC >>                      <<00.05>>04200000
                                                               <<00.05>>04205000
DEFINE                                                         <<00.05>>04210000
   DCLASS     = (0:2)#; << DEVICE TYPE BITS IN DIT0 >>         <<00.05>>04215000
                                                               <<00.05>>04220000
INTEGER SAVEDB;                                                <<00.05>>04225000
                                                               <<00.05>>04230000
POINTER                                                        <<06883>>04235000
   DLTPL,                                                      <<07426>>04240000
   DITP;                                                       <<06883>>04245000
LOGICAL                                                        <<06883>>04250000
   IOQ'ENTRY'INDEX,                                            <<06883>>04255000
   PRESENT'INDEX,                                              <<06883>>04260000
   LPDT'INDEX;                                                 <<06883>>04265000
                                                               <<00.05>>04270000
IF IOQX.(1:1)=DISC THEN RETURN;    << CAN'T ABORT DISC >>      <<17521>>04275000
   SAVEDB := SETSYSDB;                                         <<00.05>>04280000
   IOQ'ENTRY'INDEX := IOQX;                                    <<06883>>04285000
   LPDT'INDEX := IOQ'LDEV * SIZE'OF'LPDT'ENTRY;                <<06883>>04290000
   @DITP := LPDT'DIT'PTR;                                      <<06883>>04295000
@DLTPL := DITP(DDLTP);                                         <<07426>>04300000
   DISABLE;                                                    <<00.05>>04305000
   IOQ'ABORT := 1;  << SET ABORT >>                            <<06883>>04310000
  IF DLTPL.QABORTS THEN << ASK DRIVER TO ABORTIO REQ. >>       <<07426>>04315000
     ATTACHIO(IOQ'LDEV,0,0,0,ABORT'IO,0,IOQX,0,NOPCB)          <<07426>>04320000
  ELSE << HANDLE NORMAL CASE, JUST DEQUEUE >>                  <<07426>>04325000
   IF IOQ'ENTRY'INDEX = DITP(DIOQP) THEN                       <<06883>>04330000
   BEGIN  << FIRST IOQ ON LIST >>                              <<00.05>>04335000
      IF NOT DITP.TERMINAL THEN DITP.IAK := 1;                 <<06883>>04340000
      << SET INTERRUPT ACKNOW. IF NON-TERMINAL >>              <<00.05>>04345000
      ENABLE;                                                  <<00.05>>04350000
      AWAKEIO(DITP,0);                                         <<00.05>>04355000
      GO FINISH;                                               <<00.05>>04360000
   END ELSE                                                    <<00.05>>04365000
   BEGIN                                                       <<00.05>>04370000
      PRESENT'INDEX := IOQ'ENTRY'INDEX;                        <<06883>>04375000
      IOQ'ENTRY'INDEX := DITP(DIOQP); << SCAN IOQ LIST >>      <<06883>>04380000
      WHILE <> DO                                              <<06883>>04385000
      BEGIN                                                    <<00.05>>04390000
         IF IOQ'QLINK = LOGICAL(IOQX) THEN                     <<17620>>04395000
         BEGIN << FOUND IT >>                                  <<00.05>>04400000
            << DELINK IOQ >>                                   <<06883>>04405000
            PRESENT'INDEX := IOQ'ENTRY'INDEX;                  <<06883>>04410000
            IOQ'ENTRY'INDEX := IOQX;                           <<06883>>04415000
            TOS := IOQ'QLINK;                                  <<06883>>04420000
            IOQ'ENTRY'INDEX := PRESENT'INDEX;                  <<06883>>04425000
            IOQ'QLINK := TOS;                                  <<06883>>04430000
            ENABLE;                                            <<00.05>>04435000
            RETURNIOQ(IOQX);                                   <<06883>>04440000
            RESETDB(SAVEDB);                                   <<00.05>>04445000
            RETURN;                                            <<00.05>>04450000
         END;                                                  <<00.05>>04455000
         IOQ'ENTRY'INDEX := IOQ'QLINK; << STEP TO NEXT IOQ >>  <<06883>>04460000
      END;                                                     <<00.05>>04465000
   ENABLE;  <<clean up in case IOQ not chained??>>             <<02644>>04470000
   END;                                                        <<00.05>>04475000
FINISH:                                                        <<00.05>>04480000
   RESETDB(SAVEDB);                                            <<00.05>>04485000
   WAITFORIO(IOQX); << WAIT FOR I/O COMPLETION >>              <<00.05>>04490000
END;                                                           <<00.05>>04495000
$PAGE "DEVICE MAINTENENCE REQUEST PROCESSOR"                   <<03101>>04500000
procedure PROC'MAINT'REQ(LDEV,TYPE,SUBTYPE);                   <<03101>>04505000
value LDEV,TYPE,SUBTYPE;                                       <<03101>>04510000
integer LDEV,TYPE,SUBTYPE;                                     <<03101>>04515000
option internal,uncallable,privileged;                         <<03101>>04520000
begin                                                          <<03101>>04525000
                                                               <<03101>>04530000
<< This procedure processes maintence requests from >>         <<03101>>04535000
<< specific devices on the HP3000.  The mechanism   >>         <<03101>>04540000
<< used to invoke this procedure is:                >>         <<03101>>04545000
<< 1) The MPE driver calls procedure MAINT'REQUEST  >>         <<03101>>04550000
<<    in HARDRES.                                   >>         <<03101>>04555000
<< 2) Procedure MAINT'REQUEST sends a memory res-   >>         <<03101>>04560000
<<    ident message facility message to IOMSGPROC,  >>         <<03101>>04565000
<<    which then calls this procedure.              >>         <<03101>>04570000
<<                                                  >>         <<03101>>04575000
<< This procedure then makes the appropriate ATTIO  >>         <<03101>>04580000
<< calls to the device driver to extract the info,  >>         <<03101>>04585000
<< and then calls the MPE logging process to "log"  >>         <<03101>>04590000
<< the information.                                 >>         <<03101>>04595000
                                                               <<03101>>04600000
<< Information returned from driver utility requests are >>    <<03101>>04605000
<< returned in word 10 for CS'80 devices. This means that>>    <<03101>>04610000
<< this array can only hold 758 words of driver return info>>  <<03101>>04615000
                                                               <<03101>>04620000
array BUF(0:767);  << Buffer w/info for ATTACHIO    >>         <<03101>>04625000
byte array B'BUF(*) = BUF;                                     <<03101>>04630000
                                                               <<03101>>04635000
integer TOTAL'LENGTH, << Length of all info to be logged>>     <<03101>>04640000
        REM'LENGTH,   << Remaining bytes to log         >>     <<03101>>04645000
        LENGTH,       << Length to log in this call to LOG>>   <<03101>>04650000
        FNCT,         << ATTACHIO function >>                  <<03101>>04655000
        HEADS,        << Highest number head device has >>     <<03101>>04660000
        J,            << Continuation record number >>         <<03101>>04665000
        PA,PB,        << P1 & P2 of ATTACHIO        >>         <<03101>>04670000
        I,X=x,        << Utility integers >>                   <<03101>>04675000
        CNT;          << ATTACHIO count >>                     <<03101>>04680000
integer pointer BUF'PTR;  << Pointer into array BUF >>         <<03101>>04685000
byte pointer B'BUF'PTR; << Byte pointer into BUF >>            <<03101>>04690000
                                                               <<03101>>04695000
<< All following equates must be even numbers >>               <<03101>>04700000
equate MAX'LOG'LEN = 128,  << Log 128 bytes max at a time >>   <<03101>>04705000
       LOG'OVRHD   = 14,   <<14 bytes overhead per log call>>  <<03101>>04710000
       USABLE'LEN  = MAX'LOG'LEN-LOG'OVRHD;                    <<03101>>04715000
<<***********************************************************>><<03101>>04720000
double subroutine ATTIO;                                       <<03101>>04725000
begin                                                          <<03101>>04730000
                                                               <<03101>>04735000
ATTIO := ATTACHIO(LDEV,0,0,@BUF,FNCT,CNT,PA,PB,1<<blocked>>);  <<03101>>04740000
end;                                                           <<03101>>04745000
<<***********************************************************>><<03101>>04750000
subroutine LOG'TYPE'46;                                        <<03101>>04755000
    begin  << Return status was OK >>                          <<03101>>04760000
                                                               <<03101>>04765000
    << Change total length to positive bytes >>                <<03101>>04770000
    if TOTAL'LENGTH > 0 then                                   <<03101>>04775000
      TOTAL'LENGTH := TOTAL'LENGTH * 2                         <<03101>>04780000
    else if < then                                             <<03101>>04785000
      TOTAL'LENGTH := -TOTAL'LENGTH;                           <<03101>>04790000
                                                               <<03101>>04795000
    REM'LENGTH := TOTAL'LENGTH;                                <<03101>>04800000
                                                               <<03101>>04805000
    << Write records to MPE logging >>                         <<03101>>04810000
    J := 0;  << Record number >>                               <<03101>>04815000
    @B'BUF'PTR := @B'BUF(20); << Info is ret in word 10 >>     <<03101>>04820000
    while   REM'LENGTH > 0 do                                  <<03101>>04825000
      begin                                                    <<03101>>04830000
                                                               <<03101>>04835000
      LENGTH := if   REM'LENGTH > USABLE'LEN then              <<03101>>04840000
                   USABLE'LEN                                  <<03101>>04845000
                else                                           <<03101>>04850000
                   REM'LENGTH;                                 <<03101>>04855000
                                                               <<03101>>04860000
      << Call MPE logging >>                                   <<03101>>04865000
      LOG46(LDEV,TYPE,SUBTYPE,PB, << Maint req type >>         <<03101>>04870000
            I,                    << Head number    >>         <<03101>>04875000
            J,                    << Record number  >>         <<03101>>04880000
            TOTAL'LENGTH,         << Tot bytes      >>         <<03101>>04885000
            LENGTH,               << bytes in rec   >>         <<03101>>04890000
            @B'BUF'PTR,           << byte address   >>         <<03101>>04895000
            LENGTH,               << Len to copy    >>         <<03101>>04900000
            46);                  << LOG type       >>         <<03101>>04905000
                                                               <<03101>>04910000
      << Increment pointers, indicies >>                       <<03101>>04915000
      J := J + 1;   << Record number >>                        <<03101>>04920000
      @B'BUF'PTR := @B'BUF'PTR + LENGTH;                       <<03101>>04925000
      REM'LENGTH := REM'LENGTH - LENGTH;                       <<03101>>04930000
      end; << of writing intermediate records >>               <<03101>>04935000
                                                               <<03101>>04940000
end;                                                           <<03101>>04945000
<<***********************************************************>><<03101>>04950000
subroutine CS'80;                                              <<03101>>04955000
begin                                                          <<03101>>04960000
                                                               <<03101>>04965000
<< Determine how many heads device has >>                      <<03101>>04970000
FNCT := 13;      << Request device limits >>                   <<03101>>04975000
PA := 1;         << Three-vector mode     >>                   <<03101>>04980000
PB := 0;                                                       <<03101>>04985000
CNT := 2;        << Return a max of 2 words >>                 <<03101>>04990000
                                                               <<03101>>04995000
tos := ATTIO;                                                  <<03101>>05000000
assemble(del);   << Remove word count     >>                   <<03101>>05005000
if tos.(13:3) <> 1 then                                        <<03101>>05010000
  tos := 0       << Assume 0 heads if ATTIO failed >>          <<03101>>05015000
else                                                           <<03101>>05020000
  tos := BUF(1).(0:8); << # of heads >>                        <<03101>>05025000
                                                               <<03101>>05030000
<< If number of heads is zero, assume NO heads >>              <<03101>>05035000
assemble(test);                                                <<03101>>05040000
if = then                                                      <<03101>>05045000
  tos := tos - 1;   << Make # of heads negative >>             <<03101>>05050000
HEADS := tos;                                                  <<03101>>05055000
<< We must first request run-time data error log from each >>  <<03101>>05060000
<< of all 13 heads, and then call MPE logging to save info >>  <<03101>>05065000
                                                               <<03101>>05070000
FNCT := 91;   << Function 91 to driver >>                      <<03101>>05075000
PA := 2;                                                       <<03101>>05080000
PB := %305;                                                    <<03101>>05085000
CNT := -1516; << 758 words max driver can return >>            <<03101>>05090000
I := -1;                                                       <<03101>>05095000
while (I:=I+1) <= HEADS do                                     <<03101>>05100000
  begin << Process each head >>                                <<03101>>05105000
                                                               <<03101>>05110000
  BUF := 1;  << 1 byte of descriptor information >>            <<03101>>05115000
  B'BUF(2) := byte(I); << Head number in byte 2  >>            <<03101>>05120000
  tos := ATTIO;                                                <<03101>>05125000
  TOTAL'LENGTH := tos;  << store length transferred >>         <<03101>>05130000
  if tos.(13:3) = 1 then                                       <<03101>>05135000
    LOG'TYPE'46;                                               <<03101>>05140000
                                                               <<03101>>05145000
  end;   << of processing each head >>                         <<03101>>05150000
                                                               <<03101>>05155000
<< Read the fault log >>                                       <<03101>>05160000
PB := %307;     << Fault log >>                                <<03101>>05165000
I := 0;                                                        <<03101>>05170000
BUF := 0;   << 0 parameter bytes >>                            <<03101>>05175000
                                                               <<03101>>05180000
tos := ATTIO;                                                  <<03101>>05185000
TOTAL'LENGTH := tos;                                           <<03101>>05190000
if tos.(13:3) = 1 then                                         <<03101>>05195000
  LOG'TYPE'46;   << ATTACHIO was OK >>                         <<03101>>05200000
                                                               <<03101>>05205000
<< Now, we must clear maintenence info from disc >>            <<03101>>05210000
PA := 0;    << Send utility cmd >>                             <<03101>>05215000
PB := %315; << Clear log utility function >>                   <<03101>>05220000
BUF := 1;   << Send 1 byte >>                                  <<03101>>05225000
B'BUF(2) := 0;   << Byte value is zero >>                      <<03101>>05230000
ATTIO;                                                         <<03101>>05235000
end;   << of subroutine HP7935 >>                              <<03101>>05240000
<<***********************************************************>><<03101>>05245000
<< Case on device type >>                                      <<03101>>05250000
case TYPE of                                                   <<03101>>05255000
                                                               <<03101>>05260000
begin  << of case on type >>                                   <<03101>>05265000
                                                               <<03101>>05270000
<<0>>  ;   << Type 0 (disc) has no maintence requests >>       <<03101>>05275000
                                                               <<03101>>05280000
<<1>>  ;   << Type 1 has no maintenence requests      >>       <<03101>>05285000
                                                               <<03101>>05290000
<<2>>  ;   << Type 2 has no maintenence requests      >>       <<03101>>05295000
                                                               <<03101>>05300000
<<3>>  CS'80; << CS'80 type disc drive maintenence req>>       <<03101>>05305000
                                                               <<03101>>05310000
end;    << of case on device type >>                           <<03101>>05315000
                                                               <<03101>>05320000
end;  << of procedure PROC'MAINT'REQ >>                        <<03101>>05325000
$PAGE "PROCESS SERIES/64 DCU REQUEST"                          <<04187>>05330000
procedure PROC'DCU'REQUEST(PARM,DST);                          <<04187>>05335000
value PARM;                                                    <<04187>>05340000
INTEGER PARM;                                                  <<06883>>05345000
DOUBLE DST;                                                    <<06883>>05350000
option internal,privileged;                                    <<04187>>05355000
begin                                                          <<04187>>05360000
                                                               <<04187>>05365000
equate  CONSOLE = 0,                                           <<04187>>05370000
        CR      = %15,    << carriage return >>                <<04187>>05375000
        LF      = %12,    << line feed >>                      <<04187>>05380000
        SYSDB   = %1000;                                       <<04187>>05385000
                                                               <<04187>>05390000
logical I,    << Index >>                                      <<04187>>05395000
        BANK, << Bank where DST is >>                          <<04187>>05400000
        OFFSET,<< Offset in bank for DST >>                    <<04187>>05405000
        SEARCH,     <<flag to indicate when CRLF is found>>    <<04187>>05410000
        LENGTH;        << length to log >>                     <<04187>>05415000
                                                               <<04187>>05420000
integer REM'LENGTH,TOTAL'LENGTH,<< Remaining bytes to log >>   <<04187>>05425000
       DST'OFFSET, << FOR MOVING FROM DS TO LOCAL BUF >>       <<07426>>05430000
       DCU'MSG'LENGTH, << TOTAL LEN OF DS IN BYTES >>          <<07426>>05435000
        K,                     << counter >>                   <<04187>>05440000
        J;                     << Rec # of sub-record        >><<04187>>05445000
                                                               <<04187>>05450000
byte pointer B'BUF'PTR;        << Pointer into BUF           >><<04187>>05455000
byte pointer BUF'LOC;          <<location in the buffer>>      <<04187>>05460000
EQUATE BUF'LENGTH = 768;                                       <<07426>>05465000
EQUATE BUF'BYTE'LENGTH = BUF'LENGTH * 2;                       <<07426>>05470000
ARRAY BUF(0:BUF'LENGTH-1); << LOCAL BUFFER FOR LOG DATA >>     <<07426>>05475000
byte array B'BUF(*)=BUF;                                       <<04187>>05480000
   DOUBLE SEGID=DST;                                           <<06883>>05485000
   LOGICAL ARRAY SEGID'(*)=DST;                                <<06883>>05490000
                                                               <<04187>>05495000
<< the format of PARM is: (0:15) = byte count of data   >>     <<04187>>05500000
<<                        (15:1) = 0 means initiate log >>     <<04187>>05505000
<<                        (15:1) = 1 means end log      >>     <<04187>>05510000
                                                               <<04187>>05515000
<<***********************************************************>><<04187>>05520000
                                                               <<04187>>05525000
subroutine RELDST;                                             <<04187>>05530000
begin                                                          <<04187>>05535000
                                                               <<04187>>05540000
IF SEGID'(OBJIDNUMFIELD) <> 0 THEN << DST# <> 0? >>            <<06883>>05545000
  begin                                                        <<04187>>05550000
  J := SEGID'(OBJIDNUMFIELD); << GET DST# >>                   <<06883>>05555000
  SETSYSDB;                                                    <<04187>>05560000
  IOUNFREEZE'(SEGID);                                         <<10/21>> 05565000
  RELDATASEG(J);                                               <<04187>>05570000
  RESETDB(-1);                                                 <<04187>>05575000
  SEGID'(OBJIDNUMFIELD) := 0; << MARK DST NOT THERE >>         <<06883>>05580000
  end;                                                         <<04187>>05585000
                                                               <<04187>>05590000
end;  << of subroutine RELDST >>                               <<04187>>05595000
                                                               <<04187>>05600000
<<***********************************************************>><<04187>>05605000
                                                               <<04187>>05610000
subroutine LOG'TYPE'47;                                        <<04187>>05615000
begin                                                          <<04187>>05620000
                                                               <<04187>>05625000
REM'LENGTH := TOTAL'LENGTH;                                    <<04187>>05630000
@B'BUF'PTR := @B'BUF;                                          <<04187>>05635000
J := 0;                 << Sub-record 0 >>                     <<04187>>05640000
K := 0;                  <<initialize counter>>                <<04187>>05645000
SEARCH := FALSE;         <<flag for CRLF>>                     <<04187>>05650000
while REM'LENGTH > 0 do                                        <<04187>>05655000
  begin                                                        <<04187>>05660000
  while (K<71) and (K<REM'LENGTH) and NOT SEARCH do            <<04187>>05665000
    begin                              << search for the end >><<04187>>05670000
    if B'BUF'PTR(K) <> CR           << of a string. It is  >>  <<04187>>05675000
       then K := K + 1              << indicated by a CRLF. >> <<04187>>05680000
       else if B'BUF'PTR(K:=K+1) = LF                          <<04187>>05685000
            then SEARCH := TRUE                                <<04187>>05690000
    end;                                                       <<04187>>05695000
                                                               <<04187>>05700000
  @BUF'LOC := @B'BUF'PTR(K);<<location in buf of CRLF>>        <<04187>>05705000
  LENGTH := @BUF'LOC - @B'BUF'PTR + 1;   <<number to log>>     <<04187>>05710000
                                                               <<04187>>05715000
  << Call MPE logging >>                                       <<04187>>05720000
  LOG47(J,TOTAL'LENGTH,LENGTH,@B'BUF'PTR,LENGTH,47);           <<04187>>05725000
                                                               <<04187>>05730000
  REM'LENGTH := REM'LENGTH - INTEGER(LENGTH);                  <<04187>>05735000
  @B'BUF'PTR := @B'BUF'PTR(K+1);                               <<04187>>05740000
  J := J + 1;                                                  <<04187>>05745000
  K := 0;        << re-initialize flags >>                     <<04187>>05750000
  SEARCH := FALSE;                                             <<04187>>05755000
  end;                                                         <<04187>>05760000
end;   << of subroutine LOG'TYPE'47 >>                         <<04187>>05765000
<<***********************************************************>><<04187>>05770000
subroutine INIT'DCU'LOGGING;                                   <<04187>>05775000
begin                                                          <<04187>>05780000
                                                               <<04187>>05785000
<< Only performed if this is an ICF/55 processor >>            <<04187>>05790000
assemble(pcn);   << Push computer number on tos >>             <<04187>>05795000
if tos = 4 then  << This is an ICF/55           >>             <<04187>>05800000
  begin                                                        <<04187>>05805000
  tos := 0;      << Enable DCU logging          >>             <<04187>>05810000
  tos := %400;   << dummy argument              >>             <<04187>>05815000
  assemble(con %20104;con %14); << RDCU machine inst >>        <<04187>>05820000
  end;                                                         <<04187>>05825000
                                                               <<04187>>05830000
  SEGID'(OBJIDNUMFIELD) := 0; << MARK DST NOT THERE >>         <<06883>>05835000
end;   << of subroutine INIT'DCU'LOGGING >>                    <<04187>>05840000
<<***********************************************************>><<04187>>05845000
<< See if this is an enable request >>                         <<04187>>05850000
if PARM = %177777 then                                         <<04187>>05855000
  begin  << Yes, it is >>                                      <<04187>>05860000
  INIT'DCU'LOGGING;                                            <<04187>>05865000
  return                                                       <<04187>>05870000
  end;                                                         <<04187>>05875000
                                                               <<04187>>05880000
<< See if new request >>                                       <<04187>>05885000
if not logical(PARM) then                                      <<04187>>05890000
  begin  << this is a new request >>                           <<04187>>05895000
  << if DST already exists, kill it >>                         <<04187>>05900000
  RELDST;                                                      <<04187>>05905000
                                                               <<04187>>05910000
  << Get new DST for DCU logging >>                            <<04187>>05915000
  SETSYSDB;                                                    <<04187>>05920000
  J   := GETDATASEG(DCULOG'DSTSIZE,DCULOG'DSTSIZE);            <<04452>>05925000
  RESETDB(-1);                                                 <<04187>>05930000
      SEGID'(OBJIDTYPEFIELD) := OBJIDDATATYPE; << BUILD >>     <<06883>>05935000
      SEGID'(OBJIDPBXFIELD)  := 0;  << 2 WORD SEGID     >>     <<06883>>05940000
      SEGID'(OBJIDNUMFIELD)  := J;                             <<06883>>05945000
  if <> then     << DST was obtained >>                        <<04187>>05950000
    begin     << we got a DST >>                               <<04187>>05955000
    << Attempt to freeze it in memory >>                       <<04187>>05960000
Loop:                                                          <<04187>>05965000
    tos := @I;     << this code is a way >>                    <<04187>>05970000
    TOS := SEGID'(OBJIDNUMFIELD); << GET DST # >>              <<06883>>05975000
    tos := 0;      << trap and starting memory >>              <<04187>>05980000
    tos := 1;      << management on the DST if >>              <<04187>>05985000
    assemble(mfds 4);   << needed. It references 1 word. >>    <<04187>>05990000
    IOFREEZE'(SEGID);                                          <<06883>>05995000
    if <> then go to Loop;   << Loop if freeze failed >>       <<04187>>06000000
                                                               <<04187>>06005000
    << Find BANK and OFFSET to DST >>                          <<04187>>06010000
    I := absolute(2) << DST tbl ptr >> + (logical(DST)&lsl(2));<<04187>>06015000
    BANK := absolute(I+2).(8:8);                               <<04187>>06020000
    OFFSET := absolute(I+3);                                   <<04187>>06025000
                                                               <<04187>>06030000
    << Call machine-dependant I/O instruction >>               <<04187>>06035000
    tos := OFFSET;                                             <<04187>>06040000
    tos := BANK;                                               <<04187>>06045000
    assemble(con %20104);  << Special I/O instruction >>       <<04187>>06050000
    assemble(con %14);     << Parameter of 2-word inst>>       <<04187>>06055000
    end;                                                       <<04187>>06060000
  end                                                          <<04187>>06065000
else                                                           <<04187>>06070000
  begin     << Log data >>                                     <<04187>>06075000
  DST'OFFSET := 0;                                             <<07426>>06080000
  DCU'MSG'LENGTH := PARM & LSR(1); << EXTRACT BYTE LENGTH OF DS<<07426>>06085000
  TOTAL'LENGTH := IF DCU'MSG'LENGTH > BUF'BYTE'LENGTH          <<07426>>06090000
    THEN BUF'BYTE'LENGTH << DS WILL NOT FIT IN BUFFER >>       <<07426>>06095000
    ELSE DCU'MSG'LENGTH;     << DS WILL FIT IN BUFFER     >>   <<07426>>06100000
  << WHILE LOOP NEEDED TO HANDLE CASE WHERE DS WITH DCU >>     <<07426>>06105000
  << INFO IS TOO BIG FOR THE LOCAL BUFFER. LOOPS THRU   >>     <<07426>>06110000
  << ONLY ONCE IF DS WILL FIT WITHIN THE LOCAL BUFFER.  >>     <<07426>>06115000
                                                               <<07426>>06120000
  WHILE DST'OFFSET < DCU'MSG'LENGTH DO << THESE ARE ALL BYTE >><<07426>>06125000
    BEGIN                          << COUNTS AND OFFSETS >>    <<07426>>06130000
    TOS := @BUF;                                               <<07426>>06135000
    TOS := SEGID'(OBJIDNUMFIELD);                              <<07426>>06140000
    TOS := (DST'OFFSET + 1) / 2;   << MFDS EXPECTS WORD  >>    <<07426>>06145000
    TOS := (TOTAL'LENGTH + 1) / 2; << OFFSETS AND COUNTS >>    <<07426>>06150000
    ASSEMBLE(MFDS 4);                                          <<07426>>06155000
    LOG'TYPE'47; << LOG EXTRACTED PORTION OF MESG >>           <<07426>>06160000
                                                               <<07426>>06165000
    DST'OFFSET := DST'OFFSET + TOTAL'LENGTH;                   <<07426>>06170000
    IF DST'OFFSET + TOTAL'LENGTH > DCU'MSG'LENGTH              <<07426>>06175000
       THEN BEGIN << ADJUST FOR LEFT OVER AT END OF DS >>      <<07426>>06180000
            TOTAL'LENGTH := DCU'MSG'LENGTH - DST'OFFSET;       <<07426>>06185000
            END;                                               <<07426>>06190000
    END; << WHILE >>                                           <<07426>>06195000
                                                               <<07426>>06200000
  RELDST;                                                      <<04187>>06205000
                                                               <<07426>>06210000
  end;                                                         <<04187>>06215000
end;   << of procedure PROC'DCU'REQUEST >>                     <<04187>>06220000
procedure IOMESSPROC;                                          <<02803>>06225000
option privileged,uncallable;                                  <<02803>>06230000
begin                                                          <<02803>>06235000
                                                               <<02803>>06240000
<<This routine's sole purpose in life is to route messages>>   <<02803>>06245000
<<between terminals (& critical processes) without using  >>   <<02803>>06250000
<<permanent system resources.  This routine will either   >>   <<02803>>06255000
<<dynamically obtain, or release, extra data segments in  >>   <<02803>>06260000
<<MPE to hold a message until the physical I/O is done.   >>   <<02803>>06265000
                                                               <<02803>>06270000
<< Generally, port "0" is used to receive messages for this >> <<04270>>06275000
<< process.  If a process cannot be performed immediately   >> <<04270>>06280000
<< due to lack of resources, IOMESSPROC sends the message   >> <<04270>>06285000
<< to itself in port "3" to defer it until the resource     >> <<04270>>06290000
<< becomes available.  This "resource" is currently message >> <<04270>>06295000
<< buffer entries.  If this check were not made, IOMESSPROC >> <<04270>>06300000
<< could become impeded on itself waiting for an available  >> <<04270>>06305000
<< message buffer (in its call to GENMESSAGE).              >> <<04270>>06310000
                                                               <<04270>>06315000
<< If NUM'MSG'BUFS is changed, must also change in MESSAGE >>  <<02803>>06320000
equate NUM'MSG'BUFS =16; << number of MSG BUFs in DST >>       <<02803>>06325000
                                                               <<04270>>06330000
array IOQ'ARRAY(0:NUM'MSG'BUFS-1), << pending I/O IOQs >>      <<02803>>06335000
      DST'ARRAY(0:NUM'MSG'BUFS-1), << DST buffer offset >>     <<02803>>06340000
      BUF'HDR(0:21);           <<Work area for MSG DST hdr >>  <<02803>>06345000
byte array B'BUF'HDR(*)=BUF'HDR;                               <<02803>>06350000
                                                               <<02803>>06355000
<<equates for GENMSG stacked parameters>>                      <<02803>>06360000
equate DITDST         = 42,                                    <<02803>>06365000
       DITDSTI        = DITDST*4+3,                            <<02803>>06370000
       DSTB           = 14;  <<DST parm bit in GENMSG call>>   <<02803>>06375000
EQUATE DIT'REPLY = -3; << INIT. ODD VALUE FOR FLAG>>           <<06883>>06380000
integer BUF           = s-3, <<buffer in GENMSG call>>         <<02803>>06385000
        DSTNUM        = s-2; <<DST number in GENMSG call>>     <<02803>>06390000
logical FLAG;                <<whether REPLY in GENMSG>>       <<02803>>06395000
                                                               <<02803>>06400000
                                                               <<02803>>06405000
integer CURRENT'INDEX,   <<index into I/O arrays>>             <<02803>>06410000
                                                               <<06883>>06415000
        MOVE'LENGTH,     <<length to move in MDS instructions>><<02803>>06420000
        DSTX,            <<DST number to move from/to>>        <<02803>>06425000
        SAVESIR,         << Save GETSIR information >>         <<04270>>06430000
        SBUFX,           <<System buffer index>>               <<02803>>06435000
        TRLX,            << Index of watchdog timer >>         <<02803>>06440000
        LAST'ENTRY;      <<index of last entry in arrays>>     <<02803>>06445000
                                                               <<02803>>06450000
<< timer declarations >>                                       <<02803>>06455000
double NEW'TIME,           << delta time from LAST'TIME >>     <<02803>>06460000
       DST'DCU'LOG,                                            <<06883>>06465000
       LAST'TIME;          << prior cycle TIME obtained >>     <<02803>>06470000
                                                               <<02803>>06475000
define PAUSE'TIME = 30000D#;  << 30 second watchdog timer >>   <<02803>>06480000
                                                               <<02803>>06485000
<< TABLE RELATIVE INDEX INTO IOQ TABLE >>                      <<06883>>06490000
INTEGER                                                        <<06883>>06495000
   Q'ENTRY'INDEX,                                              <<06883>>06500000
   IOQ'ENTRY'INDEX = Q'ENTRY'INDEX,                            <<06883>>06505000
   DRQ'ENTRY'INDEX = Q'ENTRY'INDEX;                            <<06883>>06510000
                                                               <<02803>>06515000
<< S-relative arguments for RECEIVEMSG >>                      <<02803>>06520000
integer SM0 = s-0,                                             <<02803>>06525000
        SM1 = s-1,                                             <<02803>>06530000
        SM2 = s-2,                                             <<02803>>06535000
        SM3 = s-3;                                             <<02803>>06540000
                                                               <<02803>>06545000
pointer LOG'BUF'PTR;  <<pointer to logging info buffer in stack<<02803>>06550000
                                                               <<02803>>06555000
<<declarations to fire-off PROGEN if SHUTDOWN requested>>      <<02803>>06560000
integer PROGEN = DB + %141;  <<Sysglob location>>              <<02803>>06565000
define SHUTDOWN = absolute(%1300)#; << Shutdown flag >>        <<03072>>06570000
define THISPIN = (CURPRC)/PCBSIZE#,                            <<06883>>06575000
       CONSCELL   = absolute(%1074)#, << system cons ldev >>   <<02803>>06580000
       IOMSGQUEUE = absolute(%1062)#, << Impeded PIN head >>   <<02803>>06585000
       IOMSGDST   = absolute(%1113)#, << MSG buffers DST  >>   <<02803>>06590000
       IOMSGPROC = absolute(%1152)#;                           <<06883>>06595000
                                                               <<02803>>06600000
equate MSGSIR  = %24,  << MSG SIR number >>                    <<02803>>06605000
       SBUFDST = 8;                                            <<06883>>06610000
$PAGE                                                          <<04187>>06615000
subroutine GIVE'BACK'BUFFER; << return MSG buf to avail list>> <<04187>>06620000
begin                                                          <<02803>>06625000
                                                               <<02803>>06630000
if IOMSGDST = 0 then                                           <<02803>>06635000
  return;    << no DST for buffers yet >>                      <<02803>>06640000
                                                               <<02803>>06645000
<< move in buffer DST header info >>                           <<02803>>06650000
tos := @BUF'HDR;     tos := IOMSGDST;                          <<02803>>06655000
tos := 0;            tos := 4;                                 <<02803>>06660000
assemble(mfds 4);                                              <<02803>>06665000
                                                               <<02803>>06670000
<< get tail pointer >>                                         <<02803>>06675000
if BUF'HDR(3) = 0  then                                        <<02803>>06680000
  begin    << this will be first on avail list >>              <<02803>>06685000
  BUF'HDR(2) := BUF'HDR(3) := DST'ARRAY(CURRENT'INDEX);        <<02803>>06690000
  end                                                          <<02803>>06695000
else                                                           <<02803>>06700000
  begin    << must chain this buffer onto prior buffer >>      <<02803>>06705000
  << move this one's pointer to current last guy's >>          <<02803>>06710000
  tos := IOMSGDST;    tos := BUF'HDR(3);                       <<02803>>06715000
  tos := @DST'ARRAY(CURRENT'INDEX); tos := 1;                  <<02803>>06720000
  assemble(mtds 4);                                            <<02803>>06725000
                                                               <<02803>>06730000
  << fix tail pointer only >>                                  <<02803>>06735000
  BUF'HDR(3) := DST'ARRAY(CURRENT'INDEX);                      <<02803>>06740000
  end;                                                         <<02803>>06745000
                                                               <<02803>>06750000
<< now, write back new header info >>                          <<02803>>06755000
tos := IOMSGDST;        tos := 0;                              <<02803>>06760000
tos := @BUF'HDR;        tos := 4;                              <<02803>>06765000
assemble(mtds 4);                                              <<02803>>06770000
BUF'HDR:=0;tos:=IOMSGDST;tos:=BUF'HDR(3);tos:=@BUF'HDR;tos:=1; <<02803>>06775000
assemble(mtds 4); end;   << of subroutine GIVE'BACK'BUFFER >>  <<02803>>06780000
$PAGE                                                          <<04187>>06785000
subroutine UNIMPEDE'PROCESS;                                   <<04187>>06790000
begin                                                          <<04187>>06795000
                                                               <<04270>>06800000
<< If IOMESSPROC was waiting on buffer, re-queue msg >>        <<04270>>06805000
if PORTSTATUS(3) then                                          <<04270>>06810000
  begin                                                        <<04270>>06815000
  assemble(adds 4);  << return cells >>                        <<04270>>06820000
  RECEIVEMSG(3,4,0);                                           <<04270>>06825000
  SENDMSG(THISPIN,0,4,%140000);                                <<04270>>06830000
  return;                                                      <<04270>>06835000
  end;                                                         <<04270>>06840000
                                                               <<04270>>06845000
PDISABLE;    << protect integrity of IMP chain >>              <<02803>>06850000
if IOMSGQUEUE = 0 then                                         <<02803>>06855000
  begin    << there are no PINs waiting >>                     <<02803>>06860000
  PENABLE;                                                     <<02803>>06865000
  return;                                                      <<02803>>06870000
  end;                                                         <<02803>>06875000
                                                               <<02803>>06880000
<< fix up linking >>                                           <<02803>>06885000
tos := IOMSGQUEUE;   << save PIN to UNIMPEDE on tos >>         <<02803>>06890000
IOMSGQUEUE := LPCB(IOMSGQUEUE * PCBSIZE + NIMPPINWORDNUM) /    <<06883>>06895000
                   PCBSIZE;                                    <<06883>>06900000
X := S0 * PCBSIZE + NIMPPINWORDNUM;                            <<06883>>06905000
LPCB(X) := 0;                                                  <<06883>>06910000
UNIMPEDE(tos*PCBSIZE);  << unimpede pin 1st on list >>         <<02803>>06915000
PENABLE;                                                       <<02803>>06920000
                                                               <<02803>>06925000
<< if process was impeded & watchdog timer, clear timer >>     <<02803>>06930000
if TRLX <> 0 then                                              <<02803>>06935000
  begin    << abort/cancel this timer request >>               <<02803>>06940000
  SETSYSDB;                                                    <<02803>>06945000
  ABORTTIMEREQ(TRLX);                                          <<02803>>06950000
  RESETDB(-1);                                                 <<02803>>06955000
  TRLX := 0;  LAST'TIME := 0D;                                 <<02803>>06960000
  end;                                                         <<02803>>06965000
                                                               <<02803>>06970000
end;   << of subroutine GIVE'BACK'BUFFER >>                    <<02803>>06975000
$PAGE                                                          <<04270>>06980000
logical subroutine NO'BUF'AVAIL;                               <<04270>>06985000
<< Returns TRUE if no MSG buffers available >>                 <<04270>>06990000
begin                                                          <<04270>>06995000
<< Move in buffer DST header >>                                <<04270>>07000000
tos := @BUF'HDR;       tos := IOMSGDST;                        <<04270>>07005000
tos := 0;              tos := 4;                               <<04270>>07010000
assemble(mfds 4);                                              <<04270>>07015000
                                                               <<04270>>07020000
<< See if no available buffers >>                              <<04270>>07025000
if BUF'HDR(2) = 0 then                                         <<04270>>07030000
  NO'BUF'AVAIL := true                                         <<04270>>07035000
else                                                           <<04270>>07040000
  NO'BUF'AVAIL := false;                                       <<04270>>07045000
                                                               <<04270>>07050000
end;                                                           <<04270>>07055000
$PAGE                                                          <<04187>>07060000
subroutine MAKE'BUFFER'AVAIL;                                  <<02803>>07065000
begin <<IO is done, so clean-up>>                              <<02803>>07070000
                                                               <<02803>>07075000
SAVESIR := GETSIR(MSGSIR);  << Save integrity of msg bufs >>   <<04270>>07080000
                                                               <<02803>>07085000
<< give buffer back to available pool >>                       <<02803>>07090000
GIVE'BACK'BUFFER;                                              <<02803>>07095000
                                                               <<02803>>07100000
<< if any process waiting on buffers, unimpede >>              <<02803>>07105000
UNIMPEDE'PROCESS;                                              <<02803>>07110000
                                                               <<02803>>07115000
RELSIR(MSGSIR,SAVESIR);  << Make SIR available again >>        <<04270>>07120000
                                                               <<02803>>07125000
<<now, compress the table>>                                    <<02803>>07130000
move IOQ'ARRAY(CURRENT'INDEX) :=                               <<02803>>07135000
IOQ'ARRAY(CURRENT'INDEX+1),(LAST'ENTRY-CURRENT'INDEX);         <<02803>>07140000
move DST'ARRAY(CURRENT'INDEX) :=                               <<02803>>07145000
DST'ARRAY(CURRENT'INDEX+1),(LAST'ENTRY-CURRENT'INDEX);         <<02803>>07150000
LAST'ENTRY := LAST'ENTRY - 1;                                  <<02803>>07155000
CURRENT'INDEX := CURRENT'INDEX - 1;                            <<02803>>07160000
end;                                                           <<02803>>07165000
$PAGE "IOMESSPROC PROCEDURE OUTER BLOCK"                       <<02803>>07170000
$PAGE "IOMSGPROC PROCEDURE MAINLINE"                           <<04187>>07175000
LAST'ENTRY := -1;   <<initialize last index pointer used>>     <<02803>>07180000
TRLX := 0;          << no current watchdog timer >>            <<02803>>07185000
                                                               <<02803>>07190000
Start:                                                         <<02803>>07195000
                                                               <<02803>>07200000
if SHUTDOWN.(3:1) then                                         <<02803>>07205000
  begin   <<process stop>>                                     <<02803>>07210000
  SETSYSDB;                                                    <<03072>>07215000
  AWAKE(PROGEN,2<<son>>,0);                                    <<02803>>07220000
  WAIT(0,0);        <<go to sleep forever>>                    <<02803>>07225000
$PAGE "IOMESSPROC"                                             <<04187>>07230000
  end;                                                         <<02803>>07235000
                                                               <<02803>>07240000
                                                               <<02803>>07245000
   <<check an see if any IPC messages are waiting>>            <<02803>>07250000
   while PORTSTATUS(0) do                                      <<02803>>07255000
      begin  <<there are messages to get & process>>           <<02803>>07260000
      assemble(adds 4); <<return cells>>                       <<02803>>07265000
      RECEIVEMSG(0,4,0); <<read 4 words from port 0,destructive<<02803>>07270000
      if = then                                                <<02803>>07275000
        begin  <<got message OK>>                              <<02803>>07280000
        case SM3 of                                            <<02803>>07285000
        begin                                                  <<02803>>07290000
                                                               <<02803>>07295000
<<0>>   begin <<error log sysbuf relative>>                    <<02803>>07300000
        SBUFX := SM2;    <<save system buffer index>>          <<02803>>07305000
        MOVE'LENGTH := SM1; <<save length to log from SYSBUF>> <<02803>>07310000
        tos := 0;        <<beginning of temp buffer>>          <<02803>>07315000
        @LOG'BUF'PTR := @SM0; <<save DB addr of this buffer>>  <<02803>>07320000
        tos := MOVE'LENGTH-1; <<addt'l buffer space>>          <<02803>>07325000
        assemble(adds 0);     <<allocate buffer>>              <<02803>>07330000
                                                               <<02803>>07335000
        <<move in information from system buffer>>             <<02803>>07340000
        tos := @LOG'BUF'PTR;  <<target DB address>>            <<02803>>07345000
        tos := SBUFDST;       <<source DST is SYSBUFS>>        <<02803>>07350000
        tos := SBUFX;     <<location of buf in XDS>>           <<06883>>07355000
        tos := MOVE'LENGTH;   <<length of data in SYSBUF>>     <<02803>>07360000
        assemble(mfds 4);     <<move in data>>                 <<02803>>07365000
                                                               <<02803>>07370000
        <<now, free up system buffer>>                         <<02803>>07375000
        SETSYSDB;                                              <<02803>>07380000
        RETURNSBUF(SBUFX);                                     <<02803>>07385000
        RESETDB(-1);                                           <<02803>>07390000
                                                               <<02803>>07395000
        <<add in logging information>>                         <<02803>>07400000
        tos := MOVE'LENGTH - 15;  <<length of variable info>>  <<06883>>07405000
        tos := 11;                <<log type>>                 <<02803>>07410000
        LOG;                                                   <<02803>>07415000
                                                               <<02803>>07420000
        end;                                                   <<02803>>07425000
                                                               <<02803>>07430000
<<1>>   begin << table-overflow error >>                       <<02803>>07435000
                                                               <<02803>>07440000
        << move table name to array >>                         <<02803>>07445000
        move B'BUF'HDR := "MPE Table ",2;                      <<02803>>07450000
        case SM3 of   << actually s-2, but have stacked parm>> <<02803>>07455000
        begin                                                  <<02803>>07460000
        move * := "TBUF",2;                                    <<02803>>07465000
        move * := "SBUF",2;                                    <<02803>>07470000
        move * := "IOQ",2;                                     <<02803>>07475000
        move * := "DISC REQUEST",2;                            <<02803>>07480000
        move * := "TRL",2;                                     <<02803>>07485000
        end;                                                   <<02803>>07490000
        move * := (" has overflowed!!!",%7,%7<<bell>>),2;      <<02803>>07495000
        MOVE'LENGTH := (tos-@B'BUF'HDR+1)&lsr(1);     << ajk >><<02803>>07500000
                                                               <<02803>>07505000
        <<get SYSBUF to move it to>>                           <<02803>>07510000
        SETSYSDB;                                              <<02803>>07515000
        @LOG'BUF'PTR := GETSBUF(2);                            <<02803>>07520000
        RESETDB(-1);                                           <<02803>>07525000
        if @LOG'BUF'PTR <> 0 then                              <<02803>>07530000
          begin  << we got one >>                              <<02803>>07535000
          SBUFX := @LOG'BUF'PTR;  <<SBUF index>>               <<06883>>07540000
          << move data to sysbuf >>                            <<02803>>07545000
          tos := SBUFDST;   <<DST of system buffers>>          <<02803>>07550000
          tos := SBUFX;     <<offset into system buffers>>     <<02803>>07555000
          tos := @BUF'HDR;  <<source DB address>>              <<02803>>07560000
          tos := MOVE'LENGTH;                                  <<02803>>07565000
          assemble(mtds 4);                                    <<02803>>07570000
                                                               <<02803>>07575000
          << now, perform ATTACHIO to send to console, ASAP!>> <<02803>>07580000
     tos:=ATTACHIO(CONSCELL,            <<ldev of console>>    <<02803>>07585000
                   0,  <<QMISC>>                               <<02803>>07590000
                   0,  <<DSTX, SYSBUF used>>                   <<02803>>07595000
                   SBUFX,  <<SYSBUF index>>                    <<02803>>07600000
                   1,  <<FUNC, write>>                         <<02803>>07605000
                   MOVE'LENGTH, <<CNT>>                        <<02803>>07610000
                   0,0,<<P1, P2>>                              <<02803>>07615000
                   %17);<<SBUF,no IMPEDE,no PCB>>              <<02803>>07620000
                                                               <<02803>>07625000
          << if doubleword on tos is zero, then failed >>      <<02803>>07630000
          assemble(dtst,ddel);                                 <<02803>>07635000
          if = then                                            <<02803>>07640000
            begin  << must return system buffer >>             <<02803>>07645000
            SETSYSDB;                                          <<02803>>07650000
            RETURNSBUF(@LOG'BUF'PTR);                          <<02803>>07655000
            RESETDB(-1);                                       <<02803>>07660000
            end;                                               <<02803>>07665000
                                                               <<02803>>07670000
          << Now, log message to CONSOLE logging >>            <<02803>>07675000
          LOG15(MOVE'LENGTH*2,@B'BUF'HDR,MOVE'LENGTH*2,15);    <<02803>>07680000
                                                               <<02803>>07685000
          end;                                                 <<02803>>07690000
                                                               <<02803>>07695000
        end;                                                   <<02803>>07700000
                                                               <<02803>>07705000
<<2>>   begin <<IOQ index for sent message>>                   <<02803>>07710000
                                                               <<02803>>07715000
        <<store IOQ & DST associated in last element of array>><<02803>>07720000
        LAST'ENTRY := LAST'ENTRY + 1; <<increment last entry po<<02803>>07725000
        IOQ'ARRAY(LAST'ENTRY) := SM2; <<store IOQ>>            <<02803>>07730000
        DST'ARRAY(LAST'ENTRY) := SM1; <<store DST>>            <<02803>>07735000
                                                               <<02803>>07740000
        <<now, mark the IOQ with this PCB, IW bit>>            <<02803>>07745000
        IOQ'ENTRY'INDEX := SM2; <<load IOQ >>                  <<06883>>07750000
        DISABLE;                                               <<02803>>07755000
        if not IOQ'DONE then <<if not completed>>              <<06883>>07760000
          begin                                                <<02803>>07765000
          IOQ'IOWAKE := 1;  <<turn on WAKE bit>>               <<06883>>07770000
          IOQ'PCB := THISPIN; << set this PCB >>               <<06883>>07775000
          end;                                                 <<02803>>07780000
        ENABLE;                                                <<02803>>07785000
        end;                                                   <<02803>>07790000
                                                               <<03072>>07795000
<<3>>   begin <<GENMSG from I/O driver, ICS spawned>>          <<02803>>07800000
        SAVESIR := GETSIR(MSGSIR); << Protect MSGBUF integrity <<04270>>07805000
        if NO'BUF'AVAIL then                                   <<04270>>07810000
          begin                                                <<04270>>07815000
          << Send parms to port 3 and put dummy parms on tos >><<04270>>07820000
          SENDMSG(THISPIN,3,4,%100000);                        <<04270>>07825000
          tos := 0D;                                           <<04270>>07830000
          tos := 0D;                                           <<04270>>07835000
          end                                                  <<04270>>07840000
        else                                                   <<04270>>07845000
                                                               <<04270>>07850000
        begin                                                  <<04270>>07855000
        SBUFX := SM2;     <<save sysbuf index>>                <<02803>>07860000
        FLAG := false;    <<reply flag>>                       <<02803>>07865000
        TOS := 0;    << RETURN VALUE FROM GENMSG >>            <<06883>>07870000
        ASSEMBLE( ADDS 14 ); << OPEN BUF OF GENMSG PARMS >>    <<06883>>07875000
        ASSEMBLE( LRA S-13 ); << DB REL DISP OF BUFFER >>      <<06883>>07880000
        TOS := SBH'DST;       << DST NUMBER OF SBUF    >>      <<06883>>07885000
        TOS := SBUFX+1;       << DISP INTO SBUF TABLE  >>      <<06883>>07890000
        TOS := 14;            << NR OF WORDS TO MOVE   >>      <<06883>>07895000
        ASSEMBLE( MFDS 4 );                                    <<06883>>07900000
        DSTX := SBF(SBUFX+12);<< SAVE DITP IN DSTX     >>      <<06883>>07905000
        SETSYSDB;                                              <<06883>>07910000
        <<return system buffer>>                               <<02803>>07915000
        RETURNSBUF(SBUFX);                                     <<02803>>07920000
        assemble(tbc DSTB); <<see if REPLY and no DST>>        <<02803>>07925000
        if <> then                                             <<02803>>07930000
          begin                                                <<02803>>07935000
          if DSTNUM = 0 then                                   <<02803>>07940000
            SUDDENDEATH(271);                                  <<02803>>07945000
          FLAG := DIT'REPLY;                                   <<06883>>07950000
          BUF := BUF+DSTNUM-(DST(DITDSTI)-SYSDB);              <<06883>>07955000
          DSTNUM := DITDST;                                    <<02803>>07960000
          RELSIR(MSGSIR,SAVESIR);                              <<06883>>07965000
          end;                                                 <<02803>>07970000
        RESETDB(-1);  <<DB is back to stack>>                  <<02803>>07975000
        assemble(pcal GENMSG);                                 <<02803>>07980000
        assemble(del);  <<delete return value on tos>>         <<02803>>07985000
        if FLAG then                                           <<02803>>07990000
          begin                                                <<02803>>07995000
          SETSYSDB;                                            <<02803>>08000000
          tos := DSTX;            <<get the DIT pntr>>         <<02803>>08005000
          DISABLE;                                             <<02803>>08010000
          PS0.IAK := 1;   <<set interrupt ack bit>>            <<02803>>08015000
          Q'ENTRY'INDEX := PS0(DIOQP); <<set msg reply in IOQ>><<06883>>08020000
          if <> then                                           <<06883>>08025000
            IF PS0.(0:2) = 1 << IF DRQ ENTRY >>                <<06883>>08030000
               THEN DRQ'MSGDONE := 1                           <<06883>>08035000
               ELSE IOQ'MSGDONE := 1;                          <<06883>>08040000
          ENABLE;                                              <<02803>>08045000
          assemble(del);  <<delete pointer>>                   <<02803>>08050000
          AWAKEIO(*,NOIMPEDE);                                 <<02803>>08055000
          RESETDB(-1);                                         <<02803>>08060000
          end;                                                 <<02803>>08065000
        end;   << of ELSE on NO'BUF'AVAIL >>                   <<04270>>08070000
                                                               <<04270>>08075000
              IF FLAG <> DIT'REPLY THEN                        <<06883>>08080000
        RELSIR(MSGSIR,SAVESIR);                                <<04270>>08085000
        end;                                                   <<02803>>08090000
                                                               <<02803>>08095000
<<4>>  begin << Process device maintenence request >>          <<03101>>08100000
       PROC'MAINT'REQ(SM2,SM1,SM0);                            <<03101>>08105000
       end;                                                    <<03101>>08110000
                                                               <<03101>>08115000
<<5>>   PROC'DCU'REQUEST(SM2,DST'DCU'LOG); << DCU maintenence>><<04187>>08120000
                                                               <<04187>>08125000
        end; <<of case on message type>>                       <<02803>>08130000
                                                               <<02803>>08135000
        assemble(subs 4);  <<pop 4 words off tos>>             <<02803>>08140000
        end;  <<of successful RCPT of IPC msg>>                <<02803>>08145000
                                                               <<02803>>08150000
                                                               <<03101>>08155000
                                                               <<03101>>08160000
                                                               <<03101>>08165000
                                                               <<03072>>08170000
      end;    <<of check for any IPC message>>                 <<02803>>08175000
                                                               <<02803>>08180000
   <<now, see if any IOQ's have completed so we can>>          <<02803>>08185000
   <<release their DST>>                                       <<02803>>08190000
   CURRENT'INDEX := -1;                                        <<02803>>08195000
   while (CURRENT'INDEX:=CURRENT'INDEX+1) <= LAST'ENTRY do     <<02803>>08200000
     begin  <<check the IOQ's>>                                <<02803>>08205000
     IOSTATUS(IOQ'ARRAY(CURRENT'INDEX));                       <<02803>>08210000
     if = then                                                 <<02803>>08215000
       MAKE'BUFFER'AVAIL;  << I/O has completed >>             <<02803>>08220000
     end;                                                      <<02803>>08225000
                                                               <<02803>>08230000
<< perform watchdog timer housekeeping >>                      <<02803>>08235000
if TRLX <> 0 then                                              <<02803>>08240000
  begin   << watchdog timer is set, see if expired >>          <<02803>>08245000
  NEW'TIME := TIMER - LAST'TIME;  << delta time in ms >>       <<02803>>08250000
  if < then   << system clock wrap-around >>                   <<02803>>08255000
    NEW'TIME := %17777777777D - NEW'TIME + 1D;                 <<02803>>08260000
  if NEW'TIME >= PAUSE'TIME then                               <<02803>>08265000
    if LAST'ENTRY >= 0 then                                    <<02803>>08270000
      begin  << we will kill the oldest outstanding msg >>     <<02803>>08275000
      CURRENT'INDEX := 0;                                      <<02803>>08280000
      tos := IOQ'ARRAY(CURRENT'INDEX); << oldest IOQ on tos >> <<02803>>08285000
      SETSYSDB;                                                <<02803>>08290000
      ABORTIOX(*);                                             <<02803>>08295000
      RESETDB(-1);                                             <<02803>>08300000
      MAKE'BUFFER'AVAIL;                                       <<02803>>08305000
      end;                                                     <<02803>>08310000
  end;   << of processing "popped" watchdog timer >>           <<02803>>08315000
                                                               <<02803>>08320000
<< if no watchdog timer & have impeded processes, get one >>   <<02803>>08325000
PDISABLE;                                                      <<02803>>08330000
if IOMSGQUEUE <> 0 then  << there are impeded processes >>     <<02803>>08335000
  if TRLX = 0 then   << there is no current watchdog timer >>  <<02803>>08340000
    begin                                                      <<02803>>08345000
                                                               <<02803>>08350000
    LAST'TIME := TIMER;   << save time of call >>              <<02803>>08355000
    << stack ops for call to TIMEREQ >>                        <<02803>>08360000
    tos := 0;     << TRLX returned >>                          <<02803>>08365000
    tos := %12;   << CODE %12 is watchdog timer >>             <<02803>>08370000
    tos := IOMSGPROC;  << my PCB offset from PCB base >>       <<02803>>08375000
    tos := PAUSE'TIME; << Delay time in ms (double) >>         <<02803>>08380000
                                                               <<02803>>08385000
    SETSYSDB;                                                  <<02803>>08390000
    assemble(pcal TIMEREQ);                                    <<02803>>08395000
    << or tos := TIMEREQ(%12,IOMSGPROC,PAUSE'TIME); >>         <<02803>>08400000
    RESETDB(-1);                                               <<02803>>08405000
                                                               <<02803>>08410000
    << save TRLX index >>                                      <<02803>>08415000
    TRLX := tos;                                               <<02803>>08420000
    end;                                                       <<02803>>08425000
                                                               <<02803>>08430000
PENABLE;                                                       <<02803>>08435000
                                                               <<02803>>08440000
<<now, wait for a new event to wake me up>>                    <<02803>>08445000
WAIT(-(%114)<<IO,timer,msg>>,0);                               <<02803>>08450000
go to Start;                                                   <<02803>>08455000
                                                               <<02803>>08460000
end;   <<of process/procedure IOMESSPROC>>                     <<02803>>08465000
$INCLUDE INCLVDEV                                              <<04339>>08470000
$PAGE "SDFINIT PROCEDURE - DATA DEFINITIONS"                            08475000
<<****************************************>>                   <<03109>>08480000
<<****************************************>>                   <<03109>>08485000
<<*                                      *>>                   <<03109>>08490000
<<*          PROCEDURE SDFINIT           *>>                   <<03109>>08495000
<<*                                      *>>                   <<03109>>08500000
<<****************************************>>                   <<03109>>08505000
<<****************************************>>                   <<03109>>08510000
                                                               <<03109>>08515000
                                                               <<03109>>08520000
<<------------------------------------------------------>>     <<03109>>08525000
<<                                                      >>     <<03109>>08530000
<<  CHANGES WERE MADE TO THIS PROCEDURE IN NOVEMBER AND >>     <<03109>>08535000
<<  DECEMBER OF 1981 TO ADD THE CS-80 DISC DRIVES AND   >>     <<03109>>08540000
<<  THE HP9140 CARTRIDGE TAPE DRIVE AS SOURCE DEVICES   >>     <<03109>>08545000
<<  FOR SOFTDUMP.  THE SUBROUTINE PUT'BOOTS'ON'DEV WAS  >>     <<03109>>08550000
<<  WAS ADDED TO DECIDE WHICH SET OF BOOT CHANNEL       >>     <<03109>>08555000
<<  PROGRAMS WOULD BE BUILT.  THE BOOTSTRAPS FOR CS-80  >>     <<03109>>08560000
<<  DEVICES ARE BUILT AND STORE ONTO THE DEVICE BY THE  >>     <<03109>>08565000
<<  SUBROUTINE CONFIGURE'CS80'BOOTS.  CHANGES WERE ALSO >>     <<03109>>08570000
<<  MADE BECAUSE SOFTDUMP WAS GETTING TOO LARGE FOR     >>     <<03109>>08575000
<<  THE LOWER HALF OF BANK 0.  THE BOOTSTRAP NOW READS  >>     <<03109>>08580000
<<  THE BOOTSTRAP EXTENSION INTO %175000 OF BANK 0 FOR  >>     <<03109>>08585000
<<  %2000 WORDS. THE BOOTSTRAP EXTENSION SAVES ALL OF   >>     <<03109>>08590000
<<  BANK 0 BELOW WERE IT SITS IN MEMORY.  A CHANNEL     >>     <<03109>>08595000
<<  PROGRAM CAN NOT READ THE LAST WORD IN A BANK !!!!!  >>     <<03109>>08600000
<<  THAT IS WHY THE BOOTSTRAP EXTENSION IS ONE HP9140   >>     <<03109>>08605000
<<  SECTOR LENGTH FROM THE TOP OF BANK 0.  THE HP9140   >>     <<03109>>08610000
<<  HAS A SECTOR SIZE OF 512 WORDS.  THE ADDRESSES AND  >>     <<03109>>08615000
<<  THE LENGTHS OF THE AREAS IN THE SDFLOAD FILE ARE    >>     <<03109>>08620000
<<  ARE ADJUSTED BY THE CODE TO ALIGN ON HP9140 SECTOR  >>     <<03109>>08625000
<<  BOUNDERIES.  WHEN MAKING CHANGES BE CAREFUL  NOT TO >>     <<03109>>08630000
<<  UNDO THE ALIGNING.                                  >>     <<03109>>08635000
<<                                                      >>     <<03109>>08640000
<<------------------------------------------------------>>     <<03109>>08645000
                                                               <<03109>>08650000
                                                               <<03109>>08655000
PROCEDURE SDFINIT(MODE);                                                08660000
VALUE MODE;                                                             08665000
LOGICAL                                                                 08670000
   MODE;               <<0 - NORMAL                                     08675000
                         1 - BACKUP>>                                   08680000
  option privileged,uncallable;                                <<02637>>08685000
BEGIN                                                                   08690000
<<THIS PROCEDURE IS CALLED BY THE PROGENITOR DURING ITS                 08695000
  INITIALIZATION PHASE.  IT INITIALIZES THE SOFTWARE DUMP               08700000
  FACILITY (SDF) BY:                                                    08705000
  1. CONFIGURING BOTH THE BOOTSTRAP (ON DISC AND IN MEMORY)             08710000
     AND THE BOOTSTRAP EXTENSION.                                       08715000
  2. CONFIGURING SDF DATA SEGMENT TABLE ENTRIES TO POINT                08720000
     TO THE DISC IMAGE OF BANK 0.                                       08725000
  3. IF NOT GENERATING A BACKUP VERSION:                                08730000
     A. PLACING SYSTEM CONFIGURATION DATA INTO A RESERVED DATA          08735000
        SEGMENT OF SDF'S.                                               08740000
     B. PROCESSING THE OPTIONAL DUMPFILE COMMAND IN THE COMMAND FILE.   08745000
                                                                        08750000
   RETURNS:                                                             08755000
      CCE - OPERATION COMPLETED SUCCESSFULLY                            08760000
      CCL - OPERATION ABORTED                                           08765000
      CCG - NOT RETURNED                                                08770000
>>                                                                      08775000
                                                                        08780000
                                                                        08785000
<<* * * VERSION * * *>>                                                 08790000
                                                                        08795000
EQUATE                                                                  08800000
   VERSION          = %0012;  <<LEFT BYTE - UPDATE, RIGHT BYTE - FIX>>  08805000
                                                                        08810000
                                                                        08815000
<<* * * MISCELLANEOUS DEFINITIONS * * *>>                               08820000
                                                                        08825000
LOGICAL STAT=Q-1;                                                       08830000
LOGICAL RETURNP=Q-2;  <<RETURN POINTER IN STACK MARKER>>                08835000
INTEGER DELTAQ=Q-0;                                                     08840000
                                                                        08845000
EQUATE                                                                  08850000
   DUNIT            = 10,<< OFFSET OF UNIT # IN DIT >>         <<06883>>08855000
   DILTP            = 5, << OFFSET OF ILT PTR IN DIT >>        <<06883>>08860000
   SYSDBDATASEG     = %11,                                              08865000
   JMATDST          = 25,                                               08870000
   JMATLIMIT        = 8,                                                08875000
   SYSDBLOC         = %1000,                                            08880000
   LOWMEMORYSIZE    = %40,   <<CST PTR THRU MASK WORDS >>      <<03011>>08885000
   HIMEMORYLOC      = %1600,                                            08890000
   SECTORSIZE       = 128,                                              08895000
   HP9140'SECTOR    = %1000,                                   <<03608>>08900000
   DISABLETRAPS     = FALSE,                                            08905000
   ICF44            = 4,                                       <<01573>>08910000
   ICF55            = 5,                                       <<01573>>08915000
   MM               = 6,      << MIGHTY MOUSE SYSTEM >>        <<M8067>>08920000
   ICF25            = 2;                                                08925000
DOUBLE OFFSETFACTOR,                                           <<03608>>08930000
       SLOPLENGTH,                                             <<03608>>08935000
       SDFMAPLENGTH;                                           <<03608>>08940000
INTEGER SECTOR'COUNT;                                          <<03608>>08945000
LOGICAL SECTORSIZ;                                             <<03608>>08950000
LOGICAL LDNFORGETDEVINFO;                                      <<03608>>08955000
BYTE ARRAY LDNALPHA(0:8);                                      <<03608>>08960000
                                                                        08965000
INTEGER XREG=X;                                                         08970000
INTEGER S0=S-0,S1=S-1,S2=S-2,S3=S-3,S4=S-4,S5=S-5,S6=S-6,S7=S-7;        08975000
POINTER SP0=S-0;                                                        08980000
INTEGER QM0=Q-0,QM5=Q-5,QM7=Q-7;                                        08985000
LOGICAL LS0=S-0;                                                        08990000
BYTE BS0=S-0,BS1=S-1;                                                   08995000
BYTE POINTER BPS0=S-0,BPS1=S-1;                                         09000000
DOUBLE DS3=S-3,DS6=S-6,DS8=S-8;                                         09005000
                                                                        09010000
DEFINE                                                                  09015000
   DEVINFOTYPE      = DEVINFO(1).(10:6)#,                      <<03608>>09020000
   DATASEGADDRESS   = DSTBASE(4*DST+3)#;                                09025000
                                                                        09030000
EQUATE CCG=0,                                                           09035000
       CCL=1,                                                           09040000
       CCE=2;                                                           09045000
                                                                        09050000
DEFINE CONDITIONCODE=STAT.(6:2)#;                                       09055000
                                                                        09060000
<<* * * FILE LABEL DEFINITIONS * * *>>                                  09065000
                                                                        09070000
EQUATE                                                                  09075000
   LABELEN          = 76;                                               09080000
DEFINE                                                                  09085000
   FLABSECTOFFSET   = BUF(39).(0:8)#,                                   09090000
   FLABEXTENT0      = BUF(44)      #,                                   09095000
   FLABFIRSTEXTENT  = DBUF(22)     #;                                   09100000
                                                                        09105000
<<* * * SYSTEM DB * * *>>                                               09110000
                                                                        09115000
DEFINE                                                                  09120000
   NUMBERBANKS      = ABSOLUTE(SYSDBLOC+%47)+1 #,                       09125000
   CONSOLELDEV      = ABSOLUTE(SYSDBLOC+%74)   #,                       09130000
   MAXSTACKSIZE     = ABSOLUTE(SYSDBLOC+%107)  #,                       09135000
   MAXDSEGSIZE      = ABSOLUTE(SYSDBLOC+%111)  #,                       09140000
   MAXDSEG          = ABSOLUTE(SYSDBLOC+%112)  #;                       09145000
$PAGE                                                          <<03011>>09150000
                                                               <<03011>>09155000
COMMENT                                                        <<03011>>09160000
        DISC FORMAT OF THE SDF FILE                            <<03011>>09165000
        ===========================                            <<03011>>09170000
                                                               <<03011>>09175000
    ----------------  <= SDFILEADDR (START ADDRESS SECTOR)     <<03011>>09180000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>09185000
    ----------------  <= BOOTXADDR                             <<03011>>09190000
    !              !       (CAN NOT CROSS CYL BOUNDARY)        <<03011>>09195000
    !     BOOTX    !       BOOTSTRAP EXTENSION- WILL BE READ   <<03011>>09200000
    !              !       BY BOOT INTO MEM(%77000) AND EXEC   <<03011>>09205000
    ----------------                                           <<03011>>09210000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>09215000
    ----------------  <= BOOTXSAVEADDR                         <<03011>>09220000
    !              !       (CAN NOT CROSS CYL BOUNDARY)        <<03011>>09225000
    !   BOOTXSAVE  !       SAVE MEMORY (%77000-%77777) HERE    <<03011>>09230000
    !              !       BEFORE BOOTX IS READ THERE          <<03011>>09235000
    ----------------                                           <<03011>>09240000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>09245000
    ----------------  <= SDFMAPADDR                            <<03011>>09250000
    !              !                                           <<03011>>09255000
    !    SDFMAP    !       SDFMAP - A STORAGE MAP - CONTAINS   <<03011>>09260000
    !              !       DISC/MEM ADDRS FOR STORED PORTIONS  <<03011>>09265000
    !              !       OF ORIGINAL MEM. (FOR SDFLOAD)      <<03011>>09270000
    ----------------  <= OVERLAYADDR                           <<03011>>09275000
    !              !                                           <<03011>>09280000
    !  OVERLAYAREA !       OVERLAYAREA - 1ST HALF OF BANK-0    <<03011>>09285000
    !              !       WILL BE SAVED TO DISC HERE          <<03011>>09290000
    !              !       (EXCEPT FOR BOOTXSAVED PORTION)     <<03011>>09295000
    ----------------  <= BANK1SAVEADDR                         <<03011>>09300000
    !              !                                           <<03011>>09305000
    !  BANK-1 SAVE !       BANK-1 SAVE AREA-  FOR ICF-55       <<03011>>09310000
    !              !       DRT TABLE (BANK-1) SAVED HERE       <<03011>>09315000
    ----------------  <= SDFCODEADDR                           <<03011>>09320000
    !              !                                           <<03011>>09325000
    !   SDF CODE   !       SDF CODE WILL BE READ FROM HERE     <<03011>>09330000
    !              !       INTO MEMORY FOR EXECUTION           <<03011>>09335000
    ----------------                                           <<03011>>09340000
                                                               <<03011>>09345000
END COMMENT;                                                   <<03011>>09350000
                                                               <<03011>>09355000
$PAGE                                                          <<03011>>09360000
                                                                        09365000
                                                               <<03011>>09370000
DEFINE                                                         <<03011>>09375000
    ONESECTOR          = 128#,               <<WORDS>>         <<03011>>09380000
                                                               <<03011>>09385000
    BOOTLEN            = 1D#,                <<SECTOR>>        <<03011>>09390000
    BOOTLENWD          = 128#,               <<WORDS>>         <<03011>>09395000
       <<128W = 1 SECTOR BOOTSTRAP PROGRAM>>                   <<03011>>09400000
                                                               <<03011>>09405000
    BOOTXLEN'          = 8#,                                   <<03608>>09410000
    BOOTXLEN           = 8D#,                                  <<03608>>09415000
    BOOTXLENWD         = 1024#,                                <<03608>>09420000
    BOOTXLENBT         = 2048#,                                <<03608>>09425000
       <<512W = 4 SECTOR BOOTSTRAP EXTENSION PROGRAM>>         <<03011>>09430000
                                                               <<03011>>09435000
    SLOPLEN            = BOOTXLEN - 1D#,                       <<03011>>09440000
    HP9140'SLOPLEN     = BOOTXLEN#,                            <<03608>>09445000
       << MUST BE MULTIPLE OF FOUR FOR HP9140    >>            <<03608>>09450000
       <<WORST CASE "WASTE" TO INSURE THAT THE BOOTX        >> <<03011>>09455000
       <<AND BOOTXSAVE AREAS DO NOT CROSS "CYLINDER" BOUNDARY>><<03011>>09460000
                                                               <<03011>>09465000
    BOOTXSAVELEN'      = BOOTXLEN'#,                           <<03608>>09470000
    BOOTXSAVELEN       = BOOTXLEN#,          <<SECTORS>>       <<03011>>09475000
    BOOTXSAVELENWD     = BOOTXLENWD#,        <<WORDS>>         <<03011>>09480000
       <<EXACT SAME SIZE AS THE BOOTSTRAP EXTENSION PROGRAM.>> <<03011>>09485000
       <<SAVE AREA FOR MEMORY WHICH WILL HOLD BOOTX PROG.>>    <<03011>>09490000
                                                               <<03011>>09495000
    SDFMAPLEN          = 1D#,                <<SECTORS>>       <<03011>>09500000
    BIGSDFMAPLEN       = 4D#, << SECTORS IN A HP9140 SECTOR >> <<03608>>09505000
    SDFMAPLENWD        = 128#,               <<WORDS>>         <<03011>>09510000
       <<A MAP OF STORAGE ADDRESSES FOR ORIG SECTIONS>>        <<03011>>09515000
       <<OF MEMORY STORED DURING BOOT,BOOTX,COLD-LOAD TRAP>>   <<03011>>09520000
                                                               <<03011>>09525000
       << CERTAIN DEFINES NEED PARENTHESIS TO WORK CORRECTLY >><<03608>>09530000
    OVERLAYAREALEN     = (508D - BOOTXSAVELEN)#, << SECTORS >> <<03608>>09535000
    OVERLAYAREALENWD   = ((508 - BOOTXSAVELEN') * ONESECTOR)#, <<03608>>09540000
       <<STORAGE AREA FOR THE 1ST HALF OF BANK-0 (EXCEPT FOR>> <<03011>>09545000
       <<PREV. STORED BOOTXSAVE)  %100000W = 256 SECTORS    >> <<03011>>09550000
       <<MINUS PREVIOUSLY STORED "BOOTXSAVELEN" SECTORS     >> <<03011>>09555000
                                                               <<03011>>09560000
    BANK1SAVELEN       = 16D#,               <<SECTORS>>       <<03011>>09565000
    BANK1SAVELENWD     = 2048#,              <<WORDS>>         <<03011>>09570000
       <<AREA FOR STORAGE OF BANK-1 DRT TABLE (FOR ICF-55) >>  <<03011>>09575000
       <<512 DEVICES X 4W ENTRIES = 2048W = 16 SECTORS     >>  <<03011>>09580000
                                                               <<03011>>09585000
    CODEAREALEN'       = 256#,               <<SECTORS>>       <<03109>>09590000
    CODEAREALEN        = 256D#,              <<SECTORS>>       <<03109>>09595000
    CODEAREALENWD      = 32768#,             <<WORDS>>         <<03109>>09600000
                                                               <<03011>>09605000
    SDFCODELOC  = BOOTXLEN + SLOPLEN +BOOTXSAVELEN +SDFMAPLEN+ <<03011>>09610000
                  OVERLAYAREALEN + BANK1SAVELEN#,              <<03011>>09615000
       <<SECTOR OFFSET FROM START OF FILE TO THE CODE PORTION>><<03011>>09620000
                                                               <<03011>>09625000
    SDFTOTALSECTORS = SDFCODELOC + CODEAREALEN#, <<SECTORS>>   <<03011>>09630000
    SDFTOTALNUMRECS = SDFTOTALSECTORS#,  <<RECSIZE=ONESECTOR>> <<03011>>09635000
       <<TOTAL LENGTH IN SECTORS = TOTAL NUMRECS >>            <<03011>>09640000
    SYSDBSECTORLOC     = 4D#,                                  <<03011>>09645000
       <<4 SECTOR OFFSET = 512W = %1000 >>                     <<03011>>09650000
                                                               <<03011>>09655000
    TWO'SECTORS        = SECTORSIZ * 2#,                       <<03608>>09660000
    HP9140'HIMEMSECL   = 2D#,                                  <<03608>>09665000
    HIMEMORYSECTORLOC  = 7D#;                                  <<03011>>09670000
       <<7 SECTOR OFFSET = 896W = %1600   TARGET FOR CODE>>    <<03011>>09675000
                                                               <<03011>>09680000
                                                               <<03011>>09685000
<<* * * GLOBAL DATA - USED IMPLICITLY BY ANY SUBROUTINE * * *>>         09690000
                                                                        09695000
DEFINE                                                                  09700000
   DTSUBTYPE        = DEVTIPE.(0:8)            #,                       09705000
   DTDEVICETYPE     = DEVTIPE.(8:8)            #,                       09710000
   DSUBTYPE         = DESC0.(9:4)              #,              <<03011>>09715000
   DDEVICETYPE      = DESC1.(10:6)             #;                       09720000
EQUATE                                                                  09725000
   NUMFILES         = 4,                                                09730000
   OLDSYSFILE       = 1,                                                09735000
   READWRITE        = 4;                                                09740000
INTEGER                                                                 09745000
   SDFILENUM:=0,CMDFILENUM:=0,DUMPFILENUM:=0,BACKUPFILENUM:=0,          09750000
   NULL := 0,CPUTYPE;                                          <<01573>>09755000
ARRAY FILEARRAY(*)=SDFILENUM;                                           09760000
BYTE ARRAY DESIG(0:9);                                                  09765000
INTEGER ARRAY                                                           09770000
   BUF(0:1024);                                                         09775000
DOUBLE POINTER                                                          09780000
   DBUF:=@BUF;                                                          09785000
BYTE POINTER                                                            09790000
   BBUF:=@BUF;                                                          09795000
                                                                        09800000
<<DISC DESCRIPTORS>>                                                    09805000
EQUATE                                                                  09810000
<<TYPES>>                                                               09815000
   T13037         = 0,                                                  09820000
   T7902          = 2,                                                  09825000
   CS80TYPE       = 3,                                         <<03608>>09830000
   HP9140         = 3,                                         <<03608>>09835000
   HP797X'TAPE    = 24,                                        <<03608>>09840000
                                                                        09845000
<<13037 CONTROLLER SUBTYPES>>                                           09850000
   HP7902         = 0,                                                  09855000
   R7905          = 4,                                                  09860000
   F7905          = 5,                                                  09865000
   ALL7905        = 6,                                                  09870000
   SYSDISCMODE    = 7,                                                  09875000
   ALL7920        = 8,                                                  09880000
   ALL7925        = 9,                                                  09885000
   R7906          = 10,                                                 09890000
   F7906          = 11,                                                 09895000
   ALL7906        = 12;                                                 09900000
ARRAY SECYLINDER(4:5)=PB:=                                              09905000
   96,48,144,144,240,576,96,96,192;                                     09910000
ARRAY HEADBASE(4:5)=PB:=                                                09915000
   0, %1000, 0, 0, 0, 0, 0, %1000, 0;                                   09920000
INTEGER ARRAY SECTRACK(4:5)=PB:=                                        09925000
   48,48,48,48,48,64,48,48,48;                                          09930000
INTEGER ARRAY FILEMASK(0:1) = PB :=                                     09935000
   %7406,%7406,%7406,%7406,                                             09940000
   %7406,%7405,%7407,%7407,%7407,%7407,%7406,%7406,%7407;               09945000
INTEGER ARRAY SECYLINDER7902(0:1)=PB:=30,60,26,52;                      09950000
INTEGER ARRAY SECTRACK7902(0:1)=PB:=30,30,26,26;                        09955000
                                                                        09960000
<<FOPEN DATA>>                                                          09965000
EQUATE                                                                  09970000
   FOPTIONSMASK     = %307,                                             09975000
   FIXED            = 0,                                                09980000
   OLDFILE          = 1,                                                09985000
   DISC             = 0,                                                09990000
   TYPE7902         = 2,                                                09995000
   SAVE             = 1,                                                10000000
   PROPERFOPTIONS   = 1,                                                10005000
   NOBUF'READWRITE  = %404,                                             10010000
   PROPERFILECODE   = 0,                                                10015000
   PROPERBLOCKFACTOR= 3,                                                10020000
   PROPERNUMEXTENTS = 1;                                                10025000
DEFINE                                                                  10030000
   NOTFIXEDRECFORMAT = FOPTIONS.(8:2) <> 0#;                            10035000
BYTE ARRAY SDFDESIG(0:1)=PB:=                                           10040000
   "SDFLOAD ";                                                          10045000
BYTE ARRAY BACKUPDESIG(0:1)=PB:=                                        10050000
   "SDFBACK ";                                                          10055000
BYTE ARRAY DUMPDESIG(0:1)=PB:=                                          10060000
   "SDFDUMP ";                                                          10065000
BYTE ARRAY CMDESIG(0:1)=PB:=                                            10070000
   "SDFCOM ";                                                           10075000
ARRAY LPCLASS(0:1)=PB:=                                                 10080000
   "DLP     ";                                                          10085000
ARRAY DUMPDEVCLASS(0:1)=PB:=                                            10090000
   "DDUMP   ";                                                          10095000
INTEGER                                                                 10100000
   FN,BLOCKSIZE,LOGDEVICE,DEVICETYPE,RECSIZE,HDADDR,FILECODE,NUMEXTENT, 10105000
   BLOCKFACTOR;                                                         10110000
LOGICAL                                                                 10115000
   FOPTIONS;                                                            10120000
DOUBLE                                                                  10125000
   NUMREC,LABELADDR;                                                    10130000
INTEGER                                                                 10135000
   LABEL0=LABELADDR,LABEL1=LABELADDR+1;                                 10140000
INTEGER ARRAY                                                           10145000
   CLASSNAME(0:4);                                                      10150000
EQUATE                                                                  10155000
   SDFDESIGLEN    = 8,                                                  10160000
   DUMPDESIGLEN   = 8,                                                  10165000
   CMDESIGLEN     = 7,                                                  10170000
   BACKUPDESIGLEN = 8;                                                  10175000
                                                                        10180000
<<MESSAGE DATA>>                                                        10185000
                                                                        10190000
DEFINE                                                                  10195000
   SUCCESSFUL       = 0                            #,                   10200000
   UGLYSDFILE       = 1 CAT SDFILENUM(0:8:8)       #,                   10205000
   UGLYSDFOPTIONS   = 2 CAT SDFILENUM(0:8:8)       #,                   10210000
   UGLYSDFRECSIZE   = 3 CAT SDFILENUM(0:8:8)       #,                   10215000
   UGLYSDFLDEV      = 4 CAT SDFILENUM(0:8:8)       #,                   10220000
   UGLYSDFILECODE   = 5 CAT SDFILENUM(0:8:8)       #,                   10225000
   UGLYSDFNUMRECS   = 6 CAT SDFILENUM(0:8:8)       #,                   10230000
   UGLYSDFNUMEXTENT = 7 CAT SDFILENUM(0:8:8)       #,                   10235000
   SDFILERR         = 8 CAT SDFILENUM(0:8:8)       #,                   10240000
   UGLYBACKUPFILE   = 9 CAT BACKUPFILENUM(0:8:8)   #,                   10245000
   BACKUPNOTSERIAL  = 10 CAT BACKUPFILENUM(0:8:8)  #,                   10250000
   BACKUPFILERR     = 11 CAT BACKUPFILENUM(0:8:8)  #,                   10255000
   UGLYCOMMANDFILE  = 12 CAT CMDFILENUM(0:8:8)     #,                   10260000
   UGLYCOMFOPTIONS  = 13 CAT CMDFILENUM(0:8:8)     #,                   10265000
   UGLYCOMRECSIZE   = 14 CAT CMDFILENUM(0:8:8)     #,                   10270000
   UGLYCOMDEV       = 15 CAT CMDFILENUM(0:8:8)     #,                   10275000
   UGLYCOMEXTENTS   = 16 CAT CMDFILENUM(0:8:8)     #,                   10280000
   UGLYDUMPFILE     = 17 CAT DUMPFILENUM(0:8:8)    #,                   10285000
   UGLYDUMPFOPTIONS = 18 CAT DUMPFILENUM(0:8:8)    #,                   10290000
   UGLYDUMPRECSIZE  = 19 CAT DUMPFILENUM(0:8:8)    #,                   10295000
   UGLYDUMPDEV      = 20 CAT DUMPFILENUM(0:8:8)    #,                   10300000
   UGLYDEXTENTS     = 21 CAT DUMPFILENUM(0:8:8)    #,                   10305000
   UGLYBLOCKFACTOR  = 22 CAT CMDFILENUM(0:8:8)     #,          <<03608>>10310000
   BADDEVICE        = 23 CAT DEVTIPE(0:8:8)        #;          <<03608>>10315000
INTEGER                                                                 10320000
   MSGSTART,MSGEND;                                                     10325000
BYTE ARRAY MSGARRAY(0:1)=PB:=                                           10330000
   "#",                                                                 10335000
   "SDF FILE DOES NOT EXIST#",                                          10340000
   "SDF FILE HAS INVALID FOPTIONS#",                                    10345000
   "SDF FILE HAS INVALID RECORD SIZE#",                                 10350000
   "SDF FILE IS NOT ON THE SYSTEM DISC#",                               10355000
   "SDF FILE HAS AN INVALID FILE CODE#",                                10360000
   "SDF FILE HAS AN INSUFFICIENT NUMBER OF RECORDS#",                   10365000
   "SDF FILE HAS MORE THAN ONE EXTENT#",                                10370000
   "ERROR ENCOUNTERED ACCESSING SDF FILE#",                             10375000
   "UNABLE TO OPEN BACKUP FILE#",                                       10380000
   "BACKUP FILE NOT A SERIAL DISC#",                                    10385000
   "ERROR ENCOUNTERED WHILE ACCESSING BACKUP FILE#",                    10390000
   "UNABLE TO OPEN COMMAND FILE#",                                      10395000
   "COMMAND FILE HAS INVALID FOPTIONS#",                                10400000
   "COMMAND FILE HAS INVALID RECORD SIZE#",                             10405000
   "COMMAND FILE IS NOT ON A DISC#",                                    10410000
   "COMMAND FILE HAS MORE THAN ONE EXTENT#",                            10415000
   "UNABLE TO OPEN DISC DUMP FILE#",                                    10420000
   "DISC DUMP FILE HAS INVALID FOPTIONS#",                              10425000
   "DISC DUMP FILE HAS INVALID RECORD SIZE#",                           10430000
   "DISC DUMP FILE IS NOT ON A DISC#",                                  10435000
   "DUMP FILE HAS MORE THAN ONE EXTENT#",                               10440000
   "COMMAND FILE BLOCK FACTOR <> 5#",                          <<03608>>10445000
   "BADDEVICE CAN'T CONFIGURE BOOT #";                         <<03608>>10450000
                                                                        10455000
<<ATTACHIO DATA>>                                                       10460000
                                                                        10465000
EQUATE                                                                  10470000
   STACKDST         = 0,                                                10475000
   READ             = 0,                                                10480000
   WRITE            = 1,                                                10485000
   BLOCKED          = 1,                                                10490000
   QMISC            = 0;                                                10495000
DEFINE                                                                  10500000
   DVRSTATUS        = IOSTAT0.(13:3)    #,                              10505000
   BADIO            = (DVRSTATUS<>1)    #;                              10510000
DOUBLE                                                                  10515000
   IOSTATUS;                                                            10520000
INTEGER                                                                 10525000
   IOSTAT0=IOSTATUS,IOSTAT1=IOSTATUS+1;                                 10530000
                                                                        10535000
<<* * * MAINLINE DATA * * *>>                                           10540000
DOUBLE                                                                  10545000
   SDFILEADDR,                                                 <<03011>>10550000
   DISCTARGETADDR,                                             <<03608>>10555000
   BOOTXADDR,                                                  <<03011>>10560000
   BOOTXSAVEADDR,                                              <<03011>>10565000
   OVERLAYADDR,                                                <<03011>>10570000
   SDFMAPADDR,                                                 <<03011>>10575000
   BANK1SAVEADDR,                                              <<03011>>10580000
   SDFCODEADDR,                                                <<03011>>10585000
   HIGHMEMADDR,                                                <<03608>>10590000
   CMDFILEADDR,                                                <<03011>>10595000
   DUMPFILEADDR;                                               <<03011>>10600000
                                                               <<03011>>10605000
LOGICAL  << EQUIVALENCE SINGLES TO DOUBLES >>                  <<03608>>10610000
   BOOTXSAVEADDR1    =   BOOTXSAVEADDR,  << TOP WORD >>        <<03608>>10615000
   BOOTXSAVEADDR2    =   BOOTXSAVEADDR + 1, << BOTTOM WORD >>  <<03608>>10620000
                                                               <<03608>>10625000
   BOOTXADDR1        =   BOOTXADDR,      << TOP WORD >>        <<03608>>10630000
   BOOTXADDR2        =   BOOTXADDR + 1,  << BOTTOM WORD >>     <<03608>>10635000
                                                               <<03608>>10640000
   OVERLAYADDR1      =   OVERLAYADDR,    << TOP WORD >>        <<03608>>10645000
   OVERLAYADDR2      =   OVERLAYADDR + 1,  << BOTTOM WORD >>   <<03608>>10650000
                                                               <<03608>>10655000
   SDFCODEADDR1      =   SDFCODEADDR,    << TOP WORD >>        <<03608>>10660000
   SDFCODEADDR2      =   SDFCODEADDR + 1,  << BOTTOM WORD >>   <<03608>>10665000
                                                               <<03608>>10670000
   HIGHMEMADDR1      =   HIGHMEMADDR,    << TOP WORD >>        <<03608>>10675000
   HIGHMEMADDR2      =   HIGHMEMADDR + 1,  << BOTTOM WORD >>   <<03608>>10680000
                                                               <<03608>>10685000
   BANK1SAVEADDR1    =   BANK1SAVEADDR,  << TOP WORD >>        <<03608>>10690000
   BANK1SAVEADDR2    =   BANK1SAVEADDR + 1,  << BOTTOM WORD >> <<03608>>10695000
                                                               <<03608>>10700000
   SDFMAPADDR1       =   SDFMAPADDR,     << TOP WORD >>        <<03608>>10705000
   SDFMAPADDR2       =   SDFMAPADDR + 1,   << BOTTOM WORD >>   <<03608>>10710000
                                                               <<03608>>10715000
   DISCADDR1         =   DISCTARGETADDR,   << TOP WORD >>      <<03608>>10720000
   DISCADDR2         =   DISCTARGETADDR + 1; << BOTTOM WORD >> <<03608>>10725000
                                                               <<03608>>10730000
                                                               <<03608>>10735000
INTEGER                                                                 10740000
   DESTDEV,CMDEV:=0,DUMPDEV:=0,DEVTIPE,CMDFILELEN,DUMPFILELEN;          10745000
EQUATE                                                                  10750000
   SYSTEMDISC       = 1;                                                10755000
                                                                        10760000
<<* * * SUBROUTINE LOCAL DATA * * *>>                                   10765000
                                                                        10770000
<<LOCATEDISCADDR VARIABLES>>                                            10775000
DOUBLE                                                                  10780000
   SECTORSLEFT,SEC'CYL,CYLINDERNUM;                                     10785000
                                                                        10790000
<<ERROREXIT DATA>>                                                      10795000
                                                                        10800000
DEFINE                                                                  10805000
   ERRFILE          = ERRNUM.(0:8)                #,                    10810000
   ERRNUMBER        = ERRNUM.(8:8)                #;                    10815000
                                                                        10820000
<<CONFIGUREDISCADDR DATA>>                                              10825000
POINTER                                                                 10830000
   CMDPTR;                                                              10835000
                                                                        10840000
<<CONFIGUREDEVICE DATA>>                                                10845000
                                                                        10850000
INTEGER                                                                 10855000
   LDTDEVICE;                                                           10860000
INTEGER ARRAY                                                           10865000
   STATBUF(0:3);                                                        10870000
INTEGER ARRAY                                                           10875000
   FLEXSUBTYPE(2:8)=PB:=0,0,0,0,1,0,2;                                  10880000
EQUATE                                                                  10885000
   ICNTRL           = 7,                                       <<00.09>>10890000
   GETSTATUS        = 7,                                       <<00.09>>10895000
   LDTDST           = 14,                                               10900000
   LDTSIZE = 7,                                                <<06883>>10905000
   LDTDEVTIPELOC    = 2;                                                10910000
                                                                        10915000
<<GENERATEBACKUPSDF DATA>>                                              10920000
                                                                        10925000
DOUBLE                                                                  10930000
   DESC,INDEX;                                                 <<03011>>10935000
INTEGER                                                                 10940000
   DESC0=DESC,DESC1=DESC+1;                                             10945000
EQUATE                                                                  10950000
   CONTIGUOUS       = %1001,                                            10955000
   ENDOFILE         = 6,                                                10960000
   SERIALDISC       = %37;                                              10965000
                                                               <<03011>>10970000
<< CONFIGURE SDFMAP>>                                          <<03011>>10975000
POINTER                                                        <<03011>>10980000
   PTR;                                                        <<03011>>10985000
DOUBLE POINTER                                                 <<03011>>10990000
   DPTR = PTR;                                                 <<03011>>10995000
                                                               <<03011>>11000000
EQUATE                                                         <<03011>>11005000
   MEMORY          = 1,    <<CODE FOR MEMORY>>                 <<03011>>11010000
   SDF'FILE        = 2,    <<CODE FOR DISC>>                   <<03011>>11015000
   MAPENTRYLEN     = 8;    <<8 WORD RECORDS>>                  <<03011>>11020000
                                                               <<03011>>11025000
EQUATE      <<FIELDS IN MAP RECORDS>>                          <<03011>>11030000
     SRCMEDIA      = 0,    <<SOURCE WAS FROM MEM,DISC, ETC>>   <<03011>>11035000
     STGMEDIA      = 1,    <<STORAGE IS ON DISC,MEM,ETC.>>     <<03011>>11040000
   DSRC'START      = 1,    <<SOURCE START ADDRESS>>            <<03011>>11045000
     SRC'START'HI  = 2,                                        <<03011>>11050000
     SRC'START'LO  = 3,                                        <<03011>>11055000
   DSRC'END        = 2,    <<SOURCE END ADDRESS>>              <<03011>>11060000
     SRC'END'HI    = 4,                                        <<03011>>11065000
     SRC'END'LO    = 5,                                        <<03011>>11070000
   DSTG            = 3,    <<STORAGE ADDRESS>>                 <<03011>>11075000
     STG'HI        = 6,                                        <<03011>>11080000
     STG'LO        = 7;                                        <<03011>>11085000
                                                               <<03011>>11090000
                                                                        11095000
<<CONFIGURE BOOTSTRAP DATA>>                                            11100000
LOGICAL                                                        <<03608>>11105000
   MEMORYLEFT,MEMORYADDR,CYLINDERSIZE,WORDCOUNT;                        11110000
POINTER                                                                 11115000
   CHANPROG,CMDAREA;                                                    11120000
DOUBLE                                                                  11125000
   SDFPROGADDR,SECTOROFFSET;                                   <<03608>>11130000
EQUATE                                                                  11135000
   CHECKSUMSTART    = %123456;                                          11140000
                                                                        11145000
                                                                        11150000
<<PROCESSCOMMANDFILE DATA>>                                             11155000
                                                                        11160000
EQUATE                                                                  11165000
   CRECSIZE         = 36,                                               11170000
   DRS              = 4096,                                             11175000
   DFILEXTENT       = 1,                                                11180000
   BANKFACTOR       = 16,                                               11185000
   SYSDSEGFACTOR    = 52;                                               11190000
INTEGER                                                                 11195000
   SESSIONLIMIT,FILL,JOBLIMIT;                                          11200000
LOGICAL                                                                 11205000
   VALIDCOMMANDFILE:=FALSE;                                             11210000
BYTE ARRAY                                                              11215000
   LOGICALDEVICE(0:1);                                                  11220000
BYTE POINTER                                                            11225000
   DDESIG;                                                              11230000
ARRAY                                                                   11235000
   LIMITS(*)=SESSIONLIMIT;                                              11240000
DOUBLE                                                                  11245000
   DNUMREC;                                                             11250000
                                                                        11255000
<<CONFIGURE SDF DATA>>                                                  11260000
                                                                        11265000
EQUATE                                                                  11270000
   WORDS0'3       = FALSE,                                              11275000
   DSTABLELOC     = 2,                                                  11280000
   CONFIGDST      = 7,                                                  11285000
   STACKDSTLOC    = 9;                                                  11290000
INTEGER ARRAY                                                           11295000
   CLASSINFO(0:16);                                            <<06883>>11300000
DOUBLE                                                                  11305000
   DSTSECTOR,CONFIGSECTOR,STACKSECTOR;                                  11310000
INTEGER                                                                 11315000
   I,STACKLOC,CHECKSUM,OVERLAYSIZE,REMAINS;                             11320000
POINTER                                                                 11325000
   DSTABLE,CONFIG;                                                      11330000
DOUBLE POINTER                                                          11335000
   CONFIGD=CONFIG;                                                      11340000
                                                                        11345000
EQUATE                                                                  11350000
   INITL          = 0,                                                  11355000
   BACKUPMODE     = 1,                                                  11360000
   CLEARBACKUP    = 2,                                                  11365000
   LASTOVERLAYBLOCK=31;                                                 11370000
                                                                        11375000
<<VARIABLES FOR CONFIGUREDEVICE>>                                       11380000
BYTE ARRAY                                                              11385000
   DEVICE(0:8);                                                <<06883>>11390000
INTEGER ARRAY                                                           11395000
   DEVINFO(0:23);                                              <<06883>>11400000
EQUATE                                                                  11405000
   NOERRORS       = 0;                                                  11410000
$PAGE "BOOTSTRAP DEFINITIONS"                                           11415000
<<* * * BOOTSTRAPS * * *>>                                              11420000
                                                                        11425000
EQUATE                                                                  11430000
   WRITEDATA         = %002000,                                         11435000
   WRITECONTROL      = %002010,                                         11440000
   READATA           = %001400,                                         11445000
   READCONTROL       = %001410,                                         11450000
   WAIT              = %001000,                                         11455000
   HALTINTERRUPT     = %000600,                                         11460000
   HALTER            = %000400,                                         11465000
   DSJ1              = %002401,                                         11470000
   JUMP              = %000000,                                         11475000
                                                                        11480000
   SEEK              = %001000,                                         11485000
   ADDRESSREC        = %006000,                                         11490000
   VERIFY            = %003400,                                         11495000
   WRITECMD          = %004000,                                         11500000
   READCMD           = %002400,                                         11505000
   STATUSCMD         = %001400,                                         11510000
   MAXCHANNELEN      = %77600;                                 <<03608>>11515000
DEFINE                                                                  11520000
   NEXTCYLMAGICNUM   = 255D     #;   <<# SECTORS TO HOLD MAXCHANNELEN>> 11525000
                                                                        11530000
EQUATE                                                                  11535000
   GOODNEWS          = 2,                                               11540000
   BADNEWS           = 0,                                               11545000
   BOOTSYSDBLOC      = %1430,                                  <<00.09>>11550000
   BOOTMEMLOC        = %1530,                                  <<00.09>>11555000
   BOOTXMEMLOC       = %175000,                                <<03608>>11560000
   BJUMPLOC          = 91,                                              11565000
   BTARGETLOC        = BOOTXMEMLOC-BOOTMEMLOC-BJUMPLOC,                 11570000
   BVERIFYLOC        = BOOTMEMLOC+111,                                  11575000
   BWLOC             = BOOTMEMLOC+113,                                  11580000
   BRLOC             = BOOTMEMLOC+114,                                  11585000
   BSFMLOC           = BOOTMEMLOC+115,                                  11590000
   BSEEK1LOC         = BOOTMEMLOC+116,                                  11595000
   BADDR1LOC         = BOOTMEMLOC+119,                                  11600000
   BSEEK2LOC         = BOOTMEMLOC+122,                                  11605000
   BADDR2LOC         = BOOTMEMLOC+125;                                  11610000
                                                                        11615000
DEFINE                                                                  11620000
   BOOTDISCADDR      = 3D     #;                                        11625000
                                                                        11630000
DEFINE                                                                  11635000
   BCHECKSUM         = BUF             #,                               11640000
   BSDFMAPADDR       = BUF(1)          #,                      <<03011>>11645000
   BSDFMAPADDR1      = BUF(2)          #,                      <<03011>>11650000
   BADDRECORD0       = BUF(17)         #,                               11655000
   BADDRECORD1       = BUF(43)         #,                               11660000
   BFILEMASK         = BUF(115)        #,                               11665000
   BBOOTXSAVEAREA    = BUF(116)        #,                      <<03011>>11670000
   BBOOTXAREA        = BUF(122)        #;                               11675000
                                                                        11680000
                                                                        11685000
<<BOOT EXTENSION DEFINITIONS>>                                          11690000
                                                                        11695000
EQUATE                                                                  11700000
   COMMANDLENGTH     = 8,                                               11705000
   WRITETEMPLATELEN  = 53,                                              11710000
   READTEMPLATELEN   = 38,                                              11715000
   BOOTXBASE         = %175000,                                <<03608>>11720000
   SIXTEENK          =  %40000,                                <<03608>>11725000
   READCMDLOC        = %176776,                                <<03608>>11730000
   WRITECMDLOC       = %176777;                                <<03608>>11735000
                                                                        11740000
DEFINE                                                                  11745000
   CMDSEEKLOC        = CMDPTR        #,                                 11750000
   CMDSEEKCYLINDER   = CMDPTR(1)     #,                                 11755000
   CMDSEEKHEADSECTOR = CMDPTR(2)     #,                                 11760000
   CMDADDRECORDLOC   = CMDPTR(3)     #,                                 11765000
   CMDADDRCYLINDER   = CMDPTR(4)     #,                                 11770000
   CMDADDRHEADSECTOR = CMDPTR(5)     #,                                 11775000
   CMDVERIFY         = CMDPTR(6)     #,                                 11780000
   CMDVERIFYSEC      = CMDPTR(7)     #,                                 11785000
   CMDSTATUS         = CMDPTR(6)     #,                                 11790000
                                                                        11795000
   BXREADCOMMAND     = CHANPROG(1022)#,                        <<03608>>11800000
   BXWRITECOMMAND    = CHANPROG(1023)#,                        <<03608>>11805000
                                                                        11810000
   WTSEEKADDR        = CHANPROG(4)   #,                                 11815000
   WTADDRECORD0      = CHANPROG(7)   #,                                 11820000
   WTADDRECORDADDR   = CHANPROG(11)  #,                                 11825000
   WTBYTECOUNT       = CHANPROG(20)  #,                                 11830000
   WTMEMORYBANK      = CHANPROG(22)  #,                        <<03011>>11835000
   WTMEMORYADDR      = CHANPROG(23)  #,                                 11840000
   WTVERSEEKADDR     = CHANPROG(30)  #,                                 11845000
   WTADDRECORD1      = CHANPROG(33)  #,                                 11850000
   WTVERADDREC       = CHANPROG(37)  #,                                 11855000
   WTVERCMDADDR      = CHANPROG(44)  #,                                 11860000
   WTCHECKPOINT      = CHANPROG(52)  #,                        <<03011>>11865000
                                                                        11870000
   RDSEEKADDR        = CHANPROG(4)   #,                                 11875000
   RDADDRECORD       = CHANPROG(7)   #,                                 11880000
   RDADDRECORDADDR   = CHANPROG(11)  #,                                 11885000
   RDBYTECOUNT       = CHANPROG(20)  #,                                 11890000
   RDMEMORYADDR      = CHANPROG(23)  #,                                 11895000
   RDSTATUSCMD       = CHANPROG(30)  #,                                 11900000
   RDSTATUSADDR      = CHANPROG(35)  #;                                 11905000
                                                                        11910000
ARRAY BOOT(0:1)=PB:=                                                    11915000
<<CHECKSUM WORD>>                                                       11920000
<<0>>   0,                                                              11925000
                                                                        11930000
<<SDFMAP AREA ADDRESS>>   <<LOGICAL SECTOR NUMBER>>            <<03011>>11935000
<<1>>   0,0,                                                            11940000
                                                                        11945000
<<WRITE OUT BOOT EXTENSION AREA TO THE DISC>>                           11950000
<<3>>   WRITECONTROL,2,0,%0,BSFMLOC,        <<SET FILE MASK>>           11955000
<<8>>   WAIT,0,                                                         11960000
<<10>>  WRITECONTROL,6,0,%0,BSEEK1LOC,      <<SEEK TO BOOTX OVRLAY>>    11965000
<<15>>  WAIT,0,                                                         11970000
<<17>>  WRITECONTROL,6,0,%0,BADDR1LOC,      <<ISSUE ADDRESS RECORD>>    11975000
<<22>>  WAIT,0,                                                         11980000
<<24>>  WRITECONTROL,2,0,%0,BWLOC,          <<ISSUE WRITE DATA COMMAND>>11985000
<<29>>  WRITEDATA,BOOTXLENBT,0,%0,BOOTXMEMLOC,<<WRITE BOOTX AREA>>      11990000
<<34>>  WAIT,0,                                                         11995000
                                                                        12000000
<<VERIFY THE DATA JUST WRITTEN>>                                        12005000
<<36>>  WRITECONTROL,6,0,%0,BSEEK1LOC,      <<SEEK TO OVERLAY AREA>>    12010000
<<41>>  WAIT,0,                                                         12015000
<<43>>  WRITECONTROL,6,0,%0,BADDR1LOC,      <<ISSUE ADDRESS RECORD>>    12020000
<<48>>  WAIT,0,                                                         12025000
<<50>>  WRITECONTROL,4,0,%0,BVERIFYLOC,     <<ISSUE VERIFY COMMAND>>    12030000
<<55>>  WAIT,0,                                                         12035000
<<57>>  DSJ1,-1,GOODNEWS,BADNEWS,           <<QUIT IF BAD WRITE>>       12040000
<<61>>  HALTINTERRUPT,1,                    <<VERIFY FAILED>>           12045000
                                                                        12050000
<<READ IN BOOTX AND JUMP TO IT>>                                        12055000
<<63>>  WRITECONTROL,6,0,%0,BSEEK2LOC,      <<SEEK TO BOOTSTRAP SECTOR>>12060000
<<68>>  WAIT,0,                                                         12065000
<<70>>  WRITECONTROL,6,0,%0,BADDR2LOC,      <<ISSUE ADDRESS REC>>       12070000
<<75>>  WAIT,0,                                                         12075000
<<77>>  WRITECONTROL,2,0,%0,BRLOC,          <<ISSUE READ COMMAND>>      12080000
<<82>>  READATA,BOOTXLENBT,0,%0,BOOTXMEMLOC,<<READ IN BOOTX>>           12085000
<<87>>  WAIT,0,                                                         12090000
<<89>>  JUMP,BTARGETLOC,                    <<EXECUTE BOOTX CHAN PROG>> 12095000
                                                                        12100000
<<NULL AREA>>                                                           12105000
<<91-110>> 20(0),                                                       12110000
                                                                        12115000
<<COMMANDS AREA>>                                                       12120000
<<111>> VERIFY,BOOTXLEN',                   <<VERIFY WRITE>>            12125000
<<113>> WRITECMD,                                                       12130000
<<114>> READCMD,                                                        12135000
<<115>> 0,                                  <<SET FILE MASK>>           12140000
<<116>> SEEK,0,0,                           <<SEEK TO WRITE AREA>>      12145000
<<119>> ADDRESSREC,0,0,                     <<ADDR RECRD TO WRITE AREA>>12150000
<<122>> SEEK,0,0,                           <<SEEK TO READ AREA>>       12155000
<<125>> ADDRESSREC,0,0;                     <<ADDR RECORD TO READ AREA>>12160000
                                                                        12165000
                                                                        12170000
ARRAY WRITETEMPLATE(0:1)=PB:=                                           12175000
<<0>>   WRITECONTROL,6,0,%0,0,              <<SEEK>>                    12180000
<<5>>   WAIT,0,                                                         12185000
<<7>>   WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          12190000
<<12>>  WAIT,0,                                                         12195000
<<14>>  WRITECONTROL,2,0,%0,WRITECMDLOC,    <<WRITE DATA COMMAND>>      12200000
<<19>>  WRITEDATA,0,0,%0,0,                 <<WRITE OUT MEMORY CHUNK>>  12205000
<<24>>  WAIT,0,                                                         12210000
<<26>>  WRITECONTROL,6,0,%0,0,              <<SEEK TO OVERLAY AREA>>    12215000
<<31>>  WAIT,0,                                                         12220000
<<33>>  WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          12225000
<<38>>  WAIT,0,                                                         12230000
<<40>>  WRITECONTROL,4,0,%0,0,              <<ISSUE VERIFY COMMAND>>    12235000
<<45>>  WAIT,0,                                                         12240000
<<47>>  DSJ1,-1,GOODNEWS,BADNEWS,           <<QUIT IF BAD WRITE>>       12245000
<<51>>  HALTINTERRUPT,2;                    <<VERIFY FAILED>>           12250000
                                                                        12255000
ARRAY READTEMPLATE(0:1)=PB:=                                            12260000
<<0>>   WRITECONTROL,6,0,%0,0,              <<SEEK>>                    12265000
<<5>>   WAIT,0,                                                         12270000
<<7>>   WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          12275000
<<12>>  WAIT,0,                                                         12280000
<<14>>  WRITECONTROL,2,0,%0,READCMDLOC,     <<READ DATA COMMAND>>       12285000
<<19>>  READATA,0,0,%0,0,                   <<READ IN SDF CHUNK>>       12290000
<<24>>  WAIT,0,                                                         12295000
<<26>>  WRITECONTROL,2,0,0,0,               <<WRITE STATUS COMMAND>>    12300000
<<31>>  READCONTROL,4,0,0,0,                <<GET STATUS>>              12305000
<<36>>  WAIT,0;                                                         12310000
<<******************************************>>                 <<03608>>12315000
<<                                          >>                 <<03608>>12320000
<<   CS80 DEFINITIONS EQUATES AND OFFSETS   >>                 <<03608>>12325000
<<                                          >>                 <<03608>>12330000
<<******************************************>>                 <<03608>>12335000
                                                               <<03608>>12340000
EQUATE                                                         <<03608>>12345000
                                                               <<03608>>12350000
   << COMMAND DEFINITIONS >>                                   <<03608>>12355000
                                                               <<03608>>12360000
   READ'EXEC'SEC     =  %1416,  << READ W/EXEC MSG SEC >>      <<03608>>12365000
   WRT'EXEC'SEC      =  %2016,  << WRT W/EXEC MSG SEC >>       <<03608>>12370000
                                                               <<03608>>12375000
   CDB'READ          =      0,  << LOCATE AND READ COMMAND >>  <<03608>>12380000
   CDB'WRITE         =     %2,  << LOCATE AND WRITE COMMAND >> <<03608>>12385000
   CDB'VERIFY        =     %4,  << VERIFY COMMAND >>           <<03608>>12390000
                                                               <<03608>>12395000
   CDB'SET'BURST     =    %74,  << SET BURST COMMAND >>        <<03608>>12400000
   CDB'SET'LENGTH    =    %30,  << SET LENGTH COMMAND >>       <<03608>>12405000
   CDB'SET'SNGL'VEC  =    %20,  << SET SNGL VEC ADDR CMD >>    <<03608>>12410000
   CDB'SET'UNIT      =    %40,  << SET UNIT# COMMAND >>        <<03608>>12415000
   CDB'SET'VOL       =   %100,  << SET VOL# COMMAND >>         <<03608>>12420000
                                                               <<03608>>12425000
   << CS80 TEMPLATE LENGTHS >>                                 <<03608>>12430000
                                                               <<03608>>12435000
   WRITE'LENGTH      =     27,  << LENGTH OF WRITE TEMPLATE >> <<03608>>12440000
   READ'LENGTH       =     27,  << LENGTH OF READ TEMPLATE >>  <<03608>>12445000
   VERIFY'LENGTH     =     16,  << LENGTH OF VERIFY TEMPLATE >><<03608>>12450000
   CMDS'LENGTH       =      9,  << LENGTH OF COMMANDS >>       <<03608>>12455000
                                                               <<03608>>12460000
   << CS80 BOOTSTRAP OFFSETS >>                                <<03608>>12465000
                                                               <<03608>>12470000
   BOOT'WRITE        =      3,  << OFFSET TO BOOT WRITE >>     <<03608>>12475000
   BOOT'VERIFY       =      BOOT'WRITE + WRITE'LENGTH,         <<03608>>12480000
   BOOT'READ         =      BOOT'VERIFY + VERIFY'LENGTH,       <<03608>>12485000
                                                               <<03608>>12490000
   BOOT'WRT'CMDS     =      BOOT'READ + READ'LENGTH,           <<03608>>12495000
   BOOT'VER'CMDS     =      BOOT'WRT'CMDS + CMDS'LENGTH,       <<03608>>12500000
   BOOT'READ'CMDS    =      BOOT'VER'CMDS + CMDS'LENGTH,       <<03608>>12505000
                                                               <<03608>>12510000
   << LOCATION OF RELATIVE JUMP TO BOOT EXTENSION >>           <<03608>>12515000
                                                               <<03608>>12520000
   JUMP'BOOTX        =      BOOT'READ + 20;                    <<03608>>12525000
                                                               <<03608>>12530000
   << CS80 BOOTSTRAP EXTENSION OFFSETS >>                      <<03608>>12535000
                                                               <<03608>>12540000
LOGICAL                                                        <<03608>>12545000
                                                               <<03608>>12550000
   OVERLAY'WRITE,          << OFFSET TO OVERLAY WRITE >>       <<03608>>12555000
   OVERLAY'VERIFY,         << OFFSET TO OVERLAY VERIFY >>      <<03608>>12560000
   OVERLAY'WRT'CMDS,       << OVERLAY WRITE CMDS OFFSET >>     <<03608>>12565000
   OVERLAY'VER'CMDS;       << OVERLAY VERIFY CMDS OFFSET >>    <<03608>>12570000
                                                               <<03608>>12575000
DEFINE                                                         <<03608>>12580000
                                                               <<03608>>12585000
   LOWMEMORY'READ    =      OVERLAY'VER'CMDS + CMDS'LENGTH#,   <<03608>>12590000
   SDFCODE'READ      =      LOWMEMORY'READ + READ'LENGTH#,     <<03608>>12595000
   BANK1'WRITE       =      SDFCODE'READ + READ'LENGTH#,       <<03608>>12600000
   END'BOOTX         =      BANK1'WRITE + WRITE'LENGTH#,       <<03608>>12605000
                                                               <<03608>>12610000
   LOWMEM'READ'CMDS  =      (END'BOOTX + 2)#,                  <<03608>>12615000
   SDFCODE'READ'CMDS =      (LOWMEM'READ'CMDS + CMDS'LENGTH)#, <<03608>>12620000
   BANK1'WRT'CMDS    =      (SDFCODE'READ'CMDS + CMDS'LENGTH)#;<<03608>>12625000
                                                               <<03608>>12630000
   << CS80 TEMPLATE OFFSETS >>                                 <<03608>>12635000
                                                               <<03608>>12640000
EQUATE                                                         <<03608>>12645000
                                                               <<03608>>12650000
   WRITE'TEMPLATE    =      0,  << WRITE TEMPLATE OFFSET >>    <<03608>>12655000
   READ'TEMPLATE     =      0,  << READ TEMPLATE OFFSET >>     <<03608>>12660000
   VERIFY'TEMPLATE   =     27,  << VERIFY TEMPLATE OFFSET >>   <<03608>>12665000
                                                               <<03608>>12670000
   << RELATIVE OFFSET FOR JUMP TO BOOTX >>                     <<03608>>12675000
                                                               <<03608>>12680000
   BOOTX'REL'ADDR    = BOOTXMEMLOC-BOOTMEMLOC-JUMP'BOOTX-3;    <<03608>>12685000
                                                               <<03608>>12690000
<<*****************************************>>                  <<03608>>12695000
<<                                         >>                  <<03608>>12700000
<<   CS80 BOOT AND BOOTX CHANNEL PROGRAMS  >>                  <<03608>>12705000
<<                                         >>                  <<03608>>12710000
<<*****************************************>>                  <<03608>>12715000
                                                               <<03608>>12720000
ARRAY CS80'TEMPLATE(0:42)=PB:=                                 <<03608>>12725000
                                                               <<03608>>12730000
        <<------------------------------------------------->>  <<03608>>12735000
        << [DXFER] REAL-TIME & SOME GENERAL PURPOSE CMDS   >>  <<03608>>12740000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>  <<03608>>12745000
        <<------------------------------------------------->>  <<03608>>12750000
                                                               <<03608>>12755000
                                                               <<03608>>12760000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >><<03608>>12765000
<< 1>>                         17,  << CMD BUFFER LENGTH >>    <<03608>>12770000
<< 2>>                          0,  << BURST >>                <<03608>>12775000
<< 3>>                      %2000,  << CMD BUFFER BANK >>      <<03608>>12780000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>  <<03608>>12785000
                                                               <<03608>>12790000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>12795000
<< 6>>                          0,                             <<03608>>12800000
                                                               <<03608>>12805000
<< 7>>  << RD/WRT CTRL >>   %1416,  <<EXECUTION MSG SECONDARY>><<03608>>12810000
<< 8>>                          0,  << #BYTES TO READ/WRITE >> <<03608>>12815000
<< 9>>                          0,  << BURST >>                <<03608>>12820000
<<10>>                          0,  << DATA BANK >>            <<03608>>12825000
<<11>>                          0,  << DATA BUFFER ABS ADDR >> <<03608>>12830000
                                                               <<03608>>12835000
<<12>>  <<JUMP>>                0,  << XFER COMPLETE JUMP >>   <<03608>>12840000
<<13>>                          2,                             <<03608>>12845000
                                                               <<03608>>12850000
<<14>>  <<JUMP>>                0,  << MORE BURSTS TO GO >>    <<03608>>12855000
<<15>>                        -11,                             <<03608>>12860000
                                                               <<03608>>12865000
<<16>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>12870000
<<17>>                          0,                             <<03608>>12875000
                                                               <<03608>>12880000
<<18>>  << QSTAT (DSJ) >>   %2402,  << REPORTING MSG SEC >>    <<03608>>12885000
<<19>>                          0,  << RETURN BYTE >>          <<03608>>12890000
<<20>>                          4,  << NORMAL COMPLETION >>    <<03608>>12895000
<<21>>                          0,  << HARD ERROR >>           <<03608>>12900000
<<22>>                          2,  << POWER ON OCCURRED >>    <<03608>>12905000
                                                               <<03608>>12910000
<<23>>  << INT/HLT1 >>       %600,  << INTERRUPT/HALT >>       <<03608>>12915000
<<24>>                          1,  << CODE OF 1 IN CPVA(1) >> <<03608>>12920000
                                                               <<03608>>12925000
<<25>>  << INT/HLT2 >>       %600,  << INTERRUPT/HALT >>       <<03608>>12930000
<<26>>                          2,  << CODE OF 2 IN CPVA(1) >> <<03608>>12935000
                                                               <<03608>>12940000
                                                               <<03608>>12945000
        <<------------------------------------------------->>  <<03608>>12950000
        << [DIAG] COMPLEMENTARY, GP, DIAG, TRANS COMMANDS  >>  <<03608>>12955000
        << COMMAND/TRANS - REPORTING MESSAGE SECTION       >>  <<03608>>12960000
        <<------------------------------------------------->>  <<03608>>12965000
                                                               <<03608>>12970000
                                                               <<03608>>12975000
<< 0>>  << WRITE CTRL >>    %2005,  << CMD/TRANS MSG SEC >>    <<03608>>12980000
<< 1>>                         17,  << CMD BUFFER LENGTH >>    <<03608>>12985000
<< 2>>                          0,  << BURST >>                <<03608>>12990000
<< 3>>  << SEL DEV CLR >>   %2000,  << CMD BUFFER BANK >>      <<03608>>12995000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>  <<03608>>13000000
                                                               <<03608>>13005000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>13010000
<< 6>>                          0,                             <<03608>>13015000
                                                               <<03608>>13020000
<< 7>>  << QSTAT (DSJ) >>   %2402,  << REPORTING MSG SEC >>    <<03608>>13025000
<< 8>>                          0,  << RETURN BYTE >>          <<03608>>13030000
<< 9>>                          4,  << NORMAL COMPLETION >>    <<03608>>13035000
<<10>>                          0,  << HARD ERROR >>           <<03608>>13040000
<<11>>                          2,  << POWER ON OCCURRED >>    <<03608>>13045000
                                                               <<03608>>13050000
<<12>>  << INT/HLT1 >>       %600,  << INTERRUPT/HALT >>       <<03608>>13055000
<<13>>                          1,  << CODE OF 1 IN CPVA(1) >> <<03608>>13060000
                                                               <<03608>>13065000
<<14>>  << INT/HLT2 >>       %600,  << INTERRUPT/HALT >>       <<03608>>13070000
<<15>>                          2;  << CODE OF 2 IN CPVA(1) >> <<03608>>13075000
                                                               <<03608>>13080000
                                                               <<03608>>13085000
<<* * * CONFIGURATION TABLE * * *>>                                     13090000
                                                                        13095000
EQUATE                                                                  13100000
   CTCONFIGLEN      = 25;                                      <<03011>>13105000
                                                                        13110000
DEFINE                                                         <<03011>>13115000
   CTCHECKSUM       = CONFIG           #,                      <<03011>>13120000
   CTNUMBERBANKS    = CONFIG(1)        #,                      <<03011>>13125000
                                                               <<03011>>13130000
   CTDUMPDEVDESC    = CONFIGD(1)       #,                      <<03011>>13135000
   CTDUMPDEVDRT     = CONFIG(2).(0:9)  #,                      <<03011>>13140000
   CTDUMPDEVSUBTYPE = CONFIG(2).(9:4)  #,                      <<03011>>13145000
   CTDUMPDEVUNIT    = CONFIG(2).(13:3) #,                      <<03011>>13150000
   CTDUMPDEVTYPE    = CONFIG(3)        #,                      <<03011>>13155000
                                                               <<03011>>13160000
   CTLINEPTRDESC    = CONFIGD(2)       #,                      <<03011>>13165000
   CTLINEPTRDRT     = CONFIG(4).(0:9)  #,                      <<03011>>13170000
   CTLINEPTRSUBTYPE = CONFIG(4).(9:4)  #,                      <<03011>>13175000
   CTLINEPTRUNIT    = CONFIG(4).(13:3) #,                      <<03011>>13180000
   CTLINEPTRDEVTYPE = CONFIG(5)        #,                      <<03011>>13185000
                                                               <<03011>>13190000
   CTCONSOLEDESC    = CONFIGD(3)       #,                      <<03011>>13195000
   CTCONSOLEDRT     = CONFIG(6).(0:9)  #,                      <<03011>>13200000
   CTCONSOLESUBTYPE = CONFIG(6).(9:4)  #,                      <<03011>>13205000
   CTCONSOLEUNIT    = CONFIG(6).(13:3) #,                      <<03011>>13210000
   CTCONSOLEDEVTYPE = CONFIG(7)        #,                      <<03011>>13215000
                                                               <<03011>>13220000
   CTCOMMANDESC     = CONFIGD(4)       #,                      <<03011>>13225000
   CTCOMMANDRT      = CONFIG(8).(0:9)  #,                      <<03011>>13230000
   CTCOMMANDSUBTYPE = CONFIG(8).(9:4)  #,                      <<03011>>13235000
   CTCOMMANDUNIT    = CONFIG(8).(13:3) #,                      <<03011>>13240000
   CTCOMMANDEVTYPE  = CONFIG(9)        #,                      <<03011>>13245000
                                                               <<03011>>13250000
   CTSYSDISCDESC    = CONFIGD(5)       #,                      <<03011>>13255000
   CTSYSDISCDRT     = CONFIG(10).(0:9) #,                      <<03011>>13260000
   CTSYSDISCSUBTYPE = CONFIG(10).(9:4) #,                      <<03011>>13265000
   CTSYSDISCUNIT    = CONFIG(10).(13:3)#,                      <<03011>>13270000
   CTSYSDISCDEVTYPE = CONFIG(11)       #,                      <<03011>>13275000
                                                               <<03011>>13280000
   CTDUMPFILEDESC   = CONFIGD(6)       #,                      <<03011>>13285000
   CTDUMPFILEDRT    = CONFIG(12).(0:9) #,                      <<03011>>13290000
   CTDUMPFILESUBTYPE= CONFIG(12).(9:4) #,                      <<03011>>13295000
   CTDUMPFILEUNIT   = CONFIG(12).(13:3)#,                      <<03011>>13300000
   CTDUMPFILEDEVTYPE= CONFIG(13)       #,                      <<03011>>13305000
                                                               <<03011>>13310000
   CTDUMPFILELEN    = CONFIG(14)       #,                      <<03011>>13315000
   CTMODE           = CONFIG(15)       #,                      <<03011>>13320000
   CTCOMMANDFILE    = CONFIGD(8)       #,                      <<03011>>13325000
   CTDUMPFILE       = CONFIGD(9)       #,                      <<03011>>13330000
   CTOVERLAYSECNUM  = CONFIGD(10)      #,                      <<03011>>13335000
   CTCOMMANDLENGTH  = CONFIG(23)       #,                      <<03011>>13340000
   CTSDFINITVERSION = CONFIG(24)       #;                      <<03011>>13345000
$PAGE "SDFINIT PROCEDURE - UTILITY SUBROUTINES"                         13350000
SUBROUTINE MESSAGE(MESSAGENUM);                                         13355000
VALUE MESSAGENUM;                                                       13360000
INTEGER                                                                 13365000
   MESSAGENUM;         <<(0:8) <>0, THEN OFFENDING FILE'S FILE NUMBER>> 13370000
                       <<(8:8) # OF MESSAGE IN THE MESSAGE ARRAY>>      13375000
   BEGIN                                                                13380000
   <<WRITE PREAMBLE>>                                                   13385000
   MOVE BBUF:="* * * DUMP FACILITY ERROR * * *",2;                      13390000
   PRINT(BUF,(@BBUF-S0),0); DEL;                                        13395000
                                                                        13400000
   MESSAGENUM:=MESSAGENUM.(8:8);                                        13405000
                                                                        13410000
   <<LOCATE AND PRINT THE MESSAGE>>                                     13415000
   MSGSTART:=0;                                                         13420000
   WHILE (MESSAGENUM:=MESSAGENUM-1) > 0 DO                              13425000
      <<FLUSH PAST PRECEDING MESSAGES>>                                 13430000
      DO                                                                13435000
         BEGIN                                                          13440000
         <<FIND END OF THE MESSAGE>>                                    13445000
         MSGSTART:=MSGSTART+1;                                          13450000
         MOVE BBUF:=MSGARRAY(MSGSTART),(1);                             13455000
         END UNTIL BBUF="#";                                            13460000
   MSGEND:=MSGSTART:=MSGSTART+1;                                        13465000
   DO                                                                   13470000
      BEGIN                                                             13475000
      <<FIND END OF THE TARGET MESSAGE>>                                13480000
      MSGEND:=MSGEND+1;                                                 13485000
      MOVE BBUF:=MSGARRAY(MSGEND),(1);                                  13490000
      END UNTIL BBUF="#";                                               13495000
   MOVE BBUF:=MSGARRAY(MSGSTART),(MSGEND-MSGSTART);                     13500000
   PRINT(BUF,(MSGSTART-MSGEND),0);                                      13505000
   END  <<MESSAGE>>;                                                    13510000
SUBROUTINE ERROREXIT(ERRNUM);                                           13515000
VALUE ERRNUM;                                                           13520000
INTEGER                                                                 13525000
   ERRNUM;             <<ERROR NUMBER CODE, 0=SUCCESSFUL>>              13530000
   BEGIN                                                                13535000
   IF ERRNUMBER <> SUCCESSFUL THEN                                      13540000
      BEGIN                                                             13545000
      MESSAGE(ERRNUMBER);                                               13550000
      CONDITIONCODE:=CCL;                                               13555000
      END                                                               13560000
   ELSE                                                                 13565000
      CONDITIONCODE:=CCE;                                               13570000
   FOR I:=0 UNTIL NUMFILES-1 DO                                         13575000
      IF FILEARRAY(I) <> 0 THEN FCLOSE(FILEARRAY(I),SAVE,0);            13580000
   ASSEMBLE(EXIT 1);                                                    13585000
   END  <<ERROREXIT>>;                                                  13590000
SUBROUTINE DISCIO(DESTDEV,FUNCTION,TARGET,TARGETLEN,DISCADDR);          13595000
VALUE DESTDEV,FUNCTION,TARGETLEN,DISCADDR;                              13600000
INTEGER                                                                 13605000
   DESTDEV,            <<TARGET LOGICAL DEVICE>>                        13610000
   FUNCTION,           <<ATTACHIO FUNCTION CODE>>                       13615000
   TARGETLEN;          <<ATTACHIO COUNT>>                               13620000
ARRAY                                                                   13625000
   TARGET;             <<ADDRESS OF DATA BUFFER>>                       13630000
DOUBLE                                                                  13635000
   DISCADDR;           <<LOGICAL SECTOR ADDRESS>>                       13640000
   BEGIN                                                                13645000
   <<READ/WRITE TARGET AREA OUT TO THE TARGET DISC AND CHECK            13650000
     FOR I/O ERRORS.                                                    13655000
   >>                                                                   13660000
   IOSTATUS:=P'ATTACHIO(DESTDEV,QMISC,STACKDST,@TARGET,        <<*7530>>13665000
      FUNCTION,TARGETLEN,S2,S1,BLOCKED);                       <<*7530>>13670000
   IF BADIO THEN                                                        13675000
      BEGIN  <<REPORT THE ERROR>>                                       13680000
      MOVE BBUF:="* * * DUMP FACILITY ERROR * * *",2;                   13685000
      PRINT(BUF,(@BBUF-S0),0); DEL;                                     13690000
      MOVE BBUF:="ERROR ACCESSING LOG DEV=     STATUS=%XXXXXX",2;       13695000
      ASCII(S7,-10,BBUF(24));                                           13700000
      ASCII(IOSTAT0,8,BBUF(37));                                        13705000
      PRINT(BUF,(@BBUF-S0),0); DEL;                                     13710000
      ERROREXIT(0);                                                     13715000
      END;                                                              13720000
   END  <<DISCIO>>;                                                     13725000
SUBROUTINE EXTRACTFILEADDR(LABELADDR,LDEV,FILEADDR);                    13730000
VALUE LABELADDR;                                                        13735000
DOUBLE                                                                  13740000
   LABELADDR,          <<LABEL DISC SECTOR ADDR/LOG DEVICE>>            13745000
   FILEADDR;           <<FILE DISC SECTOR ADDR>>                        13750000
INTEGER                                                                 13755000
   LDEV;               <<LOGICAL DEVICE CONTAINED IN LABEL ADDR>>       13760000
   BEGIN                                                                13765000
   <<EXTRACT EXTENT'S DISC ADDR FROM FILE LABEL>>                       13770000
   LDEV:=S4.(0:8);                                                      13775000
   S4:=S4.(8:8);                                                        13780000
   DISCIO(LDEV,READ,BUF,LABELEN,LABELADDR);                             13785000
   FLABEXTENT0:=FLABEXTENT0.(8:8);                                      13790000
   FILEADDR:=FLABFIRSTEXTENT+DOUBLE(FLABSECTOFFSET);                    13795000
   END  <<EXTRACTFILEADDR>>;                                            13800000
DOUBLE SUBROUTINE CONVERTDISCADDR(TYPE,SUBTYPE,DISCADDR);               13805000
VALUE TYPE,SUBTYPE,DISCADDR;                                            13810000
INTEGER                                                                 13815000
   TYPE,               <<DISC TYPE>>                                    13820000
   SUBTYPE;            <<DISC SUB TYPE>>                                13825000
DOUBLE                                                                  13830000
   DISCADDR;           <<LOGICAL SECTOR NUMBER>>                        13835000
   BEGIN                                                                13840000
   XREG:=SUBTYPE;                                                       13845000
   IF TYPE=T7902 THEN                                                   13850000
      BEGIN  <<FLEXIBLE DISC>>                                          13855000
      TOS:=DISCADDR;                                                    13860000
      TOS:=SECYLINDER7902(XREG);                                        13865000
      ASSEMBLE(LDIV);                                                   13870000
      TOS:=SECTRACK7902(XREG);                                          13875000
      ASSEMBLE(DIV,XCH);                                                13880000
      TOS:=TOS&LSL(8);  <<HEAD/SECTOR CALCULATION>>                     13885000
      END                                                               13890000
   ELSE                                                                 13895000
      BEGIN  <<13037 CONTROLLER DISC>>                                  13900000
      TOS:=DISCADDR;                                                    13905000
      TOS:=SECYLINDER(XREG);                                            13910000
      ASSEMBLE(LDIV);                                                   13915000
      TOS:=SECTRACK(XREG);                                              13920000
      ASSEMBLE(DIV,XCH);                                                13925000
      TOS:=TOS&LSL(8);  <<HEAD/SECTOR CALCULATION>>                     13930000
      TOS:=TOS+HEADBASE(XREG);                                 <<00497>>13935000
      END;                                                              13940000
   TOS:=TOS+TOS;                                                        13945000
   DS8:=TOS;                                                            13950000
   END  <<CONVERTDISCADDR>>;                                            13955000
$PAGE "SDFINIT PROCEDURE - SUBROUTINES CALLED BY SUBROUTINES"           13960000
DOUBLE SUBROUTINE LOCATEDISCADDR(DEVTIPE,STARTSEC,LEN);                 13965000
VALUE DEVTIPE,STARTSEC,LEN;                                             13970000
INTEGER                                                                 13975000
   DEVTIPE;            <<SDF DISC TYPE AND SUBTYPE>>                    13980000
DOUBLE                                                                  13985000
   STARTSEC,           <<DISC ADDR OF 1ST POSSIBLE STARTING             13990000
                         SECTOR FOR THE DISCADDR>>                      13995000
   LEN;                <<LENGTH OF DISC AREA>>                          14000000
   BEGIN                                                                14005000
   <<LOCATES THE POSTION OF A DISC AREA IN THE SDF                      14010000
     FILE SO THAT IT:                                                   14015000
     1. DOES NOT CROSS A "CYLINDER" BOUNDARY (FOR 7905, 7906            14020000
        REMOVABLE PLATTER).                                             14025000
     2. IS AS CLOSE AS POSSIBLE TO STARTSEC (SUBJECT TO CONDITION 1).   14030000
     RETURNS                                                            14035000
        LOCATEDISCADDR   - LOGICAL DISC SECTOR ADDRESS OF DISC AREA     14040000
   >>                                                                   14045000
   IF DTDEVICETYPE = T13037 AND                                         14050000
      (DTSUBTYPE=R7906 OR DTSUBTYPE=F7906 OR DTSUBTYPE=R7905) THEN      14055000
      BEGIN                                                             14060000
      <<DISC IS PHYSICALLY ACCESSED IN CYLINDER MODE, BUT ONLY          14065000
        WANT TO ACCESS ONE PLATTER.                                     14070000
      >>                                                                14075000
      SEC'CYL:=DOUBLE(SECYLINDER(DTSUBTYPE));                           14080000
      SECTORSLEFT:=SEC'CYL-(STARTSEC MOD SEC'CYL);                      14085000
      IF SECTORSLEFT < LEN THEN                                         14090000
         BEGIN                                                          14095000
         <<DISC AREA WOULD STRADDLE A CYLINDER BOUNDARY, ADJUST         14100000
           IT TO THE BEGINNING OF THE NEXT CYLINDER.                    14105000
         >>                                                             14110000
         CYLINDERNUM:=STARTSEC/SEC'CYL;                                 14115000
         LOCATEDISCADDR:=(CYLINDERNUM+1D)*SEC'CYL;                      14120000
         END                                                            14125000
      ELSE                                                              14130000
         LOCATEDISCADDR:=STARTSEC;                                      14135000
      END                                                               14140000
   ELSE                                                                 14145000
      LOCATEDISCADDR:=STARTSEC;                                         14150000
   END  <<LOCATEDISCADDR>>;                                             14155000
DOUBLE SUBROUTINE GETNEXTCYLINDER(DEVTIPE,DISCADDR,CURRENTCYLSIZE);     14160000
VALUE DEVTIPE;                                                          14165000
INTEGER                                                                 14170000
   DEVTIPE,            <<SDF DISC TYPE AND SUBTYPE>>                    14175000
   CURRENTCYLSIZE;     <<NUMBER OF WORDS REMAINING IN THE OLD CYLINDER>>14180000
DOUBLE                                                                  14185000
   DISCADDR;           <<DISC ADDRESS OF THE CURRENT CYLINDER>>         14190000
   BEGIN                                                                14195000
   <<ADVANCES THE DISC ADDRESS TO THE BEGINNING OF THE NEXT CYLINDER.   14200000
     THE DISC ADDRESS IS RETURNED AS THE VALUE OF THE SUBROUTINE.       14205000
     CURRENTCYLSIZE REFLECTS THE NUMBER OF WORDS LEFT IN THE OLD        14210000
     CYLINDER.                                                          14215000
   >>                                                                   14220000
   IF DTDEVICETYPE = T13037 AND                                         14225000
      (DTSUBTYPE=R7905 OR DTSUBTYPE=F7906 OR DTSUBTYPE=R7906) THEN      14230000
      BEGIN                                                             14235000
      <<DISC ACCESSED IN CYLINDER MODE BUT WANT TO WRITE TO ONLY        14240000
        ONE PLATTER.                                                    14245000
      >>                                                                14250000
      CURRENTCYLSIZE:=SECTORSIZE*(SECYLINDER(DTSUBTYPE)                 14255000
                           -(DISCADDR MODD SECYLINDER(DTSUBTYPE)));     14260000
      GETNEXTCYLINDER:=                                                 14265000
         DISCADDR+DOUBLE(CURRENTCYLSIZE/SECTORSIZE);           <<00497>>14270000
      END                                                               14275000
   ELSE                                                                 14280000
      BEGIN                                                             14285000
      <<BENIGN DISC>>                                                   14290000
      CURRENTCYLSIZE:=MAXCHANNELEN;                                     14295000
      GETNEXTCYLINDER:=DISCADDR+NEXTCYLMAGICNUM;                        14300000
      END;                                                              14305000
   END  <<GETNEXTCYLINDER>>;                                            14310000
SUBROUTINE CONFIGUREDISCADDR(TYPE,SUBTYPE,DISCADDR,CHANCOMMAND);        14315000
VALUE TYPE,SUBTYPE,DISCADDR;                                            14320000
INTEGER                                                                 14325000
   TYPE,               <<DISC TYPE>>                                    14330000
   SUBTYPE;            <<DISC SUB TYPE>>                                14335000
DOUBLE                                                                  14340000
   DISCADDR;           <<LOGICAL SECTOR NUMBER>>                        14345000
ARRAY                                                                   14350000
   CHANCOMMAND;        <<START OF SEEK, ADDRESS RECORD COMMAND SEQ>>    14355000
   BEGIN                                                                14360000
   <<CONVERTS THE DISC ADDRESS TO THE "CYLINDER, HEAD, SECTOR"          14365000
     FORMAT REQUIRED BY THE DISC CONTROLLER.  THIS CONTROLLER FORMAT    14370000
     IS STUFFED INTO BOTH THE SEEK AND THE ADDRESS RECORD COMMANDS.     14375000
   >>                                                                   14380000
   @CMDPTR:=@CHANCOMMAND;                                               14385000
   TOS:=CONVERTDISCADDR(TYPE,SUBTYPE,DISCADDR);                         14390000
   CMDSEEKHEADSECTOR:=CMDADDRHEADSECTOR:=TOS;                           14395000
   CMDSEEKCYLINDER:=CMDADDRCYLINDER:=TOS;                               14400000
   CMDSEEKLOC:=SEEK;                                                    14405000
   CMDADDRECORDLOC:=IF TYPE=T7902 THEN SEEK ELSE ADDRESSREC;            14410000
   END  <<CONFIGUREDISCADDR>>;                                          14415000
INTEGER SUBROUTINE CALCULATECHECKSUM(TARGET,TARGETLEN,OLDCHECKSUM);     14420000
VALUE TARGET,TARGETLEN,OLDCHECKSUM;                                     14425000
POINTER                                                                 14430000
   TARGET;             <<ADDRESS OF DATA TO BE CHECKSUMED>>             14435000
INTEGER                                                                 14440000
   TARGETLEN;          <<NUMBER OF WORDS IN DATA AREA>>                 14445000
LOGICAL                                                                 14450000
   OLDCHECKSUM;        <<CURRENT VALUE OF CHECKSUM>>                    14455000
   BEGIN                                                                14460000
   <<USING THE VALUE OF OLDCHECKSUM AS A BASE, THE CHECKSUM OF          14465000
     TARGET IS COMPUTED AND RETURNED AS THE VALUE OF THE SUBROUTINE     14470000
   >>                                                                   14475000
   FOR XREG:=0 UNTIL TARGETLEN-1 DO                                     14480000
      OLDCHECKSUM:=OLDCHECKSUM+TARGET(XREG);                            14485000
   CALCULATECHECKSUM:=OLDCHECKSUM;                                      14490000
   END  <<CALCULATECHECKSUM>>;                                          14495000
SUBROUTINE CONFIGUREDEVICE(LDEV,DESC);                                  14500000
VALUE LDEV;                                                             14505000
INTEGER                                                                 14510000
   LDEV;             <<LOGICAL DEVICE NUMBER>>                          14515000
DOUBLE                                                                  14520000
   DESC;             <<RESULTANT CONFIGURED WORD>>                      14525000
   BEGIN                                                                14530000
COMMENT                                                        <<03011>>14535000
  USING VARIOUS SYSTEM TABLES, PLACE THE FOLLOWING             <<03011>>14540000
  INFORMATION INTO FIELDS OF DESC:                             <<03011>>14545000
     WORD0.(0:9)  - DRT NUMBER                                 <<03011>>14550000
     WORD0.(9:4)  - SUBTYPE                                    <<03011>>14555000
     WORD0.(13:3) - UNIT                                       <<03011>>14560000
     WORD1.(10:6) - TYPE                                                14565000
ENDCOMMENT;                                                    <<03011>>14570000
   MOVE DEVICE:="    ";                                                 14575000
   ASCII(LDEV,10,DEVICE);                                               14580000
   IF GETDEVINFO(DEVICE,DEVINFO) = NOERRORS THEN                        14585000
      BEGIN                                                             14590000
      TOS:=@DESC;                                                       14595000
      SP0:=ABS(SYSDBLOC+DEVINFO(4)+DUNIT).(12:4);<<DIT UNIT>>  <<06883>>14600000
      XREG := SYSDBLOC+DEVINFO(4)+DILTP; << POINT TO ILT PTR >><<06883>>14605000
      IF CPUTYPE=ICF25 OR CPUTYPE=ICF44 OR CPUTYPE=ICF55       <<01573>>14610000
        OR CPUTYPE=MM                                          <<M8067>>14615000
      THEN   <<DRT FROM ILT>>                                  <<01573>>14620000
         SP0.(0:9):=ABSOLUTE(ABSOLUTE(XREG)+SYSDBLOC+7)        <<06883>>14625000
      ELSE << XREG EXPECTED TO POINT TO ILT PTR IN DIT >>      <<06883>>14630000
         SP0.(0:9):=ABSOLUTE(ABSOLUTE(XREG)+SYSDBLOC);         <<06883>>14635000
      SP0.(9:4):=DEVINFO(3).(12:4);  <<SUBTYPE FROM LPDT>>     <<03011>>14640000
      TOS:=@LDTDEVICE;                                                  14645000
      TOS:=LDTDST;                                                      14650000
      TOS:=S5*LDTSIZE+LDTDEVTIPELOC;                                    14655000
      TOS:=1;                                                           14660000
      ASSEMBLE(MFDS);                                                   14665000
      SP0(1):=LDTDEVICE.(10:6);    <<TYPE FROM LDT>>                    14670000
      IF SP0(1).(10:6) = TYPE7902 THEN                                  14675000
         BEGIN  <<FLEXIBLE DISC, GET SUBTYPE AS F(DISC STATUS)>>        14680000
         IOSTATUS:=P'ATTACHIO(S3,QMISC,STACKDST,@STATBUF,      <<*7530>>14685000
            GETSTATUS,4,0,0,BLOCKED);                          <<*7530>>14690000
         IF BADIO THEN                                                  14695000
            BEGIN  <<UNABLE TO ACCESS THE DISC>>                        14700000
            DEL;                                                        14705000
            DESC:=0D;                                                   14710000
            RETURN;                                                     14715000
            END;                                                        14720000
         SP0.(9:4):=FLEXSUBTYPE(STATBUF(1).(3:4));             <<03011>>14725000
         END;                                                           14730000
      DEL;                                                              14735000
      END;                                                              14740000
   END  <<CONFIGUREDEVICE>>;                                            14745000
$PAGE "SDFINIT PROCEDURE - SUBROUTINES CALLED BY MAINLINE"              14750000
SUBROUTINE OPENSDFILE(FILENUM,DEVTIPE,LABELADDR);                       14755000
INTEGER                                                                 14760000
   FILENUM,            <<SDF FILE NUMBER>>                              14765000
   DEVTIPE;            <<SDF DEVICE TYPE AND SUBTYPE>>                  14770000
DOUBLE                                                                  14775000
   LABELADDR;        <<DISC ADDR OF SDF'S LABEL>>                       14780000
   BEGIN                                                                14785000
   <<OPENS, CHECKS, AND PROCESSES THE SDF MEMORY IMAGE FILE             14790000
   >>                                                                   14795000
   <<OPEN SDF FILE AND CHECK ITS VALIDITY>>                             14800000
   MOVE DESIG:=SDFDESIG,(SDFDESIGLEN);                                  14805000
   FILENUM:=FOPEN(DESIG,OLDSYSFILE,READWRITE);                          14810000
   IF <> THEN ERROREXIT(UGLYSDFILE);                                    14815000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>14820000
   FGETINFO(FILENUM,,FOPTIONS,,RECSIZE,                        <<03608>>14825000
              DEVTIPE,LDNFORGETDEVINFO,HDADDR,                 <<03608>>14830000
      FILECODE,,NUMREC,,,,,,NUMEXTENT,,,LABELADDR);                     14835000
   LDNALPHA(ASCII(LDNFORGETDEVINFO,10,LDNALPHA)) := %40;       <<03608>>14840000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>14845000
   DTDEVICETYPE := DEVINFOTYPE;                                <<03608>>14850000
   IF (FOPTIONS LAND FOPTIONSMASK)<>PROPERFOPTIONS THEN                 14855000
      ERROREXIT(UGLYSDFOPTIONS)                                         14860000
   ELSE IF (RECSIZE<>ONESECTOR) THEN ERROREXIT(UGLYSDFRECSIZE) <<03011>>14865000
   ELSE IF (FILECODE<>PROPERFILECODE) THEN ERROREXIT(UGLYSDFILECODE)    14870000
   ELSE IF NUMREC <> SDFTOTALNUMRECS THEN                      <<03011>>14875000
      ERROREXIT(UGLYSDFNUMRECS)                                         14880000
   ELSE IF NUMEXTENT<>PROPERNUMEXTENT THEN ERROREXIT(UGLYSDFNUMEXTENT); 14885000
   END  <<OPENSDFILE>>;                                                 14890000
SUBROUTINE ERASEBACKUP;                                                 14895000
   BEGIN                                                                14900000
   <<ERASE SECTOR 3 OF THE BACKUP DISC>>                                14905000
   MOVE DESIG:=BACKUPDESIG,(BACKUPDESIGLEN);                            14910000
   FN:=FOPEN(DESIG,,READWRITE);                                         14915000
   IF <> THEN ERROREXIT(UGLYBACKUPFILE);                                14920000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>14925000
   FGETINFO(FN,,,,,DEVICETYPE,LOGDEVICE);                               14930000
   LDNALPHA(ASCII(LOGDEVICE,10,LDNALPHA)) := %40;              <<03608>>14935000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>14940000
   IF DEVINFOTYPE = HP9140 THEN DEVICETYPE.(8:8):=DEVINFOTYPE; <<03608>>14945000
   IF DEVICETYPE.(8:8) <> SERIALDISC AND                       <<03608>>14950000
      DEVICETYPE <> HP9140 THEN ERROREXIT(BACKUPNOTSERIAL);    <<03608>>14955000
   SECTORSIZ := IF DEVICETYPE = HP9140 THEN HP9140'SECTOR      <<03608>>14960000
               ELSE SECTORSIZE;                                <<03608>>14965000
   BUF :=0;                                                    <<03608>>14970000
   MOVE BUF(1) := BUF,(SECTORSIZ - 1);                         <<03608>>14975000
   DISCIO(LOGDEVICE,WRITE,BUF,SECTORSIZ,BOOTDISCADDR)          <<03608>>14980000
   END <<ERASEBACKUP>>;                                                 14985000
                                                                        14990000
                                                                        14995000
SUBROUTINE GENERATEBACKUPSDF(FILENUM,LDEV,DEVTIPE,FILEADDR);   <<03011>>15000000
INTEGER                                                                 15005000
   FILENUM,          <<BACKUP FILE NUMBER>>                             15010000
   LDEV,             <<LOGICAL DEVICE NUMBER>>                          15015000
   DEVTIPE;          <<DEVICE TYPE>>                                    15020000
DOUBLE                                                                  15025000
   FILEADDR;        <<DISC SECTOR ADDR OF SDF>>                <<03011>>15030000
   BEGIN                                                                15035000
   <<1. OPENS THE SERIAL DISC DEVICE.                                   15040000
     2. COPIES THE SDF IMAGE TO IT.                                     15045000
     3. RETURNS INFORMATION ABOUT THE FILE.                             15050000
   >>                                                                   15055000
   MOVE DESIG:=BACKUPDESIG,(BACKUPDESIGLEN);                            15060000
   FILENUM:=FOPEN(DESIG,,NOBUF'READWRITE,ONESECTOR);           <<03011>>15065000
   IF <> THEN ERROREXIT(UGLYBACKUPFILE);                                15070000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>15075000
   FGETINFO(FILENUM,,,,,DEVTIPE,LDEV);                                  15080000
   LDNALPHA(ASCII(LDEV,10,LDNALPHA)) := %40;                   <<03608>>15085000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>15090000
   IF DEVINFOTYPE = HP9140 THEN DTDEVICETYPE := DEVINFOTYPE;   <<03608>>15095000
   IF DTDEVICETYPE <> SERIALDISC AND                           <<03608>>15100000
      DEVTIPE <> HP9140 THEN ERROREXIT(BACKUPNOTSERIAL);       <<03608>>15105000
   CONFIGUREDEVICE(LDEV,DESC);                                          15110000
   DTSUBTYPE:=DSUBTYPE;                                                 15115000
   DTDEVICETYPE:=DDEVICETYPE;                                           15120000
                                                               <<03011>>15125000
   <<ALLOCATE SPACE FOR BOOTX PROGRAM>>                        <<03011>>15130000
   <<CONTIGUOUS WRITE WILL ALLOW US TO RETRIEVE START>>        <<03011>>15135000
   <<ADDRESS FROM GAP TABLE>>                                  <<03011>>15140000
   INDEX := 0D;                                                <<03011>>15145000
   WHILE (INDEX:=INDEX+1D) <= BOOTXLEN DO                      <<03011>>15150000
     BEGIN                                                     <<03011>>15155000
       FWRITE(FILENUM,BUF,ONESECTOR,                           <<03011>>15160000
        IF INDEX = 1D THEN CONTIGUOUS ELSE 0);                 <<03011>>15165000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15170000
     END;                                                      <<03011>>15175000
                                                               <<03011>>15180000
   <<ALLOCATE SPACE FOR BOOTXSAVE AREA>>                       <<03011>>15185000
   INDEX:= 0D;                                                 <<03011>>15190000
   WHILE (INDEX:=INDEX+1D) <= BOOTXSAVELEN DO                  <<03011>>15195000
     BEGIN                                                     <<03011>>15200000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15205000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15210000
     END;                                                      <<03011>>15215000
                                                               <<03011>>15220000
   <<ALLOCATE SPACE FOR "SLOP" - WASTED SECTORS TO INSURE>>    <<03011>>15225000
   <<THAT BOOTX AND BOOTXSAVE AREAS DO NOT CROSS "CYLINDER">>  <<03011>>15230000
   <<BOUNDARIES FOR 7905/7906 DISCS>>                          <<03011>>15235000
   SLOPLENGTH := IF DEVTIPE = HP9140 THEN HP9140'SLOPLEN       <<03608>>15240000
                 ELSE SLOPLEN;                                 <<03608>>15245000
                                                               <<03608>>15250000
   << ADDED TO INSURE AREAS FALL ON HP9140 BLOCK BOUNDRIES >>  <<03608>>15255000
   INDEX:= 0D;                                                 <<03011>>15260000
   WHILE (INDEX := INDEX +1D) <= SLOPLENGTH DO                 <<03608>>15265000
     BEGIN                                                     <<03011>>15270000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15275000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15280000
     END;                                                      <<03011>>15285000
                                                               <<03011>>15290000
   <<ALLOCATE SPACE FOR SDFMAP AREA>>                          <<03011>>15295000
   SDFMAPLENGTH := IF DEVTIPE = HP9140 THEN BIGSDFMAPLEN       <<03608>>15300000
                   ELSE SDFMAPLEN;                             <<03608>>15305000
   INDEX:= 0D;                                                 <<03011>>15310000
   WHILE (INDEX:=INDEX+1D) <= SDFMAPLENGTH DO                  <<03608>>15315000
     BEGIN                                                     <<03011>>15320000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15325000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15330000
     END;                                                      <<03011>>15335000
                                                               <<03011>>15340000
   <<ALLOCATE SPACE FOR OVERLAY AREA>>                         <<03011>>15345000
   INDEX := 0D;                                                <<03011>>15350000
   WHILE (INDEX:=INDEX+1D) <= OVERLAYAREALEN DO                <<03011>>15355000
     BEGIN                                                     <<03011>>15360000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15365000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15370000
     END;                                                      <<03011>>15375000
                                                               <<03011>>15380000
   <<ALLOCATE SPACE FOR BANK-1 SAVE AREA>>                     <<03011>>15385000
   INDEX := 0D;                                                <<03011>>15390000
   WHILE (INDEX:=INDEX+1D) <= BANK1SAVELEN DO                  <<03011>>15395000
     BEGIN                                                     <<03011>>15400000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15405000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15410000
     END;                                                      <<03011>>15415000
                                                               <<03011>>15420000
   <<COPY SDF CODE TO BACKUP FILE>>                            <<03011>>15425000
   FOR SECTOR'COUNT := 1 UNTIL CODEAREALEN' DO                 <<03608>>15430000
     BEGIN                                                     <<03011>>15435000
       IF SECTOR'COUNT = INTEGER(HIMEMORYSECTORLOC) AND        <<03608>>15440000
          DEVTIPE = HP9140 THEN                                <<03608>>15445000
          BEGIN   << WRITE 128 WORDS TO ALIGN HP9140 SECTOR >> <<03608>>15450000
             BUF(0) := 0;  << BOUNDARY >>                      <<03608>>15455000
             MOVE BUF(1) := BUF,(ONESECTOR-1);                 <<03608>>15460000
             FWRITE(FILENUM,BUF,ONESECTOR,0);                  <<03608>>15465000
             IF <> THEN ERROREXIT(BACKUPFILERR);               <<03608>>15470000
          END;                                                 <<03608>>15475000
       FREADDIR(SDFILENUM,BUF,ONESECTOR,                       <<03011>>15480000
             DOUBLE(SECTOR'COUNT) + SDFCODELOC - 1D);          <<03608>>15485000
       IF <> THEN ERROREXIT(SDFILERR);                         <<03011>>15490000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>15495000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>15500000
     END;                                                      <<03011>>15505000
                                                               <<03011>>15510000
   FCONTROL(FILENUM,ENDOFILE,NULL);                                     15515000
                                                                        15520000
   <<GET START ADDRESS FROM THE GAP TABLE TO RETURN>>          <<03011>>15525000
   IF FINDSDISCGAP(LDEV,1,FILEADDR) <> SUCCESSFUL THEN                  15530000
      ERROREXIT(BACKUPFILERR);                                          15535000
   END  <<GENERATEBACKUPSDF>>;                                          15540000
SUBROUTINE INITDISCADDR (DEVTIPE, SDFILEADDR, BOOTXADDR,       <<03011>>15545000
                    BOOTXSAVEADDR,SDFMAPADDR,OVERLAYADDR,      <<03011>>15550000
                    BANK1SAVEADDR,SDFCODEADDR);                <<03011>>15555000
                                                               <<03011>>15560000
VALUE DEVTIPE,SDFILEADDR;                                      <<03011>>15565000
INTEGER                                                        <<03011>>15570000
    DEVTIPE;                <<SDF DISC TYPE AND SUBTYPE>>      <<03011>>15575000
DOUBLE                                                         <<03011>>15580000
    SDFILEADDR,             <<SDF SECTOR ADDR>>                <<03011>>15585000
    BOOTXADDR,              <<BOOTX SECTOR ADDR>>              <<03011>>15590000
    BOOTXSAVEADDR,          <<SECTOR ADDR FOR SAVE OF MEM>>    <<03011>>15595000
                            <<FOR BOOTX READ>>                 <<03011>>15600000
    SDFMAPADDR ,            <<SECTOR ADDR OF SDF MAP AREA>>    <<03011>>15605000
    OVERLAYADDR,            <<SECTOR ADDR OF OVERLAY AREA>>    <<03011>>15610000
    BANK1SAVEADDR,          <<SECTOR ADDR FOR SAVE OF BANK1>>  <<03011>>15615000
                            <<DRT TABLE- ICF55 ONLY>>          <<03011>>15620000
    SDFCODEADDR;            <<SECTOR ADDR OF START OF CODE>>   <<03011>>15625000
                                                               <<03011>>15630000
    <<BASED ON THE START ADDRESS, "SDFILEADDR", THIS >>        <<03011>>15635000
    <<ROUTINE CALCULATES THE DISC ADDRESS OF ALL THE >>        <<03011>>15640000
    <<MAJOR SECTIONS OF THE FILE. SEE DISC FORMAT    >>        <<03011>>15645000
    <<DIAGRAM AT DECLARATIONS AT PROCEDURE HEAD.     >>        <<03011>>15650000
                                                               <<03011>>15655000
BEGIN                                                          <<03011>>15660000
        <<CALCULATION FOR BOOTX AND BOOTXSAVE AREAS. >>        <<03011>>15665000
        <<NOTE: BOTH AREAS MUST NOT CROSS "CYLINDER" >>        <<03011>>15670000
        <<BOUNDARIES (FOR 7905/7906)                 >>        <<03011>>15675000
      << THE HP9140 HAS A SECTOR SIZE OF 512 WORDS.  >>        <<03608>>15680000
      << IF THE DEVICE IS A HP9140 THEN THE OFFSETS  >>        <<03608>>15685000
      << ADDED TO PREVIOUSLY COMPUTED ADDRESSES ARE  >>        <<03608>>15690000
      << DIVIDED BY 4 TO COMPENSATE FOR THE LARGER   >>        <<03608>>15695000
      << SECTOR SIZE OF THE HP9140                   >>        <<03608>>15700000
                                                               <<03608>>15705000
    OFFSETFACTOR := IF DEVTIPE = HP9140 THEN 4D ELSE 1D;       <<03608>>15710000
                                                               <<03608>>15715000
    << SET SLOPLENGTH TO HP9140'SLOPLENGTH TO INSURE THAT >>   <<03608>>15720000
    << ADDRESSES WILL BE AT HP9140 SECTOR BOUNDRYS        >>   <<03608>>15725000
    SLOPLENGTH := IF DEVTIPE = HP9140 THEN HP9140'SLOPLEN      <<03608>>15730000
                  ELSE SLOPLEN;                                <<03608>>15735000
                                                               <<03011>>15740000
    BOOTXADDR := LOCATEDISCADDR(DEVTIPE,SDFILEADDR,BOOTXLEN);  <<03011>>15745000
                                                               <<03011>>15750000
    BOOTXSAVEADDR := LOCATEDISCADDR(DEVTIPE,BOOTXADDR +        <<03011>>15755000
                             BOOTXLEN/OFFSETFACTOR,            <<03608>>15760000
                             BOOTXSAVELEN);                    <<03608>>15765000
                                                               <<03011>>15770000
        <<THE FOLLOWING ADDRESSES ARE FIXED RELATIVE TO >>     <<03011>>15775000
        <<SDFILEADDR START ADDRESS, AND ARE NOT DEPENDENT>>    <<03011>>15780000
        <<ON "CYLINDER" BOUNDARY POSITIONING. "SLOPLEN" >>     <<03011>>15785000
        <<GUARANTEES OVERLAY AREA STARTS PAST WORST CASE>>     <<03011>>15790000
        <<CYLINDER POSITIONING FOR BOOTX/BOOTXSAVE.    >>      <<03011>>15795000
                                                               <<03011>>15800000
    SDFMAPADDR  := SDFILEADDR +  <<START OF FILE>>             <<03011>>15805000
                  (SLOPLENGTH +  <<MAX SLOP FOR CYL BOUND>>    <<03608>>15810000
                   BOOTXLEN +    <<ALLOC FOR BOOTX>>           <<03011>>15815000
                   BOOTXSAVELEN) / <<ALLOC FOR MEM SAVE>>      <<03608>>15820000
                   OFFSETFACTOR;                               <<03608>>15825000
                                                               <<03011>>15830000
    OVERLAYADDR := SDFMAPADDR + SDFMAPLEN;                     <<03011>>15835000
                                                               <<03011>>15840000
    BANK1SAVEADDR := OVERLAYADDR +                             <<03608>>15845000
                     OVERLAYAREALEN / OFFSETFACTOR;            <<03608>>15850000
                                                               <<03011>>15855000
    SDFCODEADDR := BANK1SAVEADDR +                             <<03608>>15860000
                   BANK1SAVELEN / OFFSETFACTOR;                <<03608>>15865000
                                                               <<03608>>15870000
    HIGHMEMADDR := IF DEVTIPE = HP9140                         <<03608>>15875000
                   THEN SDFCODEADDR + HP9140'HIMEMSECL         <<03608>>15880000
                   ELSE SDFCODEADDR + HIMEMORYSECTORL;         <<03608>>15885000
                                                               <<03011>>15890000
END;                                                           <<03011>>15895000
$PAGE                                                          <<03608>>15900000
<<***********************************>>                        <<03608>>15905000
<<***********************************>>                        <<03608>>15910000
<<                                   >>                        <<03608>>15915000
<<             SDFMAP                >>                        <<03608>>15920000
<<                                   >>                        <<03608>>15925000
<<***********************************>>                        <<03608>>15930000
<<***********************************>>                        <<03608>>15935000
                                                               <<03608>>15940000
<<***********************************>>                        <<03608>>15945000
<<                                   >>                        <<03608>>15950000
<<        LOW MEMORY RECORD          >>                        <<03608>>15955000
<<                                   >>                        <<03608>>15960000
<<***********************************>>                        <<03608>>15965000
<<                                   >>                        <<03608>>15970000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>15975000
<<----------------------------------->>                        <<03608>>15980000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>15985000
<<----------------------------------->>                        <<03608>>15990000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03608>>15995000
<<                LOCATION = 0       >>                        <<03608>>16000000
<<----------------------------------->>                        <<03608>>16005000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03608>>16010000
<<              LOCATION   = %174777 >>                        <<03109>>16015000
<<----------------------------------->>                        <<03608>>16020000
<<   STORAGE ADDRESS = OVERLAYADDR   >>                        <<03608>>16025000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>16030000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>16035000
<<----------------------------------->>                        <<03608>>16040000
                                                               <<03608>>16045000
<<***********************************>>                        <<03608>>16050000
<<                                   >>                        <<03608>>16055000
<<        BOOTX AREA RECORD          >>                        <<03608>>16060000
<<                                   >>                        <<03608>>16065000
<<***********************************>>                        <<03608>>16070000
<<                                   >>                        <<03608>>16075000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>16080000
<<----------------------------------->>                        <<03608>>16085000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>16090000
<<----------------------------------->>                        <<03608>>16095000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03608>>16100000
<<                LOCATION = %175000 >>                        <<03109>>16105000
<<----------------------------------->>                        <<03608>>16110000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03608>>16115000
<<              LOCATION   = %176777 >>                        <<03109>>16120000
<<----------------------------------->>                        <<03608>>16125000
<<   STORAGE ADDRESS = BOOTXSAVEADDR >>                        <<03608>>16130000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>16135000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>16140000
<<----------------------------------->>                        <<03608>>16145000
                                                               <<03608>>16150000
<<***********************************>>                        <<03109>>16155000
<<                                   >>                        <<03109>>16160000
<<    BANK 0 FROM BOOTX TO BANK 1    >>                        <<03109>>16165000
<<                                   >>                        <<03109>>16170000
<<***********************************>>                        <<03109>>16175000
<<                                   >>                        <<03109>>16180000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03109>>16185000
<<----------------------------------->>                        <<03109>>16190000
<<   STORAGE TYPE   =   MEMORY       >>                        <<03109>>16195000
<<----------------------------------->>                        <<03109>>16200000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03109>>16205000
<<                LOCATION = %177000 >>                        <<03109>>16210000
<<----------------------------------->>                        <<03109>>16215000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03109>>16220000
<<              LOCATION   = %177777 >>                        <<03109>>16225000
<<----------------------------------->>                        <<03109>>16230000
<<   STORAGE ADDRESS =  BANK 0       >>                        <<03109>>16235000
<<           LOCATION = %177000      >>                        <<03109>>16240000
<<----------------------------------->>                        <<03109>>16245000
                                                               <<03109>>16250000
<<***********************************>>                        <<03608>>16255000
<<                                   >>                        <<03608>>16260000
<<       BANK1 DRT AREA RECORD       >>                        <<03608>>16265000
<<                                   >>                        <<03608>>16270000
<<***********************************>>                        <<03608>>16275000
<<                                   >>                        <<03608>>16280000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>16285000
<<----------------------------------->>                        <<03608>>16290000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>16295000
<<----------------------------------->>                        <<03608>>16300000
<<   SOURCE START ADDRESS  = BANK 1  >>                        <<03608>>16305000
<<                LOCATION = %0      >>                        <<03608>>16310000
<<----------------------------------->>                        <<03608>>16315000
<<   SOURCE END ADDRESS    = BANK 1  >>                        <<03608>>16320000
<<              LOCATION   = %3777   >>                        <<03608>>16325000
<<----------------------------------->>                        <<03608>>16330000
<<   STORAGE ADDRESS = BANK1SAVEADDR >>                        <<03608>>16335000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>16340000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>16345000
<<----------------------------------->>                        <<03608>>16350000
                                                               <<03608>>16355000
<<***********************************>>                        <<03608>>16360000
<<                                   >>                        <<03608>>16365000
<<   RECORD FOR CONFIGURED MEMORY    >>                        <<03608>>16370000
<<       ABOVE BANK1 DRT AREA        >>                        <<03608>>16375000
<<                                   >>                        <<03608>>16380000
<<***********************************>>                        <<03608>>16385000
<<                                   >>                        <<03608>>16390000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>16395000
<<----------------------------------->>                        <<03608>>16400000
<<   STORAGE TYPE   =   MEMORY       >>                        <<03608>>16405000
<<----------------------------------->>                        <<03608>>16410000
<<   SOURCE START ADDRESS  = BANK 1  >>                        <<03608>>16415000
<<                LOCATION = %4000   >>                        <<03608>>16420000
<<----------------------------------->>                        <<03608>>16425000
<<   SOURCE END ADDRESS    = HI BANK >>                        <<03608>>16430000
<<     (HIGHEST CONFIGURED BANK)     >>                        <<03608>>16435000
<<              LOCATION   = %177777 >>                        <<03608>>16440000
<<----------------------------------->>                        <<03608>>16445000
<<   STORAGE ADDRESS =  BANK 1       >>                        <<03608>>16450000
<<           LOCATION = %4000        >>                        <<03608>>16455000
<<----------------------------------->>                        <<03608>>16460000
                                                               <<03608>>16465000
                                                               <<03608>>16470000
<<***********************************>>                        <<03608>>16475000
<<  THERE IS A LIMIT OF 16 RECORDS   >>                        <<03608>>16480000
<<  IN THE SDFMAP.                   >>                        <<03608>>16485000
<<***********************************>>                        <<03608>>16490000
                                                               <<03608>>16495000
                                                               <<03608>>16500000
                                                               <<03608>>16505000
SUBROUTINE CONFIGURE'SDFMAP(SDFMAPADDR);                       <<03011>>16510000
<<====================================>>                       <<03011>>16515000
    VALUE SDFMAPADDR;                                          <<03011>>16520000
    DOUBLE SDFMAPADDR;  <<SDFMAP DISC ADDRESS>>                <<03011>>16525000
BEGIN                                                          <<03011>>16530000
                                                               <<03011>>16535000
<< THIS SUBROUTINE LOADS THE RECORDS FOR THE SDFMAP, AND>>     <<03011>>16540000
<< WRITES THE MAP TO THE RESERVED AREA "SDFMAPADDR" IN  >>     <<03011>>16545000
<<THE SDFLOAD FILE. >>                                         <<03011>>16550000
                                                               <<03011>>16555000
<<DURING THE VARIOUS PHASES OF PERFORMING A DUMP, PORTIONS>>   <<03011>>16560000
<<OF MEMORY (POSSIBLY INTERNAL REGISTERS OF DEVICES), MUST BE>><<03011>>16565000
<<SAVED TO ALLOW THEIR RE-USE DURING THE BOOT,BOOTX,COLD LOAD>><<03011>>16570000
<<TRAP ETC..  THESE AREAS HAVE GROWN IN NUMBER TO THE >>       <<03011>>16575000
<<POINT WHERE IT IS USEFUL TO MAINTAIN A "STORAGE MAP". THIS>> <<03011>>16580000
<<MAP IS BUILT HERE, AND THEN PASSED ALONG FOR USE BY THE  >>  <<03011>>16585000
<<VARIOUS STAGES, AND ULTIMATELY USED TO ALLOW THE MAJOR   >>  <<03011>>16590000
<<RECONSTRUCTION OF MEMORY PRIOR TO PRODUCING THE DUMPTAPE>>   <<03011>>16595000
                                                               <<03011>>16600000
<<EACH RECORD CONTAINS THE RANGE (START/END) AND MEDIA TYPE,>> <<03011>>16605000
<<(FROM MEMORY,DISC, INTERNAL REGISTERS, ETC.) OF AN AREA   >> <<03011>>16610000
<<WHICH IS TO BE STORED, AND ALSO THE START ADDRESS AND MEDIA>><<03011>>16615000
<<TYPE OF THE LOCATION WHERE THE STORAGE IS KEPT. >>           <<03011>>16620000
                                                               <<03011>>16625000
<<FOR EXAMPLE A RECORD MIGHT CONTAIN THE FOLLOWING INFO:    >> <<03011>>16630000
<< MEMORY ADDRESSES  0 THRU 20 ARE STORED ON DISC AT LOGICAL>> <<03011>>16635000
<< SECTOR 16 OF THE DISC>>                                     <<03011>>16640000
                                                               <<03011>>16645000
<< FORMAT OF SDFMAP RECORD >>                                  <<03011>>16650000
                                                               <<03011>>16655000
   <<-------------->>                                          <<03011>>16660000
   <<   SRC TYPE   >>  <<+0 MEDIA OF ORIG AREA TO BE SAVED>>   <<03011>>16665000
   <<   STG TYPE   >>  <<+1 MEDIA ON WHICH STORAGE IS KEPT>>   <<03011>>16670000
   <<-------------->>                                          <<03011>>16675000
   <<   SRC START  >>  <<+2 START ADDRESS OF SRC TO BE SAVED>> <<03011>>16680000
   <<   ADDRESS    >>                                          <<03011>>16685000
   <<-------------->>                                          <<03011>>16690000
   <<   SRC END    >>  <<+4 END ADDRESS OF SOURCE TO BE SAVED>><<03011>>16695000
   <<   ADDRESS    >>                                          <<03011>>16700000
   <<-------------->>                                          <<03011>>16705000
   <<   STORAGE    >>  <<+6 START ADDRESS OF THE STORAGE AREA>><<03011>>16710000
   <<   ADDRESS    >>                                          <<03011>>16715000
   <<-------------->>                                          <<03011>>16720000
                                                               <<03011>>16725000
  <<NOTE: IF MEDIA IS MEMORY, THEN BANK/OFFSET ARE USED>>      <<03011>>16730000
  <<IF MEDIA IS IN THE SDF'FILE, THEN LOGICAL SECTOR NUM>>     <<03011>>16735000
                                                               <<03011>>16740000
                                                               <<03011>>16745000
<<---------- START OF SUBROUTINE ------------->>               <<03011>>16750000
                                                               <<03011>>16755000
  @PTR := @BUF;     <<AIM PTRS AT BUF>>                        <<03011>>16760000
                                                               <<03011>>16765000
  MOVE BUF := 0;                                               <<03011>>16770000
  MOVE BUF(1) := BUF, (127);    <<ZERO OUT THE BUFFER>>        <<03011>>16775000
                                                               <<03011>>16780000
                                                               <<03011>>16785000
  <<LOW MEMORY UP TO BOOTX AREA>>                              <<03011>>16790000
  <<--------------------------->>                              <<03011>>16795000
  <<WILL BE SAVED BY BOOTSTRAP EXTENSION PROGRAM>>             <<03011>>16800000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>16805000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>16810000
  DPTR(DSRC'START):= 0D;            <<FROM BANK-0 ADDR 0 >>    <<03011>>16815000
  PTR(SRC'END'HI) := 0;             <<TO 0-%76777 >>           <<03011>>16820000
  PTR(SRC'END'LO) := BOOTXMEMLOC-1;                            <<03011>>16825000
  DPTR(DSTG)      := OVERLAYADDR;   <<SAVED IN OVERLAYAREA>>   <<03011>>16830000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>16835000
                                                               <<03011>>16840000
  <<BOOTX AREA>>                                               <<03011>>16845000
  <<---------->>                                               <<03011>>16850000
  <<WILL BE SAVED BY BOOTSTRAP PROGRAM>>                       <<03011>>16855000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>16860000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>16865000
  PTR(SRC'START'HI) := 0;                                      <<03011>>16870000
  PTR(SRC'START'LO) := BOOTXMEMLOC; <<FROM 0-%77000>>          <<03011>>16875000
  PTR(SRC'END'HI) := 0;             <<TO 0-%77777 >>           <<03011>>16880000
  PTR(SRC'END'LO) := BOOTXMEMLOC+BOOTXLENWD-1;                 <<03011>>16885000
  DPTR(DSTG)      := BOOTXSAVEADDR; <<SAVED IN BOOTXSAVEAREA>> <<03011>>16890000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>16895000
                                                               <<03011>>16900000
  <<MEMORY FROM END OF BOOTX TO END OF BANK-0>>                <<03011>>16905000
  <<----------------------------------------->>                <<03011>>16910000
  <<REMAINS INTACT IN MEMORY>>                                 <<03011>>16915000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>16920000
  PTR(STGMEDIA)     := MEMORY;                                 <<03011>>16925000
  PTR(SRC'START'HI) := 0;                                      <<03011>>16930000
  PTR(SRC'START'LO) := BOOTXMEMLOC + BOOTXLENWD;               <<03011>>16935000
  PTR(SRC'END'HI) := 0;                                        <<03011>>16940000
  PTR(SRC'END'LO) := %177777;        <<TO END OF BANK-0>>      <<03011>>16945000
  PTR(STG'HI) := 0;                                            <<03011>>16950000
  PTR(STG'LO) := BOOTXMEMLOC + BOOTXLENWD;                     <<03011>>16955000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>16960000
                                                               <<03011>>16965000
  <<BANK1 DRT TABLE AREA (FOR ICF-55) >>                       <<03011>>16970000
  <<---------------------------------->>                       <<03011>>16975000
  <<WILL BE SAVED FOR ALL CPUS BY BOOTX CHAN PROGRAM  >>       <<03011>>16980000
  <<ALTHOUGH IT IS ONLY NECESSARY FOR ICF-55>>                 <<03011>>16985000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>16990000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>16995000
  PTR(SRC'START'HI) := 1;                                      <<03011>>17000000
  PTR(SRC'START'LO) := 0;   <<FROM BANK-1 ADDR 0>>             <<03011>>17005000
  PTR(SRC'END'HI) := 1;                                        <<03011>>17010000
  PTR(SRC'END'LO) := BANK1SAVELENWD -1;                        <<03011>>17015000
  DPTR(DSTG)      := BANK1SAVEADDR; <<SAVE IN BANK1SAVEAREA>>  <<03011>>17020000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>17025000
                                                               <<03011>>17030000
  <<REST OF BANK-1 TO END OF ALL CONFIG MEMORY>>               <<03011>>17035000
  <<-------------------------------------------->>             <<03011>>17040000
  <<REMAINS INTACT IN MEMORY>>                                 <<03011>>17045000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>17050000
  PTR(STGMEDIA)     := MEMORY;                                 <<03011>>17055000
  PTR(SRC'START'HI) := 1;                                      <<03011>>17060000
  PTR(SRC'START'LO) := BANK1SAVELENWD;  <<FROM BNK1 PAST DRTS>><<03011>>17065000
  PTR(SRC'END'HI) := NUMBERBANKS - 1;   <<END OF CONFIG MEM>>  <<03011>>17070000
  PTR(SRC'END'LO) := %177777;                                  <<03011>>17075000
  PTR(STG'HI) := 1;                                            <<03011>>17080000
  PTR(STG'LO) := BANK1SAVELENWD;                               <<03011>>17085000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>17090000
                                                               <<03011>>17095000
  <<WRITE THE MAP OUT TO DISC>>                                <<03011>>17100000
  <<------------------------->>                                <<03011>>17105000
  DISCIO( DESTDEV,WRITE,BUF,SDFMAPLENWD,SDFMAPADDR);           <<03011>>17110000
                                                               <<03011>>17115000
END;  <<OF CONFIGURE'SDFMAP>>                                  <<03011>>17120000
<<---------------------------------------------------->>       <<03608>>17125000
<<                                                    >>       <<03608>>17130000
<<   SET'CMD'BYTES -- SUBROUTINE TO SET UP THE        >>       <<03608>>17135000
<<                    COMMAND DATA BYTES FOR READ,    >>       <<03608>>17140000
<<                    WRITE AND VERIFY OPERATIONS     >>       <<03608>>17145000
<<                                                    >>       <<03608>>17150000
<<---------------------------------------------------->>       <<03608>>17155000
                                                               <<03608>>17160000
      SUBROUTINE SET'CMD'BYTES(CDB'AREA'BYTE,CLDA1,CLDA2,      <<03608>>17165000
                    COUNT,FUNCTION);                           <<03608>>17170000
                                                               <<03608>>17175000
      VALUE CDB'AREA'BYTE,CLDA1,CLDA2,COUNT,FUNCTION;          <<03608>>17180000
      LOGICAL CDB'AREA'BYTE,CLDA1,CLDA2,COUNT;                 <<03608>>17185000
      BYTE FUNCTION;                                           <<03608>>17190000
                                                               <<03608>>17195000
                                                               <<03608>>17200000
       BEGIN                                                   <<03608>>17205000
         BBUF(CDB'AREA'BYTE) := CDB'SET'UNIT;                  <<03608>>17210000
         BBUF(CDB'AREA'BYTE+1) := CDB'SET'VOL;                 <<03608>>17215000
                                                               <<03608>>17220000
         BBUF(CDB'AREA'BYTE+2) := CDB'SET'SNGL'VEC;            <<03608>>17225000
         BBUF(CDB'AREA'BYTE+3) := 0;                           <<03608>>17230000
         BBUF(CDB'AREA'BYTE+4) := 0;                           <<03608>>17235000
         BBUF(CDB'AREA'BYTE+5) := CLDA1.(0:8);                 <<03608>>17240000
         BBUF(CDB'AREA'BYTE+6) := CLDA1.(8:8);                 <<03608>>17245000
         BBUF(CDB'AREA'BYTE+7) := CLDA2.(0:8);                 <<03608>>17250000
         BBUF(CDB'AREA'BYTE+8) := CLDA2.(8:8);                 <<03608>>17255000
                                                               <<03608>>17260000
         BBUF(CDB'AREA'BYTE+9) := CDB'SET'LENGTH;              <<03608>>17265000
         BBUF(CDB'AREA'BYTE+10) := 0;                          <<03608>>17270000
         BBUF(CDB'AREA'BYTE+11) := 0;                          <<03608>>17275000
         BBUF(CDB'AREA'BYTE+12) := COUNT.(0:8);                <<03608>>17280000
         BBUF(CDB'AREA'BYTE+13) := COUNT.(8:8);                <<03608>>17285000
         BBUF(CDB'AREA'BYTE+14) := CDB'SET'BURST;              <<03608>>17290000
         BBUF(CDB'AREA'BYTE+15) := 1;                          <<03608>>17295000
         BBUF(CDB'AREA'BYTE+16) := FUNCTION;                   <<03608>>17300000
       END;                                                    <<03608>>17305000
                                                               <<03608>>17310000
SUBROUTINE CONFIGURE'CS80'BOOTS(DESTDEV,DEVTIPE,BOOTXADDR,     <<03608>>17315000
                                BOOTXSAVEADDR,OVERLAYADDR,     <<03608>>17320000
                                BANK1SAVEADDR,SDFCODEADDR);    <<03608>>17325000
<< THIS PROCEDURE CONFIGURES THE BOOT AND BOOTX CHANNEL >>     <<03608>>17330000
<< PROGRAMS FOR THE CS80DEVICES.  ADDED 9/25/81 SGB     >>     <<03608>>17335000
                                                               <<03608>>17340000
VALUE DESTDEV,DEVTIPE,BOOTXADDR,BOOTXSAVEADDR,                 <<03608>>17345000
      BANK1SAVEADDR,OVERLAYADDR,SDFCODEADDR;                   <<03608>>17350000
INTEGER                                                        <<03608>>17355000
   DESTDEV,             <<DESTINATION LOGICAL DEVICE>>         <<03608>>17360000
   DEVTIPE;             <<SDF DISC SUBTYPE AND TYPE>>          <<03608>>17365000
DOUBLE                                                         <<03608>>17370000
   BOOTXADDR,           <<BOOTX DISC ADDRESS>>                 <<03608>>17375000
   BOOTXSAVEADDR,       <<OVERLAY AREA FOR BOOTX TARGET SAVE>> <<03608>>17380000
   OVERLAYADDR,         <<OVERLAY AREA DISC ADDRESS>>          <<03608>>17385000
   BANK1SAVEADDR,       <<STORAGE AREA FOR IF55 BANK1 DRTS>>   <<03608>>17390000
   SDFCODEADDR;         <<DISC ADDRESS OF SDF CODE>>           <<03608>>17395000
                                                               <<03608>>17400000
BEGIN                                                          <<03608>>17405000
                                                               <<03608>>17410000
   <<-------------------------------------->>                  <<03608>>17415000
   <<                                      >>                  <<03608>>17420000
   <<      BUILD THE CS80 BOOTSTRAP        >>                  <<03608>>17425000
   <<                                      >>                  <<03608>>17430000
   <<-------------------------------------->>                  <<03608>>17435000
                                                               <<03608>>17440000
                                                               <<03608>>17445000
      BUF := 0;                                                <<03608>>17450000
      MOVE BUF(1) := BUF,(BOOTLENWD - 1);                      <<03608>>17455000
      MOVE BUF(BOOT'WRITE) :=                                  <<03608>>17460000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>17465000
      MOVE BUF(BOOT'VERIFY) :=                                 <<03608>>17470000
               CS80'TEMPLATE(VERIFY'TEMPLATE),(VERIFY'LENGTH); <<03608>>17475000
      MOVE BUF(BOOT'READ) :=                                   <<03608>>17480000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>17485000
                                                               <<03608>>17490000
      BUF(BOOT'WRITE + 4) := BOOTMEMLOC + BOOT'WRT'CMDS;       <<03608>>17495000
      BUF(BOOT'VERIFY + 4) := BOOTMEMLOC + BOOT'VER'CMDS;      <<03608>>17500000
      BUF(BOOT'READ + 4) := BOOTMEMLOC + BOOT'READ'CMDS;       <<03608>>17505000
                                                               <<03608>>17510000
      BUF(BOOT'WRITE + 7) := WRT'EXEC'SEC;                     <<03608>>17515000
      BUF(BOOT'READ + 7) := READ'EXEC'SEC;                     <<03608>>17520000
                                                               <<03608>>17525000
      BUF(BOOT'WRITE + 8) := BOOTXLENBT;                       <<03608>>17530000
      BUF(BOOT'READ + 8) := BOOTXLENBT;                        <<03608>>17535000
                                                               <<03608>>17540000
      BUF(BOOT'WRITE + 10).(8:8) := 0; << BANK 0 >>            <<03608>>17545000
      BUF(BOOT'WRITE + 10).(0:3) := 5; << BURST THE WRITE >>   <<03608>>17550000
      BUF(BOOT'WRITE + 11) := BOOTXMEMLOC;<<BOOTX START ADDR>> <<03608>>17555000
      BUF(BOOT'READ + 10).(8:8) := 0; << BANK 0 >>             <<03608>>17560000
      BUF(BOOT'READ + 10).(0:1) := 1; << BURST THE READ >>     <<03608>>17565000
      BUF(BOOT'READ + 11) := BOOTXMEMLOC;<<BOOTX SAVE ADDRESS>><<03608>>17570000
      BUF(JUMP'BOOTX) := BOOTX'REL'ADDR;                       <<03608>>17575000
                                                               <<03608>>17580000
      SET'CMD'BYTES(BOOT'WRT'CMDS*2,BOOTXSAVEADDR1,            <<03608>>17585000
                    BOOTXSAVEADDR2,BOOTXLENBT,CDB'WRITE);      <<03608>>17590000
      SET'CMD'BYTES(BOOT'VER'CMDS*2,BOOTXSAVEADDR1,            <<03608>>17595000
                    BOOTXSAVEADDR2,BOOTXLENBT,CDB'VERIFY);     <<03608>>17600000
      SET'CMD'BYTES(BOOT'READ'CMDS*2,BOOTXADDR1,               <<03608>>17605000
                    BOOTXADDR2,BOOTXLENBT,CDB'READ);           <<03608>>17610000
                                                               <<03608>>17615000
      BSDFMAPADDR := SDFMAPADDR1;                              <<03608>>17620000
      BSDFMAPADDR1 := SDFMAPADDR2;                             <<03608>>17625000
                                                               <<03608>>17630000
      BCHECKSUM:=CALCULATECHECKSUM(BUF,BOOTLENWD,              <<03608>>17635000
                 CHECKSUMSTART);                               <<03608>>17640000
                                                               <<03608>>17645000
      <<------------------------------------->>                <<03608>>17650000
      <<                                     >>                <<03608>>17655000
      << WRITE BOOTSTRAP OUT TO SECTOR THREE >>                <<03608>>17660000
      <<                                     >>                <<03608>>17665000
      <<------------------------------------->>                <<03608>>17670000
                                                               <<03608>>17675000
      DISCIO(DESTDEV,WRITE,BUF,BOOTLENWD,BOOTDISCADDR);        <<03608>>17680000
                                                               <<03608>>17685000
                                                               <<03608>>17690000
   <<------------------------------------->>                   <<03608>>17695000
   <<                                     >>                   <<03608>>17700000
   <<    BUILD THE CS80 BOOT EXTENSION    >>                   <<03608>>17705000
   <<                                     >>                   <<03608>>17710000
   <<------------------------------------->>                   <<03608>>17715000
                                                               <<03608>>17720000
      BUF := 0;                                                <<03608>>17725000
      MOVE BUF(1) := BUF,(BOOTXLENWD - 1);                     <<03608>>17730000
      OVERLAY'WRITE := 0;                                      <<03608>>17735000
      MEMORYADDR := 0;                                         <<03608>>17740000
      MEMORYLEFT := OVERLAYAREALENWD;                          <<03608>>17745000
      DISCTARGETADDR := OVERLAYADDR;                           <<03608>>17750000
      SECTOROFFSET := IF DEVTIPE = HP9140 THEN                 <<03608>>17755000
                         DOUBLE( SIXTEENK/HP9140'SECTOR )      <<03608>>17760000
                      ELSE DOUBLE( SIXTEENK/ONESECTOR );       <<03608>>17765000
                                                               <<03608>>17770000
      DO                                                       <<03608>>17775000
         BEGIN                                                 <<03608>>17780000
            OVERLAY'VERIFY := OVERLAY'WRITE + WRITE'LENGTH;    <<03608>>17785000
            OVERLAY'WRT'CMDS := OVERLAY'VERIFY + VERIFY'LENGTH;<<03608>>17790000
            OVERLAY'VER'CMDS := OVERLAY'WRT'CMDS + CMDS'LENGTH;<<03608>>17795000
            WORDCOUNT := IF MEMORYLEFT < SIXTEENK THEN         <<03608>>17800000
                            MEMORYLEFT                         <<03608>>17805000
                         ELSE SIXTEENK;                        <<03608>>17810000
                                                               <<03608>>17815000
            MOVE BUF(OVERLAY'WRITE) :=                         <<03608>>17820000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>17825000
            MOVE BUF(OVERLAY'VERIFY) :=                        <<03608>>17830000
               CS80'TEMPLATE(VERIFY'TEMPLATE),(VERIFY'LENGTH); <<03608>>17835000
                                                               <<03608>>17840000
            BUF(OVERLAY'WRITE + 4) :=                          <<03608>>17845000
               BOOTXMEMLOC + OVERLAY'WRT'CMDS;                 <<03608>>17850000
            BUF(OVERLAY'VERIFY + 4) :=                         <<03608>>17855000
                BOOTXMEMLOC + OVERLAY'VER'CMDS;                <<03608>>17860000
                                                               <<03608>>17865000
            BUF(OVERLAY'WRITE + 7) := WRT'EXEC'SEC;            <<03608>>17870000
                                                               <<03608>>17875000
            BUF(OVERLAY'WRITE + 8) := WORDCOUNT * 2;           <<03608>>17880000
                                                               <<03608>>17885000
            BUF(OVERLAY'WRITE + 10).(8:8) := 0; << BANK 0 >>   <<03608>>17890000
            BUF(OVERLAY'WRITE + 10).(0:3) := 5; <<BURST MODE>> <<03608>>17895000
            BUF(OVERLAY'WRITE + 11) := MEMORYADDR; <<ADDRESS>> <<03608>>17900000
                                                               <<03608>>17905000
            BUF(OVERLAY'VERIFY + 9) := CMDS'LENGTH * 2 +       <<03608>>17910000
                  BUF(OVERLAY'VERIFY + 9);                     <<03608>>17915000
                                                               <<03608>>17920000
            SET'CMD'BYTES(OVERLAY'WRT'CMDS*2,DISCADDR1,        <<03608>>17925000
                    DISCADDR2, WORDCOUNT * 2,                  <<03608>>17930000
                    CDB'WRITE);                                <<03608>>17935000
            SET'CMD'BYTES(OVERLAY'VER'CMDS*2,DISCADDR1,        <<03608>>17940000
                    DISCADDR2, WORDCOUNT * 2,                  <<03608>>17945000
                    CDB'VERIFY);                               <<03608>>17950000
                                                               <<03608>>17955000
            OVERLAY'WRITE := OVERLAY'VER'CMDS + CMDS'LENGTH;   <<03608>>17960000
            MEMORYADDR := MEMORYADDR + WORDCOUNT;              <<03608>>17965000
            MEMORYLEFT := MEMORYLEFT - WORDCOUNT;              <<03608>>17970000
            DISCTARGETADDR := DISCTARGETADDR + SECTOROFFSET;   <<03608>>17975000
                                                               <<03608>>17980000
         END UNTIL MEMORYLEFT = 0;                             <<03608>>17985000
                                                               <<03608>>17990000
      MOVE BUF(LOWMEMORY'READ) :=                              <<03608>>17995000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>18000000
      MOVE BUF(SDFCODE'READ) :=                                <<03608>>18005000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>18010000
      MOVE BUF(BANK1'WRITE) :=                                 <<03608>>18015000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>18020000
                                                               <<03608>>18025000
      << INTERRUPT/HALT OF 0 TRAPS TO SDFLOAD >>               <<03608>>18030000
                                                               <<03608>>18035000
      BUF(END'BOOTX) := HALTINTERRUPT;                         <<03608>>18040000
      BUF(END'BOOTX + 1) := 0;                                 <<03608>>18045000
                                                               <<03608>>18050000
                                                               <<03608>>18055000
      BUF(LOWMEMORY'READ + 4):=BOOTXMEMLOC + LOWMEM'READ'CMDS; <<03608>>18060000
      BUF(SDFCODE'READ + 4) := BOOTXMEMLOC + SDFCODE'READ'CMDS;<<03608>>18065000
      BUF(BANK1'WRITE + 4) := BOOTXMEMLOC + BANK1'WRT'CMDS;    <<03608>>18070000
                                                               <<03608>>18075000
      BUF(LOWMEMORY'READ + 7) := READ'EXEC'SEC;                <<03608>>18080000
      BUF(SDFCODE'READ + 7) := READ'EXEC'SEC;                  <<03608>>18085000
      BUF(BANK1'WRITE + 7) := WRT'EXEC'SEC;                    <<03608>>18090000
                                                               <<03608>>18095000
      BUF(LOWMEMORY'READ + 8) := LOWMEMORYSIZE;                <<03608>>18100000
      BUF(SDFCODE'READ+8) := (CODEAREALENWD - HIMEMORYLOC)*2;  <<03608>>18105000
      BUF(BANK1'WRITE + 8) := BANK1SAVELENWD * 2;              <<03608>>18110000
                                                               <<03608>>18115000
      BUF(LOWMEMORY'READ + 10).(8:8) := 0; << BANK 0 >>        <<03608>>18120000
      BUF(LOWMEMORY'READ + 10).(0:1) := 1; << BURST THE READ >><<03608>>18125000
      BUF(LOWMEMORY'READ + 11) := 0; << LOWMEMORY ADDRESS >>   <<03608>>18130000
      BUF(SDFCODE'READ + 10).(8:8) := 0; << BANK 0 >>          <<03608>>18135000
      BUF(SDFCODE'READ + 10).(0:1) := 1; << BURST THE READ >>  <<03608>>18140000
      BUF(SDFCODE'READ + 11) := %1600; << SDF ADDRESS >>       <<03608>>18145000
      BUF(BANK1'WRITE + 10).(8:8) := 1; << BANK 1 >>           <<03608>>18150000
      BUF(BANK1'WRITE + 10).(0:3) := 5; << BURST THE WRITE >>  <<03608>>18155000
      BUF(BANK1'WRITE + 11) := 0;  << BANK1 DRT ADDRESS >>     <<03608>>18160000
                                                               <<03608>>18165000
      SET'CMD'BYTES(LOWMEM'READ'CMDS*2,SDFCODEADDR1,           <<03608>>18170000
                    SDFCODEADDR2,LOWMEMORYSIZE,CDB'READ);      <<03608>>18175000
      SET'CMD'BYTES(SDFCODE'READ'CMDS*2,HIGHMEMADDR1,          <<03608>>18180000
                    HIGHMEMADDR2,                              <<03608>>18185000
                    (CODEAREALENWD - HIMEMORYLOC)*2,           <<03608>>18190000
                    CDB'READ);                                 <<03608>>18195000
      SET'CMD'BYTES(BANK1'WRT'CMDS*2,BANK1SAVEADDR1,           <<03608>>18200000
                    BANK1SAVEADDR2,BANK1SAVELENWD * 2,         <<03608>>18205000
                    CDB'WRITE);                                <<03608>>18210000
                                                               <<03608>>18215000
      << WRITE BOOTSTRAP EXTENSION >>                          <<03608>>18220000
      DISCIO(DESTDEV,WRITE,BUF,BOOTXLENWD,BOOTXADDR);          <<03608>>18225000
                                                               <<03608>>18230000
END;                                                           <<03608>>18235000
                                                               <<03608>>18240000
$PAGE                                                          <<03608>>18245000
<<****************************************************>>       <<03608>>18250000
<<                                                    >>       <<03608>>18255000
<<   SUBROUTINE CONFIGUREBOOTS BUILDS AND WRITES      >>       <<03608>>18260000
<<   THE BOOT CHANNEL PROGRAM TO SECTOR 3 FOR         >>       <<03608>>18265000
<<   NON-CS80DEVICES, ALSO BUILDS AND WRITES THE      >>       <<03608>>18270000
<<   BOOT-EXTENSION CHANNEL PROGRAM TO THE SDFLOAD    >>       <<03608>>18275000
<<   FILE                                             >>       <<03608>>18280000
<<                                                    >>       <<03608>>18285000
<<****************************************************>>       <<03608>>18290000
                                                               <<03608>>18295000
SUBROUTINE CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,           <<03011>>18300000
   BOOTXSAVEADDR,OVERLAYADDR,BANK1SAVEADDR,SDFCODEADDR);       <<03011>>18305000
VALUE DESTDEV,DEVTIPE,BOOTXADDR,BOOTXSAVEADDR,                 <<03011>>18310000
   BANK1SAVEADDR,OVERLAYADDR,SDFCODEADDR;                      <<03011>>18315000
INTEGER                                                                 18320000
   DESTDEV,            <<DESTINATION LOGICAL DEVICE>>                   18325000
   DEVTIPE;            <<SDF DISC SUB TYPE>>                            18330000
DOUBLE                                                                  18335000
   BOOTXADDR,          <<BOOTX DISC ADDRESS>>                           18340000
   BOOTXSAVEADDR,      <<OVERLAY AREA FOR BOOTX TARGET SAVE>>  <<03011>>18345000
   OVERLAYADDR,        <<OVERLAY AREA DISC ADDRESS>>                    18350000
   BANK1SAVEADDR,      <<STORAGE AREA FOR ICF55 BANK1 DRTS>>   <<03011>>18355000
   SDFCODEADDR;        <<DISC ADDR OF SDF CODE>>                        18360000
   BEGIN                                                                18365000
   <<1. CONFIGURE AND WRITE OUT THE INITIAL BOOTSTRAP.                  18370000
     2. CONFIGURE AND WRITE OUT THE BOOTX.                              18375000
   >>                                                                   18380000
   <<CONFIGURE BOOTSTRAP>>                                              18385000
   MOVE BUF:=BOOT,(BOOTLENWD);                                          18390000
                                                               <<03011>>18395000
      <<LOAD BOOTXSAVEADDR INTO BOOTSTRAP PROGRAM>>            <<03011>>18400000
      <<SEEK TO THIS ADDR FOR DISC WRITE >>                    <<03011>>18405000
      <<SAVE OF BOOTX MEMORY TARGET AREA>>                     <<03011>>18410000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,                            18415000
                BOOTXSAVEADDR,BBOOTXSAVEAREA);                 <<03011>>18420000
                                                               <<03011>>18425000
      <<LOAD BOOTXADDR INTO BOOTSTRAP PROGRAM>>                <<03011>>18430000
       <<SEEK TO THIS ADDR FOR DISC READ OF BOOTX PROG>>       <<03011>>18435000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,BOOTXADDR,         <<03011>>18440000
                     BBOOTXAREA);                              <<03011>>18445000
                                                               <<03011>>18450000
       <<LOAD THE LOGICAL SECTOR NUMBER OF THE SDFMAP AREA>>   <<03011>>18455000
       <<INTO THE BOOTSTRAP PROGRAM>>                          <<03011>>18460000
    TOS := SDFMAPADDR;                                         <<03011>>18465000
    BSDFMAPADDR1 := TOS;  BSDFMAPADDR := TOS;                  <<03011>>18470000
   BFILEMASK:=FILEMASK(DTSUBTYPE);                                      18475000
   BCHECKSUM:=CALCULATECHECKSUM(BUF,BOOTLENWD,CHECKSUMSTART);           18480000
                                                                        18485000
   <<WRITE BOOTSTRAP OUT TO SECTOR THREE>>                              18490000
   DISCIO(DESTDEV,WRITE,BUF,BOOTLENWD,BOOTDISCADDR);                    18495000
                                                                        18500000
   <<CONFIGURE BOOTSTRAP EXTENSION>>                                    18505000
   BUF:=0; MOVE BUF(1):=BUF,(BOOTXLENWD-1);                             18510000
   @CHANPROG:=@BUF; @CMDAREA:=@BUF(BOOTXLENWD)-COMMANDLENGTH-2;         18515000
   BXREADCOMMAND:=READCMD;                                              18520000
   BXWRITECOMMAND:=WRITECMD;                                            18525000
                                                                        18530000
   <<CONFIGURE PORTION TO WRITE OUT OVERLAY AREA>>                      18535000
   MEMORYADDR:= 0;  MEMORYLEFT := OVERLAYAREALENWD;            <<03011>>18540000
   DISCTARGETADDR:=OVERLAYADDR;                                         18545000
   DO                                                                   18550000
      BEGIN                                                             18555000
      <<EMIT CHANNEL PROGRAM INSTRUCTIONS TO WRITE OUT A CYLINDER'S     18560000
        WORTH OF BANK ZERO TO THE DISC OVERLAY AREA.                    18565000
      >>                                                                18570000
      MOVE CHANPROG:=WRITETEMPLATE,(WRITETEMPLATELEN);                  18575000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,DISCTARGETADDR,CMDAREA); 18580000
      WTVERSEEKADDR:=WTSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;               18585000
      WTADDRECORDADDR:=WTVERADDREC:=WTSEEKADDR+3;                       18590000
      WTMEMORYADDR:=MEMORYADDR;                                         18595000
      WTVERCMDADDR:=BOOTXBASE+@CMDVERIFY-@BUF;                          18600000
      DISCTARGETADDR:=                                                  18605000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE);          18610000
      WORDCOUNT:=                                                       18615000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT ELSE CYLINDERSIZE);   18620000
      WTBYTECOUNT:=2*WORDCOUNT;                                         18625000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                                 18630000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                                 18635000
      CMDVERIFY:=VERIFY;                                                18640000
      CMDVERIFYSEC:=WORDCOUNT/SECTORSIZE;                               18645000
      @CHANPROG:=@CHANPROG+WRITETEMPLATELEN;                            18650000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                                 18655000
      END UNTIL MEMORYLEFT=0;                                           18660000
                                                                        18665000
   <<CONFIGURE PORTION TO READ IN SDF AREA>>                            18670000
   <<READ IN LOW MEMORY>>                                               18675000
   MOVE CHANPROG:=READTEMPLATE,(READTEMPLATELEN);                       18680000
   MEMORYADDR:=0;                                                       18685000
   RDBYTECOUNT:=LOWMEMORYSIZE;                                          18690000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,SDFCODEADDR,CMDAREA);       18695000
   RDSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;                                 18700000
   RDADDRECORDADDR:=RDSEEKADDR+3;                                       18705000
   CMDSTATUS:=STATUSCMD;                                                18710000
   RDSTATUSCMD:=RDSTATUSADDR:=RDSEEKADDR+6;                             18715000
                                                                        18720000
   <<READ IN CHUNKS OF HIGH MEMORY>>                                    18725000
   MEMORYADDR:=HIMEMORYLOC;                                             18730000
   MEMORYLEFT := CODEAREALENWD-HIMEMORYLOC;                    <<03011>>18735000
   DISCTARGETADDR:=SDFCODEADDR+HIMEMORYSECTORLOC;                       18740000
   DO                                                                   18745000
      BEGIN                                                             18750000
      <<EMIT CHANNEL PROGRAM INSTRUCTIONS TO READ IN A CYLINDER'S       18755000
        WORTH OF THE DISC SDF AREA TO BANK ZERO.                        18760000
      >>                                                                18765000
      @CHANPROG:=@CHANPROG+READTEMPLATELEN;                             18770000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                                 18775000
      MOVE CHANPROG:=READTEMPLATE,(READTEMPLATELEN);                    18780000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,DISCTARGETADDR,CMDAREA); 18785000
      RDSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;                              18790000
      RDADDRECORDADDR:=RDSEEKADDR+3;                                    18795000
      RDMEMORYADDR:=MEMORYADDR;                                         18800000
      RDSTATUSCMD:=RDSTATUSADDR:=RDSEEKADDR+6;                          18805000
      CMDSTATUS:=STATUSCMD;                                             18810000
      DISCTARGETADDR:=                                                  18815000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE);          18820000
      WORDCOUNT:=                                                       18825000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT ELSE CYLINDERSIZE);   18830000
      RDBYTECOUNT:=2*WORDCOUNT;                                         18835000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                                 18840000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                                 18845000
      END UNTIL MEMORYLEFT=0;                                           18850000
                                                               <<03011>>18855000
   <<CONFIGURE PORTION TO WRITE OUT BANK1 DRT AREA>>           <<03011>>18860000
   <<DONE FOR ALL CPUS, BUT USED LATER ONLY FOR ICF55>>        <<03011>>18865000
                                                               <<03011>>18870000
   @CHANPROG:=@CHANPROG+READTEMPLATELEN;                       <<03011>>18875000
   @CMDAREA:=@CMDAREA - COMMANDLENGTH;                         <<03011>>18880000
                                                               <<03011>>18885000
   MEMORYADDR:=0; MEMORYLEFT:=BANK1SAVELENWD;                  <<03011>>18890000
   DISCTARGETADDR:=BANK1SAVEADDR;                              <<03011>>18895000
   DO                                                          <<03011>>18900000
      BEGIN                                                    <<03011>>18905000
      <<EMIT CHANNEL PROG TO WRITE OUT DRT AREA IN BANK 1 >>   <<03011>>18910000
                                                               <<03011>>18915000
      MOVE CHANPROG:=WRITETEMPLATE,(WRITETEMPLATELEN);         <<03011>>18920000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,                <<03011>>18925000
                        DISCTARGETADDR,CMDAREA);               <<03011>>18930000
      WTVERSEEKADDR:=WTSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;      <<03011>>18935000
      WTADDRECORDADDR:=WTVERADDREC:=WTSEEKADDR+3;              <<03011>>18940000
      WTMEMORYADDR:=MEMORYADDR;                                <<03011>>18945000
      WTMEMORYBANK := 1;   <<BANK 1>>                          <<03011>>18950000
      WTCHECKPOINT := 3;  <<HALT INT. CODE FOR CHECKPOINT>>    <<03011>>18955000
      WTVERCMDADDR:=BOOTXBASE+@CMDVERIFY-@BUF;                 <<03011>>18960000
      DISCTARGETADDR:=                                         <<03011>>18965000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE); <<03011>>18970000
      WORDCOUNT:=                                              <<03011>>18975000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT              <<03011>>18980000
                                  ELSE CYLINDERSIZE);          <<03011>>18985000
      WTBYTECOUNT:=2*WORDCOUNT;                                <<03011>>18990000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                        <<03011>>18995000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                        <<03011>>19000000
      CMDVERIFY:=VERIFY;                                       <<03011>>19005000
      CMDVERIFYSEC:=WORDCOUNT/SECTORSIZE;                      <<03011>>19010000
      @CHANPROG:=@CHANPROG+WRITETEMPLATELEN;                   <<03011>>19015000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                        <<03011>>19020000
      END UNTIL MEMORYLEFT=0;                                  <<03011>>19025000
                                                                        19030000
   <<EMIT HALT INTERRUPT INSTRUCTION>>                                  19035000
   CHANPROG:=HALTINTERRUPT; CHANPROG(1):=0;                             19040000
                                                                        19045000
   <<WRITE OUT BOOTSTRAP EXTENSION>>                                    19050000
   DISCIO(DESTDEV,WRITE,BUF,BOOTXLENWD,BOOTXADDR);                      19055000
   END  <<CONFIGUREBOOT>>;                                              19060000
SUBROUTINE PROCESSCOMMANDFILE(CLDEV,CFILEADDR,CFILELEN,DLDEV,DFILEADDR, 19065000
   DFILESIZE);                                                          19070000
INTEGER                                                                 19075000
   CLDEV,              <<COMMAND FILE'S FILE NUMBER (0 IF NO FILE>>     19080000
   DLDEV,              <<DUMPFILE'S FILE NUMBER (0 IF NO FILE)>>        19085000
   CFILELEN,           <<NUMBER OF RECORDS IN THE COMMAND FILE>>        19090000
   DFILESIZE;          <<NUMBER OF SECTORS IN THE DUMP FILE>>           19095000
DOUBLE                                                                  19100000
   CFILEADDR,          <<DISC SECTOR ADDR OF THE COMMAND FILE>>         19105000
   DFILEADDR;          <<DISC SECTOR ADDR OF THE DUMP FILE>>            19110000
   BEGIN                                                                19115000
   <<SCANS THE COMMAND FILE FOR THE "DUMPFILE" COMMAND. IF FOUND THEN:  19120000
     1. IF "FILENAME" PARAMETER IS PRESENT, THE FILE'S ATTRIBUTES       19125000
        ARE CHECKED AND RETURNED.                                       19130000
     2. ELSE THE FILE, DDISCDUMP, IS OPENED HAVING THE FOLLOWING        19135000
        ATTRIBUTES:                                                     19140000
        A. RECORDSIZE     - 4096 WORDS                                  19145000
        B. NUMRECS        - SEE CODE LISTING                            19150000
   >>                                                                   19155000
   DFILEADDR:=0D; DFILESIZE:=0;                                         19160000
   <<OPEN AND CHECK COMMAND FILE VALIDITY>>                             19165000
   MOVE DESIG:=CMDESIG,(CMDESIGLEN);                                    19170000
   CMDFILENUM:=FOPEN(DESIG,OLDFILE);                                    19175000
   IF <> THEN                                                           19180000
      MESSAGE(UGLYCOMMANDFILE)                                          19185000
   ELSE                                                                 19190000
      BEGIN                                                             19195000
      <<SUCCESSFUL OPEN OF COMMAND FILE, CHECK ITS VALIDITY>>           19200000
      FGETINFO(CMDFILENUM,,FOPTIONS,,RECSIZE,DEVICETYPE,,,,,NUMREC,     19205000
         ,,,BLOCKSIZE,,NUMEXTENT,,,LABELADDR);                          19210000
      BLOCKFACTOR:=BLOCKSIZE/RECSIZE;                                   19215000
      IF RECSIZE < 0 THEN RECSIZE:=(-RECSIZE)&LSR(1);                   19220000
      IF (FOPTIONS LAND %773) <> PROPERFOPTIONS THEN                    19225000
         MESSAGE(UGLYCOMFOPTIONS)                                       19230000
      ELSE IF RECSIZE <> CRECSIZE THEN MESSAGE(UGLYCOMRECSIZE)          19235000
      ELSE IF DEVICETYPE.(8:8) <> DISC AND                     <<03608>>19240000
              DEVICETYPE.(8:8) <> CS80TYPE OR                  <<03608>>19245000
              DEVICETYPE  = HP9140 THEN MESSAGE(UGLYCOMDEV)    <<03608>>19250000
      ELSE IF NUMEXTENT <> PROPERNUMEXTENTS THEN MESSAGE(UGLYCOMEXTENTS)19255000
      ELSE IF BLOCKFACTOR <> PROPERBLOCKFACTOR THEN                     19260000
         MESSAGE(UGLYBLOCKFACTOR)                                       19265000
      ELSE                                                              19270000
         BEGIN                                                          19275000
         <<VALID COMMAND FILE, SEARCH FOR "DUMPFILE" COMMAND>>          19280000
         VALIDCOMMANDFILE:=TRUE;                                        19285000
         EXTRACTFILEADDR(LABELADDR,CLDEV,CFILEADDR);                    19290000
         CFILELEN:=INTEGER(NUMREC);                                     19295000
         FREAD(CMDFILENUM,BUF,40);                                      19300000
         IF BBUF = "DUMPFILE" THEN                                      19305000
            BEGIN                                                       19310000
            <<COMMAND FILE SPECIFIES A DISC DUMP FILE>>                 19315000
            <<GET FILE'S DESIGNATOR>>                                   19320000
            BBUF(72):=".";                                              19325000
            SCAN BBUF(8) WHILE ". ",1;                                  19330000
            @DDESIG:=TOS;                                               19335000
            IF CARRY THEN MOVE DDESIG:=DUMPDESIG,(DUMPDESIGLEN);        19340000
            <<OPEN IT OLD>>                                             19345000
            DUMPFILENUM:=FOPEN(DDESIG,OLDFILE);                         19350000
            IF <> THEN                                                  19355000
               BEGIN                                                    19360000
               <<FAILED TO OPEN IT OLD, SO OPEN IT NEW>>                19365000
               <<CALCULATE NUMBER OF RECORDS NEEDED TO DUMP             19370000
                 MAIN MEMORY AND VIRTUAL MEMORY.                        19375000
               >>                                                       19380000
               DNUMREC:=DOUBLE((NUMBERBANKS)*BANKFACTOR);               19385000
               MOVE LOGICALDEVICE:="1 ";                                19390000
               DUMPFILENUM:=FOPEN(DDESIG,FIXED,,DRS,LOGICALDEVICE,,,,,  19395000
                  DNUMREC,DFILEXTENT,DFILEXTENT);                       19400000
               IF <> THEN                                               19405000
                  BEGIN  <<FAILED TO OPEN ON THE SYSTEM DISC>>          19410000
                  <<PLACE ON ANY DISC>>                                 19415000
                  MOVE CLASSNAME:="DISC ";                              19420000
                  DUMPFILENUM:=FOPEN(DDESIG,FIXED,,DRS,CLASSNAME,,,,,   19425000
                     DNUMREC,DFILEXTENT,DFILEXTENT);                    19430000
                  END;                                                  19435000
               END;                                                     19440000
            IF <> THEN                                                  19445000
               MESSAGE(UGLYDUMPFILE)                                    19450000
            ELSE                                                        19455000
               BEGIN                                                    19460000
               <<OPENED THE DUMP FILE, CHECK ITS VALIDITY>>             19465000
               FGETINFO(DUMPFILENUM,BBUF,FOPTIONS,,RECSIZE,DEVICETYPE,  19470000
                  ,,,,,NUMREC,,,,,NUMEXTENT,,,LABELADDR);               19475000
               IF NOTFIXEDRECFORMAT THEN MESSAGE(UGLYDUMPFOPTIONS)      19480000
               ELSE IF RECSIZE < DRS THEN MESSAGE(UGLYDUMPRECSIZE)      19485000
               ELSE IF DEVICETYPE.(8:8) <> DISC AND            <<03608>>19490000
                       DEVICETYPE.(8:8) <> CS80TYPE OR         <<03608>>19495000
                       DEVICETYPE  = HP9140 THEN               <<03608>>19500000
                              MESSAGE(UGLYCOMDEV)              <<03608>>19505000
               ELSE IF NUMEXTENT<>DFILEXTENT THEN MESSAGE(UGLYDEXTENTS) 19510000
               ELSE                                                     19515000
                  BEGIN                                                 19520000
                  <<DUMP FILE IS VALID>>                                19525000
                  DFILESIZE:=INTEGER(NUMREC);                           19530000
                  DLDEV:=LABEL0.(0:8);                                  19535000
                  LABEL0:=LABEL0.(8:8); DFILEADDR:=LABELADDR;           19540000
                  <<INSURE THAT IT IS A PERMANENT FILE>>                19545000
                  FCLOSE(DUMPFILENUM,SAVE,0);                           19550000
                  FOPEN(BBUF,OLDFILE);                                  19555000
                  END  <<DUMP FILE SAVE>>;                              19560000
               END  <<DUMP FILE VALIDITY CHECK>>;                       19565000
            END  <<DUMP FILE PROCESSING>>;                              19570000
         END  <<DUMP FILE SEARCH>>;                                     19575000
      FCLOSE(CMDFILENUM,0,0);                                           19580000
      END  <<COMMAND FILE VALIDITY CHECK>>;                             19585000
   END  <<PROCESSCOMMANDFILE>>;                                         19590000
SUBROUTINE CONFIGURESDF(DESTDEV,SDFCODEADDR,OVERLAYADDR,CLDEV,CFILEADDR,19595000
   CFILELEN,DLDEV,DFILEADDR,DFILELEN);                                  19600000
VALUE DESTDEV,SDFCODEADDR,OVERLAYADDR,CLDEV,CFILEADDR,CFILELEN,DLDEV,   19605000
   DFILEADDR,DFILELEN;                                                  19610000
INTEGER                                                                 19615000
   DESTDEV,            <<DESTINATION LOGICAL DEVICE>>                   19620000
   CLDEV,              <<COMMAND FILE LOGICAL DEVICE>>                  19625000
   CFILELEN,           <<NUMBER OF RECORDS IN THE COMMAND FILE>>        19630000
   DLDEV,              <<DUMP FILE LOGICAL DEVICE>>                     19635000
   DFILELEN;           <<# 4096 WORD RECS IN DUMP FILE>>                19640000
DOUBLE                                                                  19645000
   SDFCODEADDR,        <<DISC ADDR OF SDF CODE>>                        19650000
   OVERLAYADDR,        <<DISC ADDR OF OVERLAY AREA>>                    19655000
   CFILEADDR,          <<DISC ADDR OF COMMAND FILE>>                    19660000
   DFILEADDR;          <<DISC ADDR OF DUMP FILE>>                       19665000
   BEGIN                                                                19670000
   <<CONFIGURE THE SDF MEMORY IMAGE                                     19675000
     1. SDF'S CONFIGURATION DATA SEGMENT IS INITIALIZED.                19680000
     2. A CHECKSUM IS COMPUTED AND STUFFED INTO THE CONFIGURATION       19685000
        DATA SEGMENT.                                                   19690000
   >>                                                                   19695000
                                                               <<03608>>19700000
   << IF THE DEVICE IS HP9140 THEN THE SECTOR SIZE BECOMES >>  <<03608>>19705000
   << 512 WORDS OR AREAS OF DATA WILL BE LOST              >>  <<03608>>19710000
                                                               <<03608>>19715000
   IF DEVTIPE = HP9140 THEN SECTORSIZ := HP9140'SECTOR         <<03608>>19720000
                       ELSE SECTORSIZ := SECTORSIZE;           <<03608>>19725000
                                                               <<03608>>19730000
   << FETCH THE CONFIGURATION DATA SEGMENT      >>             <<03608>>19735000
   << FIRST GET THE POINTER TO DST TABLE        >>             <<03608>>19740000
   << THEN READ THE DST TABLE TO GET THE        >>             <<03608>>19745000
   << POINTER TO THE CONFIGURATION DATA SEGMENT >>             <<03608>>19750000
   DISCIO(DESTDEV,READ,BUF,DSTABLELOC+1,SDFCODEADDR);                   19755000
   IF DEVTIPE = HP9140 AND                                     <<03608>>19760000
      BUF(DSTABLELOC) >= HIMEMORYLOC THEN                      <<03608>>19765000
         BUF(DSTABLELOC) := BUF(DSTABLELOC) + ONESECTOR;       <<03608>>19770000
      <<************************************************>>     <<03608>>19775000
      <<     PRECEDING 3 LINES WERE ADDED TO ALLOW      >>     <<03608>>19780000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>19785000
      <<************************************************>>     <<03608>>19790000
   @DSTABLE:=@BUF+(BUF(DSTABLELOC) MOD INTEGER(SECTORSIZ));    <<03608>>19795000
   DSTSECTOR:=DOUBLE(BUF(DSTABLELOC)/INTEGER(SECTORSIZ))       <<03608>>19800000
                     + SDFCODEADDR;                            <<03608>>19805000
                                                               <<03608>>19810000
   << READ DST TABLE TO GET THE POINTER TO THE >>              <<03608>>19815000
   << CONFIGURATION DATA SEGMENT               >>              <<03608>>19820000
                                                               <<03608>>19825000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,DSTSECTOR);             <<03608>>19830000
                                                               <<03608>>19835000
   <<LOCATE CONFIGURATION DATA SEGMENT'S DISC ADDR AND DISPLACEMENT>>   19840000
   IF DEVTIPE = HP9140 AND                                     <<03608>>19845000
      DSTABLE(4*CONFIGDST+3) >= HIMEMORYLOC THEN               <<03608>>19850000
         DSTABLE(4*CONFIGDST+3) :=                             <<03608>>19855000
                DSTABLE(4*CONFIGDST+3) + ONESECTOR;            <<03608>>19860000
      <<************************************************>>     <<03608>>19865000
      <<    PRECEDEING 4 LINES WERE ADDED TO ALLOW      >>     <<03608>>19870000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>19875000
      <<************************************************>>     <<03608>>19880000
   CONFIGSECTOR:=DOUBLE(DSTABLE(4*CONFIGDST+3)/SECTORSIZ)      <<03608>>19885000
                       + SDFCODEADDR;                          <<03608>>19890000
   @CONFIG:=@BUF+INTEGER(DSTABLE(XREG) MOD SECTORSIZ);         <<03608>>19895000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,CONFIGSECTOR);          <<03608>>19900000
                                                               <<03608>>19905000
   <<ZERO THE CONFIGURATION AREA>>                                      19910000
   CONFIG:=0; MOVE CONFIG(1):=CONFIG,(CTCONFIGLEN-1);                   19915000
   CTSDFINITVERSION:=VERSION;                                  <<00.08>>19920000
                                                                        19925000
   IF (CTMODE:=MODE) <> BACKUPMODE THEN                                 19930000
      BEGIN                                                             19935000
      <<INITIALIZE CONFIGURATION DATA SEGMENT>>                         19940000
      CONFIGUREDEVICE(DESTDEV,CTSYSDISCDESC);                           19945000
      CONFIGUREDEVICE(CONSOLELDEV,CTCONSOLEDESC);                       19950000
      MOVE CLASSNAME:=LPCLASS,(8);                                      19955000
      IF GETCLASS(CLASSINFO,WORDS0'3,,,CLASSNAME) THEN                  19960000
         CONFIGUREDEVICE(CLASSINFO(4),CTLINEPTRDESC);          <<06883>>19965000
      MOVE CLASSNAME:=DUMPDEVCLASS,(8);                                 19970000
      IF GETCLASS(CLASSINFO,WORDS0'3,,,CLASSNAME) THEN                  19975000
         CONFIGUREDEVICE(CLASSINFO(4),CTDUMPDEVDESC);          <<06883>>19980000
      CONFIGUREDEVICE(CLDEV,CTCOMMANDESC);                              19985000
      CONFIGUREDEVICE(DLDEV,CTDUMPFILEDESC);                            19990000
      <<MISC INFO>>                                                     19995000
      CTNUMBERBANKS:=NUMBERBANKS;                                       20000000
      CTDUMPFILELEN:=DFILELEN;                                          20005000
      CTCOMMANDFILE:=CFILEADDR;                                         20010000
      CTDUMPFILE:=DFILEADDR;                                            20015000
      CTCOMMANDLENGTH:=CFILELEN;                               <<00.08>>20020000
      END;                                                              20025000
                                                                        20030000
   <<WRITE OUT CONFIGURATION AREA>>                                     20035000
   DISCIO(DESTDEV,WRITE,BUF,TWO'SECTORS,CONFIGSECTOR);         <<03608>>20040000
                                                               <<03608>>20045000
   <<CALCULATE AND STORE THE CHECKSUM.  THE CHECKSUM STARTS AT THE      20050000
     SECOND WORD OF THE CONFIGURATION DATA SEGMENT AND ENDS AT THE WORD 20055000
     BEFORE THE STACK DATA SEGMENT.                                     20060000
   >>                                                                   20065000
   <<FIRST FIND THE END OF THE CHECKSUM AREA.>>                         20070000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,DSTSECTOR);             <<03608>>20075000
   IF DEVTIPE = HP9140 AND                                     <<03608>>20080000
      DSTABLE(4*STACKDSTLOC+3) >= HIMEMORYLOC THEN             <<03608>>20085000
         DSTABLE(4*STACKDSTLOC+3) :=                           <<03608>>20090000
                DSTABLE(4*STACKDSTLOC+3) + ONESECTOR;          <<03608>>20095000
      <<************************************************>>     <<03608>>20100000
      <<    PRECEDEING 4 LINES WERE ADDED TO ALLOW      >>     <<03608>>20105000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>20110000
      <<************************************************>>     <<03608>>20115000
   STACKSECTOR:=DOUBLE(DSTABLE(4*STACKDSTLOC+3)/SECTORSIZ)     <<03608>>20120000
                       + SDFCODEADDR;                          <<03608>>20125000
   STACKLOC:=DSTABLE(XREG) MOD SECTORSIZ;                      <<03608>>20130000
   CHECKSUM:=CHECKSUMSTART;                                             20135000
   <<CALCULATE CHECKSUM ON 2ND THRU N-1 SECTORS>>                       20140000
   FOR I:=1 UNTIL INTEGER(STACKSECTOR-CONFIGSECTOR)-1 DO                20145000
      BEGIN                                                             20150000
      DISCIO(DESTDEV,READ,BUF,SECTORSIZ,                       <<03608>>20155000
             CONFIGSECTOR+DOUBLE(I));                          <<03608>>20160000
      CHECKSUM:=CALCULATECHECKSUM(BUF,SECTORSIZ,CHECKSUM);     <<03608>>20165000
      END;                                                     <<03608>>20170000
   <<CHECKSUM ON PARTIAL LAST SECTOR>>                         <<03608>>20175000
   DISCIO(DESTDEV,READ,BUF,SECTORSIZ,STACKSECTOR);             <<03608>>20180000
   CHECKSUM:=CALCULATECHECKSUM(BUF,STACKLOC,CHECKSUM);                  20185000
   <<CHECKSUM ON PARTIAL FIRST SECTOR>>                                 20190000
   DISCIO(DESTDEV,READ,BUF,SECTORSIZ,CONFIGSECTOR);            <<03608>>20195000
  CTCHECKSUM:=CALCULATECHECKSUM(CONFIG,                        <<03608>>20200000
                       (INTEGER(SECTORSIZ)+@BUF-@CONFIG),      <<03608>>20205000
                       CHECKSUM);                              <<03608>>20210000
   DISCIO(DESTDEV,WRITE,BUF,SECTORSIZ,CONFIGSECTOR);           <<03608>>20215000
                                                                        20220000
   <<MOVE PATTERN TO OVERLAY AREA.  IF 7905 OR 7906 REMOVABLE PLATTER   20225000
     THEN WRITE THE PATTERN TO EACH "CYLINDER" BOUNDARY.                20230000
   >>                                                                   20235000
   MOVE BUF:="THIS IS A VIRGIN OVERLAY AREA";                           20240000
   DISCIO(DESTDEV,WRITE,BUF,-29,OVERLAYADDR);                  <<03011>>20245000
   MOVE BUF:="THIS IS A VIRGIN BOOTXSAVE AREA";                <<03011>>20250000
   DISCIO(DESTDEV,WRITE,BUF,-31,BOOTXSAVEADDR);                <<03011>>20255000
   MOVE BUF:="THIS IS A VIRGIN BANK1SAVE AREA";                <<03011>>20260000
   DISCIO(DESTDEV,WRITE,BUF,-31,BANK1SAVEADDR);                <<03011>>20265000
   END  <<CONFIGURESDF>>;                                               20270000
SUBROUTINE PUT'BOOTS'ON'DEV(LDEV,DEVTIPE);                     <<03608>>20275000
<< DETERMINES THE TYPE OF DEVICE AND THEN CALLS THE  >>        <<03608>>20280000
<< APPROPRIATE SUBROUTINE WHICH CONFIGURES AND STORES >>       <<03608>>20285000
<< THE BOOT AND BOOTEXTENSION CHANNEL PROGRAMS ONTO   >>       <<03608>>20290000
<< THAT DEVICE.                                       >>       <<03608>>20295000
                                                               <<03608>>20300000
VALUE LDEV,                                                    <<03608>>20305000
      DEVTIPE;                                                 <<03608>>20310000
INTEGER LDEV,                                                  <<03608>>20315000
      DEVTIPE;                                                 <<03608>>20320000
                                                               <<03608>>20325000
BEGIN                                                          <<03608>>20330000
                                                               <<03608>>20335000
   IF DTDEVICETYPE = T13037 OR                                 <<03608>>20340000
      DTDEVICETYPE = SYSTEMDISC OR                             <<03608>>20345000
      DTDEVICETYPE = T7902 THEN                                <<03608>>20350000
                                                               <<03608>>20355000
      BEGIN                                                    <<03608>>20360000
         CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,             <<03608>>20365000
                        BOOTXSAVEADDR,OVERLAYADDR,             <<03608>>20370000
                        BANK1SAVEADDR,SDFCODEADDR);            <<03608>>20375000
      END                                                      <<03608>>20380000
                                                               <<03608>>20385000
   ELSE IF DTDEVICETYPE = CS80TYPE THEN                        <<03608>>20390000
                                                               <<03608>>20395000
      BEGIN                                                    <<03608>>20400000
         CONFIGURE'CS80'BOOTS(DESTDEV,DEVTIPE,BOOTXADDR,       <<03608>>20405000
                              BOOTXSAVEADDR,OVERLAYADDR,       <<03608>>20410000
                              BANK1SAVEADDR,SDFCODEADDR);      <<03608>>20415000
      END                                                      <<03608>>20420000
                                                               <<03608>>20425000
   ELSE IF DTDEVICETYPE = SERIALDISC THEN                      <<03608>>20430000
                                                               <<03608>>20435000
      BEGIN                                                    <<03608>>20440000
         CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,             <<03608>>20445000
                        BOOTXSAVEADDR,OVERLAYADDR,             <<03608>>20450000
                        BANK1SAVEADDR,SDFCODEADDR);            <<03608>>20455000
      END                                                      <<03608>>20460000
   ELSE ERROREXIT(BADDEVICE);                                  <<03608>>20465000
                                                               <<03608>>20470000
END;                                                           <<03608>>20475000
$PAGE                                                          <<03608>>20480000
<<****************************************************>>       <<03608>>20485000
<<****************************************************>>       <<03608>>20490000
<<*                                                  *>>       <<03608>>20495000
<<*              SDFINIT  MAIN LINE                  *>>       <<03608>>20500000
<<*                                                  *>>       <<03608>>20505000
<<****************************************************>>       <<03608>>20510000
<<****************************************************>>       <<03608>>20515000
                                                               <<03608>>20520000
ARITRAP(DISABLETRAPS);                                                  20525000
IF MODE = CLEARBACKUP THEN                                              20530000
   ERASEBACKUP                                                          20535000
ELSE                                                                    20540000
   BEGIN                                                                20545000
   CPUTYPE:=THISCPU;                                           <<01573>>20550000
   IF CPUTYPE=ICF25 OR CPUTYPE=ICF44 OR CPUTYPE=ICF55          <<01573>>20555000
      OR CPUTYPE=MM OR MODE=BACKUPMODE THEN                    <<M8067>>20560000
      BEGIN                                                             20565000
      OPENSDFILE(SDFILENUM,DEVTIPE,LABELADDR);                          20570000
      IF MODE = BACKUPMODE THEN                                         20575000
         BEGIN                                                          20580000
         <<1. COPY SDF'S CONTENTS TO A SERIAL DISC                      20585000
           2. THEN CONFIGURE IT INSTEAD OF THE ORIGINAL SDF FILE.       20590000
         >>                                                             20595000
         GENERATEBACKUPSDF(BACKUPFILENUM,DESTDEV,DEVTIPE,      <<03011>>20600000
                           SDFILEADDR);                        <<03011>>20605000
         FCLOSE(SDFILENUM,0,0);                                         20610000
         SDFILENUM:=0;                                                  20615000
         END                                                            20620000
      ELSE                                                              20625000
         BEGIN                                                          20630000
         ASSEMBLE(RSW);                                                 20635000
         IF TOS = 0 THEN DEBUG;                                         20640000
         EXTRACTFILEADDR(LABELADDR,DESTDEV,SDFILEADDR);                 20645000
         IF DESTDEV <> SYSTEMDISC THEN ERROREXIT(UGLYSDFLDEV);          20650000
         END;                                                           20655000
      <<BASED ON THE SDF SECTOR START ADDRESS >>               <<03011>>20660000
      <<CALCULATE THE SECTOR ADDRESS OF THE MAJOR>>            <<03011>>20665000
      <<SECTIONS OF THE SDF FILE. (IE. BOOTX,  >>              <<03011>>20670000
      <<BOOTXSAVE,OVERLAYAREA, ETC.           >>               <<03011>>20675000
                                                               <<03011>>20680000
      INITDISCADDR( DEVTIPE, SDFILEADDR, BOOTXADDR,            <<03011>>20685000
                    BOOTXSAVEADDR,SDFMAPADDR,OVERLAYADDR,      <<03011>>20690000
                    BANK1SAVEADDR, SDFCODEADDR );              <<03011>>20695000
                                                               <<03011>>20700000
                                                               <<03011>>20705000
      CONFIGURE'SDFMAP (SDFMAPADDR);                           <<03011>>20710000
        <<BUILD STORAGE MAP RECORDS AND WRITE MAP TO DISC>>    <<03011>>20715000
                                                               <<03011>>20720000
   <<CONFIGURE AND STORE THE BOOT PROGRAMS OUT TO THE DEVICE>> <<03608>>20725000
   PUT'BOOTS'ON'DEV(DESTDEV,DEVTIPE);                          <<03608>>20730000
      IF MODE <> BACKUPMODE THEN                                        20735000
        PROCESSCOMMANDFILE(CMDEV,CMDFILEADDR,CMDFILELEN,DUMPDEV,        20740000
           DUMPFILEADDR,DUMPFILELEN);                                   20745000
                                                               <<03608>>20750000
      CONFIGURESDF(DESTDEV,SDFCODEADDR,OVERLAYADDR,CMDEV,CMDFILEADDR,   20755000
         CMDFILELEN,DUMPDEV,DUMPFILEADDR,DUMPFILELEN);                  20760000
      FCLOSE(SDFILENUM,0,0);                                            20765000
      END;                                                              20770000
   END;                                                                 20775000
ERROREXIT(SUCCESSFUL);                                                  20780000
END  <<SDFINIT>>;                                                       20785000
$PAGE                                                          <<00694>>20790000
INTEGER PROCEDURE IOTABLEINFO(CODE,P1,P2);                     <<00694>>20795000
  VALUE CODE,P1,P2;                                            <<00694>>20800000
  INTEGER CODE,P1,P2;                                          <<00694>>20805000
  option privileged,uncallable;                                <<02637>>20810000
                                                               <<00694>>20815000
COMMENT:                                                       <<00694>>20820000
   IOTABLEINFO IS DESIGNED PRIMARILY TO INTERFACE "MEASIO" TO  <<00694>>20825000
   THE SERIES III AND SERIES 33 I/O TABLES. IT WILL RETURN A   <<00694>>20830000
   VALUE BASED ON THE "CODE" SUPPLIED.                         <<00694>>20835000
   CURRENT "CODE" ASSIGNMENTS ARE:                             <<00694>>20840000
                                                               <<00694>>20845000
     1 => RETURN LDEV # FOR A GIVEN UNIT NUMBER ON A GIVEN     <<00694>>20850000
          CONTROLLER.                                          <<00694>>20855000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>20860000
             P2 = UNIT NUMBER ON THIS CONTROLLER               <<00694>>20865000
     2 => RETURN THE NUMBER OF UNITS ON A GIVEN CONTROLLER.    <<00694>>20870000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>20875000
     3 => RETURN TRUE/FALSE IF "MEASIO" WAS/NOT ENABLED ON A   <<00694>>20880000
          GIVEN DEVICE.                                        <<00694>>20885000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>20890000
             P2 = LDEV                                         <<00694>>20895000
;                                                              <<00694>>20900000
                                                               <<00694>>20905000
BEGIN                                                          <<00694>>20910000
  EQUATE                                                       <<00694>>20915000
      IDITP      = 14,                                         <<00694>>20920000
      ISIOP      = 8,                                          <<00694>>20925000
      ISTAP      = 9,                                          <<00694>>20930000
      MIO'ENABLE = 8,                                          <<00694>>20935000
      MIO'LDEV   = 70;                                         <<00694>>20940000
  DEFINE                                                       <<00694>>20945000
      ILTP      = ABS(P1+SYSDB+DILTP)+SYSDB#, <<ABS LOC ILTP>> <<00694>>20950000
      DITP      = ABS(ILTP+IDITP+P2)+SYSDB#; <<ABS LOC DIT>>   <<00694>>20955000
  INTEGER                                                      <<00694>>20960000
      I;                                                       <<00694>>20965000
                                                               <<00694>>20970000
                                                               <<00694>>20975000
  IOTABLEINFO := 0;                                            <<00694>>20980000
                                                               <<00694>>20985000
  IF CODE = 1 THEN                                             <<00694>>20990000
     BEGIN                                                     <<01577>>20995000
     IF ABS(DITP) <> 0 THEN                                    <<01577>>21000000
        IOTABLEINFO := ABS(DITP+DLDEV).(8:8); <<LDEV>>         <<01577>>21005000
     END                                                       <<01577>>21010000
  ELSE IF CODE = 2 THEN                                        <<00694>>21015000
    IOTABLEINFO:=ABS(ILTP+ISTAP)+SYSDB-(ILTP+IDITP) <<UNITS>>  <<00694>>21020000
  ELSE IF CODE = 3 THEN                                        <<00694>>21025000
  BEGIN                                                        <<00694>>21030000
    I := ABS(ILTP+ISIOP)+SYSDB;                                <<00694>>21035000
    IF ABS(I+MIO'LDEV).(8:8) = P2 AND    <<MIO'LDEV>>          <<00694>>21040000
       ABS(P1+SYSDB+MIO'ENABLE) = "OK" THEN  <<MIO'ENABLE>>    <<00694>>21045000
       IOTABLEINFO := 1;   <<SET TRUE>>                        <<00694>>21050000
  END;                                                         <<00694>>21055000
END;                                                           <<00694>>21060000
$PAGE "OUTER BLOCK"                                                     21065000
$CONTROL SEGMENT=MAIN                                                   21070000
END.  <<NON RESIDENT I/O SERVICE ROUTINES>>                             21075000
