$CONTROL MAP,CODE,USLINIT                                               00010000
<<HARDRES - MODULE 55    >>                                             00012000
<< HP32002B 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
$THIRTY                                                                 00030000
$CONTROL SEGMENT=HARDRES,MAIN=HARDRES                          <<00652>>00032000
$CONTROL PRIVILEGED ,MAP, CODE                                          00034000
                                                               <<03032>>00038000
                                                               <<03032>>00040000
BEGIN                                                          <<03032>>00042000
                                                               <<03032>>00044000
  DEFINE  DEVTYPEF   = (10:6)#,  <<TYPE FROM LDT2>>            <<03032>>00046000
          SUBTYPEF   = (12:4)#,      <<  L  >>                 <<03032>>00048000
          FORS       = (11:1)#,      <<  P  >>                 <<03032>>00050000
          NSDF       = ( 4:1)#,      <<  D  >>                 <<03032>>00052000
          JDFIELD    = ( 2:2)#,      <<  T  >>                 <<03032>>00054000
          DRSTATE    = ( 0:2)#,      <<  1  >>                 <<03032>>00056000
                                                               <<03032>>00058000
          << ---- WARNING "LPDT1" IS DEFINED LOCALLY ---- >>   <<03032>>00060000
                                                               <<03032>>00062000
          NONSYSDEV  = LPDT1.NSDF=1#,                          <<03032>>00064000
          NOTFOREIN  = LPDT1.FORS=0#,                          <<03032>>00066000
          UNOWNED    = LPDT1.DRSTATE=0#,                       <<03032>>00068000
          ALLOCATED  = LPDT1.DRSTATE=1#,                       <<03032>>00070000
          JDACCPT    = LPDT1.JDFIELD<>0#,                      <<03032>>00072000
          STYPE      = LPDT1.SUBTYPEF#,                        <<03032>>00074000
                                                               <<03032>>00076000
          << ---- WARNING "TYPE" IS DEFINED LOCALLY ---- >>    <<03032>>00078000
                                                               <<03032>>00080000
          D7905R     = ( TYPE=0 LAND STYPE= 4 )#,              <<03032>>00082000
          D7905F     = ( TYPE=0 LAND STYPE= 5 )#,              <<03032>>00084000
          D7920      = ( TYPE=0 LAND STYPE= 8 )#,              <<03032>>00086000
          D7925      = ( TYPE=0 LAND STYPE= 9 )#,              <<03032>>00088000
          D7906R     = ( TYPE=0 LAND STYPE=10 )#,              <<03032>>00090000
          D7906F     = ( TYPE=0 LAND STYPE=11 )#,              <<03032>>00092000
          FLOPPY     = ( TYPE=2 )#,                            <<03032>>00094000
          D7935      = ( TYPE=3 LAND STYPE= 8 )#,              <<03032>>00096000
          LINUS      = ( TYPE=3 LAND STYPE= 0 )#,              <<03032>>00098000
          MAGTAPE    = ( TYPE=24 )#,                           <<03032>>00100000
          DISCDEVICE = ( 0 <= TYPE <= 7 )#,                    <<03032>>00102000
          REMOVABLE  = (D7920 OR D7925 OR D7905R OR D7906R     <<03032>>00104000
                        OR FLOPPY OR D7935 OR LINUS)#,         <<03032>>00106000
          SPLITDISC  = D7905F OR D7906F#;                      <<03032>>00108000
                                                               <<03032>>00110000
  EQUATE  SERVREQ    = 2,                                      <<03032>>00112000
          SERVGRNTD  = 3,                                      <<03032>>00114000
    ABORT'IO  = 66,        << SCCP ABORTIO AND PROCIO FUNCTION >>       00116000
    ACK        = 6,         << ASCII ACKNOWLEDGE CHARACTER >>           00118000
    ACKINTRPT  = 1,         << ACKNOWLEDGE TERMINAL MPX INTERRUPT >>    00120000
    ACTIVE'   = 2,         << MONITOR IS RUNNING AGAINST THIS DEVICE >> 00122000
    ATTN      = %37,       << ATTENTION NEEDED STATUS >>       <<RH.PV>>00126000
    BANDWAIT  = 5,         << WAITING FOR LESS TERM ACTIVITY >>         00128000
    BELLS     =%3407,      << ASCII BELL/BELL>>                <<RK.05>>00130000
    BINARYREAD'=11,        << BINARY READ OR WRITE ENQ/ACK WAIT >>      00132000
    BLKDIO    =%200,       << BLOCKED I/O WAIT BIT >>                   00134000
    BLOCKED'  = 5,         << BLOCKED I/O REQUEST >>                    00136000
    BLOCKTIMEOUT=8,        << BLOCK READ TIMER TYPE >>         <<02006>>00138000
    BREAK'    = 10,        << BREAK IS ALLOWED AND HAS BEEN DETECTED >> 00140000
    BREAKSTOP = 1,         << READ STOP CODE AFTER BREAK ACCEPTED >>    00142000
    BRKBIT    =%10,        << BREAK SERVICE REQUEST TO TERM >>          00144000
    BRKSTATUS'= 7,         << BREAK DETECTED STATUS OF TIO >>           00146000
    CB'       = 5,         << CLEAR TO SEND, REQST TO SEND DELAYED >>   00148000
    CCE       = 2,                                                      00150000
    CCG       = 0,                                                      00152000
    CCL       = 1,                                                      00154000
    CF'       = 4,         << CARRIER DETECTED IF SET >>                00156000
    CFAILTO   = 1,         << CARRIER FAIL TIME OUT REQUEST >>          00158000
    CHARLOST' = 6,         << INTERRUPT NOT SERVICED IN TIME >>         00160000
    CLK       =3,           <<SYSTEM CLOCK DRT#>>              <<00652>>00162000
    CMODE'    =11,         << TERMINAL IS IN CONSOLE MODE >>            00164000
    CNTRLA     = 1,         << ASCII CONTROL A CHARACTTER >>            00166000
    CNTRLX     =%30,        << ASCII CONTROL X CHARACTER >>             00168000
    CNTRLY     =%31,        << ASCII CONTROL Y CHARACTER >>             00170000
    COMPLETED'= 6,         << I/O REQUEST HAS BEEN COMPLETED >>         00172000
    CORERES'  = 10,        << DRIVER CODE IS CORE RESIDENT >>           00174000
    CPCB      = 4,         << CURRENT PCB INDEX >>                      00176000
    CR        =%15,                                                     00178000
    CRLF      =%6412,      << ASCII CR / LF >>                          00180000
    CRWAIT    = 6,         << WAITING FOR CR TO END READ >>             00182000
    CRWAITLF  = 7,         << WAIT FOR CR TO END READ, THEN DO LF >>    00184000
    DATAFRZN' = 7,         << DATA SEGMENT IS FROZEN (IOQ) >>           00186000
    DBCNT     =12,         << READ,WRITE BYTE COUNTER AND LIMITS >>     00188000
    DBREAK    =30,         << IOQP TO SAVED BROKEN READ DATA >>         00190000
    DBTIME    = 16,        << BLOCK TIME INDEX TO DIT >>       <<02006>>00192000
    DC2       =%22,        << 2640 RESPONSE TO DC1(XON) SENT OUT >>     00194000
    DC2PAIR   = 9,         << LAST CHAR WAS A DC2 & 1ST IN BUFFER >>    00196000
    DCNTRL    =10,         << MULTIPLEXOR CONTROL WORD AND NEXT DSTATE>>00198000
    DCNT      = 18,        << COUNT TO UNUSUAL RD/WRT ACTION >>         00200000
    DDLTP     = 4,         << DLT POINTER >>                            00202000
    DELETECR  =%13,        << DOING A CR AFTER CNTRL X DELETE >>        00204000
    DELETEPAIR= 2,         << LAST PAIR CHAR WAS A CONTROL H >>         00206000
    DELECHO'  = 2,         << ECHO A \ ON CHARACTER DELETION >>         00208000
                           << 0 - NOTHING, 1 - \, 2 - LF, 3 - C'Y >>    00210000
    DHEAD     = 19,        << SYSDB POINTER TO HEAD OF TBUF LIST >>     00212000
    DILTP     = 5,         << ILT POINTER >>                            00214000
    DINTP     = 4,         << SPECIAL INTERRUPT HANDLER PLABEL >>       00216000
    DINIT     = 2,         << INITIATOR PLABEL >>                       00218000
    DIOQP     = 2,         << IOQ POINTER TO FIRST REQUEST >>           00220000
    DISC'     =  1,        << DEVICE IS A DISC (DIT) >>                 00222000
    DLAST     =23,                                                      00224000
    DLINK     = 1,         << POINTER TO NEXT DIT REQUESTING RESOURCE >>00226000
    DLDEV     = 3,         << LOGICAL DEVICE AND UNIT NUMBERS >>        00228000
    DMAMQ     =  8,        << POINTER TO MAM REQUEST QUEUE >>           00230000
    DMNTR     = 1,         << MONITOR PLABEL >>                         00232000
    DNXTB     = 25,        << TBUF POINTER OF A SAVE TBUF IF NOT 0 >>   00234000
    DPCBN     = 8,         << TYPE 3 DRIVER PCB NUMBER >>               00236000
    DMODEM    = 8,         << MODEM TYPE AND STATE  >>                  00238000
    DMONTR    = 33,        << HOLDS MONITORING CODE >>         <<00.06>>00240000
    DPNTR     = 21,        << BYTE POINTER TO ACCESS TBUFS >>           00242000
    DRBCT     = 11,        << REQUESTED TRANSFER COUNT IN BYTES >>      00244000
    DRQST     = 6,         << MONITOR SERVICE REQUEST FLAGS >>          00246000
                           << 0 - HANGUPTO    8  - READTO               00248000
                              1 - DISCONNECT  9  - ONLINE               00250000
                              2 - CFAILTO     10 - DSTREADY             00252000
                              3 - TURNTO      11 - LOGONTO              00254000
                              4 - IOERROR     12 - BREAK                00256000
                              5 - IODONE      13 - CONTROL Y            00258000
                              6 - SPOOLEND    14 - CFAIL                00260000
                              7 - SPOOLSW     15 - UNUSED               00262000
                           >>                                           00264000
    DRT3      = 3,                                             <<02500>>00266000
    DRTADDR   =9,   <<THIS WILL HOLD OFFSET FOR DRT TABLE>>    <<03032>>00268000
    DRTBANK   =8,   <<THIS WILL HOLD BANK DRT TABLE IS IN>>    <<03032>>00270000
    DRTMAX    =28,         << MAXIMUM TIME FOR READ TIMEOUT, SECONDS >> 00272000
    DRTIME    =26,         <<  INDEX TO I/O READ TIME >>                00274000
    DRTIMED   =DRTIME/2,   << DOUBLE INDEX TO I/O READ TIME >>          00276000
    DSAVE     =13,         << HOLDS WAITED DSTATE, HSTATE & TURN CHAR >>00278000
    DSERR     = 7,         << HARDWARE I/O ERROR STATUS IN DIT >>       00280000
    DSPEED    = 9,         << MULTIPLEXOR SPEED AND OTHER FLAGS >>      00282000
    DSIZE     = 5,         << DIT SIZE AND DEVICE TYPE WORD >>          00284000
    DSTAT1    = 18,        << DIT - REQUEST STATUS (WORD1)>>   <<00.PV>>00286000
    DSTAT2    = 19,        << DIT - REQUEST STATUS (WORD2)>>   <<00.PV>>00288000
    DSTATE'   =12,         << DEVICE STATE                              00290000
                               0 - NULL         %10 - EOR SYNC          00292000
                               1 - WRITING      %11 - WRITE BUF FILL    00294000
                               2 - READING      %12 - SEND XON NEXT     00296000
                               3 - XON WRITE    %13 - DELETE CR         00298000
                               4 - WRITE TURN   %14 - SYNCS OR "!"S     00300000
                               5 - BAND WAIT    %15 - READ DATA ECHO    00302000
                               6 - EOR LF       %16 - START READ        00304000
                               7 - EOR CR       %17 - STOP READ >>      00306000
    DSTOP     = 14,        << SUB SYS BRK AND EOR CHARACTERS >>         00308000
    DSYNC     = 29,        << CR,LF SYNC DATA AND SYNC COUNTER >>       00310000
    DTAIL     = 20,        << SYSDB POINTER TO END OF TBUF LIST >>      00312000
    DTBLK     = 24,        << LINK WORD FOR QUEUED TBUF REQUESTS >>     00314000
    DSTAT     = 6,         << LAST HARDWARE INTERRUPT STATUS >>         00316000
    DTBUF     =18,         << FIRST TBUF POINTER  >>                    00318000
    DTBUFD    = DTBUF/2,   << DOUBLE INDEX TO FIRST TWO TBUF POINTERS >>00320000
    DTRLX     = 31,        << TIME OUR REQUEST TRLX'S >>                00322000
    DTYPE     = 7,         << PAIRCODE, TERMTYPE, HSTATE,TIMER FLAGS>>  00324000
    DTYPEDLT  = 5,         << DIT SIZE,DEVICE TYPE>>           <<00192>>00326000
    DVRFRZN'  =  8,        << DRIVER CODE IS FROZEN (DLT) >>            00328000
    DWAIT     = 15,        << DITP TO NEXT DEV ON ACTIVITY WAIT >>      00330000
    ECHO'     = 3,         << INPUT IS TO BE ECHOED TO OUTPUT CHANNEL >>00332000
    ECHOOFF   = 0,         << TURN ECHO OFF CODE TO MPXCONTROL >>       00334000
    ENQ       = 5,         << ENQ CODE TO 2640 >>                       00336000
    ENQACKWAIT'= 11,       << WAITING TO AN ACK AFTER AN ENQ >>         00338000
    ENTER     = 8,         << DC2 LAST, POSSIBLE NO ECHO "ENTER" >>     00340000
    EORCR     = 7,         << DSTATE - EOR CR IN PROGRESS >>            00342000
    EORLF     = 6,         << DSTATE - EOR LF IN PROGRESS >>            00344000
    ESC       =%33,        << ESC CHARACTER >>                          00346000
    ESCPAIR   = 3,         << LAST PAIR CHARACTER WAS ESC     >>        00348000
    ETX       = 3,         << ASCII END OF TEXT >>                      00350000
    ETXSENT'  = 10,        << ETX SENT TO TERMINAL ON 202 >>   <<00.02>>00352000
    FORMFEED'  = 4,        << DEVICE RESPONDES TO A FORM FEED >>        00354000
    FF        =%14,        << FORM FEED >>                              00356000
    FIRSTINDEX=  8,        << INDEX TO FIRST BUFFER OF TABLE >>         00358000
    HIOPCODE  = 1,                                             <<02500>>00360000
    HP2631B   = 19,        << REMOTE LINE PRINITER T. T. >>    <<01472>>00362000
    HP2635A   = 15,        << T. T. FOR 8 BIT 2635 >>          <<01472>>00364000
    HP2640X   = 11,        << 2640 WITH NO ECHO ON START READ >>        00366000
    HP2640TO  = 0,         << 2640/44 READ/WRITE TIME OUT REQUEST >>    00368000
    IAK'      =  8,        << DEVICE HAS INTERRUPTED (DIT) >>           00370000
    ICDP      = 11,                                            <<02500>>00372000
    ICPGM     = 6,         << Next channel pgm adr to start >> <<03095>>00374000
    ICPVA0    = 0,                                             <<02500>>00376000
    ICPVA1    = 1,                                             <<02500>>00378000
    ICPVA2    = 2,                                             <<02500>>00380000
    ICPVA3    = 3,                                             <<02500>>00382000
    ICPVA4    = 4,                                             <<02500>>00384000
    ICPVA5    = 5,                                             <<02500>>00386000
   ICNTRL     =  7, << DISPLACEMENT IN ILT OF DRT # >>         <<01300>>00388000
    IFLAG     = 13,        << FLAGS WORD OF ILT >>             <<01300>>00390000
    IDITP     = 14,         << BEGINNING OF DITP'S IN ILT >>   <<01300>>00392000
    IGNOREHI' = 2,                                             <<02500>>00394000
    IMPEDABLE = 4,         << AWAKEIO CALLER MAY BE IMPEDED >>          00396000
    INITCODE  = 6,                                             <<02500>>00398000
    INTRPTOFF = 2,         << DISABLE INTRPTS & ECHO ON READ CHANNEL >> 00400000
    INITDSET  = 0,         << INITIALIZE DATA SET CONTROL CODE >>       00402000
    IOPROG'   = 7,         << SIO PROGRAM IN PROGRESS >>                00404000
    IOWAIT    =%100,       << UNBLOCKED I/O WAIT CODE >>                00406000
    IOWAKE'   = 4,         << WAKE CALLER ON COMPLETION IF SET >>       00408000
    IQUEUE    = 12,       << CONTROLLER QUEUE # IN ILT >>      <<01300>>00410000
    ISIOP     = 8,         << POINTS TO SIO PROGRAM AREA >>    <<01300>>00412000
    ISTAP     = 9,                                             <<02500>>00414000
    IUNIT     = 10,        << UNIT EXTRACT,CONTROLLER RESOURCE >><<WEO>>00416000
    JUNKWAIT  = %20,                                                    00418000
    LF        =%12,                                                     00420000
    LPDTSIZE  = 2,         << SIZE  OF LPDT ENTRY >>           <<00148>>00422000
    LFLAGS    =  1,        << FLAGS WORD OF LPDT >>                     00424000
    LIM       = 0,         << LIMIT WORD OF TABLE ALLOCATION >>         00426000
    LOGGINGON = 2,         << HSTATE LOGGING ON >>                      00428000
    LOGONTO   = 4,         << LOG ON TIME OUT REQUEST TYPE >>           00430000
    LOSTCHAR  = 4,         << MPX NOT SERVICED IN TIME >>               00432000
    LOSTDATA  = 3,         << BUFFER NOT AVAILABLE >>                   00434000
    LYNX'TYPE = %50017,    << Channel ID of LYNX >>            <<03697>>00436000
    M202'     = 2,         << 202 OR 2002 MODEM >>                      00438000
    M202      =M202'+1,    << CIRCULAR SHIFT COUNT TO GET 202 TO BIT15>>00440000
    MAILBOX   = %770,                                          <<02500>>00442000
    MAMERRORC'= 9,         << MAM ERROR BIT IN DLT >>                   00444000
    MAMERRORD'= 8,         << MAM ERROR BIT IN IOQ >>                   00446000
    MAXTIO    = 12,        << MAX TERM I/O TO PREVENT BLOCK OVERRUNS >> 00448000
    MB0       = MAILBOX,                                       <<02500>>00450000
    MB1       = MAILBOX + 1,                                   <<02500>>00452000
    MB2       = MAILBOX + 2,                                   <<02500>>00454000
    MB3       = MAILBOX + 3,                                   <<02500>>00456000
    MB4       = MAILBOX + 4,                                   <<02500>>00458000
    MB5       = MAILBOX + 5,                                   <<02500>>00460000
    MB6       = MAILBOX + 6,                                   <<02500>>00462000
    MB7       = MAILBOX + 7,                                   <<02500>>00464000
    MHDISC'   =  9,        << DEV = A MOVING HEAD DISC (DIT) >><<RK0PV>>00466000
    MINIBEE   = 9,         << TERMINAL TYPE OF MINIBEE, HP 2615 >>      00468000
    MUNIT'    = 5,         << MULTIPLE DEVICES HAVING ONE CONTROLLER >> 00470000
    NEWLINE'  = 8,         << LF WAS LAST CHARACTER OUTPUT >>           00472000
    NODATAYET  = 4,         << READ STARTED BUT NO DATA INPUT >>        00474000
    NOECHO    = 5,         << READ STARTED WITH NO ECHO,FOR "ENTER" ? >>00476000
    NOIMPEDE  = 0,         << DONT IMPEDE FLAG TO AWAKEIO >>            00478000
   NON'RESP'DEV'MSG=409,  << DRT not responding msg # >>       <<04771>>00480000
    NOPCB     = %13,       << NO PCB IS TO BE ASSOCIATED WITH THE IO >> 00482000
    NOPROTOCOL= 18,   <<TERM TYPE WITH OUT DC1 READ OR ENQ>>   <<01242>>00484000
    NOPTY'    = 2,         <<8-BIT DATA  FLAG-->>              <<AMS00>>00486000
                          <<SET IN 8TH BIT>>                   <<AMS00>>00488000
    NOTRDYMSG = 11,        << NOT READY LDEV MESSAGE NUMBER >>          00490000
    NOTREADING = 0,         << DEVICE NOT IN READING STATE >>           00492000
    NOSYNC'   = 7,         << 2640 SERIES TERMINAL >>                   00494000
    NOWAIT    = 0,         << DONT WAIT IN WAKE >>                      00496000
    NULL      = 0,                                                      00498000
    ONLINE    = 1,         << SPEED SENSED AND CAN DO I/O HSTATE >>     00500000
    OPCONSOLE = 0,         << OUTPUT MESSAGE TO OPERATOR >>             00502000
    PAPOUTMSG = 14,        << CI MSG INDEX FOR PAPER OUT >>    <<01472>>00504000
    PAIR'     = 7,         << ESCAPE OR TERMINET XOFF LAST >>           00506000
    PARITY'   = 8,         << SENSE OF PARITY WRITTEN OR READ >>        00508000
    PCBB      = 3,         << BASE OF PCB TABLE >>                      00510000
    PCB3      = 3,         << FOURTH WORD OF PCB >>                     00512000
    PCB8      = 8,         << PCB IMPEDE LINK WORD >>                   00514000
    PCBSIZE   =16,                                                      00516000
    PREMPTSTOP= 3,         << STOP READ FOR PREMPTIVE REQUEST >>        00518000
    PREQ'     = 9,         << I/O REQUEST HAS BEEN PRE-EMPTED BY MAM >> 00520000
    PRETOPOST =%30,        << ADDING A CR/LF IN PRE TO POST SPACING >>  00522000
    PRIMARY   = 1,         << GET ONLY FROM PRIMARY TABLE >>            00524000
    PRIMED'   = 10,        << 2640 READY TO SEND A BLOCK >>             00526000
    PTAPEFUNC =29,         << PAPER TAPE SPOOLING FUNCTION >>           00528000
    PTYCHK'   = 9,         << PARITY CHECK READS >>                     00530000
    PTYCNTRL' = 7,         << PARITY IS TO BE SENT IN 8TH BIT >>        00532000
    PTYERROR  = 5,         << READ PARITY ERROR >>                      00534000
    PTYMASK   =%200,       << PARITY SENSE BIT MASK >>                  00536000
    QADDR     = 5,         << TARGET BANK OF DST OFFSET >>              00538000
    QDSTN     = 4,         << BANK OR DST NUMBER >>                     00540000
    QFUNC     = 6,         << FUNCTION  >>                              00542000
    QI        = 5,         << USED BY CHECKDB >>               <<01115>>00544000
    QLDEV     = 2,         << LOGICAL DEVICE NUMBER >>                  00546000
    QLINK     = 1,         << NEXT IOQ POINTER >>                       00548000
    QMISC     = 3,         << MISCELLANEOUS STORAGE >>                  00550000
                  << .(0:8)-READ TO TRLX; .(12:4)-REQUEST STATE>>       00552000
    QPAR1     = 8,         << READ EOF CONTROL; WRITE SPACE CONTROL >>  00554000
    QPAR2     = 9,         << READ STOP CHAR; WRITE PRESPACE FLAG >>    00556000
    QWBCT     = 7,         << WORD (+) OR BYTE (-) COUNT >>             00558000
    QSTAT     =10,         << REQUEST STATUS AND PCB NUMBER >>          00560000
    QLD'ST    =QSTAT-QLDEV,<< TO SET X TO QLDEV FROM QSTAT >>           00562000
    READBINARY= 1,         << BINARY READ IN PROGRESS >>                00564000
    READCMPLTD=%43,        << RSTATE - READ COMPLETED >>                00566000
    READECHO  =%15,        << ECHOING 1ST CHAR OF NO ECHO READ >>       00568000
    READING   = 2,         << DSTATE- READ IN PROGRESS >>               00570000
    READTIMEOUT= 3,        << READ TIME OUT REQUEST TYPE >>             00572000
    READTO    = 6,         << READ TIMED OUT READERRORS CODE >>         00574000
    READWAITING= 5,        << READ WAITING TO START AFTER WRITE DONE >> 00576000
    RESTART'  = 1,         << RESTART WRITE AFTER BUFFER FILL >>        00578000
    REPEATING =%14,        << WRITING SYNC'S OR "!"'S >>                00580000
    REQUEST'  = 3,         << MONITOR SERVICE REQUESTED WHILE ACTIVE >> 00582000
    REVSLASH  = %134,                                                   00584000
    RIOCCODE  = 2,                                             <<02500>>00586000
    SECONDARY = 2,         << GET TBUF FROM 2ND IF PRIMARY EMPTY >>     00588000
    SEDCODE   = 4,                                             <<02500>>00590000
    SEND'     = 5,         << OUTPUT COMPLETION STATUS BIT >>           00592000
    SENDDOWN   = 2,         << SEND INFO DOWN TO UNIT >>                00594000
    SENDXON   =%12,        << READ TO BE ACTUALLY STARTED DSTATE >>     00596000
    SETECHO   = 1,         << SET ECHO ON IF ENABLE >>                  00598000
    SERIES'33 = 8,         <<CPU # OF SERIES 33     >>         <<04319>>00600000
    SFAIL'    = 10,        << SIO FAILURE BIT IN QFLAGS >>              00602000
    SIOPCODE  = 0,                                             <<02500>>00604000
    SIOFAIL  = 64,         << DELAYED SIO FAILURE FUNCTION CODE >>      00606000
    SPEC'     =  1,        << DISC REQUEST IS FOR MAM >>                00608000
    SPECIALSTOP= 1,        << READ TERMINATED ON SPECIAL STOP CHAR >>   00610000
    SPECIH'   = 4,         << USE SPECIAL INTERRUPT HANDLER >>          00612000
    SPEEDTO   = 6,         << SPEED SENSING TIMEOUT TYPE >>             00614000
    SPOOLEND' = 7,         << PTAPE READ COMPLTD SERVICE REQUES<<00.06>>00616000
    SPOOLING' = 5,         << PTAPE READ IN PROGRESS >>                 00618000
    SPOOLSW'  = 6,         << PTAPE BUFFER FULL SERVICE REQUEST<<00.06>>00620000
    SSBREAK'  = 4,         << SUB SYS BRK IS ALLOWED &  HAS BEEN DET. >>00622000
    STOPPED   =%44,        << READ STOPPED REQUEST STATE >>             00624000
    SYSDB     =%1000,                                                   00626000
    SYNCCHAR  =%47777,     << SYNC CHARACTER  >>                        00628000
    SYNCFLAG' = 4,         << SET IF DATA IS A SYNC CHARACTER >>        00630000
    SYSBUFR'  =  3,        << REQUEST DATA IS IN SYSTEM BUFFERS >>      00632000
    SYSCST    = 1,                                                      00634000
    SYSDST    = 2,                                                      00636000
    SYSIOQ    = 5,                                                      00638000
    SYSLPDT   =%10,        << LOGICAL PHYSICAL DEVICE TABLE >>          00640000
    SYSMON    =%1267,      << SYSTEM MONITOR FLAG >>           <<00.02>>00642000
    SYSPCB    = 3,                                                      00644000
    SYSSBUF   = 6,                                                      00646000
    SYSTBUF   =%16,                                                     00648000
    TAPEMODE' = 0,         << PAPER TAPE READ MODE;NO EDIT RESPONSES >> 00650000
    TBMAXB    = 30,        << TBUF SIZE IN BYTES >>                     00652000
    TBQN      = 0,         << RESOUCE QUEUE # FOR TBUF REQUESTS >>      00654000
    TERMCHAR' =10,         << TERMINATE INPUT ON STOP CHAR >>           00656000
    TERMINAL  = 16,        << DEVICE TYPE 16 = TERMINAL>>      <<00192>>00658000
    TERMINET  = 6,                                                      00660000
    THEAD     = 2,         << HEAD INDEX  >>                            00662000
    TIMERWAIT = %10,        << Waken PIN on TIMER wait >>      <<02808>>00664000
    TOVRFL    = 5,         << OVERFLOW OF PRIMARY TABLE COUNTER >>      00666000
    TQUEUE    = 1,         << TERM I/O LIMIT RESOURCE NUMBER >>         00668000
    TRANSERR' = %14,       << IOSTAT VALUE FOR 2631'S >>       <<01472>>00670000
    TRANSMIT  = 4,         << FINSH TURNING 202 TO WRITE STATE >>       00672000
    TRQSTS    = 3,         << REQUEST FOR ELEMENTS COUNTER, DOUBLE >>   00674000
    TSIZE     = 1,         << ELEMENT SIZE AND IMPEDED PCB >>           00676000
    TTAIL     = 3,         << INDEX OF LAST ELEMENT  >>                 00678000
    TURN202    = 4,        << DSTATE, TURNING 202 TO READ OR WRITE >>   00680000
    TURNTO     = 2,        << 202 TURN AROUND TIME OUT TYPE >>          00682000
    TUSE      = 4,         << MAX IN USE AND CURRENT IN USE >>          00684000
    UNITMASK = %037000,    << MASK UNIT # FROM CONTROL WORD >>          00686000
    UNKNOWN'INT'MSG = 410, << Unknown Device Interrupted msg >><<03663>>00688000
    UP'       = 1,         << ON LINE,SPEED SENSED AND CAN DO I/O >>    00690000
    WAITED    =%11,        << WRITE/READ/BANDWAIT HELD FOR BREAK >>     00692000
    WAKECOUNT =32,         << WAKE IF LESS REMAIN TO BE WRITTEN >>      00694000
    WIOCCODE  = 3,                                             <<02500>>00696000
    WRITING   = 1,         << DSTATE IS WRITING >>                      00698000
    WSP       =14,          <<OFFSET TO WSP POINTER>>          <<00652>>00700000
    XON       =%21,                                                     00702000
    XOFF       =%23,        << ASCII CONTROL X CHARACTER >>             00704000
    XOFFPAIR  = 1,         << LAST PAIR CHAR XOFF,TERMINET & TAPEMODE >>00706000
    XONWRIT   = 3,         << DSTATE XON WRITE >>                       00708000
  ENDEQ       = 0;                                                      00710000
EQUATE SYSBASE=%1000,                                          <<MPEIV>>00712000
       DISCREQTABIX=%31,                                       <<MPEIV>>00714000
       SYSDISCREQTAB=SYSBASE+DISCREQTABIX,                     <<MPEIV>>00716000
        SYSWAITTODISPMSG=%1053,                                <<MPEIV>>00718000
       SCHEDPIN=0,                                             <<MPEIV>>00720000
       IOSEGREQPORT=3;                                         <<MPEIV>>00722000
DEFINE TRANSCOMPFLAG=(15:1)#,  <<WAITTODISPMSG>>               <<MPEIV>>00724000
       LONGWAITFLAG=(1:1)#,                                    <<MPEIV>>00726000
       PHASETRANSFLAG=(3:1)#,                                  <<MPEIV>>00728000
       MEMTRAPFLAG=(4:1)#,                                     <<MPEIV>>00730000
       IMPTRAPFLAG=(5:1)#,                                     <<MPEIV>>00732000
       RECOVEREDOCFLAG=(6:1)#,                                 <<MPEIV>>00734000
       DISCWAITFLAG=(7:1)#,                                    <<MPEIV>>00736000
       TERMREADFLAG=(8:1)#,                                    <<MPEIV>>00738000
       SWFLAG=(0:1)#;                                          <<MPEIV>>00740000
DEFINE MSGIOFZREQFLAG=(0:1)#;                                  <<MPEIV>>00742000
INTEGER DISCREQTABSYSBASEINX=DB+DISCREQTABIX;                  <<MPEIV>>00744000
EQUATE PCBIX=3;                                                <<MPEIV>>00746000
INTEGER PCBSYSBASEINX=DB+PCBIX;                                <<MPEIV>>00748000
INTEGER POINTER DISCREQTAB=DISCREQTABIX;                       <<MPEIV>>00750000
INTEGER POINTER ICS = 7;                                       <<01810>>00752000
EQUATE          ICSSTKBANK=5,                                  <<01810>>00754000
                ICSSTKBASE=9,                                  <<01810>>00756000
                PXGLOBSIZE=8;                                  <<01810>>00758000
DEFINE SETDISCIOSEGFLAG=(1:1)#;                                <<MPEIV>>00760000
EQUATE CLEARDISCIOSEGBIT=3,                                    <<MPEIV>>00762000
       SLLIXWORDNUM=1,DBXDSINFOWORDNUM=2;                      <<MPEIV>>00764000
DEFINE XDSDSTFIELD=(1:10)#;                                    <<MPEIV>>00766000
DEFINE REFERENCEDFLAG=(2:1)#;                                  <<MPEIV>>00768000
EQUATE QUEUEINGINFOWORDNUM=%15,                                <<MPEIV>>00770000
       QPRIWORDNUM=1,                                          <<MPEIV>>00772000
       SWBIT=0,                                                <<MPEIV>>00774000
       TRANSCOMPBIT=15;                                        <<MPEIV>>00776000
DEFINE PRIFIELD=(8:8)#;                                                 00778000
DEFINE  TRAPSOFF = PUSH(STATUS);                               <<01859>>00780000
                   TOS.(2:1) := 0;                             <<01859>>00782000
                   SET(STATUS)#;                               <<01859>>00784000
$INCLUDE INCLIO                                                         00786000
$INCLUDE INCLMEAS                                              <<MPEIV>>00788000
$INCLUDE INCLMIFT                                              <<04117>>00790000
EQUATE SEGIDDATATYPE=0,                                                 00792000
       SEGIDSLTYPE=1;  <<PROGRAM TYPE =2 OR 3>>                         00794000
DEFINE SEGIDTYPEFIELD=(0:2)#,                                           00796000
       SEGIDPBXFLAG=(0:1)#,                                             00798000
       SEGIDPBXFIELD=(1:7)#,                                            00800000
       SEGIDLOGSEGFIELD=(8:8)#;                                         00802000
                                                                        00804000
  DEFINE                                                                00806000
    ABS       = ABSOLUTE#,                                              00808000
    ACTIVE    =(ACTIVE'  :1)#,                                          00810000
    AUTOHANDSH=IOQPL(QPAR2).(9:1)#, << DO VIEW READ >>         <<01473>>00812000
    BINARYREAD=(11:1)#,    << IF SET THEN XFER 8 BITS ON READ >>        00814000
    ASMB      = ASSEMBLE#,                                              00816000
    BINARY    =(11:2)#,    << IF 0 THEN ASCII ELSE BINARY READ >>       00818000
    BIT8      =( 8:1)#,    << BIT 8 OF OF ASCII CODE >>                 00820000
    BLOCKED   =(BLOCKED':1)#,<< REQUEST WAITS UNTIL COMPLETION >>       00822000
    BWRITE    =( 7:1)#,    << BINARY WRITE, PTY DISABLE >>              00824000
    CB        =(CB':1)#,                                                00826000
    CBSB      =(CB':2)#,   << CURRENT STATE OF CB AND SB >>             00828000
    CCCHANGE  =(11:1)#,    << CHANGE IN DATA SET READY STATUS >>        00830000
    CF        = (CF':1)#,  << CARRIER DETECTED >>                       00832000
    CFAILCNT  =( 4:6)#,    << CARRIER FAILURE COUNTER >>       <<01.01>>00834000
    CFSTATUS  = (14:1)#,   << DSET CARRIER DETECTED STATUS >>           00836000
    CC        =( 6:2)#,    << CONDITION CODE FIELD IN STATUS >>         00838000
    CCC        =( 5:3)#,    << COND CODE PLUS CARRY >>         <<03032>>00840000
    CH        =(10:1)#,    << 2002 SPEED CONTROL, 0 = LOW SPEED  00.02>>00842000
    CHANQUE   =(1:6)#,     << CHANNEL QUEUE NUMBER IN ILT >>            00844000
    CHARMASK  =( 8:8)#,                                                 00846000
    CHECKDB  =DISABLE;                                         <<01115>>00848000
              PUSH(DB);                                        <<01115>>00850000
              X := ABSOLUTE(QI)-5;                             <<01115>>00852000
              TOS := ABSOLUTE(X);                              <<01115>>00854000
              X := X+1;                                        <<01115>>00856000
              TOS := ABSOLUTE(X);                              <<01115>>00858000
              ENABLE;                                          <<01115>>00860000
              ASSEMBLE(DCMP)#,                                 <<01115>>00862000
    CHECKDIO  = IF < THEN IOFAILURE(DRTN,DITP)#,                        00864000
    CMODE     =(CMODE':1)#,<< TERMINAL IN CONSOLE MODE >>               00866000
    COMPLETED =(COMPLETED':1)#,                                         00868000
    CONSINTRPT=(11:1)#,    << CONSOLE INTERRUPT OK IF SET >>   <<00.03>>00870000
    CORERES   =(CORERES':1)#,                                           00872000
    CQUEN     =(8:8)#,     << CONTROLLER REQUEST QUE # >>               00874000
    CRSYNC    =( 4:4)#,    << NUMBER OF SYNC'S AFTER A CR >>   <<00.02>>00876000
    DATAFRZN  =(DATAFRZN':1)#,                                          00878000
    DATAPARITY=(5:1)#,     << DATA INPUT PARITY >>             <<01.01>>00880000
    DELECHO   =(DELECHO':2)#,                                           00882000
    DEVTYPE   =(8:8)#,     << DEVICE TYPE OF DLT >>                     00884000
    DIRCSTATE =( 0:2)#,    <<  DEVICE RECOGNITION STATE  0 - NOT OWNED  00886000
                               1 - REQUESTING SERVICE, 2 - SERVICE      00888000
                               GRANTED,  3 - OWNED OR RECOGNIZED  >>    00890000
    DISABLE   = ASSEMBLE( SED 0 )#,                                     00892000
    DISC      =(DISC':1)#, << DFLAG, DEVICE IS A DISC >>                00894000
    DISCONNECT=( 1:1)#,    << DISCONNECT SERVICE REQUEST TO TERM >>     00896000
    DLDEVN    =(8:8)#,     << LOGICAL DEVICE NUMBER OF DIT >>           00898000
    DRTNUMBER =(9:7)#,                                         <<01300>>00900000
    DSETREADY =(10:1)#,    << DATA SET READY SERVICE REQUEST TO TERM >> 00902000
    DSETUNIT  =( 4:4)#,    << UNIT FIELD IN DSET STATUS >>              00904000
    DSTATE    =(DSTATE'  :4)#,                                          00906000
    DSTFIELD  =(1:10)#,    << DST NUMBER EXTRACT FROM PCB >>            00908000
    DSTN      =(6:10)#,    << DST EXTRACT FROM IOQ >>          <<00.04>>00910000
    DUPLICATE =ASSEMBLE( DUP     )#,                                    00912000
    DVRFRZN   =(DVRFRZN':1)#,                                           00914000
    ECHO      =(ECHO':1)#,                                              00916000
    ENABLE    = ASSEMBLE( SED 1 )#,                                     00918000
    ENQACKWAIT=(11:1)#,    << 2640 WRITE ENQ/ACK WAIT >>                00920000
    EOF       =( 7:3)#,    << LAST EOF CONDITON IN LPDT >>              00922000
    EORCHAR    =( 8:8)#,    << TRANSPARENT READ EOR CHARACTER >>        00924000
    ERRORS    = MAILBOX4.(15:1) = 1#,                          <<02500>>00926000
    ESCSEQCNT = DITP(36).(13:3)#,                              <<01472>>00928000
    ESIZE     =(8:8)#,     << TABLE ENTRY SIZE >>                       00930000
    ETXSENT   =(ETXSENT':1)#,<< ETX SENT TO TERMINAL ON 202 >> <<00.02>>00932000
    F         =ABSOLUTE#,                                      <<00652>>00934000
    FILLING   =(10:1)#,    << TERM IS FILLING TBUFS WITH WRITE DATA >>  00936000
    FLUSH     =(0:1)#,     << BRK/SSBRK FLUSH IN PROGRESS >>            00938000
    FORMFEED  =(FORMFEED':1)#, << IF CLEAR DO CR FOR FORMFEED >>        00940000
    FUNC      =( 8:8)#,    << QFUNC, FUNCTION CODE >>                   00942000
    HCUNIT    =(11:5)#,     << HIGH CONFIGURED UNIT NUMBER >>  <<01300>>00944000
    HIOP'CCG  = MAILBOX4.(7:1) = 1#,                           <<02500>>00946000
    HPIB      = DITP(3).(0:2) = 1#,                            <<02500>>00948000
    HSTATE    =( 4:3)#,    << HANG UP STATE                             00950000
                               0 - HUNGUP       3 - HNGP SPD SNS DISCNCT00952000
                               1 - ONLINE       4 - DCLOSE DISCONNECT   00954000
                               2 - LOGGING ON   5 - LO SPD SNS DISCNCT  00956000
                               6 - HANG UP TURN 7 - HANGING UP >>       00958000
    IAK       =(IAK':1)#,                                               00960000
    IGNOREHI  = (IGNOREHI':1)#,                                <<02500>>00962000
    IMB'ERROR = MAILBOX4.(1:4) <> 0 OR MAILBOX4.(10:1) = 1#,   <<02500>>00964000
    IMB'TIMEOUT = MAILBOX4.(0:1) = 0#,                         <<02500>>00966000
    IMPEDEOK  =(13:1)#,    << OK TO IMPEDE AWAKEIO CALLER >>            00968000
    INIT'CCG  = MAILBOX4.(8:2) <> 0#,                          <<02500>>00970000
    INSPEED   =(12:4)#,    << INPUT SPEED AND CHARACTER SIZE >>         00972000
                           <<  0 - NOT DETERMINED  4 - 30 CPS           00974000
                               1 - 240 CPS         5 - 15 CPS           00976000
                               2 - 120 CPS         6 - 10 CPS           00978000
                               3 -  60 CPS         7 - 14 CPS  >>       00980000
    INUSE     =(8:8)#,     << NUMBER OF ELEMENTS CURRENTY IN USE >>     00982000
    INTRPTENABLE=(2:1)#,   << ENABLE INTERUPTS ON THIS CHANNEL >>       00984000
    IOWAKE    =(IOWAKE':1)#,                                            00986000
    IOPROG    =(IOPROG':1)#,<< SIO PROGRAM IN PROGRESS >>               00988000
    IOSTAT    =( 8:8)#,    << TOTAL REQUEST STATUS RETURNED >>          00990000
    LDEVN     =( 8:8)#,    << DLDEV, LOGICAL DEVICE NUMBER >>           00992000
    LFSYNC    =( 0:4)#,    << NUMBER OF SYNC'S AFTER A LF >>            00994000
    LIMIT1    =(8:8)#,     << PRIMARY TABLE SIZE  >>                    00996000
    LIMIT2    =(0:8)#,     << TOTAL TABLE SIZE >>                       00998000
    LOADMEMORY=ASSEMBLE( LSEA )#,                                       01000000
    LR = ABS(CLK&LSL(2)+3).(1:15)#, << STORAGE FOR LIMIT REG >><<01147>>01002000
    MAILBOX0  = ABS(MB0)#,                                     <<02500>>01004000
    MAILBOX1  = ABS(MB1)#,                                     <<02500>>01006000
    MAILBOX2  = ABS(MB2)#,                                     <<02500>>01008000
    MAILBOX3  = ABS(MB3)#,                                     <<02500>>01010000
    MAILBOX4  = ABS(MB4)#,                                     <<02500>>01012000
    MAILBOX5  = ABS(MB5)#,                                     <<02500>>01014000
    MAILBOX6  = ABS(MB6)#,                                     <<02500>>01016000
    MAILBOX7  = ABS(MB7)#,                                     <<02500>>01018000
    MAMERRORC =(MAMERRORC':1)#,                                         01020000
    MAMERRORD =(MAMERRORD':1)#,                                         01022000
    MASK'HPIB = ABS(%13)#,                                     <<02500>>01024000
    MAXENTRY  =( 0:8)#,    << ENTRIES IN LPDT >>                        01026000
    MCODE     =(10:6)#,    << MONITORING TO BE DONE CODE >>             01028000
    MEASURE = LOGICAL(ABS(%1267))#,                            <<01231>>01030000
    MHDISC    =(MHDISC':1)#, << MHFLAG,IS A MOVING HEAD DISC >><<RK0PV>>01032000
    MUNIT     =(MUNIT':1)#,                                             01034000
    MPXFLAG    =(4:1)#,     << OPERATION COMPLETED ON TERMINAL MPX  >>  01036000
    MPXUNIT    =(0:5)#,     << UNIT NUMBER IN TERMINAL MPX STATUS >>    01038000
    MTYPE     =( 1:3)#,    << MODEM TYPE                                01040000
                                0 - HARDWIRED   2 - 202C                01042000
                                1 - 103         3 - 2002   >>           01044000
    NEWLINE   =(NEWLINE' :1)#,                                          01046000
    NOPTY  =(NOPTY':1)#,   <<8-BIT DATA FLAG-->>               <<AMS00>>01050000
                          <<NO PARITY SET IN 8TH BIT>>         <<AMS00>>01052000
    NOSYNC    =(NOSYNC':1)#,<< NO SYNC TERMINAL, USES ENQ AND ACK >>    01054000
    NOTIMPEDABLE=(13:1)#,  <<CALLER MAY NOT BE IMPEDED >>               01056000
    NOTRDY    =(9:1)#,     << START WAIT FOR NOTRDY DEV >>     <<01300>>01058000
    NO'CX'ECHO=( 1:1)#,    << IF SET DONT ECHO !!! ON CONTROL X >>      01060000
    NXTDSTATE =( 9:4)#,    << NEXT DSTATE AFTER 202 TURN AROUND >>      01062000
    OFFLINE   = (13:1)#,   << OF STATUS FROM HP263X >>         <<01472>>01064000
    OUTPUT    =(1:1)#,     << IF SET THEN WIO IS OUTPUT CONTROL >>      01066000
    OUTSPEED  =( 6:4)#,    << OUTPUT SPEED AND CHARACTER SIZE CODE      01068000
                               SEE INSPEED FOR MEANING >>               01070000
    OWNREAD   =(10:1)#,    << USER DOES OWN DC1/DC2 HANDSHAKING >>      01072000
    PAPEROUT  = (15:1)#,   << STATUS FROM HP263X >>            <<01472>>01074000
    PAIR      =(PAIR'    :1)#,                                          01076000
    PAIRCODE  =(12:4)#,    << DENOTES LAST PAIR CHAR INPUT >>           01078000
    PARITY    =(PARITY':1)#,                                            01080000
    PARITYSAVE=( 8:2)#,    << HOLDS PRTY SENSE DURING WRITE BACK 01.01>>01082000
    PCBM      =(8:8)#,     << PCB MASK FOR PCB AND TABLE IMPEDED LINK >>01084000
    PCBN      =( 0:8)#,    << QSTAT, PCB NUMBER >>                      01086000
    PCBS      =LSR(8)#,    << SHIFT TO GET PCB NUMBER FROM IOQ >>       01088000
    PDISABLE  = ASSEMBLE( PSDB )#,     << PSUEDO DISABLE >>             01090000
    PENABLE   = ASSEMBLE( PSEB )#,     << PSEUDO ENABLE >>              01092000
    PREQ      =(PREQ':1)#,                                              01094000
    PTYCNTRL  =(PTYCNTRL':1)#,                                          01096000
    PRIMED    =(PRIMED':1)#,<< 2640 READY TO SEND A BLOCK >>            01098000
    PREMPT    =( 0:1)#,   << SET WHEN PREMPTIVE TERM REQUEST QUEUE >>   01100000
    PREMPTFIELD=( 7:2)#,   << TERMINAL REQUEST PREMPT FLAGS >>          01102000
    PREMPTFLD =(12:2)#,    << SIO REQUEST PREMP FLAGS >>                01104000
    QABORTS  = (11:1)#,    << SEND ABORT REQUEST, DONT SET BITS >>      01106000
    QLDEVN    =(8:8)#,     << LOGICAL DEVICE # FIELD OF I/O REQ >>      01108000
    RBYTE     =(8:8)#,                                                  01110000
    RDCOUNTED =( 8:1)#,    << RDCOUNTER INCREMENTED >>                  01112000
    READTRLX  =( 8:8)#,    << TRLX FOR READ & LOGON TIME OUTS >>        01114000
    READSTOP  =( 7:3)#,    << IF NOT ZERO THEN STOP READ BECAUSE        01116000
                                 0 - NONE        4 - LOGON TIMED OUT    01118000
                                 1 - BREAK       5 - ABORTED            01120000
                                 2 - PREMPT      6 - NOT USED           01122000
                                 3 - TIMED OUT   7 - NOT USED  >>       01124000
    READERRORS=(10:3)#,    << 0-OK,1-SPECIALSTOP,2-PTY ERR              01126000
                              3-LOST DATA,4-LOST CHAR,5-BREAK >>        01128000
    READ'MASK'HPIB = TOS : = MASK'HPIB#,                       <<02500>>01130000
    RESTART   =(RESTART':1)#,                                           01132000
    REQUEST   =(REQUEST':1)#,<< REQUEST FOR SERVICE WHILE ACTIVE >>     01134000
    REQSTAT   = DITPL(36).(12:1)#,  << 31 STAT REQ ACTIVE >>   <<01472>>01136000
    RIOC'CCL  = MAILBOX4.(5:1) = 1#,                           <<02500>>01138000
    RPLEVEL   =(13:3)#,    << REQUEST PREMPT LEVEL,SEE LPLEVEL  >>      01140000
    RSTATE    =(10:6)#,    << REQUEST STATE -                           01142000
                              0 - NEW       %30 - PRE TO POST TBUF WAIT 01144000
                              1 - STARTED   %31 - PRESPACE TBUF WAIT    01146000
                              2 - READING    32 - WRT DATA TBUF WAIT    01148000
                             43 - RD CMPLTD  33 - POSTSPACE TBUF WAIT   01150000
                             44 - RD STOPPED                            01152000
                              5 - READ WAITING                          01154000
                             %34-%37 SAME A %30-%33 BUT ENQ ADD WAIT    01156000
                           >>                                           01158000
    RTYPE     =(14:2)#,    << EXTRACT LEAST BITS OF REQUEST TYPE        01160000
                               0 - UNBLOCKED, NO WAKE                   01162000
                               1 - BLOCKED                              01164000
                               2 - UNBLOCKED, WAKE                      01166000
                               3 - UNBLOCKED, NO PCB, NO WAKE           01168000
                           >>                                           01170000
    SEND      =(SEND':1)#,                                              01172000
<< THIS LINE DELETED  WEO>>                                    <<01300>>01174000
    SCOUNT    =( 8:8)#,    << SYNC'S REMAINING TO DO AFTER THIS  00.02>>01176000
    SCP       =( 3:1)#,    << Restart channel pgm on interrupt <<03095>>01178000
    SQ        =( 4:1)#,    << Restart channel pgm queued >>    <<03095>>01180000
    SET'MASK'HPIB  = MASK'HPIB : = TOS#,                       <<02500>>01182000
    SFAIL     =(SFAIL':1)#,                                             01184000
    SIOEND    =( 0:8)#,    << END LOC OF SIO - ILT(2) >>       <<RH.PV>>01186000
    SIOPREMPT =( 6:1)#,    << SET WHEN A PREMTIVE REQUEST IS QUEUE >>   01188000
    SIOP'CCG  = MAILBOX4.(6:2) <> 0#,                          <<02500>>01190000
    SIOP'CCL  = MAILBOX4.(5:1) = 1#,                           <<02500>>01192000
    SPDFOUND  = ( 9:1)#,   << ON LINE OR SPD SNSE SERVICE REQST >>      01194000
    SPDSENSING = (4:1)#,   << DEVICE IS IN SPEED SENSING MODE    01.01>>01196000
    SPEC      =(SPEC':1)#,                                              01198000
    SPECFLAG  =(10:1)#,    << SPEC REQUEST FLAG, FLAGS WORD, ATTACHIO >>01200000
    SPOOLEND  =(SPOOLEND':1)#,                                          01202000
    SPOOLING  =(SPOOLING':1)#,                                          01204000
    SPOOLSW   =(SPOOLSW' :1)#,                                          01206000
    SSBRKCHAR  =( 0:8)#,    << TRANSPARENT READ SUB SYS BRK CHARACTER >>01208000
    STACKFLAG = ( 0:1)#,   << IF SET QADDR IS DB RELATIVE ADDR <<00.05>>01210000
    STATEF    =(12:4)#,    << SIO DEVICE REQUEST STATE >>               01212000
    STATDONE   = (15:1)#,  << DRQST, STAT REQ COMPLETE >>      <<01472>>01214000
    STATUS    =(13:3)#,    << QSTAT, GENERAL STATUS >>                  01216000
    STWAIT    =(10:1)#,    << START WAIT PROG (DIT) >>   <<00.TP>>      01218000
    SYNC      =( 2:1)#,    << REPEATING SYNC'S FOR FILL CHARS >>        01220000
    SYSBUFR   =(SYSBUFR':1)#,                                           01222000
    SYSBUFRS  =(12:1)#,    << ADDRESS IS SBUF RELATIVE >>               01224000
    TAPEMODE  =(TAPEMODE':1)#,                                          01226000
    TDFLAGS   =( 0:2)#,    << TERM & DISC FLAGS IN DFLAGS >>            01228000
    TERMCHAR  =(TERMCHAR':1)#,                                          01230000
    TTYPE     =( 5:5)#,    << TERMINAL TYPE AS IN MPE ERS >>            01232000
    TESTBIT   = ASSEMBLE(TBC#,                                          01234000
    TIMING    = (0:1)#,    << A TIMED READ IS IN PROGRESS >>            01236000
    TIMEREAD  =( 1:1)#,    << TIME READ OPERATIONS >>                   01238000
    TIOSTAT   =( 3:5)#,    << TIO TERMINATION STATUS >>        <<RH.PV>>01240000
    TMODE     =(11:2)#,    << TERMINAL MODE                             01242000
                                 0 - NORMAL   2 - CONSOLE               01244000
                                 1 - BREAK    3 - CONSOLE FROM BREAK >> 01246000
    TURNCHAR  =( 8:8)#,    << BYTE TO BE OUTPUT WHEN TURNED AROUND >>   01248000
    TURNTOWRITE=( 7:1)#,   << IF SET, 202 TURNING TO WRITE ELSE READ >> 01250000
    TRANSERR  = (12:1)#,   << STATUS FROM 2635X >>             <<01472>>01252000
    UP        =(UP':1)#,   << UNIT IS ON LINE & SPEED SENSED >>         01254000
    WAITDONE  =( 2:1)#,    << TERM BAND WIDTH WAIT COMPLETED >>         01256000
    WAITEDSTATE=(0:4)#,    << STATE WAITED FOR BREAK >>                 01258000
    WAITPROG  =(1:1)#,     << WAIT PROG IS RUNNING (ILT) >>    <<01300>>01260000
    WIOC'CCL  = MAILBOX4.(5:1) = 1#,                           <<02500>>01262000
    WRTCOUNTED=( 9:1)#,    << WRTCOUNTER INCREMENTED >>                 01264000
    WRTWAIT   =( 6:1)#,    << WAITING FOR A WRITE CMPLTION INTRPT >>    01266000
    XCHDB     = ASSEMBLE( XCHD )#,                                      01268000
    XONWAIT   =(2:1)#,     << XON/XOFF WAIT >>                 <<01471>>01270000
    ENDDEF    = 0#;                                                     01272000
$PAGE                                                                   01274000
                                                                        01276000
  <<----------- GENERAL SERVICE VARIABLES ----------------->>           01278000
                                                                        01280000
                                                                        01282000
    LOGICAL POINTER PCB=3;  <<PROCESS CONTROL BLOCK>>          <<00652>>01284000
    INTEGER POINTER TRL=10; <<TIMER REQUEST LIST   >>          <<00652>>01286000
    LOGICAL SYSUP = DB + %73;  << SYSTEM UP FLAG >>                     01288000
    INTEGER ARRAY DITPA(*) = DB+ IDITP;   << BASE OF DITP'S IN ILT >>   01290000
                                                                        01292000
    INTEGER POINTER PS0 = S-0,  PS1 = S-1;                              01294000
    LOGICAL LS0 = S-0,  LS1 = S-1,  LX = X;                             01296000
    INTEGER S0 = S-0, S1 = S-1, X = X;                                  01298000
                                                                        01300000
    INTEGER ARRAY WA0(*) = DB + 0;                                      01302000
    BYTE ARRAY BA0(*) = DB + 0;  << TO BYTE ADDRESS DIT AND TBUFS >>    01304000
                                                                        01306000
    INTEGER RSTATUS = Q -1;   << PCAL RETURN STATUS >>                  01308000
                                                                        01310000
    INTEGER ARRAY LPDT(@) = DB + SYSLPDT;                               01312000
    INTEGER POINTER S'LPDT= SYSLPDT;                           <<03032>>01314000
    DOUBLE ARRAY LPDTD(@) = DB + SYSLPDT;                               01316000
    INTEGER ARRAY CST (@) = DB + SYSCST;                                01318000
    INTEGER ARRAY IOQ (@) = DB + SYSIOQ ;                               01320000
    INTEGER ARRAY SBUF(@) = DB + SYSSBUF;                               01322000
    INTEGER ARRAY TBUF(@) = DB + SYSTBUF;                               01324000
    INTEGER ARRAY DST (@) = DB + SYSDST;                                01326000
                                                                        01328000
    INTEGER ARRAY BUSY(@) = DB + %55;                                   01330000
    INTEGER ARRAY HEAD(@) = DB + %56;                                   01332000
    INTEGER ARRAY TAIL(@) = DB + %57;                                   01334000
                                                                        01336000
    INTEGER SIOCOUNT   = DB + %60;  << # OF SIO PROGRAMS IN PROGRESS >> 01338000
    INTEGER RDCOUNTER  = DB + %64; << # OF TERMINAL READS IN PROGESS >> 01340000
    INTEGER WRTCOUNTER = DB + %65; << # OF TERMNAL WRITES IN PROGRESS >>01342000
                                                                        01344000
    INTEGER CONSLDEV   = DB + %74;  << SYSTEM CONSOLE LDEV >>           01346000
    INTEGER POWERFAIL  = DB + %72;  << POWERFAIL STATE >>               01348000
    INTEGER PROGENPCBP = DB + %141;  << PROGEN PCB INDEX >>             01350000
    INTEGER DEVRECPCBP = DB + %145;  << DEVICE RECOGNITION PCB INDEX >> 01352000
    INTEGER SYSIOPCBP  = DB + %153; << SYSTEM I/O PROCESS PBC INDEX >>  01354000
    LOGICAL LOGONTIME  = DB + %120; << MAX LOGON TIME IN SECONDS >>     01356000
    LOGICAL AVR        = DB + %346; << AUTO TAPE VOL. RECOG. WORD >>    01358000
                                                                        01360000
  <<-------------- MONITORING DECLARATIONS ---------------->>           01362000
                                                                        01364000
    INTEGER DSETB = DB + %66;                                           01366000
    DOUBLE LASTTIMER = DB + %67;                                        01368000
                                                                        01370000
  <<----------- Misc defines using utility variables ---->>    <<04572>>01372000
  define ENABLE'IF'WAS'ENABLED = if RSTATUS.(1:1) = 1 then     <<04572>>01374000
                                    ENABLE#;                   <<04572>>01376000
                                                                        01378000
                                                                        01380000
  <<---------EXTERNAL PROCEDURE DECLARATIONS ------------->>            01382000
                                                                        01384000
                                                                        01386000
PROCEDURE ABORTTIMEREQ(TRLX);                                           01388000
  VALUE TRLX; INTEGER TRLX; OPTION FORWARD;                    <<00652>>01390000
                                                                        01392000
PROCEDURE AWAKE(PCBPT, N, WAITF);                                       01394000
  VALUE PCBPT, N, WAITF;                                                01396000
  INTEGER PCBPT, N, WAITF;  OPTION EXTERNAL;                            01398000
                                                               <<04319>>01400000
DOUBLE PROCEDURE B08'LOGICAL'DVR(LDEV, QMISC, DSTX, ADDR,      <<04319>>01402000
                                 FNCT, CNT, P1, P2, FLAGS);    <<04319>>01404000
                                                               <<04319>>01406000
VALUE                            LDEV, QMISC, DSTX, ADDR,      <<04319>>01408000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04319>>01410000
                                                               <<04319>>01412000
INTEGER                          LDEV, QMISC, DSTX, ADDR,      <<04319>>01414000
                                 FNCT, CNT, P1, P2, FLAGS;     <<04319>>01416000
                                                               <<04319>>01418000
OPTION EXTERNAL;                                               <<04319>>01420000
                                                               <<04319>>01422000
                                                                        01424000
PROCEDURE CHKCHANNELQUE(QN,DITP);                                       01426000
  VALUE QN,DITP;   INTEGER QN; POINTER DITP;                            01428000
  OPTION FORWARD;                                                       01430000
                                                                        01432000
PROCEDURE CLEARWWS;    OPTION EXTERNAL;                                 01434000
                                                                        01436000
PROCEDURE DOCIO(ORDER,DEVICE);                                          01438000
  VALUE ORDER, DEVICE;  INTEGER ORDER, DEVICE;                          01440000
  OPTION FORWARD;                                                       01442000
                                                                        01444000
INTEGER PROCEDURE GET'DSDEVICE(LDEV);                          <<04309>>01446000
  VALUE LDEV;                                                  <<04309>>01448000
  INTEGER LDEV;                                                <<04309>>01450000
  OPTION EXTERNAL;                                             <<04309>>01452000
                                                               <<04309>>01454000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01456000
  VALUE DRTN;  INTEGER DRTN;                                            01458000
  ARRAY DITP;  OPTION FORWARD;                                          01460000
                                                               <<04771>>01462000
PROCEDURE ISSUE'HARD'MSG(MSGNO,PARM,FLAGS);                    <<04771>>01464000
  VALUE MSGNO,PARM,FLAGS;                                      <<04771>>01466000
  INTEGER MSGNO,PARM;                                          <<04771>>01468000
  LOGICAL FLAGS;                                               <<04771>>01470000
  OPTION FORWARD;                                              <<04771>>01472000
                                                                        01474000
integer procedure GETDRT(DRTN,WORD);                           <<03697>>01476000
  value DRTN,WORD;                                             <<03697>>01478000
  integer DRTN,WORD;                                           <<03697>>01480000
  option forward;                                              <<03697>>01482000
                                                               <<03697>>01484000
INTEGER PROCEDURE GETSBUF(TYPE);                                        01486000
  VALUE TYPE;  INTEGER TYPE;                                            01488000
  OPTION FORWARD;                                                       01490000
                                                                        01492000
PROCEDURE RETURNDISCREQ(PNTR);                                 <<01638>>01494000
VALUE PNTR;                                                    <<01638>>01496000
INTEGER POINTER PNTR;                                          <<01638>>01498000
OPTION FORWARD;                                                <<01638>>01500000
                                                               <<01638>>01502000
PROCEDURE HELP; OPTION FORWARD;                                <<00652>>01504000
                                                                        01506000
PROCEDURE IOFREEZE'(SEGIDENT);                                 <<MPEIV>>01508000
VALUE SEGIDENT;                                                <<MPEIV>>01510000
INTEGER SEGIDENT;                                              <<MPEIV>>01512000
OPTION EXTERNAL;                                               <<MPEIV>>01514000
                                                               <<MPEIV>>01516000
PROCEDURE IOUNFREEZE'(SEGIDENT);                               <<MPEIV>>01518000
VALUE SEGIDENT;                                                <<MPEIV>>01520000
INTEGER SEGIDENT;                                              <<MPEIV>>01522000
OPTION EXTERNAL;                                               <<MPEIV>>01524000
                                                                        01526000
PROCEDURE IOIMPEDE(TBASE);                                              01528000
  VALUE TBASE;  INTEGER TBASE;                                          01530000
  OPTION FORWARD;                                                       01532000
                                                                        01534000
PROCEDURE IOUNIMPEDE(TBASE);                                            01536000
  VALUE TBASE;  INTEGER TBASE;                                          01538000
  OPTION FORWARD;                                                       01540000
                                                                        01542000
PROCEDURE IMPEDE(PCBPT);                                                01544000
  VALUE PCBPT;  INTEGER PCBPT;                                          01546000
  OPTION EXTERNAL;                                                      01548000
                                                                        01550000
PROCEDURE LOGERROR(A,B,C);                                              01552000
VALUE A,B,C;                                                            01554000
INTEGER C;                                                              01556000
INTEGER POINTER A,B;                                                    01558000
OPTION FORWARD;                                                         01560000
                                                                        01562000
                                                               <<MPEIV>>01564000
INTEGER PROCEDURE GETSYSTABENTRY(SYSTABINX);                   <<MPEIV>>01566000
VALUE SYSTABINX;                                               <<MPEIV>>01568000
INTEGER SYSTABINX;                                             <<MPEIV>>01570000
OPTION EXTERNAL;                                               <<MPEIV>>01572000
                                                               <<MPEIV>>01574000
PROCEDURE RELSYSTABENTRY(SYSTABINX,ENTRYSYSBASEINX);           <<MPEIV>>01576000
VALUE SYSTABINX,ENTRYSYSBASEINX;                               <<MPEIV>>01578000
INTEGER SYSTABINX,ENTRYSYSBASEINX;                             <<MPEIV>>01580000
OPTION EXTERNAL;                                               <<MPEIV>>01582000
                                                               <<MPEIV>>01584000
PROCEDURE FETCHIOSEG(SEGID,LDEV,IOREQSYSBASEINX,FLAGS);        <<01773>>01586000
VALUE SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                        <<01773>>01588000
INTEGER SEGID,LDEV,IOREQSYSBASEINX,FLAGS;                      <<01773>>01590000
OPTION EXTERNAL;                                               <<01773>>01592000
                                                               <<01773>>01594000
                                                               <<MPEIV>>01596000
PROCEDURE CRASH'(WHY);                                         <<MPEIV>>01598000
VALUE WHY;                                                     <<MPEIV>>01600000
INTEGER WHY;                                                   <<MPEIV>>01602000
OPTION EXTERNAL;                                               <<MPEIV>>01604000
                                                               <<MPEIV>>01606000
                                                               <<MPEIV>>01608000
                                                               <<MPEIV>>01610000
PROCEDURE SEGWRITECOMPLETOR(REQP);                             <<MPEIV>>01612000
VALUE REQP;                                                    <<MPEIV>>01614000
INTEGER REQP;                                                  <<MPEIV>>01616000
OPTION EXTERNAL;                                               <<MPEIV>>01618000
                                                               <<MPEIV>>01620000
PROCEDURE SEGREADCOMPLETOR(REQP);                              <<MPEIV>>01622000
VALUE REQP;                                                    <<MPEIV>>01624000
INTEGER REQP;                                                  <<MPEIV>>01626000
OPTION EXTERNAL;                                               <<MPEIV>>01628000
                                                               <<MPEIV>>01630000
PROCEDURE ADJUSTLOCALITY(PROCINX,SEGIDENT,REQSIZE,FLAGS);      <<MPEIV>>01632000
VALUE PROCINX,SEGIDENT,REQSIZE,FLAGS;                          <<MPEIV>>01634000
LOGICAL PROCINX,SEGIDENT,REQSIZE,FLAGS;                        <<MPEIV>>01636000
OPTION EXTERNAL;                                               <<MPEIV>>01638000
                                                               <<MPEIV>>01640000
PROCEDURE QUEUEONSEGMENT(SEGIDENT);                            <<MPEIV>>01642000
VALUE SEGIDENT;                                                <<MPEIV>>01644000
INTEGER SEGIDENT;                                              <<MPEIV>>01646000
OPTION EXTERNAL;                                               <<MPEIV>>01648000
                                                               <<MPEIV>>01650000
PROCEDURE FLAGPROCABSENT(PROCINX,SEGIDENT);                    <<MPEIV>>01652000
VALUE PROCINX,SEGIDENT;                                        <<MPEIV>>01654000
INTEGER PROCINX,SEGIDENT;                                      <<MPEIV>>01656000
OPTION EXTERNAL;                                               <<MPEIV>>01658000
LOGICAL PROCEDURE TESTIOFROZEN(SEGIDENT);                      <<MPEIV>>01660000
VALUE SEGIDENT;                                                <<MPEIV>>01662000
INTEGER SEGIDENT;                                              <<MPEIV>>01664000
OPTION EXTERNAL;                                               <<MPEIV>>01666000
                                                               <<MPEIV>>01668000
PROCEDURE ADDTOLOCALITY(SLLINX,SEGIDENTIFIER,FLAGS);           <<MPEIV>>01670000
VALUE SLLINX,SEGIDENTIFIER,FLAGS;                              <<MPEIV>>01672000
INTEGER SLLINX,SEGIDENTIFIER,FLAGS;                            <<MPEIV>>01674000
OPTION EXTERNAL;                                               <<MPEIV>>01676000
                                                               <<04771>>01678000
DOUBLE PROCEDURE ATTACHIO(LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS);    01680000
VALUE LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                         01682000
INTEGER LDEV,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;                       01684000
OPTION FORWARD;                                                <<MPEIV>>01686000
                                                               <<04771>>01688000
INTEGER PROCEDURE GETTBUF(TYPE);                                        01690000
VALUE TYPE;INTEGER TYPE;OPTION FORWARD;                                 01692000
                                                               <<04771>>01694000
PROCEDURE RETURNTBUF(PNTR);                                             01696000
VALUE PNTR; INTEGER POINTER PNTR;OPTION FORWARD;                        01698000
                                                               <<04771>>01700000
PROCEDURE RETURNIOQ(PNTR);                                              01702000
VALUE PNTR; INTEGER POINTER PNTR;OPTION FORWARD;                        01704000
                                                                        01706000
PROCEDURE MMSTAT(E,P1,P2,P3);                                  <<00.02>>01708000
VALUE E,P1,P2,P3;                                              <<00.02>>01710000
INTEGER E,P1,P2,P3;                                            <<00.02>>01712000
OPTION EXTERNAL;                                               <<00.02>>01714000
                                                               <<00.02>>01716000
procedure SENDMSG(DESTPIN,DESTPORT,MSGLEN,FLAGS);              <<02808>>01718000
value DESTPIN,DESTPORT,MSGLEN,FLAGS;                           <<02808>>01720000
integer DESTPIN,DESTPORT,MSGLEN;                               <<02808>>01722000
logical FLAGS;                                                 <<02808>>01724000
option external;                                               <<02808>>01726000
                                                               <<02808>>01728000
INTEGER PROCEDURE SYSPROC(LPIN);                               <<HM.00>>01730000
VALUE LPIN;                                                    <<HM.00>>01732000
INTEGER LPIN;                                                  <<HM.00>>01734000
OPTION EXTERNAL;                                               <<HM.00>>01736000
                                                               <<HM.00>>01738000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<02808>>01740000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<02808>>01742000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<02808>>01744000
   IOTYPE;                                                     <<02808>>01746000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<02808>>01748000
   IOTYPE;                                                     <<02808>>01750000
INTEGER POINTER DITP;                                          <<02808>>01752000
OPTION variable,forward;                                       <<02808>>01754000
                                                               <<02808>>01756000
procedure MPE'TABLE'FULL(TABNUM);                                       01758000
value TABNUM;  integer TABNUM;                                          01760000
option forward;                                                         01762000
                                                                        01764000
PROCEDURE RESETCRITICAL(OLDCRIT);                                       01766000
  VALUE OLDCRIT;  INTEGER OLDCRIT;                                      01768000
  OPTION EXTERNAL;                                                      01770000
                                                                        01772000
PROCEDURE RESETDB(OLDDB);                                               01774000
  VALUE OLDDB;  INTEGER OLDDB;                                          01776000
  OPTION EXTERNAL;                                                      01778000
                                                                        01780000
PROCEDURE RETURNSYSBUF(INDEX);                                          01782000
VALUE INDEX;                                                            01784000
INTEGER INDEX;                                                          01786000
OPTION FORWARD;                                                         01788000
                                                                        01790000
PROCEDURE SENDSYNC(NEWDSTATE,DITP);                                     01792000
  VALUE NEWDSTATE;  INTEGER NEWDSTATE;                                  01794000
  ARRAY DITP;   OPTION FORWARD;                                         01796000
                                                                        01798000
LOGICAL PROCEDURE SETSYSDB;  OPTION EXTERNAL;                           01800000
                                                                        01802000
INTEGER PROCEDURE SETCRITICAL;                                          01804000
  OPTION EXTERNAL;                                                      01806000
                                                                        01808000
PROCEDURE SUDDENDEATH(N);                                               01810000
  VALUE N;  INTEGER N;                                                  01812000
  OPTION FORWARD;                                                       01814000
                                                                        01816000
DOUBLE PROCEDURE TIMER; OPTION FORWARD;                        <<00652>>01818000
                                                                        01820000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               01822000
  VALUE CODE, REQ, TIME;                                                01824000
  INTEGER CODE, REQ;   DOUBLE TIME;                                     01826000
  OPTION FORWARD;                                              <<00652>>01828000
                                                                        01830000
PROCEDURE UNIMPEDE(PCBPT);                                              01832000
  VALUE PCBPT;  INTEGER PCBPT;                                          01834000
  OPTION EXTERNAL;                                                      01836000
                                                                        01838000
PROCEDURE WAIT(WAITF,WAITTYPE);                                         01840000
  VALUE WAITF, WAITTYPE;                                                01842000
  INTEGER WAITF, WAITTYPE;                                              01844000
  OPTION EXTERNAL;                                                      01846000
DOUBLE PROCEDURE SDISCIO(LDNUM,QMISC,DSTX,ADR,FNCT,            <<SD.00>>01848000
CNT,P1,P2,FLAGS);                                              <<SD.00>>01850000
VALUE LDNUM,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;               <<SD.00>>01852000
INTEGER LDNUM,QMISC,DSTX,ADR,FNCT,CNT,P1,P2,FLAGS;             <<SD.00>>01854000
OPTION EXTERNAL;                                               <<SD.00>>01856000
                                                               <<SD.00>>01858000
INTEGER PROCEDURE EXCHANGEDB(DST);                             <<SD.00>>01860000
VALUE DST;                                                     <<SD.00>>01862000
INTEGER DST;                                                   <<SD.00>>01864000
OPTION EXTERNAL;                                               <<SD.00>>01866000
                                                               <<SD.00>>01868000
PROCEDURE HALT'HPIB(DITP);                                     <<02500>>01870000
INTEGER ARRAY DITP;                                            <<02500>>01872000
OPTION FORWARD;                                                <<02500>>01874000
                                                               <<02500>>01876000
LOGICAL PROCEDURE SED'HPIB(ENABLE'DISABLE);                    <<02500>>01878000
VALUE ENABLE'DISABLE;                                          <<02500>>01880000
INTEGER ENABLE'DISABLE;                                        <<02500>>01882000
OPTION FORWARD;                                                <<02500>>01884000
                                                               <<02500>>01886000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<02500>>01888000
INTEGER ARRAY DITP;                                            <<02500>>01890000
OPTION FORWARD;                                                <<02500>>01892000
                                                               <<02500>>01894000
PROCEDURE START'HPIB(DITP,SIOP,QUEUE);                         <<02500>>01896000
VALUE QUEUE;                                                   <<02500>>01898000
INTEGER ARRAY DITP,SIOP;                                       <<02500>>01900000
LOGICAL QUEUE;                                                 <<02500>>01902000
OPTION FORWARD;                                                <<02500>>01904000
                                                               <<02500>>01906000
                                                               <<02500>>01908000
PROCEDURE WIOC'HPIB(COMMAND,DATAWORD);                         <<02500>>01910000
VALUE COMMAND,DATAWORD;                                        <<02500>>01912000
INTEGER COMMAND,DATAWORD;                                      <<02500>>01914000
OPTION FORWARD;                                                <<02500>>01916000
                                                               <<02500>>01918000
PROCEDURE MAILBOX'DEBUG;                                       <<02500>>01920000
OPTION FORWARD;                                                <<02500>>01922000
PROCEDURE ADDTAIL(NEW,LINKINDEX,QUEUENUMBER);                           01924000
  VALUE   LINKINDEX, QUEUENUMBER;                                       01926000
  INTEGER LINKINDEX, QUEUENUMBER;                                       01928000
  INTEGER ARRAY NEW;                                                    01930000
  OPTION FORWARD;                                                       01932000
                                                                        01934000
                                                                        01936000
PROCEDURE ADDHEAD(NEW,LINKINDEX,QUEUENUMBER);                           01938000
  VALUE   LINKINDEX, QUEUENUMBER;                                       01940000
  INTEGER LINKINDEX, QUEUENUMBER;                                       01942000
  INTEGER ARRAY NEW;                                                    01944000
  OPTION FORWARD;                                                       01946000
                                                                        01948000
                                                                        01950000
INTEGER PROCEDURE DEQUEUE(LINKINDEX,QUEUENUMBER);                       01952000
  VALUE LINKINDEX, QUEUENUMBER;   INTEGER LINKINDEX, QUEUENUMBER;       01954000
  OPTION FORWARD;                                                       01956000
                                                                        01958000
                                                                        01960000
PROCEDURE CHECKLDEV(LDEV);                                              01962000
  VALUE LDEV;  INTEGER LDEV;                                            01964000
  OPTION FORWARD;                                                       01966000
                                                                        01968000
INTEGER PROCEDURE LDEVTOTYPE(LDEV);                            <<03032>>01970000
VALUE LDEV;  INTEGER LDEV;                                     <<03032>>01972000
OPTION FORWARD;                                                <<03032>>01974000
                                                                        01976000
PROCEDURE AWAKEIO( DITP,FLAGS);                                         01978000
  VALUE DITP, FLAGS;                                                    01980000
  INTEGER POINTER DITP;  INTEGER FLAGS;                                 01982000
  OPTION FORWARD;                                                       01984000
                                                                        01986000
                                                                        01988000
PROCEDURE STARTIO(DITP,SIOP,QUEUE);                         <<01301>>   01990000
VALUE QUEUE;                                                            01992000
INTEGER ARRAY DITP,SIOP;                                                01994000
LOGICAL QUEUE;                                                          01996000
OPTION FORWARD;                                                         01998000
                                                                        02000000
                                                               <<00148>>02004000
$PAGE                                                                   02006000
                                                                        02008000
PROCEDURE WRITECHAR( CHAR );                                            02010000
  VALUE CHAR;  INTEGER CHAR;                                            02012000
    OPTION PRIVILEGED, UNCALLABLE;                                      02014000
  BEGIN                                                                 02016000
    INTEGER POINTER DITP = Q+1;                                         02018000
    INTEGER DRTN =  Q+3;                                                02020000
                                                                        02022000
    TOS := LPDTD(CONSLDEV);  << SET CONSOLE DITP >>                     02024000
    TOS := WA0(DITP(DILTP)+ICNTRL) ;          <<  DRT NUMBER >><<01300>>02026000
    TOS := CHAR.CHARMASK +%43400;                                       02028000
                                                                        02030000
L1:                                                                     02032000
    ASMB( WIO 1 );                                                      02034000
    IF > THEN BEGIN DEL; GOTO L1; END;   << NOT READY >>                02036000
    CHECKDIO;                                                           02038000
                                                                        02040000
    DOCIO(DITP(DCNTRL),@DITP);                                 <<00692>>02042000
                                                                        02044000
WAIT:                                                                   02046000
    IF LOGICAL(POWERFAIL) THEN RETURN;  << POWERFAIL WITHIN POWERFAIL >>02048000
    ASMB( TIO 0 );                                                      02050000
    CHECKDIO;                                                           02052000
                                                                        02054000
    IF NOT LS0.MPXFLAG THEN    << NOT FINISHED >>                       02056000
      BEGIN  DEL;  GOTO WAIT;  END;                                     02058000
                                                                        02060000
    IF NOT TOS.SEND THEN                                                02062000
      BEGIN                                                             02064000
WRONGUNIT:                                                              02066000
      DOCIO((LOGICAL(DITP(DCNTRL)) LAND UNITMASK)+ACKINTRPT,   <<00692>>02068000
            @DITP);                                            <<00692>>02070000
        GOTO WAIT;                                                      02072000
      END;                                                              02074000
                                                                        02076000
L2:                                                                     02078000
    ASMB( RIO 0 );                                                      02080000
    IF > THEN BEGIN DEL; GOTO L2;  END;    << NOT READY >>              02082000
    CHECKDIO;                                                           02084000
   IF TOS.MPXUNIT<>DITP(DCNTRL).(2:5) THEN GOTO WRONGUNIT;              02086000
                                                                        02088000
   DOCIO((LOGICAL(DITP(DCNTRL)) LAND UNITMASK)+ACKINTRPT,@DITP);        02090000
                                                                        02092000
  END;   <<  WRITE CHAR >>                                              02094000
                                                                        02096000
                                                                        02098000
                                                                        02100000
PROCEDURE WRITE2(TC);                                                   02102000
  VALUE TC;  INTEGER TC;                                                02104000
    OPTION PRIVILEGED, UNCALLABLE;                                      02106000
  BEGIN  << WRITES TWO CHARACTERS TO THE MUX >>                         02108000
    WRITECHAR(TC&LSR(8));                                               02110000
    WRITECHAR(TC);                                                      02112000
  END;  << WRITE 2  >>                                                  02114000
$PAGE                                                                   02116000
                                                                        02118000
PROCEDURE BCONVERT(BN);                                                 02120000
  VALUE BN;  INTEGER BN;                                                02122000
    OPTION PRIVILEGED, UNCALLABLE;                                      02124000
  BEGIN  << CONVERTS AND PRINTS THE BINARY NUMBER BN >>                 02126000
    TOS := BN;                                                          02128000
    ASMB(ZERO,ZROX);                                                    02130000
    TOS := TOS&DLSR(2);  << GET READY >>                                02132000
                                                                        02134000
    WHILE X<6 DO   << CONVERT TO ASCII AND PRINT >>                     02136000
      BEGIN                                                             02138000
        TOS := TOS&DCSL(3);  << GET A DIGIT >>                          02140000
        X := X+1;  << INCREMENT COUNTER >>                              02142000
        WRITECHAR(S0.(13:3)+"0");                                       02144000
      END;                                                              02146000
                                                                        02148000
  END;  << B CONVERT >>                                                 02150000
                                                                        02152000
PROCEDURE DCONVERT(N);                                                  02154000
  VALUE N;  INTEGER N;                                                  02156000
    OPTION PRIVILEGED, UNCALLABLE;                                      02158000
  << CONVERTS THE NUMBER N TO ASCII DECIMAL AND OUTPUTS >>              02160000
  BEGIN                                                                 02162000
    INTEGER TEMP;                                                       02164000
                                                                        02166000
    TOS := N;  TOS := 1000;                                    <<SD.00>>02168000
    ASMB(DIV , XCH);                                                    02170000
    TEMP := TOS;                                                        02172000
    IF <> THEN WRITECHAR(TEMP+"0");                                     02174000
    TOS := 100;  ASMB( DIV, XCH);                              <<SD.00>>02176000
    TEMP := TOS;                                                        02178000
    IF <> OR N>999 THEN WRITECHAR(TEMP+"0");                   <<SD.00>>02180000
    TOS := 10;  ASMB( DIV, XCH);                               <<SD.00>>02182000
    TEMP:=TOS;                                                 <<SD.00>>02184000
    IF <> OR N>99 THEN WRITECHAR(TEMP+"0");                    <<SD.00>>02186000
    TOS := TOS + "0";                                                   02188000
    WRITECHAR( * );                                                     02190000
  END;   << D CONVERT >>                                                02192000
$PAGE                                                                   02196000
                                                                        02198000
PROCEDURE DOCIO(ORDER,DEVICE);                                          02200000
  VALUE ORDER, DEVICE;  INTEGER ORDER, DEVICE;                          02202000
  OPTION UNCALLABLE, PRIVILEGED;                                        02204000
  <<                                                                    02206000
    THIS PROCEDURE DOES A CIO INSTRUCTION TO THE DEVICE REFERENCED BY   02208000
    DEVICE, SENDING THE WORD ORDER.  IF THERE IS A CIO FAILURE, THE     02210000
    PROCEDURE IOFAILURE IS CALLED.                                      02212000
    IF DEVICE IS LESS THAN 128, THEN IT IS CONSIDERED A DRT OTHERWISE   02214000
    IT IS CONSIDERED A DIT POINTER;                                     02216000
  >>                                                                    02218000
  BEGIN                                                                 02220000
    INTEGER POINTER DITP = Q+1;                                         02222000
                                                                        02224000
    IF DEVICE>128 THEN    << IT IS A DIT POINTER >>                     02226000
      BEGIN                                                             02228000
        TOS := DEVICE;    << SET DITP >>                                02230000
        DEVICE := WA0(DITP(DILTP)+ICNTRL).DRTNUMBER;           <<01300>>02232000
      END                                                               02234000
    ELSE TOS := 0;   << SET DITP TO INDICATE NO DIT SPECIFIED >>        02236000
                                                                        02238000
    TOS := DEVICE;                                                      02240000
    TOS := ORDER;                                                       02242000
    ASMB( CIO 1 );                                                      02244000
    << Removed call to IOFAILURE here. >>                      <<04771>>02246000
  END;    << DO CIO >>                                                  02248000
$PAGE                                                                   02250000
                                                                        02252000
PROCEDURE MASTERCLEAR(DITP);                                            02254000
  INTEGER ARRAY DITP;    OPTION PRIVILEGED, UNCALLABLE;                 02256000
  <<                                                                    02258000
     THIS PROCEDURE ISSUES A MASTERCLEAR FOLLOWED BY A CLEAR INTERRUPTS 02260000
     ORDER TO THE CONTROLLER IDENTIFIED BY DITP. THE SIO PROGRAM FLAGS  02262000
     AND COUNTERS  ARE CLEANED UP AS IF AND INTERRUPT OCCURED. >>       02264000
  BEGIN                                                                 02266000
 INTEGER CHANNEL = Q+1,                                                 02268000
         SAVE    = CHANNEL+1;                                           02270000
   IF HPIB THEN                                                <<02500>>02272000
    BEGIN                                                      <<02500>>02274000
     MASTERCLEARHPIB(DITP);                                    <<02500>>02276000
     RETURN;                                                   <<02500>>02278000
    END;                                                       <<02500>>02280000
   TOS := DITP(DILTP) + ICNTRL; << ILT POINTER >>              <<01300>>02282000
   TOS := PS0; << ILT WORD 7 >>                                <<01300>>02284000
   DELB;    DISABLE;                                                    02286000
    DOCIO(%100000,@DITP);   << DO MASTER CLEAR >>                       02288000
    DOCIO(%40000,@DITP);     << CLEAR INTERRUPTS >>                     02290000
    DITP.IOPROG := 0;                                                   02292000
    IF <> THEN   << SIO PROGRAM IN PROGRESS >>                          02294000
      BEGIN                                                             02296000
        SIOCOUNT := SIOCOUNT - 1;                                       02298000
        ASMB(TEST); << CHECK FOR SOFTWARE CHANNEL >>                    02300000
        IF < THEN CHKCHANNELQUE(*,DITP);  << GET NEXT CHANNEL USER >>   02302000
      END ELSE                                                          02304000
      BEGIN << I/O NOT STARTED, CHECK FOR CHANNEL WAITING >>            02306000
         ASMB(TEST); << CHECK ILT 0 FOR MULTI CHANNEL >>                02308000
         IF < THEN                                                      02310000
         BEGIN                                                          02312000
            TOS := TOS.CHANQUE; << CHANNEL # >>                         02314000
            TOS := DEQUEUE(DLINK,CHANNEL);                              02316000
            TOS := S0; << SAVE DITP FOR END TEST >>                     02318000
            IF > THEN << DIT LIST IS NOT EMPTY >>                       02320000
              WHILE S0 <> @DITP DO                                      02322000
              BEGIN << THIS ISN'T THE DIT, KEEP LOOKING >>              02324000
                 ADDTAIL(*,DLINK,CHANNEL); << PUT BACK ON LIST >>       02326000
                 TOS := DEQUEUE(DLINK,CHANNEL); << GET NEXT DIT >>      02328000
                 IF S0 = SAVE THEN                                      02330000
                 BEGIN << END OF LIST, DIT IS NOT IN LIST >>            02332000
                    ADDTAIL(*,DLINK,CHANNEL);                           02334000
                    RETURN;                                             02336000
                 END;                                                   02338000
              END;                                                      02340000
         END;                                                           02342000
      END;                                                              02344000
  END;  << MASTER CLEAR >>                                              02346000
                                                                        02350000
                                                                        02352000
PROCEDURE AWAKETERMINAL(DITP);                                          02354000
  INTEGER ARRAY DITP;                                                   02356000
    OPTION UNCALLABLE,PRIVILEGED;                              <<01.02>>02358000
  <<                                                                    02360000
    THIS PROCEDURE SEARCHES THE IOQ LIST OF THE DEVICE SPECIFIED BY     02362000
    DITP AND IF ANY BLOCKED I/O OPERATION IS FOUND, THAT PROCESS IS     02364000
    AWAKENED TO RUN THE TERMINAL MONITOR. IF NO BLOCKED I/O PROCESS     02366000
    IS FOUND, THE SYSTEM I/O PROCESS IS AWAKENED.                       02368000
  >>                                                                    02370000
  BEGIN                                                                 02372000
    X := DITP(DIOQP);                                                   02374000
    WHILE <> DO   << SEARCH FOR A BLOCKED REQUEST >>                    02376000
      IF LOGICAL(WA0(X)).BLOCKED THEN                                   02378000
        BEGIN   << A BLOCKED REQUEST FOUND >>                           02380000
          X := X + QSTAT;   << INDEX TO PCB NUMBER >>                   02382000
          AWAKE(WA0(X).PCBN*PCBSIZE,BLKDIO,NOWAIT);                     02384000
          RETURN;                                                       02386000
        END                                                             02388000
      ELSE X := WA0(X:=X+QLINK);   << STEP TO NEXT IOQ >>               02390000
                                                                        02392000
    AWAKEIO(DITP,NOIMPEDE);                                             02394000
  END;   << AWAKE TERMINAL >>                                           02396000
$PAGE                                                                   02398000
                                                                        02400000
PROCEDURE CHECKINDEX(INDX,TB);                                          02402000
  VALUE INDX,TB;  INTEGER INDX;  INTEGER POINTER TB;                    02404000
  OPTION PRIVILEGED, UNCALLABLE;                                        02406000
  BEGIN                                                                 02408000
    INTEGER SIZE;    << SIZE OF ELEMENT >>                              02410000
    LOGICAL FLAG;  << IF SET CHECK MODULO OF SIZE >>                    02412000
                                                                        02414000
    FLAG := 1;   SIZE := TB(1).(8:8);                                   02416000
                                                                        02418000
    IF @TB=@SBUF THEN                                                   02420000
      IF INDX>=0 THEN INDX := INDX-1 ELSE                               02422000
        BEGIN                                                           02424000
          INDX := NOT LOGICAL(INDX);  << NEGATE & SUBTRACT 1 >>         02426000
          FLAG := 0;  << NO MODULO CHECK >>                             02428000
        END;                                                            02430000
                                                                        02432000
     IF @TB=ABSOLUTE(SYSDISCREQTAB) THEN INDX:=INDX-%20 ELSE   <<01638>>02434000
    INDX := INDX-%10;                                                   02436000
    IF NOT(0<=INDX<=SIZE*(TB&LSR(8))) OR                                02438000
    FLAG AND (INDX MOD SIZE)<>0 THEN                                    02440000
      SUDDENDEATH(249);                                                 02442000
  END;  << CHECK INDEX >>                                               02444000
$PAGE                                                                   02446000
                                                                        02448000
PROCEDURE DMONITOR(DITP,ID,P1,P2);                                      02450000
  VALUE ID, P1, P2;   INTEGER ID, P1, P2;                               02452000
  INTEGER ARRAY DITP;                                                   02454000
  OPTION PRIVILEGED, UNCALLABLE;                                        02456000
  BEGIN                                                                 02458000
    INTEGER POINTER PS1 = S - 1;                                        02460000
    INTEGER Q0 = Q - 0;                                                 02462000
    DEFINE MSECS'24'DAYS= 2073600000D#;                        <<01.03>>02464000
                                                                        02466000
    TOS := DITP(DMONTR).MCODE;   << SET MNCODE >>              <<00.06>>02468000
    TOS := TOS LAND LOGICAL(ID) LAND %70; << CHECK CALLER WITH FLAGS >> 02470000
    IF = THEN RETURN;  << CALLER NOT BEING MONITORED >>                 02472000
                                                                        02474000
    TOS := DSETB;                                                       02476000
    IF = THEN  << GET A SBUF FOR MONITORING >>                          02478000
      BEGIN                                                             02480000
        TOS := GETSBUF(1);   << PRIMARY AREA ONLY >>                    02482000
        ASMB( TEST );   IF = THEN RETURN;   << NONE AVAILABLE >>        02484000
        DSETB := TOS - 1;  << SET BASE TO FIRST WORD OF BUFFER >>       02486000
     END;                                                               02488000
                                                                        02490000
    X := DITP(X).(13:3);   << EXTRACT MONITORING FUNCTION >>            02492000
    ASMB(BR *+1,X;   EXIT 4;   BR CALLHELP;  BR MNTR;   BR HISTO;       02494000
      NOP;     NOP;     NOP;    EXIT 4);                                02496000
                                                                        02498000
CALLHELP:                                                               02500000
    DISABLE;                                                            02502000
    PUSH( Q );   TOS := S0-Q0;   SET( Q );                              02504000
    HELP;                                                               02506000
    SET(  Q );   RETURN;                                                02508000
                                                                        02510000
HISTO:                                                                  02512000
    WA0(DSETB) := WA0(DSETB) + 1;                                       02514000
    TOS := TIMER;   ASMB(DDUP     );                                    02516000
    TOS:=LASTTIMER; ASMB(DSUB);  << DELTA T >>                 <<01.03>>02518000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<01.03>>02520000
              << THAT TIMER HAS OVERFLOWED    >>               <<01.03>>02522000
       TOS:= TOS+MSECS'24'DAYS;                                <<01.03>>02524000
    ASMB(DELB);                                                <<01.03>>02526000
    IF S0>127 THEN BEGIN  DEL;  TOS := 127;  END;                       02528000
    ASMB(ADAX,INCX);                                                    02530000
    WA0(X) := WA0(X) + 1;  << BUMP THIS TIME SLOT COUNT >>              02532000
    LASTTIMER := TOS;                                                   02534000
    RETURN;                                                             02536000
                                                                        02538000
MNTR:                                                                   02540000
    IF P2=-1 THEN  << USE DEFAULT PARAMETER >>                          02542000
      BEGIN                                                             02544000
        TOS := DITP(DIOQP);   << SET IOQ POINTER >>                     02546000
        TOS := PS0(QMISC);   << Q FLUSH AND REQUEST STATE >>            02548000
        TOS.( 1:6) := DITP(DMODEM);  << PRIMED,TMODE,LPLEVEL >>         02550000
        TOS.( 7:3) := PS1;   << RPLEVEL >>                              02552000
        P2 := TOS;                                                      02554000
      END;                                                              02556000
                                                                        02558000
    TOS := TIMER;   ASMB(DDUP     );                                    02560000
    DISABLE;                                                            02562000
    TOS :=LASTTIMER;                                                    02564000
    ASMB(DSUB);  << DELTA T >>                                 <<01.03>>02566000
    IF < THEN << NEGATIVE TIME INTERVAL MEANS >>               <<01.03>>02568000
              << THAT TIMER HAS OVERFLOWED    >>               <<01.03>>02570000
       TOS:= TOS+MSECS'24'DAYS;                                <<01.03>>02572000
    ASMB(ZROX,XCH,DEL);                                        <<01.03>>02574000
    IF <> THEN  BEGIN  DEL;   TOS := %7777;   END                       02576000
    ELSE                                                                02578000
      BEGIN                                                             02580000
        WHILE S0.( 0:6)<>0 DO                                           02582000
          BEGIN   X := X+1;   TOS := TOS&LSR(3);   END;                 02584000
        TOS.( 4:2) := X;                                                02586000
      END;                                                              02588000
    TOS.( 0:4) := ID;                                                   02590000
                                                                        02592000
    TOS := WA0(DSETB);  << GET INDEX >>                                 02594000
    WA0(X) := S0 + 4;  << STEP TO NEXT >>                               02596000
    TOS := TOS.(9:7);  << MOD 128 >>                                    02598000
    ASMB( ADAX,INCX);  << FORM INDEX TO THIS BLOCK >>                   02600000
    WA0(X) := TOS;     << SAVE DELTA T >>                               02602000
    LASTTIMER := TOS;                                                   02604000
    ASMB(LDXA,INCA);  << SAVE INDEX AND BUMP >>                         02606000
    TOS := DITP;                                                        02608000
    TOS.( 0:4) := DITP(DLDEV).( 4:4);  << UNIT >>                       02610000
    TOS.( 4:1) := DITP.PAIR;                                   <<00.05>>02612000
    TOS.(10:1) := DITP(DLDEV).FLUSH;                                    02614000
    TOS.( 5:2) := DITP(DMODEM).(CB':2);  << CB, SB >>                   02616000
    TOS.( 7:3) := DITP.(UP':3);  << UP, ACTIVE, REQUEST >>              02618000
    TOS.(11:1) := DITP.BINARYREAD;                                      02620000
    ENABLE;    ASMB(STBX,DELB);   << RESTORE INDEX >>                   02622000
    WA0(X) := TOS;    << SAVE DMODEM >>                                 02624000
    WA0(X:=X+1) := P1;                                                  02626000
    WA0(X:=X+1) := P2;  << FLAG LAST WORD OF BLOCK >>                   02628000
  END;   << DMONITOR  >>                                                02630000
$PAGE                                                                   02632000
$PAGE "SIODM - SIO DEVICE MONITOR PROCEDURE"                            02636000
PROCEDURE STARTIO(DITP,SIOP,QUEUE);                                     02638000
VALUE QUEUE;                                                            02640000
INTEGER ARRAY DITP,SIOP;                                                02642000
LOGICAL QUEUE;                                                          02644000
OPTION PRIVILEGED,UNCALLABLE;                                           02646000
BEGIN                                                                   02648000
INTEGER                                                                 02650000
   DRTN        = Q+3,  << DRT NUMBER >>                                 02652000
   CHANNEL     = Q+2;  << CHANNEL QUEUE # >>                            02654000
                                                                        02656000
INTEGER POINTER                                                         02658000
   ILTP        = Q+1;                                                   02660000
LOGICAL POINTER                                                <<RK0PV>>02662000
   DITPL       = DITP;                                         <<RK0PV>>02664000
EQUATE NSDMASK = %040140;  <<USER DOMAIN DISC - 7920/7905>>             02666000
                                                                        02668000
   TOS := DITP(DILTP);    << GET MULTI CONTROLLER CHANNEL FLAG >>       02670000
   DISABLE;                                                             02672000
                                                                        02674000
   TOS := ILTP(ICNTRL);                                        <<01300>>02676000
   IF < THEN                                                            02678000
   BEGIN << CONTROLLER IS ON A CHANNEL >>                               02680000
      TOS := TOS.CHANQUE; << DERIVE QUEUE # >>                          02682000
                                                               <<04572>>02684000
      << We must protect ourselves from a possible INTERRUPT >><<04572>>02686000
      << between checking ownership of the SOFTWARE CHANNEL  >><<04572>>02688000
      << and possibly mainipulating it.                      >><<04572>>02690000
                                                               <<04771>>02692000
      IF BUSY(CHANNEL) <> 0 THEN                                        02694000
      BEGIN << CHANNEL IS BUSY, QUEUE REQUEST >>                        02696000
         IF QUEUE THEN ADDTAIL(DITP,DLINK,CHANNEL);                     02698000
         << PUT DEVICE ON CHANNEL QUEUE IF REQUESTED >>                 02700000
                                                               <<04572>>02702000
         << Save SIOP start address >>                         <<04572>>02704000
         ILTP(ICPGM) := @SIOP;                                 <<04572>>02706000
         ILTP(IFLAG).SQ := if QUEUE then 1 else 0;             <<04572>>02708000
                                                               <<04572>>02710000
         << Turn off IAK bit in DIT to inhibit SIODM >>        <<04572>>02712000
         DITP.IAK := 0;                                        <<04572>>02714000
                                                               <<04572>>02716000
         TOS := CCL;                                                    02718000
         GO TO OUT;                                                     02720000
      END;                                                              02722000
      BUSY(CHANNEL) := @DITP; << IF NOT BUSY, SET BUSY >>               02724000
                                                               <<04771>>02726000
   END;                                                                 02728000
                                                                        02730000
   tos := ILTP(ICNTRL).DRTNUMBER;                              <<03697>>02732000
   TOS := @SIOP + SYSDB;                                                02734000
                                                               <<03663>>02736000
  << Log SIOP event in MMSTAT table        >>                  <<03663>>02738000
  << Word 0 - MMSTAT event 193             >>                  <<03663>>02740000
  <<      1 - DRT number                   >>                  <<03663>>02742000
  <<      2 - SIOP address                 >>                  <<03663>>02744000
  <<      3 - LSW of timer                 >>                  <<03663>>02746000
  ASMB(ddup);   << Duplicate DRT & SIOP address >>             <<03663>>02748000
  tos := 193;   << Event number                 >>             <<03663>>02750000
  ASMB(cab,cab);<< Put in the right order       >>             <<03663>>02752000
  tos := TIMER;                                                <<03663>>02754000
  ASMB(delb);   << Remove high-order word of timer >>          <<03663>>02756000
  MMSTAT(*,*,*,*);                                             <<03663>>02758000
                                                               <<03663>>02760000
      IF DITPL.DISC                                            <<01300>>02762000
         THEN DOCIO(%040000,@DITP); <<CLEAR INTERRUPT>>        <<RK2PV>>02764000
   ASMB(SIO 1); << START THE I/O PROGRAM >>                             02766000
   IF = THEN                                                            02768000
   BEGIN << I/O IS SUCCESSFULLY STARTED >>                              02770000
                                                               <<04572>>02772000
      << We must DISABLE to protect shared SYSGLOB cell >>     <<04572>>02774000
                                                               <<04771>>02776000
      SIOCOUNT := SIOCOUNT + 1;                                         02778000
                                                               <<04771>>02780000
                                                               <<04572>>02782000
      TOS := DITP;                                                      02784000
      TOS.IAK := 0; << RESET INTERRUPT ACKNOWLEDGE >>                   02786000
      TOS.IOPROG := 1; << SET I/O PROG. IN PROGRESS >>                  02788000
      DITP := TOS;                                                      02790000
      TOS := CCE;                                                       02792000
OUT:                                                                    02794000
      RSTATUS.CC := TOS;                                                02796000
      RETURN;                                                           02798000
   END;                                                                 02800000
                                                                        02802000
   << If CCL, then hardware did not respond >>                 <<04771>>02804000
   IF < THEN                                                   <<04771>>02806000
      BEGIN                                                    <<04771>>02808000
                                                               <<04771>>02810000
      << Print message to operator that I/O on DRT failed >>   <<04771>>02812000
      ISSUE'HARD'MSG(3,DRTN,1); << Non-resp DRT msg >>         <<04771>>02814000
      IOMESSAGE(1,NON'RESP'DEV'MSG,%10000,DRTN,,,,,            <<04771>>02816000
                OPCONSOLE);                                    <<04771>>02818000
                                                               <<04771>>02820000
      END                                                      <<04771>>02822000
   ELSE                                                        <<04771>>02824000
      DITP(DSTAT) := TOS;  << CCG MEANS I/O NOT RDY, SAVE STATU<<04771>>02826000
                                                                        02828000
   << If device is on a channel queue, we must release it >>   <<04771>>02830000
   TOS := ILTP(ICNTRL);                                        <<04771>>02832000
   IF < THEN   << Yes, it is on a channel queue >>             <<04771>>02834000
      CHKCHANNELQUE(*,DITP);                                   <<04771>>02836000
                                                               <<04771>>02838000
   TOS := CCG;                                                          02840000
   GO TO OUT;                                                           02842000
END;                                                                    02844000
$PAGE "GIP  -  GENERAL INTERRUPT PROCESSOR"                             02848000
PROCEDURE GIP;                                                          02850000
OPTION PRIVILEGED,UNCALLABLE;                                           02852000
BEGIN                                                                   02854000
EQUATE STHISDITP=-5,                                           <<01959>>02856000
       ISTAP=%11,                                              <<01959>>02858000
       SSEEKMASK=-3;                                           <<01959>>02860000
INTEGER                                                                 02862000
   DRTN        = Q+3,                                                   02864000
   DEVSTATUS   = Q+4, << DEVICE STATUS >>                               02866000
   UNIT        = Q+5, << UNIT NUMBER EXTRACTED FROM DEVSTATUS>><<00148>>02868000
   DBIUNIT     = DB + IUNIT; << DITP FOR THIS UNIT >>                   02870000
INTEGER POINTER                                                         02872000
   ILTP        = Q+6, << ILT POINTER >>                        <<00148>>02874000
   SIOP        = Q+7, << SIO PROGRAM POINTER >>                <<00148>>02876000
   DITP        = Q+8; << DIT POINTER >>                        <<00148>>02878000
LOGICAL POINTER                                                         02880000
   DITPL       = DITP;                                                  02882000
                                                                        02884000
EQUATE IDITP'1 = IDITP + 1;                                    <<00148>>02886000
   ASMB(TIO 0); << GET STATUS FROM DEVICE >>                            02888000
   IF < THEN IOFAILURE(DRTN, 0 ); << CONTROLLER FAILURE >>              02890000
   DUPLICATE;                                                           02892000
   TOS := DBIUNIT; << UNIT EXTRACT INSTRUCTION, DB IS AT BASE OF ILT >> 02894000
   IF <> THEN ASMB(XCH; XEQ 1); << EXTRACT UNIT # FROM STATUS >>        02896000
   ASMB(DELB);                 << Q+5 - UNIT >>                <<00148>>02898000
   TOS := 0;                                                            02900000
   TOS := SYSDB;                                                        02902000
   ASMB(XCHD); << SET DB TO SYSDB >>                                    02904000
   TOS := SYSDB;                                                        02906000
   ASMB(SUB,DELB);             << Q+6 - ILT POINTER >>         <<00148>>02908000
   TOS := ILTP(ISIOP);         << Q+7 - SIOP >>                <<00148>>02910000
   TOS := ILTP(IFLAG).HCUNIT;  << HIGHEST CONFIGURED UNIT >>   <<01300>>02912000
   IF TOS < UNIT OR (TOS := ILTP(UNIT+IDITP)) <= 0 THEN        <<00148>>02914000
      BEGIN                                                    <<00148>>02916000
      << Print message here >>                                 <<03663>>02918000
      IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,OPCONSOLE);  <<03663>>02920000
        ASMB( IXIT );                                          <<00148>>02922000
      END;                                                     <<00148>>02924000
   IF DITPL.DISC THEN                                          <<01959>>02926000
      BEGIN <<MAYBE WRONG UNIT INTERRUPTING>>                  <<01959>>02928000
      tos := SIOP(SSEEKMASK);                                  <<04572>>02930000
      X := UNIT;                                               <<04572>>02932000
      ASMB(TBC 0,X);                                           <<01959>>02934000
      IF <> THEN @DITP:=SIOP(STHISDITP); <<REMAP DITP>>        <<01959>>02936000
      END;                                                     <<01959>>02938000
   DITP(DSTAT) := DEVSTATUS; << SAVE AWAY THE DEVICE STATUS >>          02940000
   << LOG EVENT FOR BUG DETECTION>>                            <<01914>>02942000
   TOS:=192;                                                   <<01914>>02944000
   TOS:=ABSOLUTE(DRTN*4)-SYSDB-ILTP(ISIOP);<<REL CHAN LOC>>    <<01914>>02946000
   TOS.(0:7):=DITP(DLDEV).DLDEVN;                              <<01914>>02948000
   TOS:=WA0(ILTP(ISTAP));                                      <<01914>>02950000
   TOS:=TIMER;ASMB(DELB); <<LOW ORDER TIMER>>                  <<01914>>02952000
   MMSTAT(*,*,*,*);                                            <<01914>>02954000
   TOS := DITP;                                                         02956000
   TOS.IAK := 1; << SET INTERRUPT ACKNOWLEDGE >>                        02958000
   TOS.IOPROG := 0; << RESET I/O PROG IN PROGRESS >>                    02960000
   DITP := TOS;                                                         02962000
   IF <> THEN                                                           02964000
   BEGIN << I/O PROGRAM COMPLETION, CHECK FOR CHANNEL >>                02966000
      DISABLE;                                                          02968000
      SIOCOUNT := SIOCOUNT - 1;                                         02970000
      ENABLE;                                                           02972000
      TOS := ILTP(ICNTRL);       <<  DRT NUMBER >>             <<01300>>02974000
      IF < THEN CHKCHANNELQUE(*,DITP);                                  02976000
   END ELSE IF DITP.STATEF = 0 THEN DITP.STATEF := 6; << SET DEVREC >>  02978000
   AWAKEIO(DITP,NOIMPEDE);  << CALL MONITOR FOR INTERRUPTING DEVICE >>  02980000
   ASMB( IXIT );                                                        02982000
END;                                                                    02984000
$PAGE                                                                   02990000
<< Procedure LDEVNOTRDY re-written & moved to INCLHARD >>      <<03697>>02992000
$PAGE "MEASUREMENT PROCEDURES"                                          02996000
PROCEDURE PTRIP;                                                        02998000
OPTION PRIVILEGED,UNCALLABLE;                                           03000000
BEGIN                                                                   03002000
  INTEGER                                                               03004000
  DB4    =DB+4,                                                         03006000
  DEVICE =Q+3, <<INTERRUPT DRT#>>                                       03008000
  DEVSTATUS = Q+4;  <<DEVICE STATUS>>                                   03010000
  INTEGER POINTER                                                       03012000
  DITP = Q+5,  <<DIT POINTER>>                                          03014000
  ILTP = Q+6,  <<ILT POINTER>>                                          03016000
  DLTP = Q+7;                                                           03018000
  LOGICAL POINTER                                                       03020000
  DITPL = DITP;                                                         03022000
  EQUATE SYSDB = %1000;                                                 03024000
EQUATE                                                                  03026000
        CLEAR      =    %040000,       <<RESET INTS               >>    03028000
        INITCHR    =    %002023,       <<START NEXT CHARACTER>>         03030000
        MSK         =  8,                                               03032000
         MXNULL     =   9,                                     <<00.06>>03034000
        NULLCNT     =  10,                                              03036000
        TERMCHR     =  11,                                              03038000
        COUNT       =  12,                                              03040000
        ODDBYTEF    =  13,                                              03042000
        SAVCNT      =  18,                                              03044000
        TEMP        =  19,                                              03046000
        ADDR        =  14,                                              03048000
        BANKA       =  15,                                              03050000
        CNT         =  16,                                              03052000
        FLG         =  17,                                              03054000
        TRBLF   =1,                                                     03056000
        EOTF    =2,                                                     03058000
        DELF       =          3,                                        03060000
        WAITF      =          4,                                        03062000
        TOF         =         5,                                        03064000
        CR         =        %15,                                        03066000
        LF         =        %12,                                        03068000
        XC         =       %030,       <<CONTROL X>>                    03070000
        HC         =       %010,       <<CONTROL H>>                    03072000
        QC         =       %21,                                         03074000
        YC         =       %31,                                         03076000
        R0         =       %177,                                        03078000
        STOPEQTS   =     000000;       <<STOPPER FOR EQUATES        >>  03080000
  ASSEMBLE(TIO 0);  <<GET STATUS FROM DEVICE>>                          03082000
  IF < THEN SUDDENDEATH(262);                                           03084000
  TOS:= WA0(IDITP);    <<  DITP   >>                           <<00795>>03086000
  TOS:=0;                                                               03088000
  TOS:=SYSDB;                                                           03090000
  ASSEMBLE(XCHD);  <<SET DB TO SYS DB>>                                 03092000
  TOS:=SYSDB;                                                           03094000
  ASSEMBLE(SUB,DELB);    <<ILT POINTER>>                                03096000
  DITP(DSTAT):=DEVSTATUS;   <<SAVE  DEVICE STATUS>>                     03098000
  TOS:=DITP;                                                            03100000
  TOS.IAK:=1;  <<SET INTERRUPT ACKNOWLEDGE>>                            03102000
  DITP:=TOS;                                                            03104000
  IF DITP(FLG) = WAITF THEN GO WAKEMON;                                 03106000
  IF DITP(COUNT) = 0 THEN GO WAKEMON;                          <<00.06>>03108000
<<WAIT FOR RIO OK OR WATCHDOG TIMER>>                                   03110000
  IF DEVSTATUS.(1:1)=0 THEN                                             03112000
  BEGIN                                                                 03114000
    TOS:=DEVICE;                                                        03116000
TEST:                                                                   03118000
    ASSEMBLE(TIO 0);                                                    03120000
    IF <> THEN GO TRBL;                                                 03122000
    DEVSTATUS:=TOS;                                                     03124000
    IF DEVSTATUS.(1:1)=1 THEN GO OK;                                    03126000
    IF DEVSTATUS.(12:1)=1 THEN GO BR1;                         <<00.05>>03128000
    IF DEVSTATUS.(15:1)=1 THEN GO TRBL;                                 03130000
    GO TEST;                                                            03132000
OK:                                                                     03134000
    ASSEMBLE(DEL);                                                      03136000
  END;                                                                  03138000
BR1:                                                           <<00.05>>03140000
  IF DEVSTATUS.(12:1)=1 THEN IF DITP(MSK)=%377 THEN                     03142000
  BEGIN  <<OUT OF TAPE IN BINARY MODE>>                                 03144000
    DITP(FLG):=TOF;                                                     03146000
    DITP(COUNT):=0;                                            <<00.06>>03148000
    GO WAKEMON;                                                         03150000
  END;                                                                  03152000
  TOS:=DEVICE;                                                          03154000
  ASSEMBLE (RIO 0);                                                     03156000
  IF <> THEN GO TRBL;  <<RIO REJECTED>>                                 03158000
  IF DITP(MSK) = %377 THEN                                              03160000
  BEGIN  <<BINARY MODE>>                                                03162000
    GO SAVEIT;                                                          03164000
  END;                                                                  03166000
  TOS:=TOS LAND LOGICAL(DITP(MSK));  <<PARITY BIT>>                     03168000
  IF = THEN GO NULLC;                                                   03170000
  TOS:=S0;                                                              03172000
  DITP(NULLCNT):=DITP(MXNULL);                                          03174000
  IF TOS = DITP(TERMCHR) THEN                                           03176000
  BEGIN  <<TERMINATION CHARACTER DETECTED>>                             03178000
    DEL;                                                                03180000
    GO WAKEMON;                                                         03182000
  END;                                                                  03184000
  IF DITP(FLG) = DELF THEN GO IGNORE;                                   03186000
  TOS:=S0;                                                              03188000
  IF TOS = LF THEN                                                      03190000
  BEGIN                                                                 03192000
IGNORE:                                                                 03194000
    DEL;                                                                03196000
    GO NXTCHR;                                                          03198000
  END;                                                                  03200000
  TOS:=S0;                                                              03202000
  IF TOS = XC THEN                                                      03204000
  BEGIN  <<DELETE LINE>>                                                03206000
    DITP(FLG):=DELF;                                                    03208000
    GO IGNORE;                                                          03210000
  END;                                                                  03212000
  TOS:=S0;                                                              03214000
  IF TOS = CR THEN GO IGNORE;                                           03216000
  TOS:=S0;                                                              03218000
  IF TOS = XOFF THEN GO IGNORE;                                         03220000
  TOS:=S0;                                                              03222000
  IF TOS =QC THEN GO IGNORE;                                            03224000
  TOS:=S0;                                                              03226000
  IF TOS= YC THEN GO IGNORE;                                            03228000
  TOS:=S0;                                                              03230000
  IF TOS = R0 THEN GO IGNORE;                                           03232000
  TOS:=S0;                                                              03234000
  IF TOS = HC THEN                                                      03236000
  BEGIN  <<DELETE CHARACTERS>>                                          03238000
    TOS:=DITP(CNT);                                                     03240000
    IF > THEN                                                           03242000
    BEGIN  <<OK TO DELETE CHARACTERS>>                                  03244000
    TOS:=TOS-1;                                                         03246000
    DITP(SAVCNT):=TOS;                                                  03248000
    DITP(COUNT):=DITP(COUNT)-1;                                         03250000
    TOS:=DITP(ODDBYTEF);                                                03252000
    ASSEMBLE(TCBC 0);                                                   03254000
    DITP(SAVCNT):=TOS;                                                  03256000
    IF = THEN                                                           03258000
    BEGIN  <<DECREMENT WORD ADDRESS>>                                   03260000
      DITP(ADDR):=DITP(ADDR)-1;                                         03262000
    END;                                                                03264000
  END ELSE DEL;  <<END DEL CHAR>>                                       03266000
  GO IGNORE;                                                            03268000
  END;                                                                  03270000
SAVEIT:                                                                 03272000
  IF INTEGER(DITP(COUNT)) < 0 THEN                                      03274000
  BEGIN   <<STORE THE CHARACTER>>                                       03276000
    DITP(CNT):=DITP(CNT)+1;                                             03278000
    TOS:=DITP(ODDBYTEF);                                                03280000
    ASSEMBLE(TCBC 0);                                                   03282000
    DITP(ODDBYTEF):=TOS;                                                03284000
    IF = THEN                                                           03286000
    BEGIN  <<EVEN BYTE>>                                                03288000
      DITP(TEMP):=TOS;  <<SAVE BYTE>>                                   03290000
      TOS:=DITP(BANKA);                                                 03292000
      TOS:=DITP(ADDR);                                                  03294000
      TOS:=DITP(TEMP);                                                  03296000
      TOS:=TOS&LSL(8);                                                  03298000
      ASSEMBLE(SSEA; DDEL);                                             03300000
    END                                                                 03302000
    ELSE  <<ODDBYTE>>                                                   03304000
    BEGIN                                                               03306000
      DITP(TEMP):=TOS;  <<SAVE BYTE>>                                   03308000
      TOS:=DITP(BANKA);                                                 03310000
      TOS:=DITP(ADDR);                                                  03312000
      ASSEMBLE(LSEA);  <<GET WORD>>                                     03314000
      TOS.(8:8):=DITP(TEMP);  <<ADD ODD BYTE>>                          03316000
      ASSEMBLE(SSEA; DDEL);  <<PUT IT BACK>>                            03318000
      DITP(ADDR):=DITP(ADDR)+1;                                         03320000
    END;                                                                03322000
    DITP(COUNT):=DITP(COUNT)+1;                                         03324000
    IF >= THEN                                                          03326000
    BEGIN  <<COUNT DONE>>                                               03328000
      IF DITP(MSK) =%377 THEN                                           03330000
      BEGIN                                                             03332000
        GO WAKEMON;                                                     03334000
      END;                                                              03336000
  END;                                                                  03338000
    END ELSE DEL;                                                       03340000
NXTCHR:                                                                 03342000
    TOS:=DEVICE;                                                        03344000
    TOS:=CLEAR;                                                         03346000
    ASSEMBLE(CIO 1);                                                    03348000
    TOS:=INITCHR;                                                       03350000
    ASSEMBLE(CIO 1);                                                    03352000
    ASSEMBLE(DEL);                                                      03354000
    GO RETRN;                                                           03356000
NULLC:                                                                  03358000
    DEL;                                                                03360000
    DITP(NULLCNT):=DITP(NULLCNT)+1;                                     03362000
    IF < THEN GO NXTCHR;                                                03364000
    DITP(FLG):=EOTF;                                                    03366000
    GO WAKEMON;                                                         03368000
TRBL:                                                                   03370000
    DITP(FLG):=TRBLF;                                                   03372000
WAKEMON:                                                                03374000
  TOS:=DEVICE;     <<RESET INTERRUPTS>>                                 03376000
  TOS:=CLEAR;                                                           03378000
  ASSEMBLE (CIO 1);                                                     03380000
  IF DITP.STATEF=0 THEN DITP.STATEF:=6;                                 03382000
    AWAKEIO(DITP,NOIMPEDE);                                             03384000
RETRN:                                                                  03386000
    ASSEMBLE(IXIT);                                                     03388000
  END;                                                                  03390000
$PAGE                                                          <<01671>>03392000
PROCEDURE returntbufs(tfirst);                                 <<01671>>03394000
  INTEGER ARRAY tfirst;                                        <<01671>>03396000
 option privileged,uncallable;                                 <<02639>>03398000
  BEGIN                                                        <<01671>>03400000
                                                               <<01671>>03402000
  INTEGER size,limit,tindex,tcnt,x=X;                          <<01671>>03404000
  INTEGER POINTER tlast,tpntr,ditp,ioqp;                       <<01671>>03406000
                                                               <<01671>>03408000
  SUBROUTINE checkindex( tindex );                             <<01671>>03410000
    VALUE tindex;  INTEGER tindex;                             <<01671>>03412000
    BEGIN                                                      <<01671>>03414000
    COMMENT  Check the tbuf index for validity.  The index     <<01671>>03416000
             must lie within the tbuf table, and be a          <<01671>>03418000
             valid element address;                            <<01671>>03420000
                                                               <<01671>>03422000
    TOS := tindex;                                             <<01671>>03424000
    TOS := size;                                               <<01671>>03426000
    ASMB( DIV );                                               <<01671>>03428000
    ASMB( STBX,DELB );                                         <<01671>>03430000
    IF TOS <> %10 OR                                           <<01671>>03432000
      NOT ( 0 <= X <= limit ) THEN suddendeath( 249 );         <<01671>>03434000
                                                               <<01671>>03436000
    END;                                                       <<01671>>03438000
                                                               <<01671>>03440000
  size := tbuf(tsize).esize;                                   <<01671>>03442000
  limit := tbuf.limit2;                                        <<01671>>03444000
                                                               <<01671>>03446000
<<Check the first element for validity and not in free list>>  <<01671>>03448000
                                                               <<01671>>03450000
  IF @tfirst = 0 THEN suddendeath(249);                        <<01671>>03452000
  tindex := @tfirst - @tbuf;                                   <<01671>>03454000
  checkindex( tindex );                                        <<01671>>03456000
  IF tbuf(ttail) = tindex OR                                   <<01671>>03458000
     1 <= tfirst <= @tbuf THEN                                 <<01671>>03460000
    suddendeath(202);  << already in free list >>              <<01671>>03462000
                                                               <<01671>>03464000
<< Convert sydb chaining to tbuf index chaining >>             <<01671>>03466000
<< Validate all elements of the chain >>                       <<01671>>03468000
                                                               <<01671>>03470000
  @tpntr := @tfirst;                                           <<01671>>03472000
  @tlast := @tfirst;                                           <<01671>>03474000
  tcnt := 1;                                                   <<01671>>03476000
  WHILE ( @tpntr := tpntr ) <> 0 DO                            <<01671>>03478000
    BEGIN                                                      <<01671>>03480000
    tcnt := tcnt +1;                                           <<01671>>03482000
    tindex := tlast := @tpntr - @tbuf;                         <<01671>>03484000
    checkindex( tindex );                                      <<01671>>03486000
    @tlast := @tpntr;                                          <<01671>>03488000
    END;                                                       <<01671>>03490000
                                                               <<01671>>03492000
<< add tbuf chain to free list >>                              <<01671>>03494000
                                                               <<01671>>03496000
  disable;                                                     <<01671>>03498000
  tbuf(tuse) := tbuf(tuse) - tcnt;                             <<01671>>03500000
  tbuf(tbuf(ttail)) := @tfirst - @tbuf;                        <<01671>>03502000
  tbuf(ttail) := tindex;                                       <<01671>>03504000
                                                               <<01671>>03506000
<< Check for drivers impeded on tbufs >>                       <<01671>>03508000
                                                               <<01671>>03510000
  WHILE head(tbqn) > 0 AND tbuf(thead) > 0 DO                  <<01671>>03512000
    BEGIN                                                      <<01671>>03514000
    @ditp := dequeue( dtblk,tbqn );                            <<01671>>03516000
    @ioqp := ditp(dioqp);  << any requests waiting >>          <<01671>>03518000
    IF <> AND ioqp(qmisc).rstate >= pretopost THEN             <<01671>>03520000
      BEGIN  << request waiting for a tbuf >>                  <<01671>>03522000
      ditp(dnxtb) := gettbuf(secondary);                       <<01671>>03524000
      awaketerminal( ditp );                                   <<01671>>03526000
      END;                                                     <<01671>>03528000
    END;                                                       <<01671>>03530000
                                                               <<01671>>03532000
<< Check for processes impeded on tbufs >>                     <<01671>>03534000
                                                               <<01671>>03536000
  TOS := tbuf(tsize).pcbn;  << get impeded link >>             <<01671>>03538000
  IF <> AND tbuf(tuse).inuse < tbuf.limit1 THEN                <<01671>>03540000
    iounimpede( @tbuf );                                       <<01671>>03542000
                                                               <<01671>>03544000
  END;                                                         <<01671>>03546000
$PAGE "CORE RESIDENT TERMINAL SERVICE ROUTINES"                         03548000
                                                                        03550000
PROCEDURE MPXWRITE( DATA, DITP);                                        03552000
  VALUE DATA;   INTEGER DATA;                                           03554000
  INTEGER ARRAY DITP;  OPTION PRIVILEGED, UNCALLABLE;                   03556000
  <<                                                                    03558000
     THIS PROCEDURE WRITES THE DATA TO THE MULTIPLEXOR UNIT SPECIFIED BY03560000
     DITP. IF DATA IS NULL, A SYNC IS SENT UNLESS DSTATE IS NULL, THEN  03562000
     NOTHING IS DONE.                                                   03564000
  >>                                                                    03566000
  BEGIN                                                                 03568000
    LOGICAL POINTER DITPL = DITP;                                       03570000
    INTEGER DRTN = Q+1;                                                 03572000
    TOS := WA0(DITP(DILTP)+ICNTRL) ;        << SET DRT + 1 >>  <<01300>>03574000
                                                                        03576000
    DISABLE;                                                   <<00.06>>03578000
                                                                        03580000
    TOS := DATA;                                                        03582000
    IF >= THEN  << MPX DATA OPERATION >>                                03584000
      BEGIN                                                             03586000
        IF = THEN   << A SYNC REQUEST >>                                03588000
          BEGIN                                                         03590000
            IF DITP.DSTATE=NULL THEN RETURN;                            03592000
            DITP.WRTWAIT := 1;  << INDICATE WRITE IN PROGRESS >>        03594000
            IF <> THEN RETURN;  << WRITE ALREADY IN PROGRESS >>         03596000
            DEL;    TOS := SYNCCHAR;                                    03598000
          END;                                                          03600000
        TOS:=TOS LOR %43400 LOR (DITPL(DCNTRL) LAND PTYMASK);  <<01230>>03602000
        TESTBIT SYNCFLAG');                                             03604000
        IF <> AND DITPL( X ).PTYCNTRL THEN                              03606000
        TOS.BIT8 := 0;  << FORM PROPER SYNC CHAR WITH PTY GENERATION >> 03608000
      END;                                                              03610000
                                                                        03612000
TRYAGAIN:                                                               03614000
    ASMB( WIO 1 );                                                      03616000
    IF <> THEN                                                          03618000
      BEGIN                                                             03620000
        DEL;                                                            03622000
        IF > THEN GOTO TRYAGAIN;                                        03624000
        IOFAILURE(DRTN,DITP);  << NON RESPONDING DEVICE >>              03626000
      END;                                                              03628000
                                                                        03630000
    TOS := DITP(DCNTRL);                                                03632000
    ASMB( CIO 1 );                                                      03634000
    IF < THEN IOFAILURE(DRTN,DITP);  << NON RESPONDING >>               03636000
  END;    << MPX WRITE  >>                                              03638000
                                                                        03640000
                                                                        03642000
                                                                        03644000
PROCEDURE MPXCONTROL(FUNCTION,DITP);                                    03646000
  VALUE FUNCTION, DITP; INTEGER FUNCTION;                               03648000
  INTEGER POINTER DITP;                                                 03650000
  OPTION UNCALLABLE, PRIVILEGED;                                        03652000
                                                                        03654000
    <<  THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO INITIALIZE AND    03656000
        FOR ECHO CONTROL OF THE MULTIPLEXER BOARD.  IT CLEARS           03658000
        DIAGNOSE IF NOT SPEED SENSING OR SETS IT IF SPEED SENSING       03660000
                                                                        03662000
         FUNC:   -1 - INITIALIZE WRITE CHANNEL                          03664000
                  0 - TURN ECHO OFF                                     03666000
                  1 - TURN ECHO ON IF ECHO ENABLE                       03668000
                  2 - DISABLE INTERRUPTS & TURN ECHO OFF                03670000
    >>                                                                  03672000
  BEGIN                                                                 03674000
    INTEGER ARRAY SPEED(0: 7) = PB :=                                   03676000
      %120405 << 2400 BAUD >>, %120405 << 2400 BAUD >>,                 03678000
      %120413 << 1200 BAUD >>, %120427 <<  600 BAUD >>,                 03680000
      %120457 <<  300 BAUD >>, %120537 <<  150 BAUD >>,                 03682000
      %121202 <<  110 BAUD >>, %120152 <<  2741     >>;                 03684000
                                                                        03686000
    LOGICAL LFUNCTION = FUNCTION;                                       03688000
    POINTER DITPL = DITP;                                               03690000
    INTEGER POINTER ILTP = Q+1;                                         03692000
                                                                        03694000
    TOS := DITP(DILTP);                                                 03696000
      TOS := ILTP(ICNTRL);                                     <<01300>>03698000
                                                                        03700000
    TOS := DITP(DSPEED);                                                03702000
    X := FUNCTION;                                                      03704000
    IF < THEN          << SEND INITIALIZE >>                            03706000
      BEGIN                                                             03708000
        TOS := SPEED(TOS.OUTSPEED);                                     03710000
        TOS.( 3:1) := DITP(DCNTRL).PTYCNTRL;                            03712000
        TOS.OUTPUT := 1;                                                03714000
      END                                                               03716000
    ELSE         << RECEIVE CONTROL OR INITIALIZE >>                    03718000
      BEGIN                                                             03720000
        TOS := SPEED(TOS.INSPEED);                                      03722000
        TOS.(ECHO':2) := DITP(DSPEED).(ECHO':2);                        03724000
        IF DITPL(DMODEM).PRIMED AND DITP(DTYPE).TTYPE=HP2640X           03726000
          OR DITPL(DMODEM)&CSL(M202) OR NOT LFUNCTION THEN              03728000
            TOS.ECHO := 0; << PRIMED READ OR 202 OR ECHO OFF >>         03730000
      END;                                                              03732000
                                                                        03734000
    IF FUNCTION=2 THEN TOS.INTRPTENABLE := 0;                           03736000
                                                                        03738000
    MPXWRITE( *, DITP);                                                 03740000
  END;   <<  MPX  CONTROL >>                                            03742000
                                                                        03744000
                                                                        03746000
                                                                        03748000
                                                                        03750000
PROCEDURE DSETCONTROL (CONTROL, DITP);                                  03752000
  VALUE CONTROL;  INTEGER CONTROL;                                      03754000
  INTEGER ARRAY DITP;                                                   03756000
  OPTION PRIVILEGED, UNCALLABLE;                                        03758000
  <<                                                                    03760000
    THIS PROCEDURE OUTPUTS CONTROL INFORMATION TO THE DSETS TO SET      03762000
    THEM IN THE FOLLOWING STATES:                                       03764000
    CONTROL:  0 - INITIALIZE AND MAKE READY FOR LOGGON                  03766000
              1 - START WRITE TURNAROUND ( LOWER SA )                   03768000
              2 - SET TO READING STATE                                  03770000
              3 - HANG UP                                               03772000
              4 - FINISH WRITE TURNAROUND ( RAISE CA )                  03774000
                                                                        03776000
    THE DIT IS CHECKED TO SEE IF THE CONTROL SHOULD BE SET TO NONE,     03778000
    ONE OR TWO DATASET INTERFACES.                                      03780000
  >>                                                                    03782000
                                                                        03784000
  BEGIN                                                                 03786000
    INTEGER ARRAY CONTROL1(0: 3) = PB :=  << CONTROL WORDS FOR DSET1 >> 03788000
      %030324,  << SET CD, MONITOR FOR CC = 1 >>                        03790000
      %030017,  << MONITOR FOR CF AND CC = 0 >>                         03792000
      %030217,  << CLEAR CA, MONITOR FOR CF & CC = 0 >>                 03794000
      %030300,  << CLEAR CA & CD; STOP MONITORING CF & CC >>            03796000
      %030255;  << SET CA; MONITOR FOR CF=1,CC=0 >>                     03798000
                                                                        03800000
    INTEGER ARRAY CONTROL2(0: 3) = PB :=  << CONTROL WORDS FOR DSET2 >> 03802000
      %030360,  << SET CH & SA; NO CB OR SB MONITORING >>               03804000
      %030100,  << CLEAR SA AND STOP MONITORING CB & SB >>              03806000
      %030136,  << SET SA,  MONITOR FOR CB = 0 & SB = 1 >>              03808000
      %030100,  << CLEAR SA; STOP MONITORING CB & SB >>                 03810000
      %030014;  << MONITOR FOR CB AND SB = 1 >>                         03812000
                                                                        03814000
    LOGICAL POINTER DITPL = DITP;                                       03816000
    INTEGER ORDER;    << HOLDS CONTROL ORDER >>                         03818000
    INTEGER MODEMTYPE = ORDER + 1;                                      03820000
    INTEGER DRTN1     = MODEMTYPE + 1;   << MUX DRT NUMBER + 1 >>       03822000
    INTEGER DRTN2     = DRTN1 + 1;  << MUX DRT NUMBER + 2 >>            03824000
    INTEGER UNITNUMBER= DRTN2 + 1;                                      03826000
                                                                        03828000
    TOS := (DITP(DMODEM).MTYPE).(14:2);  << SET MODEMTYPE >>   <<01.01>>03830000
    IF = THEN RETURN;  << NOT ON A DSET >>                              03832000
                                                                        03834000
    DMONITOR(DITP,%65,DITP,CONTROL);  << SAVE FLAGS & CONTROL    00.05>>03836000
                                                                        03838000
    TOS := WA0(DITP(DILTP)+ICNTRL) + 1;     << SET DRT + 1 >>  <<01300>>03840000
    ASMB( DUP,INCA);    << SET DRT + 2 >>                               03842000
    TOS := (DITPL(DCNTRL) LAND UNITMASK)&LSR(1);  << SET UNITNUMBER >>  03844000
                                                                        03846000
    IF MODEMTYPE>=2 THEN << ON A 202/2002 >>                            03848000
      DOCIO(UNITNUMBER,DRTN2);    << STOP SCAN & CLEAR UPDATE >>        03850000
                                                                        03852000
    DOCIO(UNITNUMBER,DRTN1);    << STOP SCAN & CLEAR UPDATE >>          03854000
                                                                        03856000
    IF MODEMTYPE>=2 THEN  << ON A 202 OR 2002 >>                        03858000
      BEGIN                                                             03860000
        TOS := UNITNUMBER+CONTROL2(CONTROL); <<MERGE CNTRL & UNIT>>     03862000
        IF CONTROL=INITDSET AND MODEMTYPE=3 THEN               <<00.02>>03864000
          TOS.CH := 0;     << SET UP FOR LOW SPEED >>          <<00.02>>03866000
        ORDER := TOS;  << SAVE CONTROL WORD 2 >>                        03868000
                                                                        03870000
        DOCIO(ORDER,DRTN2);    << SEND CONTROL TO DSET 2 >>             03872000
      END;                                                              03874000
                                                                        03876000
    TOS := UNITNUMBER+CONTROL1(CONTROL);  << MERGE CONTROL & UNIT >>    03878000
    IF CONTROL=INITDSET AND MODEMTYPE=1 THEN                            03880000
      TOS := TOS LOR %250;  << ON A 103, SET CA, MONITOR FOR CF = 0 >>  03882000
                                                                        03884000
    DOCIO( *, DRTN1);  << SEND TO DRT + 1 >>                            03886000
  END;  << DSET CONTROL >>                                              03888000
$PAGE                                                                   03890000
                                                                        03892000
PROCEDURE STOPTIMEOUT(TYPE,DITP);                                       03894000
  VALUE TYPE;     INTEGER TYPE;                                         03896000
  INTEGER ARRAY DITP;                                                   03898000
  OPTION UNCALLABLE, PRIVILEGED;                                        03900000
  <<                                                                    03902000
    THIS PROCEDURE RETURNS ANY OUTSTANDING TIME OUT REQUEST OF          03904000
    OF THE TYPE IDENTIFIED BY TYPE. IT ALSO CLEARS THE ASSOCIATED       03906000
    REQUEST BIT IN DRQST.                                               03908000
                                                                        03910000
      TYPE:  0 - 2640 READ OR WRITE TIME OUT                            03912000
             1 - CARRIER FAILED TIME OUT                                03914000
             2 - TURN 202 TO WRITE TIMEOUT                              03916000
             3 - READ OPERATION TIMED OUT                               03918000
             4 - LOGON TIMED OUT                                        03920000
             5 - HANGUP TIME OUT                                        03922000
             6 - SPEED SENSING NOT SUCCESSFUL TIME OUT                  03924000
             7 - DISCONNECT SPEED SENSING TIME OUT                      03926000
             8 - BLOCK MODE READ TIME OUT                      <<02006  03928000
  >>                                                                    03930000
  BEGIN                                                                 03932000
    ARRAY TRLXINDEX(0:7) = PB :=                                        03934000
      <<  0:7 - NOT USED,  7:6 - BIT TO CLEAR IN DRQST,                 03936000
         13:3 - BYTE OFFSET TO BYTE HOLDING TRLX FROM DTRLX >>          03938000
      [7/0,6/04,3/0],[7/0,6/2,3/2],[7/0,6/03,3/3],[7/0,6/08,3/1],       03940000
      [7/0,6/11,3/1],[7/0,6/0,3/1],[7/0,6/16,3/0],[7/0,6/16,3/0],       03942000
      [7/0,6/14,3/0];                                          <<02006>>03944000
    INTEGER REQUESTBIT;      << BIT TO CLEAR IN DRQST >>                03946000
    INTEGER TRLXOFFSET;      << BYTE OFFSET FOR DTRLX >>                03948000
                                                                        03950000
    REQUESTBIT := TRLXINDEX(TYPE).(7:6);                                03952000
    TRLXOFFSET := TRLXINDEX(TYPE).(13:3);                               03954000
                                                                        03956000
    DISABLE;                                                            03958000
    IF REQUESTBIT<16 THEN << CLEAR BIT IN DRQST >>                      03960000
      BEGIN                                                             03962000
        TOS := DITP(DRQST);                                             03964000
        X := REQUESTBIT;   ASMB( TRBC 0,X );  << CLEAR BIT >>           03966000
        DITP(DRQST) := TOS;                                             03968000
      END;                                                              03970000
                                                                        03972000
    TOS := BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET); << GET TRLX >>         03974000
    BA0(X) := 0;  << CLEAR TO INDICATE RETURNED >>                      03976000
                                                                        03978000
    ABORTTIMEREQ( * );                                                  03980000
  END;    << STOP TIME OUT >>                                           03982000
                                                                        03984000
                                                                        03986000
PROCEDURE STARTTIMEOUT(TYPE,DITP);                                      03988000
  VALUE TYPE;    INTEGER TYPE;                                          03990000
  INTEGER ARRAY DITP;                                                   03992000
  OPTION UNCALLABLE, PRIVILEGED;                                        03994000
  <<                                                                    03996000
    THIS PROCEDURE STARTS A TIME OUT REQUEST OF THE TYPE SPECIFIED BY   03998000
    TYPE. IN SOME CASE IF A TIME OUT IS PENDING IT IS STOPPED AND THE   04000000
    NEW REQUEST STARTED, OTHERWISE 	IF A TIMEOUT IS IN PROGRESS NO NEW  04002000
     REQUEST IS STARTED.                                                04004000
  >>                                                                    04006000
  BEGIN                                                                 04008000
    ARRAY TRLXINDEX(0:7) = PB :=                                        04010000
      <<  0:1 - IF SET THEN ABORT AND RESTART TIMEOUT                   04012000
          1:6 - TIMEOUT TIME IN SECONDS                                 04014000
          7:6 - TIMEOUT REQUEST CODE TYPE                               04016000
         13:3 - BYTE OFFSET FROM DTRLX TO TRLX STORAGE                  04018000
       >>                                                               04020000
      [1/1,6/10,6/7,3/0],[1/0,6/30,6/1,3/2],                   <<00.02>>04022000
      [1/1,6/05,6/2,3/3],[1/0,6/00,6/3,3/1],                            04024000
      [1/0,6/00,6/4,3/1],[1/1,6/05,6/0,3/1],                            04026000
      [1/1,6/01,6/7,3/0],[1/1,6/01,6/7,3/0],                   <<02006>>04028000
      [1/1,6/00,6/9,3/0];                                      <<02006>>04030000
    INTEGER TRLXOFFSET, REQCODE;                                        04032000
    DOUBLE TIME;                                                        04034000
                                                                        04036000
    TOS := TRLXINDEX(TYPE);  << TEST BIT 0 >>                           04038000
    REQCODE := S0.(7:6);                                       <<02006>>04040000
    TRLXOFFSET := S0.(13:3);                                   <<02006>>04042000
    IF S0 < 0 THEN STOPTIMEOUT(TYPE,DITP)                      <<02006>>04044000
    ELSE IF INTEGER(BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET)) <> 0 <<02006>>04046000
         THEN RETURN;                                          <<02006>>04048000
    TOS := TOS.(1:6);  << EXTRACT TIME IN SECONDS >>                    04050000
    IF = THEN  << LOGON OR READ TIMEOUT >>                              04052000
      BEGIN                                                             04054000
        TOS :=      IF TYPE = LOGONTO      THEN LOGONTIME      <<02006>>04056000
               ELSE IF TYPE = READTIMEOUT  THEN DITP(DRTMAX)   <<02006>>04058000
               ELSE IF TYPE = BLOCKTIMEOUT THEN DITP(DBTIME)   <<02006>>04060000
               ELSE 0;                                         <<02006>>04062000
        IF = THEN RETURN;  << NO TIME OUT REQUESTED >>                  04064000
      END;                                                              04066000
    TIME := TOS**1000;  << TIME IN MS >>                                04068000
                                                                        04070000
    TOS := TIMEREQ(REQCODE,@DITP,TIME);                                 04072000
    DISABLE;                                                            04074000
                                                               <<02006>>04076000
    BA0((@DITP+DTRLX)&LSL(1)+TRLXOFFSET) := TOS;               <<02006>>04078000
                                                               <<02006>>04080000
  END;   << START TIME OUT >>                                           04082000
                                                                        04084000
                                                                        04086000
PROCEDURE CHECKTQUEUE(DITP);                                            04088000
  INTEGER ARRAY DITP;  OPTION PRIVILEGED, UNCALLABLE;                   04090000
  <<                                                                    04092000
    THIS PROCEDURE DECREMENTS THE TERMINAL I/O COUNTER IF NECESSARY     04094000
    AND CALLS AWAKEIO FOR THE NEXT DEVICE WIATING TO DO TERMINAL I/O.   04096000
  >>                                                                    04098000
  BEGIN                                                                 04100000
    LOGICAL FLAG := 1;    << READ/WRITE STARTED & UNCOUNTED FLAG >>     04102000
                                                                        04104000
    DISABLE;                                                            04106000
    TOS := DITP(DMODEM);                                                04108000
                                                                        04110000
    TOS.WRTCOUNTED := 0;                                                04112000
    IF <> THEN                                                          04114000
      BEGIN                                                             04116000
        WRTCOUNTER := WRTCOUNTER - 1;                                   04118000
        FLAG := 0;                                                      04120000
      END;                                                              04122000
                                                                        04124000
    TOS.RDCOUNTED := 0;                                                 04126000
    IF <> THEN                                                          04128000
      BEGIN                                                             04130000
         STOPTIMEOUT(HP2640TO,DITP);                                    04132000
        RDCOUNTER := RDCOUNTER - 1;                                     04134000
        FLAG := 0;                                                      04136000
      END;                                                              04138000
                                                                        04140000
    DITP( X ) := TOS;                                                   04142000
    ENABLE;                                                             04144000
                                                                        04146000
    WHILE NOT FLAG DO    << SOMETHING UNCOUNTED OR NO READ STARTED >>   04148000
      BEGIN                                                             04150000
        X := DEQUEUE(DWAIT,TQUEUE);  << CHECK TERMINAL ACTIVITY QUEUE >>04152000
        IF <= THEN RETURN;   << NOTHING TO START >>                     04154000
                                                                        04156000
        @DITP := X;                                                     04158000
        IF DITP.DSTATE=BANDWAIT THEN  << PROCESS THIS DIT >>            04160000
          BEGIN                                                         04162000
            TOS := DITP(DCNTRL).NXTDSTATE;                              04164000
            DISABLE;                                                    04166000
            IF S0=WRITING THEN  << WRITE TO BE STARTED >>               04168000
              BEGIN                                                     04170000
                DITP(DMODEM).WRTCOUNTED := 1;                           04172000
                IF = THEN WRTCOUNTER := WRTCOUNTER + 1;                 04174000
                FLAG := 2;   << INDICATE A WRITE STARTED >>             04176000
              END                                                       04178000
            ELSE IF INTEGER(FLAG)=0 THEN  << NOTHING STARTED YET >>     04180000
              BEGIN                                                     04182000
                X := DITP(DIOQP);      X := X + QMISC;                  04184000
                WA0( X ).WAITDONE := 1;                                 04186000
                FLAG := 1;   << INDICATE A READ STARTED >>              04188000
              END                                                       04190000
            ELSE                                                        04192000
              BEGIN   << WRITES STARTED SO CANT START READ >>           04194000
                ADDHEAD(DITP,DWAIT,TQUEUE); << RESTORE TO QUEUE >>      04196000
                RETURN;                                                 04198000
              END;                                                      04200000
                                                                        04202000
            SENDSYNC(*, DITP); << SET NEW DSTATE, START OPERATION >>    04204000
          END;                                                          04206000
      END;                                                              04208000
  END;   << CHECK TQUEUE >>                                             04210000
                                                                        04212000
                                                                        04214000
PROCEDURE SETREADERROR(IOQP,ENUMB);                                     04216000
  VALUE ENUMB;   INTEGER ENUMB;                                         04218000
  INTEGER ARRAY IOQP;    OPTION PRIVILEGED, UNCALLABLE;                 04220000
  BEGIN                                                                 04222000
    X := @IOQP;                                                         04224000
    IF <> AND IOQP.READERRORS<ENUMB THEN                                04226000
      IOQP.READERRORS := ENUMB;                                         04228000
  END;                                                                  04230000
$PAGE                                                                   04232000
                                                                        04234000
LOGICAL PROCEDURE BREAKOK(DITP);                                        04236000
  VALUE DITP;   POINTER DITP;                                           04238000
  OPTION UNCALLABLE, PRIVILEGED;                                        04240000
                                                                        04242000
  <<  RETURNS TRUE IF BREAK/SUB SYS BREAK ENABLE AND NOT ALREADY IN     04244000
       BREAK/SUB SYS BREAK MODE AND NOT IN CONSOLE MODE >>              04246000
                                                                        04248000
  BEGIN                                                                 04250000
    ENTRY SSBREAKOK;                                                    04252000
    INTEGER TYPE = Q+1;                                                 04254000
                                                                        04256000
    TOS := BREAK';   << BIT POSITION FOR BREAK >>                       04258000
    GOTO L1;                                                            04260000
                                                                        04262000
SSBREAKOK:                                                              04264000
    TOS := SSBREAK';   <<  BIT POSITION FOR SUB SYS BREAK  >>           04266000
                                                                        04268000
L1:                                                                     04270000
    IF NOT DITP(DMODEM).CMODE AND NOT DITP(X).RDCOUNTED THEN            04272000
      IF DITP.DSTATE<=READING OR DITP.DSTATE=BANDWAIT THEN              04274000
        BEGIN                                                           04276000
          TOS := DITP(DSPEED);                                          04278000
          X := TYPE;    ASMB( TBC 1,X );                                04280000
          IF <> THEN  << BREAK/SSBREAK ENABLED >>                       04282000
            BEGIN                                                       04284000
              TOS := DITP(DLDEV);                                       04286000
              IF TYPE=BREAK' THEN  << CHECK THE FLUSH FLAG >>           04288000
                TOS := TOS.FLUSH                                        04290000
              ELSE  << SUB SYS BREAK  >>                                04292000
                BEGIN   << CHECK IF ALREADY SET >>                      04294000
                  TOS := LPDTD(TOS.LDEVN);                              04296000
                  TOS := TOS.(SSBREAK':1);                              04298000
                END;                                                    04300000
                                                                        04302000
              IF NOT TOS THEN   << FLAG WAS NOT SET >>                  04304000
                BREAKOK := TRUE;                                        04306000
            END;                                                        04308000
        END;                                                            04310000
  END;   << ESCAPE OK   BREAK OK  >>                                    04312000
$PAGE                                                                   04314000
                                                               <<00.05>>04316000
PROCEDURE BREAKSERVICE(DITP,TYPE);                             <<00.05>>04318000
  VALUE TYPE;  LOGICAL TYPE;  ARRAY DITP;                      <<00.05>>04320000
 option privileged,uncallable;                                 <<02639>>04322000
  <<                                                                    04324000
    THIS PROCEDURE SETS DSTATE TO WAITED, SAVES THE OLD DSTATE IN       04326000
    WAITEDSTATE, REQUESTS SERVICE FROM TERMIOM AS INDICATED BY          04328000
    TYPE AND WAKES THE TERMINAL MONITOR. CALLED WITH INTERRUPTS OFF     04330000
  >>                                                                    04332000
  BEGIN                                                        <<00.05>>04334000
    MPXCONTROL(INTRPTOFF, DITP);                               <<00.05>>04336000
    DITP(DSAVE).WAITEDSTATE := DITP;  << SAVE CURRENT DSTATE>> <<00.05>>04338000
    DITP.DSTATE := WAITED;                                     <<00.05>>04340000
    DITP(DRQST) := DITP(DRQST) LOR TYPE;                       <<00.05>>04342000
    AWAKETERMINAL(DITP);                                       <<00.05>>04344000
  END;   << BREAK SERVICE >>                                   <<00.05>>04346000
$PAGE                                                          <<00.05>>04348000
                                                                        04350000
  <<-----  DSET1  DATA SET INTERRUPT HANDLER FOR CF AND CC ----->>      04352000
                                                                        04354000
                                                                        04356000
PROCEDURE DSET1;     <<  DATA SET INTERRUPT HANDLER FOR DRT + 1 >>      04358000
  OPTION PRIVILEGED, UNCALLABLE;                                        04360000
  BEGIN                                                                 04362000
                                                                        04364000
    INTEGER DRTN         = Q+3;                                         04366000
    INTEGER POINTER DITP = Q+4;                                         04368000
    LOGICAL POINTER DITPL = DITP;                                       04370000
                                                                        04372000
    LOGICAL DSETSTATUS = Q+5;      << DATA SET STATUS WORD >>           04374000
    LOGICAL OLDCF = Q+6;   << PREVIOUS CARRIER DETECT STATUS >>         04376000
    INTEGER TURNCODE = Q+7;  << -1 NOT TURNING, 0 TO READ, 1 TO WRITE >>04378000
                                                                        04380000
    ASMB(  ADDS 3 );    TOS := -1;  << FORM LOCAL VARIABLES >>          04382000
                                                                        04384000
    ASMB( TIO 4 );     << GET DATA SET STATUS >>                        04386000
    IF < THEN IOFAILURE(DRTN, 0);   << NON RESPONDING DEVICE >>         04388000
                                                                        04390000
    DSETSTATUS := S0;                                                   04392000
    TOS.(0: 3) := 3;   << SET SCAN AND UPDATE >>                        04394000
    DOCIO( *, DRTN);   << SET NEW STATUS IN INTERFACE >>                04396000
                                                                        04398000
    @DITP := DITPA(DSETSTATUS.DSETUNIT);   << SET DITP >>               04400000
                                                                        04402000
    IF <= THEN  << NON CONFIGURED DEVICE? >>                            04404000
      BEGIN                                                             04406000
        << SHOULD HAVE A MESSAGE TO OUTPUT HERE >>                      04408000
        ASMB( IXIT );                                                   04410000
      END;                                                              04412000
                                                                        04414000
    TOS := %1000D;                                                      04416000
    XCHDB;  << SET DB TO SYS DB >>                                      04418000
                                                                        04420000
                                                                        04422000
    DMONITOR(DITP,%46,DITP,DSETSTATUS);                                 04424000
                                                                        04426000
    DISABLE;                                                            04428000
    OLDCF := DITP(DMODEM).CF;                                           04430000
    DITP(DMODEM).CF := DSETSTATUS.CFSTATUS;                             04432000
    IF DSETSTATUS.CCCHANGE THEN  << DATA SET READY CHANGED >>           04434000
      BEGIN                                                             04436000
        TOS := DITP(DRQST);                                             04438000
        IF DSETSTATUS THEN TOS.DSETREADY := 1                           04440000
          ELSE TOS.DISCONNECT := 1;                                     04442000
        DITP(DRQST) := TOS;                                             04444000
        ENABLE;                                                         04446000
        AWAKETERMINAL(DITP);                                            04448000
      END                                                               04450000
    ELSE IF DITP(DSAVE).HSTATE<=LOGGINGON THEN                          04452000
      BEGIN   << CHECK CARRIER ACTIVITY >>                              04454000
        ENABLE;                                                         04456000
        IF DITP.DSTATE=TURN202 THEN                                     04458000
          TURNCODE := DITP(DSAVE).TURNTOWRITE;                          04460000
                                                                        04462000
        IF DSETSTATUS.CFSTATUS THEN                                     04464000
          BEGIN   << CARRIER DETECTED >>                                04466000
            STOPTIMEOUT(CFAILTO,DITP);                                  04468000
            X := TURNCODE; << CHECK IF TURN TO READ >>                  04470000
            IF = AND NOT OLDCF THEN  << TURNED TO READ >>               04472000
              MPXWRITE(NULL,DITP);  << SET READING >>                   04474000
          END                                                           04476000
        ELSE IF TURNCODE=1 THEN << FINISH TURN TO WRITE >>              04478000
          DSETCONTROL(TRANSMIT,DITP) << RAISE CA >>                     04480000
            ELSE                                               <<00.02>>04482000
              BEGIN   << CARRIER FAILED >>                     <<00.02>>04484000
                TOS := DITP(DIOQP);                            <<00.02>>04486000
                IF DITP.DSTATE=READING THEN                    <<00.02>>04488000
                 BEGIN                                                  04490000
                  SETREADERROR( *, LOSTDATA );                 <<00.02>>04492000
                  IF DITP(DMONTR).CFAILCNT>50 THEN                      04494000
                    BEGIN                                      <<01.01>>04496000
                      DITP(DRQST).DISCONNECT := 1;             <<01.01>>04498000
                      ENABLE;                                  <<01.01>>04500000
                      AWAKETERMINAL(DITP);                     <<01.01>>04502000
                      ASMB( IXIT );                            <<01.01>>04504000
                    END;                                       <<01.01>>04506000
                  DITP(DMONTR).CFAILCNT := DITP(DMONTR).CFAILCNT+1;     04508000
                 END;                                          <<01.01>>04510000
                STARTTIMEOUT(CFAILTO,DITP);                    <<01.01>>04512000
              END;                                             <<00.02>>04514000
      END;                                                              04516000
    ASMB( IXIT );                                                       04518000
  END;     <<  DSET1   -  CF , CC  DATA SET INTERRUPT HANDLER >>        04520000
$PAGE                                                                   04522000
                                                                        04524000
       << DSET2  DATA SET INTERRUPT HANDLER FOR CB AND SB >>            04526000
                                                                        04528000
                                                                        04530000
PROCEDURE DSET2;     <<  DATA SET INTERRUPT HANDLER FOR DRT + 2 >>      04532000
  OPTION PRIVILEGED, UNCALLABLE;                                        04534000
  BEGIN                                                                 04536000
    INTEGER DRTN         = Q+3;                                         04538000
    INTEGER POINTER DITP = Q+4;                                         04540000
    LOGICAL POINTER DITPL = DITP;                                       04542000
    LOGICAL DSETSTATUS = Q+5;      << DATA SET STATUS WORD >>           04544000
                                                                        04546000
                                                                        04548000
    ASMB( ADDS 2 );     << FORM  LOCAL VARIABLES >>                     04550000
    ASMB( TIO 2 );     << GET DATA SET STATUS >>                        04552000
    IF < THEN IOFAILURE(DRTN, 0);   << NON RESPONDING DEVICE >>         04554000
                                                                        04556000
    DSETSTATUS := S0;                                                   04558000
    TOS.(0: 3) := 3;        << SET SCAN AND UPDATE >>                   04560000
    DOCIO( *, DRTN);        << UPDATE STATUS IN INTERFACE >>            04562000
                                                                        04564000
    @DITP := DITPA(DSETSTATUS.DSETUNIT);   << SET DITP >>               04566000
                                                                        04568000
    IF <= THEN    << NON CONFIGURED DEVICE? >>                          04570000
      BEGIN                                                             04572000
        << SHOULD HAVE A MESSAGE TO OUTPUT HERE >>                      04574000
        ASMB( IXIT );                                                   04576000
      END;                                                              04578000
                                                                        04580000
    TOS := %1000D;                                                      04582000
    XCHDB;    << SET SYS DB >>                                          04584000
                                                                        04586000
    DMONITOR(DITP,%47,DITP,DSETSTATUS);                                 04588000
                                                                        04590000
    DISABLE;                                                            04592000
    DITP(DMODEM).CBSB := DSETSTATUS;  << UPDATE STATUS IN DIT >>        04594000
                                                               <<00.02>>04596000
    IF NOT DSETSTATUS AND DITP.DSTATE<>TURN202 THEN            <<00.02>>04598000
      STARTTIMEOUT(CFAILTO,DITP); << NO SB AND NOT TURNING >>  <<00.02>>04600000
                                                                        04602000
    TOS := DITP(DSAVE).HSTATE;                                          04604000
    IF <> AND TOS<=LOGGINGON THEN  << NOT HUNG UP OR HANGING UP >>      04606000
      IF DITP.DSTATE<READING THEN                                       04608000
        BEGIN   << WRITE OR NULL, CHECK FOR BREAK >>                    04610000
          IF DITP(DMODEM).CBSB=2 AND BREAKOK(DITP) THEN                 04612000
            BEGIN << NO SB, SENDING AND BREAK OK >>                     04614000
              BREAKSERVICE(DITP,BRKBIT);                                04616000
              ENABLE;                                                   04618000
            END;                                                        04620000
        END                                                             04622000
      ELSE IF DITP.DSTATE=TURN202 AND DITPL(DSAVE).TURNTOWRITE          04624000
        AND DITP(DMODEM).CBSB=3 THEN                                    04626000
          BEGIN   << CLEAR TO SEND AND SECONDARY OK >>                  04628000
            ENABLE;                                                     04630000
            STOPTIMEOUT(TURNTO,DITP);   << STOP TURN TIME OUT >>        04632000
            MPXWRITE(NULL, DITP);  << RESTART WRITE >>                  04634000
          END;                                                          04636000
                                                                        04638000
    ASMB( IXIT );                                                       04640000
  END;   <<  DSET2  - CB AND SB DATA SET INTERRUPT HANDLER  >>          04642000
                                                                        04644000
                                                                        04646000
PROCEDURE SENDSYNC(NEWDSTATE,DITP);                                     04648000
  VALUE NEWDSTATE;   INTEGER NEWDSTATE;                                 04650000
  ARRAY DITP;  OPTION UNCALLABLE, PRIVILEGED;                           04652000
  <<                                                                    04654000
    THIS ROUTINE SETS DSTATE TO THE NEWDSTATE AND SENDS A SYNC          04656000
    CHARACTER OUT, CAUSING AN INTERRUPT ON THE ASYNCHROUNS MPX.         04658000
  >>                                                                    04660000
  BEGIN                                                                 04662000
    DISABLE;                                                            04664000
    DITP.DSTATE := NEWDSTATE;  << SET SYNC DSTATE >>                    04666000
    IF NEWDSTATE<>READING THEN  << SET PAIR TO INDICATE NOT READING >>  04668000
      BEGIN                                                             04670000
        DITP.PAIR := 1;                                                 04672000
        IF = THEN DITP(DTYPE).PAIRCODE := NOTREADING;                   04674000
      END;                                                              04676000
                                                                        04678000
    MPXWRITE(NULL,DITP);   << SEND SYNC >>                              04680000
  END;    << SEND SYNC >>                                               04682000
$PAGE   " TERMINAL INTERRUPT PROCESSOR  - TIP"                          04684000
                                                                        04686000
PROCEDURE TIPX;          <<  TERMINAL INTERRUPT PROCESSOR >>            04688000
  OPTION PRIVILEGED, UNCALLABLE;                                        04690000
  BEGIN                                                                 04692000
    INTEGER DEVICE = Q+3;                                               04694000
                                                                        04696000
    INTEGER READDATA = Q+4;   << ALL RIO DATA, CHAR, PARITY, UNIT # >>  04698000
                                                                        04700000
    INTEGER DATA = Q+5; << RIO DATA MASKED TO 9:7, JUST CHARACTER >>    04702000
                                                                        04704000
    LOGICAL POINTER DITPL = Q + 6;                                      04706000
    DOUBLE  POINTER DITPD = DITPL;                                      04708000
    INTEGER ARRAY DITP(*) = DITPL;                                      04710000
                                                                        04712000
    INTEGER PAIRTYPE = Q+7;  << HOLDS PAIR CODE OR ZERO >>              04714000
                                                                        04716000
    LOGICAL TAPEMODEFLAG   = Q+%10;  << SET IF TAPE OR BLOCK READ >>    04718000
    INTEGER UNITNUMBER     = TAPEMODEFLAG;                              04720000
    INTEGER POINTER SAVEP  = TAPEMODEFLAG;                              04722000
    INTEGER TEMP           = TAPEMODEFLAG;                              04724000
    LOGICAL READTIMED      = TEMP;                                      04726000
                                                                        04728000
    POINTER IOQPL = Q+%11;  << POINTS TO CURRENT IOQ ELEMENT >>         04730000
    INTEGER ARRAY IOQP(*) = IOQPL;                                      04732000
    POINTER ILTP  = IOQP;                                               04734000
                                                                        04736000
                                                                        04738000
    INTEGER POINTER DLTP =S-0;    << POINTS TO DLT >>                   04740000
                                                                        04742000
    INTEGER MAINUNIT = DB+IUNIT; << UNIT SAVED DURING SPEED SENSING >>  04744000
    INTEGER PROGENPCBP = DB + %141;  << PROGEN'S PCB POINTER >>         04746000
                                                                        04748000
    ARRAY ECHOCHARS(0:3) =PB := %20000,REVSLASH,%20012,CNTRLY;          04750000
    ARRAY FFSYNCS( 1:6) = PB := 255,240,120,60,30,20;          <<00.02>>04752000
    ARRAY ESCQMDC1(0:3)=PB:=ESC, %77, %21, 0; << ESC,?,DC1,0 >><<01472>>04754000
                                                               <<01472>>04756000
    ARRAY DISABLE'HOME(0:4) = PB := ESC,%143,ESC,%110,NULL;    <<01473>>04758000
    INTEGER ARRAY CPS(0:7) = PB := 240,240,120,60,30,15,10,14; <<02006>>04760000
    DEFINE MSECS'24'DAYS=2073600000D#;                         <<01.03>>04762000
    ENTRY TIP;     << SO THERE CAN BE CODE BEFORE ENTRY >>              04764000
$PAGE                                                                   04766000
                                                                        04768000
  SUBROUTINE FINISHREAD;                                                04770000
    <<                                                                  04772000
      THIS SUBROUTINE CLEANS UP READS. IT COMPLETES TIMEOUTS,           04774000
      CALCULATES READ TIME, TURNS OFF ECHO, CHECKS FOR STARTING         04776000
      ANY QUEUED REQUESTS.                                              04778000
    >>                                                                  04780000
      BEGIN                                                             04782000
        READTIMED := IF DITP(DTRLX).READTRLX<>0 AND                     04784000
                   DITP(DSAVE).HSTATE=ONLINE THEN TRUE ELSE FALSE;      04786000
        MPXCONTROL(ECHOOFF,DITP);                                       04788000
        IOQP(QMISC).RSTATE := READCMPLTD;                               04790000
                                                                        04792000
        X := IOQP(QMISC).READSTOP;                                      04794000
        IF <> THEN  << READ HAS BEEN STOPPED >>                         04796000
          BEGIN                                                         04798000
            IF X=PREMPTSTOP THEN                                        04800000
              BEGIN  << PREMPT STOP, RESTORE TIME FLAGS >>              04802000
                DITP(DTYPE).TIMING := 0;                                04804000
                IF <> THEN DITP(DTYPE).TIMEREAD := 1;                   04806000
              END                                                       04808000
            ELSE IF X=BREAKSTOP AND READTIMED THEN                      04810000
              SETREADERROR(IOQP,READTO);                                04812000
                                                                        04814000
            IOQP(QMISC).RSTATE := STOPPED;                              04816000
          END;                                                          04818000
                                                                        04820000
        DITP(DTYPE).TIMING := 0;                                        04822000
        IF <> THEN        << FORM READ TIME >>                          04824000
          BEGIN                                                         04826000
          TOS := TIMER-DITPD(DRTIMED);                         <<01.03>>04828000
          IF < THEN << NEGATIVE TIME INTERVAL MEANS >>         <<01.03>>04830000
                    << THAT TIMER HAS OVERFLOWED    >>         <<01.03>>04832000
             TOS:= TOS+MSECS'24'DAYS;                          <<01.03>>04834000
          TOS := 10;                                           <<01.03>>04836000
            ASMB(LDIV, DEL);                                            04838000
            IF OVERFLOW THEN  << SET TO -1 FOR A FLAG >>                04840000
              BEGIN   DEL;   TOS := -1;   END;                          04842000
            DITP(DRTIME) := TOS;                                        04844000
          END;                                                          04846000
                                                                        04848000
        IF READTIMED THEN     << READ BEGIN TIMED >>                    04850000
            BEGIN                                                       04852000
              IF IOQP(QMISC).READSTOP<>PREMPTSTOP THEN                  04854000
                DITP(DRTMAX) := 0;  << CLEAR REQUEST TO TIME READ >>    04856000
              STOPTIMEOUT(READTIMEOUT,DITP);                            04858000
            END;                                                        04860000
        STOPTIMEOUT(BLOCKTIMEOUT,DITP);                        <<02006>>04862000
        S1.PAIR := 1;                                                   04864000
        IF = OR DITP(DTYPE).PAIRCODE<>XOFFPAIR THEN                     04866000
          DITP(DTYPE).PAIRCODE := NOTREADING;                           04868000
        DITP(DMODEM).PRIMED := IF PAIRTYPE<ENTER THEN 0 ELSE 1;<<0.03>> 04870000
                                                               <<02080>>04872000
                                                                        04874000
        CHECKTQUEUE(DITP);  << START ANY WAITING I/O >>                 04876000
      END;                                                              04878000
$PAGE                                                                   04880000
                                                                        04882000
SUBROUTINE DELETECHAR;                                                  04884000
  <<                                                                    04886000
    DELETES A CHARACTER FROM BUFFER IF COUNT NO ZERO AND RETURNS        04888000
    A TBUF IF NECESSARY                                                 04890000
  >>                                                                    04892000
    IF DITP.DSTATE=READING AND DITP(DBCNT)<>0 THEN                      04894000
      BEGIN  << DECREMENT COUNT AND RETURN TBUF AS NECESSARY >>         04896000
        DITP(X) := DITP(X) - 1;                                         04898000
        IF = THEN IOQP.READERRORS := NULL;                              04900000
        IF (DITP(X) MOD TBMAXB)=0 THEN  << RETURN A TBUF >>             04902000
          BEGIN                                                         04904000
            TOS := DITP(DTAIL);   X := @DITP(DHEAD);                    04906000
            WHILE S0<>WA0(X) DO X := WA0(X);  << STEP TO NEXT >>        04908000
            TOS := X;    WA0(X) := 0;   << CLEAR END LINK >>            04910000
            DITP(DTAIL) := TOS;   << SET NEW TAIL POINTER >>            04912000
            RETURNTBUF( * );                                            04914000
            DITP(DPNTR) := -1;  << SET NO BUFFER FLAG >>                04916000
          END                                                           04918000
        ELSE IF DITP(DPNTR)=-1 THEN  << NOT POINTING TO A BUFFER >>     04920000
          BEGIN  << FORM COUNT AND POINTER TO LAST CHAR INPUT >>        04922000
            DITP(DPNTR) := DITP(DTAIL)&LSL(1) + TBMAXB;                 04924000
            DITP(DCNT ) := 1;                                           04926000
          END                                                           04928000
        ELSE                                                            04930000
          BEGIN  << JUST ADJUST COUNT AND POINTER >>                    04932000
            DITP(DPNTR) := DITP(DPNTR) - 1;                             04934000
            DITP(DCNT ) := DITP(DCNT ) + 1;                             04936000
          END;                                                          04938000
      END;  << DELETE CHAR >>                                           04940000
                                                               <<00.05>>04942000
                                                               <<00.05>>04944000
                                                               <<00.05>>04946000
LOGICAL SUBROUTINE WAITFORCR;                                  <<00.05>>04948000
  <<                                                                    04950000
    RETURNS TRUE IF IN TAPEMODE AND NOT A 264X OR IF TERMTYPE           04952000
    IS 11 AND A BLOCK MODE READ IS IN PROGRESS & DATA IS NOT A CR       04954000
  >>                                                                    04956000
  BEGIN                                                        <<00.05>>04958000
    X := DITP(DSPEED);   << TEST TAPE MODE FLAG >>             <<00.05>>04960000
    IF < AND NOT DITPL(DMODEM).NOSYNC OR DITPL(DMODEM).PRIMED  <<00.05>>04962000
      AND DITP(DTYPE).TTYPE=HP2640X THEN                       <<00.05>>04964000
        IF DATA<>CR THEN WAITFORCR := TRUE;                             04966000
  END;   << WAIT FOR CR >>                                     <<00.05>>04968000
                                                               <<02006>>04970000
INTEGER SUBROUTINE BLOCKTIME;                                  <<02006>>04972000
   BLOCKTIME := (DITP(DRBCT)/CPS(DITP(DSPEED).INSPEED))        <<02006>>04974000
      &ASL(1) + 30;                                            <<02006>>04976000
$PAGE                                                          <<00.05>>04978000
                                                                        04980000
ERROR1:                                                                 04982000
    IOFAILURE(DEVICE,DITP);   << TIO OR CIO FAILURE >>                  04984000
                                                                        04986000
ERROR3:                                                                 04988000
    IF < THEN IOFAILURE(DEVICE, 0);  << RIO FAILURE >>                  04990000
    DEL;  << DELETE STATUS & TRY AGAIN >>                               04992000
                                                                        04994000
                                                                        04996000
    << -------------------- BEGIN INTERRUPT HANDLER ---------------->>  04998000
                                                                        05000000
TIP:                                                                    05002000
    ASMB( RIO 0 );  << GET CHARACTER AND UNIT >>                        05004000
    IF <> THEN GOTO ERROR3;  << NOT READY OR NON RESPONDING >>          05006000
                                                                        05008000
    X := S0&LSR(11);  << X := UNIT >>                                   05010000
    TOS := S0.( 9:7);        << SET DATA >>                             05012000
    IF X>15 THEN X := MAINUNIT;       << SPEED SENSE UNIT >>            05014000
    TOS := DITPA(X);  << GET DIT POINTER  >>                            05016000
    IF <= THEN    << NON CONFIGURED UNIT >>                             05018000
      BEGIN                                                             05020000
        << SHOULD HAVE A MESSAGE TO OUTPUT HERE >>                      05022000
        ASMB( IXIT );                                                   05024000
      END;                                                              05026000
                                                                        05028000
    TOS := %1000D;   << FOR SETTING SYSDB >>                            05030000
    XCHDB;       << SET DB TO SYSDB >>                                  05032000
                                                                        05034000
    DISABLE;                                                   <<00.06>>05036000
                                                               <<00.06>>05038000
    TOS := DITP(DIOQP);  << SET IOQP >>                                 05040000
    TOS := DITP;        << GET DFLAG >>                                 05042000
                                                                        05044000
    TESTBIT SPECIH');                                                   05046000
    IF <> THEN GOTO CALLSPECIAL;                                        05048000
                                                                        05050000
    ASMB( TIO 7);    << GET STATUS  >>                                  05052000
    IF < THEN GOTO ERROR1;                                              05054000
                                                                        05056000
    TOS := ACKINTRPT;                                                   05058000
    ASMB(CIO %11);     << ACKNOWLEDGE INTERRUPT >>                      05060000
    IF < THEN GOTO ERROR1;   << NON RESPONDING DEVICE >>                05062000
                                                                        05064000
    TESTBIT SEND');                                                     05066000
    IF = THEN GOTO INPUT;    << NOT AN OUTPUT COMPLETION INTERRUPT >>   05068000
$PAGE                                                                   05070000
                                                                        05072000
DSWITCH:                                                                05074000
    DEL;        << DELETE STATUS >>                                     05076000
                                                               <<01472>>05078000
    TOS.WRTWAIT := 0;                                                   05080000
    IF REQSTAT THEN GOTO REQSTATL;                             <<01472>>05082000
    X := S0.DSTATE;                                            <<01472>>05084000
                                                                        05086000
    ASMB( LOAD DSTABLE,X;   ADAX;   BR DSTABLE,X;                       05088000
DSTABLE:                                                                05090000
      CON OUT;       CON WRITINGL;  CON OUT;       CON XONWRITE;        05092000
      CON TURN202L;  CON OUT;       CON EORLFL;    CON EORCRL;          05094000
      CON EORSYNCL;  CON WAITEDL;   CON SENDXONL;  CON DELETECRL;       05096000
      CON REPEATINGL;CON READECHOL; CON STARTREADL;CON FINREADL);       05098000
                                                                        05100000
FINREADL:                                                               05102000
    FINISHREAD;                                                         05104000
    TOS.DSTATE := DITP(DCNTRL).NXTDSTATE;                               05106000
DSWITCHX:                                                               05108000
    TOS := 0;       << SET UP STACK >>                                  05110000
    GOTO DSWITCH;  << RESUME AT NEW DSTATE >>                           05112000
                                                                        05114000
                                                                        05116000
  <<--------- CHECK BINARY AND TRANSPARENT READS ------->>              05118000
                                                                        05120000
IN6:                                                                    05122000
    TESTBIT TERMCHAR');                                                 05124000
    IF = THEN DATA := READDATA   << BINARY READ IN PROGRESS >>          05126000
    ELSE  << TRANSPARENT READ, CHECK FOR SUB SYS BRK & EOR >>           05128000
      BEGIN                                                             05130000
        IF DITP(DLDEV).NOPTY<> 0 THEN <<CHECK FOR 8-BIT DATA>> <<AMS00>>05132000
        DATA := READDATA.(8:8); <<8 BIT DATA-NO PRTY>>         <<+1.M3>>05134000
        IF DATA=CNTRLA AND DITP(DLDEV).DLDEVN=CONSLDEV THEN    <<00.03>>05136000
          GOTO AWAKEPROGEN;  << CONSOLE INTERRUPT >>           <<00.03>>05138000
                                                                        05140000
        IF DITP(DSTOP).EORCHAR=DATA THEN                       <<00.05>>05142000
          BEGIN                                                <<00.05>>05144000
            IF NOT WAITFORCR THEN GOTO STOPREADING;            <<00.05>>05146000
                                                               <<00.05>>05148000
            TOS := CRWAIT;                                     <<00.05>>05150000
            GOTO SETPAIR;                                      <<00.05>>05152000
          END;                                                 <<00.05>>05154000
                                                               <<00.05>>05156000
        IF DITP(DSTOP).SSBRKCHAR=DATA THEN                     <<00.05>>05158000
          BEGIN                                                <<00.05>>05160000
            DITP := TOS;   << SAVE FLAGS >>                    <<00.05>>05162000
            BREAKSERVICE(DITP,SSBREAK');                       <<00.05>>05164000
            ASMB( IXIT );                                      <<00.05>>05166000
          END;                                                 <<00.05>>05168000
      END;                                                              05170000
                                                                        05172000
    GOTO IN4;   << SKIP ANY CHECKS >>                                   05174000
$PAGE                                                                   05176000
                                                                        05178000
     << ---- CHECK FOR PARITY ERRORS, LOST CHARACTERS & BREAK ------ >> 05180000
                                                                        05182000
PCHECK:                                                                 05184000
    IF DITP(DLDEV).NOPTY <>0 THEN                              <<AMS00>>05186000
      BEGIN  <<NORMAL READ, BUT 8-BIT DATA>>                   <<+1.M3>>05188000
        DATA := READDATA.(8:8);                                <<+1.M3>>05190000
        GOTO IN2; <<CONTINUE PROCESSING CHARCTER>>             <<+1.M3>>05192000
      END;                                                     <<+1.M3>>05194000
    IF READDATA.DATAPARITY<>DITP(DCNTRL).PARITY THEN           <<01.01>>05196000
      SETREADERROR(IOQP,PTYERROR);                             <<01.01>>05198000
    GOTO IN2;  << CONTINUE PROCESSING CHARACTER >>                      05200000
                                                                        05202000
IN5:                                                                    05204000
    IF READDATA.(6:10)=0 THEN GOTO BRKFOUND ELSE GOTO IN0;              05206000
                                                                        05208000
IN7:                                                                    05210000
    SETREADERROR(IOQP,LOSTCHAR);                                        05212000
    GOTO IN1;                                                           05214000
                                                               <<00.05>>05216000
                                                                        05218000
   <<----------- INPUT CHARACTER PROCESSING --------------->>           05220000
                                                                        05222000
INPUT:                                                                  05224000
    TESTBIT BRKSTATUS');                                                05226000
    IF <> THEN GOTO IN5;   << CHECK DATA FOR VALID BREAK >>             05228000
                                                                        05230000
IN0:                                                                    05232000
    TESTBIT CHARLOST');                                                 05234000
    IF <> THEN GOTO IN7;   << DIDNT SERVICE INTERRUPT IN TIME >>        05236000
                                                                        05238000
IN1:                                                                    05240000
    DEL;     << DELETE STATUS FROM TIO >>                               05242000
   IF DATA=CNTRLA AND DITP(DLDEV).DLDEVN=CONSLDEV THEN GOTO CONTROLA;   05244000
    TESTBIT UP');                                                       05246000
    IF = THEN GOTO SPDSENSE;     << NOT ON LINE >>                      05248000
                                                                        05250000
    TESTBIT PAIR');                                                     05252000
    IF <> THEN GOTO PAIRCHECK;  << CHECK FOR A PAIR SEQUENCE >>         05254000
                                                                        05256000
IN3:                                                                    05258000
    TESTBIT BINARYREAD');                                               05260000
    IF <> THEN GOTO IN6;   << BINARY READ OR TRANSPARENT READ >>        05262000
                                                                        05264000
    TESTBIT PTYCHK');     <<PARITY CHECK OR HP2645K FLAG>>     <<+1.M3>>05266000
    IF <> THEN GOTO PCHECK;   << GO CHECK PARITY OF CHARACTER >>        05268000
                                                                        05270000
IN2:                                                                    05272000
    TESTBIT SPOOLING');                                                 05274000
    IF <> THEN GOTO SPOOL;                                              05276000
                                                                        05278000
    X := DATA;     X := X-ESC;                                          05280000
    IF <= THEN GOTO CNTRLCHAR;   << CHECK FOR A CONTROL CHARACTER >>    05282000
                                                                        05284000
    X := X-%144;                                                        05286000
    IF = THEN GOTO OUT;  << A RUBOUT CHARACTER, IGNORE  >>              05288000
                                                                        05290000
$PAGE                                                                   05292000
IN4:                                                                    05294000
    TOS.NEWLINE := 0;                                                   05296000
    IF <> AND DATA<%40 THEN TOS.NEWLINE := 1;  << NON PRINTING CHAR >>  05298000
    DITP(DPNTR) := DITP(DPNTR) + 1;                                     05300000
    IF = THEN GOTO NEWBUF;   << NEW TBUF NEEDED >>                      05302000
                                                                        05304000
    BA0(DITP(X)) := DATA;  << 8 OR 7 BITS OF DATA >>                    05306000
    DITP(DBCNT) := DITP(DBCNT) + 1;  << INCREMENT CHAR COUNT >>         05308000
    TESTBIT TERMCHAR');                                                 05310000
    IF <> AND IOQP(QPAR2)&LSR(8)=DATA  AND DATA<>0 THEN                 05312000
      BEGIN    << SPECIAL READ TERMINATION CHARACTER DETECTED >>        05314000
        SETREADERROR(IOQP,SPECIALSTOP);                                 05316000
        IF NOT WAITFORCR THEN BEGIN                            <<01231>>05318000
           TOS:=TIMER-DITPD(17);                               <<01231>>05320000
           DITP(34):=TOS;       DEL;                           <<01231>>05322000
           MMSTAT(238,DITP(DLDEV).DLDEVN,DITP(34),DITP(DBCNT));<<01231>>05324000
           DITPD(17):=0D;                                      <<01231>>05326000
           GOTO STOPREADING;                                   <<01231>>05328000
           END;                                                <<01231>>05330000
                                                               <<00.05>>05332000
        TOS := CRWAIT;                                         <<00.05>>05334000
        GOTO SETPAIR;                                          <<00.05>>05336000
      END;                                                     <<00.05>>05338000
                                                                        05340000
    DITP(DCNT) := DITP(DCNT) - 1;                                       05342000
    IF > THEN  << COUNT OR BUFFER NOT EXHAUSTED >>                      05344000
      BEGIN                                                             05346000
WAITEDL:                                                                05348000
OUT:                                                                    05350000
        DITP := TOS;                                                    05352000
        ASMB( IXIT );                                                   05354000
      END;                                                              05356000
                                                                        05358000
                                                                        05360000
  <<------------- COUNT EXHAUSTED, OR TBUF FULL --------------->>       05362000
                                                                        05364000
    IF DITP(DBCNT)<DITP(DRBCT) THEN                                     05366000
      BEGIN   << TBUF FULL, BUT NOT END OF READ >>                      05368000
        DITP(DPNTR) := -1;   << SET TBUF FULL FLAG >>                   05370000
        GOTO OUT;                                                       05372000
      END;                                                              05374000
                                                                        05376000
COUNTDONE:                                                              05378000
    IF S0.(TERMCHAR':2)=READBINARY THEN BEGIN                  <<01231>>05380000
MEASUREMENT1:                                                  <<01231>>05382000
       IF MEASURE THEN BEGIN                                   <<01231>>05384000
          TOS:=TIMER-DITPD(17);                                <<01231>>05386000
          DITP(34):=TOS;       DEL;                            <<01231>>05388000
          MMSTAT(233,DITP(DLDEV).DLDEVN,DITP(34),DITP(DBCNT)); <<01231>>05390000
          DITPD(17):=0D;                                       <<01231>>05392000
          END;                                                 <<01231>>05394000
       GOTO STOPREADING;                                       <<01231>>05396000
       END;                                                    <<01231>>05398000
                                                               <<00.05>>05400000
    IF NOT WAITFORCR THEN GOTO READDONE;                       <<00.05>>05402000
                                                               <<00.05>>05404000
    X := DITP(DSTOP);   << TEST FOR TRANSPARENT READS >>       <<00.05>>05406000
    TOS := IF = THEN CRWAITLF ELSE CRWAIT;                     <<00.05>>05408000
    GOTO SETPAIR;                                              <<00.05>>05410000
$PAGE                                                                   05412000
                                                                        05414000
  <<------------ GET NEW READ BUFFER ----------------->>                05416000
                                                                        05418000
NEWBUF:                                                        <<01671>>05420000
    IF IOQP.READERRORS<>LOSTDATA THEN                          <<01671>>05422000
      BEGIN                                                    <<01671>>05424000
      TOS := GETTBUF(SECONDARY);  TOS := S0;  TOS := S0;       <<01671>>05426000
      IF <> THEN   << TBUF AVAILABLE, LINK IN >>               <<01671>>05428000
        BEGIN                                                  <<01671>>05430000
        IF DITP(DBCNT)=0 THEN DITP(DHEAD) := TOS  << FIRST >>  <<01671>>05432000
          ELSE WA0(DITP(DTAIL)) := TOS;  << LINK TO LAST >>    <<01671>>05434000
        DITP(DTAIL) := TOS;                                    <<01671>>05436000
        DITP(DPNTR) := TOS&LSL(1)+1;                           <<01671>>05438000
                                                               <<01671>>05440000
        TEMP := DITP(DRBCT) - DITP(DBCNT);  << COUNT LEFT >>   <<01671>>05442000
        DITP(DCNT) := IF TEMP<TBMAXB THEN TEMP ELSE TBMAXB;    <<01671>>05444000
                                                               <<01671>>05446000
        GOTO IN4;   << SAVE CHAR >>                            <<01671>>05448000
        END;                                                   <<01671>>05450000
      DITP(DCNT) := DITP(DRBCT) - DITP(DBCNT);<< COUNT LEFT >> <<02006>>05452000
      ASMB( DDEL, DEL );                                       <<01671>>05454000
      END;                                                     <<01671>>05456000
                                                               <<01671>>05458000
    DITP(DPNTR) := -1;   << SET NO TBUF FLAG >>                <<01671>>05460000
    SETREADERROR(IOQP,LOSTDATA);                               <<01671>>05462000
    DITP(DCNT) := DITP(DCNT) - 1; << DECREMENT COUNT LEFT >>   <<02006>>05464000
    << SETUP FOR RETURNING ALL TBUFS >>                        <<01671>>05466000
    TOS := DITP(DHEAD);                                        <<01671>>05468000
    IF <> THEN                                                 <<01671>>05470000
      BEGIN   << SOME TO RETURN, POSTPONE UNTIL ENABLED >>     <<01671>>05472000
      DITP(DHEAD) := DITP(DTAIL) := 0;                         <<01671>>05474000
      DITP(DBCNT) := 0;                                        <<02079>>05476000
      END;                                                     <<01671>>05478000
    ASMB( XCH );                                               <<01671>>05480000
                                                               <<01671>>05482000
    TESTBIT TERMCHAR');                                        <<01671>>05484000
    IF <> AND IOQP(QPAR2)&LSR(8)=DATA AND DATA <> 0 OR         <<02006>>05486000
      DITP(DCNT) = 0 THEN BEGIN << READ COMPLETED >>           <<02006>>05488000
      FINISHREAD;                                              <<01671>>05490000
      TOS.DSTATE := NULL;                                      <<01671>>05492000
      AWAKETERMINAL(DITP);                                     <<01671>>05494000
      END;                                                     <<01671>>05496000
                                                               <<01671>>05498000
    DITP := TOS;                                               <<01671>>05500000
    ENABLE;                                                    <<01671>>05502000
    ASMB( TEST );   << SEE IF POSTPONED TBUF RETURN >>         <<01671>>05504000
    IF <> THEN RETURNTBUFS( * );                               <<01671>>05506000
                                                               <<01671>>05508000
    ASMB( IXIT );                                              <<01671>>05510000
                                                                        05512000
   <<----- DELETE LINE CARRIAGE RETURN COMPLETED ---->>                 05514000
                                                                        05516000
DELETECRL:                                                              05518000
    TOS.DSTATE := XONWRIT;                                              05520000
    TOS := LF;     << DELETE LINE LINE FEED >>                          05522000
    GOTO CHKWRTCHAR;                                                    05524000
                                                                        05526000
                                                                        05528000
   << ------------- EOR SEQUENCE SYNC COMPLETED  --------->>            05530000
                                                                        05532000
EORSYNCL:                                                               05534000
    TOS.DSTATE := EORCR;                                                05536000
    TOS := CR;                                                          05538000
    GOTO CHKWRTCHAR;  << GO WRITE CARRAIGE RETURN >>                    05540000
                                                                        05542000
                                                                        05544000
   <<--------- EOR CARRIAGE RETURN COMPLETED ---------->>               05546000
                                                                        05548000
EORCRL:                                                                 05550000
    TOS.DSTATE := EORLF;                                                05552000
    TOS := LF;                                                          05554000
    GOTO CHKWRTCHAR;                                                    05556000
                                                                        05558000
                                                                        05560000
   <<------- 202 TURN TO WRITE DONE, WRITE TURN CHARACTER -------->>    05562000
                                                                        05564000
TURN202L:                                                               05566000
    TOS.DSTATE := DITP(DCNTRL).NXTDSTATE;                               05568000
    IF NOT DITPL(DSAVE).TURNTOWRITE THEN GOTO DSWITCHX;                 05570000
    TOS := DITP(DSAVE).TURNCHAR;                                        05572000
    GOTO WRITECHAR;                                                     05574000
$PAGE                                                                   05576000
                                                                        05578000
        <<----------- SYNC OR "!" COMPLETED -------->>                  05580000
                                                                        05582000
REPEATINGL:                                                             05584000
    IF DITP(DMONTR).XONWAIT <> 0 THEN GOTO OUT1;               <<01471>>05586000
                                                               <<01471>>05588000
    IF DITP(DSYNC).SCOUNT<>0 THEN  << MORE SYNCS OR "!" >>              05590000
      BEGIN                                                             05592000
        DITP(DSYNC) := DITP(DSYNC) - 1;                                 05594000
                                                                        05596000
        IF DITPL(DSPEED).SYNC THEN  << DOING SYNC'S >>                  05598000
          BEGIN                                                         05600000
            TOS := SYNCCHAR;                                            05602000
            IF DITPL(DCNTRL).PTYCNTRL THEN                              05604000
              TOS.BIT8 := 0;  << PROPER SYNC CHAR WITH PTY GENERATION >>05606000
            GOTO WRTCHAR3;  << GO OUTPUT SYNC CHARACTER >>              05608000
          END;                                                          05610000
                                                                        05612000
        TOS := "!";                                                     05614000
        GOTO CHKWRTCHAR;                                                05616000
      END;                                                              05618000
                                                                        05620000
    IF DITPL(DSPEED).SYNC THEN  << CONTINUE AFTER SYNCS COMPLETE >>     05622000
      BEGIN                                                             05624000
        TOS.DSTATE := DITP(DSAVE).WAITEDSTATE;                          05626000
        GOTO DSWITCHX;                                                  05628000
      END;                                                              05630000
                                                                        05632000
    TOS.DSTATE := DELETECR;                                             05634000
    TOS := CR;                                                          05636000
    GOTO CHKWRTCHAR;                                                    05638000
$PAGE                                                                   05640000
                                                                        05642000
   <<------------- READ TO BE STARTED --------------->>                 05644000
                                                                        05646000
STARTREADL:                                                             05648000
    TOS := TOS LAND %174700; << INITIALIZE FLAGS FOR A READ >>          05650000
    IF IOQP(QFUNC).FUNC=PTAPEFUNC THEN TOS.SPOOLING := 1                05652000
      ELSE IF IOQP(QPAR2).BINARY<>0 THEN TOS.BINARYREAD := 1            05654000
        ELSE  << CHECK FOR TRANSPARENT & SPECIAL STOP CHAR READS >>     05656000
          BEGIN                                                         05658000
            IF IOQP(QPAR2)&LSR(8)<>NULL THEN TOS.TERMCHAR := 1;         05660000
            X := DITP(DSTOP);  << TEST FOR TRANSPARENT READS >>         05662000
            IF <> AND DITP(DMODEM).TMODE=NULL THEN                      05664000
              BEGIN  << NOT IN BRK OR CONSOLE MODE >>                   05666000
                TOS.TERMCHAR := 1;                                      05668000
                TOS.BINARYREAD := 1;                                    05670000
              END;                                                      05672000
          END;                                                          05674000
                                                                        05676000
    DMONITOR(DITP,%22,DITP(DMODEM), -1);                                05678000
                                                                        05680000
    @SAVEP := DITP(DBREAK);                                             05682000
    IF <> AND DITP(DMODEM).TMODE=0 THEN                                 05684000
      BEGIN   << BROKEN READ TO BE RESTARTED >>                         05686000
        DITP(DBREAK) := 0;                                              05688000
        DITP(DBCNT) := SAVEP;   << RESTORE BYTE COUNT SO FAR >>         05690000
        MOVE DITP(DCNT) := SAVEP(6), (4);  << RESTORE CT,HD,TL,PR >>    05692000
        RETURNIOQ(SAVEP);                                               05694000
                                                                        05696000
        IF DITP(DRBCT)<=DITP(DBCNT) THEN    << ENOUGH ALREADY READ >>   05698000
          GOTO READDONE;  << STOP READ & CHECK FOR LF ECHO >>           05700000
      END;                                                              05702000
                                                                        05704000
    IOQP(QMISC).RSTATE := READING;                                      05706000
                                                               <<01242>>05708000
                                                               <<02005>>05710000
$PAGE                                                                   05712000
                                                                        05714000
   <<------------ SEND XON TO START READ ------------->>                05716000
                                                                        05718000
SENDXONL:                                                               05720000
    TOS.PAIR := 1;   << HOLD OFF ANY INPUT DURING XON WRITE >>          05722000
    IF = THEN DITP(DTYPE).PAIRCODE := NOTREADING;                       05724000
                                                                        05728000
    IF AUTOHANDSH AND DITPL(DMODEM).PRIMED THEN                <<01473>>05730000
      BEGIN                                                    <<01473>>05732000
      tos.dstate := sendxon;                                   <<01704>>05734000
      TOS := DISABLE'HOME(ESCSEQCNT); << GET CHAR >>           <<01473>>05736000
      IF <> THEN                                               <<01473>>05738000
        BEGIN << SEND CHAR >>                                  <<01473>>05740000
        ESCSEQCNT := ESCSEQCNT + 1;                            <<01473>>05742000
        GOTO CHKWRTCHAR;                                       <<01473>>05744000
        END;                                                   <<01473>>05746000
      ESCSEQCNT := TOS;  << CLEAR TOS AND COUNT >>             <<01473>>05748000
      END;  << VIEW READ ESC CONTROL SEQUENCE >>               <<01473>>05750000
                                                               <<01473>>05752000
    TOS.DSTATE := XONWRIT;                                              05754000
    IF DITPL(DMODEM).PRIMED THEN BEGIN                         <<02006>>05756000
      DITP(DBTIME) := BLOCKTIME;                               <<02006>>05758000
      STARTTIMEOUT(BLOCKTIMEOUT, DITP)  END;                   <<02006>>05760000
    IF IOQP.RPLEVEL=NULL AND                                   <<01473>>05762000
    (NOT AUTOHANDSH OR NOT DITPL(DMODEM).PRIMED) THEN <<TIME>> <<01473>>05764000
      BEGIN                                                             05766000
        STARTTIMEOUT(READTIMEOUT,DITP);  << START ANY REQUESTED >>      05768000
                                                                        05770000
        DITP(DTYPE).TIMEREAD := 0;                                      05772000
        IF <> THEN       << TIME READ OPERATIONS >>                     05774000
          BEGIN                                                         05776000
            DITP(DTYPE).TIMING := 1;                                    05778000
            DITPD(DRTIMED) := TIMER;                                    05780000
          END;                                                          05782000
      END;                                                              05784000
    IF DITP(DTYPE).TTYPE=NOPROTOCOL THEN GOTO XONWRITE;        <<02005>>05786000
    IF NOT DITPL(DMODEM)&CSL(M202) THEN                        <<00.02>>05788000
      BEGIN                                                    <<00.02>>05790000
        TOS := XON;                                            <<00.02>>05792000
        GOTO CHKWRTCHAR;                                       <<00.02>>05794000
      END;                                                     <<00.02>>05796000
$PAGE                                                                   05798000
                                                                        05800000
   <<----------------- X ON COMPLETED ---------------->>                05802000
                                                                        05804000
XONWRITE:                                                               05806000
    DITP(DSPEED).RESTART := 0;                                          05808000
                                                                        05810000
    X := DITP(DRBCT);                                                   05812000
    IF = THEN GOTO COUNTDONE;                                           05814000
                                                                        05816000
    IF DITPL(DMODEM)&CSL(M202) AND DITPL(DMODEM).CB THEN                05818000
      BEGIN                                                             05820000
        IF DITPL(DMODEM).NOSYNC THEN  << HP264X >>             <<00.02>>05822000
          BEGIN                                                <<00.02>>05824000
            TOS := DITP(DTYPE);  << GET ETX SENT FLAG >>       <<00.02>>05826000
            ASMB( TCBC ETXSENT' );  << COMPLEMENT AND TEST >>  <<00.02>>05828000
            DITP( X ) := TOS;    << RESTORE ETX FLAG >>        <<00.02>>05830000
            IF = THEN  << ETX NOT SENT >>                      <<00.02>>05832000
              BEGIN                                            <<00.02>>05834000
                TOS := ETX;                                    <<00.02>>05836000
                GOTO CHKWRTCHAR;                               <<00.02>>05838000
              END;                                             <<00.02>>05840000
          END;                                                 <<00.02>>05842000
                                                               <<00.02>>05844000
        DSETCONTROL(READING,DITP);   << TURN TO READ >>                 05846000
        TOS := 0;   << WILL BE TURN TO WRITE FLAG >>                    05848000
        GOTO TURNWAIT;   << WAIT FOR TURN TO FINISH >>                  05850000
      END;                                                              05852000
                                                                        05854000
    IF IOQP(QMISC).READSTOP<>NULL THEN                                  05856000
      BEGIN  << READ TO BE STOPPED >>                                   05858000
        IF NOT DITPL(DMODEM).PRIMED OR S0.(TERMCHAR':2)=READBINARY OR   05860000
          NOT WAITFORCR THEN GOTO STOPREADING;                 <<00.06>>05862000
                                                                        05864000
        TOS := CRWAIT;                                                  05866000
                                                               <<00.03>>05868000
SETPAIR:                                                       <<00.03>>05870000
        DITP(DTYPE).PAIRCODE := TOS;                           <<00.03>>05872000
        TOS.PAIR := 1;                                         <<00.03>>05874000
        GOTO OUT3;                                             <<00.03>>05876000
      END;                                                              05878000
$PAGE                                                          <<00.02>>05880000
                                                                        05882000
SETREADING:                                                             05884000
    TOS.DSTATE := READING;                                              05886000
    TOS.PAIR := 0;                                                      05888000
    IF <> AND %061400&CSL(DITP(DTYPE).PAIRCODE+1) THEN         <<00.05>>05890000
      TOS.PAIR := 1;  << XOFF, DELETE & CRWAIT'S >>            <<00.05>>05892000
                                                                        05894000
    X := DITP(DBCNT);   << CHECK FOR NO INPUT YET >>                    05896000
    IF = THEN  << NOTHING INPUT YET >>                                  05898000
      BEGIN                                                             05900000
        IF NOT LS0.SPOOLING THEN DITP(DPNTR) := -1; << NO TBUF FLAG >>  05902000
        IF DITPL(DMODEM).NOSYNC AND NOT DITPL(DMODEM).PRIMED THEN       05904000
          BEGIN  << 2640/44 AND LOOK FOR AN "ENTER" >>                  05906000
            X := DITP(DSPEED);   << TEST TAPE MODE FLAG >>              05908000
            IF < OR DITPL(DMODEM)&CSL(M202) OR IOQPL(QPAR2).OWNREAD OR  05910000
              DITP(DTYPE).TTYPE<>HP2640X OR S0.(TERMCHAR':2)=READBINARY 05912000
                OR NOT DITPL(DSPEED).ECHO THEN << START READ NORMALLY >>05914000
                  BEGIN                                                 05916000
                    MPXCONTROL(SETECHO,DITP);                           05918000
                    TOS := NODATAYET;                                   05920000
                    GOTO SETPAIR;  << WAIT FOR FIRST CHARACTER >>       05922000
                  END;                                                  05924000
                                                                        05926000
            MPXCONTROL(ECHOOFF,DITP);  << START READ WITH ECHO OFF >>   05928000
            TOS := NOECHO;                                              05930000
            GOTO SETPAIR;  << WAIT FOR FIRST CHARACTER >>               05932000
          END;                                                          05934000
      END;                                                              05936000
                                                                        05938000
    MPXCONTROL(SETECHO,DITP);  << NORMAL READ STARTED >>                05940000
    GOTO OUT3;  << WAIT FOR DATA >>                                     05942000
$PAGE                                                                   05944000
                                                                        05946000
PAIRCHECK:                                                              05948000
    DMONITOR(DITP,%20,S0,READDATA);                                     05950000
                                                                        05952000
    IF DATA=CNTRLA AND DITP(DLDEV).DLDEVN=CONSLDEV THEN                 05954000
      GOTO AWAKEPROGEN;   << CONSOLE INTERRUPT >>                       05956000
                                                                        05958000
    PAIRTYPE := DITP(DTYPE).PAIRCODE;                                   05960000
                                                                        05962000
    IF S0.DSTATE=READING THEN  << CHECK PAIR TYPE >>                    05964000
      BEGIN                                                             05966000
        TOS.PAIR := 0;                                                  05968000
                                                                        05970000
        X := PAIRTYPE;                                                  05972000
        ASMB( LOAD PAIRTABLE,X;  ADAX;  BR PAIRTABLE,X;                 05974000
PAIRTABLE:                                                              05976000
          CON NOTREADINGL; CON XOFFPAIRL; CON IN3;     CON ESCPAIRL;    05978000
          CON NODATAYETL;  CON NOECHOL;   CON CRWAITL; CON CRWAITLFL;   05980000
          CON IN3;         CON DC2PAIRL);                      <<00.03>>05982000
      END;                                                              05984000
                                                                        05986000
                                                                        05988000
    IF S0.DSTATE<=WRITING OR S0.DSTATE=REPEATING THEN          <<01471>>05990000
      BEGIN   << CHECK OF ACK, XON, XOFF >>                    <<00.06>>05992000
        IF = AND DATA=ACK OR DATA=XON THEN  << RESTART WRITE >><<01.02>>05994000
          BEGIN                                                <<01471>>05996000
          IF DATA=ACK THEN                                     <<01471>>05998000
            BEGIN                                              <<01471>>06000000
            TOS.ENQACKWAIT:=0; <<CHECK TO RESTART WRITE>>      <<01471>>06002000
            IF <> THEN                                         <<01471>>06004000
              BEGIN                                            <<01471>>06006000
              STOPTIMEOUT(HP2640TO,DITP);                      <<01471>>06008000
              TOS.WRTWAIT := 1;                                <<01471>>06010000
              IF = THEN GOTO DSWITCHX;                         <<01471>>06012000
              END;                                             <<01471>>06014000
            GOTO OUT3;                                         <<01471>>06016000
            END                                                <<01471>>06018000
          ELSE IF DATA=XON THEN                                <<01471>>06020000
            BEGIN                                              <<01471>>06022000
            DITP(DMONTR).XONWAIT := 0;                         <<01471>>06024000
            IF <> AND NOT REQSTAT THEN                         <<01472>>06026000
              BEGIN                                            <<01471>>06028000
              TOS.WRTWAIT := 1;                                <<01471>>06030000
              IF = THEN GOTO DSWITCHX;                         <<01471>>06032000
              END;                                             <<01471>>06034000
            GOTO OUT3;                                         <<01471>>06036000
            END;                                               <<01471>>06038000
          END;                                                 <<01471>>06040000
        IF DATA = XOFF THEN  <<PAUSE WRITE>>                   <<01471>>06042000
          BEGIN                                                <<01471>>06044000
          DITP(DMONTR).XONWAIT := 1;                           <<01471>>06046000
          IF = AND LS0.ENQACKWAIT THEN                         <<01471>>06048000
            STOPTIMEOUT(HP2640TO,DITP);                        <<01471>>06050000
          IF DITPL(DTYPE).TTYPE=HP2631B THEN                   <<01472>>06052000
            BEGIN                                              <<01472>>06054000
            REQSTAT := 1;                                      <<01472>>06056000
            IF = AND NOT LOGICAL(S0).WRTWAIT THEN GOTO REQSTATL<<01472>>06058000
            END;                                               <<01472>>06060000
          GOTO OUT3;                                           <<01471>>06062000
          END;                                                 <<01471>>06064000
      END;                                                     <<00.06>>06066000
                                                               <<00.06>>06068000
    IF DATA=DC2 AND DITPL(DMODEM).NOSYNC THEN                           06070000
      BEGIN                                                             06072000
        DITP(DMODEM).PRIMED := 1;                              <<00.03>>06074000
        GOTO OUT3;                                             <<00.03>>06076000
      END;                                                              06078000
                                                               <<01472>>06080000
  IF DITPL(DTYPE).TTYPE=HP2631B AND REQSTAT THEN               <<01472>>06082000
    BEGIN                                                      <<01472>>06084000
    STOPTIMEOUT(HP2640TO,DITP);                                <<01472>>06086000
    IF LOGICAL(DATA).OFFLINE OR LOGICAL(DATA).PAPEROUT THEN    <<01472>>06088000
      BEGIN                                                    <<01472>>06090000
      DITP(DMONTR).XONWAIT := 1;                               <<01472>>06092000
      IF NOT IOMESSAGE (1,IF LOGICAL(DATA).PAPEROUT THEN       <<01472>>06094000
      PAPOUTMSG ELSE NOTRDYMSG, %10000, DITP(DLDEV).DLDEVN,    <<01472>>06096000
      ,,,,OPCONSOLE) THEN                                      <<01472>>06098000
        BEGIN  << NO SYSTEM MESSAGE BUFFER  >>                 <<01472>>06100000
        END;                                                   <<01472>>06102000
      END;                                                     <<01472>>06104000
    IF LOGICAL(DATA).TRANSERR AND DITP.DSTATE=WRITING AND      <<01472>>06106000
      @IOQP<>0 THEN IOQP(QSTAT).IOSTAT := TRANSERR';           <<01472>>06108000
    REQSTAT := 0;                                              <<01472>>06110000
    X := DITP(DBCNT);                                          <<01472>>06112000
    IF = AND @IOQP<>0 AND DITP.DSTATE=WRITING THEN             <<01472>>06114000
      BEGIN DITP(DRQST).STATDONE:=1; GOTO STATDONEL; END;      <<01472>>06116000
    GOTO DSWITCHX;                                             <<01472>>06118000
    END;                                                       <<01472>>06120000
                                                                        06122000
    DITP := TOS;   << SAVE DFLAGS >>                           <<00.05>>06124000
    X := DITP(DSTOP);  << CHECK FOR TRANSPARENT BREAK >>                06126000
    IF <> THEN   << IN TRANSPARENT MODE >>                     <<00.05>>06128000
      BEGIN                                                             06130000
        IF DITP(DSTOP).SSBRKCHAR=DATA AND SSBREAKOK(DITP) THEN <<00.05>>06132000
          BREAKSERVICE(DITP,SSBREAK');                         <<00.05>>06134000
      END                                                               06136000
    ELSE IF DATA=CNTRLY THEN                                   <<00.05>>06138000
      BEGIN                                                    <<00.05>>06140000
        DITP(DSPEED).TAPEMODE := 0;                            <<00.05>>06142000
        IF = AND SSBREAKOK(DITP) THEN                          <<00.05>>06144000
          BREAKSERVICE(DITP,SSBREAK');                         <<00.05>>06146000
      END;                                                     <<00.05>>06148000
                                                                        06150000
    ASMB( IXIT );                                              <<00.05>>06152000
                                                                        06154000
                                                                        06156000
XOFFPAIRL:                                                              06158000
    IF DATA=CR THEN GOTO OUT3 ELSE GOTO IN3;                            06160000
                                                               <<00.05>>06162000
                                                               <<00.05>>06164000
NOTREADINGL:                                                   <<00.05>>06166000
    SUDDENDEATH(200);   << DS=READING & PAIRCODE=NOTREADING >> <<00.05>>06168000
                                                               <<00.05>>06170000
                                                                        06172000
ESCPAIRL:                                                               06174000
    TEMP := ";"-DATA;      << 0 OR 1 IF : OR ; >>                       06176000
    IF = OR TEMP=1 THEN  << COLON OR SEMICOLON >>                       06178000
      BEGIN  << SET ECHO AS REQUESTED >>                                06180000
        DITP(DSPEED).ECHO := TEMP;                                      06182000
        MPXCONTROL(TEMP, DITP);                                         06184000
        DELETECHAR;  << DELETE ESCAPE CHARACTER >>                      06186000
                                                               <<00.03>>06188000
OUT3:                                                          <<00.03>>06190000
        DITP := TOS;                                           <<00.03>>06192000
        ASMB( IXIT );                                          <<00.03>>06194000
      END;                                                              06196000
                                                                        06198000
    IF DITP(DTYPE).TTYPE=MINIBEE AND "A"<=DATA<="K" AND                 06200000
      %6476&LSR(X) THEN  << A-E,H,J OR K; POSITIONING SEQUENCE <<00.00>>06202000
        BEGIN  DELETECHAR;   GOTO OUT3;  END;                           06204000
                                                                        06206000
    GOTO IN3;  << GO SAVE CHARACTER >>                                  06208000
                                                                        06210000
                                                                        06212000
NODATAYETL:                                                             06214000
    IF DATA=DC2 THEN   << ASSUME "ENTER" HAS BEEN PRESSED >>   <<00.03>>06216000
      BEGIN                                                    <<00.03>>06218000
      IF AUTOHANDSH THEN                                       <<01473>>06220000
        BEGIN                                                  <<01473>>06222000
        TOS.BINARYREAD := 1;                                   <<01473>>06224000
        TOS.DSTATE := SENDXON;                                 <<01473>>06226000
        GOTO GETDATA;                                          <<01473>>06228000
        END;                                                   <<01473>>06230000
        IF NOT IOQPL(QPAR2).OWNREAD THEN GOTO GETDATA;         <<00.03>>06232000
        TOS.PAIR := 1;  DITP(DTYPE).PAIRCODE := ENTER;         <<00.03>>06234000
        PAIRTYPE := ENTER;  << IN CASE READ ENDS NOW >>        <<00.03>>06236000
MEASUREMENT3:                                                  <<01231>>06238000
   IF MEASURE THEN BEGIN                                       <<01231>>06240000
      TOS:=TIMER-DITPD(17);                                    <<01231>>06242000
      DITP(34):=TOS;       DEL;                                <<01231>>06244000
      MMSTAT(231,DITP(DLDEV).DLDEVN,DITP(34),DITP(DBCNT));     <<01231>>06246000
      DITPD(17):=0D;                                           <<01231>>06248000
      END;                                                     <<01231>>06250000
      END;                                                     <<00.03>>06252000
                                                               <<00.03>>06254000
    GOTO IN3;                                                  <<00.03>>06256000
                                                               <<00.03>>06258000
                                                               <<00.03>>06260000
NOECHOL:                                                       <<00.03>>06262000
   IF DATA=DC2 THEN  << ASSUME "ENTER" >>                      <<00.03>>06264000
      BEGIN                                                    <<00.03>>06266000
GETDATA:                                                       <<00.03>>06268000
        STOPTIMEOUT(READTIMEOUT, DITP);<<STOP USER TIMER HERE>><<02078>>06270000
        DITP(DRTMAX) := 0; << CLEAR REQUEST FOR TIMER >>       <<02094>>06272000
        DITP(DMODEM).PRIMED := 1;                              <<00.03>>06274000
        GOTO SENDXONL;   << GET DATA NOW >>                    <<00.03>>06276000
      END;                                                              06278000
                                                                        06280000
    TOS.DSTATE := READECHO;                                             06282000
    DITP(DSAVE).TURNCHAR := READDATA;  << SAVE CHARACTER >>    <<01.01>>06284000
    DITP(DLAST).PARITYSAVE := READDATA.DATAPARITY;             <<01.01>>06286000
    TOS := DATA;                                                        06288000
    GOTO WRITECHAR;   << ECHO FIRST CHARACTER BACK >>                   06290000
                                                                        06292000
                                                                        06294000
   << ------ FIRST CHAR ECHOED BECAUSE READ STARTED WITH ECHO OFF ---->>06296000
                                                                        06298000
READECHOL:                                                              06300000
    TOS.PAIR := 0;    << ENABLE READ INPUT NOW >>                       06302000
    TOS.DSTATE := READING;                                              06304000
    DITP := S0;   << IN CASE OF A CONTROL Y CHECK >>                    06306000
    TOS := DITP(DSAVE).TURNCHAR;  << RESTORE CHARACTER >>      <<01.01>>06308000
    TOS.DATAPARITY := DITP(DLAST).PARITYSAVE;                  <<01.01>>06310000
    DATA := S0.(9:7);  << 7 BITS OF READ DATA >>               <<01.01>>06312000
    READDATA := TOS;                                           <<01.01>>06314000
    MPXCONTROL(SETECHO,DITP);  << ECHO ON IF SPECIFIED >>               06316000
    GOTO IN3;   << SAVE CHARACTER >>                                    06318000
                                                                        06320000
                                                                        06322000
DC2PAIRL:                                                               06324000
    IF DATA<>CR THEN GOTO IN3;  << NOT AN "ENTER" >>                    06326000
                                                                        06328000
    IF IOQPL(QPAR2).OWNREAD THEN GOTO READDONE;                <<00.03>>06330000
                                                                        06332000
    DO DELETECHAR UNTIL DITP(DBCNT)=0;                                  06334000
    GOTO GETDATA;    << GO READ DATA FOR "ENTER" >>            <<00.03>>06336000
                                                                        06338000
                                                                        06340000
CRWAITLFL:                                                              06342000
    X := DITP(DSTOP);   << CHECK FOR TRANSPARENT READ >>                06344000
    IF = AND DATA=CNTRLX THEN GOTO CNTRLCHAR;                           06346000
                                                                        06348000
CRWAITL:                                                                06350000
    X := DITP(DSPEED);   << TEST IF IN TAPE MODE >>            <<00.05>>06352000
    IF < AND DATA=XOFF AND DITP(DTYPE).TTYPE=TERMINET OR DATA=CR        06354000
      THEN GOTO CNTRLCHAR;   << END OF READ >>                          06356000
                                                                        06358000
    TOS.PAIR := 1;   << RESTORE PAIR STATE >>                           06360000
    GOTO OUT3;      << WAIT FOR CR >>                                   06362000
$PAGE                                                                   06364000
                                                                        06366000
<<-------PTAPE OR SPOOLING READ CHARACTER PROCESSING ---------->>       06368000
                                                                        06370000
SPOOL:                                                                  06372000
    TOS := DITP(DBCNT).RBYTE;  << GET BYTE OFFSET INTO BUFFER >>        06374000
    X := S0&LSR(1)+DITP(DTBUF);   << FORM TOTAL WORD INDEX >>           06376000
    IF TOS THEN TOS := DATA + WA0(X)     << MERGE INTO RIGHT BYTE >>    06378000
      ELSE  TOS := DATA&LSL(8);      << LEFT BYTE >>                    06380000
    WA0(X) := TOS;                                                      06382000
                                                                        06384000
    IF DATA=CNTRLY THEN    << CONTROL Y, SPOOL END >>                   06386000
      BEGIN                                                             06388000
        DITP(DRQST).SPOOLEND := 1;                                      06390000
                                                                        06392000
STOPREADING:                                                            06394000
        FINISHREAD;                                                     06396000
        GOTO EORLFL;                                                    06398000
      END;                                                              06400000
                                                                        06402000
    DITP(DBCNT) := DITP(DBCNT) + 1;                                     06404000
    IF < THEN      << TOO MUCH DATA >>                                  06406000
      BEGIN                                                             06408000
        DITP(DBCNT) := DITP(DBCNT) - 1;  << RESTORE COUNT >>            06410000
        SETREADERROR(IOQP,LOSTDATA);                                    06412000
      END                                                               06414000
                                                                        06416000
    ELSE IF DITP( DBCNT ).RBYTE=0 THEN  << BUFFER FULL >>               06418000
      BEGIN                                                             06420000
        DITP(DRQST).SPOOLSW := 1;                                       06422000
        IF <> THEN SETREADERROR(IOQP,LOSTDATA);                         06424000
        TOS := DITPD(DTBUFD);                                           06426000
        ASMB( XCH     );        << EXCHANGE BUFFER POINTERS >>          06428000
        DITPD(X) := TOS;                                                06430000
        AWAKEIO(DITP,NOIMPEDE);  << FOR FAST SERVICE >>                 06432000
      END;                                                              06434000
                                                                        06436000
    GOTO OUT3;                                                          06438000
$PAGE                                                                   06440000
                                                                        06442000
      <<------------  CONTROL CHARACTER PROCESSING --------->>          06444000
                                                                        06446000
CNTRLCHAR:                                                              06448000
    DMONITOR(DITP,%20,S0,READDATA);                                     06450000
                                                                        06452000
    X := DITP(DSPEED);  << CHECK FOR TAPEMODE >>                        06454000
    TAPEMODEFLAG := IF < OR DITPL(DMODEM).PRIMED THEN 1 ELSE 0;         06456000
                                                                        06458000
MEASUREMENT4:                                                  <<01231>>06460000
   IF MEASURE THEN MMSTAT(236,DITP(DLDEV).DLDEVN,DATA,0);      <<01231>>06462000
                                                               <<01231>>06464000
    X := DATA;                                                          06466000
    ASMB( LOAD CCTABLE,X;  ADAX;   BR CCTABLE,X;                        06468000
CCTABLE:                                                                06470000
      CON OUT2';   CON CONTROLA;  CON IN4;       CON IN4;               06472000
      CON IN4;     CON IN4;       CON IN4;       CON IN4;               06474000
      CON CONTROLH;CON IN4;       CON LFL;       CON IN4;               06476000
      CON IN4;     CON CRL;       CON IN4;       CON IN4;               06478000
      CON IN4;     CON XONL;      CON DC2L;      CON XOFFL;             06480000
      CON IN4;     CON IN4;       CON IN4;       CON IN4;               06482000
      CON CONTROLX;CON CONTROLY;  CON IN4;       CON ESCAPE);           06484000
                                                                        06486000
                                                                        06488000
  <<-----------CONTROL A , CONSOLE INTERRUPT --------->>                06490000
                                                                        06492000
CONTROLA:                                                               06494000
    IF DITP(DLDEV).DLDEVN<>CONSLDEV THEN GOTO IN4;  << SAVE CHARACTER >>06496000
                                                                        06498000
AWAKEPROGEN:                                                            06500000
    IF DITPL(DTYPE).CONSINTRPT THEN AWAKE(PROGENPCBP,JUNKWAIT,NOWAIT);  06502000
    GOTO OUT3;                                                          06504000
                                                                        06506000
                                                                        06508000
    <<---------  CONTROL H,  CHARACTER DELETE ------------->>           06510000
                                                                        06512000
CONTROLH:                                                               06514000
    TOS := ECHOCHARS(DITP(DTYPE).DELECHO);                              06516000
    X := DITP(DBCNT);   << TEST CHAR COUNT >>                           06518000
    IF = THEN TOS := TOS&LSR(8); << POSITION 0 COUNT ECHO CHAR >>       06520000
    DELETECHAR;   << DELETE CHARACTER >>                                06522000
    X := TOS.( 8:8);   << SAVE ECHO CHAR & SET CONDITION CODE >>        06524000
    IF = OR TAPEMODEFLAG THEN GOTO SETREADING;    << NOTHING TO ECHO >> 06526000
                                                                        06528000
    IF X=LF THEN  << ECHO A LF FOR HARDCOPY DEVICES >>                  06530000
      BEGIN                                                             06532000
        TOS.PAIR := 1;                                                  06534000
        IF PAIRTYPE=DELETEPAIR THEN << LF ECHOED LAST TIME >>           06536000
          GOTO OUT2; << DON'T ECHO ANYTHING >>                          06538000
        DITP(DTYPE).PAIRCODE := DELETEPAIR;                             06540000
        X := LF;    << RESTORE CHARACTER >>                             06542000
      END;                                                              06544000
                                                                        06546000
    MPXCONTROL(INTRPTOFF,DITP);  << RESPOND WITH ECHO OFF >>            06548000
    TOS.DSTATE := XONWRIT;  << DSTATE SET TO DELETELF >>                06550000
    TOS := X;   << RESTORE ECHO CHARACTER >>                            06552000
    GOTO CHKWRTCHAR;    << RESPOND WITH ECHO OFF >>                     06554000
$PAGE                                                                   06556000
                                                                        06558000
    <<-------------- LINE FEED ------------>>                           06560000
                                                                        06562000
LFL:                                                                    06564000
    IF TAPEMODEFLAG THEN GOTO SETREADING;                               06566000
                                                                        06568000
    MPXCONTROL(INTRPTOFF,DITP);  << RESPOND WITH ECHO OFF >>            06570000
    TOS.NEWLINE := 1;                                                   06572000
    TOS.DSTATE := XONWRIT;                                              06574000
    TOS := CR;                                                          06576000
    GOTO CHKWRTCHAR;     << OUTPUT A CR ON EACH LF >>                   06578000
                                                                        06580000
                                                                        06582000
  <<---------CARRIAGE RETURN, END OF INPUT -------------->>             06584000
                                                                        06586000
CRL:                                                                    06588000
    IF DITPL(DSPEED).RESTART THEN GOTO SENDXONL;  << READ AGAIN >>      06590000
                                                                        06592000
READDONE:                                                               06594000
MEASUREMENT2:                                                  <<01231>>06596000
    IF MEASURE THEN BEGIN                                      <<01231>>06598000
      TOS:=TIMER-DITPD(17);                                    <<01231>>06600000
      DITP(34):=TOS;  X:=TOS; IF <> THEN DITP(34) := %177777;  <<01231>>06602000
      MMSTAT(230,DITP(DLDEV).DLDEVN,DITP(34),DITP(DBCNT));     <<01231>>06604000
      DITPD(17):=0D;                                           <<01231>>06606000
      END;                                                     <<01231>>06608000
    FINISHREAD;                                                         06610000
                                                                        06612000
    X := IOQP(QPAR1);   << TEST NO CRLF FLAG >>                         06614000
    IF < OR DITPL(DSPEED).TAPEMODE OR PAIRTYPE=CRWAIT THEN              06616000
      GOTO EORLFL   << DONT ECHO A LF >>                                06618000
        ELSE IF DATA=CR THEN GOTO EORCRL  << ECHO A LF ONLY >>          06620000
          ELSE GOTO EORSYNCL;   << ECHO A CRLF >>                       06622000
                                                                        06624000
                                                                        06626000
   <<-------------XON CHARACTER PROCESSING ---------->>                 06628000
                                                                        06630000
XONL:                                                                   06632000
    IF DITP(DTYPE).TTYPE < HP2635A THEN                        <<01472>>06634000
    DITP(DSPEED).TAPEMODE := 1;                                         06636000
    GOTO SETREADING;                                                    06638000
                                                                        06640000
                                                                        06642000
   <<-------------DC2 CHARACTER PROCESSING ---------->>                 06644000
                                                                        06646000
DC2L:                                                                   06648000
    IF AUTOHANDSH THEN                                         <<04839>>06650000
       BEGIN                                                   <<04839>>06652000
         DO DELETECHAR UNTIL DITP(DBCNT)=0;                    <<04839>>06654000
         GOTO NODATAYETL;                                      <<04839>>06656000
       END;                                                    <<04839>>06658000
    IF DITPL(DMODEM).NOSYNC THEN                                        06660000
      BEGIN    << POSSIBLE "ENTER" >>                                   06662000
        TOS.PAIR := 1;                                                  06664000
        DITP(DTYPE).PAIRCODE := DC2PAIR;                                06666000
      END;                                                              06668000
                                                                        06670000
    GOTO IN4;    << SAVE CHARACTER >>                                   06672000
$PAGE                                                                   06674000
                                                                        06676000
  <<------------ X OFF CHARACTER PROCESSING --------->>                 06678000
                                                                        06680000
XOFFL:                                                                  06682000
    X := DITP(DSPEED);   << TEST IF NOT IN TAPE MODE >>                 06684000
    IF >= OR DITP(DTYPE).TTYPE<>TERMINET THEN                           06686000
      GOTO SETREADING;   << NOT A TERMINET IN TAPEMODE >>               06688000
                                                                        06690000
    TOS.PAIR := 1;    << TO SKIP NEXT CHAR IF A CR >>                   06692000
    DITP(DTYPE).PAIRCODE := XOFFPAIR;                                   06694000
                                                                        06696000
    IF DITPL(DSPEED).RESTART THEN GOTO SENDXONL   << READ AGAIN >>      06698000
      ELSE GOTO STOPREADING;  << XOFF END OF TERMINET READ >>           06700000
                                                                        06702000
                                                                        06704000
    <<--------  CONTROL  X,  LINE  DELETE -------------  >>             06706000
                                                                        06708000
CONTROLX:                                                               06710000
    DO DELETECHAR UNTIL DITP(DBCNT)=0;                                  06712000
                                                                        06714000
    IF TAPEMODEFLAG THEN  << TAPEMODE OR BLOCK READ >>                  06716000
      BEGIN  << RESTART READ WHEN CR FOUND >>                           06718000
        IF NOT WAITFORCR THEN GOTO OUT2;                       <<00.06>>06720000
        DITP(DSPEED).RESTART := 1;                                      06722000
        TOS := CRWAIT;                                                  06724000
        GOTO SETPAIR;  << WAIT FOR A CARRIAGE RETURN >>                 06726000
      END;                                                              06728000
                                                                        06730000
    IF DITPL(DLDEV).NO'CX'ECHO THEN                                     06732000
      BEGIN  << DONT ECHO ANYTHING AFTER CONTROL X >>                   06734000
        TOS.DSTATE := XONWRIT;                                          06736000
        GOTO DSWITCHX;                                                  06738000
      END;                                                              06740000
                                                                        06742000
    TOS.DSTATE := REPEATING;   << SET DOING !!!'S >>                    06744000
    DITP(DSYNC).SCOUNT := 2;       << SET "!" COUNTER >>                06746000
    DITP(DSPEED).SYNC := 0;                                             06748000
                                                                        06750000
    MPXCONTROL(INTRPTOFF,DITP);  << RESPOND WITH ECHO OFF >>            06752000
    TOS := "!";                                                         06754000
    GOTO CHKWRTCHAR;                                                    06756000
                                                                        06758000
                                                                        06760000
  <<---------ESC CHARACTER PROCESSING ------------>>                    06762000
                                                                        06764000
ESCAPE:                                                                 06766000
    TOS.PAIR := 1;                                                      06768000
    DITP(DTYPE).PAIRCODE := ESCPAIR;                                    06770000
    GOTO IN4;   << SAVE CHARACTER >>                                    06772000
$PAGE                                                                   06774000
                                                                        06776000
  <<------- CONTROL Y, SUB SYSTEM BREAK ---------->>                    06778000
                                                                        06780000
CONTROLY:                                                               06782000
    DITP(DSPEED).TAPEMODE := 0;                                         06784000
    IF <> OR NOT SSBREAKOK(DITP) THEN GOTO SETREADING;         <<00.05>>06786000
                                                               <<00.05>>06788000
    DITP := TOS;                                               <<00.05>>06790000
    BREAKSERVICE(DITP,SSBREAK');                               <<00.05>>06792000
    ASMB( IXIT );                                              <<00.05>>06794000
                                                                        06796000
                                                                        06798000
  <<------------------- BREAK PROCESSING ------------->>                06800000
                                                                        06802000
BRKFOUND:                                                               06804000
    DEL;   << DELETE STATUS >>                                          06806000
                                                                        06808000
    TESTBIT UP');                                                       06810000
    IF = THEN GOTO SPDSENSE;     << NOT ON LINE >>                      06812000
                                                                        06814000
    TESTBIT SPOOLING');                                                 06816000
    IF = AND BREAKOK(DITP) THEN                                         06818000
      BEGIN   << READ/WRITE/NULL/BANDWAIT AND BREAK OK >>               06820000
        DITP := TOS;   << SAVE DFLAGS >>                       <<00.05>>06822000
        BREAKSERVICE(DITP,BRKBIT);                             <<00.05>>06824000
MEASUREMENT5:                                                  <<01231>>06826000
  IF MEASURE THEN MMSTAT(237,DITP(DLDEV).DLDEVN,DITP.DSTATE,0);<<01231>>06828000
        ASMB( IXIT );                                          <<00.05>>06830000
      END;                                                     <<00/05>>06832000
                                                                        06834000
OUT2':                                                                  06836000
OUT2:                                                                   06838000
    DITP := TOS;                                                        06840000
    ASMB( IXIT );                                                       06842000
$PAGE                                                                   06844000
                                                                        06846000
  <<------------- SPEED SENSING ----------------->>                     06848000
                                                                        06850000
SPDSENSE:                                                               06852000
    DMONITOR(DITP,%20,S0,READDATA);                                     06854000
                                                                        06856000
    UNITNUMBER := READDATA&LSR(11);   << GET UNIT NUMBER >>             06858000
    IF UNITNUMBER<16 THEN   << MAIN UNIT >>                             06860000
      BEGIN                                                             06862000
        @ILTP := DITP(DILTP);                                           06864000
        ILTP(IUNIT) := UNITNUMBER;   << SAVE MAIN UNIT >>               06866000
        UNITNUMBER := 15; << TO FORM 2400 BAUD SPEED NUMBER >>          06868000
      END;                                                              06870000
                                                                        06872000
    IF DITP(DSAVE).HSTATE<=LOGGINGON THEN  << CHECK FOR SPEED >>        06874000
      BEGIN                                                             06876000
        IF DITPL(DSPEED).SPDSENSING THEN                       <<01.01>>06878000
          STARTTIMEOUT(SPEEDTO,DITP);                          <<01.01>>06880000
                                                                        06882000
        IF DATA=CR AND SYSUP THEN      << SPEED FOUND >>                06884000
          BEGIN                                                         06886000
            STOPTIMEOUT(SPEEDTO,DITP);                                  06888000
            DITP(DCNT) := IF DITPL(DSPEED).SPDSENSING THEN     <<01.01>>06890000
                            UNITNUMBER-14 ELSE DITP(DSPEED).INSPEED;    06892000
   IF DITP(DLDEV).NOPTY =  0  THEN                             <<AMS00>>06894000
            DITP(DCNTRL).PARITY := READDATA.DATAPARITY;        <<01.01>>06896000
            DITP(DRQST).SPDFOUND := 1;                                  06898000
            AWAKETERMINAL(DITP);                                        06900000
          END;                                                          06902000
      END;                                                              06904000
                                                                        06906000
    GOTO OUT2;                                                          06908000
                                                                        06910000
                                                                        06912000
          <<---------- CALL SPECIAL INTERRUPT HANDLER ----------->>     06914000
                                                                        06916000
CALLSPECIAL:                                                            06918000
    TOS := DEVICE;  << SET UP FOR SPECIAL INTRPT HANDLER CALL >>        06920000
    TOS := DITP(DDLTP);    << GET  DLT  POINTER >>                      06922000
    TOS := DLTP(DINTP);     << SET SPECIAL INTRPT HANDLER PLABEL >>     06924000
    DELB;   << DELETE DLTP >>                                           06926000
    ASMB(PCAL 0);                                                       06928000
    ASMB( IXIT );                                                       06930000
$PAGE                                                                   06932000
                                                                        06934000
    <<---------------- SYNC INITIALIZATION ------------->>              06936000
                                                                        06938000
SETSYNC:                                                                06940000
    DMONITOR(DITP,%21,DITP, X);                                         06942000
                                                                        06944000
    READDATA := X;  << SAVE CHARACTER >>                                06946000
                                                                        06948000
    IF NOT DITPL(DLAST).BWRITE AND S0.DSTATE<>XONWRIT THEN              06950000
      IF DITPL(DMODEM).NOSYNC THEN                                      06952000
        BEGIN                                                           06954000
          IF READDATA=ENQ THEN                                          06956000
            BEGIN     << SEND ENQ TO 2640 >>                            06958000
              IF DITP(DSPEED).INSPEED<>DITP(DSPEED).OUTSPEED OR         06960000
                DITPL(DMODEM)&CSL(M202) THEN GOTO WRITINGL; << NO ENQ >>06962000
                                                                        06964000
              STARTTIMEOUT(HP2640TO,DITP);                              06966000
              TOS.ENQACKWAIT := 1;                                      06968000
            END;                                                        06970000
        END                                                             06972000
                                                                        06974000
      ELSE  << CHECK FOR SYNC REQUIREMENTS >>                           06976000
        BEGIN                                                           06978000
          IF READDATA=CR THEN   << CARRIAGE RETURN >>                   06980000
            BEGIN                                                       06982000
              TOS := DITP(DSYNC).CRSYNC;  << GET CR SYNC COUNT >>       06984000
              GOTO SETSYNC0;                                   <<00.02>>06986000
            END;                                                        06988000
                                                                        06990000
        IF READDATA=FF AND DITPL(DTYPE).TTYPE<>18 THEN         <<04840>>06992000
            IF DITPL(DTYPE).FORMFEED THEN  << DEVICE RESPONDS TO FF >>  06994000
              BEGIN                                                     06996000
                 TOS := FFSYNCS(DITP(DSPEED).OUTSPEED);        <<00.02>>06998000
                 GOTO SETSYNC1;                                         07000000
              END                                                       07002000
            ELSE READDATA := LF;  << DO A LF FOR FF >>                  07004000
                                                                        07006000
          IF READDATA=LF THEN   << LINE FEED >>                         07008000
            BEGIN                                                       07010000
              TOS := DITP(DSYNC).LFSYNC;                                07012000
              IF DATA=CR THEN  << LF IS RESPONDING TO A CR >>           07014000
                BEGIN  << CHECK FOR MORE CR THAN LF SYNCS >>            07016000
                  TEMP := DITP(DSYNC).CRSYNC;                  <<00.02>>07018000
                  IF S0<TEMP THEN  << MORE CR THAN LF REQUIRED >>       07020000
                    BEGIN   DEL;  TOS := TEMP;   END;                   07022000
                END;                                                    07024000
                                                                        07026000
SETSYNC0:                                                      <<00.02>>07028000
              IF S0>7 THEN TOS := (TOS-6)*5;                   <<00.02>>07030000
                                                               <<00.02>>07032000
SETSYNC1:                                                               07034000
              ASMB(TEST);                                      <<00.TE>>07036000
              IF = THEN DEL ELSE                               <<00.TE>>07038000
                BEGIN                                          <<00.TE>>07040000
                  DITP(DSYNC).SCOUNT := TOS;<< SET SYNC COUNT>><<00.TE>>07042000
                  DITP(DSPEED).SYNC := 1;                      <<00.TE>>07044000
                  DITP(DSAVE).WAITEDSTATE := S0;               <<00.TE>>07046000
                  TOS.DSTATE := REPEATING;                     <<00.TE>>07048000
                END;                                           <<00.TE>>07050000
            END;                                                        07052000
        END;                                                            07054000
                                                                        07056000
    IF READDATA=LF THEN TOS.NEWLINE := 1;                               07058000
    TOS := READDATA;  << RESTORE CHARACTER >>                           07060000
    GOTO WRITECHAR;                                                     07062000
                                                                        07064000
                                                                        07066000
                                                                        07068000
     <<-------- LAST WRITE CHARACTER IN BUFFER, RETURN BUFFER ------->> 07070000
                                                                        07072000
CHECKLIMIT:                                                             07074000
    IF < THEN GOTO ENDWRITE;  << WRITE COMPLETED >>                     07076000
                                                                        07078000
    IF DITPL(DSPEED).FILLING AND DITP(DBCNT)<=TBMAXB THEN               07080000
      BEGIN  << MARK END OF TBUF OCCURED AND WAIT >>                    07082000
        DITP(DCNT) := -2;                                               07084000
        GOTO OUT1;                                                      07086000
      END;                                                              07088000
                                                                        07090000
    DITP(DPNTR) := DITP(DPNTR) + 1;                                     07092000
    TOS := BA0(DITP(X));    << GET LAST BYTE IN TBUF >>                 07094000
                                                                        07096000
    DITP(DBCNT) := DITP(DBCNT) - TBMAXB;                                07098000
    IF <= THEN DITP(DBCNT) := 0   << END OF WRITE >>                    07100000
    ELSE   << GET NEXT BUFFER >>                                        07102000
      BEGIN                                                             07104000
        IF DITP(DBCNT)<TBMAXB THEN  << NOT A FULL BUFFER >>             07106000
          TOS := DITP(X) ELSE TOS := TBMAXB;                            07108000
        DITP(DCNT) := TOS;  << SET WRITE COUNTER >>                     07110000
      END;                                                              07112000
                                                                        07114000
    TOS := DITP(DHEAD);   << GET TBUF POINTER >>                        07116000
    DITP(DHEAD) := WA0(S0);  << LINK IN NEXT TBUF IF ANY >>             07118000
    RETURNTBUF( * );                                                    07120000
    DITP(DPNTR) := DITP(DHEAD)&LSL(1) + 1; << FETCH BYTE PNTR >>        07122000
                                                                        07124000
    X := @IOQP;  << TEST IOQP FOR ZERO >>                               07126000
    IF <> AND IOQP(QMISC).RSTATE>=PRETOPOST AND DITP(DBCNT)<=WAKECOUNT  07128000
      AND IOQPL.BLOCKED THEN   << START EARLY TO CONCATENATE WRITES >>  07130000
        AWAKETERMINAL(DITP);                                            07132000
                                                                        07134000
    GOTO CHKWRTCHAR;                                                    07136000
$PAGE                                                                   07138000
                                                                        07140000
  <<-------- WRITE CHARACTER PROCESSING ----------->>                   07142000
                                                                        07144000
WRITINGL:                                                               07146000
    TESTBIT ENQACKWAIT');                                               07148000
    IF <> THEN GOTO OUT1;  << ENQ/ACK WAIT >>                           07150000
                                                                        07152000
    IF DITP(DMONTR).XONWAIT <> 0 THEN                          <<01471>>07154000
    GOTO OUT1;                                                 <<01471>>07156000
    DITP(DCNT) := DITP(DCNT) - 1;                                       07158000
    IF <= THEN GOTO CHECKLIMIT;   << END OF WRITE OR TBUF >>            07160000
                                                                        07162000
    DITP(DPNTR) := DITP(DPNTR) + 1;                                     07164000
    TOS := BA0(DITP(X));   << GET CHARACTER >>                          07166000
                                                                        07168000
CHKWRTCHAR:                                                             07170000
    X := S0;  << SAVE CHARACTER >>                                      07172000
    IF TOS <= CR THEN GOTO SETSYNC;  << LOOK FOR SYNC NEEDS >>          07174000
                                                                        07176000
    TOS.NEWLINE := 0;                                                   07178000
    IF <> AND X<%40 THEN TOS.NEWLINE := 1;  << NON PRINTING CHAR >>     07180000
    TOS :=X;   << RETRIEVE CHARACTER >>                                 07182000
                                                                        07184000
WRITECHAR:                                                              07186000
    TOS := DITP(DMODEM)&CSL(M202);                                      07188000
    IF TOS AND DITP(DMODEM).CBSB<>3 THEN  << 202 NOT IN WRITE STATE >>  07190000
      BEGIN                                                             07192000
        DITP(DTYPE).ETXSENT := 0;                              <<00.02>>07194000
        DITP(DSAVE).TURNCHAR := TOS;  << SAVE CHAR TO BE OUTPUT >>      07196000
        MPXCONTROL(INTRPTOFF,DITP);  << DISABLE READ INTERRUPTS >>      07198000
        STARTTIMEOUT(TURNTO,DITP);                                      07200000
        DSETCONTROL(WRITING,DITP);  << START TURN TO WRITE >>           07202000
        TOS := 1;   << TURN TO WRITE FLAG >>                            07204000
                                                                        07206000
TURNWAIT:                                                               07208000
        DITP(DSAVE).TURNTOWRITE := TOS;                                 07210000
                                                                        07212000
        DITP(DCNTRL).NXTDSTATE := S0;  << SAVE DSTATE AFTER TURN >>     07214000
        TOS.DSTATE := TURN202;                                          07216000
        GOTO OUT1;  << SET IN DIT AND EXIT >>                           07218000
      END;                                                              07220000
                                                                        07222000
    TOS := DITPL(DCNTRL) LAND PTYMASK;                                  07224000
    TOS := %43400 LOR TOS LOR TOS;  <<  MERGE BYTE AND PARITY >>        07226000
                                                                        07228000
                                                                        07230000
   <<-------------- WRITE CHARACTER ------------>>                      07232000
                                                                        07234000
WRTCHAR3:                                                               07236000
    ASMB( WIO %10 );     << WRITE OUT CHARACTER >>                      07238000
    IF = THEN                                                           07240000
      BEGIN                                                             07242000
        TOS := DITP(DCNTRL);                                            07244000
        ASMB( CIO %10 );    <<  SEND DOWN TO UNIT >>                    07246000
        IF = THEN                                                       07248000
          BEGIN                                                         07250000
            TOS.WRTWAIT := 1;  << INDICATED WAITING FOR INTRPT >>       07252000
            TOS.PAIR := 1;    << HOLD OFF ANY FURTHER INPUT >> <<00.06>>07254000
            IF = THEN DITP(DTYPE).PAIRCODE := NOTREADING;      <<00.06>>07256000
                                                               <<00.06>>07258000
OUT1:                                                                   07260000
            DITP := TOS;   << SET NEW DFLAG >>                          07262000
            ASMB( IXIT );                                               07264000
          END                                                           07266000
      END;                                                              07268000
                                                                        07270000
    DEL;                                                                07272000
    IF > THEN GOTO WRTCHAR3;    << NOT READY, TRY AGAIN  >>             07274000
    IOFAILURE(DEVICE,DITP);   << NON RESPONDING DEVICE >>               07276000
                                                                        07278000
                                                                        07280000
  <<---------- WRITE COMPLETION ---------------->>                      07282000
                                                                        07284000
ENDWRITE:                                                               07286000
  IF DITPL(DTYPE).TTYPE=HP2631B THEN                           <<01472>>07288000
      BEGIN                                                    <<01472>>07290000
      REQSTAT := 1;                                            <<01472>>07292000
      GOTO REQSTATL;                                           <<01472>>07294000
      END;                                                     <<01472>>07296000
STATDONEL:                                                     <<01472>>07298000
    TOS.DSTATE := NULL;                                                 07300000
    CHECKTQUEUE(DITP); << DECREMENT COUNT, START ANY WAITING REQUESTS >>07302000
    X := DITP(DRQST);                                                   07304000
    IF = THEN  << NO SERVICE REQUESTS PENDING >>                        07306000
      BEGIN                                                             07308000
        TESTBIT ACTIVE');                                               07310000
        IF <> THEN BEGIN   TOS.REQUEST := 1;   GOTO OUT1;   END;        07312000
                                                                        07314000
        X := @IOQP;                                                     07316000
        IF <> AND IOQP(QMISC).RSTATE=READWAITING THEN BEGIN    <<01231>>07318000
MEASUREMENT6:                                                  <<01231>>07320000
           IF MEASURE THEN DITPD(17):=TIMER;                   <<01231>>07322000
           GOTO STARTREADL;                                    <<01231>>07324000
           END;                                                <<01231>>07326000
      END;                                                              07328000
                                                                        07330000
                                                                        07332000
  <<-------READ/WRITE COMPLETION, CALL MONITOR ------------>>           07334000
                                                                        07336000
EORLFL:                                                                 07338000
    TOS.DSTATE := NULL;                                                 07340000
                                                                        07342000
    X := @IOQP;                                                         07344000
    IF <> THEN AWAKETERMINAL(DITP);        << REQUEST PENDING >>        07346000
                                                                        07348000
    DITP := TOS;                                                        07350000
    ASMB( IXIT );                                                       07352000
REQSTATL:                                                      <<01472>>07354000
     TOS := ESCQMDC1(ESCSEQCNT);                               <<01472>>07356000
     IF <> THEN                                                <<01472>>07358000
       BEGIN                                                   <<01472>>07360000
       ESCSEQCNT := ESCSEQCNT + 1;                             <<01472>>07362000
       GOTO WRITECHAR;                                         <<01472>>07364000
       END;                                                    <<01472>>07366000
     ESCSEQCNT := TOS;                                         <<01472>>07368000
     STARTTIMEOUT(HP2640TO,DITP);                              <<01472>>07370000
     GOTO OUT1;                                                <<01472>>07372000
  END;   <<  TIP  - TERMINAL INTERRUPT PROCESSOR >>                     07374000
DOUBLE PROCEDURE TIMER;                                                 07376000
OPTION PRIVILEGED;                                                      07378000
                                                                        07380000
COMMENT:                                                         01.03  07382000
         RETURNS A DOUBLE WORD UNSIGNED QUANTITY (31 BITS)       01.03  07384000
                                                                 01.03  07386000
         TIMER:    THIS QUANTITY REPRESENTS THE NUMBER OF        01.03  07388000
                   MILLISECONDS SINCE THE MIDNIGHT PRE-          01.03  07390000
                   CEEDING THE LAST SYSTEM COLD LOAD.            01.03  07392000
                   THIS SYSTEM TIMER WILL BE RESET TO ZERO ON    01.03  07394000
                   24-DAY INTERVALS AT EXACTLY 12 0'CLOCK MID-   01.03  07396000
                   NIGHT.  DETECTION AND CORRECTION OF THIS      01.03  07398000
                   CASE BETWEEN TWO CALLS TO TIMER (LESS THAN    01.03  07400000
                   24 DAYS APART) CAN BE DONE AS FOLLOWS:        01.03  07402000
                                                                 01.03  07404000
                     IF, WHEN SUBTRACTING A CURRENT TIMER        01.03  07406000
                     COUNT FROM A PREVIOUS COUNT, THE RESULT     01.03  07408000
                     IS NEGATIVE, ADD 2073600000 (THE NUMBER OF  01.03  07410000
                     MILLISECONDS IN 24 DAYS) TO THE RESULT.     01.03  07412000
                                                                 01.03  07414000
NOTES:   THE MILLISECOND COUNT SINCE THE MIDNIGHT PRECEEDING     01.03  07416000
         COLD LOAD IS COMPUTED BY ADDING THE COUNTER REGISTER    01.03  07418000
         (DRT #3) WITH THE OVERFLOW COUNTER (TRL(5) AND (6)).    01.03  07420000
         THE PROCEDURE TICK WILL RESET THE COUNT IN THE TRL      01.03  07422000
         TABLE EVERY 24 DAYS AND UPDATE THE BASE JULIAN DATE     01.03  07424000
         ACCORDINGLY.                                            01.03  07426000
      ;                                                                 07428000
                                                                        07430000
BEGIN                                                                   07432000
      DEFINE  CONTROL=ASMB(CIO 1;BE *+3; LDI 2; PCAL SUDDENDEATH)#;     07434000
      DEFINE  TESTIO = ASMB(TIO 1; BE *+3; LDI 2; PCAL SUDDENDEATH)#;   07436000
      DEFINE  READIO=ASMB(RIO 0;BE *+3; LDI 2; PCAL SUDDENDEATH)#;      07438000
      DEFINE  TWENTY'FOUR'DAYS = 2073600000D#;                 <<01.03>>07440000
      INTEGER  MSW = Q-5,  LSW = Q-4;  << RETURN VALUE >>               07442000
      LOGICAL WRAP := FALSE;                                            07444000
                                                                        07446000
      PUSH(STATUS);  TOS.(2:1) := 0;  SET(STATUS);                      07448000
      DISABLE;                                                          07450000
      TOS:=CLK;                        <<CLOCK DRT #>>                  07452000
T1:   TOS := %3711;                    <<RESET BAD READ, SELECT CR>>    07454000
      CONTROL;                                                          07456000
      READIO;                          <<READ COUNTER>>                 07458000
      TESTIO;                          <<GET STATUS>>                   07460000
      TOS.(9:1) := 0;                                                   07462000
      IF <> THEN                                                        07464000
      BEGIN                            <<BAD READ OCCURED>>             07466000
         DDEL;                                                          07468000
         GOTO T1;                      <<TRY AGAIN>>                    07470000
      END;                                                              07472000
                                                                        07474000
      IF NOT WRAP THEN                                                  07476000
         BEGIN <<LIMIT NOT CHECKED YET>>                                07478000
         IF TOS.(10:1) THEN                                             07480000
            BEGIN <<LR = CR>>                                           07482000
            WRAP := TRUE;                                               07484000
            DEL;                                                        07486000
            GO TO T1;                                                   07488000
            END;                                                        07490000
         END                                                            07492000
      ELSE                                                              07494000
         BEGIN                                                          07496000
         DEL; <<STATUS>>                                                07498000
         TOS := LR;                                            <<01147>>07500000
         IF =  THEN  TOS := TOS + 100;                         <<01147>>07502000
         ASMB(ADD);                                            <<01147>>07504000
         END;                                                           07506000
      ASMB( ZROB );                    << FORM DOUBLE >>                07508000
      << GET OVCR FROM TRL AND ADD TO COUNTER REGISTER TO >>   <<01.03>>07510000
      << COMPUTE CURRENT MSEC COUNT                       >>   <<01.03>>07512000
      TOS := TRL(5);  TOS := TRL(6);  ASMB( DADD );                     07514000
      ASMB(DDUP);  << SYS TIMER RESET EVERY 24 DAYS >>         <<01.03>>07516000
      IF TOS > TWENTY'FOUR'DAYS THEN                           <<01.03>>07518000
         TOS := TOS - TWENTY'FOUR'DAYS;                        <<01.03>>07520000
      LSW := TOS;  MSW := TOS.(1:15);  << RETURN VALUE >>               07522000
                                                                        07524000
END;  << T I M E R  >>                                                  07526000
                                                                        07528000
PROCEDURE ABORTTIMEREQ(TRLX);                                           07530000
VALUE TRLX;                                                             07532000
INTEGER TRLX;                                                           07534000
OPTION PRIVILEGED,UNCALLABLE;                                           07536000
                                                                        07538000
COMMENT: ABORTS THE TIMER REQUEST FOUND IN ENTRY TRLX. ENTRY IS RELEASED07540000
                                                                        07542000
      ;                                                                 07544000
                                                                        07546000
BEGIN                                                                   07548000
      INTEGER  S, T := 8;                                               07550000
                                                                        07552000
                                                                        07554000
      TRLX := TRLX&LSL(2);                                              07556000
      IF  =  THEN  RETURN;   << IGNORE ZERO FROM I/O SYSTEM >>          07558000
      IF NOT (%14 <= TRLX <= TRL(1)&LSR(6)) THEN                        07560000
         SUDDENDEATH(24);            <<INDEX BAD>>                      07562000
      DISABLE;                                                          07564000
      IF TRLX = TRL(0) THEN                                             07566000
         SUDDENDEATH(28);            <<RETURNING 1ST FREE?>>            07568000
      IF  TRL(TRLX) < 0  THEN                                           07570000
         BEGIN  << ACTIVE REQUEST >>                                    07572000
         WHILE  T <> TRLX  DO                                           07574000
            BEGIN                                                       07576000
            S := T;                                                     07578000
            T := TRL(S).(6:10);                                         07580000
            END;                                                        07582000
         TRL(S).(6:10) := TRL(T);         << DELINK >>                  07584000
         T := TRL(T).(6:10);                                            07586000
         IF  <>  THEN                                                   07588000
            BEGIN                                                       07590000
            TOS := TRL(TRLX+2);          << GET TIME >>                 07592000
            TOS := TRL(X:=X+1);                                         07594000
            TOS := TRL(T+2);                                            07596000
            TOS := TRL(X:=X+1);                                         07598000
            ASMB( DADD );                                               07600000
            TRL(X) := TOS;                                              07602000
            TRL(X:=X-1) := TOS;                                         07604000
            END;                                                        07606000
         END;                                                           07608000
      TRL(TRLX) := TRL(0);                                              07610000
      TOS := X;                                                         07612000
      TRL(0) := TOS;                                                    07614000
                                                                        07616000
                                                                        07618000
                                                                        07620000
      TRL(2):=%20000+TRLX;    <<TRACE>>                                 07622000
                                                                        07624000
                                                                        07626000
                                                                        07628000
END;  << A B O R T T I M E R E Q  >>                                    07630000
                                                                        07632000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               07634000
VALUE CODE,REQ,TIME;                                                    07636000
DOUBLE TIME;                                                            07638000
INTEGER CODE,REQ;                                                       07640000
OPTION UNCALLABLE,PRIVILEGED;                                           07642000
                                                                        07644000
COMMENT: SETS UP A TIME REQUEST.                                        07646000
         ACCEPTS TIME UP TO 2**32-1.                                    07648000
         MOST PRIORITARY REQUEST ALWAYS FIRST IN THE LIST.              07650000
                                                                        07652000
      ;                                                                 07654000
                                                                        07656000
BEGIN                                                                   07658000
      INTEGER  TRLX, S, T := 8;                                         07660000
      INTEGER  S0 = S-0, S1 = S-1;                                      07662000
      INTEGER  MST = Q-5, LST = Q-4;   << TIME >>                       07664000
                                                                        07666000
      TIME := TIME+100D;               << FIGURE TICKS >>               07668000
      TOS := 0;  TOS := MST;                                            07670000
      TOS := 100;                                                       07672000
      ASMB( LDIV );                                                     07674000
      TOS := LST;                                                       07676000
      TOS := 100;                                                       07678000
      ASMB( LDIV,DEL );                                                 07680000
      DISABLE;                                                          07682000
      TRLX := TRL(0);  << GET AN ENTRY >>                               07684000
      IF  =  THEN  SUDDENDEATH(3);                                      07686000
      IF NOT (%14 <= TRLX <= TRL(1)&LSR(6)) THEN                        07688000
         SUDDENDEATH(25);                                               07690000
      << if this is last TRL entry, report TABLE'FULL >>       <<02808>>07692000
      tos := TRL(TRLX);   << next TRL pointer >>               <<02808>>07694000
      if = then                                                <<02808>>07696000
        MPE'TABLE'FULL(4);  << 4 is timer req. list >>         <<02808>>07698000
      TRL(0) := tos;      << update next pointer >>            <<02808>>07700000
      TIMEREQ := TRLX&ASR(2);                                           07702000
      DO                                                                07704000
         BEGIN   << FIND POSITION IN LINE >>                            07706000
         S := T;                                                        07708000
         T := TRL(S).(6:10);                                            07710000
         TOS := TRL(S+2);                                               07712000
         TOS := TRL(X:=X+1);                                            07714000
         ASMB( DSUB );                                                  07716000
         END                                                            07718000
      UNTIL  T = 0  OR  S1 < TRL(T+2)  OR  =  AND  LOGICAL(S0) <        07720000
             LOGICAL(TRL(X:=X+1));                                      07722000
                                                                        07724000
      << BUILD ENTRY >>                                                 07726000
      IF REQ=0 THEN SUDDENDEATH(26);                                    07728000
      TIME := TOS;                                                      07730000
      TRL(TRLX) := %100000+CODE&LSL(10)+T;                              07732000
      TRL(X:=X+1) := REQ;                                               07734000
      TRL(X:=X+1) := MST;                                               07736000
      TRL(X:=X+1) := LST;                                               07738000
      TRL(S).(6:10) := TRLX;                                            07740000
                                                                        07742000
      << CHECK FOR TIME ADJUST IN T >>                                  07744000
      IF  T <> 0  THEN                                                  07746000
         BEGIN                                                          07748000
         TOS := TRL(T+2);                                               07750000
         TOS := TRL(X:=X+1);                                            07752000
         TOS := TOS-TIME;                                               07754000
         TRL(X) := TOS;                                                 07756000
         TRL(X:=X-1) := TOS;                                            07758000
         END;                                                           07760000
                                                                        07762000
                                                                        07764000
      << IF SIO TIMEOUT, DIT8.((CODE LAND %17):1) := 0 >>               07766000
      TOS := CODE;                                                      07768000
      TOS.(11:1) := 0;                                                  07770000
      IF = THEN DEL                                                     07772000
      ELSE                                                              07774000
         BEGIN << SIO TIMEOUT >>                                        07776000
         TOS := F(%1010+REQ);                                           07778000
         ASMB(XBX;                                                      07780000
              TRBC 0,X;                                                 07782000
              XCH,STAX;);                                               07784000
         F(X) := TOS;                                                   07786000
         END;                                                           07788000
                                                                        07790000
                                                                        07792000
                                                                        07794000
      TRL(2):=%10000+TRLX;           <<TRACE>>                          07796000
                                                                        07798000
                                                                        07800000
                                                                        07802000
END;  << T I M E R E Q  >>                                              07804000
                                                                        07806000
LOGICAL PROCEDURE CHEKTRLFREE;                             <<1.01>>     07808000
  OPTION PRIVILEGED,UNCALLABLE;                            <<1.01>>     07810000
COMMENT: RETURNS TRUE IF A TIMER REQUEST ENTRY IS FREE     <<1.01>>     07812000
         ELSE RETURNS FALSE                                <<1.01>>     07814000
;                                                          <<1.01>>     07816000
  BEGIN                                                    <<1.01>>     07818000
  CHEKTRLFREE:= IF TRL(0) <> 0 THEN TRUE ELSE FALSE;       <<1.01>>     07820000
  END;   << CHEKTRLFREE >>                                 <<1.01>>     07822000
                                                                        07824000
PROCEDURE STARTCLOCK(YEARDAY,TIMEDAY);                                  07826000
   VALUE   YEARDAY,TIMEDAY;                                             07828000
   INTEGER YEARDAY;                                                     07830000
   DOUBLE  TIMEDAY;                                                     07832000
   OPTION  PRIVILEGED,UNCALLABLE;                                       07834000
   << INITIALISES CLOCK AND PUTS YEAR/DAY/TIMEOFDAY IN TRL >>           07836000
   << CLOCK INTERRUPTS EVERY 100MS ,RATE IS 1MS >>                      07838000
   BEGIN                                                                07840000
   EQUATE MSK = %70210    ;  <<IMS,RESET CR,SELECT CLK/LR>>             07842000
   DEFINE FAIL    = BE *+3;LDI 2;PCAL SUDDENDEATH #,                    07844000
          CONTROL = ASSEMBLE(CIO 1;FAIL) #,                             07846000
          WRITE   = ASSEMBLE(WIO 1;FAIL) #;                             07848000
                                                                        07850000
   TOS := YEARDAY;        <<YEAR/DAY>>                                  07852000
   TRL(7) := TOS;                                                       07854000
   TOS := TIMEDAY;        <<TIME TO TRL>>                               07856000
   TRL(6) := TOS;                                                       07858000
   TRL(5) := TOS;                                                       07860000
   TOS := CLK;            <<MASTER CLEAR>>                              07862000
   TOS := %100000;                                                      07864000
   CONTROL;                                                             07866000
   TOS := MSK;            <<SET RATE>>                                  07868000
   CONTROL;                                                             07870000
   TOS := 100;            <<SET LR>>                                    07872000
   WRITE;                                                               07874000
   TOS := MSK+%100;        <<SET CR>>                                   07876000
   CONTROL;                                                             07878000
   TOS := 0;                                                            07880000
   WRITE;                                                               07882000
   TOS := MSK+%41;          <<INTERRUPTS ON>>                           07884000
   CONTROL;                                                             07886000
   END;  << S T A R T C L O C K  >>                                     07888000
PROCEDURE  OLDTICK;                                            <<01147>>07890000
OPTION PRIVILEGED,UNCALLABLE;                                  <<01147>>07892000
   BEGIN                                                       <<01147>>07894000
   EQUATE   DRQST = 6;                                         <<01147>>07896000
   DEFINE  SYS'PORTIMER = ABSOLUTE(%1121)#;                    <<HM.00>>07898000
   EQUATE  JUNKWAIT = %20,                                     <<HM.00>>07900000
           UCOPIN   = 2;                                       <<HM.00>>07902000
   INTEGER  QTIME = DB+4,                                      <<01147>>07904000
            HEAD = DB+8,                                       <<01147>>07906000
            S0 = S-0,                                          <<01147>>07908000
            REQ,                                               <<01147>>07910000
            CODE;                                              <<01147>>07912000
   INTEGER ARRAY TRL(*) = DB+0;                                <<01147>>07914000
   DOUBLE ARRAY  TRLD(*) = DB+0;                               <<01147>>07916000
   ARRAY  DITBIT(*) = PB :=                                    <<01147>>07918000
      %100000, %20000, %10000, %200, %20, 0, 0, %4000, 0, 2;   <<02006>>07920000
                                                               <<01147>>07922000
   X := HEAD&ASR(1);                                           <<01147>>07924000
   IF  <>  THEN                                                <<01147>>07926000
      BEGIN   << QUEUED REQUESTS >>                            <<01147>>07928000
      X := X+1;                                                <<01147>>07930000
      TRLD(X) := TRLD(X)-1D;                                   <<01147>>07932000
      TOS := HEAD;                                             <<01147>>07934000
      WHILE  <>  AND  TRLD(TOS&ASR(1)+1) <= 0D  DO             <<01147>>07936000
         BEGIN                                                 <<01147>>07938000
         TOS := TRLD(X:=X-1);   << GET VALUES >>               <<01147>>07940000
         IF S0=0 THEN SUDDENDEATH(27);                         <<01147>>07942000
         TRLD(X) := 0D;         << MARK DONE >>                <<01147>>07944000
         REQ := TOS;                                           <<01147>>07946000
         CODE := S0.(1:5);                                     <<01147>>07948000
         TRL(2) := %30000+HEAD;     << TRACE WORD >>           <<01147>>07950000
         HEAD := TOS.(6:10);     << DELINK >>                  <<01147>>07952000
         IF CODE = 5 THEN UNIMPEDE(REQ)                        <<01147>>07954000
         ELSE IF CODE = 8 THEN                                 <<HM.00>>07956000
            BEGIN  <<PORT TIMEOUT, AWAKEN UCOP>>               <<HM.00>>07958000
            TOS:=SYS'PORTIMER LOR LOGICAL(REQ&LSL(3));         <<HM.00>>07960000
            SYS'PORTIMER := TOS;  <<SET PORT MASK BIT>>        <<HM.00>>07962000
            AWAKE(SYSPROC(UCOPIN),JUNKWAIT,NOWAIT);            <<HM.00>>07964000
            END                                                <<HM.00>>07966000
         ELSE if CODE = %12 then << PCB watchdog timer >>      <<02808>>07968000
            AWAKE(REQ,TIMERWAIT,NOWAIT)                        <<02808>>07970000
         ELSE                                                  <<01147>>07972000
            BEGIN  << I/O TIMEOUT >>                           <<01147>>07974000
            X := %1000 + REQ;                                  <<01147>>07976000
            TOS := CODE;                                       <<01147>>07978000
            TOS.(11:1) := 0;                                   <<01147>>07980000
            IF <> THEN                                         <<01147>>07982000
               BEGIN << SIO DEVICE TIMEOUT >>                  <<01147>>07984000
               ABS(X).(8:1) := 1;  <<IAK  BIT>>                <<01147>>07986000
               X := X + 2;       <<SET DIT8>>                  <<01147>>07988000
               ASMB(XAX,ZERO; TSBC 0,X;);                      <<01147>>07990000
               END                                             <<01147>>07992000
            ELSE                                               <<01147>>07994000
               BEGIN << DIO DEVICE TIMEOUT >>                  <<01147>>07996000
               ASMB(XAX);                                      <<01147>>07998000
               TOS := DITBIT(X);                               <<01147>>08000000
               END;                                            <<01147>>08002000
            ASMB(XCH,STAX);                                    <<01147>>08004000
            X := X + DRQST;                                    <<01147>>08006000
            ABS(X) := TOS LOR ABS(X);                          <<01147>>08008000
            TOS := %1000D;  ASMB( XCHD 0 );  ENABLE;           <<01147>>08010000
            TOS:=REQ;                                          <<01147>>08012000
            AWAKEIO(*,0);                                      <<01147>>08014000
            ASMB( XCHD 0; DDEL );  DISABLE;                    <<01147>>08016000
            END;                                               <<01147>>08018000
         TOS := HEAD;                                          <<01147>>08020000
         END;                                                  <<01147>>08022000
      END;                                                     <<01147>>08024000
   ENABLE;                                                     <<01147>>08026000
   QTIME := QTIME-1;                                           <<01147>>08028000
   IF = THEN                                                   <<MPEIV>>08030000
      BEGIN <<TIME EXPIRED, POSSIBLY MEASURE EVENT>>           <<MPEIV>>08032000
      IF GCLASSENABLEDMASK.CLASS0 AND ABS(CPCB) <> 0 THEN      <<01859>>08034000
         BEGIN <<MEASURE>>                                     <<MPEIV>>08036000
         TOS:=MEASSTATXDSBANK;                                 <<MPEIV>>08038000
         TOS:=MEASSTATXDSBASE;                                 <<MPEIV>>08040000
         TOS:=TOS+C0SUB0'SEGRELOFF+C'STOPTIMEOUT;              <<MPEIV>>08042000
         ASMB(LSEA;INCA;SSEA;DDEL);                            <<MPEIV>>08044000
         END;                                                  <<MPEIV>>08046000
      << NEXT BLOCK OF CODE SUPPORTS MEASURMENT INTF >>        <<01970>>08048000
      TOS:=ABS(CPCB);                                          <<01970>>08050000
      IF <> THEN                                               <<01970>>08052000
         BEGIN << PROCESS RUNNING WHEN INTERRUPT OCCURED >>    <<01970>>08054000
         DEL;  << DUMP CPCB >>                                 <<01970>>08056000
         TOS:=ICS(-ICSSTKBANK);                                <<01970>>08058000
         TOS:=ICS(-ICSSTKBASE);                                <<01970>>08060000
         TOS:=TOS+PXGLOBSIZE+MEASSTOPREASON'IDX;               <<01970>>08062000
         ASMB(LSEA;DEL); << PROCESSES STOPREASON >>            <<01970>>08064000
         IF = THEN << PROCESS HAD NOT STOPPED FOR OTHER >>     <<02829>>08066000
            BEGIN   << REASON INCONJUNCTION WITH TIMING OUT >> <<01970>>08068000
            TOS:=STOPACTIVE;                                   <<01970>>08070000
            ASMB(SSEA;DDEL);                                   <<01970>>08072000
            IF GCLASSENABLEDMASK.CLASS15 THEN                  <<01970>>08074000
               BEGIN << BUMP TIMEOUT COUNTER >>                <<01970>>08076000
               TOS:=MEASPROCXDSBANK;                           <<01970>>08078000
               TOS:=MEASPROCXDSBASE;                           <<01970>>08080000
               TOS:=TOS+((ABS(CPCB)-ABS(PCBB))/PCBSIZE)*       <<01970>>08082000
                    CLASS15'SUB0SIZE+CP'STOPTIMEOUT;           <<01970>>08084000
               ASMB(LSEA;INCA;SSEA;DDEL);                      <<01970>>08086000
               END;                                            <<01970>>08088000
            END                                                <<01970>>08090000
         ELSE                                                  <<01970>>08092000
            ASMB(DDEL); << ICSSTKABNK, ICSSTKBASE >>           <<01970>>08094000
         END                                                   <<01970>>08096000
      ELSE                                                     <<01970>>08098000
         ASMB(DEL); << CPCB >>                                 <<01970>>08100000
      ASMB(DISP);                                              <<MPEIV>>08102000
      END;                                                     <<MPEIV>>08104000
    END;                                                       <<MPEIV>>08106000
 PROCEDURE TICK;                                               <<DK.40>>08108000
                                                               <<DK.40>>08110000
 << THIS IS A SYSTEM CLOCK INTERRUPT HANDLER  >>               <<DK.40>>08112000
 << WHEN ENTER, DB IS SET AT TRL BASE.        >>               <<DK.40>>08114000
                                                               <<DK.40>>08116000
 OPTION PRIVILEGED, UNCALLABLE, INTERRUPT;                     <<DK.40>>08118000
 BEGIN                                                         <<DK.40>>08120000
                                                               <<DK.40>>08122000
    EQUATE   ONE'YEAR = [7/1,9/0];                             <<DK.40>>08124000
    DEFINE   FLAG = ABS(CLK'TAB'BASE)#,                        <<DK.40>>08126000
        LEAP'YEAR = DATE.(5:2) = 0#,                           <<DK.40>>08130000
 TWENTY'FOUR'DAYS = 2073600000D#,                              <<DK.40>>08132000
           TESTIO = ASMB(TIO 0;BE *+3;LDI 7;PCAL SUDDENDEATH)#,<<DK.40>>08134000
          CONTROL = ASMB(CIO 1;BE *+3;LDI 7;PCAL SUDDENDEATH)#,<<DK.40>>08136000
          WRITEIO = ASMB(WIO 1;BE *+3;LDI 7;PCAL SUDDENDEATH)#;<<DK.40>>08138000
    INTEGER  DATE = DB + 7,                                    <<DK.40>>08140000
             I, DAY, DAYS'THIS'YEAR,                           <<DK.40>>08142000
             CLK'TAB'BASE;                                     <<DK.40>>08144000
    DOUBLE   DTIME = DB + 5;                                   <<DK.40>>08146000
                                                               <<DK.40>>08150000
    TOS := CLK;                                                <<DK.40>>08152000
    TESTIO;                                                    <<DK.40>>08154000
    TOS := TOS&LSR(2);                    << CHECK FOR SIN >>  <<DK.40>>08156000
    IF  TOS  THEN                                              <<DK.40>>08158000
    BEGIN                                                      <<DK.40>>08160000
       ASMB(DISP);                                             <<DK.40>>08162000
       TOS := %1611;                                           <<DK.40>>08164000
       GOTO  RESETCLK;                                         <<DK.40>>08166000
    END;                                                       <<DK.40>>08168000
                                                               <<DK.40>>08170000
    DISABLE;                                                   <<DK.40>>08172000
    TOS := 0;                                                  <<DK.40>>08174000
    TOS := LR;                  << FIND INTERRUPT RATE >>      <<DK.40>>08176000
    IF  =  THEN  TOS := TOS + 100;                             <<DK.40>>08178000
    DTIME := DTIME + TOS;                                      <<DK.40>>08180000
    IF  DTIME >= TWENTY'FOUR'DAYS  THEN                        <<DK.40>>08182000
    << RESET DTIME TO THE NUMBER OF MS PAST 24 DAYS >>         <<DK.40>>08184000
    << THE BASE JULIAN DATE MUST BE INCREMENTED BY 24 DAYS >>  <<DK.40>>08186000
    << AND THE YEAR CHANGED IF THE JULIAN DATE ROLLS PAST  >>  <<DK.40>>08188000
    << 365 DAYS(OR 365 IF LEAP YEAR).                      >>  <<DK.40>>08190000
    BEGIN                                                      <<DK.40>>08192000
       DTIME := DTIME - TWENTY'FOUR'DAYS;                      <<DK.40>>08194000
       DAYS'THIS'YEAR := IF  LEAP'YEAR  THEN  366  ELSE  365;  <<DK.40>>08196000
       IF  (DAY:=DATE.(7:9)+24) > DAYS'THIS'YEAR  THEN         <<DK.40>>08198000
       BEGIN                                                   <<DK.40>>08200000
          DAY := DAY - DAYS'THIS'YEAR;                         <<DK.40>>08202000
          DATE := DATE + ONE'YEAR;                             <<DK.40>>08204000
       END;                                                    <<DK.40>>08206000
       DATE.(7:9) := DAY;                                      <<DK.40>>08208000
    END;                                                       <<DK.40>>08210000
                                                               <<DK.40>>08212000
    TOS := %250;                                               <<DK.40>>08214000
    CONTROL;                                                   <<DK.40>>08216000
                                                               <<DK.40>>08218000
    CLK'TAB'BASE := ABS(%1261)+%1070; << GET DATA TABLE BASE >><<DK.40>>08220000
    IF  TLIMIT <> 0  THEN                                      <<DK.40>>08222000
    BEGIN    << SOMEONE IS USING THE SHARED CLOCK INTERFACE >> <<DK.40>>08224000
    TCOUNT := TCOUNT - 1;                                      <<04315>>08226000
    IF  TCOUNT <= 0  THEN                                      <<04315>>08228000
       BEGIN                                                   <<DK.40>>08230000
          TCOUNT := TLIMIT;                                    <<DK.40>>08232000
          OLDTICK;                                             <<DK.40>>08234000
          IF LR = 0 AND INTEGER ( DLABEL) < 0 THEN             <<04117>>08236000
          BEGIN                                                <<DK.40>>08238000
             TOS := 100/TLIMIT;                                <<DK.40>>08240000
             LR := S0.(1:15);  << STORE INTERRUPT INTERVAL >>  <<DK.40>>08242000
             WRITEIO;                                          <<DK.40>>08244000
          END  ELSE                                            <<DK.40>>08246000
          IF LR > 0 AND INTEGER ( DLABEL ) >= 0 THEN           <<04117>>08248000
          BEGIN                                                <<DK.40>>08250000
             TOS := 100;                                       <<DK.40>>08252000
             WRITEIO;                                          <<DK.40>>08254000
             LR := 0;                                          <<DK.40>>08256000
             FOR I:= 59 UNTIL 62  DO  MEASINFOTABPTR(I) := 0;  <<DK.40>>08258000
             GOTO  EXIT;                                       <<DK.40>>08260000
          END;                                                 <<DK.40>>08262000
       END;                                                    <<DK.40>>08264000
       DCOUNT := DCOUNT -1;                                    <<04315>>08266000
       IF  DCOUNT <= 0  THEN                                   <<04315>>08268000
       BEGIN                                                   <<DK.40>>08270000
          IF  NOT FLAG  THEN                                   <<DK.40>>08272000
          BEGIN                                                <<DK.40>>08274000
             TOS := IF  FLAG < 0  THEN  1  ELSE  0;            <<DK.40>>08276000
             TOS := DLABEL;                                    <<04117>>08278000
             IF  INTEGER(DLABEL) < 0  THEN                     <<04315>>08280000
             BEGIN                                             <<DK.40>>08282000
                ENABLE;                                        <<DK.40>>08284000
                FLAG := 1;                                     <<DK.40>>08286000
                ASMB(PCAL 0);                                  <<DK.40>>08288000
                DCOUNT := DLIMIT;                              <<DK.40>>08290000
                DISABLE;                                       <<DK.40>>08292000
             END  ELSE  ASMB(DDEL);                            <<DK.40>>08294000
             FLAG := 0;                                        <<DK.40>>08296000
        END ELSE FLAG := FLAG LOR %100000;                     <<04315>>08298000
       END;                                                    <<DK.40>>08300000
    END  ELSE  OLDTICK;                                        <<DK.40>>08302000
                                                               <<DK.40>>08304000
 EXIT:                                                         <<DK.40>>08306000
    TOS := CLK;                                                <<DK.40>>08308000
    TOS := %251;                                               <<DK.40>>08310000
 RESETCLK:                                                     <<DK.40>>08312000
    CONTROL;                                                   <<DK.40>>08314000
 END;                                                          <<DK.40>>08316000
                                                               <<DK.40>>08318000
PROCEDURE HELP;                                                         08320000
    OPTION PRIVILEGED, UNCALLABLE;                                      08322000
<<                                                                      08324000
   MPE/30 STANDALONE DEBUGGING PROCEDURE.                               08326000
   THE FOLLOWING QUANTITIES ARE ASSUMED TO BE DEFINED OUTSIDE           08328000
   THIS PROCEDURE:                                                      08330000
        DISABLE = ASMB(SED 0)#, ASMB = ASSEMBLE#, AND                   08332000
        F = ABSOLUTE#.                                                  08334000
>>                                                                      08336000
BEGIN                                                                   08338000
DEFINE  TIO = ASMB( CON %030240; BL *-1 )#, << I/O INSTS >>             08340000
        WIO = ASMB( CON %030221; BNE *-1 )#,                            08342000
        RIO = ASMB( CON %030200; BNE *-1 )#,                            08344000
        CIO = ASMB( CON %030261; BL *-1 )#,                             08346000
        DRT = 3#,   << DRT FOR CLOCK/TTY >>                             08348000
        CST'SIZE = 4#,                                                  08350000
        LDAD = ASMB( LSEA )#,                                           08352000
        STAD = ASMB( SSEA )#;                                           08354000
                                                                        08356000
EQUATE MAX'ADDR'DIG =  7;                                      <<01323>>08358000
  << MAX # OF DIGITS WHICH CAN BE INPUT AS AN OCTAL INTEGER >> <<01323>>08360000
  << OR WILL BE OUTPUT AS AN ADDRESS                        >> <<01323>>08362000
EQUATE MAX'BPTS = 10,  << NUMBER OF ENTRIES IN TABLE >>        <<01323>>08364000
       TABLE'SIZE = MAX'BPTS * 6;                              <<01323>>08366000
DEFINE NUM'BPTS = BPTAB(TABLE'SIZE+1)#;                        <<01323>>08368000
  << THE LAST WORD OF THE BREAK POINT TABLE COUNTS THE >>      <<01323>>08370000
  << NUMBER OF BREAK POINTS.                           >>      <<01323>>08372000
                                                               <<01323>>08374000
ARRAY BP'TAB(*) = PB := TABLE'SIZE(0),-1,0;                    <<01323>>08376000
<< THIS ARRAY HOLDS THE INFORMATION REQUIRED FOR BREAKPOINTS.           08378000
   EACH ENTRY IN THE TABLE IS 6 WORDS LONG. THE TABLE IS                08380000
   ENDED WITH A -1. IT MAY BE EXTENDED BY  CHANGING THE NUMBER          08382000
   OF INITIALIZATION ZEROS IN THE ABOVE DECLARATION. THE WORDS          08384000
   IN  A TABLE ENTRY ARE USED AS FOLLOWS:                               08386000
                                                                        08388000
   WORD0.(0:8) =  0    EMPTY TABLE ENTRY                                08390000
                  1    USER SET BREAKPOINT                              08392000
                  2    "FAKE" BREAKPOINT                                08394000
                                                                        08396000
   WORD0.(8:8) =       CST FOR THE BREAKPOINT. IF ZERO THEN             08398000
                       THIS TABLE ENTRY IS FREE.                        08400000
                                                                        08402000
   WORD1       =       PB RELATIVE ADDRESS FOR THE BREAKPOINT. IF       08404000
                       ZERO THEN THE ENTRY IS FREE.                     08406000
                                                                        08408000
   WORD2       =       SAVED INSTRUCTION  IF A BREAKPOINT IS SET.       08410000
                                                                        08412000
   WORD3.(0:8) =       RELATIONAL OPERATOR FOR THE CONDITIONAL          08414000
                  0    NO CONDITION ATTACHED                            08416000
                  1    COUNT ATTACHED                                   08418000
                  2    <                                                08420000
                  3    =                                                08422000
                  4    >                                                08424000
                  5    #                                                08426000
                                                                        08428000
   WORD3.(8:8) =       BANK FOR COMPARISON ADDRESS                      08430000
                                                                        08432000
   WORD4       =       REST OF THE COMPARISON ADDRESS                   08434000
                                                                        08436000
   WORD5       =       COMPARISON CONSTANT                              08438000
>>                                                                      08440000
                                                                        08442000
INTEGER ARRAY  BPTAB(*) = DB+0;  << BREAKPOINT TABLE >>                 08444000
BYTE ARRAY INPUT(0:39) = Q;  << HOLDS COMMAND STRING INPUT >>           08446000
                                                                        08448000
BYTE ARRAY IO(0:MAX'ADDR'DIG+9) = Q;  << OUTPUT BUFFER >>      <<01323>>08450000
INTEGER ARRAY  WRDIO(*) = IO;  << OVERLAY FOR ABOVE >>                  08452000
                                                                        08454000
EQUATE NUM'CMNDS = 7;                                          <<01323>>08456000
INTEGER ARRAY COMM(*) = PB := %102,%103,%104,%115,%122,%121,   <<01323>>08458000
                              %114;                            <<01323>>08460000
<< OCTAL VALUES OF THE CHARACTER COMMANDS >>                            08462000
                                                                        08464000
INTEGER ARRAY  REL(*) = PB := %74,%75,%76,%43;                          08466000
<<  THE ABOVE ARE THE ALLOWABLE RELATIONAL OPERATORS >>                 08468000
                                                                        08470000
INTEGER ARRAY  PRE(*) = PB := "HELP    . ";                             08472000
INTEGER POINTER IOQP = 5;                                               08474000
                                                                        08476000
DOUBLE  P1, P2,   << PARAMETERS FOR COMMANDS >>                         08478000
        OLDDB,    << CALLERS DB >>                                      08480000
        K,  << TEMPORARY VARIABLE >>                                    08482000
        DS4 = S-4,   << S RELATIVE TEMPS >>                             08484000
        DS5 = S-5,                                                      08486000
        DS1 = S-1;                                                      08488000
                                                                        08490000
LOGICAL  P2F,   << SET IF 2ND PARAMETER EXISTS >>                       08492000
         REG;   << SET IF A REGISTER APPEARS IN PRI' >>                 08494000
                                                                        08496000
INTEGER  X = X,   << DEFINE REGISTERS AND TOS VARIABLES >>              08498000
         S0 = S-0,                                                      08500000
         S1 = S-1,                                                      08502000
         S2 = S-2,                                                      08504000
         S3 = S-3,                                                      08506000
         S4 = S-4,                                                      08508000
         S5 = S-5,                                                      08510000
         S7 = S-7,                                                      08512000
         TOKEN,  << OUTPUT OF CHAR SUBROUTINE >>                        08514000
         INPNTR, << INDEX TO FETCH NEXT CHAR FROM CMND STRING >>        08516000
         I, J, L,  << TEMPORARY VARIABLES >>                            08518000
         OLDS,  << S VALUE TO RESET IN FAIL >>                          08520000
         COM,  << COMMAND # >>                                          08522000
         CST,  << CST VALUE FOR B AND C COMMANDS >>                     08524000
         P,  << P VALUE FOR ABOVE >>                                    08526000
         CLKCR,  << CR FROM CLOCK BOARD >>                              08528000
         CPUCLK,  << CPU CLOCK >>                                       08530000
         SMP = Q-2,  << P FROM STACK MARKER >>                          08532000
         SMSTA = Q-1;  << STATUS FROM STACK MARKER >>                   08534000
                                                                        08536000
                                                                        08538000
SUBROUTINE  PRINT(C);                                                   08540000
   VALUE C; INTEGER C;                                                  08542000
<<                                                                      08544000
THIS SUBROUTINE PRINTS THE I/O BUFFER (IO) ON THE TELETYPE.             08546000
C IS A COUNT. ITS ABSOLUTE VALUE IS THE NUMBER OF CHARACTERS            08548000
TO PRINT. IF C >= 0, THEN THE LINE WILL BE FOLLOWED BY A                08550000
RETURN-LINEFEED.                                                        08552000
>>                                                                      08554000
   BEGIN                                                                08556000
   TOS := DRT;  TOS := %22;  CIO;  << RESET TTY >>                      08558000
   X := 0;                                                              08560000
   WHILE  X < \S2\  DO                                                  08562000
      BEGIN  << PRINT A CHARACTER >>                                    08564000
      TOS := IO(X);                                                     08566000
      WIO;                                                              08568000
      DO  TIO  UNTIL  TOS.(7:1);  << WAIT FOR PRINT >>                  08570000
      X := X+1;                                                         08572000
      END;                                                              08574000
   DEL;  << DRT# FROM THE STACK >>                                      08576000
                                                                        08578000
   IF  C >= 0  THEN                                                     08580000
      BEGIN  << PRINT A CR, LF >>                                       08582000
      WRDIO := [8/%15,8/%12];                                           08584000
      X := 4;  WHILE > DO BEGIN WRDIO(X) := -1; X :=X-1; END;           08586000
      PRINT(-10);     << PRINT IT >>                                    08588000
      END;                                                              08590000
   END;                                                                 08592000
                                                                        08594000
SUBROUTINE  FAIL;                                                       08596000
<<                                                                      08598000
THIS IS CALLED ON A COMMAND FAILURE. IT CUTS THE STACK                  08600000
BACK AS NEEDED AND RETURNS TO THE COMMAND INPUT LOOP.                   08602000
>>                                                                      08604000
    BEGIN                                                               08606000
    WRDIO := "??";                                                      08608000
    PRINT( 2 );  << PRINT ERROR INDICATION >>                           08610000
    TOS := OLDS;  << RESET S AS REQUIRED >>                             08612000
    SET (  S  );                                                        08614000
    GO COMIN;                                                           08616000
    END;                                                                08618000
                                                                        08620000
                                                                        08622000
SUBROUTINE GETINPUT;                                                    08624000
                                                                        08626000
  << READ COMMAND INTO INPUT BUFFER, INPUT.  FIRST CHARACTER OF         08628000
     COMMAND IS PUT INTO TOKEN AND A LF IS OUTPUT ON THE CR.            08630000
     CONTROL H AND X ARE PROCESSED IN THIS ROUTINE.                     08632000
  >>                                                                    08634000
                                                                        08636000
  BEGIN                                                                 08638000
   I := 0;                                                              08640000
   TOS := DRT;  << TTY/CLK DRT# >>                                      08642000
                                                                        08644000
READL:                                                                  08646000
   DO  TIO  UNTIL  TOS.(6:1);  << WAIT FOR A CHAR >>                    08648000
   RIO;  << READ IT AND SAVE IT IN TOKEN >>                             08650000
   TOKEN := TOS.(9:7);                                                  08652000
   IF  TOKEN = " "  THEN  GOTO READL;                                   08654000
                                                                        08656000
   IF TOKEN=%10 THEN  << CONTROL H, DELETE A CHARACTER >>               08658000
     BEGIN                                                              08660000
       IF I>0 THEN  << SOMETHING TO DELETE >>                           08662000
         BEGIN                                                          08664000
           I := I - 1;                                                  08666000
           IO := "\";    PRINT(-1);                                     08668000
         END;                                                           08670000
       GOTO READL;   << GET NEXT CHARACTER >>                           08672000
     END;                                                               08674000
                                                                        08676000
   IF TOKEN=%30 THEN  << CONTROL X, DELETE THE LINE >>                  08678000
     BEGIN                                                              08680000
       I := 0;                                                          08682000
       WRDIO := "!!";   IO(2) := "!";                                   08684000
       PRINT(3);                                                        08686000
       GOTO READL;   << GET NEXT CHARACTER >>                           08688000
     END;                                                               08690000
                                                                        08692000
   IF I>=40 THEN FAIL;   << OVERFLOW BUFFER >>                          08694000
   INPUT(I) := TOKEN;     I := I + 1;                                   08696000
   IF TOKEN<>%15 THEN GOTO READL;  << NOT A CR, GET NEXT CHARACTER >>   08698000
                                                                        08700000
   I := 0;                                                              08702000
   DEL;  << DRT # >>                                                    08704000
   INPNTR := 1;   TOKEN := INPUT;                                       08706000
   PRINT(0);    << CR/LF >>                                             08708000
  END;   << GET INPUT >>                                                08710000
                                                                        08712000
                                                                        08714000
SUBROUTINE  CHAR;                                                       08716000
<<                                                                      08718000
THIS SUBROUTINE GETS A CHARACTER FROM THE INPUT BUFFER AND PLACES       08720000
IT IN TOKEN.                                                            08722000
>>                                                                      08724000
   BEGIN                                                                08726000
     TOKEN := INPUT(INPNTR);                                            08728000
     INPNTR := INPNTR + 1;                                              08730000
   END;                                                                 08732000
                                                                        08734000
SUBROUTINE  NUMOUT( N, L, S );                                          08736000
   VALUE  N,L,S;                                                        08738000
   DOUBLE N;                                                            08740000
   INTEGER L,S;                                                         08742000
<<                                                                      08744000
N IS THE NUMBER TO PRINT. L IS THE LOCATION IN IO TO PLACE IT.          08746000
S IS THE SIZE IN CHARACTERS FOR THE CONVERTED NUMBER.                   08748000
>>                                                                      08750000
   BEGIN                                                                08752000
   X := L+S;  << SET UP THE INDEX >>                                    08754000
   TOS := N;  << GET NUMBER >>                                          08756000
   DO                                                                   08758000
      BEGIN  << CONVERT ONE DIGIT >>                                    08760000
      X := X-1;                                                         08762000
      ASMB( DUP );                                                      08764000
      IO(X) := (TOS LAND 7) LOR %60;                                    08766000
      TOS := TOS&DASR(3);                                               08768000
      END                                                               08770000
   UNTIL  S4 = X;                                                       08772000
   DDEL;  << DELETE N'S REMAINS >>                                      08774000
   END;                                                                 08776000
                                                                        08778000
DOUBLE SUBROUTINE OCTINT;                                               08780000
<<                                                                      08782000
COMPUTES AND RETURNS AN OCTAL INTEGER. THE INTEGER MUST                 08784000
HAVE BETWEEN 1 AND 6 DIGITS INCLUSIVE                                   08786000
>>                                                                      08788000
   BEGIN                                                                08790000
   L := 0;  << ZERO THE DIGIT COUNTER >>                                08792000
   TOS := 0D;  << INITIAL VALUE OF OCTINT >>                            08794000
   WHILE  %60 <= TOKEN <= %67  DO                                       08796000
      BEGIN  << GET A DIGIT >>                                          08798000
      L := L+1;                                                         08800000
      TOS := TOS&DCSL(3);                                               08802000
      TOS := 0;   << FORM DOUBLE VALUE FOR NEW DIGIT >>                 08804000
      TOS := TOKEN-%60;                                                 08806000
      ASMB( DADD );                                                     08808000
      CHAR;  << GET THE NEXT CHARACTER >>                               08810000
      END;                                                              08812000
   IF NOT( 1 <= L <= MAX'ADDR'DIG) THEN FAIL; <<TOO MANY/FEW>> <<01323>>08814000
   DS4 := TOS;  << RETURN THE VALUE >>                                  08816000
   END;                                                                 08818000
                                                                        08820000
DOUBLE SUBROUTINE NUMBER;                                               08822000
<<                                                                      08824000
COMPUTES A SIGNED NUMBER                                                08826000
>>                                                                      08828000
   IF  TOKEN = "-"  THEN                                                08830000
      BEGIN                                                             08832000
      CHAR;  << GET NEXT >>                                             08834000
      NUMBER := -OCTINT;                                                08836000
      END                                                               08838000
   ELSE                                                                 08840000
      BEGIN                                                             08842000
      IF  TOKEN = "+"  THEN  CHAR;  << IGNORE IT >>                     08844000
      NUMBER := OCTINT;                                                 08846000
      END;                                                              08848000
                                                                        08850000
DOUBLE SUBROUTINE CST'ADDR( CST );                                      08852000
   VALUE CST; INTEGER CST;                                              08854000
<<                                                                      08856000
COMPUTES THE BASE ADDRESS FOR A SEGMENT GIVEN THE CST.                  08858000
FAILS IF THE SEGMENT IS ABSENT                                          08860000
>>                                                                      08862000
   BEGIN                                                                08864000
   IF  F(F(0)) < CST  THEN  FAIL;  << ILLEGAL CST >>                    08866000
   X := X+CST*CST'SIZE;                                                 08868000
   IF  F(X) < 0  THEN  FAIL;  << ABSENT, ERROR >>                       08870000
   TOS:=ABSOLUTE(X:=X+2);                                      <<01773>>08872000
   TOS := F(X:=X+1);  << GET ADDRESS IN THE BANK >>                     08874000
   DS5 := TOS;  << RETURN THE VALUE >>                                  08876000
   END;                                                                 08878000
                                                                        08880000
DOUBLE SUBROUTINE PRI';                                                 08882000
<<                                                                      08884000
COMPUTES A PRI, SEE DOCUMENTATION FOR DEFINITION                        08886000
>>                                                                      08888000
   IF  "D" <= TOKEN <= "Z"  THEN                                        08890000
      BEGIN << A REGISTER IS GIVEN >>                                   08892000
      REG := TRUE;                                                      08894000
      PUSH(SBANK);  << GET THE STACK BANK >>                            08896000
      PUSH( DB );                                                       08898000
      DELB;   << GET RID OF DB BANK >>                                  08900000
      IF  TOKEN = "D"  THEN                                             08902000
         BEGIN  << DL OR DB >>                                          08904000
         CHAR;  << GET THE B OR L >>                                    08906000
         IF  TOKEN = "B"  THEN                                          08908000
            BEGIN  << DB >>                                             08910000
            DDEL;  << CUT DB AND SBANK >>                               08912000
            TOS := OLDDB;                                               08914000
            TOS := 0;   << DB REL DB >>                                 08916000
            END                                                         08918000
         ELSE  IF  TOKEN  = "L"  THEN  PUSH( DL )                       08920000
         ELSE  FAIL;  << ILLEGAL REGISTER GIVEN >>                      08922000
         END                                                            08924000
      ELSE                                                              08926000
         BEGIN                                                          08928000
         IF  TOKEN = "Q"  THEN                                          08930000
            BEGIN  << Q >>                                              08932000
            PUSH( Q );  << GET Q >>                                     08934000
            TOS := TOS+TOS;   << MAKE ABSOLUTE Q >>                     08936000
            LDAD;  << GET DELTA Q FROM MARKER >>                        08938000
            TOS := -TOS;  << BUILD USER'S Q >>                          08940000
            END                                                         08942000
         ELSE  IF  TOKEN = "S"  THEN                                    08944000
            BEGIN  << S >>                                              08946000
            PUSH( Q );                                                  08948000
            TOS := TOS-4;                                               08950000
            END                                                         08952000
         ELSE  IF  TOKEN = "Z"  THEN  PUSH( Z )                         08954000
         ELSE  FAIL;                                                    08956000
         END;                                                           08958000
      CHAR;  << SCAN OFF THE REGISTER >>                                08960000
      TOS := TOS+TOS;   << CHANGE DB REL TO ABS >>                      08962000
      DS4 := TOS;  << RETURN THE VALUE >>                               08964000
      END                                                               08966000
   ELSE                                                                 08968000
      PRI' := NUMBER;                                                   08970000
                                                                        08972000
DOUBLE SUBROUTINE SEXP;                                                 08974000
<<                                                                      08976000
COMPUTES A <SEXP>                                                       08978000
>>                                                                      08980000
   BEGIN                                                                08982000
   REG := FALSE;                                                        08984000
   TOS := PRI';  << GET A <PRI> >>                                      08986000
L: IF  TOKEN = "+"  THEN                                                08988000
      BEGIN                                                             08990000
      CHAR;  << SCAN OFF + >>                                           08992000
      TOS := PRI'; IF REG THEN  ASMB(DELB,ADD)  ELSE  ASMB(DADD);       08994000
      GO L;                                                             08996000
      END;                                                              08998000
   IF  TOKEN = "-"  THEN                                                09000000
      BEGIN                                                             09002000
      CHAR;  << SCAN OFF THE - >>                                       09004000
      TOS := PRI'; IF REG THEN  ASMB(DELB,SUB)  ELSE  ASMB(DSUB);       09006000
      GO L;                                                             09008000
      END;                                                              09010000
   IF  TOKEN = "I"  THEN                                                09012000
      BEGIN  << INDIRECT >>                                             09014000
      CHAR;  << SCAN OFF THE I >>                                       09016000
      LDAD;  << GET THE ADDRESS' CONTENTS >>                            09018000
      DELB; DELB;  << CUT ADDRESS >>                                    09020000
      IF  REG  THEN  ASMB(LDD OLDDB; CAB,ADD)  ELSE                     09022000
      ASMB( ZERO,XCH );  << FORM A DOUBLE >>                            09024000
      GO L;                                                             09026000
      END;                                                              09028000
   DS4 := TOS;                                                          09030000
   END;                                                                 09032000
                                                                        09034000
DOUBLE SUBROUTINE  EXP;                                                 09036000
<<                                                                      09038000
COMPUTES A <EXP>                                                        09040000
>>                                                                      09042000
   BEGIN                                                                09044000
   TOS := SEXP;                                                         09046000
   IF  TOKEN = "."  THEN                                                09048000
      BEGIN                                                             09050000
      ASMB( DUP );                                                      09052000
      CST := S0;                                                        09054000
      CHAR;                                                             09056000
      TOS := CST'ADDR(*);                                               09058000
      TOS := SEXP;                                                      09060000
      P := S0;                                                          09062000
      ASMB(DADD);                                                       09064000
      END;                                                              09066000
   DS4 := TOS;                                                          09068000
   END;                                                                 09070000
                                                                        09072000
LOGICAL SUBROUTINE FIND;                                                09074000
<<                                                                      09076000
THIS SUBROUTINE IS USED TO FIND ENTRIES IN THE BP'TAB. IT               09078000
RETURNS TRUE ON A SUCCESSFUL FIND. ON SUCCESS, I IS SET                 09080000
TO THE 16 BIT INDEX OF THE FIRST WORD OF THE TABLE ENTRY.               09082000
>>                                                                      09084000
   BEGIN                                                                09086000
   I := X := 0;                                                         09088000
   DO                                                                   09090000
      IF  BPTAB(X).(8:8) = CST  AND  BPTAB(X:=X+1) = P THEN             09092000
         BEGIN  FIND := TRUE;  RETURN;  END                             09094000
   UNTIL  BPTAB(I:=I+6) = -1;                                           09096000
   END;                                                                 09098000
                                                                        09100000
SUBROUTINE  IMPCST;                                                     09102000
<<                                                                      09104000
CHECKS FOR AN IMPLIED CST IN THE C OR B COMMANDS                        09106000
>>                                                                      09108000
   IF  CST = 0  THEN                                                    09110000
      BEGIN  << IMPLIED CST >>                                          09112000
      CST := SMSTA.(8:8);                                               09114000
      TOS := P1;  DELB;  P := TOS;                                      09116000
      END;                                                              09118000
                                                                        09120000
SUBROUTINE CLEAR;                                                       09122000
<<                                                                      09124000
THIS SUBROUTINE IS CALLED TO CLEAR A BREAKPOINT                         09126000
>>                                                                      09128000
   BEGIN                                                                09130000
   IMPCST;                                                              09132000
   IF  FIND  THEN                                                       09134000
      BEGIN  << ONE EXISTS, ZAP IT >>                                   09136000
      TOS := CST'ADDR( CST )+DOUBLE( P );                               09138000
      BPTAB(I) := 0;                                                    09140000
      BPTAB(X:=X+1) := 0;                                               09142000
      TOS := BPTAB(X:=X+1);  << GET THE INSTRUCTION >>                  09144000
      STAD;  << RESTORE IT IN THE CODE >>                               09146000
      DDEL;                                                             09148000
                                                               <<01323>>09150000
      NUM'BPTS := NUM'BPTS - 1;                                <<01323>>09152000
                                                               <<01323>>09154000
      P := P+1;  << TAKE OUT A POSSIBLE FAKE >>                         09156000
      IF  FIND  AND  BPTAB(I).(0:8) = 2  THEN  CLEAR;                   09158000
      P := P-1;                                                         09160000
      END                                                               09162000
   ELSE  FAIL;                                                          09164000
   END;                                                                 09166000
                                                                        09168000
SUBROUTINE BREAK( A );                                                  09170000
   VALUE A; INTEGER A;                                                  09172000
<<                                                                      09174000
THIS ROUTINE PUTS IN BREAK POINTS. THE A PASSED IS THE TYPE             09176000
OF BREAKPOINT.                                                          09178000
>>                                                                      09180000
COMMENT                                                        <<01323>>09182000
   BECAUSE A FAKE BREAK POINT IS SET WHENEVER HELP IS ENTERED  <<01323>>09184000
   VIA A USER SET BREAK POINT, THERE MUST BE AT LEAST ONE      <<01323>>09186000
   FREE ENTRY AFTER A USER BREAK POINT IS SET TO ACCOMODATE    <<01323>>09188000
   THE FAKE BREAK POINT.                                       <<01323>>09190000
;                                                              <<01323>>09192000
                                                               <<01323>>09194000
   BEGIN  << TABLE ENTRY WILL BE BUILT ON THE STACK >>                  09196000
   IMPCST;                                                              09198000
   TOS := 0;  << INITIALIZE THE CONSTANT >>                             09200000
   TOS := P2;  << GET THE ADDRESS FOR THE TEST >>                       09202000
   ASMB( XCH );  << REVERSE THE ADDRESS FOR AS WANTED >>                09204000
   IF  P < 0  OR  FIND  THEN  FAIL;  << BAD P OR ALREADY EXISTS >>      09206000
   K := TOS := CST'ADDR( CST )+DOUBLE( P );                             09208000
   LDAD;  << GET THE INSTRUCTION TO REPLACE >>                          09210000
                                                                        09212000
   IF  S7 = 1  THEN   << A IS NOW AT S7 >>                              09214000
      BEGIN  << USER BREAKPOINT, CHECK INSTRUCTION >>                   09216000
      IF  S0.(0:4) = %14   THEN  FAIL;  << BRANCHES >>                  09218000
      IF  S0.(0:4) = 3  AND  1<=S0.(4:4)<=4 THEN FAIL;                  09220000
      IF  S0.(0:4) = 1  THEN                                            09222000
         BEGIN  << CHECK WHICH ONES >>                                  09224000
         TOS := %117001703D;                                            09226000
         TOS := TOS&DCSL(S2.(5:5));                                     09228000
         IF  <  THEN  FAIL;                                             09230000
         DDEL;  << KICK OFF MAGIC CONSTANT >>                           09232000
         END;                                                           09234000
      << GETTING TO THIS POINT SAYS IT IS O.K. >>                       09236000
      END;                                                              09238000
                                                                        09240000
   ASMB( CAB,CAB );  << PUT ADDRESS ABOVE INSTRUCTION >>                09242000
   TOS := TOS-DOUBLE(P)+DOUBLE(F(F(0)+CST*CST'SIZE).(4:12)*4)-1D;       09244000
   << THE ABOVE MONSTER IS THE ADDRESS OF PL >>                         09246000
   << CHECK FOR P IN BOUNDS >>                                          09248000
   IF  K > DS1  THEN  FAIL;                                             09250000
   LDAD;  << GET STT SIZE >>                                            09252000
   X := TOS.(8:8);                                                      09254000
   J :=  I := 0;  << INITIAL PL VALUES >>                               09256000
   DO                                                                   09258000
      BEGIN  << SEARCH THE STT >>                                       09260000
      I := I+1;                                                         09262000
      S0 := S0-1;  << BACK UP ADDRESS POINTER >>                        09264000
      LDAD;  << GET THE LABEL >>                                        09266000
      IF  TOS = @HELP  THEN  J := I;  << FOUND IT >>                    09268000
      END                                                               09270000
   UNTIL  DXBZ;                                                         09272000
   PUSH(STATUS);  IF  TOS.(8:8) = CST  THEN  J := @HELP.(1:7);          09274000
   IF  J = 0  THEN  FAIL;                                               09276000
   DDEL;  << GET RID OF THE ADDRESS INTO THE STT >>                     09278000
   TOS := P;  P := 0;                                                   09280000
   TOS := CST;  CST := 0;   << STACK THE VITALS >>                      09282000
   TOS.(0:8) := S7;  << A FROM THE CALL >>                              09284000
                                                               <<01323>>09286000
   IF (S7 <<A>> = 1) AND (NUM'BPTS >= MAX'BPTS - 1)            <<01323>>09288000
     THEN FAIL;  << NOT ENOUGH ROOM IN TABLE >>                <<01323>>09290000
                                                               <<01323>>09292000
   IF  NOT FIND  THEN  FAIL;  << GET A ZERO ENTRY >>                    09294000
   << CHECK FOR A <LEXP> >>                                             09296000
   IF  S7 <<A>> = 1  AND  P2F  THEN                                     09298000
      IF  TOKEN = %15  THEN                                             09300000
         BEGIN  << JUST A COUNT >>                                      09302000
         S3.(0:8) := 1;  << SET THE RELOP >>                            09304000
         S3.(8:8) := 0;  << CLEAR BANK >>                      <<01323>>09306000
         S4 := S5 := INTEGER(P2);  << SET COUNT >>                      09308000
         END                                                            09310000
      ELSE                                                              09312000
         BEGIN                                                          09314000
         TOS := -1;                                                     09316000
         X := 0;                                                        09318000
         DO  IF  REL(X) = TOKEN  THEN  S0 := X+2                        09320000
         UNTIL  (X:=X+1) = 4;                                           09322000
         IF  S0 = -1  THEN  FAIL;                                       09324000
         S4.(0:8) := TOS;                                               09326000
         CHAR;  << SCAN OFF THE RELOP >>                                09328000
         S5 := INTEGER(EXP);                                            09330000
         IF  TOKEN <> %15  THEN  FAIL;                                  09332000
         END;                                                           09334000
   X := I;  << SET UP ENTRY >>                                          09336000
   I := 6;                                                              09338000
   DO                                                                   09340000
      BEGIN  << MOVE FROM STACK TO TABLE >>                             09342000
      BPTAB(X) := TOS;                                                  09344000
      X := X+1;                                                         09346000
      I := I-1;                                                         09348000
      END                                                               09350000
   UNTIL  =;                                                            09352000
                                                               <<01323>>09354000
   NUM'BPTS := NUM'BPTS + 1;                                   <<01323>>09356000
                                                               <<01323>>09358000
   << SET UP THE PCAL INTO THE SEGMENT >>                               09360000
   TOS := K;  << GET ADDRESS >>                                         09362000
   TOS := J+%031000;  << FORM THE PCAL >>                               09364000
   STAD;  << STORE IT >>                                                09366000
   DDEL;                                                                09368000
   END;                                                                 09370000
                                                                        09372000
SUBROUTINE DUM(A);                                                      09374000
   VALUE A;  INTEGER A;                                                 09376000
<<                                                                      09378000
HELPER FUNCTION FOR DUMP AND MODIFY                                     09380000
>>                                                                      09382000
   BEGIN                                                                09384000
   NUMOUT(P1,0,MAX'ADDR'DIG);                                  <<01323>>09386000
   IO(MAX'ADDR'DIG) := ":";                                    <<01323>>09388000
   IO(X:=X+1) := " ";                                          <<01323>>09390000
   TOS := P1;                                                           09392000
   LDAD;                                                                09394000
   ASMB( ZERO,XCH );  << FORM INTO 32 BIT VALUE >>                      09396000
   NUMOUT( *, S5, 6 );                                                  09398000
   DDEL;                                                                09400000
   P1 := P1+1D;                                                         09402000
   P2 := P2-1D;                                                         09404000
   END;                                                                 09406000
                                                                        09408000
SUBROUTINE DUMP;                                                        09410000
<<                                                                      09412000
DUMPS MEMORY LOCATIONS WHEN CALLED                                      09414000
>>                                                                      09416000
   DO                                                                   09418000
      BEGIN  << DUMP A WORD >>                                          09420000
      DUM(MAX'ADDR'DIG + 2);                                   <<01323>>09422000
      PRINT(-MAX'ADDR'DIG - 8);                                <<01323>>09424000
      I := 0;                                                           09426000
      WHILE  (I:=I+1) < 8  AND  P2 > 0D  DO                             09428000
         BEGIN                                                          09430000
         DUM(2);                                                        09432000
         WRDIO := "  ";                                                 09434000
         PRINT(-8);                                                     09436000
         END;                                                           09438000
      PRINT(0);                                                         09440000
      END                                                               09442000
   UNTIL  P2 <= 0D;                                                     09444000
                                                                        09446000
SUBROUTINE MODIFY;                                                      09448000
<<                                                                      09450000
DOES MODIFICATIONS TO MEMORY                                            09452000
>>                                                                      09454000
   DO                                                                   09456000
      BEGIN  << DO A WORD >>                                            09458000
      TOS := P1;                                                        09460000
      DUM(MAX'ADDR'DIG + 2);                                   <<01323>>09462000
      IO(MAX'ADDR'DIG + 8) := " ";                             <<01323>>09464000
      IO(X:=X+1) := "_";                                       <<01323>>09466000
      PRINT(-MAX'ADDR'DIG - 10);                               <<01323>>09468000
      GETINPUT;   << GET MODIFIED VALUE >>                              09470000
      TOS := EXP;  << GET THE NEW VALUE >>                              09472000
      DELB;  << SHORTEN IT >>                                           09474000
      STAD;  << STORE IT >>                                             09476000
      DDEL;  << DELETE THE ADDRESS >>                                   09478000
      END                                                               09480000
   UNTIL  P2 <= 0D;                                                     09482000
                                                                        09484000
SUBROUTINE LIST;                                               <<01323>>09486000
COMMENT                                                        <<01323>>09488000
   LISTS USER SET BREAK POINTS.                                <<01323>>09490000
;                                                              <<01323>>09492000
                                                               <<01323>>09494000
   BEGIN                                                       <<01323>>09496000
   I := X := 0;                                                <<01323>>09498000
   DO                                                          <<01323>>09500000
      IF BPTAB(X).(0:8) = 1 THEN                               <<01323>>09502000
        BEGIN                                                  <<01323>>09504000
        TOS := DOUBLE(BPTAB(X).(8:8));                         <<01323>>09506000
        TOS := DOUBLE(BPTAB(X:=X+1));                          <<01323>>09508000
        NUMOUT(*,4,5);                                         <<01323>>09510000
        NUMOUT(*,0,3);                                         <<01323>>09512000
        IO(3) := ".";                                          <<01323>>09514000
        PRINT(9);                                              <<01323>>09516000
        END                                                    <<01323>>09518000
   UNTIL BPTAB(I:=I+6) = -1;                                   <<01323>>09520000
   END;                                                        <<01323>>09522000
                                                                        09524000
SUBROUTINE  EXIT;                                                       09526000
<<                                                                      09528000
RETURNS TO THE USER PROGRAM                                             09530000
>>                                                                      09532000
   BEGIN                                                                09534000
   TOS := OLDDB;  SET(DB);                                              09536000
   TOS := DRT;   << RESET THE CLOCKS >>                                 09538000
   TOS := %(2)0111000011101001;                                         09540000
   CIO;                                                                 09542000
   TOS := CLKCR-1;                                                      09544000
   WIO;                                                                 09546000
   TOS := CPUCLK;                                                       09548000
   ASMB( SCLK );                                                        09550000
   TOS := P1;  TOS := TOS+%31400;                                       09552000
   ASMB( XEQ 0 );  << CUT BACK STACKED PARAMETERS, EXIT >>              09554000
   END;                                                                 09556000
                                                                        09558000
                                                                        09560000
SUBROUTINE PRINTIOQS;                                                   09562000
<<                                                                      09564000
  THIS SUBROUTINE PRINTS A LIST OF IOQS. THE FIRST PARAMETER OF THE     09566000
  COMMAND SPECIFIES THE LDEV NUMBER OR IF ZERO NO LDEV IS SPECIFIED.    09568000
  THE 2ND PARAMETER SPECIFIES THE NUMBER OF IOQS TO PRINT. THE IOQS     09570000
  ARE PRINTED IN THE REVERSE ORDER OF AGE, THAT IS, THE LAST EVENT      09572000
  IS PRINT FIRST.                                                       09574000
>>                                                                      09576000
  BEGIN                                                                 09578000
    L := INTEGER(P1);      << LOGICAL DEVICE NUMBER >>                  09580000
    J := INTEGER(P2);      << NUMBER OF IOQS TO PRINT >>                09582000
    COM := 0;   << HOLDS INDEX OF LAST IOQ PRINTED >>                   09584000
                                                                        09586000
FINDLOOP:                                                               09588000
    I := IOQP(2);   << GET INDEX OF OLDEST IOQ >>                       09590000
    IF I<>COM THEN  <<LAST NOT OLDEST SO LOOK FOR ONE >>                09592000
      BEGIN                                                             09594000
        WHILE IOQP(I+1)<>COM DO I := IOQP(X);<< FIND PRECEEDING IOQ >>  09596000
        COM := I;      << SAVE NEW CURRENT IOQ >>                       09598000
        IF L<>0 AND L<>IOQP(I+2).(8:8) THEN                             09600000
          GOTO FINDLOOP;  << NOT CORRECT LDEV, FIND NEXT IOQ >>         09602000
                                                                        09604000
        P1 := DOUBLE(F(%1005)+%1000+I);    << ABSOLUTE ADDR OF IOQ >>   09606000
        P2 := 11D;  DUMP;  << PRINT 11 WORD IOQ >>                      09608000
        IF (J:=J-1)>0 THEN GOTO FINDLOOP;  << DO NEXT IOQ >>            09610000
      END;                                                              09612000
  END;  << PRINT IOQ >>                                                 09614000
                                                                        09616000
<<                                                                      09618000
                                                                        09620000
START OF THE PROCEDURE BODY                                             09622000
                                                                        09624000
>>                                                                      09626000
DISABLE;  << TURN OFF INTERRUPTS >>                                     09628000
<< DECIDE WHY WE STOPPED >>                                             09630000
TOS := 0D;                                                              09632000
PUSH(STATUS);                                                           09634000
ASMB( DUP );                                                            09636000
TOS.(2:1) := 0;  SET(STATUS);  << TURN OFF THE TRAPS >>                 09638000
TOS := TOS.(8:8);                                                       09640000
TOS := CST'ADDR( * );   TOS := TOS+@BP'TAB;                             09642000
ASMB( XCHD 0 );  OLDDB := TOS;                                          09644000
P := SMP-1;  << GET P FROM STACK MARKER >>                              09646000
CST := SMSTA.(8:8);  << GET THE STATUS >>                               09648000
TOS := DOUBLE( P );  TOS := DOUBLE( CST );  << SAVE TO PRINT >>         09650000
                                                                        09652000
IF  FIND  THEN                                                          09654000
   BEGIN  << IN THE BREAKPOINT TABLE >>                                 09656000
   TOS := CST'ADDR( CST )+DOUBLE( P );                                  09658000
   SMP := P;  << DECREMENT EXIT ADDRESS >>                              09660000
   IF  BPTAB(I).(0:8) = 2  THEN                                         09662000
      BEGIN  << A FAKE BREAKPOINT >>                                    09664000
      LDAD;  << GET THE PCAL FROM THE WORD >>                           09666000
      J := TOS;  << SAVE IT >>                                          09668000
      TOS := BPTAB(I+2);                                                09670000
      STAD;  << RESTORE THE INSTRUCTION >>                              09672000
      CLEAR;  << REMOVE THE FAKE BREAKPOINT >>                          09674000
      TOS := TOS-1;                                                     09676000
      TOS := J;                                                         09678000
      STAD;  << PUT THE PCAL BACK INTO THE LOCATION >>                  09680000
OUT:  TOS := OLDDB;  SET(DB);  RETURN;                                  09682000
      END;                                                              09684000
   TOS := BPTAB(I+2);  << RESTORE INSTRUCTION AT BREAKPOINT >>          09686000
   STAD;  DDEL;                                                         09688000
   TOS := I;  << SAVE I >>                                              09690000
   P := P+1;  << SET A FAKE BREAKPOINT >>                               09692000
   BREAK( 2 );                                                          09694000
   I := TOS;  << RESTORE I >>                                           09696000
   TOS := BPTAB(I+3).(12:4);  << GET THE BANK >>               <<01323>>09698000
   TOS := BPTAB(X:=X+1);  << GET LOW ORDER 16 BITS >>                   09700000
   LDAD;  << GET TEST VALUE >>                                          09702000
   TOS := BPTAB(X:=X+1);   << GET THE CONSTANT >>                       09704000
   CASE  *BPTAB(I+3).(0:8)  OF                                          09706000
      BEGIN  << DO THE CORRECT TEST >>                                  09708000
      DDEL  << NULL >>;  << DO IT >>                                    09710000
         BEGIN                                                          09712000
         X := I+4;                                                      09714000
         BPTAB(X) := BPTAB(X)-1;                                        09716000
         IF  >  THEN  GO OUT;  << NOT COUNTED, SO EXIT >>               09718000
         TOS := BPTAB(X:=X+1);                                          09720000
         BPTAB(X:=X-1) := TOS;  << RESET THE COUNT >>                   09722000
         DDEL;                                                          09724000
         END;                                                           09726000
      IF  TOS >= TOS  THEN  GO OUT;                                     09728000
      IF  TOS <> TOS  THEN  GO OUT;                                     09730000
      IF  TOS <= TOS  THEN  GO OUT;                                     09732000
      IF  TOS = TOS  THEN  GO OUT;                                      09734000
      END;                                                              09736000
   DDEL;                                                                09738000
   END;                                                                 09740000
                                                                        09742000
<< SAVE THE CLOCK VALUES >>                                             09744000
TOS := DRT;  << READ PRESENT CLOCK VALUES >>                            09746000
DO                                                                      09748000
   BEGIN                                                                09750000
   TOS := %70150; CIO;                                                  09752000
   RIO;  CLKCR := TOS;  TIO;                                            09754000
   END                                                                  09756000
UNTIL  NOT TOS.(9:1);                                                   09758000
DEL;                                                                    09760000
ASMB( RCLK );  CPUCLK := TOS;                                           09762000
                                                                        09764000
<< PRINT THE WELCOME MESSAGE >>                                         09766000
PRINT( 0 );  << NEWLINE >>                                              09768000
X := 4;  DO  WRDIO(X) := PRE(X)  UNTIL  (X:=X-1)<0;                     09770000
NUMOUT( *, 5, 3 );                                                      09772000
NUMOUT( *, 9, 5 );                                                      09774000
PRINT( 14 );                                                            09776000
PUSH( S );  OLDS := TOS;  << SAVE FOR FAIL >>                           09778000
                                                                        09780000
<< COMMAND INPUT LOOP >>                                                09782000
                                                                        09784000
COMIN:                                                                  09786000
                                                                        09788000
IO := "-";  PRINT( -1 );  << PRINT THE PROMPT >>                        09790000
GETINPUT;   << GET COMMAND STRING >>                                    09792000
CST := 0;                                                               09794000
X := NUM'CMNDS - 1;                                            <<01323>>09796000
DO                                                                      09798000
   BEGIN                                                                09800000
   IF COMM(X) = TOKEN  THEN  GO FND;                                    09802000
   X := X-1;                                                            09804000
   END                                                                  09806000
UNTIL <;                                                                09808000
FAIL;  << ILLEGAL COMMAND >>                                            09810000
                                                                        09812000
FND:  << LEGAL COMMAND IF YOU GET HERE >>                               09814000
                                                                        09816000
COM := X;  << SAVE THE COMMAND >>                                       09818000
CHAR;  << SCAN OFF THE COMMAND >>                                       09820000
P1 := 0D;                                                               09822000
IF (COM <> 4) AND (COM <> 6) THEN                              <<01323>>09824000
   BEGIN  << GET THE PARAMETERS >>                                      09826000
   P1 := EXP;                                                           09828000
   P2 := 0D;                                                            09830000
   P2F := FALSE;                                                        09832000
   IF  TOKEN = ","  AND  COM <> 1 THEN                                  09834000
      BEGIN  << GET A SECOND PARAMETER >>                               09836000
      CHAR;                                                             09838000
      P2 := EXP;                                                        09840000
      P2F := TRUE;                                                      09842000
      END;                                                              09844000
   END                                                                  09846000
ELSE  IF (COM = 4) AND (TOKEN <> %15) THEN                     <<01323>>09848000
   BEGIN  << GET STACK CUT BACK PARAMETER >>                            09850000
   P1 := SEXP;                                                          09852000
   IF  P1 > 255D  THEN  FAIL;                                           09854000
   END;                                                                 09856000
                                                                        09858000
IF  TOKEN <> %15  AND  COM <> 0  THEN  FAIL;  << ERROR >>               09860000
                                                                        09862000
CASE  *COM  OF                                                          09864000
   BEGIN                                                                09866000
   BREAK( 1 );                                                          09868000
   CLEAR;                                                               09870000
   DUMP;                                                                09872000
   MODIFY;                                                              09874000
   EXIT;                                                                09876000
   PRINTIOQS;                                                           09878000
   LIST;                                                       <<01323>>09880000
   END;                                                                 09882000
GO COMIN;                                                               09884000
END;  << HELP >>                                                        09886000
$PAGE "CHANNEL'ID"                                             <<03697>>09888000
<< This procedure is a dummy for Series II/III >>              <<03697>>09890000
logical procedure CHANNEL'ID(LDEV);                            <<03697>>09892000
value LDEV;                                                    <<03697>>09894000
integer LDEV;                                                  <<03697>>09896000
option uncallable,privileged,internal;                         <<03697>>09898000
begin                                                          <<03697>>09900000
end;    << of procedure CHANNEL'ID >>                          <<03697>>09902000
                                                                        09904000
$INCLUDE INCLHARD                                              <<MPEIV>>09906000
$PAGE"IMB ADAPTER INTERFACE PROCEDURES"                        <<02500>>09912000
$PAGE                                                          <<04838>>09914000
                                                               <<04838>>09916000
                                                               <<04838>>09918000
                                                               <<04838>>09920000
                                                               <<04838>>09922000
                                                               <<04838>>09924000
INTEGER PROCEDURE GETTBUF(TYPE);                               <<04838>>09926000
  VALUE  TYPE;   INTEGER TYPE;                                 <<04838>>09928000
  OPTION UNCALLABLE, PRIVILEGED;                               <<04838>>09930000
  BEGIN                                                        <<04838>>09932000
                                                               <<04838>>09934000
    GETTBUF := GETGBUF(TYPE);                                  <<04838>>09936000
                                                               <<04838>>09938000
  END;  << GETTBUF >>                                          <<04838>>09940000
                                                               <<04838>>09942000
                                                               <<04838>>09944000
                                                               <<04838>>09946000
                                                               <<04838>>09948000
                                                               <<04838>>09950000
PROCEDURE RETURNTBUF(PNTR);                                    <<04838>>09952000
  VALUE PNTR;   INTEGER POINTER PNTR;                          <<04838>>09954000
  OPTION PRIVILEGED, UNCALLABLE;                               <<04838>>09956000
  BEGIN                                                        <<04838>>09958000
                                                               <<04838>>09960000
    RETURNGBUF(PNTR);                                          <<04838>>09962000
                                                               <<04838>>09964000
  END;  << RETURNTBUF >>                                       <<04838>>09966000
                                                               <<04838>>09968000
                                                               <<04838>>09970000
                                                               <<04838>>09972000
                                                               <<04838>>09974000
$PAGE                                                          <<04838>>09976000
INTEGER PROCEDURE MAILBOX'STATUS;                              <<02500>>09978000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>09980000
                                                                        09982000
<<                                                                      09984000
     MAILBOX'STATUS ANALYZES THE I/O STATUS WORD IN THE                 09986000
     IMB ADAPTER MAILBOX AND RETURNS CONDITION CODES FOR                09988000
     THE MAILBOX COMMANDS.                                              09990000
>>                                                                      09992000
                                                                        09994000
BEGIN                                                          <<02500>>09996000
                                                               <<02500>>09998000
  INTEGER CCODE;                                               <<02500>>10000000
                                                               <<02500>>10002000
  CCODE := IF MAILBOX0 = SEDCODE THEN 1 ELSE CCE;              <<02500>>10004000
  IF IMB'TIMEOUT THEN                                          <<02500>>10006000
    BEGIN                                                      <<02500>>10008000
      MAILBOX'DEBUG;   << FOR DEBUGGING ONLY >>                <<02500>>10010000
      CCODE := IF MAILBOX0 = SEDCODE THEN 0 ELSE CCL;          <<02500>>10012000
    END                                                        <<02500>>10014000
  ELSE                                                         <<02500>>10016000
  IF ERRORS THEN                                               <<02500>>10018000
    BEGIN << ANALYZE ERRORS >>                                 <<02500>>10020000
       IF IMB'ERROR THEN                                       <<02500>>10022000
         BEGIN                                                 <<02500>>10024000
           MAILBOX'DEBUG;   << FOR DEBUGGING ONLY >>           <<02500>>10026000
           CCODE := IF MAILBOX0 = SEDCODE THEN 0 ELSE CCL;     <<02500>>10028000
         END                                                   <<02500>>10030000
       ELSE                                                    <<02500>>10032000
         BEGIN << I/O INSTRUCTION FAILURE >>                   <<02500>>10034000
            CASE MAILBOX0 OF                                   <<02500>>10036000
              BEGIN << CASES >>                                <<02500>>10038000
                                                               <<02500>>10040000
                IF SIOP'CCG THEN CCODE := CCG     << SIOP >>   <<02500>>10042000
                ELSE IF SIOP'CCL THEN CCODE := CCL;            <<02500>>10044000
                                                               <<02500>>10046000
                IF HIOP'CCG THEN CCODE := CCG;    << HIOP >>   <<02500>>10048000
                                                               <<02500>>10050000
                IF RIOC'CCL THEN CCODE := CCL;    << RIOC >>   <<02500>>10052000
                                                               <<02500>>10054000
                IF WIOC'CCL THEN CCODE := CCL;    << WIOC >>   <<02500>>10056000
                                                               <<02500>>10058000
                CCODE := 0;  << FALSE >>          << SED >>    <<02500>>10060000
                                                               <<02500>>10062000
                ;     << UNUSED OPCODE >>         << UNUSED >> <<02500>>10064000
                                                               <<02500>>10066000
                IF INIT'CCG THEN CCODE := CCG;    << INIT >>   <<02500>>10068000
                                                               <<02500>>10070000
              END;  << CASES >>                                <<02500>>10072000
         END;  << I/O INSTRUCTION FAILURE >>                   <<02500>>10074000
    END;  << ANALYZE ERRORS >>                                 <<02500>>10076000
                                                               <<02500>>10078000
  MAILBOX'STATUS := CCODE;   << RETURN CONDITION CODE >>       <<02500>>10080000
END;                                                           <<02500>>10082000
                                                               <<02500>>10084000
PROCEDURE COUNTDOWN'HPIB;                                      <<02626>>10086000
OPTION PRIVILEGED,UNCALLABLE;                                  <<02626>>10088000
BEGIN                                                          <<02626>>10090000
COMMENT                                                        <<02626>>10092000
        THIS PROCEDURE WAITS FOR THE HPIB ADAPTER              <<02626>>10094000
        TO MARK ITS MAIL BOX NOT BUSY                          <<02626>>10096000
        IE.  MAILBOX4.(0:1)=1 INDICATES NOT BUSY               <<02626>>10098000
 ;                                                             <<02626>>10100000
                                                               <<02626>>10102000
 INTEGER COUNTDOWN;                                            <<02626>>10104000
 COUNTDOWN := 32000;                                           <<02626>>10106000
 DO COUNTDOWN := COUNTDOWN - 1                                 <<02626>>10108000
 UNTIL ( COUNTDOWN <= 0 )  OR  ( MAILBOX4 < 0);                <<02626>>10110000
                                                               <<02626>>10112000
 RETURN                                                        <<02626>>10114000
END;                                                           <<02626>>10116000
                                                               <<02500>>10118000
$PAGE                                                          <<02500>>10120000
PROCEDURE SIOP'HPIB(CHANNEL'DEVICE,CHANP);                     <<02500>>10122000
VALUE   CHANNEL'DEVICE,  << CHANNEL AND DEVICE NUMBER >>       <<02500>>10124000
        CHANP;           << CHANNEL PROGRAM POINTER >>         <<02500>>10126000
INTEGER CHANNEL'DEVICE,                                        <<02500>>10128000
        CHANP;                                                 <<02500>>10130000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10132000
                                                                        10134000
<<                                                                      10136000
     SIOP'HPIB ATTEMPTS TO START A CHANNEL PROGRAM                      10138000
     ON THE CHANNEL'DEVICE PASSED.                                      10140000
>>                                                                      10142000
                                                                        10144000
BEGIN                                                          <<02500>>10146000
                                                               <<02626>>10148000
                                                               <<02500>>10150000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10152000
  MAILBOX0 := SIOPCODE;        << SIOP OPCODE >>               <<02500>>10154000
  MAILBOX1 := CHANNEL'DEVICE.DRTNUMBER;  << DRT # >>           <<02500>>10156000
  MAILBOX3 := CHANP;           << CHANNEL PROG POINTER >>      <<02500>>10158000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10160000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10162000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10164000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10166000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10168000
    BEGIN                                                      <<02500>>10170000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10172000
    END                                                        <<02500>>10174000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10176000
    BEGIN                                                      <<02500>>10178000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10180000
    END                                                        <<02500>>10182000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10184000
    BEGIN                                                      <<02500>>10186000
                                                               <<02626>>10188000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10190000
                                                               <<02626>>10192000
      RSTATUS.CC := MAILBOX'STATUS;                            <<02500>>10194000
    END;                                                       <<02500>>10196000
END;  << SIOP'HPIB >>                                          <<02500>>10198000
                                                               <<02500>>10200000
                                                               <<02500>>10202000
$PAGE                                                          <<02500>>10204000
PROCEDURE HIOP'HPIB(CHANNEL'DEVICE);                           <<02500>>10206000
VALUE   CHANNEL'DEVICE;  << CHANNEL AND DEVICE NUMBER >>       <<02500>>10208000
INTEGER CHANNEL'DEVICE;                                        <<02500>>10210000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10212000
                                                                        10214000
<<                                                                      10216000
     HIOP'HPIB ATTEMPTS TO HALT THE CURRENT CHANNEL                     10218000
     PROGRAM ON THE CHANNEL'DEVICE PASSED.                              10220000
>>                                                                      10222000
                                                                        10224000
BEGIN                                                          <<02500>>10226000
                                                               <<02626>>10228000
                                                               <<02500>>10230000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10232000
  MAILBOX0 := HIOPCODE;        << HIOP OPCODE >>               <<02500>>10234000
  MAILBOX1 := CHANNEL'DEVICE.DRTNUMBER;  << DRT # >>           <<02500>>10236000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10238000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10240000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10242000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10244000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10246000
    BEGIN                                                      <<02500>>10248000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10250000
    END                                                        <<02500>>10252000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10254000
    BEGIN                                                      <<02500>>10256000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10258000
    END                                                        <<02500>>10260000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10262000
    BEGIN                                                      <<02500>>10264000
                                                               <<02626>>10266000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10268000
                                                               <<02626>>10270000
      RSTATUS.CC := MAILBOX'STATUS;                            <<02500>>10272000
    END;                                                       <<02500>>10274000
END;  << HIOP'HPIB >>                                          <<02500>>10276000
                                                               <<02500>>10278000
                                                               <<02500>>10280000
$PAGE                                                          <<02500>>10282000
INTEGER PROCEDURE RIOC'HPIB(COMMAND);                          <<02500>>10284000
VALUE   COMMAND;                                               <<02500>>10286000
INTEGER COMMAND;                                               <<02500>>10288000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10290000
                                                                        10292000
<<                                                                      10294000
     RIOC'HPIB ATTEMPTS TO DO A READ I/O CHANNEL.                       10296000
>>                                                                      10298000
                                                                        10300000
BEGIN                                                          <<02500>>10302000
                                                               <<02626>>10304000
                                                               <<02500>>10306000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10308000
  MAILBOX0 := RIOCCODE;        << RIOC OPCODE >>               <<02500>>10310000
  MAILBOX1 := COMMAND;         << IMB READ COMMAND >>          <<02500>>10312000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10314000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10316000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10318000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10320000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10322000
    BEGIN                                                      <<02500>>10324000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10326000
    END                                                        <<02500>>10328000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10330000
    BEGIN                                                      <<02500>>10332000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10334000
    END                                                        <<02500>>10336000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10338000
    BEGIN                                                      <<02500>>10340000
                                                               <<02626>>10342000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10344000
                                                               <<02626>>10346000
      RSTATUS.CC := MAILBOX'STATUS;                            <<02500>>10348000
      RIOC'HPIB := MAILBOX2;        << DATA READ >>            <<02500>>10350000
    END;                                                       <<02500>>10352000
END;  << RIOC'HPIB >>                                          <<02500>>10354000
                                                               <<02500>>10356000
                                                               <<02500>>10358000
$PAGE                                                          <<02500>>10360000
PROCEDURE WIOC'HPIB(COMMAND,DATAWORD);                         <<02500>>10362000
VALUE   COMMAND,                                               <<02500>>10364000
        DATAWORD;                                              <<02500>>10366000
INTEGER COMMAND,                                               <<02500>>10368000
        DATAWORD;                                              <<02500>>10370000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10372000
                                                                        10374000
<<                                                                      10376000
     WIOC'HPIB ATTEMPTS TO DO A WRITE I/O CHANNEL.                      10378000
>>                                                                      10380000
                                                                        10382000
BEGIN                                                          <<02500>>10384000
                                                               <<02626>>10386000
                                                               <<02500>>10388000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10390000
  MAILBOX0 := WIOCCODE;        << WIOC OPCODE >>               <<02500>>10392000
  MAILBOX1 := COMMAND;         << IMB WRITE COMMAND >>         <<02500>>10394000
  MAILBOX2 := DATAWORD;        << DATA TO BE WRITTEN >>        <<02500>>10396000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10398000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10400000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10402000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10404000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10406000
    BEGIN                                                      <<02500>>10408000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10410000
    END                                                        <<02500>>10412000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10414000
    BEGIN                                                      <<02500>>10416000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10418000
    END                                                        <<02500>>10420000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10422000
    BEGIN                                                      <<02500>>10424000
                                                               <<02626>>10426000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10428000
                                                               <<02626>>10430000
      RSTATUS.CC := MAILBOX'STATUS;                            <<02500>>10432000
    END;                                                       <<02500>>10434000
END;  << WIOC'HPIB >>                                          <<02500>>10436000
                                                               <<02500>>10438000
                                                               <<02500>>10440000
$PAGE                                                          <<02500>>10442000
LOGICAL PROCEDURE SED'HPIB(ENABLE'DISABLE);                    <<02500>>10444000
VALUE   ENABLE'DISABLE; << 0 - DISABLE, 1 - ENABLE >>          <<02500>>10446000
INTEGER ENABLE'DISABLE;                                        <<02500>>10448000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10450000
                                                                        10452000
<<                                                                      10454000
     SED'HPIB ATTEMPTS TO ENABLE OR DISABLE EXTERNAL                    10456000
     INTERRUPTS FROM THE IMB ADAPTER BOARD ( 25A CPU ).                 10458000
>>                                                                      10460000
                                                                        10462000
BEGIN                                                          <<02500>>10464000
                                                               <<02626>>10466000
                                                               <<02500>>10468000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10470000
  MAILBOX0 := SEDCODE;         << SED OPCODE >>                <<02500>>10472000
  MAILBOX1 := ENABLE'DISABLE;  << DISABLE/ENABLE 25A CPU >>    <<02500>>10474000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10476000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10478000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10480000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10482000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10484000
    BEGIN                                                      <<02500>>10486000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10488000
    END                                                        <<02500>>10490000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10492000
    BEGIN                                                      <<02500>>10494000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10496000
    END                                                        <<02500>>10498000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10500000
    BEGIN                                                      <<02500>>10502000
                                                               <<02626>>10504000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10506000
                                                               <<02626>>10508000
      SED'HPIB := MAILBOX'STATUS;                              <<02500>>10510000
    END;                                                       <<02500>>10512000
END;  << SED'HPIB >>                                           <<02500>>10514000
                                                               <<02500>>10516000
                                                               <<02500>>10518000
$PAGE                                                          <<02500>>10520000
PROCEDURE INIT'HPIB(CHANNEL);                                  <<02500>>10522000
VALUE   CHANNEL;  << CHANNEL NUMBER >>                         <<02500>>10524000
INTEGER CHANNEL;                                               <<02500>>10526000
OPTION  PRIVILEGED,UNCALLABLE;                                 <<02500>>10528000
                                                                        10530000
<<                                                                      10532000
     INIT'HPIB ATTEMPTS TO INITIALIZE A CHANNEL.                        10534000
>>                                                                      10536000
                                                                        10538000
BEGIN                                                          <<02500>>10540000
                                                               <<02626>>10542000
                                                               <<02500>>10544000
  ASSEMBLE(SED 0 );   << DISABLE DISPATCHING >>                <<02500>>10546000
  MAILBOX0 := INITCODE;        << INIT OPCODE >>               <<02500>>10548000
  MAILBOX1 := CHANNEL;         << CHANNEL NUMBER >>            <<02500>>10550000
  MAILBOX4 := 0;               << I/O STATUS WORD >>           <<02500>>10552000
  TOS := %175;                 << IMB ADAPTER DRT # >>         <<02500>>10554000
  TOS := %177777;              << SIO PROGRAM POINTER >>       <<02500>>10556000
  DOSIO:  ASSEMBLE( SIO 1 );                                   <<02500>>10558000
  IF > THEN       << DEVICE NOT READY >>                       <<02500>>10560000
    BEGIN                                                      <<02500>>10562000
      MAILBOX'DEBUG;  << SIO RETURNED CCG >>                   <<02500>>10564000
    END                                                        <<02500>>10566000
  ELSE IF < THEN  << DEVICE CONTROLLER DOES NOT RESPOND >>     <<02500>>10568000
    BEGIN                                                      <<02500>>10570000
      MAILBOX'DEBUG;  << SIO RETURNED CCL >>                   <<02500>>10572000
    END                                                        <<02500>>10574000
  ELSE            << SIO OK, WAIT FOR 25A CPU >>               <<02500>>10576000
    BEGIN                                                      <<02500>>10578000
                                                               <<02626>>10580000
       COUNTDOWN'HPIB;  << WAIT ON MAILBOX >>                  <<02626>>10582000
                                                               <<02626>>10584000
      RSTATUS.CC := MAILBOX'STATUS;                            <<02500>>10586000
    END;                                                       <<02500>>10588000
END;  << INIT'HPIB >>                                          <<02500>>10590000
                                                               <<02500>>10592000
$PAGE                                                          <<02500>>10594000
PROCEDURE START'HPIB(DITP,SIOP,QUEUE);                         <<02500>>10596000
VALUE QUEUE;                                                   <<02500>>10598000
INTEGER ARRAY DITP,SIOP;                                       <<02500>>10600000
LOGICAL QUEUE;                                                 <<02500>>10602000
OPTION PRIVILEGED,UNCALLABLE;                                  <<02500>>10604000
<<                                                                      10606000
    START'HPIB STARTS A CHANNEL PROGRAM FOR THE DEVICE                  10608000
    POINTED TO BY DITP ON THE IMB ADAPTER.                              10610000
>>                                                                      10612000
<<*************** Returned Condtion Codes *******************>><<03095>>10614000
<<  CCE - SIOP was successfully issued                       >><<03095>>10616000
<<  CCG - Failed to issue SIOP (Non-resp DRT)                >><<03095>>10618000
<<  CCL - SIOP deferred due to queuing on software channel   >><<03095>>10620000
<<***********************************************************>><<03095>>10622000
                                                               <<03095>>10624000
BEGIN                                                          <<02500>>10626000
  INTEGER POINTER                                              <<02500>>10628000
     ILTP        = Q+1;                                        <<02500>>10630000
  INTEGER                                                      <<02500>>10632000
     CONTROL     = ILTP+1,                                     <<02500>>10634000
     CHANNEL     = CONTROL+1;                                  <<02500>>10636000
                                                               <<02500>>10638000
                                                               <<02500>>10640000
  TOS := DITP(DILTP);   << ILTP >>                             <<02500>>10642000
  TOS := ILTP(ICNTRL); << CONTROL >>                           <<02500>>10644000
  TOS := S0.CHANQUE;   << CHANNEL >>                           <<02500>>10646000
   << If this is a restart of a channel program due to >>      <<03095>>10648000
   << a wait for HIOP to complete, bypass queuing code >>      <<03095>>10650000
   ILTP(IFLAG).SCP := 0;                                       <<03095>>10652000
   if = then                                                   <<03095>>10654000
  IF QUEUE THEN << NORMAL PROGRAM START >>                     <<02500>>10656000
  IF LOGICAL(CONTROL)&CSL(1) THEN                              <<02500>>10658000
    BEGIN << MULTI-CONTROLLER CHANNEL RESOURCE >>              <<02500>>10660000
      DISABLE;                                                 <<02500>>10662000
      IF BUSY(CHANNEL) <> 0 THEN                               <<02500>>10664000
        BEGIN                                                  <<02500>>10666000
          ADDTAIL(DITP,DLINK,CHANNEL);                         <<02500>>10668000
                                                               <<03095>>10670000
         << Save SIOP start address in ILT >>                  <<03095>>10672000
         ILTP(ICPGM) := @SIOP;                                 <<03095>>10674000
         ILTP(IFLAG).SQ := if QUEUE then 1 else 0;             <<03095>>10676000
                                                               <<03095>>10678000
         << Turn off IAK bit in DIT so SIODM will not >>       <<03095>>10680000
         << fire-off I/O again.                       >>       <<03095>>10682000
         DITP.IAK := 0;                                        <<03095>>10684000
                                                               <<03095>>10686000
                                                               <<04572>>10688000
          TOS := CCL;                                          <<02500>>10690000
          GO OUT;                                              <<02500>>10692000
        END;                                                   <<02500>>10694000
      BUSY(CHANNEL) := @DITP;                                  <<02500>>10696000
      ENABLE'IF'WAS'ENABLED;                                   <<04572>>10698000
    END;                                                       <<02500>>10700000
  DISABLE;                                                     <<02500>>10702000
  HALT'HPIB(DITP); << HALT CURRENT PROGRAM >>                  <<02500>>10704000
  IF > THEN                                                    <<02500>>10706000
    BEGIN                                                      <<02500>>10708000
     << Wait for HIOP interrupt & restart from GIP >>          <<03095>>10710000
     tos := ILTP(IFLAG);                                       <<03095>>10712000
     tos.SCP := 1;          << Turn on start chanp flag >>     <<03095>>10714000
     tos.SQ := if QUEUE then 1 else 0; << Whether queued >>    <<03095>>10716000
     tos.IGNOREHI := 1;     << Tell GIP to ignore HIOP int >>  <<03095>>10718000
     ILTP(X) := tos;                                           <<03095>>10720000
     ILTP(ICDP) := @DITP;                                      <<03095>>10722000
     ILTP(ICPGM ) := @SIOP;                                    <<03095>>10724000
     tos := CCE;    << Tell driver all went OK >>              <<03095>>10726000
     go to OUT;                                                <<03095>>10728000
                                                               <<03095>>10730000
    END;                                                       <<02500>>10732000
  << There used to be an ENABLE here >>                        <<03697>>10734000
  DITP.IAK := 0;   << Turn off int ack bit >>                  <<03095>>10736000
  << NEED TO CHECK RESULTS AFTER TIMEOUT >>                    <<02500>>10738000
  tos := CONTROL.DRTNUMBER;    << DRT number >>                <<03697>>10740000
                                                               <<03697>>10742000
  << Issue a "CLEAR INTERRUPT" to the GIC >>                   <<03697>>10744000
  << At current this code is commented because the WIOC >>     <<03697>>10746000
  << does not appear to work on STARFISH.               >>     <<03697>>10748000
<<ASMB(dup,stax);>> << Put copy of DRT in X-register >>        <<03697>>10750000
<<tos := logical(X) land %(16)0C00;>><< Write register C >>    <<03697>>10752000
<<tos := logical(X) land %7; << Device # is data to write>>    <<03697>>10754000
<<WIOC'HPIB(*,*);>>                                            <<03697>>10756000
<<if < then   << Did not work >>                               <<03697>>10758000
<<  go to IO'FAILURE;>>                                        <<03697>>10760000
                                                               <<03697>>10762000
  TOS := @SIOP + SYSDB;                                        <<02500>>10764000
  << There used to be a DISABLE here >>                        <<03697>>10766000
  DITP.IAK := 0;  << RESET INTERRUPT ACKNOWLEDGE >>            <<02500>>10768000
  SIOP'HPIB(*,*); << START I/O INSTRUCTION >>                  <<02500>>10770000
  IF = THEN                                                    <<02500>>10772000
    BEGIN << PROGRAM STARTED >>                                <<02500>>10774000
      IF QUEUE THEN                                            <<02500>>10776000
        BEGIN                                                  <<02500>>10778000
          DITP.IOPROG := 1; << SET I/O PROGRAM IN PROGRESS >>  <<02500>>10780000
          ILTP(IFLAG).WAITPROG := 0; << CLEAR WAIT PROG FLAG >><<02500>>10782000
          TOS := @DITP;                                        <<02500>>10784000
        END                                                    <<02500>>10786000
      ELSE                                                     <<02500>>10788000
        BEGIN                                                  <<02500>>10790000
          ILTP(IFLAG).WAITPROG := 1; << WAIT PROGRAM STARTED >><<02500>>10792000
          TOS := 0;                                            <<02500>>10794000
        END;                                                   <<02500>>10796000
      ILTP(ICDP) := TOS; << SET CURRENT DIT POINTER IN ILT >>  <<02500>>10798000
      TOS := CCE;                                              <<02500>>10800000
OUT:                                                           <<02500>>10802000
      RSTATUS.CC := TOS;                                       <<02500>>10804000
      RETURN;                                                  <<02500>>10806000
    END;                                                       <<02500>>10808000
                                                               <<02500>>10810000
  IF < THEN                                                    <<02500>>10812000
    BEGIN << BAD DRT, RETURN I/O FAILURE >>                    <<02500>>10814000
                                                               <<03697>>10816000
IO'FAILURE:                                                    <<03697>>10818000
                                                               <<03697>>10820000
      X := CONTROL.(8:8)&LSL(2)+DRT3;                          <<02500>>10822000
      ABS(X)  := 0;  << CLEAR LAST WORD OF DRT >>              <<02500>>10824000
      TOS := CCG;                                              <<02500>>10826000
      GO OUT;                                                  <<02500>>10828000
    END;                                                       <<02500>>10830000
                                                               <<02500>>10832000
  IF QUEUE AND LOGICAL(CONTROL)&CSL(1) THEN                    <<02500>>10834000
  CHKCHANNELQUE(CONTROL,DITP);                                 <<02500>>10836000
  TOS := CCG;                                                  <<02500>>10838000
  GO TO OUT;                                                   <<02500>>10840000
END;                                                           <<02500>>10842000
                                                               <<02500>>10844000
                                                               <<02500>>10846000
$PAGE                                                          <<02500>>10848000
PROCEDURE HALT'HPIB(DITP);                                     <<02500>>10850000
INTEGER ARRAY DITP;                                            <<02500>>10852000
OPTION UNCALLABLE,PRIVILEGED;                                  <<02500>>10854000
<<                                                                      10856000
    HALT'HPIB HALTS A CHANNEL PROGRAM RUNNING ON THE IMB                10858000
    ADAPTER ON THE HP3000 SERIES II/III.                                10860000
>>                                                                      10862000
BEGIN                                                          <<02500>>10864000
logical pointer ILTP = q+1;   << Pointer to ILT >>             <<03095>>10866000
                                                               <<02500>>10868000
  TOS := DITP(DILTP); << ILT POINTER >>                        <<02500>>10870000
  TOS := PS0(ICNTRL); << DRT NUMBER >>                         <<02500>>10872000
                                                               <<03095>>10874000
  << Reset the deferred SIOP bits in case a deferred >>        <<03095>>10876000
  << START'HPIB was requested.                       >>        <<03095>>10878000
  ILTP(IFLAG).SCP := 0;                                        <<03095>>10880000
                                                               <<03095>>10882000
  HIOP'HPIB(*);       << HALT I/O INSTRUCTION >>               <<02500>>10884000
  IF = THEN TOS := CCE                                         <<02500>>10886000
  ELSE IF > THEN TOS := CCG                                    <<02500>>10888000
  ELSE                                                         <<02500>>10890000
    BEGIN                                                      <<02500>>10892000
      X := TOS.(8:8)&LSL(2)+DRT3;                              <<02500>>10894000
      ABSOLUTE(X) := 0;                                        <<02500>>10896000
      TOS := CCL;                                              <<02500>>10898000
    END;                                                       <<02500>>10900000
  RSTATUS.CC := TOS;                                           <<02500>>10902000
END;                                                           <<02500>>10904000
                                                               <<02500>>10906000
                                                               <<02500>>10908000
$PAGE                                                          <<02500>>10910000
PROCEDURE GIP'HPIB;                                            <<02500>>10912000
OPTION PRIVILEGED,UNCALLABLE;                                  <<02500>>10914000
<<                                                                      10916000
    GIP'HPIB HANDLES EXTERNAL INTERRUPTS FOR THE HPIB DEVICES           10918000
    ATTACHED TO THE HP3000 SERIES II/III. WHEN THIS PROCEDURE           10920000
    IS ENTERED DB IS POINTING TO THE CPVA FOR THE INTERRUPTING          10922000
    DEVICE. Q IS POINTING AT THE INTERRUPT CONTROL STACK.               10924000
>>                                                                      10926000
BEGIN                                                          <<02500>>10928000
  INTEGER                                                      <<02500>>10930000
     CDP         = DB+ICDP,                                    <<02500>>10932000
     CPVA0       = DB+ICPVA0,                                  <<02500>>10934000
     DRTN        = Q+3,                                        <<02500>>10936000
     FLAG        = DB+IFLAG,                                   <<02500>>10938000
     STAP        = DB+ISTAP,                                   <<02500>>10940000
     UNIT        = DB+IUNIT;                                   <<02500>>10942000
  INTEGER POINTER                                              <<02500>>10944000
     DITP        = DRTN+1,                                     <<02500>>10946000
     ILTP        = DITP+1;                                     <<02500>>10948000
  LOGICAL                                                      <<02500>>10950000
     ABORTED     = ILTP+1;                                     <<02500>>10952000
  LOGICAL POINTER                                              <<02500>>10954000
     DITPL       = DITP;                                       <<02500>>10956000
                                                               <<03095>>10958000
<< Subroutine to set SYSDB and log event in MMSTAT >>          <<03095>>10960000
subroutine SETDB'LOG;                                          <<03095>>10962000
begin                                                          <<03095>>10964000
                                                               <<03095>>10966000
<< Set SYSDB >>                                                <<03095>>10968000
tos := 0;                                                      <<03095>>10970000
tos := SYSDB;                                                  <<03095>>10972000
ASMB(xchd);                                                    <<03095>>10974000
DDEL;                                                          <<03095>>10976000
                                                               <<03095>>10978000
<< log event to MMSTAT >>                                      <<03095>>10980000
tos := X;    << save X register >>                             <<03095>>10982000
tos := 192;                                                    <<03095>>10984000
tos := GETDRT(DRTN,0)-SYSDB-ILTP(ISIOP); << @ SIOP rel >>      <<03095>>10986000
tos.(0:7) := DITP(DLDEV).DLDEVN;   << LDEV >>                  <<03095>>10988000
tos := WA0(ILTP(ISTAP ));  << Save controller status >>        <<03095>>10990000
tos := TIMER;                                                  <<03095>>10992000
ASMB(delb);                << LSW of TIMER >>                  <<03095>>10994000
                                                               <<03095>>10996000
MMSTAT(*,*,*,*);                                               <<03095>>10998000
                                                               <<03095>>11000000
X := tos;  << restore X register >>                            <<03095>>11002000
end;                                                           <<03095>>11004000
                                                               <<03095>>11006000
  PUSH(DB);                                                    <<02500>>11008000
  TOS := TOS - %1000;  << ILTP >>                              <<02500>>11010000
  TOS := FALSE; << ABORTED SET TO FALSE >>                     <<02500>>11012000
  FLAG.IGNOREHI := 0;                                          <<02500>>11014000
  << If we expected HIOP interrupt, we must check to >>        <<03095>>11016000
  << see if we should attempt to restart the channel >>        <<03095>>11018000
  << program for this device.                        >>        <<03095>>11020000
  if <> then                                                   <<03095>>11022000
    begin                                                      <<03095>>11024000
                                                               <<03095>>11026000
    << Set to SYSDB and log to MMSTAT >>                       <<03095>>11028000
    @DITP := CDP;   << Set DIT pointer to current DITP >>      <<03095>>11030000
    SETDB'LOG;                                                 <<03095>>11032000
                                                               <<03095>>11034000
    << check to see if channel program should be restarted >>  <<03095>>11036000
    if ILTP(IFLAG).SCP = 1 then                                <<03095>>11038000
      begin                                                    <<03095>>11040000
      ILTP<<(ICPVA0)>> := 0; << Zero HIOP status >>            <<03095>>11042000
      tos := @DITP;   << DIT to fire I/O against >>            <<03095>>11044000
      tos := ILTP(ICPGM); << Channel pgm start adr >>          <<03095>>11046000
      ILTP(X) := 0;   << Zero out start address  >>            <<03095>>11048000
      START'HPIB(*,*,if ILTP(IFLAG).SQ=1 then true else false);<<03095>>11050000
      end;                                                     <<03095>>11052000
                                                               <<03095>>11054000
    go to LEAVE;                                               <<03095>>11056000
                                                               <<03095>>11058000
    end;                                                       <<03095>>11060000
                                                               <<03095>>11062000
  IF CDP = 0 THEN                                              <<02500>>11064000
    BEGIN << WAIT PROGRAM COMPLETION >>                        <<02500>>11066000
      FLAG.WAITPROG := 0; << RESET INDICATOR >>                <<02500>>11068000
      IF CPVA0 <> 0 AND UNIT <> 0 THEN                         <<02500>>11070000
        << CHANNEL FAILURE ON MULTI-UNIT WAIT PROGRAM >>       <<02500>>11072000
        BEGIN << IDLE CHANNEL PROGRAM ABORTED >>               <<02500>>11074000
RESTARTIDLEP:                                                  <<02500>>11076000
          ABORTED := TRUE;                                     <<02500>>11078000
                                                               <<03095>>11080000
       << Unit 0 may not be configured for this controller, so <<03095>>11082000
       << we must use the highest-configured unit for the idle <<03095>>11084000
          @DITP := DITPA(FLAG.HCUNIT);                         <<03095>>11086000
                                                               <<03095>>11088000
          CPVA0 := 0;                                          <<02500>>11090000
        END                                                    <<02500>>11092000
      ELSE                                                     <<02500>>11094000
        BEGIN << GET UNIT NUMBER FROM STATUS AREA >>           <<02500>>11096000
          TOS := WA0(STAP-@ILTP); << GET CONTROLLER STATUS >>  <<02500>>11098000
          WA0(X) := 0;   << Zero-out status >>                 <<03697>>11100000
          TOS := UNIT; << EXTRACT INSTRUCTION >>               <<02500>>11102000
          IF <> THEN ASMB(XCH; XEQ 1); << ISOLATE UNIT # >>    <<02500>>11104000
          ASMB(DELB,DUP); << DELETE UNIT EXTRACT INSTR >>      <<02500>>11106000
       << Check and see if UNIT is configured >>               <<03663>>11110000
       X := tos;     << Store UNIT number in index register >> <<03663>>11112000
       @DITP := DITPA(X);   << Get DIT pointer >>              <<03663>>11114000
       if <= or             << Invalid DIT pointer >>          <<03663>>11116000
          tos > FLAG.HCUNIT then << Beyond highest unit conf.>><<03663>>11118000
         begin   << Print out message >>                       <<03663>>11120000
         << Set SYSDB >>                                       <<03663>>11122000
         tos := 0;                                             <<03663>>11124000
         tos := SYSDB;                                         <<03663>>11126000
         ASMB(xchd);                                           <<03663>>11128000
         << Print message >>                                   <<03663>>11130000
         IOMESSAGE(1,UNKNOWN'INT'MSG,%10000,DRTN,,,,,          <<03663>>11132000
                   OPCONSOLE);                                 <<03663>>11134000
         << Put back DB >>                                     <<03663>>11136000
         ASMB(xchd;ddel);                                      <<03663>>11138000
         go to RESTARTIDLEP;                                   <<03663>>11140000
         end;                                                  <<03663>>11142000
        END;                                                   <<02500>>11144000
    END                                                        <<02500>>11146000
  ELSE @DITP := CDP; << USE CURRENT DIT POINTER >>             <<02500>>11148000
SETDB'LOG;                                                     <<03095>>11152000
                                                               <<03095>>11154000
  TOS := DITP;                                                 <<02500>>11156000
  TOS.IAK := 1;                                                <<02500>>11158000
  TOS.IOPROG := 0;                                             <<02500>>11160000
  DITP := TOS; << ACKNOWLEDGE INTERRUPT >>                     <<02500>>11162000
  IF ILTP(ICDP) = 0 THEN                                       <<02500>>11164000
    BEGIN << WAIT PROGRAM, CHECK DEVREC >>                     <<02500>>11166000
      IF DITP.STATEF = 0 AND NOT ABORTED THEN DITP.STATEF := 6;<<02500>>11168000
    END                                                        <<02500>>11170000
  ELSE                                                         <<02500>>11172000
    BEGIN                                                      <<02500>>11174000
      X := ILTP(ICNTRL);  << CHANNEL RESOURCE ? >>             <<02500>>11176000
      IF < THEN CHKCHANNELQUE(X,DITP);                         <<02500>>11178000
    END;                                                       <<02500>>11180000
  AWAKEIO(DITP,NOIMPEDE);  << CALL MONITOR FOR DEVICE >>       <<02500>>11182000
LEAVE:                                                         <<02500>>11184000
  DISABLE;  << ONLY UNTIL THE IXIT IS EXECUTED >>              <<02500>>11186000
  IF NOT SED'HPIB(1) THEN MAILBOX'DEBUG;                       <<02500>>11188000
   DRTN := %175;  <<  FOR IXIT TO IMBA IN CASE FORGOT DRTN >>  <<02626>>11190000
  ASMB( IXIT );                                                <<02500>>11192000
END;                                                           <<02500>>11194000
                                                               <<02500>>11196000
                                                               <<02500>>11198000
$PAGE                                                          <<02500>>11200000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<02500>>11202000
INTEGER ARRAY DITP;                                            <<02500>>11204000
OPTION PRIVILEGED, UNCALLABLE;                                 <<02500>>11206000
<<                                                                      11208000
    MASTERCLEARHPIB SENDS A MASTERCLEAR FOLLOWED BY A CLEAR             11210000
    INTERRUPTS ORDER TO THE CONTROLLER IDENTIFIED BY DITP. THE          11212000
    CHANNEL PROGRAM  FLAGS AND COUNTERS ARE CLEANED UP AS IF            11214000
    AN INTERRUPT OCCURED.                                               11216000
>>                                                                      11218000
BEGIN                                                          <<02500>>11220000
  INTEGER POINTER ILTP=Q+1;                                    <<02500>>11222000
  INTEGER CHANNEL = ILTP+1,                                    <<02500>>11224000
          SAVE    = CHANNEL+1;                                 <<02500>>11226000
                                                               <<02500>>11228000
  TOS := DITP(DILTP); << ILT POINTER >>                        <<02500>>11230000
  TOS := PS0(ICNTRL); << ILT CONTROLLER WORD >>                <<02500>>11232000
                                                               <<03663>>11234000
  << Log SIOP event in MMSTAT table        >>                  <<03663>>11236000
  << Word 0 - MMSTAT event 193             >>                  <<03663>>11238000
  <<      1 - DRT number                   >>                  <<03663>>11240000
  <<      2 - SIOP address                 >>                  <<03663>>11242000
  <<      3 - LSW of timer                 >>                  <<03663>>11244000
  ASMB(ddup);   << Duplicate DRT & SIOP address >>             <<03663>>11246000
  tos := 193;   << Event number                 >>             <<03663>>11248000
  ASMB(cab,cab);<< Put in the right order       >>             <<03663>>11250000
  tos := TIMER;                                                <<03663>>11252000
  ASMB(delb);   << Remove high-order word of timer >>          <<03663>>11254000
  MMSTAT(*,*,*,*);                                             <<03663>>11256000
                                                               <<03663>>11258000
  DISABLE;                                                     <<02500>>11260000
  DITP.IOPROG := 0;                                            <<02500>>11262000
  IF <> THEN   << SIO PROGRAM IN PROGRESS >>                   <<02500>>11264000
    BEGIN                                                      <<02500>>11266000
      HALT'HPIB(DITP);  << HALT I/O PROGRAM >>                 <<02500>>11268000
      IF <> THEN                                               <<02500>>11270000
        BEGIN << PROGRAM NOT IN WAIT >>                        <<02500>>11272000
          ILTP(IFLAG).IGNOREHI := 1; << IGNORE INTERRUPT >>    <<02500>>11274000
          TOS := LS0 LAND %377; << DRT # >>                    <<02500>>11276000
          DO UNTIL ABS(S0&LSL(2)+DRT3)=0;                      <<02500>>11278000
          DEL;                                                 <<02500>>11280000
        END; << I/O PROGRAM HALTED >>                          <<02500>>11282000
      ASMB(TEST); << CHECK FOR SOFTWARE CHANNEL >>             <<02500>>11284000
      IF < THEN CHKCHANNELQUE(*,DITP); << NEXT CHANNEL USER >> <<02500>>11286000
    END                                                        <<02500>>11288000
  ELSE                                                         <<02500>>11290000
    BEGIN << I/O NOT STARTED, CHECK FOR CHANNEL WAITING >>     <<02500>>11292000
      ASMB(TEST);  << CHECK FOR PENDING PROG >>                <<02500>>11294000
      IF < THEN                                                <<02500>>11296000
        BEGIN                                                  <<02500>>11298000
          TOS := TOS.CHANQUE; << CHANNEL # >>                  <<02500>>11300000
          TOS := DEQUEUE(DLINK,CHANNEL);                       <<02500>>11302000
          TOS := S0; << SAVE DITP FOR END TEST >>              <<02500>>11304000
          IF > THEN << DIT LIST IS NOT EMPTY >>                <<02500>>11306000
          WHILE S0 <> @DITP DO                                 <<02500>>11308000
            BEGIN << THIS ISN'T THE DIT, KEEP LOOKING >>       <<02500>>11310000
              ADDTAIL(*,DLINK,CHANNEL); << PUT BACK ON LIST >> <<02500>>11312000
              TOS := DEQUEUE(DLINK,CHANNEL); << GET NEXT DIT >><<02500>>11314000
              IF S0 = SAVE THEN                                <<02500>>11316000
                BEGIN << END OF LIST, DIT IS NOT IN LIST >>    <<02500>>11318000
                  ADDTAIL(*,DLINK,CHANNEL);                    <<02500>>11320000
                  RETURN;                                      <<02500>>11322000
                END;                                           <<02500>>11324000
            END;                                               <<02500>>11326000
        END;                                                   <<02500>>11328000
    END;                                                       <<02500>>11330000
END;  << MASTERCLEARHPIB >>                                    <<02500>>11332000
PROCEDURE MAILBOX'DEBUG;                                                11334000
OPTION UNCALLABLE,PRIVILEGED;                                           11336000
<<                                                                      11338000
     THIS PROCEDURE IS USED FOR DEBUGGING THE IMB ADAPTER               11340000
     SOFTWARE AND HARDWARE.                                             11342000
                                                                        11344000
     IT IS ASSUMED THAT THE DISPATCHER IS DISABLED AND                  11346000
     EXTERNAL INTERRUPTS ARE ENABLED WHEN THIS PROCEDURE                11348000
     IS ENTERED.                                                        11350000
>>                                                                      11352000
                                                               <<02500>>11354000
BEGIN                                                          <<02500>>11356000
                                                               <<02500>>11358000
  DOUBLE DBSAVE;                                               <<02500>>11360000
                                                               <<02500>>11362000
  ARRAY MSG0(0:7) = PB := %006412, "I/O OPCODE = %";           <<02500>>11364000
  ARRAY MSG1(0:7) = PB := %006412, "DATA WORD1 = %";           <<02500>>11366000
  ARRAY MSG2(0:7) = PB := %006412, "DATA WORD2 = %";           <<02500>>11368000
  ARRAY MSG3(0:7) = PB := %006412, "DATA WORD3 = %";           <<02500>>11370000
  ARRAY MSG4(0:7) = PB := %006412, "I/O STATUS = %";           <<02500>>11372000
  ARRAY MSG5(0:7) = PB := %006412, "MAILBOX #5 = %";           <<02500>>11374000
  ARRAY MSG6(0:7) = PB := %006412, "MAILBOX #6 = %";           <<02500>>11376000
  ARRAY MSG7(0:7) = PB := %006412, "MAILBOX #7 = %";           <<02500>>11378000
                                                               <<02500>>11380000
  << LET'S GET TO SYSTEM DB >>                                 <<02500>>11382000
                                                               <<02500>>11384000
  DISABLE;      << DISABLE EXTERNAL INTERRUPTS >>              <<02500>>11386000
  TOS := DOUBLE(SYSDB);                                        <<02500>>11388000
  XCHDB;                                                       <<02500>>11390000
  DBSAVE := TOS;                                               <<02500>>11392000
                                                               <<02500>>11394000
  << I/O OPCODE >>                                             <<02500>>11396000
                                                               <<02500>>11398000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG0(X));                     <<02500>>11400000
  BCONVERT(MAILBOX0);                                          <<02500>>11402000
                                                               <<02500>>11404000
  << DATA WORD1 >>                                             <<02500>>11406000
                                                               <<02500>>11408000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG1(X));                     <<02500>>11410000
  BCONVERT(MAILBOX1);                                          <<02500>>11412000
                                                               <<02500>>11414000
  << DATA WORD2 >>                                             <<02500>>11416000
                                                               <<02500>>11418000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG2(X));                     <<02500>>11420000
  BCONVERT(MAILBOX2);                                          <<02500>>11422000
                                                               <<02500>>11424000
  << DATA WORD3 >>                                             <<02500>>11426000
                                                               <<02500>>11428000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG3(X));                     <<02500>>11430000
  BCONVERT(MAILBOX3);                                          <<02500>>11432000
                                                               <<02500>>11434000
  << I/O STATUS >>                                             <<02500>>11436000
                                                               <<02500>>11438000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG4(X));                     <<02500>>11440000
  BCONVERT(MAILBOX4);                                          <<02500>>11442000
                                                               <<02500>>11444000
  << MAILBOX #5 >>                                             <<02500>>11446000
                                                               <<02500>>11448000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG5(X));                     <<02500>>11450000
  BCONVERT(MAILBOX5);                                          <<02500>>11452000
                                                               <<02500>>11454000
  << MAILBOX #6 >>                                             <<02500>>11456000
                                                               <<02500>>11458000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG6(X));                     <<02500>>11460000
  BCONVERT(MAILBOX6);                                          <<02500>>11462000
                                                               <<02500>>11464000
  << MAILBOX #7 >>                                             <<02500>>11466000
                                                               <<02500>>11468000
  FOR * X := 0 UNTIL 7 DO WRITE2(MSG7(X));                     <<02500>>11470000
  BCONVERT(MAILBOX7);                                          <<02500>>11472000
                                                               <<02500>>11474000
  SUDDENDEATH(201);    << NON-RESPONDING HPIB ADAPTER>>        <<02500>>11476000
END;  << MAILBOX'DEBUG >>                                      <<02500>>11478000
$PAGE "I/O INITIALIZATION PROCEDURE"                           <<02500>>11480000
PROCEDURE INITIO (FLAG);                                       <<02500>>11482000
   VALUE   FLAG;                                               <<02500>>11484000
   LOGICAL FLAG;                                               <<02500>>11486000
   OPTION  PRIVILEGED,UNCALLABLE;                              <<02500>>11488000
   << INITIALISE THE I/O SYSTEM. CALLED BY PROGEN AS SOON  >>  <<02500>>11490000
   << AS IT TAKES CONTROL IN TWO PHASES                    >>  <<02500>>11492000
   <<    - FLAG = TRUE : INIT CONSOLE AND DISC             >>  <<02500>>11494000
   <<    - FLAG = FALSE: INIT ALL OTHER DEVICES            >>  <<02500>>11496000
   BEGIN                                                       <<02500>>11498000
   INTEGER I,SPEED,TYPE,CONSOLE;                               <<02500>>11500000
   EQUATE SYSDISC = 1;                                         <<02500>>11502000
   DEFINE TERMTYPE = (0:7)#,                                   <<02500>>11504000
          SPEDDF   = (0:8)#,                                   <<02500>>11506000
          LDEVF    = (8:8)#;                                   <<02500>>11508000
   INTEGER CONSOL = DB+%74;                                    <<02500>>11510000
   INTEGER POINTER DITP;                                       <<02500>>11512000
   INTEGER POINTER DLTP;                                       <<02500>>11514000
                                                               <<02500>>11516000
   SUBROUTINE INITDEV;                                         <<02500>>11518000
      BEGIN                                                    <<02500>>11520000
      @DITP := LPDT(I&LSL(1));                                 <<02500>>11522000
      IF > THEN                                                <<02500>>11524000
         BEGIN  <<REAL DEVICE>>                                <<02500>>11526000
         TOS := @DITP;                                         <<02500>>11528000
         @DLTP := DITP(4);                                     <<02500>>11530000
         TOS := DLTP(7);                                       <<02500>>11532000
         IF <> THEN ASSEMBLE(PCAL 0) ELSE DDEL;                <<02500>>11534000
         END;                                                  <<02500>>11536000
      END;                                                     <<02500>>11538000
                                                               <<02500>>11540000
   SETSYSDB;                                                   <<02500>>11542000
   CONSOLE := CONSOL.LDEVF;                                    <<02500>>11544000
   IF FLAG THEN                                                <<02500>>11546000
      BEGIN  <<INIT CONSOLE AND SYSTEM DISC>>                  <<02500>>11548000
      I := SYSDISC;                                            <<02500>>11550000
      INITDEV;                                                 <<02500>>11552000
      I := CONSOLE;                                            <<02500>>11554000
      INITDEV;                                                 <<02500>>11556000
      SPEED := CONSOL.SPEDDF;                                  <<02500>>11558000
      CONSOL := CONSOLE;                                       <<02500>>11560000
      TYPE := DITP(23).TERMTYPE;                               <<02500>>11562000
      TOS := ATTACHIO(CONSOLE,0,0,0,24,0,TYPE,SPEED,1);        <<02500>>11564000
      DEL;                                                     <<02500>>11566000
      IF TOS.(13:3) <> 1 THEN  <<INVALID TERMTYPE,TRY UNDEF>>  <<02500>>11568000
         ATTACHIO(CONSOLE,0,0,0,24,0,%37,SPEED,1);             <<02500>>11570000
      END                                                      <<02500>>11572000
   ELSE                                                        <<02500>>11574000
      BEGIN  <<INIT ALL OTHER DEVICES>>                        <<02500>>11576000
      I := LPDT(0).(0:8);                                      <<02500>>11578000
      DO                                                       <<02500>>11580000
         IF I<>CONSOLE AND I<>SYSDISC THEN INITDEV             <<02500>>11582000
      UNTIL (I := I-1) = 0;                                    <<02500>>11584000
      END;                                                     <<02500>>11586000
   RESETDB(-1);                                                <<02500>>11588000
   END;  <<INITIO>>                                            <<02500>>11590000
$CONTROL SEGMENT=MAIN                                                   11592000
END.                                                                    11594000
