$CONTROL MAP,CODE,USLINIT                                               00010000
  <<   3/25/77  NRIO,MODULE 62 - NON RESIDENT I/O ROUTINES >>           00012000
<< HP32033C MPE SOURCE C.00.00 >>                                       00014000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00016000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00018000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00020000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00022000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00024000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00026000
$TITLE "DEC 27 ,1975  S62  NON CORE RESIDENT I/O ROUTINES"              00028000
$CONTROL PRIVILEGED, MAIN = NRIO ,SEGMENT = NRIO                        00030000
$TP                                                                     00032000
                                                                        00034000
BEGIN    << NON CORE RESIDENT I/O  ROUTINES >>                          00036000
                                                                        00038000
EQUATE                                                                  00040000
    ABORT'    =  0,        << ABORT THIS I/O REQUEST >>                 00042000
    ABORT'IO  = 66,      << SCCP ABORTIO AND PROCIO FUNCTION >><<00.TE>>00044000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00046000
    CCE       = 2,                                                      00048000
    CCG       = 0,                                                      00050000
    CCL       = 1,                                                      00052000
    CPCB      = 4,         << CURRENT PCB INDEX >>                      00054000
    CR        =%15,                                                     00056000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00058000
    DCULOG'DSTSIZE =%12200,<< Size of DST for DCU logging>>    <<04452>>00060000
    DDLTP     = 4,         << DLT POINTER >>                            00062000
    DELECHO'  = 2,         << CHARACTER DELETION ECHO CODE >>           00064000
    DILTP     = 5,         << ILT POINTER >>                            00066000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00068000
    DISC'     =  1,        << DEVICE IS A DISC (DIT) >>                 00070000
    DLAST     =23,                                             <<00.06>>00072000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00074000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00076000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00078000
    DSTATE'   =12,         << DEVICE STATE                              00080000
                               0 - NULL         %10 - EOR SYNC          00082000
                               1 - WRITING      %11 - WRITE BUF FILL    00084000
                               2 - READING      %12 - DELETE LF OR CHAR 00086000
                               3 - XON WRITE    %13 - DELETE CR         00088000
                               4 - READ TURN    %14 - DELETE !'S        00090000
                               5 - BAND WAIT    %15 - WRT TURN DONE     00092000
                               6 - EOR LF       %16 - START READ        00094000
                               7 - EOR CR       %17 - FINISH READ  >>   00096000
    DSTAT     = 6,         << LAST HARDWARE INTERRUPT STATUS >>         00098000
    DSIZE     = 5,         << DEVICE TYPE >>                            00100000
    DSYNC     =29,         << CR,LF SYNC DATA AND SYNC COUNTER >>       00102000
    DTYPE     = 7,         << STOP FLAGS, TERMTYPE, HSTATE,TIMER FLAGS>>00104000
    ECHOOFF   = 0,         << TURN ECHO OFF CODE TO MPXCONTROL >>       00106000
    FIRSTINDEX= 8,         << INDEX TO FIRST BUFFER OF TABLE >>         00108000
    GOODIO    = 1,         << SUCCESSFUL I/O STATUS RETURN >>           00110000
    HP2645K  = 12,         <<HP2645K 8-BIT TTYPE>>             <<AMS00>>00112000
    HSI       = 19,        << HSI DEVICE TYPE >>               <<00.TE>>00114000
    IAK'      = 8,         << DEVICE HAS INTERRUPTED (DIT) >>           00116000
$CONTROL USLINIT,CODE,MAP                                      <<03011>>00118000
    ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>        <<00.TP>>00120000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00122000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00124000
    IOQSIZE   =11,         << IOQ ELEMENT SIZE >>                       00126000
    JUNKWAIT  = %20,                                                    00128000
    LIM       = 0,         << LIMIT WORD OF TABLE ALLOCATION >>         00130000
    MHDISC    = 1,         << MOVING HEAD DISC TYPE >>         <<00.TE>>00132000
    NOPCB     = %13,       << NO PCB I/O REQUEST >>            <<00.TE>>00134000
    NOIMPEDE  = 0,         << AWAKEIO CALLER MAY NOT BE IMPEDED >>      00136000
    NOPTY'    = 2,         <<8-BIT DATA  FLAG-->>              <<AMS00>>00138000
                           <<SET IN 8TH BIT>>                  <<AMS00>>00140000
    NULL      = 0,                                                      00142000
    PARITYBITS'=7,     <<1ST PRTY CNTRL BIT IN DCNTRL>>        <<+1.M3>>00144000
    PCBB      = 3,         << BASE OF PCB TABLE >>                      00146000
    PCBSIZE   =16,                                                      00148000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00150000
    QLDEV     = 2,        << LDEV INDEX IN IOQ >>              <<00.05>>00152000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00154000
    READFUNC  = 0,         << READ FUNCTION CODE >>                     00156000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>      <<00.03>>00158000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00160000
    SSLC      = 18,        << SSLC DEVICE TYPE >>              <<00.TE>>00162000
    SYSDB     =%1000,                                                   00164000
    SYNCCHAR  =%47777,     << SYNC CHARACTER  >>                        00166000
    SYSDISK   = 1,         << SYSTEM DISK LOGICAL DEVICE # >>           00168000
    SYSCST    = 1,                                                      00170000
    SYSDST    = 2,                                                      00172000
    SYSIOQ    = 5,        << IOQ TABLE PTR SYSDB INDEX >>      <<00.05>>00174000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00176000
    SYSSBUF   = 6,                                                      00178000
    TELENET   = 13,        << TELENET TERMINAL TYPE >>                  00180000
    TERMINAL' = 0,         << DEVICE IS A TERMINAL >>                   00182000
    THEAD     = 2,         << HEAD INDEX  >>                            00184000
    TOVRFL    = 5,         << OVERFLOW OF PRIMARY TABLE COUNTER >>      00186000
    TRQSTS    = 3,         << REQUEST FOR ELEMENTS COUNTER, DOUBLE >>   00188000
    TR1       = TRQSTS*2,  << MSW OF REQUEST CNTR >>                    00190000
    TR2       = TR1+1,     << LSW OF REQUEST CNTR >>                    00192000
    TSIZE     = 1,         << ELEMENT SIZE AND IMPEDED PCB >>           00194000
    TTAIL     = 3,         << INDEX OF LAST ELEMENT  >>                 00196000
    TUSE      = 4,         << MAX IN USE AND CURRENT IN USE >>          00198000
    UNDEFINED =%37,        << UNDEFINED TERMINAL TYPE >>                00200000
    WRTCHAN   =-1,         << FLAG TO INDICATE WRITE CHANNEL MPXCNTRL >>00202000
    Y'C       =%31,        << CONTROL Y >>                              00204000
  ENDEQ       = 0;                                                      00206000
                                                                        00208000
  DEFINE                                                                00210000
    ABORT     =(ABORT':1)#,<< QFLAG, REQUEST IS TO BE ABORTED >>        00212000
    ABS       = ABSOLUTE#,                                              00214000
    ASMB      = ASSEMBLE#,                                              00216000
    CC        =( 6:2)#,    << CONDITION CODE FIELD IN STATUS >>         00218000
    COMPLETED = (6:1)#,    << REQUEST COMPLETED BY DRIVER >>   <<00.TE>>00220000
    CHARMASK  =( 8:8)#,                                                 00222000
    CRSYNCS   =( 4:6)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>00224000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>00226000
    DEVTYPE   =(8:8)#,     << DEVICE TYPE OF DLT >>                     00228000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     00230000
    DSTATE    =(DSTATE'  :4)#,                                          00232000
    DUPLICATE =ASSEMBLE( DUP     )#,                                    00234000
    EIGHTBITS = (8:1)#,    <<8-BIT PROTOCOL,PARITY DISALLOWED>>         00236000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     00238000
    ECHO      =( 3:1)#,    << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00240000
    ESIZE     =(8:8)#,     << TABLE ENTRY SIZE >>                       00242000
    IAK       =(IAK':1)#,                                               00244000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         00246000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           00248000
                               1 - 240 CPS         5 - 15 CPS           00250000
                               2 - 120 CPS         6 - 10 CPS           00252000
                               3 -  60 CPS         7 - 14 CPS  >>       00254000
    INUSE     =(8:8)#,     << NUMBER OF ELEMENTS CURRENTY IN USE >>     00256000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00258000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           00260000
    LIMIT1    =(8:8)#,     << PRIMARY TABLE SIZE  >>                    00262000
    LIMIT2    =(0:8)#,     << TOTAL TABLE SIZE >>                       00264000
    MAXENTRY  =( 0:8)#,    << ENTRIES IN LPDT >>                        00266000
    MAXUSE    =( 0:8)#,    << MAXIMUM TABLE ENTRIES USED >>             00268000
    MSGREPLY  =(15:1)#,  << MESSAGE REPLY BIT OF IOQ >>                 00270000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                00272000
                                0 - HARDWIRED   2 - 202C                00274000
                                1 - 103         3 - 2002   >>           00276000
    NOPTY     =(NOPTY':1)#,<<8-BIT DATA FLAG-->>               <<AMS00>>00278000
                           <<NO PARITY SET IN 8TH BIT>>        <<AMS00>>00280000
    NOSYNC    =( 7:1)#,    << NO SYNC TERMINAL, USES ENQ AND ACK >>     00282000
    OUTSPEED  =( 6:4)#,    << OUTPUT SPEED AND CHARACTER SIZE CODE      00284000
                               SEE INSPEED FOR MEANING >>               00286000
    PARITYBITS=(PARITYBITS':2)#,<<PRTY CNTRL BITS>>            <<+1.M3>>00288000
    PCBIO    =IOQP(QSTAT).PCBN<>0#,<<TRUE IF PROC. RELATED IO>><<00.TE>>00290000
    PCBN      =( 0:8)#,    << QSTAT, PCB NUMBER >>                      00292000
    PDISABLE  = ASMB(PSDB)#,                                   <<00.05>>00294000
    PENABLE   = ASMB(PSEB)#,                                   <<00.05>>00296000
    QABORTS   = (11:1)#,   << Q ABORTS RATHER THAN SET BITS >> <<00.TE>>00298000
    QLDEVN    =(8:8)#,     << LOGICAL DEVICE # FIELD OF I/O REQ >>      00300000
    RBYTE     =(8:8)#,                                                  00302000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS<<00.02>>00304000
    SPDSENSING = (4:1)#,   << DEVICE IS IN SPEED SENSING MODE    01.01>>00306000
    SPEEDF    =(10:6)#,    << SPEED INDEX FIELD IN TERM TABLE >>        00308000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  00310000
    TFIELD    =(11:5)#,    << TERM TYPE FIELD IN TERMTABLE >>           00312000
    TERMSPEED =(12:4)#,    << PRECONFIGURED TERMINAL SPEED >>  <<00.06>>00314000
    TERMINALTYPE=( 0:7)#,  << DEFAULT TERMINAL TYPE >>         <<00.06>>00316000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            00318000
    UNIT      =( 3:5)#,    << DLDEV, UNIT NUMBER >>                     00320000
    UP        =( 1:1)#,    <<ONLINE, SPEED SENSED, CAN DO I/O >>        00322000
    ENDDEF    = 0#;                                                     00324000
                                                                        00326000
                                                                        00328000
                                                                        00330000
                                                                        00332000
    INTEGER POINTER PS0 = S-0,  PS1 = S-1;                              00334000
    POINTER LPS0 = S-0;                                                 00336000
    INTEGER S0 = S-0, S1 = S-1, X = X;                                  00338000
                                                                        00340000
    INTEGER RSTATUS = Q -1;   << PCAL RETURN STATUS >>                  00342000
                                                                        00344000
    INTEGER ARRAY WA0(*) = DB + 0;                                      00346000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    00348000
     INTEGER ARRAY IOQ(@) = DB + SYSIOQ;                       <<00.05>>00350000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               00352000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               00354000
    INTEGER POINTER LPDTP = 8;<<LOAD/STORE LPDT SYSTEM TABLE >><<00.TE>>00356000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               00358000
                                                                        00360000
    INTEGER ARRAY DST (@) = DB + SYSDST;                                00362000
                                                                        00364000
    INTEGER DSETB = DB+%66;                                             00366000
$PAGE " EXTERNAL PROCEDURE DECLARATIONS    JUNE 28, 1974"               00368000
                                                                        00370000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS);    00372000
  VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                       00374000
  INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                     00376000
  OPTION EXTERNAL;                                                      00378000
                                                                        00380000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       00382000
  VALUE PCBPT, N, WAITF;                                                00384000
  INTEGER PCBPT, N, WAITF;                                              00386000
  OPTION EXTERNAL;                                                      00388000
                                                                        00390000
PROCEDURE AWAKEIO(DITP,IMPDFLAG);                                       00392000
  VALUE DITP, IMPDFLAG;  INTEGER IMPDFLAG;                              00394000
  INTEGER POINTER DITP;                                                 00396000
  OPTION EXTERNAL;                                                      00398000
                                                                        00400000
PROCEDURE CHECKLDEV(LDEV);                                              00402000
  VALUE LDEV;  INTEGER LDEV;                                            00404000
  OPTION EXTERNAL;                                                      00406000
  <<                                                                    00408000
     RETURN:  CCE - SIO DEVICE                                          00410000
              CCG - TERMINAL                                            00412000
              CCL - INVALID DEVICE                                      00414000
  >>                                                                    00416000
                                                                        00418000
PROCEDURE DSETCONTROL(CONTROL,DITP);                                    00420000
  VALUE CONTROL;    INTEGER CONTROL;                                    00422000
  ARRAY DITP;    OPTION EXTERNAL;                                       00424000
                                                                        00426000
INTEGER PROCEDURE EXCHANGEDB(DST);                             <<01201>>00428000
  VALUE DST;                                                   <<01201>>00430000
  INTEGER DST;                                                 <<01201>>00432000
  OPTION EXTERNAL;                                             <<01201>>00434000
                                                               <<01201>>00436000
INTEGER PROCEDURE GENMSG(A,B,C,D,E,F,G,H,I,J,K,L,M);           <<0U.EB>>00438000
   VALUE A,B,C,D,E,F,G,H,I,J,K,L,M;                            <<0U.EB>>00440000
   INTEGER A,B,C,D,E,F,G,H,I,J,K,L,M;                          <<0U.EB>>00442000
   OPTION EXTERNAL,VARIABLE;                                   <<0U.EB>>00444000
                                                               <<0U.EB>>00446000
INTEGER PROCEDURE GETDEVINFO(DEVICE,DEVINFO);                  <<SP.03>>00448000
   BYTE ARRAY DEVICE;                                          <<SP.03>>00450000
   INTEGER ARRAY DEVINFO;                                      <<SP.03>>00452000
   OPTION EXTERNAL;                                            <<SP.03>>00454000
                                                               <<SP.03>>00456000
PROCEDURE HELP;   OPTION EXTERNAL;                                      00458000
                                                                        00460000
PROCEDURE IOFAILURE(DRTN,DITP);                                         00462000
  VALUE DRTN;    INTEGER DRTN;                                          00464000
  ARRAY DITP;    OPTION  EXTERNAL;                                      00466000
                                                                        00468000
PROCEDURE IOIMPEDE(TBASE);                                              00470000
  VALUE TBASE;  INTEGER TBASE;                                          00472000
  OPTION EXTERNAL;                                                      00474000
                                                                        00476000
PROCEDURE LOG; OPTION EXTERNAL;                                         00478000
                                                                        00480000
PROCEDURE MPXCONTROL(FUNCTION,DITP);                                    00482000
  VALUE FUNCTION;   INTEGER FUNCTION;                                   00484000
  ARRAY DITP;    OPTION EXTERNAL;                                       00486000
                                                                        00488000
PROCEDURE MPXWRITE(DATA,DITP);                                          00490000
  VALUE DATA;   INTEGER DATA;                                           00492000
  ARRAY DITP;   OPTION EXTERNAL;                                        00494000
                                                                        00496000
PROCEDURE RESETDB(OLDDB);                                               00498000
  VALUE OLDDB;  INTEGER OLDDB;                                          00500000
  OPTION EXTERNAL;                                                      00502000
                                                                        00504000
PROCEDURE RETURNIOQ(PNTR);                                              00506000
  VALUE PNTR;   INTEGER POINTER PNTR;                                   00508000
  OPTION EXTERNAL;                                                      00510000
                                                                        00512000
PROCEDURE RETURNTBUF(BPTR);                                             00514000
  VALUE BPTR;                                                           00516000
  POINTER BPTR;                                                         00518000
  OPTION EXTERNAL;                                                      00520000
                                                                        00522000
INTEGER PROCEDURE SETSYSDB;  OPTION EXTERNAL;                           00524000
                                                                        00526000
PROCEDURE SUDDENDEATH(NUMBER);                                          00528000
  VALUE NUMBER;  INTEGER NUMBER;                                        00530000
  OPTION EXTERNAL;                                                      00532000
                                                                        00534000
PROCEDURE WAIT(WAITFIELD,WAITTYPE);                                     00536000
  VALUE WAITFIELD, WAITTYPE;                                            00538000
  INTEGER WAITFIELD, WAITTYPE;                                          00540000
  OPTION EXTERNAL;                                                      00542000
                                                               <<00.05>>00544000
DOUBLE PROCEDURE WAITFORIO(IOQX);                              <<00.05>>00546000
   VALUE IOQX; INTEGER IOQX;                                   <<00.05>>00548000
   OPTION EXTERNAL;                                            <<00.05>>00550000
                                                               <<SP.03>>00552000
INTEGER PROCEDURE THISCPU;                                     <<HM.00>>00554000
OPTION EXTERNAL;                                               <<HM.00>>00556000
                                                               <<HM.00>>00558000
LOGICAL PROCEDURE GETCLASS(BUF,EVERYTHING,CLADR,CLINX,CLNAME); <<HM.00>>00560000
VALUE EVERYTHING,CLADR,CLINX;                                  <<HM.00>>00562000
INTEGER CLADR,CLINX;                                           <<HM.00>>00564000
LOGICAL EVERYTHING;                                            <<HM.00>>00566000
INTEGER ARRAY CLNAME,BUF;                                      <<HM.00>>00568000
OPTION VARIABLE,EXTERNAL;                                      <<HM.00>>00570000
                                                               <<HM.00>>00572000
INTEGER PROCEDURE FINDSDISCGAP(LDEV,BLOCK,ADR,LEN);            <<HM.00>>00574000
VALUE LDEV,BLOCK;                                              <<HM.00>>00576000
INTEGER LDEV,BLOCK;                                            <<HM.00>>00578000
DOUBLE ADR,LEN;                                                <<HM.00>>00580000
OPTION VARIABLE,EXTERNAL;                                      <<HM.00>>00582000
                                                               <<HM.00>>00584000
procedure SENDMSG(DESTPIN,DESTPORT,MSGLEN,FLAGS);              <<02803>>00586000
value DESTPIN,DESTPORT,MSGLEN,FLAGS;                           <<02803>>00588000
integer DESTPIN,DESTPORT,MSGLEN;                               <<02803>>00590000
logical FLAGS;                                                 <<02803>>00592000
option external;                                               <<02803>>00594000
                                                               <<02803>>00596000
logical procedure PORTSTATUS(PORTNUMBER);                      <<02803>>00598000
value PORTNUMBER;                                              <<02803>>00600000
integer PORTNUMBER;                                            <<02803>>00602000
option external;                                               <<02803>>00604000
                                                               <<02803>>00606000
procedure RECEIVEMSG(PORTNUM,MSGLEN,FLAGS);                    <<02803>>00608000
value PORTNUM,MSGLEN,FLAGS;                                    <<02803>>00610000
integer PORTNUM,MSGLEN;                                        <<02803>>00612000
logical FLAGS;                                                 <<02803>>00614000
option external;                                               <<02803>>00616000
                                                               <<02803>>00618000
procedure RETURNSBUF(IX);                                      <<02803>>00620000
value IX; integer IX;                                          <<02803>>00622000
option external;                                               <<02803>>00624000
                                                               <<02803>>00626000
integer procedure GETDATASEG(SIZE,VMALLOC);                    <<02803>>00628000
value SIZE,VMALLOC;                                            <<02803>>00630000
integer SIZE,VMALLOC;                                          <<02803>>00632000
option external;                                               <<02803>>00634000
                                                               <<02803>>00636000
procedure RETURNSYSBUF(INDEX);                                 <<02803>>00638000
value INDEX;                                                   <<02803>>00640000
integer INDEX;                                                 <<02803>>00642000
option external;                                               <<02803>>00644000
                                                               <<02803>>00646000
double procedure IOSTATUS(IOQX);                               <<02803>>00648000
value IOQX;                                                    <<02803>>00650000
integer IOQX;                                                  <<02803>>00652000
option external;                                               <<02803>>00654000
                                                               <<02803>>00656000
procedure RELDATASEG(INDEX);                                   <<02803>>00658000
value INDEX;                                                   <<02803>>00660000
integer INDEX;                                                 <<02803>>00662000
option external;                                               <<02803>>00664000
                                                               <<02803>>00666000
integer procedure GETSIR(SIRNUM);                              <<02803>>00668000
value SIRNUM;  logical SIRNUM;                                 <<02803>>00670000
option external;                                               <<02803>>00672000
                                                               <<02803>>00674000
procedure RELSIR(SIRNUM,A);                                    <<02803>>00676000
value SIRNUM,A;  logical SIRNUM,A;                             <<02803>>00678000
option external;                                               <<02803>>00680000
                                                               <<02803>>00682000
procedure UNIMPEDE(PCBPT);                                     <<02803>>00684000
value PCBPT;  integer PCBPT;                                   <<02803>>00686000
option external;                                               <<02803>>00688000
                                                               <<02803>>00690000
integer procedure GETSBUF(TYPE);                               <<02803>>00692000
value TYPE;  integer TYPE;                                     <<02803>>00694000
option external;                                               <<02803>>00696000
                                                               <<02803>>00698000
double procedure TIMER;                                        <<02803>>00700000
option external;                                               <<02803>>00702000
                                                               <<02803>>00704000
procedure ABORTTIMEREQ(TRLX);                                  <<02803>>00706000
value TRLX;  integer TRLX;                                     <<02803>>00708000
option external;                                               <<02803>>00710000
                                                               <<02803>>00712000
integer procedure TIMEREQ(CODE,REQ,TIME);                      <<02803>>00714000
value CODE, REQ, TIME;                                         <<02803>>00716000
double TIME;                                                   <<02803>>00718000
integer CODE, REQ;                                             <<02803>>00720000
option external;                                               <<02803>>00722000
                                                               <<02803>>00724000
procedure MPE'TABLE'FULL(INX);                                 <<02803>>00726000
value INX;   integer INX;                                      <<02803>>00728000
option external;                                               <<02803>>00730000
                                                               <<02803>>00732000
procedure LOG15(I,J,K,L);                                      <<02803>>00734000
value I,J,K,L;                                                 <<02803>>00736000
logical I,J,K,L;                                               <<02803>>00738000
option external;                                               <<02803>>00740000
                                                               <<02803>>00742000
procedure LOG46(I,J,K,L,M,N,O,P,Q,R,S);                        <<03101>>00744000
value I,J,K,L,M,N,O,P,Q,R,S;                                   <<03101>>00746000
logical I,J,K,L,M,N,O,P,Q,R,S;                                 <<03101>>00748000
option external;                                               <<03101>>00750000
                                                               <<03101>>00752000
procedure LOG47(I,J,K,L,M,N);                                  <<03101>>00754000
value I,J,K,L,M,N;                                             <<03101>>00756000
logical I,J,K,L,M,N;                                           <<03101>>00758000
option external;                                               <<03101>>00760000
                                                               <<03101>>00762000
procedure IOFREEZE'(SEG);                                      <<04187>>00764000
value SEG;                                                     <<04187>>00766000
integer SEG;                                                   <<04187>>00768000
option external;                                               <<04187>>00770000
                                                               <<04187>>00772000
procedure IOUNFREEZE'(SEG);                                    <<04187>>00774000
value SEG;                                                     <<04187>>00776000
integer SEG;                                                   <<04187>>00778000
option external;                                               <<04187>>00780000
                                                               <<04187>>00782000
logical procedure IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,      <<04187>>00784000
     P5,DEST,REPLY,OFFSET,DITP,IOTYPE);                        <<04187>>00786000
value SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,              <<04187>>00788000
     OFFSET,DITP,IOTYPE;                                       <<04187>>00790000
integer SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,            <<04187>>00792000
     OFFSET,IOTYPE;                                            <<04187>>00794000
integer pointer DITP;                                          <<04187>>00796000
option variable,external;                                      <<04187>>00798000
                                                               <<04187>>00800000
INTRINSIC                                                      <<HM.00>>00802000
   FOPEN,FCLOSE,FREAD,FWRITE,FCONTROL,FREADDIR,DEBUG,          <<HM.00>>00804000
   FGETINFO,FCHECK,PRINTFILEINFO,PRINT,BINARY,ARITRAP,ASCII;   <<HM.00>>00806000
$PAGE  "NON CORE RESIDENT I/O SERVICE ROUTINES"                         00808000
                                                               <<01201>>00810000
                                                               <<01201>>00812000
LOGICAL PROCEDURE DEVICESTATUS(LDEV);                          <<01201>>00814000
  VALUE  LDEV;   INTEGER LDEV;                                 <<01201>>00816000
  OPTION UNCALLABLE, PRIVILEGED;                               <<01201>>00818000
                                                                        00820000
<< THIS PROCEDURE RETURNS THE HARDWARE INTERRUPT STATUS                 00822000
   FOR DEVICES OTHER THAN TERMINALS. FOR SERIES 2/3 I/O                 00824000
   TYPE, STATUS IS GOTTEN FROM THE DIT TABLE, WORD 6.                   00826000
   FOR HPIB I/O TYPE, STATUS IS RETURNED BY USING AN                    00828000
   ATTACHIO CALL WITH A FUNCTION CODE OF 15.                            00830000
                                                                        00832000
     RETURNS:  CCE - DEVICE STATUS RETURNED                             00834000
               CCL - INVALID LDEV OR A TERMINAL      >>                 00836000
                                                                        00838000
  BEGIN                                                        <<01201>>00840000
    INTEGER SAVST;  << STATUS REGISTER >>                      <<01201>>00842000
    INTEGER CCODE;  << CONDITION CODE >>                       <<01201>>00844000
    INTEGER DBSAVE;  << DB SAVED >>                            <<01201>>00846000
    DOUBLE LPDTENTRY;  << LOGICAL DEV LPTD ENTRY >>            <<01201>>00848000
    INTEGER POINTER DITP = LPDTENTRY;  << DITP >>              <<01201>>00850000
    INTEGER DEVST;  << STATUS RETURN >>                        <<01201>>00852000
                                                               <<01201>>00854000
    <<  NOTE:  PROCEDURE ENTERED IN SPLIT STACK MODE >>        <<01201>>00856000
                                                               <<01201>>00858000
    SAVST := RSTATUS;  << SAVE STATUS REGISTER >>              <<01201>>00860000
    CCODE := 1;  << INIT TO CONDITION CODE CCL >>              <<01201>>00862000
    DBSAVE := SETSYSDB;  << SET DB TO SYSDB >>                 <<01201>>00864000
    CHECKLDEV(LDEV);                                           <<01201>>00866000
    IF = THEN    << VALID LDEV, NOT A TERMINAL >>              <<01201>>00868000
      BEGIN  << GET STATUS >>                                  <<01201>>00870000
      LPDTENTRY := LPDTD(LDEV);  << GET DITP >>                <<01201>>00872000
      IF DITP(DLDEV).(0:2)=0 THEN  << CHECK I/O TYPE >>        <<01369>>00874000
        BEGIN  << SERIES 2/3 SYSTEM >>                         <<01201>>00876000
        IF WA0(DITP(DDLTP)+DSIZE).DEVTYPE = 23 THEN            <<01201>>00878000
          << IF PGM CNTRLER, PUT STATUS IN DIT >>              <<01201>>00880000
          ATTACHIO(LDEV,0,0,0,28,0,1,0,1);                     <<01201>>00882000
        DEVICESTATUS := DITP(DSTAT);  << RET. STATUS >>        <<01201>>00884000
        RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>           <<01201>>00886000
        END                                                    <<01201>>00888000
      ELSE                                                     <<01201>>00890000
        BEGIN  << SERIES 33/HPIB >>                            <<01201>>00892000
        RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>           <<01201>>00894000
        DBSAVE := EXCHANGEDB(0);  << SET TO USER DB >>         <<01201>>00896000
        DEVST := 0;  << CLEAR STATUS >>                        <<01201>>00898000
        ATTACHIO(LDEV,0,0,@DEVST,15,1,0,0,1);                  <<01201>>00900000
        DEVICESTATUS := DEVST; << RET.SINGLE STATUS >>         <<01201>>00902000
        EXCHANGEDB(DBSAVE);  << RESET TO SPLIT STACK >>        <<01201>>00904000
        END;                                                   <<01201>>00906000
      CCODE := CCODE + 1;  << SET CCE >>                       <<01201>>00908000
      END ELSE                                                 <<01248>>00910000
      RESETDB(DBSAVE);  << RESET TO SPLIT STACK >>             <<01248>>00912000
    RSTATUS := SAVST;  << RESTORE STATUS >>                    <<01201>>00914000
    RSTATUS.CC := CCODE;  << SET CC IN STAT REG FOR RET >>     <<01201>>00916000
    END;                                                       <<01201>>00918000
                                                               <<01201>>00920000
$PAGE                                                                   00922000
                                                                        00924000
LOGICAL PROCEDURE IOCONTROL(LDEV,FUNCTION);                             00926000
  VALUE   LDEV, FUNCTION;                                               00928000
  INTEGER LDEV, FUNCTION;                                               00930000
  OPTION PRIVILEGED, UNCALLABLE;                                        00932000
                                                                        00934000
  << THIS PROCEDURE GENERATES A BLOCKED CONTROL REQUEST.                00936000
                                                                        00938000
     RETURN: TRUE  - SUCCESSFULLY COMPLETED                             00940000
             FALSE - ERROR OCCURED IN PERFORMING REQUEST                00942000
  >>                                                                    00944000
  BEGIN                                                                 00946000
    TOS := ATTACHIO(LDEV, 0, 0, 0, FUNCTION, 0, 0, 0, 1 );              00948000
    DEL;     << DELETE TRANSFER COUNT >>                                00950000
    IF TOS.STATUS = GOODIO THEN                                         00952000
      IOCONTROL := 1;     << SET TRUE RETURN >>                         00954000
  END;                                                                  00956000
$PAGE   "NON RESIDENT TERMINAL SERVICE ROUTINES"                        00958000
                                                                        00960000
LOGICAL PROCEDURE RESETBREAKBITS(LDEV,BFLAG);                           00962000
  VALUE  LDEV, BFLAG;                                                   00964000
  INTEGER LDEV;  LOGICAL BFLAG;                                         00966000
  OPTION UNCALLABLE, PRIVILEGED;                                        00968000
                                                                        00970000
  <<                                                                    00972000
    THIS PROCEDURE RESETS THE BREAK OR CONTROL Y OCCURED BITS IN        00974000
    THE LPDT AND RETURNS THE PREVIOUS SETTING.                          00976000
                                                                        00978000
    BFLAG:  TRUE  - RESET BREAK BIT                                     00980000
            FALSE - RESET CONTROL Y BIT                                 00982000
                                                                        00984000
    RETURN: TRUE  - BIT WAS SET BEFORE BEING CLEARED                    00986000
            FALSE - BIT WAS CLEAR                                       00988000
  >>                                                                    00990000
  BEGIN                                                                 00992000
    TOS := SETSYSDB;                                                    00994000
                                                                        00996000
    CHECKLDEV(LDEV);                                                    00998000
    IF > THEN    << A TERMINAL >>                                       01000000
      BEGIN                                                             01002000
        DISABLE;                                                        01004000
        TOS := LPDTD(LDEV);                                             01006000
        IF BFLAG THEN TOS.(BREAK':1) := 0                               01008000
          ELSE TOS.(SSBREAK':1) := 0;                                   01010000
        IF <> THEN RESETBREAKBITS := 1;                                 01012000
        LPDTD(X) := TOS;                                                01014000
      END;                                                              01016000
                                                                        01018000
    RESETDB( * );                                                       01020000
  END;   <<  RESET BREAK BITS >>                                        01022000
$PAGE                                                                   01024000
                                                                        01026000
                                                                        01028000
PROCEDURE SETTERMTYPE(TYPE,INSPD,OUTSPD,DITP);                          01030000
  VALUE TYPE, INSPD, OUTSPD;                                            01032000
  INTEGER TYPE, INSPD, OUTSPD;                                          01034000
  INTEGER ARRAY DITP;                                                   01036000
  option privileged,uncallable;                                <<02637>>01038000
  <<                                                                    01040000
    THIS PROCEDURE CHECKS FOR VALID TYPE SPECIFICATION AND CHECKS       01042000
    THAT THE SPEEDS ARE ALLOWED FOR THE TYPE SPECIFIED                  01044000
                                                                        01046000
    TYPE   - TERMINAL TYPE AS SPECIFIED IN THE MPE ERS                  01048000
    INSPD   -INPUT SPEED BAUDRATE CODE                                  01050000
             %10 - 960 CPS           6 - 60CPS                          01052000
             %11 - 480 CPS         %15 - 30 CPS                         01054000
               7 - 240 CPS         %16 - 15 CPS                         01056000
             %13 - 120 CPS         %17 - 10 CPS                         01058000
    OUTSPD - OUTPUT SPEED NUMBER                                        01060000
                                                                        01062000
    RETURN - CCL:  IF SPEED OR TYPE INCORRECT                           01064000
             CCE:  NEW TYPE AND/OR SPEEDS SET                           01066000
  >>                                                                    01068000
  BEGIN                                                                 01070000
    INTEGER  TTBASE,  << INDEX IN TERMTABLE TO BASE OF TYPE ENTRY >>    01072000
             NSPEEDS, << NUMBER OF SPEEDS ALLOWED FOR TYPE >>           01074000
             I;                                                         01076000
    LOGICAL POINTER DITPL = DITP;                              <<00637>>01078000
                                                                        01080000
  <<------- TERMINAL SPEED & CAPABILITY DATA ---------->>               01082000
                                                                        01084000
  <<                                                                    01086000
    EACH ENTRY IN THE TERM TYPE TABLE BELOW CONSISTS OF A ONE WORD      01088000
    HEADER FOLLOWED BY ONE TO SIX WORDS, ONE FOR EACH SPEED THAT THE    01090000
    TERMINAL IS CAPABILE OF OPERATING AT.                               01092000
                                                                        01094000
    HEADER.( 0:4) = NUMBER OF DIFFERENT SPEEDS                          01096000
           .(4:2)  = NOT USED                                  <<AMS00  01098000
           .(6:1)  = 8-BIT DATA FLAG SET 2635/45K              <<AMS00  01100000
           .(7:1)  = NO  SYNC FLAG,SET FOR 2635/40/44/45K      <<AMS00  01102000
          .( 8:2) = DELETE RESPONSE CODE                                01104000
                     0 - NULL, 1 - \, 2 - LF, 3 - CNTRL Y               01106000
          .(10:1) = SET IF RESPONDS TO A FORM FEED                      01108000
          .(11:5) = TERM TYPE NUMBER                                    01110000
                                                                        01112000
    SPEEDS.( 0:4) = NUMBER OF LINE FEED SYNCS REQUIRED                  01114000
          .( 4:6) = NUMBER OF CARRIAGE RETURN SYNCS REQUIRED            01116000
          .(10:6) = SPEED NUMBER                                        01118000
                                                                        01120000
    NUMBER OF SYNCS = IF GREATER THAN 7 THEN (N-6)*5           <<00.02  01122000
  >>                                                                    01124000
                                                                        01126000
                                                                        01128000
  INTEGER ARRAY TERMTABLE(0: 8) = PB :=  <<DATAPOINT: TT4>>    <<04245>>01130000
    %100304,%000017,%040016,%040015,%040006,%040013,%040207,   <<04245>>01132000
    %040411,%040410;                                           <<04245>>01134000
                                                               <<00637>>01136000
    ARRAY TT6(0: 8) = PB :=   <<TERMINET>>                     <<01219>>01138000
      %100246,%030017,%050016,%100015,%120006,                 <<01219>>01140000
      %150013,%170007,%170011,%170010;                         <<01219>>01142000
                                                               <<01219>>01144000
    ARRAY TT9(0: 8) = PB :=   <<MINI BEE>>                     <<01219>>01146000
      %100051,%000017,%040016,%040015,%040006,                 <<01219>>01148000
      %040013,%040007,%040011,%040010;                         <<01219>>01150000
                                                               <<00637>>01152000
                                                                        01154000
    ARRAY TT10(0: 8) = PB :=   << HP2640/44:TYPE 10 >>         <<00637>>01156000
       %100452,%000017,%000016,%000015,%000006,%000013,%000007,%11,%10; 01158000
                                                                        01160000
    ARRAY TT11(0: 8) = PB :=   << HP2640/44 WITH FULL "ENTER" SERVICE>> 01162000
       %100453,%000017,%000016,%000015,%000006,%000013,%000007,%11,%10; 01164000
                                                                        01166000
    ARRAY TT12(0: 8) = PB :=   << HP2645K >>                            01168000
       %101454,%000017,%000016,%000015,%000006,%000013,%000007,%11,%10; 01170000
                                                                        01172000
  ARRAY TT13(0: 8) = PB :=  <<TELENET PSEUDO TERMINAL>>        <<04245>>01174000
    %100055,%17,%16,%15,%6,%13,%7,%11,%10;                     <<04245>>01176000
                                                               <<00.06>>01178000
  ARRAY TT15(0: 8) = PB :=  <<HP2635: 8-BIT,NO PTY>>           <<04245>>01180000
    %101657,%17,%16,%15,%6,%13,%7,%11,%10;                     <<04245>>01182000
                                                                        01184000
  ARRAY TT16(0: 8) = PB :=  <<HP2635:7/8 BIT PROTOCOL>>        <<04245>>01186000
    %100660,%17,%16,%15,%6,%13,%7,%11,%10;                     <<04245>>01188000
                                                                        01190000
    ARRAY TT18(0: 8) = PB :=  <<NO DC1 ON READS OR ENQ IN WRITE<<01220>>01192000
      %100062, %17, %16, %15, %6, %13, %7, %11, %10;           <<01619>>01194000
                                                               <<01220>>01196000
  ARRAY TT19(0: 8) = PB :=  <<HP2631: 7-BIT TERM>>             <<04245>>01198000
       %100263, %17, %16, %15, %6, %13, %7, %11, %10;          <<01467>>01200000
                                                               <<01467>>01202000
    ARRAY TT20(0:8) = PB :=   << HP2631B (8-BIT TERM) >>       <<04847>>01204000
       %101264, %17, %16, %15, %6, %13, %7, %11, %10;          <<04847>>01206000
                                                               <<04847>>01208000
    ARRAY TT21(0:8) = PB :=   << HP2631B (7-BIT TERM, W/FIX)>> <<04847>>01210000
       %100265, %17, %16, %15, %6, %13, %7, %11, %10;          <<04847>>01212000
                                                               <<04847>>01214000
    ARRAY TT22(0:8) = PB :=   << HP2631B (8-BIT TERM, W/FIX)>> <<04847>>01216000
       %101266, %17, %16, %15, %6, %13, %7, %11, %10;          <<04847>>01218000
                                                               <<04847>>01220000
  ARRAY TTUNDEFINED(0: 8) = PB :=  <<UNDEFINED TERM TYPE>>     <<04245>>01222000
    %100177,%000117,%040016,%040015,%040006,%040013,%040207,   <<04245>>01224000
    %040411,%040410;                                           <<04245>>01226000
                                                                        01228000
   ARRAY TTEND(0: 0) = PB := 0;  << END OF TERM TYPE TABLE >>           01230000
                                                                        01232000
                                                                        01234000
INTEGER SUBROUTINE CHECKSPEED(SPEEDN);                                  01236000
  VALUE SPEEDN;   INTEGER SPEEDN;                                       01238000
  <<                                                                    01240000
    THIS SUBROUTINE CHECKS THAT THE SPEED IS ALLOWED FOR THE TYPE       01242000
    WHOSE BASE IS INDICATED BY TTBASE. IF NOT IT EXITS THE PROCEDURE    01244000
    OTHERWISE THE SPEED AND SYNC WORD IS RETURNED FROM TERMTABLE        01246000
  >>                                                                    01248000
  BEGIN                                                                 01250000
    I := NSPEEDS;                                                       01252000
    IF SPEEDN<>0 THEN  << SEARCH TERMTABLE FOR SPEED >>                 01254000
      BEGIN                                                             01256000
        X := TTBASE; << SET X TO BASE OF THIS TERM TYPES TABLE >>       01258000
        WHILE TERMTABLE(X:=X+1).SPEEDF<>SPEEDN DO                       01260000
          BEGIN   << STEP TO NEXT SPEED >>                              01262000
            I := I - 1;  << DECREMENT NUMBER OF SPEEDS COUNTER >>       01264000
            IF < THEN ASMB( EXIT 4 );   << END OF SPEEDS, BAD SPEED >>  01266000
          END;                                                          01268000
        CHECKSPEED := TERMTABLE(X);                                     01270000
      END;                                                              01272000
  END;  << CHECK SPEED >>                                               01274000
                                                                        01276000
                                                                        01278000
    X := 0;                                                             01280000
    WHILE TERMTABLE(X).TFIELD<>TYPE DO << FIND TERMINAL TYPE >>         01282000
      BEGIN  << STEP TO NEXT AND CHECK FOR END >>                       01284000
        TOS := TERMTABLE(X)&LSR(12);  << GET ENTRY SIZE -1 >>           01286000
        ASMB(ADAX,INCX);   << STEP TO NEXT >>                           01288000
        IF TERMTABLE(X)=0 THEN RETURN;  << TYPE NOT FOUND, BAD >>       01290000
      END;                                                              01292000
                                                                        01294000
    NSPEEDS := TERMTABLE(X)&LSR(12);  << # OF SPEEDS >>                 01296000
    TTBASE  := X;  << SAVE BASE OF ENTRY FOR TYPE >>                    01298000
                                                                        01300000
    TOS := CHECKSPEED(INSPD);  << GET AND CHECK INPUT SPEED >>          01302000
    TOS := CHECKSPEED(OUTSPD);                                          01304000
                                                                        01306000
    DISABLE;                                                            01308000
    DITP(DSPEED).OUTSPEED := S0;                                        01310000
    TOS.CRSYNC := S0.CRSYNCS;  << MOVE CR SYNC COUNT >>        <<00.02>>01312000
    TOS.SCOUNT := 0;                                           <<02305>>01314000
    DITP(DSYNC) := TOS;   << SET SYNC COUNTS >>                         01316000
    DITP(DSPEED).INSPEED  := TOS;                                       01318000
    IF TYPE=TELENET THEN DITP(DSPEED).ECHO := 0;               <<00.06>>01320000
     DITP(7).(DELECHO':8) := TERMTABLE(TTBASE);                         01322000
       << SET TERMTYPE, DELECHO AND FORMFEED FIELDS IN DTYPE WORD >>    01324000
    DITP(DMODEM).NOSYNC := TERMTABLE(TTBASE).(7:1);                     01326000
    DITP(DLAST).EIGHTBITS := TERMTABLE(TTBASE).(6:1);                   01328000
    IF NOT DITPL(DMODEM).NOSYNC THEN DITP(DSYNC).SCOUNT:=0;    <<00637>>01330000
    RSTATUS.CC := CCE;   << SUCCESSFUL COMPLETION >>                    01332000
  END;   << SET TERM TYPE >>                                            01334000
$PAGE                                                                   01336000
                                                                        01338000
  <<------ CHANNEL INITIALIZATION PROCEDURE ------------>>              01340000
                                                                        01342000
                                                                        01344000
PROCEDURE INITCHANNEL(DITP);                                            01346000
  INTEGER ARRAY DITP;                                                   01348000
  OPTION PRIVILEGED, UNCALLABLE;                                        01350000
  BEGIN                                                                 01352000
    DSETCONTROL(INITDSET,DITP);   << SET CD & SA; MONITOR CC = 1 >>     01354000
                                                                        01356000
    MPXCONTROL(ECHOOFF,DITP);    << INITIALIZE RECEIVE CHANNEL >>       01358000
    MPXCONTROL(WRTCHAN,DITP)       << INITIALIZE SEND CHANNEL >>        01360000
  END;  << INIT CHANNEL >>                                              01362000
                                                                        01364000
                                                                        01366000
                                                                        01368000
<<------------- TERMINAL INITIALIZATION PROCEDURE ------------------->> 01370000
                                                                        01372000
                                                                        01374000
PROCEDURE TERMINIT(DITP);                                               01376000
  INTEGER ARRAY DITP;                                                   01378000
  OPTION PRIVILEGED, UNCALLABLE;                                        01380000
  BEGIN                                                                 01382000
    INTEGER POINTER ILTP = Q+1;                                         01384000
                                                                        01386000
    ARRAY CNTRLWORDS(0: 4) = PB :=                                      01388000
      %120413,   << 1200 BAUD >>                                        01390000
      %120427,   <<  600 BAUD >>                                        01392000
      %120457,   <<  300 BAUD >>                                        01394000
      %120537,   <<  150 BAUD >>                                        01396000
      %121202;   <<  110 BAUD >>                                        01398000
                                                                        01400000
    TOS := DITP(DILTP);  << SET ILTP >>                                 01402000
                                                                        01404000
    IF LOGICAL(DITP.UP) THEN   << POWERFAIL RESTART >>                  01406000
      BEGIN                                                             01408000
        INITCHANNEL(DITP);                                              01410000
        IF DITP.DSTATE<>NULL THEN  << RESTART OPERATION >>              01412000
          MPXWRITE(SYNCCHAR,DITP);                                      01414000
        DSETCONTROL(READING,DITP);  << LOOK FOR LINE DROP >>   <<00.03>>01416000
      END                                                               01418000
    ELSE                                                                01420000
      BEGIN  << INITIALIZE DCNTRL AND SET MODEM TYPE IN DIT >>          01422000
        DITP(DSPEED).OUTSPEED := DITP(DLAST).TERMSPEED;        <<00.06>>01424000
        DITP(DTYPE).TTYPE := DITP(DLAST).TERMINALTYPE;         <<00.06>>01426000
        TOS := DITP(DLDEV).UNIT;                                        01428000
        DITP(DCNTRL) := TOS&LSL(9)+%602;<< CNTRL WORD, GEN ODD <<01.01>>01430000
                                                                        01432000
        TOS := LPDTD(DITP(DLDEV).LDEVN);                                01434000
        DITP(DMODEM).MTYPE := TOS;   << SET MODEM TYPE IN DIT >>        01436000
        IF DITP(DMODEM).MTYPE>3 THEN  << NO SPEED SENSING >>   <<01.01>>01438000
          BEGIN                                                <<01.01>>01440000
            DITP(DSPEED).SPDSENSING := 0;                      <<01.01>>01442000
            DITP(DSPEED).INSPEED := DITP(DSPEED).OUTSPEED;     <<01.01>>01444000
          END;                                                 <<01.01>>01446000
        INITCHANNEL(DITP);  << INITIALIZE CHANNEL >>                    01448000
      END;                                                              01450000
                                                                        01452000
    TOS := ILTP.(8:8);   << GET DRT NUMBER >>                           01454000
                                                                        01456000
    X := 0;                                                             01458000
    DO BEGIN  << INITIALIZE DIAGNOSTIC CHANNELS >>                      01460000
      TOS := CNTRLWORDS(X);                                             01462000
      ASMB( WIO 1 );                                                    01464000
      IF = THEN  << OK ,SEND TO CHANNEL AND STEP TO NEXT >>             01466000
        BEGIN                                                           01468000
          TOS := (X+16)&LSL(9)+2;  << CONTROL WORD AND UNIT # >>        01470000
          ASMB( CIO 1 );  << SEND INFO TO CHANNEL >>                    01472000
          IF < THEN IOFAILURE(S1, DITP);                                01474000
                                                                        01476000
          X := X+1;  << STEP TO NEXT CHANNEL >>                         01478000
        END                                                             01480000
      ELSE IF < THEN IOFAILURE(S1, DITP)        << NON RESPONDING >>    01482000
        ELSE DDEL;  << TRY AGAIN >>                                     01484000
    END UNTIL X=5;                                                      01486000
                                                                        01488000
    END;  << TERM INIT >>                                               01490000
$PAGE "SYSTEM BUFFER ROUTINES"                                          01492000
                                                                        01494000
INTEGER PROCEDURE GETSYSBUF(NUM,IMPF);                                  01496000
VALUE NUM,IMPF;                                                         01498000
INTEGER NUM;                                                            01500000
LOGICAL IMPF;                                                           01502000
OPTION PRIVILEGED,UNCALLABLE;                                           01504000
BEGIN                                                                   01506000
                                                                        01508000
ENTRY FGETSYSBUF;                                                       01510000
INTEGER                                                                 01512000
   CSTAT       = Q-1, << CALLER STATUS >>                               01514000
   TYPE        = Q+1, << BUFFER FENCE >>                                01516000
   SIZE        = Q+2; << BUFFER SIZE >>                                 01518000
INTEGER POINTER                                                         01520000
   SYSBUF      = SYSSBUF;                                               01522000
                                                                        01524000
   TOS := 0; << NO BUFFER FENCE >>                                      01526000
   GO AROUND;                                                           01528000
   HELP;  <<FOR HELP PLABEL *************>>                    <<00.05>>01530000
FGETSYSBUF:                                                             01532000
   TOS := 8; << BUFFER FENCE FOR FILESYSTEM TO PREVENT HOGGING >>       01534000
AROUND:                                                                 01536000
   TOS := SYSBUF(TSIZE).ESIZE; << BUFFER SIZE >>                        01538000
   SYSBUF(X) := SYSBUF(TR2) + 1; << INC. REQ. CNTR >>                   01540000
   IF CARRY THEN SYSBUF(X) := SYSBUF(TR1) + 1;                          01542000
   IF NOT(1 <= NUM <= SYSBUF(LIM).LIMIT1) THEN                          01544000
   BEGIN                                                                01546000
      TOS := CCL;                                                       01548000
      GO TO SETCC;                                                      01550000
   END;                                                                 01552000
   DISABLE;                                                             01554000
TRYAGAIN:                                                               01556000
   TOS := NUM + SYSBUF(TUSE).INUSE;                                     01558000
   ASMB(DUP,DDUP);                                                      01560000
   TOS := TOS + TYPE;                                                   01562000
   IF TOS > SYSBUF(LIM).LIMIT1 THEN                                     01564000
   BEGIN << CAN'T SUPPLY ENOUGH BUFFERS >>                              01566000
      << If first overflow, report table full to console >>    <<02803>>01568000
      tos := SYSBUF(TOVRFL);                                   <<02803>>01570000
      if = then                                                <<02803>>01572000
        MPE'TABLE'FULL(1);  << table 1 is SBUF >>              <<02803>>01574000
      SYSBUF(TOVRFL) := tos + 1;                               <<02803>>01576000
      IF IMPF THEN                                                      01578000
      BEGIN << IMPEDE THIS PROCESS >>                                   01580000
         IOIMPEDE(ABS(SYSDB+SYSSBUF));                                  01582000
         ASSEMBLE (DDEL, DEL);                                 <<01595>>01584000
         GO TO TRYAGAIN;                                                01586000
      END;                                                              01588000
      TOS := CCG; << IMFORM CALLER OF BUFFER SHORTAGE >>                01590000
      GO TO SETCC;                                                      01592000
   END;                                                                 01594000
   IF TOS > SYSBUF(TUSE).MAXUSE THEN                                    01596000
   SYSBUF(X).MAXUSE := TOS; <<ENTER NEW MAXUSE IF THIS CNT BIGGER >>    01598000
   SYSBUF(X).INUSE := TOS; << UPDATE USE CNTR >>                        01600000
   TOS := FIRSTINDEX;                                                   01602000
   TOS := (SYSBUF(LIM).LIMIT2 - 1) * SIZE + FIRSTINDEX;                 01604000
   TOS := SYSBUF(THEAD);                                                01606000
   DUPLICATE; << SET START OF BUFFER SCAN >>                            01608000
   GETSYSBUF := TOS; << RETURN INDEX TO CALLER >>                       01610000
   DO                                                                   01612000
   BEGIN                                                                01614000
      X := TOS; << SET SYSBUF POINTER >>                                01616000
      ASMB(DDUP,DECX);                                                  01618000
      IF NOT(TOS <= X <= TOS) THEN SUDDENDEATH(250);                    01620000
      TOS := X - FIRSTINDEX; << CHECK THAT INDEX IS MODULO >>           01622000
      TOS := SIZE;                                                      01624000
      ASMB(DIV,TEST; DDEL);                                             01626000
      IF <> THEN SUDDENDEATH(250);                                      01628000
      TOS := SYSBUF(X);                                                 01630000
      NUM := NUM - 1;                                                   01632000
   END UNTIL =;                                                         01634000
    SYSBUF(X) := 0; << ZERO LAST LINK >>                                01636000
    ASMB(TEST); << CHECK FOR END-OF-LIST CONDITION >>                   01638000
   IF = THEN SYSBUF(TTAIL) := THEAD + 1; << LIST IS NULL >>             01640000
   SYSBUF(THEAD) := TOS; << MAKE HEAD POINT AT NAXT AVAIL. BUF. >>      01642000
   TOS := CCE;                                                          01644000
SETCC:                                                                  01646000
   CSTAT.CC := TOS;                                                     01648000
END;                                                                    01650000
$PAGE "ABORT I/O ROUTINES"                                              01652000
PROCEDURE ABORTPROCIO(PCBNUMB);                                         01654000
VALUE PCBNUMB;  INTEGER PCBNUMB;                                        01656000
OPTION PRIVILEGED, UNCALLABLE;                                          01658000
BEGIN                                                                   01660000
INTEGER POINTER                                                         01662000
   DITP,                                                                01664000
   IOQP,                                                       <<00.TE>>01666000
   DLTP;                                                       <<00.TE>>01668000
LOGICAL POINTER                                                <<00.TE>>01670000
   DLTPL,                                                      <<00.TE>>01672000
   IOQPL     = IOQP,                                           <<00.TE>>01674000
   DITPL     = DITP;                                           <<00.TE>>01676000
LOGICAL                                                        <<00.TE>>01678000
   FOUNDONE;                                                   <<00.TE>>01680000
INTEGER                                                        <<00.TE>>01682000
   DBSAVE,                                                     <<00.TE>>01684000
   PIN,                                                        <<00.TE>>01686000
   I := 0;                                                     <<00.TE>>01688000
                                                               <<00.TE>>01690000
  DBSAVE := SETSYSDB;                                          <<00.TE>>01692000
  PIN := PCBNUMB;                                              <<00.TE>>01694000
  IF = THEN PIN := (ABS(CPCB) - ABS(PCBB))/PCBSIZE;            <<00.TE>>01696000
                                                               <<00.TE>>01698000
  WHILE (I:=I+1)<=LPDT.MAXENTRY DO                             <<00.TE>>01700000
    BEGIN   << SEARCH LPDT FOR PROCCESS I/O TO ABORT >>        <<00.TE>>01702000
    @DITP := LPDTP(I*2);                                       <<00.TE>>01704000
    IF > AND DITP.(TERMINAL':2)<>DISC' THEN                    <<00.TE>>01706000
      BEGIN   << VALID DEVICE FOR ABORTING I/O >>              <<00.TE>>01708000
      FOUNDONE := FALSE;                                       <<00.TE>>01710000
      @DLTPL := DITP(DDLTP);                                   <<00.TE>>01712000
      IF DLTPL.QABORTS THEN  << SEND REQUEST TO ABORT >>       <<00.TE>>01714000
                                                               <<03645>>01716000
        << PCBNUM is passed to datacom driver via the QMISC >> <<03645>>01718000
        << parameter in the call to ATTACHIO.  The datacom  >> <<03645>>01720000
        << driver compares this PIN to all its outstanding  >> <<03645>>01722000
        << IOQ's and aborts only those with the same PIN.   >> <<03645>>01724000
        << This information is per Cathy Smith (DCO lab) on >> <<03645>>01726000
        << 12/28/81.  (AJK - MPE I/O)                       >> <<03645>>01728000
                                                               <<03645>>01730000
        ATTACHIO(I, PIN, 0, 0, ABORT'IO, 0, 0, 0, NOPCB)       <<00.TE>>01732000
      ELSE                                                     <<00.TE>>01734000
        BEGIN    << SET BITS TO CAUSE ABORT >>                 <<00.TE>>01736000
        PDISABLE;                                              <<00.TE>>01738000
        @IOQP := DITP(DIOQP);                                  <<00.TE>>01740000
        WHILE <> DO  << SEARCH DEVICE IOQ LIST >>              <<00.TE>>01742000
          BEGIN                                                <<00.TE>>01744000
          IF NOT IOQPL.COMPLETED AND IOQP(QSTAT).PCBN=PIN THEN <<00.TE>>01746000
            BEGIN    << ABORT REQUEST >>                       <<00.TE>>01748000
            DISABLE;                                           <<00.TE>>01750000
            IOQP.ABORT := 1;                                   <<00.TE>>01752000
            IF DITP>=0 THEN DITP.IAK := 1;<<NOT A TERMINAL >>  <<00.TE>>01754000
            ENABLE;                                            <<00.TE>>01756000
            FOUNDONE := TRUE;                                  <<00.TE>>01758000
            END;                                               <<00.TE>>01760000
          @IOQP := IOQP(QLINK);  << STEP TO NEXT IOQ >>        <<00.TE>>01762000
          END;                                                 <<00.TE>>01764000
        PENABLE;                                               <<00.TE>>01766000
        IF FOUNDONE THEN AWAKEIO(DITP,IMPEDABLE);              <<00.TE>>01768000
        END;                                                   <<00.TE>>01770000
      END;                                                     <<00.TE>>01772000
    END;                                                       <<00.TE>>01774000
                                                               <<00.TE>>01776000
  RESETDB(DBSAVE);                                             <<00.TE>>01778000
END;   <<  ABORT PROC IO  >>                                            01780000
                                                                        01782000
PROCEDURE ABORTIO(LDEVICE);                                             01784000
VALUE LDEVICE;   INTEGER LDEVICE;                                       01786000
OPTION PRIVILEGED, UNCALLABLE;                                          01788000
BEGIN                                                                   01790000
<< This procedure will mark all IOQ's for a LDEV >>            <<02644>>01792000
<< as ABORTED and AWAKEN the monitor to process  >>            <<02644>>01794000
<< the abortion requests.  If a negative LDEV is >>            <<02644>>01796000
<< passed to this routine, only PCB related IOQ's>>            <<02660>>01798000
<< will be marked as aborted.  If the LDEV is    >>            <<02660>>01800000
<< positive, all IOQ's for this device are marked>>            <<02660>>01802000
<< as aborted.  The return status are as follows:>>            <<02644>>01804000
<<            CCE - IOQ's existed & were aborted >>            <<02644>>01806000
<<            CCG - no IOQ's were found          >>            <<02644>>01808000
<<            CCL - invalid LDEV to do ABORTIO   >>            <<02644>>01810000
INTEGER POINTER                                                <<00.TE>>01812000
  DITP,                                                        <<00.TE>>01814000
  DLTP,                                                        <<00.TE>>01816000
  IOQP;                                                        <<00.TE>>01818000
LOGICAL POINTER                                                <<00.TE>>01820000
  IOQPL  =  IOQP;                                              <<00.TE>>01822000
INTEGER                                                        <<00.TE>>01824000
  DBSAVE;                                                      <<00.TE>>01826000
LOGICAL                                                        <<00.TE>>01828000
  FIRST'IOQ'ABORTED := false,<<first IOQ in chain was aborted>><<02660>>01830000
  ABORTALL := true;   <<abort all PCB's I/Os against device>>  <<02644>>01832000
                                                               <<00.TE>>01834000
  DBSAVE := SETSYSDB;                                          <<00.TE>>01836000
  X := LDEVICE;                                                <<00.TE>>01838000
  IF < THEN    << ABORT ONLY PCB RELATED I/O >>                <<00.TE>>01840000
    BEGIN  LDEVICE := -X;   ABORTALL := FALSE;   END;          <<00.TE>>01842000
                                                               <<00.TE>>01844000
  @DITP := LPDTP(LDEVICE*2);                                   <<00.TE>>01846000
  @DLTP := DITP(DDLTP);                                        <<00.TE>>01848000
                                                               <<00.TE>>01850000
  TOS := CCL;  << INVALID DEVICE RETURN >>                     <<00.TE>>01852000
                                                               <<02644>>01854000
  <<check if LDEV is valid, not virtual, and not DISC>>        <<02644>>01856000
  CHECKLDEV(LDEVICE);                                          <<03645>>01858000
  if >= and      << Is valid LDEV >>                           <<03645>>01860000
     nocarry then  << is not a DISC >>                         <<03645>>01862000
    BEGIN   << VALID DEVICE AND TYPE, SO DO ABORT >>           <<00.TE>>01864000
    TOS := CCG;   << ASSUME EMPTY QUEUE >>                     <<00.TE>>01866000
    <<if device is datacomm, must do ATTACHIO to driver>>      <<02644>>01868000
    IF NOT LOGICAL(DLTP).QABORTS THEN                          <<00.TE>>01870000
      BEGIN   << CHECK QUEUE >>                                <<00.TE>>01872000
      DISABLE;   <<protect IOQ chain integrity>>               <<02644>>01874000
      @IOQP := DITP(DIOQP);                                    <<00.TE>>01876000
      IF <> THEN  << SOMETHING ON QUEUE >>                     <<00.TE>>01878000
        BEGIN                                                  <<00.TE>>01880000
        @IOQP := DITP(DIOQP);                                  <<00.TE>>01884000
        WHILE <> DO  << ABORT REQUEST >>                       <<00.TE>>01886000
          BEGIN                                                <<00.TE>>01888000
          IF NOT IOQPL.COMPLETED AND (ABORTALL OR PCBIO) THEN  <<00.TE>>01890000
            begin                                              <<02660>>01894000
            IOQP.ABORT := 1;   <<mark IOQ aborted>>            <<02660>>01896000
            if @IOQP = DITP(DIOQP) then                        <<02660>>01898000
              FIRST'IOQ'ABORTED := true; <<must awake monitor>><<02660>>01900000
            end;                                               <<02660>>01902000
          @IOQP := IOQP(QLINK);  << STEP TO NEXT IOQ >>        <<00.TE>>01906000
          END;                                                 <<00.TE>>01908000
        <<if first IOQ aborted, waken monitor>>                <<02660>>01912000
        if FIRST'IOQ'ABORTED then                              <<02660>>01914000
          begin                                                <<02660>>01916000
          if DITP>=0 then DITP.IAK := 1; <<NOT a terminal>>    <<02660>>01918000
          ENABLE;                                              <<02660>>01920000
          AWAKEIO(DITP, IMPEDABLE);                            <<02660>>01922000
          end                                                  <<02660>>01924000
        else                                                   <<02660>>01926000
          ENABLE;                                              <<02660>>01928000
                                                               <<02644>>01930000
        <<now, report a good completion code>>                 <<02660>>01932000
                                                               <<02660>>01934000
        TOS := CCE;  << REPORT I/O ABORTED >>                  <<00.TE>>01940000
        end                                                    <<02644>>01942000
      else                                                     <<02644>>01944000
        ENABLE;  <<enable interrupts>>                         <<02644>>01946000
      END                                                      <<00.TE>>01948000
                                                               <<02644>>01950000
<<For datacomm, we must issue a request of the driver to>>     <<02644>>01952000
<<abort the current I/O.                                >>     <<02644>>01954000
    ELSE IF IOCONTROL(LDEVICE,ABORT'IO) THEN TOS := CCE;       <<00.TE>>01956000
    END;                                                       <<00.TE>>01958000
                                                               <<00.TE>>01960000
  RSTATUS.CC := TOS;                                           <<00.TE>>01962000
  RESETDB(DBSAVE);                                             <<00.TE>>01964000
END; << ABORT IO >>                                                     01966000
PROCEDURE ABORTIOX(IOQX);                                      <<00.05>>01968000
VALUE IOQX;                                                    <<00.05>>01970000
INTEGER IOQX;                                                  <<00.05>>01972000
OPTION PRIVILEGED,UNCALLABLE;                                  <<00.05>>01974000
BEGIN                                                          <<00.05>>01976000
EQUATE                                                         <<00.05>>01978000
   DISC       = 1; << DEV TYPE IS DISC >>                      <<00.05>>01980000
                                                               <<00.05>>01982000
DEFINE                                                         <<00.05>>01984000
   DCLASS     = (0:2)#; << DEVICE TYPE BITS IN DIT0 >>         <<00.05>>01986000
                                                               <<00.05>>01988000
INTEGER SAVEDB;                                                <<00.05>>01990000
                                                               <<00.05>>01992000
INTEGER POINTER IOQP,DITP,TESTP;                               <<00.05>>01994000
                                                               <<00.05>>01996000
   SAVEDB := SETSYSDB;                                         <<00.05>>01998000
   @IOQP := @IOQ + IOQX;                                       <<00.05>>02000000
   TOS := LPDTD(IOQP(QLDEV).LDEVN);                            <<00.05>>02002000
   DEL;                                                        <<00.05>>02004000
   @DITP := TOS;                                               <<00.05>>02006000
   IF DITP.DCLASS = DISC THEN GO FINISH; << CAN'T ABORT DISC >><<00.05>>02008000
   DISABLE;                                                    <<00.05>>02010000
   IOQP.ABORT := 1; << SET ABORT >>                            <<00.05>>02012000
   IF @IOQP = DITP(DIOQP) THEN                                 <<00.05>>02014000
   BEGIN  << FIRST IOQ ON LIST >>                              <<00.05>>02016000
      IF DITP >= 0 THEN DITP.IAK := 1;                         <<00.05>>02018000
      << SET INTERRUPT ACKNOW. IF NON-TERMINAL >>              <<00.05>>02020000
      ENABLE;                                                  <<00.05>>02022000
      AWAKEIO(DITP,0);                                         <<00.05>>02024000
      GO FINISH;                                               <<00.05>>02026000
   END ELSE                                                    <<00.05>>02028000
   BEGIN                                                       <<00.05>>02030000
      @TESTP := DITP(DIOQP); << SCAN IOQ LIST >>               <<00.05>>02032000
      WHILE @TESTP <> 0 DO                                     <<00.05>>02034000
      BEGIN                                                    <<00.05>>02036000
         IF TESTP(QLINK) = @IOQP THEN                          <<00.05>>02038000
         BEGIN << FOUND IT >>                                  <<00.05>>02040000
            TESTP(QLINK) := IOQP(QLINK); <<DELINK IOQ>>        <<00.05>>02042000
            ENABLE;                                            <<00.05>>02044000
            RETURNIOQ(IOQP);                                   <<00.05>>02046000
            RESETDB(SAVEDB);                                   <<00.05>>02048000
            RETURN;                                            <<00.05>>02050000
         END;                                                  <<00.05>>02052000
         @TESTP := TESTP(QLINK); << STEP TO NEXT IOQ >>        <<00.05>>02054000
      END;                                                     <<00.05>>02056000
   ENABLE;  <<clean up in case IOQ not chained??>>             <<02644>>02058000
   END;                                                        <<00.05>>02060000
FINISH:                                                        <<00.05>>02062000
   RESETDB(SAVEDB);                                            <<00.05>>02064000
   WAITFORIO(IOQX); << WAIT FOR I/O COMPLETION >>              <<00.05>>02066000
END;                                                           <<00.05>>02068000
$PAGE "DEVICE MAINTENENCE REQUEST PROCESSOR"                   <<03101>>02070000
procedure PROC'MAINT'REQ(LDEV,TYPE,SUBTYPE);                   <<03101>>02072000
value LDEV,TYPE,SUBTYPE;                                       <<03101>>02074000
integer LDEV,TYPE,SUBTYPE;                                     <<03101>>02076000
option internal,uncallable,privileged;                         <<03101>>02078000
begin                                                          <<03101>>02080000
                                                               <<03101>>02082000
<< This procedure processes maintence requests from >>         <<03101>>02084000
<< specific devices on the HP3000.  The mechanism   >>         <<03101>>02086000
<< used to invoke this procedure is:                >>         <<03101>>02088000
<< 1) The MPE driver calls procedure MAINT'REQUEST  >>         <<03101>>02090000
<<    in HARDRES.                                   >>         <<03101>>02092000
<< 2) Procedure MAINT'REQUEST sends a memory res-   >>         <<03101>>02094000
<<    ident message facility message to IOMSGPROC,  >>         <<03101>>02096000
<<    which then calls this procedure.              >>         <<03101>>02098000
<<                                                  >>         <<03101>>02100000
<< This procedure then makes the appropriate ATTIO  >>         <<03101>>02102000
<< calls to the device driver to extract the info,  >>         <<03101>>02104000
<< and then calls the MPE logging process to "log"  >>         <<03101>>02106000
<< the information.                                 >>         <<03101>>02108000
                                                               <<03101>>02110000
<< Information returned from driver utility requests are >>    <<03101>>02112000
<< returned in word 10 for CS'80 devices. This means that>>    <<03101>>02114000
<< this array can only hold 758 words of driver return info>>  <<03101>>02116000
                                                               <<03101>>02118000
array BUF(0:767);  << Buffer w/info for ATTACHIO    >>         <<03101>>02120000
byte array B'BUF(*) = BUF;                                     <<03101>>02122000
                                                               <<03101>>02124000
integer TOTAL'LENGTH, << Length of all info to be logged>>     <<03101>>02126000
        REM'LENGTH,   << Remaining bytes to log         >>     <<03101>>02128000
        LENGTH,       << Length to log in this call to LOG>>   <<03101>>02130000
        FNCT,         << ATTACHIO function >>                  <<03101>>02132000
        HEADS,        << Highest number head device has >>     <<03101>>02134000
        J,            << Continuation record number >>         <<03101>>02136000
        PA,PB,        << P1 & P2 of ATTACHIO        >>         <<03101>>02138000
        I,X=x,        << Utility integers >>                   <<03101>>02140000
        CNT;          << ATTACHIO count >>                     <<03101>>02142000
integer pointer BUF'PTR;  << Pointer into array BUF >>         <<03101>>02144000
byte pointer B'BUF'PTR; << Byte pointer into BUF >>            <<03101>>02146000
                                                               <<03101>>02148000
<< All following equates must be even numbers >>               <<03101>>02150000
equate MAX'LOG'LEN = 128,  << Log 128 bytes max at a time >>   <<03101>>02152000
       LOG'OVRHD   = 14,   <<14 bytes overhead per log call>>  <<03101>>02154000
       USABLE'LEN  = MAX'LOG'LEN-LOG'OVRHD;                    <<03101>>02156000
<<***********************************************************>><<03101>>02158000
double subroutine ATTIO;                                       <<03101>>02160000
begin                                                          <<03101>>02162000
                                                               <<03101>>02164000
ATTIO := ATTACHIO(LDEV,0,0,@BUF,FNCT,CNT,PA,PB,1<<blocked>>);  <<03101>>02166000
end;                                                           <<03101>>02168000
<<***********************************************************>><<03101>>02170000
subroutine LOG'TYPE'46;                                        <<03101>>02172000
    begin  << Return status was OK >>                          <<03101>>02174000
                                                               <<03101>>02176000
    << Change total length to positive bytes >>                <<03101>>02178000
    if TOTAL'LENGTH > 0 then                                   <<03101>>02180000
      TOTAL'LENGTH := TOTAL'LENGTH * 2                         <<03101>>02182000
    else if < then                                             <<03101>>02184000
      TOTAL'LENGTH := -TOTAL'LENGTH;                           <<03101>>02186000
                                                               <<03101>>02188000
    REM'LENGTH := TOTAL'LENGTH;                                <<03101>>02190000
                                                               <<03101>>02192000
    << Write records to MPE logging >>                         <<03101>>02194000
    J := 0;  << Record number >>                               <<03101>>02196000
    @B'BUF'PTR := @B'BUF(20); << Info is ret in word 10 >>     <<03101>>02198000
    while   REM'LENGTH > 0 do                                  <<03101>>02200000
      begin                                                    <<03101>>02202000
                                                               <<03101>>02204000
      LENGTH := if   REM'LENGTH > USABLE'LEN then              <<03101>>02206000
                   USABLE'LEN                                  <<03101>>02208000
                else                                           <<03101>>02210000
                   REM'LENGTH;                                 <<03101>>02212000
                                                               <<03101>>02214000
      << Call MPE logging >>                                   <<03101>>02216000
      LOG46(LDEV,TYPE,SUBTYPE,PB, << Maint req type >>         <<03101>>02218000
            I,                    << Head number    >>         <<03101>>02220000
            J,                    << Record number  >>         <<03101>>02222000
            TOTAL'LENGTH,         << Tot bytes      >>         <<03101>>02224000
            LENGTH,               << bytes in rec   >>         <<03101>>02226000
            @B'BUF'PTR,           << byte address   >>         <<03101>>02228000
            LENGTH,               << Len to copy    >>         <<03101>>02230000
            46);                  << LOG type       >>         <<03101>>02232000
                                                               <<03101>>02234000
      << Increment pointers, indicies >>                       <<03101>>02236000
      J := J + 1;   << Record number >>                        <<03101>>02238000
      @B'BUF'PTR := @B'BUF'PTR + LENGTH;                       <<03101>>02240000
      REM'LENGTH := REM'LENGTH - LENGTH;                       <<03101>>02242000
      end; << of writing intermediate records >>               <<03101>>02244000
                                                               <<03101>>02246000
end;                                                           <<03101>>02248000
<<***********************************************************>><<03101>>02250000
subroutine CS'80;                                              <<03101>>02252000
begin                                                          <<03101>>02254000
                                                               <<03101>>02256000
<< Determine how many heads device has >>                      <<03101>>02258000
FNCT := 13;      << Request device limits >>                   <<03101>>02260000
PA := 1;         << Three-vector mode     >>                   <<03101>>02262000
PB := 0;                                                       <<03101>>02264000
CNT := 2;        << Return a max of 2 words >>                 <<03101>>02266000
                                                               <<03101>>02268000
tos := ATTIO;                                                  <<03101>>02270000
assemble(del);   << Remove word count     >>                   <<03101>>02272000
if tos.(13:3) <> 1 then                                        <<03101>>02274000
  tos := 0       << Assume 0 heads if ATTIO failed >>          <<03101>>02276000
else                                                           <<03101>>02278000
  tos := BUF(1).(0:8); << # of heads >>                        <<03101>>02280000
                                                               <<03101>>02282000
<< If number of heads is zero, assume NO heads >>              <<03101>>02284000
assemble(test);                                                <<03101>>02286000
if = then                                                      <<03101>>02288000
  tos := tos - 1;   << Make # of heads negative >>             <<03101>>02290000
HEADS := tos;                                                  <<03101>>02292000
<< We must first request run-time data error log from each >>  <<03101>>02294000
<< of all 13 heads, and then call MPE logging to save info >>  <<03101>>02296000
                                                               <<03101>>02298000
FNCT := 91;   << Function 91 to driver >>                      <<03101>>02300000
PA := 2;                                                       <<03101>>02302000
PB := %305;                                                    <<03101>>02304000
CNT := -1516; << 758 words max driver can return >>            <<03101>>02306000
I := -1;                                                       <<03101>>02308000
while (I:=I+1) <= HEADS do                                     <<03101>>02310000
  begin << Process each head >>                                <<03101>>02312000
                                                               <<03101>>02314000
  BUF := 1;  << 1 byte of descriptor information >>            <<03101>>02316000
  B'BUF(2) := byte(I); << Head number in byte 2  >>            <<03101>>02318000
  tos := ATTIO;                                                <<03101>>02320000
  TOTAL'LENGTH := tos;  << store length transferred >>         <<03101>>02322000
  if tos.(13:3) = 1 then                                       <<03101>>02324000
    LOG'TYPE'46;                                               <<03101>>02326000
                                                               <<03101>>02328000
  end;   << of processing each head >>                         <<03101>>02330000
                                                               <<03101>>02332000
<< Read the fault log >>                                       <<03101>>02334000
PB := %307;     << Fault log >>                                <<03101>>02336000
I := 0;                                                        <<03101>>02338000
BUF := 0;   << 0 parameter bytes >>                            <<03101>>02340000
                                                               <<03101>>02342000
tos := ATTIO;                                                  <<03101>>02344000
TOTAL'LENGTH := tos;                                           <<03101>>02346000
if tos.(13:3) = 1 then                                         <<03101>>02348000
  LOG'TYPE'46;   << ATTACHIO was OK >>                         <<03101>>02350000
                                                               <<03101>>02352000
<< Now, we must clear maintenence info from disc >>            <<03101>>02354000
PA := 0;    << Send utility cmd >>                             <<03101>>02356000
PB := %315; << Clear log utility function >>                   <<03101>>02358000
BUF := 1;   << Send 1 byte >>                                  <<03101>>02360000
B'BUF(2) := 0;   << Byte value is zero >>                      <<03101>>02362000
ATTIO;                                                         <<03101>>02364000
end;   << of subroutine HP7935 >>                              <<03101>>02366000
<<***********************************************************>><<03101>>02368000
<< Case on device type >>                                      <<03101>>02370000
case TYPE of                                                   <<03101>>02372000
                                                               <<03101>>02374000
begin  << of case on type >>                                   <<03101>>02376000
                                                               <<03101>>02378000
<<0>>  ;   << Type 0 (disc) has no maintence requests >>       <<03101>>02380000
                                                               <<03101>>02382000
<<1>>  ;   << Type 1 has no maintenence requests      >>       <<03101>>02384000
                                                               <<03101>>02386000
<<2>>  ;   << Type 2 has no maintenence requests      >>       <<03101>>02388000
                                                               <<03101>>02390000
<<3>>  CS'80; << CS'80 type disc drive maintenence req>>       <<03101>>02392000
                                                               <<03101>>02394000
end;    << of case on device type >>                           <<03101>>02396000
                                                               <<03101>>02398000
end;  << of procedure PROC'MAINT'REQ >>                        <<03101>>02400000
$PAGE "PROCESS SERIES/64 DCU REQUEST"                          <<04187>>02402000
procedure PROC'DCU'REQUEST(PARM,DST);                          <<04187>>02404000
value PARM;                                                    <<04187>>02406000
integer PARM,DST;                                              <<04187>>02408000
option internal,privileged;                                    <<04187>>02410000
begin                                                          <<04187>>02412000
                                                               <<04187>>02414000
equate  CONSOLE = 0,                                           <<04187>>02416000
        CR      = %15,    << carriage return >>                <<04187>>02418000
        LF      = %12,    << line feed >>                      <<04187>>02420000
        SYSDB   = %1000;                                       <<04187>>02422000
                                                               <<04187>>02424000
logical I,    << Index >>                                      <<04187>>02426000
        BANK, << Bank where DST is >>                          <<04187>>02428000
        OFFSET,<< Offset in bank for DST >>                    <<04187>>02430000
        SEARCH,     <<flag to indicate when CRLF is found>>    <<04187>>02432000
        LENGTH;        << length to log >>                     <<04187>>02434000
                                                               <<04187>>02436000
integer REM'LENGTH,TOTAL'LENGTH,<< Remaining bytes to log >>   <<04187>>02438000
        K,                     << counter >>                   <<04187>>02440000
        J;                     << Rec # of sub-record        >><<04187>>02442000
                                                               <<04187>>02444000
byte pointer B'BUF'PTR;        << Pointer into BUF           >><<04187>>02446000
byte pointer BUF'LOC;          <<location in the buffer>>      <<04187>>02448000
array   BUF(0:767);   << Buffer for logged data >>             <<04187>>02450000
byte array B'BUF(*)=BUF;                                       <<04187>>02452000
                                                               <<04187>>02454000
<< the format of PARM is: (0:15) = byte count of data   >>     <<04187>>02456000
<<                        (15:1) = 0 means initiate log >>     <<04187>>02458000
<<                        (15:1) = 1 means end log      >>     <<04187>>02460000
                                                               <<04187>>02462000
<<***********************************************************>><<04187>>02464000
                                                               <<04187>>02466000
subroutine RELDST;                                             <<04187>>02468000
begin                                                          <<04187>>02470000
                                                               <<04187>>02472000
if DST <> 0 then                                               <<04187>>02474000
  begin                                                        <<04187>>02476000
  J := DST;                                                    <<04187>>02478000
  SETSYSDB;                                                    <<04187>>02480000
  RELDATASEG(J);                                               <<04187>>02482000
  RESETDB(-1);                                                 <<04187>>02484000
  DST := 0;                                                    <<04187>>02486000
  end;                                                         <<04187>>02488000
                                                               <<04187>>02490000
end;  << of subroutine RELDST >>                               <<04187>>02492000
                                                               <<04187>>02494000
<<***********************************************************>><<04187>>02496000
                                                               <<04187>>02498000
subroutine LOG'TYPE'47;                                        <<04187>>02500000
begin                                                          <<04187>>02502000
                                                               <<04187>>02504000
REM'LENGTH := TOTAL'LENGTH;                                    <<04187>>02506000
@B'BUF'PTR := @B'BUF;                                          <<04187>>02508000
J := 0;                 << Sub-record 0 >>                     <<04187>>02510000
K := 0;                  <<initialize counter>>                <<04187>>02512000
SEARCH := FALSE;         <<flag for CRLF>>                     <<04187>>02514000
while REM'LENGTH > 0 do                                        <<04187>>02516000
  begin                                                        <<04187>>02518000
  while (K<71) and (K<REM'LENGTH) and NOT SEARCH do            <<04187>>02520000
    begin                              << search for the end >><<04187>>02522000
    if B'BUF'PTR(K) <> CR           << of a string. It is  >>  <<04187>>02524000
       then K := K + 1              << indicated by a CRLF. >> <<04187>>02526000
       else if B'BUF'PTR(K:=K+1) = LF                          <<04187>>02528000
            then SEARCH := TRUE                                <<04187>>02530000
    end;                                                       <<04187>>02532000
                                                               <<04187>>02534000
  @BUF'LOC := @B'BUF'PTR(K);<<location in buf of CRLF>>        <<04187>>02536000
  LENGTH := @BUF'LOC - @B'BUF'PTR + 1;   <<number to log>>     <<04187>>02538000
                                                               <<04187>>02540000
  << Call MPE logging >>                                       <<04187>>02542000
  LOG47(J,TOTAL'LENGTH,LENGTH,@B'BUF'PTR,LENGTH,47);           <<04187>>02544000
                                                               <<04187>>02546000
  REM'LENGTH := REM'LENGTH - INTEGER(LENGTH);                  <<04187>>02548000
  @B'BUF'PTR := @B'BUF'PTR(K+1);                               <<04187>>02550000
  J := J + 1;                                                  <<04187>>02552000
  K := 0;        << re-initialize flags >>                     <<04187>>02554000
  SEARCH := FALSE;                                             <<04187>>02556000
  end;                                                         <<04187>>02558000
end;   << of subroutine LOG'TYPE'47 >>                         <<04187>>02560000
<<***********************************************************>><<04187>>02562000
subroutine INIT'DCU'LOGGING;                                   <<04187>>02564000
begin                                                          <<04187>>02566000
                                                               <<04187>>02568000
<< Only performed if this is an ICF/55 processor >>            <<04187>>02570000
assemble(pcn);   << Push computer number on tos >>             <<04187>>02572000
if tos = 4 then  << This is an ICF/55           >>             <<04187>>02574000
  begin                                                        <<04187>>02576000
  tos := 0;      << Enable DCU logging          >>             <<04187>>02578000
  tos := %400;   << dummy argument              >>             <<04187>>02580000
  assemble(con %20104;con %14); << RDCU machine inst >>        <<04187>>02582000
  end;                                                         <<04187>>02584000
                                                               <<04187>>02586000
DST         := 0;  << No DST allocated yet >>                  <<04187>>02588000
end;   << of subroutine INIT'DCU'LOGGING >>                    <<04187>>02590000
<<***********************************************************>><<04187>>02592000
<< See if this is an enable request >>                         <<04187>>02594000
if PARM = %177777 then                                         <<04187>>02596000
  begin  << Yes, it is >>                                      <<04187>>02598000
  INIT'DCU'LOGGING;                                            <<04187>>02600000
  return                                                       <<04187>>02602000
  end;                                                         <<04187>>02604000
                                                               <<04187>>02606000
<< See if new request >>                                       <<04187>>02608000
if not logical(PARM) then                                      <<04187>>02610000
  begin  << this is a new request >>                           <<04187>>02612000
  << if DST already exists, kill it >>                         <<04187>>02614000
  RELDST;                                                      <<04187>>02616000
                                                               <<04187>>02618000
  << Get new DST for DCU logging >>                            <<04187>>02620000
  SETSYSDB;                                                    <<04187>>02622000
  J   := GETDATASEG(DCULOG'DSTSIZE,DCULOG'DSTSIZE);            <<04452>>02624000
  RESETDB(-1);                                                 <<04187>>02626000
  DST := J;                                                    <<04187>>02628000
  if <> then     << DST was obtained >>                        <<04187>>02630000
    begin     << we got a DST >>                               <<04187>>02632000
    << Attempt to freeze it in memory >>                       <<04187>>02634000
Loop:                                                          <<04187>>02636000
    tos := @I;     << this code is a way >>                    <<04187>>02638000
    tos := DST;    << of causing an absent >>                  <<04187>>02640000
    tos := 0;      << trap and starting memory >>              <<04187>>02642000
    tos := 1;      << management on the DST if >>              <<04187>>02644000
    assemble(mfds 4);   << needed. It references 1 word. >>    <<04187>>02646000
    IOFREEZE'(DST);                                            <<04187>>02648000
    if <> then go to Loop;   << Loop if freeze failed >>       <<04187>>02650000
                                                               <<04187>>02652000
    << Find BANK and OFFSET to DST >>                          <<04187>>02654000
    I := absolute(2) << DST tbl ptr >> + (logical(DST)&lsl(2));<<04187>>02656000
    BANK := absolute(I+2).(8:8);                               <<04187>>02658000
    OFFSET := absolute(I+3);                                   <<04187>>02660000
                                                               <<04187>>02662000
    << Call machine-dependant I/O instruction >>               <<04187>>02664000
    tos := OFFSET;                                             <<04187>>02666000
    tos := BANK;                                               <<04187>>02668000
    assemble(con %20104);  << Special I/O instruction >>       <<04187>>02670000
    assemble(con %14);     << Parameter of 2-word inst>>       <<04187>>02672000
    end;                                                       <<04187>>02674000
  end                                                          <<04187>>02676000
else                                                           <<04187>>02678000
  begin     << Log data >>                                     <<04187>>02680000
  TOTAL'LENGTH := PARM & lsr(1);   << Byte count >>            <<04187>>02682000
  IOUNFREEZE'(DST);                                            <<04187>>02684000
  tos := @BUF;                                                 <<04187>>02686000
  tos := DST;                                                  <<04187>>02688000
  tos := 0;                                                    <<04187>>02690000
  tos := (TOTAL'LENGTH + 1) / 2;                               <<04187>>02692000
  assemble(mfds 4);                                            <<04187>>02694000
  RELDST;                                                      <<04187>>02696000
  LOG'TYPE'47;                                                 <<04187>>02698000
  end;                                                         <<04187>>02700000
end;   << of procedure PROC'DCU'REQUEST >>                     <<04187>>02702000
procedure IOMESSPROC;                                          <<02803>>02706000
option privileged,uncallable;                                  <<02803>>02708000
begin                                                          <<02803>>02710000
                                                               <<02803>>02712000
<<This routine's sole purpose in life is to route messages>>   <<02803>>02714000
<<between terminals (& critical processes) without using  >>   <<02803>>02716000
<<permanent system resources.  This routine will either   >>   <<02803>>02718000
<<dynamically obtain, or release, extra data segments in  >>   <<02803>>02720000
<<MPE to hold a message until the physical I/O is done.   >>   <<02803>>02722000
                                                               <<02803>>02724000
<< Generally, port "0" is used to receive messages for this >> <<04270>>02726000
<< process.  If a process cannot be performed immediately   >> <<04270>>02728000
<< due to lack of resources, IOMESSPROC sends the message   >> <<04270>>02730000
<< to itself in port "3" to defer it until the resource     >> <<04270>>02732000
<< becomes available.  This "resource" is currently message >> <<04270>>02734000
<< buffer entries.  If this check were not made, IOMESSPROC >> <<04270>>02736000
<< could become impeded on itself waiting for an available  >> <<04270>>02738000
<< message buffer (in its call to GENMESSAGE).              >> <<04270>>02740000
                                                               <<04270>>02742000
<< If NUM'MSG'BUFS is changed, must also change in MESSAGE >>  <<02803>>02744000
equate NUM'MSG'BUFS =16; << number of MSG BUFs in DST >>       <<02803>>02746000
                                                               <<04270>>02748000
array IOQ'ARRAY(0:NUM'MSG'BUFS-1), << pending I/O IOQs >>      <<02803>>02750000
      DST'ARRAY(0:NUM'MSG'BUFS-1), << DST buffer offset >>     <<02803>>02752000
      BUF'HDR(0:21);           <<Work area for MSG DST hdr >>  <<02803>>02754000
byte array B'BUF'HDR(*)=BUF'HDR;                               <<02803>>02756000
                                                               <<02803>>02758000
<<equates for GENMSG stacked parameters>>                      <<02803>>02760000
equate DITDST         = 42,                                    <<02803>>02762000
       DITDSTI        = DITDST*4+3,                            <<02803>>02764000
       DSTB           = 14;  <<DST parm bit in GENMSG call>>   <<02803>>02766000
integer BUF           = s-3, <<buffer in GENMSG call>>         <<02803>>02768000
        DSTNUM        = s-2; <<DST number in GENMSG call>>     <<02803>>02770000
logical FLAG;                <<whether REPLY in GENMSG>>       <<02803>>02772000
                                                               <<02803>>02774000
define SYSB'LOC = absolute(%1006)#;<<loc of SYSDB SYSBUF ptr>> <<02803>>02776000
                                                               <<02803>>02778000
integer CURRENT'INDEX,   <<index into I/O arrays>>             <<02803>>02780000
        DST'DCU'LOG,      << DST for DCU logging >>            <<04187>>02782000
        MOVE'LENGTH,     <<length to move in MDS instructions>><<02803>>02784000
        DSTX,            <<DST number to move from/to>>        <<02803>>02786000
        SAVESIR,         << Save GETSIR information >>         <<04270>>02788000
        SBUFX,           <<System buffer index>>               <<02803>>02790000
        TRLX,            << Index of watchdog timer >>         <<02803>>02792000
        LAST'ENTRY;      <<index of last entry in arrays>>     <<02803>>02794000
                                                               <<02803>>02796000
<< timer declarations >>                                       <<02803>>02798000
double NEW'TIME,           << delta time from LAST'TIME >>     <<02803>>02800000
       LAST'TIME;          << prior cycle TIME obtained >>     <<02803>>02802000
                                                               <<02803>>02804000
define PAUSE'TIME = 30000D#;  << 30 second watchdog timer >>   <<02803>>02806000
                                                               <<02803>>02808000
<<SYSDB-relative location of IOQ table pointer>>               <<02803>>02810000
define IOQ'TABLE'LOC = absolute(%1005)#;                       <<02803>>02812000
                                                               <<02803>>02814000
<< S-relative arguments for RECEIVEMSG >>                      <<02803>>02816000
integer SM0 = s-0,                                             <<02803>>02818000
        SM1 = s-1,                                             <<02803>>02820000
        SM2 = s-2,                                             <<02803>>02822000
        SM3 = s-3;                                             <<02803>>02824000
                                                               <<02803>>02826000
pointer LOG'BUF'PTR;  <<pointer to logging info buffer in stack<<02803>>02828000
                                                               <<02803>>02830000
<<declarations to fire-off PROGEN if SHUTDOWN requested>>      <<02803>>02832000
integer PROGEN = DB + %141;  <<Sysglob location>>              <<02803>>02834000
define SHUTDOWN = absolute(%1300)#; << Shutdown flag >>        <<03072>>02836000
define THISPIN = (absolute(CPCB)-absolute(PCBB))/PCBSIZE#,     <<02803>>02838000
       CONSCELL   = absolute(%1074)#, << system cons ldev >>   <<02803>>02840000
       IOMSGQUEUE = absolute(%1062)#, << Impeded PIN head >>   <<02803>>02842000
       IOMSGDST   = absolute(%1113)#, << MSG buffers DST  >>   <<02803>>02844000
       IOMSGPROC = absolute(%1152)#,  << my PIN (CPCB-PCBB) >> <<02803>>02846000
       PCBM       = (8:8)#;           << NIMP field of PCB8 >> <<02803>>02848000
                                                               <<02803>>02850000
equate MSGSIR  = %24,  << MSG SIR number >>                    <<02803>>02852000
       SBUFDST = 8,    <<DST number of system buffers>>        <<02803>>02854000
       PCB8    = 8;    << eighth word of PCB (NIMP) >>         <<02803>>02856000
$PAGE                                                          <<04187>>02858000
subroutine GIVE'BACK'BUFFER; << return MSG buf to avail list>> <<04187>>02860000
begin                                                          <<02803>>02862000
                                                               <<02803>>02864000
if IOMSGDST = 0 then                                           <<02803>>02866000
  return;    << no DST for buffers yet >>                      <<02803>>02868000
                                                               <<02803>>02870000
<< move in buffer DST header info >>                           <<02803>>02872000
tos := @BUF'HDR;     tos := IOMSGDST;                          <<02803>>02874000
tos := 0;            tos := 4;                                 <<02803>>02876000
assemble(mfds 4);                                              <<02803>>02878000
                                                               <<02803>>02880000
<< get tail pointer >>                                         <<02803>>02882000
if BUF'HDR(3) = 0  then                                        <<02803>>02884000
  begin    << this will be first on avail list >>              <<02803>>02886000
  BUF'HDR(2) := BUF'HDR(3) := DST'ARRAY(CURRENT'INDEX);        <<02803>>02888000
  end                                                          <<02803>>02890000
else                                                           <<02803>>02892000
  begin    << must chain this buffer onto prior buffer >>      <<02803>>02894000
  << move this one's pointer to current last guy's >>          <<02803>>02896000
  tos := IOMSGDST;    tos := BUF'HDR(3);                       <<02803>>02898000
  tos := @DST'ARRAY(CURRENT'INDEX); tos := 1;                  <<02803>>02900000
  assemble(mtds 4);                                            <<02803>>02902000
                                                               <<02803>>02904000
  << fix tail pointer only >>                                  <<02803>>02906000
  BUF'HDR(3) := DST'ARRAY(CURRENT'INDEX);                      <<02803>>02908000
  end;                                                         <<02803>>02910000
                                                               <<02803>>02912000
<< now, write back new header info >>                          <<02803>>02914000
tos := IOMSGDST;        tos := 0;                              <<02803>>02916000
tos := @BUF'HDR;        tos := 4;                              <<02803>>02918000
assemble(mtds 4);                                              <<02803>>02920000
BUF'HDR:=0;tos:=IOMSGDST;tos:=BUF'HDR(3);tos:=@BUF'HDR;tos:=1; <<02803>>02922000
assemble(mtds 4); end;   << of subroutine GIVE'BACK'BUFFER >>  <<02803>>02924000
$PAGE                                                          <<04187>>02926000
subroutine UNIMPEDE'PROCESS;                                   <<04187>>02928000
begin                                                          <<04187>>02930000
                                                               <<04270>>02932000
<< If IOMESSPROC was waiting on buffer, re-queue msg >>        <<04270>>02934000
if PORTSTATUS(3) then                                          <<04270>>02936000
  begin                                                        <<04270>>02938000
  assemble(adds 4);  << return cells >>                        <<04270>>02940000
  RECEIVEMSG(3,4,0);                                           <<04270>>02942000
  SENDMSG(THISPIN,0,4,%140000);                                <<04270>>02944000
  return;                                                      <<04270>>02946000
  end;                                                         <<04270>>02948000
                                                               <<04270>>02950000
PDISABLE;    << protect integrity of IMP chain >>              <<02803>>02952000
if IOMSGQUEUE = 0 then                                         <<02803>>02954000
  begin    << there are no PINs waiting >>                     <<02803>>02956000
  PENABLE;                                                     <<02803>>02958000
  return;                                                      <<02803>>02960000
  end;                                                         <<02803>>02962000
                                                               <<02803>>02964000
<< fix up linking >>                                           <<02803>>02966000
tos := IOMSGQUEUE;   << save PIN to UNIMPEDE on tos >>         <<02803>>02968000
IOMSGQUEUE := absolute(absolute(PCBB) + (IOMSGQUEUE*PCBSIZE) + <<02803>>02970000
              PCB8).PCBM;  << put next PIN into IOMSGQUEUE >>  <<02803>>02972000
X := (S0*PCBSIZE)+absolute(PCBB)+PCB8; << awoken PINs index+8 ><<02803>>02974000
absolute(X).PCBM := 0;  << zero NIMP field of PCB to be awoken <<02803>>02976000
UNIMPEDE(tos*PCBSIZE);  << unimpede pin 1st on list >>         <<02803>>02978000
PENABLE;                                                       <<02803>>02980000
                                                               <<02803>>02982000
<< if process was impeded & watchdog timer, clear timer >>     <<02803>>02984000
if TRLX <> 0 then                                              <<02803>>02986000
  begin    << abort/cancel this timer request >>               <<02803>>02988000
  SETSYSDB;                                                    <<02803>>02990000
  ABORTTIMEREQ(TRLX);                                          <<02803>>02992000
  RESETDB(-1);                                                 <<02803>>02994000
  TRLX := 0;  LAST'TIME := 0D;                                 <<02803>>02996000
  end;                                                         <<02803>>02998000
                                                               <<02803>>03000000
end;   << of subroutine GIVE'BACK'BUFFER >>                    <<02803>>03002000
$PAGE                                                          <<04270>>03004000
logical subroutine NO'BUF'AVAIL;                               <<04270>>03006000
<< Returns TRUE if no MSG buffers available >>                 <<04270>>03008000
begin                                                          <<04270>>03010000
<< Move in buffer DST header >>                                <<04270>>03012000
tos := @BUF'HDR;       tos := IOMSGDST;                        <<04270>>03014000
tos := 0;              tos := 4;                               <<04270>>03016000
assemble(mfds 4);                                              <<04270>>03018000
                                                               <<04270>>03020000
<< See if no available buffers >>                              <<04270>>03022000
if BUF'HDR(2) = 0 then                                         <<04270>>03024000
  NO'BUF'AVAIL := true                                         <<04270>>03026000
else                                                           <<04270>>03028000
  NO'BUF'AVAIL := false;                                       <<04270>>03030000
                                                               <<04270>>03032000
end;                                                           <<04270>>03034000
$PAGE                                                          <<04187>>03036000
subroutine MAKE'BUFFER'AVAIL;                                  <<02803>>03038000
begin <<IO is done, so clean-up>>                              <<02803>>03040000
                                                               <<02803>>03042000
SAVESIR := GETSIR(MSGSIR);  << Save integrity of msg bufs >>   <<04270>>03044000
                                                               <<02803>>03046000
<< give buffer back to available pool >>                       <<02803>>03048000
GIVE'BACK'BUFFER;                                              <<02803>>03050000
                                                               <<02803>>03052000
<< if any process waiting on buffers, unimpede >>              <<02803>>03054000
UNIMPEDE'PROCESS;                                              <<02803>>03056000
                                                               <<02803>>03058000
RELSIR(MSGSIR,SAVESIR);  << Make SIR available again >>        <<04270>>03060000
                                                               <<02803>>03062000
<<now, compress the table>>                                    <<02803>>03064000
move IOQ'ARRAY(CURRENT'INDEX) :=                               <<02803>>03066000
IOQ'ARRAY(CURRENT'INDEX+1),(LAST'ENTRY-CURRENT'INDEX);         <<02803>>03068000
move DST'ARRAY(CURRENT'INDEX) :=                               <<02803>>03070000
DST'ARRAY(CURRENT'INDEX+1),(LAST'ENTRY-CURRENT'INDEX);         <<02803>>03072000
LAST'ENTRY := LAST'ENTRY - 1;                                  <<02803>>03074000
CURRENT'INDEX := CURRENT'INDEX - 1;                            <<02803>>03076000
end;                                                           <<02803>>03078000
$PAGE "IOMESSPROC PROCEDURE OUTER BLOCK"                       <<02803>>03080000
$PAGE "IOMSGPROC PROCEDURE MAINLINE"                           <<04187>>03082000
LAST'ENTRY := -1;   <<initialize last index pointer used>>     <<02803>>03084000
TRLX := 0;          << no current watchdog timer >>            <<02803>>03086000
                                                               <<02803>>03088000
Start:                                                         <<02803>>03090000
                                                               <<02803>>03092000
if SHUTDOWN.(3:1) then                                         <<02803>>03094000
  begin   <<process stop>>                                     <<02803>>03096000
  SETSYSDB;                                                    <<03072>>03098000
  AWAKE(PROGEN,2<<son>>,0);                                    <<02803>>03100000
  WAIT(0,0);        <<go to sleep forever>>                    <<02803>>03102000
$PAGE "IOMESSPROC"                                             <<04187>>03104000
  end;                                                         <<02803>>03106000
                                                               <<02803>>03108000
                                                               <<02803>>03110000
   <<check an see if any IPC messages are waiting>>            <<02803>>03112000
   while PORTSTATUS(0) do                                      <<02803>>03114000
      begin  <<there are messages to get & process>>           <<02803>>03116000
      assemble(adds 4); <<return cells>>                       <<02803>>03118000
      RECEIVEMSG(0,4,0); <<read 4 words from port 0,destructive<<02803>>03120000
      if = then                                                <<02803>>03122000
        begin  <<got message OK>>                              <<02803>>03124000
        case SM3 of                                            <<02803>>03126000
        begin                                                  <<02803>>03128000
                                                               <<02803>>03130000
<<0>>   begin <<error log sysbuf relative>>                    <<02803>>03132000
        SBUFX := SM2;    <<save system buffer index>>          <<02803>>03134000
        MOVE'LENGTH := SM1; <<save length to log from SYSBUF>> <<02803>>03136000
        tos := 0;        <<beginning of temp buffer>>          <<02803>>03138000
        @LOG'BUF'PTR := @SM0; <<save DB addr of this buffer>>  <<02803>>03140000
        tos := MOVE'LENGTH-1; <<addt'l buffer space>>          <<02803>>03142000
        assemble(adds 0);     <<allocate buffer>>              <<02803>>03144000
                                                               <<02803>>03146000
        <<move in information from system buffer>>             <<02803>>03148000
        tos := @LOG'BUF'PTR;  <<target DB address>>            <<02803>>03150000
        tos := SBUFDST;       <<source DST is SYSBUFS>>        <<02803>>03152000
        tos := logical(SBUFX)-SYSB'LOC; <<location of buf in XD<<02803>>03154000
        tos := MOVE'LENGTH;   <<length of data in SYSBUF>>     <<02803>>03156000
        assemble(mfds 4);     <<move in data>>                 <<02803>>03158000
                                                               <<02803>>03160000
        <<now, free up system buffer>>                         <<02803>>03162000
        SETSYSDB;                                              <<02803>>03164000
        RETURNSBUF(SBUFX);                                     <<02803>>03166000
        RESETDB(-1);                                           <<02803>>03168000
                                                               <<02803>>03170000
        <<add in logging information>>                         <<02803>>03172000
        tos := MOVE'LENGTH - 13;  <<length of variable info>>  <<02803>>03174000
        tos := 11;                <<log type>>                 <<02803>>03176000
        LOG;                                                   <<02803>>03178000
                                                               <<02803>>03180000
        end;                                                   <<02803>>03182000
                                                               <<02803>>03184000
<<1>>   begin << table-overflow error >>                       <<02803>>03186000
                                                               <<02803>>03188000
        << move table name to array >>                         <<02803>>03190000
        move B'BUF'HDR := "MPE Table ",2;                      <<02803>>03192000
        case SM3 of   << actually s-2, but have stacked parm>> <<02803>>03194000
        begin                                                  <<02803>>03196000
        move * := "TBUF",2;                                    <<02803>>03198000
        move * := "SBUF",2;                                    <<02803>>03200000
        move * := "IOQ",2;                                     <<02803>>03202000
        move * := "DISC REQUEST",2;                            <<02803>>03204000
        move * := "TRL",2;                                     <<02803>>03206000
        end;                                                   <<02803>>03208000
        move * := (" has overflowed!!!",%7,%7<<bell>>),2;      <<02803>>03210000
        MOVE'LENGTH := (tos-@B'BUF'HDR+1)&lsr(1);     << ajk >><<02803>>03212000
                                                               <<02803>>03214000
        <<get SYSBUF to move it to>>                           <<02803>>03216000
        SETSYSDB;                                              <<02803>>03218000
        @LOG'BUF'PTR := GETSBUF(2);                            <<02803>>03220000
        RESETDB(-1);                                           <<02803>>03222000
        if @LOG'BUF'PTR <> 0 then                              <<02803>>03224000
          begin  << we got one >>                              <<02803>>03226000
          SBUFX := integer(@LOG'BUF'PTR-SYSB'LOC);<<SBUF indx>><<02803>>03228000
          << move data to sysbuf >>                            <<02803>>03230000
          tos := SBUFDST;   <<DST of system buffers>>          <<02803>>03232000
          tos := SBUFX;     <<offset into system buffers>>     <<02803>>03234000
          tos := @BUF'HDR;  <<source DB address>>              <<02803>>03236000
          tos := MOVE'LENGTH;                                  <<02803>>03238000
          assemble(mtds 4);                                    <<02803>>03240000
                                                               <<02803>>03242000
          << now, perform ATTACHIO to send to console, ASAP!>> <<02803>>03244000
     tos:=ATTACHIO(CONSCELL,            <<ldev of console>>    <<02803>>03246000
                   0,  <<QMISC>>                               <<02803>>03248000
                   0,  <<DSTX, SYSBUF used>>                   <<02803>>03250000
                   SBUFX,  <<SYSBUF index>>                    <<02803>>03252000
                   1,  <<FUNC, write>>                         <<02803>>03254000
                   MOVE'LENGTH, <<CNT>>                        <<02803>>03256000
                   0,0,<<P1, P2>>                              <<02803>>03258000
                   %17);<<SBUF,no IMPEDE,no PCB>>              <<02803>>03260000
                                                               <<02803>>03262000
          << if doubleword on tos is zero, then failed >>      <<02803>>03264000
          assemble(dtst,ddel);                                 <<02803>>03266000
          if = then                                            <<02803>>03268000
            begin  << must return system buffer >>             <<02803>>03270000
            SETSYSDB;                                          <<02803>>03272000
            RETURNSBUF(@LOG'BUF'PTR);                          <<02803>>03274000
            RESETDB(-1);                                       <<02803>>03276000
            end;                                               <<02803>>03278000
                                                               <<02803>>03280000
          << Now, log message to CONSOLE logging >>            <<02803>>03282000
          LOG15(MOVE'LENGTH*2,@B'BUF'HDR,MOVE'LENGTH*2,15);    <<02803>>03284000
                                                               <<02803>>03286000
          end;                                                 <<02803>>03288000
                                                               <<02803>>03290000
        end;                                                   <<02803>>03292000
                                                               <<02803>>03294000
<<2>>   begin <<IOQ index for sent message>>                   <<02803>>03296000
                                                               <<02803>>03298000
        <<store IOQ & DST associated in last element of array>><<02803>>03300000
        LAST'ENTRY := LAST'ENTRY + 1; <<increment last entry po<<02803>>03302000
        IOQ'ARRAY(LAST'ENTRY) := SM2; <<store IOQ>>            <<02803>>03304000
        DST'ARRAY(LAST'ENTRY) := SM1; <<store DST>>            <<02803>>03306000
                                                               <<02803>>03308000
        <<now, mark the IOQ with this PCB, IW bit>>            <<02803>>03310000
        @LOG'BUF'PTR := logical(SM2)+IOQ'TABLE'LOC; <<load IOQ <<02803>>03312000
        SETSYSDB;                                              <<02803>>03314000
        DISABLE;                                               <<02803>>03316000
        if not LOG'BUF'PTR.(6:1) then <<if not completed>>     <<02803>>03318000
          begin                                                <<02803>>03320000
          LOG'BUF'PTR.(4:1) := 1;  <<turn on WAKE bit>>        <<02803>>03322000
          LOG'BUF'PTR(10).(0:8) := THISPIN; << set this PCB >> <<02803>>03324000
          end;                                                 <<02803>>03326000
        ENABLE;                                                <<02803>>03328000
        RESETDB(-1);                                           <<02803>>03330000
        end;                                                   <<02803>>03332000
                                                               <<03072>>03334000
<<3>>   begin <<GENMSG from I/O driver, ICS spawned>>          <<02803>>03336000
        SAVESIR := GETSIR(MSGSIR); << Protect MSGBUF integrity <<04270>>03338000
        if NO'BUF'AVAIL then                                   <<04270>>03340000
          begin                                                <<04270>>03342000
          << Send parms to port 3 and put dummy parms on tos >><<04270>>03344000
          SENDMSG(THISPIN,3,4,%100000);                        <<04270>>03346000
          tos := 0D;                                           <<04270>>03348000
          tos := 0D;                                           <<04270>>03350000
          end                                                  <<04270>>03352000
        else                                                   <<04270>>03354000
                                                               <<04270>>03356000
        begin                                                  <<04270>>03358000
        SBUFX := SM2;     <<save sysbuf index>>                <<02803>>03360000
        @LOG'BUF'PTR := SM2; <<load as DB pointer, too>>       <<02803>>03362000
        FLAG := false;    <<reply flag>>                       <<02803>>03364000
        SETSYSDB;                                              <<02803>>03366000
        tos := 0;       <<return value from GENMSG>>           <<02803>>03368000
        X := 0;                                                <<02803>>03370000
        while (X := X+1) < 15 do                               <<02803>>03372000
          tos := LOG'BUF'PTR(X);<<load GENMSG parms on tos>>   <<02803>>03374000
        DSTX := LOG'BUF'PTR(12); <<save DITP in DSTX>>         <<02803>>03376000
        <<return system buffer>>                               <<02803>>03378000
        RETURNSBUF(SBUFX);                                     <<02803>>03380000
        assemble(tbc DSTB); <<see if REPLY and no DST>>        <<02803>>03382000
        if <> then                                             <<02803>>03384000
          begin                                                <<02803>>03386000
          if DSTNUM = 0 then                                   <<02803>>03388000
            SUDDENDEATH(271);                                  <<02803>>03390000
          FLAG := true; <<can't put reply stack relative>>     <<02803>>03392000
          BUF := BUF+DSTNUM-(DST(DITDSTI)+SYSDB);              <<02803>>03394000
          DSTNUM := DITDST;                                    <<02803>>03396000
          end;                                                 <<02803>>03398000
        RESETDB(-1);  <<DB is back to stack>>                  <<02803>>03400000
        assemble(pcal GENMSG);                                 <<02803>>03402000
        assemble(del);  <<delete return value on tos>>         <<02803>>03404000
        if FLAG then                                           <<02803>>03406000
          begin                                                <<02803>>03408000
          SETSYSDB;                                            <<02803>>03410000
          tos := DSTX;            <<get the DIT pntr>>         <<02803>>03412000
          DISABLE;                                             <<02803>>03414000
          PS0.IAK := 1;   <<set interrupt ack bit>>            <<02803>>03416000
          tos := PS0(DIOQP); <<set msg reply in IOQ>>          <<02803>>03418000
          if <> then                                           <<02803>>03420000
            PS0.MSGREPLY := 1;                                 <<02803>>03422000
          ENABLE;                                              <<02803>>03424000
          assemble(del);  <<delete pointer>>                   <<02803>>03426000
          AWAKEIO(*,NOIMPEDE);                                 <<02803>>03428000
          RESETDB(-1);                                         <<02803>>03430000
          end;                                                 <<02803>>03432000
        end;   << of ELSE on NO'BUF'AVAIL >>                   <<04270>>03434000
                                                               <<04270>>03436000
        RELSIR(MSGSIR,SAVESIR);                                <<04270>>03438000
        end;                                                   <<02803>>03440000
                                                               <<02803>>03442000
<<4>>  begin << Process device maintenence request >>          <<03101>>03444000
       PROC'MAINT'REQ(SM2,SM1,SM0);                            <<03101>>03446000
       end;                                                    <<03101>>03448000
                                                               <<03101>>03450000
<<5>>   PROC'DCU'REQUEST(SM2,DST'DCU'LOG); << DCU maintenence>><<04187>>03452000
                                                               <<04187>>03454000
        end; <<of case on message type>>                       <<02803>>03456000
                                                               <<02803>>03458000
        assemble(subs 4);  <<pop 4 words off tos>>             <<02803>>03460000
        end;  <<of successful RCPT of IPC msg>>                <<02803>>03462000
                                                               <<02803>>03464000
                                                               <<03101>>03466000
                                                               <<03101>>03468000
                                                               <<03101>>03470000
                                                               <<03072>>03472000
      end;    <<of check for any IPC message>>                 <<02803>>03474000
                                                               <<02803>>03476000
   <<now, see if any IOQ's have completed so we can>>          <<02803>>03478000
   <<release their DST>>                                       <<02803>>03480000
   CURRENT'INDEX := -1;                                        <<02803>>03482000
   while (CURRENT'INDEX:=CURRENT'INDEX+1) <= LAST'ENTRY do     <<02803>>03484000
     begin  <<check the IOQ's>>                                <<02803>>03486000
     IOSTATUS(IOQ'ARRAY(CURRENT'INDEX));                       <<02803>>03488000
     if = then                                                 <<02803>>03490000
       MAKE'BUFFER'AVAIL;  << I/O has completed >>             <<02803>>03492000
     end;                                                      <<02803>>03494000
                                                               <<02803>>03496000
<< perform watchdog timer housekeeping >>                      <<02803>>03498000
if TRLX <> 0 then                                              <<02803>>03500000
  begin   << watchdog timer is set, see if expired >>          <<02803>>03502000
  NEW'TIME := TIMER - LAST'TIME;  << delta time in ms >>       <<02803>>03504000
  if < then   << system clock wrap-around >>                   <<02803>>03506000
    NEW'TIME := %17777777777D - NEW'TIME + 1D;                 <<02803>>03508000
  if NEW'TIME >= PAUSE'TIME then                               <<02803>>03510000
    if LAST'ENTRY >= 0 then                                    <<02803>>03512000
      begin  << we will kill the oldest outstanding msg >>     <<02803>>03514000
      CURRENT'INDEX := 0;                                      <<02803>>03516000
      tos := IOQ'ARRAY(CURRENT'INDEX); << oldest IOQ on tos >> <<02803>>03518000
      SETSYSDB;                                                <<02803>>03520000
      ABORTIOX(*);                                             <<02803>>03522000
      RESETDB(-1);                                             <<02803>>03524000
      MAKE'BUFFER'AVAIL;                                       <<02803>>03526000
      end;                                                     <<02803>>03528000
  end;   << of processing "popped" watchdog timer >>           <<02803>>03530000
                                                               <<02803>>03532000
<< if no watchdog timer & have impeded processes, get one >>   <<02803>>03534000
PDISABLE;                                                      <<02803>>03536000
if IOMSGQUEUE <> 0 then  << there are impeded processes >>     <<02803>>03538000
  if TRLX = 0 then   << there is no current watchdog timer >>  <<02803>>03540000
    begin                                                      <<02803>>03542000
                                                               <<02803>>03544000
    LAST'TIME := TIMER;   << save time of call >>              <<02803>>03546000
    << stack ops for call to TIMEREQ >>                        <<02803>>03548000
    tos := 0;     << TRLX returned >>                          <<02803>>03550000
    tos := %12;   << CODE %12 is watchdog timer >>             <<02803>>03552000
    tos := IOMSGPROC;  << my PCB offset from PCB base >>       <<02803>>03554000
    tos := PAUSE'TIME; << Delay time in ms (double) >>         <<02803>>03556000
                                                               <<02803>>03558000
    SETSYSDB;                                                  <<02803>>03560000
    assemble(pcal TIMEREQ);                                    <<02803>>03562000
    << or tos := TIMEREQ(%12,IOMSGPROC,PAUSE'TIME); >>         <<02803>>03564000
    RESETDB(-1);                                               <<02803>>03566000
                                                               <<02803>>03568000
    << save TRLX index >>                                      <<02803>>03570000
    TRLX := tos;                                               <<02803>>03572000
    end;                                                       <<02803>>03574000
                                                               <<02803>>03576000
PENABLE;                                                       <<02803>>03578000
                                                               <<02803>>03580000
<<now, wait for a new event to wake me up>>                    <<02803>>03582000
WAIT(-(%114)<<IO,timer,msg>>,0);                               <<02803>>03584000
go to Start;                                                   <<02803>>03586000
                                                               <<02803>>03588000
end;   <<of process/procedure IOMESSPROC>>                     <<02803>>03590000
$INCLUDE INCLVDEV                                              <<04339>>03594000
$PAGE "SDFINIT PROCEDURE - DATA DEFINITIONS"                            03596000
<<****************************************>>                   <<03109>>03598000
<<****************************************>>                   <<03109>>03600000
<<*                                      *>>                   <<03109>>03602000
<<*          PROCEDURE SDFINIT           *>>                   <<03109>>03604000
<<*                                      *>>                   <<03109>>03606000
<<****************************************>>                   <<03109>>03608000
<<****************************************>>                   <<03109>>03610000
                                                               <<03109>>03612000
                                                               <<03109>>03614000
<<------------------------------------------------------>>     <<03109>>03616000
<<                                                      >>     <<03109>>03618000
<<  CHANGES WERE MADE TO THIS PROCEDURE IN NOVEMBER AND >>     <<03109>>03620000
<<  DECEMBER OF 1981 TO ADD THE CS-80 DISC DRIVES AND   >>     <<03109>>03622000
<<  THE HP9140 CARTRIDGE TAPE DRIVE AS SOURCE DEVICES   >>     <<03109>>03624000
<<  FOR SOFTDUMP.  THE SUBROUTINE PUT'BOOTS'ON'DEV WAS  >>     <<03109>>03626000
<<  WAS ADDED TO DECIDE WHICH SET OF BOOT CHANNEL       >>     <<03109>>03628000
<<  PROGRAMS WOULD BE BUILT.  THE BOOTSTRAPS FOR CS-80  >>     <<03109>>03630000
<<  DEVICES ARE BUILT AND STORE ONTO THE DEVICE BY THE  >>     <<03109>>03632000
<<  SUBROUTINE CONFIGURE'CS80'BOOTS.  CHANGES WERE ALSO >>     <<03109>>03634000
<<  MADE BECAUSE SOFTDUMP WAS GETTING TOO LARGE FOR     >>     <<03109>>03636000
<<  THE LOWER HALF OF BANK 0.  THE BOOTSTRAP NOW READS  >>     <<03109>>03638000
<<  THE BOOTSTRAP EXTENSION INTO %175000 OF BANK 0 FOR  >>     <<03109>>03640000
<<  %2000 WORDS. THE BOOTSTRAP EXTENSION SAVES ALL OF   >>     <<03109>>03642000
<<  BANK 0 BELOW WERE IT SITS IN MEMORY.  A CHANNEL     >>     <<03109>>03644000
<<  PROGRAM CAN NOT READ THE LAST WORD IN A BANK !!!!!  >>     <<03109>>03646000
<<  THAT IS WHY THE BOOTSTRAP EXTENSION IS ONE HP9140   >>     <<03109>>03648000
<<  SECTOR LENGTH FROM THE TOP OF BANK 0.  THE HP9140   >>     <<03109>>03650000
<<  HAS A SECTOR SIZE OF 512 WORDS.  THE ADDRESSES AND  >>     <<03109>>03652000
<<  THE LENGTHS OF THE AREAS IN THE SDFLOAD FILE ARE    >>     <<03109>>03654000
<<  ARE ADJUSTED BY THE CODE TO ALIGN ON HP9140 SECTOR  >>     <<03109>>03656000
<<  BOUNDERIES.  WHEN MAKING CHANGES BE CAREFUL  NOT TO >>     <<03109>>03658000
<<  UNDO THE ALIGNING.                                  >>     <<03109>>03660000
<<                                                      >>     <<03109>>03662000
<<------------------------------------------------------>>     <<03109>>03664000
                                                               <<03109>>03666000
                                                               <<03109>>03668000
PROCEDURE SDFINIT(MODE);                                                03670000
VALUE MODE;                                                             03672000
LOGICAL                                                                 03674000
   MODE;               <<0 - NORMAL                                     03676000
                         1 - BACKUP>>                                   03678000
  option privileged,uncallable;                                <<02637>>03680000
BEGIN                                                                   03682000
<<THIS PROCEDURE IS CALLED BY THE PROGENITOR DURING ITS                 03684000
  INITIALIZATION PHASE.  IT INITIALIZES THE SOFTWARE DUMP               03686000
  FACILITY (SDF) BY:                                                    03688000
  1. CONFIGURING BOTH THE BOOTSTRAP (ON DISC AND IN MEMORY)             03690000
     AND THE BOOTSTRAP EXTENSION.                                       03692000
  2. CONFIGURING SDF DATA SEGMENT TABLE ENTRIES TO POINT                03694000
     TO THE DISC IMAGE OF BANK 0.                                       03696000
  3. IF NOT GENERATING A BACKUP VERSION:                                03698000
     A. PLACING SYSTEM CONFIGURATION DATA INTO A RESERVED DATA          03700000
        SEGMENT OF SDF'S.                                               03702000
     B. PROCESSING THE OPTIONAL DUMPFILE COMMAND IN THE COMMAND FILE.   03704000
                                                                        03706000
   RETURNS:                                                             03708000
      CCE - OPERATION COMPLETED SUCCESSFULLY                            03710000
      CCL - OPERATION ABORTED                                           03712000
      CCG - NOT RETURNED                                                03714000
>>                                                                      03716000
                                                                        03718000
                                                                        03720000
<<* * * VERSION * * *>>                                                 03722000
                                                                        03724000
EQUATE                                                                  03726000
   VERSION          = %0012;  <<LEFT BYTE - UPDATE, RIGHT BYTE - FIX>>  03728000
                                                                        03730000
                                                                        03732000
<<* * * MISCELLANEOUS DEFINITIONS * * *>>                               03734000
                                                                        03736000
LOGICAL STAT=Q-1;                                                       03738000
LOGICAL RETURNP=Q-2;  <<RETURN POINTER IN STACK MARKER>>                03740000
INTEGER DELTAQ=Q-0;                                                     03742000
                                                                        03744000
EQUATE                                                                  03746000
   SYSDBDATASEG     = %11,                                              03748000
   JMATDST          = 25,                                               03750000
   JMATLIMIT        = 8,                                                03752000
   SYSDBLOC         = %1000,                                            03754000
   LOWMEMORYSIZE    = %40,   <<CST PTR THRU MASK WORDS >>      <<03011>>03756000
   HIMEMORYLOC      = %1600,                                            03758000
   SECTORSIZE       = 128,                                              03760000
   HP9140'SECTOR    = %1000,                                   <<03608>>03762000
   DISABLETRAPS     = FALSE,                                            03764000
   ICF44            = 4,                                       <<01573>>03766000
   ICF55            = 5,                                       <<01573>>03768000
   ICF25            = 2;                                                03770000
DOUBLE OFFSETFACTOR,                                           <<03608>>03772000
       SLOPLENGTH,                                             <<03608>>03774000
       SDFMAPLENGTH;                                           <<03608>>03776000
INTEGER SECTOR'COUNT;                                          <<03608>>03778000
LOGICAL SECTORSIZ;                                             <<03608>>03780000
LOGICAL LDNFORGETDEVINFO;                                      <<03608>>03782000
BYTE ARRAY LDNALPHA(0:8);                                      <<03608>>03784000
                                                                        03786000
INTEGER XREG=X;                                                         03788000
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;        03790000
POINTER SP0=S-0;                                                        03792000
INTEGER QM0=Q-0,QM5=Q-5,QM7=Q-7;                                        03794000
LOGICAL LS0=S-0;                                                        03796000
BYTE BS0=S-0,BS1=S-1;                                                   03798000
BYTE POINTER BPS0=S-0,BPS1=S-1;                                         03800000
DOUBLE DS3=S-3,DS6=S-6,DS8=S-8;                                         03802000
                                                                        03804000
DEFINE                                                                  03806000
   DEVINFOTYPE      = DEVINFO(1).(10:6)#,                      <<03608>>03808000
   DATASEGADDRESS   = DSTBASE(4*DST+3)#;                                03810000
                                                                        03812000
EQUATE CCG=0,                                                           03814000
       CCL=1,                                                           03816000
       CCE=2;                                                           03818000
                                                                        03820000
DEFINE CONDITIONCODE=STAT.(6:2)#;                                       03822000
                                                                        03824000
<<* * * FILE LABEL DEFINITIONS * * *>>                                  03826000
                                                                        03828000
EQUATE                                                                  03830000
   LABELEN          = 76;                                               03832000
DEFINE                                                                  03834000
   FLABSECTOFFSET   = BUF(39).(0:8)#,                                   03836000
   FLABEXTENT0      = BUF(44)      #,                                   03838000
   FLABFIRSTEXTENT  = DBUF(22)     #;                                   03840000
                                                                        03842000
<<* * * SYSTEM DB * * *>>                                               03844000
                                                                        03846000
DEFINE                                                                  03848000
   NUMBERBANKS      = ABSOLUTE(SYSDBLOC+%47)+1 #,                       03850000
   CONSOLELDEV      = ABSOLUTE(SYSDBLOC+%74)   #,                       03852000
   MAXSTACKSIZE     = ABSOLUTE(SYSDBLOC+%107)  #,                       03854000
   MAXDSEGSIZE      = ABSOLUTE(SYSDBLOC+%111)  #,                       03856000
   MAXDSEG          = ABSOLUTE(SYSDBLOC+%112)  #;                       03858000
$PAGE                                                          <<03011>>03860000
                                                               <<03011>>03862000
COMMENT                                                        <<03011>>03864000
        DISC FORMAT OF THE SDF FILE                            <<03011>>03866000
        ===========================                            <<03011>>03868000
                                                               <<03011>>03870000
    ----------------  <= SDFILEADDR (START ADDRESS SECTOR)     <<03011>>03872000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>03874000
    ----------------  <= BOOTXADDR                             <<03011>>03876000
    !              !       (CAN NOT CROSS CYL BOUNDARY)        <<03011>>03878000
    !     BOOTX    !       BOOTSTRAP EXTENSION- WILL BE READ   <<03011>>03880000
    !              !       BY BOOT INTO MEM(%77000) AND EXEC   <<03011>>03882000
    ----------------                                           <<03011>>03884000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>03886000
    ----------------  <= BOOTXSAVEADDR                         <<03011>>03888000
    !              !       (CAN NOT CROSS CYL BOUNDARY)        <<03011>>03890000
    !   BOOTXSAVE  !       SAVE MEMORY (%77000-%77777) HERE    <<03011>>03892000
    !              !       BEFORE BOOTX IS READ THERE          <<03011>>03894000
    ----------------                                           <<03011>>03896000
    !      XXX     !       (POSSIBLE HOLE FOR CYL BOUNDS)      <<03011>>03898000
    ----------------  <= SDFMAPADDR                            <<03011>>03900000
    !              !                                           <<03011>>03902000
    !    SDFMAP    !       SDFMAP - A STORAGE MAP - CONTAINS   <<03011>>03904000
    !              !       DISC/MEM ADDRS FOR STORED PORTIONS  <<03011>>03906000
    !              !       OF ORIGINAL MEM. (FOR SDFLOAD)      <<03011>>03908000
    ----------------  <= OVERLAYADDR                           <<03011>>03910000
    !              !                                           <<03011>>03912000
    !  OVERLAYAREA !       OVERLAYAREA - 1ST HALF OF BANK-0    <<03011>>03914000
    !              !       WILL BE SAVED TO DISC HERE          <<03011>>03916000
    !              !       (EXCEPT FOR BOOTXSAVED PORTION)     <<03011>>03918000
    ----------------  <= BANK1SAVEADDR                         <<03011>>03920000
    !              !                                           <<03011>>03922000
    !  BANK-1 SAVE !       BANK-1 SAVE AREA-  FOR ICF-55       <<03011>>03924000
    !              !       DRT TABLE (BANK-1) SAVED HERE       <<03011>>03926000
    ----------------  <= SDFCODEADDR                           <<03011>>03928000
    !              !                                           <<03011>>03930000
    !   SDF CODE   !       SDF CODE WILL BE READ FROM HERE     <<03011>>03932000
    !              !       INTO MEMORY FOR EXECUTION           <<03011>>03934000
    ----------------                                           <<03011>>03936000
                                                               <<03011>>03938000
END COMMENT;                                                   <<03011>>03940000
                                                               <<03011>>03942000
$PAGE                                                          <<03011>>03944000
                                                                        03946000
                                                               <<03011>>03950000
DEFINE                                                         <<03011>>03952000
    ONESECTOR          = 128#,               <<WORDS>>         <<03011>>03954000
                                                               <<03011>>03956000
    BOOTLEN            = 1D#,                <<SECTOR>>        <<03011>>03958000
    BOOTLENWD          = 128#,               <<WORDS>>         <<03011>>03960000
       <<128W = 1 SECTOR BOOTSTRAP PROGRAM>>                   <<03011>>03962000
                                                               <<03011>>03964000
    BOOTXLEN'          = 8#,                                   <<03608>>03966000
    BOOTXLEN           = 8D#,                                  <<03608>>03968000
    BOOTXLENWD         = 1024#,                                <<03608>>03970000
    BOOTXLENBT         = 2048#,                                <<03608>>03972000
       <<512W = 4 SECTOR BOOTSTRAP EXTENSION PROGRAM>>         <<03011>>03974000
                                                               <<03011>>03976000
    SLOPLEN            = BOOTXLEN - 1D#,                       <<03011>>03978000
    HP9140'SLOPLEN     = BOOTXLEN#,                            <<03608>>03980000
       << MUST BE MULTIPLE OF FOUR FOR HP9140    >>            <<03608>>03982000
       <<WORST CASE "WASTE" TO INSURE THAT THE BOOTX        >> <<03011>>03984000
       <<AND BOOTXSAVE AREAS DO NOT CROSS "CYLINDER" BOUNDARY>><<03011>>03986000
                                                               <<03011>>03988000
    BOOTXSAVELEN'      = BOOTXLEN'#,                           <<03608>>03990000
    BOOTXSAVELEN       = BOOTXLEN#,          <<SECTORS>>       <<03011>>03992000
    BOOTXSAVELENWD     = BOOTXLENWD#,        <<WORDS>>         <<03011>>03994000
       <<EXACT SAME SIZE AS THE BOOTSTRAP EXTENSION PROGRAM.>> <<03011>>03996000
       <<SAVE AREA FOR MEMORY WHICH WILL HOLD BOOTX PROG.>>    <<03011>>03998000
                                                               <<03011>>04000000
    SDFMAPLEN          = 1D#,                <<SECTORS>>       <<03011>>04002000
    BIGSDFMAPLEN       = 4D#, << SECTORS IN A HP9140 SECTOR >> <<03608>>04004000
    SDFMAPLENWD        = 128#,               <<WORDS>>         <<03011>>04006000
       <<A MAP OF STORAGE ADDRESSES FOR ORIG SECTIONS>>        <<03011>>04008000
       <<OF MEMORY STORED DURING BOOT,BOOTX,COLD-LOAD TRAP>>   <<03011>>04010000
                                                               <<03011>>04012000
       << CERTAIN DEFINES NEED PARENTHESIS TO WORK CORRECTLY >><<03608>>04014000
    OVERLAYAREALEN     = (508D - BOOTXSAVELEN)#, << SECTORS >> <<03608>>04016000
    OVERLAYAREALENWD   = ((508 - BOOTXSAVELEN') * ONESECTOR)#, <<03608>>04018000
       <<STORAGE AREA FOR THE 1ST HALF OF BANK-0 (EXCEPT FOR>> <<03011>>04020000
       <<PREV. STORED BOOTXSAVE)  %100000W = 256 SECTORS    >> <<03011>>04022000
       <<MINUS PREVIOUSLY STORED "BOOTXSAVELEN" SECTORS     >> <<03011>>04024000
                                                               <<03011>>04026000
    BANK1SAVELEN       = 16D#,               <<SECTORS>>       <<03011>>04028000
    BANK1SAVELENWD     = 2048#,              <<WORDS>>         <<03011>>04030000
       <<AREA FOR STORAGE OF BANK-1 DRT TABLE (FOR ICF-55) >>  <<03011>>04032000
       <<512 DEVICES X 4W ENTRIES = 2048W = 16 SECTORS     >>  <<03011>>04034000
                                                               <<03011>>04036000
    CODEAREALEN'       = 256#,               <<SECTORS>>       <<03109>>04038000
    CODEAREALEN        = 256D#,              <<SECTORS>>       <<03109>>04040000
    CODEAREALENWD      = 32768#,             <<WORDS>>         <<03109>>04042000
                                                               <<03011>>04044000
    SDFCODELOC  = BOOTXLEN + SLOPLEN +BOOTXSAVELEN +SDFMAPLEN+ <<03011>>04046000
                  OVERLAYAREALEN + BANK1SAVELEN#,              <<03011>>04048000
       <<SECTOR OFFSET FROM START OF FILE TO THE CODE PORTION>><<03011>>04050000
                                                               <<03011>>04052000
    SDFTOTALSECTORS = SDFCODELOC + CODEAREALEN#, <<SECTORS>>   <<03011>>04054000
    SDFTOTALNUMRECS = SDFTOTALSECTORS#,  <<RECSIZE=ONESECTOR>> <<03011>>04056000
       <<TOTAL LENGTH IN SECTORS = TOTAL NUMRECS >>            <<03011>>04058000
    SYSDBSECTORLOC     = 4D#,                                  <<03011>>04060000
       <<4 SECTOR OFFSET = 512W = %1000 >>                     <<03011>>04062000
                                                               <<03011>>04064000
    TWO'SECTORS        = SECTORSIZ * 2#,                       <<03608>>04066000
    HP9140'HIMEMSECL   = 2D#,                                  <<03608>>04068000
    HIMEMORYSECTORLOC  = 7D#;                                  <<03011>>04070000
       <<7 SECTOR OFFSET = 896W = %1600   TARGET FOR CODE>>    <<03011>>04072000
                                                               <<03011>>04074000
                                                               <<03011>>04076000
<<* * * GLOBAL DATA - USED IMPLICITLY BY ANY SUBROUTINE * * *>>         04082000
                                                                        04084000
DEFINE                                                                  04086000
   DTSUBTYPE        = DEVTIPE.(0:8)            #,                       04088000
   DTDEVICETYPE     = DEVTIPE.(8:8)            #,                       04090000
   DSUBTYPE         = DESC0.(9:4)              #,              <<03011>>04096000
   DDEVICETYPE      = DESC1.(10:6)             #;                       04100000
EQUATE                                                                  04102000
   NUMFILES         = 4,                                                04104000
   OLDSYSFILE       = 1,                                                04106000
   READWRITE        = 4;                                                04108000
INTEGER                                                                 04110000
   SDFILENUM:=0,CMDFILENUM:=0,DUMPFILENUM:=0,BACKUPFILENUM:=0,          04112000
   NULL := 0,CPUTYPE;                                          <<01573>>04114000
ARRAY FILEARRAY(*)=SDFILENUM;                                           04116000
BYTE ARRAY DESIG(0:9);                                                  04118000
INTEGER ARRAY                                                           04120000
   BUF(0:1024);                                                         04122000
DOUBLE POINTER                                                          04124000
   DBUF:=@BUF;                                                          04126000
BYTE POINTER                                                            04128000
   BBUF:=@BUF;                                                          04130000
                                                                        04132000
<<DISC DESCRIPTORS>>                                                    04134000
EQUATE                                                                  04136000
<<TYPES>>                                                               04138000
   T13037         = 0,                                                  04140000
   T7902          = 2,                                                  04142000
   CS80TYPE       = 3,                                         <<03608>>04144000
   HP9140         = 3,                                         <<03608>>04146000
   HP797X'TAPE    = 24,                                        <<03608>>04148000
                                                                        04150000
<<13037 CONTROLLER SUBTYPES>>                                           04152000
   HP7902         = 0,                                                  04154000
   R7905          = 4,                                                  04156000
   F7905          = 5,                                                  04158000
   ALL7905        = 6,                                                  04160000
   SYSDISCMODE    = 7,                                                  04162000
   ALL7920        = 8,                                                  04164000
   ALL7925        = 9,                                                  04166000
   R7906          = 10,                                                 04168000
   F7906          = 11,                                                 04170000
   ALL7906        = 12;                                                 04172000
ARRAY SECYLINDER(4:5)=PB:=                                              04174000
   96,48,144,144,240,576,96,96,192;                                     04176000
ARRAY HEADBASE(4:5)=PB:=                                                04178000
   0, %1000, 0, 0, 0, 0, 0, %1000, 0;                                   04180000
INTEGER ARRAY SECTRACK(4:5)=PB:=                                        04182000
   48,48,48,48,48,64,48,48,48;                                          04184000
INTEGER ARRAY FILEMASK(0:1) = PB :=                                     04186000
   %7406,%7406,%7406,%7406,                                             04188000
   %7406,%7405,%7407,%7407,%7407,%7407,%7406,%7406,%7407;               04190000
INTEGER ARRAY SECYLINDER7902(0:1)=PB:=30,60,26,52;                      04192000
INTEGER ARRAY SECTRACK7902(0:1)=PB:=30,30,26,26;                        04194000
                                                                        04196000
<<FOPEN DATA>>                                                          04198000
EQUATE                                                                  04200000
   FOPTIONSMASK     = %307,                                             04202000
   FIXED            = 0,                                                04204000
   OLDFILE          = 1,                                                04206000
   DISC             = 0,                                                04208000
   TYPE7902         = 2,                                                04210000
   SAVE             = 1,                                                04212000
   PROPERFOPTIONS   = 1,                                                04214000
   NOBUF'READWRITE  = %404,                                             04216000
   PROPERFILECODE   = 0,                                                04220000
   PROPERBLOCKFACTOR= 3,                                                04224000
   PROPERNUMEXTENTS = 1;                                                04226000
DEFINE                                                                  04228000
   NOTFIXEDRECFORMAT = FOPTIONS.(8:2) <> 0#;                            04230000
BYTE ARRAY SDFDESIG(0:1)=PB:=                                           04232000
   "SDFLOAD ";                                                          04234000
BYTE ARRAY BACKUPDESIG(0:1)=PB:=                                        04236000
   "SDFBACK ";                                                          04238000
BYTE ARRAY DUMPDESIG(0:1)=PB:=                                          04240000
   "SDFDUMP ";                                                          04242000
BYTE ARRAY CMDESIG(0:1)=PB:=                                            04244000
   "SDFCOM ";                                                           04246000
ARRAY LPCLASS(0:1)=PB:=                                                 04248000
   "DLP     ";                                                          04250000
ARRAY DUMPDEVCLASS(0:1)=PB:=                                            04252000
   "DDUMP   ";                                                          04254000
INTEGER                                                                 04256000
   FN,BLOCKSIZE,LOGDEVICE,DEVICETYPE,RECSIZE,HDADDR,FILECODE,NUMEXTENT, 04258000
   BLOCKFACTOR;                                                         04260000
LOGICAL                                                                 04262000
   FOPTIONS;                                                            04264000
DOUBLE                                                                  04266000
   NUMREC,LABELADDR;                                                    04268000
INTEGER                                                                 04270000
   LABEL0=LABELADDR,LABEL1=LABELADDR+1;                                 04272000
INTEGER ARRAY                                                           04274000
   CLASSNAME(0:4);                                                      04276000
EQUATE                                                                  04278000
   SDFDESIGLEN    = 8,                                                  04280000
   DUMPDESIGLEN   = 8,                                                  04282000
   CMDESIGLEN     = 7,                                                  04284000
   BACKUPDESIGLEN = 8;                                                  04286000
                                                                        04288000
<<MESSAGE DATA>>                                                        04290000
                                                                        04292000
DEFINE                                                                  04294000
   SUCCESSFUL       = 0                            #,                   04296000
   UGLYSDFILE       = 1 CAT SDFILENUM(0:8:8)       #,                   04298000
   UGLYSDFOPTIONS   = 2 CAT SDFILENUM(0:8:8)       #,                   04300000
   UGLYSDFRECSIZE   = 3 CAT SDFILENUM(0:8:8)       #,                   04302000
   UGLYSDFLDEV      = 4 CAT SDFILENUM(0:8:8)       #,                   04304000
   UGLYSDFILECODE   = 5 CAT SDFILENUM(0:8:8)       #,                   04306000
   UGLYSDFNUMRECS   = 6 CAT SDFILENUM(0:8:8)       #,                   04308000
   UGLYSDFNUMEXTENT = 7 CAT SDFILENUM(0:8:8)       #,                   04310000
   SDFILERR         = 8 CAT SDFILENUM(0:8:8)       #,                   04312000
   UGLYBACKUPFILE   = 9 CAT BACKUPFILENUM(0:8:8)   #,                   04314000
   BACKUPNOTSERIAL  = 10 CAT BACKUPFILENUM(0:8:8)  #,                   04316000
   BACKUPFILERR     = 11 CAT BACKUPFILENUM(0:8:8)  #,                   04318000
   UGLYCOMMANDFILE  = 12 CAT CMDFILENUM(0:8:8)     #,                   04320000
   UGLYCOMFOPTIONS  = 13 CAT CMDFILENUM(0:8:8)     #,                   04322000
   UGLYCOMRECSIZE   = 14 CAT CMDFILENUM(0:8:8)     #,                   04324000
   UGLYCOMDEV       = 15 CAT CMDFILENUM(0:8:8)     #,                   04326000
   UGLYCOMEXTENTS   = 16 CAT CMDFILENUM(0:8:8)     #,                   04328000
   UGLYDUMPFILE     = 17 CAT DUMPFILENUM(0:8:8)    #,                   04330000
   UGLYDUMPFOPTIONS = 18 CAT DUMPFILENUM(0:8:8)    #,                   04332000
   UGLYDUMPRECSIZE  = 19 CAT DUMPFILENUM(0:8:8)    #,                   04334000
   UGLYDUMPDEV      = 20 CAT DUMPFILENUM(0:8:8)    #,                   04336000
   UGLYDEXTENTS     = 21 CAT DUMPFILENUM(0:8:8)    #,                   04338000
   UGLYBLOCKFACTOR  = 22 CAT CMDFILENUM(0:8:8)     #,          <<03608>>04340000
   BADDEVICE        = 23 CAT DEVTIPE(0:8:8)        #;          <<03608>>04342000
INTEGER                                                                 04344000
   MSGSTART,MSGEND;                                                     04346000
BYTE ARRAY MSGARRAY(0:1)=PB:=                                           04348000
   "#",                                                                 04350000
   "SDF FILE DOES NOT EXIST#",                                          04352000
   "SDF FILE HAS INVALID FOPTIONS#",                                    04354000
   "SDF FILE HAS INVALID RECORD SIZE#",                                 04356000
   "SDF FILE IS NOT ON THE SYSTEM DISC#",                               04358000
   "SDF FILE HAS AN INVALID FILE CODE#",                                04360000
   "SDF FILE HAS AN INSUFFICIENT NUMBER OF RECORDS#",                   04362000
   "SDF FILE HAS MORE THAN ONE EXTENT#",                                04364000
   "ERROR ENCOUNTERED ACCESSING SDF FILE#",                             04366000
   "UNABLE TO OPEN BACKUP FILE#",                                       04368000
   "BACKUP FILE NOT A SERIAL DISC#",                                    04370000
   "ERROR ENCOUNTERED WHILE ACCESSING BACKUP FILE#",                    04372000
   "UNABLE TO OPEN COMMAND FILE#",                                      04374000
   "COMMAND FILE HAS INVALID FOPTIONS#",                                04376000
   "COMMAND FILE HAS INVALID RECORD SIZE#",                             04378000
   "COMMAND FILE IS NOT ON A DISC#",                                    04380000
   "COMMAND FILE HAS MORE THAN ONE EXTENT#",                            04382000
   "UNABLE TO OPEN DISC DUMP FILE#",                                    04384000
   "DISC DUMP FILE HAS INVALID FOPTIONS#",                              04386000
   "DISC DUMP FILE HAS INVALID RECORD SIZE#",                           04388000
   "DISC DUMP FILE IS NOT ON A DISC#",                                  04390000
   "DUMP FILE HAS MORE THAN ONE EXTENT#",                               04392000
   "COMMAND FILE BLOCK FACTOR <> 5#",                          <<03608>>04394000
   "BADDEVICE CAN'T CONFIGURE BOOT #";                         <<03608>>04396000
                                                                        04398000
<<ATTACHIO DATA>>                                                       04400000
                                                                        04402000
EQUATE                                                                  04404000
   STACKDST         = 0,                                                04406000
   READ             = 0,                                                04408000
   WRITE            = 1,                                                04410000
   BLOCKED          = 1,                                                04412000
   SERDISCBLOCKED   = %41,                                              04414000
   QMISC            = 0;                                                04416000
DEFINE                                                                  04418000
   DVRSTATUS        = IOSTAT0.(13:3)    #,                              04420000
   BADIO            = (DVRSTATUS<>1)    #;                              04422000
DOUBLE                                                                  04424000
   IOSTATUS;                                                            04426000
INTEGER                                                                 04428000
   IOSTAT0=IOSTATUS,IOSTAT1=IOSTATUS+1;                                 04430000
                                                                        04432000
<<* * * MAINLINE DATA * * *>>                                           04434000
DOUBLE                                                                  04436000
   SDFILEADDR,                                                 <<03011>>04438000
   DISCTARGETADDR,                                             <<03608>>04440000
   BOOTXADDR,                                                  <<03011>>04442000
   BOOTXSAVEADDR,                                              <<03011>>04444000
   OVERLAYADDR,                                                <<03011>>04446000
   SDFMAPADDR,                                                 <<03011>>04448000
   BANK1SAVEADDR,                                              <<03011>>04450000
   SDFCODEADDR,                                                <<03011>>04452000
   HIGHMEMADDR,                                                <<03608>>04454000
   CMDFILEADDR,                                                <<03011>>04456000
   DUMPFILEADDR;                                               <<03011>>04458000
                                                               <<03011>>04460000
LOGICAL  << EQUIVALENCE SINGLES TO DOUBLES >>                  <<03608>>04462000
   BOOTXSAVEADDR1    =   BOOTXSAVEADDR,  << TOP WORD >>        <<03608>>04464000
   BOOTXSAVEADDR2    =   BOOTXSAVEADDR + 1, << BOTTOM WORD >>  <<03608>>04466000
                                                               <<03608>>04468000
   BOOTXADDR1        =   BOOTXADDR,      << TOP WORD >>        <<03608>>04470000
   BOOTXADDR2        =   BOOTXADDR + 1,  << BOTTOM WORD >>     <<03608>>04472000
                                                               <<03608>>04474000
   OVERLAYADDR1      =   OVERLAYADDR,    << TOP WORD >>        <<03608>>04476000
   OVERLAYADDR2      =   OVERLAYADDR + 1,  << BOTTOM WORD >>   <<03608>>04478000
                                                               <<03608>>04480000
   SDFCODEADDR1      =   SDFCODEADDR,    << TOP WORD >>        <<03608>>04482000
   SDFCODEADDR2      =   SDFCODEADDR + 1,  << BOTTOM WORD >>   <<03608>>04484000
                                                               <<03608>>04486000
   HIGHMEMADDR1      =   HIGHMEMADDR,    << TOP WORD >>        <<03608>>04488000
   HIGHMEMADDR2      =   HIGHMEMADDR + 1,  << BOTTOM WORD >>   <<03608>>04490000
                                                               <<03608>>04492000
   BANK1SAVEADDR1    =   BANK1SAVEADDR,  << TOP WORD >>        <<03608>>04494000
   BANK1SAVEADDR2    =   BANK1SAVEADDR + 1,  << BOTTOM WORD >> <<03608>>04496000
                                                               <<03608>>04498000
   SDFMAPADDR1       =   SDFMAPADDR,     << TOP WORD >>        <<03608>>04500000
   SDFMAPADDR2       =   SDFMAPADDR + 1,   << BOTTOM WORD >>   <<03608>>04502000
                                                               <<03608>>04504000
   DISCADDR1         =   DISCTARGETADDR,   << TOP WORD >>      <<03608>>04506000
   DISCADDR2         =   DISCTARGETADDR + 1; << BOTTOM WORD >> <<03608>>04508000
                                                               <<03608>>04510000
                                                               <<03608>>04512000
INTEGER                                                                 04514000
   DESTDEV,CMDEV:=0,DUMPDEV:=0,DEVTIPE,CMDFILELEN,DUMPFILELEN;          04516000
EQUATE                                                                  04518000
   SYSTEMDISC       = 1;                                                04520000
                                                                        04522000
<<* * * SUBROUTINE LOCAL DATA * * *>>                                   04524000
                                                                        04526000
<<LOCATEDISCADDR VARIABLES>>                                            04528000
DOUBLE                                                                  04530000
   SECTORSLEFT,SEC'CYL,CYLINDERNUM;                                     04532000
                                                                        04534000
<<ERROREXIT DATA>>                                                      04536000
                                                                        04538000
DEFINE                                                                  04540000
   ERRFILE          = ERRNUM.(0:8)                #,                    04542000
   ERRNUMBER        = ERRNUM.(8:8)                #;                    04544000
                                                                        04546000
<<CONFIGUREDISCADDR DATA>>                                              04548000
POINTER                                                                 04550000
   CMDPTR;                                                              04552000
                                                                        04554000
<<CONFIGUREDEVICE DATA>>                                                04556000
                                                                        04558000
INTEGER                                                                 04560000
   LDTDEVICE;                                                           04562000
INTEGER ARRAY                                                           04564000
   STATBUF(0:3);                                                        04566000
INTEGER ARRAY                                                           04568000
   FLEXSUBTYPE(2:8)=PB:=0,0,0,0,1,0,2;                                  04570000
EQUATE                                                                  04572000
   ICNTRL           = 7,                                       <<00.09>>04574000
   GETSTATUS        = 7,                                       <<00.09>>04576000
   LDTDST           = 14,                                               04578000
   LDTSIZE          = 5,                                                04580000
   LDTDEVTIPELOC    = 2;                                                04582000
                                                                        04584000
<<GENERATEBACKUPSDF DATA>>                                              04586000
                                                                        04588000
DOUBLE                                                                  04590000
   DESC,INDEX;                                                 <<03011>>04592000
INTEGER                                                                 04594000
   DESC0=DESC,DESC1=DESC+1;                                             04596000
EQUATE                                                                  04598000
   CONTIGUOUS       = %1001,                                            04600000
   ENDOFILE         = 6,                                                04602000
   SERIALDISC       = %37;                                              04604000
                                                               <<03011>>04606000
<< CONFIGURE SDFMAP>>                                          <<03011>>04608000
POINTER                                                        <<03011>>04610000
   PTR;                                                        <<03011>>04612000
DOUBLE POINTER                                                 <<03011>>04614000
   DPTR = PTR;                                                 <<03011>>04616000
                                                               <<03011>>04618000
EQUATE                                                         <<03011>>04620000
   MEMORY          = 1,    <<CODE FOR MEMORY>>                 <<03011>>04622000
   SDF'FILE        = 2,    <<CODE FOR DISC>>                   <<03011>>04624000
   MAPENTRYLEN     = 8;    <<8 WORD RECORDS>>                  <<03011>>04626000
                                                               <<03011>>04628000
EQUATE      <<FIELDS IN MAP RECORDS>>                          <<03011>>04630000
     SRCMEDIA      = 0,    <<SOURCE WAS FROM MEM,DISC, ETC>>   <<03011>>04632000
     STGMEDIA      = 1,    <<STORAGE IS ON DISC,MEM,ETC.>>     <<03011>>04634000
   DSRC'START      = 1,    <<SOURCE START ADDRESS>>            <<03011>>04636000
     SRC'START'HI  = 2,                                        <<03011>>04638000
     SRC'START'LO  = 3,                                        <<03011>>04640000
   DSRC'END        = 2,    <<SOURCE END ADDRESS>>              <<03011>>04642000
     SRC'END'HI    = 4,                                        <<03011>>04644000
     SRC'END'LO    = 5,                                        <<03011>>04646000
   DSTG            = 3,    <<STORAGE ADDRESS>>                 <<03011>>04648000
     STG'HI        = 6,                                        <<03011>>04650000
     STG'LO        = 7;                                        <<03011>>04652000
                                                               <<03011>>04654000
                                                                        04656000
<<CONFIGURE BOOTSTRAP DATA>>                                            04658000
LOGICAL                                                        <<03608>>04660000
   MEMORYLEFT,MEMORYADDR,CYLINDERSIZE,WORDCOUNT;                        04662000
POINTER                                                                 04664000
   CHANPROG,CMDAREA;                                                    04666000
DOUBLE                                                                  04668000
   SDFPROGADDR,SECTOROFFSET;                                   <<03608>>04670000
EQUATE                                                                  04672000
   CHECKSUMSTART    = %123456;                                          04674000
                                                                        04676000
                                                                        04678000
<<PROCESSCOMMANDFILE DATA>>                                             04680000
                                                                        04682000
EQUATE                                                                  04684000
   CRECSIZE         = 36,                                               04686000
   DRS              = 4096,                                             04688000
   DFILEXTENT       = 1,                                                04690000
   BANKFACTOR       = 16,                                               04692000
   SYSDSEGFACTOR    = 52;                                               04694000
INTEGER                                                                 04696000
   SESSIONLIMIT,FILL,JOBLIMIT;                                          04698000
LOGICAL                                                                 04700000
   VALIDCOMMANDFILE:=FALSE;                                             04702000
BYTE ARRAY                                                              04704000
   LOGICALDEVICE(0:1);                                                  04706000
BYTE POINTER                                                            04708000
   DDESIG;                                                              04710000
ARRAY                                                                   04712000
   LIMITS(*)=SESSIONLIMIT;                                              04714000
DOUBLE                                                                  04716000
   DNUMREC;                                                             04718000
                                                                        04720000
<<CONFIGURE SDF DATA>>                                                  04722000
                                                                        04724000
EQUATE                                                                  04726000
   WORDS0'3       = FALSE,                                              04728000
   DSTABLELOC     = 2,                                                  04730000
   CONFIGDST      = 7,                                                  04732000
   STACKDSTLOC    = 9;                                                  04734000
INTEGER ARRAY                                                           04736000
   CLASSINFO(0:3);                                                      04738000
DOUBLE                                                                  04740000
   DSTSECTOR,CONFIGSECTOR,STACKSECTOR;                                  04742000
INTEGER                                                                 04744000
   I,STACKLOC,CHECKSUM,OVERLAYSIZE,REMAINS;                             04746000
POINTER                                                                 04748000
   DSTABLE,CONFIG;                                                      04750000
DOUBLE POINTER                                                          04752000
   CONFIGD=CONFIG;                                                      04754000
                                                                        04756000
EQUATE                                                                  04758000
   INITL          = 0,                                                  04762000
   BACKUPMODE     = 1,                                                  04764000
   CLEARBACKUP    = 2,                                                  04766000
   LASTOVERLAYBLOCK=31;                                                 04768000
                                                                        04770000
<<VARIABLES FOR CONFIGUREDEVICE>>                                       04772000
BYTE ARRAY                                                              04774000
   DEVICE(0:4);                                                         04776000
INTEGER ARRAY                                                           04778000
   DEVINFO(0:8);                                                        04780000
EQUATE                                                                  04782000
   NOERRORS       = 0;                                                  04784000
$PAGE "BOOTSTRAP DEFINITIONS"                                           04786000
<<* * * BOOTSTRAPS * * *>>                                              04788000
                                                                        04790000
EQUATE                                                                  04792000
   WRITEDATA         = %002000,                                         04794000
   WRITECONTROL      = %002010,                                         04796000
   READATA           = %001400,                                         04798000
   READCONTROL       = %001410,                                         04800000
   WAIT              = %001000,                                         04802000
   HALTINTERRUPT     = %000600,                                         04804000
   HALTER            = %000400,                                         04806000
   DSJ1              = %002401,                                         04808000
   JUMP              = %000000,                                         04810000
                                                                        04812000
   SEEK              = %001000,                                         04814000
   ADDRESSREC        = %006000,                                         04816000
   VERIFY            = %003400,                                         04818000
   WRITECMD          = %004000,                                         04820000
   READCMD           = %002400,                                         04822000
   STATUSCMD         = %001400,                                         04824000
   MAXCHANNELEN      = %77600;                                 <<03608>>04826000
DEFINE                                                                  04828000
   NEXTCYLMAGICNUM   = 255D     #;   <<# SECTORS TO HOLD MAXCHANNELEN>> 04830000
                                                                        04832000
EQUATE                                                                  04834000
   GOODNEWS          = 2,                                               04836000
   BADNEWS           = 0,                                               04838000
   BOOTSYSDBLOC      = %1430,                                  <<00.09>>04840000
   BOOTMEMLOC        = %1530,                                  <<00.09>>04842000
   BOOTXMEMLOC       = %175000,                                <<03608>>04844000
   BJUMPLOC          = 91,                                              04846000
   BTARGETLOC        = BOOTXMEMLOC-BOOTMEMLOC-BJUMPLOC,                 04848000
   BVERIFYLOC        = BOOTMEMLOC+111,                                  04850000
   BWLOC             = BOOTMEMLOC+113,                                  04852000
   BRLOC             = BOOTMEMLOC+114,                                  04854000
   BSFMLOC           = BOOTMEMLOC+115,                                  04856000
   BSEEK1LOC         = BOOTMEMLOC+116,                                  04858000
   BADDR1LOC         = BOOTMEMLOC+119,                                  04860000
   BSEEK2LOC         = BOOTMEMLOC+122,                                  04862000
   BADDR2LOC         = BOOTMEMLOC+125;                                  04864000
                                                                        04866000
DEFINE                                                                  04868000
   BOOTDISCADDR      = 3D     #;                                        04870000
                                                                        04872000
DEFINE                                                                  04874000
   BCHECKSUM         = BUF             #,                               04876000
   BSDFMAPADDR       = BUF(1)          #,                      <<03011>>04878000
   BSDFMAPADDR1      = BUF(2)          #,                      <<03011>>04880000
   BADDRECORD0       = BUF(17)         #,                               04882000
   BADDRECORD1       = BUF(43)         #,                               04884000
   BFILEMASK         = BUF(115)        #,                               04886000
   BBOOTXSAVEAREA    = BUF(116)        #,                      <<03011>>04888000
   BBOOTXAREA        = BUF(122)        #;                               04890000
                                                                        04892000
                                                                        04894000
<<BOOT EXTENSION DEFINITIONS>>                                          04896000
                                                                        04898000
EQUATE                                                                  04900000
   COMMANDLENGTH     = 8,                                               04902000
   WRITETEMPLATELEN  = 53,                                              04904000
   READTEMPLATELEN   = 38,                                              04906000
   BOOTXBASE         = %175000,                                <<03608>>04908000
   SIXTEENK          =  %40000,                                <<03608>>04910000
   READCMDLOC        = %176776,                                <<03608>>04912000
   WRITECMDLOC       = %176777;                                <<03608>>04914000
                                                                        04916000
DEFINE                                                                  04918000
   CMDSEEKLOC        = CMDPTR        #,                                 04920000
   CMDSEEKCYLINDER   = CMDPTR(1)     #,                                 04922000
   CMDSEEKHEADSECTOR = CMDPTR(2)     #,                                 04924000
   CMDADDRECORDLOC   = CMDPTR(3)     #,                                 04926000
   CMDADDRCYLINDER   = CMDPTR(4)     #,                                 04928000
   CMDADDRHEADSECTOR = CMDPTR(5)     #,                                 04930000
   CMDVERIFY         = CMDPTR(6)     #,                                 04932000
   CMDVERIFYSEC      = CMDPTR(7)     #,                                 04934000
   CMDSTATUS         = CMDPTR(6)     #,                                 04936000
                                                                        04938000
   BXREADCOMMAND     = CHANPROG(1022)#,                        <<03608>>04940000
   BXWRITECOMMAND    = CHANPROG(1023)#,                        <<03608>>04942000
                                                                        04944000
   WTSEEKADDR        = CHANPROG(4)   #,                                 04946000
   WTADDRECORD0      = CHANPROG(7)   #,                                 04948000
   WTADDRECORDADDR   = CHANPROG(11)  #,                                 04950000
   WTBYTECOUNT       = CHANPROG(20)  #,                                 04952000
   WTMEMORYBANK      = CHANPROG(22)  #,                        <<03011>>04954000
   WTMEMORYADDR      = CHANPROG(23)  #,                                 04956000
   WTVERSEEKADDR     = CHANPROG(30)  #,                                 04958000
   WTADDRECORD1      = CHANPROG(33)  #,                                 04960000
   WTVERADDREC       = CHANPROG(37)  #,                                 04962000
   WTVERCMDADDR      = CHANPROG(44)  #,                                 04964000
   WTCHECKPOINT      = CHANPROG(52)  #,                        <<03011>>04966000
                                                                        04968000
   RDSEEKADDR        = CHANPROG(4)   #,                                 04970000
   RDADDRECORD       = CHANPROG(7)   #,                                 04972000
   RDADDRECORDADDR   = CHANPROG(11)  #,                                 04974000
   RDBYTECOUNT       = CHANPROG(20)  #,                                 04976000
   RDMEMORYADDR      = CHANPROG(23)  #,                                 04978000
   RDSTATUSCMD       = CHANPROG(30)  #,                                 04980000
   RDSTATUSADDR      = CHANPROG(35)  #;                                 04982000
                                                                        04984000
ARRAY BOOT(0:1)=PB:=                                                    04986000
<<CHECKSUM WORD>>                                                       04988000
<<0>>   0,                                                              04990000
                                                                        04992000
<<SDFMAP AREA ADDRESS>>   <<LOGICAL SECTOR NUMBER>>            <<03011>>04994000
<<1>>   0,0,                                                            04996000
                                                                        04998000
<<WRITE OUT BOOT EXTENSION AREA TO THE DISC>>                           05000000
<<3>>   WRITECONTROL,2,0,%0,BSFMLOC,        <<SET FILE MASK>>           05002000
<<8>>   WAIT,0,                                                         05004000
<<10>>  WRITECONTROL,6,0,%0,BSEEK1LOC,      <<SEEK TO BOOTX OVRLAY>>    05006000
<<15>>  WAIT,0,                                                         05008000
<<17>>  WRITECONTROL,6,0,%0,BADDR1LOC,      <<ISSUE ADDRESS RECORD>>    05010000
<<22>>  WAIT,0,                                                         05012000
<<24>>  WRITECONTROL,2,0,%0,BWLOC,          <<ISSUE WRITE DATA COMMAND>>05014000
<<29>>  WRITEDATA,BOOTXLENBT,0,%0,BOOTXMEMLOC,<<WRITE BOOTX AREA>>      05016000
<<34>>  WAIT,0,                                                         05018000
                                                                        05020000
<<VERIFY THE DATA JUST WRITTEN>>                                        05022000
<<36>>  WRITECONTROL,6,0,%0,BSEEK1LOC,      <<SEEK TO OVERLAY AREA>>    05024000
<<41>>  WAIT,0,                                                         05026000
<<43>>  WRITECONTROL,6,0,%0,BADDR1LOC,      <<ISSUE ADDRESS RECORD>>    05028000
<<48>>  WAIT,0,                                                         05030000
<<50>>  WRITECONTROL,4,0,%0,BVERIFYLOC,     <<ISSUE VERIFY COMMAND>>    05032000
<<55>>  WAIT,0,                                                         05034000
<<57>>  DSJ1,-1,GOODNEWS,BADNEWS,           <<QUIT IF BAD WRITE>>       05036000
<<61>>  HALTINTERRUPT,1,                    <<VERIFY FAILED>>           05038000
                                                                        05040000
<<READ IN BOOTX AND JUMP TO IT>>                                        05042000
<<63>>  WRITECONTROL,6,0,%0,BSEEK2LOC,      <<SEEK TO BOOTSTRAP SECTOR>>05044000
<<68>>  WAIT,0,                                                         05046000
<<70>>  WRITECONTROL,6,0,%0,BADDR2LOC,      <<ISSUE ADDRESS REC>>       05048000
<<75>>  WAIT,0,                                                         05050000
<<77>>  WRITECONTROL,2,0,%0,BRLOC,          <<ISSUE READ COMMAND>>      05052000
<<82>>  READATA,BOOTXLENBT,0,%0,BOOTXMEMLOC,<<READ IN BOOTX>>           05054000
<<87>>  WAIT,0,                                                         05056000
<<89>>  JUMP,BTARGETLOC,                    <<EXECUTE BOOTX CHAN PROG>> 05058000
                                                                        05060000
<<NULL AREA>>                                                           05062000
<<91-110>> 20(0),                                                       05064000
                                                                        05066000
<<COMMANDS AREA>>                                                       05068000
<<111>> VERIFY,BOOTXLEN',                   <<VERIFY WRITE>>            05070000
<<113>> WRITECMD,                                                       05072000
<<114>> READCMD,                                                        05074000
<<115>> 0,                                  <<SET FILE MASK>>           05076000
<<116>> SEEK,0,0,                           <<SEEK TO WRITE AREA>>      05078000
<<119>> ADDRESSREC,0,0,                     <<ADDR RECRD TO WRITE AREA>>05080000
<<122>> SEEK,0,0,                           <<SEEK TO READ AREA>>       05082000
<<125>> ADDRESSREC,0,0;                     <<ADDR RECORD TO READ AREA>>05084000
                                                                        05086000
                                                                        05088000
ARRAY WRITETEMPLATE(0:1)=PB:=                                           05090000
<<0>>   WRITECONTROL,6,0,%0,0,              <<SEEK>>                    05092000
<<5>>   WAIT,0,                                                         05094000
<<7>>   WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          05096000
<<12>>  WAIT,0,                                                         05098000
<<14>>  WRITECONTROL,2,0,%0,WRITECMDLOC,    <<WRITE DATA COMMAND>>      05100000
<<19>>  WRITEDATA,0,0,%0,0,                 <<WRITE OUT MEMORY CHUNK>>  05102000
<<24>>  WAIT,0,                                                         05104000
<<26>>  WRITECONTROL,6,0,%0,0,              <<SEEK TO OVERLAY AREA>>    05106000
<<31>>  WAIT,0,                                                         05108000
<<33>>  WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          05110000
<<38>>  WAIT,0,                                                         05112000
<<40>>  WRITECONTROL,4,0,%0,0,              <<ISSUE VERIFY COMMAND>>    05114000
<<45>>  WAIT,0,                                                         05116000
<<47>>  DSJ1,-1,GOODNEWS,BADNEWS,           <<QUIT IF BAD WRITE>>       05118000
<<51>>  HALTINTERRUPT,2;                    <<VERIFY FAILED>>           05120000
                                                                        05122000
ARRAY READTEMPLATE(0:1)=PB:=                                            05124000
<<0>>   WRITECONTROL,6,0,%0,0,              <<SEEK>>                    05126000
<<5>>   WAIT,0,                                                         05128000
<<7>>   WRITECONTROL,6,0,%0,0,              <<ADDRESS RECORD>>          05130000
<<12>>  WAIT,0,                                                         05132000
<<14>>  WRITECONTROL,2,0,%0,READCMDLOC,     <<READ DATA COMMAND>>       05134000
<<19>>  READATA,0,0,%0,0,                   <<READ IN SDF CHUNK>>       05136000
<<24>>  WAIT,0,                                                         05138000
<<26>>  WRITECONTROL,2,0,0,0,               <<WRITE STATUS COMMAND>>    05140000
<<31>>  READCONTROL,4,0,0,0,                <<GET STATUS>>              05142000
<<36>>  WAIT,0;                                                         05144000
<<******************************************>>                 <<03608>>05146000
<<                                          >>                 <<03608>>05148000
<<   CS80 DEFINITIONS EQUATES AND OFFSETS   >>                 <<03608>>05150000
<<                                          >>                 <<03608>>05152000
<<******************************************>>                 <<03608>>05154000
                                                               <<03608>>05156000
EQUATE                                                         <<03608>>05158000
                                                               <<03608>>05160000
   << COMMAND DEFINITIONS >>                                   <<03608>>05162000
                                                               <<03608>>05164000
   READ'EXEC'SEC     =  %1416,  << READ W/EXEC MSG SEC >>      <<03608>>05166000
   WRT'EXEC'SEC      =  %2016,  << WRT W/EXEC MSG SEC >>       <<03608>>05168000
                                                               <<03608>>05170000
   CDB'READ          =      0,  << LOCATE AND READ COMMAND >>  <<03608>>05172000
   CDB'WRITE         =     %2,  << LOCATE AND WRITE COMMAND >> <<03608>>05174000
   CDB'VERIFY        =     %4,  << VERIFY COMMAND >>           <<03608>>05176000
                                                               <<03608>>05178000
   CDB'SET'BURST     =    %74,  << SET BURST COMMAND >>        <<03608>>05180000
   CDB'SET'LENGTH    =    %30,  << SET LENGTH COMMAND >>       <<03608>>05182000
   CDB'SET'SNGL'VEC  =    %20,  << SET SNGL VEC ADDR CMD >>    <<03608>>05184000
   CDB'SET'UNIT      =    %40,  << SET UNIT# COMMAND >>        <<03608>>05186000
   CDB'SET'VOL       =   %100,  << SET VOL# COMMAND >>         <<03608>>05188000
                                                               <<03608>>05190000
   << CS80 TEMPLATE LENGTHS >>                                 <<03608>>05192000
                                                               <<03608>>05194000
   WRITE'LENGTH      =     27,  << LENGTH OF WRITE TEMPLATE >> <<03608>>05196000
   READ'LENGTH       =     27,  << LENGTH OF READ TEMPLATE >>  <<03608>>05198000
   VERIFY'LENGTH     =     16,  << LENGTH OF VERIFY TEMPLATE >><<03608>>05200000
   CMDS'LENGTH       =      9,  << LENGTH OF COMMANDS >>       <<03608>>05202000
                                                               <<03608>>05204000
   << CS80 BOOTSTRAP OFFSETS >>                                <<03608>>05206000
                                                               <<03608>>05208000
   BOOT'WRITE        =      3,  << OFFSET TO BOOT WRITE >>     <<03608>>05210000
   BOOT'VERIFY       =      BOOT'WRITE + WRITE'LENGTH,         <<03608>>05214000
   BOOT'READ         =      BOOT'VERIFY + VERIFY'LENGTH,       <<03608>>05216000
                                                               <<03608>>05218000
   BOOT'WRT'CMDS     =      BOOT'READ + READ'LENGTH,           <<03608>>05220000
   BOOT'VER'CMDS     =      BOOT'WRT'CMDS + CMDS'LENGTH,       <<03608>>05222000
   BOOT'READ'CMDS    =      BOOT'VER'CMDS + CMDS'LENGTH,       <<03608>>05224000
                                                               <<03608>>05226000
   << LOCATION OF RELATIVE JUMP TO BOOT EXTENSION >>           <<03608>>05228000
                                                               <<03608>>05230000
   JUMP'BOOTX        =      BOOT'READ + 20;                    <<03608>>05232000
                                                               <<03608>>05234000
   << CS80 BOOTSTRAP EXTENSION OFFSETS >>                      <<03608>>05238000
                                                               <<03608>>05240000
LOGICAL                                                        <<03608>>05242000
                                                               <<03608>>05244000
   OVERLAY'WRITE,          << OFFSET TO OVERLAY WRITE >>       <<03608>>05246000
   OVERLAY'VERIFY,         << OFFSET TO OVERLAY VERIFY >>      <<03608>>05248000
   OVERLAY'WRT'CMDS,       << OVERLAY WRITE CMDS OFFSET >>     <<03608>>05250000
   OVERLAY'VER'CMDS;       << OVERLAY VERIFY CMDS OFFSET >>    <<03608>>05252000
                                                               <<03608>>05254000
DEFINE                                                         <<03608>>05256000
                                                               <<03608>>05258000
   LOWMEMORY'READ    =      OVERLAY'VER'CMDS + CMDS'LENGTH#,   <<03608>>05260000
   SDFCODE'READ      =      LOWMEMORY'READ + READ'LENGTH#,     <<03608>>05262000
   BANK1'WRITE       =      SDFCODE'READ + READ'LENGTH#,       <<03608>>05264000
   END'BOOTX         =      BANK1'WRITE + WRITE'LENGTH#,       <<03608>>05266000
                                                               <<03608>>05268000
   LOWMEM'READ'CMDS  =      (END'BOOTX + 2)#,                  <<03608>>05272000
   SDFCODE'READ'CMDS =      (LOWMEM'READ'CMDS + CMDS'LENGTH)#, <<03608>>05274000
   BANK1'WRT'CMDS    =      (SDFCODE'READ'CMDS + CMDS'LENGTH)#;<<03608>>05276000
                                                               <<03608>>05278000
   << CS80 TEMPLATE OFFSETS >>                                 <<03608>>05280000
                                                               <<03608>>05282000
EQUATE                                                         <<03608>>05284000
                                                               <<03608>>05286000
   WRITE'TEMPLATE    =      0,  << WRITE TEMPLATE OFFSET >>    <<03608>>05288000
   READ'TEMPLATE     =      0,  << READ TEMPLATE OFFSET >>     <<03608>>05290000
   VERIFY'TEMPLATE   =     27,  << VERIFY TEMPLATE OFFSET >>   <<03608>>05292000
                                                               <<03608>>05294000
   << RELATIVE OFFSET FOR JUMP TO BOOTX >>                     <<03608>>05296000
                                                               <<03608>>05298000
   BOOTX'REL'ADDR    = BOOTXMEMLOC-BOOTMEMLOC-JUMP'BOOTX-3;    <<03608>>05300000
                                                               <<03608>>05302000
<<*****************************************>>                  <<03608>>05304000
<<                                         >>                  <<03608>>05306000
<<   CS80 BOOT AND BOOTX CHANNEL PROGRAMS  >>                  <<03608>>05308000
<<                                         >>                  <<03608>>05310000
<<*****************************************>>                  <<03608>>05312000
                                                               <<03608>>05314000
ARRAY CS80'TEMPLATE(0:42)=PB:=                                 <<03608>>05316000
                                                               <<03608>>05318000
        <<------------------------------------------------->>  <<03608>>05320000
        << [DXFER] REAL-TIME & SOME GENERAL PURPOSE CMDS   >>  <<03608>>05322000
        << COMMAND - EXECUTION - REPORTING MESSAGE SECTION >>  <<03608>>05324000
        <<------------------------------------------------->>  <<03608>>05326000
                                                               <<03608>>05328000
                                                               <<03608>>05330000
<< 0>>  << WRITE CTRL >>    %2005,  << COMMAND MSG SECONDARY >><<03608>>05332000
<< 1>>                         17,  << CMD BUFFER LENGTH >>    <<03608>>05334000
<< 2>>                          0,  << BURST >>                <<03608>>05336000
<< 3>>                      %2000,  << CMD BUFFER BANK >>      <<03608>>05338000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>  <<03608>>05340000
                                                               <<03608>>05342000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>05344000
<< 6>>                          0,                             <<03608>>05346000
                                                               <<03608>>05348000
<< 7>>  << RD/WRT CTRL >>   %1416,  <<EXECUTION MSG SECONDARY>><<03608>>05350000
<< 8>>                          0,  << #BYTES TO READ/WRITE >> <<03608>>05352000
<< 9>>                          0,  << BURST >>                <<03608>>05354000
<<10>>                          0,  << DATA BANK >>            <<03608>>05356000
<<11>>                          0,  << DATA BUFFER ABS ADDR >> <<03608>>05358000
                                                               <<03608>>05360000
<<12>>  <<JUMP>>                0,  << XFER COMPLETE JUMP >>   <<03608>>05362000
<<13>>                          2,                             <<03608>>05364000
                                                               <<03608>>05366000
<<14>>  <<JUMP>>                0,  << MORE BURSTS TO GO >>    <<03608>>05368000
<<15>>                        -11,                             <<03608>>05370000
                                                               <<03608>>05372000
<<16>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>05374000
<<17>>                          0,                             <<03608>>05376000
                                                               <<03608>>05378000
<<18>>  << QSTAT (DSJ) >>   %2402,  << REPORTING MSG SEC >>    <<03608>>05380000
<<19>>                          0,  << RETURN BYTE >>          <<03608>>05382000
<<20>>                          4,  << NORMAL COMPLETION >>    <<03608>>05384000
<<21>>                          0,  << HARD ERROR >>           <<03608>>05386000
<<22>>                          2,  << POWER ON OCCURRED >>    <<03608>>05388000
                                                               <<03608>>05390000
<<23>>  << INT/HLT1 >>       %600,  << INTERRUPT/HALT >>       <<03608>>05392000
<<24>>                          1,  << CODE OF 1 IN CPVA(1) >> <<03608>>05394000
                                                               <<03608>>05396000
<<25>>  << INT/HLT2 >>       %600,  << INTERRUPT/HALT >>       <<03608>>05398000
<<26>>                          2,  << CODE OF 2 IN CPVA(1) >> <<03608>>05400000
                                                               <<03608>>05402000
                                                               <<03608>>05404000
        <<------------------------------------------------->>  <<03608>>05406000
        << [DIAG] COMPLEMENTARY, GP, DIAG, TRANS COMMANDS  >>  <<03608>>05408000
        << COMMAND/TRANS - REPORTING MESSAGE SECTION       >>  <<03608>>05410000
        <<------------------------------------------------->>  <<03608>>05412000
                                                               <<03608>>05414000
                                                               <<03608>>05416000
<< 0>>  << WRITE CTRL >>    %2005,  << CMD/TRANS MSG SEC >>    <<03608>>05418000
<< 1>>                         17,  << CMD BUFFER LENGTH >>    <<03608>>05420000
<< 2>>                          0,  << BURST >>                <<03608>>05422000
<< 3>>  << SEL DEV CLR >>   %2000,  << CMD BUFFER BANK >>      <<03608>>05424000
<< 4>>                          0,  << CMD BUFFER ABS ADDR >>  <<03608>>05426000
                                                               <<03608>>05428000
<< 5>>  << WAIT >>          %1000,  << WAIT FOR // POLL >>     <<03608>>05430000
<< 6>>                          0,                             <<03608>>05432000
                                                               <<03608>>05434000
<< 7>>  << QSTAT (DSJ) >>   %2402,  << REPORTING MSG SEC >>    <<03608>>05436000
<< 8>>                          0,  << RETURN BYTE >>          <<03608>>05438000
<< 9>>                          4,  << NORMAL COMPLETION >>    <<03608>>05440000
<<10>>                          0,  << HARD ERROR >>           <<03608>>05442000
<<11>>                          2,  << POWER ON OCCURRED >>    <<03608>>05444000
                                                               <<03608>>05446000
<<12>>  << INT/HLT1 >>       %600,  << INTERRUPT/HALT >>       <<03608>>05448000
<<13>>                          1,  << CODE OF 1 IN CPVA(1) >> <<03608>>05450000
                                                               <<03608>>05452000
<<14>>  << INT/HLT2 >>       %600,  << INTERRUPT/HALT >>       <<03608>>05454000
<<15>>                          2;  << CODE OF 2 IN CPVA(1) >> <<03608>>05456000
                                                               <<03608>>05458000
                                                               <<03608>>05460000
<<* * * CONFIGURATION TABLE * * *>>                                     05462000
                                                                        05464000
EQUATE                                                                  05466000
   CTCONFIGLEN      = 25;                                      <<03011>>05468000
                                                                        05470000
DEFINE                                                         <<03011>>05472000
   CTCHECKSUM       = CONFIG           #,                      <<03011>>05474000
   CTNUMBERBANKS    = CONFIG(1)        #,                      <<03011>>05476000
                                                               <<03011>>05478000
   CTDUMPDEVDESC    = CONFIGD(1)       #,                      <<03011>>05480000
   CTDUMPDEVDRT     = CONFIG(2).(0:9)  #,                      <<03011>>05482000
   CTDUMPDEVSUBTYPE = CONFIG(2).(9:4)  #,                      <<03011>>05484000
   CTDUMPDEVUNIT    = CONFIG(2).(13:3) #,                      <<03011>>05486000
   CTDUMPDEVTYPE    = CONFIG(3)        #,                      <<03011>>05488000
                                                               <<03011>>05490000
   CTLINEPTRDESC    = CONFIGD(2)       #,                      <<03011>>05492000
   CTLINEPTRDRT     = CONFIG(4).(0:9)  #,                      <<03011>>05494000
   CTLINEPTRSUBTYPE = CONFIG(4).(9:4)  #,                      <<03011>>05496000
   CTLINEPTRUNIT    = CONFIG(4).(13:3) #,                      <<03011>>05498000
   CTLINEPTRDEVTYPE = CONFIG(5)        #,                      <<03011>>05500000
                                                               <<03011>>05502000
   CTCONSOLEDESC    = CONFIGD(3)       #,                      <<03011>>05504000
   CTCONSOLEDRT     = CONFIG(6).(0:9)  #,                      <<03011>>05506000
   CTCONSOLESUBTYPE = CONFIG(6).(9:4)  #,                      <<03011>>05508000
   CTCONSOLEUNIT    = CONFIG(6).(13:3) #,                      <<03011>>05510000
   CTCONSOLEDEVTYPE = CONFIG(7)        #,                      <<03011>>05512000
                                                               <<03011>>05514000
   CTCOMMANDESC     = CONFIGD(4)       #,                      <<03011>>05516000
   CTCOMMANDRT      = CONFIG(8).(0:9)  #,                      <<03011>>05518000
   CTCOMMANDSUBTYPE = CONFIG(8).(9:4)  #,                      <<03011>>05520000
   CTCOMMANDUNIT    = CONFIG(8).(13:3) #,                      <<03011>>05522000
   CTCOMMANDEVTYPE  = CONFIG(9)        #,                      <<03011>>05524000
                                                               <<03011>>05526000
   CTSYSDISCDESC    = CONFIGD(5)       #,                      <<03011>>05528000
   CTSYSDISCDRT     = CONFIG(10).(0:9) #,                      <<03011>>05530000
   CTSYSDISCSUBTYPE = CONFIG(10).(9:4) #,                      <<03011>>05532000
   CTSYSDISCUNIT    = CONFIG(10).(13:3)#,                      <<03011>>05534000
   CTSYSDISCDEVTYPE = CONFIG(11)       #,                      <<03011>>05536000
                                                               <<03011>>05538000
   CTDUMPFILEDESC   = CONFIGD(6)       #,                      <<03011>>05540000
   CTDUMPFILEDRT    = CONFIG(12).(0:9) #,                      <<03011>>05542000
   CTDUMPFILESUBTYPE= CONFIG(12).(9:4) #,                      <<03011>>05544000
   CTDUMPFILEUNIT   = CONFIG(12).(13:3)#,                      <<03011>>05546000
   CTDUMPFILEDEVTYPE= CONFIG(13)       #,                      <<03011>>05548000
                                                               <<03011>>05550000
   CTDUMPFILELEN    = CONFIG(14)       #,                      <<03011>>05552000
   CTMODE           = CONFIG(15)       #,                      <<03011>>05554000
   CTCOMMANDFILE    = CONFIGD(8)       #,                      <<03011>>05556000
   CTDUMPFILE       = CONFIGD(9)       #,                      <<03011>>05558000
   CTOVERLAYSECNUM  = CONFIGD(10)      #,                      <<03011>>05560000
   CTCOMMANDLENGTH  = CONFIG(23)       #,                      <<03011>>05562000
   CTSDFINITVERSION = CONFIG(24)       #;                      <<03011>>05564000
$PAGE "SDFINIT PROCEDURE - UTILITY SUBROUTINES"                         05566000
SUBROUTINE MESSAGE(MESSAGENUM);                                         05568000
VALUE MESSAGENUM;                                                       05570000
INTEGER                                                                 05572000
   MESSAGENUM;         <<(0:8) <>0, THEN OFFENDING FILE'S FILE NUMBER>> 05574000
                       <<(8:8) # OF MESSAGE IN THE MESSAGE ARRAY>>      05576000
   BEGIN                                                                05578000
   <<WRITE PREAMBLE>>                                                   05580000
   MOVE BBUF:="* * * DUMP FACILITY ERROR * * *",2;                      05582000
   PRINT(BUF,(@BBUF-S0),0); DEL;                                        05584000
                                                                        05586000
   MESSAGENUM:=MESSAGENUM.(8:8);                                        05588000
                                                                        05590000
   <<LOCATE AND PRINT THE MESSAGE>>                                     05592000
   MSGSTART:=0;                                                         05594000
   WHILE (MESSAGENUM:=MESSAGENUM-1) > 0 DO                              05596000
      <<FLUSH PAST PRECEDING MESSAGES>>                                 05598000
      DO                                                                05600000
         BEGIN                                                          05602000
         <<FIND END OF THE MESSAGE>>                                    05604000
         MSGSTART:=MSGSTART+1;                                          05606000
         MOVE BBUF:=MSGARRAY(MSGSTART),(1);                             05608000
         END UNTIL BBUF="#";                                            05610000
   MSGEND:=MSGSTART:=MSGSTART+1;                                        05612000
   DO                                                                   05614000
      BEGIN                                                             05616000
      <<FIND END OF THE TARGET MESSAGE>>                                05618000
      MSGEND:=MSGEND+1;                                                 05620000
      MOVE BBUF:=MSGARRAY(MSGEND),(1);                                  05622000
      END UNTIL BBUF="#";                                               05624000
   MOVE BBUF:=MSGARRAY(MSGSTART),(MSGEND-MSGSTART);                     05626000
   PRINT(BUF,(MSGSTART-MSGEND),0);                                      05628000
   END  <<MESSAGE>>;                                                    05630000
SUBROUTINE ERROREXIT(ERRNUM);                                           05632000
VALUE ERRNUM;                                                           05634000
INTEGER                                                                 05636000
   ERRNUM;             <<ERROR NUMBER CODE, 0=SUCCESSFUL>>              05638000
   BEGIN                                                                05640000
   IF ERRNUMBER <> SUCCESSFUL THEN                                      05642000
      BEGIN                                                             05644000
      MESSAGE(ERRNUMBER);                                               05646000
      CONDITIONCODE:=CCL;                                               05648000
      END                                                               05650000
   ELSE                                                                 05652000
      CONDITIONCODE:=CCE;                                               05654000
   FOR I:=0 UNTIL NUMFILES-1 DO                                         05656000
      IF FILEARRAY(I) <> 0 THEN FCLOSE(FILEARRAY(I),SAVE,0);            05658000
   ASSEMBLE(EXIT 1);                                                    05660000
   END  <<ERROREXIT>>;                                                  05662000
SUBROUTINE DISCIO(DESTDEV,FUNCTION,TARGET,TARGETLEN,DISCADDR);          05664000
VALUE DESTDEV,FUNCTION,TARGETLEN,DISCADDR;                              05666000
INTEGER                                                                 05668000
   DESTDEV,            <<TARGET LOGICAL DEVICE>>                        05670000
   FUNCTION,           <<ATTACHIO FUNCTION CODE>>                       05672000
   TARGETLEN;          <<ATTACHIO COUNT>>                               05674000
ARRAY                                                                   05676000
   TARGET;             <<ADDRESS OF DATA BUFFER>>                       05678000
DOUBLE                                                                  05680000
   DISCADDR;           <<LOGICAL SECTOR ADDRESS>>                       05682000
   BEGIN                                                                05684000
   <<READ/WRITE TARGET AREA OUT TO THE TARGET DISC AND CHECK            05686000
     FOR I/O ERRORS.                                                    05688000
   >>                                                                   05690000
   IOSTATUS:=ATTACHIO(DESTDEV,QMISC,STACKDST,@TARGET,FUNCTION,          05692000
      TARGETLEN,S2,S1,IF MODE<>INITL THEN SERDISCBLOCKED ELSE BLOCKED); 05694000
   IF BADIO THEN                                                        05696000
      BEGIN  <<REPORT THE ERROR>>                                       05698000
      MOVE BBUF:="* * * DUMP FACILITY ERROR * * *",2;                   05700000
      PRINT(BUF,(@BBUF-S0),0); DEL;                                     05702000
      MOVE BBUF:="ERROR ACCESSING LOG DEV=     STATUS=%XXXXXX",2;       05704000
      ASCII(S7,-10,BBUF(24));                                           05706000
      ASCII(IOSTAT0,8,BBUF(37));                                        05708000
      PRINT(BUF,(@BBUF-S0),0); DEL;                                     05710000
      ERROREXIT(0);                                                     05712000
      END;                                                              05714000
   END  <<DISCIO>>;                                                     05716000
SUBROUTINE EXTRACTFILEADDR(LABELADDR,LDEV,FILEADDR);                    05718000
VALUE LABELADDR;                                                        05720000
DOUBLE                                                                  05722000
   LABELADDR,          <<LABEL DISC SECTOR ADDR/LOG DEVICE>>            05724000
   FILEADDR;           <<FILE DISC SECTOR ADDR>>                        05726000
INTEGER                                                                 05728000
   LDEV;               <<LOGICAL DEVICE CONTAINED IN LABEL ADDR>>       05730000
   BEGIN                                                                05732000
   <<EXTRACT EXTENT'S DISC ADDR FROM FILE LABEL>>                       05734000
   LDEV:=S4.(0:8);                                                      05736000
   S4:=S4.(8:8);                                                        05738000
   DISCIO(LDEV,READ,BUF,LABELEN,LABELADDR);                             05740000
   FLABEXTENT0:=FLABEXTENT0.(8:8);                                      05742000
   FILEADDR:=FLABFIRSTEXTENT+DOUBLE(FLABSECTOFFSET);                    05744000
   END  <<EXTRACTFILEADDR>>;                                            05746000
DOUBLE SUBROUTINE CONVERTDISCADDR(TYPE,SUBTYPE,DISCADDR);               05748000
VALUE TYPE,SUBTYPE,DISCADDR;                                            05750000
INTEGER                                                                 05752000
   TYPE,               <<DISC TYPE>>                                    05754000
   SUBTYPE;            <<DISC SUB TYPE>>                                05756000
DOUBLE                                                                  05758000
   DISCADDR;           <<LOGICAL SECTOR NUMBER>>                        05760000
   BEGIN                                                                05762000
   XREG:=SUBTYPE;                                                       05764000
   IF TYPE=T7902 THEN                                                   05766000
      BEGIN  <<FLEXIBLE DISC>>                                          05768000
      TOS:=DISCADDR;                                                    05770000
      TOS:=SECYLINDER7902(XREG);                                        05772000
      ASSEMBLE(LDIV);                                                   05774000
      TOS:=SECTRACK7902(XREG);                                          05776000
      ASSEMBLE(DIV,XCH);                                                05778000
      TOS:=TOS&LSL(8);  <<HEAD/SECTOR CALCULATION>>                     05780000
      END                                                               05782000
   ELSE                                                                 05784000
      BEGIN  <<13037 CONTROLLER DISC>>                                  05786000
      TOS:=DISCADDR;                                                    05788000
      TOS:=SECYLINDER(XREG);                                            05790000
      ASSEMBLE(LDIV);                                                   05792000
      TOS:=SECTRACK(XREG);                                              05794000
      ASSEMBLE(DIV,XCH);                                                05796000
      TOS:=TOS&LSL(8);  <<HEAD/SECTOR CALCULATION>>                     05798000
      TOS:=TOS+HEADBASE(XREG);                                 <<00497>>05800000
      END;                                                              05802000
   TOS:=TOS+TOS;                                                        05804000
   DS8:=TOS;                                                            05806000
   END  <<CONVERTDISCADDR>>;                                            05808000
$PAGE "SDFINIT PROCEDURE - SUBROUTINES CALLED BY SUBROUTINES"           05810000
DOUBLE SUBROUTINE LOCATEDISCADDR(DEVTIPE,STARTSEC,LEN);                 05812000
VALUE DEVTIPE,STARTSEC,LEN;                                             05814000
INTEGER                                                                 05816000
   DEVTIPE;            <<SDF DISC TYPE AND SUBTYPE>>                    05818000
DOUBLE                                                                  05820000
   STARTSEC,           <<DISC ADDR OF 1ST POSSIBLE STARTING             05822000
                         SECTOR FOR THE DISCADDR>>                      05824000
   LEN;                <<LENGTH OF DISC AREA>>                          05826000
   BEGIN                                                                05828000
   <<LOCATES THE POSTION OF A DISC AREA IN THE SDF                      05830000
     FILE SO THAT IT:                                                   05832000
     1. DOES NOT CROSS A "CYLINDER" BOUNDARY (FOR 7905, 7906            05834000
        REMOVABLE PLATTER).                                             05836000
     2. IS AS CLOSE AS POSSIBLE TO STARTSEC (SUBJECT TO CONDITION 1).   05838000
     RETURNS                                                            05840000
        LOCATEDISCADDR   - LOGICAL DISC SECTOR ADDRESS OF DISC AREA     05842000
   >>                                                                   05844000
   IF DTDEVICETYPE = T13037 AND                                         05846000
      (DTSUBTYPE=R7906 OR DTSUBTYPE=F7906 OR DTSUBTYPE=R7905) THEN      05848000
      BEGIN                                                             05850000
      <<DISC IS PHYSICALLY ACCESSED IN CYLINDER MODE, BUT ONLY          05852000
        WANT TO ACCESS ONE PLATTER.                                     05854000
      >>                                                                05856000
      SEC'CYL:=DOUBLE(SECYLINDER(DTSUBTYPE));                           05858000
      SECTORSLEFT:=SEC'CYL-(STARTSEC MOD SEC'CYL);                      05860000
      IF SECTORSLEFT < LEN THEN                                         05862000
         BEGIN                                                          05864000
         <<DISC AREA WOULD STRADDLE A CYLINDER BOUNDARY, ADJUST         05866000
           IT TO THE BEGINNING OF THE NEXT CYLINDER.                    05868000
         >>                                                             05870000
         CYLINDERNUM:=STARTSEC/SEC'CYL;                                 05872000
         LOCATEDISCADDR:=(CYLINDERNUM+1D)*SEC'CYL;                      05874000
         END                                                            05876000
      ELSE                                                              05878000
         LOCATEDISCADDR:=STARTSEC;                                      05880000
      END                                                               05882000
   ELSE                                                                 05884000
      LOCATEDISCADDR:=STARTSEC;                                         05886000
   END  <<LOCATEDISCADDR>>;                                             05888000
DOUBLE SUBROUTINE GETNEXTCYLINDER(DEVTIPE,DISCADDR,CURRENTCYLSIZE);     05890000
VALUE DEVTIPE;                                                          05892000
INTEGER                                                                 05894000
   DEVTIPE,            <<SDF DISC TYPE AND SUBTYPE>>                    05896000
   CURRENTCYLSIZE;     <<NUMBER OF WORDS REMAINING IN THE OLD CYLINDER>>05898000
DOUBLE                                                                  05900000
   DISCADDR;           <<DISC ADDRESS OF THE CURRENT CYLINDER>>         05902000
   BEGIN                                                                05904000
   <<ADVANCES THE DISC ADDRESS TO THE BEGINNING OF THE NEXT CYLINDER.   05906000
     THE DISC ADDRESS IS RETURNED AS THE VALUE OF THE SUBROUTINE.       05908000
     CURRENTCYLSIZE REFLECTS THE NUMBER OF WORDS LEFT IN THE OLD        05910000
     CYLINDER.                                                          05912000
   >>                                                                   05914000
   IF DTDEVICETYPE = T13037 AND                                         05916000
      (DTSUBTYPE=R7905 OR DTSUBTYPE=F7906 OR DTSUBTYPE=R7906) THEN      05918000
      BEGIN                                                             05920000
      <<DISC ACCESSED IN CYLINDER MODE BUT WANT TO WRITE TO ONLY        05922000
        ONE PLATTER.                                                    05924000
      >>                                                                05926000
      CURRENTCYLSIZE:=SECTORSIZE*(SECYLINDER(DTSUBTYPE)                 05928000
                           -(DISCADDR MODD SECYLINDER(DTSUBTYPE)));     05930000
      GETNEXTCYLINDER:=                                                 05932000
         DISCADDR+DOUBLE(CURRENTCYLSIZE/SECTORSIZE);           <<00497>>05934000
      END                                                               05936000
   ELSE                                                                 05938000
      BEGIN                                                             05940000
      <<BENIGN DISC>>                                                   05942000
      CURRENTCYLSIZE:=MAXCHANNELEN;                                     05944000
      GETNEXTCYLINDER:=DISCADDR+NEXTCYLMAGICNUM;                        05946000
      END;                                                              05948000
   END  <<GETNEXTCYLINDER>>;                                            05950000
SUBROUTINE CONFIGUREDISCADDR(TYPE,SUBTYPE,DISCADDR,CHANCOMMAND);        05952000
VALUE TYPE,SUBTYPE,DISCADDR;                                            05954000
INTEGER                                                                 05956000
   TYPE,               <<DISC TYPE>>                                    05958000
   SUBTYPE;            <<DISC SUB TYPE>>                                05960000
DOUBLE                                                                  05962000
   DISCADDR;           <<LOGICAL SECTOR NUMBER>>                        05964000
ARRAY                                                                   05966000
   CHANCOMMAND;        <<START OF SEEK, ADDRESS RECORD COMMAND SEQ>>    05968000
   BEGIN                                                                05970000
   <<CONVERTS THE DISC ADDRESS TO THE "CYLINDER, HEAD, SECTOR"          05972000
     FORMAT REQUIRED BY THE DISC CONTROLLER.  THIS CONTROLLER FORMAT    05974000
     IS STUFFED INTO BOTH THE SEEK AND THE ADDRESS RECORD COMMANDS.     05976000
   >>                                                                   05978000
   @CMDPTR:=@CHANCOMMAND;                                               05980000
   TOS:=CONVERTDISCADDR(TYPE,SUBTYPE,DISCADDR);                         05982000
   CMDSEEKHEADSECTOR:=CMDADDRHEADSECTOR:=TOS;                           05984000
   CMDSEEKCYLINDER:=CMDADDRCYLINDER:=TOS;                               05986000
   CMDSEEKLOC:=SEEK;                                                    05988000
   CMDADDRECORDLOC:=IF TYPE=T7902 THEN SEEK ELSE ADDRESSREC;            05990000
   END  <<CONFIGUREDISCADDR>>;                                          05992000
INTEGER SUBROUTINE CALCULATECHECKSUM(TARGET,TARGETLEN,OLDCHECKSUM);     05994000
VALUE TARGET,TARGETLEN,OLDCHECKSUM;                                     05996000
POINTER                                                                 05998000
   TARGET;             <<ADDRESS OF DATA TO BE CHECKSUMED>>             06000000
INTEGER                                                                 06002000
   TARGETLEN;          <<NUMBER OF WORDS IN DATA AREA>>                 06004000
LOGICAL                                                                 06006000
   OLDCHECKSUM;        <<CURRENT VALUE OF CHECKSUM>>                    06008000
   BEGIN                                                                06010000
   <<USING THE VALUE OF OLDCHECKSUM AS A BASE, THE CHECKSUM OF          06012000
     TARGET IS COMPUTED AND RETURNED AS THE VALUE OF THE SUBROUTINE     06014000
   >>                                                                   06016000
   FOR XREG:=0 UNTIL TARGETLEN-1 DO                                     06018000
      OLDCHECKSUM:=OLDCHECKSUM+TARGET(XREG);                            06020000
   CALCULATECHECKSUM:=OLDCHECKSUM;                                      06022000
   END  <<CALCULATECHECKSUM>>;                                          06024000
SUBROUTINE CONFIGUREDEVICE(LDEV,DESC);                                  06026000
VALUE LDEV;                                                             06028000
INTEGER                                                                 06030000
   LDEV;             <<LOGICAL DEVICE NUMBER>>                          06032000
DOUBLE                                                                  06034000
   DESC;             <<RESULTANT CONFIGURED WORD>>                      06036000
   BEGIN                                                                06038000
COMMENT                                                        <<03011>>06040000
  USING VARIOUS SYSTEM TABLES, PLACE THE FOLLOWING             <<03011>>06042000
  INFORMATION INTO FIELDS OF DESC:                             <<03011>>06044000
     WORD0.(0:9)  - DRT NUMBER                                 <<03011>>06046000
     WORD0.(9:4)  - SUBTYPE                                    <<03011>>06048000
     WORD0.(13:3) - UNIT                                       <<03011>>06050000
     WORD1.(10:6) - TYPE                                                06052000
ENDCOMMENT;                                                    <<03011>>06054000
   MOVE DEVICE:="    ";                                                 06056000
   ASCII(LDEV,10,DEVICE);                                               06058000
   IF GETDEVINFO(DEVICE,DEVINFO) = NOERRORS THEN                        06060000
      BEGIN                                                             06062000
      TOS:=@DESC;                                                       06064000
      SP0:=ABSOLUTE(SYSDBLOC+DEVINFO(2)+3).(4:4);  <<UNIT FROM DIT>>    06066000
      IF CPUTYPE=ICF25 OR CPUTYPE=ICF44 OR CPUTYPE=ICF55       <<01573>>06068000
      THEN   <<DRT FROM ILT>>                                  <<01573>>06070000
         SP0.(0:9):=ABSOLUTE(ABSOLUTE(XREG+2)+SYSDBLOC+7)      <<03011>>06072000
      ELSE                                                              06074000
         SP0.(0:9):=ABSOLUTE(ABSOLUTE(XREG+2)+SYSDBLOC);       <<03011>>06076000
      SP0.(9:4):=DEVINFO(3).(12:4);  <<SUBTYPE FROM LPDT>>     <<03011>>06078000
      TOS:=@LDTDEVICE;                                                  06080000
      TOS:=LDTDST;                                                      06082000
      TOS:=S5*LDTSIZE+LDTDEVTIPELOC;                                    06084000
      TOS:=1;                                                           06086000
      ASSEMBLE(MFDS);                                                   06088000
      SP0(1):=LDTDEVICE.(10:6);    <<TYPE FROM LDT>>                    06090000
      IF SP0(1).(10:6) = TYPE7902 THEN                                  06092000
         BEGIN  <<FLEXIBLE DISC, GET SUBTYPE AS F(DISC STATUS)>>        06094000
         IOSTATUS:=ATTACHIO(S3,QMISC,STACKDST,@STATBUF,GETSTATUS,<<.10>>06096000
            4,0,0,IF MODE<>INITL THEN SERDISCBLOCKED ELSE BLOCKED);     06098000
         IF BADIO THEN                                                  06100000
            BEGIN  <<UNABLE TO ACCESS THE DISC>>                        06102000
            DEL;                                                        06104000
            DESC:=0D;                                                   06106000
            RETURN;                                                     06108000
            END;                                                        06110000
         SP0.(9:4):=FLEXSUBTYPE(STATBUF(1).(3:4));             <<03011>>06112000
         END;                                                           06114000
      DEL;                                                              06116000
      END;                                                              06118000
   END  <<CONFIGUREDEVICE>>;                                            06120000
$PAGE "SDFINIT PROCEDURE - SUBROUTINES CALLED BY MAINLINE"              06122000
SUBROUTINE OPENSDFILE(FILENUM,DEVTIPE,LABELADDR);                       06124000
INTEGER                                                                 06126000
   FILENUM,            <<SDF FILE NUMBER>>                              06128000
   DEVTIPE;            <<SDF DEVICE TYPE AND SUBTYPE>>                  06130000
DOUBLE                                                                  06132000
   LABELADDR;        <<DISC ADDR OF SDF'S LABEL>>                       06134000
   BEGIN                                                                06136000
   <<OPENS, CHECKS, AND PROCESSES THE SDF MEMORY IMAGE FILE             06138000
   >>                                                                   06140000
   <<OPEN SDF FILE AND CHECK ITS VALIDITY>>                             06142000
   MOVE DESIG:=SDFDESIG,(SDFDESIGLEN);                                  06144000
   FILENUM:=FOPEN(DESIG,OLDSYSFILE,READWRITE);                          06146000
   IF <> THEN ERROREXIT(UGLYSDFILE);                                    06148000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>06150000
   FGETINFO(FILENUM,,FOPTIONS,,RECSIZE,                        <<03608>>06152000
              DEVTIPE,LDNFORGETDEVINFO,HDADDR,                 <<03608>>06154000
      FILECODE,,NUMREC,,,,,,NUMEXTENT,,,LABELADDR);                     06156000
   LDNALPHA(ASCII(LDNFORGETDEVINFO,10,LDNALPHA)) := %40;       <<03608>>06158000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>06160000
   DTDEVICETYPE := DEVINFOTYPE;                                <<03608>>06162000
   IF (FOPTIONS LAND FOPTIONSMASK)<>PROPERFOPTIONS THEN                 06164000
      ERROREXIT(UGLYSDFOPTIONS)                                         06166000
   ELSE IF (RECSIZE<>ONESECTOR) THEN ERROREXIT(UGLYSDFRECSIZE) <<03011>>06168000
   ELSE IF (FILECODE<>PROPERFILECODE) THEN ERROREXIT(UGLYSDFILECODE)    06170000
   ELSE IF NUMREC <> SDFTOTALNUMRECS THEN                      <<03011>>06172000
      ERROREXIT(UGLYSDFNUMRECS)                                         06174000
   ELSE IF NUMEXTENT<>PROPERNUMEXTENT THEN ERROREXIT(UGLYSDFNUMEXTENT); 06176000
   END  <<OPENSDFILE>>;                                                 06178000
SUBROUTINE ERASEBACKUP;                                                 06180000
   BEGIN                                                                06182000
   <<ERASE SECTOR 3 OF THE BACKUP DISC>>                                06184000
   MOVE DESIG:=BACKUPDESIG,(BACKUPDESIGLEN);                            06186000
   FN:=FOPEN(DESIG,,READWRITE);                                         06188000
   IF <> THEN ERROREXIT(UGLYBACKUPFILE);                                06190000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>06192000
   FGETINFO(FN,,,,,DEVICETYPE,LOGDEVICE);                               06194000
   LDNALPHA(ASCII(LOGDEVICE,10,LDNALPHA)) := %40;              <<03608>>06196000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>06198000
   IF DEVINFOTYPE = HP9140 THEN DEVICETYPE.(8:8):=DEVINFOTYPE; <<03608>>06200000
   IF DEVICETYPE.(8:8) <> SERIALDISC AND                       <<03608>>06202000
      DEVICETYPE <> HP9140 THEN ERROREXIT(BACKUPNOTSERIAL);    <<03608>>06204000
   SECTORSIZ := IF DEVICETYPE = HP9140 THEN HP9140'SECTOR      <<03608>>06206000
               ELSE SECTORSIZE;                                <<03608>>06208000
   BUF :=0;                                                    <<03608>>06210000
   MOVE BUF(1) := BUF,(SECTORSIZ - 1);                         <<03608>>06212000
   DISCIO(LOGDEVICE,WRITE,BUF,SECTORSIZ,BOOTDISCADDR)          <<03608>>06214000
   END <<ERASEBACKUP>>;                                                 06216000
                                                                        06218000
                                                                        06220000
SUBROUTINE GENERATEBACKUPSDF(FILENUM,LDEV,DEVTIPE,FILEADDR);   <<03011>>06222000
INTEGER                                                                 06224000
   FILENUM,          <<BACKUP FILE NUMBER>>                             06226000
   LDEV,             <<LOGICAL DEVICE NUMBER>>                          06228000
   DEVTIPE;          <<DEVICE TYPE>>                                    06230000
DOUBLE                                                                  06232000
   FILEADDR;        <<DISC SECTOR ADDR OF SDF>>                <<03011>>06234000
   BEGIN                                                                06238000
   <<1. OPENS THE SERIAL DISC DEVICE.                                   06240000
     2. COPIES THE SDF IMAGE TO IT.                                     06242000
     3. RETURNS INFORMATION ABOUT THE FILE.                             06244000
   >>                                                                   06246000
   MOVE DESIG:=BACKUPDESIG,(BACKUPDESIGLEN);                            06248000
   FILENUM:=FOPEN(DESIG,,NOBUF'READWRITE,ONESECTOR);           <<03011>>06250000
   IF <> THEN ERROREXIT(UGLYBACKUPFILE);                                06252000
 <<FGETINFO MISTAKENLY RETURNS DEVICE TYPE 0 FOR CS80 DEVICE>> <<03608>>06254000
   FGETINFO(FILENUM,,,,,DEVTIPE,LDEV);                                  06256000
   LDNALPHA(ASCII(LDEV,10,LDNALPHA)) := %40;                   <<03608>>06258000
   GETDEVINFO(LDNALPHA,DEVINFO); <<TO GET CORRECT DEVICE TYPE>><<03608>>06260000
   IF DEVINFOTYPE = HP9140 THEN DTDEVICETYPE := DEVINFOTYPE;   <<03608>>06262000
   IF DTDEVICETYPE <> SERIALDISC AND                           <<03608>>06264000
      DEVTIPE <> HP9140 THEN ERROREXIT(BACKUPNOTSERIAL);       <<03608>>06266000
   CONFIGUREDEVICE(LDEV,DESC);                                          06268000
   DTSUBTYPE:=DSUBTYPE;                                                 06270000
   DTDEVICETYPE:=DDEVICETYPE;                                           06272000
                                                               <<03011>>06276000
   <<ALLOCATE SPACE FOR BOOTX PROGRAM>>                        <<03011>>06278000
   <<CONTIGUOUS WRITE WILL ALLOW US TO RETRIEVE START>>        <<03011>>06280000
   <<ADDRESS FROM GAP TABLE>>                                  <<03011>>06282000
   INDEX := 0D;                                                <<03011>>06284000
   WHILE (INDEX:=INDEX+1D) <= BOOTXLEN DO                      <<03011>>06286000
     BEGIN                                                     <<03011>>06288000
       FWRITE(FILENUM,BUF,ONESECTOR,                           <<03011>>06290000
        IF INDEX = 1D THEN CONTIGUOUS ELSE 0);                 <<03011>>06292000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06294000
     END;                                                      <<03011>>06296000
                                                               <<03011>>06298000
   <<ALLOCATE SPACE FOR BOOTXSAVE AREA>>                       <<03011>>06300000
   INDEX:= 0D;                                                 <<03011>>06302000
   WHILE (INDEX:=INDEX+1D) <= BOOTXSAVELEN DO                  <<03011>>06304000
     BEGIN                                                     <<03011>>06306000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06308000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06310000
     END;                                                      <<03011>>06312000
                                                               <<03011>>06314000
   <<ALLOCATE SPACE FOR "SLOP" - WASTED SECTORS TO INSURE>>    <<03011>>06316000
   <<THAT BOOTX AND BOOTXSAVE AREAS DO NOT CROSS "CYLINDER">>  <<03011>>06318000
   <<BOUNDARIES FOR 7905/7906 DISCS>>                          <<03011>>06320000
   SLOPLENGTH := IF DEVTIPE = HP9140 THEN HP9140'SLOPLEN       <<03608>>06322000
                 ELSE SLOPLEN;                                 <<03608>>06324000
                                                               <<03608>>06326000
   << ADDED TO INSURE AREAS FALL ON HP9140 BLOCK BOUNDRIES >>  <<03608>>06328000
   INDEX:= 0D;                                                 <<03011>>06330000
   WHILE (INDEX := INDEX +1D) <= SLOPLENGTH DO                 <<03608>>06332000
     BEGIN                                                     <<03011>>06334000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06336000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06338000
     END;                                                      <<03011>>06340000
                                                               <<03011>>06342000
   <<ALLOCATE SPACE FOR SDFMAP AREA>>                          <<03011>>06344000
   SDFMAPLENGTH := IF DEVTIPE = HP9140 THEN BIGSDFMAPLEN       <<03608>>06346000
                   ELSE SDFMAPLEN;                             <<03608>>06348000
   INDEX:= 0D;                                                 <<03011>>06350000
   WHILE (INDEX:=INDEX+1D) <= SDFMAPLENGTH DO                  <<03608>>06352000
     BEGIN                                                     <<03011>>06354000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06356000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06358000
     END;                                                      <<03011>>06360000
                                                               <<03011>>06362000
   <<ALLOCATE SPACE FOR OVERLAY AREA>>                         <<03011>>06364000
   INDEX := 0D;                                                <<03011>>06366000
   WHILE (INDEX:=INDEX+1D) <= OVERLAYAREALEN DO                <<03011>>06368000
     BEGIN                                                     <<03011>>06370000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06372000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06374000
     END;                                                      <<03011>>06376000
                                                               <<03011>>06378000
   <<ALLOCATE SPACE FOR BANK-1 SAVE AREA>>                     <<03011>>06380000
   INDEX := 0D;                                                <<03011>>06382000
   WHILE (INDEX:=INDEX+1D) <= BANK1SAVELEN DO                  <<03011>>06384000
     BEGIN                                                     <<03011>>06386000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06388000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06390000
     END;                                                      <<03011>>06392000
                                                               <<03011>>06394000
   <<COPY SDF CODE TO BACKUP FILE>>                            <<03011>>06396000
   FOR SECTOR'COUNT := 1 UNTIL CODEAREALEN' DO                 <<03608>>06398000
     BEGIN                                                     <<03011>>06400000
       IF SECTOR'COUNT = INTEGER(HIMEMORYSECTORLOC) AND        <<03608>>06402000
          DEVTIPE = HP9140 THEN                                <<03608>>06404000
          BEGIN   << WRITE 128 WORDS TO ALIGN HP9140 SECTOR >> <<03608>>06406000
             BUF(0) := 0;  << BOUNDARY >>                      <<03608>>06408000
             MOVE BUF(1) := BUF,(ONESECTOR-1);                 <<03608>>06410000
             FWRITE(FILENUM,BUF,ONESECTOR,0);                  <<03608>>06412000
             IF <> THEN ERROREXIT(BACKUPFILERR);               <<03608>>06414000
          END;                                                 <<03608>>06416000
       FREADDIR(SDFILENUM,BUF,ONESECTOR,                       <<03011>>06418000
             DOUBLE(SECTOR'COUNT) + SDFCODELOC - 1D);          <<03608>>06420000
       IF <> THEN ERROREXIT(SDFILERR);                         <<03011>>06422000
       FWRITE(FILENUM,BUF,ONESECTOR,0);                        <<03011>>06424000
       IF <> THEN ERROREXIT(BACKUPFILERR);                     <<03011>>06426000
     END;                                                      <<03011>>06428000
                                                               <<03011>>06430000
   FCONTROL(FILENUM,ENDOFILE,NULL);                                     06432000
                                                                        06434000
   <<GET START ADDRESS FROM THE GAP TABLE TO RETURN>>          <<03011>>06436000
   IF FINDSDISCGAP(LDEV,1,FILEADDR) <> SUCCESSFUL THEN                  06438000
      ERROREXIT(BACKUPFILERR);                                          06440000
   END  <<GENERATEBACKUPSDF>>;                                          06446000
SUBROUTINE INITDISCADDR (DEVTIPE, SDFILEADDR, BOOTXADDR,       <<03011>>06450000
                    BOOTXSAVEADDR,SDFMAPADDR,OVERLAYADDR,      <<03011>>06452000
                    BANK1SAVEADDR,SDFCODEADDR);                <<03011>>06454000
                                                               <<03011>>06456000
VALUE DEVTIPE,SDFILEADDR;                                      <<03011>>06458000
INTEGER                                                        <<03011>>06460000
    DEVTIPE;                <<SDF DISC TYPE AND SUBTYPE>>      <<03011>>06462000
DOUBLE                                                         <<03011>>06464000
    SDFILEADDR,             <<SDF SECTOR ADDR>>                <<03011>>06466000
    BOOTXADDR,              <<BOOTX SECTOR ADDR>>              <<03011>>06468000
    BOOTXSAVEADDR,          <<SECTOR ADDR FOR SAVE OF MEM>>    <<03011>>06470000
                            <<FOR BOOTX READ>>                 <<03011>>06472000
    SDFMAPADDR ,            <<SECTOR ADDR OF SDF MAP AREA>>    <<03011>>06474000
    OVERLAYADDR,            <<SECTOR ADDR OF OVERLAY AREA>>    <<03011>>06476000
    BANK1SAVEADDR,          <<SECTOR ADDR FOR SAVE OF BANK1>>  <<03011>>06478000
                            <<DRT TABLE- ICF55 ONLY>>          <<03011>>06480000
    SDFCODEADDR;            <<SECTOR ADDR OF START OF CODE>>   <<03011>>06482000
                                                               <<03011>>06484000
    <<BASED ON THE START ADDRESS, "SDFILEADDR", THIS >>        <<03011>>06486000
    <<ROUTINE CALCULATES THE DISC ADDRESS OF ALL THE >>        <<03011>>06488000
    <<MAJOR SECTIONS OF THE FILE. SEE DISC FORMAT    >>        <<03011>>06490000
    <<DIAGRAM AT DECLARATIONS AT PROCEDURE HEAD.     >>        <<03011>>06492000
                                                               <<03011>>06494000
BEGIN                                                          <<03011>>06496000
        <<CALCULATION FOR BOOTX AND BOOTXSAVE AREAS. >>        <<03011>>06498000
        <<NOTE: BOTH AREAS MUST NOT CROSS "CYLINDER" >>        <<03011>>06500000
        <<BOUNDARIES (FOR 7905/7906)                 >>        <<03011>>06502000
      << THE HP9140 HAS A SECTOR SIZE OF 512 WORDS.  >>        <<03608>>06504000
      << IF THE DEVICE IS A HP9140 THEN THE OFFSETS  >>        <<03608>>06506000
      << ADDED TO PREVIOUSLY COMPUTED ADDRESSES ARE  >>        <<03608>>06508000
      << DIVIDED BY 4 TO COMPENSATE FOR THE LARGER   >>        <<03608>>06510000
      << SECTOR SIZE OF THE HP9140                   >>        <<03608>>06512000
                                                               <<03608>>06514000
    OFFSETFACTOR := IF DEVTIPE = HP9140 THEN 4D ELSE 1D;       <<03608>>06516000
                                                               <<03608>>06518000
    << SET SLOPLENGTH TO HP9140'SLOPLENGTH TO INSURE THAT >>   <<03608>>06520000
    << ADDRESSES WILL BE AT HP9140 SECTOR BOUNDRYS        >>   <<03608>>06522000
    SLOPLENGTH := IF DEVTIPE = HP9140 THEN HP9140'SLOPLEN      <<03608>>06524000
                  ELSE SLOPLEN;                                <<03608>>06526000
                                                               <<03011>>06528000
    BOOTXADDR := LOCATEDISCADDR(DEVTIPE,SDFILEADDR,BOOTXLEN);  <<03011>>06530000
                                                               <<03011>>06532000
    BOOTXSAVEADDR := LOCATEDISCADDR(DEVTIPE,BOOTXADDR +        <<03011>>06534000
                             BOOTXLEN/OFFSETFACTOR,            <<03608>>06536000
                             BOOTXSAVELEN);                    <<03608>>06538000
                                                               <<03011>>06540000
        <<THE FOLLOWING ADDRESSES ARE FIXED RELATIVE TO >>     <<03011>>06542000
        <<SDFILEADDR START ADDRESS, AND ARE NOT DEPENDENT>>    <<03011>>06544000
        <<ON "CYLINDER" BOUNDARY POSITIONING. "SLOPLEN" >>     <<03011>>06546000
        <<GUARANTEES OVERLAY AREA STARTS PAST WORST CASE>>     <<03011>>06548000
        <<CYLINDER POSITIONING FOR BOOTX/BOOTXSAVE.    >>      <<03011>>06550000
                                                               <<03011>>06552000
    SDFMAPADDR  := SDFILEADDR +  <<START OF FILE>>             <<03011>>06554000
                  (SLOPLENGTH +  <<MAX SLOP FOR CYL BOUND>>    <<03608>>06556000
                   BOOTXLEN +    <<ALLOC FOR BOOTX>>           <<03011>>06558000
                   BOOTXSAVELEN) / <<ALLOC FOR MEM SAVE>>      <<03608>>06560000
                   OFFSETFACTOR;                               <<03608>>06562000
                                                               <<03011>>06564000
    OVERLAYADDR := SDFMAPADDR + SDFMAPLEN;                     <<03011>>06566000
                                                               <<03011>>06568000
    BANK1SAVEADDR := OVERLAYADDR +                             <<03608>>06570000
                     OVERLAYAREALEN / OFFSETFACTOR;            <<03608>>06572000
                                                               <<03011>>06574000
    SDFCODEADDR := BANK1SAVEADDR +                             <<03608>>06576000
                   BANK1SAVELEN / OFFSETFACTOR;                <<03608>>06578000
                                                               <<03608>>06580000
    HIGHMEMADDR := IF DEVTIPE = HP9140                         <<03608>>06582000
                   THEN SDFCODEADDR + HP9140'HIMEMSECL         <<03608>>06584000
                   ELSE SDFCODEADDR + HIMEMORYSECTORL;         <<03608>>06586000
                                                               <<03011>>06588000
END;                                                           <<03011>>06590000
$PAGE                                                          <<03608>>06592000
<<***********************************>>                        <<03608>>06594000
<<***********************************>>                        <<03608>>06596000
<<                                   >>                        <<03608>>06598000
<<             SDFMAP                >>                        <<03608>>06600000
<<                                   >>                        <<03608>>06602000
<<***********************************>>                        <<03608>>06604000
<<***********************************>>                        <<03608>>06606000
                                                               <<03608>>06608000
<<***********************************>>                        <<03608>>06610000
<<                                   >>                        <<03608>>06612000
<<        LOW MEMORY RECORD          >>                        <<03608>>06614000
<<                                   >>                        <<03608>>06616000
<<***********************************>>                        <<03608>>06618000
<<                                   >>                        <<03608>>06620000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>06622000
<<----------------------------------->>                        <<03608>>06624000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>06626000
<<----------------------------------->>                        <<03608>>06628000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03608>>06630000
<<                LOCATION = 0       >>                        <<03608>>06632000
<<----------------------------------->>                        <<03608>>06634000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03608>>06636000
<<              LOCATION   = %174777 >>                        <<03109>>06638000
<<----------------------------------->>                        <<03608>>06640000
<<   STORAGE ADDRESS = OVERLAYADDR   >>                        <<03608>>06642000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>06644000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>06646000
<<----------------------------------->>                        <<03608>>06648000
                                                               <<03608>>06650000
<<***********************************>>                        <<03608>>06652000
<<                                   >>                        <<03608>>06654000
<<        BOOTX AREA RECORD          >>                        <<03608>>06656000
<<                                   >>                        <<03608>>06658000
<<***********************************>>                        <<03608>>06660000
<<                                   >>                        <<03608>>06662000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>06664000
<<----------------------------------->>                        <<03608>>06666000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>06668000
<<----------------------------------->>                        <<03608>>06670000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03608>>06672000
<<                LOCATION = %175000 >>                        <<03109>>06674000
<<----------------------------------->>                        <<03608>>06676000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03608>>06678000
<<              LOCATION   = %176777 >>                        <<03109>>06680000
<<----------------------------------->>                        <<03608>>06682000
<<   STORAGE ADDRESS = BOOTXSAVEADDR >>                        <<03608>>06684000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>06686000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>06688000
<<----------------------------------->>                        <<03608>>06690000
                                                               <<03608>>06692000
<<***********************************>>                        <<03109>>06694000
<<                                   >>                        <<03109>>06696000
<<    BANK 0 FROM BOOTX TO BANK 1    >>                        <<03109>>06698000
<<                                   >>                        <<03109>>06700000
<<***********************************>>                        <<03109>>06702000
<<                                   >>                        <<03109>>06704000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03109>>06706000
<<----------------------------------->>                        <<03109>>06708000
<<   STORAGE TYPE   =   MEMORY       >>                        <<03109>>06710000
<<----------------------------------->>                        <<03109>>06712000
<<   SOURCE START ADDRESS  = BANK 0  >>                        <<03109>>06714000
<<                LOCATION = %177000 >>                        <<03109>>06716000
<<----------------------------------->>                        <<03109>>06718000
<<   SOURCE END ADDRESS    = BANK 0  >>                        <<03109>>06720000
<<              LOCATION   = %177777 >>                        <<03109>>06722000
<<----------------------------------->>                        <<03109>>06724000
<<   STORAGE ADDRESS =  BANK 0       >>                        <<03109>>06726000
<<           LOCATION = %177000      >>                        <<03109>>06728000
<<----------------------------------->>                        <<03109>>06730000
                                                               <<03109>>06732000
<<***********************************>>                        <<03608>>06734000
<<                                   >>                        <<03608>>06736000
<<       BANK1 DRT AREA RECORD       >>                        <<03608>>06738000
<<                                   >>                        <<03608>>06740000
<<***********************************>>                        <<03608>>06742000
<<                                   >>                        <<03608>>06744000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>06746000
<<----------------------------------->>                        <<03608>>06748000
<<   STORAGE TYPE   =   SDF FILE     >>                        <<03608>>06750000
<<----------------------------------->>                        <<03608>>06752000
<<   SOURCE START ADDRESS  = BANK 1  >>                        <<03608>>06754000
<<                LOCATION = %0      >>                        <<03608>>06756000
<<----------------------------------->>                        <<03608>>06758000
<<   SOURCE END ADDRESS    = BANK 1  >>                        <<03608>>06760000
<<              LOCATION   = %3777   >>                        <<03608>>06762000
<<----------------------------------->>                        <<03608>>06764000
<<   STORAGE ADDRESS = BANK1SAVEADDR >>                        <<03608>>06766000
<<     ( SINCE TYPE IS A FILE TWO    >>                        <<03608>>06768000
<<       WORD SECTOR ADDRESS )       >>                        <<03608>>06770000
<<----------------------------------->>                        <<03608>>06772000
                                                               <<03608>>06774000
<<***********************************>>                        <<03608>>06776000
<<                                   >>                        <<03608>>06778000
<<   RECORD FOR CONFIGURED MEMORY    >>                        <<03608>>06780000
<<       ABOVE BANK1 DRT AREA        >>                        <<03608>>06782000
<<                                   >>                        <<03608>>06784000
<<***********************************>>                        <<03608>>06786000
<<                                   >>                        <<03608>>06788000
<<   SOURCE TYPE    =   MEMORY       >>                        <<03608>>06790000
<<----------------------------------->>                        <<03608>>06792000
<<   STORAGE TYPE   =   MEMORY       >>                        <<03608>>06794000
<<----------------------------------->>                        <<03608>>06796000
<<   SOURCE START ADDRESS  = BANK 1  >>                        <<03608>>06798000
<<                LOCATION = %4000   >>                        <<03608>>06800000
<<----------------------------------->>                        <<03608>>06802000
<<   SOURCE END ADDRESS    = HI BANK >>                        <<03608>>06804000
<<     (HIGHEST CONFIGURED BANK)     >>                        <<03608>>06806000
<<              LOCATION   = %177777 >>                        <<03608>>06808000
<<----------------------------------->>                        <<03608>>06810000
<<   STORAGE ADDRESS =  BANK 1       >>                        <<03608>>06812000
<<           LOCATION = %4000        >>                        <<03608>>06814000
<<----------------------------------->>                        <<03608>>06816000
                                                               <<03608>>06818000
                                                               <<03608>>06820000
<<***********************************>>                        <<03608>>06822000
<<  THERE IS A LIMIT OF 16 RECORDS   >>                        <<03608>>06824000
<<  IN THE SDFMAP.                   >>                        <<03608>>06826000
<<***********************************>>                        <<03608>>06828000
                                                               <<03608>>06830000
                                                               <<03608>>06832000
                                                               <<03608>>06834000
SUBROUTINE CONFIGURE'SDFMAP(SDFMAPADDR);                       <<03011>>06836000
<<====================================>>                       <<03011>>06838000
    VALUE SDFMAPADDR;                                          <<03011>>06840000
    DOUBLE SDFMAPADDR;  <<SDFMAP DISC ADDRESS>>                <<03011>>06842000
BEGIN                                                          <<03011>>06844000
                                                               <<03011>>06846000
<< THIS SUBROUTINE LOADS THE RECORDS FOR THE SDFMAP, AND>>     <<03011>>06848000
<< WRITES THE MAP TO THE RESERVED AREA "SDFMAPADDR" IN  >>     <<03011>>06850000
<<THE SDFLOAD FILE. >>                                         <<03011>>06852000
                                                               <<03011>>06854000
<<DURING THE VARIOUS PHASES OF PERFORMING A DUMP, PORTIONS>>   <<03011>>06856000
<<OF MEMORY (POSSIBLY INTERNAL REGISTERS OF DEVICES), MUST BE>><<03011>>06858000
<<SAVED TO ALLOW THEIR RE-USE DURING THE BOOT,BOOTX,COLD LOAD>><<03011>>06860000
<<TRAP ETC..  THESE AREAS HAVE GROWN IN NUMBER TO THE >>       <<03011>>06862000
<<POINT WHERE IT IS USEFUL TO MAINTAIN A "STORAGE MAP". THIS>> <<03011>>06864000
<<MAP IS BUILT HERE, AND THEN PASSED ALONG FOR USE BY THE  >>  <<03011>>06866000
<<VARIOUS STAGES, AND ULTIMATELY USED TO ALLOW THE MAJOR   >>  <<03011>>06868000
<<RECONSTRUCTION OF MEMORY PRIOR TO PRODUCING THE DUMPTAPE>>   <<03011>>06870000
                                                               <<03011>>06872000
<<EACH RECORD CONTAINS THE RANGE (START/END) AND MEDIA TYPE,>> <<03011>>06874000
<<(FROM MEMORY,DISC, INTERNAL REGISTERS, ETC.) OF AN AREA   >> <<03011>>06876000
<<WHICH IS TO BE STORED, AND ALSO THE START ADDRESS AND MEDIA>><<03011>>06878000
<<TYPE OF THE LOCATION WHERE THE STORAGE IS KEPT. >>           <<03011>>06880000
                                                               <<03011>>06882000
<<FOR EXAMPLE A RECORD MIGHT CONTAIN THE FOLLOWING INFO:    >> <<03011>>06884000
<< MEMORY ADDRESSES  0 THRU 20 ARE STORED ON DISC AT LOGICAL>> <<03011>>06886000
<< SECTOR 16 OF THE DISC>>                                     <<03011>>06888000
                                                               <<03011>>06890000
<< FORMAT OF SDFMAP RECORD >>                                  <<03011>>06892000
                                                               <<03011>>06894000
   <<-------------->>                                          <<03011>>06896000
   <<   SRC TYPE   >>  <<+0 MEDIA OF ORIG AREA TO BE SAVED>>   <<03011>>06898000
   <<   STG TYPE   >>  <<+1 MEDIA ON WHICH STORAGE IS KEPT>>   <<03011>>06900000
   <<-------------->>                                          <<03011>>06902000
   <<   SRC START  >>  <<+2 START ADDRESS OF SRC TO BE SAVED>> <<03011>>06904000
   <<   ADDRESS    >>                                          <<03011>>06906000
   <<-------------->>                                          <<03011>>06908000
   <<   SRC END    >>  <<+4 END ADDRESS OF SOURCE TO BE SAVED>><<03011>>06910000
   <<   ADDRESS    >>                                          <<03011>>06912000
   <<-------------->>                                          <<03011>>06914000
   <<   STORAGE    >>  <<+6 START ADDRESS OF THE STORAGE AREA>><<03011>>06916000
   <<   ADDRESS    >>                                          <<03011>>06918000
   <<-------------->>                                          <<03011>>06920000
                                                               <<03011>>06922000
  <<NOTE: IF MEDIA IS MEMORY, THEN BANK/OFFSET ARE USED>>      <<03011>>06924000
  <<IF MEDIA IS IN THE SDF'FILE, THEN LOGICAL SECTOR NUM>>     <<03011>>06926000
                                                               <<03011>>06928000
                                                               <<03011>>06930000
<<---------- START OF SUBROUTINE ------------->>               <<03011>>06932000
                                                               <<03011>>06934000
  @PTR := @BUF;     <<AIM PTRS AT BUF>>                        <<03011>>06936000
                                                               <<03011>>06938000
  MOVE BUF := 0;                                               <<03011>>06940000
  MOVE BUF(1) := BUF, (127);    <<ZERO OUT THE BUFFER>>        <<03011>>06942000
                                                               <<03011>>06944000
                                                               <<03011>>06946000
  <<LOW MEMORY UP TO BOOTX AREA>>                              <<03011>>06948000
  <<--------------------------->>                              <<03011>>06950000
  <<WILL BE SAVED BY BOOTSTRAP EXTENSION PROGRAM>>             <<03011>>06952000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>06954000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>06956000
  DPTR(DSRC'START):= 0D;            <<FROM BANK-0 ADDR 0 >>    <<03011>>06958000
  PTR(SRC'END'HI) := 0;             <<TO 0-%76777 >>           <<03011>>06960000
  PTR(SRC'END'LO) := BOOTXMEMLOC-1;                            <<03011>>06962000
  DPTR(DSTG)      := OVERLAYADDR;   <<SAVED IN OVERLAYAREA>>   <<03011>>06964000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>06966000
                                                               <<03011>>06968000
  <<BOOTX AREA>>                                               <<03011>>06970000
  <<---------->>                                               <<03011>>06972000
  <<WILL BE SAVED BY BOOTSTRAP PROGRAM>>                       <<03011>>06974000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>06976000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>06978000
  PTR(SRC'START'HI) := 0;                                      <<03011>>06980000
  PTR(SRC'START'LO) := BOOTXMEMLOC; <<FROM 0-%77000>>          <<03011>>06982000
  PTR(SRC'END'HI) := 0;             <<TO 0-%77777 >>           <<03011>>06984000
  PTR(SRC'END'LO) := BOOTXMEMLOC+BOOTXLENWD-1;                 <<03011>>06986000
  DPTR(DSTG)      := BOOTXSAVEADDR; <<SAVED IN BOOTXSAVEAREA>> <<03011>>06988000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>06990000
                                                               <<03011>>06992000
  <<MEMORY FROM END OF BOOTX TO END OF BANK-0>>                <<03011>>06994000
  <<----------------------------------------->>                <<03011>>06996000
  <<REMAINS INTACT IN MEMORY>>                                 <<03011>>06998000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>07000000
  PTR(STGMEDIA)     := MEMORY;                                 <<03011>>07002000
  PTR(SRC'START'HI) := 0;                                      <<03011>>07004000
  PTR(SRC'START'LO) := BOOTXMEMLOC + BOOTXLENWD;               <<03011>>07006000
  PTR(SRC'END'HI) := 0;                                        <<03011>>07008000
  PTR(SRC'END'LO) := %177777;        <<TO END OF BANK-0>>      <<03011>>07010000
  PTR(STG'HI) := 0;                                            <<03011>>07012000
  PTR(STG'LO) := BOOTXMEMLOC + BOOTXLENWD;                     <<03011>>07014000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>07016000
                                                               <<03011>>07018000
  <<BANK1 DRT TABLE AREA (FOR ICF-55) >>                       <<03011>>07020000
  <<---------------------------------->>                       <<03011>>07022000
  <<WILL BE SAVED FOR ALL CPUS BY BOOTX CHAN PROGRAM  >>       <<03011>>07024000
  <<ALTHOUGH IT IS ONLY NECESSARY FOR ICF-55>>                 <<03011>>07026000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>07028000
  PTR(STGMEDIA)     := SDF'FILE;                               <<03011>>07030000
  PTR(SRC'START'HI) := 1;                                      <<03011>>07032000
  PTR(SRC'START'LO) := 0;   <<FROM BANK-1 ADDR 0>>             <<03011>>07034000
  PTR(SRC'END'HI) := 1;                                        <<03011>>07036000
  PTR(SRC'END'LO) := BANK1SAVELENWD -1;                        <<03011>>07038000
  DPTR(DSTG)      := BANK1SAVEADDR; <<SAVE IN BANK1SAVEAREA>>  <<03011>>07040000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>07042000
                                                               <<03011>>07044000
  <<REST OF BANK-1 TO END OF ALL CONFIG MEMORY>>               <<03011>>07046000
  <<-------------------------------------------->>             <<03011>>07048000
  <<REMAINS INTACT IN MEMORY>>                                 <<03011>>07050000
  PTR(SRCMEDIA)     := MEMORY;                                 <<03011>>07052000
  PTR(STGMEDIA)     := MEMORY;                                 <<03011>>07054000
  PTR(SRC'START'HI) := 1;                                      <<03011>>07056000
  PTR(SRC'START'LO) := BANK1SAVELENWD;  <<FROM BNK1 PAST DRTS>><<03011>>07058000
  PTR(SRC'END'HI) := NUMBERBANKS - 1;   <<END OF CONFIG MEM>>  <<03011>>07060000
  PTR(SRC'END'LO) := %177777;                                  <<03011>>07062000
  PTR(STG'HI) := 1;                                            <<03011>>07064000
  PTR(STG'LO) := BANK1SAVELENWD;                               <<03011>>07066000
  @PTR := @PTR + MAPENTRYLEN;                                  <<03011>>07068000
                                                               <<03011>>07070000
  <<WRITE THE MAP OUT TO DISC>>                                <<03011>>07072000
  <<------------------------->>                                <<03011>>07074000
  DISCIO( DESTDEV,WRITE,BUF,SDFMAPLENWD,SDFMAPADDR);           <<03011>>07076000
                                                               <<03011>>07078000
END;  <<OF CONFIGURE'SDFMAP>>                                  <<03011>>07080000
<<---------------------------------------------------->>       <<03608>>07082000
<<                                                    >>       <<03608>>07084000
<<   SET'CMD'BYTES -- SUBROUTINE TO SET UP THE        >>       <<03608>>07086000
<<                    COMMAND DATA BYTES FOR READ,    >>       <<03608>>07088000
<<                    WRITE AND VERIFY OPERATIONS     >>       <<03608>>07090000
<<                                                    >>       <<03608>>07092000
<<---------------------------------------------------->>       <<03608>>07094000
                                                               <<03608>>07096000
      SUBROUTINE SET'CMD'BYTES(CDB'AREA'BYTE,CLDA1,CLDA2,      <<03608>>07098000
                    COUNT,FUNCTION);                           <<03608>>07100000
                                                               <<03608>>07102000
      VALUE CDB'AREA'BYTE,CLDA1,CLDA2,COUNT,FUNCTION;          <<03608>>07104000
      LOGICAL CDB'AREA'BYTE,CLDA1,CLDA2,COUNT;                 <<03608>>07106000
      BYTE FUNCTION;                                           <<03608>>07108000
                                                               <<03608>>07110000
                                                               <<03608>>07112000
       BEGIN                                                   <<03608>>07114000
         BBUF(CDB'AREA'BYTE) := CDB'SET'UNIT;                  <<03608>>07116000
         BBUF(CDB'AREA'BYTE+1) := CDB'SET'VOL;                 <<03608>>07118000
                                                               <<03608>>07120000
         BBUF(CDB'AREA'BYTE+2) := CDB'SET'SNGL'VEC;            <<03608>>07122000
         BBUF(CDB'AREA'BYTE+3) := 0;                           <<03608>>07124000
         BBUF(CDB'AREA'BYTE+4) := 0;                           <<03608>>07126000
         BBUF(CDB'AREA'BYTE+5) := CLDA1.(0:8);                 <<03608>>07128000
         BBUF(CDB'AREA'BYTE+6) := CLDA1.(8:8);                 <<03608>>07130000
         BBUF(CDB'AREA'BYTE+7) := CLDA2.(0:8);                 <<03608>>07132000
         BBUF(CDB'AREA'BYTE+8) := CLDA2.(8:8);                 <<03608>>07134000
                                                               <<03608>>07136000
         BBUF(CDB'AREA'BYTE+9) := CDB'SET'LENGTH;              <<03608>>07138000
         BBUF(CDB'AREA'BYTE+10) := 0;                          <<03608>>07140000
         BBUF(CDB'AREA'BYTE+11) := 0;                          <<03608>>07142000
         BBUF(CDB'AREA'BYTE+12) := COUNT.(0:8);                <<03608>>07144000
         BBUF(CDB'AREA'BYTE+13) := COUNT.(8:8);                <<03608>>07146000
         BBUF(CDB'AREA'BYTE+14) := CDB'SET'BURST;              <<03608>>07148000
         BBUF(CDB'AREA'BYTE+15) := 1;                          <<03608>>07150000
         BBUF(CDB'AREA'BYTE+16) := FUNCTION;                   <<03608>>07152000
       END;                                                    <<03608>>07154000
                                                               <<03608>>07156000
SUBROUTINE CONFIGURE'CS80'BOOTS(DESTDEV,DEVTIPE,BOOTXADDR,     <<03608>>07160000
                                BOOTXSAVEADDR,OVERLAYADDR,     <<03608>>07162000
                                BANK1SAVEADDR,SDFCODEADDR);    <<03608>>07164000
<< THIS PROCEDURE CONFIGURES THE BOOT AND BOOTX CHANNEL >>     <<03608>>07166000
<< PROGRAMS FOR THE CS80DEVICES.  ADDED 9/25/81 SGB     >>     <<03608>>07168000
                                                               <<03608>>07170000
VALUE DESTDEV,DEVTIPE,BOOTXADDR,BOOTXSAVEADDR,                 <<03608>>07172000
      BANK1SAVEADDR,OVERLAYADDR,SDFCODEADDR;                   <<03608>>07174000
INTEGER                                                        <<03608>>07176000
   DESTDEV,             <<DESTINATION LOGICAL DEVICE>>         <<03608>>07178000
   DEVTIPE;             <<SDF DISC SUBTYPE AND TYPE>>          <<03608>>07180000
DOUBLE                                                         <<03608>>07182000
   BOOTXADDR,           <<BOOTX DISC ADDRESS>>                 <<03608>>07184000
   BOOTXSAVEADDR,       <<OVERLAY AREA FOR BOOTX TARGET SAVE>> <<03608>>07186000
   OVERLAYADDR,         <<OVERLAY AREA DISC ADDRESS>>          <<03608>>07188000
   BANK1SAVEADDR,       <<STORAGE AREA FOR IF55 BANK1 DRTS>>   <<03608>>07190000
   SDFCODEADDR;         <<DISC ADDRESS OF SDF CODE>>           <<03608>>07192000
                                                               <<03608>>07194000
BEGIN                                                          <<03608>>07196000
                                                               <<03608>>07198000
   <<-------------------------------------->>                  <<03608>>07200000
   <<                                      >>                  <<03608>>07202000
   <<      BUILD THE CS80 BOOTSTRAP        >>                  <<03608>>07204000
   <<                                      >>                  <<03608>>07206000
   <<-------------------------------------->>                  <<03608>>07208000
                                                               <<03608>>07210000
                                                               <<03608>>07212000
      BUF := 0;                                                <<03608>>07214000
      MOVE BUF(1) := BUF,(BOOTLENWD - 1);                      <<03608>>07216000
      MOVE BUF(BOOT'WRITE) :=                                  <<03608>>07218000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>07220000
      MOVE BUF(BOOT'VERIFY) :=                                 <<03608>>07222000
               CS80'TEMPLATE(VERIFY'TEMPLATE),(VERIFY'LENGTH); <<03608>>07224000
      MOVE BUF(BOOT'READ) :=                                   <<03608>>07226000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>07228000
                                                               <<03608>>07230000
      BUF(BOOT'WRITE + 4) := BOOTMEMLOC + BOOT'WRT'CMDS;       <<03608>>07232000
      BUF(BOOT'VERIFY + 4) := BOOTMEMLOC + BOOT'VER'CMDS;      <<03608>>07234000
      BUF(BOOT'READ + 4) := BOOTMEMLOC + BOOT'READ'CMDS;       <<03608>>07236000
                                                               <<03608>>07238000
      BUF(BOOT'WRITE + 7) := WRT'EXEC'SEC;                     <<03608>>07240000
      BUF(BOOT'READ + 7) := READ'EXEC'SEC;                     <<03608>>07242000
                                                               <<03608>>07244000
      BUF(BOOT'WRITE + 8) := BOOTXLENBT;                       <<03608>>07246000
      BUF(BOOT'READ + 8) := BOOTXLENBT;                        <<03608>>07248000
                                                               <<03608>>07250000
      BUF(BOOT'WRITE + 10).(8:8) := 0; << BANK 0 >>            <<03608>>07252000
      BUF(BOOT'WRITE + 10).(0:3) := 5; << BURST THE WRITE >>   <<03608>>07254000
      BUF(BOOT'WRITE + 11) := BOOTXMEMLOC;<<BOOTX START ADDR>> <<03608>>07256000
      BUF(BOOT'READ + 10).(8:8) := 0; << BANK 0 >>             <<03608>>07258000
      BUF(BOOT'READ + 10).(0:1) := 1; << BURST THE READ >>     <<03608>>07260000
      BUF(BOOT'READ + 11) := BOOTXMEMLOC;<<BOOTX SAVE ADDRESS>><<03608>>07262000
      BUF(JUMP'BOOTX) := BOOTX'REL'ADDR;                       <<03608>>07264000
                                                               <<03608>>07266000
      SET'CMD'BYTES(BOOT'WRT'CMDS*2,BOOTXSAVEADDR1,            <<03608>>07268000
                    BOOTXSAVEADDR2,BOOTXLENBT,CDB'WRITE);      <<03608>>07270000
      SET'CMD'BYTES(BOOT'VER'CMDS*2,BOOTXSAVEADDR1,            <<03608>>07272000
                    BOOTXSAVEADDR2,BOOTXLENBT,CDB'VERIFY);     <<03608>>07274000
      SET'CMD'BYTES(BOOT'READ'CMDS*2,BOOTXADDR1,               <<03608>>07276000
                    BOOTXADDR2,BOOTXLENBT,CDB'READ);           <<03608>>07278000
                                                               <<03608>>07280000
      BSDFMAPADDR := SDFMAPADDR1;                              <<03608>>07282000
      BSDFMAPADDR1 := SDFMAPADDR2;                             <<03608>>07284000
                                                               <<03608>>07286000
      BCHECKSUM:=CALCULATECHECKSUM(BUF,BOOTLENWD,              <<03608>>07288000
                 CHECKSUMSTART);                               <<03608>>07290000
                                                               <<03608>>07292000
      <<------------------------------------->>                <<03608>>07294000
      <<                                     >>                <<03608>>07296000
      << WRITE BOOTSTRAP OUT TO SECTOR THREE >>                <<03608>>07298000
      <<                                     >>                <<03608>>07300000
      <<------------------------------------->>                <<03608>>07302000
                                                               <<03608>>07304000
      DISCIO(DESTDEV,WRITE,BUF,BOOTLENWD,BOOTDISCADDR);        <<03608>>07306000
                                                               <<03608>>07308000
                                                               <<03608>>07310000
   <<------------------------------------->>                   <<03608>>07312000
   <<                                     >>                   <<03608>>07314000
   <<    BUILD THE CS80 BOOT EXTENSION    >>                   <<03608>>07316000
   <<                                     >>                   <<03608>>07318000
   <<------------------------------------->>                   <<03608>>07320000
                                                               <<03608>>07322000
      BUF := 0;                                                <<03608>>07324000
      MOVE BUF(1) := BUF,(BOOTXLENWD - 1);                     <<03608>>07326000
      OVERLAY'WRITE := 0;                                      <<03608>>07328000
      MEMORYADDR := 0;                                         <<03608>>07330000
      MEMORYLEFT := OVERLAYAREALENWD;                          <<03608>>07332000
      DISCTARGETADDR := OVERLAYADDR;                           <<03608>>07334000
      SECTOROFFSET := IF DEVTIPE = HP9140 THEN                 <<03608>>07336000
                         DOUBLE( SIXTEENK/HP9140'SECTOR )      <<03608>>07338000
                      ELSE DOUBLE( SIXTEENK/ONESECTOR );       <<03608>>07340000
                                                               <<03608>>07342000
      DO                                                       <<03608>>07344000
         BEGIN                                                 <<03608>>07346000
            OVERLAY'VERIFY := OVERLAY'WRITE + WRITE'LENGTH;    <<03608>>07348000
            OVERLAY'WRT'CMDS := OVERLAY'VERIFY + VERIFY'LENGTH;<<03608>>07350000
            OVERLAY'VER'CMDS := OVERLAY'WRT'CMDS + CMDS'LENGTH;<<03608>>07352000
            WORDCOUNT := IF MEMORYLEFT < SIXTEENK THEN         <<03608>>07354000
                            MEMORYLEFT                         <<03608>>07356000
                         ELSE SIXTEENK;                        <<03608>>07358000
                                                               <<03608>>07360000
            MOVE BUF(OVERLAY'WRITE) :=                         <<03608>>07362000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>07364000
            MOVE BUF(OVERLAY'VERIFY) :=                        <<03608>>07366000
               CS80'TEMPLATE(VERIFY'TEMPLATE),(VERIFY'LENGTH); <<03608>>07368000
                                                               <<03608>>07370000
            BUF(OVERLAY'WRITE + 4) :=                          <<03608>>07372000
               BOOTXMEMLOC + OVERLAY'WRT'CMDS;                 <<03608>>07374000
            BUF(OVERLAY'VERIFY + 4) :=                         <<03608>>07376000
                BOOTXMEMLOC + OVERLAY'VER'CMDS;                <<03608>>07378000
                                                               <<03608>>07380000
            BUF(OVERLAY'WRITE + 7) := WRT'EXEC'SEC;            <<03608>>07382000
                                                               <<03608>>07384000
            BUF(OVERLAY'WRITE + 8) := WORDCOUNT * 2;           <<03608>>07386000
                                                               <<03608>>07388000
            BUF(OVERLAY'WRITE + 10).(8:8) := 0; << BANK 0 >>   <<03608>>07390000
            BUF(OVERLAY'WRITE + 10).(0:3) := 5; <<BURST MODE>> <<03608>>07392000
            BUF(OVERLAY'WRITE + 11) := MEMORYADDR; <<ADDRESS>> <<03608>>07394000
                                                               <<03608>>07396000
            BUF(OVERLAY'VERIFY + 9) := CMDS'LENGTH * 2 +       <<03608>>07398000
                  BUF(OVERLAY'VERIFY + 9);                     <<03608>>07400000
                                                               <<03608>>07402000
            SET'CMD'BYTES(OVERLAY'WRT'CMDS*2,DISCADDR1,        <<03608>>07404000
                    DISCADDR2, WORDCOUNT * 2,                  <<03608>>07406000
                    CDB'WRITE);                                <<03608>>07408000
            SET'CMD'BYTES(OVERLAY'VER'CMDS*2,DISCADDR1,        <<03608>>07410000
                    DISCADDR2, WORDCOUNT * 2,                  <<03608>>07412000
                    CDB'VERIFY);                               <<03608>>07414000
                                                               <<03608>>07416000
            OVERLAY'WRITE := OVERLAY'VER'CMDS + CMDS'LENGTH;   <<03608>>07418000
            MEMORYADDR := MEMORYADDR + WORDCOUNT;              <<03608>>07420000
            MEMORYLEFT := MEMORYLEFT - WORDCOUNT;              <<03608>>07422000
            DISCTARGETADDR := DISCTARGETADDR + SECTOROFFSET;   <<03608>>07424000
                                                               <<03608>>07426000
         END UNTIL MEMORYLEFT = 0;                             <<03608>>07428000
                                                               <<03608>>07430000
      MOVE BUF(LOWMEMORY'READ) :=                              <<03608>>07432000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>07434000
      MOVE BUF(SDFCODE'READ) :=                                <<03608>>07436000
               CS80'TEMPLATE(READ'TEMPLATE),(READ'LENGTH);     <<03608>>07438000
      MOVE BUF(BANK1'WRITE) :=                                 <<03608>>07440000
               CS80'TEMPLATE(WRITE'TEMPLATE),(WRITE'LENGTH);   <<03608>>07442000
                                                               <<03608>>07444000
      << INTERRUPT/HALT OF 0 TRAPS TO SDFLOAD >>               <<03608>>07446000
                                                               <<03608>>07448000
      BUF(END'BOOTX) := HALTINTERRUPT;                         <<03608>>07450000
      BUF(END'BOOTX + 1) := 0;                                 <<03608>>07452000
                                                               <<03608>>07454000
                                                               <<03608>>07456000
      BUF(LOWMEMORY'READ + 4):=BOOTXMEMLOC + LOWMEM'READ'CMDS; <<03608>>07458000
      BUF(SDFCODE'READ + 4) := BOOTXMEMLOC + SDFCODE'READ'CMDS;<<03608>>07460000
      BUF(BANK1'WRITE + 4) := BOOTXMEMLOC + BANK1'WRT'CMDS;    <<03608>>07462000
                                                               <<03608>>07464000
      BUF(LOWMEMORY'READ + 7) := READ'EXEC'SEC;                <<03608>>07466000
      BUF(SDFCODE'READ + 7) := READ'EXEC'SEC;                  <<03608>>07468000
      BUF(BANK1'WRITE + 7) := WRT'EXEC'SEC;                    <<03608>>07470000
                                                               <<03608>>07472000
      BUF(LOWMEMORY'READ + 8) := LOWMEMORYSIZE;                <<03608>>07474000
      BUF(SDFCODE'READ+8) := (CODEAREALENWD - HIMEMORYLOC)*2;  <<03608>>07476000
      BUF(BANK1'WRITE + 8) := BANK1SAVELENWD * 2;              <<03608>>07478000
                                                               <<03608>>07480000
      BUF(LOWMEMORY'READ + 10).(8:8) := 0; << BANK 0 >>        <<03608>>07482000
      BUF(LOWMEMORY'READ + 10).(0:1) := 1; << BURST THE READ >><<03608>>07484000
      BUF(LOWMEMORY'READ + 11) := 0; << LOWMEMORY ADDRESS >>   <<03608>>07486000
      BUF(SDFCODE'READ + 10).(8:8) := 0; << BANK 0 >>          <<03608>>07488000
      BUF(SDFCODE'READ + 10).(0:1) := 1; << BURST THE READ >>  <<03608>>07490000
      BUF(SDFCODE'READ + 11) := %1600; << SDF ADDRESS >>       <<03608>>07492000
      BUF(BANK1'WRITE + 10).(8:8) := 1; << BANK 1 >>           <<03608>>07494000
      BUF(BANK1'WRITE + 10).(0:3) := 5; << BURST THE WRITE >>  <<03608>>07496000
      BUF(BANK1'WRITE + 11) := 0;  << BANK1 DRT ADDRESS >>     <<03608>>07498000
                                                               <<03608>>07500000
      SET'CMD'BYTES(LOWMEM'READ'CMDS*2,SDFCODEADDR1,           <<03608>>07502000
                    SDFCODEADDR2,LOWMEMORYSIZE,CDB'READ);      <<03608>>07504000
      SET'CMD'BYTES(SDFCODE'READ'CMDS*2,HIGHMEMADDR1,          <<03608>>07506000
                    HIGHMEMADDR2,                              <<03608>>07508000
                    (CODEAREALENWD - HIMEMORYLOC)*2,           <<03608>>07510000
                    CDB'READ);                                 <<03608>>07512000
      SET'CMD'BYTES(BANK1'WRT'CMDS*2,BANK1SAVEADDR1,           <<03608>>07514000
                    BANK1SAVEADDR2,BANK1SAVELENWD * 2,         <<03608>>07516000
                    CDB'WRITE);                                <<03608>>07518000
                                                               <<03608>>07520000
      << WRITE BOOTSTRAP EXTENSION >>                          <<03608>>07522000
      DISCIO(DESTDEV,WRITE,BUF,BOOTXLENWD,BOOTXADDR);          <<03608>>07524000
                                                               <<03608>>07526000
END;                                                           <<03608>>07528000
                                                               <<03608>>07530000
$PAGE                                                          <<03608>>07532000
<<****************************************************>>       <<03608>>07534000
<<                                                    >>       <<03608>>07536000
<<   SUBROUTINE CONFIGUREBOOTS BUILDS AND WRITES      >>       <<03608>>07538000
<<   THE BOOT CHANNEL PROGRAM TO SECTOR 3 FOR         >>       <<03608>>07540000
<<   NON-CS80DEVICES, ALSO BUILDS AND WRITES THE      >>       <<03608>>07542000
<<   BOOT-EXTENSION CHANNEL PROGRAM TO THE SDFLOAD    >>       <<03608>>07544000
<<   FILE                                             >>       <<03608>>07546000
<<                                                    >>       <<03608>>07548000
<<****************************************************>>       <<03608>>07550000
                                                               <<03608>>07552000
SUBROUTINE CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,           <<03011>>07554000
   BOOTXSAVEADDR,OVERLAYADDR,BANK1SAVEADDR,SDFCODEADDR);       <<03011>>07556000
VALUE DESTDEV,DEVTIPE,BOOTXADDR,BOOTXSAVEADDR,                 <<03011>>07558000
   BANK1SAVEADDR,OVERLAYADDR,SDFCODEADDR;                      <<03011>>07560000
INTEGER                                                                 07562000
   DESTDEV,            <<DESTINATION LOGICAL DEVICE>>                   07564000
   DEVTIPE;            <<SDF DISC SUB TYPE>>                            07566000
DOUBLE                                                                  07568000
   BOOTXADDR,          <<BOOTX DISC ADDRESS>>                           07570000
   BOOTXSAVEADDR,      <<OVERLAY AREA FOR BOOTX TARGET SAVE>>  <<03011>>07572000
   OVERLAYADDR,        <<OVERLAY AREA DISC ADDRESS>>                    07574000
   BANK1SAVEADDR,      <<STORAGE AREA FOR ICF55 BANK1 DRTS>>   <<03011>>07576000
   SDFCODEADDR;        <<DISC ADDR OF SDF CODE>>                        07578000
   BEGIN                                                                07580000
   <<1. CONFIGURE AND WRITE OUT THE INITIAL BOOTSTRAP.                  07582000
     2. CONFIGURE AND WRITE OUT THE BOOTX.                              07584000
   >>                                                                   07586000
   <<CONFIGURE BOOTSTRAP>>                                              07588000
   MOVE BUF:=BOOT,(BOOTLENWD);                                          07590000
                                                               <<03011>>07592000
      <<LOAD BOOTXSAVEADDR INTO BOOTSTRAP PROGRAM>>            <<03011>>07594000
      <<SEEK TO THIS ADDR FOR DISC WRITE >>                    <<03011>>07596000
      <<SAVE OF BOOTX MEMORY TARGET AREA>>                     <<03011>>07598000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,                            07600000
                BOOTXSAVEADDR,BBOOTXSAVEAREA);                 <<03011>>07602000
                                                               <<03011>>07604000
      <<LOAD BOOTXADDR INTO BOOTSTRAP PROGRAM>>                <<03011>>07606000
       <<SEEK TO THIS ADDR FOR DISC READ OF BOOTX PROG>>       <<03011>>07608000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,BOOTXADDR,         <<03011>>07610000
                     BBOOTXAREA);                              <<03011>>07612000
                                                               <<03011>>07614000
       <<LOAD THE LOGICAL SECTOR NUMBER OF THE SDFMAP AREA>>   <<03011>>07616000
       <<INTO THE BOOTSTRAP PROGRAM>>                          <<03011>>07618000
    TOS := SDFMAPADDR;                                         <<03011>>07620000
    BSDFMAPADDR1 := TOS;  BSDFMAPADDR := TOS;                  <<03011>>07622000
   BFILEMASK:=FILEMASK(DTSUBTYPE);                                      07626000
   BCHECKSUM:=CALCULATECHECKSUM(BUF,BOOTLENWD,CHECKSUMSTART);           07628000
                                                                        07630000
   <<WRITE BOOTSTRAP OUT TO SECTOR THREE>>                              07632000
   DISCIO(DESTDEV,WRITE,BUF,BOOTLENWD,BOOTDISCADDR);                    07634000
                                                                        07636000
   <<CONFIGURE BOOTSTRAP EXTENSION>>                                    07638000
   BUF:=0; MOVE BUF(1):=BUF,(BOOTXLENWD-1);                             07640000
   @CHANPROG:=@BUF; @CMDAREA:=@BUF(BOOTXLENWD)-COMMANDLENGTH-2;         07642000
   BXREADCOMMAND:=READCMD;                                              07644000
   BXWRITECOMMAND:=WRITECMD;                                            07646000
                                                                        07648000
   <<CONFIGURE PORTION TO WRITE OUT OVERLAY AREA>>                      07650000
   MEMORYADDR:= 0;  MEMORYLEFT := OVERLAYAREALENWD;            <<03011>>07652000
   DISCTARGETADDR:=OVERLAYADDR;                                         07654000
   DO                                                                   07656000
      BEGIN                                                             07658000
      <<EMIT CHANNEL PROGRAM INSTRUCTIONS TO WRITE OUT A CYLINDER'S     07660000
        WORTH OF BANK ZERO TO THE DISC OVERLAY AREA.                    07662000
      >>                                                                07664000
      MOVE CHANPROG:=WRITETEMPLATE,(WRITETEMPLATELEN);                  07666000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,DISCTARGETADDR,CMDAREA); 07668000
      WTVERSEEKADDR:=WTSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;               07670000
      WTADDRECORDADDR:=WTVERADDREC:=WTSEEKADDR+3;                       07672000
      WTMEMORYADDR:=MEMORYADDR;                                         07674000
      WTVERCMDADDR:=BOOTXBASE+@CMDVERIFY-@BUF;                          07676000
      DISCTARGETADDR:=                                                  07678000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE);          07680000
      WORDCOUNT:=                                                       07682000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT ELSE CYLINDERSIZE);   07684000
      WTBYTECOUNT:=2*WORDCOUNT;                                         07686000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                                 07688000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                                 07690000
      CMDVERIFY:=VERIFY;                                                07692000
      CMDVERIFYSEC:=WORDCOUNT/SECTORSIZE;                               07694000
      @CHANPROG:=@CHANPROG+WRITETEMPLATELEN;                            07696000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                                 07698000
      END UNTIL MEMORYLEFT=0;                                           07700000
                                                                        07702000
   <<CONFIGURE PORTION TO READ IN SDF AREA>>                            07704000
   <<READ IN LOW MEMORY>>                                               07706000
   MOVE CHANPROG:=READTEMPLATE,(READTEMPLATELEN);                       07708000
   MEMORYADDR:=0;                                                       07710000
   RDBYTECOUNT:=LOWMEMORYSIZE;                                          07712000
   CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,SDFCODEADDR,CMDAREA);       07714000
   RDSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;                                 07716000
   RDADDRECORDADDR:=RDSEEKADDR+3;                                       07718000
   CMDSTATUS:=STATUSCMD;                                                07720000
   RDSTATUSCMD:=RDSTATUSADDR:=RDSEEKADDR+6;                             07722000
                                                                        07724000
   <<READ IN CHUNKS OF HIGH MEMORY>>                                    07726000
   MEMORYADDR:=HIMEMORYLOC;                                             07728000
   MEMORYLEFT := CODEAREALENWD-HIMEMORYLOC;                    <<03011>>07730000
   DISCTARGETADDR:=SDFCODEADDR+HIMEMORYSECTORLOC;                       07732000
   DO                                                                   07734000
      BEGIN                                                             07736000
      <<EMIT CHANNEL PROGRAM INSTRUCTIONS TO READ IN A CYLINDER'S       07738000
        WORTH OF THE DISC SDF AREA TO BANK ZERO.                        07740000
      >>                                                                07742000
      @CHANPROG:=@CHANPROG+READTEMPLATELEN;                             07744000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                                 07746000
      MOVE CHANPROG:=READTEMPLATE,(READTEMPLATELEN);                    07748000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,DISCTARGETADDR,CMDAREA); 07750000
      RDSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;                              07752000
      RDADDRECORDADDR:=RDSEEKADDR+3;                                    07754000
      RDMEMORYADDR:=MEMORYADDR;                                         07756000
      RDSTATUSCMD:=RDSTATUSADDR:=RDSEEKADDR+6;                          07758000
      CMDSTATUS:=STATUSCMD;                                             07760000
      DISCTARGETADDR:=                                                  07762000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE);          07764000
      WORDCOUNT:=                                                       07766000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT ELSE CYLINDERSIZE);   07768000
      RDBYTECOUNT:=2*WORDCOUNT;                                         07770000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                                 07772000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                                 07774000
      END UNTIL MEMORYLEFT=0;                                           07776000
                                                               <<03011>>07778000
   <<CONFIGURE PORTION TO WRITE OUT BANK1 DRT AREA>>           <<03011>>07780000
   <<DONE FOR ALL CPUS, BUT USED LATER ONLY FOR ICF55>>        <<03011>>07782000
                                                               <<03011>>07784000
   @CHANPROG:=@CHANPROG+READTEMPLATELEN;                       <<03011>>07786000
   @CMDAREA:=@CMDAREA - COMMANDLENGTH;                         <<03011>>07788000
                                                               <<03011>>07790000
   MEMORYADDR:=0; MEMORYLEFT:=BANK1SAVELENWD;                  <<03011>>07792000
   DISCTARGETADDR:=BANK1SAVEADDR;                              <<03011>>07794000
   DO                                                          <<03011>>07796000
      BEGIN                                                    <<03011>>07798000
      <<EMIT CHANNEL PROG TO WRITE OUT DRT AREA IN BANK 1 >>   <<03011>>07800000
                                                               <<03011>>07802000
      MOVE CHANPROG:=WRITETEMPLATE,(WRITETEMPLATELEN);         <<03011>>07804000
      CONFIGUREDISCADDR(DTDEVICETYPE,DTSUBTYPE,                <<03011>>07806000
                        DISCTARGETADDR,CMDAREA);               <<03011>>07808000
      WTVERSEEKADDR:=WTSEEKADDR:=BOOTXBASE+@CMDAREA-@BUF;      <<03011>>07810000
      WTADDRECORDADDR:=WTVERADDREC:=WTSEEKADDR+3;              <<03011>>07812000
      WTMEMORYADDR:=MEMORYADDR;                                <<03011>>07814000
      WTMEMORYBANK := 1;   <<BANK 1>>                          <<03011>>07816000
      WTCHECKPOINT := 3;  <<HALT INT. CODE FOR CHECKPOINT>>    <<03011>>07818000
      WTVERCMDADDR:=BOOTXBASE+@CMDVERIFY-@BUF;                 <<03011>>07820000
      DISCTARGETADDR:=                                         <<03011>>07822000
         GETNEXTCYLINDER(DEVTIPE,DISCTARGETADDR,CYLINDERSIZE); <<03011>>07824000
      WORDCOUNT:=                                              <<03011>>07826000
      (IF CYLINDERSIZE>MEMORYLEFT THEN MEMORYLEFT              <<03011>>07828000
                                  ELSE CYLINDERSIZE);          <<03011>>07830000
      WTBYTECOUNT:=2*WORDCOUNT;                                <<03011>>07832000
      MEMORYADDR:=MEMORYADDR+WORDCOUNT;                        <<03011>>07834000
      MEMORYLEFT:=MEMORYLEFT-WORDCOUNT;                        <<03011>>07836000
      CMDVERIFY:=VERIFY;                                       <<03011>>07838000
      CMDVERIFYSEC:=WORDCOUNT/SECTORSIZE;                      <<03011>>07840000
      @CHANPROG:=@CHANPROG+WRITETEMPLATELEN;                   <<03011>>07842000
      @CMDAREA:=@CMDAREA-COMMANDLENGTH;                        <<03011>>07844000
      END UNTIL MEMORYLEFT=0;                                  <<03011>>07846000
                                                                        07848000
   <<EMIT HALT INTERRUPT INSTRUCTION>>                                  07850000
   CHANPROG:=HALTINTERRUPT; CHANPROG(1):=0;                             07854000
                                                                        07856000
   <<WRITE OUT BOOTSTRAP EXTENSION>>                                    07858000
   DISCIO(DESTDEV,WRITE,BUF,BOOTXLENWD,BOOTXADDR);                      07860000
   END  <<CONFIGUREBOOT>>;                                              07862000
SUBROUTINE PROCESSCOMMANDFILE(CLDEV,CFILEADDR,CFILELEN,DLDEV,DFILEADDR, 07864000
   DFILESIZE);                                                          07866000
INTEGER                                                                 07868000
   CLDEV,              <<COMMAND FILE'S FILE NUMBER (0 IF NO FILE>>     07870000
   DLDEV,              <<DUMPFILE'S FILE NUMBER (0 IF NO FILE)>>        07872000
   CFILELEN,           <<NUMBER OF RECORDS IN THE COMMAND FILE>>        07874000
   DFILESIZE;          <<NUMBER OF SECTORS IN THE DUMP FILE>>           07876000
DOUBLE                                                                  07878000
   CFILEADDR,          <<DISC SECTOR ADDR OF THE COMMAND FILE>>         07880000
   DFILEADDR;          <<DISC SECTOR ADDR OF THE DUMP FILE>>            07882000
   BEGIN                                                                07884000
   <<SCANS THE COMMAND FILE FOR THE "DUMPFILE" COMMAND. IF FOUND THEN:  07886000
     1. IF "FILENAME" PARAMETER IS PRESENT, THE FILE'S ATTRIBUTES       07888000
        ARE CHECKED AND RETURNED.                                       07890000
     2. ELSE THE FILE, DDISCDUMP, IS OPENED HAVING THE FOLLOWING        07892000
        ATTRIBUTES:                                                     07894000
        A. RECORDSIZE     - 4096 WORDS                                  07896000
        B. NUMRECS        - SEE CODE LISTING                            07898000
   >>                                                                   07900000
   DFILEADDR:=0D; DFILESIZE:=0;                                         07902000
   <<OPEN AND CHECK COMMAND FILE VALIDITY>>                             07904000
   MOVE DESIG:=CMDESIG,(CMDESIGLEN);                                    07906000
   CMDFILENUM:=FOPEN(DESIG,OLDFILE);                                    07908000
   IF <> THEN                                                           07910000
      MESSAGE(UGLYCOMMANDFILE)                                          07912000
   ELSE                                                                 07914000
      BEGIN                                                             07916000
      <<SUCCESSFUL OPEN OF COMMAND FILE, CHECK ITS VALIDITY>>           07918000
      FGETINFO(CMDFILENUM,,FOPTIONS,,RECSIZE,DEVICETYPE,,,,,NUMREC,     07920000
         ,,,BLOCKSIZE,,NUMEXTENT,,,LABELADDR);                          07922000
      BLOCKFACTOR:=BLOCKSIZE/RECSIZE;                                   07924000
      IF RECSIZE < 0 THEN RECSIZE:=(-RECSIZE)&LSR(1);                   07926000
      IF (FOPTIONS LAND %773) <> PROPERFOPTIONS THEN                    07928000
         MESSAGE(UGLYCOMFOPTIONS)                                       07930000
      ELSE IF RECSIZE <> CRECSIZE THEN MESSAGE(UGLYCOMRECSIZE)          07932000
      ELSE IF DEVICETYPE.(8:8) <> DISC AND                     <<03608>>07934000
              DEVICETYPE.(8:8) <> CS80TYPE OR                  <<03608>>07936000
              DEVICETYPE  = HP9140 THEN MESSAGE(UGLYCOMDEV)    <<03608>>07938000
      ELSE IF NUMEXTENT <> PROPERNUMEXTENTS THEN MESSAGE(UGLYCOMEXTENTS)07940000
      ELSE IF BLOCKFACTOR <> PROPERBLOCKFACTOR THEN                     07942000
         MESSAGE(UGLYBLOCKFACTOR)                                       07944000
      ELSE                                                              07946000
         BEGIN                                                          07948000
         <<VALID COMMAND FILE, SEARCH FOR "DUMPFILE" COMMAND>>          07950000
         VALIDCOMMANDFILE:=TRUE;                                        07952000
         EXTRACTFILEADDR(LABELADDR,CLDEV,CFILEADDR);                    07954000
         CFILELEN:=INTEGER(NUMREC);                                     07956000
         FREAD(CMDFILENUM,BUF,40);                                      07958000
         IF BBUF = "DUMPFILE" THEN                                      07960000
            BEGIN                                                       07962000
            <<COMMAND FILE SPECIFIES A DISC DUMP FILE>>                 07964000
            <<GET FILE'S DESIGNATOR>>                                   07966000
            BBUF(72):=".";                                              07968000
            SCAN BBUF(8) WHILE ". ",1;                                  07970000
            @DDESIG:=TOS;                                               07972000
            IF CARRY THEN MOVE DDESIG:=DUMPDESIG,(DUMPDESIGLEN);        07974000
            <<OPEN IT OLD>>                                             07976000
            DUMPFILENUM:=FOPEN(DDESIG,OLDFILE);                         07978000
            IF <> THEN                                                  07980000
               BEGIN                                                    07982000
               <<FAILED TO OPEN IT OLD, SO OPEN IT NEW>>                07984000
               <<CALCULATE NUMBER OF RECORDS NEEDED TO DUMP             07986000
                 MAIN MEMORY AND VIRTUAL MEMORY.                        07988000
               >>                                                       07990000
               DNUMREC:=DOUBLE((NUMBERBANKS)*BANKFACTOR);               07992000
               MOVE LOGICALDEVICE:="1 ";                                07994000
               DUMPFILENUM:=FOPEN(DDESIG,FIXED,,DRS,LOGICALDEVICE,,,,,  07996000
                  DNUMREC,DFILEXTENT,DFILEXTENT);                       07998000
               IF <> THEN                                               08000000
                  BEGIN  <<FAILED TO OPEN ON THE SYSTEM DISC>>          08002000
                  <<PLACE ON ANY DISC>>                                 08004000
                  MOVE CLASSNAME:="DISC ";                              08006000
                  DUMPFILENUM:=FOPEN(DDESIG,FIXED,,DRS,CLASSNAME,,,,,   08008000
                     DNUMREC,DFILEXTENT,DFILEXTENT);                    08010000
                  END;                                                  08012000
               END;                                                     08014000
            IF <> THEN                                                  08016000
               MESSAGE(UGLYDUMPFILE)                                    08018000
            ELSE                                                        08020000
               BEGIN                                                    08022000
               <<OPENED THE DUMP FILE, CHECK ITS VALIDITY>>             08024000
               FGETINFO(DUMPFILENUM,BBUF,FOPTIONS,,RECSIZE,DEVICETYPE,  08026000
                  ,,,,,NUMREC,,,,,NUMEXTENT,,,LABELADDR);               08028000
               IF NOTFIXEDRECFORMAT THEN MESSAGE(UGLYDUMPFOPTIONS)      08030000
               ELSE IF RECSIZE < DRS THEN MESSAGE(UGLYDUMPRECSIZE)      08032000
               ELSE IF DEVICETYPE.(8:8) <> DISC AND            <<03608>>08034000
                       DEVICETYPE.(8:8) <> CS80TYPE OR         <<03608>>08036000
                       DEVICETYPE  = HP9140 THEN               <<03608>>08038000
                              MESSAGE(UGLYCOMDEV)              <<03608>>08040000
               ELSE IF NUMEXTENT<>DFILEXTENT THEN MESSAGE(UGLYDEXTENTS) 08042000
               ELSE                                                     08044000
                  BEGIN                                                 08046000
                  <<DUMP FILE IS VALID>>                                08048000
                  DFILESIZE:=INTEGER(NUMREC);                           08050000
                  DLDEV:=LABEL0.(0:8);                                  08052000
                  LABEL0:=LABEL0.(8:8); DFILEADDR:=LABELADDR;           08054000
                  <<INSURE THAT IT IS A PERMANENT FILE>>                08056000
                  FCLOSE(DUMPFILENUM,SAVE,0);                           08058000
                  FOPEN(BBUF,OLDFILE);                                  08060000
                  END  <<DUMP FILE SAVE>>;                              08062000
               END  <<DUMP FILE VALIDITY CHECK>>;                       08064000
            END  <<DUMP FILE PROCESSING>>;                              08066000
         END  <<DUMP FILE SEARCH>>;                                     08068000
      FCLOSE(CMDFILENUM,0,0);                                           08070000
      END  <<COMMAND FILE VALIDITY CHECK>>;                             08072000
   END  <<PROCESSCOMMANDFILE>>;                                         08074000
SUBROUTINE CONFIGURESDF(DESTDEV,SDFCODEADDR,OVERLAYADDR,CLDEV,CFILEADDR,08076000
   CFILELEN,DLDEV,DFILEADDR,DFILELEN);                                  08078000
VALUE DESTDEV,SDFCODEADDR,OVERLAYADDR,CLDEV,CFILEADDR,CFILELEN,DLDEV,   08080000
   DFILEADDR,DFILELEN;                                                  08082000
INTEGER                                                                 08084000
   DESTDEV,            <<DESTINATION LOGICAL DEVICE>>                   08086000
   CLDEV,              <<COMMAND FILE LOGICAL DEVICE>>                  08088000
   CFILELEN,           <<NUMBER OF RECORDS IN THE COMMAND FILE>>        08090000
   DLDEV,              <<DUMP FILE LOGICAL DEVICE>>                     08092000
   DFILELEN;           <<# 4096 WORD RECS IN DUMP FILE>>                08094000
DOUBLE                                                                  08096000
   SDFCODEADDR,        <<DISC ADDR OF SDF CODE>>                        08098000
   OVERLAYADDR,        <<DISC ADDR OF OVERLAY AREA>>                    08100000
   CFILEADDR,          <<DISC ADDR OF COMMAND FILE>>                    08102000
   DFILEADDR;          <<DISC ADDR OF DUMP FILE>>                       08104000
   BEGIN                                                                08106000
   <<CONFIGURE THE SDF MEMORY IMAGE                                     08108000
     1. SDF'S CONFIGURATION DATA SEGMENT IS INITIALIZED.                08110000
     2. A CHECKSUM IS COMPUTED AND STUFFED INTO THE CONFIGURATION       08112000
        DATA SEGMENT.                                                   08114000
   >>                                                                   08116000
                                                               <<03608>>08118000
   << IF THE DEVICE IS HP9140 THEN THE SECTOR SIZE BECOMES >>  <<03608>>08120000
   << 512 WORDS OR AREAS OF DATA WILL BE LOST              >>  <<03608>>08122000
                                                               <<03608>>08124000
   IF DEVTIPE = HP9140 THEN SECTORSIZ := HP9140'SECTOR         <<03608>>08126000
                       ELSE SECTORSIZ := SECTORSIZE;           <<03608>>08128000
                                                               <<03608>>08130000
   << FETCH THE CONFIGURATION DATA SEGMENT      >>             <<03608>>08132000
   << FIRST GET THE POINTER TO DST TABLE        >>             <<03608>>08134000
   << THEN READ THE DST TABLE TO GET THE        >>             <<03608>>08136000
   << POINTER TO THE CONFIGURATION DATA SEGMENT >>             <<03608>>08138000
   DISCIO(DESTDEV,READ,BUF,DSTABLELOC+1,SDFCODEADDR);                   08140000
   IF DEVTIPE = HP9140 AND                                     <<03608>>08142000
      BUF(DSTABLELOC) >= HIMEMORYLOC THEN                      <<03608>>08144000
         BUF(DSTABLELOC) := BUF(DSTABLELOC) + ONESECTOR;       <<03608>>08146000
      <<************************************************>>     <<03608>>08148000
      <<     PRECEDING 3 LINES WERE ADDED TO ALLOW      >>     <<03608>>08150000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>08152000
      <<************************************************>>     <<03608>>08154000
   @DSTABLE:=@BUF+(BUF(DSTABLELOC) MOD INTEGER(SECTORSIZ));    <<03608>>08156000
   DSTSECTOR:=DOUBLE(BUF(DSTABLELOC)/INTEGER(SECTORSIZ))       <<03608>>08158000
                     + SDFCODEADDR;                            <<03608>>08160000
                                                               <<03608>>08162000
   << READ DST TABLE TO GET THE POINTER TO THE >>              <<03608>>08164000
   << CONFIGURATION DATA SEGMENT               >>              <<03608>>08166000
                                                               <<03608>>08168000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,DSTSECTOR);             <<03608>>08170000
                                                               <<03608>>08172000
   <<LOCATE CONFIGURATION DATA SEGMENT'S DISC ADDR AND DISPLACEMENT>>   08174000
   IF DEVTIPE = HP9140 AND                                     <<03608>>08176000
      DSTABLE(4*CONFIGDST+3) >= HIMEMORYLOC THEN               <<03608>>08178000
         DSTABLE(4*CONFIGDST+3) :=                             <<03608>>08180000
                DSTABLE(4*CONFIGDST+3) + ONESECTOR;            <<03608>>08182000
      <<************************************************>>     <<03608>>08184000
      <<    PRECEDEING 4 LINES WERE ADDED TO ALLOW      >>     <<03608>>08186000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>08188000
      <<************************************************>>     <<03608>>08190000
   CONFIGSECTOR:=DOUBLE(DSTABLE(4*CONFIGDST+3)/SECTORSIZ)      <<03608>>08192000
                       + SDFCODEADDR;                          <<03608>>08194000
   @CONFIG:=@BUF+INTEGER(DSTABLE(XREG) MOD SECTORSIZ);         <<03608>>08196000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,CONFIGSECTOR);          <<03608>>08198000
                                                               <<03608>>08200000
   <<ZERO THE CONFIGURATION AREA>>                                      08202000
   CONFIG:=0; MOVE CONFIG(1):=CONFIG,(CTCONFIGLEN-1);                   08204000
   CTSDFINITVERSION:=VERSION;                                  <<00.08>>08206000
                                                                        08208000
   IF (CTMODE:=MODE) <> BACKUPMODE THEN                                 08210000
      BEGIN                                                             08212000
      <<INITIALIZE CONFIGURATION DATA SEGMENT>>                         08214000
      CONFIGUREDEVICE(DESTDEV,CTSYSDISCDESC);                           08216000
      CONFIGUREDEVICE(CONSOLELDEV,CTCONSOLEDESC);                       08218000
      MOVE CLASSNAME:=LPCLASS,(8);                                      08220000
      IF GETCLASS(CLASSINFO,WORDS0'3,,,CLASSNAME) THEN                  08222000
         CONFIGUREDEVICE(CLASSINFO(3).(8:8),CTLINEPTRDESC);             08224000
      MOVE CLASSNAME:=DUMPDEVCLASS,(8);                                 08226000
      IF GETCLASS(CLASSINFO,WORDS0'3,,,CLASSNAME) THEN                  08228000
         CONFIGUREDEVICE(CLASSINFO(3).(8:8),CTDUMPDEVDESC);             08230000
      CONFIGUREDEVICE(CLDEV,CTCOMMANDESC);                              08232000
      CONFIGUREDEVICE(DLDEV,CTDUMPFILEDESC);                            08234000
      <<MISC INFO>>                                                     08236000
      CTNUMBERBANKS:=NUMBERBANKS;                                       08238000
      CTDUMPFILELEN:=DFILELEN;                                          08240000
      CTCOMMANDFILE:=CFILEADDR;                                         08242000
      CTDUMPFILE:=DFILEADDR;                                            08244000
      CTCOMMANDLENGTH:=CFILELEN;                               <<00.08>>08246000
      END;                                                              08248000
                                                                        08250000
   <<WRITE OUT CONFIGURATION AREA>>                                     08252000
   DISCIO(DESTDEV,WRITE,BUF,TWO'SECTORS,CONFIGSECTOR);         <<03608>>08254000
                                                               <<03608>>08256000
   <<CALCULATE AND STORE THE CHECKSUM.  THE CHECKSUM STARTS AT THE      08258000
     SECOND WORD OF THE CONFIGURATION DATA SEGMENT AND ENDS AT THE WORD 08260000
     BEFORE THE STACK DATA SEGMENT.                                     08262000
   >>                                                                   08264000
   <<FIRST FIND THE END OF THE CHECKSUM AREA.>>                         08266000
   DISCIO(DESTDEV,READ,BUF,TWO'SECTORS,DSTSECTOR);             <<03608>>08268000
   IF DEVTIPE = HP9140 AND                                     <<03608>>08270000
      DSTABLE(4*STACKDSTLOC+3) >= HIMEMORYLOC THEN             <<03608>>08272000
         DSTABLE(4*STACKDSTLOC+3) :=                           <<03608>>08274000
                DSTABLE(4*STACKDSTLOC+3) + ONESECTOR;          <<03608>>08276000
      <<************************************************>>     <<03608>>08278000
      <<    PRECEDEING 4 LINES WERE ADDED TO ALLOW      >>     <<03608>>08280000
      <<  HIGHMEMORY TO ALIGN ON A HP9140 SECTOR        >>     <<03608>>08282000
      <<************************************************>>     <<03608>>08284000
   STACKSECTOR:=DOUBLE(DSTABLE(4*STACKDSTLOC+3)/SECTORSIZ)     <<03608>>08286000
                       + SDFCODEADDR;                          <<03608>>08288000
   STACKLOC:=DSTABLE(XREG) MOD SECTORSIZ;                      <<03608>>08290000
   CHECKSUM:=CHECKSUMSTART;                                             08292000
   <<CALCULATE CHECKSUM ON 2ND THRU N-1 SECTORS>>                       08294000
   FOR I:=1 UNTIL INTEGER(STACKSECTOR-CONFIGSECTOR)-1 DO                08296000
      BEGIN                                                             08298000
      DISCIO(DESTDEV,READ,BUF,SECTORSIZ,                       <<03608>>08300000
             CONFIGSECTOR+DOUBLE(I));                          <<03608>>08302000
      CHECKSUM:=CALCULATECHECKSUM(BUF,SECTORSIZ,CHECKSUM);     <<03608>>08304000
      END;                                                     <<03608>>08306000
   <<CHECKSUM ON PARTIAL LAST SECTOR>>                         <<03608>>08308000
   DISCIO(DESTDEV,READ,BUF,SECTORSIZ,STACKSECTOR);             <<03608>>08310000
   CHECKSUM:=CALCULATECHECKSUM(BUF,STACKLOC,CHECKSUM);                  08312000
   <<CHECKSUM ON PARTIAL FIRST SECTOR>>                                 08314000
   DISCIO(DESTDEV,READ,BUF,SECTORSIZ,CONFIGSECTOR);            <<03608>>08316000
  CTCHECKSUM:=CALCULATECHECKSUM(CONFIG,                        <<03608>>08318000
                       (INTEGER(SECTORSIZ)+@BUF-@CONFIG),      <<03608>>08320000
                       CHECKSUM);                              <<03608>>08322000
   DISCIO(DESTDEV,WRITE,BUF,SECTORSIZ,CONFIGSECTOR);           <<03608>>08324000
                                                                        08326000
   <<MOVE PATTERN TO OVERLAY AREA.  IF 7905 OR 7906 REMOVABLE PLATTER   08328000
     THEN WRITE THE PATTERN TO EACH "CYLINDER" BOUNDARY.                08330000
   >>                                                                   08332000
   MOVE BUF:="THIS IS A VIRGIN OVERLAY AREA";                           08334000
   DISCIO(DESTDEV,WRITE,BUF,-29,OVERLAYADDR);                  <<03011>>08336000
   MOVE BUF:="THIS IS A VIRGIN BOOTXSAVE AREA";                <<03011>>08338000
   DISCIO(DESTDEV,WRITE,BUF,-31,BOOTXSAVEADDR);                <<03011>>08340000
   MOVE BUF:="THIS IS A VIRGIN BANK1SAVE AREA";                <<03011>>08342000
   DISCIO(DESTDEV,WRITE,BUF,-31,BANK1SAVEADDR);                <<03011>>08344000
   END  <<CONFIGURESDF>>;                                               08346000
SUBROUTINE PUT'BOOTS'ON'DEV(LDEV,DEVTIPE);                     <<03608>>08348000
<< DETERMINES THE TYPE OF DEVICE AND THEN CALLS THE  >>        <<03608>>08350000
<< APPROPRIATE SUBROUTINE WHICH CONFIGURES AND STORES >>       <<03608>>08352000
<< THE BOOT AND BOOTEXTENSION CHANNEL PROGRAMS ONTO   >>       <<03608>>08354000
<< THAT DEVICE.                                       >>       <<03608>>08356000
                                                               <<03608>>08358000
VALUE LDEV,                                                    <<03608>>08360000
      DEVTIPE;                                                 <<03608>>08362000
INTEGER LDEV,                                                  <<03608>>08364000
      DEVTIPE;                                                 <<03608>>08366000
                                                               <<03608>>08368000
BEGIN                                                          <<03608>>08370000
                                                               <<03608>>08372000
   IF DTDEVICETYPE = T13037 OR                                 <<03608>>08374000
      DTDEVICETYPE = SYSTEMDISC OR                             <<03608>>08376000
      DTDEVICETYPE = T7902 THEN                                <<03608>>08378000
                                                               <<03608>>08380000
      BEGIN                                                    <<03608>>08382000
         CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,             <<03608>>08384000
                        BOOTXSAVEADDR,OVERLAYADDR,             <<03608>>08386000
                        BANK1SAVEADDR,SDFCODEADDR);            <<03608>>08388000
      END                                                      <<03608>>08390000
                                                               <<03608>>08392000
   ELSE IF DTDEVICETYPE = CS80TYPE THEN                        <<03608>>08394000
                                                               <<03608>>08396000
      BEGIN                                                    <<03608>>08398000
         CONFIGURE'CS80'BOOTS(DESTDEV,DEVTIPE,BOOTXADDR,       <<03608>>08400000
                              BOOTXSAVEADDR,OVERLAYADDR,       <<03608>>08402000
                              BANK1SAVEADDR,SDFCODEADDR);      <<03608>>08404000
      END                                                      <<03608>>08406000
                                                               <<03608>>08408000
   ELSE IF DTDEVICETYPE = SERIALDISC THEN                      <<03608>>08410000
                                                               <<03608>>08412000
      BEGIN                                                    <<03608>>08414000
         CONFIGUREBOOTS(DESTDEV,DEVTIPE,BOOTXADDR,             <<03608>>08416000
                        BOOTXSAVEADDR,OVERLAYADDR,             <<03608>>08418000
                        BANK1SAVEADDR,SDFCODEADDR);            <<03608>>08420000
      END                                                      <<03608>>08422000
   ELSE ERROREXIT(BADDEVICE);                                  <<03608>>08424000
                                                               <<03608>>08426000
END;                                                           <<03608>>08428000
$PAGE                                                          <<03608>>08430000
<<****************************************************>>       <<03608>>08432000
<<****************************************************>>       <<03608>>08434000
<<*                                                  *>>       <<03608>>08436000
<<*              SDFINIT  MAIN LINE                  *>>       <<03608>>08438000
<<*                                                  *>>       <<03608>>08440000
<<****************************************************>>       <<03608>>08442000
<<****************************************************>>       <<03608>>08444000
                                                               <<03608>>08446000
ARITRAP(DISABLETRAPS);                                                  08448000
IF MODE = CLEARBACKUP THEN                                              08450000
   ERASEBACKUP                                                          08452000
ELSE                                                                    08454000
   BEGIN                                                                08456000
   CPUTYPE:=THISCPU;                                           <<01573>>08458000
   IF CPUTYPE=ICF25 OR CPUTYPE=ICF44 OR CPUTYPE=ICF55          <<01573>>08460000
      OR MODE=BACKUPMODE THEN                                  <<01573>>08462000
      BEGIN                                                             08464000
      OPENSDFILE(SDFILENUM,DEVTIPE,LABELADDR);                          08466000
      IF MODE = BACKUPMODE THEN                                         08468000
         BEGIN                                                          08470000
         <<1. COPY SDF'S CONTENTS TO A SERIAL DISC                      08472000
           2. THEN CONFIGURE IT INSTEAD OF THE ORIGINAL SDF FILE.       08474000
         >>                                                             08476000
         GENERATEBACKUPSDF(BACKUPFILENUM,DESTDEV,DEVTIPE,      <<03011>>08478000
                           SDFILEADDR);                        <<03011>>08480000
         FCLOSE(SDFILENUM,0,0);                                         08482000
         SDFILENUM:=0;                                                  08484000
         END                                                            08486000
      ELSE                                                              08488000
         BEGIN                                                          08490000
         ASSEMBLE(RSW);                                                 08492000
         IF TOS = 0 THEN DEBUG;                                         08494000
         EXTRACTFILEADDR(LABELADDR,DESTDEV,SDFILEADDR);                 08496000
         IF DESTDEV <> SYSTEMDISC THEN ERROREXIT(UGLYSDFLDEV);          08498000
         END;                                                           08502000
      <<BASED ON THE SDF SECTOR START ADDRESS >>               <<03011>>08506000
      <<CALCULATE THE SECTOR ADDRESS OF THE MAJOR>>            <<03011>>08508000
      <<SECTIONS OF THE SDF FILE. (IE. BOOTX,  >>              <<03011>>08510000
      <<BOOTXSAVE,OVERLAYAREA, ETC.           >>               <<03011>>08512000
                                                               <<03011>>08514000
      INITDISCADDR( DEVTIPE, SDFILEADDR, BOOTXADDR,            <<03011>>08516000
                    BOOTXSAVEADDR,SDFMAPADDR,OVERLAYADDR,      <<03011>>08518000
                    BANK1SAVEADDR, SDFCODEADDR );              <<03011>>08520000
                                                               <<03011>>08522000
                                                               <<03011>>08524000
      CONFIGURE'SDFMAP (SDFMAPADDR);                           <<03011>>08526000
        <<BUILD STORAGE MAP RECORDS AND WRITE MAP TO DISC>>    <<03011>>08528000
                                                               <<03011>>08530000
   <<CONFIGURE AND STORE THE BOOT PROGRAMS OUT TO THE DEVICE>> <<03608>>08532000
   PUT'BOOTS'ON'DEV(DESTDEV,DEVTIPE);                          <<03608>>08534000
      IF MODE <> BACKUPMODE THEN                                        08536000
        PROCESSCOMMANDFILE(CMDEV,CMDFILEADDR,CMDFILELEN,DUMPDEV,        08538000
           DUMPFILEADDR,DUMPFILELEN);                                   08540000
                                                               <<03608>>08542000
      CONFIGURESDF(DESTDEV,SDFCODEADDR,OVERLAYADDR,CMDEV,CMDFILEADDR,   08544000
         CMDFILELEN,DUMPDEV,DUMPFILEADDR,DUMPFILELEN);                  08546000
      FCLOSE(SDFILENUM,0,0);                                            08548000
      END;                                                              08550000
   END;                                                                 08552000
ERROREXIT(SUCCESSFUL);                                                  08554000
END  <<SDFINIT>>;                                                       08556000
$PAGE                                                          <<00694>>08558000
INTEGER PROCEDURE IOTABLEINFO(CODE,P1,P2);                     <<00694>>08560000
  VALUE CODE,P1,P2;                                            <<00694>>08562000
  INTEGER CODE,P1,P2;                                          <<00694>>08564000
  option privileged,uncallable;                                <<02637>>08566000
                                                               <<00694>>08568000
COMMENT:                                                       <<00694>>08570000
   IOTABLEINFO IS DESIGNED PRIMARILY TO INTERFACE "MEASIO" TO  <<00694>>08572000
   THE SERIES III AND SERIES 33 I/O TABLES. IT WILL RETURN A   <<00694>>08574000
   VALUE BASED ON THE "CODE" SUPPLIED.                         <<00694>>08576000
   CURRENT "CODE" ASSIGNMENTS ARE:                             <<00694>>08578000
                                                               <<00694>>08580000
     1 => RETURN LDEV # FOR A GIVEN UNIT NUMBER ON A GIVEN     <<00694>>08582000
          CONTROLLER.                                          <<00694>>08584000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>08586000
             P2 = UNIT NUMBER ON THIS CONTROLLER               <<00694>>08588000
     2 => RETURN THE NUMBER OF UNITS ON A GIVEN CONTROLLER.    <<00694>>08590000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>08592000
     3 => RETURN TRUE/FALSE IF "MEASIO" WAS/NOT ENABLED ON A   <<00694>>08594000
          GIVEN DEVICE.                                        <<00694>>08596000
             P1 = SYSDB REL. DIT POINTER                       <<00694>>08598000
             P2 = LDEV                                         <<00694>>08600000
;                                                              <<00694>>08602000
                                                               <<00694>>08604000
BEGIN                                                          <<00694>>08606000
  EQUATE                                                       <<00694>>08608000
      IDITP      = 14,                                         <<00694>>08610000
      ISIOP      = 8,                                          <<00694>>08612000
      ISTAP      = 9,                                          <<00694>>08614000
      MIO'ENABLE = 8,                                          <<00694>>08616000
      MIO'LDEV   = 70;                                         <<00694>>08618000
  DEFINE                                                       <<00694>>08620000
      ILTP      = ABS(P1+SYSDB+DILTP)+SYSDB#, <<ABS LOC ILTP>> <<00694>>08622000
      DITP      = ABS(ILTP+IDITP+P2)+SYSDB#; <<ABS LOC DIT>>   <<00694>>08624000
  INTEGER                                                      <<00694>>08626000
      I;                                                       <<00694>>08628000
                                                               <<00694>>08630000
                                                               <<00694>>08632000
  IOTABLEINFO := 0;                                            <<00694>>08634000
                                                               <<00694>>08636000
  IF CODE = 1 THEN                                             <<00694>>08638000
     BEGIN                                                     <<01577>>08640000
     IF ABS(DITP) <> 0 THEN                                    <<01577>>08642000
        IOTABLEINFO := ABS(DITP+DLDEV).(8:8); <<LDEV>>         <<01577>>08644000
     END                                                       <<01577>>08646000
  ELSE IF CODE = 2 THEN                                        <<00694>>08648000
    IOTABLEINFO:=ABS(ILTP+ISTAP)+SYSDB-(ILTP+IDITP) <<UNITS>>  <<00694>>08650000
  ELSE IF CODE = 3 THEN                                        <<00694>>08652000
  BEGIN                                                        <<00694>>08654000
    I := ABS(ILTP+ISIOP)+SYSDB;                                <<00694>>08656000
    IF ABS(I+MIO'LDEV).(8:8) = P2 AND    <<MIO'LDEV>>          <<00694>>08658000
       ABS(P1+SYSDB+MIO'ENABLE) = "OK" THEN  <<MIO'ENABLE>>    <<00694>>08660000
       IOTABLEINFO := 1;   <<SET TRUE>>                        <<00694>>08662000
  END;                                                         <<00694>>08664000
END;                                                           <<00694>>08666000
$PAGE "OUTER BLOCK"                                                     08668000
$CONTROL SEGMENT=MAIN                                                   08670000
END.  <<NON RESIDENT I/O SERVICE ROUTINES>>                             08672000
