$CONTROL USLINIT,ADR,MAP                                       <<03033>>00010000
<< HARDRES - MODULE 55 >>                                               00012000
<< HP32002C 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
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$CONTROL USLINIT,ADR,MAP,CODE                                  <<03068>>00030000
$TP                                                                     00032000
                                                               <<03033>>00036000
$CONTROL SEGMENT=HARDRES,MAIN=HARDRES,NOWARN                   <<03033>>00038000
                                                               <<03033>>00040000
BEGIN                                                          <<03033>>00042000
                                                               <<03033>>00044000
  DEFINE  DEVTYPEF   = (10:6)#,  <<TYPE FROM LDT2>>            <<03033>>00046000
          SUBTYPEF   = (12:4)#,      <<  L  >>                 <<03033>>00048000
          FORS       = (11:1)#,      <<  P  >>                 <<03033>>00050000
          NSDF       = ( 4:1)#,      <<  D  >>                 <<03033>>00052000
          JDFIELD    = ( 2:2)#,      <<  T  >>                 <<03033>>00054000
          DRSTATE    = ( 0:2)#,      <<  1  >>                 <<03033>>00056000
                                                               <<03033>>00058000
          << ---- WARNING "LPDT1" IS DEFINED LOCALLY ---- >>   <<03033>>00060000
                                                               <<03033>>00062000
          NONSYSDEV  = LPDT1.NSDF=1#,                          <<03033>>00064000
          NOTFOREIN  = LPDT1.FORS=0#,                          <<03033>>00066000
          UNOWNED    = LPDT1.DRSTATE=0#,                       <<03033>>00068000
          ALLOCATED  = LPDT1.DRSTATE=1#,                       <<03033>>00070000
          JDACCPT    = LPDT1.JDFIELD<>0#,                      <<03033>>00072000
          STYPE      = LPDT1.SUBTYPEF#,                        <<03033>>00074000
                                                               <<03033>>00076000
          << ---- WARNING "TYPE" IS DEFINED LOCALLY ---- >>    <<03033>>00078000
                                                               <<03033>>00080000
          D7905R     = ( TYPE=0 LAND STYPE= 4 )#,              <<03033>>00082000
          D7905F     = ( TYPE=0 LAND STYPE= 5 )#,              <<03033>>00084000
          D7920      = ( TYPE=0 LAND STYPE= 8 )#,              <<03033>>00086000
          D7925      = ( TYPE=0 LAND STYPE= 9 )#,              <<03033>>00088000
          D7906R     = ( TYPE=0 LAND STYPE=10 )#,              <<03033>>00090000
          D7906F     = ( TYPE=0 LAND STYPE=11 )#,              <<03033>>00092000
          FLOPPY     = ( TYPE=2 )#,                            <<03033>>00094000
          D7935      = ( TYPE=3 LAND STYPE= 8 )#,              <<03033>>00096000
          LINUS      = ( TYPE=3 LAND STYPE= 0 )#,              <<03033>>00098000
          MAGTAPE    = ( TYPE=24 )#,                           <<03033>>00100000
          DISCDEVICE = ( 0 <= TYPE <= 7 )#,                    <<03033>>00102000
          REMOVABLE  = (D7920 OR D7925 OR D7905R OR D7906R     <<03033>>00104000
                        OR FLOPPY OR D7935 OR LINUS)#,         <<03033>>00106000
          SPLITDISC  = D7905F OR D7906F#;                      <<03033>>00108000
                                                               <<03033>>00110000
  EQUATE  SERVREQ    = 2,                                      <<03033>>00112000
          SERVGRNTD  = 3,                                      <<03033>>00114000
    WRTBASE   = 17,      <<SIO PROG STARTING ADDRESS>>                  00116000
    ABORTED   = 5,                                             <<01828>>00118000
    ABORT'IO  = 66,        << SCCP ABORTIO AND PROCIO FUNCTION >>       00120000
    ACK        = 6,         << ASCII ACKNOWLEDGE CHARACTER >>           00122000
    ACKINTRPT  = 1,         << ACKNOWLEDGE TERMINAL MPX INTERRUPT >>    00124000
    ACTIVE'   = 2,         << MONITOR IS RUNNING AGAINST THIS DEVICE >> 00126000
    ATTN      = %37,       << ATTENTION NEEDED STATUS >>       <<RH.PV>>00130000
    BANDWAIT  = 5,         << WAITING FOR LESS TERM ACTIVITY >>         00132000
    BINARYREAD'=11,        << BINARY READ OR WRITE ENQ/ACK WAIT >>      00134000
    BLKDIO    =%200,       << BLOCKED I/O WAIT BIT >>                   00136000
    BLOCKED'  = 5,         << BLOCKED I/O REQUEST >>                    00138000
    BLOCKMODRD= WRTBASE+233,                                            00140000
    BLOCKTIMEOUT= 8,                                           <<01826>>00142000
    BLOCKWAIT = WRTBASE+223,                                            00144000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00146000
    BREAKSTOP = 1,         << READ STOP CODE AFTER BREAK ACCEPTED >>    00148000
    BRKBIT    =%10,        << BREAK SERVICE REQUEST TO TERM >>          00150000
    BRKSTATUS'= 7,         << BREAK DETECTED STATUS OF TIO >>           00152000
    CB'       = 5,         << CLEAR TO SEND, REQST TO SEND DELAYED >>   00154000
    CCE       = 2,                                                      00156000
    CCG       = 0,                                                      00158000
    CCL       = 1,                                                      00160000
    CF'       = 4,         << CARRIER DETECTED IF SET >>                00162000
    CFAILTO   = 1,         << CARRIER FAIL TIME OUT REQUEST >>          00164000
    CHARLOST' = 6,         << INTERRUPT NOT SERVICED IN TIME >>         00166000
    CLKMULTIPLYER=%13547,  << SIMULATE .09412857 IN BINARY >>           00168000
    CMODE'    =11,         << TERMINAL IS IN CONSOLE MODE >>            00170000
    CNTRLA     = 1,         << ASCII CONTROL A CHARACTTER >>            00172000
    CNTRLH    =%10,                                                     00174000
    CNTRLX     =%30,        << ASCII CONTROL X CHARACTER >>             00176000
    CNTRLY     =%31,        << ASCII CONTROL Y CHARACTER >>             00178000
    COMPLETED'= 6,         << I/O REQUEST HAS BEEN COMPLETED >>         00180000
    CORERES'  = 10,        << DRIVER CODE IS CORE RESIDENT >>           00182000
    CPCB      = 4,         << CURRENT PCB INDEX >>                      00184000
    CR        =%15,                                                     00186000
    CRLF      =%6412,      << ASCII CR / LF >>                          00188000
    CRLFJMP   = 52,      <<JMP DISPLM FROM 32 TO 84>>                   00190000
    CRWAIT    = 1,                                                      00192000
    CRWAITLF  = 2,                                                      00194000
    CSTPADDR  = 0,         << ABSOLUTE ADDR OF CST POINTER >>  <<01475>>00196000
    CY'ETX    = %14403,    << CONTROL Y, ETX >>                <<02866>>00198000
    DATAFRZN' = 7,         << DATA SEGMENT IS FROZEN (IOQ) >>           00200000
    DBCNT     =12,         << READ,WRITE BYTE COUNTER AND LIMITS >>     00202000
    DBLKTAIL  = 36,                                                     00204000
    DBREAK    =30,         << IOQP TO SAVED BROKEN READ DATA >>         00206000
    DBTIME    = 16,                                            <<01826>>00208000
    DC1'ETX   = %10403,    << DC1 TRIGGER AND ETX CHARACTERS>> <<01931>>00210000
    DC2       =%22,        << 2640 RESPONSE TO DC1(XON) SENT OUT >>     00212000
    DC2PAIR   = 4,                                                      00214000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00216000
    DCNT      = 18,        << COUNT TO UNUSUAL RD/WRT ACTION >>         00218000
    DDLTP     = 4,         << DLT POINTER >>                            00220000
    DELETECR  =%13,        << DOING A CR AFTER CNTRL X DELETE >>        00222000
    DELETEPAIR= 2,         << LAST PAIR CHAR WAS A CONTROL H >>         00224000
    DELECHO'  = 2,         << ECHO A \ ON CHARACTER DELETION >>         00226000
                           << 0 - NOTHING, 1 - \, 2 - LF, 3 - C'Y >>    00228000
    DHEAD     = 19,        << SYSDB POINTER TO HEAD OF TBUF LIST >>     00230000
    DILTP     = 5,         << ILT POINTER >>                            00232000
    DINTP     = 4,         << SPECIAL INTERRUPT HANDLER PLABEL >>       00234000
    DINIT     = 2,         << INITIATOR PLABEL >>                       00236000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00238000
    DISC'     =  1,        << DEVICE IS A DISC (DIT) >>                 00240000
    DLAST     =23,                                                      00242000
    DLINK     = 1,         << POINTER TO NEXT DIT REQUESTING RESOURCE >>00244000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00246000
    DMAMQ     =  8,        << POINTER TO MAM REQUEST QUEUE >>           00248000
    DMNTR     = 1,         << MONITOR PLABEL >>                         00250000
    DNXTB     = 25,        << TBUF POINTER OF A SAVE TBUF IF NOT 0 >>   00252000
    DPCBN     = 8,         << TYPE 3 DRIVER PCB NUMBER >>               00254000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00256000
    DMONTR    = 34,                                                     00258000
    DPNTR     = 21,        << BYTE POINTER TO ACCESS TBUFS >>           00260000
    DRBCT     = 11,        << REQUESTED TRANSFER COUNT IN BYTES >>      00262000
    DRQST     = 6,         << MONITOR SERVICE REQUEST FLAGS >>          00264000
                           << 0 - HANGUPTO    8  - READTO               00266000
                              1 - DISCONNECT  9  - ONLINE               00268000
                              2 - CFAILTO     10 - DSTREADY             00270000
                              3 - TURNTO      11 - LOGONTO              00272000
                              4 - IOERROR     12 - BREAK                00274000
                              5 - IODONE      13 - CONTROL Y            00276000
                              6 - SPOOLEND    14 - CFAIL                00278000
                              7 - SPOOLSW     15 - UNUSED               00280000
                           >>                                           00282000
    DRT3      = 3,         << LAST WORD OF DRT ENTRY >>                 00284000
    DRTADDR   =9,   <<THIS WILL HOLD OFFSET FOR DRT TABLE>>    <<03018>>00286000
    DRTBANK   =8,   <<THIS WILL HOLD BANK DRT TABLE IS IN>>    <<03018>>00288000
    DRTMASK   =%777,    <<MASK TO KEEP LAST 9 BITS>>           <<03018>>00290000
    DRTMAX    =28,         << MAXIMUM TIME FOR READ TIMEOUT, SECONDS >> 00292000
    DRTIME    =26,         <<  INDEX TO I/O READ TIME >>                00294000
    DRTIMED   =DRTIME/2,   << DOUBLE INDEX TO I/O READ TIME >>          00296000
    DSAVE     =13,         << HOLDS WAITED DSTATE, HSTATE & TURN CHAR >>00298000
    DSERR     = 7,         << HARDWARE I/O ERROR STATUS IN DIT >>       00300000
    DSIOPC    = 35,                                                     00302000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00304000
    DSIZE     = 5,         << DIT SIZE AND DEVICE TYPE WORD >>          00306000
    DSTAT1    = 18,        << DIT - REQUEST STATUS (WORD1)>>   <<00.PV>>00308000
    DSTAT2    = 19,        << DIT - REQUEST STATUS (WORD2)>>   <<00.PV>>00310000
    DSTATE'   =12,         << DEVICE STATE                              00312000
                               0 - NULL         %10 - EOR SYNC          00314000
                               1 - WRITING      %11 - WRITE BUF FILL    00316000
                               2 - READING      %12 - SEND XON NEXT     00318000
                               3 - XON WRITE    %13 - DELETE CR         00320000
                               4 - WRITE TURN   %14 - SYNCS OR "!"S     00322000
                               5 - BAND WAIT    %15 - READ DATA ECHO    00324000
                               6 - EOR LF       %16 - START READ        00326000
                               7 - EOR CR       %17 - STOP READ >>      00328000
    DSTOP     = 14,        << SUB SYS BRK AND EOR CHARACTERS >>         00330000
    DSYNC     = 29,        << CR,LF SYNC DATA AND SYNC COUNTER >>       00332000
    DTAIL     = 20,        << SYSDB POINTER TO END OF TBUF LIST >>      00334000
    DTBLK     = 24,        << LINK WORD FOR QUEUED TBUF REQUESTS >>     00336000
    DSTAT     = 6,         << LAST HARDWARE INTERRUPT STATUS >>         00338000
    DTANKB    = 33,                                                     00340000
    DTBUF     =18,         << FIRST TBUF POINTER  >>                    00342000
    DTBUFD    = DTBUF/2,   << DOUBLE INDEX TO FIRST TWO TBUF POINTERS >>00344000
    DTRLX     = 31,        << TIME OUR REQUEST TRLX'S >>                00346000
    DTYPE     = 7,         << PAIRCODE, TERMTYPE, HSTATE,TIMER FLAGS>>  00348000
    DTYPEDLT  = 5,         << Device type in Driver Linkage Tab<<02804>>00350000
    DVRFRZN'  =  8,        << DRIVER CODE IS FROZEN (DLT) >>            00352000
    DWAIT     = 15,        << DITP TO NEXT DEV ON ACTIVITY WAIT >>      00354000
    ECHO'     = 3,         << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00356000
    ECHOOFF   = 0,         << TURN ECHO OFF CODE TO MPXCONTROL >>       00358000
    EMPTITBUF = %100002, <<WRT SIO PROG FINI SENDING TBUF>>             00360000
    ENQ       = 5,         << ENQ CODE TO 2640 >>                       00362000
    ENQACKWAIT'= 11,       << WAITING TO AN ACK AFTER AN ENQ >>         00364000
    ENTER     = 8,         << DC2 LAST, POSSIBLE NO ECHO "ENTER" >>     00366000
    EORCR     = 7,         << DSTATE - EOR CR IN PROGRESS >>            00368000
    EORLF     = 6,         << DSTATE - EOR LF IN PROGRESS >>            00370000
    EORSYNC   =%10,                                                     00372000
    ESC       =%33,        << ESC CHARACTER >>                          00374000
    ESCSEQ    = 24,                                                     00376000
    ESCPAIR   = 3,         << LAST PAIR CHARACTER WAS ESC     >>        00378000
    ETX       = 3,         << ASCII END OF TEXT >>                      00380000
    ETXSENT'  = 10,        << ETX SENT TO TERMINAL ON 202 >>   <<00.02>>00382000
    FILLEDTBUF= %100003, <<RD SIO PROG FINI FILLING TBUF>>              00384000
    FINISEND  = WRTBASE+121,                                            00386000
    FINREAD   =%17,                                                     00388000
    FORMFEED'  = 4,        << DEVICE RESPONDES TO A FORM FEED >>        00390000
    FF        =%14,        << FORM FEED >>                              00392000
    FIRSTINDEX=  8,        << INDEX TO FIRST BUFFER OF TABLE >>         00394000
    ICF'55    =4, <<CPU NUMBER OF ICF 55>>                     <<03018>>00396000
    HANGINGUP =  7,        <<MODEM BEING HANGED UP>>           <<01669>>00398000
    HANGUPTURN=  6,        <<LINE BEING TURNAROUND>>           <<01669>>00400000
    HIOPCODE  =%120000,                                                 00402000
    HP2631B   = 19,        << REMOTE LINE PRINITER T. T. >>    <<01475>>00404000
    HP2640X   = 11,        << 2640 WITH NO ECHO ON START READ >>        00406000
    HP2640TO  = 0,         << 2640/44 READ/WRITE TIME OUT REQUEST >>    00408000
    IAK'      =  8,        << DEVICE HAS INTERRUPTED (DIT) >>           00410000
    ICDP      = 11,        << CURRENT DITP IN ILT TABLE >>     <<00.TP>>00412000
    ICPGM     = 6,         << Next channel pgm adr to start >> <<03068>>00414000
    ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>        <<00.TP>>00416000
    ICPVA0    = 0,         << CPVA WORD0 IN ILT >>             <<00.TP>>00418000
    ICPVA1    = 1,                                             <<00.TP>>00420000
    ICPVA2    = 2,                                             <<00.TP>>00422000
    ICPVA3    = 3,         << CPVA WORD3 IN ILT >>             <<00.TP>>00424000
    IDITP     = 14,        << BEGINNING OF DITP'S IN ILT >>    <<00.TP>>00426000
    IFLAG     = 13,        << FLAGS WORD OF ILT >>             <<00.TP>>00428000
    IGNOREHI' = 2,         << IGNORE HALT INTERRUPT FLAG >>    <<TP.10>>00430000
    IMASK     = 7,         << INTERRUPT MASK WORD>>                     00432000
    IMASK55   =%32,<<START OF 4 WORD INTERRUPT MASK FOR ICF55>><<03018>>00434000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00436000
    INTRPTOFF = 2,         << DISABLE INTRPTS & ECHO ON READ CHANNEL >> 00438000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00440000
    IOPROG'   = 7,         << SIO PROGRAM IN PROGRESS >>                00442000
    IOWAIT    =%100,       << UNBLOCKED I/O WAIT CODE >>                00444000
    IOWAKE'   = 4,         << WAKE CALLER ON COMPLETION IF SET >>       00446000
    IQUEUE    = 12,       << CONTROLLER QUEUE # IN ILT >>      <<00.TP>>00448000
    ISIOP     = 8,         << POINTS TO SIO PROGRAM AREA >>    <<00.TP>>00450000
    ISTAP     = 9,         << STATUS AREA PTR IN ILT >>        <<00.TP>>00452000
    IUNIT     = 10,        << CONTROLLER RESOURCE # >>         <<00.TP>>00454000
    JMPSRQOFF = 38,      <<JMP DISPLM FROM 62 TO 100>>                  00456000
    JUNKWAIT  = %20,                                                    00458000
    LF        =%12,                                                     00460000
    LF'ETX    = %5003,     << LINE FEED, ETX >>                <<02866>>00462000
    LFLAGS    =  1,        << FLAGS WORD OF LPDT >>                     00464000
    LIM       = 0,         << LIMIT WORD OF TABLE ALLOCATION >>         00466000
    LOGGINGON = 2,         << HSTATE LOGGING ON >>                      00468000
    LOGONTO   = 4,         << LOG ON TIME OUT REQUEST TYPE >>           00470000
    LOSTCHAR  = 4,         << MPX NOT SERVICED IN TIME >>               00472000
    LOSTDATA  = 3,         << BUFFER NOT AVAILABLE >>                   00474000
    LPDTSIZE  = 2,         << SIZE  OF LPDT ENTRY >>                    00476000
    LR        = 17,        << STORAGE FOR INTERRUPT INTERVAL >><<01431>>00478000
    LYNX'TYPE = %50017,   <<LYNX CHANNEL ID VALUE>>            <<03028>>00480000
    M202'     = 2,         << 202 OR 2002 MODEM >>                      00482000
    M202      =M202'+1,    << CIRCULAR SHIFT COUNT TO GET 202 TO BIT15>>00484000
    MAMERRORC'= 9,         << MAM ERROR BIT IN DLT >>                   00486000
    MAMERRORD'= 8,         << MAM ERROR BIT IN IOQ >>                   00488000
    MAXTIO    = 12,        << MAX TERM I/O TO PREVENT BLOCK OVERRUNS >> 00490000
    MHDISC'   =  9,        << DEV = A MOVING HEAD DISC (DIT) >><<RK0PV>>00492000
    MINIBEE   = 9,         << TERMINAL TYPE OF MINIBEE, HP 2615 >>      00494000
    MODSIOCNTRL=WRTBASE+154,                                            00496000
    MODSIOPTY =WRTBASE+171,                                             00498000
    MUNIT'    = 5,         << MULTIPLE DEVICES HAVING ONE CONTROLLER >> 00500000
    NEWLINE'  = 8,         << LF WAS LAST CHARACTER OUTPUT >>           00502000
    NEWSPECCHAR=WRTBASE+258,<<SIO PROG ADDRESS FOR SPEC CHAR>> <<02867>>00504000
    NODATAYET = 5,                                                      00506000
    NOECHO    = 3,                                                      00508000
    NOIMPEDE  = 0,         << DONT IMPEDE FLAG TO AWAKEIO >>            00510000
    NON'RESP'DEV'MSG=409,<< Non-responding device DRT # msg >> <<03073>>00512000
    NOPCB     = %13,       << NO PCB IS TO BE ASSOCIATED WITH THE IO >> 00514000
    NOPROTOCOL=18, <<TERM TYPE WITHOUT DC1 READ OR ENQ WRITES>><<01218>>00516000
    NOPTY'    = 2,         <<8-BIT DATA  FLAG-->>              <<AMS00>>00518000
                          <<SET IN 8TH BIT>>                   <<AMS00>>00520000
    NOTRDYMSG = 11,        << NOT READY LDEV MESSAGE NUMBER >>          00522000
    NOTREADING = 0,         << DEVICE NOT IN READING STATE >>           00524000
    NOSYNC'   = 7,         << 2640 SERIES TERMINAL >>                   00526000
    NOWAIT    = 0,         << DONT WAIT IN WAKE >>                      00528000
    NULL      = 0,                                                      00530000
    NXTNULL   = 3,         <<SIO INTERRUPT CODE IN CPVA1>>              00532000
    NXTBLKRD  = WRTBASE+221,                                            00534000
    NXTCRLF   = 4,                                                      00536000
    NXTRD     = 5,                                                      00538000
    ONLINE    = 1,         << SPEED SENSED AND CAN DO I/O HSTATE >>     00540000
    OPCONSOLE = 0,         << OUTPUT MESSAGE TO OPERATOR >>             00542000
    PAIR'     = 7,         << ESCAPE OR TERMINET XOFF LAST >>           00544000
    PAPOUTMSG = 14,        << CI MSG INDEX FOR PAPER OUT >>    <<01475>>00546000
    PARITY'   = 8,         << SENSE OF PARITY WRITTEN OR READ >>        00548000
    PCBB      = 3,         << BASE OF PCB TABLE >>                      00550000
    PCB3      = 3,         << FOURTH WORD OF PCB >>                     00552000
    PCB8      = 8,         << PCB IMPEDE LINK WORD >>                   00554000
    PCBSIZE   =16,                                                      00556000
    PREMPTSTOP= 3,         << STOP READ FOR PREMPTIVE REQUEST >>        00558000
    PREQ'     = 9,         << I/O REQUEST HAS BEEN PRE-EMPTED BY MAM >> 00560000
    PRETOPOST =%30,        << ADDING A CR/LF IN PRE TO POST SPACING >>  00562000
    PRIMARY   = 1,         << GET ONLY FROM PRIMARY TABLE >>            00564000
    PRIMED'   = 10,        << 2640 READY TO SEND A BLOCK >>             00566000
    PTAPEFUNC =29,         << PAPER TAPE SPOOLING FUNCTION >>           00568000
    PTYCHK'   = 9,         << PARITY CHECK READS >>                     00570000
    PTYCNTRL' = 7,         << PARITY IS TO BE SENT IN 8TH BIT >>        00572000
    PTYERROR  = 5,         << READ PARITY ERROR >>                      00574000
    PTYMASK   =%200,       << PARITY SENSE BIT MASK >>                  00576000
    QADDR     = 5,         << TARGET BANK OF DST OFFSET >>              00578000
    QDSTN     = 4,         << BANK OR DST NUMBER >>                     00580000
    QFUNC     = 6,         << FUNCTION  >>                              00582000
    QI        = 5,         << USED BY CHECKDB >>               <<01115>>00584000
    QLDEV     = 2,         << LOGICAL DEVICE NUMBER >>                  00586000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00588000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00590000
                  << .(0:8)-READ TO TRLX; .(12:4)-REQUEST STATE>>       00592000
    QPAR1     = 8,         << READ EOF CONTROL; WRITE SPACE CONTROL >>  00594000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00596000
    QWBCT     = 7,         << WORD (+) OR BYTE (-) COUNT >>             00598000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00600000
    QLD'ST    =QSTAT-QLDEV,<< TO SET X TO QLDEV FROM QSTAT >>           00602000
    RDINSTR   = [8/3,8/0],                                              00604000
    RD4THWORD = [1/1,1/0,14/0],  <<4TH WORD IN RD CHANNEL INSTR>>       00606000
    RDDATAINSTR=WRTBASE+91,                                             00608000
    RDSPECL   = 2,         <<CPVA2 INTERRUPT CODE>>                     00610000
    RDNXTTB   = 1,                                                      00612000
    RDSTRT    =WRTBASE+43,                                              00614000
    RDINTRPT  =WRTBASE+147,                                             00616000
    RDWAIT    =WRTBASE+76,                                              00618000
    READBINARY= 1,         << BINARY READ IN PROGRESS >>                00620000
    READCMPLTD=%43,        << RSTATE - READ COMPLETED >>                00622000
    READECHO  =%15,        << ECHOING 1ST CHAR OF NO ECHO READ >>       00624000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>               00626000
    READTIMEOUT= 3,        << READ TIME OUT REQUEST TYPE >>             00628000
    READTO    = 6,         << READ TIMED OUT READERRORS CODE >>         00630000
    READWAITING= 5,        << READ WAITING TO START AFTER WRITE DONE >> 00632000
    RESTART'  = 1,         << RESTART WRITE AFTER BUFFER FILL >>        00634000
    REPEATING =%14,        << WRITING SYNC'S OR "!"'S >>                00636000
    REQUEST'  = 3,         << MONITOR SERVICE REQUESTED WHILE ACTIVE >> 00638000
    REVSLASH  = %134,                                                   00640000
    SECONDARY = 2,         << GET TBUF FROM 2ND IF PRIMARY EMPTY >>     00642000
    RECVOFF   =WRTBASE+50,                                              00644000
    SBUFMAXB  = 256,                                                    00646000
    SCSR      = %26,       <<                              >>           00648000
    SCLC      = %27,       <<                              >>           00650000
    SEND'     = 5,         << OUTPUT COMPLETION STATUS BIT >>           00652000
    SENDDOWN   = 2,         << SEND INFO DOWN TO UNIT >>                00654000
    SENDLF    = 8,         <<CPVA1 CODE TO SEND LF/SYNCS>>     <<00637>>00656000
    SENDXON   =%12,        << READ TO BE ACTUALLY STARTED DSTATE >>     00658000
    SETECHO   = 1,         << SET ECHO ON IF ENABLE >>                  00660000
    SERIES'33 = 8,            << CPU # OF SERIES 33 >>         <<01431>>00662000
    SFAIL'    = 10,        << SIO FAILURE BIT IN QFLAGS >>              00664000
    SIOBASE   = -46,       << OFFSET FROM INITTCP TO SIO AREA>><<01286>>00666000
    SIOFAIL  = 64,         << DELAYED SIO FAILURE FUNCTION CODE >>      00668000
    SP'ETX    = %20003,    << SPACE, ETX >>                    <<02866>>00670000
    SPEC'     =  1,        << DISC REQUEST IS FOR MAM >>                00672000
    SPECIALSTOP= 1,        << READ TERMINATED ON SPECIAL STOP CHAR >>   00674000
    SPECIH'   = 4,         << USE SPECIAL INTERRUPT HANDLER >>          00676000
    SPEEDTO   = 6,         << SPEED SENSING TIMEOUT TYPE >>             00678000
    SPOOLEND' = 7,         << PTAPE READ COMPLTD SERVICE REQUES<<00.06>>00680000
    SPOOLING' = 5,         << PTAPE READ IN PROGRESS >>                 00682000
    SPOOLSW'  = 6,         << PTAPE BUFFER FULL SERVICE REQUEST<<00.06>>00684000
    SPSENBAUD =WRTBASE+178,                                             00686000
    SPDSENSIO = 7,         <<SPEEDSENSE SIO PROG ACTIVE DSTATE>>        00688000
    SRQOFF    = WRTBASE+209,                                            00690000
    SRQOFFSET = 76,        <<OFFSET OF WAIT SRQ INSTR FOR READ>>        00692000
    STATADROFSET=11, <<OFFSET OF BUF ADDR FOR RD STATUS INSTR>>         00694000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00696000
    STOPPED   =%44,        << READ STOPPED REQUEST STATE >>             00698000
    SYSDB     =%1000,                                                   00700000
    SYNC'CR   = 6,                                                      00702000
    SYNC'LF   = 7,                                                      00704000
    SYNCCHAR  =%47777,     << SYNC CHARACTER  >>                        00706000
    SYNCFLAG' = 4,         << SET IF DATA IS A SYNC CHARACTER >>        00708000
    SYNSTRT   =WRTBASE+57,                                              00710000
    SYSBUFR'  =  3,        << REQUEST DATA IS IN SYSTEM BUFFERS >>      00712000
    SYSCST    = 1,                                                      00714000
    SYSDST    = 2,                                                      00716000
    SYSINITTCP=%347,       << SYSGLOB OFFSET >>                <<01286>>00718000
    SYSIOQ    = 5,                                                      00720000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00722000
    SYSMON    =%1267,      << SYSTEM MONITOR FLAG >>           <<00.02>>00724000
    SYSPCB    = 3,                                                      00726000
    SYSSBUF   = 6,                                                      00728000
    SYSTBUF   =%16,                                                     00730000
    TAPEMODE' = 0,         << PAPER TAPE READ MODE;NO EDIT RESPONSES >> 00732000
    TBMAXB    = 60,                                                     00734000
    TBMAXW    = TBMAXB/2,                                               00736000
    TBQN      = 0,        <<RESOURCE QUEUE# FOR TBUF REQUESTS>>         00738000
    TEMPLR    = %22,   << THIS LOCATION IS USED BY TICK >>     <<00495>>00740000
                       << BECAUSE THE LIMIT REGISTER IS >>     <<00495>>00742000
                       << UPDATED BY THE FIRMWARE BEFORE>>     <<00495>>00744000
                       << IT GETS TO TICK(SEE TICK PROC >>     <<00495>>00746000
    TERMCHAR' =10,         << TERMINATE INPUT ON STOP CHAR >>           00748000
    TERMINET  = 6,                                                      00750000
    TERMJMP   = [8/15,8/1],                                             00752000
    THEAD     = 2,         << HEAD INDEX  >>                            00754000
    TIMERWAIT = %10,        << Waken PIN on TIMER wait >>      <<02804>>00756000
    TOVRFL    = 5,         << OVERFLOW OF PRIMARY TABLE COUNTER >>      00758000
    TQUEUE    = 1,         << TERM I/O LIMIT RESOURCE NUMBER >>         00760000
    TRANSERR' = %14,       << IOSTAT ERROR FOR 2631'S >>       <<01475>>00762000
    TRANSMIT  = 4,         << FINSH TURNING 202 TO WRITE STATE >>       00764000
    TRANSMIT' = 5,        << FINISH TURN OF HALF DUPLEX LINE >><<02866>>00766000
    TRQSTS    = 3,         << REQUEST FOR ELEMENTS COUNTER, DOUBLE >>   00768000
    TSIZE     = 1,         << ELEMENT SIZE AND IMPEDED PCB >>           00770000
    TTAIL     = 3,         << INDEX OF LAST ELEMENT  >>                 00772000
    TURN202    = 4,        << DSTATE, TURNING 202 TO READ OR WRITE >>   00774000
    TURNTO     = 2,        << 202 TURN AROUND TIME OUT TYPE >>          00776000
    TUSE      = 4,         << MAX IN USE AND CURRENT IN USE >>          00778000
    UNITMASK = %037000,    << MASK UNIT # FROM CONTROL WORD >>          00780000
    UP'       = 1,         << ON LINE,SPEED SENSED AND CAN DO I/O >>    00782000
    UARTBUFADR= 10,                                                     00784000
    UNKNOWN'INT'MSG = 410, << Unknown Device Interrupted msg >><<03662>>00786000
    WAIT2SIO  = WRTBASE+251,                                            00788000
    WAITED    =%11,        << WRITE/READ/BANDWAIT HELD FOR BREAK >>     00790000
    WAITACK   = 16,        <<CPVA2 INTERRUPT CODE>>                     00792000
    WAITCR    = 14,        <<CPVA2 INTERRUPT CODE>>                     00794000
    WAITC'A   = 18,        <<CPVA2 INTERRUPT CODE>>                     00796000
    WAITING   = 7,        << QMISC STATE FOR WAITED REQ'S >>   <<01475>>00798000
    WAITSPDS  =8,                                                       00800000
    WAKECOUNT =32,         << WAKE IF LESS REMAIN TO BE WRITTEN >>      00802000
    WRITING   = 1,         << DSTATE IS WRITING >>                      00804000
    WRTSRQ    = WRTBASE+10,                                             00806000
    WRTDATAINSTR=WRTBASE+34,                                            00808000
    WRTINTRF  = 123,  <<OFFSET OF WRT INTERF CNTRL CHAN INSTR>>         00810000
    WRT'RD    =WRTBASE+66,                                              00812000
    WRT'RD2   = WRTBASE+246,                                            00814000
    WRTSPECL  = 3,                                             <<04228>>00816000
    WSP       = 14,        <<                              >>           00818000
    XMITON    =WRTBASE+5,                                               00820000
    XMITOFF   =WRTBASE+71,                                              00822000
    XON       =%21,                                                     00824000
    XOFF       =%23,        << ASCII CONTROL X CHARACTER >>             00826000
    XOFFPAIR  = 1,         << LAST PAIR CHAR XOFF,TERMINET & TAPEMODE >>00828000
  ENDEQ       = 0;                                                      00832000
EQUATE SYSBASE=%1000,                                                   00834000
       DISCREQTABIX=%31,                                       <<MPEIV>>00836000
       SYSDISCREQTAB=SYSBASE+DISCREQTABIX,                     <<MPEIV>>00838000
        SYSWAITTODISPMSG=%1053;                                <<MPEIV>>00840000
INTEGER POINTER ICS = 7;                                       <<01811>>00842000
EQUATE          ICSSTKBANK=5,                                  <<01811>>00844000
                ICSSTKBASE=9,                                  <<01811>>00846000
                PXGLOBSIZE=8;                                  <<01811>>00848000
DEFINE  TRAPSOFF = PUSH(STATUS);                               <<01861>>00850000
                   TOS.(2:1) := 0;                             <<01861>>00852000
                   SET(STATUS)#;                               <<01861>>00854000
$INCLUDE INCLMSG                                                        00856000
DEFINE TRANSCOMPFLAG=(15:1)#,  <<WAITTODISPMSG>>               <<MPEIV>>00858000
       LONGWAITFLAG=(1:1)#,                                    <<MPEIV>>00860000
       PHASETRANSFLAG=(3:1)#,                                  <<MPEIV>>00862000
       MEMTRAPFLAG=(4:1)#,                                     <<MPEIV>>00864000
       IMPTRAPFLAG=(5:1)#,                                     <<MPEIV>>00866000
       RECOVEREDOCFLAG=(6:1)#,                                 <<MPEIV>>00868000
       DISCWAITFLAG=(7:1)#,                                    <<MPEIV>>00870000
       TERMREADFLAG=(8:1)#,                                    <<MPEIV>>00872000
       SWFLAG=(0:1)#;                                          <<MPEIV>>00874000
DEFINE MSGIOFZREQFLAG=(0:1)#;                                  <<MPEIV>>00876000
INTEGER DISCREQTABSYSBASEINX=DB+DISCREQTABIX;                  <<MPEIV>>00878000
EQUATE PCBIX=3;                                                <<MPEIV>>00880000
INTEGER PCBSYSBASEINX=DB+PCBIX;                                <<MPEIV>>00882000
INTEGER POINTER DISCREQTAB=DISCREQTABIX;                       <<MPEIV>>00884000
DEFINE SETDISCIOSEGFLAG=(1:1)#;                                <<MPEIV>>00886000
EQUATE CLEARDISCIOSEGBIT=3,                                    <<MPEIV>>00888000
       SLLIXWORDNUM=1,DBXDSINFOWORDNUM=2;                      <<MPEIV>>00890000
DEFINE XDSDSTFIELD=(1:10)#;                                    <<MPEIV>>00892000
DEFINE REFERENCEDFLAG=(2:1)#;                                  <<MPEIV>>00894000
DEFINE PRIFIELD=(8:8)#;                                        <<MPEIV>>00896000
                                                               <<MPEIV>>00898000
EQUATE QUEUEINGINFOWORDNUM=%15,                                <<MPEIV>>00900000
       QPRIWORDNUM=1,                                          <<MPEIV>>00902000
       SWBIT=0,                                                <<MPEIV>>00904000
       TRANSCOMPBIT=15;                                        <<MPEIV>>00906000
$INCLUDE INCLMEAS                                              <<MPEIV>>00908000
                                                                        00910000
$INCLUDE INCLMIFT                                              <<04115>>00912000
$INCLUDE INCLIO                                                         00914000
EQUATE SEGIDDATATYPE=0,                                                 00916000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                         00918000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                           00920000
       SEGIDPBXFLAG=(0:1)#,                                             00922000
       SEGIDPBXFIELD=(1:7)#,                                            00924000
       SEGIDLOGSEGFIELD=(8:8)#;                                         00926000
  DEFINE                                                                00928000
    ABORTWRT  =( 5:1)#,                                                 00930000
    ABS       = ABSOLUTE#,                                              00932000
    ACTIVE    =(ACTIVE'  :1)#,                                          00934000
    AUTOHANDSH=IOQPL(QPAR2).(9:1)#, << DO VIEWS READ >>        <<01474>>00936000
    BINARYREAD=(11:1)#,    << IF SET THEN XFER 8 BITS ON READ >>        00938000
    ASMB      = ASSEMBLE#,                                              00940000
    BCNTED    =( 6:1)#,                                                 00942000
    BINARY    =(11:2)#,    << IF 0 THEN ASCII ELSE BINARY READ >>       00944000
    BIT8      =( 8:1)#,    << BIT 8 OF OF ASCII CODE >>                 00946000
    BLOCKED   =(BLOCKED':1)#,<< REQUEST WAITS UNTIL COMPLETION >>       00948000
    BLOCKRD   =(10:1)#,                                                 00950000
    BRKRQST   =(12:1)#,                                                 00952000
    BWRITE    =( 7:1)#,    << BINARY WRITE, PTY DISABLE >>              00954000
    CB        =(CB':1)#,                                                00956000
    CBSB      =(CB':2)#,   << CURRENT STATE OF CB AND SB >>             00958000
    CCVALUE   =( 9:1)#,    << OLD CC STATUS KEPT IN DSAVE>>             00960000
    CCCHANGE  =(11:1)#,    << CHANGE IN DATA SET READY STATUS >>        00962000
    CF        = (CF':1)#,  << CARRIER DETECTED >>                       00964000
    CF'CB'SB  =( 4:3)#,    << HALF DUPLEX STATE >>             <<02866>>00966000
    CFAILCNT  =( 4:6)#,    << CARRIER FAILURE COUNTER >>       <<01.01>>00968000
    CFAILTRLX = DITP(32).(0:8)#, << CARRIER FAIL TIMER INDEX>> <<02866>>00970000
    CFSTATUS  = (14:1)#,   << DSET CARRIER DETECTED STATUS >>           00972000
    CC        =( 6:2)#,    << CONDITION CODE FIELD IN STATUS >>         00974000
    CCC        =( 5:3)#,    << COND CODE PLUS CARRY >>         <<03033>>00976000
    CH        =(10:1)#,    << 2002 SPEED CONTROL, 0 = LOW SPEED  00.02>>00978000
    CHANQUE   =(1:6)#,     << CHANNEL QUEUE NUMBER IN ILT >>            00980000
    CHARMASK  =( 8:8)#,                                                 00982000
    CHECKDB  =DISABLE;                                         <<01115>>00984000
              PUSH(DB);                                        <<01115>>00986000
              X := ABSOLUTE(QI)-5;                             <<01115>>00988000
              TOS := ABSOLUTE(X);                              <<01115>>00990000
              X := X+1;                                        <<01115>>00992000
              TOS := ABSOLUTE(X);                              <<01115>>00994000
              ENABLE;                                          <<01115>>00996000
              ASSEMBLE(DCMP)#,                                 <<01115>>00998000
    CHECKDIO  = IF < THEN IOFAILURE(DRTN,DITP)#,                        01000000
    CMODE     =(CMODE':1)#,<< TERMINAL IN CONSOLE MODE >>               01002000
    COMPLETED =(COMPLETED':1)#,                                         01004000
    CONSINTRPT=(11:1)#,    << CONSOLE INTERRUPT OK IF SET >>   <<00.03>>01006000
    CORERES   =(CORERES':1)#,                                           01008000
    CQUEN     =(8:8)#,     << CONTROLLER REQUEST QUE # >>               01010000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>01012000
    DATAFRZN  =(DATAFRZN':1)#,                                          01014000
    DATAPARITY=(5:1)#,     << DATA INPUT PARITY >>             <<01.01>>01016000
    DELACK    =( 8:1)#,                                                 01018000
    DELECHO   =(DELECHO':2)#,                                           01020000
    DEVTYPE   =(8:8)#,     << DEVICE TYPE OF DLT >>                     01022000
    DIRCSTATE =( 0:2)#,    <<  DEVICE RECOGNITION STATE  0 - NOT OWNED  01024000
                               1 - REQUESTING SERVICE, 2 - SERVICE      01026000
                               GRANTED,  3 - OWNED OR RECOGNIZED  >>    01028000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     01030000
    DISC      =(DISC':1)#, << DFLAG, DEVICE IS A DISC >>                01032000
    DISCONNECT=( 1:1)#,    << DISCONNECT SERVICE REQUEST TO TERM >>     01034000
    DOMOD     =( 6:1)#,                                                 01036000
    DONXTMOD  =( 3:3)#,                                                 01038000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           01040000
    DMONTRP   = DITP(DMONTR)#,                                 <<02866>>01042000
    DRTNUMBER =(7:9)#,                                         <<03018>>01044000
    DSAVEPL   = DITPL(DSAVE)#,                                 <<02866>>01046000
    DSETREADY =(10:1)#,    << DATA SET READY SERVICE REQUEST TO TERM >> 01048000
    DSETUNIT  =( 4:4)#,    << UNIT FIELD IN DSET STATUS >>              01050000
    DSTATE    =(DSTATE'  :4)#,                                          01052000
    DSTFIELD  =(1:10)#,    << DST NUMBER EXTRACT FROM PCB >>            01054000
    DSTN      =(6:10)#,    << DST EXTRACT FROM IOQ >>          <<00.04>>01056000
    DUPLICATE =ASSEMBLE( DUP     )#,                                    01058000
    DVRFRZN   =(DVRFRZN':1)#,                                           01060000
    ECHO      =(ECHO':1)#,                                              01062000
    ECHOON    =( 2:1)#,  <<WHEN RESTART RD, ENABLE ECHO>>               01064000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     01066000
    ENQACKWAIT=(11:1)#,    << 2640 WRITE ENQ/ACK WAIT >>                01068000
    ENQOFFSET =(1:15)#,                                                 01070000
    EOF       =( 7:3)#,    << LAST EOF CONDITON IN LPDT >>              01072000
    EORCHAR    =( 8:8)#,    << TRANSPARENT READ EOR CHARACTER >>        01074000
    EPE       =( 6:1)#,                                                 01076000
    ESIZE     =(8:8)#,     << TABLE ENTRY SIZE >>                       01078000
    ETXSENT   =(ETXSENT':1)#,<< ETX SENT TO TERMINAL ON 202 >> <<00.02>>01080000
    F         = ABSOLUTE#,                                              01082000
    FILLING   =(14:1)#,    <<IOTERM IS FILLING TBUFS WITH WRT DATA>>    01084000
    FLUSH     =(0:1)#,     << BRK/SSBRK FLUSH IN PROGRESS >>            01086000
    FORMFEED  =(FORMFEED':1)#, << IF CLEAR DO CR FOR FORMFEED >>        01088000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   01090000
    HCUNIT    =(11:5)#,     << HIGH CONFIGURED UNIT NUMBER >>           01092000
    HIOP      =CON %20302;CON 1#,                                       01094000
    HIOPWAIT  =( 0:1)#,                                                 01096000
    HSTATE    =( 4:3)#,    << HANG UP STATE                             01098000
                               0 - HUNGUP       3 - HNGP SPD SNS DISCNCT01100000
                               1 - ONLINE       4 - DCLOSE DISCONNECT   01102000
                               2 - LOGGING ON   5 - LO SPD SNS DISCNCT  01104000
                               6 - HANG UP TURN 7 - HANGING UP >>       01106000
    IAK       =(IAK':1)#,                                               01108000
    IDLESIO   =(0:3)#,<<0-RUNSTATUS,1-CHNG STAT,2-PWR RECVRY>>          01110000
    IGNOREHI  =(IGNOREHI':1)#,                                 <<TP.10>>01112000
    IMPEDEOK  =(13:1)#,    << OK TO IMPEDE AWAKEIO CALLER >>            01114000
    ININ      =(14:1)#,    <<SYSTEM INITIALIZATION FLAG>>      <<01045>>01116000
    INIT      =CON %20302;CON 6#,                              <<01301>>01118000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         01120000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           01122000
                               1 - 240 CPS         5 - 15 CPS           01124000
                               2 - 120 CPS         6 - 10 CPS           01126000
                               3 -  60 CPS         7 - 14 CPS  >>       01128000
    INUSE     =(8:8)#,     << NUMBER OF ELEMENTS CURRENTY IN USE >>     01130000
    INTRPTENABLE=(2:1)#,   << ENABLE INTERUPTS ON THIS CHANNEL >>       01132000
    IOWAKE    =(IOWAKE':1)#,                                            01134000
    IOPROG    =(IOPROG':1)#,<< SIO PROGRAM IN PROGRESS >>               01136000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          01138000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           01140000
    LFLAST    =( 1:1)#,                                                 01142000
    LFSYNC    =( 0:4)#,    << NUMBER OF SYNC'S AFTER A LF >>            01144000
    LIMIT1    =(8:8)#,     << PRIMARY TABLE SIZE  >>                    01146000
    LIMIT2    =(0:8)#,     << TOTAL TABLE SIZE >>                       01148000
    LOADMEMORY=ASSEMBLE( LSEA )#,                                       01150000
    MAMERRORC =(MAMERRORC':1)#,                                         01152000
    MAMERRORD =(MAMERRORD':1)#,                                         01154000
    MAXENTRY  =( 0:8)#,    << ENTRIES IN LPDT >>                        01156000
    MCODE     =(10:6)#,    << MONITORING TO BE DONE CODE >>             01158000
    MHDISC    =(MHDISC':1)#, << MHFLAG,IS A MOVING HEAD DISC >><<RK0PV>>01160000
    MISSEDINT =(10:1)#,    << MISSED INTERUPT FIELD OF IFLAG OF ILT >>  01162000
    MUNIT     =(MUNIT':1)#,                                             01164000
    MODACTIVE =( 6:1)#,    <<INTERF MODEM CONTROL PROG ACTIVE>>         01166000
    MODBYTE   =(11:5)#,    << MODEM CONTROL BYTE >>                     01168000
    MODEM     =( 2:2)#,     << MODEM TYPE NUMBER >>            <<01993>>01170000
    MODECHO   =(11:1)#,                                                 01172000
    MODCA     =(12:1)#,                                                 01174000
    MODCD     =(13:1)#,                                                 01176000
    MODCH     =(14:1)#,                                                 01178000
    MODSA     =(15:1)#,                                                 01180000
    MODCBREF  =( 3:1)#,                                                 01182000
    MODCCREF  =( 4:1)#,                                                 01184000
    MODCEREF  =( 5:1)#,                                                 01186000
    MODCFREF  =( 6:1)#,                                                 01188000
    MODSBREF  =( 7:1)#,                                                 01190000
    MODCBMSK  =(11:1)#,                                                 01192000
    MODCCMSK  =(12:1)#,                                                 01194000
    MODCEMSK  =(13:1)#,                                                 01196000
    MODCFMSK  =(14:1)#,                                                 01198000
    MODSBMSK  =(15:1)#,                                                 01200000
    MPXFLAG    =(4:1)#,     << OPERATION COMPLETED ON TERMINAL MPX  >>  01202000
    MPXUNIT    =(0:5)#,     << UNIT NUMBER IN TERMINAL MPX STATUS >>    01204000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                01206000
                                0 - HARDWIRED   2 - 202C                01208000
                                1 - 103         3 - 2002   >>           01210000
    MS'PER'DAY = 86400000D#,   << # OF MS IN A DAY >>          <<01431>>01212000
    MSECS'24'DAYS= 2073600000D#,<< MILLISEC IN 24 DAYS>><<01.03>>       01214000
    NEWLINE   =(NEWLINE' :1)#,                                          01216000
    NOPTY  =(NOPTY':1)#,   <<8-BIT DATA FLAG-->>               <<AMS00>>01220000
                          <<NO PARITY SET IN 8TH BIT>>         <<AMS00>>01222000
    NOSYNC    =(NOSYNC':1)#,<< NO SYNC TERMINAL, USES ENQ AND ACK >>    01224000
    NOTIMPEDABLE=(13:1)#,  <<CALLER MAY NOT BE IMPEDED >>               01226000
    NOTRDY    =(9:1)#,     << START WAIT FOR NOTRDY DEV >>     <<00.TP>>01228000
    NO'CX'ECHO=( 1:1)#,    << IF SET DONT ECHO !!! ON CONTROL X >>      01230000
    NSW       =(11:1)#,     << DO NOT SHORT WAIT DISC >>                01232000
    NXTDSTATE =( 9:4)#,    << NEXT DSTATE AFTER 202 TURN AROUND >>      01234000
    ODDPTY    =( 8:1)#,                                                 01236000
    OE        =( 5:1)#,                                                 01238000
    OEPE      =( 5:2)#,    <<UART OVERRUN,PTY ERROR STATUS>>            01240000
    OFFLINE   = (13:1)#,   << OF STATUS FROM HP263X >>         <<01475>>01242000
    OUTPUT    =(1:1)#,     << IF SET THEN WIO IS OUTPUT CONTROL >>      01244000
    OUTSPEED  =( 6:4)#,    << OUTPUT SPEED AND CHARACTER SIZE CODE      01246000
                               SEE INSPEED FOR MEANING >>               01248000
    OWNREAD   =(10:1)#,    << USER DOES OWN DC1/DC2 HANDSHAKING >>      01250000
    PAIR      =(PAIR'    :1)#,                                          01252000
    PAIRCODE  =(12:4)#,    << DENOTES LAST PAIR CHAR INPUT >>           01254000
    PAPEROUT  = (15:1)#,   << STATUS FROM HP263X >>            <<01475>>01256000
    PARITY    =(PARITY':1)#,                                            01258000
    PARITYSAVE=( 8:2)#,    << HOLDS PRTY SENSE DURING WRITE BACK 01.01>>01260000
    PCBM      =(8:8)#,     << PCB MASK FOR PCB AND TABLE IMPEDED LINK >>01262000
    PCBN      =( 0:8)#,    << QSTAT, PCB NUMBER >>                      01264000
    PCBS      =LSR(8)#,    << SHIFT TO GET PCB NUMBER FROM IOQ >>       01266000
    PDISABLE  = ASSEMBLE( PSDB )#,     << PSUEDO DISABLE >>             01268000
    PE        =( 6:1)#,    <<UART PARITY ERROR BIT>>                    01270000
    PENABLE   = ASSEMBLE( PSEB )#,     << PSEUDO ENABLE >>              01272000
    PREQ      =(PREQ':1)#,                                              01274000
    PTYCHK    =( 9:1)#,                                                 01276000
    PTYCNTRL  =(PTYCNTRL':1)#,                                          01278000
    PTYON     =( 7:1)#,                                                 01280000
    PTYONODD  =( 7:2)#,    <<PTY ON FLAG; ODD PTY FLAG>>       <<00637>>01282000
    PRIMED    =(PRIMED':1)#,<< 2640 READY TO SEND A BLOCK >>            01284000
    PREMPT    =( 0:1)#,   << SET WHEN PREMPTIVE TERM REQUEST QUEUE >>   01286000
    PREMPTFIELD=( 7:2)#,   << TERMINAL REQUEST PREMPT FLAGS >>          01288000
    PREMPTFLD =(12:2)#,    << SIO REQUEST PREMP FLAGS >>                01290000
    QABORTS  = (11:1)#,    << SEND ABORT REQUEST, DONT SET BITS >>      01292000
    QLDEVN    =(8:8)#,     << LOGICAL DEVICE # FIELD OF I/O REQ >>      01294000
    RBYTE     =(8:8)#,                                                  01296000
    RDCOUNTED =( 8:1)#,    << RDCOUNTER INCREMENTED >>                  01298000
    RDFLUSH   =( 2:1)#,                                        <<01828>>01300000
    READTRLX  =( 8:8)#,    << TRLX FOR READ & LOGON TIME OUTS >>        01302000
    READSTOP  =( 7:3)#,    << IF NOT ZERO THEN STOP READ BECAUSE        01304000
                                 0 - NONE        4 - LOGON TIMED OUT    01306000
                                 1 - BREAK       5 - ABORTED            01308000
                                 2 - PREMPT      6 - NOT USED           01310000
                                 3 - TIMED OUT   7 - NOT USED  >>       01312000
    READERRORS=(10:3)#,    << 0-OK,1-SPECIALSTOP,2-PTY ERR              01314000
                              3-LOST DATA,4-LOST CHAR,5-BREAK >>        01316000
    RESTART   =(RESTART':1)#,                                           01318000
    RESTSPD   =(10:1)#,                                                 01320000
    REQUEST   =(REQUEST':1)#,<< REQUEST FOR SERVICE WHILE ACTIVE >>     01322000
    RIOA      =CON %20302;CON %13#,                            <<03018>>01324000
    RIOC      =CON %20302;CON 2#,                              <<01301>>01326000
    RPLEVEL   =(13:3)#,    << REQUEST PREMPT LEVEL,SEE LPLEVEL  >>      01328000
    RSTATE    =(10:6)#,    << REQUEST STATE -                           01330000
                              0 - NEW       %30 - PRE TO POST TBUF WAIT 01332000
                              1 - STARTED   %31 - PRESPACE TBUF WAIT    01334000
                              2 - READING    32 - WRT DATA TBUF WAIT    01336000
                             43 - RD CMPLTD  33 - POSTSPACE TBUF WAIT   01338000
                             44 - RD STOPPED                            01340000
                              5 - READ WAITING                          01342000
                             %34-%37 SAME A %30-%33 BUT ENQ ADD WAIT    01344000
                           >>                                           01346000
    RTYPE     =(14:2)#,    << EXTRACT LEAST BITS OF REQUEST TYPE        01348000
                               0 - UNBLOCKED, NO WAKE                   01350000
                               1 - BLOCKED                              01352000
                               2 - UNBLOCKED, WAKE                      01354000
                               3 - UNBLOCKED, NO PCB, NO WAKE           01356000
                           >>                                           01358000
    RUNWAIT   =(0:1)#,     << RUN WAIT PROG ON THIS CONT. >>   <<00.TP>>01360000
    SB        =( 6:1)#,                                                 01362000
    SCP       =( 3:1)#,    << Restart channel pgm on interrupt <<03068>>01364000
    SEND      =(SEND':1)#,                                              01366000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS  00.02>>01368000
    SFAIL     =(SFAIL':1)#,                                             01370000
    SIOHIOP   =( 2:1)#,                                                 01372000
    SIOPREMPT =( 6:1)#,    << SET WHEN A PREMTIVE REQUEST IS QUEUE >>   01374000
    SIORUN    =(6:1)#,   <<SIO PROG IN RUNNING STATUS>>                 01376000
    SPDFOUND  = ( 9:1)#,   << ON LINE OR SPD SNSE SERVICE REQST >>      01378000
    SPDSENSING=( 4:1)#,                                                 01380000
    SPDSIO    =( 2:1)#,                                                 01382000
    SPEC      =(SPEC':1)#,                                              01384000
    SPECFLAG  =(10:1)#,    << SPEC REQUEST FLAG, FLAGS WORD, ATTACHIO >>01386000
    SPOOLEND  =(SPOOLEND':1)#,                                          01388000
    SPOOLING  =(SPOOLING':1)#,                                          01390000
    SPOOLSW   =(SPOOLSW' :1)#,                                          01392000
    SQ        =(4:1)#,     << Restart channel program QUEUED >><<03669>>01394000
    SSBRQST   =(13:1)#,                                                 01396000
    SSBRKCHAR  =( 0:8)#,    << TRANSPARENT READ SUB SYS BRK CHARACTER >>01398000
    STACKFLAG = ( 0:1)#,   << IF SET QADDR IS DB RELATIVE ADDR <<00.05>>01400000
    STARTSIO  =ASMB(CON %20302;CON 0)#,                                 01402000
    STATEF    =(12:4)#,    << SIO DEVICE REQUEST STATE >>               01404000
    STATDONE  = (15:1)#,   << DRQST, STAT REQ COMPLETE >>      <<01475>>01406000
    STATREQ   = DITPL(DSAVE).(13:1)#, << STAT REQ ACTIVE >>    <<01475>>01408000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  01410000
    STOPSIO = ASMB(CON %20302; CON 1)#,                        <<01475>>01412000
    STRTWRT   =(14:1)#,                                                 01414000
    STWAIT    =(10:1)#,    << START WAIT PROG (DIT) >>   <<00.TP>>      01416000
    SYNC      =( 2:1)#,    << REPEATING SYNC'S FOR FILL CHARS >>        01418000
    SYNCSTATE =( 4:4)#,    << SAVED INTERRUPT FOR SYNCS >>     <<02866>>01420000
    SYSBUFR   =(SYSBUFR':1)#,                                           01422000
    SYSBUFRS  =(12:1)#,    << ADDRESS IS SBUF RELATIVE >>               01424000
    TAPEMODE  =(TAPEMODE':1)#,                                          01426000
    TDFLAGS   =( 0:2)#,    << TERM & DISC FLAGS IN DFLAGS >>            01428000
    TERMCHAR  =(TERMCHAR':1)#,                                          01430000
    TERMSPEED =(10:6)#,   <<DEFAULT SPEED>>                    <<04229>>01432000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            01434000
    TESTBIT   = ASSEMBLE(TBC#,                                          01436000
    TIMING    = (0:1)#,    << A TIMED READ IS IN PROGRESS >>            01438000
    TIMEREAD  =( 1:1)#,    << TIME READ OPERATIONS >>                   01440000
    TMODE     =(11:2)#,    << TERMINAL MODE                             01442000
                                 0 - NORMAL   2 - CONSOLE               01444000
                                 1 - BREAK    3 - CONSOLE FROM BREAK >> 01446000
    TRANSERR  = (12:1)#,   << STATUS FROM 2635X >>             <<01475>>01448000
    TURNCHAR  =( 8:8)#,    << BYTE TO BE OUTPUT WHEN TURNED AROUND >>   01450000
    TURNTOWRITE=( 7:1)#,   << IF SET, 202 TURNING TO WRITE ELSE READ >> 01452000
    UP        =(UP':1)#,   << UNIT IS ON LINE & SPEED SENSED >>         01454000
    WAITDONE  =( 2:1)#,    << TERM BAND WIDTH WAIT COMPLETED >>         01456000
    WAITEDSTATE=(0:4)#,    << STATE WAITED FOR BREAK >>                 01458000
    WAITPROG  =(1:1)#,     << WAIT PROG IS RUNNING (ILT) >>    <<00.TP>>01460000
    WAITXON   =(10:1)#,    <<WRITE HALTED TO WAIT FOR XON>>    <<00487>>01462000
    WIOA      =CON %20302;CON %14#,                            <<03018>>01464000
    WIOC      =CON %20302;CON 3#,                              <<01301>>01466000
    WRTCOUNTED=( 9:1)#,    << WRTCOUNTER INCREMENTED >>                 01468000
    WRTWAIT   =( 6:1)#,    << WAITING FOR A WRITE CMPLTION INTRPT >>    01470000
    WRTENQ    =( 0:1)#,                                                 01472000
    XCHDB     = ASSEMBLE( XCHD )#,                                      01474000
    ENDDEF    = 0#;                                                     01476000
$PAGE                                                                   01478000
                                                                        01480000
  <<----------- GENERAL SERVICE VARIABLES ----------------->>           01482000
                                                                        01484000
                                                                        01486000
    LOGICAL SYSUP = DB + %73;  << SYSTEM UP FLAG >>                     01488000
    INTEGER ARRAY DITPA(*) = DB+ IDITP;   << BASE OF DITP'S IN ILT >>   01490000
    INTEGER ARRAY ILT(*) = DB;                                          01492000
   ARRAY TDS'DB(*) = DB; <<TO ACCESS TERMINAL DATA SEGMENT>>   <<03651>>01494000
    LOGICAL POINTER  PCB = 3;   << PROCESS CONTROL BLOCK >>             01496000
    INTEGER POINTER  TRL = 10;  << TIMER REQUEST LIST >>                01498000
                                                                        01500000
    INTEGER POINTER PS0 = S-0,  PS1 = S-1;                              01502000
    LOGICAL LS0 = S-0,  LS1 = S-1,  LX = X;                             01504000
    INTEGER S0 = S-0, S1 = S-1, X = X;                                  01506000
                                                                        01508000
    INTEGER ARRAY WA0(*) = DB + 0;                                      01510000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    01512000
                                                                        01514000
    INTEGER RSTATUS = Q -1;   << PCAL RETURN STATUS >>                  01516000
                                                                        01518000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               01520000
    INTEGER POINTER S'LPDT= SYSLPDT;                           <<03033>>01522000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               01524000
    INTEGER ARRAY CST (@) = DB + SYSCST;                                01526000
    INTEGER ARRAY IOQ (@) = DB + SYSIOQ ;                               01528000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               01530000
    INTEGER ARRAY TBUF(@) = DB + SYSTBUF;                               01532000
    INTEGER ARRAY DST (@) = DB + SYSDST;                                01534000
    INTEGER ARRAY INITTCP(@) = DB + SYSINITTCP;                <<01286>>01536000
    INTEGER ARRAY SIOP(@) = DB + SYSINITTCP;                   <<01286>>01538000
    << THE SIO PROGRAM AREA FOR PRINTCHAR AND READCHAR IS    >><<01286>>01540000
    << LOCATED 46 WORDS BEFORE THE INITTCP AREA IN BANK 0.   >><<01286>>01542000
    << TO SAVE A SYSGLOB CELL, THE SIO AREA WILL BE ACCESSED >><<01286>>01544000
    << BY USING THE POINTER TO INITTCP(-46) OR SIOP(SIOBASE).>><<01286>>01546000
                                                                        01548000
    INTEGER ARRAY BUSY(@) = DB + %55;                                   01550000
    INTEGER ARRAY HEAD(@) = DB + %56;                                   01552000
    INTEGER ARRAY TAIL(@) = DB + %57;                                   01554000
    INTEGER SIOCOUNT   = DB + %60;  << # OF SIO PROGRAMS IN PROGRESS >> 01556000
    INTEGER RDCOUNTER  = DB + %64; << # OF TERMINAL READS IN PROGESS >> 01558000
    INTEGER WRTCOUNTER = DB + %65; << # OF TERMNAL WRITES IN PROGRESS >>01560000
                                                                        01562000
    INTEGER CONSLDEV   = DB + %74;  << SYSTEM CONSOLE LDEV >>           01564000
    INTEGER POWERFAIL  = DB + %72;  << POWERFAIL STATE >>               01566000
    INTEGER PROGENPCBP = DB + %141;  << PROGEN PCB INDEX >>             01568000
    INTEGER DEVRECPCBP = DB + %145;  << DEVICE RECOGNITION PCB INDEX >> 01570000
    INTEGER SYSIOPCBP  = DB + %153; << SYSTEM I/O PROCESS PBC INDEX >>  01572000
    LOGICAL LOGONTIME  = DB + %120; << MAX LOGON TIME IN SECONDS >>     01574000
    LOGICAL AVR        = DB + %346; << AUTO TAPE VOL. RECOG. WORD >>    01576000
                                                                        01578000
  <<-------------- MONITORING DECLARATIONS ---------------->>           01580000
                                                                        01582000
    INTEGER DSETB = DB + %66;                                           01584000
    DOUBLE LASTTIMER = DB + %67;                                        01586000
                                                                        01588000
                                                                        01590000
                                                                        01592000
  <<---------EXTERNAL PROCEDURE DECLARATIONS ------------->>            01594000
                                                                        01596000
                                                                        01598000
PROCEDURE ABORTTIMEREQ(TRLX);                                           01600000
  VALUE TRLX;  INTEGER TRLX;   OPTION FORWARD;                          01602000
                                                                        01604000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       01606000
  VALUE PCBPT, N, WAITF;                                                01608000
  INTEGER PCBPT, N, WAITF;  OPTION EXTERNAL;                            01610000
                                                               <<04318>>01612000
DOUBLE PROCEDURE B08'LOGICAL'DVR(LDEV, QMISC, DSTX, ADDR,      <<04318>>01614000
                                 FNCT, CNT, P1, P2, FLAGS);    <<04318>>01616000
                                                               <<04318>>01618000
VALUE                            LDEV, QMISC, DSTX, ADDR,      <<04318>>01620000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04318>>01622000
                                                               <<04318>>01624000
INTEGER                          LDEV, QMISC, DSTX, ADDR,      <<04318>>01626000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04318>>01628000
                                                               <<04318>>01630000
OPTION EXTERNAL;                                               <<04318>>01632000
                                                               <<04318>>01634000
                                                                        01636000
PROCEDURE CHKCHANNELQUE(QN,DITP);                                       01638000
  VALUE QN,DITP;   INTEGER QN; POINTER DITP;                            01640000
  OPTION FORWARD;                                                       01642000
                                                                        01644000
PROCEDURE CLEARWWS;    OPTION EXTERNAL;                                 01646000
                                                                        01648000
                                                                        01650000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01652000
  VALUE DRTN;  INTEGER DRTN;                                            01654000
  ARRAY DITP;  OPTION FORWARD;                                          01656000
                                                                        01658000
INTEGER PROCEDURE GETSBUF(TYPE);                                        01660000
  VALUE TYPE;  INTEGER TYPE;                                            01662000
  OPTION FORWARD;                                                       01664000
                                                                        01666000
PROCEDURE HALT'HPIB(DITP);                                     <<01301>>01668000
   INTEGER ARRAY DITP;                                         <<TP.10>>01670000
   OPTION UNCALLABLE,PRIVILEGED,FORWARD;                       <<TP.10>>01672000
                                                                        01674000
PROCEDURE HELP; OPTION FORWARD;                                         01676000
                                                                        01678000
INTEGER PROCEDURE SYSPROC(LPIN);                               <<01752>>01680000
VALUE LPIN;                                                    <<01752>>01682000
INTEGER LPIN;                                                  <<01752>>01684000
OPTION EXTERNAL;                                               <<01752>>01686000
                                                               <<01752>>01688000
PROCEDURE IDLEWAIT (DITP);                                              01690000
  INTEGER ARRAY DITP;                                                   01692000
  OPTION FORWARD;                                                       01694000
                                                                        01696000
PROCEDURE INIT'LYNX'DEV'(DITP, DEVICE'TYPE);                   <<03028>>01698000
  VALUE DITP,DEVICE'TYPE;                                      <<03019>>01700000
  POINTER DITP;                                                <<03019>>01702000
  LOGICAL DEVICE'TYPE;                                         <<03019>>01704000
  OPTION EXTERNAL;                                             <<03019>>01706000
                                                                        01708000
PROCEDURE IOFREEZE'(SEGIDENT);                                 <<MPEIV>>01710000
VALUE SEGIDENT;                                                <<MPEIV>>01712000
INTEGER SEGIDENT;                                              <<MPEIV>>01714000
OPTION EXTERNAL;                                               <<MPEIV>>01716000
                                                               <<MPEIV>>01718000
PROCEDURE IOUNFREEZE'(SEGIDENT);                               <<MPEIV>>01720000
VALUE SEGIDENT;                                                <<MPEIV>>01722000
INTEGER SEGIDENT;                                              <<MPEIV>>01724000
OPTION EXTERNAL;                                               <<MPEIV>>01726000
                                                                        01728000
PROCEDURE IOIMPEDE(TBASE);                                              01730000
  VALUE TBASE;  INTEGER TBASE;                                          01732000
  OPTION FORWARD;                                                       01734000
                                                                        01736000
PROCEDURE IOUNIMPEDE(TBASE);                                            01738000
  VALUE TBASE;  INTEGER TBASE;                                          01740000
  OPTION FORWARD;                                                       01742000
                                                                        01744000
PROCEDURE IMPEDE(PCBPT);                                                01746000
  VALUE PCBPT;  INTEGER PCBPT;                                          01748000
  OPTION EXTERNAL;                                                      01750000
                                                                        01752000
PROCEDURE LOGERROR(A,B,C);                                              01754000
VALUE A,B,C;                                                            01756000
INTEGER C;                                                              01758000
INTEGER POINTER A,B;                                                    01760000
OPTION FORWARD;                                                         01762000
                                                                        01764000
INTEGER PROCEDURE GETSYSTABENTRY(SYSTABINX);                   <<MPEIV>>01766000
VALUE SYSTABINX;                                               <<MPEIV>>01768000
INTEGER SYSTABINX;                                             <<MPEIV>>01770000
OPTION EXTERNAL;                                               <<MPEIV>>01772000
                                                               <<MPEIV>>01774000
PROCEDURE RELSYSTABENTRY(SYSTABINX,ENTRYSYSBASEINX);           <<MPEIV>>01776000
VALUE SYSTABINX,ENTRYSYSBASEINX;                               <<MPEIV>>01778000
INTEGER SYSTABINX,ENTRYSYSBASEINX;                             <<MPEIV>>01780000
OPTION EXTERNAL;                                               <<MPEIV>>01782000
                                                               <<MPEIV>>01784000
PROCEDURE FETCHIOSEG(SEGID,LDEV,IOREQSYSBASEINX,FLAGS);                 01786000
VALUE SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                                 01788000
INTEGER SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                               01790000
OPTION EXTERNAL;                                                        01792000
                                                                        01794000
PROCEDURE CRASH'(WHY);                                         <<MPEIV>>01796000
VALUE WHY;                                                     <<MPEIV>>01798000
INTEGER WHY;                                                   <<MPEIV>>01800000
OPTION EXTERNAL;                                               <<MPEIV>>01802000
                                                               <<MPEIV>>01804000
                                                               <<MPEIV>>01806000
PROCEDURE SEGWRITECOMPLETOR(REQP);                             <<MPEIV>>01808000
VALUE REQP;                                                    <<MPEIV>>01810000
INTEGER REQP;                                                  <<MPEIV>>01812000
OPTION EXTERNAL;                                               <<MPEIV>>01814000
                                                               <<MPEIV>>01816000
PROCEDURE SEGREADCOMPLETOR(REQP);                              <<MPEIV>>01818000
VALUE REQP;                                                    <<MPEIV>>01820000
INTEGER REQP;                                                  <<MPEIV>>01822000
OPTION EXTERNAL;                                               <<MPEIV>>01824000
                                                               <<MPEIV>>01826000
PROCEDURE ADJUSTLOCALITY(PROCINX,SEGIDENT,REQSIZE,FLAGS);      <<MPEIV>>01828000
VALUE PROCINX,SEGIDENT,REQSIZE,FLAGS;                          <<MPEIV>>01830000
LOGICAL PROCINX,SEGIDENT,REQSIZE,FLAGS;                        <<MPEIV>>01832000
OPTION EXTERNAL;                                               <<MPEIV>>01834000
                                                               <<MPEIV>>01836000
PROCEDURE QUEUEONSEGMENT(SEGIDENT);                            <<MPEIV>>01838000
VALUE SEGIDENT;                                                <<MPEIV>>01840000
INTEGER SEGIDENT;                                              <<MPEIV>>01842000
OPTION EXTERNAL;                                               <<MPEIV>>01844000
                                                               <<MPEIV>>01846000
PROCEDURE FLAGPROCABSENT(PROCINX,SEGIDENT);                    <<MPEIV>>01848000
VALUE PROCINX,SEGIDENT;                                        <<MPEIV>>01850000
INTEGER PROCINX,SEGIDENT;                                      <<MPEIV>>01852000
OPTION EXTERNAL;                                               <<MPEIV>>01854000
LOGICAL PROCEDURE TESTIOFROZEN(SEGIDENT);                      <<MPEIV>>01856000
VALUE SEGIDENT;                                                <<MPEIV>>01858000
INTEGER SEGIDENT;                                              <<MPEIV>>01860000
OPTION EXTERNAL;                                               <<MPEIV>>01862000
                                                               <<MPEIV>>01864000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENTIFIER,FLAGS);           <<MPEIV>>01866000
VALUE SLLINX,SEGIDENTIFIER,FLAGS;                              <<MPEIV>>01868000
INTEGER SLLINX,SEGIDENTIFIER,FLAGS;                            <<MPEIV>>01870000
OPTION EXTERNAL;                                               <<MPEIV>>01872000
                                                                        01874000
PROCEDURE MMSTAT(E,P1,P2,P3);                                  <<00.02>>01876000
VALUE E,P1,P2,P3;                                              <<00.02>>01878000
INTEGER E,P1,P2,P3;                                            <<00.02>>01880000
OPTION EXTERNAL;                                               <<00.02>>01882000
                                                               <<00.02>>01884000
PROCEDURE RESETCRITICAL(OLDCRIT);                                       01886000
  VALUE OLDCRIT;  INTEGER OLDCRIT;                                      01888000
  OPTION EXTERNAL;                                                      01890000
                                                                        01892000
PROCEDURE RESETDB(OLDDB);                                               01894000
  VALUE OLDDB;  INTEGER OLDDB;                                          01896000
  OPTION EXTERNAL;                                                      01898000
                                                                        01900000
INTEGER PROCEDURE GET'DSDEVICE(LDEV);                          <<04310>>01902000
  VALUE LDEV;                                                  <<04310>>01904000
  INTEGER LDEV;                                                <<04310>>01906000
  OPTION EXTERNAL;                                             <<04310>>01908000
                                                               <<04310>>01910000
PROCEDURE RETURNSYSBUF(INDEX);                                          01912000
VALUE INDEX;                                                            01914000
INTEGER INDEX;                                                          01916000
OPTION FORWARD;                                                         01918000
                                                                        01920000
                                                                        01922000
PROCEDURE RETURNDISCREQ(PNTR);                                 <<01637>>01924000
VALUE PNTR;                                                    <<01637>>01926000
INTEGER POINTER PNTR;                                          <<01637>>01928000
OPTION FORWARD;                                                <<01637>>01930000
                                                               <<01637>>01932000
LOGICAL PROCEDURE READ'DEVICE'REG(DRT, REG'NUM);               <<03028>>01934000
VALUE DRT, REG'NUM;                                            <<03028>>01936000
LOGICAL DRT, REG'NUM;                                          <<03028>>01938000
OPTION FORWARD;                                                <<03028>>01940000
                                                               <<03028>>01942000
PROCEDURE WRITE'DEVICE'REG(DRT, REG'NUM, DATA'OUT);            <<03028>>01944000
VALUE DRT, REG'NUM, DATA'OUT;                                  <<03028>>01946000
LOGICAL DRT, REG'NUM, DATA'OUT;                                <<03028>>01948000
OPTION FORWARD;                                                <<03028>>01950000
                                                               <<03028>>01952000
LOGICAL PROCEDURE CHANNEL'ID(LDEV);                            <<03028>>01954000
VALUE LDEV;                                                    <<03028>>01956000
INTEGER LDEV;                                                  <<03028>>01958000
OPTION FORWARD;                                                <<03028>>01960000
                                                                        01962000
                                                                        01964000
PROCEDURE ADDTAIL(NEW,LINKINDEX,QUEUENUMBER);                           01966000
  VALUE   LINKINDEX, QUEUENUMBER;                                       01968000
  INTEGER LINKINDEX, QUEUENUMBER;                                       01970000
  INTEGER ARRAY NEW;                                                    01972000
  OPTION FORWARD;                                                       01974000
                                                                        01976000
                                                                        01978000
PROCEDURE ADDHEAD(NEW,LINKINDEX,QUEUENUMBER);                           01980000
  VALUE   LINKINDEX, QUEUENUMBER;                                       01982000
  INTEGER LINKINDEX, QUEUENUMBER;                                       01984000
  INTEGER ARRAY NEW;                                                    01986000
  OPTION FORWARD;                                                       01988000
                                                                        01990000
                                                                        01992000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QUEUENUMBER);                       01994000
  VALUE LINKINDEX, QUEUENUMBER;   INTEGER LINKINDEX, QUEUENUMBER;       01996000
  OPTION FORWARD;                                                       01998000
                                                                        02000000
INTEGER PROCEDURE LDEVTOTYPE(LDEV);                            <<03033>>02002000
VALUE LDEV;  INTEGER LDEV;                                     <<03033>>02004000
OPTION FORWARD;                                                <<03033>>02006000
                                                                        02008000
PROCEDURE CHECKLDEV(LDEV);                                              02010000
  VALUE LDEV;  INTEGER LDEV;                                            02012000
  OPTION FORWARD;                                                       02014000
                                                                        02016000
                                                                        02018000
PROCEDURE AWAKEIO( DITP,FLAGS);                                         02020000
  VALUE DITP, FLAGS;                                                    02022000
  INTEGER POINTER DITP;  INTEGER FLAGS;                                 02024000
  OPTION FORWARD;                                                       02026000
                                                                        02028000
                                                                        02030000
PROCEDURE STARTIO(DITP,SIOP,QUEUE);                         <<01301>>   02032000
VALUE QUEUE;                                                            02034000
INTEGER ARRAY DITP,SIOP;                                                02036000
LOGICAL QUEUE;                                                          02038000
OPTION FORWARD;                                                         02040000
                                                                        02042000
                                                                        02044000
LOGICAL PROCEDURE SETSYSDB;  OPTION EXTERNAL;                           02046000
                                                                        02048000
INTEGER PROCEDURE SETCRITICAL;                                          02050000
  OPTION EXTERNAL;                                                      02052000
                                                                        02054000
PROCEDURE SUDDENDEATH(N);                                               02056000
  VALUE N;  INTEGER N;                                                  02058000
  OPTION FORWARD;                                                       02060000
                                                                        02062000
DOUBLE PROCEDURE TIMER;    OPTION FORWARD;                              02064000
                                                                        02066000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               02068000
  VALUE CODE, REQ, TIME;                                                02070000
  INTEGER CODE, REQ;   DOUBLE TIME;                                     02072000
  OPTION FORWARD;                                                       02074000
                                                                        02076000
PROCEDURE UNIMPEDE(PCBPT);                                              02078000
  VALUE PCBPT;  INTEGER PCBPT;                                          02080000
  OPTION EXTERNAL;                                                      02082000
                                                                        02084000
PROCEDURE WAIT(WAITF,WAITTYPE);                                         02086000
  VALUE WAITF, WAITTYPE;                                                02088000
  INTEGER WAITF, WAITTYPE;                                              02090000
  OPTION EXTERNAL;                                                      02092000
                                                                        02094000
                                                               <<04837>>02096000
PROCEDURE AWAKETERMINAL(DITP);                                 <<04837>>02098000
  INTEGER ARRAY DITP;                                          <<04837>>02100000
  OPTION EXTERNAL;                                             <<04837>>02102000
                                                               <<04837>>02104000
INTEGER PROCEDURE READCHAR(WAITMS);                            <<04837>>02106000
  VALUE WAITMS;  LOGICAL WAITMS;                               <<04837>>02108000
  OPTION VARIABLE,EXTERNAL;                                    <<04837>>02110000
                                                               <<04837>>02112000
$PAGE                                                          <<03019>>02114000
LOGICAL PROCEDURE PRINTCHAR(CHAR);                             <<03019>>02116000
  VALUE CHAR;INTEGER CHAR;                                              02118000
  OPTION EXTERNAL;  <<  PRINTCHAR IN TERMRES >>                <<04837>>02120000
                                                               <<03651>>02126000
PROCEDURE LYNX'PF'CHECK;                                       <<03651>>02128000
OPTION FORWARD;                                                <<03651>>02130000
                                                               <<03651>>02132000
INTEGER PROCEDURE LOADPROC( PROCNAME, LIBSEARCH, PLABEL);      <<03651>>02134000
VALUE LIBSEARCH;                                               <<03651>>02136000
INTEGER LIBSEARCH, PLABEL;                                     <<03651>>02138000
BYTE ARRAY PROCNAME;                                           <<03651>>02140000
OPTION EXTERNAL;                                               <<03651>>02142000
                                                               <<03651>>02144000
PROCEDURE UNLOAD( PROCID);                                     <<03651>>02146000
VALUE PROCID;                                                  <<03651>>02148000
INTEGER PROCID;                                                <<03651>>02150000
OPTION EXTERNAL;                                               <<03651>>02152000
                                                               <<03019>>02154000
PROCEDURE LDEVONENOTREADY(CONSLDEV);                           <<03651>>02156000
   VALUE CONSLDEV;                                             <<03019>>02158000
   INTEGER CONSLDEV;                                           <<03019>>02160000
   OPTION FORWARD;                                             <<03651>>02162000
                                                               <<03019>>02164000
DOUBLE PROCEDURE SDISCIO(LDNUM,QMISC,DSTX,ADR,FNCT,            <<SD.00>>02166000
CNT,P1,P2,FLAGS);                                              <<SD.00>>02168000
VALUE LDNUM,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;               <<SD.00>>02170000
INTEGER LDNUM,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;             <<SD.00>>02172000
OPTION EXTERNAL;                                               <<SD.00>>02174000
                                                               <<SD.00>>02176000
INTEGER PROCEDURE EXCHANGEDB(DST);                             <<SD.00>>02178000
VALUE DST;                                                     <<SD.00>>02180000
INTEGER DST;                                                   <<SD.00>>02182000
OPTION EXTERNAL;                                               <<SD.00>>02184000
                                                               <<SD.00>>02186000
INTEGER PROCEDURE GETDRT(DRT,OFFSET);                          <<03018>>02188000
VALUE DRT,OFFSET;                                              <<03018>>02190000
INTEGER DRT,OFFSET;                                            <<03018>>02192000
OPTION FORWARD;                                                <<03018>>02194000
                                                               <<03018>>02196000
PROCEDURE PUTDRT(DRT,OFFSET,NUM);                              <<03018>>02198000
VALUE DRT,OFFSET,NUM;                                          <<03018>>02200000
INTEGER DRT,OFFSET,NUM;                                        <<03018>>02202000
OPTION FORWARD;                                                <<03018>>02204000
                                                               <<03018>>02206000
procedure SENDMSG(DESTPIN,DESTPORT,MSGLEN,FLAGS);              <<02804>>02208000
value DESTPIN,DESTPORT,MSGLEN,FLAGS;                           <<02804>>02210000
integer DESTPIN,DESTPORT,MSGLEN;                               <<02804>>02212000
logical FLAGS;                                                 <<02804>>02214000
option external;                                               <<02804>>02216000
                                                               <<02804>>02218000
procedure STOPTIMEOUT(TYPE,DITP);                              <<03687>>02220000
value TYPE;                                                    <<03687>>02222000
integer TYPE;                                                  <<03687>>02224000
integer array DITP;                                            <<03687>>02226000
option forward;                                                <<03687>>02228000
                                                               <<03687>>02230000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<02804>>02232000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<02804>>02234000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<02804>>02236000
   IOTYPE;                                                     <<02804>>02238000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<02804>>02240000
   IOTYPE;                                                     <<02804>>02242000
INTEGER POINTER DITP;                                          <<02804>>02244000
OPTION variable,forward;                                       <<02804>>02246000
                                                               <<02804>>02248000
procedure MPE'TABLE'FULL(TABNUM);                              <<02804>>02250000
value TABNUM;  integer TABNUM;                                 <<02804>>02252000
option forward;                                                <<02804>>02254000
                                                               <<02804>>02256000
$PAGE                                                                   02260000
                                                                        02262000
                                                                        02264000
                                                                        02266000
                                                                        02268000
PROCEDURE WRITE2(TC);                                                   02270000
  VALUE TC;  INTEGER TC;                                                02272000
    OPTION PRIVILEGED, UNCALLABLE;                                      02274000
  BEGIN  << WRITES TWO CHARACTERS TO THE MUX >>                         02276000
    PRINTCHAR(TC&LSR(8));                                               02278000
    PRINTCHAR(TC);                                                      02280000
  END;  << WRITE 2  >>                                                  02282000
$PAGE                                                                   02284000
                                                                        02286000
PROCEDURE BCONVERT(BN);                                                 02288000
  VALUE BN;  INTEGER BN;                                                02290000
    OPTION PRIVILEGED, UNCALLABLE;                                      02292000
  BEGIN  << CONVERTS AND PRINTS THE BINARY NUMBER BN >>                 02294000
    TOS := BN;                                                          02296000
    ASMB(ZERO,ZROX);                                                    02298000
    TOS := TOS&DLSR(2);  << GET READY >>                                02300000
                                                                        02302000
    WHILE X<6 DO   << CONVERT TO ASCII AND PRINT >>                     02304000
      BEGIN                                                             02306000
        TOS := TOS&DCSL(3);  << GET A DIGIT >>                          02308000
        X := X+1;  << INCREMENT COUNTER >>                              02310000
        PRINTCHAR(S0.(13:3)+"0");                                       02312000
      END;                                                              02314000
                                                                        02316000
  END;  << B CONVERT >>                                                 02318000
                                                                        02320000
PROCEDURE DCONVERT(N);                                                  02322000
  VALUE N;  INTEGER N;                                                  02324000
    OPTION PRIVILEGED, UNCALLABLE;                                      02326000
  << CONVERTS THE NUMBER N TO ASCII DECIMAL AND OUTPUTS >>              02328000
  BEGIN                                                                 02330000
    INTEGER TEMP;                                                       02332000
                                                                        02334000
    TOS := N;  TOS := 1000;                                    <<SD.00>>02336000
    ASMB(DIV , XCH);                                                    02338000
    TEMP := TOS;                                                        02340000
    IF <> THEN PRINTCHAR(TEMP+"0");                                     02342000
    TOS := 100;  ASMB( DIV, XCH);                              <<SD.00>>02344000
    TEMP := TOS;                                                        02346000
    IF <> OR N>99 THEN PRINTCHAR(TEMP+"0");                             02348000
    TOS := 10;  ASMB( DIV, XCH);                               <<SD.00>>02350000
    TEMP:=TOS;                                                 <<SD.00>>02352000
    IF <> OR N>99 THEN PRINTCHAR(TEMP+"0");                    <<SD.00>>02354000
    TOS := TOS + "0";                                                   02356000
    PRINTCHAR( * );                                                     02358000
  END;   << D CONVERT >>                                                02360000
                                                               <<TP.CR>>02366000
PROCEDURE INIT'HPIB(CHANNEL);                                  <<01301>>02368000
VALUE   CHANNEL;                                               <<01301>>02370000
INTEGER CHANNEL;                                               <<01301>>02372000
OPTION PRIVILEGED, UNCALLABLE;                                 <<01301>>02374000
BEGIN                                                          <<01301>>02376000
                                                                        02378000
<<                                                                      02380000
                                                                        02382000
    INIT'HPIB is used by HP3000 Series 33 I/O drivers                   02384000
to initialize a channel on the IMB. The reason for this is              02386000
that the HP-IB drivers on the Series II/III for the IMB                 02388000
Adapter must call procedures to perform HP-IB commands.                 02390000
                                                                        02392000
>>                                                                      02394000
                                                                        02396000
   TOS := CHANNEL;     << CHANNEL NUMBER IN BITS 9,10,11,12 >> <<01301>>02398000
                       << IF ICF 55 THEN MODULE NUMBER>>       <<03018>>02400000
                       << IS IN BITS 7 AND 8 >>                <<03018>>02402000
   ASSEMBLE(INIT);     << INITIALIZE THE CHANNEL >>            <<01301>>02404000
    tos := if = then CCE                                       <<03687>>02406000
           else if < then CCL                                  <<03687>>02408000
           else CCG;                                           <<03687>>02410000
    RSTATUS.CC := tos;                                         <<03687>>02412000
                                                               <<03687>>02414000
END;                                                           <<01301>>02416000
                                                               <<01301>>02418000
$PAGE                                                          <<01301>>02420000
                                                               <<01301>>02422000
INTEGER PROCEDURE RIOC'HPIB(COMMAND,CHANDEV);                  <<03018>>02424000
VALUE   COMMAND,                                               <<03018>>02426000
        CHANDEV;                                               <<03018>>02428000
INTEGER COMMAND,                                               <<03018>>02430000
        CHANDEV;                                               <<03018>>02432000
OPTION PRIVILEGED, UNCALLABLE;                                 <<01301>>02434000
BEGIN                                                          <<01301>>02436000
                                                                        02438000
COMMENT                                                        <<03018>>02440000
                                                                        02442000
    RIOC'HPIB is used by HP3000 Series 33 I/O drivers                   02444000
to read an I/O channel on the IMB. The reason for this is               02446000
that the HP-IB drivers on the Series II/III for the IMB                 02448000
Adapter must call procedures to perform HP-IB commands.                 02450000
                                                                        02452000
    The form of the words COMMAND and CHANDEV are as follows   <<03018>>02454000
COMMAND - BBBBRRRR00000000                                     <<03018>>02456000
CHANDEV - 0000000MMCCCCDDD                                     <<03018>>02458000
B=BUSOP CODE                                                   <<03018>>02460000
R=REGISTER NUMBER                                              <<03018>>02462000
M=MODULE  NUMBER  - note if CPU not ICF 55 then MM=00          <<03018>>02464000
C=CHANNEL NUMBER                                               <<03018>>02466000
D=DEVICE NUMBER                                                <<03018>>02468000
                                                               <<03018>>02470000
If the CPU is not an ICF 55 then COMMAND and CHANDEV will be   <<03018>>02472000
combined into one word before the RIOC instruction is executed <<03018>>02474000
If the CPU is an ICF 55 then CHANDEV and COMMAND are pushed on <<03018>>02476000
stack separately and the instruction RIOA is used instead of   <<03018>>02478000
RIOC.                                                          <<03018>>02480000
ENDCOMMENT;                                                    <<03018>>02482000
                                                                        02484000
   ASMB(PCN);                                                  <<03018>>02486000
   IF TOS=ICF'55 THEN BEGIN                                    <<03018>>02488000
     TOS:=CHANDEV;            << Module, channel and device>>  <<03018>>02490000
     TOS:=COMMAND;            << command and register number>> <<03018>>02492000
     ASMB(RIOA);              << Read the I/O channel>>        <<03018>>02494000
   END ELSE BEGIN                                              <<03018>>02496000
     COMMAND.(7:9):=CHANDEV.(7:9);                             <<03018>>02498000
     TOS := COMMAND;          << IMB READ COMMAND >>           <<03018>>02500000
     ASSEMBLE(RIOC);          << READ THE I/O CHANNEL >>       <<03018>>02502000
   END;                                                        <<03018>>02504000
   IF = THEN RIOC'HPIB := TOS;                                 <<01301>>02506000
    tos := if = then CCE                                       <<03687>>02508000
           else if < then CCL                                  <<03687>>02510000
           else CCG;                                           <<03687>>02512000
    RSTATUS.CC := tos;                                         <<03687>>02514000
                                                               <<03687>>02516000
END;                                                           <<01301>>02518000
                                                               <<01301>>02520000
$PAGE                                                          <<01301>>02522000
                                                               <<01301>>02524000
PROCEDURE WIOC'HPIB(COMMAND,CHANDEV,DATAWORD);                 <<03018>>02526000
VALUE   COMMAND,                                               <<01301>>02528000
        CHANDEV,                                               <<03018>>02530000
        DATAWORD;                                              <<01301>>02532000
INTEGER COMMAND,                                               <<01301>>02534000
        CHANDEV,                                               <<03018>>02536000
        DATAWORD;                                              <<01301>>02538000
OPTION PRIVILEGED, UNCALLABLE;                                 <<01301>>02540000
BEGIN                                                          <<01301>>02542000
                                                                        02544000
COMMENT                                                        <<03018>>02546000
                                                                        02548000
    WIOC'HPIB is used by HP3000 Series 33 I/O drivers                   02550000
to write to an I/O channel on the IMB. The reason for this is           02552000
that the HP-IB drivers on the Series II/III for the IMB                 02554000
Adapter must call procedures to perform HP-IB commands.                 02556000
                                                                        02558000
    The form of the words COMMAND and CHANDEV are as follows   <<03018>>02560000
COMMAND - BBBBRRRR00000000                                     <<03018>>02562000
CHANDEV - 0000000MMCCCCDDD                                     <<03018>>02564000
B=BUSOP CODE                                                   <<03018>>02566000
R=REGISTER NUMBER                                              <<03018>>02568000
M=MODULE  NUMBER  - note if CPU not ICF 55 then MM=00          <<03018>>02570000
C=CHANNEL NUMBER                                               <<03018>>02572000
D=DEVICE NUMBER                                                <<03018>>02574000
                                                               <<03018>>02576000
If the CPU is not an ICF 55 then COMMAND and CHANDEV will be   <<03018>>02578000
combined into one word before the WIOC instruction is executed <<03018>>02580000
If the CPU is an ICF 55 then CHANDEV and COMMAND are pushed on <<03018>>02582000
stack separately and the instruction WIOA is used instead of   <<03018>>02584000
WIOC.                                                          <<03018>>02586000
ENDCOMMENT;                                                    <<03018>>02588000
                                                                        02590000
    ASMB(PCN);                                                 <<03018>>02592000
    IF TOS=ICF'55 THEN BEGIN                                   <<03018>>02594000
      TOS:=CHANDEV;            << module, channel and device>> <<03018>>02596000
      TOS:=COMMAND;            << command and register number>><<03018>>02598000
      TOS:=DATAWORD;           << word to be written>>         <<03018>>02600000
      ASMB(WIOA);              << write to the I/O channel>>   <<03018>>02602000
    END ELSE BEGIN                                             <<03018>>02604000
      COMMAND.(9:7):=CHANDEV.(9:7);                            <<03018>>02606000
      TOS := COMMAND;          << IMB WRITE COMMAND >>         <<03018>>02608000
      TOS := DATAWORD;         << WORD TO BE WRITTEN >>        <<03018>>02610000
      ASSEMBLE(WIOC);          << WRITE TO THE I/O CHANNEL >>  <<03018>>02612000
    END;                                                       <<03018>>02614000
    tos := if = then CCE                                       <<03687>>02616000
           else if < then CCL                                  <<03687>>02618000
           else CCG;                                           <<03687>>02620000
    RSTATUS.CC := tos;                                         <<03687>>02622000
                                                               <<03687>>02624000
END;                                                           <<01301>>02626000
$PAGE                                                                   02628000
                                                                        02630000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<01301>>02632000
  INTEGER ARRAY DITP;    OPTION PRIVILEGED, UNCALLABLE;                 02634000
  <<                                                                    02636000
     THIS PROCEDURE ISSUES A MASTERCLEAR FOLLOWED BY A CLEAR INTERRUPTS 02638000
     ORDER TO THE CONTROLLER IDENTIFIED BY DITP. THE SIO PROGRAM FLAGS  02640000
     AND COUNTERS  ARE CLEANED UP AS IF AND INTERRUPT OCCURED. >>       02642000
  BEGIN                                                                 02644000
    INTEGER POINTER ILTP=Q+1;                                           02646000
 INTEGER CHANNEL = ILTP+1,                                     <<TP.10>>02648000
         SAVE    = CHANNEL+1;                                           02650000
    ENTRY MASTERCLEAR;   << FOR COMPATABILITY REASONS >>       <<01301>>02652000
                                                               <<01301>>02654000
MASTERCLEAR:                                                   <<01301>>02656000
   TOS := DITP(DILTP); << ILT POINTER >>                                02658000
   TOS := PS0(ICNTRL); << ILT CONTROLLER WORD >>               <<00.TP>>02660000
   DISABLE;                                                    <<TP.10>>02662000
    DITP.IOPROG := 0;                                                   02664000
    IF <> THEN   << SIO PROGRAM IN PROGRESS >>                          02666000
      BEGIN                                                             02668000
        HALT'HPIB(DITP);  << HALT I/O PROGRAM >>               <<01301>>02670000
        IF <> THEN                                             <<TP.10>>02672000
          BEGIN << PROGRAM NOT IN WAIT >>                      <<TP.10>>02674000
          ILTP(IFLAG).IGNOREHI := 1; << IGNORE INTERRUPT >>    <<TP.10>>02676000
          TOS := LS0 LAND DRTMASK; << DRT # >>                 <<03018>>02678000
          DO UNTIL GETDRT(S0,DRT3)=0; <<WORD 3 OF DRT>>        <<03018>>02680000
          DEL;                                                 <<TP.10>>02682000
          END; << I/O PROGRAM HALTED >>                        <<TP.10>>02684000
        ASMB(TEST); << CHECK FOR SOFTWARE CHANNEL >>                    02686000
        IF < THEN CHKCHANNELQUE(*,DITP);  << GET NEXT CHANNEL USER >>   02688000
      END ELSE                                                          02690000
      BEGIN << I/O NOT STARTED, CHECK FOR CHANNEL WAITING >>            02692000
          ASMB(TEST);  << CHECK FOR PENDING PROG >>            <<00.TP>>02694000
         IF < THEN                                                      02696000
         BEGIN                                                          02698000
            TOS := TOS.CHANQUE; << CHANNEL # >>                         02700000
            TOS := DEQUEUE(DLINK,CHANNEL);                              02702000
            TOS := S0; << SAVE DITP FOR END TEST >>                     02704000
            IF > THEN << DIT LIST IS NOT EMPTY >>                       02706000
              WHILE S0 <> @DITP DO                                      02708000
              BEGIN << THIS ISN'T THE DIT, KEEP LOOKING >>              02710000
                 ADDTAIL(*,DLINK,CHANNEL); << PUT BACK ON LIST >>       02712000
                 TOS := DEQUEUE(DLINK,CHANNEL); << GET NEXT DIT >>      02714000
                 IF S0 = SAVE THEN                                      02716000
                 BEGIN << END OF LIST, DIT IS NOT IN LIST >>            02718000
                    ADDTAIL(*,DLINK,CHANNEL);                           02720000
                    RETURN;                                             02722000
                 END;                                                   02724000
              END;                                                      02726000
         END;                                                           02728000
      END;                                                              02730000
  END;  << MASTER CLEAR >>                                              02732000
$PAGE                                                                   02738000
                                                                        02740000
PROCEDURE CHECKINDEX(INDX,TB);                                          02742000
  VALUE INDX,TB;  INTEGER INDX;  INTEGER POINTER TB;                    02744000
  OPTION PRIVILEGED, UNCALLABLE;                                        02746000
  BEGIN                                                                 02748000
    INTEGER SIZE;    << SIZE OF ELEMENT >>                              02750000
    LOGICAL FLAG;  << IF SET CHECK MODULO OF SIZE >>                    02752000
                                                                        02754000
    FLAG := 1;   SIZE := TB(1).(8:8);                                   02756000
                                                                        02758000
    IF @TB=@SBUF THEN                                                   02760000
      IF INDX>=0 THEN INDX := INDX-1 ELSE                               02762000
        BEGIN                                                           02764000
          INDX := NOT LOGICAL(INDX);  << NEGATE & SUBTRACT 1 >>         02766000
          FLAG := 0;  << NO MODULO CHECK >>                             02768000
        END;                                                            02770000
                                                                        02772000
     IF @TB=ABSOLUTE(SYSDISCREQTAB) THEN INDX:=INDX-%20 ELSE   <<01637>>02774000
    INDX := INDX-%10;                                                   02776000
    IF NOT(0<=INDX<=SIZE*(TB&LSR(8))) OR                                02778000
    FLAG AND (INDX MOD SIZE)<>0 THEN                                    02780000
      SUDDENDEATH(249);                                                 02782000
  END;  << CHECK INDEX >>                                               02784000
$PAGE                                                                   02786000
$PAGE                                                                   02790000
                                                                        02792000
$INCLUDE INCLHARD                                                       02794000
PROCEDURE HALT'HPIB(DITP);                                     <<01301>>02798000
   INTEGER ARRAY DITP;                                         <<00.TP>>02800000
   OPTION UNCALLABLE,PRIVILEGED;                               <<00.TP>>02802000
BEGIN                                                          <<00.TP>>02804000
logical pointer ILTP = q+1;   << pointer to ILT >>             <<03073>>02806000
   ENTRY HALTIO;    << FOR COMPATABILITY REASONS >>            <<01301>>02808000
                                                               <<01301>>02810000
HALTIO:                                                        <<01301>>02812000
                                                               <<00.TP>>02814000
   TOS := DITP(DILTP); << ILT POINTER >>                       <<00.TP>>02816000
   TOS := PS0(ICNTRL).DRTNUMBER; <<DRT NUMBER>>                <<03018>>02818000
                                                               <<03073>>02820000
   << We will reset the deferred SIOP bits in case a >>        <<03073>>02822000
   << deferred START'HPIB was scheduled previously   >>        <<03073>>02824000
   ILTP(IFLAG).SCP := 0;                                       <<03073>>02826000
                                                               <<03073>>02828000
   ASMB(HIOP);        << HALT I/O INSTRUCTION >>               <<00.TP>>02830000
   IF = THEN TOS := CCE                                        <<TP.14>>02832000
     ELSE IF > THEN TOS := CCG ELSE BEGIN                      <<TP.14>>02834000
                                    PUTDRT(S0,DRT3,0);         <<03018>>02836000
                         <<PUT 0 IN WORD 3 OF DRT>>            <<03018>>02838000
       << Print NON-RESPONDING DEVICE DRT#n on console >>      <<03073>>02840000
       IOMESSAGE(1,NON'RESP'DEV'MSG,%10000,S0,,,,,OPCONSOLE);  <<03073>>02842000
                                    TOS := CCL;                <<TP.14>>02844000
                                    END;                       <<TP.14>>02846000
   RSTATUS.CC := TOS;                                          <<TP.14>>02848000
END;                                                           <<00.TP>>02850000
$PAGE "STARTIO     I/O PROGRAM ROUTINE"                                 02852000
PROCEDURE STARTIO(DITP,SIOP,QUEUE);                                     02856000
VALUE QUEUE;                                                            02858000
INTEGER ARRAY DITP,SIOP;                                                02860000
LOGICAL QUEUE;                                                          02862000
OPTION PRIVILEGED,UNCALLABLE;                                           02864000
BEGIN                                                                   02866000
INTEGER POINTER                                                <<00.TP>>02868000
   ILTP        = Q+1;                                          <<00.TP>>02870000
INTEGER                                                        <<00.TP>>02872000
   CONTROL     = ILTP+1,                                       <<00.TP>>02874000
   CHANNEL     = CONTROL+1;                                    <<00.TP>>02876000
                                                               <<03088>>02878000
<<*************** Returned Condtion Codes *******************>><<03088>>02880000
<<  CCE - SIOP was successfully issued                       >><<03088>>02882000
<<  CCG - Failed to issue SIOP (Non-resp DRT)                >><<03088>>02884000
<<  CCL - SIOP deferred due to queuing on software channel   >><<03088>>02886000
<<***********************************************************>><<03088>>02888000
                                                               <<03088>>02890000
ENTRY  START'HPIB;  << HPIB DRIVERS CALL THIS >>                        02892000
                                                               <<00.TP>>02894000
                                                               <<00.TP>>02896000
START'HPIB:                                                             02898000
   TOS := DITP(DILTP);   << ILTP >>                            <<00.TP>>02900000
   TOS := ILTP(ICNTRL); << CONTROL >>                          <<00.TP>>02902000
   TOS := S0.CHANQUE;   << CHANNEL >>                          <<00.TP>>02904000
                                                               <<03068>>02906000
   << If this is a restart of a channel program due to >>      <<03068>>02908000
   << a wait for HIOP to complete, bypass queuing code >>      <<03068>>02910000
   ILTP(IFLAG).SCP := 0;                                       <<03068>>02912000
   if = then                                                   <<03068>>02914000
   IF QUEUE THEN << NORMAL PROGRAM START >>                    <<00.TP>>02916000
   IF LOGICAL(CONTROL)&CSL(1) THEN                             <<00.TP>>02918000
   BEGIN << MULTI-CONTROLLER CHANNEL RESOURCE >>               <<00.TP>>02920000
      DISABLE;                                                 <<00.TP>>02922000
      IF BUSY(CHANNEL) <> 0 THEN                               <<00.TP>>02924000
      BEGIN                                                    <<00.TP>>02926000
         ADDTAIL(DITP,DLINK,CHANNEL);                          <<00.TP>>02928000
                                                               <<03088>>02930000
         << Save SIOP start address in ILT >>                  <<03088>>02932000
         ILTP(ICPGM) := @SIOP;                                 <<03088>>02934000
                                                               <<03088>>02936000
         << Turn off IAK bit in DIT so SIODM will not >>       <<03088>>02938000
         << fire-off I/O again.                       >>       <<03088>>02940000
         DITP.IAK := 0;                                        <<03088>>02942000
                                                               <<03088>>02944000
         ENABLE;                                               <<00.TP>>02946000
         TOS := CCL;                                           <<00.TP>>02948000
         GO OUT;                                               <<00.TP>>02950000
      END;                                                     <<00.TP>>02952000
      BUSY(CHANNEL) := @DITP;                                  <<00.TP>>02954000
      ENABLE;                                                  <<00.TP>>02956000
   END;                                                        <<00.TP>>02958000
                                                               <<03068>>02960000
   DISABLE;                                                    <<TP.10>>02962000
   DITP.IAK := 0;  << Turn off interrupt ack >>                <<03088>>02964000
   HALT'HPIB(DITP); << HALT CURRENT PROGRAM >>                 <<01301>>02966000
   IF > THEN                                                   <<TP.10>>02968000
     BEGIN                                                     <<TP.10>>02970000
     << Wait for HIOP interrupt & restart from GIP >>          <<03068>>02972000
     tos := ILTP(IFLAG);                                       <<03068>>02974000
     tos.SCP := 1;          << Turn on start chanp flag >>     <<03068>>02976000
     << If QUEUED, we must set flag to start deferred SIOP >>  <<03669>>02978000
     << as QUEUED.                                         >>  <<03669>>02980000
     tos.SQ := if QUEUE then 1 else 0;                         <<03669>>02982000
     tos.IGNOREHI := 1;     << Tell GIP to ignore HIOP int >>  <<03068>>02984000
     ILTP(X) := tos;                                           <<03068>>02986000
     ILTP(ICDP) := @DITP;                                      <<03068>>02988000
     ILTP(ICPGM ) := @SIOP;                                    <<03068>>02990000
     tos := CCE;    << Tell driver all went OK >>              <<03068>>02992000
     go to OUT;                                                <<03068>>02994000
                                                               <<03068>>02996000
     END;                                                      <<TP.10>>02998000
   <<  THERE USED TO BE AN ENABLE  >>                                   03000000
   << NEED TO CHECK RESULTS AFTER TIMEOUT >>                   <<00.TP>>03002000
   TOS := CONTROL.DRTNUMBER; << DRT NUMBER >>                  <<03018>>03004000
                                                               <<03687>>03006000
   << Clear any pending interrupts >>                          <<03687>>03008000
   ASMB(dup,stax);  << Put copy of DRT in X-register >>        <<03687>>03010000
   tos := %006000;  << Write register "C" on GIG     >>        <<03687>>03012000
   tos := X;        << IMB, CHANNEL, & (device)      >>        <<03687>>03014000
   tos := logical(X) land %7;                                  <<03687>>03016000
   WIOC'HPIB(*,*,*);                                           <<03687>>03018000
   if < then                                                   <<03687>>03020000
     go to IO'FAILURE;                                         <<03687>>03022000
                                                               <<03687>>03024000
   TOS := @SIOP + SYSDB;                                       <<00.TP>>03026000
                                                               <<03662>>03028000
  << Log SIOP event in MMSTAT table        >>                  <<03662>>03030000
  << Word 0 - MMSTAT event 193             >>                  <<03662>>03032000
  <<      1 - DRT number                   >>                  <<03662>>03034000
  <<      2 - SIOP address                 >>                  <<03662>>03036000
  <<      3 - LSW of timer                 >>                  <<03662>>03038000
  ASMB(ddup);   << Duplicate DRT & SIOP address >>             <<03662>>03040000
  tos := 193;   << Event number                 >>             <<03662>>03042000
  ASMB(cab,cab);<< Put in the right order       >>             <<03662>>03044000
  tos := TIMER;                                                <<03662>>03046000
  ASMB(delb);   << Remove high-order word of timer >>          <<03662>>03048000
  MMSTAT(*,*,*,*);                                             <<03662>>03050000
                                                               <<03068>>03052000
                                                               <<03088>>03054000
   STARTSIO;           << START I/O INSTRUCTION >>             <<00.TP>>03056000
   IF = THEN                                                   <<00.TP>>03058000
   BEGIN << PROGRAM STARTED >>                                 <<00.TP>>03060000
      IF QUEUE THEN                                            <<00.TP>>03062000
      BEGIN                                                    <<00.TP>>03064000
         DITP.IOPROG := 1; << SET I/O PROGRAM IN PROGRESS >>   <<00.TP>>03066000
         ILTP(IFLAG).WAITPROG := 0; << CLEAR WAIT PROG FLAG >> <<00.TP>>03068000
         TOS := @DITP;                                         <<00.TP>>03070000
      END ELSE                                                 <<00.TP>>03072000
      BEGIN                                                    <<00.TP>>03074000
         ILTP(IFLAG).WAITPROG := 1; << WAIT PROGRAM STARTED >> <<00.TP>>03076000
         TOS := 0;                                             <<00.TP>>03078000
      END;                                                     <<00.TP>>03080000
      ILTP(ICDP) := TOS; << SET CURRENT DIT POINTER IN ILT >>  <<00.TP>>03082000
      TOS := CCE;                                              <<00.TP>>03084000
OUT:                                                                    03086000
      RSTATUS.CC := TOS;                                                03088000
      RETURN;                                                           03090000
   END;                                                                 03092000
                                                                        03094000
   IF < THEN                                                   <<TP.CR>>03096000
     BEGIN << BAD DRT, RETURN I/O FAILURE >>                   <<TP.CR>>03098000
IO'FAILURE:                                                    <<03687>>03100000
     PUTDRT(CONTROL.DRTNUMBER,DRT3,0);                         <<03018>>03102000
                    << CLEAR LAST WORD OF DRT >>               <<03018>>03104000
     << Print NON-RESPONDING DEVICE DRT#n on console >>        <<03073>>03106000
     IOMESSAGE(1,NON'RESP'DEV'MSG,%10000,CONTROL.DRTNUMBER,,,,,<<03073>>03108000
               OPCONSOLE);                                     <<03073>>03110000
     TOS := CCG;                                               <<TP.CR>>03112000
     GO OUT;                                                   <<TP.CR>>03114000
     END;                                                      <<TP.CR>>03116000
                                                                        03118000
   IF QUEUE AND LOGICAL(CONTROL)&CSL(1) THEN                   <<00.TP>>03120000
   CHKCHANNELQUE(CONTROL,DITP);                                <<00.TP>>03122000
   TOS := CCG;                                                          03124000
   GO TO OUT;                                                           03126000
END;                                                                    03128000
$PAGE "GIP  -  GENERAL INTERRUPT PROCESSOR"                             03132000
PROCEDURE GIP'HPIB;                                            <<01301>>03134000
OPTION PRIVILEGED,UNCALLABLE;                                           03136000
BEGIN                                                                   03138000
INTEGER                                                                 03140000
   CDP         = DB+ICDP,                                      <<00.TP>>03142000
   CPVA0       = DB+ICPVA0,                                    <<00.TP>>03144000
   DRTN        = Q+3,                                                   03146000
   FLAG        = DB+IFLAG,                                     <<00.TP>>03148000
   STAP        = DB+ISTAP,                                     <<00.TP>>03150000
   UNIT        = DB+IUNIT;                                     <<00.TP>>03152000
INTEGER POINTER                                                         03156000
   DITP        = DRTN+1,                                       <<03018>>03158000
   ILTP        = DITP+1;                                       <<00.TP>>03160000
LOGICAL                                                        <<TP.CR>>03162000
   ABORTED     = ILTP+1;                                       <<TP.CR>>03164000
INTEGER                                                        <<03018>>03166000
   I            = ABORTED+1,                                   <<03018>>03168000
   TEMP         = I+1,                                         <<03018>>03170000
   CPUNUM       = TEMP+1;                                      <<03018>>03172000
LOGICAL ARRAY                                                  <<03018>>03174000
   NEWMASK(*)  =CPUNUM+1,                                      <<03018>>03176000
   OLDMASK(*)   =NEWMASK+4;                                    <<03018>>03178000
LOGICAL POINTER                                                         03180000
   DITPL       = DITP;                                                  03182000
LOGICAL ARRAY LMASK(0:15) = PB :=     0,%100000,%140000,       <<03018>>03184000
%160000,%170000,%174000,%176000,%177000,%177400,%177600,       <<03018>>03186000
%177700,%177740,%177760,%177770,%177774,%177776;               <<03018>>03188000
ENTRY GIP;     << FOR COMPATABILITY REASONS >>                 <<01301>>03190000
                                                               <<03068>>03192000
<< Subroutine to set SYSDB and log event in MMSTAT >>          <<03068>>03194000
subroutine SETDB'LOG;                                          <<03068>>03196000
begin                                                          <<03068>>03198000
                                                               <<03068>>03200000
<< Set SYSDB >>                                                <<03068>>03202000
tos := 0;                                                      <<03068>>03204000
tos := SYSDB;                                                  <<03068>>03206000
ASMB(xchd);                                                    <<03068>>03208000
DDEL;                                                          <<03068>>03210000
                                                               <<03068>>03212000
<< log event to MMSTAT >>                                      <<03068>>03214000
tos := X;    << save X register >>                             <<03068>>03216000
tos := 192;                                                    <<03068>>03218000
tos := GETDRT(DRTN,0)-SYSDB-ILTP(ISIOP); << @ SIOP rel >>      <<03068>>03220000
tos.(0:7) := DITP(DLDEV).DLDEVN;   << LDEV >>                  <<03068>>03222000
tos := WA0(ILTP(ISTAP ));  << Save controller status >>        <<03068>>03224000
tos := TIMER;                                                  <<03068>>03226000
ASMB(delb);                << LSW of TIMER >>                  <<03068>>03228000
                                                               <<03068>>03230000
MMSTAT(*,*,*,*);                                               <<03068>>03232000
                                                               <<03068>>03234000
X := tos;  << restore X register >>                            <<03068>>03236000
end;                                                           <<03068>>03238000
                                                                        03240000
GIP:                                                           <<01301>>03242000
   PUSH(DB);                                                   <<00.TP>>03246000
   TOS := TOS - %1000; << ILTP >>                              <<00.TP>>03248000
   TOS := FALSE; << ABORTED SET TO FALSE >>                    <<TP.CR>>03250000
   ASMB(ADDS 11);  <<LEAVE SPACE FOR I,TEMP,CPUNUM&MASKARRAYS>><<03018>>03252000
   ASMB(PCN);                                                  <<03018>>03254000
   CPUNUM:=TOS;                                                <<03018>>03256000
   IF CPUNUM=ICF'55 THEN                                       <<03018>>03258000
    BEGIN                                                      <<03018>>03260000
      ASMB(RMSK);                                              <<03018>>03262000
      OLDMASK(0):=TOS; << MOST SIGNIFICANT PART OF MASK>>      <<03018>>03264000
      OLDMASK(1):=TOS;                                         <<03018>>03266000
      OLDMASK(2):=TOS;                                         <<03018>>03268000
      OLDMASK(3):=TOS; <<LEASTSIGNIFICANT PART OF MASK>>       <<03018>>03270000
      TEMP:=DRTN&LSR(3); <<IOA AND CHANNEL #>>                 <<03018>>03272000
      I:=0;                                                    <<03018>>03274000
      WHILE TEMP>15 DO                                         <<03018>>03276000
      BEGIN                                                    <<03018>>03278000
         NEWMASK(I):=%177777;                                  <<03018>>03280000
         I:=I+1;                                               <<03018>>03282000
         TEMP:=TEMP-16;                                        <<03018>>03284000
      END;                                                     <<03018>>03286000
      NEWMASK(I):=LMASK(TEMP);                                 <<03018>>03288000
      I:=I+1;                                                  <<03018>>03290000
      WHILE I<4 DO                                             <<03018>>03292000
      BEGIN                                                    <<03018>>03294000
         NEWMASK(I):=0;                                        <<03018>>03296000
         I:=I+1;                                               <<03018>>03298000
      END;                                                     <<03018>>03300000
      I:=3;                                                    <<03018>>03302000
      WHILE I>=0 DO                                            <<03018>>03304000
      BEGIN                                                    <<03018>>03306000
         TOS:=NEWMASK(I) LAND OLDMASK(I);                      <<03018>>03308000
         I:=I-1;                                               <<03018>>03310000
      END;                                                     <<03018>>03312000
      ASMB(SMSK);                                              <<03018>>03314000
      IF <> THEN SUDDENDEATH(205);<<if SMSK fails, we're sunk>><<03762>>03316000
    END                                                        <<03018>>03318000
   ELSE                                                        <<03018>>03320000
    BEGIN                                                      <<03018>>03322000
      ASMB(RMSK);                                              <<03018>>03324000
      OLDMASK:=TOS;                                            <<03018>>03326000
      X := DRTN&LSR(3);     << DRT NUMBER >>                   <<03018>>03328000
      TOS := OLDMASK LAND LMASK(X);                            <<03018>>03330000
      ASMB(SMSK);           << DISABLE LOWER PRIORITY INTERRUPT<<03018>>03332000
      IF <> THEN SUDDENDEATH(205);<<if SMSK fails, we're sunk>><<03762>>03334000
    END;                                                       <<03018>>03336000
   ENABLE;                                                              03338000
   FLAG.IGNOREHI := 0;                                         <<TP.10>>03340000
   << If we expected HIOP interrupt, we must check to >>       <<03068>>03342000
   << see if we should attempt to restart the channel >>       <<03068>>03344000
   << program for this device.                        >>       <<03068>>03346000
   if <> then                                                  <<03068>>03348000
     begin                                                     <<03068>>03350000
                                                               <<03068>>03352000
     << Set to SYSDB and log to MMSTAT >>                      <<03068>>03354000
     @DITP := CDP;   << Set DIT pointer to current DITP >>     <<03068>>03356000
     SETDB'LOG;                                                <<03068>>03358000
                                                               <<03068>>03360000
     << check to see if channel program should be restarted >> <<03068>>03362000
     if ILTP(IFLAG).SCP = 1 then                               <<03068>>03364000
       begin                                                   <<03068>>03366000
       ILTP<<(ICPVA0)>> := 0; << Zero HIOP status >>           <<03068>>03368000
       tos := @DITP;   << DIT to fire I/O against >>           <<03068>>03370000
       tos := ILTP(ICPGM); << Channel pgm start adr >>         <<03068>>03372000
       ILTP(X) := 0;   << Zero out start address  >>           <<03068>>03374000
       START'HPIB(*,*,if ILTP(IFLAG).SQ = 1 then true          <<03669>>03376000
                                            else false);       <<03669>>03378000
       end;                                                    <<03068>>03380000
                                                               <<03068>>03382000
     go to LEAVE;                                              <<03068>>03384000
                                                               <<03068>>03386000
     end;                                                      <<03068>>03388000
                                                               <<03068>>03390000
   IF CDP = 0 THEN                                             <<00.TP>>03392000
     BEGIN << WAIT PROGRAM COMPLETION >>                       <<TP.CR>>03394000
     FLAG.WAITPROG := 0; << RESET INDICATOR >>                 <<TP.CR>>03396000
     IF CPVA0 <> 0 AND UNIT <> 0 THEN                          <<TP.CR>>03398000
      << CHANNEL FAILURE ON MULTI-UNIT WAIT PROGRAM >>         <<TP.CR>>03400000
       BEGIN << IDLE CHANNEL PROGRAM ABORTED >>                <<TP.CR>>03402000
RESTARTIDLEP:                                                           03404000
       ABORTED := TRUE;                                        <<TP.CR>>03406000
                                                               <<03073>>03408000
       << Unit 0 may not be configured for this controller, so <<03073>>03410000
       << we must use the highest-configured unit for the idle <<03073>>03412000
       @DITP := DITPA(FLAG.HCUNIT);                            <<03073>>03414000
                                                               <<03073>>03416000
       CPVA0 := 0;                                             <<TP.CR>>03418000
       END                                                     <<TP.CR>>03420000
     ELSE                                                      <<TP.CR>>03422000
       BEGIN << GET UNIT NUMBER FROM STATUS AREA >>            <<TP.CR>>03424000
       TOS := WA0(STAP-@ILTP); << GET CONTROLLER STATUS >>     <<TP.CR>>03426000
       WA0(X) := 0;    << Zero out status word-disc dvr >>     <<03687>>03428000
       TOS := UNIT; << EXTRACT INSTRUCTION >>                  <<TP.CR>>03430000
       IF <> THEN ASMB(XCH; XEQ 1); << ISOLATE UNIT MUN >>     <<TP.CR>>03432000
      ASMB(DELB,DUP); << DELETE UNIT EXTRACT INSTR >>                   03434000
       << Check and see if UNIT is configured >>               <<03662>>03436000
       X := tos;     << Store UNIT number in index register >> <<03662>>03438000
       @DITP := DITPA(X);   << Get DIT pointer >>              <<03662>>03440000
       if <= or             << Invalid DIT pointer >>          <<03662>>03442000
          tos > FLAG.HCUNIT then << Beyond highest unit conf.>><<03662>>03444000
         begin   << Print out message >>                       <<03662>>03446000
         << Set SYSDB >>                                       <<03662>>03448000
         tos := 0;                                             <<03662>>03450000
         tos := SYSDB;                                         <<03662>>03452000
         ASMB(xchd);                                           <<03662>>03454000
         << Print message >>                                   <<03662>>03456000
         IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,          <<03662>>03458000
                   OPCONSOLE);                                 <<03662>>03460000
         << Put back DB >>                                     <<03662>>03462000
         ASMB(xchd;ddel);                                      <<03662>>03464000
         go to RESTARTIDLEP;                                   <<03662>>03466000
         end;                                                  <<03662>>03468000
       END;                                                    <<TP.CR>>03472000
     END                                                       <<TP.CR>>03474000
   ELSE @DITP := CDP; << USE CURRENT DIT POINTER >>            <<TP.CR>>03476000
SETDB'LOG;                                                     <<03068>>03480000
   TOS := DITP;                                                <<00.TP>>03482000
   TOS.IAK := 1;                                               <<00.TP>>03484000
   TOS.IOPROG := 0;                                            <<00.TP>>03486000
   DITP := TOS; << ACKNOWLEDGE INTERRUPT >>                    <<00.TP>>03488000
   IF ILTP(ICDP) = 0 THEN                                               03490000
     BEGIN << WAIT PROGRAM, CHECK DEVREC >>                    <<TP.CR>>03492000
     IF DITP.STATEF = 0 AND NOT ABORTED THEN DITP.STATEF := 6; <<TP.CR>>03494000
     END                                                       <<TP.CR>>03496000
   ELSE                                                        <<TP.CR>>03498000
     BEGIN                                                     <<TP.CR>>03500000
     X := ILTP(ICNTRL);  << CHANNEL RESOURCE ? >>              <<TP.CR>>03502000
     IF < THEN CHKCHANNELQUE(X,DITP);                          <<TP.CR>>03504000
     END;                                                      <<TP.CR>>03506000
   AWAKEIO(DITP,NOIMPEDE);  << CALL MONITOR FOR INTERRUPTING DEVICE >>  03508000
LEAVE:                                                                  03510000
   DISABLE;                                                    <<01868>>03512000
   IF CPUNUM=ICF'55 THEN                                       <<03018>>03514000
    BEGIN                                                      <<03018>>03516000
      I:=3;                                                    <<03018>>03518000
      WHILE I>=0 DO                                            <<03018>>03520000
      BEGIN                                                    <<03018>>03522000
         TOS:=OLDMASK(I);                                      <<03018>>03524000
         I:=I-1;                                               <<03018>>03526000
      END;                                                     <<03018>>03528000
      ASMB(SMSK);                                              <<03018>>03530000
      IF <> THEN SUDDENDEATH(205);<<if SMSK fails, we're sunk>><<03762>>03532000
    END                                                        <<03018>>03534000
   ELSE                                                        <<03018>>03536000
    BEGIN                                                      <<03018>>03538000
      TOS := OLDMASK;                                          <<03018>>03540000
      ASMB( SMSK );  << RESET INTERRUPT MASK >>                <<03018>>03542000
      IF <> THEN SUDDENDEATH(205);<<if SMSK fails, we're sunk>><<03762>>03544000
    END;                                                       <<03018>>03546000
   ASMB( IXIT );                                                        03548000
END;                                                                    03550000
$PAGE "COMMUNICATIONS PROCEDURES"                                       03554000
$PAGE                                                                   03558000
<< Procedure LDEVNOTRDY re-written & moved to INCLHARD >>      <<03687>>03560000
$PAGE "MEASUREMENT PROCEDURES"                                          03564000
                                                                        03566000
PROCEDURE INITIO (FLAG);                                       <<00.05>>03568000
   VALUE   FLAG;                                               <<00.05>>03570000
   LOGICAL FLAG;                                               <<00.05>>03572000
   OPTION  PRIVILEGED,UNCALLABLE;                              <<00.05>>03574000
   << INITIALISE THE I/O SYSTEM. CALLED BY PROGEN AS SOON  >>  <<00.05>>03576000
   << AS IT TAKES CONTROL IN TWO PHASES                    >>  <<00.05>>03578000
   << FLAG = 2 ==> INIT SYSTEM DISC  >>                        <<MPEIV>>03580000
   << FLAG = 1 ==> INIT CONSOLE AND SYSTEM VOLUMES>>           <<MPEIV>>03582000
   << FLAG = 0 ==> INITIALIZE EVERYTHING ELSE >>               <<MPEIV>>03584000
   BEGIN                                                       <<00.05>>03586000
   INTEGER I,SPEED,TYPE,CONSOLE,J,TEMP;                        <<03018>>03588000
   LOGICAL ARRAY MASK(0:3);                                    <<03018>>03590000
INTEGER PROCID, PLABEL;                                        <<03651>>03592000
BYTE ARRAY LYNX'GENESIS(0:9) = Q;<<MUST BE Q RELATIVE/DIRECT>> <<03651>>03594000
   EQUATE SYSDISC = 1;                                         <<00.05>>03596000
   EQUATE DLAST   = 23; << DIT INDEX TO SPEED CODE AND TERM TYPE >>     03598000
   DEFINE TERMTYPE = (0:7)#,                                   <<00.05>>03600000
          SPEEDCF  = (10:6)#,  << SPEED CODE FIELD OF DLAST >>          03602000
          LDEVF    = (8:8)#;                                   <<00.05>>03604000
   INTEGER CONSOL = DB+%74;                                    <<00.05>>03606000
   INTEGER POINTER DITP;                                       <<00.05>>03608000
   INTEGER POINTER DLTP,ILTP;                                  <<00.05>>03610000
   INTEGER ARRAY SPEEDCODE(4:15) = PB :=                                03612000
      14,20,60,240,960,480,180,120,240,30,15,10;                        03614000
                                                               <<00.05>>03616000
   SUBROUTINE INITDEV;                                         <<00.05>>03618000
      BEGIN                                                    <<00.05>>03620000
      @DITP := LPDT(I&LSL(1));                                 <<00.05>>03622000
      IF > THEN                                                <<00.05>>03624000
         BEGIN  <<REAL DEVICE>>                                <<00.05>>03626000
         TOS := @DITP;                                         <<00.05>>03628000
         @DLTP := DITP(DDLTP);                                 <<00.05>>03630000
         @ILTP := DITP(DILTP);                                          03632000
         TOS := DLTP(7);                                       <<00.05>>03634000
         IF <> THEN ASSEMBLE(PCAL 0) ELSE DDEL;                <<00.05>>03636000
         ASMB(PCN);                                            <<03018>>03638000
         IF TOS=ICF'55 THEN BEGIN <<SPECIAL FOR ICF55>>        <<03018>>03640000
            J:=0;                                              <<03018>>03642000
            WHILE J<=3 DO BEGIN                                <<03018>>03644000
               MASK(J):=ABS(IMASK55+J);                        <<03018>>03646000
               J:=J+1;                                         <<03018>>03648000
            END;                                               <<03018>>03650000
            TOS:=ILTP(ICNTRL).DRTNUMBER;  <<DRTN>>             <<03018>>03652000
            TEMP:=TOS&LSR(3);  <<IOA AND CHANNEL>>             <<03018>>03654000
            J:=TEMP.(10:2); <<IMB #>>                          <<03018>>03656000
            TOS:=MASK(J);                                      <<03018>>03658000
            X:=TEMP.(12:4); <<CHANNEL #>>                      <<03018>>03660000
            ASMB(TSBC 0,X);                                    <<03018>>03662000
            MASK(J):=TOS;                                      <<03018>>03664000
            J:=3;                                              <<03018>>03666000
            WHILE J>=0 DO                                      <<03018>>03668000
            BEGIN                                              <<03018>>03670000
               TOS:=MASK(J);                                   <<03018>>03672000
               J:=J-1;                                         <<03018>>03674000
            END;                                               <<03018>>03676000
            ASMB(SMSK);                                        <<03018>>03678000
            IF <> THEN SUDDENDEATH(205);                       <<03762>>03680000
                                  <<if SMSK fails, we're sunk>><<03762>>03682000
         END ELSE   <<NOW FOR NON ICF 55>>                     <<03018>>03684000
         BEGIN                                                 <<03018>>03686000
               TOS := ABSOLUTE(IMASK); <<INTERRUPT MASK WORD>> <<03018>>03688000
               TOS := ILTP(ICNTRL).DRTNUMBER;   << DRTN  >>    <<03018>>03690000
               X := TOS&LSR(3);    <<CHANNEL #>>               <<03018>>03692000
               ASMB(TSBC 0,X);     <<SET BIT IN MASK WORD>>    <<03018>>03694000
               ASMB(SMSK);<<ENABLE INTERUPTS FOR THIS DEVICE >><<03018>>03696000
               IF <> THEN SUDDENDEATH(205);                    <<03762>>03698000
                                  <<if SMSK fails, we're sunk>><<03762>>03700000
         END;                                                  <<03018>>03702000
         END;                                                           03704000
      END;                                                     <<00.05>>03706000
   IF FLAG=2 THEN                                              <<MPEIV>>03708000
      BEGIN  <<JUST INITAILIZE THE SYSTEM DISC>>               <<MPEIV>>03710000
            I := 1;                                            <<02628>>03712000
            DO                                                 <<02628>>03714000
            BEGIN <<   INITIALIZE ALL DISCS   >>               <<02628>>03716000
               CHECKLDEV(I);                                   <<02628>>03718000
               IF = AND CARRY THEN                             <<02628>>03720000
               BEGIN << IT'S A DISC >>                         <<02628>>03722000
                INITDEV;  << INIT ALL DISC:  MAY HAVE V. M. >> <<02628>>03724000
               END;                                            <<02628>>03726000
            END UNTIL (I := I + 1) > LPDT.MAXENTRY;            <<02628>>03728000
      END                                                      <<MPEIV>>03730000
   ELSE                                                        <<MPEIV>>03732000
      BEGIN  <<INITIALIZE SYSTEM CONSOLE OR OTHER DEVICES>>    <<MPEIV>>03734000
   SETSYSDB;                                                   <<00.05>>03736000
   CONSOLE := CONSOL.LDEVF;                                    <<00.05>>03738000
      IF FLAG = 1 THEN                                         <<MPEIV>>03740000
         BEGIN  <<INITIALIZE SYSTEM VOLUMES AND CONSOLE>>      <<MPEIV>>03742000
      I := CONSOLE;                                            <<00.05>>03744000
      INITDEV;                                                 <<00.05>>03746000
      IF POWERFAIL=0 THEN                                               03748000
        BEGIN << NO NEED TO DO ON POWER FAILURE >>                      03750000
        CONSOL:=CONSOLE;                                       <<03019>>03752000
      IF CHANNEL'ID(CONSOLE) <> LYNX'TYPE THEN                 <<03028>>03754000
         BEGIN  <<CONSOLE MUST BE ADCC>>                       <<03019>>03756000
        SPEED := SPEEDCODE(DITP(DLAST).SPEEDCF);                        03758000
        TYPE := DITP(DLAST).TERMTYPE;                                   03762000
        TOS := ATTACHIO(CONSOLE,0,0,0,24,0,TYPE,SPEED,1);               03764000
        DEL;                                                            03766000
        IF TOS.(13:3) <> 1 THEN  <<INVALID TERMTYPE,TRY UNDEF>>         03768000
           ATTACHIO(CONSOLE,0,0,0,24,0,%37,SPEED,1);                    03770000
         END;   <<ADCC CONSOLE>>                               <<03651>>03772000
         <<IF LYNX SOFTWARE PRESENT, CALL IT TO BUILD TABLES >><<03651>>03774000
         <<FOR ANY DEVICES CONFIGURED WITH LYNX DRIVERS      >><<03651>>03776000
         RESETDB(-1);                                          <<03651>>03778000
         MOVE LYNX'GENESIS := "LYNX'GEN ";                     <<03651>>03780000
         PROCID := LOADPROC( LYNX'GENESIS, 0, PLABEL);         <<03651>>03782000
         IF =                                                  <<03651>>03784000
            THEN BEGIN   <<LYNX SOFTWARE THERE>>               <<03651>>03786000
            TOS := PLABEL;                                     <<03651>>03788000
            ASSEMBLE ( PCAL 0 );                               <<03651>>03790000
            UNLOAD(PROCID);                                    <<03651>>03792000
            END;                                               <<03651>>03794000
                                                               <<03651>>03796000
         END;   <<END OF CONSOLE INITIALIZATION>>              <<03651>>03798000
      END                                                      <<00.05>>03800000
   ELSE                                                        <<00.05>>03802000
      BEGIN  <<INIT ALL OTHER DEVICES>>                        <<00.05>>03804000
      I := LPDT(0).(0:8);                                      <<00.05>>03806000
      DO                                                       <<00.05>>03808000
         IF I<>CONSOLE AND I<>SYSDISC THEN INITDEV             <<00.05>>03810000
      UNTIL (I := I-1) = 0;                                    <<00.05>>03812000
      END;                                                     <<00.05>>03814000
   RESETDB(-1);                                                <<00.05>>03816000
      END;                                                     <<MPEIV>>03818000
   END;  <<INITIO>>                                            <<00.05>>03820000
 DOUBLE PROCEDURE TIMER;                                       <<01431>>03824000
 OPTION PRIVILEGED;                                            <<01431>>03826000
                                                               <<01431>>03828000
 COMMENT:  RETURNS A UNSIGNED, 31 BITS DOUBLE WORD.            <<01431>>03830000
                                                               <<01431>>03832000
           THIS QUANTITY REPRESENTS THE NUMBER OF              <<01431>>03834000
           MILLISECONDS SINCE THE MIDNIGHT PRECEEDING          <<01431>>03836000
           THE LAST SYSTEM COLD LOAD.  THIS QUANTITY           <<01431>>03838000
           WILL BE RESET TO ZERO ON 24-DAY INTERVALS           <<01431>>03840000
           AT EXACTLY 12 O'CLOCK MIDNIGHT.  DETECTION          <<01431>>03842000
           AND CORRECTION OF THIS CASE BETWEEN TWO             <<01431>>03844000
           CALLS TO TIMER (LESS THAN 24 DAYS APART)            <<01431>>03846000
           CAN BE DONE AS FOLLOWS:                             <<01431>>03848000
                                                               <<01431>>03850000
           IF THE CURRENT RETURNED TIMER VALUE IS EQUAL        <<01431>>03852000
           OR SMALLER THAN LAST TIMER VALUE, ADD               <<01431>>03854000
           2073600000 (THE NUMBER OF MS IN 24 DAYS) TO         <<01431>>03856000
           THE RESULT.                                         <<01431>>03858000
                                                               <<01431>>03860000
 NOTE:     THE MILLISECOND COUNT SINCE THE MIDNIGHT            <<01431>>03862000
           PRECEEDING COLD LOAD IS COMPUTED IN NUMBER          <<01431>>03864000
           OF CLOCK TICKS BY ADDING THE COUNT REGISTER         <<01431>>03866000
           OF THE SYSTEM CLOCK WITH THE OVERFLOW COUNTER       <<01431>>03868000
           (TRL(5) AND TRL(6)).  THE PROCEDURE TICK WILL       <<01431>>03870000
           RESET THE COUNT IN TRL EVERY TWENTY FOUR HOURS      <<01431>>03872000
           AND THE NUMBER OF DAYS SINCE COLD LOAD IS STORED    <<01431>>03874000
           IN TRL(3).  TRL(3) IS RESETED EVERY 24 DAYS AND     <<01431>>03876000
           THE BASE JULIAN DATE IS UPDATED ACCORDINGLY.        <<01431>>03878000
 ;                                                             <<01431>>03880000
                                                               <<01431>>03882000
 BEGIN                                                         <<01431>>03884000
                                                               <<01431>>03886000
    LOGICAL S33 := TRUE;                                       <<01431>>03888000
    INTEGER NUM'OF'DAYS, TICK'IN'INT := 1100,                  <<01431>>03890000
            MSW = Q-5, LSW = Q-4;       << RETURN VALUE >>     <<01431>>03892000
    DOUBLE  MS, NUM'OF'TICKS, NUM'TICK'PER'DAY := 944710000D;  <<01431>>03894000
    REAL    TICK'TO'MS := 9.14566375E-2;<<CONVERT TICK TO MS>> <<01431>>03896000
                                                               <<01431>>03898000
    DISABLE;                                                   <<01431>>03900000
    PUSH(STATUS); TOS.(2:1):=0; SET(STATUS);                   <<01431>>03902000
    ASMB(PCN);  << GET CPU # >>                                <<01431>>03904000
    IF TOS <> SERIES'33  THEN                                  <<01431>>03906000
    BEGIN                                                      <<01431>>03908000
       S33 := FALSE;                                           <<01431>>03910000
       NUM'TICK'PER'DAY := MS'PER'DAY;                         <<01431>>03912000
    END;                                                       <<01431>>03914000
    TOS := 0;                                                  <<01431>>03916000
    ASMB(RCCR);                         << COUNT REG VALUE >>  <<01431>>03918000
    IF S33  THEN                                               <<01431>>03920000
    BEGIN                                                      <<01431>>03922000
       TOS := F(TEMPLR);  << LAST UPDATED COUNT REG VALUE >>   <<01431>>03924000
       ASMB(LSUB);                                             <<01431>>03926000
    END;                                                       <<01431>>03928000
    TOS := TRL(5);                                             <<01431>>03930000
    TOS := TRL(6);                                             <<01431>>03932000
    ASMB(DADD; DDUP);                                          <<01431>>03934000
    NUM'OF'DAYS := TRL(3);                                     <<01431>>03936000
    TOS := NUM'TICK'PER'DAY;  << CHECK IF OVER A DAY >>        <<01431>>03938000
    ASMB(DSUB; DDEL);                                          <<01431>>03940000
    IF >=  THEN                                                <<01431>>03942000
    BEGIN                                                      <<01431>>03944000
       NUM'OF'TICKS := TOS - NUM'TICK'PER'DAY;                 <<01431>>03946000
       NUM'OF'DAYS := IF NUM'OF'DAYS = 23  THEN  0  ELSE       <<01431>>03948000
                      NUM'OF'DAYS + 1;                         <<01431>>03950000
    END  ELSE  NUM'OF'TICKS := TOS;                            <<01431>>03952000
    MS := IF S33  THEN  FIXR(REAL(NUM'OF'TICKS)*TICK'TO'MS)    <<01431>>03954000
          ELSE  NUM'OF'TICKS;                                  <<01431>>03956000
                                                               <<01431>>03958000
 COMMENT:  THE ABOVE CALCULATION IS TO GET THE TOTAL TIME      <<01431>>03960000
           SINCE LAST CLOCK INTERRUPT.  FOR SERIES 33, ALL THE <<01431>>03962000
           VALUES USED ARE IN NUMBER OF TICKS, HENCE MUST BE   <<01431>>03964000
           CONVERTED TO MILLISECONDS FOR THE RETURN VALUE OF   <<01431>>03966000
           TIMER.  THE MULTIPLIER WE USED IS .0914566375, WHICH<<01431>>03968000
           IS 1024/(INTERNAL CLOCK FRENQUENCY IN KHZ).  NOTE,  <<01431>>03970000
           IF THE CLOCK FRENQUENCY CHANGES, THEN THIS NUMBER   <<01431>>03972000
           MUST BE ALSO CHANGED ACCORDINGLY.                   <<01431>>03974000
 ;                                                             <<01431>>03976000
    TOS := DOUBLE(NUM'OF'DAYS)*MS'PER'DAY + MS;                <<01431>>03978000
    LSW := TOS;                                                <<01431>>03980000
    MSW := TOS.(1:15);                                         <<01431>>03982000
 END;    << TIMER >>                                           <<01431>>03984000
                                                                        03986000
PROCEDURE ABORTTIMEREQ(TRLX);                                           03988000
VALUE TRLX;                                                             03990000
INTEGER TRLX;                                                           03992000
OPTION PRIVILEGED,UNCALLABLE;                                           03994000
                                                                        03996000
COMMENT: ABORTS THE TIMER REQUEST FOUND IN ENTRY TRLX. ENTRY IS RELEASED03998000
                                                                        04000000
      ;                                                                 04002000
                                                                        04004000
BEGIN                                                                   04006000
      INTEGER  S, T := 8;                                               04008000
                                                                        04010000
                                                                        04012000
      TRLX := TRLX&LSL(2);                                              04014000
      IF  =  THEN  RETURN;   << IGNORE ZERO FROM I/O SYSTEM >>          04016000
      IF NOT (%14 <= TRLX <= TRL(1)&LSR(6)) THEN                        04018000
         SUDDENDEATH(24);            <<INDEX BAD>>                      04020000
      DISABLE;                                                          04022000
      IF TRLX = TRL(0) THEN                                             04024000
         SUDDENDEATH(28);            <<RETURNING 1ST FREE?>>            04026000
      IF  TRL(TRLX) < 0  THEN                                           04028000
         BEGIN  << ACTIVE REQUEST >>                                    04030000
         WHILE  T <> TRLX  DO                                           04032000
            BEGIN                                                       04034000
            S := T;                                                     04036000
            T := TRL(S).(6:10);                                         04038000
            END;                                                        04040000
         TRL(S).(6:10) := TRL(T);         << DELINK >>                  04042000
         T := TRL(T).(6:10);                                            04044000
         IF  <>  THEN                                                   04046000
            BEGIN                                                       04048000
            TOS := TRL(TRLX+2);          << GET TIME >>                 04050000
            TOS := TRL(X:=X+1);                                         04052000
            TOS := TRL(T+2);                                            04054000
            TOS := TRL(X:=X+1);                                         04056000
            ASMB( DADD );                                               04058000
            TRL(X) := TOS;                                              04060000
            TRL(X:=X-1) := TOS;                                         04062000
            END;                                                        04064000
         END;                                                           04066000
      TRL(TRLX) := TRL(0);                                              04068000
      TOS := X;                                                         04070000
      TRL(0) := TOS;                                                    04072000
                                                                        04074000
                                                                        04076000
                                                                        04078000
      TRL(2):=%20000+TRLX;    <<TRACE>>                                 04080000
                                                                        04082000
                                                                        04084000
                                                                        04086000
END;  << A B O R T T I M E R E Q  >>                                    04088000
                                                                        04090000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               04092000
VALUE CODE,REQ,TIME;                                                    04094000
DOUBLE TIME;                                                            04096000
INTEGER CODE,REQ;                                                       04098000
OPTION UNCALLABLE,PRIVILEGED;                                           04100000
                                                                        04102000
COMMENT: SETS UP A TIME REQUEST.                                        04104000
         ACCEPTS TIME UP TO 2**32-1.                                    04106000
         MOST PRIORITARY REQUEST ALWAYS FIRST IN THE LIST.              04108000
                                                                        04110000
      ;                                                                 04112000
                                                                        04114000
BEGIN                                                                   04116000
      INTEGER  TRLX, S, T := 8;                                         04118000
      INTEGER  S0 = S-0, S1 = S-1;                                      04120000
      INTEGER  MST = Q-5, LST = Q-4;   << TIME >>                       04122000
                                                                        04124000
      TIME := TIME+100D;               << FIGURE TICKS >>               04126000
      TOS := 0;  TOS := MST;                                            04128000
      TOS := 100;                                                       04130000
      ASMB( LDIV );                                                     04132000
      TOS := LST;                                                       04134000
      TOS := 100;                                                       04136000
      ASMB( LDIV,DEL );                                                 04138000
      DISABLE;                                                          04140000
      TRLX := TRL(0);  << GET AN ENTRY >>                               04142000
      IF  =  THEN  SUDDENDEATH(3);                                      04144000
      IF NOT (%14 <= TRLX <= TRL(1)&LSR(6)) THEN                        04146000
         SUDDENDEATH(25);                                               04148000
      << if this is last TRL entry, report TABLE'FULL >>       <<02804>>04150000
      tos := TRL(TRLX);   << next TRL pointer >>               <<02804>>04152000
      if = then                                                <<02804>>04154000
        MPE'TABLE'FULL(4);  << 4 is timer req. list >>         <<02804>>04156000
      TRL(0) := tos;      << update next pointer >>            <<02804>>04158000
      TIMEREQ := TRLX&ASR(2);                                           04160000
      DO                                                                04162000
         BEGIN   << FIND POSITION IN LINE >>                            04164000
         S := T;                                                        04166000
         T := TRL(S).(6:10);                                            04168000
         TOS := TRL(S+2);                                               04170000
         TOS := TRL(X:=X+1);                                            04172000
         ASMB( DSUB );                                                  04174000
         END                                                            04176000
      UNTIL  T = 0  OR  S1 < TRL(T+2)  OR  =  AND  LOGICAL(S0) <        04178000
             LOGICAL(TRL(X:=X+1));                                      04180000
                                                                        04182000
      << BUILD ENTRY >>                                                 04184000
      IF REQ=0 THEN SUDDENDEATH(26);                                    04186000
      TIME := TOS;                                                      04188000
      TRL(TRLX) := %100000+CODE&LSL(10)+T;                              04190000
      TRL(X:=X+1) := REQ;                                               04192000
      TRL(X:=X+1) := MST;                                               04194000
      TRL(X:=X+1) := LST;                                               04196000
      TRL(S).(6:10) := TRLX;                                            04198000
                                                                        04200000
      << CHECK FOR TIME ADJUST IN T >>                                  04202000
      IF  T <> 0  THEN                                                  04204000
         BEGIN                                                          04206000
         TOS := TRL(T+2);                                               04208000
         TOS := TRL(X:=X+1);                                            04210000
         TOS := TOS-TIME;                                               04212000
         TRL(X) := TOS;                                                 04214000
         TRL(X:=X-1) := TOS;                                            04216000
         END;                                                           04218000
                                                                        04220000
                                                                        04222000
      << IF SIO TIMEOUT, DIT8.((CODE LAND %17):1) := 0 >>      <<01301>>04224000
      TOS := CODE;                                                      04226000
      TOS.(11:1) := 0;                                                  04228000
      IF = THEN DEL                                                     04230000
      ELSE                                                              04232000
         BEGIN << SIO TIMEOUT >>                                        04234000
         TOS := F(%1010+REQ);                                  <<01301>>04236000
         ASMB(XBX;                                                      04238000
              TRBC 0,X;                                                 04240000
              XCH,STAX;);                                               04242000
         F(X) := TOS;                                                   04244000
         END;                                                           04246000
                                                                        04248000
                                                                        04250000
                                                                        04252000
      TRL(2):=%10000+TRLX;           <<TRACE>>                          04254000
                                                                        04256000
                                                                        04258000
                                                                        04260000
END;  << T I M E R E Q  >>                                              04262000
                                                                        04264000
LOGICAL PROCEDURE CHEKTRLFREE;                             <<1.01>>     04266000
  OPTION PRIVILEGED,UNCALLABLE;                            <<1.01>>     04268000
COMMENT: RETURNS TRUE IF A TIMER REQUEST ENTRY IS FREE     <<1.01>>     04270000
         ELSE RETURNS FALSE                                <<1.01>>     04272000
;                                                          <<1.01>>     04274000
  BEGIN                                                    <<1.01>>     04276000
  CHEKTRLFREE:= IF TRL(0) <> 0 THEN TRUE ELSE FALSE;       <<1.01>>     04278000
  END;   << CHEKTRLFREE >>                                 <<1.01>>     04280000
                                                                        04282000
PROCEDURE STARTCLOCK(YEARDAY,TIMEDAY);                                  04284000
   VALUE   YEARDAY,TIMEDAY;                                             04286000
   INTEGER YEARDAY;                                                     04288000
   DOUBLE  TIMEDAY;                                                     04290000
   OPTION  PRIVILEGED,UNCALLABLE;                                       04292000
 << INITILISES CLOCK AND STORE YEAR/DAY/TIME IN TRL. >>        <<01431>>04294000
 << CLOCK INTERRUPTS EVERY 1100 TICKS (S 33) OR 100 MS (OTHERS)<<01431>>04296000
   BEGIN                                                       <<01431>>04298000
                                                               <<01431>>04300000
   LOGICAL S33 := TRUE;                                        <<01431>>04302000
   INTEGER TICK'IN'INT := 1100;  << # OF TICKS PER 100 MS >>   <<01431>>04304000
   REAL MS'TO'TICK := 10.9341451852;                           <<01431>>04306000
                                                               <<01431>>04308000
   ASMB(PCN);  << GET CPU # >>                                 <<01431>>04310000
   IF TOS <> SERIES'33  THEN                                   <<01431>>04312000
   BEGIN                                                       <<01431>>04314000
      S33 := FALSE;                                            <<01431>>04316000
      TICK'IN'INT := 100;                                      <<01431>>04318000
   END;                                                        <<01431>>04320000
   TOS := YEARDAY;        <<YEAR/DAY>>                                  04322000
   TRL(7) := TOS;                                                       04324000
   TOS := TIMEDAY;        <<TIME TO TRL>>                               04326000
   TOS := MS'PER'DAY;                                          <<01431>>04328000
   ASMB(DDIV);         << # OF DAYS SINCE COLDLOAD >>          <<01431>>04330000
   IF S33 THEN                                                 <<01431>>04332000
   BEGIN                                                       <<01431>>04334000
      ASMB(DFLT);                                              <<01431>>04336000
      TOS := MS'TO'TICK;                                       <<01431>>04338000
      ASMB(FMPY; FIXR);   << CONVERT MS INTO # OF TICKS >>     <<01431>>04340000
   END;                                                        <<01431>>04342000
   TRL(6) := TOS;                                                       04344000
   TRL(5) := TOS;                                                       04346000
   TRL(3) := TOS;      << # OF DAYS SINCE COLDLOAD >>          <<01431>>04348000
   F(LR) := 0;         << SET INTERRUPT RATE TO DEFAULT >>     <<01431>>04350000
    IF S33  THEN  ASMB(RCCR)  ELSE  TOS := 0;                  <<01431>>04352000
   F(TEMPLR) := F(SCLC) := S0;  << TEMP LIMIT REG >>           <<01431>>04354000
   TOS := TOS + TICK'IN'INT;                                   <<01431>>04356000
   ASMB(SCLR);  << UPDATE LIMIT REG USED BY FIRMWARE >>        <<00495>>04358000
   F(SCSR) := 0;                                                        04360000
   ASMB(TON);   <<ENABLE TIMER>>                                        04362000
   END;  << S T A R T C L O C K  >>                                     04364000
 PROCEDURE OLDTICK;                                            <<01431>>04366000
 OPTION PRIVILEGED, UNCALLABLE;                                <<01431>>04368000
 BEGIN                                                         <<01431>>04370000
 EQUATE   DRQST = 6;                                           <<01431>>04372000
 INTEGER  QTIME = DB+4,                                        <<01431>>04374000
          HEAD = DB+8,                                         <<01431>>04376000
          REQ,                                                 <<01431>>04378000
          CODE;                                                <<01431>>04380000
 INTEGER ARRAY  TRL(*) = DB+0;                                 <<01431>>04382000
 DOUBLE ARRAY  TRLD(*) = DB+0;                                 <<01431>>04384000
 ARRAY    DITBIT(*) = PB :=                                    <<01431>>04386000
          %100000, %20000, %10000, %200, %20, 0, 0, %4000, 0,2;<<01826>>04388000
   DEFINE  SYS'PORTIMER = ABSOLUTE(%1121)#;                    <<01752>>04390000
   EQUATE  JUNKWAIT = %20,                                     <<01752>>04392000
           UCOPIN   = 2;                                       <<01752>>04394000
                                                               <<01431>>04396000
   X := HEAD&ASR(1);                                           <<01431>>04398000
   IF  <>  THEN                                                <<01431>>04400000
      BEGIN   << QUEUED REQUESTS >>                            <<01431>>04402000
      X := X+1;                                                <<01431>>04404000
      TRLD(X) := TRLD(X)-1D;                                   <<01431>>04406000
      TOS := HEAD;                                             <<01431>>04408000
                                                               <<01431>>04410000
      WHILE  <>  AND  TRLD(TOS&ASR(1)+1) <= 0D  DO             <<01431>>04412000
         BEGIN                                                 <<01431>>04414000
         TOS := TRLD(X:=X-1);   << GET VALUES >>               <<01431>>04416000
         IF S0=0 THEN SUDDENDEATH(27);                         <<01431>>04418000
         TRLD(X) := 0D;         << MARK DONE >>                <<01431>>04420000
         REQ := TOS;                                           <<01431>>04422000
         CODE := S0.(1:5);                                     <<01431>>04424000
         TRL(2) := %30000+HEAD;     << TRACE WORD >>           <<01431>>04426000
         HEAD := TOS.(6:10);     << DELINK >>                  <<01431>>04428000
         IF CODE = 5 THEN UNIMPEDE(REQ)                        <<01431>>04430000
         ELSE IF CODE = 8 THEN                                 <<01752>>04432000
            BEGIN  <<PORT TIMEOUT, AWAKEN UCOP>>               <<01752>>04434000
            TOS:=SYS'PORTIMER LOR LOGICAL(REQ&LSL(3));         <<01752>>04436000
            SYS'PORTIMER := TOS;  <<SET PORT MASK BIT>>        <<01752>>04438000
            AWAKE(SYSPROC(UCOPIN),JUNKWAIT,NOWAIT);            <<01752>>04440000
            END                                                <<01752>>04442000
         ELSE if CODE = %12 then << PCB watchdog timer >>      <<02804>>04444000
            AWAKE(REQ,TIMERWAIT,NOWAIT)                        <<02804>>04446000
         ELSE                                                  <<01431>>04448000
            BEGIN  << I/O TIMEOUT >>                           <<01431>>04450000
            X := %1000 + REQ;                                  <<01431>>04452000
            TOS := CODE;                                       <<01431>>04454000
            TOS.(11:1) := 0;                                   <<01431>>04456000
            IF <> THEN                                         <<01431>>04458000
               BEGIN << SIO DEVICE TIMEOUT >>                  <<01431>>04460000
               F(X).(8:1) := 1;  <<IAK  BIT>>                  <<01431>>04462000
                X := X + 2;                                    <<01481>>04464000
                ASMB(XAX,ZERO;           << SET DIT(8) >>      <<01481>>04466000
                    TSBC 0,X;);                                <<01431>>04468000
               END                                             <<01431>>04470000
            ELSE                                               <<01431>>04472000
               BEGIN << DIO DEVICE TIMEOUT >>                  <<01431>>04474000
               ASMB(XAX);                                      <<01431>>04476000
               TOS := DITBIT(X);                               <<01431>>04478000
               END;                                            <<01431>>04480000
            ASMB(XCH,STAX);                                    <<01431>>04482000
            X := X + DRQST;                                    <<01431>>04484000
            F(X) := TOS LOR F(X);                              <<01431>>04486000
            TOS := %1000D;  ASMB( XCHD 0 );  ENABLE;           <<01431>>04488000
            TOS := REQ;                                        <<01431>>04490000
            AWAKEIO( *, 0 );                                   <<01431>>04492000
            ASMB( XCHD 0; DDEL );  DISABLE;                    <<01431>>04494000
            END;                                               <<01431>>04496000
         TOS := HEAD;                                          <<01431>>04498000
         END;                                                  <<01431>>04500000
      END;                                                     <<01431>>04502000
                                                               <<01431>>04504000
   ENABLE;                                                     <<01431>>04506000
   QTIME := QTIME-1;                                           <<01431>>04508000
   IF = THEN                                                   <<MPEIV>>04510000
      BEGIN <<TIME EXPIRED, POSSIBLY MEASURE EVENT>>           <<MPEIV>>04512000
      IF GCLASSENABLEDMASK.CLASS0 AND ABS(CPCB) <> 0 THEN      <<01861>>04514000
         BEGIN <<MEASURE>>                                     <<MPEIV>>04516000
         TOS:=MEASSTATXDSBANK;                                 <<MPEIV>>04518000
         TOS:=MEASSTATXDSBASE;                                 <<MPEIV>>04520000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPTIMEOUT;              <<MPEIV>>04522000
         ASMB(LSEA;INCA;SSEA;DDEL);                            <<MPEIV>>04524000
         END;                                                  <<MPEIV>>04526000
      << NEXT BLOCK OF CODE SUPPORTS MEASURMENT INTF >>        <<01969>>04528000
      TOS:=ABS(CPCB);                                          <<01969>>04530000
      IF <> THEN                                               <<01969>>04532000
         BEGIN << PROCESS RUNNING WHEN INTERRUPT OCCURED >>    <<01969>>04534000
         DEL;  << DUMP CPCB >>                                 <<01969>>04536000
         TOS:=ICS(-ICSSTKBANK);                                <<01969>>04538000
         TOS:=ICS(-ICSSTKBASE);                                <<01969>>04540000
         TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;               <<01969>>04542000
         ASMB(LSEA;DEL); << PROCESSES STOPREASON >>            <<01969>>04544000
         IF = THEN << PROCESS HAD NOT STOPPED FOR OTHER >>     <<02828>>04546000
            BEGIN   << REASON INCONJUNCTION WITH TIMING OUT >> <<01969>>04548000
            TOS:=STOPACTIVE;                                   <<01969>>04550000
            ASMB(SSEA;DDEL);                                   <<01969>>04552000
            IF GCLASSENABLEDMASK.CLASS15 THEN                  <<01969>>04554000
               BEGIN << BUMP TIMEOUT COUNTER >>                <<01969>>04556000
               TOS:=MEASPROCXDSBANK;                           <<01969>>04558000
               TOS:=MEASPROCXDSBASE;                           <<01969>>04560000
               TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*       <<01969>>04562000
                    CLASS15'SUB0SIZE+CP'STOPTIMEOUT;           <<01969>>04564000
               ASMB(LSEA;INCA;SSEA;DDEL);                      <<01969>>04566000
               END;                                            <<01969>>04568000
            END                                                <<01969>>04570000
         ELSE                                                  <<01969>>04572000
            ASMB(DDEL); << ICSSTKABNK, ICSSTKBASE >>           <<01969>>04574000
         END                                                   <<01969>>04576000
      ELSE                                                     <<01969>>04578000
         ASMB(DEL); << CPCB >>                                 <<01969>>04580000
      ASMB(DISP);                                              <<MPEIV>>04582000
      END;                                                     <<MPEIV>>04584000
 END;                                                          <<01431>>04586000
                                                               <<01431>>04588000
                                                               <<01431>>04590000
PROCEDURE  TICK;                                               <<01431>>04592000
   OPTION  PRIVILEGED, UNCALLABLE;                             <<01431>>04594000
COMMENT:                                                       <<01431>>04596000
      INTERRUPT HANDLER FOR THE SYSTEM CLOCK                   <<01431>>04598000
      DB  IS SET TO THE TRL BASE.                              <<01431>>04600000
      INTERRUPTS ARE ALEADY DISABLED BUT WILL ENABLED HERE.    <<01431>>04602000
;                                                              <<01431>>04604000
   BEGIN                                                       <<01431>>04606000
   EQUATE  ONE'YEAR = [7/1,9/0];                               <<01431>>04608000
    DEFINE   FLAG = ABS(CLK'TAB'BASE)#,                        <<DK.40>>04610000
        LEAP'YEAR = DATE.(5:2) = 0#,                           <<DK.40>>04614000
              LRV = ABS(LR).(1:15)#, <<CURRENT INTERRUPT RATE>><<DK.40>>04616000
           GET'INT'RATE = TOS := LRV;                          <<01431>>04618000
                          IF = THEN TOS := TOS + TICK'IN'INT#; <<01431>>04620000
   INTEGER DATE = DB+7,                                        <<01431>>04622000
           NUM'OF'DAYS = DB + 3,<< # OF DAYS SINCE COLD LOLD >><<01431>>04624000
           CLK'TAB'BASE, I,                                    <<DK.40>>04626000
           DAY,                                                <<01431>>04628000
           DAYS'THIS'YEAR,                                     <<01431>>04630000
           TICK'IN'INT := 1100, <<INTERRUPT INTERVAL IN TICKS>><<01431>>04632000
           TICK'PER'100MS := %2106,   <<INTERRUPT RATE BY MC>> <<01431>>04634000
           TSLINT = Q-4, <<TIME SINCE LAST INTERRUPT INTERVAL>><<01431>>04636000
           INT'MISSED;   << # OF TICKS SINCE LAST INTERRUPT >> <<01431>>04638000
   LOGICAL WRAP := TRUE, S33 := TRUE;                          <<01431>>04640000
   DOUBLE  DTIME = DB+5, NUM'TICK'PER'DAY := 944710000D;       <<01431>>04642000
                                                               <<01431>>04646000
   ASMB(PCN);  << GET CPU # >>                                 <<01431>>04648000
   IF  TOS <> SERIES'33  THEN                                  <<01431>>04650000
   BEGIN                                                       <<01431>>04652000
      S33 := FALSE;                                            <<01431>>04654000
      TICK'IN'INT := TICK'PER'100MS := 100;                    <<01431>>04656000
      NUM'TICK'PER'DAY := MS'PER'DAY;                          <<01431>>04658000
   END;                                                        <<01431>>04660000
   TOS := F(SCSR);   <<SYSTEM CLOCK STATUS>>                   <<01431>>04662000
   IF < THEN                                                   <<01431>>04664000
   BEGIN <<SIN COMMAND>>                                       <<01431>>04666000
      F(SCSR) := TOS.(1:15);  << CLEAR SINC FLAG >>            <<01431>>04668000
      ENABLE;                                                  <<01431>>04670000
      ASMB( DISP );                                            <<01431>>04672000
      GO TO RESETCLK;                                          <<01431>>04674000
   END  ELSE  F(X) := 0;  << CLEAR STATUS REGISTER >>          <<01431>>04676000
   IF  S33  THEN                                               <<01431>>04678000
   BEGIN                                                       <<01431>>04680000
      TOS := 0;                                                <<01431>>04682000
      ASMB(RCCR; DUP);                                         <<01431>>04684000
      TOS := F(TEMPLR);                                        <<01431>>04686000
      ASMB(XCH);                                               <<01431>>04688000
      F(X) := TOS;                                             <<01431>>04690000
      ASMB(LSUB; DUP);                                         <<01431>>04692000
   END  ELSE                                                   <<01431>>04694000
   BEGIN                                                       <<01431>>04696000
      TOS := 0;                                                <<01431>>04698000
      TOS := TSLINT;                                           <<01431>>04700000
      ASMB(DUP);                                               <<01431>>04702000
   END;                                                        <<01431>>04704000
   GET'INT'RATE;                                               <<01431>>04706000
   ASMB(DIV; DEL);                                             <<01431>>04708000
   INT'MISSED := TOS;   << # IF INTERUPTS MISSED  >>           <<01431>>04710000
   DTIME := TOS+DTIME;  << IN MILLISECONDS >>                  <<01431>>04712000
   IF DTIME >= NUM'TICK'PER'DAY THEN                           <<01431>>04714000
   BEGIN                                                       <<01431>>04716000
      DTIME := DTIME - NUM'TICK'PER'DAY;                       <<01431>>04718000
      IF NUM'OF'DAYS = 23  THEN                                <<01431>>04720000
      BEGIN                                                    <<01431>>04722000
         NUM'OF'DAYS := 0;                                     <<01431>>04724000
         DAYS'THIS'YEAR := IF LEAP'YEAR THEN 366 ELSE 365;     <<01431>>04726000
         IF (DAY:=DATE.(7:9)+24) > DAYS'THIS'YEAR THEN         <<01431>>04728000
         BEGIN                                                 <<01431>>04730000
            DAY := DAY - DAYS'THIS'YEAR;                       <<01431>>04732000
            DATE := DATE + ONE'YEAR;                           <<01431>>04734000
         END;                                                  <<01431>>04736000
         DATE.(7:9) := DAY;                                    <<01431>>04738000
      END  ELSE  NUM'OF'DAYS := NUM'OF'DAYS + 1;               <<01431>>04740000
   END;                                                        <<01431>>04742000
                                                               <<DK.40>>04744000
    CLK'TAB'BASE := ABS(%1261)+%1070; << GET DATA TABLE BASE >><<DK.40>>04746000
    IF  TLIMIT <> 0  THEN                                      <<DK.40>>04748000
    BEGIN    << SOMEONE IS USING THE SHARED CLOCK INTERFACE >> <<DK.40>>04750000
      TOS := INT'MISSED;                                       <<01838>>04752000
       TOS := TCOUNT;                                          <<DK.40>>04754000
       ASMB(XCH; SUB);                                         <<DK.40>>04756000
       IF  <=  THEN                                            <<DK.40>>04758000
       BEGIN                                                   <<DK.40>>04760000
          TCOUNT := TLIMIT;                                    <<DK.40>>04762000
          OLDTICK;                                             <<DK.40>>04764000
          IF LRV = 0 AND INTEGER ( DLABEL ) < 0 THEN           <<04115>>04766000
          BEGIN                                                <<DK.40>>04768000
              TOS := TICK'IN'INT / INTEGER ( TLIMIT );         <<04115>>04770000
             LRV := S0.(1:15);  << STORE INTERRUPT INTERVAL >> <<DK.40>>04772000
             IF  NOT S33  THEN  ASMB(SCLR);                    <<DK.40>>04774000
          END  ELSE                                            <<DK.40>>04776000
          IF LRV > 0 AND INTEGER ( DLABEL ) >=0 THEN           <<04115>>04778000
          BEGIN                                                <<DK.40>>04780000
             LRV := 0;                                         <<DK.40>>04782000
             FOR I:= 59 UNTIL 62  DO  MEASINFOTABPTR(I) := 0;  <<DK.40>>04784000
             IF  NOT S33  THEN                                 <<DK.40>>04786000
             BEGIN                                             <<DK.40>>04788000
                TOS := 100;                                    <<DK.40>>04790000
                ASMB(SCLR);                                    <<DK.40>>04792000
             END;                                              <<DK.40>>04794000
             GOTO  EXIT;                                       <<DK.40>>04796000
          END;                                                 <<DK.40>>04798000
       END  ELSE  TCOUNT := TOS;                               <<04314>>04800000
      TOS := INT'MISSED;                                       <<01838>>04802000
       TOS := DCOUNT;                                          <<DK.40>>04804000
       ASMB(XCH; SUB);                                         <<DK.40>>04806000
       IF  <=  THEN                                            <<DK.40>>04808000
       BEGIN                                                   <<DK.40>>04810000
          IF  NOT FLAG  THEN                                   <<DK.40>>04812000
          BEGIN                                                <<DK.40>>04814000
             TOS := IF  FLAG < 0  THEN  1  ELSE  0;            <<DK.40>>04816000
              TOS := DLABEL;                                   <<04115>>04818000
             IF  <  THEN                                       <<DK.40>>04820000
             BEGIN                                             <<DK.40>>04822000
                ENABLE;                                        <<DK.40>>04824000
                FLAG := 1;                                     <<DK.40>>04826000
                ASMB(PCAL 0);                                  <<DK.40>>04828000
                DCOUNT := DLIMIT;                              <<DK.40>>04830000
                DISABLE;                                       <<DK.40>>04832000
             END  ELSE  ASMB(DDEL);                            <<DK.40>>04834000
             FLAG := 0;                                        <<DK.40>>04836000
           END ELSE FLAG := FLAG LOR %100000;                  <<04314>>04838000
       END ELSE  DCOUNT := TOS;                                <<04314>>04840000
    END  ELSE  OLDTICK;                                        <<DK.40>>04842000
                                                               <<DK.40>>04844000
EXIT:                                                          <<01431>>04846000
   IF S33  THEN                                                <<01431>>04848000
   BEGIN                                                       <<01431>>04850000
      GET'INT'RATE;                                            <<01431>>04852000
      TOS := F(TEMPLR);                                        <<01431>>04854000
      ASMB(LADD; DUP; RCCR; LSUB);                             <<01431>>04856000
      TOS := 10;                                               <<01431>>04858000
      ASMB(SUB; DEL);                                          <<01431>>04860000
      IF <=  THEN << NEXT SCHEDULED INTERRUPT HAS PASSED >>    <<01431>>04862000
      BEGIN                                                    <<01431>>04864000
         GET'INT'RATE;  << GET INTERRUPT RATE >>               <<01431>>04866000
         ASMB(RCCR; LADD);  << SET INTERRUPT FROM NOW >>       <<01431>>04868000
      END;                                                     <<01431>>04870000
      ASMB(SCLR);                                              <<01431>>04872000
   END;                                                        <<01431>>04874000
RESETCLK:                                                      <<01431>>04876000
   ASMB(TON);                                                  <<01431>>04878000
END;                                                           <<01431>>04880000
$PAGE                                                          <<03028>>04882000
                                                                        04886000
PROCEDURE HELP;                                                         04888000
    OPTION PRIVILEGED, UNCALLABLE;                                      04890000
<<                                                                      04892000
   MPE/30 STANDALONE DEBUGGING PROCEDURE.                               04894000
   THE FOLLOWING QUANTITIES ARE ASSUMED TO BE DEFINED OUTSIDE           04896000
   THIS PROCEDURE:                                                      04898000
        DISABLE = ASMB(SED 0)#, ASMB = ASSEMBLE#, AND                   04900000
        F = ABSOLUTE#.                                                  04902000
>>                                                                      04904000
BEGIN                                                                   04906000
DEFINE  CST'SIZE = 4#,                                         <<01364>>04908000
        BANKS'CONFIGURED = F( SYSDB + %47)#,                   <<01364>>04910000
        LDAD = ASMB( LSEA )#,                                           04912000
        STAD = ASMB( SSEA )#;                                           04914000
                                                                        04916000
EQUATE MAX'BPTS = 10,  << NUMBER OF ENTRIES IN TABLE >>        <<01364>>04918000
       TABLE'SIZE = MAX'BPTS * 6;                              <<01364>>04920000
DEFINE NUM'BPTS = BPTAB(TABLE'SIZE+1)#;                        <<01364>>04922000
  << THE LAST WORD OF THE BREAK POINT TABLE COUNTS THE >>      <<01364>>04924000
  << NUMBER OF BREAK POINTS.                           >>      <<01364>>04926000
                                                               <<01364>>04928000
ARRAY BP'TAB(*) = PB := TABLE'SIZE(0),-1,0;                    <<01364>>04930000
<< THIS ARRAY HOLDS THE INFORMATION REQUIRED FOR BREAKPOINTS.           04932000
   EACH ENTRY IN THE TABLE IS 6 WORDS LONG. THE TABLE IS                04934000
   ENDED WITH A -1. IT MAY BE EXTENDED BY  CHANGING THE NUMBER          04936000
   OF INITIALIZATION ZEROS IN THE ABOVE DECLARATION. THE WORDS          04938000
   IN  A TABLE ENTRY ARE USED AS FOLLOWS:                               04940000
                                                                        04942000
   WORD0.(0:8) =  0    EMPTY TABLE ENTRY                                04944000
                  1    USER SET BREAKPOINT                              04946000
                  2    "FAKE" BREAKPOINT                                04948000
                                                                        04950000
   WORD0.(8:8) =       CST FOR THE BREAKPOINT. IF ZERO THEN             04952000
                       THIS TABLE ENTRY IS FREE.                        04954000
                                                                        04956000
   WORD1       =       PB RELATIVE ADDRESS FOR THE BREAKPOINT. IF       04958000
                       ZERO THEN THE ENTRY IS FREE.                     04960000
                                                                        04962000
   WORD2       =       SAVED INSTRUCTION  IF A BREAKPOINT IS SET.       04964000
                                                                        04966000
   WORD3.(0:8) =       RELATIONAL OPERATOR FOR THE CONDITIONAL          04968000
                  0    NO CONDITION ATTACHED                            04970000
                  1    COUNT ATTACHED                                   04972000
                  2    <                                                04974000
                  3    =                                                04976000
                  4    >                                                04978000
                  5    #                                                04980000
                                                                        04982000
   WORD3.(8:8) =       BANK FOR COMPARISON ADDRESS                      04984000
                                                                        04986000
   WORD4       =       REST OF THE COMPARISON ADDRESS                   04988000
                                                                        04990000
   WORD5       =       COMPARISON CONSTANT                              04992000
>>                                                                      04994000
                                                                        04996000
INTEGER ARRAY  BPTAB(*) = DB+0;  << BREAKPOINT TABLE >>                 04998000
BYTE ARRAY INPUT(0:39) = Q;  << HOLDS COMMAND STRING INPUT >>           05000000
                                                                        05002000
BYTE ARRAY  IO(0:39) = Q;   << OUTPUT BUFFER >>                <<01778>>05004000
INTEGER ARRAY  WRDIO(*) = IO;  << OVERLAY FOR ABOVE >>                  05006000
                                                                        05008000
EQUATE NUM'CMNDS = 7;                                          <<01364>>05010000
INTEGER ARRAY COMM(*) = PB := %102,%103,%104,%115,%122,%121,   <<01364>>05012000
                              %114;                            <<01364>>05014000
<< OCTAL VALUES OF THE CHARACTER COMMANDS >>                            05016000
                                                                        05018000
INTEGER ARRAY  REL(*) = PB := %74,%75,%76,%43;                          05020000
<<  THE ABOVE ARE THE ALLOWABLE RELATIONAL OPERATORS >>                 05022000
                                                                        05024000
INTEGER ARRAY  PRE(*) = PB := "HELP    . ";                             05026000
INTEGER POINTER IOQP = 5;                                               05028000
                                                                        05030000
DOUBLE  P1, P2,   << PARAMETERS FOR COMMANDS >>                         05032000
        OLDDB,    << CALLERS DB >>                                      05034000
        K,  << TEMPORARY VARIABLE >>                                    05036000
        DS4 = S-4,   << S RELATIVE TEMPS >>                             05038000
        DS5 = S-5,                                                      05040000
        DS1 = S-1;                                                      05042000
                                                                        05044000
LOGICAL  P2F,   << SET IF 2ND PARAMETER EXISTS >>                       05046000
         REG;   << SET IF A REGISTER APPEARS IN PRI' >>                 05048000
                                                                        05050000
INTEGER  X = X,   << DEFINE REGISTERS AND TOS VARIABLES >>              05052000
         S0 = S-0,                                                      05054000
         S1 = S-1,                                                      05056000
         S2 = S-2,                                                      05058000
         S3 = S-3,                                                      05060000
         S4 = S-4,                                                      05062000
         S5 = S-5,                                                      05064000
         S7 = S-7,                                                      05066000
         TOKEN,  << OUTPUT OF CHAR SUBROUTINE >>                        05068000
         INPNTR, << INDEX TO FETCH NEXT CHAR FROM CMND STRING >>        05070000
         I, J, L,  << TEMPORARY VARIABLES >>                            05072000
         OLDS,  << S VALUE TO RESET IN FAIL >>                          05074000
         COM,  << COMMAND # >>                                          05076000
         CST,  << CST VALUE FOR B AND C COMMANDS >>                     05078000
         P,  << P VALUE FOR ABOVE >>                                    05080000
         SMP = Q-2,  << P FROM STACK MARKER >>                          05082000
         SMSTA = Q-1;  << STATUS FROM STACK MARKER >>                   05084000
                                                                        05086000
                                                                        05088000
SUBROUTINE  PRINT(C);                                                   05090000
   VALUE C; INTEGER C;                                                  05092000
<<                                                                      05094000
THIS SUBROUTINE PRINTS THE I/O BUFFER (IO) ON THE TELETYPE.             05096000
C IS A COUNT. ITS ABSOLUTE VALUE IS THE NUMBER OF CHARACTERS            05098000
TO PRINT. IF C >= 0, THEN THE LINE WILL BE FOLLOWED BY A                05100000
RETURN-LINEFEED.                                                        05102000
>>                                                                      05104000
   BEGIN                                                                05106000
                                                                        05108000
   X := 0;                                                              05110000
   WHILE  X < \C\  DO                                          <<01364>>05112000
      BEGIN  << PRINT A CHARACTER >>                                    05114000
                                                                        05116000
      PRINTCHAR (IO(X));                                                05118000
                                                                        05120000
      X := X+1;                                                         05122000
      END;                                                              05124000
                                                                        05126000
                                                                        05128000
   IF  C >= 0  THEN                                                     05130000
      BEGIN  << PRINT A CR, LF >>                                       05132000
      PRINTCHAR(%15);    PRINTCHAR(%12);                                05134000
      X:=4;                                                             05136000
      DO  PRINTCHAR(0)  UNTIL DXBZ;                            <<01364>>05138000
      END;                                                              05140000
   END;                                                                 05142000
                                                                        05144000
SUBROUTINE  FAIL;                                                       05146000
<<                                                                      05148000
THIS IS CALLED ON A COMMAND FAILURE. IT CUTS THE STACK                  05150000
BACK AS NEEDED AND RETURNS TO THE COMMAND INPUT LOOP.                   05152000
>>                                                                      05154000
    BEGIN                                                               05156000
    WRDIO := "??";                                                      05158000
    PRINT( 2 );  << PRINT ERROR INDICATION >>                           05160000
    TOS := OLDS;  << RESET S AS REQUIRED >>                             05162000
    SET (  S  );                                                        05164000
    GO COMIN;                                                           05166000
    END;                                                                05168000
                                                                        05170000
                                                                        05172000
SUBROUTINE GETINPUT;                                                    05174000
                                                                        05176000
  << READ COMMAND INTO INPUT BUFFER, INPUT.  FIRST CHARACTER OF         05178000
     COMMAND IS PUT INTO TOKEN AND A LF IS OUTPUT ON THE CR.            05180000
     CONTROL H AND X ARE PROCESSED IN THIS ROUTINE.                     05182000
  >>                                                                    05184000
                                                                        05186000
  BEGIN                                                                 05188000
   I := 0;                                                              05190000
                                                                        05192000
                                                                        05194000
READL:                                                                  05196000
                                                                        05198000
    TOKEN:=READCHAR;                                                    05200000
                                                                        05202000
   IF  TOKEN = " "  THEN  GOTO READL;                                   05204000
                                                                        05206000
   IF TOKEN=%10 THEN  << CONTROL H, DELETE A CHARACTER >>               05208000
     BEGIN                                                              05210000
       IF I>0 THEN  << SOMETHING TO DELETE >>                           05212000
         BEGIN                                                          05214000
           I := I - 1;                                                  05216000
           IO := "\";    PRINT(-1);                                     05218000
         END;                                                           05220000
       GOTO READL;   << GET NEXT CHARACTER >>                           05222000
     END;                                                               05224000
                                                                        05226000
   IF TOKEN=%30 THEN  << CONTROL X, DELETE THE LINE >>                  05228000
     BEGIN                                                              05230000
       I := 0;                                                          05232000
       WRDIO := "!!";   IO(2) := "!";                                   05234000
       PRINT(3);                                                        05236000
       GOTO READL;   << GET NEXT CHARACTER >>                           05238000
     END;                                                               05240000
                                                                        05242000
   IF I>=40 THEN FAIL;   << OVERFLOW BUFFER >>                          05244000
   INPUT(I) := TOKEN;     I := I + 1;                                   05246000
   IF TOKEN<>%15 THEN GOTO READL;  << NOT A CR, GET NEXT CHARACTER >>   05248000
                                                                        05250000
   I := 0;                                                              05252000
                                                                        05254000
   INPNTR := 1;   TOKEN := INPUT;                                       05256000
   PRINT(0);    << CR/LF >>                                             05258000
  END;   << GET INPUT >>                                                05260000
                                                                        05262000
                                                                        05264000
SUBROUTINE  CHAR;                                                       05266000
<<                                                                      05268000
THIS SUBROUTINE GETS A CHARACTER FROM THE INPUT BUFFER AND PLACES       05270000
IT IN TOKEN.                                                            05272000
>>                                                                      05274000
   BEGIN                                                                05276000
     TOKEN := INPUT(INPNTR);                                            05278000
     INPNTR := INPNTR + 1;                                              05280000
   END;                                                                 05282000
                                                                        05284000
SUBROUTINE  NUMOUT( N, L, S );                                          05286000
   VALUE  N,L,S;                                                        05288000
   DOUBLE N;                                                            05290000
   INTEGER L,S;                                                         05292000
<<                                                                      05294000
N IS THE NUMBER TO PRINT. L IS THE LOCATION IN IO TO PLACE IT.          05296000
S IS THE SIZE IN CHARACTERS FOR THE CONVERTED NUMBER.                   05298000
>>                                                                      05300000
   BEGIN                                                                05302000
   X := L+S;  << SET UP THE INDEX >>                                    05304000
   TOS := N;  << GET NUMBER >>                                          05306000
   DO                                                                   05308000
      BEGIN  << CONVERT ONE DIGIT >>                                    05310000
      X := X-1;                                                         05312000
      ASMB( DUP );                                                      05314000
      IO(X) := (TOS LAND 7) LOR %60;                                    05316000
      TOS := TOS&DASR(3);                                               05318000
      END                                                               05320000
   UNTIL  S4 = X;                                                       05322000
   DDEL;  << DELETE N'S REMAINS >>                                      05324000
   END;                                                                 05326000
                                                                        05328000
DOUBLE SUBROUTINE OCTINT;                                               05330000
<<                                                                      05332000
COMPUTES AND RETURNS AN OCTAL INTEGER. THE INTEGER MUST                 05334000
HAVE BETWEEN 1 AND 6 DIGITS INCLUSIVE                                   05336000
>>                                                                      05338000
   BEGIN                                                                05340000
   L := 0;  << ZERO THE DIGIT COUNTER >>                                05342000
   TOS := 0D;  << INITIAL VALUE OF OCTINT >>                            05344000
   WHILE  %60 <= TOKEN <= %67  DO                                       05346000
      BEGIN  << GET A DIGIT >>                                          05348000
      L := L+1;                                                         05350000
      TOS := TOS&DCSL(3);                                               05352000
      TOS := 0;   << FORM DOUBLE VALUE FOR NEW DIGIT >>                 05354000
      TOS := TOKEN-%60;                                                 05356000
      ASMB( DADD );                                                     05358000
      CHAR;  << GET THE NEXT CHARACTER >>                               05360000
      END;                                                              05362000
   IF  NOT( 1 <= L <= 6 )  THEN  FAIL;  << TOO MANY OR TOO FEW >>       05364000
   DS4 := TOS;  << RETURN THE VALUE >>                                  05366000
   END;                                                                 05368000
                                                                        05370000
DOUBLE SUBROUTINE NUMBER;                                               05372000
<<                                                                      05374000
COMPUTES A SIGNED NUMBER                                                05376000
>>                                                                      05378000
   IF  TOKEN = "-"  THEN                                                05380000
      BEGIN                                                             05382000
      CHAR;  << GET NEXT >>                                             05384000
      NUMBER := -OCTINT;                                                05386000
      END                                                               05388000
   ELSE                                                                 05390000
      BEGIN                                                             05392000
      IF  TOKEN = "+"  THEN  CHAR;  << IGNORE IT >>                     05394000
      NUMBER := OCTINT;                                                 05396000
      END;                                                              05398000
                                                                        05400000
DOUBLE SUBROUTINE CST'ADDR( CST );                                      05402000
   VALUE CST; INTEGER CST;                                              05404000
<<                                                                      05406000
COMPUTES THE BASE ADDRESS FOR A SEGMENT GIVEN THE CST.                  05408000
FAILS IF THE SEGMENT IS ABSENT                                          05410000
>>                                                                      05412000
   BEGIN                                                                05414000
   IF  F(F(0)) < CST  THEN  FAIL;  << ILLEGAL CST >>                    05416000
   X := X+CST*CST'SIZE;                                                 05418000
   IF  F(X) < 0  THEN  FAIL;  << ABSENT, ERROR >>                       05420000
   TOS := F(X:=X+2);         << GET BANK >>                    <<01778>>05422000
   TOS := F(X:=X+1);  << GET ADDRESS IN THE BANK >>                     05424000
   DS5 := TOS;  << RETURN THE VALUE >>                                  05426000
   END;                                                                 05428000
                                                                        05430000
DOUBLE SUBROUTINE PRI';                                                 05432000
<<                                                                      05434000
COMPUTES A PRI, SEE DOCUMENTATION FOR DEFINITION                        05436000
>>                                                                      05438000
   IF  "D" <= TOKEN <= "Z"  THEN                                        05440000
      BEGIN << A REGISTER IS GIVEN >>                                   05442000
      REG := TRUE;                                                      05444000
      PUSH(SBANK);  << GET THE STACK BANK >>                            05446000
      PUSH( DB );                                                       05448000
      DELB;   << GET RID OF DB BANK >>                                  05450000
      IF  TOKEN = "D"  THEN                                             05452000
         BEGIN  << DL OR DB >>                                          05454000
         CHAR;  << GET THE B OR L >>                                    05456000
         IF  TOKEN = "B"  THEN                                          05458000
            BEGIN  << DB >>                                             05460000
            DDEL;  << CUT DB AND SBANK >>                               05462000
            TOS := OLDDB;                                               05464000
            TOS := 0;   << DB REL DB >>                                 05466000
            END                                                         05468000
         ELSE  IF  TOKEN  = "L"  THEN  PUSH( DL )                       05470000
         ELSE  FAIL;  << ILLEGAL REGISTER GIVEN >>                      05472000
         END                                                            05474000
      ELSE                                                              05476000
         BEGIN                                                          05478000
         IF  TOKEN = "Q"  THEN                                          05480000
            BEGIN  << Q >>                                              05482000
            PUSH( Q );  << GET Q >>                                     05484000
            TOS := TOS+TOS;   << MAKE ABSOLUTE Q >>                     05486000
            LDAD;  << GET DELTA Q FROM MARKER >>                        05488000
            TOS := -TOS;  << BUILD USER'S Q >>                          05490000
            END                                                         05492000
         ELSE  IF  TOKEN = "S"  THEN                                    05494000
            BEGIN  << S >>                                              05496000
            PUSH( Q );                                                  05498000
            TOS := TOS-4;                                               05500000
            END                                                         05502000
         ELSE  IF  TOKEN = "Z"  THEN  PUSH( Z )                         05504000
         ELSE  FAIL;                                                    05506000
         END;                                                           05508000
      CHAR;  << SCAN OFF THE REGISTER >>                                05510000
      TOS := TOS+TOS;   << CHANGE DB REL TO ABS >>                      05512000
      DS4 := TOS;  << RETURN THE VALUE >>                               05514000
      END                                                               05516000
   ELSE                                                                 05518000
      PRI' := NUMBER;                                                   05520000
                                                                        05522000
DOUBLE SUBROUTINE SEXP;                                                 05524000
<<                                                                      05526000
COMPUTES A <SEXP>                                                       05528000
>>                                                                      05530000
   BEGIN                                                                05532000
   REG := FALSE;                                                        05534000
   TOS := PRI';  << GET A <PRI> >>                                      05536000
L: IF  TOKEN = "+"  THEN                                                05538000
      BEGIN                                                             05540000
      CHAR;  << SCAN OFF + >>                                           05542000
      TOS := PRI'; IF REG THEN  ASMB(DELB,ADD)  ELSE  ASMB(DADD);       05544000
      GO L;                                                             05546000
      END;                                                              05548000
   IF  TOKEN = "-"  THEN                                                05550000
      BEGIN                                                             05552000
      CHAR;  << SCAN OFF THE - >>                                       05554000
      TOS := PRI'; IF REG THEN  ASMB(DELB,SUB)  ELSE  ASMB(DSUB);       05556000
      GO L;                                                             05558000
      END;                                                              05560000
   IF  TOKEN = "I"  THEN                                                05562000
      BEGIN  << INDIRECT >>                                             05564000
      CHAR;  << SCAN OFF THE I >>                                       05566000
      LDAD;  << GET THE ADDRESS' CONTENTS >>                            05568000
      DELB; DELB;  << CUT ADDRESS >>                                    05570000
      IF  REG  THEN  ASMB(LDD OLDDB; CAB,ADD)  ELSE                     05572000
      ASMB( ZERO,XCH );  << FORM A DOUBLE >>                            05574000
      GO L;                                                             05576000
      END;                                                              05578000
   DS4 := TOS;                                                          05580000
   END;                                                                 05582000
                                                                        05584000
DOUBLE SUBROUTINE  EXP;                                                 05586000
<<                                                                      05588000
COMPUTES A <EXP>                                                        05590000
>>                                                                      05592000
   BEGIN                                                                05594000
   TOS := SEXP;                                                         05596000
   IF  TOKEN = "."  THEN                                                05598000
      BEGIN                                                             05600000
      ASMB( DUP );                                                      05602000
      CST := S0;                                                        05604000
      CHAR;                                                             05606000
      TOS := CST'ADDR(*);                                               05608000
      TOS := SEXP;                                                      05610000
      P := S0;                                                          05612000
      ASMB(DADD);                                                       05614000
      END                                                      <<01364>>05616000
 ELSE IF TOKEN = "@" THEN                                      <<01364>>05618000
      BEGIN  << BANK AND ABSOLUTE ADDRESS >>                   <<01364>>05620000
      DELB;                                                    <<01364>>05622000
      CHAR;                                                    <<01364>>05624000
      TOS:=SEXP;                                               <<01364>>05626000
      DELB;                                                    <<01364>>05628000
      END;                                                     <<01364>>05630000
   DS4 := TOS;                                                          05632000
   END;                                                                 05634000
                                                                        05636000
LOGICAL SUBROUTINE FIND;                                                05638000
<<                                                                      05640000
THIS SUBROUTINE IS USED TO FIND ENTRIES IN THE BP'TAB. IT               05642000
RETURNS TRUE ON A SUCCESSFUL FIND. ON SUCCESS, I IS SET                 05644000
TO THE 16 BIT INDEX OF THE FIRST WORD OF THE TABLE ENTRY.               05646000
>>                                                                      05648000
   BEGIN                                                                05650000
   I := X := 0;                                                         05652000
   DO                                                                   05654000
      IF  BPTAB(X).(8:8) = CST  AND  BPTAB(X:=X+1) = P THEN             05656000
         BEGIN  FIND := TRUE;  RETURN;  END                             05658000
   UNTIL  BPTAB(I:=I+6) = -1;                                           05660000
   END;                                                                 05662000
                                                                        05664000
SUBROUTINE  IMPCST;                                                     05666000
<<                                                                      05668000
CHECKS FOR AN IMPLIED CST IN THE C OR B COMMANDS                        05670000
>>                                                                      05672000
   IF  CST = 0  THEN                                                    05674000
      BEGIN  << IMPLIED CST >>                                          05676000
      CST := SMSTA.(8:8);                                               05678000
      TOS := P1;  DELB;  P := TOS;                                      05680000
      END;                                                              05682000
                                                                        05684000
SUBROUTINE CLEAR;                                                       05686000
<<                                                                      05688000
THIS SUBROUTINE IS CALLED TO CLEAR A BREAKPOINT                         05690000
>>                                                                      05692000
   BEGIN                                                                05694000
   IMPCST;                                                              05696000
   IF  FIND  THEN                                                       05698000
      BEGIN  << ONE EXISTS, ZAP IT >>                                   05700000
      TOS := CST'ADDR( CST )+DOUBLE( P );                               05702000
      BPTAB(I) := 0;                                                    05704000
      BPTAB(X:=X+1) := 0;                                               05706000
      TOS := BPTAB(X:=X+1);  << GET THE INSTRUCTION >>                  05708000
      STAD;  << RESTORE IT IN THE CODE >>                               05710000
      DDEL;                                                             05712000
                                                               <<01364>>05714000
      NUM'BPTS := NUM'BPTS - 1;                                <<01364>>05716000
                                                               <<01364>>05718000
      P := P+1;  << TAKE OUT A POSSIBLE FAKE >>                         05720000
      IF  FIND  AND  BPTAB(I).(0:8) = 2  THEN  CLEAR;                   05722000
      P := P-1;                                                         05724000
      END                                                               05726000
   ELSE  FAIL;                                                          05728000
   END;                                                                 05730000
                                                                        05732000
SUBROUTINE BREAK( A );                                                  05734000
   VALUE A; INTEGER A;                                                  05736000
<<                                                                      05738000
THIS ROUTINE PUTS IN BREAK POINTS. THE A PASSED IS THE TYPE             05740000
OF BREAKPOINT.                                                          05742000
>>                                                                      05744000
COMMENT                                                        <<01364>>05746000
   BECAUSE A FAKE BREAK POINT IS SET WHENEVER HELP IS ENTERED  <<01364>>05748000
   VIA A USER SET BREAK POINT, THERE MUST BE AT LEAST ONE      <<01364>>05750000
   FREE ENTRY AFTER A USER BREAK POINT IS SET TO ACCOMODATE    <<01364>>05752000
   THE FAKE BREAK POINT.                                       <<01364>>05754000
;                                                              <<01364>>05756000
                                                               <<01364>>05758000
   BEGIN  << TABLE ENTRY WILL BE BUILT ON THE STACK >>                  05760000
   IMPCST;                                                              05762000
   TOS := 0;  << INITIALIZE THE CONSTANT >>                             05764000
   TOS := P2;  << GET THE ADDRESS FOR THE TEST >>                       05766000
   ASMB( XCH );  << REVERSE THE ADDRESS FOR AS WANTED >>                05768000
   IF  P < 0  OR  FIND  THEN  FAIL;  << BAD P OR ALREADY EXISTS >>      05770000
   K := TOS := CST'ADDR( CST )+DOUBLE( P );                             05772000
   LDAD;  << GET THE INSTRUCTION TO REPLACE >>                          05774000
                                                                        05776000
   IF  S7 = 1  THEN   << A IS NOW AT S7 >>                              05778000
      BEGIN  << USER BREAKPOINT, CHECK INSTRUCTION >>                   05780000
      IF  S0.(0:4) = %14   THEN  FAIL;  << BRANCHES >>                  05782000
      IF  S0.(0:4) = 3  AND  1<=S0.(4:4)<=4 THEN FAIL;                  05784000
      IF  S0.(0:4) = 1  THEN                                            05786000
         BEGIN  << CHECK WHICH ONES >>                                  05788000
         TOS := %117001703D;                                            05790000
         TOS := TOS&DCSL(S2.(5:5));                                     05792000
         IF  <  THEN  FAIL;                                             05794000
         DDEL;  << KICK OFF MAGIC CONSTANT >>                           05796000
         END;                                                           05798000
      << GETTING TO THIS POINT SAYS IT IS O.K. >>                       05800000
      END;                                                              05802000
                                                                        05804000
   ASMB( CAB,CAB );  << PUT ADDRESS ABOVE INSTRUCTION >>                05806000
   TOS := TOS-DOUBLE(P)+DOUBLE(F(F(0)+CST*CST'SIZE).(4:12)*4)-1D;       05808000
   << THE ABOVE MONSTER IS THE ADDRESS OF PL >>                         05810000
   << CHECK FOR P IN BOUNDS >>                                          05812000
   IF  K > DS1  THEN  FAIL;                                             05814000
   LDAD;  << GET STT SIZE >>                                            05816000
   X := TOS.(8:8);                                                      05818000
   J :=  I := 0;  << INITIAL PL VALUES >>                               05820000
   DO                                                                   05822000
      BEGIN  << SEARCH THE STT >>                                       05824000
      I := I+1;                                                         05826000
      S0 := S0-1;  << BACK UP ADDRESS POINTER >>                        05828000
      LDAD;  << GET THE LABEL >>                                        05830000
      IF  TOS = @HELP  THEN  J := I;  << FOUND IT >>                    05832000
      END                                                               05834000
   UNTIL  DXBZ;                                                         05836000
   PUSH(STATUS);  IF  TOS.(8:8) = CST  THEN  J := @HELP.(1:7);          05838000
   IF  J = 0  THEN  FAIL;                                               05840000
   DDEL;  << GET RID OF THE ADDRESS INTO THE STT >>                     05842000
   TOS := P;  P := 0;                                                   05844000
   TOS := CST;  CST := 0;   << STACK THE VITALS >>                      05846000
   TOS.(0:8) := S7;  << A FROM THE CALL >>                              05848000
                                                               <<01364>>05850000
   IF (S7 <<A>> = 1) AND (NUM'BPTS >= MAX'BPTS - 1)            <<01364>>05852000
     THEN FAIL;  << NOT ENOUGH ROOM IN TABLE >>                <<01364>>05854000
                                                               <<01364>>05856000
   IF  NOT FIND  THEN  FAIL;  << GET A ZERO ENTRY >>                    05858000
   << CHECK FOR A <LEXP> >>                                             05860000
   IF  S7 <<A>> = 1  AND  P2F  THEN                                     05862000
      IF  TOKEN = %15  THEN                                             05864000
         BEGIN  << JUST A COUNT >>                                      05866000
         S3.(0:8) := 1;  << SET THE RELOP >>                            05868000
         S3.(8:8) := 0;  << CLEAR BANK >>                      <<01364>>05870000
         S4 := S5 := INTEGER(P2);  << SET COUNT >>                      05872000
         END                                                            05874000
      ELSE                                                              05876000
         BEGIN                                                          05878000
         TOS := -1;                                                     05880000
         X := 0;                                                        05882000
         DO  IF  REL(X) = TOKEN  THEN  S0 := X+2                        05884000
         UNTIL  (X:=X+1) = 4;                                           05886000
         IF  S0 = -1  THEN  FAIL;                                       05888000
         S4.(0:8) := TOS;                                               05890000
         CHAR;  << SCAN OFF THE RELOP >>                                05892000
         S5 := INTEGER(EXP);                                            05894000
         IF  TOKEN <> %15  THEN  FAIL;                                  05896000
         END;                                                           05898000
   X := I;  << SET UP ENTRY >>                                          05900000
   I := 6;                                                              05902000
   DO                                                                   05904000
      BEGIN  << MOVE FROM STACK TO TABLE >>                             05906000
      BPTAB(X) := TOS;                                                  05908000
      X := X+1;                                                         05910000
      I := I-1;                                                         05912000
      END                                                               05914000
   UNTIL  =;                                                            05916000
                                                               <<01364>>05918000
   NUM'BPTS := NUM'BPTS + 1;                                   <<01364>>05920000
                                                               <<01364>>05922000
   << SET UP THE PCAL INTO THE SEGMENT >>                               05924000
   TOS := K;  << GET ADDRESS >>                                         05926000
   TOS := J+%031000;  << FORM THE PCAL >>                               05928000
   STAD;  << STORE IT >>                                                05930000
   DDEL;                                                                05932000
   END;                                                                 05934000
                                                                        05936000
SUBROUTINE DUM(A);                                                      05938000
   VALUE A;  INTEGER A;                                                 05940000
<<                                                                      05942000
HELPER FUNCTION FOR DUMP AND MODIFY                                     05944000
>>                                                                      05946000
   BEGIN                                                                05948000
   TOS:=P1&DLSR(16);    << BANK NUMBER >>                      <<01364>>05950000
   NUMOUT(*, 0, 6);                                            <<01778>>05952000
   WRDIO(3):=" @";                                             <<01778>>05954000
   TOS:=P1&DLSL(16);    << USE ONLY 1 WORD >>                  <<01364>>05956000
   TOS:=TOS&DLSR(16);   << FOR ADDRESS     >>                  <<01364>>05958000
   NUMOUT(*, 8, 6);                                            <<01778>>05960000
   WRDIO(7):=": ";                                             <<01778>>05962000
   TOS := P1;                                                           05964000
   IF S1 > BANKS'CONFIGURED THEN FAIL;                         <<01778>>05966000
   LDAD;                                                                05968000
   ASMB( ZERO,XCH );  << FORM INTO 32 BIT VALUE >>                      05970000
   NUMOUT( *, S5, 6 );                                                  05972000
   DDEL;                                                                05974000
   P1 := P1+1D;                                                         05976000
   P2 := P2-1D;                                                         05978000
   END;                                                                 05980000
                                                                        05982000
SUBROUTINE DUMP;                                                        05984000
<<                                                                      05986000
DUMPS MEMORY LOCATIONS WHEN CALLED                                      05988000
>>                                                                      05990000
   DO                                                                   05992000
      BEGIN  << DUMP A WORD >>                                          05994000
      DUM(16);                                                 <<01778>>05996000
      PRINT( -22 );                                            <<01778>>05998000
      I := 0;                                                           06000000
      WHILE  (I:=I+1) < 8  AND  P2 > 0D  DO                             06002000
         BEGIN                                                          06004000
         DUM(2);                                                        06006000
         WRDIO := "  ";                                                 06008000
         PRINT(-8);                                                     06010000
         END;                                                           06012000
      PRINT(0);                                                         06014000
      END                                                               06016000
   UNTIL  P2 <= 0D;                                                     06018000
                                                                        06020000
SUBROUTINE MODIFY;                                                      06022000
<<                                                                      06024000
DOES MODIFICATIONS TO MEMORY                                            06026000
>>                                                                      06028000
   DO                                                                   06030000
      BEGIN  << DO A WORD >>                                            06032000
      TOS := P1;                                                        06034000
      IF S1 > BANKS'CONFIGURED THEN FAIL;                      <<01778>>06036000
      DUM(16);                                                 <<01778>>06038000
      WRDIO(11) := " _";                                       <<01778>>06040000
      PRINT( -24 );                                            <<01778>>06042000
      GETINPUT;   << GET MODIFIED VALUE >>                              06044000
      TOS := EXP;  << GET THE NEW VALUE >>                              06046000
      DELB;  << SHORTEN IT >>                                           06048000
      STAD;  << STORE IT >>                                             06050000
      DDEL;  << DELETE THE ADDRESS >>                                   06052000
      END                                                               06054000
   UNTIL  P2 <= 0D;                                                     06056000
                                                                        06058000
SUBROUTINE LIST;                                               <<01364>>06060000
COMMENT                                                        <<01364>>06062000
   LISTS USER SET BREAK POINTS.                                <<01364>>06064000
;                                                              <<01364>>06066000
                                                               <<01364>>06068000
   BEGIN                                                       <<01364>>06070000
   I := X := 0;                                                <<01364>>06072000
   DO                                                          <<01364>>06074000
      IF BPTAB(X).(0:8) = 1 THEN                               <<01364>>06076000
        BEGIN                                                  <<01364>>06078000
        TOS := DOUBLE(BPTAB(X).(8:8));                         <<01364>>06080000
        TOS := DOUBLE(BPTAB(X:=X+1));                          <<01364>>06082000
        NUMOUT(*,4,5);                                         <<01364>>06084000
        NUMOUT(*,0,3);                                         <<01364>>06086000
        IO(3) := ".";                                          <<01364>>06088000
        PRINT(9);                                              <<01364>>06090000
        END                                                    <<01364>>06092000
   UNTIL BPTAB(I:=I+6) = -1;                                   <<01364>>06094000
   END;                                                        <<01364>>06096000
                                                                        06098000
SUBROUTINE  EXIT;                                                       06100000
<<                                                                      06102000
RETURNS TO THE USER PROGRAM                                             06104000
>>                                                                      06106000
   BEGIN                                                                06108000
   TOS := OLDDB;  SET(DB);                                              06110000
   TOS := P1;  TOS := TOS+%31400;                                       06112000
   ASMB( XEQ 0 );  << CUT BACK STACKED PARAMETERS, EXIT >>              06114000
   END;                                                                 06116000
                                                                        06118000
                                                                        06120000
SUBROUTINE PRINTIOQS;                                                   06122000
<<                                                                      06124000
  THIS SUBROUTINE PRINTS A LIST OF IOQS. THE FIRST PARAMETER OF THE     06126000
  COMMAND SPECIFIES THE LDEV NUMBER OR IF ZERO NO LDEV IS SPECIFIED.    06128000
  THE 2ND PARAMETER SPECIFIES THE NUMBER OF IOQS TO PRINT. THE IOQS     06130000
  ARE PRINTED IN THE REVERSE ORDER OF AGE, THAT IS, THE LAST EVENT      06132000
  IS PRINT FIRST.                                                       06134000
>>                                                                      06136000
  BEGIN                                                                 06138000
    L := INTEGER(P1);      << LOGICAL DEVICE NUMBER >>                  06140000
    J := INTEGER(P2);      << NUMBER OF IOQS TO PRINT >>                06142000
    COM := 0;   << HOLDS INDEX OF LAST IOQ PRINTED >>                   06144000
                                                                        06146000
FINDLOOP:                                                               06148000
    I := IOQP(2);   << GET INDEX OF OLDEST IOQ >>                       06150000
    IF I<>COM THEN  <<LAST NOT OLDEST SO LOOK FOR ONE >>                06152000
      BEGIN                                                             06154000
        WHILE IOQP(I+1)<>COM DO I := IOQP(X);<< FIND PRECEEDING IOQ >>  06156000
        COM := I;      << SAVE NEW CURRENT IOQ >>                       06158000
        IF L<>0 AND L<>IOQP(I+2).(8:8) THEN                             06160000
          GOTO FINDLOOP;  << NOT CORRECT LDEV, FIND NEXT IOQ >>         06162000
                                                                        06164000
        P1 := DOUBLE(F(%1005)+%1000+I);    << ABSOLUTE ADDR OF IOQ >>   06166000
        P2 := 11D;  DUMP;  << PRINT 11 WORD IOQ >>                      06168000
        IF (J:=J-1)>0 THEN GOTO FINDLOOP;  << DO NEXT IOQ >>            06170000
      END;                                                              06172000
  END;  << PRINT IOQ >>                                                 06174000
                                                                        06176000
<<                                                                      06178000
                                                                        06180000
START OF THE PROCEDURE BODY                                             06182000
                                                                        06184000
>>                                                                      06186000
DISABLE;  << TURN OFF INTERRUPTS >>                                     06188000
<< DECIDE WHY WE STOPPED >>                                             06190000
TOS := 0D;                                                              06192000
PUSH(STATUS);                                                           06194000
ASMB( DUP );                                                            06196000
TOS.(2:1) := 0;  SET(STATUS);  << TURN OFF THE TRAPS >>                 06198000
TOS := TOS.(8:8);                                                       06200000
TOS := CST'ADDR( * );   TOS := TOS+@BP'TAB;                             06202000
ASMB( XCHD 0 );  OLDDB := TOS;                                          06204000
P := SMP-1;  << GET P FROM STACK MARKER >>                              06206000
CST := SMSTA.(8:8);  << GET THE STATUS >>                               06208000
TOS := DOUBLE( P );  TOS := DOUBLE( CST );  << SAVE TO PRINT >>         06210000
                                                                        06212000
IF  FIND  THEN                                                          06214000
   BEGIN  << IN THE BREAKPOINT TABLE >>                                 06216000
   TOS := CST'ADDR( CST )+DOUBLE( P );                                  06218000
   SMP := P;  << DECREMENT EXIT ADDRESS >>                              06220000
   IF  BPTAB(I).(0:8) = 2  THEN                                         06222000
      BEGIN  << A FAKE BREAKPOINT >>                                    06224000
      LDAD;  << GET THE PCAL FROM THE WORD >>                           06226000
      J := TOS;  << SAVE IT >>                                          06228000
      TOS := BPTAB(I+2);                                                06230000
      STAD;  << RESTORE THE INSTRUCTION >>                              06232000
      CLEAR;  << REMOVE THE FAKE BREAKPOINT >>                          06234000
      TOS := TOS-1;                                                     06236000
      TOS := J;                                                         06238000
      STAD;  << PUT THE PCAL BACK INTO THE LOCATION >>                  06240000
OUT:  TOS := OLDDB;  SET(DB);  RETURN;                                  06242000
      END;                                                              06244000
   TOS := BPTAB(I+2);  << RESTORE INSTRUCTION AT BREAKPOINT >>          06246000
   STAD;  DDEL;                                                         06248000
   TOS := I;  << SAVE I >>                                              06250000
   P := P+1;  << SET A FAKE BREAKPOINT >>                               06252000
   BREAK( 2 );                                                          06254000
   I := TOS;  << RESTORE I >>                                           06256000
   TOS := BPTAB(I+3).(8:8);   << GET THE BANK >>               <<01778>>06258000
   TOS := BPTAB(X:=X+1);  << GET LOW ORDER 16 BITS >>                   06260000
   LDAD;  << GET TEST VALUE >>                                          06262000
   TOS := BPTAB(X:=X+1);   << GET THE CONSTANT >>                       06264000
   CASE  *BPTAB(I+3).(0:8)  OF                                          06266000
      BEGIN  << DO THE CORRECT TEST >>                                  06268000
      DDEL  << NULL >>;  << DO IT >>                                    06270000
         BEGIN                                                          06272000
         X := I+4;                                                      06274000
         BPTAB(X) := BPTAB(X)-1;                                        06276000
         IF  >  THEN  GO OUT;  << NOT COUNTED, SO EXIT >>               06278000
         TOS := BPTAB(X:=X+1);                                          06280000
         BPTAB(X:=X-1) := TOS;  << RESET THE COUNT >>                   06282000
         DDEL;                                                          06284000
         END;                                                           06286000
      IF  TOS >= TOS  THEN  GO OUT;                                     06288000
      IF  TOS <> TOS  THEN  GO OUT;                                     06290000
      IF  TOS <= TOS  THEN  GO OUT;                                     06292000
      IF  TOS = TOS  THEN  GO OUT;                                      06294000
      END;                                                              06296000
   DDEL;                                                                06298000
   END;                                                                 06300000
                                                                        06302000
<< PRINT THE WELCOME MESSAGE >>                                         06304000
PRINT( 0 );  << NEWLINE >>                                              06306000
X := 4;  DO  WRDIO(X) := PRE(X)  UNTIL  (X:=X-1)<0;                     06308000
NUMOUT( *, 5, 3 );                                                      06310000
NUMOUT( *, 9, 5 );                                                      06312000
PRINT( 14 );                                                            06314000
PUSH( S );  OLDS := TOS;  << SAVE FOR FAIL >>                           06316000
                                                                        06318000
<< COMMAND INPUT LOOP >>                                                06320000
                                                                        06322000
COMIN:                                                                  06324000
                                                                        06326000
IO := "-";  PRINT( -1 );  << PRINT THE PROMPT >>                        06328000
GETINPUT;   << GET COMMAND STRING >>                                    06330000
CST := 0;                                                               06332000
X := NUM'CMNDS - 1;                                            <<01364>>06334000
DO                                                                      06336000
   BEGIN                                                                06338000
   IF COMM(X) = TOKEN  THEN  GO FND;                                    06340000
   X := X-1;                                                            06342000
   END                                                                  06344000
UNTIL <;                                                                06346000
FAIL;  << ILLEGAL COMMAND >>                                            06348000
                                                                        06350000
FND:  << LEGAL COMMAND IF YOU GET HERE >>                               06352000
                                                                        06354000
COM := X;  << SAVE THE COMMAND >>                                       06356000
CHAR;  << SCAN OFF THE COMMAND >>                                       06358000
P1 := 0D;                                                               06360000
IF (COM <> 4) AND (COM <> 6) THEN                              <<01364>>06362000
   BEGIN  << GET THE PARAMETERS >>                                      06364000
   P1 := EXP;                                                           06366000
   P2 := 0D;                                                            06368000
   P2F := FALSE;                                                        06370000
   IF  TOKEN = ","  AND  COM <> 1 THEN                                  06372000
      BEGIN  << GET A SECOND PARAMETER >>                               06374000
      CHAR;                                                             06376000
      P2 := EXP;                                                        06378000
      P2F := TRUE;                                                      06380000
      END;                                                              06382000
   END                                                                  06384000
ELSE  IF (COM = 4) AND (TOKEN <> %15) THEN                     <<01364>>06386000
   BEGIN  << GET STACK CUT BACK PARAMETER >>                            06388000
   P1 := SEXP;                                                          06390000
   IF  P1 > 255D  THEN  FAIL;                                           06392000
   END;                                                                 06394000
                                                                        06396000
IF  TOKEN <> %15  AND  COM <> 0  THEN  FAIL;  << ERROR >>               06398000
                                                                        06400000
CASE  *COM  OF                                                          06402000
   BEGIN                                                                06404000
   BREAK( 1 );                                                          06406000
   CLEAR;                                                               06408000
   DUMP;                                                                06410000
   MODIFY;                                                              06412000
   EXIT;                                                                06414000
   PRINTIOQS;                                                           06416000
   LIST;                                                       <<01364>>06418000
   END;                                                                 06420000
GO COMIN;                                                               06422000
END;  << HELP >>                                                        06424000
                                                                        06426000
$CONTROL SEGMENT=MAIN                                                   06428000
END.     << HARDRES >>                                                  06430000
